크라우니 오피스 Phase 2-1 — cdf(CWDv2) 정본 저장/열기 승격
개요
spec/오피스-개발계획.md Phase 2 착수: 기존 ⌘S(html 직접 저장)를 cdf(CWDv2 컨테이너) 정본 저장으로 승격하고, html은 별도 "내보내기" 메뉴(⌘⇧E)로 이관. ⌘O는 .cdf 우선(무결성검사 포함) + .html/.htm 하위호환을 겸한다. crowny-word CWD포맷v2.한선 엔진(v2직렬화/무결성검사/v2저장/v2열기)을 그대로 재사용(원본 무수정) — 1단계 설계는 "무손실 우선": 편집영역 innerHTML을 CWDv2 본문 섹션에 비파괴 그대로 담아, 서식·표·이미지가 전부 보존된다(구조 분해는 후속 심화 대상).
무엇을 했는지
1. 한선씨 정본 브릿지 — bundle/office/bridge/문서저장.한선 (신규)
- crowny-word
CWD포맷v2.한선의 핵심 함수(전체치환/섹션이스케이프복원/v2직렬화/섹션추출/섹션교체/
- 신규 함수:
메타값(메타필드설정의 역, 단일 필드 조회),제목이스케이프(메타 구분자;충돌
메타빌드(제목·버전·수정시각·단어수 체인), CDF저장(경로,제목,시각,단어수,본문HTML).
CROWNY_OFFICE_MODE로 분기, 미지정 시 자체시험 실행):save: CROWNY_OFFICE_TITLE_FILE/HTML_FILE(내용은 파일로 — NSTask env/argv NFD 정규화TS/WORDS(ascii) + OUT_FILE → CDF저장 후 stdout OK/FAIL:<사유>.
open: CROWNY_OFFICE_IN_FILE → v2열기(무결성검사 겸함) → OUT_HTML_FILE/OUT_META_FILE에OK/FAIL:무결성검사실패.
- 자체시험 17종(직렬화·역직렬화·왕복동일·메타·무결성 5축 커버, 세미콜론 이스케이프 포함) —
hanseonc_high 컴파일 + crownyc run 실행 17/17 PASS 확인.
- 함정 수정: 초기 버전에서
통과 = 통과 + 확인(...)인라인 산술이 VM에서 오작동(PASS 로그는
r = 확인(...)
→ 통과 = 통과 + r)으로 교정 후 17/17 정상.2. 네이티브 브릿지 — native/crowny-ai-content.m
crowny-ai-butler.m의cbButlerRunVMStage/cbButlerEnsureSummaryToau관용구를 그대로 이식:
caOfficeEnsureBridgeToau(mtime 4항 자가치유 컴파일 캐시) + caOfficeRunVMStage(NSTask stdout
캡처) + caOfficeStatusOK(라인 단위 OK/FAIL 판정) + caOfficeMetaValue(메타 파싱 미러).
caSaveOfficeDocument(⌘S): 편집영역 {title,html,words} 추출(JS, 단어수는 문서통계.한선과 동일
~/Documents/CrownyOffice/<제목>-<시각>.cdf로 moveItemAtPath:.
caExportOfficeDocumentHTML(신규, ⌘⇧E): 수정 전 caSaveOfficeDocument 로직을 그대로 이관(html
caOpenOfficeDocument(⌘O):allowedFileTypes를[cdf, html, htm]으로 확장, 확장자로 분기.caOpenOfficeCDFAtURL:(신규): 원본을 순수 Cocoa API로 읽어(한글 경로 안전) ascii 임시경로에
⚠ 토스트만 표시.
- 한글 데이터는 전부 "파일 내용"으로만 NSTask 경계를 넘고, env/argv 값 자체는 ascii 임시경로만
3. 메뉴 배선 — native/crowny-ai-main.m
CAContentController (CAAIExtras)재선언에caExportOfficeDocumentHTML추가.- File 메뉴에 "내보내기(HTML)" 항목(⌘⇧E) 신설,
menuExportHTML:셀렉터 배선. menuSave:/menuOpen:주석을 cdf 정본 기준으로 갱신.
실측 검증 (실셸, CrownyAI.app 라이브)
make ai에러 0 · 경고 0 (cc -fsyntax-only -fobjc-arc -DCROWNY_HYBRID자가검증도 통과).- 3초 생존 확인.
- 실행 흐름: 앱 기동 → AI홈 "오피스" 타일 클릭 →
crowny://office대시보드 → "새 문서" → 기존
cat): CWDv2 헤더 + 6개 섹션 마커 전부 존재,
본문에 <table>/<b> 태그 원문 그대로, 메타 제목=...;버전=2;수정시각=...;단어수=101.
- ⌘O로 그 cdf 선택 → 새 탭에 제목·굵은글씨·표(플랜/월요금/포함사항 3행)·체크박스까지 전부
- ⌘⇧E 내보내기 →
문서-20260716-1021.html생성 확인, 동일<table>/<b>태그 보존. - 손상 cdf 실측: 메타 섹션 마커를 깨뜨린 파일을 ⌘O로 열었을 때 새 탭이 생기지 않고
- 회귀 하니스:
bash bundle/office/bridge/회귀실행.sh→ 27/27 PASS (crownyBridge.js/앱 무수정
- crowny-browser.m·crowny-shell.m·Makefile 기존 타깃·앱 번들 무수정(요구사항 그대로 준수).
- 테스트로 생성한 cdf/html/손상 샘플 파일은 검증 후
~/Documents/CrownyOffice/에서 삭제(사용자
관련 파일
/Users/ef/crownybrowser/bundle/office/bridge/문서저장.한선(신규, 한선씨 정본)/Users/ef/crownybrowser/native/crowny-ai-content.m(CAOfficeIO 카테고리 확장)/Users/ef/crownybrowser/native/crowny-ai-main.m(메뉴 배선)/Users/ef/crowny-word/도구/CWD포맷v2.한선(엔진 원본, 무수정 — 재사용만)/Users/ef/crownybrowser/spec/오피스-개발계획.md(Phase 2 정본 계획)/Users/ef/crownybrowser/spec/신셸-빌더-가드레일.md(팔레트/ARC/자가검증 규칙)
잔여 이슈
- 1단계는 "무손실 우선"이라 CWDv2의 런/문단속성/표/이미지 구조 섹션은 비워둔 채 본문에 HTML을
- 자동저장·복구(자동저장복구.한선)·버전/비교(버전비교.한선)·DOCX/PDF/MD/RTF 내보내기·문서
- osascript System Events의
keystroke가 한글 문자를 각각 'a'로 뭉개는 현상을 실측 중 발견(이