yoi/tickets/home-dir-layout.md

94 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ホームディレクトリ配下のディレクトリ整理
## 背景
現状、Insomnia のホーム配下のファイルは 2 つのツリーに分かれていて、規約が一貫していない:
- `$XDG_CONFIG_HOME/insomnia/` (fallback `~/.config/insomnia/`)
- `manifest.toml` (user manifest)
- `providers.toml` / `models.toml` (catalog user override、`crates/provider/src/catalog.rs`)
- `prompts/` / `prompts.toml` (user prompts、`crates/pod/src/prompt/loader.rs`)
- `~/.insomnia/`
- `sessions/` (session store、`crates/pod/src/main.rs:default_store_dir`)
- `run/` (XDG_RUNTIME_DIR 不在時の socket fallback、`crates/pod/src/runtime/dir.rs:default_runtime_base`)
config 系は XDG に従っているが、data / runtime 系は `~/.insomnia/` 直下に独自に積まれている。新しい機能(モデル設定 wizard 等)を足す前に、どこに何を置くかをはっきりさせたい。
## 方針候補
### 案 A: XDG 完全準拠
各ディレクトリを XDG Base Directory Specification に分ける:
| 種別 | XDG 変数 | fallback | 内容 |
|---|---|---|---|
| config | `$XDG_CONFIG_HOME/insomnia/` | `~/.config/insomnia/` | manifest / catalog / prompts |
| data | `$XDG_DATA_HOME/insomnia/` | `~/.local/share/insomnia/` | sessions |
| state | `$XDG_STATE_HOME/insomnia/` | `~/.local/state/insomnia/` | logs (将来) |
| runtime | `$XDG_RUNTIME_DIR/insomnia/` | `~/.cache/insomnia/run/` 等 | socket / scope lock |
**Pros**: 標準に従う。バックアップ対象dataと捨てて良いものruntimeが分離する。
**Cons**: ディレクトリが 3〜4 箇所に分散して把握しにくい。fallback 経路の選択も複雑。
### 案 B: `~/.insomnia/` 一元化
`~/.insomnia/` 配下に config も data も runtime も全部置く:
```
~/.insomnia/
manifest.toml # 旧 ~/.config/insomnia/manifest.toml
providers.toml # 旧 ~/.config/insomnia/providers.toml
models.toml
prompts/
sessions/
run/ # XDG_RUNTIME_DIR があればそちら、無ければここ
```
XDG 系の env が設定されていればそれを優先、無ければ `~/.insomnia/` で完結。
**Pros**: 全部同じ場所、ファイル探索 / バックアップ / 移行が楽。`~/.config/insomnia/` を見たときに「あれ、設定ここだっけ?」とならない。
**Cons**: XDG 規約から外れる。Linux ユーザの期待とずれる可能性。
### 案 C: ハイブリッド(現状の整理)
config だけ XDG、data / runtime は `~/.insomnia/` 配下を維持。位置は変えず命名と responsibility を整理:
```
$XDG_CONFIG_HOME/insomnia/ # 永続的な設定(人間が手で書く / 編集する)
manifest.toml
providers.toml
models.toml
prompts/
~/.insomnia/ # ランタイム & データ(プログラム生成・状態)
sessions/
run/
cache/ # 将来用
```
**Pros**: 「人が編集するもの」と「プロセスが書くもの」が物理的に分かれる。現状からの移行が小さい。
**Cons**: XDG 半準拠なので、XDG_DATA_HOME を尊重したいユーザは別途設定が必要。
## 設計で決めること
- **どの案を採用するか** (A / B / C のどれか、または別案)
- **環境変数による override**: `INSOMNIA_HOME` / `INSOMNIA_CONFIG_DIR` / `INSOMNIA_DATA_DIR` / `INSOMNIA_RUNTIME_DIR` のような上書き口を入れるか
- **マイグレーション**: 既存の `~/.insomnia/sessions/` / `~/.config/insomnia/manifest.toml` 配置を持つユーザの data を新パスに引き継ぐか、初回起動時にメッセージだけ出して移動はユーザに任せるか
- **socket / scope_lock の扱い**: runtime はマシン再起動で消えて良いものなので XDG_RUNTIME_DIR 優先で良いか、`~/.insomnia/run/` が常に唯一の置き場で良いか
- **prompts / catalog override の置き場**: config に近いので config 側でほぼ確定だが、project ローカル prompts (`<project>/.insomnia/prompts/`) との対応関係を整理する
## 完了条件
- 各ディレクトリの責務config / data / state / runtimeと置き場が docs か module レベル comment に明記されている
- pod / tui 各クレートの該当箇所(`pod/src/main.rs` / `pod/src/runtime/dir.rs` / `pod/src/runtime/scope_lock.rs` / `manifest/src/cascade.rs` / `provider/src/catalog.rs` / `pod/src/prompt/loader.rs`)が新規約に揃っている
- 既存ユーザ向けのマイグレーションパスが決まっている(自動 / 手動 / 何もしないのいずれか明文化)
- 新しいレイアウトで pod の起動と tui の spawn flow が引き続き動く
## 範囲外
- Windows / macOS のネイティブ規約(`%APPDATA%` / `~/Library/Application Support` 等)への対応。本チケットは Linux / 一般的な Unix 想定
- TUI 側で setup wizard が「どこに何を書く」表示するかの UX。本チケットの結論を `tickets/tui-user-model-setup.md` が前提として使う
## 後続チケット
- `tickets/tui-user-model-setup.md`: 本チケットで確定したレイアウトに従って user manifest を書き込む wizard を実装する