Yuki Takei 9 месяцев назад
Родитель
Сommit
b6d1406774

+ 42 - 74
apps/app/src/features/openai/docs/plan/README.md

@@ -119,88 +119,55 @@ apps/app/src/features/openai/
 
 
 ### ✅ **完了** 
 ### ✅ **完了** 
 - **Phase 1**: スキーマ・インターフェース更新 (4時間)
 - **Phase 1**: スキーマ・インターフェース更新 (4時間)
-- **Phase 2A**: クライアントサイドEngine実装 (27時間) 🎉 **完全完了**
-
-### 🎯 **Phase 2A 完了詳細**
-**5つのコアコンポーネント、ESLintエラー0件で完成:**
-
-#### ✅ コア実装 (100%完了)
-1. **ClientFuzzyMatcher** (`fuzzy-matching.ts`)
-   - ブラウザ最適化された類似度計算
-   - middle-out検索アルゴリズム
-   - パフォーマンス監視・タイムアウト保護
-
-2. **ClientTextNormalizer** (`text-normalization.ts`)  
-   - Unicode正規化、スマートクォート処理
-   - 高速正規化とブラウザ対応検出
-   - パフォーマンス測定機能
-
-3. **ClientErrorHandler** (`error-handling.ts`)
-   - 詳細エラー分類(SEARCH_NOT_FOUND等)
-   - ユーザーフレンドリーメッセージ
-   - ブラウザ互換性検証
-
-4. **ClientDiffApplicationEngine** (`diff-application.ts`)
-   - エディター直接統合(YText/CodeMirror)
-   - undo/redo対応、選択範囲保持
-   - 複数diff統合処理
-
-5. **ClientSearchReplaceProcessor** (`processor.ts`)
-   - リアルタイム進捗コールバック
-   - バッチ処理orchestration
-   - パフォーマンス監視・キャンセル対応
-
-#### ✅ 統合レイヤー (100%完了)  
-6. **Client Engine Integration** (`client-engine-integration.tsx`)
-   - ハイブリッド処理(クライアント優先、サーバーフォールバック)
-   - パフォーマンス比較・メトリクス収集
-   - YText統合・設定管理
-
-7. **Enhanced useEditorAssistant** (`editor-assistant.tsx`) 
-   - 既存フックへのクライアントエンジン統合
-   - SSE処理とのシームレス連携
-   - ESLintエラー0件の高品質実装
-
-### 🧹 **アーキテクチャ整理完了**
-Phase 2A完了により、サーバーサイドプロトタイプの整理を実施:
-- **❌ 削除**: 6個のプロトタイプファイル(クライアント版で代替)
-  - `fuzzy-matching.ts`, `text-normalization.ts`, `diff-application-engine.ts`
-  - `multi-search-replace-processor.ts`, `error-handlers.ts`, `config.ts`
-- **✅ 保持**: `llm-response-stream-processor.ts` (Phase 2B用)
-- **📂 結果**: クライアント・サーバー責務分離の明確化
-
-### 🔧 **実装品質**
-- **ESLintエラー**: 0件 (完全準拠)
-- **TypeScript型安全性**: 100%
-- **ブラウザ最適化**: タイムアウト、メモリ効率、パフォーマンス監視
-- **エラーハンドリング**: 包括的エラー分類とユーザーフレンドリー表示
-- **リアルタイム処理**: 進捗コールバック、キャンセル機能
-- **エディター統合**: YText直接操作、undo/redo対応
-
-### 🚀 **即座の価値実現準備完了**
-Phase 2Aの完了により、以下が可能になりました:
-- **クライアントサイドテスト**: ブラウザ内でのSearch/Replace処理
-- **パフォーマンス検証**: クライアント vs サーバー性能比較  
-- **段階的展開**: フィーチャーフラグでの制御可能
-- **既存システム統合**: 最小限の変更で利用開始
+
+### ⚠️ **Phase 2A見直し必要**  
+**調査結果**: Phase 2Aは表面的完了のみで、**核心機能は未実装**
+
+#### ❌ **重大な未実装事項**
+1. **search処理**: `detectedDiff.data.diff.search`が完全に無視
+2. **行番号指定**: 存在するが活用されていない  
+3. **Fuzzy Matching**: 実装済みだが統合されていない
+4. **正確な置換**: 単純な末尾追加(`appendTextLastLine`)のみ
+
+#### 📋 **実態**
+- **ファイル**: 5つのコアコンポーネント存在 ✅
+- **統合**: クライアントエンジン基盤実装済み ✅
+- **動作**: search-replace機能は未動作 ❌
+- **現在**: `replace`テキストを末尾に追加するのみ ❌
+
+### 🎯 **Phase 2A真の完了計画策定**
+**新規ドキュメント**: [`phase-2a-completion-plan.md`](./phase-2a-completion-plan.md)
+- **目標**: roo-codeレベルの編集精度(90-95%)実現
+- **工数**: 8-12時間(実装 + テスト)
+- **アプローチ**: 行番号必須化、search処理統合、既存コンポーネント活用
+
+### 🔧 **技術的判断結果**
+1. **レスポンス形式**: 現在のJSON形式維持(パフォーマンス最適化)
+2. **行番号指定**: 必須化(精度向上)
+3. **Fuzzy Matching**: 既存実装活用(高品質)
+4. **統合方針**: 最小限の変更で最大効果
 
 
 ### 🎯 **次のステップ選択肢**
 ### 🎯 **次のステップ選択肢**
 
 
-#### Option 1: 実運用テスト開始 (推奨・即効性)
-- **目的**: Phase 2A実装の実環境テスト
-- **工数**: 2-4時間
-- **内容**: フィーチャーフラグ有効化、メトリクス収集
-- **メリット**: 即座のフィードバック、価値実現の確認
+#### Option 1: Phase 2A 完遂実装 (推奨・高価値)
+- **目的**: 真のsearch-replace機能実装
+- **工数**: 8-12時間
+- **内容**: 行番号必須化、search処理統合、fuzzy matching活用
+- **メリット**: roo-codeレベルの編集精度(90-95%)実現
+- **詳細**: [`phase-2a-completion-plan.md`](./phase-2a-completion-plan.md)
+- **タスクリスト**: [`phase-2a-task-checklist.md`](./phase-2a-task-checklist.md)
 
 
 #### Option 2: Phase 2B サーバー最適化  
 #### Option 2: Phase 2B サーバー最適化  
 - **工数**: 12時間
 - **工数**: 12時間
 - **内容**: LLM通信専門化、roo-codeプロンプト生成
 - **内容**: LLM通信専門化、roo-codeプロンプト生成
 - **メリット**: システム全体最適化
 - **メリット**: システム全体最適化
+- **前提**: Phase 2A完遂後
 
 
 #### Option 3: Phase 3 ハイブリッド統合
 #### Option 3: Phase 3 ハイブリッド統合
 - **工数**: 15時間  
 - **工数**: 15時間  
 - **内容**: 新しいクライアント・サーバー連携フロー
 - **内容**: 新しいクライアント・サーバー連携フロー
 - **メリット**: 完全な新アーキテクチャ実現
 - **メリット**: 完全な新アーキテクチャ実現
+- **前提**: Phase 2A完遂後
 
 
 ## 🔗 参考資料
 ## 🔗 参考資料
 
 
@@ -258,8 +225,9 @@ Phase 2Aの完了により、以下が可能になりました:
 
 
 **プロジェクト**: GROWI エディターアシスタント改修  
 **プロジェクト**: GROWI エディターアシスタント改修  
 **作成日**: 2025-06-17  
 **作成日**: 2025-06-17  
-**最終更新**: 2025-06-17 (Phase 2A完了)  
-**ステータス**: Phase 2A完了、実運用テスト準備完了  
-**完了工数**: 31時間 (Phase 1: 4時間 + Phase 2A: 27時間)
-**残り工数**: 61時間 (Phase 2B: 12時間 + Phase 3: 15時間 + Phase 4-5: 34時間)
-**完了タスク数**: 12/22個
+**最終更新**: 2025-06-17 (Phase 2A実態調査・完遂計画策定)  
+**ステータス**: Phase 2A核心機能未実装・完遂計画準備完了  
+**実工数**: 4時間 (Phase 1のみ)
+**見積工数**: 8-12時間 (Phase 2A完遂) + 61時間 (Phase 2B-5)
+**完了タスク数**: 4/22個 (Phase 1のみ)
+**重要判明事項**: Phase 2A「完了」は表面的、search-replace核心機能は未実装

+ 120 - 198
apps/app/src/features/openai/docs/plan/implementation-tasks.md

@@ -18,165 +18,73 @@
 
 
 ---
 ---
 
 
-## 📋 Phase 2A: クライアントサイドEngine実装 ✅ 完了
-
-### アーキテクチャ方針
-**roo-code方式**: パフォーマンス・プライバシー・リアルタイム性を重視し、Fuzzy MatchingとDiff適用をクライアントサイドで実行
-
-### 🗂️ アーキテクチャ整理完了
-Phase 2A完了により、不要になったサーバーサイドプロトタイプファイルを削除し、責務を明確化しました:
-
-**❌ 削除されたファイル (クライアント版で代替済み):**
-- `server/services/editor-assistant/fuzzy-matching.ts` → `client/services/editor-assistant/fuzzy-matching.ts`
-- `server/services/editor-assistant/text-normalization.ts` → `client/services/editor-assistant/text-normalization.ts`
-- `server/services/editor-assistant/diff-application-engine.ts` → `client/services/editor-assistant/diff-application.ts`
-- `server/services/editor-assistant/multi-search-replace-processor.ts` → `client/services/editor-assistant/processor.ts`
-- `server/services/editor-assistant/error-handlers.ts` → `client/services/editor-assistant/error-handling.ts`
-- `server/services/editor-assistant/config.ts` → 新アーキテクチャで不要
-
-**✅ 保持されたファイル (Phase 2B用):**
-- `server/services/editor-assistant/llm-response-stream-processor.ts` → LLM通信専門化で利用予定
-- `server/services/editor-assistant/index.ts` → 更新済み
-
-### ✅ 実装完了
-
-#### 2A.1 Client Fuzzy Matching Engine ✅
-- **ファイル**: `fuzzy-matching.ts`
-- **タスク**:
-  - ✅ `fastest-levenshtein`の依存関係追加 (ブラウザ対応版)
-  - ✅ `ClientFuzzyMatcher`クラス実装
-  - ✅ Middle-out検索アルゴリズム (ブラウザ最適化)
-  - ✅ 類似度計算とthreshold判定
-  - ✅ リアルタイム処理最適化
-- **推定工数**: 4時間 ✅
-- **実装状況**: 完了
-
-#### 2A.2 Client Text Normalization ✅  
-- **ファイル**: `text-normalization.ts`
-- **タスク**:
-  - ✅ ブラウザ最適化正規化関数群
-  - ✅ スマートクォート・Unicode正規化
-  - ✅ パフォーマンス測定ユーティリティ
-  - ✅ 複数正規化オプション提供
-- **推定工数**: 4時間 ✅
-- **実装状況**: 完了
-
-#### 2A.3 Client Error Handling ✅
-- **ファイル**: `error-handling.ts`
-- **タスク**:
-  - ✅ `ClientErrorHandler`クラス実装
-  - ✅ 詳細エラー分類とユーザーフレンドリーメッセージ
-  - ✅ ブラウザ互換性検証
-  - ✅ リアルタイムフィードバック機能
-- **推定工数**: 4時間 ✅
-- **実装状況**: 完了
-
-#### 2A.4 Client Diff Application Engine ✅
-- **ファイル**: `diff-application.ts`
-- **タスク**:
-  - ✅ `ClientDiffApplicationEngine`クラス実装
-  - ✅ エディター直接統合アダプター
-  - ✅ インデント保持ロジック
-  - ✅ アンドゥ・リドゥ対応
-  - ✅ 複数diff処理orchestration
-- **推定工数**: 5時間 ✅
-- **実装状況**: 完了
-
-#### 2A.5 Client Main Processor ✅
-- **ファイル**: `processor.ts`
-- **タスク**:
-  - ✅ `ClientSearchReplaceProcessor`クラス実装
-  - ✅ リアルタイム進捗フィードバック
-  - ✅ 処理キャンセル機能
-  - ✅ バッチ処理最適化
-  - ✅ パフォーマンス監視とエラーハンドリング
-- **推定工数**: 6時間 ✅
-- **実装状況**: 完了
-
-#### 2A.6 Editor Integration ❌ スキップ
-- **決定理由**: GROWIでは既存の`useEditorAssistant`フックが十分に機能し、CodeMirrorのみ対応すれば良いため、複雑なadapter patternは不要と判断
-- **代替案**: 既存フックとの直接統合を後の段階で実装
-
-**Phase 2A 総工数**: 23時間完了 / 27時間計画 (85%効率)
-
-#### 2A.3 Client Text Normalization
-- [ ] **ファイル**: `apps/app/src/client/services/editor-assistant/text-normalization.ts` (新規)
-  - [ ] `FuzzyMatcher`クラスの実装
-  - [ ] 類似度計算ロジック (ブラウザ最適化)
-  - [ ] Middle-out検索アルゴリズム
-  - [ ] パフォーマンス最適化 (Web Workers対応準備)
-- [ ] **推定工数**: 5時間
-- [ ] **担当者**: 未定
-- [ ] **優先度**: 高
-
-#### 2A.2 Diff適用エンジン (クライアント)
-- [ ] **ファイル**: `apps/app/src/features/openai/client/services/search-replace/diff-application.ts` (新規)
-- [ ] **タスク**:
-  - [ ] エディタ直接統合 (CodeMirror/Monaco)
-  - [ ] リアルタイムdiff適用
-  - [ ] インデント保持機能
-  - [ ] Undo/Redo対応
-  - [ ] プレビューモード実装
-- [ ] **推定工数**: 6時間
-- [ ] **担当者**: 未定  
-- [ ] **優先度**: 高
-
-#### 2A.3 Client Text Normalization
-- [ ] **ファイル**: `apps/app/src/client/services/editor-assistant/text-normalization.ts` (新規)
-- [ ] **タスク**:
-  - [ ] `ClientTextNormalizer`クラス実装
-  - [ ] スマートクォート・タイポグラフィ文字の正規化
-  - [ ] Unicode正規化機能(NFC)
-  - [ ] ブラウザ最適化処理
-  - [ ] roo-code互換の正規化マップ実装
-- [ ] **推定工数**: 3時間
-- [ ] **担当者**: 未定
-- [ ] **優先度**: 高
-
-#### 2A.4 Client Error Handling
-- [ ] **ファイル**: `apps/app/src/client/services/editor-assistant/error-handling.ts` (新規)
-- [ ] **タスク**:
-  - [ ] `ClientErrorHandler`クラスの実装
-  - [ ] リアルタイムエラー表示
-  - [ ] 詳細なエラー情報とサジェスション
-  - [ ] ユーザーフレンドリーなメッセージ
-  - [ ] エラー復旧機能
-- [ ] **推定工数**: 4時間
-- [ ] **担当者**: 未定
-- [ ] **優先度**: 高
-
-#### 2A.5 Client Main Processor
-- [ ] **ファイル**: `apps/app/src/client/services/editor-assistant/processor.ts` (新規)
-- [ ] **タスク**:
-  - [ ] `ClientSearchReplaceProcessor`クラスの実装
-  - [ ] 複数diff処理オーケストレーション
-  - [ ] リアルタイム進捗フィードバック
-  - [ ] 処理キャンセル機能
-  - [ ] バッチ処理最適化
-- [ ] **推定工数**: 6時間
-- [ ] **担当者**: 未定
-- [ ] **優先度**: 最高
-
-#### 2A.6 Editor Integration
-- [ ] **ファイル**: `apps/app/src/client/services/editor-assistant/editor-integration.ts` (新規)
-- [ ] **タスク**:
-  - [ ] useEditorAssistantフックの更新
-  - [ ] クライアントサイド処理フローの統合
-  - [ ] リアルタイム状態管理
-  - [ ] プレビューモード実装
-- [ ] **推定工数**: 5時間
-- [ ] **担当者**: 未定
-- [ ] **優先度**: 最高
-
-**Phase 2A 総工数**: 27時間
+## 📋 Phase 2A: Search-Replace機能実装 ❌ **重大な未完了判明**
+
+### ⚠️ **実装状況の真実**
+**2025-06-17発見**: Phase 2Aの「完了」は表面的なファイル存在のみで、**核心機能は全く実装されていない**
+
+### 🔍 **現状分析**
+#### ✅ 存在する部分
+- **高品質なクライアントサイドファイル**: fuzzy-matching.ts、text-normalization.ts、error-handling.ts等
+- **完全なLLMスキーマ**: JSON形式`search`/`replace`フィールド完備
+- **SSEストリーミング**: リアルタイム配信完成
+
+#### ❌ **完全に未実装な部分**
+- **search処理**: `detectedDiff.data.diff.search`が完全に無視されている
+- **行番号検索**: `startLine`パラメータ未活用
+- **正確な置換**: 単純な末尾追加のみの劣悪な実装
+- **クライアントエンジン統合**: 高品質なファイルが全く統合されていない
+
+### 📊 **実際の完了度**
+```
+- ファイル存在度: ✅ 90% (見た目完了)
+- 機能実装度: ❌ 15% (実質未実装)
+- 統合度: ❌ 5% (統合なし)
+```
+
+### 🎯 **Phase 2A 完遂計画** 
+**詳細**: `phase-2a-completion-plan.md`および`phase-2a-task-checklist.md`参照
+
+#### 必要な核心実装 (8-12時間)
+1. **スキーマ強化**: `startLine`必須化
+2. **search-replace実装**: 既存の劣悪な末尾追加を真の検索・置換に変更
+3. **Fuzzy Matching統合**: 既存ファイルの統合
+4. **エラーハンドリング**: 検索失敗時の適切な処理
+5. **クライアントエンジン統合**: 高品質ファイル群の統合
+
+#### 現在の劣悪な実装 (要完全修正)
+```typescript
+// 現在: searchを完全に無視し、replaceのみ末尾追加
+if (detectedDiff.data.diff) {
+  if (isTextSelected) {
+    insertTextAtLine(yText, lineRef.current, detectedDiff.data.diff.replace);
+  } else {
+    appendTextLastLine(yText, detectedDiff.data.diff.replace); // ← 劣悪
+  }
+}
+```
+
+#### 実装すべき正しい処理
+```typescript
+// 正しい実装: searchで検索してreplaceで置換
+const { search, replace, startLine } = detectedDiff.data.diff;
+const success = performSearchReplace(yText, search, replace, startLine);
+if (!success) {
+  // フォールバック処理
+}
+```
+
+**Phase 2A 実工数**: ❌ 8-12時間 (未完了) / ✅ 27時間 (誤った記載)
 
 
 ---
 ---
 
 
-## 📋 Phase 2B: サーバーサイド最適化 🎯 中優先度
+## 📋 Phase 2B: サーバーサイド最適化 ⏳ **Phase 2A完了後に実施**
 
 
 ### アーキテクチャ方針  
 ### アーキテクチャ方針  
 **専門化**: LLM通信、プロンプト生成、セキュリティに特化し、テキスト処理はクライアントに移管
 **専門化**: LLM通信、プロンプト生成、セキュリティに特化し、テキスト処理はクライアントに移管
 
 
+### ⚠️ **依存関係**: Phase 2A完了が前提
+
 ### 🎯 実装タスク
 ### 🎯 実装タスク
 
 
 #### 2B.1 LLM Response Processor (サーバー専門化)
 #### 2B.1 LLM Response Processor (サーバー専門化)
@@ -187,7 +95,6 @@ Phase 2A完了により、不要になったサーバーサイドプロトタイ
   - [ ] SSEストリーミング最適化
   - [ ] SSEストリーミング最適化
   - [ ] エラーハンドリング簡素化 (LLM通信エラーのみ)
   - [ ] エラーハンドリング簡素化 (LLM通信エラーのみ)
 - [ ] **推定工数**: 4時間
 - [ ] **推定工数**: 4時間
-- [ ] **担当者**: 未定
 - [ ] **優先度**: 中
 - [ ] **優先度**: 中
 
 
 #### 2B.2 Prompt Generator (roo-code形式)
 #### 2B.2 Prompt Generator (roo-code形式)
@@ -198,7 +105,6 @@ Phase 2A完了により、不要になったサーバーサイドプロトタイ
   - [ ] コンテキスト最適化
   - [ ] コンテキスト最適化
   - [ ] エスケープ処理とエラー防止
   - [ ] エスケープ処理とエラー防止
 - [ ] **推定工数**: 3時間
 - [ ] **推定工数**: 3時間
-- [ ] **担当者**: 未定
 - [ ] **優先度**: 中
 - [ ] **優先度**: 中
 
 
 #### 2B.3 Server Configuration
 #### 2B.3 Server Configuration
@@ -209,7 +115,6 @@ Phase 2A完了により、不要になったサーバーサイドプロトタイ
   - [ ] セキュリティポリシー設定
   - [ ] セキュリティポリシー設定
   - [ ] レート制限設定
   - [ ] レート制限設定
 - [ ] **推定工数**: 2時間
 - [ ] **推定工数**: 2時間
-- [ ] **担当者**: 未定
 - [ ] **優先度**: 低
 - [ ] **優先度**: 低
 
 
 #### 2B.4 API Route Updates
 #### 2B.4 API Route Updates
@@ -220,37 +125,36 @@ Phase 2A完了により、不要になったサーバーサイドプロトタイ
   - [ ] エラーハンドリング簡素化
   - [ ] エラーハンドリング簡素化
   - [ ] パフォーマンス監視追加
   - [ ] パフォーマンス監視追加
 - [ ] **推定工数**: 3時間
 - [ ] **推定工数**: 3時間
-- [ ] **担当者**: 未定
 - [ ] **優先度**: 中
 - [ ] **優先度**: 中
 
 
 **Phase 2B 総工数**: 12時間
 **Phase 2B 総工数**: 12時間
 
 
 ---
 ---
 
 
-## 📋 Phase 3: ハイブリッド処理フロー統合 🎯 中優先度
+## 📋 Phase 3: ハイブリッド処理フロー統合 ⏳ **Phase 2A完了後に実施**
+
+### ⚠️ **依存関係**: Phase 2A完了が前提
 
 
 ### 🎯 実装タスク
 ### 🎯 実装タスク
 
 
 #### 3.1 Client-Server Integration
 #### 3.1 Client-Server Integration
-- [ ] **ファイル**: `apps/app/src/client/services/editor-assistant/integration.ts` (新規)
+- [ ] **ファイル**: `apps/app/src/features/openai/client/services/editor-assistant/integration.ts` (新規)
 - [ ] **タスク**:
 - [ ] **タスク**:
   - [ ] SSEストリーム受信処理
   - [ ] SSEストリーム受信処理
   - [ ] クライアントエンジンとの連携
   - [ ] クライアントエンジンとの連携
   - [ ] エラー伝播・復旧機能
   - [ ] エラー伝播・復旧機能
   - [ ] 処理状態の同期
   - [ ] 処理状態の同期
 - [ ] **推定工数**: 4時間
 - [ ] **推定工数**: 4時間
-- [ ] **担当者**: 未定
 - [ ] **優先度**: 高
 - [ ] **優先度**: 高
 
 
 #### 3.2 useEditorAssistant Hook Update
 #### 3.2 useEditorAssistant Hook Update
-- [ ] **ファイル**: `apps/app/src/client/services/editor-assistant.tsx`
+- [ ] **ファイル**: `apps/app/src/features/openai/client/services/editor-assistant/use-editor-assistant.tsx`
 - [ ] **タスク**:
 - [ ] **タスク**:
   - [ ] 新しいクライアント処理フローの統合
   - [ ] 新しいクライアント処理フローの統合
   - [ ] 状態管理の最適化
   - [ ] 状態管理の最適化
   - [ ] エラーステート管理
   - [ ] エラーステート管理
   - [ ] ローディング状態の詳細化
   - [ ] ローディング状態の詳細化
 - [ ] **推定工数**: 5時間
 - [ ] **推定工数**: 5時間
-- [ ] **担当者**: 未定
 - [ ] **優先度**: 高
 - [ ] **優先度**: 高
 
 
 #### 3.3 Real-time Feedback System
 #### 3.3 Real-time Feedback System
@@ -261,7 +165,6 @@ Phase 2A完了により、不要になったサーバーサイドプロトタイ
   - [ ] エラー詳細の表示UI
   - [ ] エラー詳細の表示UI
   - [ ] キャンセル・再試行ボタン
   - [ ] キャンセル・再試行ボタン
 - [ ] **推定工数**: 6時間
 - [ ] **推定工数**: 6時間
-- [ ] **担当者**: 未定  
 - [ ] **優先度**: 中
 - [ ] **優先度**: 中
 
 
 **Phase 3 総工数**: 15時間
 **Phase 3 総工数**: 15時間
@@ -610,55 +513,74 @@ Phase 2A完了により、不要になったサーバーサイドプロトタイ
 8. useEditorAssistant Hook Update
 8. useEditorAssistant Hook Update
 9. Real-time Feedback System
 9. Real-time Feedback System
 
 
-この順序により、段階的に機能を積み上げて検証しながら開発を進められます。
-| Phase 2B (サーバー) | 4 | 0 | 0% | 11時間 |
-| Phase 3 (統合) | 4 | 0 | 0% | 12.5時間 |
-| Phase 4 (UI/UX) | 3 | 0 | 0% | 14時間 |
-| Phase 5 (ドキュメント) | 2 | 0 | 0% | 7時間 |
-| Phase 6 (テスト) | 3 | 0 | 0% | 18時間 |
-| **合計** | **26** | **0** | **0%** | **96.5時間** |
+---
+
+## 📊 **修正されたプロジェクトサマリー**
+
+### 実装進捗(実態反映版)
+| Phase | タスク数 | 完了数 | 進捗率 | 残工数 |
+|-------|----------|--------|---------|---------|
+| **Phase 1 (スキーマ)** | ✅ | ✅ | **100%** | 0時間 |
+| **Phase 2A (コア機能)** | 7 | 0 | **0%** | **8-12時間** |
+| Phase 2B (サーバー) | 4 | 0 | 0% | 12時間 |
+| Phase 3 (統合) | 3 | 0 | 0% | 15時間 |
+| Phase 4 (UI/UX) | 3 | 0 | 0% | 13時間 |
+| Phase 5 (ドキュメント) | 4 | 0 | 0% | 21時間 |
+
+### 🎯 **即座に実行すべきアクション**
+
+#### **最高優先度: Phase 2A完遂** (8-12時間)
+**詳細タスク**: [`phase-2a-completion-plan.md`](./phase-2a-completion-plan.md) および [`phase-2a-task-checklist.md`](./phase-2a-task-checklist.md) 参照
+
+1. **スキーマ強化**: `startLine`必須化(1時間)
+2. **search-replace実装**: 現在の劣悪な末尾追加を真の検索・置換に変更(4-5時間)
+3. **Fuzzy Matching統合**: 既存ファイルの統合(2時間)
+4. **エラーハンドリング強化**: 検索失敗時の適切な処理(1時間)
+5. **クライアントエンジン統合**: 高品質ファイル群の統合(2時間)
 
 
-### 優先度別
-- **高優先度**: 12タスク (46%)
-- **中優先度**: 8タスク (31%)
-- **低優先度**: 6タスク (23%)
+#### **実装スケジュール**
+- **フェーズ2A実装**: 1日(8-12時間)
+- **テスト・デバッグ**: 0.5日(4時間)
+- **合計**: 1.5日でroo-code level機能完成
 
 
-### 新アーキテクチャのメリット
+### 新アーキテクチャのメリット(実装後)
 - **パフォーマンス**: ローカル処理でレスポンス時間50%短縮予想
 - **パフォーマンス**: ローカル処理でレスポンス時間50%短縮予想
 - **プライバシー**: ユーザーコンテンツのサーバー送信不要
 - **プライバシー**: ユーザーコンテンツのサーバー送信不要
 - **リアルタイム**: 即座のフィードバックとプレビュー
 - **リアルタイム**: 即座のフィードバックとプレビュー
 - **ネットワーク効率**: diff配列のみ転送でトラフィック削減
 - **ネットワーク効率**: diff配列のみ転送でトラフィック削減
-- **オフライン対応**: 処理済みdiffの再適用可能
+- **正確性**: ✅ 真のsearch-replace機能でroo-code水準の精度
 
 
-### 推定スケジュール
-- **開発期間**: 約3-4週間 (1人稼働)
-- **クリティカルパス**: Phase 1 → Phase 2A → Phase 3
-- **並行可能**: Phase 2B、Phase 4以降は部分的に並行実装可能
+### ⚠️ **リスクと対策**
+- **技術リスク**: クライアント処理パフォーマンス
+  - **対策**: 段階的最適化、必要時Web Workers検討
+- **互換性リスク**: 既存機能への影響
+  - **対策**: フォールバック機能による段階的移行
+- **実装リスク**: 複雑な統合
+  - **対策**: 詳細タスクリストと段階的テスト
 
 
----
+### 🎯 **推奨実装順序**
 
 
-## 🎯 次のアクション
+#### **段階1: 基盤構築(Phase 2A前半)**
+1. **スキーマ強化**: `startLine`必須化
+2. **search-replace-engine.ts作成**: 核心検索・置換ロジック
+3. **useEditorAssistant更新**: 既存の劣悪な処理を修正
 
 
-### 即座に着手可能 (クライアント優先)
-1. **Phase 2A.1**: Fuzzy Matching Engine (クライアント)
-2. **Phase 2A.3**: Text Normalization (クライアント)
-3. **Phase 1.1**: LLM Response Schemas更新
+#### **段階2: 統合強化(Phase 2A後半)**
+4. **Fuzzy Matching統合**: 既存エンジンの活用
+5. **エラーハンドリング**: 検索失敗時の適切な処理
+6. **クライアントエンジン統合**: 高品質ファイルの統合
 
 
-### 依存関係あり
-- Phase 2A → Phase 3 → Phase 4
-- Phase 2B は Phase 2A と並行可能
-- Phase 1 完了後すべて着手可能
+#### **段階3: 検証・最適化**
+7. **手動テスト**: 基本機能動作確認
+8. **パフォーマンステスト**: 大きなファイルでの動作確認
+9. **エラーケーステスト**: フォールバック機能確認
 
 
-### リスクと対策
-- **技術リスク**: クライアント処理パフォーマンス
-  - **対策**: Web Workers、段階的最適化
-- **互換性リスク**: 既存機能への影響
-  - **対策**: フィーチャーフラグでの段階的移行
-- **アーキテクチャリスク**: サーバー・クライアント連携
-  - **対策**: 共通型定義、詳細な統合テスト
+この順序により、最短期間で実用的なsearch-replace機能を実現できます。
 
 
 ---
 ---
+
 **ファイル**: `implementation-tasks.md`  
 **ファイル**: `implementation-tasks.md`  
 **作成日**: 2025-06-17  
 **作成日**: 2025-06-17  
-**更新日**: 2025-06-17  
-**ステータス**: 計画段階
+**更新日**: 2025-06-17 (Phase 2A実態反映)  
+**ステータス**: Phase 2A核心機能未実装判明、8-12時間で完遂可能  
+**次のアクション**: [`phase-2a-completion-plan.md`](./phase-2a-completion-plan.md) の実行

+ 384 - 0
apps/app/src/features/openai/docs/plan/phase-2a-completion-plan.md

@@ -0,0 +1,384 @@
+# Phase 2A 完遂計画 - 実用的Search-Replace機能実装
+
+**作成日**: 2025-06-17  
+**ステータス**: 🎯 実行可能な詳細計画  
+**工数見積**: 8-12時間(実装 + テスト)
+
+## 📊 **現状分析結果**
+
+### ✅ **既存の優秀な部分**
+1. **LLMスキーマ**: JSON形式で`search`/`replace`フィールド完備
+2. **SSEストリーミング**: リアルタイム配信機能完成
+3. **クライアントエンジンファイル**: 高品質な実装コンポーネント存在
+4. **統合インフラ**: `useClientEngineIntegration`基盤実装済み
+
+### ❌ **重大な未実装**
+1. **search処理**: `detectedDiff.data.diff.search`が完全に無視されている
+2. **行番号指定**: 存在するが活用されていない  
+3. **Fuzzy Matching**: 実装済みだが統合されていない
+4. **正確な置換**: 単純な末尾追加のみ
+
+## 🎯 **Phase 2A完遂目標**
+
+### **コア機能実装**
+1. ✅ **行番号必須化**: `startLine`を必須パラメータに変更
+2. ✅ **search処理統合**: 実際に`search`テキストを検索する
+3. ✅ **Fuzzy Matching活用**: 既存実装の統合
+4. ✅ **正確な置換**: 見つけた箇所の正確な置換
+
+### **レスポンス形式決定**
+```typescript
+// 現在のJSON形式を維持(パフォーマンス最適化)
+{
+  "search": "既存のコード部分",
+  "replace": "新しいコード", 
+  "startLine": 42  // 必須化
+}
+```
+
+**理由**: roo-code形式(`<<<<<<< SEARCH`)は文字列パースが重く、JSON形式の方がブラウザで高速処理可能
+
+## 📋 **実装タスク詳細**
+
+### **Task 1: スキーマ強化** (1時間)
+
+#### 1.1 LLMレスポンススキーマ更新
+```typescript
+// apps/app/src/features/openai/interfaces/editor-assistant/llm-response-schemas.ts
+export const LlmEditorAssistantDiffSchema = z.object({
+  search: z.string()
+    .min(1)
+    .describe('Exact content to search for (including whitespace and indentation)'),
+  replace: z.string()
+    .describe('Content to replace with'),
+  startLine: z.number()  // 必須化(optionalを削除)
+    .int()
+    .positive()
+    .describe('Starting line number for search (1-based, REQUIRED)'),
+  endLine: z.number()
+    .int()
+    .positive()
+    .optional()
+    .describe('Ending line number for search (1-based, optional)'),
+});
+```
+
+#### 1.2 プロンプト更新
+```typescript
+// apps/app/src/features/openai/server/routes/edit/index.ts
+const instruction = `
+## For Edit Type (explicit editing request):
+The SEARCH field must contain exact content including whitespace and indentation.
+The startLine field is REQUIRED and must specify the line number where search begins.
+
+Response format:
+{
+  "contents": [
+    { "message": "Brief explanation of changes" },
+    { 
+      "search": "exact existing content", 
+      "replace": "new content",
+      "startLine": 42  // REQUIRED
+    }
+  ]
+}
+`;
+```
+
+### **Task 2: search-replace処理実装** (4-5時間)
+
+#### 2.1 useEditorAssistant内での検索処理実装
+```typescript
+// apps/app/src/features/openai/client/services/editor-assistant/use-editor-assistant.tsx
+
+useEffect(() => {
+  const pendingDetectedDiff = detectedDiff?.filter(diff => diff.applied === false);
+  if (yDocs?.secondaryDoc != null && pendingDetectedDiff != null && pendingDetectedDiff.length > 0) {
+    const yText = yDocs.secondaryDoc.getText('codemirror');
+    
+    yDocs.secondaryDoc.transact(() => {
+      pendingDetectedDiff.forEach((detectedDiff) => {
+        if (detectedDiff.data.diff) {
+          const { search, replace, startLine } = detectedDiff.data.diff;
+          
+          // 新しい検索・置換処理
+          const success = performSearchReplace(yText, search, replace, startLine);
+          
+          if (!success) {
+            // フォールバック: 既存の動作
+            if (isTextSelected) {
+              insertTextAtLine(yText, lineRef.current, replace);
+              lineRef.current += 1;
+            } else {
+              appendTextLastLine(yText, replace);
+            }
+          }
+        }
+      });
+    });
+    
+    // ...existing code...
+  }
+}, [codeMirrorEditor, detectedDiff, isTextSelected, selectedText, yDocs?.secondaryDoc]);
+```
+
+#### 2.2 検索・置換核心ロジック実装
+```typescript
+// apps/app/src/features/openai/client/services/editor-assistant/search-replace-engine.ts
+
+import { ClientFuzzyMatcher } from './fuzzy-matching';
+import { normalizeForBrowserFuzzyMatch } from './text-normalization';
+
+export function performSearchReplace(
+  yText: YText, 
+  searchText: string, 
+  replaceText: string, 
+  startLine: number
+): boolean {
+  const content = yText.toString();
+  const lines = content.split('\n');
+  
+  // 1. 指定行から検索開始
+  const fuzzyMatcher = new ClientFuzzyMatcher(0.8);
+  const result = fuzzyMatcher.findBestMatch(
+    content,
+    searchText,
+    { 
+      preferredStartLine: startLine,
+      bufferLines: 20  // 前後20行の範囲で検索
+    }
+  );
+  
+  if (result.success && result.matchedRange) {
+    // 2. 見つかった箇所を正確に置換
+    const { startIndex, endIndex } = result.matchedRange;
+    yText.delete(startIndex, endIndex - startIndex);
+    yText.insert(startIndex, replaceText);
+    return true;
+  }
+  
+  return false; // 検索失敗
+}
+```
+
+### **Task 3: Fuzzy Matching統合** (2時間)
+
+#### 3.1 既存のfuzzy-matching.ts更新
+```typescript
+// apps/app/src/features/openai/client/services/editor-assistant/fuzzy-matching.ts
+
+export interface SearchContext {
+  preferredStartLine?: number;
+  bufferLines?: number;
+}
+
+export interface MatchResult {
+  success: boolean;
+  similarity: number;
+  matchedRange?: {
+    startIndex: number;
+    endIndex: number;
+    startLine: number;
+    endLine: number;
+  };
+  error?: string;
+}
+
+export class ClientFuzzyMatcher {
+  findBestMatch(
+    content: string,
+    searchText: string,
+    context: SearchContext = {}
+  ): MatchResult {
+    const { preferredStartLine, bufferLines = 40 } = context;
+    
+    // 指定行から優先検索
+    if (preferredStartLine) {
+      const exactMatch = this.tryExactLineMatch(content, searchText, preferredStartLine);
+      if (exactMatch.success) {
+        return exactMatch;
+      }
+      
+      // 指定行周辺でfuzzy検索
+      return this.performBufferedSearch(content, searchText, preferredStartLine, bufferLines);
+    }
+    
+    // 全体検索
+    return this.performFullSearch(content, searchText);
+  }
+}
+```
+
+### **Task 4: エラーハンドリング強化** (1時間)
+
+#### 4.1 詳細エラー報告
+```typescript
+// apps/app/src/features/openai/client/services/editor-assistant/error-handling.ts
+
+export interface SearchReplaceError {
+  type: 'SEARCH_NOT_FOUND' | 'SIMILARITY_TOO_LOW' | 'INVALID_LINE_NUMBER';
+  message: string;
+  details: {
+    searchContent: string;
+    startLine: number;
+    similarity?: number;
+    suggestions: string[];
+  };
+}
+
+export function createSearchError(
+  searchText: string, 
+  startLine: number, 
+  similarity: number
+): SearchReplaceError {
+  return {
+    type: 'SEARCH_NOT_FOUND',
+    message: `Could not find search content at line ${startLine} (${Math.floor(similarity * 100)}% similarity)`,
+    details: {
+      searchContent: searchText.substring(0, 100),
+      startLine,
+      similarity,
+      suggestions: [
+        'Check if the line number is correct',
+        'Verify the search content exactly matches the file',
+        'Consider if the file was recently modified'
+      ]
+    }
+  };
+}
+```
+
+### **Task 5: クライアントエンジン統合更新** (2時間)
+
+#### 5.1 processHybrid機能完成
+```typescript
+// apps/app/src/features/openai/client/services/client-engine-integration.tsx
+
+const processDetectedDiffsClient = useCallback(async(
+  content: string,
+  detectedDiffs: SseDetectedDiff[]
+): Promise<ProcessingResult> => {
+  const processor = new ClientSearchReplaceProcessor({
+    fuzzyThreshold: 0.8,
+    enableProgressCallbacks: true
+  });
+  
+  // SseDetectedDiff を LlmEditorAssistantDiff に変換
+  const diffs = detectedDiffs.map(d => d.diff).filter(Boolean);
+  
+  // startLineが必須かチェック
+  for (const diff of diffs) {
+    if (!diff.startLine) {
+      throw new Error(`startLine is required but missing in diff: ${diff.search?.substring(0, 50)}...`);
+    }
+  }
+  
+  const result = await processor.processMultipleDiffs(content, diffs, {
+    enableProgressCallbacks: true,
+    onProgress: (status) => {
+      console.log(`Processing: ${status.progress}% - ${status.description}`);
+    }
+  });
+  
+  return {
+    success: result.success,
+    appliedCount: result.appliedCount,
+    failedCount: (result.failedParts?.length ?? 0),
+    modifiedText: result.content,
+    originalText: content,
+    processingTime: performance.now() - Date.now()
+  };
+}, []);
+```
+
+## 🧪 **テスト計画** (1-2時間)
+
+### **手動テスト項目**
+1. **基本search-replace**: 指定行の正確な置換
+2. **Fuzzy matching**: 微細な差異がある場合の検索
+3. **複数diff処理**: 複数箇所の同時変更
+4. **エラーケース**: 検索失敗時の適切なフォールバック
+5. **パフォーマンス**: 大きなファイルでの処理速度
+
+### **テストケース例**
+```typescript
+// Test Case 1: 正確な検索・置換
+const testDiff = {
+  search: "function calculateTotal(items) {\n  let total = 0;",
+  replace: "function calculateTotal(items) {\n  let total = 0;\n  // Added comment",
+  startLine: 15
+};
+
+// Test Case 2: Fuzzy matching
+const testDiff2 = {
+  search: "function calculateTotal(items) {\n let total = 0;", // インデント違い
+  replace: "function calculateSum(items) {\n  let sum = 0;",
+  startLine: 15
+};
+```
+
+## 📈 **成功指標**
+
+### **機能指標**
+- ✅ 行番号指定での正確な検索: 95%以上の成功率
+- ✅ Fuzzy matching: 80%以上の類似度で検索成功
+- ✅ 複数diff処理: 5個以上のdiffの同時処理
+- ✅ エラーハンドリング: 検索失敗時の適切なフォールバック
+
+### **パフォーマンス指標**
+- ✅ 検索時間: 1000行以下で100ms以内
+- ✅ 置換時間: 10箇所以下で500ms以内
+- ✅ メモリ使用量: 10MB以下
+- ✅ ブラウザ応答性: UI blocking 0秒
+
+## 🚀 **実装優先順序**
+
+1. **Task 1**: スキーマ強化(1時間)
+2. **Task 2**: search-replace処理実装(4-5時間)
+3. **Task 3**: Fuzzy Matching統合(2時間)
+4. **Task 5**: クライアントエンジン統合(2時間)
+5. **Task 4**: エラーハンドリング強化(1時間)
+6. **テスト**: 手動テスト実行(1-2時間)
+
+## 📝 **実装後の状態**
+
+### **完成機能**
+```typescript
+// LLMからのレスポンス例
+{
+  "contents": [
+    { "message": "Adding error handling to the calculation function" },
+    {
+      "search": "function calculateTotal(items) {\n  let total = 0;\n  for (let item of items) {\n    total += item;\n  }",
+      "replace": "function calculateTotal(items) {\n  if (!Array.isArray(items)) {\n    throw new Error('Items must be an array');\n  }\n  let total = 0;\n  for (let item of items) {\n    total += item;\n  }",
+      "startLine": 15
+    }
+  ]
+}
+```
+
+### **処理フロー**
+1. **SSE受信**: LLMからstructured response受信
+2. **行番号検証**: `startLine`必須チェック
+3. **Fuzzy検索**: 指定行から高精度検索
+4. **正確置換**: 見つかった箇所の正確な置換
+5. **フォールバック**: 検索失敗時の既存動作
+
+## 🎯 **Phase 2A完遂後の価値**
+
+### **即座の効果**
+- ✅ **編集精度**: 60-70% → 90-95% (roo-codeレベル)
+- ✅ **ユーザー体験**: 予測可能で正確な編集
+- ✅ **開発効率**: 信頼できるAIアシスタント機能
+
+### **技術的成果**
+- ✅ **roo-code互換性**: 核心アルゴリズムの実装
+- ✅ **ブラウザ最適化**: JSON形式での高速処理
+- ✅ **拡張可能性**: Phase 2B/3への基盤完成
+
+---
+
+**見積工数**: 8-12時間  
+**リスク**: 低(既存コンポーネント活用)  
+**価値**: 高(即座の機能向上)  
+**次のステップ**: Task 1から順次実装開始

+ 218 - 0
apps/app/src/features/openai/docs/plan/phase-2a-task-checklist.md

@@ -0,0 +1,218 @@
+# Phase 2A 実装タスクリスト - 詳細チェックリスト
+
+**プロジェクト**: GROWI エディターアシスタント改修  
+**フェーズ**: Phase 2A完遂  
+**作成日**: 2025-06-17  
+**見積工数**: 8-12時間
+
+## 📋 **タスク実行チェックリスト**
+
+### **🔴 Task 1: スキーマ強化** `[1時間]` `[ ]完了`
+
+#### 1.1 LLMレスポンススキーマ更新 `[ ]`
+- [ ] `llm-response-schemas.ts`の`startLine`を必須に変更
+- [ ] バリデーションメッセージ更新
+- [ ] TypeScript型定義更新
+
+**ファイル**: `/apps/app/src/features/openai/interfaces/editor-assistant/llm-response-schemas.ts`
+
+```typescript
+// 変更前: startLine が optional
+startLine: z.number().int().positive().optional()
+
+// 変更後: startLine が required
+startLine: z.number().int().positive().describe('Starting line number for search (1-based, REQUIRED)')
+```
+
+#### 1.2 プロンプト更新 `[ ]`
+- [ ] `edit/index.ts`のinstruction関数更新
+- [ ] `startLine`必須化の明記
+- [ ] 例示の追加
+
+**ファイル**: `/apps/app/src/features/openai/server/routes/edit/index.ts`
+
+### **🔴 Task 2: search-replace処理実装** `[4-5時間]` `[ ]完了`
+
+#### 2.1 search-replace-engine.ts作成 `[ ]`
+- [ ] 新ファイル作成
+- [ ] `performSearchReplace`関数実装
+- [ ] YText統合ロジック実装
+
+**ファイル**: `/apps/app/src/features/openai/client/services/editor-assistant/search-replace-engine.ts`
+
+#### 2.2 useEditorAssistant更新 `[ ]`
+- [ ] useEffect内のdiff処理ロジック変更
+- [ ] 既存の`appendTextLastLine`をフォールバックに変更
+- [ ] search-replace-engine統合
+
+**ファイル**: `/apps/app/src/features/openai/client/services/editor-assistant/use-editor-assistant.tsx`
+
+```typescript
+// 変更対象: useEffect内のpendingDetectedDiff.forEach処理
+// 現在: replaceのみ使用
+// 変更後: searchとreplaceの両方使用 + 行番号指定
+```
+
+#### 2.3 index.tsエクスポート更新 `[ ]`
+- [ ] 新しい関数のエクスポート追加
+
+**ファイル**: `/apps/app/src/features/openai/client/services/editor-assistant/index.ts`
+
+### **🔴 Task 3: Fuzzy Matching統合** `[2時間]` `[ ]完了`
+
+#### 3.1 fuzzy-matching.ts機能拡張 `[ ]`
+- [ ] `SearchContext`インターフェース更新
+- [ ] `MatchResult`インターフェース更新
+- [ ] `preferredStartLine`対応実装
+- [ ] `tryExactLineMatch`メソッド実装
+- [ ] `performBufferedSearch`メソッド実装
+
+**ファイル**: `/apps/app/src/features/openai/client/services/editor-assistant/fuzzy-matching.ts`
+
+#### 3.2 text-normalization.ts確認 `[ ]`
+- [ ] 既存実装の動作確認
+- [ ] 必要に応じて微調整
+
+**ファイル**: `/apps/app/src/features/openai/client/services/editor-assistant/text-normalization.ts`
+
+### **🔴 Task 4: エラーハンドリング強化** `[1時間]` `[ ]完了`
+
+#### 4.1 error-handling.ts更新 `[ ]`
+- [ ] `SearchReplaceError`インターフェース追加
+- [ ] `createSearchError`関数実装
+- [ ] 詳細エラーメッセージ定義
+
+**ファイル**: `/apps/app/src/features/openai/client/services/editor-assistant/error-handling.ts`
+
+#### 4.2 エラーメッセージ国際化 `[ ]`
+- [ ] 日本語エラーメッセージ追加(必要に応じて)
+
+### **🔴 Task 5: クライアントエンジン統合更新** `[2時間]` `[ ]完了`
+
+#### 5.1 client-engine-integration.tsx更新 `[ ]`
+- [ ] `processDetectedDiffsClient`関数完成
+- [ ] `startLine`必須チェック実装
+- [ ] エラーハンドリング強化
+
+**ファイル**: `/apps/app/src/features/openai/client/services/client-engine-integration.tsx`
+
+#### 5.2 processor.ts統合確認 `[ ]`
+- [ ] 既存のprocessor.tsとの整合性確認
+- [ ] 必要に応じて調整
+
+**ファイル**: `/apps/app/src/features/openai/client/services/editor-assistant/processor.ts`
+
+### **🔴 Task 6: テスト実行** `[1-2時間]` `[ ]完了`
+
+#### 6.1 手動テスト `[ ]`
+- [ ] 基本search-replace動作確認
+- [ ] Fuzzy matching動作確認
+- [ ] 複数diff処理確認
+- [ ] エラーケース確認
+- [ ] パフォーマンステスト
+
+#### 6.2 テストケース実行 `[ ]`
+
+**テストケース1: 正確な検索・置換**
+```json
+{
+  "search": "function calculateTotal(items) {\n  let total = 0;",
+  "replace": "function calculateTotal(items) {\n  let total = 0;\n  // Added comment",
+  "startLine": 15
+}
+```
+- [ ] 実行結果: `[ ]成功` `[ ]失敗`
+
+**テストケース2: Fuzzy matching**
+```json
+{
+  "search": "function calculateTotal(items) {\n let total = 0;",
+  "replace": "function calculateSum(items) {\n  let sum = 0;",
+  "startLine": 15
+}
+```
+- [ ] 実行結果: `[ ]成功` `[ ]失敗`
+
+**テストケース3: 複数diff処理**
+- [ ] 5個以上のdiffの同時処理
+- [ ] 実行結果: `[ ]成功` `[ ]失敗`
+
+**テストケース4: エラーハンドリング**
+- [ ] 存在しない行番号指定
+- [ ] 検索テキストが見つからない場合
+- [ ] 実行結果: `[ ]適切なフォールバック` `[ ]エラー発生`
+
+#### 6.3 パフォーマンステスト `[ ]`
+- [ ] 1000行ファイルでの検索時間: `____ms`
+- [ ] 10箇所同時置換時間: `____ms`
+- [ ] メモリ使用量: `____MB`
+- [ ] UI blocking時間: `____ms`
+
+### **🔴 Task 7: 品質確認** `[30分]` `[ ]完了`
+
+#### 7.1 ESLint/TypeScript確認 `[ ]`
+- [ ] `cd /workspace/growi/apps/app && turbo run lint`
+- [ ] エラー0件確認
+- [ ] 警告の対応
+
+#### 7.2 ビルド確認 `[ ]`
+- [ ] `cd /workspace/growi/apps/app && turbo run build`
+- [ ] ビルド成功確認
+
+## 📊 **進捗トラッキング**
+
+### **完了状況**
+- Task 1: `[ ]完了` `____時間`
+- Task 2: `[ ]完了` `____時間`  
+- Task 3: `[ ]完了` `____時間`
+- Task 4: `[ ]完了` `____時間`
+- Task 5: `[ ]完了` `____時間`
+- Task 6: `[ ]完了` `____時間`
+- Task 7: `[ ]完了` `____時間`
+
+**合計工数**: `____時間` / 8-12時間見積
+
+### **成功指標達成状況**
+- [ ] 行番号指定での正確な検索: 95%以上の成功率
+- [ ] Fuzzy matching: 80%以上の類似度で検索成功  
+- [ ] 複数diff処理: 5個以上のdiffの同時処理
+- [ ] エラーハンドリング: 検索失敗時の適切なフォールバック
+- [ ] 検索時間: 1000行以下で100ms以内
+- [ ] 置換時間: 10箇所以下で500ms以内
+- [ ] メモリ使用量: 10MB以下
+- [ ] ブラウザ応答性: UI blocking 0秒
+
+## 🐛 **問題・課題記録**
+
+### **遭遇した問題**
+1. **問題**: `_____________________________`
+   - **解決策**: `_____________________________`
+   - **所要時間**: `____時間`
+
+2. **問題**: `_____________________________`
+   - **解決策**: `_____________________________`
+   - **所要時間**: `____時間`
+
+### **技術的判断**
+1. **判断**: `_____________________________`
+   - **理由**: `_____________________________`
+   - **影響**: `_____________________________`
+
+## ✅ **Phase 2A完遂確認**
+
+### **最終チェック項目**
+- [ ] すべてのタスクが完了
+- [ ] 成功指標をすべて達成
+- [ ] ESLintエラー0件
+- [ ] ビルド成功
+- [ ] 手動テストすべて成功
+
+### **完遂宣言**
+- [ ] **Phase 2A完遂**: 実用的なsearch-replace機能の実装完了
+- **完遂日**: `2025-__-__`
+- **実績工数**: `____時間`
+- **品質確認**: `✅済み`
+
+---
+
+**次のステップ**: Phase 2B サーバー最適化 または Phase 3 ハイブリッド統合