4.4 KiB
4.4 KiB
TUI # Knowledge 補完の未実装解消
背景
TUI 入力欄で # を打つと CompletionKind::Knowledge で Pod に ListCompletions を投げる導線は既にある(crates/tui/src/input.rs、crates/tui/src/app.rs)。一方 Pod 側 IPC は crates/pod/src/ipc/server.rs:105 で
protocol::CompletionKind::Knowledge => Vec::new(),
と無条件に空ベクタを返しており、ワークスペースに knowledge エントリがあっても TUI 上では候補が一切出ない。# で何も出ないのはフロントマター(model_invokation)の問題ではなく、補完経路そのものが未配線。
Workflow 側は同じ構造で既に動いている:
Pod::workflow_completions()→Vec<String>(crates/pod/src/pod.rs:1236)PodController::startでPodSharedState::set_workflows()に投入(crates/pod/src/controller.rs:385)- IPC が
shared_state.list_workflow_completions(prefix)を引いて返す
Knowledge も同じ形に揃えれば足りる。
前提
- knowledge の物理レイアウトは
<workspace>/.insomnia/knowledge/<slug>.md(crates/memory/src/workspace.rs)。 - memory クレートには
collect_resident_knowledgeがあるが、これはmodel_invokation: trueのみを返す resident-injection 用 API で、補完用途には不適。 #補完では「ユーザーが参照可能な knowledge slug すべて」を返したい(model_invokationは resident 注入対象のフラグであって参照可否ではない)。- workflow の
list_user_invocableに相当する「列挙 API」が memory クレートに無いので追加が要る。
方針
- memory クレートに「knowledge slug 一覧を返す」公開 API を追加する。
collect_resident_knowledgeとは別関数とし、model_invokationでフィルタしない。frontmatter が壊れているファイルは silently skip する(collect_resident_knowledgeと同じく Linter が write 時に shape を保証する前提)。 PodSharedStateに knowledge 候補スロット(workflowsと同形のOnceLock<Vec<...>>)を追加し、PodController::startで memory layout から列挙して投入する。memory layout 未設定の Pod(Pod::memory_layoutがNone)では空のまま残す。- IPC server の
CompletionKind::Knowledge分岐を、shared_state.list_knowledge_completions(&prefix)を引いてCompletionEntry { value: slug, is_dir: false }に詰める実装に置き換える。 - 補完結果の並びは slug 昇順、prefix マッチは
starts_with(workflow と揃える)。
要件
- TUI で
#を入力した状態で、ワークスペース.insomnia/knowledge/配下に存在する slug(model_invokationの真偽に関わらず)が候補として列挙される。 #fooのように prefix 入力中の場合、prefix にマッチする slug のみが返る。- memory layout が無効な Pod(
memory_layout: None)では空ベクタが返り、エラーにはならない。 - 確定時の挙動(
replace_with_knowledge_ref→Segment::KnowledgeRef化、#slugチップ表示)は既存の TUI 側の実装をそのまま使う。Pod 側補完を埋めるだけで TUI 改修は不要。 - 単体テストで以下をカバーする
- 全件列挙(複数 slug、
model_invokation: true/false混在で全部返る) - prefix フィルタ
- knowledge ディレクトリ不在時の空ベクタ
- 壊れた frontmatter /
.md以外のファイルがスキップされる
- 全件列挙(複数 slug、
範囲外
- knowledge のフロントマター仕様変更や、補完候補に description / model_invokation を載せて TUI で表示する強化(
CompletionEntry.value以外の表示は別チケットで検討) - workflow / file の補完経路への手入れ
- resident 注入経路(
collect_resident_knowledgeの挙動)の変更
参照
- 未実装箇所:
crates/pod/src/ipc/server.rs:105 - mirror 対象:
crates/pod/src/pod.rs:1236(workflow_completions)、crates/pod/src/shared_state.rs:74-89、crates/pod/src/controller.rs:385-390 - TUI 側既存導線:
crates/tui/src/input.rs:260、crates/tui/src/app.rs:281,315 - 列挙対象:
crates/memory/src/workspace.rs(knowledge_dir)、crates/memory/src/resident.rs(参考)
Review
- 状態: Approve
- レビュー詳細: ./tui-knowledge-completion.review.md
- 日付: 2026-05-12