← 목록
기타 2026-04-15 8KB 읽기 9분

크라우니터미널 (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에서 한 것

  1. 로컬 데몬 (src/daemon.js) — node-pty로 서비스별 세션 spawn, WebSocket 브리지, 버퍼 재생, 토큰 인증.
  2. 서비스 YAML 4종 — play / church / network / terminal. 각 세션에 cwd / allowed_paths / blocked_paths / skill_profile 정의.
  3. 웹 허브 UI (web/index.html) — xterm.js 기반 다중 탭 터미널, 서비스/세션 드롭다운, 토큰 저장.
  4. 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/networkroot_path는 placeholder. 실제 프로젝트 디렉토리 확인되는 대로 갱신.