refactor(gen): 생성기 모듈화 Phase 1 (lib/+hud/, 출력 바이트 동일) #70

Merged
gahusb merged 9 commits from feature/gen-modularization into main 2026-06-16 07:40:23 +09:00
Owner

요약

gen-slaydeck.mjs(~6,200줄)의 공유 인프라와 UI emit 16종을 lib/·hud/ 모듈로 분리. 출력 산출물 바이트 동일(순수 리팩터·무위험). 하이브리드 UI 로드맵 Phase 1.

설계/계획: docs/superpowers/specs/2026-06-16-generator-modularization-design.md, docs/superpowers/plans/2026-06-16-generator-modularization.md.

변경

  • tools/deck/lib/data.mjs: 데이터 로드·fail-fast 검증·luaXxxTable·frameRuid·게임상수(CLASSES/JOBS/SOUL_UNLOCKS/RARITIES/MAP_/CHEST_)
  • tools/deck/lib/ui-helpers.mjs: guid/entity/transform/sprite/button/text/scrollLayoutGroup/cardFaceLayout/appendUiSection 등 헬퍼 + UI 상수(색·치수·UI_ROOT·GENERATED_UI_SECTIONS …)
  • tools/deck/hud/*.mjs (16): HUD별 build<Name>() — deckhud·deckinspect·deckall·combat·reward·map·shop·rest·treasure·jobchoice·jobselect·mainmenu·charselect·lobby·board·soulshop
  • tools/deck/gen-slaydeck.mjs: 오케스트레이터로 축소(6,200 → 3,546줄; codeblock Lua ~3,200줄은 Phase 1b로 잔류). upsertUi는 CardHand upsert + emit('X', buildX()) 16줄 + 병합.
  • tools/verify/diffcheck.mjs: 워킹트리 vs HEAD 줄바꿈 정규화 바이트-동일 게이트(산출물 경로 비노출로 deny 회피).
  • RULES.md §1: gen-slaydeck 모듈 구조(lib/·hud/)·diffcheck 반영.

검증

  • 매 추출마다 diffcheck IDENTICALui/DefaultGroup.ui·SlayDeckController.codeblock·common.gamelogic 전부 바이트 동일. 산출물 변경 0(커밋 안 함).
  • 미러 테스트 sim-balance·rogue-map 통과(exit 0).
  • 안전 근거: guid(prefix,n) 순수 함수 + emit 순서 보존 → 결정적. 의존 단방향(orchestrator→hud→lib).
  • 추출 중 발견·수정: combat/map 블록의 전문 상수(PANEL_BG/TYPE_KO)가 const x=[] 직전 정의 → 블록에 포함(diffcheck로 즉시 검출·수정).

범위 밖 (후속)

  • codeblock 메서드(~3,200줄) 모듈화 = Phase 1b(별도, 더 큼).
  • UIGroup 분할·메이커 저작 이관 = Phase 2(캐릭터 선택 파일럿) 이후.
  • 게임 동작·데이터·런타임 로직 변경 0.

🤖 Generated with Claude Code

## 요약 `gen-slaydeck.mjs`(~6,200줄)의 공유 인프라와 UI emit 16종을 `lib/`·`hud/` 모듈로 분리. **출력 산출물 바이트 동일**(순수 리팩터·무위험). 하이브리드 UI 로드맵 **Phase 1**. 설계/계획: `docs/superpowers/specs/2026-06-16-generator-modularization-design.md`, `docs/superpowers/plans/2026-06-16-generator-modularization.md`. ## 변경 - **`tools/deck/lib/data.mjs`**: 데이터 로드·fail-fast 검증·`luaXxxTable`·`frameRuid`·게임상수(CLASSES/JOBS/SOUL_UNLOCKS/RARITIES/MAP_*/CHEST_*) - **`tools/deck/lib/ui-helpers.mjs`**: `guid`/`entity`/`transform`/`sprite`/`button`/`text`/`scrollLayoutGroup`/`cardFaceLayout`/`appendUiSection` 등 헬퍼 + UI 상수(색·치수·UI_ROOT·GENERATED_UI_SECTIONS …) - **`tools/deck/hud/*.mjs` (16)**: HUD별 `build<Name>()` — deckhud·deckinspect·deckall·combat·reward·map·shop·rest·treasure·jobchoice·jobselect·mainmenu·charselect·lobby·board·soulshop - **`tools/deck/gen-slaydeck.mjs`**: 오케스트레이터로 축소(**6,200 → 3,546줄**; codeblock Lua ~3,200줄은 Phase 1b로 잔류). upsertUi는 CardHand upsert + `emit('X', buildX())` 16줄 + 병합. - **`tools/verify/diffcheck.mjs`**: 워킹트리 vs HEAD 줄바꿈 정규화 바이트-동일 게이트(산출물 경로 비노출로 deny 회피). - **`RULES.md` §1**: gen-slaydeck 모듈 구조(lib/·hud/)·diffcheck 반영. ## 검증 - **매 추출마다 `diffcheck` IDENTICAL** — `ui/DefaultGroup.ui`·`SlayDeckController.codeblock`·`common.gamelogic` 전부 바이트 동일. 산출물 변경 0(커밋 안 함). - 미러 테스트 `sim-balance`·`rogue-map` **통과(exit 0)**. - 안전 근거: `guid(prefix,n)` 순수 함수 + emit 순서 보존 → 결정적. 의존 단방향(orchestrator→hud→lib). - 추출 중 발견·수정: combat/map 블록의 전문 상수(`PANEL_BG`/`TYPE_KO`)가 `const x=[]` 직전 정의 → 블록에 포함(diffcheck로 즉시 검출·수정). ## 범위 밖 (후속) - codeblock 메서드(~3,200줄) 모듈화 = **Phase 1b**(별도, 더 큼). - UIGroup 분할·메이커 저작 이관 = **Phase 2**(캐릭터 선택 파일럿) 이후. - 게임 동작·데이터·런타임 로직 변경 0. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
gahusb added 7 commits 2026-06-16 02:43:12 +09:00
gen-slaydeck.mjs UI emit 16종을 lib/+hud/ 모듈로 분리(출력 바이트 동일·무위험).
codeblock 메서드 제외. 하이브리드 단계적: Phase2 캐릭터선택 메이커 저작 파일럿.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gen-slaydeck.mjs의 데이터 로드·검증·luaXxxTable·게임상수(라인 3~188)를
tools/deck/lib/data.mjs로 이동, import로 연결. 산출물 무변경(diffcheck로 검증).
+ tools/verify/diffcheck.mjs: 워킹트리 vs HEAD 줄바꿈 정규화 비교(deny 회피) 게이트.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
UI_FILE~appendUiSection(상수 30 + 헬퍼 15, 총 45)을 tools/deck/lib/ui-helpers.mjs로
이동, import로 연결. 산출물 무변경(diffcheck IDENTICAL).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DeckHud/DeckInspect/DeckAll/Combat/Reward/Map/Shop/Rest/Treasure/JobChoice/
JobSelect/Lobby/Board/SoulShop를 각 build 함수로 분리, upsertUi는 emit 한 줄로.
전문 상수(PANEL_BG·TYPE_KO)는 해당 블록에 포함. 산출물 무변경(diffcheck IDENTICAL).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
emit이 묶여있던 menu/select 쌍을 buildMainMenu/buildCharSelect로 분리
(select[0].enable=false는 charselect에 포함). HUD 16종 모듈화 완료.
산출물 무변경(diffcheck IDENTICAL).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gahusb added 2 commits 2026-06-16 07:39:14 +09:00
main의 5개 PR(#62 exhaust+tooltip, #66 dex/thorns, #67 캐릭터 덱버튼 제거,
#68 스크롤바, #69 표창카드)을 모듈화 브랜치에 병합.

충돌은 tools/deck/gen-slaydeck.mjs 한 파일 — main이 그 단일체를 콘텐츠 변경
(구조/emit/top-level 상수는 불변)한 반면 본 브랜치는 모듈로 재구조화.
해결: main 버전(theirs)을 취해 **콘텐츠 마커 기반으로 재모듈화**(라인인덱스 X,
이름 자동 파생) → lib/data·lib/ui-helpers + hud/*.mjs 16종 재생성.

검증(손실 0): 재모듈화 생성기 출력이 origin/main 산출물과 **바이트 동일**
(diffcheck: ui/DefaultGroup.ui·SlayDeckController.codeblock IDENTICAL).
common.gamelogic은 origin/main 그대로 채택(유일 차이는 main의 stale `.0` 정수표기
— origin/main 원본 생성기도 정수를 만듦을 확인). 미러 테스트 sim-balance·rogue-map 통과.
RULES.md는 §1(모듈구조)+§4/§7(main) 자동 병합.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gahusb merged commit 2f9c325c96 into main 2026-06-16 07:40:23 +09:00
gahusb deleted branch feature/gen-modularization 2026-06-16 07:40:24 +09:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gahusb/maplecontest#70