Skip to content

[Feature] --index-path オプション(インデックスパス指定) #88

@Kewton

Description

@Kewton

概要

.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.tomlRawIndexConfigpath フィールドを追加:

[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 設定を尊重
  • SearchContextindex_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 でのインデックスパス指定
  • [index].path の相対パスがリポジトリルート基準で解決されることの検証
  • 優先順位テスト(CLI --index-path > config [index].path > デフォルト)
  • search の全モード(fulltext/symbol/related/semantic)での --index-path 動作
  • workspace 横断の search / status / update での [index].path 尊重
  • clean の安全ガード(symlink拒否、削除対象限定、keep_embeddings)
  • parser/ignore.rs のリポジトリ内カスタムパス除外
  • parser/ignore.rs のリポジトリ外パス(除外不要)
  • 共有 index を repo 配下に置いた場合の自己インデックス防止
  • export/import で custom index path 使用時の state 整合性
  • パス不存在時の挙動(書き込み系: 自動作成、読み取り系: エラー)

受け入れ基準

  • --index-path グローバルオプションで任意パスのインデックスを参照できる
  • commandindex.toml[index] path でも指定可能(RawIndexConfigpath フィールド追加)
  • [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.rsCOMMANDINDEX_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 全パス

実装規模

推奨実装順序

  1. INDEX_DIR_NAME 定数の統一
  2. load_config シグネチャ拡張 + RawIndexConfig.path 追加
  3. Cli 構造体にグローバルオプション追加 + 各関数シグネチャ変更
  4. 各サブコマンド対応(search全モード, context, config, export, import, status, clean)
  5. workspace 対応(search / status / update、1 repo 1 回の設定解決)
  6. parser/ignore.rs の動的除外
  7. 出力メッセージの動的化
  8. ヘルプ・ドキュメント更新
  9. テスト追加(既存テスト期待値更新 + 新規テスト)

関連シナリオ

  • scenario.md シナリオ3

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions