지속성
MadoHub이 무엇을 어디에 어떻게 저장하는지 설명합니다.
MadoHub은 워크스페이스 상태를 디스크에 저장하므로 앱을 다시 실행하면 모든 것이 복원됩니다. 저장된 워크스페이스 데이터는 모두 로컬 머신에 보관됩니다.
저장 위치
모든 파일은 ~/.madohub/에 저장됩니다:
~/.madohub/
├── canvas-state.json # 전체 캔버스 상태
├── config.json # 앱 설정
├── chat-history.json # 채팅 메시지 기록
├── memory-policies.json # 메모리 자동 주입 정책
├── templates/
│ └── <slug>.json # 저장된 워크스페이스 템플릿마다 하나씩
├── flows/
│ └── <id>.json # 저장된 flow마다 하나씩
├── logs/
│ └── madohub.log # 애플리케이션 로그
├── notifications/ # Stop 훅 완료 마커
└── orchestrator/ # 오케스트레이터 모드 상태저장되는 항목
캔버스 상태 (canvas-state.json)
| 데이터 | 세부 내용 |
|---|---|
| Tiles | 유형, 위치, 크기, z-index, 파일 경로, 작업 디렉터리 |
| Frames | 워크스페이스 경로, 색상, 위치 |
| Viewport | 팬 오프셋(X/Y) 및 줌 레벨 |
| Connections | 트리거/변환 설정이 포함된 모든 라우팅 연결 |
| Settings | API 공급자, 키, 모델, 알림 훅 상태 |
| Max z-index | 새 타일의 스태킹 순서 |
| Dismissed sessions | 숨겨진 tmux 세션 |
앱 설정 (config.json)
| 데이터 | 세부 내용 |
|---|---|
| Hooks state | Claude Code 알림 훅 활성화 여부 |
| Workspaces (레거시, 비활성) | config 스키마에는 등록된 프로젝트 디렉터리 목록과 활성 워크스페이스 ID가 여전히 정의되어 있지만, 이를 저장/로드하는 프런트엔드 코드 경로가 전혀 없어 사실상 죽은 코드입니다. 프로젝트별 상태를 나타내는 실제 개념은 frame이며, canvas-state.json에 저장됩니다. |
저장 방식
- 자동 저장: 캔버스, 연결, 설정이 변경될 때마다 실행됩니다.
- 지연 처리: 500ms 지연으로 빠른 변경을 묶어서 처리합니다.
- 원자적 쓰기: 데이터를 고유한 사이드카 파일(
<name>.tmp.<pid>.<seq>)에 먼저 쓴 뒤 제자리로 이름을 바꿉니다. 앱이 쓰는 도중에 충돌해도 손상을 막습니다. - 손상 복구: 로드 시 어떤 파일이 JSON으로 파싱되지 않으면, 그 바이트는 콘텐츠 해시 기반의
<name>.corrupt.<hash>사이드카 파일로 격리되고(재시작해도 동일하게 유지됨), 로딩은 실패하는 대신 기본값으로 대체됩니다.
저장되지 않는 항목
- 터미널 세션 콘텐츠(PTY 출력은 휘발성입니다)
- 클립보드 내용