Skip to content

[Feature] update コマンド実装(manifestハッシュ比較ベースのインクリメンタル更新) #27

@Kewton

Description

@Kewton

概要

commandindex update コマンドを実装する。manifestファイルのハッシュ比較をもとにインデックスを差分更新し、フルリビルドを不要にする。

背景・動機

Phase 1 では index コマンドで毎回フルビルドしていた。日常的なワークフローでは、数ファイルの変更に対してフルビルドは非効率。update コマンドにより高速な差分更新を実現する。

提案する解決策

CLI インターフェース

commandindex update [--path <DIR>]
オプション デフォルト 説明
--path . インデックス対象ディレクトリ

処理フロー

  1. インデックスの存在確認(未作成ならフォールバックでフルインデックスを自動実行)
  2. manifest.json を読み込み
  3. 差分検知エンジン([Feature] 差分検知エンジン(manifest比較による変更/追加/削除ファイル検出) #25)でmanifestハッシュ比較による変更/追加/削除を検出
  4. tantivy 差分更新([Feature] tantivy インデックス差分更新(追加/変更/削除のドキュメント単位更新) #26)を実行
  5. manifest.json / state.json を更新
  6. 結果サマリーを表示

出力例

Incremental update completed:
  Added:     3 files (12 sections)
  Modified:  2 files (8 sections)
  Deleted:   1 files
  Unchanged: 38 files
  Skipped:   0 files
  Duration:  0.80s

インデックス未作成時

フォールバック動作:自動的にフルインデックスを実行し、結果をインクリメンタル更新サマリーとして表示する。

Note: No existing index found. Running full index...
Incremental update completed:
  Added:     5 files (20 sections)
  ...

変更なしの場合

サマリー形式で変更なしを表現(Added/Modified/Deleted が全て0、Unchanged にファイル数を表示)。

Incremental update completed:
  Added:     0 files (0 sections)
  Modified:  0 files (0 sections)
  Deleted:   0 files
  Unchanged: 42 files
  Skipped:   0 files
  Duration:  0.05s

性能要件

  • 数十ファイルの差分更新: 1分以内

注意事項(影響範囲レビューで検出)

  • [本Issue対応] state.jsonのu64アンダーフロー対策: total_files/total_sections の減算に saturating_sub() を使用し、state破損時のpanic/wrapを防止する
  • [認識済みリスク] commit後のmanifest保存失敗: tantivyのcommit()成功後にmanifest.save()が失敗した場合、次回updateで冪等に再処理されるため致命的ではないが、認識すべきリスク
  • [将来対応] 拡張子定数の統一: run()内のハードコード拡張子フィルタをSUPPORTED_EXTENSIONS定数に統一すべき(本Issueスコープ外、将来の拡張時に対応)

受け入れ基準

  • 差分更新が正しく動作する(追加/変更/削除)
  • 更新後に search で最新内容が検索できる
  • 削除されたファイルが search 結果に出ない
  • 変更なしの場合にサマリーで変更数0として表示される
  • インデックス未作成時にフォールバックでフルインデックスが実行される
  • --path オプションで対象ディレクトリを指定できる
  • 更新サマリーが正しく表示される
  • cargo test / clippy / fmt 全パス
  • state.jsonのu64演算でアンダーフローが発生しないこと(saturating_sub使用)

依存 Issue

レビュー履歴

Stage 1 通常レビュー(2026-03-20)

  • 修正済み: Issueタイトル「Git差分ベース」→「manifestハッシュ比較ベース」に修正(実装はGit非依存)
  • 修正済み: インデックス未作成時の挙動をフォールバック動作に更新
  • 修正済み: 出力例を実装に合わせて更新
  • 修正済み: 変更なし時の挙動をサマリー形式に更新

Stage 3 影響範囲レビュー(2026-03-20)

  • 追記: state.jsonのu64アンダーフロー対策を注意事項と受け入れ基準に追加
  • 追記: commit後のmanifest保存失敗リスクを注意事項に記録
  • 追記: 拡張子定数の統一を注意事項に追加

Stage 5 通常レビュー 2回目(2026-03-20)

  • 明確化: 注意事項のスコープを [本Issue対応] / [認識済みリスク] / [将来対応] に分類
  • 確認済み: saturating_sub()は実装フェーズ(Phase 5 TDD)で修正予定

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