← 목록
기타 2026-07-16 7KB 읽기 7분

크라우니 오피스 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직렬화/섹션추출/섹션교체/
v2역직렬화/버전감지/v1승격/무결성검사/메타필드설정/메타갱신/본문만로드/v2저장/v2열기)를 이식 (원본 파일 무수정, 기존 브릿지 이식 관용구와 동일).
  • 신규 함수: 메타값(메타필드설정의 역, 단일 필드 조회), 제목이스케이프(메타 구분자 ; 충돌
방지), 메타빌드(제목·버전·수정시각·단어수 체인), CDF저장(경로,제목,시각,단어수,본문HTML).
  • CLI 진입점(환경변수 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
  • 본문/메타 기록, stdout OK/FAIL:무결성검사실패.
    • 자체시험 17종(직렬화·역직렬화·왕복동일·메타·무결성 5축 커버, 세미콜론 이스케이프 포함) —
    hanseonc_high 컴파일 + crownyc run 실행 17/17 PASS 확인.
    • 함정 수정: 초기 버전에서 통과 = 통과 + 확인(...) 인라인 산술이 VM에서 오작동(PASS 로그는
    전부 찍히는데 합계가 1/17로 나옴) → CWD포맷v2.한선 원본과 동일한 2단계 패턴(r = 확인(...)통과 = 통과 + r)으로 교정 후 17/17 정상.

    2. 네이티브 브릿지 — native/crowny-ai-content.m

    • crowny-ai-butler.mcbButlerRunVMStage/cbButlerEnsureSummaryToau 관용구를 그대로 이식:
    caOfficeEnsureBridgeToau(mtime 4항 자가치유 컴파일 캐시) + caOfficeRunVMStage(NSTask stdout 캡처) + caOfficeStatusOK(라인 단위 OK/FAIL 판정) + caOfficeMetaValue(메타 파싱 미러).
    • caSaveOfficeDocument(⌘S): 편집영역 {title,html,words} 추출(JS, 단어수는 문서통계.한선과 동일
    공백류 분리 규약 클라이언트 계산 추가) → ascii 임시경로에 title/html "내용" 기록 → 엔진 호출 → 성공 시 ascii 임시 출력을 ~/Documents/CrownyOffice/<제목>-<시각>.cdfmoveItemAtPath:.
    • caExportOfficeDocumentHTML(신규, ⌘⇧E): 수정 전 caSaveOfficeDocument 로직을 그대로 이관(html
    완결 스냅샷, 엔진 비개입).
    • caOpenOfficeDocument(⌘O): allowedFileTypes[cdf, html, htm]으로 확장, 확장자로 분기.
    • caOpenOfficeCDFAtURL:(신규): 원본을 순수 Cocoa API로 읽어(한글 경로 안전) ascii 임시경로에
    옮긴 뒤에만 엔진(NSTask) 호출 — 무결성검사 실패 시 탭을 만들지 않고 토스트만 표시.
    • 한글 데이터는 전부 "파일 내용"으로만 NSTask 경계를 넘고, env/argv 값 자체는 ascii 임시경로만
    사용(크라우니앱뷰어.m 이식 주의사항 — NSTask가 env/argv를 NFD로 정규화해 한글이 깨지는 함정 재적용).

    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 대시보드 → "새 문서" → 기존
    샘플 문서(표+굵게+밑줄 포함) 편집(추가 텍스트 + ⌘B 굵게) → ⌘S → 토스트 "저장됨: 문서-20260716-1020.cdf" → 파일 실측(cat): CWDv2 헤더 + 6개 섹션 마커 전부 존재, 본문에 <table>/<b> 태그 원문 그대로, 메타 제목=...;버전=2;수정시각=...;단어수=101.
    • ⌘O로 그 cdf 선택 → 새 탭에 제목·굵은글씨·표(플랜/월요금/포함사항 3행)·체크박스까지 전부
    시각적으로 복원(screencapture로 확인) — 무손실 왕복 실증.
    • ⌘⇧E 내보내기 → 문서-20260716-1021.html 생성 확인, 동일 <table>/<b> 태그 보존.
    • 손상 cdf 실측: 메타 섹션 마커를 깨뜨린 파일을 ⌘O로 열었을 때 새 탭이 생기지 않고
    "⚠ 문서를 열 수 없습니다(무결성 검사 실패)" 토스트만 표시됨을 라이브로 확인.
    • 회귀 하니스: bash bundle/office/bridge/회귀실행.sh27/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을
    통째로 담는다 — 구조 분해(진짜 런/문단 모델)는 Phase 2 후속 심화 과제로 개발계획에 이미 명시됨.
    • 자동저장·복구(자동저장복구.한선)·버전/비교(버전비교.한선)·DOCX/PDF/MD/RTF 내보내기·문서
    라이브러리 실데이터는 Phase 2의 나머지 항목(미착수).
    • osascript System Events의 keystroke가 한글 문자를 각각 'a'로 뭉개는 현상을 실측 중 발견(이
    세션의 UI 자동화 한정 이슈 — cdf 엔진 자체와는 무관, 저장된 영문/서식 텍스트로 왕복검증은 이상 없이 통과). 추후 한글 라이브 UI 자동화가 필요하면 별도 IME 주입 방식 조사 필요.