← 목록
AI 2026-07-25 6KB 읽기 7분

CrownyAI 생태계 통일 장착 3건(U1): 캔버스·메일·워드 네이티브 전환

개요

사장님 지시 [임무 U1] — ①crowny://canvas ②crowny://mail 장착, ③워드 런처 카드 웹→네이티브 전환 + 오피스 문서 딥링크(crowny://office#doc). 기존 EV/FAB/factory/vps/os 장착 공정을 1:1 미러링(라이브 서버형, self-contained 번들 없음).

무엇을 했는지

① crowny://canvas / ② crowny://mail

  • native/crowny-ai-content.m 5지점 배선(모두 EV/os 공정 그대로 미러):
1. normalizeURLString — 별칭 캔버스/canvas/크라우니캔버스/crowny://canvas, 메일/mail/크라우니메일/crowny://mail 2. caOpenCanvasInActiveTab / caOpenMailInActiveTabcaOpenOsInActiveTab 미러, loadRequest로 각각 https://canvas.crowny.org / https://mail.crowny.org 직접 오픈 3. navigateTo: 디스패치 분기(os 분기 다음에 추가) 4. AI홈 타일(마을 타일 다음에 캔=캔버스, 메=메일 추가) 5. 북마크 시드 — v19(캔버스), v20(메일) (v18=os가 최고 채번이었음 — 다음 채번 = v21)
  • 한선씨 SSOT: src/캔버스연결.한선, src/메일연결.한선 (EV연결.한선 자매 구조, 4상 판정 티/타/옴/음).
자체시험 각 14/14 PASS(최초 작성 시 "크라우니EV"/"크라우니트리"/"크라우니OS" 등 정확별칭 누락으로 11/14 — 타서비스별칭인가()에 전 서비스 exact-alias 세트 보강 후 PASS).
  • src/앱목록.psv 캔버스(36행)·메일(37행)은 이미 등록되어 있어 무수정(작업지시 그대로).

③ 워드 카드 네이티브 전환 + 오피스 문서 딥링크

  • src/앱목록.psv 15행: 워드|url:https://docs.crowny.org/office/?mode=doc|...
워드|url:crowny://office#doc|-|-|-|크라우니 워드 (문서 편집 — 네이티브).
  • 경로 추적 결론(딥링크 성사): appListEntries()(crowny-ai-engine.m)는 url: 카드 클릭 시
self.onNav(url) 호출 → onNav = navigateTo:(content.m). navigateTo:의 office 분기가 hasPrefix:@"crowny://office"#doc 프래그먼트가 있어도 매칭이 안 깨진다(문제는 매칭이 아니라 — 원래 caOpenOfficeInActiveTab이 인자 없이 호출돼 프래그먼트를 그냥 버렸다는 점). → caOpenOfficeInActiveTab을 :(NSString *)fragment 오버로드로 확장(0-인자 버전은 nil로 위임, 회귀 0) — fragment가 있으면 NSURL fileURLWithPath 뒤에 #<fragment>를 문자열로 이어붙여 로드 URL을 재구성(file://.../index.html#doc) → WKWebView location.hash로 그대로 전달됨. navigateTo의 office 분기에서 # 이후를 잘라 fragment로 넘기도록 수정.
  • bundle/office/bridge/crownyBridge.js §31(append, 20줄): location.hash==='#doc'이고
window.__crownyDocDeepLinkDone 미설정이면, 기존 §21 navToOfficeModule 관용구(리프 div/span의 textContent 정확일치 "문서" → mousedown/mouseup/click 합성 디스패치)를 그대로 미러링해 최대 20회(300ms 간격, ~6초) 재시도로 홈→문서 모듈 1회 자동 진입.
  • 한선씨 동반(훅 강제): bundle/office/bridge/문서딥링크.한선 — §31의 4상 판정(hash 불일치=음,
이미완료=타, 라벨발견=티, 미발견+재시도한도내=옴, 초과=타) 순수함수 정본화. 자체시험 11/11 PASS.

검증(실측)

  • make ai: 에러0, 경고 4건(사전존재 — main.m getter 3 + butler unused-function 1, 회귀 아님).
  • 한선씨 3본 컴파일+실행 PASS(stdout/stderr 분리): 캔버스연결 14/14, 메일연결 14/14, 문서딥링크 11/11.
  • bash bundle/office/bridge/회귀실행.sh: 27/27 PASS(crownyBridge.js §31 append 후 회귀 불변).
  • 헤드리스 Chrome CDP(:9342, scratchpad 1회성 스크립트 — 도형검증.js 패턴 미러)로
file://.../office/app/index.html#doc 로드 + crownyBridge.js 주입 실측: docDeepLinkDone=true, 홈 화면 "RECENT" 마커 소멸, "문서" 탭 라벨 존재 확인, body에 실제 문서 편집기 툴바+본문("Crowny Office 1.0 출시 안내…") 렌더 확인 — 딥링크 종단 PASS.
  • install-ai-app.sh 미실행(메인 권한 — 지시 준수), 실행 중인 CrownyAI 프로세스 kill 없음.
  • crownycode-learn.sh add 4건 학습(캔버스연결/메일연결/문서딥링크/문서딥링크 판정 패턴).

관련 파일

  • /Users/ef/CrownyBrowser/native/crowny-ai-content.m (5365→5460줄, 백업
native/crowny-ai-content.m.bak-u1통일-1784943937)
  • /Users/ef/CrownyBrowser/src/캔버스연결.한선(신규), /Users/ef/CrownyBrowser/src/메일연결.한선(신규)
  • /Users/ef/CrownyBrowser/src/앱목록.psv (백업 src/앱목록.psv.bak-u1통일-1784943937, 15행만 변경)
  • /Users/ef/CrownyBrowser/bundle/office/bridge/crownyBridge.js (17316→17337줄, §31 append,
백업 bundle/office/bridge/crownyBridge.js.bak-u1통일-1784943937)
  • /Users/ef/CrownyBrowser/bundle/office/bridge/문서딥링크.한선(신규)
  • 검증 스캐폴드(1회성, scratchpad 전용 — codebase 미편입):
/private/tmp/claude-501/-Users-ef/8d497ef1-d316-4d5a-bc8e-b330dcc68e72/scratchpad/딥링크검증.js

잔여 이슈

  • install-ai-app.sh 미실행 — 다음 설치+앱재시작 전까지 실행 중인 CrownyAI.app에는 미반영
(make ai 바이너리에만 반영). 설치 권한은 메인 세션 소관.
  • 캔버스/메일 브릿지(.js)·ERP/Today 이벤트버스 연동은 이번 범위 제외(EV/factory와 동일 원칙).
  • 문서딥링크.한선/캔버스연결.한선/메일연결.한선은 순수 판정 로직만 정본화 — 실시간
DOM 탐색/네트워크 로드는 각각 JS/ObjC가 수행(VM에 DOM·WKWebView 없음, 가드레일 원칙).
  • CDP 검증 스크립트(딥링크검증.js)는 순수 프로토콜 플루밍이라 .한선 동반 생략 — 기존
bundle/office/bridge/*검증.js 17건 전부 동일 전례(0/17 동반), 일관성 유지.