Skip to content

[Feature] index コマンド実装(Markdown解析 → tantivy格納 → 状態保存) #7

@Kewton

Description

@Kewton

概要

commandindex index コマンドを実装する。リポジトリ内のMarkdownファイルを解析し、tantivy インデックスを構築する。

背景・動機

Phase 1 の主要コマンド。パーサー・インデックス・状態管理を統合し、検索可能なインデックスを生成する。

提案する解決策

処理フロー

  1. --path オプションで対象ディレクトリを決定(デフォルト: カレントディレクトリ)
  2. 対象ディレクトリの存在を確認(不在の場合はエラー終了)
  3. .cmindexignore を読み込み、除外ルールを構築(IgnoreFilter::from_file()
  4. 対象ディレクトリを walkdir で再帰走査し、.md ファイルを列挙
  5. IgnoreFilter::is_ignored() で除外ルールによるフィルタリング
  6. 各ファイルを parser::markdown::parse_file() で個別パース(heading分割、frontmatter抽出、tag抽出、リンク抽出)
  7. パース結果を SectionDoc に変換し、IndexWriterWrapper で tantivy インデックスに書き込み
  8. Manifest にファイルエントリ(パス・ハッシュ・セクション数)を追加
  9. IndexWriterWrapper::commit() でインデックスを確定
  10. manifest.json.commandindex/ に保存
  11. state.json.commandindex/ に保存(ファイル数・セクション数を記録)
  12. 結果サマリーを標準出力に表示

設計方針

  • ファイル列挙・フィルタリング: 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/ が存在する場合:

  1. .commandindex/tantivy/ ディレクトリを削除
  2. 新規に IndexWriterWrapper::open() でインデックスを作成
  3. 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/

受け入れ基準

  • commandindex index で Markdown ファイルのインデックスが構築される
  • commandindex index --path <dir> でディレクトリ指定ができる
  • .commandindex/tantivy/ にインデックスが保存される
  • .commandindex/manifest.json が生成される
  • .commandindex/state.json が生成される
  • .cmindexignore のルールが適用される
  • 処理結果のサマリーが表示される(スキャン数・インデックス数・スキップ数・除外数・所要時間)
  • 既にインデックスが存在する場合、tantivy ディレクトリ削除→再構築される
  • パースエラーのファイルはスキップして処理を続行する
  • cli/ モジュールにコマンドロジックが分離されている
  • 既存テスト(cli_args等)が更新されて全パスする
  • cargo test / clippy / fmt 全パス

依存 Issue

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