概要
.commandindex/ のデフォルトパスではなく、任意のパスにあるインデックスを参照する --index-path オプションを追加する。
背景・動機
シナリオ3(並列エージェントの共有知識): 複数 worktree が共通のインデックスを共有し、エージェント A の設計判断をエージェント B が検索できるようにする
提案する解決策
# 共有インデックスを参照して検索
commandindex search " 認証" --index-path /shared/.commandindex/
# 共有インデックスに対して update
commandindex update --index-path /shared/.commandindex/
# 設定ファイルでも指定可能
# commandindex.toml:
# [index]
# path = "/shared/.commandindex/"
--index-path と --path の関係
オプション
役割
例
--path
対象ディレクトリ(サブコマンドにより用途が異なる)
--path /my/repo
--index-path
インデックスの物理パス(.commandindex/ ディレクトリの代替)
--index-path /shared/.commandindex/
サブコマンドごとの --path の役割 :
サブコマンド
--path の役割
--path の有無
index
インデックス対象のリポジトリルート
あり(デフォルト .)
search
検索結果のパスフィルタ
あり(フィルタ用途)
update
更新対象のリポジトリルート
あり(デフォルト .)
status
状態表示対象のリポジトリルート
あり(デフォルト .)
context
現在なし(cwd基準)
なし → cwd基準を維持
embed
エンベディング対象のリポジトリルート
あり(デフォルト .)
export
現在なし(cwd基準)
なし → cwd基準を維持
import
現在なし(cwd基準)
なし → cwd基準を維持
clean
削除対象のリポジトリルート
あり(デフォルト .)
config
現在なし(cwd基準)
なし → cwd基準を維持
設定探索の基準パス : 各サブコマンドの --path(存在する場合)またはカレントディレクトリ(--path がないサブコマンド)を基準に commandindex.toml を探索する。
--index-path 未指定時: 従来通り {基準パス}/.commandindex/ を使用(後方互換)
--index-path 指定時: 指定パスをインデックスディレクトリとして使用
相対パスの解決基準
指定方法
相対パスの解決基準
CLI --index-path
カレントディレクトリ基準
commandindex.toml の [index].path
リポジトリルート(commandindex.toml の所在ディレクトリ)基準
対応サブコマンド
全サブコマンドで --index-path を受け付ける(Cli 構造体のグローバルオプションとして実装):
サブコマンド
対応
備考
index
○
インデックス作成先が変わる
search
○
全モード(fulltext/symbol/related/semantic)で一貫して効く
update
○
更新対象インデックスが変わる
status
○
状態表示対象が変わる
context
○
コンテキスト取得元が変わる
embed
○
エンベディング格納先が変わる
export
○
エクスポート元が変わる
import
○
インポート先が変わる
clean
○
削除対象が変わる(安全ガード付き)
config
○
config show で effective index path を表示、config path で effective index dir を追加表示
同時書き込み対策
Note : ファイルロックの具体的な実装は別Issueとして切り出し、本Issueでは --index-path によるパス指定機能のみにスコープを限定する。
SQLite の WAL モードで対応(複数プロセスからの同時読み取りは安全)
tantivy の書き込みはシングルライターを前提(tantivy 内部の meta.lock に依存)
重要 : 共有インデックスシナリオでは、tantivy の single-writer 制約と SQLite WAL の既存制約がこれまでよりユーザー影響の大きい前提になる。複数プロセスからの同時 update は tantivy のロックでエラーになる。この制約をドキュメントに明記する。
パス不存在時の挙動
コマンド種別
挙動
書き込み系(index, update, import)
指定パスが存在しなければ自動作成
読み取り系(search, status, context, export, embed)
指定パスが存在しなければエラー
clean
指定パスが存在しなければ「既に削除済み」メッセージ
設定ファイル対応
commandindex.toml の RawIndexConfig に path フィールドを追加:
[index ]
path = " /shared/.commandindex/"
languages = [" markdown" , " rust" ]
優先順位 : CLI --index-path > commandindex.toml の [index].path > デフォルト {基準パス}/.commandindex/
設定読み込みの分離
設定ファイル
探索パス
commandindex.toml(チーム設定)
リポジトリルート(--path or cwd)
config.local.toml(個人設定)
インデックスディレクトリ配下(--index-path or デフォルト)
legacy config.toml
インデックスディレクトリ配下
load_config のシグネチャを拡張して index_path: Option<&Path> を受け取る。
workspace では 1 repo あたり 1 回の設定解決に集約し、不要な I/O を避ける。
出力メッセージのパス対応
以下のハードコードメッセージを実際のインデックスパスを使った動的メッセージに変更:
main.rs: 「Index saved to .commandindex/」→ 実パス表示
main.rs: 「Removed index at .commandindex/」→ 実パス表示
clean の完了メッセージ
上記に依存する CLI/E2E テストの期待値も更新
workspace との相互作用
workspace 横断の search / status / update で、各リポジトリの commandindex.toml の [index].path 設定を尊重
SearchContext に index_path_override フィールドを追加して、カスタムパスを伝搬
workspace 解決時の index existence check も [index].path を参照
1 repo あたり 1 回の設定解決に集約してパフォーマンスを維持
parser/ignore.rs の除外パターン
デフォルト除外パターン .commandindex/** は維持
--index-path でリポジトリ内の別パスを指定した場合のみ、そのパスも動的に除外パターンに追加
リポジトリ外パスの場合は walkdir のスキャン範囲外のため追加不要
既存の .cmindexignore との合成結果が正しいことをテストで検証
共有 index を repo 配下に置いた場合の自己インデックス防止をテスト
clean の安全ガード
symlink 拒否を継続
--index-path 指定時は指定パスを直接クリーン対象とする
削除対象はインデックスディレクトリ直下のファイルに限定
keep_embeddings オプション時は embeddings.db を保存
存在しない場合は「既に削除済み」メッセージ
ヘルプ・ドキュメント更新
--path を持たないサブコマンド(context, export, import, config)の usage/help に --index-path の説明を追加
共有インデックス使用時の同時書き込み制約をREADMEまたはヘルプに記載
status --detail の既存 cwd 依存バグ(load_config(Path::new(".")) 固定)を本 Issue で合わせて修正
テスト戦略
既存テスト
後方互換性テストとしてそのまま維持
出力メッセージの動的化に伴う期待値の更新
新規テスト
受け入れ基準
--index-path グローバルオプションで任意パスのインデックスを参照できる
commandindex.toml の [index] path でも指定可能(RawIndexConfig に path フィールド追加)
[index].path の相対パスはリポジトリルート基準で解決される
全サブコマンド(index, search, update, status, context, embed, export, import, clean)で正しく動作する
search の全モード(fulltext/symbol/related/semantic)で --index-path が一貫して効く
--index-path 未指定時は従来通り {基準パス}/.commandindex/ を使用(後方互換)
INDEX_DIR_NAME 定数の重複を解消(lib.rs に一元化、indexer/mod.rs の COMMANDINDEX_DIR を廃止)
ヘルパー関数がインデックスパスを直接受け取る設計に変更
Path::new(".") ハードコード箇所の解消(search全モード, context, config, export, import, status)
config show で effective index path を表示
出力メッセージが実際のインデックスパスを反映(index, clean の完了メッセージ)
workspace 横断の search / status / update が [index].path を尊重
clean の安全ガード(symlink拒否、削除対象限定、keep_embeddings対応)
status --detail の既存 cwd 依存バグ修正
共有インデックスの同時書き込み制約をドキュメントに明記
既存テストが後方互換性を維持
新規テスト(テスト戦略セクション参照)が全パス
cargo test / clippy / fmt 全パス
実装規模
中
推奨実装順序
INDEX_DIR_NAME 定数の統一
load_config シグネチャ拡張 + RawIndexConfig.path 追加
Cli 構造体にグローバルオプション追加 + 各関数シグネチャ変更
各サブコマンド対応(search全モード, context, config, export, import, status, clean)
workspace 対応(search / status / update、1 repo 1 回の設定解決)
parser/ignore.rs の動的除外
出力メッセージの動的化
ヘルプ・ドキュメント更新
テスト追加(既存テスト期待値更新 + 新規テスト)
関連シナリオ
概要
.commandindex/のデフォルトパスではなく、任意のパスにあるインデックスを参照する--index-pathオプションを追加する。背景・動機
提案する解決策
--index-path と --path の関係
--path--path /my/repo--index-path.commandindex/ディレクトリの代替)--index-path /shared/.commandindex/サブコマンドごとの
--pathの役割:--pathの役割--pathの有無index.)searchupdate.)status.)contextembed.)exportimportclean.)config設定探索の基準パス: 各サブコマンドの
--path(存在する場合)またはカレントディレクトリ(--pathがないサブコマンド)を基準にcommandindex.tomlを探索する。--index-path未指定時: 従来通り{基準パス}/.commandindex/を使用(後方互換)--index-path指定時: 指定パスをインデックスディレクトリとして使用相対パスの解決基準
--index-pathcommandindex.tomlの[index].path対応サブコマンド
全サブコマンドで
--index-pathを受け付ける(Cli構造体のグローバルオプションとして実装):indexsearchupdatestatuscontextembedexportimportcleanconfigconfig showで effective index path を表示、config pathで effective index dir を追加表示同時書き込み対策
パス不存在時の挙動
設定ファイル対応
commandindex.tomlのRawIndexConfigにpathフィールドを追加:優先順位: CLI
--index-path>commandindex.tomlの[index].path> デフォルト{基準パス}/.commandindex/設定読み込みの分離
commandindex.toml(チーム設定)--pathor cwd)config.local.toml(個人設定)--index-pathor デフォルト)config.tomlload_configのシグネチャを拡張してindex_path: Option<&Path>を受け取る。workspace では 1 repo あたり 1 回の設定解決に集約し、不要な I/O を避ける。
出力メッセージのパス対応
以下のハードコードメッセージを実際のインデックスパスを使った動的メッセージに変更:
main.rs: 「Index saved to .commandindex/」→ 実パス表示main.rs: 「Removed index at .commandindex/」→ 実パス表示cleanの完了メッセージworkspace との相互作用
commandindex.tomlの[index].path設定を尊重SearchContextにindex_path_overrideフィールドを追加して、カスタムパスを伝搬[index].pathを参照parser/ignore.rs の除外パターン
.commandindex/**は維持--index-pathでリポジトリ内の別パスを指定した場合のみ、そのパスも動的に除外パターンに追加.cmindexignoreとの合成結果が正しいことをテストで検証clean の安全ガード
--index-path指定時は指定パスを直接クリーン対象とするkeep_embeddingsオプション時は embeddings.db を保存ヘルプ・ドキュメント更新
--pathを持たないサブコマンド(context, export, import, config)の usage/help に--index-pathの説明を追加status --detailの既存 cwd 依存バグ(load_config(Path::new("."))固定)を本 Issue で合わせて修正テスト戦略
既存テスト
新規テスト
--index-pathでカスタムパスにインデックスを作成・検索・更新・削除commandindex.tomlの[index].pathでのインデックスパス指定[index].pathの相対パスがリポジトリルート基準で解決されることの検証--index-path> config[index].path> デフォルト)--index-path動作[index].path尊重受け入れ基準
--index-pathグローバルオプションで任意パスのインデックスを参照できるcommandindex.tomlの[index] pathでも指定可能(RawIndexConfigにpathフィールド追加)[index].pathの相対パスはリポジトリルート基準で解決される--index-pathが一貫して効く--index-path未指定時は従来通り{基準パス}/.commandindex/を使用(後方互換)INDEX_DIR_NAME定数の重複を解消(lib.rsに一元化、indexer/mod.rsのCOMMANDINDEX_DIRを廃止)Path::new(".")ハードコード箇所の解消(search全モード, context, config, export, import, status)config showで effective index path を表示[index].pathを尊重status --detailの既存 cwd 依存バグ修正実装規模
中
推奨実装順序
INDEX_DIR_NAME定数の統一load_configシグネチャ拡張 +RawIndexConfig.path追加Cli構造体にグローバルオプション追加 + 各関数シグネチャ変更関連シナリオ