phasegate 0.124.0 → 0.126.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/CHANGELOG.md CHANGED
@@ -7,6 +7,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.126.0] - 2026-05-08
11
+
12
+ ### Fixed
13
+
14
+ - **WI-090 — `phasegate init` が unknown flag を silent ignore する問題を解消** — 例えば `phasegate init --skill-set core` (typo: 正しくは `--skills core`) を実行すると、従来は `--skill-set` 値が無視されて default の `all` で deploy されていた。本リリースで unknown flag を **exit 2 + suggestion** として error 化。
15
+ - **新規ヘルパー**: `scripts/harness/main.ts` に `validateKnownFlags` / `findClosestFlag` / `levenshtein` の 3 関数を inline 追加 (presentation layer の zero-dep CLI parser に組み込み、commander/yargs などの外部依存は追加しない方針を維持)。
16
+ - **挙動**: `init` 冒頭で `KNOWN_INIT_FLAGS = ["--name", "--preset", "--skills", "--agent", "--with-husky", "--yes"]` と照合し、未知の `--xxx` または `--xxx=value` を検出すると Levenshtein 距離 ≤ 4 の closest flag を `Did you mean '...'?` で提示、該当無しなら known flags の列挙を提示して exit 2。
17
+ - **互換性**: 既存の正しい flag 利用 (`--skills core` / `--name foo` 等) には一切影響しない。`--yes` は既存 user の script 互換のため known flag として受理 (no-op)。
18
+ - **help line 修正**: `main.ts` の `printUsage()` で表示される `init` 説明行に `--skills <core|all>` と `--yes` を追記 (従来 `--skills` が help から欠落していた)。
19
+ - **テスト追加**: 4 integration ケース (`scripts/harness/__tests__/integration/harness-api/init-flag-validation.integration.test.ts`):
20
+ - `--skill-set core` typo は `Did you mean '--skills'?` を出して exit 2
21
+ - `--skill-set=core` (=value 形式の typo) も同様に検出
22
+ - `--xyz-totally-unknown` は known flags の列挙を出して exit 2
23
+ - 正しい組み合わせ `--name foo --skills all --agent claude --yes` は flag validation で reject されない
24
+ - 全 3503 テスト (前回 3499 + 新規 4) グリーン、L1 lint 違反なし。
25
+ - **スコープ外**: 他 subcommand (update-skills / migrate / lint / validate / etc.) への validateKnownFlags 展開は段階適用のため別 WI。`--help` per subcommand 実装も別 WI。
26
+
27
+ ## [0.125.0] - 2026-05-08
28
+
29
+ ### Changed
30
+
31
+ - **WI-089 — WI-088 guidance skills の dogfood feedback 反映 (P1, P2, P4, P5 + cohesion audit)** — v0.124.0 で追加した `phasegate-toolkit-guide` / `phasegate-config-doctor` を別 PJ で dogfood 検証した結果を反映し、UX 改善 + skill 内部の冗長 / 凝集度 / 矛盾を解消。
32
+ - **P1 (discoverability)**: `phasegate init` 完了メッセージの末尾に `Need help?` ブロックを追加。`skillSet !== "core"` 時に `/phasegate-toolkit-guide` (Q&A) と `/phasegate-config-doctor` (config tuning) の起動方法を案内。
33
+ - **P2 (fresh init shortcut)**: `phasegate-config-doctor` に **Step 1.5: Fresh init 判定** を新設。default config + 設計文書空 + Unit 構造未着手の 3 条件を全て満たすプロジェクトには「先に `/product-architect` で AIDLC を開始するのが効率的」とショートカット応答し、9 観点の機械的診断ノイズを抑制。
34
+ - **P4 (UX 標準化)**: `phasegate-config-doctor` Step 4 (適用フロー) を `AskUserQuestion` ベースに書き換え。提案件数に応じて 1 回確認 / WARN→SUGGEST 分割を使い分ける指針を明記。
35
+ - **P5 (consumer noise 削除)**: 両 skill 本文から `WI-086` / `WI-087` 等の実装履歴 WI 番号を削除し、機能ベースの記述 (例: `(v0.122 以降)` / `monorepo 自動検出`) に置き換え。consumer プロジェクトの AI に意味のない historical noise を排除。
36
+ - **Cohesion audit** (`phasegate-toolkit-guide`): 「重要な設計原則」と「アンチパターン」「回答プロセス」と「回答時のスタイル」「マッピングが曖昧な場合 / 設定変更を伴う質問 / アンチパターン」の 3 重複を統合。設計原則を肯定形 4 項目に正規化、回答プロセスを 4 step に統合、境界条件を 1 セクションにまとめ、アンチパターン section を削除。
37
+ - **Cohesion audit** (`phasegate-config-doctor`): 設計原則を 6 項目の肯定形に正規化しアンチパターン section を削除、観点 1 (schema バージョン) と観点 3 (architecture.preset) を「観点 1: architecture セクション (preset / 整合性)」に統合 (architecture key 不在判定 + 推奨 preset 推測 + custom 値検証を一体化)、Step 3 末尾の重複した「適用しますか?」列挙を Step 4 に統合、Step 4 末尾と重複していた「出力例 (簡易)」section を削除。
38
+ - **矛盾解消** (`phasegate-config-doctor` 観点 3 paths): default path が「実プロジェクトのパスに合っていれば OK」という曖昧条件を「Read tool でリストして存在 + 中身ありなら OK / 存在しないか空なら scaffold 期 (Step 1.5) または別配置の可能性」と判定基準を明示化。
39
+ - **検証**: 両 SKILL.md を `skill-creator/scripts/quick_validate.py` で再 validation pass。全 3499 テストグリーン (前回と同数、新規テストは追加せず — UX 改善 + 文章整理のため挙動変更なし)。L1 lint 違反なし。
40
+ - **スコープ外**: P3 (canonical doc 日本語化 / 各 doc に日本語サマリ追加) は分量大のため別 WI (WI-090 候補) で扱う。
41
+
10
42
  ## [0.124.0] - 2026-05-08
11
43
 
12
44
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phasegate",
3
- "version": "0.124.0",
3
+ "version": "0.126.0",
4
4
  "packageManager": "pnpm@10.30.1",
5
5
  "description": "Phasegate — AI-agnostic quality defense toolkit. Enforces structural integrity between design intent and code.",
6
6
  "license": "MIT",
@@ -81,7 +81,8 @@ Usage: phasegate <command> [options]
81
81
 
82
82
  Setup:
83
83
  init Initialize project: deploy skills + design docs + phasegate.config.json
84
- (--name <project-name>, --preset <full|standard|minimal|custom>, --agent <claude|codex|both>, --with-husky)
84
+ (--name <project-name>, --preset <full|standard|minimal|custom>,
85
+ --skills <core|all>, --agent <claude|codex|both>, --with-husky, --yes)
85
86
  update-skills Re-deploy skills from current harness version
86
87
 
87
88
  Commands:
@@ -166,6 +167,58 @@ function hasFlag(args: readonly string[], flag: string): boolean {
166
167
  return args.includes(flag);
167
168
  }
168
169
 
170
+ function levenshtein(a: string, b: string): number {
171
+ const m = a.length;
172
+ const n = b.length;
173
+ if (m === 0) return n;
174
+ if (n === 0) return m;
175
+ const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
176
+ for (let i = 0; i <= m; i++) dp[i][0] = i;
177
+ for (let j = 0; j <= n; j++) dp[0][j] = j;
178
+ for (let i = 1; i <= m; i++) {
179
+ for (let j = 1; j <= n; j++) {
180
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
181
+ dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
182
+ }
183
+ }
184
+ return dp[m][n];
185
+ }
186
+
187
+ function findClosestFlag(input: string, known: readonly string[]): string | undefined {
188
+ let best: string | undefined;
189
+ let bestDist = Number.POSITIVE_INFINITY;
190
+ for (const flag of known) {
191
+ const dist = levenshtein(input, flag);
192
+ if (dist < bestDist) {
193
+ bestDist = dist;
194
+ best = flag;
195
+ }
196
+ }
197
+ return bestDist <= 4 ? best : undefined;
198
+ }
199
+
200
+ function validateKnownFlags(args: readonly string[], known: readonly string[]): string | null {
201
+ const knownSet = new Set(known);
202
+ let i = 0;
203
+ while (i < args.length) {
204
+ const arg = args[i];
205
+ if (!arg.startsWith("--")) {
206
+ i++;
207
+ continue;
208
+ }
209
+ const flagName = arg.includes("=") ? arg.slice(0, arg.indexOf("=")) : arg;
210
+ if (knownSet.has(flagName)) {
211
+ i++;
212
+ continue;
213
+ }
214
+ const suggestion = findClosestFlag(flagName, known);
215
+ return suggestion
216
+ ? `Error: unknown flag '${flagName}'. Did you mean '${suggestion}'?`
217
+ : `Error: unknown flag '${flagName}'. Known flags: ${known.join(", ")}`;
218
+ }
219
+ return null;
220
+ }
221
+
169
222
  /** フラグとその値を除いた位置引数のみを返す */
170
223
  function parsePositionalArgs(args: readonly string[], flagsWithValues: readonly string[] = []): string[] {
171
224
  const result: string[] = [];
@@ -434,6 +487,12 @@ async function main(): Promise<void> {
434
487
  switch (command) {
435
488
  // ── harness setup ──
436
489
  case "init": {
490
+ const KNOWN_INIT_FLAGS = ["--name", "--preset", "--skills", "--agent", "--with-husky", "--yes"];
491
+ const flagError = validateKnownFlags(args, KNOWN_INIT_FLAGS);
492
+ if (flagError) {
493
+ console.error(flagError);
494
+ process.exit(2);
495
+ }
437
496
  const projectName = parseFlag(args, "--name") ?? "my-project";
438
497
  const rawPhasePreset = parseFlag(args, "--preset");
439
498
  if (
@@ -564,6 +623,12 @@ async function main(): Promise<void> {
564
623
  );
565
624
  console.log(` See docs/guide/codex-integration.md for the native apply_patch limitation.`);
566
625
  }
626
+ if (skillSet !== "core") {
627
+ console.log("");
628
+ console.log("Need help?");
629
+ console.log(" • Q&A about phasegate concepts: invoke /phasegate-toolkit-guide");
630
+ console.log(" • Diagnose & tune phasegate.config.json: invoke /phasegate-config-doctor");
631
+ }
567
632
  process.exit(0);
568
633
  break;
569
634
  }
@@ -5,98 +5,121 @@ description: 現在の phasegate.config.json を schema + プロジェクト検
5
5
 
6
6
  # Phasegate Config Doctor
7
7
 
8
- 現在の `phasegate.config.json` を診断し、改善案を **diff 形式** でユーザーに提示する skill。**silent 書き換えは禁止** — 必ずユーザー確認を取ってから Edit を実行する。
8
+ 現在の `phasegate.config.json` を診断し、改善案を **diff 形式** でユーザーに提示する skill
9
9
 
10
10
  ## このスキルが解決する問題
11
11
 
12
- phasegate を導入した直後の config は単純な default で、実プロジェクトの構造 (monorepo / formatter 選定 / architecture style / Quick Mode の運用方針) に最適化されていない。ユーザーが「設定を最適化したい」と言ったとき、AI が schema を知らずに勘で書き換えると壊れるため、**schema + 検出結果に基づいた決定的提案** が必要。
12
+ phasegate を導入した直後の config は単純な default で、実プロジェクトの構造 (monorepo / formatter 選定 / architecture style / Quick Mode の運用方針) に最適化されていない。AI が schema を知らずに勘で書き換えると壊れるため、**schema + 検出結果に基づいた決定的提案** が必要。
13
13
 
14
- ## 重要な設計原則
14
+ ## 設計原則
15
15
 
16
- 1. **silent 書き換え禁止** — 全提案は diff として提示し、ユーザー承認後に Edit
17
- 2. **schema を読んでから提案** `node_modules/phasegate/scripts/harness/.../schemas/harness-config-v3.schema.json` Read してから値域を確認
18
- 3. **検出結果を優先**機械的に決定可能な部分 (workspace 構造、formatter、bash 互換性) AI 推論ではなく検出結果を採用
19
- 4. **AI 推論は判断要素のみ**architecture preset 選定、relaxedGates 推奨値などは AI が判断するが、根拠を必ず示す
20
- 5. **read-only な Q&A は phasegate-toolkit-guide に委譲** — 「L2 って何?」など概念質問は本 skill のスコープ外
16
+ 1. **silent 書き換え禁止** — 提案は diff として提示し、`AskUserQuestion` で承認を取ってから Edit
17
+ 2. **検出結果を優先**機械的に決定可能な部分 (workspace 構造、formatter、bash 互換性) は AI 推論ではなく検出結果を採用
18
+ 3. **AI 推論は判断要素のみ** architecture preset 選定、relaxedGates 推奨値などは AI が判断するが根拠を必ず示す
19
+ 4. **schema enum 違反確認時のみ Read** 日常診断は本 SKILL 内の判定基準で十分。schema 全文 Read は値域不明時に限定する
20
+ 5. **read-only な Q&A は phasegate-toolkit-guide に委譲** — 「L2 って何?」など概念質問は本 skill スコープ外
21
+ 6. **変更後は L2 検証必須** — `npx phasegate validate --layer L2` を走らせてからユーザーに完了報告
21
22
 
22
23
  ## 診断プロセス
23
24
 
24
25
  ### Step 1: 現状把握 (read-only)
25
26
 
26
- 以下のファイルを **必ず Read** してから診断する:
27
+ 以下のファイルを Read してから診断する:
27
28
 
28
29
  | 情報源 | パス | 用途 |
29
30
  |---|---|---|
30
31
  | 現 config | `phasegate.config.json` | 診断対象 |
31
- | schema | `node_modules/phasegate/scripts/harness/config-foundation/infrastructure/schemas/harness-config-v3.schema.json` (or `harness-config-v2.schema.json` if v2) | 値域確認 |
32
32
  | package.json | `package.json` | devDependencies (formatter 検出) / workspaces 検出 |
33
- | pnpm workspace | `pnpm-workspace.yaml` | workspace 検出 |
34
- | lerna config | `lerna.json` | workspace 検出 |
33
+ | pnpm workspace | `pnpm-workspace.yaml` (存在すれば) | workspace 検出 |
34
+ | lerna config | `lerna.json` (存在すれば) | workspace 検出 |
35
35
  | hook config | `.claude/scripts/hook-config.json` | 既存 hook 設定確認 |
36
36
 
37
- phasegate リポジトリ自体 (dogfood) の場合は `node_modules/phasegate/` を `docs/` / `scripts/harness/config-foundation/...` に置換。
37
+ **schema は必要なときだけ Read** (enum 違反疑い時など): `node_modules/phasegate/scripts/harness/config-foundation/infrastructure/schemas/harness-config-v3.schema.json` (or `harness-config-v2.schema.json` if v2)。
38
+
39
+ phasegate リポジトリ自体 (dogfood) の場合は `node_modules/phasegate/` を `scripts/harness/config-foundation/...` に置換。
40
+
41
+ ### Step 1.5: Fresh init 判定 (重要)
42
+
43
+ 以下の **全条件** を満たす場合、フル診断は早期。Step 2 に進まず AIDLC 開始を案内する:
44
+
45
+ - `phasegate.config.json` が `phasegate init` 直後の default 状態 (`project.preset = "standard"` / `architecture.preset` 設定済 / `layers` / `quickMode` / `harnesses` が空 dict)
46
+ - `docs/product/construction/` が空または存在しない
47
+ - `scripts/`, `src/` 配下に Unit 構造 (`domain/application/infrastructure/presentation` 等) が無い
48
+
49
+ **該当時の応答**:
50
+
51
+ ```
52
+ このプロジェクトは phasegate init 直後の状態のため、config を最適化するより先に
53
+ AIDLC を開始することを推奨します:
54
+
55
+ /product-architect
56
+
57
+ product-architect で Unit を作り、いくつかの logical_design を書いた後で本 skill を再実行すると、
58
+ 実態に基づいた具体的な改善提案ができます。
59
+ ```
60
+
61
+ 該当しない場合のみ Step 2 に進む。
38
62
 
39
63
  ### Step 2: 診断観点
40
64
 
41
- 以下の観点で順に診断する。各観点で **OK / WARN / SUGGEST** のいずれかを出す。
65
+ 各観点で **OK / WARN / SUGGEST** のいずれかを出す。
42
66
 
43
- #### 観点 1: schema バージョン
67
+ #### 観点 1: architecture セクション (preset / 整合性)
44
68
 
45
- - `architecture` キーが無い → v2 として扱われる → v0.120 以降では `architecture: { preset: "..." }` 追加を推奨 (SUGGEST)
46
- - `architecture.preset` "custom" だが `architecture.layers` 未定義schema validator で reject される (WARN)
69
+ - `architecture` キーが無い → v2 として扱われる → SUGGEST: `architecture: { preset: "..." }` 追加
70
+ - `architecture.preset` 未指定 + `scripts/`, `src/` 配下のディレクトリ構造から推測SUGGEST:
71
+ - `domain/` `application/` `infrastructure/` `presentation/` の 4 層あり → `clean` 推奨
72
+ - DDD タクティカル (`entities/aggregates/repositories`) あり → `strict-ddd` 推奨
73
+ - `core/`, `adapters/`, `ports/` パターン → `hexagonal` 推奨
74
+ - 上記いずれも無し → ユーザーに確認 + `custom` 提案
75
+ - 検出根拠を必ず提示 (例:「`scripts/harness/{domain,application,infrastructure,presentation}` を検出 → `clean` 推奨」)
76
+ - `architecture.preset = "custom"` だが `architecture.layers` 未定義 → WARN: schema validator で reject される
47
77
 
48
78
  #### 観点 2: project.preset (防御プリセット)
49
79
 
50
- - `project.preset` が未指定 → SUGGEST: プロジェクト規模に応じて `minimal` / `standard` / `strict` から推奨
80
+ - `project.preset` 未指定 → SUGGEST: プロジェクト規模に応じて `minimal` / `standard` / `strict`
51
81
  - 値が enum 外 → WARN
52
82
 
53
- #### 観点 3: architecture.preset (アーキプリセット)
54
-
55
- - 未指定 + `scripts/`, `src/` 配下のディレクトリ構造を検査して推測:
56
- - `domain/` `application/` `infrastructure/` `presentation/` の 4 層あり → `clean` を推奨
57
- - DDD タクティカル (entities/aggregates/repositories) あり → `strict-ddd` を推奨
58
- - `core/`, `adapters/`, `ports/` パターン → `hexagonal` を推奨
59
- - 上記いずれも無し、または独自命名 → ユーザーに確認 + `custom` を提案
60
- - 検出根拠を必ず提示 (例: 「`scripts/harness/{domain,application,infrastructure,presentation}` を検出 → `clean` 推奨」)
83
+ #### 観点 3: paths
61
84
 
62
- #### 観点 4: paths
85
+ - `paths.designDocs` / `paths.inceptionDocs` が default のまま (`docs/product/construction` / `docs/inception`):
86
+ - 実 path を Read tool でリスト確認し、存在 + 中身あり → OK
87
+ - 存在しない or 空 → fresh init scaffold 期 (Step 1.5 で早期 return しているはず) または別 path に置いている可能性 → ユーザーに確認
88
+ - default 以外で実 path に存在する → OK
63
89
 
64
- - `paths.designDocs` / `paths.inceptionDocs` が default のまま (`docs/product/construction` / `docs/inception`) → 実プロジェクトのパスに合っていれば OK
65
- - 異なるパスに設計文書がある場合 → SUGGEST: 実パスに合わせて変更
66
-
67
- #### 観点 5: quickMode
90
+ #### 観点 4: quickMode
68
91
 
69
92
  - `quickMode.allowedCategories` が default `['bugfix', 'docs', 'test', 'config']` のまま → プロジェクトの慣習に応じて拡張提案
70
93
  - `quickMode.relaxedGates` が空 → small team なら `['phase-gate']` 追加を SUGGEST、enterprise なら現状維持を OK
71
94
 
72
- #### 観点 6: harnesses (cascade / bundle / dead-code)
95
+ #### 観点 5: harnesses (cascade / bundle / dead-code)
73
96
 
74
- - `cascadeUpdate: false` → AI 主導開発なら true 推奨 (SUGGEST)
75
- - `agentLessonCollection: false` → AI セッションの教訓を蓄積したいなら true 推奨 (SUGGEST)
97
+ - `cascadeUpdate: false` → AI 主導開発なら `true` 推奨 (SUGGEST)
98
+ - `agentLessonCollection: false` → AI セッションの教訓を蓄積したいなら `true` 推奨 (SUGGEST)
76
99
  - `bundleSizeLimit: 0` → frontend プロジェクトなら値設定推奨
77
100
 
78
- #### 観点 7: baseline
101
+ #### 観点 6: baseline
79
102
 
80
103
  - `baseline` セクション不在 → default `enabled: true, path: .phasegate/baseline.json` (v0.117 以降)
81
104
  - 既存大規模プロジェクトに後追い導入なら baseline 有効化推奨 (新規違反のみ厳しく検査)
82
105
 
83
- #### 観点 8: agentIntegration.stopHook.enforce (WI-087 Phase C-2)
106
+ #### 観点 7: agentIntegration.stopHook.enforce (v0.122 以降)
84
107
 
85
108
  - 未指定 (`false` 相当) → AI セッションの Stop hook 失敗を **warning のみ** で許容
86
109
  - `true` セット → Complete Check 失敗時に Claude Code の turn を hard block (exit 2)
87
110
  - 推奨: AI 主導開発で本格運用するなら `true` を SUGGEST
88
111
 
89
- #### 観点 9: hook-config.json (`.claude/scripts/`)
112
+ #### 観点 8: hook-config.json (`.claude/scripts/`)
90
113
 
91
- - `targetDirs: ["src"]` のままで monorepo の場合 → WARN: `phasegate init` を再実行すれば WI-087 Phase B の自動検出が効く
114
+ - `targetDirs: ["src"]` のままで monorepo の場合 → WARN: `phasegate init` を再実行すれば monorepo 自動検出が効く (v0.120 以降)
92
115
  - `formatter: "biome"` だが `@biomejs/biome` が devDependencies に無い → WARN: prettier に切り替え推奨
93
- - WI-087 v0.119 未満で deploy された hook script (mapfile 使用) → WARN: macOS で silent fail
116
+ - v0.119 未満で deploy された hook script (bash 4 `mapfile` 使用) → WARN: macOS の bash 3.2 で silent fail。`phasegate init` 再実行で更新
94
117
 
95
- ### Step 3: 提案フォーマット
118
+ ### Step 3: 診断レポート
96
119
 
97
- 診断結果を以下の形式でユーザーに提示する:
120
+ 診断結果を以下の形式で提示する:
98
121
 
99
- ```markdown
122
+ ````markdown
100
123
  ## phasegate.config.json 診断結果
101
124
 
102
125
  ### サマリ
@@ -116,7 +139,7 @@ phasegate リポジトリ自体 (dogfood) の場合は `node_modules/phasegate/`
116
139
  + "layers": [ /* layer 定義 */ ]
117
140
  + }
118
141
  ```
119
- - 補足: layer 構造が clean / strict-ddd / hexagonal / onion / layered / flat のいずれかに該当するなら、`preset: "<その値>"` に変更する方が簡潔
142
+ - 補足: layer 構造が clean / strict-ddd / hexagonal / onion / layered / flat のいずれかに該当するなら `preset: "<その値>"` のほうが簡潔
120
143
 
121
144
  ### 💡 改善提案 (SUGGEST)
122
145
 
@@ -135,20 +158,26 @@ phasegate リポジトリ自体 (dogfood) の場合は `node_modules/phasegate/`
135
158
  - project.preset = "standard"
136
159
  - paths.designDocs / paths.inceptionDocs はデフォルト値で実プロジェクトと一致
137
160
  - baseline セクション不在 → default 有効 (v0.117+)
161
+ ````
138
162
 
139
- ---
163
+ ### Step 4: 適用 (AskUserQuestion 経由)
140
164
 
141
- 上記提案のうち、適用するものを選択してください:
142
- - [全て適用]
143
- - [W1 のみ適用]
144
- - [S1 のみ適用]
145
- - [何も適用しない (情報のみ)]
146
- - [カスタム (個別選択)]
147
- ```
165
+ 提案件数に応じて使い分ける:
148
166
 
149
- ### Step 4: 適用
167
+ - **提案 1-3 件**: `AskUserQuestion` 1 回で「全て適用 / 個別選択 / 適用しない」を提示
168
+ - **提案 4 件以上**: WARN を先に `AskUserQuestion` で確認し、SUGGEST はバッチで別途確認
150
169
 
151
- ユーザーが適用対象を確定したら、`Edit` ツールで `phasegate.config.json` を変更。
170
+ option 設計の例 (提案 2 件、WARN 1 + SUGGEST 1 のとき):
171
+
172
+ ```
173
+ question: "phasegate.config.json に提案 2 件あります。どう適用しますか?"
174
+ options:
175
+ - label: "全て適用 (推奨) — W1 + S1"
176
+ - label: "WARN のみ適用 — W1 のみ"
177
+ - label: "適用しない (情報のみ受け取る)"
178
+ ```
179
+
180
+ ユーザーが適用対象を確定したら `Edit` で `phasegate.config.json` を変更。
152
181
 
153
182
  **変更後の必須検証**:
154
183
 
@@ -158,15 +187,6 @@ npx phasegate validate --layer L2
158
187
 
159
188
  L2 でエラーが出た場合は変更を **rollback** し、ユーザーに報告 (silent に進めない)。
160
189
 
161
- ## アンチパターン
162
-
163
- - ❌ 現 config を読まずに「一般論として推奨」を出す (実態と乖離する)
164
- - ❌ schema を読まずに値を提案する (enum 外の値を出してしまう)
165
- - ❌ ユーザー確認を取らずに Edit する
166
- - ❌ 「とりあえず全部 strict にしておく」のような根拠なき強気提案
167
- - ❌ phase-dependency-model 関連の改修を無検証で提案 (memory `feedback_dogfood_before_release.md` 適用 — paths config / Artifact 改修は dogfood 必須)
168
- - ❌ 設定変更後に `npx phasegate validate --layer L2` を走らせずに完了報告
169
-
170
190
  ## phasegate-toolkit-guide との使い分け
171
191
 
172
192
  | 質問種別 | 使う skill |
@@ -176,24 +196,4 @@ L2 でエラーが出た場合は変更を **rollback** し、ユーザーに報
176
196
  | 「monorepo 対応されてる?」(現状確認) | phasegate-toolkit-guide |
177
197
  | 「monorepo 用に config 直して」(設定変更) | phasegate-config-doctor |
178
198
 
179
- ユーザー質問が両方にまたがる場合は、まず phasegate-toolkit-guide で概念を説明 → ユーザーが「じゃあ修正して」と言ったら phasegate-config-doctor に切り替える。
180
-
181
- ## 出力例 (簡易)
182
-
183
- ユーザー: 「phasegate のセットアップ最適化して」
184
-
185
- ```
186
- [phasegate.config.json を Read]
187
- [harness-config-v3.schema.json を Read]
188
- [package.json / pnpm-workspace.yaml を Read]
189
- [scripts/ ディレクトリ構造を ls]
190
-
191
- 診断結果:
192
- - ✅ OK: 5 件 (project / paths / harnesses / reporting / baseline)
193
- - ⚠️ WARN: 1 件 (W1: architecture.preset 未指定 → v2 schema 扱い → warning が出る)
194
- - 💡 SUGGEST: 2 件 (S1: clean preset 推奨 / S2: cascadeUpdate=true 推奨)
195
-
196
- 提案 diff: [上記フォーマット]
197
-
198
- どれを適用しますか?
199
- ```
199
+ ユーザー質問が両方にまたがる場合は、まず phasegate-toolkit-guide で概念を説明 → ユーザーが「じゃあ修正して」と言ったら本 skill に切り替える。
@@ -9,22 +9,23 @@ phasegate ツールキット自体の概念・仕様・設定について、ユ
9
9
 
10
10
  ## このスキルが解決する問題
11
11
 
12
- ユーザーが phasegate を導入したプロジェクトで、AI に phasegate 関連の質問や設定変更を依頼したとき、AI が `node_modules/phasegate/` を grep で調査して仕様を推測する非効率を防ぐ。
12
+ ユーザーが phasegate を導入したプロジェクトで AI に phasegate 関連の質問をしたとき、AI が `node_modules/phasegate/` を grep で調査して仕様を推測する非効率を防ぐ。
13
13
 
14
- phasegate の概念と仕様は **canonical doc が `node_modules/phasegate/docs/guide/` 配下に同梱されている**。本 skill はそれらへの正確なポインタを提供する。
14
+ phasegate の概念・仕様は **canonical doc が `node_modules/phasegate/docs/guide/` 配下に同梱されている**。本 skill はそれらへの正確なポインタを提供する。
15
15
 
16
- ## 重要な設計原則
16
+ ## 設計原則
17
17
 
18
- **knowledge skill 本体に固定しない**。本 SKILL.md は「どの doc を読めば答えられるか」のポインタだけを持つ。実際の概念知識は phasegate 同梱 canonical doc から動的に読み込む。
19
-
20
- これにより `npm update phasegate` knowledge が自動追従する (skill markdown に概念本文を書いてしまうとバージョン乖離が起きる)。
18
+ 1. **canonical doc を必ず Read してから答える** training data 依存で答えない (バージョン乖離リスク)
19
+ 2. **knowledge を skill 本体に固定しない** — skill markdown には「どの doc を読めば答えられるか」のポインタだけを書く。`npm update phasegate` で knowledge が自動追従する構造を保つ
20
+ 3. **read-only に徹する** 「config X を変更したい」など設定変更を伴う質問は範囲外。`phasegate-config-doctor` に委譲する
21
+ 4. **doc 全文をユーザーに貼り付けない** — 要約 + 該当セクション名引用で返す
21
22
 
22
23
  ## 回答プロセス
23
24
 
24
25
  1. ユーザー質問を以下の **概念カテゴリ** にマッピング
25
- 2. 対応する canonical doc を **Read tool で読む**
26
- 3. Read した内容に基づいて回答
27
- 4. 回答内に **doc 内の該当セクションへのポインタ** を含める (ユーザーが詳細確認できるように)
26
+ 2. 対応する canonical doc を **Read tool で読む** — 長い doc は当該セクションを `offset` / `limit` で限定して読む
27
+ 3. Read した内容に基づいて簡潔に回答 (2-3 段落 + コード例 1 つ程度)
28
+ 4. 回答内に **doc 内の該当セクション名** を引用 (ユーザーが doc を直接開いたとき navigation できるように)
28
29
 
29
30
  ### canonical doc の場所
30
31
 
@@ -32,7 +33,7 @@ phasegate がインストールされたプロジェクトでは、以下のい
32
33
 
33
34
  ```
34
35
  node_modules/phasegate/docs/guide/ # npm 経由でインストールされた consumer プロジェクト
35
- docs/guide/ # phasegate リポジトリ自体 (dogfood)
36
+ docs/guide/ # phasegate リポジトリ自体 (dogfood)
36
37
  ```
37
38
 
38
39
  **先に `node_modules/phasegate/docs/guide/` を試し**、見つからなければ `docs/guide/` を試す。
@@ -48,7 +49,7 @@ docs/guide/ # phasegate リポジトリ自体 (dogfood
48
49
 
49
50
  **参照先**: `docs/guide/layer-model.md`
50
51
 
51
- **読み方**: ファイル全体を読む (各層のセクションが明確に分かれている)
52
+ 各層 (L0 / L1 / L2 / L3 / L4) のセクションが見出しで区切られているので、質問された層のセクションのみ `offset` 指定で部分読みすると効率的。
52
53
 
53
54
  ### 2. 防御プリセット / アーキプリセット (重要: 2 系統あり)
54
55
 
@@ -75,9 +76,9 @@ docs/guide/ # phasegate リポジトリ自体 (dogfood
75
76
  - 「relaxedGates って何のため?」
76
77
  - 「allowedCategories はどこで設定する?」
77
78
 
78
- **参照先**: `docs/guide/quick-vs-full-mode.md`
79
+ **参照先**: `docs/guide/quick-vs-full-mode.md` (Mode の概念と切り替え条件)
79
80
 
80
- 設定キーは `phasegate.config.json` の `quickMode` セクション (`allowedCategories` / `relaxedGates` / `fullModeRequiredWhen`)。詳細は `docs/guide/configuration.md` の `quickMode` セクションも併読。
81
+ 設定キー (`quickMode.allowedCategories` / `quickMode.relaxedGates` / `quickMode.fullModeRequiredWhen`) の詳細は `docs/guide/configuration.md` の `quickMode` セクション。
81
82
 
82
83
  ### 4. Hook 仕様 (PreToolUse / PostToolUse / Stop / SessionStart / UserPromptSubmit)
83
84
 
@@ -89,7 +90,7 @@ docs/guide/ # phasegate リポジトリ自体 (dogfood
89
90
 
90
91
  **参照先**: `docs/guide/hooks-integration.md`
91
92
 
92
- `Responsibility Separation` セクションに pre / post / Stop の責務分担表がある (WI-086 で追加)。Stop hook `agentIntegration.stopHook.enforce` オプションは WI-087 Phase C-2 で追加された。
93
+ `Responsibility Separation` セクションに pre / post / Stop の責務分担表があり、Stop hook を strict mode (turn を hard block) にする `agentIntegration.stopHook.enforce` オプションもそこに記載されている。
93
94
 
94
95
  ### 5. config 全般 (`phasegate.config.json`)
95
96
 
@@ -101,7 +102,7 @@ docs/guide/ # phasegate リポジトリ自体 (dogfood
101
102
 
102
103
  **参照先**: `docs/guide/configuration.md`
103
104
 
104
- 各 top-level セクションごとに説明あり: `project` / `layers` / `quickMode` / `phaseDependencies` / `harnesses` / `paths` / `reporting` / `architecture` / `agentIntegration` / `protectedFiles` / `baseline`。
105
+ 各 top-level セクション (`project` / `layers` / `quickMode` / `phaseDependencies` / `harnesses` / `paths` / `reporting` / `architecture` / `agentIntegration` / `protectedFiles` / `baseline`) ごとに説明あり。
105
106
 
106
107
  ### 6. CLI コマンド一覧
107
108
 
@@ -120,7 +121,7 @@ docs/guide/ # phasegate リポジトリ自体 (dogfood
120
121
  - 「既存プロジェクトに後から導入したい」
121
122
 
122
123
  **参照先**:
123
- - 新規導入: `docs/guide/installation.md`, `docs/guide/quickstart.md` (存在する場合)
124
+ - 新規導入: `docs/guide/installation.md`
124
125
  - 既存プロジェクト導入: `docs/guide/retrofit-adoption.md`
125
126
 
126
127
  ### 8. skill 一覧と使い分け
@@ -139,28 +140,18 @@ docs/guide/ # phasegate リポジトリ自体 (dogfood
139
140
 
140
141
  **参照先**: `docs/guide/codex-integration.md`
141
142
 
142
- ## 回答時のスタイル
143
+ ## 境界条件
143
144
 
144
- - 簡潔に答える (2-3 段落 + コード例 1 つ程度)
145
- - canonical doc の **該当セクション名** を必ず引用 (ユーザーが doc を直接開いたときの navigation 補助)
146
- - 質問が複数カテゴリにまたがる場合は、最も関連性の高い doc を先に読む
147
- - doc を読まずに回答しない (本 skill の存在意義は「正確な情報源を引く」こと)
145
+ ### 質問が複数カテゴリにまたがる場合
148
146
 
149
- ## マッピングが曖昧な場合
147
+ 最も関連性の高い doc を先に読み、必要なら追加で別 doc を読んで補う。
150
148
 
151
- ユーザー質問が上記カテゴリのいずれにも明確に当てはまらない場合:
149
+ ### マッピングが曖昧な場合
152
150
 
153
151
  1. `docs/guide/` 配下の doc 一覧 (`ls node_modules/phasegate/docs/guide/`) を取得
154
152
  2. ファイル名から推測して最も近い doc を読む
155
153
  3. それでも見つからなければ、ユーザーに **どの観点を知りたいか** を質問で絞り込む
156
154
 
157
- ## 設定変更を伴う質問
158
-
159
- 「config の X を変更したい」など **設定変更を伴う質問** は、本 skill の範囲外。phasegate-config-doctor skill (存在すれば) に委譲するか、ユーザーに「設定変更には phasegate-config-doctor を起動するのが推奨」と案内する。本 skill は **read-only な Q&A に徹する**。
160
-
161
- ## アンチパターン
155
+ ### 設定変更を伴う質問
162
156
 
163
- - canonical doc を読まずに training data 依存で答える (バージョン乖離リスク)
164
- - ❌ doc 全文をユーザーに貼り付ける (要約して該当セクションへのポインタを返す)
165
- - ❌ `phasegate.config.json` を直接編集する (本 skill は read-only)
166
- - ❌ skill 本文に概念解説を書き加える (doc に書くべき。skill はポインタ役)
157
+ 「config X を変更したい」など **設定変更を伴う質問** は本 skill のスコープ外。`phasegate-config-doctor` に委譲する (deploy 済の guidance skill。ユーザーに「設定変更には phasegate-config-doctor が推奨」と案内)