永続化
MadoHub が何を、どこに、どのように保存するか。
MadoHub はワークスペースの状態をディスクに永続化するため、アプリを再起動するとすべて復元されます。永続化されたワークスペースデータはすべてローカルのマシンに保存されます。
保存先
すべてのファイルは ~/.madohub/ に保存されます。
~/.madohub/
├── canvas-state.json # 完全なキャンバス状態
├── config.json # アプリ設定
├── chat-history.json # チャットメッセージ履歴
├── memory-policies.json # メモリ自動注入ポリシー
├── templates/
│ └── <slug>.json # 保存済みワークスペーステンプレートごとに1つ
├── flows/
│ └── <id>.json # 保存済みフローごとに1つ
├── logs/
│ └── madohub.log # アプリケーションログ
├── notifications/ # Stop フックの完了マーカー
└── orchestrator/ # オーケストレーターモードの状態保存される内容
Canvas state (canvas-state.json)
| データ | 詳細 |
|---|---|
| Tiles | タイプ、位置、サイズ、z-index、ファイルパス、作業ディレクトリ |
| Frames | ワークスペースパス、色、位置 |
| Viewport | パンのオフセット(X/Y)とズームレベル |
| Connections | トリガー / Transform 設定を含むすべてのルーティング接続 |
| Settings | API プロバイダー、キー、モデル、通知フックの状態 |
| Max z-index | 新しいタイルの重なり順 |
| Dismissed sessions | 非表示にした tmux セッション |
App config (config.json)
| データ | 詳細 |
|---|---|
| Hooks state | Claude Code の通知フックが有効かどうか |
| Workspaces(レガシー、無効) | config のスキーマには登録済みプロジェクトディレクトリの一覧とアクティブなワークスペース ID がまだ定義されていますが、それらの保存・読み込み関数を呼び出すフロントエンドのコードパスは存在せず、実質的に使われていません。プロジェクト単位の状態を表す現行の概念は frame であり、canvas-state.json に保存されます。 |
保存の仕組み
- Auto-save: キャンバス、接続、または設定が変わるたびに保存します。
- Debounced: 500ms 遅延でまとめて書き込みます。
- Atomic writes: まず一意なサイドカーファイル(
<name>.tmp.<pid>.<seq>)に書き込み、その後 rename して配置します。これにより、アプリが書き込み中にクラッシュしても破損を防げます。 - 破損時のリカバリ: 読み込み時に JSON としてパースできないファイルがあった場合、その内容はコンテンツアドレス方式の
<name>.corrupt.<hash>(再起動をまたいでも安定)というサイドカーファイルに退避され、読み込みはエラーにする代わりにデフォルト値にフォールバックします。
保存されないもの
- ターミナルセッションの内容(PTY 出力は一時的)
- クリップボードの内容