크라우니스페이스 앱 장착 (2026-07-17)
개요
crowny://space = Crowny Space(개인 공간 관리 홈어시스턴트, Home Assistant 대응 — 우리집/교회/사무실/상점 등 여러 공간을 하나의 앱으로 관리, 홈·제어·일정·손님·고지서·구매·대여품 7모듈)를 CrownyAI 신셸 모듈로 장착. office/building/erp/today와 동일 공정(무수정 원칙+WKUserScript 브릿지+scheme 배선). crowny://building(구 Space, 빌딩급 관제로 재분류)과는 별개 제품 — Space는 개인/가정 스케일 홈어시스턴트.
무엇을 했는지
- 사전조회:
crownycode-learn.sh search "브라우저 앱 장착" / "crowny-ai-content 모듈 배선" → MISS(기존 ERP/Today와 동일). search "동기화판정" → today의 동기화판정 패턴 HIT, 파리티로 재사용.
- 번들 편입 (원본 무수정, MD5 일치 확인
bf94ffeaaa76bf95dcb51287f5030f36):
-
bundle/space/app/index.html ←
~/Downloads/design_handoff_crowny_space/Crowny Space 앱 (standalone).html (4.25MB)
-
bundle/space/design/ ←
Crowny Space 앱.dc.html +
SpModule*.dc.html 7개 +
README.md (설계 참고 자산)
- self-contained 검증:
grep -oE 'src=["\']https?://...' → 0건(외부 실호출 없음, 폰트/런타임 내장).
- 브릿지:
-
bundle/space/bridge/spaceBridge.js — todayBridge.js 구조 미러(가드→WKUserScript atDocumentEnd→30초 폴링→DOM 이벤트 위임). 서버
http://127.0.0.1:9607 우선 →
https://space.crowny.org 폴백,
/health 확인 후
/api/entities·
/api/logbook·
/api/bills·
/api/cart 하이드레이션 +
/api/command 동기화. localStorage 오프라인 스토어(
crownySpace.entities/logbook/bills/cart/queue). DOM 캡처는 SpModuleControl.dc.html 실측 라벨("잠금"/"해제"/"1회용 코드 발급"/"게이트 열기"/"납부"/"담기"/"반납 확인") 기반 키워드 매칭, 실패해도 데이터 레이어는 항상 보존.
-
bundle/space/bridge/spaceBridge.한선 — 4상 판정 정본 2종: ①
동기화판정(today와 동일 시그니처·규칙, 파리티) ②
명령가드판정(엔티티 제어 안전게이트 — 안전규칙 최우선 티/카메라=음 이관/오프라인 중 lock·cover unlock·open=타 거부/온라인 시 옴 확인필요/그 외 티 즉시실행).
CROWNY_STRICT=1 컴파일 경고 0, 자체시험 20/20 ALL_PASS.
- 네이티브 배선 (
native/crowny-ai-content.m, ERP/Today 배선 구조 그대로 복제, 8지점):
-
caIsVectorService(L259)에 "스페이스"/"Space" 추가
-
caSpaceBridgeScriptSource()(L181) 신설 +
_ucc addUserScript(L742-746) 등록
- AI홈 타일(L484) "스페이스" 추가(투데이 옆)
- 북마크 v8 시드(L677-687,
crowny.ai.bookmarksSeeded.v8)
- file:// →
crowny://space 리매핑 2곳(L921 activateTabAtIndex, L1641-1642 KVO observeValueForKeyPath)
-
normalizeURLString(L1033-1037) 별칭: "space"/"스페이스"/"크라우니스페이스"
-
caOpenSpaceInActiveTab(L1186, app/index.html 단일 후보 — 빌딩·ERP·투데이와 동일하게 오피스식 다단 폴백 미사용)
-
navigateTo:(L1219-1221) 디스패치 추가
- 빌드:
cd native && make ai → 에러 0, 경고 0(cc -Wall -fobjc-arc), CrownyAI(519KB) 빌드 성공.
- 학습:
crownycode-learn.sh add "스페이스브릿지판정" "<spaceBridge.한선 전문>" 등록 완료.
관련 파일
/Users/ef/CrownyBrowser/native/crowny-ai-content.m — 배선 본체(이번 작업의 유일한 기존파일 수정)
/Users/ef/CrownyBrowser/bundle/space/app/index.html — 스페이스 앱 본체(원본 그대로, MD5 대조 일치)
/Users/ef/CrownyBrowser/bundle/space/design/ — dc.html 소스 8개 + README (참고용)
/Users/ef/CrownyBrowser/bundle/space/bridge/spaceBridge.js — 브릿지 JS(오프라인퍼스트+동기화+DOM캡처)
/Users/ef/CrownyBrowser/bundle/space/bridge/spaceBridge.한선 — 브릿지 판정 한선씨 정본(자체시험 20/20)
검증
CROWNY_STRICT=1 ./hanseonc_high spaceBridge.한선 → crownyc run: 통과=20 실패=0, ALL_PASS, STRICT 경고 0.
node --check spaceBridge.js: 문법 오류 0.
cd native && make ai: 에러 0·경고 0, CrownyAI(519,608B) 빌드 성공.
- 배선 8지점 grep 자기검증 전부 PASS(라인번호는 위 "네이티브 배선" 참조).
- touchedExistingFiles = [
native/crowny-ai-content.m] — 그 외 기존 파일(앱목록.psv, src/런처앱.한선, native/런처렌더.sh, gateway.yaml, LaunchAgent, crontab 등) 무접촉.
- 라이브 클릭 E2E(CDP/AppleScript/cliclick)는 이번 작업 범위 밖 — GUI 자동화는 사용자 활동 중 포커스레이스 사고 이력으로 금지된 지시사항이었고, 라이브 실행 확인은 메인 세션이 수행.
크라우니코드
lookup HIT 1건(동기화판정 파리티 재사용) / MISS 2건(spaceBridge.js, spaceBridge.한선 신규) / learn 추가 1건(스페이스브릿지판정).
잔여 이슈
space.crowny.org / 로컬 :9607 스페이스 서버는 다른 에이전트가 동시 구축 중 — 이번 배선 시점엔 미확인/미기동. 브릿지는 서버 부재를 오프라인퍼스트로 정상 감내하도록 설계했으나, 서버 기동 후 /api/entities·/api/command 등 실응답 스키마 대조 재검증 필요.
- spaceBridge.js의 DOM 캡처(엔티티 제어/코드발급/납부/담기/반납확인)는 SpModuleControl.dc.html 소스 라벨 기반 best-effort 추정 — 실제 컴파일된 standalone 렌더 DOM에서 셀렉터 정밀화(office/today 사례처럼 런타임 실측) 권장.
명령가드판정의 옴(확인필요) 판정은 현재 로컬에서 낙관적으로 큐잉만 하고 2차 확인 UI(사용자 컨펌 모달)는 미구현 — 실제 기기 구동은 서버 어댑터 책임이라는 전제로 설계했으나, 클라이언트 측 확인 UX는 다음 세션 트랙.
- 라이브 클릭 실측(CDP/AppleScript)은 이번 배선에서 다루지 않음.
bundle/space/design/은 복사만 하고 별도 열람 진입점은 만들지 않음(지시 범위 밖, ERP design/index.html과 동일 취급).