Stage 2 후속 + Stage 3 + Stage 4 — 병렬 완료
개요
v3 마스터 플랜의 중간 3단계를 Sonnet 에이전트 3개로 병렬 처리. 영역 격리(서로 다른 파일)로 충돌 0건.
Stage 2 후속 — 도면 OmniGraffle 완성
산출물
도면/도면편집기.html1911 → 2424줄 (+513)도면/도면라이브러리.js594줄 신규도면/도면출력.html397 → 430줄lib/cdf-v2-spec.md스키마 확장 (DiagramLayer, 회전·미러·자식들·라이브러리ID)
추가 기능 6종
- 도형 라이브러리 81개 / 7 카테고리 — 기본(18)·화살표(9)·플로우차트(14)·UML(10)·네트워크(11)·ER(7)·건축(12). 검색·카테고리 필터·클릭 추가
- 레이어 시스템 — 추가/삭제/이름변경, 가시성 토글(👁), 잠금 토글(🔒).
DiagramLayer{이름, 가시, 잠금}객체 배열. v2.0string[]과 역호환 - 그룹/언그룹 — Ctrl+G 그룹화, Ctrl+Shift+G 언그룹.
종류:'group'+자식들:[id...]. bbox 자동 계산 - 회전·미러 — 슬라이더(0~360°)+숫자 입력, X/Y 미러 버튼. SVG
transform="rotate(N cx cy) scale(±1,±1)" - SVG/PNG 내보내기 — XMLSerializer→Blob→Image→Canvas→toBlob 순수 브라우저 API. 외부 라이브러리 0
- 외부 의존성 0 (CDN/웹폰트 X), CSS 변수·한글 식별자·시스템 폰트 유지
알려진 한계
- 그룹 자식 개별 SVG 유지 (중첩 그룹 없음)
- 베지어 컨트롤 핸들 미구현 (자동 S자 곡선만)
- PNG 내보내기
foreignObject범례 일부 브라우저 누락 가능
Stage 3 — 트랙 1·2 .cdf v2 호환 어댑터
산출물
한선씨/정적/cdf-adapter.js(18,516 bytes) — 트랙 1 JS 어댑터한선씨/공용/cdf-adapter.한선(7,875 bytes) — 한선씨 동반본 (정통 RPN)src/cdf/v2adapter.ts(8,717 bytes) — 트랙 2 TypeScript 어댑터src/cdf/v2adapter.한선(6,457 bytes)server-docs-cdf-routes.patch.md— 서버 라우트 추가 사양 (직접 patch 안 함)
핵심 API
- 트랙 1 (
window.CrownyCDFAdapter):exportToCDF,importFromCDF,cellToHTML,htmlToCell,tableToSheetCell,validateCDF,migrateV1ToV27개 - 트랙 2 (v2adapter.ts):
migrateV1ToV2,isV2,ensureV2,attachBizMeta,attachLayout,attachTemplate,normalizeFromStatic,normalizeToStatic,resolveCellIdConflicts,extractCells,extractSynapses,documentStats12개 named export
v1→v2 호환성
양 어댑터 모두formatVersion === "1.0.0" 감지 시 자동 마이그레이션. v1 필드 전체 유지, formatVersion만 "2.0.0" 승격, __bizMeta/__layout/__template는 undefined. 감사 로그 자동 추가.검증
node -c cdf-adapter.js✓- TypeScript:
v2adapter.ts0 에러 - 한선씨 동반본 2종 — 패턴 유효 (검증은 다음 사이클)
알려진 한계
- 트랙 1
htmlToCell은 TipTap ProseMirror 파서 없이html_raw노드로 래핑 (브라우저 TipTap 인스턴스 필요) tableToSheetCell은 DOM Element 직접 접근 (Node 환경 불가)- 서버 라우트
from-quote/from-proposal/from-diagram는 501 스텁 — Stage 4에서 채움
Stage 4 — 트랙 4 레거시 → CDF v2 머지
산출물
lib/legacy-merge.js(25,927 bytes, 633줄) — 양방향 변환 JSlib/legacy-merge.한선(6,669 bytes) — 한선씨 동반견적서/한선씨/견적→cdf.rpn.한선(127줄) — RPN 정통, 컴파일+실행 ✓제안서/한선씨/제안→cdf.rpn.한선(122줄) — RPN 정통, 컴파일+실행 ✓도면/한선씨/도면→cdf.rpn.한선(130줄) — RPN 정통, 컴파일+실행 ✓
양방향 변환 함수
javascriptwindow.CrownyLegacyMerge = {
quoteToCDF, cdfToQuote, // 견적서 ↔ CDF v2
proposalToCDF, cdfToProposal, // 제안서 ↔ CDF v2
diagramToCDF, cdfToDiagram, // 도면 ↔ CDF v2
migrateAll(opts) // 일괄
};
핵심 수치 (광주은광교회 LED 검증)
- 원가합 18,645,720 → 공급가 18,640,000 → 부가세 1,864,000 → 합계 20,504,000
- 견적서: 7 셀 (공종 6 + 특기사항 1), 시냅스 0
- 제안서: 표지·5절·일정·정산옵션·첨부 → 9 셀, 시냅스 5
- 도면: 1 diagram 셀 (도형 4·연결 0) + __bizMeta.참조
변환 규칙
- 견적서.공급자/공급받는자 →
__bizMeta.공급자/공급받는자 - 공종[N] →
sheet셀 [N] - 정산옵션 →
__bizMeta.정산옵션 - 도면 전체 → 단일
diagram셀 (content에 그대로 임베드) - 양식 정보 →
__bizMeta.양식(가로형·세로형·평면도·단면도·입면도)
학습 DB 등록 (이번 세션 누적)
cdf_v2_데이터모델_정통RPN(Stage 0)제안엔진_정통RPN,도면엔진_정통RPN,제안저장소_정통RPN(Stage 0~)stage4_견적_cdf_정통RPN,stage4_제안_cdf_정통RPN,stage4_도면_cdf_정통RPN(Stage 4)stage3_cdf_adapter_한선씨(Stage 3)
골든 워크플로우 재실행 결과
═══════════════════════════════════════════
통과 29 · 경고 0 · 실패 0
═══════════════════════════════════════════
Stage 2 후속/3/4 반영 후에도 라우트·API·저장-로드·도면→견적·한선씨 RPN·TS·외부의존성 전부 정상.
다음 사이클 후보 (Stage 5 마무리 + 운영)
- 트랙 1 cdf-adapter의 TipTap 파서 완성 (브라우저 인스턴스 통합)
- 트랙 4 도면 → CDF v2 자동 마이그레이션 (이미 저장된 d* 파일 일괄)
- server-docs-cdf-routes.patch.md 사양을 실제 server-docs.js에 반영
- 견적서 폴더의 사양서/제안서 변종 HTML 10개 정리 (트랙 4 내부 중복)
- 443/80 인스턴스 코드 동기화 (운영 이슈)
- 베지어 컨트롤 핸들 (Stage 2 잔여)
- 도형 라이브러리 한선씨 동반 (
도형라이브러리.한선)