yoi/tickets/pod-module-layout.md
2026-04-24 11:48:27 +09:00

98 lines
4.8 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.

# pod クレートのモジュール分割
## 背景
`crates/pod/src/` は 25 ファイル・約 10k 行がフラットに並んでおり、責務の軸が立っていない。命名も `pod_events` / `pod_interceptor` / `pod_comm_tools` のように、所属クレート名である `pod_` prefix を冗長に付けているものと、`spawn_pod` / `spawned_pod_registry` のように prefix なしのものが混在しており、どの単位で読むべきかが構造から読み取れない。
同規模の `llm-worker``llm_client/scheme/{anthropic,gemini,...}/``timeline/` でサブモジュール化されており、`provider` も `codex_oauth/` を切っている。`pod` だけが規模に対して階層を持っていない。
## 要件
### 目標レイアウト
```
crates/pod/src/
├── lib.rs
├── main.rs
├── pod.rs ← Pod 本体
├── controller.rs ← PodController / PodHandle
├── factory.rs ← manifest cascade からの組み立て
├── shared_state.rs ← 横断的な共有状態
├── ipc/ ← Pod ↔ クライアント(自 Pod の対外 socket
│ ├── mod.rs
│ ├── server.rs ← socket_server.rs
│ ├── event.rs ← pod_events.rs
│ ├── interceptor.rs ← pod_interceptor.rs
│ ├── notifier.rs
│ └── notification_buffer.rs
├── spawn/ ← Pod ↔ Pod親子関係とツール群
│ ├── mod.rs
│ ├── tool.rs ← spawn_pod.rs
│ ├── registry.rs ← spawned_pod_registry.rs
│ └── comm_tools.rs ← pod_comm_tools.rs
├── prompt/
│ ├── mod.rs
│ ├── catalog.rs ← prompts.rs
│ ├── loader.rs ← prompt_loader.rs
│ ├── system.rs ← system_prompt.rs
│ └── agents_md.rs
├── compact/
│ ├── mod.rs
│ ├── state.rs ← compact_state.rs
│ ├── worker.rs ← compact_worker.rs
│ ├── token_counter.rs
│ ├── usage_tracker.rs
│ └── prune.rs
├── hook.rs ← フック基盤(将来拡張予定だが現在 1 ファイルなのでフラットに残す)
├── interrupt_and_run.rs ← `impl Pod` の付加メソッドpod.rs の延長)
└── runtime/
├── mod.rs
├── dir.rs ← runtime_dir.rs
└── scope_lock.rs
```
### 軸の置き方
- **`ipc/` と `spawn/` を分離**する: 前者は「自 Pod 外界(クライアント)との通信」、後者は「他 Podとの通信」。対向が違うので混ぜない。
- **`compact/` に会計系を集約**する: `token_counter` / `usage_tracker` / `prune` は compaction の判断材料として利用側から見ると一塊。
- **トップレベルに残すのは核 4 個**: `pod` / `controller` / `factory` / `shared_state`。どのサブに入れても不自然になる「束ねる側」。
- **`pod_` prefix を全廃**する: `pod` crate 内で `pod::pod_events` は冗長。`pod::ipc::event` にする。
### 公開 API パスの変化
`lib.rs``pub mod` 経由で露出している型は外部からパスが変わる。例:
| 旧 | 新 |
|---|---|
| `pod::socket_server::SocketServer` | `pod::ipc::server::SocketServer` |
| `pod::pod_events::{...}` | `pod::ipc::event::{...}` |
| `pod::pod_comm_tools::{...}` | `pod::spawn::comm_tools::{...}` |
| `pod::spawn_pod::spawn_pod_tool` | `pod::spawn::tool::spawn_pod_tool` |
| `pod::spawned_pod_registry::SpawnedPodRegistry` | `pod::spawn::registry::SpawnedPodRegistry` |
| `pod::runtime_dir::{...}` | `pod::runtime::dir::{...}` |
| `pod::scope_lock::{...}` | `pod::runtime::scope_lock::{...}` |
現時点で `pod::XXX` パスを参照しているのは `crates/pod/tests/` のみで、他クレートからの `use pod::<submodule>` 参照は無い(`manifest` / `llm-worker` 内の該当箇所はコメントのみ)。
### スコープ外
- `pod.rs`1496 行)・`scope_lock.rs`1103 行)自体の内部分割は別チケット。本チケットは **ファイルの配置と命名の変更のみ** を扱い、1 ファイルの中身は移動だけに留める。
- `lib.rs``pub use` re-export で旧パスを残す互換レイヤは作らない(外部参照が tests のみで、一斉更新できるため)。
### 完了条件
- 新構造でビルドが通る (`cargo check`)
- `crates/pod/tests/` が全部緑 (`cargo test -p pod`)
- 既存の振る舞いに変更なし(純粋な再配置)
## Review
- 状態: Approve with follow-up
- レビュー詳細: [./pod-module-layout.review.md](./pod-module-layout.review.md)
- 日付: 2026-04-24