크라우니터미널 (terminal.crowny.org) — MVP1 초안
개요
각 crowny.org 서비스 페이지의
크라우니코드 모달창과 맥 로컬의
클로드 코드 + 크라우니코드 세션을 1:1로 이어주는 세션 오케스트레이터. 여러 터미널 창에 따로따로 입력하던 문제를 서비스별 고정 세션 + 웹 브리지로 해결한다.
아키텍처 (선택)
방식 B —
맥 로컬 데몬 우선. 무거운 Tauri/Electron 대신 Node.js + node-pty + WebSocket만으로 MVP1 구성.
[서비스 페이지 모달] ─ WS ─> [로컬 데몬 :9400] ─ pty ─> [zsh + claude + 크라우니코드]
│
└─ :9401 정적 UI (xterm.js 허브)
MVP1에서 한 것
- 로컬 데몬 (
src/daemon.js) — node-pty로 서비스별 세션 spawn, WebSocket 브리지, 버퍼 재생, 토큰 인증.
- 서비스 YAML 4종 —
play / church / network / terminal. 각 세션에 cwd / allowed_paths / blocked_paths / skill_profile 정의.
- 웹 허브 UI (
web/index.html) — xterm.js 기반 다중 탭 터미널, 서비스/세션 드롭다운, 토큰 저장.
- CLI (
bin/cli.js) — start/stop/status/token/services/open.
핵심 설계
- 세션 격리:
serviceId/sessionId 키로 pty 인스턴스 유지. 웹 모달 재연결 시 버퍼 재생으로 맥락 복원.
- 환경 변수 주입:
CROWNY_SERVICE / CROWNY_SESSION / CROWNY_ALLOWED_PATHS / CROWNY_BLOCKED_PATHS — 세션 내부에서 허용 경로 판정에 사용.
- 인증: 랜덤 24바이트 토큰을
data/.token에 저장. WS 연결 시 쿼리로 전달.
- 초기 배너: 세션 시작 시 서비스/세션/톤/허용·금지 경로를 주석으로 주입 → 이후 사용자가
claude를 띄우면 클로드가 이 배너를 읽고 맥락 파악.
관련 파일
/Users/ef/crowny-terminal/src/daemon.js — 데몬 본체
/Users/ef/crowny-terminal/bin/cli.js — CLI
/Users/ef/crowny-terminal/web/index.html — xterm UI 허브
/Users/ef/crowny-terminal/services/*.yml — 서비스 정의 4종
/Users/ef/crowny-terminal/data/.token — 로컬 인증 토큰
실행
bashcd /Users/ef/crowny-terminal
node bin/cli.js start
node bin/cli.js open # 브라우저에서 xterm 허브 열기
node bin/cli.js token # 토큰 복사 → 웹 UI에 붙여넣기
MVP2 (완료)
web/modal.js — 서비스 페이지에 삽입할 플로팅 모달 SDK. data-service 속성으로 자동 초기화.
- 컨텍스트 자동 캡처: URL/섹션ID/선택 텍스트/viewport → 세션에 CTX JSON으로 주입.
web/demo.html — 통합 테스트용 데모 페이지.
- 데몬에 CORS 헤더 추가 (외부 오리진에서 로드 가능).
MVP3 (완료)
/api/status /api/diff /api/approve /api/revert HTTP API 추가.
- 허용 경로 정책 강제: 세션의
allowed_paths/blocked_paths 밖 변경이 포함된 approve는 403 거부. 검증: data/daemon.log 변경 포함 시 거부, src/daemon.js 변경만 있을 때 승인 성공 → [master 86e7f6e] mvp3: verify approve path 커밋.
- 모달 UI에 "변경/승인" 탭 추가: diff 컬러 렌더 + 승인+커밋 / 되돌리기 버튼.
- revert:
git checkout -- . + git clean -fd (경로 지정 시 해당 경로만).
MVP4 (완료) — terminal.crowny.org 게이트웨이 노출
- 포트 통합: WS 9400 + HTTP 9401 → 단일 9840 (gateway upstream 한 개 제약 충족, 9400은 crowny-bank가 점유).
- WS를 별도 서버 대신
httpServer.on('upgrade')로 attach → /ws 경로.
- gateway.yaml에
crowny-terminal 엔트리 추가 (websocket:true, timeout:86400, CORS 9개 서비스).
- gateway 마스터에 SIGHUP → 핫리로드 → admin API에서
terminal.crowny.org 라우트 확인.
- 통합 테스트:
Host: terminal.crowny.org 헤더로 :8080 경유 HTTP 200, WS 업그레이드 → READY 메시지.
- 버그 수정:
node-pty prebuild의 spawn-helper 실행 권한 손실 → posix_spawnp failed. chmod +x 로 해결, postinstall 스크립트로 재발 방지.
MVP5 (완료) — 세션 자동 claude 기동
- 서비스 YAML에
auto_claude: true 추가 시 세션 spawn 후 600ms 뒤 claude --append-system-prompt "$(cat <prompt-file>)" 자동 실행.
- 초기 프롬프트에 서비스 도메인/톤/허용·금지 경로/스킬 프로필/diff 승인 규칙/
/크라우니코드 진입 명령 포함.
- 버그 수정: 초기 banner를 shell echo로 주입하면 zsh가 multiline quote(
cmdand quote>)를 열어 claude 기동을 막음. banner를 pty가 아닌 클라이언트 화면 버퍼에만 직접 push로 변경.
MVP6 (완료) — 실제 서비스 경로 매핑
10개 서비스 YAML 등록 + 실제 디렉토리 검증:
play, church, network, market, bank, int, mind, solution, enterprise, terminal
모두 /Users/ef/crowny-* 실제 경로 존재 확인.
각 서비스마다 차별화된 tone, allowed_paths, blocked_paths (특히 bank의 genesis/keys, mind의 SAP/ERP 금지 톤).운영 메모
- gateway SIGHUP:
kill -HUP $(ps ax | grep openclaw-gateway | grep -v grep | head -1 | awk '{print $1}')
- TLS: 현재 cert가 crownybus.com용 SAN. terminal.crowny.org은
gateway.yaml의 ssl 자동갱신(ACME)으로 처리되거나 SAN에 추가 필요.
- 데몬 자동 시작은 LaunchAgent 구성 미정 (수동
node bin/cli.js start).
한선씨 동반 (완료)
한선씨/모달.한선 — modal.js 핵심 로직: 컨텍스트캡처, 페이로드 조립, WS 상태기계 (학습DB: crowny_terminal_모달_sdk_로직)
한선씨/데몬.한선 — daemon.js 핵심 로직: 서비스 등록, 허용 경로 정책, 승인 판정 (학습DB: crowny_terminal_데몬_경로정책)
- 한선씨 구현 불가 구간: pty 네이티브 바인딩, 브라우저 DOM. → 중기에 crownyc C 확장(
pty.한선)으로 해결 예정.
play.crowny.org 모달 삽입 (완료)
index.html, app.html 하단에 <script src="https://terminal.crowny.org/modal.js" data-service="play" data-session="play-ui"> 삽입.
.app 번들화 (완료 — 2026-04-17)
/Applications/크라우니터미널.app 설치 (144KB)
- Info.plist + AppIcon.icns + 한선씨 Resources 번들
- Launchpad/Spotlight에서 "크라우니터미널" 검색 가능.
modal.js 전 서비스 삽입 (완료 — 2026-04-17)
- 9개 서비스 HTML에
terminal.crowny.org/modal.js 삽입:
play(index+app), church, market, bank, int, mind, solution, network.
LaunchAgent 자동 시작 (완료 — 2026-04-17)
~/Library/LaunchAgents/org.crowny.terminal.plist 등록.
- RunAtLoad + KeepAlive → 부팅 시 자동 실행, 크래시 시 자동 재시작.
다음 단계 후보
- LaunchAgent: 부팅 시 데몬 자동 시작.
- 서비스 모달 실제 삽입: 각 crowny.org 서비스 페이지의 공통 레이아웃에
<script src="https://terminal.crowny.org/modal.js" data-service="..." data-host="terminal.crowny.org"> 삽입.
- 배포 승인 훅: approve 후 crowny-hub commit + 배포 트리거.
- 기존 터미널 작업 점진 치환: 19+ 동시 세션이 LIVE_STATUS.md 기반으로 일부 태스크를 크라우니터미널 탭으로 이관.
- Tailscale 게이트웨이: 현재 127.0.0.1 바인딩. 외부 모달에서 접근하려면 crowny-gateway 또는 Tailscale 경유 리버스 프록시 필요.
- claude 자동 기동: 현재는 zsh 프롬프트에서 수동으로
claude 실행. 세션 생성 시 자동 기동 + 초기 프롬프트 주입 옵션 필요.
- 서비스 실제 경로:
play/church/network의 root_path는 placeholder. 실제 프로젝트 디렉토리 확인되는 대로 갱신.