takt 0.32.0 → 0.32.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/builtins/en/facets/instructions/e2e-coverage-implement.md +26 -0
- package/builtins/en/facets/instructions/e2e-coverage-plan.md +38 -0
- package/builtins/en/facets/instructions/e2e-coverage-supervise.md +21 -0
- package/builtins/en/facets/instructions/fix.md +4 -0
- package/builtins/en/facets/instructions/loop-monitor-ai-fix.md +4 -3
- package/builtins/en/facets/instructions/loop-monitor-reviewers-fix.md +4 -2
- package/builtins/en/facets/instructions/plan.md +2 -0
- package/builtins/en/facets/instructions/review-frontend.md +9 -0
- package/builtins/en/facets/instructions/security-audit-plan.md +12 -0
- package/builtins/en/facets/instructions/security-audit-review.md +22 -0
- package/builtins/en/facets/instructions/security-audit-supervise.md +20 -0
- package/builtins/en/facets/instructions/security-audit-team-leader.md +27 -0
- package/builtins/en/facets/knowledge/e2e-testing.md +89 -0
- package/builtins/en/facets/knowledge/frontend.md +46 -0
- package/builtins/en/facets/knowledge/react.md +90 -0
- package/builtins/en/facets/knowledge/unit-testing.md +108 -0
- package/builtins/en/facets/output-contracts/e2e-coverage-plan.md +33 -0
- package/builtins/en/facets/output-contracts/plan-frontend.md +41 -0
- package/builtins/en/facets/output-contracts/plan.md +8 -0
- package/builtins/en/facets/output-contracts/security-audit.md +31 -0
- package/builtins/en/facets/personas/coder.md +1 -0
- package/builtins/en/facets/personas/frontend-reviewer.md +4 -0
- package/builtins/en/facets/policies/ai-antipattern.md +43 -0
- package/builtins/en/facets/policies/coding.md +90 -1
- package/builtins/en/facets/policies/design-fidelity.md +51 -0
- package/builtins/en/facets/policies/design-planning.md +52 -0
- package/builtins/en/facets/policies/qa.md +15 -0
- package/builtins/en/facets/policies/testing.md +54 -1
- package/builtins/en/piece-categories.yaml +3 -2
- package/builtins/en/pieces/backend-cqrs.yaml +5 -0
- package/builtins/en/pieces/backend.yaml +5 -0
- package/builtins/en/pieces/default.yaml +2 -0
- package/builtins/en/pieces/dual-cqrs-mini.yaml +8 -1
- package/builtins/en/pieces/dual-cqrs.yaml +10 -2
- package/builtins/en/pieces/dual-mini.yaml +8 -1
- package/builtins/en/pieces/dual.yaml +14 -2
- package/builtins/en/pieces/{e2e-test.yaml → fill-e2e.yaml} +41 -61
- package/builtins/en/pieces/{unit-test.yaml → fill-unit.yaml} +12 -2
- package/builtins/en/pieces/frontend-mini.yaml +8 -1
- package/builtins/en/pieces/frontend.yaml +25 -3
- package/builtins/en/pieces/review-default.yaml +3 -0
- package/builtins/en/pieces/review-dual-cqrs.yaml +3 -1
- package/builtins/en/pieces/review-dual.yaml +3 -1
- package/builtins/en/pieces/review-fix-default.yaml +3 -0
- package/builtins/en/pieces/review-fix-dual-cqrs.yaml +5 -1
- package/builtins/en/pieces/review-fix-dual.yaml +5 -1
- package/builtins/en/pieces/review-fix-frontend.yaml +5 -1
- package/builtins/en/pieces/review-fix-takt-default.yaml +5 -2
- package/builtins/en/pieces/review-frontend.yaml +3 -1
- package/builtins/en/pieces/review-takt-default.yaml +3 -0
- package/builtins/en/pieces/security-audit.yaml +68 -0
- package/builtins/en/pieces/takt-default.yaml +7 -2
- package/builtins/en/pieces/terraform.yaml +0 -5
- package/builtins/ja/INSTRUCTION_STYLE_GUIDE.md +9 -10
- package/builtins/ja/KNOWLEDGE_STYLE_GUIDE.md +4 -4
- package/builtins/ja/OUTPUT_CONTRACT_STYLE_GUIDE.md +4 -4
- package/builtins/ja/PERSONA_STYLE_GUIDE.md +8 -8
- package/builtins/ja/POLICY_STYLE_GUIDE.md +5 -5
- package/builtins/ja/STYLE_GUIDE.md +8 -26
- package/builtins/ja/facets/instructions/e2e-coverage-implement.md +26 -0
- package/builtins/ja/facets/instructions/e2e-coverage-plan.md +38 -0
- package/builtins/ja/facets/instructions/e2e-coverage-supervise.md +21 -0
- package/builtins/ja/facets/instructions/fix.md +4 -0
- package/builtins/ja/facets/instructions/loop-monitor-ai-fix.md +4 -3
- package/builtins/ja/facets/instructions/loop-monitor-reviewers-fix.md +4 -2
- package/builtins/ja/facets/instructions/plan.md +2 -0
- package/builtins/ja/facets/instructions/review-frontend.md +9 -0
- package/builtins/ja/facets/instructions/security-audit-plan.md +12 -0
- package/builtins/ja/facets/instructions/security-audit-review.md +22 -0
- package/builtins/ja/facets/instructions/security-audit-supervise.md +20 -0
- package/builtins/ja/facets/instructions/security-audit-team-leader.md +27 -0
- package/builtins/ja/facets/knowledge/e2e-testing.md +89 -0
- package/builtins/ja/facets/knowledge/frontend.md +46 -0
- package/builtins/ja/facets/knowledge/react.md +90 -0
- package/builtins/ja/facets/knowledge/unit-testing.md +108 -0
- package/builtins/ja/facets/output-contracts/e2e-coverage-plan.md +33 -0
- package/builtins/ja/facets/output-contracts/plan-frontend.md +41 -0
- package/builtins/ja/facets/output-contracts/plan.md +8 -0
- package/builtins/ja/facets/output-contracts/security-audit.md +31 -0
- package/builtins/ja/facets/personas/coder.md +1 -0
- package/builtins/ja/facets/personas/frontend-reviewer.md +2 -0
- package/builtins/ja/facets/policies/ai-antipattern.md +43 -0
- package/builtins/ja/facets/policies/coding.md +90 -1
- package/builtins/ja/facets/policies/design-fidelity.md +51 -0
- package/builtins/ja/facets/policies/design-planning.md +52 -0
- package/builtins/ja/facets/policies/qa.md +15 -0
- package/builtins/ja/facets/policies/testing.md +54 -1
- package/builtins/ja/piece-categories.yaml +3 -2
- package/builtins/ja/pieces/backend-cqrs.yaml +5 -0
- package/builtins/ja/pieces/backend.yaml +5 -0
- package/builtins/ja/pieces/default.yaml +2 -0
- package/builtins/ja/pieces/dual-cqrs-mini.yaml +8 -1
- package/builtins/ja/pieces/dual-cqrs.yaml +10 -2
- package/builtins/ja/pieces/dual-mini.yaml +8 -1
- package/builtins/ja/pieces/dual.yaml +14 -2
- package/builtins/ja/pieces/{e2e-test.yaml → fill-e2e.yaml} +40 -60
- package/builtins/ja/pieces/{unit-test.yaml → fill-unit.yaml} +12 -2
- package/builtins/ja/pieces/frontend-mini.yaml +8 -1
- package/builtins/ja/pieces/frontend.yaml +25 -3
- package/builtins/ja/pieces/review-default.yaml +3 -0
- package/builtins/ja/pieces/review-dual-cqrs.yaml +3 -1
- package/builtins/ja/pieces/review-dual.yaml +3 -1
- package/builtins/ja/pieces/review-fix-default.yaml +3 -0
- package/builtins/ja/pieces/review-fix-dual-cqrs.yaml +5 -1
- package/builtins/ja/pieces/review-fix-dual.yaml +5 -1
- package/builtins/ja/pieces/review-fix-frontend.yaml +5 -1
- package/builtins/ja/pieces/review-fix-takt-default.yaml +5 -2
- package/builtins/ja/pieces/review-frontend.yaml +3 -1
- package/builtins/ja/pieces/review-takt-default.yaml +3 -0
- package/builtins/ja/pieces/security-audit.yaml +68 -0
- package/builtins/ja/pieces/takt-default.yaml +7 -2
- package/builtins/ja/pieces/terraform.yaml +0 -5
- package/dist/app/cli/routing.js +1 -1
- package/dist/app/cli/routing.js.map +1 -1
- package/dist/core/models/config-types.d.ts +4 -0
- package/dist/core/models/config-types.d.ts.map +1 -1
- package/dist/core/models/schemas.d.ts +4 -0
- package/dist/core/models/schemas.d.ts.map +1 -1
- package/dist/core/models/schemas.js +4 -0
- package/dist/core/models/schemas.js.map +1 -1
- package/dist/core/piece/engine/MovementExecutor.d.ts +1 -0
- package/dist/core/piece/engine/MovementExecutor.d.ts.map +1 -1
- package/dist/core/piece/engine/MovementExecutor.js +8 -4
- package/dist/core/piece/engine/MovementExecutor.js.map +1 -1
- package/dist/core/piece/engine/OptionsBuilder.d.ts.map +1 -1
- package/dist/core/piece/engine/OptionsBuilder.js +4 -1
- package/dist/core/piece/engine/OptionsBuilder.js.map +1 -1
- package/dist/features/config/deploySkillInternal.d.ts.map +1 -1
- package/dist/features/config/deploySkillInternal.js +2 -6
- package/dist/features/config/deploySkillInternal.js.map +1 -1
- package/dist/features/interactive/conversationLoop.d.ts.map +1 -1
- package/dist/features/interactive/conversationLoop.js +4 -15
- package/dist/features/interactive/conversationLoop.js.map +1 -1
- package/dist/features/pipeline/steps.d.ts.map +1 -1
- package/dist/features/pipeline/steps.js +5 -1
- package/dist/features/pipeline/steps.js.map +1 -1
- package/dist/features/tasks/execute/resolveTask.d.ts.map +1 -1
- package/dist/features/tasks/execute/resolveTask.js +11 -3
- package/dist/features/tasks/execute/resolveTask.js.map +1 -1
- package/dist/infra/config/global/globalConfigCore.d.ts.map +1 -1
- package/dist/infra/config/global/globalConfigCore.js +11 -8
- package/dist/infra/config/global/globalConfigCore.js.map +1 -1
- package/dist/infra/config/global/globalConfigSerializer.d.ts.map +1 -1
- package/dist/infra/config/global/globalConfigSerializer.js +6 -0
- package/dist/infra/config/global/globalConfigSerializer.js.map +1 -1
- package/dist/infra/config/pathExpansion.d.ts +3 -0
- package/dist/infra/config/pathExpansion.d.ts.map +1 -0
- package/dist/infra/config/pathExpansion.js +15 -0
- package/dist/infra/config/pathExpansion.js.map +1 -0
- package/dist/infra/config/project/projectConfig.d.ts.map +1 -1
- package/dist/infra/config/project/projectConfig.js +15 -2
- package/dist/infra/config/project/projectConfig.js.map +1 -1
- package/dist/infra/config/resolveConfigValue.d.ts.map +1 -1
- package/dist/infra/config/resolveConfigValue.js +4 -1
- package/dist/infra/config/resolveConfigValue.js.map +1 -1
- package/dist/infra/cursor/client.js +1 -1
- package/dist/infra/cursor/client.js.map +1 -1
- package/dist/infra/github/pr.d.ts.map +1 -1
- package/dist/infra/github/pr.js +36 -8
- package/dist/infra/github/pr.js.map +1 -1
- package/dist/infra/resources/index.d.ts +5 -6
- package/dist/infra/resources/index.d.ts.map +1 -1
- package/dist/infra/resources/index.js +5 -6
- package/dist/infra/resources/index.js.map +1 -1
- package/dist/infra/task/autoCommit.d.ts.map +1 -1
- package/dist/infra/task/autoCommit.js +5 -1
- package/dist/infra/task/autoCommit.js.map +1 -1
- package/dist/infra/task/clone.d.ts +2 -1
- package/dist/infra/task/clone.d.ts.map +1 -1
- package/dist/infra/task/clone.js +5 -2
- package/dist/infra/task/clone.js.map +1 -1
- package/dist/infra/task/git.d.ts +5 -1
- package/dist/infra/task/git.d.ts.map +1 -1
- package/dist/infra/task/git.js +51 -3
- package/dist/infra/task/git.js.map +1 -1
- package/dist/infra/task/index.d.ts +1 -1
- package/dist/infra/task/index.d.ts.map +1 -1
- package/dist/infra/task/index.js +1 -1
- package/dist/infra/task/index.js.map +1 -1
- package/dist/shared/utils/index.d.ts +1 -0
- package/dist/shared/utils/index.d.ts.map +1 -1
- package/dist/shared/utils/index.js +1 -0
- package/dist/shared/utils/index.js.map +1 -1
- package/dist/shared/utils/pathBoundary.d.ts +2 -0
- package/dist/shared/utils/pathBoundary.d.ts.map +1 -0
- package/dist/shared/utils/pathBoundary.js +10 -0
- package/dist/shared/utils/pathBoundary.js.map +1 -0
- package/package.json +2 -2
- package/builtins/en/facets/instructions/implement-e2e-test.md +0 -51
- package/builtins/en/facets/instructions/plan-e2e-test.md +0 -11
- package/builtins/en/templates/instructions/ai-fix.md +0 -74
- package/builtins/en/templates/instructions/ai-review-standalone.md +0 -47
- package/builtins/en/templates/instructions/arbitrate.md +0 -45
- package/builtins/en/templates/instructions/architect.md +0 -48
- package/builtins/en/templates/instructions/fix.md +0 -86
- package/builtins/en/templates/instructions/implement.md +0 -102
- package/builtins/en/templates/instructions/plan.md +0 -55
- package/builtins/en/templates/instructions/review.md +0 -101
- package/builtins/en/templates/instructions/supervise.md +0 -106
- package/builtins/en/templates/personas/character.md +0 -45
- package/builtins/en/templates/personas/expert.md +0 -68
- package/builtins/en/templates/personas/simple.md +0 -22
- package/builtins/en/templates/policies/policy.md +0 -49
- package/builtins/en/templates/reports/architecture-design.md +0 -31
- package/builtins/en/templates/reports/plan.md +0 -70
- package/builtins/en/templates/reports/review.md +0 -143
- package/builtins/en/templates/reports/security-review.md +0 -43
- package/builtins/en/templates/reports/summary.md +0 -52
- package/builtins/en/templates/reports/validation.md +0 -31
- package/builtins/ja/facets/instructions/implement-e2e-test.md +0 -51
- package/builtins/ja/facets/instructions/plan-e2e-test.md +0 -11
- package/builtins/ja/templates/instructions/ai-fix.md +0 -74
- package/builtins/ja/templates/instructions/ai-review-standalone.md +0 -47
- package/builtins/ja/templates/instructions/arbitrate.md +0 -45
- package/builtins/ja/templates/instructions/architect.md +0 -48
- package/builtins/ja/templates/instructions/fix.md +0 -86
- package/builtins/ja/templates/instructions/implement.md +0 -102
- package/builtins/ja/templates/instructions/plan.md +0 -55
- package/builtins/ja/templates/instructions/review.md +0 -101
- package/builtins/ja/templates/instructions/supervise.md +0 -106
- package/builtins/ja/templates/knowledge/knowledge.md +0 -39
- package/builtins/ja/templates/output-contracts/architecture-design.md +0 -31
- package/builtins/ja/templates/output-contracts/plan.md +0 -70
- package/builtins/ja/templates/output-contracts/review.md +0 -143
- package/builtins/ja/templates/output-contracts/security-review.md +0 -43
- package/builtins/ja/templates/output-contracts/summary.md +0 -52
- package/builtins/ja/templates/output-contracts/validation.md +0 -31
- package/builtins/ja/templates/personas/character.md +0 -43
- package/builtins/ja/templates/personas/expert.md +0 -21
- package/builtins/ja/templates/personas/simple.md +0 -22
- package/builtins/ja/templates/policies/policy.md +0 -49
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
セキュリティ監査タスクを分解し、担当ファイルを割り当てて並列実行してください。
|
|
2
|
+
|
|
3
|
+
**重要:** 計画レポートを参照してください: {report:01-plan.md}
|
|
4
|
+
|
|
5
|
+
**やること:**
|
|
6
|
+
|
|
7
|
+
1. 計画レポートのファイル一覧を確認し、監査対象の全ファイルを把握する
|
|
8
|
+
2. ファイルをモジュール/レイヤー単位で3グループに分割する
|
|
9
|
+
- セキュリティリスクの高いファイル(認証、入力処理、外部通信等)を各グループに均等に分散する
|
|
10
|
+
- 関連するファイル(同一モジュール内)はなるべく同じグループにまとめる
|
|
11
|
+
3. 各パートに排他的なファイル担当を割り当てる
|
|
12
|
+
|
|
13
|
+
**各パートの instruction に以下を必ず明記する:**
|
|
14
|
+
- **担当ファイル一覧**(Read で確認する全ファイルのパス)
|
|
15
|
+
- **監査手順:**
|
|
16
|
+
1. 担当ファイルを**1つずつ Read tool で全文を読む**(Grep や部分読みで省略しない)
|
|
17
|
+
2. 各ファイルについてセキュリティ観点でレビューする
|
|
18
|
+
3. 発見した問題を重大度付きで報告する
|
|
19
|
+
- **絶対禁止事項:**
|
|
20
|
+
- Grep でキーワード検索してヒットしたファイルだけ見る → 禁止。全ファイルを Read する
|
|
21
|
+
- ファイルの一部だけ読んで判断する → 禁止。全文を読む
|
|
22
|
+
- 「問題なさそう」で読み飛ばす → 禁止。全ファイルを確認する
|
|
23
|
+
- **完了基準:** 担当ファイル全件の Read が完了し、各ファイルの監査結果を報告していること
|
|
24
|
+
|
|
25
|
+
**制約:**
|
|
26
|
+
- 各パートは読み取り専用。コードを変更しない
|
|
27
|
+
- 担当外のファイルを監査しない(重複を防ぐ)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# E2Eテスト知識
|
|
2
|
+
|
|
3
|
+
## E2Eテストのスコープ
|
|
4
|
+
|
|
5
|
+
E2Eテストはユーザーの操作フロー全体を検証する。ユニットテストやインテグレーションテストとはスコープが異なる。
|
|
6
|
+
|
|
7
|
+
| テスト種別 | スコープ | 検証対象 |
|
|
8
|
+
|-----------|---------|---------|
|
|
9
|
+
| ユニット | 関数/クラス | ロジックの正しさ |
|
|
10
|
+
| インテグレーション | モジュール間結合 | データフローの正しさ |
|
|
11
|
+
| E2E | ユーザー操作フロー全体 | ユーザーから見た振る舞い |
|
|
12
|
+
|
|
13
|
+
| 基準 | 判定 |
|
|
14
|
+
|------|------|
|
|
15
|
+
| ユニットテストでカバーできるロジック検証をE2Eで書く | 警告。ユニットテストに移動を検討 |
|
|
16
|
+
| ユーザーが実行する操作フローの検証 | E2Eテストが適切 |
|
|
17
|
+
| 複数コマンド/ページにまたがるシナリオ | E2Eテストが適切 |
|
|
18
|
+
| エラーメッセージの表示確認 | E2Eテストが適切 |
|
|
19
|
+
|
|
20
|
+
## UXルートの洗い出し
|
|
21
|
+
|
|
22
|
+
E2Eテストの網羅性はユーザー操作ルートの洗い出しに依存する。ドキュメントではなくコードから起点を特定する。
|
|
23
|
+
|
|
24
|
+
### 起点の特定方法
|
|
25
|
+
|
|
26
|
+
| アプリケーション種別 | 起点の探し方 |
|
|
27
|
+
|-------------------|------------|
|
|
28
|
+
| CLI | コマンド定義、サブコマンド登録、オプション/フラグ定義をコードから抽出 |
|
|
29
|
+
| Web | ルーティング定義、ページコンポーネント一覧をコードから抽出 |
|
|
30
|
+
| API | エンドポイント定義、ルーター登録をコードから抽出 |
|
|
31
|
+
|
|
32
|
+
### 分岐パターン
|
|
33
|
+
|
|
34
|
+
各起点から分岐するルートを網羅的に列挙する。
|
|
35
|
+
|
|
36
|
+
| 分岐パターン | 例 |
|
|
37
|
+
|------------|-----|
|
|
38
|
+
| オプション/フラグの組み合わせ | `--verbose` あり/なし、`--format json` vs `--format table` |
|
|
39
|
+
| 状態による分岐 | 初回実行 vs 既存データあり、設定ファイルあり vs なし |
|
|
40
|
+
| 権限/ロール | 管理者 vs 一般ユーザー、認証済み vs 未認証 |
|
|
41
|
+
| 外部依存の状態 | 接続成功 vs タイムアウト、正常レスポンス vs エラーレスポンス |
|
|
42
|
+
| エラーリカバリー | 途中で失敗した場合の再試行、ロールバック |
|
|
43
|
+
| 入力バリエーション | 有効な入力、無効な入力、空入力、境界値 |
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
## モック境界の設計
|
|
47
|
+
|
|
48
|
+
E2Eテストでは「どこまで実物で動かし、どこからモックするか」の判断が重要。
|
|
49
|
+
|
|
50
|
+
### モック設計の原則
|
|
51
|
+
|
|
52
|
+
- テスト対象のアプリケーションコードはそのまま動かす
|
|
53
|
+
- 外部サービスとの境界でモックを挿入する
|
|
54
|
+
- モックは既存のフィクスチャ・ヘルパーのパターンに合わせる
|
|
55
|
+
- 新しいモック機構を導入する前に既存のものを確認する
|
|
56
|
+
|
|
57
|
+
## フレイキーテスト対策
|
|
58
|
+
|
|
59
|
+
E2Eテストは非決定的な要因で失敗しやすい。
|
|
60
|
+
|
|
61
|
+
| 原因 | 対策 |
|
|
62
|
+
|------|------|
|
|
63
|
+
| タイミング依存 | 明示的な待機条件を使う(固定 sleep ではなく状態ベースの待機) |
|
|
64
|
+
| ポート競合 | テストごとにランダムポートを割り当てる |
|
|
65
|
+
| ファイルシステムの残留 | テストごとに一時ディレクトリを作成し、終了時にクリーンアップ |
|
|
66
|
+
| プロセスリーク | タイムアウトと強制終了を設定する |
|
|
67
|
+
| 環境依存 | テスト実行に必要な前提条件を明示的にセットアップする |
|
|
68
|
+
| 実行順序依存 | 各テストが独立して実行できるよう、状態を初期化する |
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
// NG - 固定 sleep でタイミングを合わせる
|
|
72
|
+
await sleep(3000)
|
|
73
|
+
expect(result).toBeDefined()
|
|
74
|
+
|
|
75
|
+
// OK - 条件ベースで待機する
|
|
76
|
+
await waitFor(() => expect(result).toBeDefined(), { timeout: 5000 })
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## テストケース管理
|
|
80
|
+
|
|
81
|
+
E2Eテストの網羅性を保証するため、テストケースをリストで管理する。
|
|
82
|
+
|
|
83
|
+
| 原則 | 内容 |
|
|
84
|
+
|------|------|
|
|
85
|
+
| 番号付きリスト | 各テストケースに一意の番号を付与し、実装状況を追跡する |
|
|
86
|
+
| 起点ごとに分類 | コマンド/ページ/エンドポイント単位でグループ化する |
|
|
87
|
+
| 優先度付け | ユーザー影響度 × 未テストのリスクで優先度を決定する |
|
|
88
|
+
| 既存テストとの突き合わせ | 新規追加前に既存テストのカバー範囲を確認する |
|
|
89
|
+
|
|
@@ -37,6 +37,40 @@ View コンポーネント(`features/*/components/*-view.tsx`)がデータ
|
|
|
37
37
|
ルート(route) → View(データ取得・状態管理) → 子コンポーネント(表示)
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
### 画面追加時のルーティング配線
|
|
41
|
+
|
|
42
|
+
新しい画面を追加したら、画面コンポーネントを作るだけで終わらせず、到達経路まで配線する。Router、メニュー、導線のどこから到達するかを計画時点で固定する。
|
|
43
|
+
|
|
44
|
+
| 基準 | 判定 |
|
|
45
|
+
|------|------|
|
|
46
|
+
| 新規ページを作成したのに Router に route がない | REJECT |
|
|
47
|
+
| basename 配下の URL と route path の対応を確認していない | REJECT |
|
|
48
|
+
| 画面実装と同時に Router / 導線 / 一時導線の要否を判断している | OK |
|
|
49
|
+
| 開発用の一時導線を使う場合、その理由と後で除去する前提を記録している | OK |
|
|
50
|
+
| route を更新したが、メニュー・ボタン・リンク・外部呼び出しなど実際の入口を未確認 | 警告 |
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
// OK - 画面実装と route 配線を同時に追加
|
|
54
|
+
<Route path="/contreg" element={<ContainerRegisterPage />} />
|
|
55
|
+
|
|
56
|
+
// REJECT - 画面実装はあるが到達経路がない
|
|
57
|
+
// src/pages/ContainerRegisterPage.tsx は存在する
|
|
58
|
+
// Router には route がない
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
到達経路は Router だけではない。メニュー、一覧からの遷移ボタン、ダイアログ内の確定導線、外部画面からのリンクなど、利用者が実際にたどる入口を基準に確認する。
|
|
62
|
+
|
|
63
|
+
### 外部UIライブラリとの統合
|
|
64
|
+
|
|
65
|
+
DataGrid、日付ピッカー、チャート、仮想リストのような外部 UI ライブラリは、型が通っても実行時に落ちることがある。特にメジャーバージョン差分では、props 名や state model の互換性を shallow なモックだけでは検出できない。
|
|
66
|
+
|
|
67
|
+
| 基準 | 判定 |
|
|
68
|
+
|------|------|
|
|
69
|
+
| 主要 UI ライブラリの props を、既存プロジェクトのバージョン確認なしに推測で渡す | REJECT |
|
|
70
|
+
| テストでライブラリ本体を完全にモックし、実マウント時の破綻を見逃す | 警告 |
|
|
71
|
+
| 代表的な props で実コンポーネントを描画し、画面レベルでクラッシュしないことを確認する | OK |
|
|
72
|
+
| 既存画面の利用パターンやプロジェクト依存バージョンを参照して props 形を決める | OK |
|
|
73
|
+
|
|
40
74
|
## コンポーネント設計
|
|
41
75
|
|
|
42
76
|
1ファイルにベタ書きしない。必ずコンポーネント分割する。
|
|
@@ -146,6 +180,7 @@ const Parent = () => {
|
|
|
146
180
|
| 子から親への状態変更(逆方向データフロー) | REJECT |
|
|
147
181
|
| APIレスポンスをそのまま状態に | 正規化を検討 |
|
|
148
182
|
| useEffectの依存配列が不適切 | REJECT |
|
|
183
|
+
| 初期取得が不安定な Context/Provider 関数参照に結び付いている | REJECT |
|
|
149
184
|
|
|
150
185
|
状態配置の判断基準:
|
|
151
186
|
|
|
@@ -171,6 +206,17 @@ const Parent = () => {
|
|
|
171
206
|
2. 既存の生成済みクライアントの使用パターンを確認
|
|
172
207
|
3. 新規エンドポイントは生成パイプラインに追加し、生成されたフックを使う
|
|
173
208
|
|
|
209
|
+
## 初期表示ロードと再取得境界
|
|
210
|
+
|
|
211
|
+
初期表示ロードはリアクティブな再取得と分けて扱う。URL、フィルタ、ページング、明示的な更新操作がない限り、初回ロードは mount-only に保ち、不安定なコールバック参照に結び付けない。
|
|
212
|
+
|
|
213
|
+
| 基準 | 判定 |
|
|
214
|
+
|------|------|
|
|
215
|
+
| Provider/Context の関数参照変化で初期取得が再実行される | REJECT |
|
|
216
|
+
| 再取得条件が URL・フィルタ・ページング・更新操作として明示されている | OK |
|
|
217
|
+
| メッセージ表示、loading 切替、dialog 開閉で再取得される | REJECT |
|
|
218
|
+
| 初期取得は mount-only、以後の再取得は明示トリガーで行う | OK |
|
|
219
|
+
|
|
174
220
|
## データ取得
|
|
175
221
|
|
|
176
222
|
API呼び出しはルート(View)コンポーネントで行い、子コンポーネントにはpropsで渡す。
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# React知識
|
|
2
|
+
|
|
3
|
+
## effect と再実行
|
|
4
|
+
|
|
5
|
+
`useEffect` は「いつ再実行してよいか」を明示する仕組みであり、初期化処理の置き場ではない。初期表示で1回だけ行う処理か、依存変化で再実行すべき処理かを先に決める。
|
|
6
|
+
|
|
7
|
+
| 基準 | 判定 |
|
|
8
|
+
|------|------|
|
|
9
|
+
| 初期表示の一度きりのロードなのに、再生成される関数参照を依存に置く | REJECT |
|
|
10
|
+
| 再取得条件が明確でないのに、Context/Provider 由来関数を依存に置く | REJECT |
|
|
11
|
+
| mount-only 初期化を `useEffect(..., [])` で表現し、意図をコメントで残す | OK |
|
|
12
|
+
| 依存変化時の再取得が仕様として必要で、その依存を明示している | OK |
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
// REJECT - 初期取得なのに不安定な関数依存を経由して再実行されうる
|
|
16
|
+
const fetchList = useCallback(async () => {
|
|
17
|
+
await loadItems()
|
|
18
|
+
}, [setIsLoading, errorPage])
|
|
19
|
+
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
fetchList()
|
|
22
|
+
}, [fetchList])
|
|
23
|
+
|
|
24
|
+
// OK - 初期表示の一度きりロードとして固定
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
void loadItemsOnMount()
|
|
27
|
+
// mount-only initial load
|
|
28
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
29
|
+
}, [])
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Context と Provider value
|
|
33
|
+
|
|
34
|
+
Context の `value={{ ... }}` は Provider の再描画ごとに新しい参照になる。Context から受け取った関数を `useEffect` の依存に置くと、利用側が意図せず再実行ループに入ることがある。
|
|
35
|
+
|
|
36
|
+
| 基準 | 判定 |
|
|
37
|
+
|------|------|
|
|
38
|
+
| Context 由来関数の参照安定性を確認せず、effect 依存に入れる | REJECT |
|
|
39
|
+
| Provider 側で value の安定性が保証されていないのに mount effect の依存に使う | REJECT |
|
|
40
|
+
| Context 関数はイベントハンドラから使い、初期取得は mount-only に閉じる | OK |
|
|
41
|
+
| Provider 側で value 安定化を行い、再取得条件も仕様で定義する | OK |
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
// REJECT - Context 関数をそのまま初期取得 effect の依存に使う
|
|
45
|
+
const { setIsLoading, errorPage } = useAppContext()
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
void loadInitialData(setIsLoading, errorPage)
|
|
48
|
+
}, [setIsLoading, errorPage])
|
|
49
|
+
|
|
50
|
+
// OK - 初期取得は mount-only、Context 関数は内部で使う
|
|
51
|
+
const { setIsLoading, errorPage } = useAppContext()
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
void loadInitialData({ setIsLoading, errorPage })
|
|
54
|
+
// mount-only initial load
|
|
55
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
56
|
+
}, [])
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## 初期表示ロード
|
|
60
|
+
|
|
61
|
+
初期表示ロードは「画面を開いたときに1回だけ必要な処理」か、「状態変化に応じて再実行する処理」かを区別する。後者でない限り、再取得のトリガーは明示的なユーザー操作や URL/検索条件の変化に限定する。
|
|
62
|
+
|
|
63
|
+
| 条件 | 推奨 |
|
|
64
|
+
|------|------|
|
|
65
|
+
| 初期表示で一覧を1回読むだけ | mount-only effect |
|
|
66
|
+
| フィルタ、ページング、URL パラメータ変更で再取得 | その状態を依存に明示 |
|
|
67
|
+
| loading state 更新で再取得が走る | REJECT |
|
|
68
|
+
| message 表示や dialog 開閉で再取得が走る | REJECT |
|
|
69
|
+
|
|
70
|
+
## custom hook の責務
|
|
71
|
+
|
|
72
|
+
React custom hook は「React の state/effect/ref を使う状態遷移」に限定する。純粋計算だけなら custom hook ではなく関数モジュールでよい。
|
|
73
|
+
|
|
74
|
+
| 基準 | 判定 |
|
|
75
|
+
|------|------|
|
|
76
|
+
| React の state/effect を使わないのに `use*` と命名する | 警告 |
|
|
77
|
+
| 純関数群を custom hook として扱う | 警告 |
|
|
78
|
+
| stateful な UI 制御は custom hook に、純粋計算は function module に分ける | OK |
|
|
79
|
+
| hook が JSX を返す | REJECT |
|
|
80
|
+
|
|
81
|
+
## exhaustive-deps の扱い
|
|
82
|
+
|
|
83
|
+
`react-hooks/exhaustive-deps` は無条件で従うものではなく、effect の意味を壊さない範囲で従う。mount-only 初期化で依存を増やすと挙動が壊れる場合は、理由を残して抑制する。
|
|
84
|
+
|
|
85
|
+
| 基準 | 判定 |
|
|
86
|
+
|------|------|
|
|
87
|
+
| ルールに従うためだけに不要な再実行依存を追加する | REJECT |
|
|
88
|
+
| lint 抑制を無言で入れる | 警告 |
|
|
89
|
+
| mount-only の理由をコメントで説明して抑制する | OK |
|
|
90
|
+
| 再実行が必要な effect なのに `[]` にする | REJECT |
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# ユニットテスト知識
|
|
2
|
+
|
|
3
|
+
## テストダブルの使い分け
|
|
4
|
+
|
|
5
|
+
テストダブルは目的に応じて使い分ける。過剰なモックはテストの信頼性を下げる。
|
|
6
|
+
|
|
7
|
+
| 種類 | 目的 | 使用場面 |
|
|
8
|
+
|------|------|---------|
|
|
9
|
+
| Stub | 固定値を返す | 外部依存の出力を制御したい |
|
|
10
|
+
| Mock | 呼び出しを検証する | メソッド呼び出しの有無・引数を確認したい |
|
|
11
|
+
| Spy | 実装を残しつつ呼び出しを記録 | 副作用の検証をしたい |
|
|
12
|
+
| Fake | 簡易的な実装 | インメモリDBなど軽量な代替が必要 |
|
|
13
|
+
|
|
14
|
+
### モック粒度の判断
|
|
15
|
+
|
|
16
|
+
- テスト対象の直接の依存のみモックする(間接依存はモックしない)
|
|
17
|
+
- 「モックが多すぎる」はテスト対象の設計の問題を示唆する
|
|
18
|
+
- 純粋関数は依存がないのでモック不要
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// NG - 内部実装をモック(振る舞いではなく実装を検証している)
|
|
22
|
+
vi.spyOn(service, 'privateMethod')
|
|
23
|
+
service.execute()
|
|
24
|
+
expect(service.privateMethod).toHaveBeenCalled()
|
|
25
|
+
|
|
26
|
+
// OK - 外部依存をモックし、振る舞いを検証
|
|
27
|
+
const repository = { findById: vi.fn().mockResolvedValue(user) }
|
|
28
|
+
const service = new UserService(repository)
|
|
29
|
+
const result = await service.getUser('id')
|
|
30
|
+
expect(result).toEqual(user)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 境界値分析
|
|
34
|
+
|
|
35
|
+
境界値と同値分割はユニットテストの基本手法。
|
|
36
|
+
|
|
37
|
+
| 手法 | 内容 |
|
|
38
|
+
|------|------|
|
|
39
|
+
| 同値分割 | 入力を等価なグループに分け、各グループから1つずつテスト |
|
|
40
|
+
| 境界値分析 | 同値クラスの境界でテスト(境界、境界±1) |
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
// NG - 正常系のみ
|
|
44
|
+
test('validates age', () => {
|
|
45
|
+
expect(validateAge(25)).toBe(true)
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
// OK - 境界値を含む
|
|
49
|
+
test('validates age at boundaries', () => {
|
|
50
|
+
expect(validateAge(0)).toBe(true) // 下限
|
|
51
|
+
expect(validateAge(-1)).toBe(false) // 下限-1
|
|
52
|
+
expect(validateAge(150)).toBe(true) // 上限
|
|
53
|
+
expect(validateAge(151)).toBe(false) // 上限+1
|
|
54
|
+
})
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## テストフィクスチャ設計
|
|
58
|
+
|
|
59
|
+
テストデータはファクトリ関数で管理する。
|
|
60
|
+
|
|
61
|
+
- ファクトリ関数で必要最小限のフィクスチャを生成する
|
|
62
|
+
- テストに無関係なフィールドはデフォルト値で埋める
|
|
63
|
+
- 共有フィクスチャを変更して使い回さない(テスト間の独立性を保つ)
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
// NG - 全フィールドを毎回定義
|
|
67
|
+
const user = { id: '1', name: 'test', email: 'test@example.com', role: 'admin', createdAt: new Date() }
|
|
68
|
+
|
|
69
|
+
// OK - ファクトリ関数で必要最小限
|
|
70
|
+
const createUser = (overrides: Partial<User> = {}): User => ({
|
|
71
|
+
id: 'test-id',
|
|
72
|
+
name: 'test-user',
|
|
73
|
+
email: 'test@example.com',
|
|
74
|
+
role: 'user',
|
|
75
|
+
...overrides,
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
test('admin can delete', () => {
|
|
79
|
+
const admin = createUser({ role: 'admin' })
|
|
80
|
+
// テストに関係するフィールドだけ明示
|
|
81
|
+
})
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## テスト対象の分離
|
|
85
|
+
|
|
86
|
+
テスト容易性は設計品質の指標。テストしにくいコードは依存が密結合している。
|
|
87
|
+
|
|
88
|
+
### 依存注入パターン
|
|
89
|
+
|
|
90
|
+
| パターン | 使用場面 |
|
|
91
|
+
|---------|---------|
|
|
92
|
+
| コンストラクタ注入 | クラスベースの依存分離 |
|
|
93
|
+
| 関数引数 | 関数の依存を引数で受け取る |
|
|
94
|
+
| モジュール差し替え | テスト時にモジュール全体を差し替える |
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
// NG - 直接依存を生成(テストでモック不可)
|
|
98
|
+
class OrderService {
|
|
99
|
+
private repo = new OrderRepository()
|
|
100
|
+
async create(order: Order) { return this.repo.save(order) }
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// OK - コンストラクタ注入(テストでモック可能)
|
|
104
|
+
class OrderService {
|
|
105
|
+
constructor(private readonly repo: OrderRepository) {}
|
|
106
|
+
async create(order: Order) { return this.repo.save(order) }
|
|
107
|
+
}
|
|
108
|
+
```
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
```markdown
|
|
2
|
+
# E2Eカバレッジ計画
|
|
3
|
+
|
|
4
|
+
## プロジェクト概要
|
|
5
|
+
{技術スタック、E2Eテストフレームワーク、テスト実行コマンド}
|
|
6
|
+
|
|
7
|
+
## ユーザー操作の起点
|
|
8
|
+
| # | 起点 | 種別 | ハンドラ |
|
|
9
|
+
|---|------|------|---------|
|
|
10
|
+
| 1 | {コマンド名/ルート/エンドポイント} | CLI/Web/API | `src/file.ts:42` |
|
|
11
|
+
|
|
12
|
+
## UXルート分析
|
|
13
|
+
### {起点名}
|
|
14
|
+
| # | ルート | 分岐条件 | 既存テスト |
|
|
15
|
+
|---|--------|---------|-----------|
|
|
16
|
+
| 1 | {正常フロー} | - | ✅ `e2e/file.test.ts` / ❌ なし |
|
|
17
|
+
| 2 | {オプションX有効時} | `--flag` | ❌ なし |
|
|
18
|
+
| 3 | {エラー時} | {条件} | ❌ なし |
|
|
19
|
+
|
|
20
|
+
## 不足テストケースリスト
|
|
21
|
+
| # | 起点 | テストケース | 優先度 | 検証すべき期待結果 |
|
|
22
|
+
|---|------|------------|--------|-----------------|
|
|
23
|
+
| 1 | {起点} | {ケース概要} | 高/中/低 | {期待結果} |
|
|
24
|
+
| 2 | {起点} | {ケース概要} | 高/中/低 | {期待結果} |
|
|
25
|
+
|
|
26
|
+
## テスト方針
|
|
27
|
+
- {モック戦略}
|
|
28
|
+
- {フィクスチャ設計}
|
|
29
|
+
- {既存ヘルパーの活用}
|
|
30
|
+
|
|
31
|
+
## 実装ガイドライン
|
|
32
|
+
- {テスト実装者向けの指示}
|
|
33
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
```markdown
|
|
2
|
+
# タスク計画
|
|
3
|
+
|
|
4
|
+
## 元の要求
|
|
5
|
+
{ユーザーの要求をそのまま記載}
|
|
6
|
+
|
|
7
|
+
## 分析結果
|
|
8
|
+
|
|
9
|
+
### 目的
|
|
10
|
+
{達成すべきこと}
|
|
11
|
+
|
|
12
|
+
### 参照資料の調査結果(参照資料がある場合)
|
|
13
|
+
{参照資料の実装アプローチの概要と、現在の実装との主要な差異}
|
|
14
|
+
|
|
15
|
+
### デザイン要素の判定(デザイン参照がある場合)
|
|
16
|
+
| 要素 | 変更要/不要 | 根拠 |
|
|
17
|
+
|------|-------------|------|
|
|
18
|
+
|
|
19
|
+
### スコープ
|
|
20
|
+
{影響範囲}
|
|
21
|
+
|
|
22
|
+
### 検討したアプローチ(設計判断がある場合)
|
|
23
|
+
| アプローチ | 採否 | 理由 |
|
|
24
|
+
|-----------|------|------|
|
|
25
|
+
|
|
26
|
+
### 実装アプローチ
|
|
27
|
+
{どう進めるか}
|
|
28
|
+
|
|
29
|
+
## 実装ガイドライン(設計が必要な場合のみ)
|
|
30
|
+
- {Coderが実装時に従うべき指針}
|
|
31
|
+
|
|
32
|
+
## スコープ外(項目がある場合のみ)
|
|
33
|
+
| 項目 | 除外理由 |
|
|
34
|
+
|------|---------|
|
|
35
|
+
|
|
36
|
+
デザイン参照がある場合:
|
|
37
|
+
- {除外した要素名と、除外理由・代替しない理由}
|
|
38
|
+
|
|
39
|
+
## 確認事項(あれば)
|
|
40
|
+
- {不明点や確認が必要な点}
|
|
41
|
+
```
|
|
@@ -22,6 +22,14 @@
|
|
|
22
22
|
### 実装アプローチ
|
|
23
23
|
{どう進めるか}
|
|
24
24
|
|
|
25
|
+
### 到達経路・起動条件(利用者向け機能の追加/変更がある場合)
|
|
26
|
+
| 項目 | 内容 |
|
|
27
|
+
|------|------|
|
|
28
|
+
| 利用者が到達する入口 | {メニュー/route/ボタン/リンク/外部呼び出し など。なければ「入口なし」と明記} |
|
|
29
|
+
| 更新が必要な呼び出し元・配線 | {更新対象のファイルや層} |
|
|
30
|
+
| 起動条件 | {認証、権限、URL条件、フラグなど} |
|
|
31
|
+
| 未対応項目 | {残っている配線があれば明記。なければ「なし」} |
|
|
32
|
+
|
|
25
33
|
## 実装ガイドライン(設計が必要な場合のみ)
|
|
26
34
|
- {Coderが実装時に従うべき指針}
|
|
27
35
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
```markdown
|
|
2
|
+
# セキュリティ監査レポート
|
|
3
|
+
|
|
4
|
+
## 結果: APPROVE / REJECT
|
|
5
|
+
|
|
6
|
+
## 重大度: None / Low / Medium / High / Critical
|
|
7
|
+
|
|
8
|
+
## 監査対象
|
|
9
|
+
| # | ファイル | 監査済み | リスク分類 |
|
|
10
|
+
|---|---------|---------|-----------|
|
|
11
|
+
| 1 | `src/file.ts` | ✅ | 高 / 中 / 低 |
|
|
12
|
+
|
|
13
|
+
## 検出された問題
|
|
14
|
+
| # | 重大度 | カテゴリ | 場所 | 問題 | 修正案 |
|
|
15
|
+
|---|--------|---------|------|------|--------|
|
|
16
|
+
| 1 | Critical | injection | `src/file.ts:42` | {問題の説明} | {修正方法} |
|
|
17
|
+
|
|
18
|
+
## 問題なしのファイル
|
|
19
|
+
- {問題が検出されなかったファイルの一覧}
|
|
20
|
+
|
|
21
|
+
## 推奨事項(非ブロッキング)
|
|
22
|
+
- {セキュリティ改善の提案}
|
|
23
|
+
|
|
24
|
+
## REJECT判定条件
|
|
25
|
+
- High または Critical の問題が1件以上ある場合は REJECT
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**認知負荷軽減ルール:**
|
|
29
|
+
- 問題なし → 監査対象テーブルのみ(15行以内)
|
|
30
|
+
- Low/Medium のみ → + 問題テーブル(30行以内)
|
|
31
|
+
- High/Critical あり → 全セクション出力
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
- TypeScript型安全性の検証
|
|
14
14
|
- フロントエンドセキュリティの確認
|
|
15
15
|
- フロントエンド/バックエンド責務分離の検証
|
|
16
|
+
- デザイン参照が指定されている場合、実装とデザインの一致度検証
|
|
16
17
|
|
|
17
18
|
**やらないこと:**
|
|
18
19
|
- バックエンドのアーキテクチャレビュー(Architecture Reviewerが担当)
|
|
@@ -27,3 +28,4 @@
|
|
|
27
28
|
- アクセシビリティは後付け困難。最初から組み込む
|
|
28
29
|
- 過度な抽象化を警戒。シンプルに保つ
|
|
29
30
|
- フレームワークの作法に従う。独自パターンより標準的なアプローチ
|
|
31
|
+
- デザイン参照があれば、UXの良し悪しより先にデザインとの一致を確認する
|
|
@@ -75,6 +75,49 @@ await processFile(input, output, formatOpt);
|
|
|
75
75
|
2. 差異がオプション引数の有無のみなら、三項演算子やスプレッド構文で統一
|
|
76
76
|
3. 分岐ごとに異なる前処理がある場合は、変数に結果を格納してから単一呼び出しに統一
|
|
77
77
|
|
|
78
|
+
## コールバック + 外部変数キャプチャの濫用
|
|
79
|
+
|
|
80
|
+
AIは戻り値で返せるデータを、コールバック関数と外部変数のキャプチャで実装しがちである。
|
|
81
|
+
|
|
82
|
+
| パターン | 例 | 判定 |
|
|
83
|
+
|---------|-----|------|
|
|
84
|
+
| コールバックで外部変数に代入 | `let result; await f(x => { result = x })` | REJECT |
|
|
85
|
+
| イベントハンドラ経由で値を取得 | `emitter.on('data', d => { captured = d })` で同期的に値を取得 | REJECT |
|
|
86
|
+
| 複数のコールバックで外部状態を組み立て | `forEach(item => {外部Map.set(...) })` で結果を構築 | REJECT |
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
// REJECT - コールバックで外部変数をキャプチャ
|
|
90
|
+
let selectedMode: string | undefined;
|
|
91
|
+
await promptUser(choices, (choice) => {
|
|
92
|
+
selectedMode = choice;
|
|
93
|
+
});
|
|
94
|
+
return selectedMode;
|
|
95
|
+
|
|
96
|
+
// OK - 戻り値で受け取る
|
|
97
|
+
const selectedMode = await promptUser(choices);
|
|
98
|
+
return selectedMode;
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
検証アプローチ:
|
|
102
|
+
1. コールバック関数内で外部スコープの変数に代入している箇所を探す
|
|
103
|
+
2. その値が関数の戻り値で返せるか確認
|
|
104
|
+
3. 返せる場合は戻り値パターンに書き換えを指摘する
|
|
105
|
+
|
|
106
|
+
## レビュー指摘への不適切な対応検出
|
|
107
|
+
|
|
108
|
+
AIはレビュー指摘を「修正」する代わりに、テストやドキュメントで「指摘内容を検証する」コードを追加して対応したつもりになることがある。
|
|
109
|
+
|
|
110
|
+
| パターン | 例 | 判定 |
|
|
111
|
+
|---------|-----|------|
|
|
112
|
+
| 指摘の修正ではなくテストの追加 | 「コメント不要」→ コメントの有無を検証するテストを追加 | REJECT |
|
|
113
|
+
| 指摘の修正ではなくドキュメントの追加 | 「DRY違反」→ 重複が意図的である旨のドキュメントを追加 | REJECT |
|
|
114
|
+
| 指摘と無関係なファイルの変更 | セキュリティ指摘 → 全く別のリファクタリングを実施 | REJECT |
|
|
115
|
+
|
|
116
|
+
検証アプローチ:
|
|
117
|
+
1. 修正差分が指摘の対象ファイル・対象行に対する変更を含んでいるか確認
|
|
118
|
+
2. 新規ファイル追加のみで対応している場合、そのファイルが指摘の「修正」ではなく「検証」になっていないか確認
|
|
119
|
+
3. テスト追加が指摘への対応の場合、テストが「修正後の正しい動作」を検証しているか(「指摘内容そのもの」を検証していないか)確認
|
|
120
|
+
|
|
78
121
|
## コンテキスト適合性評価
|
|
79
122
|
|
|
80
123
|
コードはこの特定のプロジェクトに合っているか?
|