Skip to content

[Feature] diff サブコマンド(影響範囲の比較・共通ファイル検出) #92

@Kewton

Description

@Kewton

概要

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() で正規化後に比較し、エラーメッセージを表示

影響範囲

変更対象ファイル:

  1. src/main.rs - Commands enum に Diff バリアント追加、マッチアーム追加
  2. src/cli/mod.rs - pub mod diff; 宣言追加(アルファベット順で clean と embed の間)
  3. src/cli/diff.rs - 新規作成(diff サブコマンドのメインロジック)
  4. src/output/mod.rs - DiffResult 型と format_diff_results() 関数追加
  5. src/output/human.rs - diff 用フォーマッタ追加
  6. src/output/json.rs - diff 用フォーマッタ追加
  7. src/output/path.rs - diff 用フォーマッタ追加
  8. tests/cli_args.rs - help_flag_shows_usage に diff 検証行追加
  9. tests/e2e_diff.rs - 新規作成(E2Eテスト)

受け入れ基準

  • 2ファイルの影響範囲を比較できる
  • only_a, only_b, overlap が正しく分類される
  • human / json / path 出力形式に対応
  • エラーケースが適切にハンドリングされる(インデックス未作成、ファイル未インデックス、同一ファイル指定)
  • cargo test / clippy / fmt 全パス

テストケース

  • 重複なし(overlap 空)
  • 完全一致(only_a, only_b 空)
  • 部分重複
  • 入力ファイル自身が結果に含まれないこと
  • 各出力形式(human / json / path)の検証

実装規模

関連シナリオ

  • scenario.md シナリオ8

関連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