概要
2つのファイルの影響範囲を比較し、共通ファイル(コンフリクトリスク)を検出する diff サブコマンドを追加する。
背景・動機
シナリオ8(設計突合の自動化): 並列 Issue の影響範囲が重複する箇所を自動検出
提案する解決策
CLI インターフェース
# 2ファイルの影響範囲を比較
commandindex diff src/auth/jwt.rs src/auth/middleware.rs --format json
files 引数: 2つのファイルパスを必須指定(#[arg(required = true, num_args = 2)])
--format オプション: OutputFormat enum(Human / Json / Path)、デフォルト値は Human(既存 Search サブコマンドと同じパターン #[arg(long, value_enum, default_value_t = OutputFormat::Human)])
出力フォーマット
JSON形式
diff結果は単一JSONオブジェクトとして出力する(既存のJSONL形式とは異なる)。
{
"file_a" : " src/auth/jwt.rs" ,
"file_b" : " src/auth/middleware.rs" ,
"only_a" : [" docs/jwt-design.md" ],
"only_b" : [" docs/middleware-design.md" ],
"overlap" : [" src/auth/types.rs" , " tests/auth_test.rs" ],
"overlap_count" : 2
}
Human形式
=== Diff: src/auth/jwt.rs vs src/auth/middleware.rs ===
Only in src/auth/jwt.rs:
docs/jwt-design.md
Only in src/auth/middleware.rs:
docs/middleware-design.md
Overlap (2 files):
src/auth/types.rs
tests/auth_test.rs
Path形式
overlap のファイルパスのみを1行1パスで出力する(パイプライン連携用)。
src/auth/types.rs
tests/auth_test.rs
ポイント
内部的には各ファイルに対して RelatedSearchEngine::find_related() を実行し、結果のファイルパス集合で集合演算(only_a, only_b, overlap)を返す
context サブコマンド(src/cli/context.rs)の collect_related_context() / merge_related_results() に類似のマージロジックが存在するため、実装パターン(特に reader/store の共有パターン)を参考にする
impact サブコマンド([Feature] impact サブコマンド(git diff ベースの影響分析) #90 )は単一ファイルの影響範囲分析に特化、diff は2ファイル間の影響範囲比較に特化という棲み分け
/orchestrate Phase 4(設計突合)での自動コンフリクト予測に使用
エラーハンドリング
インデックス未作成時: 適切なエラーメッセージを表示
ファイルがインデックスに存在しない場合: 即座にエラー終了 (context.rs のスキップ設計と異なり、比較対象が欠損すると結果が無意味なため)。どちらのファイルが問題かを明示するエラーメッセージを表示
同一ファイルを2回指定した場合: normalize_path() で正規化後に比較し、エラーメッセージを表示
影響範囲
変更対象ファイル:
src/main.rs - Commands enum に Diff バリアント追加、マッチアーム追加
src/cli/mod.rs - pub mod diff; 宣言追加(アルファベット順で clean と embed の間)
src/cli/diff.rs - 新規作成 (diff サブコマンドのメインロジック)
src/output/mod.rs - DiffResult 型と format_diff_results() 関数追加
src/output/human.rs - diff 用フォーマッタ追加
src/output/json.rs - diff 用フォーマッタ追加
src/output/path.rs - diff 用フォーマッタ追加
tests/cli_args.rs - help_flag_shows_usage に diff 検証行追加
tests/e2e_diff.rs - 新規作成 (E2Eテスト)
受け入れ基準
テストケース
重複なし(overlap 空)
完全一致(only_a, only_b 空)
部分重複
入力ファイル自身が結果に含まれないこと
各出力形式(human / json / path)の検証
実装規模
中
関連シナリオ
関連Issue
概要
2つのファイルの影響範囲を比較し、共通ファイル(コンフリクトリスク)を検出する
diffサブコマンドを追加する。背景・動機
提案する解決策
CLI インターフェース
# 2ファイルの影響範囲を比較 commandindex diff src/auth/jwt.rs src/auth/middleware.rs --format jsonfiles引数: 2つのファイルパスを必須指定(#[arg(required = true, num_args = 2)])--formatオプション:OutputFormatenum(Human / Json / Path)、デフォルト値はHuman(既存 Search サブコマンドと同じパターン#[arg(long, value_enum, default_value_t = OutputFormat::Human)])出力フォーマット
JSON形式
diff結果は単一JSONオブジェクトとして出力する(既存のJSONL形式とは異なる)。
{ "file_a": "src/auth/jwt.rs", "file_b": "src/auth/middleware.rs", "only_a": ["docs/jwt-design.md"], "only_b": ["docs/middleware-design.md"], "overlap": ["src/auth/types.rs", "tests/auth_test.rs"], "overlap_count": 2 }Human形式
Path形式
overlap のファイルパスのみを1行1パスで出力する(パイプライン連携用)。
ポイント
RelatedSearchEngine::find_related()を実行し、結果のファイルパス集合で集合演算(only_a, only_b, overlap)を返すcontextサブコマンド(src/cli/context.rs)のcollect_related_context()/merge_related_results()に類似のマージロジックが存在するため、実装パターン(特に reader/store の共有パターン)を参考にするimpactサブコマンド([Feature] impact サブコマンド(git diff ベースの影響分析) #90)は単一ファイルの影響範囲分析に特化、diffは2ファイル間の影響範囲比較に特化という棲み分け/orchestratePhase 4(設計突合)での自動コンフリクト予測に使用エラーハンドリング
normalize_path()で正規化後に比較し、エラーメッセージを表示影響範囲
変更対象ファイル:
src/main.rs- Commands enum に Diff バリアント追加、マッチアーム追加src/cli/mod.rs-pub mod diff;宣言追加(アルファベット順で clean と embed の間)src/cli/diff.rs- 新規作成(diff サブコマンドのメインロジック)src/output/mod.rs-DiffResult型とformat_diff_results()関数追加src/output/human.rs- diff 用フォーマッタ追加src/output/json.rs- diff 用フォーマッタ追加src/output/path.rs- diff 用フォーマッタ追加tests/cli_args.rs- help_flag_shows_usage に diff 検証行追加tests/e2e_diff.rs- 新規作成(E2Eテスト)受け入れ基準
テストケース
実装規模
中
関連シナリオ
関連Issue