JARVIS-UI
업데이트 2.160
2026. 6. 20.
v2.160.0.0MINORJarvis-UI
A–C 단계: ModuleRegistry + Workspace Ready (§17) + 플라이아웃이 없는 아이콘 레일 (§16) (Jarvis-UI)
- A–C 단계의 전달
docs/specs/EDITOR_UI_OVERHAUL_PLAN.md§16–§17 (Halyson 2026-06-20 결정), 이에 따라docs/ai/PROMPT_UI_GLM_REMAINING_BACKLOG_2026-06-20.md. 범위: 네비게이션 아키텍처 + 데이터 기반 카탈로그 + 아이콘 세트 — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE 변경 없음; 68개의 핸들러MenuItem_*리팩토링되지 않음 (단순히 호출만 됨). 단계 A — ModuleRegistry (단일 소스):ModuleCatalogPolicy.cs문서용 스텁에서 권위 있는 카탈로그로 발전 — 신규public static class ModuleRegistry~와 함께IReadOnlyList<ModuleCatalogEntry> All41개 항목(홈 + 10개 핵심 제작 + 5개 지도 + 7개 라이브 + 16개 추가 콘텐츠 + 2개 웨이브-1)으로 채워졌으며, 각 모듈당 하나씩 레일을 따라 배정되었습니다.ModuleCatalogEntry이긴다Mode/Notes/Scope/Cluster(enumModuleCluster) 그 외에도Id/Title/Description/IconKey/RequiresProject원본. 각 리터럴의 정확한 복사본SetModule(...)에서Main_Window.axaml.cs(재창조된 것이 아님). doc-comment 정책: 신규MenuItem_*라우팅됨 = 레지스트리에 추가 (검토 차단). 단계 A — 아이콘:StudioIcons.axaml14개 → 54개 아이콘으로 확장됨 (<StreamGeometry>Lucide 스타일, 뷰박스 24×24) — 모듈당 하나의 은유(검+뿔=몬스터, 디스켓=세이브, 해골=적 디자인, 육각 격자=구형 그리드 등). 일관성 검사(스크립트)를 통해 41개 모두IconKey레지스트리의 s는 다음으로 해석됩니다.StudioIcons. B 단계 — §17 Workspace Ready:MainDashboard_Control.axaml더 이상 6개의 하드코딩된 타일이 아닌,ItemsControl ItemsSource="{Binding Modules}"~와 함께DataTemplate(아이콘 + 제목 + 전체 설명 + 모드 팰릿).Main_DataModel이긴다public IReadOnlyList<ModuleCatalogEntry> Modules => ModuleRegistry.All. 새 컨버터 두 개가FFXProjectEditor/Converters/:IconKeyToGeo metryConverter(resolve string IconKey → Geometry percorrendo자료+병합된 사전viaTryGetResource(key, ActualThemeVariant, out _)— necessário porque binding{DynamicResource {Binding IconKey}}não funciona paraPathIcon.Dataem Avalonia) eRequiresProjectEnabledConverter(IMultiValueConverterRequiresProject × IsProjectLoaded →IsEnabled). Hero + empty-state CTA + card de Workspace status preservados (§17.4). Fase C — §16 Icon Rail sem flyouts: removidos os 5Button.Flyout/플라이아웃 메뉴doIconRailCol(XAML L156–239) — substituídos por<StackPanel Name="RailStack">populado em code-behind porBuildIconRail()(1 botãorailIconpor entry, agrupado por cluster comBorder1px como separador).Popup#RailDrawer(narrow) troca a lista textual deButton Classes="nav"por<WrapPanel Name="RailDrawerGrid">(grid de ícones). Handler únicoButton_RailModule_Click(sender, e)lê태그=ID→Dispatch(id).RefreshRailProjectGates()re-aplica o gateRequiresProjectquandoProject_Service.IsProjectLoadedmuda. Fase C — Dispatch genérico:OnQuickLaunchRequested(6 keys hardcoded: monster/kernel/sphere/save/extras/home) substituído porDispatch(string moduleId)com switch de todos os 41 Ids → handlerMenuItem_*existente. Rail, drawer e dashboard passam pelo mesmo caminho. Aceite: build Release 0 erros (402 warnings preexistentes); 0플라이아웃 메뉴noIconRailCol; 0 tile hardcoded no dashboard; 41 ícones renderizando no rail + 41 cards no home com ícone dedicado + descrição completa; cards desabilitados quandoRequiresProject && !IsProjectLoaded. Bug visual corrigido: os ícones não renderizavam inicialmente porqueApplication.Current.Resources.TryGetValue()em Avalonia 11 não percorre병합된 사전— fix viaResolveGeometry()helper compartilhado que itera os merged dicts comTryGetResource. [anterior:v2.159.6.1]
v2.160.1.0PATCHJarvis-UI
D1 단계 완료: 인터페이스 `IRestorableModule` + 리팩토링 `NavigationSnapshot` (Jarvis-UI)
- D 단계의 첫 번째 커밋 (
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D1). 범위: 탐색 아키텍처 (복원 가능한 뒤로/앞으로 이동) — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE는 변경되지 않음. 새로운 계약FFXProjectEditor/Modules/Common/IRestorableModule.cs:CaptureState()→Dictionary<string,object?>?(null = 상태 없음) 및RestoreState(state)(항등 연산, null에 대해 안전). D1 이전에는,Main_Window구체적인 유형에 대해 패턴 매칭을 수행했고 (MonEditorSelector_Control/KernelCommands_Control) 상태를 캡처하기 위해 — ~38개 모듈까지 확장되지 않습니다. 이제Main_Window제어 장치에 그것이 있는지 물어보세요IRestorableModule. 리팩토링NavigationSnapshot:** 돌다record struct (string ModuleId, Dictionary<string,object?>? State); enumNavigationSurfaceKind삭제됩니다. 새 필드private string _currentModuleId = "home"~의 시작 부분에 설정된Dispatch(string moduleId).CaptureCurrentNavigationSnapshot()일반 의약품 viaContentFrame.Content is IRestorableModule;IsSameNavigationSurface()한 번 비교해 보세요ModuleId;RestoreNavigationSnapshot()~한다Dispatch(snapshot.ModuleId)+restorable.RestoreState(snapshot.State). 3건의 연결 실패 오류 수정 (여전히 참조하고 있었음NavigationSurfaceKind):MenuItem_MonsterMagic1/2(L560/568) →_currentModuleId = "battle-commands-hub"+new NavigationSnapshot("battle-commands-hub")(다음과 동일한 패턴의MenuItem_Commands/MenuItem_Items(이미 마이그레이션된 것);NavigateToMonsterEditor(L1549) →new NavigationSnapshot("monster-editor"). 정직하게 말하자면: 뒤로/앞으로 기능은 3가지 원본(Home/Monster/KernelCommands)에서 계속 작동하지만, Monster/KernelCommands는 완전히 복원될 수 있을 뿐입니다 le는 해당 컨트롤이 구현될 때IRestorableModule(D2/D4). 그때까지는 스냅샷이 생성되지만,State오다null(모듈로 돌아가며, 하위 선택 항목은 복원하지 않음). 릴리스 빌드 오류 0개 (기존 경고 402개). [이전:v2.160.0.0]
v2.160.2.0PATCHJarvis-UI
D2 단계: `IRestorableModule` 7가지 간편한 에디터(Jarvis-UI)
- D 단계의 두 번째 커밋 (
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D2). 적용 범위: 7가지 Core Authoring 편집기에서 복원 가능한 뒤로/앞으로 기능 — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE는 변경되지 않음. 구현IRestorableModule(D1에서 정의됨) 7개의 제어에서:TreasureEditor_Control,AutoAbilityEditor_Control,PlayerGrowthEditor_Control,CtbBaseEditor_Control,KeyItemEditor_Control,FormationEditor_Control,BukiGetTreasureCatalog_Control. 각CaptureState()캡처filterText(문자열) +selectedIndex(int? 컬렉션에서 선택한 항목에서 파생된)Displayed*);RestoreState(state)필터를 다시 적용합니다 (이를 통해ApplyFilter출처:OnFilterTextChanged)를 사용하여 인덱스를 통해 행을 다시 선택합니다. 에디터별 매핑: Treasure (SelectedTreasure/DisplayedTreasures), AutoAbility (SelectedAbility/DisplayedAbilities), PlayerGrowth (SelectedCharacter/DisplayedCharacters), CtbBase (SelectedRow/DisplayedRows), KeyItem (SelectedItem/DisplayedItems), 형성 (SelectedBattle/Battles—Displayed*없음), BukiGetTreasureCatalog (SelectedRow/표시된 행 수). **Honestidade:** agora Monster Editor + os 7 editores acima são plenamente restorable via back/forward (voltam pra seleção/filtro exatos). KernelCommands + os hubs (BattleCommands/Items/etc.) viram em D3 (SubTabHub). Build Release **0 erros** (402 warnings preexistentes). [anterior:v2.160.1.0`]
v2.160.3.0PATCHJarvis-UI
D3 단계: `IRestorableModule` 에서 `SubTabHub_Control` (9개 허브 지원) (Jarvis-UI)
- D 단계의 세 번째 커밋 (
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D3). 적용 범위: 모든 기반 허브에서 뒤로/앞으로 기능 복원 가능 에서SubTabHub** — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE는 변경되지 않았습니다.SubTabHub_Control.axaml.cs구현한다IRestorableModule: 새 필드int _activeTabIndex추적됨:SelectTab(index);CaptureState()돌아온다{["activeTab"] = _activeTabIndex};RestoreState(state)불꽃SelectTab(idx)(일반적으로 pill/active/hosted-content를 다시 호출합니다). 9개 허브에 대한 자동 지원: BattleCommandsHub, ItemsHub, SphereGridHub, TextHub, EnemyDesignHub, CustomizationsHub, StatsHub, EncountersHub, Blitzball — 모두 다음을 사용합니다SubTabHub_Control출처:AddTab(...), 그러면 한 번의 변경만으로 모든 사용자가 활성 하위 탭 복원 기능을 무료로 이용할 수 있습니다. 정직성: 각 하위 탭의 내부 콘텐츠(호스팅된 편집기의 필터/선택 기능)는 호스팅된 컨트롤의 책임입니다 — 만약 해당 컨트롤이 또한IRestorableModule(D2는 Treasure/KeyItem/기타 등을 다루었으며), 그Main_Window이어서 복원 작업을 실행합니다. 빌드 릴리스 오류 0건 (기존 경고 402건). [이전:v2.160.2.0]
v2.160.4.0PATCHJarvis-UI
D4 단계: `IRestorableModule` 나머지 모든 컨트롤에 대해서는 기본 인터페이스 메서드(Jarvis-UI)를 통해 처리됩니다
- D 단계의 네 번째 커밋 (
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D4). 적용 범위: 모든 곳에서 인터페이스를 선언해야 한다*_Control나머지** — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE는 변경되지 않았습니다.IRestorableModule.cs기본 인터페이스 메서드를 얻게 됩니다:CaptureState() => null그리고RestoreState(state) { }(기본값: stateless/no-op). 따라서 의미 있는 상태가 없는 컨트롤(읽기 전용 탐색기, 허브, 런타임 랩, 디버그, 트래커, 16가지 추가 기능, Wave-1, 하위 컨트롤)은 다음만 선언하면 됩니다., IRestorableModule서명란에 — oMain_Window이제 할 수 있습니다ContentFrame.Content is IRestorableModule유형을 가리지 않고 어떤 모듈에서든. 자동 스윕을 통해work/_irestable_stateless_sweep_20260620.ps1: 65개의 컨트롤이 변경됨 (추가됨using FFXProjectEditor.Modules.Common;+: UserControl, IRestorableModule), 9개 생략 (D1/D2/D3에 이미 구현된 8개 +MonsterAiEditor2_Control단종됨). 정직하게 말하자면: 필터가 적용된 3가지 브라우저(MagicDllBrowser/RuntimeDllManager/Ps3MagicBrowser)는 다음 이유로 기본값인 ‘stateless’를 상속받았습니다.FilterText비공개 DataModels에 존재하며, 컨트롤에는 노출되지 않습니다. 필터의 실제 캡처는 하위 백로그로 남습니다. D1+D2+D3+D4를 통해, 약 72개의 모든 컨트롤이 이제 선언합니다.IRestorableModule; 기존에 있던 것들(편집자 8명 + 허브 9개)은 명시적인 오버라이드를 수행하며, 나머지는 스테이트리스입니다. 빌드 릴리스 오류 0건 (기존 경고 402건)
v2.160.3.0