概要
指定期間内に変更されたファイルを Git 履歴から取得し、それらの関連情報を返す --changed-since オプションを追加する。
背景・動機
シナリオ5(朝のブリーフィング): 「昨夜の変更」に関連するドキュメント・コードを一括検索
提案する解決策
CLI インターフェース
# 12時間以内の変更ファイルの関連情報
commandindex search --changed-since " 12 hours ago" --format json
# 昨日以降
commandindex search --changed-since " yesterday" --format json
# 特定コミット以降
commandindex search --changed-since " abc1234" --format json
CLI 設計方針
search サブコマンドのオプションとして --changed-since を追加する。既存の排他的検索モード(query/symbol/related/related_stdin/semantic)と同様に conflicts_with_all で排他制御を行う。
排他制御 : --changed-since 側の conflicts_with_all に query, symbol, related, related_stdin, semantic, workspace, tag, path, file_type, heading, no_semantic, rerank を指定(clap v4 は片方定義で双方向に機能)
実装方針
入力判定ロジック : validate_commit_hash()(git_info.rs 既存)を利用し、入力がコミットハッシュか期間文字列かを判定
validate_commit_hash() が true → git log <hash>..HEAD --name-only --format=''(指定コミット以降の変更)
false → git log --since=<期間> --name-only --format=''
変更ファイル一覧を取得
共用ロジック : impact サブコマンド [Feature] impact サブコマンド(git diff ベースの影響分析) #90 の aggregate_impact() を pub(crate) 化して共用。RelatedSearchEngine::find_related() で各ファイルの関連情報を取得
結果を ImpactResult 形式(changed_files/impact/overlap/summary)でマージして出力
format_impact_results() を再利用して human/json/path 形式で出力
main.rs 分岐 : related_stdin と同様に、パターンマッチの前に if let で changed_since を先に分岐処理
エラー型変換 : From<ImpactError> for SearchError を実装
マッピング: Stdin→Stdin, IndexNotFound→IndexNotFound, SymbolDbNotFound→SymbolDbNotFound, Reader→Reader, SymbolStore→SymbolStore, RelatedSearch→RelatedSearch, Output→Output, NoValidPaths→InvalidArgument, InvalidArgument→InvalidArgument
期間の指定形式
Git の --since と同じ形式をサポート: "12 hours ago", "yesterday", "2026-03-22", "1 week ago"
コミットハッシュも指定可能: --changed-since "abc1234" → git log abc1234..HEAD(指定コミット以降のすべての変更ファイルを取得)
入力バリデーション
入力値の最大長制限(256文字)
制御文字の拒否
先頭 - の拒否 (git 引数インジェクション防御)
Command::new("git").args() を使用しシェル経由実行を回避(コマンドインジェクション対策)
--since=<value> のように = 付き単一引数として渡す
git log 実行後の exit code チェック
パフォーマンス考慮
MAX_INPUT_FILES(500)を共用し、大量変更ファイル時に上限制限
INTERNAL_FETCH_LIMIT(1000)を共用
受け入れ基準
依存 Issue
実装規模
中
関連シナリオ
概要
指定期間内に変更されたファイルを Git 履歴から取得し、それらの関連情報を返す
--changed-sinceオプションを追加する。背景・動機
提案する解決策
CLI インターフェース
CLI 設計方針
searchサブコマンドのオプションとして--changed-sinceを追加する。既存の排他的検索モード(query/symbol/related/related_stdin/semantic)と同様にconflicts_with_allで排他制御を行う。排他制御:
--changed-since側のconflicts_with_allにquery,symbol,related,related_stdin,semantic,workspace,tag,path,file_type,heading,no_semantic,rerankを指定(clap v4 は片方定義で双方向に機能)実装方針
validate_commit_hash()(git_info.rs 既存)を利用し、入力がコミットハッシュか期間文字列かを判定validate_commit_hash()が true →git log <hash>..HEAD --name-only --format=''(指定コミット以降の変更)git log --since=<期間> --name-only --format=''impactサブコマンド [Feature] impact サブコマンド(git diff ベースの影響分析) #90 のaggregate_impact()をpub(crate)化して共用。RelatedSearchEngine::find_related()で各ファイルの関連情報を取得ImpactResult形式(changed_files/impact/overlap/summary)でマージして出力format_impact_results()を再利用して human/json/path 形式で出力related_stdinと同様に、パターンマッチの前にif letでchanged_sinceを先に分岐処理From<ImpactError> for SearchErrorを実装期間の指定形式
--sinceと同じ形式をサポート:"12 hours ago","yesterday","2026-03-22","1 week ago"--changed-since "abc1234"→git log abc1234..HEAD(指定コミット以降のすべての変更ファイルを取得)入力バリデーション
-の拒否(git 引数インジェクション防御)Command::new("git").args()を使用しシェル経由実行を回避(コマンドインジェクション対策)--since=<value>のように=付き単一引数として渡すパフォーマンス考慮
MAX_INPUT_FILES(500)を共用し、大量変更ファイル時に上限制限INTERNAL_FETCH_LIMIT(1000)を共用受け入れ基準
--changed-sinceで指定期間内の変更ファイルの関連情報が返るhash..HEADの範囲で変更ファイルを取得-の入力を拒否(引数インジェクション防御)依存 Issue
実装規模
中
関連シナリオ