← 목록
기타 2026-05-27 6KB 읽기 7분

Stage 2 후속 + Stage 3 + Stage 4 — 병렬 완료

개요

v3 마스터 플랜의 중간 3단계를 Sonnet 에이전트 3개로 병렬 처리. 영역 격리(서로 다른 파일)로 충돌 0건.

Stage 2 후속 — 도면 OmniGraffle 완성

산출물

  • 도면/도면편집기.html 1911 → 2424줄 (+513)
  • 도면/도면라이브러리.js 594줄 신규
  • 도면/도면출력.html 397 → 430줄
  • lib/cdf-v2-spec.md 스키마 확장 (DiagramLayer, 회전·미러·자식들·라이브러리ID)

추가 기능 6종

  1. 도형 라이브러리 81개 / 7 카테고리 — 기본(18)·화살표(9)·플로우차트(14)·UML(10)·네트워크(11)·ER(7)·건축(12). 검색·카테고리 필터·클릭 추가
  2. 레이어 시스템 — 추가/삭제/이름변경, 가시성 토글(👁), 잠금 토글(🔒). DiagramLayer{이름, 가시, 잠금} 객체 배열. v2.0 string[]과 역호환
  3. 그룹/언그룹 — Ctrl+G 그룹화, Ctrl+Shift+G 언그룹. 종류:'group' + 자식들:[id...]. bbox 자동 계산
  4. 회전·미러 — 슬라이더(0~360°)+숫자 입력, X/Y 미러 버튼. SVG transform="rotate(N cx cy) scale(±1,±1)"
  5. SVG/PNG 내보내기 — XMLSerializer→Blob→Image→Canvas→toBlob 순수 브라우저 API. 외부 라이브러리 0
  6. 외부 의존성 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, migrateV1ToV2 7개
  • 트랙 2 (v2adapter.ts): migrateV1ToV2, isV2, ensureV2, attachBizMeta, attachLayout, attachTemplate, normalizeFromStatic, normalizeToStatic, resolveCellIdConflicts, extractCells, extractSynapses, documentStats 12개 named export

v1→v2 호환성

양 어댑터 모두 formatVersion === "1.0.0" 감지 시 자동 마이그레이션. v1 필드 전체 유지, formatVersion"2.0.0" 승격, __bizMeta/__layout/__templateundefined. 감사 로그 자동 추가.

검증

  • node -c cdf-adapter.js
  • TypeScript: v2adapter.ts 0 에러
  • 한선씨 동반본 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줄) — 양방향 변환 JS
  • lib/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 잔여)
  • 도형 라이브러리 한선씨 동반 (도형라이브러리.한선)