apply_diff
apply_diffツールは、置き換えるべき正確な内容を指定することで、ファイルに対して精密な変更を行います。適切なコードのフォーマットと構造を維持しながら、変更を特定し適用するために、複数の高度な戦略を採用しています。
パラメータ
このツールは次のパラメータを受け取ります:
path(必須):現在の作業ディレクトリからの相対パスで指定される変更対象ファイルのパス。diff(必須):変更を定義する検索/置換ブロック。現在実装されているすべての戦略では、diffコンテンツ形式に行番号を含める必要があります。
注意:システムは異なるdiff戦略を拡張するように設計されていますが、現在実装されているすべての戦略では、diffコンテンツ自体に:start_line:マーカーを使用して行番号を指定する必要があります。
機能の概要
このツールは、高度な戦略を使用して既存のファイルにターゲットを絞った変更を行い、コンテンツを正確に特定して置き換えます。単純な検索と置換とは異なり、インテリジェントなマッチングアルゴリズム(ファジーマッチングを含む)を採用し、異なるコンテンツタイプやファイルサイズに適応できるようになっています。また、複雑な編集のためのフォールバックメカニズムも備えています。
アプリケーションシナリオ
- VJSPが既存のコードに対してファイル全体を書き直すことなく精密な変更を行う必要がある場合。
- 周囲のコンテキストを維持しながら、コードの特定の部分をリファクタリングする場合。
- 外科手術のような精度で既存のコードのエラーを修正する場合。
- ファイルの特定の部分のみを変更する機能強化を実装する場合。
コア機能
- 設定可能な信頼度しきい値(通常0.8-1.0)を備えたインテリジェントなファジーマッチングを採用。
- マッチングのコンテキストを提供するために
BUFFER_LINES(デフォルト値40)を使用。 - 大きなファイルに対してオーバーラップウィンドウ検索方法を実装。
- コードのフォーマットとインデントを自動的に保持。
- オーバーラップするマッチを組み合わせて信頼度スコアを向上。
- 変更を適用する前に、diffビューで変更内容を表示し、ユーザーがレビューおよび編集できるようにする。
- 繰り返しの失敗を防止するために、ファイルごとの連続エラー(
consecutiveMistakeCountForApplyDiff)を追跡。 .VJSPcodeignoreルールに基づいてファイルアクセスを検証。- 複数行の編集を効果的に処理。
制限事項
- 一意で、認識しやすいコードセクションで最適に機能。
- 非常に大きなファイルや高度に繰り返されるコードパターンでは、パフォーマンスが異なる場合がある。
- コンテンツが曖昧な場合、ファジーマッチングが誤った位置を選択することが稀にある。
- 各diff戦略には特定のフォーマット要件がある。
- 複雑な編集には、慎重な戦略の選択や手動レビューが必要になる場合がある。
動作メカニズム
apply_diffツールが呼び出されると、次のプロセスに従います:
- パラメータ検証:必須の
pathおよびdiffパラメータを検証する。 - VJSPCodeIgnoreチェック:ターゲットファイルパスが
.VJSPcodeignoreルールに準拠しているかを検証する。 - ファイル分析:ターゲットファイルのコンテンツをロードする。
- マッチローカリゼーション:選択された戦略のアルゴリズム(完全一致、ファジーマッチング、オーバーラップウィンドウ)を使用して、信頼度しきい値とコンテキスト(
BUFFER_LINES)を考慮しながら、ターゲットコンテンツを特定する。 - 変更準備:元のインデントを保持しながら、提案された変更を生成する。
- ユーザーインタラクション:
- diffビューで変更内容を表示する。
- ユーザーが提案された変更をレビューし、必要に応じて編集できるようにする。
- ユーザーの承認または拒否を待つ。
- 変更の適用:承認された場合、(ユーザーの編集を含む可能性のある)変更をファイルに適用する。
- エラー処理:エラーが発生した場合(マッチングの失敗、部分的な適用など)、ファイルの
consecutiveMistakeCountForApplyDiffをインクリメントし、失敗の種類を報告する。 - フィードバックの返却:ユーザーのフィードバックやエラーの詳細を含む結果を返す。
Diff戦略
VJSPはdiffを適用するために次の戦略を採用しています:
MultiSearchReplaceDiffStrategy
単一のリクエストで複数の変更を実行することをサポートする拡張された検索/置換形式。各検索ブロックに行番号を指定する必要があります。
- 最適な使用ケース:複数の異なる変更が必要で、行番号が既知または推定できる場合。
- 要件:スペースやインデントを含む
SEARCHブロックの内容との完全一致。行番号(:start_line:、:end_line:)を指定する必要がある。コンテンツ内のマーカーはエスケープする必要がある(\)。
<diff>ブロックの例の形式:
diff
<<<<<<< SEARCH
:start_line:10
:end_line:12
-------
// Old calculation logic
const result = value * 0.9;
return result;
=======
// Updated calculation logic with logging
console.log(`Calculating for value: ${value}`);
const result = value * 0.95; // Adjusted factor
return result;
>>>>>>> REPLACE
<<<<<<< SEARCH
:start_line:25
:end_line:25
-------
const defaultTimeout = 5000;
=======
const defaultTimeout = 10000; // Increased timeout
>>>>>>> REPLACE