ai-check-template 0.2.0-alpha.0
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/LICENSE +201 -0
- package/README-ja.md +151 -0
- package/README.md +149 -0
- package/bin/ai-check-template.mjs +7 -0
- package/docs/cli.md +348 -0
- package/package-templates/.claude/README.md +83 -0
- package/package-templates/.claude/rules/test-rules.md +46 -0
- package/package-templates/.claude/settings.hook-fragment.json +25 -0
- package/package-templates/README.md +56 -0
- package/package-templates/ci-examples/README.md +134 -0
- package/package-templates/ci-examples/github-actions/ai-check-fast.yml +49 -0
- package/package-templates/ci-examples/github-actions/ai-check.yml +58 -0
- package/package-templates/ci-examples/github-actions/ai-quality-call.yml +26 -0
- package/package-templates/ci-examples/github-actions/ai-quality-reusable.yml +113 -0
- package/package-templates/docs/philosophy/formal-name-match.md +182 -0
- package/package-templates/docs/philosophy/given-when-then.md +206 -0
- package/package-templates/docs/philosophy/qa-techniques.md +235 -0
- package/package-templates/docs/philosophy/test-pyramid.md +171 -0
- package/package-templates/docs/test-design-template.md +173 -0
- package/package-templates/package.scripts.fragment.json +6 -0
- package/package-templates/profiles/README.md +89 -0
- package/package-templates/profiles/expo-rn/README.md +80 -0
- package/package-templates/profiles/node-cli/README.md +93 -0
- package/package-templates/profiles/react-nextjs/README.md +82 -0
- package/package-templates/profiles/react-vanilla/README.md +73 -0
- package/package-templates/profiles/supabase-rls/README.md +89 -0
- package/package-templates/prompts/README.md +94 -0
- package/package-templates/prompts/boundary-value.md +94 -0
- package/package-templates/prompts/decision-table.md +82 -0
- package/package-templates/prompts/diagnostic-repair.md +149 -0
- package/package-templates/prompts/plan-first.md +122 -0
- package/package-templates/prompts/rls-permission.md +94 -0
- package/package-templates/prompts/state-transition.md +81 -0
- package/package-templates/scripts/README.md +78 -0
- package/package-templates/scripts/ai-check-fast.sh +20 -0
- package/package-templates/scripts/ai-check.sh +22 -0
- package/package.json +47 -0
- package/src/cli/ci-workflows.mjs +104 -0
- package/src/cli/claude-hooks.mjs +94 -0
- package/src/cli/dependency-installer.mjs +164 -0
- package/src/cli/doctor.mjs +392 -0
- package/src/cli/index.mjs +80 -0
- package/src/cli/init.mjs +433 -0
- package/src/cli/install-state.mjs +242 -0
- package/src/cli/package-manager.mjs +78 -0
- package/src/cli/profile-diagnostics.mjs +160 -0
- package/src/cli/profile-docs.mjs +31 -0
- package/src/cli/profile-scripts.mjs +96 -0
- package/src/cli/profile.mjs +59 -0
- package/src/cli/update.mjs +537 -0
- package/src/cli/utils.mjs +75 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# supabase-rls profile(addon)
|
|
2
|
+
|
|
3
|
+
> **ステータス**: Draft v0.1(Phase 1 dogfooding 後に改訂予定。実体ファイルは Phase 2 で配布)
|
|
4
|
+
|
|
5
|
+
## 目的
|
|
6
|
+
|
|
7
|
+
Supabase + Row Level Security(RLS)を使うプロジェクトで、**他 profile に追加適用**する addon profile。pgTAP による DB level テストや、Magic Link 認証の E2E パターンを示す。
|
|
8
|
+
|
|
9
|
+
単独で完結する profile ではなく、`react-nextjs+supabase-rls` のように組み合わせて使う前提。
|
|
10
|
+
|
|
11
|
+
## 対象スタック
|
|
12
|
+
|
|
13
|
+
| カテゴリ | 想定 |
|
|
14
|
+
|---|---|
|
|
15
|
+
| Backend | Supabase(自前 PostgreSQL でも RLS 部分は適用可) |
|
|
16
|
+
| Database | PostgreSQL + Row Level Security |
|
|
17
|
+
| Auth | Supabase Auth(Magic Link / OAuth / Email/Password) |
|
|
18
|
+
| Combine with | react-nextjs / react-vanilla / expo-rn / node-cli いずれか |
|
|
19
|
+
|
|
20
|
+
## 推奨ツール(addon)
|
|
21
|
+
|
|
22
|
+
| ツール | 必須/推奨/任意 | 用途 | 備考 |
|
|
23
|
+
|---|---|---|---|
|
|
24
|
+
| **pgTAP** | 必須 | DB 単体・RLS テスト | Supabase CLI の `supabase test db` で実行 |
|
|
25
|
+
| **InBucket** | 推奨 | Magic Link / メール E2E | Supabase local の SMTP receiver |
|
|
26
|
+
| Supabase CLI | 必須 | local db / migration / test 実行 | `supabase start` で local Postgres 起動 |
|
|
27
|
+
| Vitest + supabase-js | 推奨 | 統合テスト(実ユーザートークン) | service_role は使わない |
|
|
28
|
+
|
|
29
|
+
## ai:check / ai:check:fast カスタマイズ案(addon)
|
|
30
|
+
|
|
31
|
+
base profile の `ai:check` に **追加** で:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"scripts": {
|
|
36
|
+
"test:db": "supabase test db",
|
|
37
|
+
"test:integration:rls": "vitest run --dir tests/rls",
|
|
38
|
+
"ai:check": "pnpm typecheck && pnpm lint && pnpm deadcode && pnpm test && pnpm test:db && pnpm test:integration:rls && pnpm test:e2e:smoke"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- `pnpm test:db`: pgTAP の SQL テスト実行
|
|
44
|
+
- `pnpm test:integration:rls`: 実ユーザートークンで他人データへのアクセス不可を検証
|
|
45
|
+
|
|
46
|
+
## .claude / scripts カスタマイズ案(addon)
|
|
47
|
+
|
|
48
|
+
- `.claude/rules/test-rules.md` に **追記**:
|
|
49
|
+
- RLS テストは「見えるべき / 見えてはいけない」両方をテスト
|
|
50
|
+
- **`service_role` でテストしてはいけない**(権限を素通りする)
|
|
51
|
+
- 実ユーザートークン(`Authorization: Bearer <user-jwt>`)で検証
|
|
52
|
+
- hook fragment は base profile と同じ
|
|
53
|
+
|
|
54
|
+
## 注意事項
|
|
55
|
+
|
|
56
|
+
- **`service_role` 落とし穴**: バックエンドキーで全 RLS をスキップしてしまうため、テストで `service_role` を使うと「RLS が機能しているか」検証できない。**必ず実ユーザートークンで検証**
|
|
57
|
+
- **Magic Link テスト**: InBucket(`http://127.0.0.1:54324`)の API で受信メールを取得 → リンクを抽出 → Playwright で踏む
|
|
58
|
+
- **migration の互換性**: 既存データへの破壊的変更(NOT NULL 追加、列削除)は本番反映前に dry-run
|
|
59
|
+
- **organization_id / tenant_id**: 必ず WHERE 条件で固定。RLS だけに依存しない(防御 in depth)
|
|
60
|
+
- **Edge Functions**: Deno で動くため、Node の test と別環境
|
|
61
|
+
|
|
62
|
+
## 推奨観点([`../../prompts/rls-permission.md`](../../prompts/rls-permission.md) と併せて使う)
|
|
63
|
+
|
|
64
|
+
- role 別マトリクス(anonymous / user / admin)
|
|
65
|
+
- リソース所有マトリクス(self / others)
|
|
66
|
+
- 操作マトリクス(read / create / update / delete)
|
|
67
|
+
- multi-tenant 境界(organization_id / tenant_id)
|
|
68
|
+
|
|
69
|
+
## 隣接 profile(組み合わせ先)
|
|
70
|
+
|
|
71
|
+
- [`../react-nextjs/README.md`](../react-nextjs/README.md) — Next.js + Supabase の典型
|
|
72
|
+
- [`../react-vanilla/README.md`](../react-vanilla/README.md) — SPA + Supabase
|
|
73
|
+
- [`../expo-rn/README.md`](../expo-rn/README.md) — モバイル + Supabase
|
|
74
|
+
- [`../node-cli/README.md`](../node-cli/README.md) — CLI から Supabase API 操作
|
|
75
|
+
|
|
76
|
+
## 隣接思想
|
|
77
|
+
|
|
78
|
+
- [`../../docs/philosophy/test-pyramid.md`](../../docs/philosophy/test-pyramid.md) §5 DB-RLS test 層
|
|
79
|
+
- [`../../docs/philosophy/qa-techniques.md`](../../docs/philosophy/qa-techniques.md) §3 デシジョンテーブル(権限マトリクス)
|
|
80
|
+
- [`../../docs/philosophy/formal-name-match.md`](../../docs/philosophy/formal-name-match.md) — 形名参同
|
|
81
|
+
- [`../../docs/philosophy/given-when-then.md`](../../docs/philosophy/given-when-then.md) — GWT で RLS シナリオ記述
|
|
82
|
+
- [`../../prompts/rls-permission.md`](../../prompts/rls-permission.md) — RLS 専用プロンプト
|
|
83
|
+
|
|
84
|
+
## 出典
|
|
85
|
+
|
|
86
|
+
- Notion ページ: `7c531b165bab4b7ea2dce1782469ac52` — Supabase Testing 戦略(参照日 2026-05-13)
|
|
87
|
+
- Notion ページ: `35b68c677f4380bfa1ffeab248264e92` — テストフロー再設計(Supabase / RLS 観点)
|
|
88
|
+
- Supabase Testing Overview(公式)
|
|
89
|
+
- pgTAP 公式 docs
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# prompts/
|
|
2
|
+
|
|
3
|
+
AI 駆動開発で利用する**プロンプト雛形ライブラリ**。`docs/philosophy/` の思想を AI(Claude Code / Codex 等)に渡す具体的なテキストとして実体化したもの。
|
|
4
|
+
|
|
5
|
+
> **ステータス**: Draft v0.1(Phase 1 dogfooding 後に改訂予定)
|
|
6
|
+
|
|
7
|
+
## 提供物
|
|
8
|
+
|
|
9
|
+
| ファイル | 目的 | カテゴリ | philosophy 対応 |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| [`plan-first.md`](./plan-first.md) | 実装前に AI に Plan(成功基準・検証コマンド・リスク)を書かせる | プロセス | formal-name-match §Phase A |
|
|
12
|
+
| [`decision-table.md`](./decision-table.md) | 複数条件の組み合わせ漏れを防ぐデシジョンテーブル生成 | QA 技法 | qa-techniques §3 |
|
|
13
|
+
| [`state-transition.md`](./state-transition.md) | 状態遷移の許可・禁止両方をテスト | QA 技法 | qa-techniques §4 |
|
|
14
|
+
| [`boundary-value.md`](./boundary-value.md) | 同値分割 + 境界値で入力空間網羅 | QA 技法 | qa-techniques §1, §2 |
|
|
15
|
+
| [`rls-permission.md`](./rls-permission.md) | RLS / 権限境界の機械検証 | QA 技法 + DB-RLS 層 | test-pyramid §5 |
|
|
16
|
+
| [`diagnostic-repair.md`](./diagnostic-repair.md) | `ai:check` / CI 失敗後に diagnostic output から修復計画・patch・再検証へ進める | 修復 | formal-name-match §Repair / Re-check |
|
|
17
|
+
|
|
18
|
+
## 使い方
|
|
19
|
+
|
|
20
|
+
### 1. プロンプト本文をコピー
|
|
21
|
+
|
|
22
|
+
各ファイルの「## プロンプト本文」コードブロックをコピーする。
|
|
23
|
+
|
|
24
|
+
### 2. プレースホルダーを自プロジェクトの仕様で置換
|
|
25
|
+
|
|
26
|
+
プロンプト本文には「(例: ...)」「(ここに仕様を貼り付け)」等のプレースホルダーがある。自プロジェクトの仕様で置換する。
|
|
27
|
+
|
|
28
|
+
### 3. AI に投げる
|
|
29
|
+
|
|
30
|
+
Claude Code / Codex / Cursor 等に貼り付けて実行。実装前段階(observation 設計)にも使えるし、テストコード生成段階にも使える。
|
|
31
|
+
|
|
32
|
+
## 推奨利用フロー
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
1. plan-first.md で「何を作るか」「成功基準」を AI に書かせる
|
|
36
|
+
↓
|
|
37
|
+
2. Plan の「成功基準」を見て、観点が足りなければ以下を補強:
|
|
38
|
+
- 条件組み合わせ → decision-table.md
|
|
39
|
+
- 状態遷移 → state-transition.md
|
|
40
|
+
- 入力バリデーション → boundary-value.md
|
|
41
|
+
- 権限制御 → rls-permission.md
|
|
42
|
+
↓
|
|
43
|
+
3. 補強した成功基準を SPEC / Plan に登録
|
|
44
|
+
↓
|
|
45
|
+
4. ../docs/test-design-template.md で AC と Test Matrix を固定
|
|
46
|
+
↓
|
|
47
|
+
5. 実装
|
|
48
|
+
↓
|
|
49
|
+
6. 形名参同(formal-name-match)で「名」(成功基準)と「形」(実測)を照合
|
|
50
|
+
↓
|
|
51
|
+
7. 失敗時は diagnostic-repair.md に redacted diagnostic output を渡して修復し、同じ command を再実行
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 思想
|
|
55
|
+
|
|
56
|
+
これらのプロンプトは、AI に「テストを書いて」と曖昧に依頼する代わりに、**観点の網羅性を担保する道具**として設計されている。
|
|
57
|
+
|
|
58
|
+
- AI は明示しない限り正常系中心の薄いテストを書きがち
|
|
59
|
+
- 同値分割 / 境界値 / デシジョンテーブル / 状態遷移 / 権限境界の各観点は、人間が QA 技法として明示する必要がある
|
|
60
|
+
- プロンプト雛形は、観点設計の属人化を防ぐ「チームの共通言語」
|
|
61
|
+
|
|
62
|
+
詳細は [`../docs/philosophy/qa-techniques.md`](../docs/philosophy/qa-techniques.md) と [`../docs/philosophy/formal-name-match.md`](../docs/philosophy/formal-name-match.md) を参照。
|
|
63
|
+
|
|
64
|
+
## カスタマイズ
|
|
65
|
+
|
|
66
|
+
### 業務ドメイン特化
|
|
67
|
+
|
|
68
|
+
プロンプト本文を自プロジェクトのドメイン例で置換すると、AI 出力の質が上がる。
|
|
69
|
+
例:
|
|
70
|
+
- `boundary-value.md` の「パスワードは 8 文字以上...」を、自プロジェクトの「商品名は 1〜100 文字...」に置換
|
|
71
|
+
|
|
72
|
+
### プロンプトの組み合わせ
|
|
73
|
+
|
|
74
|
+
複雑な機能では複数プロンプトを順次使う。
|
|
75
|
+
例(決済機能):
|
|
76
|
+
1. `plan-first.md` で全体設計
|
|
77
|
+
2. `boundary-value.md` で金額バリデーション
|
|
78
|
+
3. `state-transition.md` で決済ステータス遷移
|
|
79
|
+
4. `decision-table.md` で割引条件組み合わせ
|
|
80
|
+
5. `rls-permission.md` で組織別の権限
|
|
81
|
+
6. `diagnostic-repair.md` で `ai:check` 失敗後の修復
|
|
82
|
+
|
|
83
|
+
## 隣接する思想
|
|
84
|
+
|
|
85
|
+
- [`../docs/philosophy/qa-techniques.md`](../docs/philosophy/qa-techniques.md) — 6 つの QA 技法の理論
|
|
86
|
+
- [`../docs/philosophy/formal-name-match.md`](../docs/philosophy/formal-name-match.md) — 「名」と「形」の照合(プロンプトの上位概念)
|
|
87
|
+
- [`../docs/philosophy/given-when-then.md`](../docs/philosophy/given-when-then.md) — プロンプト出力を GWT で記述する
|
|
88
|
+
- [`../docs/philosophy/test-pyramid.md`](../docs/philosophy/test-pyramid.md) — 各プロンプトを Unit / Integration / E2E / DB-RLS のどの層に使うか
|
|
89
|
+
|
|
90
|
+
## 出典
|
|
91
|
+
|
|
92
|
+
- Notion ページ: `dc8774cd03c8490688b066c2b0179cac` — AI 駆動開発時代に押さえる QA 技法(参照日 2026-05-13)
|
|
93
|
+
- Notion ページ: `c3e549660ca44005a20c4f6fdb54c8d5` — 無料で作る AI エージェント開発診断フロー
|
|
94
|
+
- Notion ページ: `35b68c677f4380bfa1ffeab248264e92` — テストフロー再設計
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# boundary-value プロンプト
|
|
2
|
+
|
|
3
|
+
> **ステータス**: Draft v0.1(Phase 1 dogfooding 後に改訂予定)
|
|
4
|
+
|
|
5
|
+
## 目的
|
|
6
|
+
|
|
7
|
+
入力空間を同値分割でグループ化し、各境目(境界値)でテストする。AI が生成した実装で頻発する「`>=` と `>` の取り違え」「`<= N` と `< N` の取り違え」を狙い撃ちする。
|
|
8
|
+
|
|
9
|
+
形名参同の「名」に境目の値を漏らさないための観点設計プロンプト。
|
|
10
|
+
|
|
11
|
+
## プロンプト本文
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
以下のバリデーション仕様について、同値分割と境界値分析でテストケースを設計してください。
|
|
15
|
+
|
|
16
|
+
## 仕様
|
|
17
|
+
(例: 「人数は 1〜4 名まで」「文字数は 10 文字以上 100 文字以下」「料金は 100 円以上、最大なし」)
|
|
18
|
+
|
|
19
|
+
## 手順
|
|
20
|
+
|
|
21
|
+
1. 入力空間を同値クラスに分割
|
|
22
|
+
- 有効グループ(spec 内で受理されるべき範囲)
|
|
23
|
+
- 無効グループ(拒否されるべき範囲、各方向)
|
|
24
|
+
2. 各グループの境目の値を特定
|
|
25
|
+
3. 各境目の **内側 1 値** と **外側 1 値** をテストケースに含める
|
|
26
|
+
4. 各代表値で「受理 / 拒否」の期待結果を明示
|
|
27
|
+
|
|
28
|
+
## 出力形式
|
|
29
|
+
|
|
30
|
+
### Step 1: 同値分割
|
|
31
|
+
|
|
32
|
+
- 有効: [a, b]
|
|
33
|
+
- 無効(下限外): x < a
|
|
34
|
+
- 無効(上限外): x > b
|
|
35
|
+
|
|
36
|
+
### Step 2: 境界値リスト
|
|
37
|
+
|
|
38
|
+
| 値 | 期待 | 理由 |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| a-1 | 拒否 | 下限の 1 つ外 |
|
|
41
|
+
| a | 受理 | 下限ちょうど |
|
|
42
|
+
| a+1 | 受理 | 下限の 1 つ内 |
|
|
43
|
+
| b-1 | 受理 | 上限の 1 つ内 |
|
|
44
|
+
| b | 受理 | 上限ちょうど |
|
|
45
|
+
| b+1 | 拒否 | 上限の 1 つ外 |
|
|
46
|
+
|
|
47
|
+
### Step 3: テストコード
|
|
48
|
+
|
|
49
|
+
各境界値で「受理されるか / 拒否されるか」を unit test。
|
|
50
|
+
|
|
51
|
+
## 制約
|
|
52
|
+
|
|
53
|
+
- 境目の値は必ず両側(内 / 外)含める
|
|
54
|
+
- spec が片側のみ制約(例: 「100 円以上、上限なし」)の場合、上限側の境界は省略可
|
|
55
|
+
- 境界値テストは正常系・異常系の AC として SPEC に登録する
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## 利用例
|
|
59
|
+
|
|
60
|
+
### 入力仕様
|
|
61
|
+
> パスワードは 8 文字以上 64 文字以下、英数記号必須。
|
|
62
|
+
|
|
63
|
+
### 期待される AI 出力
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
| 値 | 期待 | 理由 |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| "" (空) | 拒否 | 文字数 0 < 8 |
|
|
69
|
+
| 7 文字 | 拒否 | 下限 - 1 |
|
|
70
|
+
| 8 文字 | 受理 | 下限ちょうど |
|
|
71
|
+
| 9 文字 | 受理 | 下限 + 1 |
|
|
72
|
+
| 64 文字 | 受理 | 上限ちょうど |
|
|
73
|
+
| 65 文字 | 拒否 | 上限 + 1 |
|
|
74
|
+
| 英字のみ 8 文字 | 拒否 | 数字・記号欠落 |
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
その後、各値で受理 / 拒否を確認する unit test を生成。
|
|
78
|
+
|
|
79
|
+
## 隣接する思想
|
|
80
|
+
|
|
81
|
+
- [`../docs/philosophy/qa-techniques.md`](../docs/philosophy/qa-techniques.md) §1. 同値分割, §2. 境界値分析 — 技法の理論
|
|
82
|
+
- [`../docs/philosophy/given-when-then.md`](../docs/philosophy/given-when-then.md) — 境界値を GWT の Then で具体化する
|
|
83
|
+
- [`../docs/philosophy/test-pyramid.md`](../docs/philosophy/test-pyramid.md) — Unit 層に境界値テストを集約する
|
|
84
|
+
|
|
85
|
+
## カスタマイズ
|
|
86
|
+
|
|
87
|
+
- **連続値以外(enum / 集合)**: 境界値の概念が薄まる。代わりに「集合の境界(含む / 含まない要素)」を扱う
|
|
88
|
+
- **複数次元**: 入力が複数軸を持つ場合、デシジョンテーブルプロンプトと組み合わせる
|
|
89
|
+
- **浮動小数点**: 浮動小数の比較は `Number.EPSILON` 等の許容誤差を考慮
|
|
90
|
+
|
|
91
|
+
## 出典
|
|
92
|
+
|
|
93
|
+
- Notion ページ: `dc8774cd03c8490688b066c2b0179cac` — AI 駆動開発時代に押さえる QA 技法(参照日 2026-05-13)の「1. 同値分割」「2. 境界値分析」節
|
|
94
|
+
- 一次資料: ISTQB Foundation Level Syllabus
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# decision-table プロンプト
|
|
2
|
+
|
|
3
|
+
> **ステータス**: Draft v0.1(Phase 1 dogfooding 後に改訂予定)
|
|
4
|
+
|
|
5
|
+
## 目的
|
|
6
|
+
|
|
7
|
+
複数条件の組み合わせ漏れを防ぐ。AI にいきなり「テストを書いて」と依頼すると、条件の組み合わせのうち一部だけテストして他を見落としがち。先にデシジョンテーブルを書かせて、全パターン列挙してから対応テストを生成させる。
|
|
8
|
+
|
|
9
|
+
形名参同の「名」を漏れなく構成するための観点設計プロンプト。
|
|
10
|
+
|
|
11
|
+
## プロンプト本文
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
以下の仕様について、デシジョンテーブルを作成してから、対応するテストコードを生成してください。
|
|
15
|
+
|
|
16
|
+
## 仕様
|
|
17
|
+
(ここに仕様を貼り付け。例: 「通知メール送信条件は、イベント発生 AND 通知 ON AND メール登録の 3 条件を満たすときのみ送信する」)
|
|
18
|
+
|
|
19
|
+
## 手順
|
|
20
|
+
|
|
21
|
+
1. 条件を列挙する(N 個)
|
|
22
|
+
2. 全 2^N パターンをデシジョンテーブルで列挙する
|
|
23
|
+
3. 各パターンの期待結果(例: 送信する / 送信しない)を埋める
|
|
24
|
+
4. 同じ結果のパターンを縮約してよい場合は縮約し、その理由を明記する
|
|
25
|
+
5. 各パターンに対応するテストケースを生成する
|
|
26
|
+
|
|
27
|
+
## 出力形式
|
|
28
|
+
|
|
29
|
+
### Step 1: デシジョンテーブル
|
|
30
|
+
|
|
31
|
+
| 条件A | 条件B | 条件C | 期待結果 | 縮約可否 |
|
|
32
|
+
|---|---|---|---|---|
|
|
33
|
+
| Yes | Yes | Yes | <結果> | - |
|
|
34
|
+
| Yes | Yes | No | <結果> | - |
|
|
35
|
+
...
|
|
36
|
+
|
|
37
|
+
### Step 2: テストコード
|
|
38
|
+
|
|
39
|
+
各パターンに対応する test case(言語・テストランナーは利用者プロジェクトに合わせる)。
|
|
40
|
+
|
|
41
|
+
## 制約
|
|
42
|
+
|
|
43
|
+
- 全パターンを必ず列挙すること(条件が 3 つなら 8 パターン全部)
|
|
44
|
+
- 「他の条件が No なら結果も No」のような縮約をする場合、その判断根拠を明示
|
|
45
|
+
- テストケースは 1 パターン 1 ケースを原則とする
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 利用例
|
|
49
|
+
|
|
50
|
+
### 入力仕様
|
|
51
|
+
> ユーザー登録時、有効な email(フォーマット OK)AND 18 歳以上 AND 利用規約同意の 3 条件を満たすときのみアカウント作成成功。それ以外はエラー。
|
|
52
|
+
|
|
53
|
+
### 期待される AI 出力
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
| email有効 | 18歳以上 | 規約同意 | 結果 |
|
|
57
|
+
|---|---|---|---|
|
|
58
|
+
| Yes | Yes | Yes | 成功 |
|
|
59
|
+
| Yes | Yes | No | エラー: 規約未同意 |
|
|
60
|
+
| Yes | No | Yes | エラー: 年齢不足 |
|
|
61
|
+
| Yes | No | No | エラー(年齢不足を優先) |
|
|
62
|
+
| No | Yes | Yes | エラー: email 無効 |
|
|
63
|
+
...(全 8 パターン)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
その後、各パターンに対応する unit test が生成される。
|
|
67
|
+
|
|
68
|
+
## 隣接する思想
|
|
69
|
+
|
|
70
|
+
- [`../docs/philosophy/qa-techniques.md`](../docs/philosophy/qa-techniques.md) §3. デシジョンテーブル — 技法の理論
|
|
71
|
+
- [`../docs/philosophy/given-when-then.md`](../docs/philosophy/given-when-then.md) — 各パターンを GWT で記述する方法
|
|
72
|
+
- [`../docs/philosophy/formal-name-match.md`](../docs/philosophy/formal-name-match.md) — 「名」を漏れなく定義する道具としての本プロンプト
|
|
73
|
+
|
|
74
|
+
## カスタマイズ
|
|
75
|
+
|
|
76
|
+
- **条件数が多い場合(4 つ以上)**: 2^N が爆発するため、仕様の見直しを検討。本プロンプト末尾に「条件数 4 以上なら仕様分割を提案」を追記してもよい
|
|
77
|
+
- **業務ドメイン特化**: 「ユーザー登録」「決済」「在庫管理」等の例示をプロンプト本文に追加すると AI 出力の質が上がる
|
|
78
|
+
|
|
79
|
+
## 出典
|
|
80
|
+
|
|
81
|
+
- Notion ページ: `dc8774cd03c8490688b066c2b0179cac` — AI 駆動開発時代に押さえる QA 技法(参照日 2026-05-13)の「3. デシジョンテーブル」節
|
|
82
|
+
- 一次資料: ISTQB Foundation Level Syllabus
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# diagnostic-repair プロンプト
|
|
2
|
+
|
|
3
|
+
> **ステータス**: Draft v0.1(Phase 1 dogfooding 後に改訂予定)
|
|
4
|
+
|
|
5
|
+
## 目的
|
|
6
|
+
|
|
7
|
+
`ai:check`、typecheck、lint、unit test、integration test、E2E smoke、security diagnostic が失敗した後に、AI へ安全に修復を依頼するためのプロンプト雛形。
|
|
8
|
+
|
|
9
|
+
このプロンプトは「失敗したから成功基準を変える」ことを禁止し、diagnostic output から root cause、repair plan、patch、re-check へ進ませる。Formal Name Match の Repair → Re-check phase で使う。
|
|
10
|
+
|
|
11
|
+
## 使うタイミング
|
|
12
|
+
|
|
13
|
+
- 実装後に `pnpm ai:check` または `pnpm ai:check:fast` が失敗した
|
|
14
|
+
- CI の diagnostic output を人間が読める形で AI に渡したい
|
|
15
|
+
- AI が「修正しました」と言う前に再検証コマンドを固定したい
|
|
16
|
+
- 失敗ログに private value が含まれる可能性があり、redacted output だけを渡したい
|
|
17
|
+
|
|
18
|
+
## プロンプト本文
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
以下の diagnostic output をもとに、実装を修復してください。
|
|
22
|
+
|
|
23
|
+
## Diagnostic Output
|
|
24
|
+
|
|
25
|
+
(ここに redacted 済みの失敗ログを貼り付ける)
|
|
26
|
+
|
|
27
|
+
Rules for this section:
|
|
28
|
+
- private value, credential, personal data, token-like value は貼らない
|
|
29
|
+
- 必要な場合は [REDACTED] に置換する
|
|
30
|
+
- コマンド名、失敗したファイルパス、テスト名、error message、stack trace の relevant excerpt は残す
|
|
31
|
+
|
|
32
|
+
## Original Requirement
|
|
33
|
+
|
|
34
|
+
(実装前に固定した要件を貼り付ける)
|
|
35
|
+
|
|
36
|
+
## Acceptance Criteria
|
|
37
|
+
|
|
38
|
+
(実装前に固定した AC を貼り付ける)
|
|
39
|
+
|
|
40
|
+
## Verification Commands
|
|
41
|
+
|
|
42
|
+
(再実行すべきコマンドを貼り付ける)
|
|
43
|
+
|
|
44
|
+
## Do Not Change Acceptance Criteria
|
|
45
|
+
|
|
46
|
+
- Acceptance Criteria は変更しない
|
|
47
|
+
- 失敗を避けるために test を弱めない
|
|
48
|
+
- 失敗を避けるために assertion を削らない
|
|
49
|
+
- 仕様が本当に間違っている可能性がある場合は、コード変更を止めて「SPEC mismatch」として報告する
|
|
50
|
+
|
|
51
|
+
## Repair Plan
|
|
52
|
+
|
|
53
|
+
まず patch する前に、以下を短く出力してください。
|
|
54
|
+
|
|
55
|
+
1. Failing command
|
|
56
|
+
2. Failing evidence
|
|
57
|
+
3. Suspected root cause
|
|
58
|
+
4. Files likely to change
|
|
59
|
+
5. Tests that must remain strict
|
|
60
|
+
6. Re-check commands
|
|
61
|
+
|
|
62
|
+
## Patch Rules
|
|
63
|
+
|
|
64
|
+
- 変更は root cause に直接関係する最小範囲に限定する
|
|
65
|
+
- 既存の passing behavior を広げて壊さない
|
|
66
|
+
- AC を満たすための test は削除・緩和しない
|
|
67
|
+
- redacted diagnostic output から secret value を復元しようとしない
|
|
68
|
+
- 関係ない formatting / refactor は混ぜない
|
|
69
|
+
- 修復後、変更したファイルと理由を報告する
|
|
70
|
+
|
|
71
|
+
## Re-check Commands
|
|
72
|
+
|
|
73
|
+
修復後に以下の順で実行し、結果を報告してください。
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
(fast command。例: pnpm test path/to/failing.test.ts)
|
|
77
|
+
(typecheck / lint。例: pnpm typecheck)
|
|
78
|
+
(full gate。例: pnpm ai:check)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Output Format
|
|
82
|
+
|
|
83
|
+
### Diagnosis
|
|
84
|
+
|
|
85
|
+
- Failing command:
|
|
86
|
+
- Failing evidence:
|
|
87
|
+
- Root cause:
|
|
88
|
+
|
|
89
|
+
### Repair Plan
|
|
90
|
+
|
|
91
|
+
- File scope:
|
|
92
|
+
- Patch summary:
|
|
93
|
+
- Tests preserved:
|
|
94
|
+
|
|
95
|
+
### Changes Made
|
|
96
|
+
|
|
97
|
+
- path/to/file:
|
|
98
|
+
|
|
99
|
+
### Re-check Result
|
|
100
|
+
|
|
101
|
+
- command:
|
|
102
|
+
- result:
|
|
103
|
+
- remaining failure:
|
|
104
|
+
|
|
105
|
+
### Human Review Notes
|
|
106
|
+
|
|
107
|
+
- risk:
|
|
108
|
+
- follow-up:
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## 期待する AI のふるまい
|
|
112
|
+
|
|
113
|
+
- diagnostic output を証拠として扱う
|
|
114
|
+
- 失敗した command と test name を明記する
|
|
115
|
+
- AC を変えずに、実装または test の明確な不整合だけを直す
|
|
116
|
+
- 修復後に同じ command を再実行する
|
|
117
|
+
- まだ失敗が残る場合は、成功したように報告しない
|
|
118
|
+
|
|
119
|
+
## 悪い使い方
|
|
120
|
+
|
|
121
|
+
- 失敗ログを貼らずに「直して」と依頼する
|
|
122
|
+
- 失敗を避けるために assertion を削る
|
|
123
|
+
- AC を実装後に書き換える
|
|
124
|
+
- private value を含む raw diagnostic output を貼る
|
|
125
|
+
- unrelated cleanup を同じ repair に混ぜる
|
|
126
|
+
|
|
127
|
+
## Test Design Template との接続
|
|
128
|
+
|
|
129
|
+
実装前に [`../docs/test-design-template.md`](../docs/test-design-template.md) で Requirement / AC / Test Matrix / Verification Commands を固定する。実装後に diagnostic が失敗したら、この prompt に同じ AC と redacted diagnostic output を渡す。
|
|
130
|
+
|
|
131
|
+
## 隣接する思想
|
|
132
|
+
|
|
133
|
+
- [`../docs/philosophy/formal-name-match.md`](../docs/philosophy/formal-name-match.md) — 名(AC)を変えずに形(実測)を修復する
|
|
134
|
+
- [`../docs/philosophy/test-pyramid.md`](../docs/philosophy/test-pyramid.md) — 失敗した layer に応じて最小修復する
|
|
135
|
+
- [`../docs/philosophy/given-when-then.md`](../docs/philosophy/given-when-then.md) — 失敗した Then を明確化する
|
|
136
|
+
- [`../docs/philosophy/qa-techniques.md`](../docs/philosophy/qa-techniques.md) — 境界値・状態遷移・条件組み合わせの見落としを補う
|
|
137
|
+
|
|
138
|
+
## 他プロンプトとの組み合わせ
|
|
139
|
+
|
|
140
|
+
1. [`./plan-first.md`](./plan-first.md) で成功基準を固定
|
|
141
|
+
2. [`../docs/test-design-template.md`](../docs/test-design-template.md) で test matrix を作る
|
|
142
|
+
3. `ai:check` または CI で diagnostic output を得る
|
|
143
|
+
4. `diagnostic-repair.md` で root cause repair を依頼
|
|
144
|
+
5. 同じ command を re-check する
|
|
145
|
+
|
|
146
|
+
## 出典
|
|
147
|
+
|
|
148
|
+
- Notion ページ: `c3e549660ca44005a20c4f6fdb54c8d5` — 無料で作る AI エージェント開発診断フロー
|
|
149
|
+
- philosophy: `package-templates/docs/philosophy/formal-name-match.md` §形名照合ループ
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# plan-first プロンプト
|
|
2
|
+
|
|
3
|
+
> **ステータス**: Draft v0.1(Phase 1 dogfooding 後に改訂予定)
|
|
4
|
+
|
|
5
|
+
## 目的
|
|
6
|
+
|
|
7
|
+
AI に実装させる**前**に、Plan(計画)を書かせる。成功基準・検証コマンド・想定リスクを実装前に固定することで、形名参同の「名」(事前宣言)を確立する。実装後に AI が「動きました」と曖昧に申告するのを防ぐ。
|
|
8
|
+
|
|
9
|
+
形名参同の Phase A([`../docs/philosophy/formal-name-match.md`](../docs/philosophy/formal-name-match.md) §段階的導入)を実装プロセスに組み込むためのプロンプト雛形。
|
|
10
|
+
|
|
11
|
+
## プロンプト本文
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
このタスクを実装する前に、まず Plan を出力してください。
|
|
15
|
+
|
|
16
|
+
## Plan に含めるべき項目
|
|
17
|
+
|
|
18
|
+
1. **変更対象ファイル**: 具体的なパス(推測の場合は「推測」と明記)
|
|
19
|
+
2. **実装方針**: アーキテクチャ・パターン・採用ライブラリ
|
|
20
|
+
3. **成功基準(受け入れ条件)**: 機械検証可能な形で 3 件以上
|
|
21
|
+
4. **実装後に実行する検証コマンド**: typecheck / lint / test / e2e 等の具体コマンド
|
|
22
|
+
5. **想定リスク**: 副作用・互換性・性能・セキュリティ
|
|
23
|
+
6. **影響範囲**: 直接変更しないが影響を受ける箇所
|
|
24
|
+
7. **未確認になりそうな項目**: テストで網羅できない部分(手動確認 / 後続タスク化)
|
|
25
|
+
8. **ロールバック手段**: 失敗時の戻し方
|
|
26
|
+
|
|
27
|
+
## 制約
|
|
28
|
+
|
|
29
|
+
- まだコードは変更しないでください
|
|
30
|
+
- 成功基準は実装後に変更しないでください(「動いたから OK」と後付け正当化しない)
|
|
31
|
+
- 検証コマンドは実行可能な形で記述(「ちゃんと動く」「適切に動く」等の曖昧表現禁止)
|
|
32
|
+
|
|
33
|
+
## 出力形式
|
|
34
|
+
|
|
35
|
+
### Plan
|
|
36
|
+
|
|
37
|
+
**変更対象ファイル**:
|
|
38
|
+
- src/foo/bar.ts (新規)
|
|
39
|
+
- src/foo/types.ts (更新)
|
|
40
|
+
|
|
41
|
+
**実装方針**:
|
|
42
|
+
- ...
|
|
43
|
+
|
|
44
|
+
**成功基準**:
|
|
45
|
+
- [ ] AC-01: `pnpm tsc --noEmit` でエラー 0
|
|
46
|
+
- [ ] AC-02: `pnpm test src/foo` で新規テスト全 pass
|
|
47
|
+
- [ ] AC-03: ...
|
|
48
|
+
|
|
49
|
+
**検証コマンド**:
|
|
50
|
+
\`\`\`bash
|
|
51
|
+
pnpm typecheck
|
|
52
|
+
pnpm lint
|
|
53
|
+
pnpm test
|
|
54
|
+
\`\`\`
|
|
55
|
+
|
|
56
|
+
**想定リスク**:
|
|
57
|
+
- ...
|
|
58
|
+
|
|
59
|
+
**影響範囲**:
|
|
60
|
+
- ...
|
|
61
|
+
|
|
62
|
+
**未確認項目**:
|
|
63
|
+
- ...
|
|
64
|
+
|
|
65
|
+
**ロールバック**:
|
|
66
|
+
- `git checkout HEAD -- src/foo/` で復元可能
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 利用例
|
|
70
|
+
|
|
71
|
+
### 入力タスク
|
|
72
|
+
> ユーザーログイン API(POST /auth/login)を実装してください。
|
|
73
|
+
|
|
74
|
+
### 期待される AI 出力(Plan)
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
**変更対象ファイル**:
|
|
78
|
+
- src/auth/login.ts (新規)
|
|
79
|
+
- src/auth/login.test.ts (新規)
|
|
80
|
+
- src/auth/types.ts (更新: LoginRequest, LoginResponse 型追加)
|
|
81
|
+
|
|
82
|
+
**実装方針**:
|
|
83
|
+
- bcrypt でパスワード照合
|
|
84
|
+
- 成功時 JWT を返す(HS256 / 15 分有効)
|
|
85
|
+
- 失敗時 401 と { error: "invalid_credentials" }
|
|
86
|
+
|
|
87
|
+
**成功基準**:
|
|
88
|
+
- [ ] AC-01: `pnpm typecheck` エラー 0
|
|
89
|
+
- [ ] AC-02: 正しい credential で POST /auth/login → 200 + token
|
|
90
|
+
- [ ] AC-03: 誤った password → 401
|
|
91
|
+
- [ ] AC-04: 存在しない email → 401(user enumeration 防止)
|
|
92
|
+
- [ ] AC-05: failed_attempts カウンタが +1 される
|
|
93
|
+
|
|
94
|
+
...
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
実装は Plan が承認されてから着手。
|
|
98
|
+
|
|
99
|
+
## 隣接する思想
|
|
100
|
+
|
|
101
|
+
- [`../docs/philosophy/formal-name-match.md`](../docs/philosophy/formal-name-match.md) §段階的導入 Phase A, §実装パターン §パターン 1: Plan-First プロンプト — 本プロンプトの理論
|
|
102
|
+
- [`../docs/philosophy/given-when-then.md`](../docs/philosophy/given-when-then.md) — 成功基準を GWT 構文で書く方法
|
|
103
|
+
- [`../docs/philosophy/qa-techniques.md`](../docs/philosophy/qa-techniques.md) — 成功基準の観点を充実させる技法
|
|
104
|
+
|
|
105
|
+
## 他プロンプトとの組み合わせ
|
|
106
|
+
|
|
107
|
+
Plan-first を最初に実行 → Plan で挙げた成功基準を以下のプロンプトで具体化:
|
|
108
|
+
- 入力バリデーション → [`./boundary-value.md`](./boundary-value.md)
|
|
109
|
+
- 条件分岐 → [`./decision-table.md`](./decision-table.md)
|
|
110
|
+
- ステータス遷移 → [`./state-transition.md`](./state-transition.md)
|
|
111
|
+
- 権限制御 → [`./rls-permission.md`](./rls-permission.md)
|
|
112
|
+
|
|
113
|
+
## カスタマイズ
|
|
114
|
+
|
|
115
|
+
- **大規模実装**: Plan が肥大化したら、機能を分割して別 Plan に分ける
|
|
116
|
+
- **既存コード変更**: 「変更対象ファイル」に既存パス + 変更概要を記載
|
|
117
|
+
- **段階的導入**: Phase 別に Plan を分けて、各 Phase の AC を独立に検証
|
|
118
|
+
|
|
119
|
+
## 出典
|
|
120
|
+
|
|
121
|
+
- Notion ページ: `c3e549660ca44005a20c4f6fdb54c8d5` — 無料で作る AI エージェント開発診断フロー(参照日 2026-05-13)の「### 実装前」節
|
|
122
|
+
- philosophy: `package-templates/docs/philosophy/formal-name-match.md` §実装パターン §パターン 1
|