概要
commandindex index コマンドを実装する。リポジトリ内のMarkdownファイルを解析し、tantivy インデックスを構築する。
背景・動機
Phase 1 の主要コマンド。パーサー・インデックス・状態管理を統合し、検索可能なインデックスを生成する。
提案する解決策
処理フロー
--path オプションで対象ディレクトリを決定(デフォルト: カレントディレクトリ)
- 対象ディレクトリの存在を確認(不在の場合はエラー終了)
.cmindexignore を読み込み、除外ルールを構築(IgnoreFilter::from_file())
- 対象ディレクトリを
walkdir で再帰走査し、.md ファイルを列挙
IgnoreFilter::is_ignored() で除外ルールによるフィルタリング
- 各ファイルを
parser::markdown::parse_file() で個別パース(heading分割、frontmatter抽出、tag抽出、リンク抽出)
- パース結果を
SectionDoc に変換し、IndexWriterWrapper で tantivy インデックスに書き込み
Manifest にファイルエントリ(パス・ハッシュ・セクション数)を追加
IndexWriterWrapper::commit() でインデックスを確定
manifest.json を .commandindex/ に保存
state.json を .commandindex/ に保存(ファイル数・セクション数を記録)
- 結果サマリーを標準出力に表示
設計方針
- ファイル列挙・フィルタリング: index コマンド側で
walkdir + IgnoreFilter によりファイルを列挙し、parse_file() を個別呼び出しする。既存の parse_directory() は変更せず、index コマンドの責務としてフィルタリングを統合する。
- コマンドロジックの配置:
cli/ モジュールを新設し、index コマンドのロジックを分離する(CLAUDE.md Phase 1 モジュール構成に準拠)。main.rs はサブコマンドのディスパッチのみ。
- パースエラー時: ファイル単位でスキップし、警告を出力。他のファイルの処理は続行する。
CLI オプション
commandindex index [--path <dir>] # デフォルト: カレントディレクトリ
Index サブコマンドに --path オプション(Option<PathBuf>、デフォルト: .)を追加する。
上書き再構築の挙動
既に .commandindex/ が存在する場合:
.commandindex/tantivy/ ディレクトリを削除
- 新規に
IndexWriterWrapper::open() でインデックスを作成
- manifest.json / state.json は新規作成で上書き
エラーハンドリング
- 対象ディレクトリ不在: エラーメッセージを表示して終了コード1で終了
- パースエラー: 該当ファイルをスキップし、警告を表示。他のファイルの処理は続行
- tantivy書き込みエラー: エラーメッセージを表示して終了コード1で終了
- .commandindex/ 作成失敗: エラーメッセージを表示して終了コード1で終了
出力例
Indexing /path/to/repo...
Scanned: 42 files
Indexed: 185 sections
Skipped: 3 files (parse error)
Ignored: 5 files (.cmindexignore)
Duration: 1.2s
Index saved to .commandindex/
受け入れ基準
依存 Issue
概要
commandindex indexコマンドを実装する。リポジトリ内のMarkdownファイルを解析し、tantivy インデックスを構築する。背景・動機
Phase 1 の主要コマンド。パーサー・インデックス・状態管理を統合し、検索可能なインデックスを生成する。
提案する解決策
処理フロー
--pathオプションで対象ディレクトリを決定(デフォルト: カレントディレクトリ).cmindexignoreを読み込み、除外ルールを構築(IgnoreFilter::from_file())walkdirで再帰走査し、.mdファイルを列挙IgnoreFilter::is_ignored()で除外ルールによるフィルタリングparser::markdown::parse_file()で個別パース(heading分割、frontmatter抽出、tag抽出、リンク抽出)SectionDocに変換し、IndexWriterWrapperで tantivy インデックスに書き込みManifestにファイルエントリ(パス・ハッシュ・セクション数)を追加IndexWriterWrapper::commit()でインデックスを確定manifest.jsonを.commandindex/に保存state.jsonを.commandindex/に保存(ファイル数・セクション数を記録)設計方針
walkdir+IgnoreFilterによりファイルを列挙し、parse_file()を個別呼び出しする。既存のparse_directory()は変更せず、index コマンドの責務としてフィルタリングを統合する。cli/モジュールを新設し、index コマンドのロジックを分離する(CLAUDE.md Phase 1 モジュール構成に準拠)。main.rsはサブコマンドのディスパッチのみ。CLI オプション
Indexサブコマンドに--pathオプション(Option<PathBuf>、デフォルト:.)を追加する。上書き再構築の挙動
既に
.commandindex/が存在する場合:.commandindex/tantivy/ディレクトリを削除IndexWriterWrapper::open()でインデックスを作成エラーハンドリング
出力例
受け入れ基準
commandindex indexで Markdown ファイルのインデックスが構築されるcommandindex index --path <dir>でディレクトリ指定ができる.commandindex/tantivy/にインデックスが保存される.commandindex/manifest.jsonが生成される.commandindex/state.jsonが生成される.cmindexignoreのルールが適用されるcli/モジュールにコマンドロジックが分離されている依存 Issue