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 /
caOpenMailInActiveTab —
caOpenOsInActiveTab 미러,
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 동반), 일관성 유지.