CrownyDoc Office — 모듈 간 변환·연결 브리지 (module-bridge)
개요
office-design 설계명세.json의 crossModuleFeatures 중 과제 지정 5건을 구현:
mind→outline(뷰 전환), mind가지→plan작업 내보내기, mind→slide 초안, outline→slide 변환,
문서 에디터
/시트 /마인드맵 라이브 블록 임베드.
무엇을 했는지
module-bridge.js: 위쪽 절반은 순수 함수(DOM 비의존, Node 하네스 가능) — treeToOutlineLines,
subtreeToPlanTasks,
treeToSlideStructure,
outlineLinesToSlideStructure,
docindexUpsert 등.
아래쪽 절반은 브라우저 배선 — 실존 API만 호출(
CrownyOffice.mindmap.save,
CrownyOffice.slide.addSlide/addText,
CrownyOffice.editor.onChange,
CrownyOffice.sheet.getData).
window.CrownyShell이 아직 없거나 늦게 로드돼도
최대 10초 폴링 후
registerCommand로 4개 커맨드(
bridge.mindToOutline/
bridge.branchToPlan/
bridge.mindToSlide/
bridge.outlineToSlide) 등록.
- 가지→플랜 내보내기는 지시대로
/plan 서버(iframe, plan-tab.js) 미접촉 — crowny-docindex
(localStorage,
{id,title,module,mtime,meta}) 엔티티 +
crowny-localplan-<id> 로컬 문서로만 구현.
- 문서 블록 임베드는 editor-core.js 미수정 —
CrownyOffice.editor.onChange(cb) 공개 훅만 사용해
캐럿 앞 텍스트가
/시트 ·
/마인드맵 로 끝나면 contenteditable=false 미리보기+"열기" 블록으로 치환.
- 병렬로 다른 세션이 만든
outline.js를 사후 확인 — CrownyOutlineData.STORAGE_KEY = 'mindmap-doc',
노드 스키마
{id,text,parent,children} 동일 확인. 설계 가정(같은 저장소·같은 트리 포맷 공유)이 실제
구현과 일치해 module-bridge.js 수정 불필요.
module-bridge.한선 동반 작성 — 같은 DFS/가지작업목록/슬라이드구조 로직을 병렬배열(g_text/g_parent)로
재귀 구현. "함수 재호출 배열 지역변수 함정"(2026-07-13 VM 트랩) 회피를 위해 자식목록을 별도 배열-반환
헬퍼로 분리하지 않고 재귀 함수 안에 인라인 스캔(스칼라만 사용)으로 처리.
검증
node --check module-bridge.js OK.
- Node 하네스(26 assert,
/private/tmp/.../scratchpad/module-bridge-test.js) 26/26 PASS —
트리 순회, 가지→작업 변환, 맵→슬라이드 구조, 아웃라인→슬라이드 파이프라인 일치성, docindex 안전 폴백,
CrownyOffice 부재 시 크래시 없는 null 반환까지 커버.
CROWNY_STRICT=1 ./hanseonc_high module-bridge.한선 → 594토큰/2021큐브, STRICT 경고 0.
./crownyc run 자체시험 6/6 PASS, 스택 비움(clean exit).
~/.claude/scripts/crownycode-learn.sh search 사전 조회 — 기존 패턴 MISS(신규 로직 확인 후 작성).
관련 파일
/Users/ef/CrownyDoc/한선씨/정적/module-bridge.js
/Users/ef/CrownyDoc/한선씨/정적/module-bridge.한선
- 참조(읽기 전용):
mindmap.js, outline.js, slide-core.js, editor-core.js, plan-tab.js, common.js
- 검증 스크립트(임시):
/private/tmp/claude-501/-Users-ef/c96e50c5-c067-41f3-bf44-38a58a7faa23/scratchpad/module-bridge-test.js
잔여 이슈
CrownyShell(registerModule/registerCommand/gotoModule) 자체가 아직 어느 세션에서도 구현되지 않은
상태로 확인됨(전수 grep 결과 0건) — module-bridge.js는 폴링으로 안전 대기하도록 설계했으나, 실제
등록/커맨드팔레트 동작은 CrownyShell 구현체가 배선된 뒤에만 라이브 검증 가능.
- 문서 블록 임베드는 텍스트 노드 캐럿(
anchorNode.nodeType===3)만 처리하는 단순 구현 — 트리거 직후
캐럿이 element 노드에 있는 예외 케이스는 스킵(안전 우선, 크래시 없음).
- 슬라이드 생성 시
addText는 title/content 텍스트만 채움 — 실제 master placeholder 좌표 자동배치는
slide-core.js의 향후 API 확장 필요(현재는 고정 좌표 60,40 / 60,140).