phasegate 0.315.0 → 0.340.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.
Files changed (106) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.ja.md +22 -9
  3. package/README.md +28 -17
  4. package/docs/ADR/038-config-state-operation-permission-policy.md +5 -2
  5. package/docs/ADR/039-hook-observable-state-as-authorization-unit.md +74 -0
  6. package/docs/ADR/040-quick-mode-config-via-preset-resolution.md +66 -0
  7. package/docs/ADR/041-non-excludable-agent-trust-roots.md +68 -0
  8. package/docs/guide/antigravity-integration.md +26 -0
  9. package/docs/guide/cli-reference.md +93 -11
  10. package/docs/guide/codex-integration.md +44 -107
  11. package/docs/guide/configuration.md +43 -2
  12. package/docs/guide/grok-integration.md +26 -0
  13. package/docs/guide/hooks-integration.md +27 -4
  14. package/docs/guide/installation.md +4 -2
  15. package/docs/guide/quick-vs-full-mode.md +36 -1
  16. package/docs/guide/setup-artifacts.md +4 -4
  17. package/docs/guide/skills-overview.md +1 -1
  18. package/package.json +2 -2
  19. package/scripts/harness/agent-integration/application/dto/handle-pre-tool-use-dto.ts +6 -2
  20. package/scripts/harness/agent-integration/application/dto/normalized-pre-tool-use-request.ts +32 -0
  21. package/scripts/harness/agent-integration/application/usecases/handle-pre-tool-use-usecase.ts +17 -9
  22. package/scripts/harness/agent-integration/domain/ports/full-mode-requirement-query-port.ts +3 -1
  23. package/scripts/harness/agent-integration/domain/services/apply-patch-write-target-extractor.ts +98 -0
  24. package/scripts/harness/agent-integration/domain/services/bash-write-target-extractor.ts +196 -54
  25. package/scripts/harness/agent-integration/domain/value-objects/hook-translation-result.ts +1 -1
  26. package/scripts/harness/agent-integration/domain/value-objects/protected-file-list.ts +39 -17
  27. package/scripts/harness/agent-integration/infrastructure/adapters/quick-mode-full-mode-requirement-adapter.ts +15 -1
  28. package/scripts/harness/agent-integration/presentation/phasegate-status-context.ts +1 -1
  29. package/scripts/harness/agent-integration/presentation/post-tool-use-hook.ts +1 -0
  30. package/scripts/harness/agent-integration/presentation/pre-tool-use-hook.ts +129 -73
  31. package/scripts/harness/agent-integration/presentation/pre-tool-use-payload-normalizer.ts +228 -0
  32. package/scripts/harness/agent-integration/presentation/pre-tool-use-response-renderer.ts +38 -0
  33. package/scripts/harness/ci-governance/application/dto/scaffold-inception-input.ts +9 -0
  34. package/scripts/harness/ci-governance/application/dto/scaffold-inception-output.ts +13 -0
  35. package/scripts/harness/ci-governance/application/usecases/list-templates-usecase.ts +30 -0
  36. package/scripts/harness/ci-governance/application/usecases/scaffold-inception-usecase.ts +63 -0
  37. package/scripts/harness/ci-governance/application/usecases/show-template-usecase.ts +39 -0
  38. package/scripts/harness/ci-governance/composition-root.ts +55 -3
  39. package/scripts/harness/ci-governance/domain/ports/inception-doc-writer-port.ts +19 -0
  40. package/scripts/harness/ci-governance/domain/ports/inception-template-repository-port.ts +16 -0
  41. package/scripts/harness/ci-governance/domain/ports/template-catalog-port.ts +23 -0
  42. package/scripts/harness/ci-governance/domain/value-objects/inception-doc-kind.ts +109 -0
  43. package/scripts/harness/ci-governance/domain/value-objects/integrity-target.ts +2 -0
  44. package/scripts/harness/ci-governance/domain/value-objects/template-catalog-entry.ts +53 -0
  45. package/scripts/harness/ci-governance/domain/value-objects/template-name.ts +50 -0
  46. package/scripts/harness/ci-governance/infrastructure/adapters/file-system-inception-doc-writer-adapter.ts +42 -0
  47. package/scripts/harness/ci-governance/infrastructure/adapters/file-system-inception-template-repository-adapter.ts +32 -0
  48. package/scripts/harness/ci-governance/infrastructure/adapters/file-system-template-catalog-adapter.ts +60 -0
  49. package/scripts/harness/ci-governance/presentation/handlers/scaffold-inception-handler.ts +101 -0
  50. package/scripts/harness/ci-governance/presentation/handlers/templates-handler.ts +103 -0
  51. package/scripts/harness/config-foundation/domain/harness-config.ts +12 -0
  52. package/scripts/harness/config-foundation/infrastructure/presets/minimal.json +2 -2
  53. package/scripts/harness/config-foundation/infrastructure/presets/standard.json +2 -2
  54. package/scripts/harness/config-foundation/infrastructure/presets/strict.json +2 -2
  55. package/scripts/harness/config-foundation/infrastructure/schemas/harness-config-v2.schema.json +44 -1
  56. package/scripts/harness/config-foundation/infrastructure/schemas/harness-config-v3.schema.json +42 -1
  57. package/scripts/harness/harness-api/domain/value-objects/known-harness-commands.ts +3 -1
  58. package/scripts/harness/installation/application/checks/antigravity-hook-missing-check.ts +79 -0
  59. package/scripts/harness/installation/application/checks/codex-hook-missing-check.ts +70 -6
  60. package/scripts/harness/installation/application/checks/grok-hook-missing-check.ts +79 -0
  61. package/scripts/harness/installation/application/checks/husky-runtime-inactive-check.ts +33 -0
  62. package/scripts/harness/installation/application/named-hook-json.ts +17 -0
  63. package/scripts/harness/installation/application/operator-notice.ts +42 -0
  64. package/scripts/harness/installation/application/usecases/run-doctor-diagnostics.ts +18 -7
  65. package/scripts/harness/installation/application/usecases/run-install.ts +152 -52
  66. package/scripts/harness/installation/application/usecases/run-reconcile.ts +86 -10
  67. package/scripts/harness/installation/application/usecases/run-uninstall.ts +149 -25
  68. package/scripts/harness/installation/composition-root.ts +10 -0
  69. package/scripts/harness/installation/domain/agent-target.ts +39 -0
  70. package/scripts/harness/installation/domain/check-id.ts +5 -0
  71. package/scripts/harness/installation/domain/husky-runtime-state.ts +34 -0
  72. package/scripts/harness/installation/domain/ports/git-hooks-runtime-probe.ts +9 -0
  73. package/scripts/harness/installation/domain/repair-table.ts +5 -0
  74. package/scripts/harness/installation/infrastructure/adapters/git-hooks-runtime-probe-adapter.ts +62 -0
  75. package/scripts/harness/installation/presentation/cli/install-handler.ts +23 -4
  76. package/scripts/harness/installation/presentation/cli/reconcile-handler.ts +7 -1
  77. package/scripts/harness/installation/presentation/formatters/diagnostic-report-formatter.ts +27 -0
  78. package/scripts/harness/main.ts +202 -51
  79. package/scripts/harness/phase-dependency-model/application/services/evidence-bundle-assembler.ts +2 -1
  80. package/scripts/harness/phase-dependency-model/domain/ports/plan-document-reader-port.ts +12 -0
  81. package/scripts/harness/phase-dependency-model/infrastructure/filesystem/markdown-plan-document-reader.ts +4 -1
  82. package/scripts/harness/quick-mode/application/dto/change-category-classification-contract.ts +1 -1
  83. package/scripts/harness/quick-mode/application/dto/quick-mode-eligibility-contract.ts +1 -1
  84. package/scripts/harness/quick-mode/application/usecases/classify-change-category-usecase.ts +3 -1
  85. package/scripts/harness/quick-mode/domain/errors/quick-mode-config-error.ts +19 -0
  86. package/scripts/harness/quick-mode/domain/services/quick-mode-judgment-engine.ts +59 -19
  87. package/scripts/harness/quick-mode/domain/types/rejection-rule.ts +1 -1
  88. package/scripts/harness/quick-mode/domain/value-objects/category-override-rules.ts +147 -0
  89. package/scripts/harness/quick-mode/domain/value-objects/change-category.ts +33 -0
  90. package/scripts/harness/quick-mode/domain/value-objects/quick-mode-config.ts +31 -10
  91. package/scripts/harness/quick-mode/index.ts +7 -1
  92. package/scripts/harness/quick-mode/infrastructure/adapters/harness-config-quick-mode-config-adapter.ts +83 -32
  93. package/scripts/harness/regression-suite/infrastructure/adapters/vitest-test-runner-adapter.ts +13 -3
  94. package/skills/product-architect/SKILL.md +19 -0
  95. package/skills/story-mapper/SKILL.md +11 -0
  96. package/skills/story-writer/SKILL.md +11 -0
  97. package/skills/unit-designer/SKILL.md +11 -0
  98. package/templates/.agents/hooks.json +16 -0
  99. package/templates/.claude/scripts/analyze-errors-hook.sh +2 -2
  100. package/templates/.claude/settings.json +5 -3
  101. package/templates/.codex/hooks.json +2 -2
  102. package/templates/product_overview.template.md +85 -0
  103. package/templates/product_overview_plan.template.md +55 -0
  104. package/templates/story_mapping_plan.template.md +61 -0
  105. package/templates/story_writer_plan.template.md +61 -0
  106. package/templates/unit_design_plan.template.md +63 -0
@@ -2,81 +2,132 @@
2
2
  * @layer infrastructure
3
3
  * @unit quick-mode
4
4
  * @work-item-id WI-140
5
+ * @work-item-id WI-372
6
+ * @work-item-id WI-377
5
7
  *
6
8
  * phasegate.config.json から QuickModeConfig を取得する Adapter
9
+ *
10
+ * ADR-040: 実効値は config-foundation の防御プリセット解決を経由して決定する。
11
+ * preset 定義(presets/*.json の quickMode)が実効値の所在であり、
12
+ * 下の DEFAULT_QUICK_MODE_CONFIG は preset 解決不能時の fail-open 用フォールバックである。
7
13
  */
8
14
 
9
- import * as fs from 'node:fs/promises';
10
- import * as path from 'node:path';
11
- import { QuickModeConfig } from '../../domain/value-objects/quick-mode-config.js';
15
+ import * as fs from "node:fs/promises";
16
+ import * as path from "node:path";
17
+ import type {
18
+ HarnessConfigResolvedDocument,
19
+ HarnessConfigSourceDocument,
20
+ PresetId,
21
+ } from "../../../config-foundation/domain/harness-config.js";
22
+ import { PresetResolutionService } from "../../../config-foundation/domain/services/preset-resolution-service.js";
23
+ import { PresetDefinitionStore } from "../../../config-foundation/infrastructure/preset-definition-store.js";
24
+ import { QuickModeConfig } from "../../domain/value-objects/quick-mode-config.js";
12
25
 
13
26
  export class HarnessConfigNotFoundError extends Error {
14
27
  constructor(filePath: string) {
15
28
  super(`phasegate.config.json not found: ${filePath}`);
16
- this.name = 'HarnessConfigNotFoundError';
29
+ this.name = "HarnessConfigNotFoundError";
17
30
  }
18
31
  }
19
32
 
20
33
  export class HarnessConfigParseError extends Error {
21
34
  constructor(message: string) {
22
35
  super(`Failed to parse phasegate.config.json: ${message}`);
23
- this.name = 'HarnessConfigParseError';
36
+ this.name = "HarnessConfigParseError";
24
37
  }
25
38
  }
26
39
 
40
+ /**
41
+ * preset 解決が使えない config(未知 preset / project 欠落 / 他セクション不正)でも
42
+ * Quick Mode 判定を止めないためのフォールバック。ADR-038 §3-1 の fail-open 原則に従い、
43
+ * preset 解決の導入によって新たな遮断経路を作らない。
44
+ */
27
45
  const DEFAULT_QUICK_MODE_CONFIG = {
28
- allowedCategories: ['bugfix', 'docs', 'test', 'config'],
29
- maintainedLayers: ['L1', 'L2-002', 'L2-003', 'L2-014', 'L3-001'],
30
- relaxedGates: ['L2-001', 'L3-002', 'L3-003', 'L3-004', 'L4'],
46
+ allowedCategories: ["bugfix", "docs", "test", "config"],
47
+ maintainedLayers: ["L1", "L2-002", "L2-003", "L2-014", "L3-001"],
48
+ relaxedGates: ["L2-001", "L3-002", "L3-003", "L3-004", "L4"],
31
49
  };
32
50
 
51
+ const PRESET_IDS: readonly PresetId[] = ["minimal", "standard", "strict"];
52
+
53
+ type RawQuickMode = HarnessConfigResolvedDocument["quickMode"];
54
+
55
+ function isPresetId(value: unknown): value is PresetId {
56
+ return typeof value === "string" && PRESET_IDS.includes(value as PresetId);
57
+ }
58
+
33
59
  export class HarnessConfigQuickModeConfigAdapter {
34
60
  private readonly configPath: string;
61
+ private readonly presetDefinitionStore: PresetDefinitionStore;
62
+ private readonly presetResolutionService: PresetResolutionService;
35
63
 
36
64
  constructor(configPath?: string) {
37
- this.configPath = configPath ?? path.resolve(process.cwd(), 'phasegate.config.json');
65
+ this.configPath = configPath ?? path.resolve(process.cwd(), "phasegate.config.json");
66
+ this.presetDefinitionStore = new PresetDefinitionStore();
67
+ this.presetResolutionService = new PresetResolutionService();
38
68
  }
39
69
 
40
70
  async getQuickModeConfig(): Promise<QuickModeConfig> {
71
+ const parsed = await this.readSourceDocument();
72
+ const quickMode = this.resolveQuickMode(parsed);
73
+
74
+ return QuickModeConfig.create({
75
+ allowedCategories: quickMode?.allowedCategories ?? DEFAULT_QUICK_MODE_CONFIG.allowedCategories,
76
+ maintainedLayers: quickMode?.maintainedLayers ?? DEFAULT_QUICK_MODE_CONFIG.maintainedLayers,
77
+ relaxedGates: quickMode?.relaxedGates ?? DEFAULT_QUICK_MODE_CONFIG.relaxedGates,
78
+ fullModeRequiredWhen: quickMode?.fullModeRequiredWhen,
79
+ // WI-372 × WI-377 合流点: categoryOverrides は preset 解決経路と raw 縮退経路の
80
+ // 双方が返す `quickMode` から一様に読む。preset 定義は当該キーを宣言しないため
81
+ // deepMerge は source の宣言をそのまま引き継ぎ(base 側 undefined → override を clone)、
82
+ // preset 解決が例外で縮退した場合も raw の宣言がそのまま渡る。未設定時は空ルール
83
+ // = 現行分類のまま。enum 違反は QuickModeConfig.create が QuickModeConfigError を
84
+ // 投げ、この try/catch の外側なので fail-closed 経路へ表面化する。
85
+ categoryOverrides: quickMode?.categoryOverrides,
86
+ });
87
+ }
88
+
89
+ private async readSourceDocument(): Promise<Record<string, unknown>> {
41
90
  let content: string;
42
91
 
43
92
  try {
44
- content = await fs.readFile(this.configPath, 'utf8') as string;
93
+ content = (await fs.readFile(this.configPath, "utf8")) as string;
45
94
  } catch (err) {
46
95
  const error = err as NodeJS.ErrnoException;
47
- if (error.code === 'ENOENT') {
96
+ if (error.code === "ENOENT") {
48
97
  throw new HarnessConfigNotFoundError(this.configPath);
49
98
  }
50
99
  throw err;
51
100
  }
52
101
 
53
- let parsed: Record<string, unknown>;
54
102
  try {
55
- parsed = JSON.parse(content) as Record<string, unknown>;
103
+ return JSON.parse(content) as Record<string, unknown>;
56
104
  } catch (err) {
57
105
  throw new HarnessConfigParseError(err instanceof Error ? err.message : String(err));
58
106
  }
107
+ }
108
+
109
+ /**
110
+ * 防御プリセット解決を経由した quickMode を返す。
111
+ * preset が特定できない、または解決が失敗する config では raw の quickMode に縮退し、
112
+ * 未宣言キーは呼び出し側で DEFAULT_QUICK_MODE_CONFIG に補完される。
113
+ */
114
+ private resolveQuickMode(parsed: Record<string, unknown>): Partial<RawQuickMode> | undefined {
115
+ const rawQuickMode = parsed["quickMode"] as Partial<RawQuickMode> | undefined;
116
+ const preset = (parsed["project"] as { preset?: unknown } | undefined)?.preset;
59
117
 
60
- const quickMode = parsed['quickMode'] as {
61
- allowedCategories?: string[];
62
- maintainedLayers?: string[];
63
- relaxedGates?: string[];
64
- fullModeRequiredWhen?: {
65
- mixedCategories?: boolean;
66
- newDomainFile?: boolean;
67
- apiContractChange?: boolean;
68
- };
69
- } | undefined;
70
-
71
- if (!quickMode) {
72
- return QuickModeConfig.create(DEFAULT_QUICK_MODE_CONFIG);
118
+ if (!isPresetId(preset)) {
119
+ return rawQuickMode;
73
120
  }
74
121
 
75
- return QuickModeConfig.create({
76
- allowedCategories: quickMode.allowedCategories ?? DEFAULT_QUICK_MODE_CONFIG.allowedCategories,
77
- maintainedLayers: quickMode.maintainedLayers ?? DEFAULT_QUICK_MODE_CONFIG.maintainedLayers,
78
- relaxedGates: quickMode.relaxedGates ?? DEFAULT_QUICK_MODE_CONFIG.relaxedGates,
79
- fullModeRequiredWhen: quickMode.fullModeRequiredWhen,
80
- });
122
+ try {
123
+ const presetDefinitions = this.presetDefinitionStore.load();
124
+ const resolved = this.presetResolutionService.resolve(
125
+ parsed as unknown as HarnessConfigSourceDocument,
126
+ presetDefinitions[preset],
127
+ );
128
+ return resolved.quickMode;
129
+ } catch {
130
+ return rawQuickMode;
131
+ }
81
132
  }
82
133
  }
@@ -1,7 +1,10 @@
1
1
  // @layer infrastructure
2
- import { execSync } from 'node:child_process';
2
+ // @unit regression-suite
3
+ // @work-item-id WI-384
4
+ import { execFileSync } from 'node:child_process';
3
5
  import { existsSync } from 'node:fs';
4
6
  import { join } from 'node:path';
7
+ import { execPath } from 'node:process';
5
8
  import { KRequirementTest } from '../../domain/value-objects/k-requirement-test.js';
6
9
  import { GngConditionTest } from '../../domain/value-objects/gng-condition-test.js';
7
10
  import { AgentIndependenceTest } from '../../domain/value-objects/agent-independence-test.js';
@@ -65,8 +68,15 @@ export class VitestTestRunnerAdapter implements TestRunnerPort {
65
68
 
66
69
  const testPattern = hasUnitTests ? unitTestDir : unitIntegrationDir;
67
70
  try {
68
- execSync(
69
- `npx tsx node_modules/vitest/vitest.mjs run --config scripts/harness/__tests__/vitest.config.ts "${testPattern}"`,
71
+ execFileSync(
72
+ execPath,
73
+ [
74
+ 'node_modules/vitest/vitest.mjs',
75
+ 'run',
76
+ '--config',
77
+ 'scripts/harness/__tests__/vitest.config.ts',
78
+ testPattern,
79
+ ],
70
80
  { cwd: this.rootDir, stdio: 'pipe', timeout: 60_000 },
71
81
  );
72
82
  unitResults.set(unit, true);
@@ -35,6 +35,18 @@ languages: [typescript]
35
35
  ### 出力ファイル
36
36
  `docs/inception/_shared/product_overview_plan.md`
37
37
 
38
+ > **テンプレート実体の取得(正本)**: 下の構成ブロックは読み取り用の要約であり、
39
+ > 実体は `templates/product_overview_plan.template.md` にある。
40
+ > node_modules を Read せずに取得・生成するには次を使う:
41
+ >
42
+ > ```bash
43
+ > phasegate templates show product_overview_plan # 本文を stdout に出力
44
+ > phasegate scaffold-inception --kind product-overview-plan --apply # 実ファイルを生成
45
+ > ```
46
+ >
47
+ > scaffold した文書は無編集で Level-1 フェーズゲート(`interactive` モード)を通る。
48
+ > `[Answer]` は **人間が記入する**。AI が埋めると承認証跡の偽造になる。
49
+
38
50
  ### 計画ファイルの構成
39
51
 
40
52
  ```markdown
@@ -93,6 +105,13 @@ languages: [typescript]
93
105
  |------|--------|
94
106
  | 成果物 | `docs/product/product_overview.md` |
95
107
 
108
+ > **テンプレート実体の取得(正本)**: 実体は `templates/product_overview.template.md` にある。
109
+ >
110
+ > ```bash
111
+ > phasegate templates show product_overview
112
+ > phasegate scaffold-inception --kind product-overview --apply
113
+ > ```
114
+
96
115
  ### product_overview.md の構成
97
116
 
98
117
  ```markdown
@@ -81,6 +81,17 @@ MVPスコープの方針・分類基準・不明点を整理し、人間の承
81
81
  ### 出力ファイル
82
82
  `docs/inception/_shared/story_mapping_plan.md`
83
83
 
84
+ > **テンプレート実体の取得(正本)**: 下の構成ブロックは読み取り用の要約であり、
85
+ > 実体は `templates/story_mapping_plan.template.md` にある。
86
+ > node_modules を Read せずに取得・生成するには次を使う:
87
+ >
88
+ > ```bash
89
+ > phasegate templates show story_mapping_plan
90
+ > phasegate scaffold-inception --kind story-mapping-plan --apply
91
+ > ```
92
+ >
93
+ > `[Answer]` は **人間が記入する**。AI が埋めると承認証跡の偽造になる。
94
+
84
95
  ### 計画ファイルの構成
85
96
 
86
97
  ```markdown
@@ -45,6 +45,17 @@ If not, halt and ask the user to create the WI first, or offer to run `phasegate
45
45
  ### 出力ファイル
46
46
  `docs/inception/_shared/story_writer_plan.md`
47
47
 
48
+ > **テンプレート実体の取得(正本)**: 下の構成ブロックは読み取り用の要約であり、
49
+ > 実体は `templates/story_writer_plan.template.md` にある。
50
+ > node_modules を Read せずに取得・生成するには次を使う:
51
+ >
52
+ > ```bash
53
+ > phasegate templates show story_writer_plan
54
+ > phasegate scaffold-inception --kind story-writer-plan --apply
55
+ > ```
56
+ >
57
+ > `[Answer]` は **人間が記入する**。AI が埋めると承認証跡の偽造になる。
58
+
48
59
  ### 計画ファイルの構成
49
60
 
50
61
  ```markdown
@@ -84,6 +84,17 @@ Unit分割の方針・グルーピングの根拠・不明点を整理し、人
84
84
 
85
85
  > **パス注記**: 本スキルが扱う設計文書パス(`docs/inception/...` / `docs/product/units/...`)は既定値であり、consumer が `phasegate.config.json` の `paths` 設定で上書きしている場合はそちらが優先される。
86
86
 
87
+ > **テンプレート実体の取得(正本)**: 下の構成ブロックは読み取り用の要約であり、
88
+ > 実体は `templates/unit_design_plan.template.md` にある。
89
+ > node_modules を Read せずに取得・生成するには次を使う:
90
+ >
91
+ > ```bash
92
+ > phasegate templates show unit_design_plan
93
+ > phasegate scaffold-inception --kind unit-design-plan --apply
94
+ > ```
95
+ >
96
+ > `[Answer]` は **人間が記入する**。AI が埋めると承認証跡の偽造になる。
97
+
87
98
  ### 計画ファイルの構成
88
99
 
89
100
  ```markdown
@@ -0,0 +1,16 @@
1
+ {
2
+ "phasegate-gate": {
3
+ "PreToolUse": [
4
+ {
5
+ "matcher": "^(write_to_file|replace_file_content|multi_replace_file_content|run_command)$",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "npx phasegate hook pre-tool-use",
10
+ "timeout": 30
11
+ }
12
+ ]
13
+ }
14
+ ]
15
+ }
16
+ }
@@ -96,10 +96,10 @@ if command -v npx >/dev/null 2>&1; then
96
96
  fi
97
97
  fi
98
98
 
99
- # Biome lint check
99
+ # PhaseGate lint check (uses the target project's PhaseGate/Biome configuration)
100
100
  LINT_OUTPUT=""
101
101
  if command -v npx >/dev/null 2>&1; then
102
- LINT_RAW=$(npx @biomejs/biome lint "$LOCAL_PATH" 2>&1)
102
+ LINT_RAW=$(npx phasegate lint --json --skip-eslint-removal-check 2>&1)
103
103
  if [ $? -ne 0 ] && [ -n "$LINT_RAW" ]; then
104
104
  LINT_OUTPUT=$(echo "$LINT_RAW" | head -5)
105
105
  fi
@@ -2,7 +2,7 @@
2
2
  "hooks": {
3
3
  "PreToolUse": [
4
4
  {
5
- "matcher": "Bash",
5
+ "matcher": "Bash|apply_patch",
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
@@ -10,7 +10,8 @@
10
10
  },
11
11
  {
12
12
  "type": "command",
13
- "command": "npx phasegate hook pre-tool-use"
13
+ "command": "npx phasegate hook pre-tool-use",
14
+ "timeout": 30
14
15
  }
15
16
  ]
16
17
  },
@@ -19,7 +20,8 @@
19
20
  "hooks": [
20
21
  {
21
22
  "type": "command",
22
- "command": "npx phasegate hook pre-tool-use"
23
+ "command": "npx phasegate hook pre-tool-use",
24
+ "timeout": 30
23
25
  }
24
26
  ]
25
27
  }
@@ -25,7 +25,7 @@
25
25
  ],
26
26
  "PreToolUse": [
27
27
  {
28
- "matcher": "Bash",
28
+ "matcher": "Bash|apply_patch",
29
29
  "hooks": [
30
30
  {
31
31
  "type": "command",
@@ -37,7 +37,7 @@
37
37
  ],
38
38
  "PostToolUse": [
39
39
  {
40
- "matcher": "Bash",
40
+ "matcher": "Bash|apply_patch",
41
41
  "hooks": [
42
42
  {
43
43
  "type": "command",
@@ -0,0 +1,85 @@
1
+ # <プロダクト名>
2
+
3
+ > **スキル**: `product-architect` Phase 2(実行)
4
+ > **入力**: `docs/inception/_shared/product_overview_plan.md`(承認済み)
5
+ > **作成日**: <YYYY-MM-DD>
6
+
7
+ このファイルは `phasegate scaffold-inception --kind product-overview --apply`
8
+ が生成した雛形です。TODO を実体で埋めてください。
9
+ このドキュメントは全スキルの**前提**として参照されます。
10
+
11
+ ---
12
+
13
+ ## 1. プロダクト定義
14
+
15
+ ### 1.1 根本思想
16
+
17
+ TODO: このプロダクトが何を信条として作られるかを 2〜3 行で記述
18
+
19
+ ### 1.2 解決する問題
20
+
21
+ TODO: 現状の痛みと、それが放置された場合のコスト
22
+
23
+ ### 1.3 対象ユーザー
24
+
25
+ TODO: 主ターゲットと、明示的に対象外とするユーザー
26
+
27
+ ## 2. コアドメイン
28
+
29
+ ### 2.1 主要概念(ユビキタス言語)
30
+
31
+ | 概念 | 定義 | 例 |
32
+ |------|------|-----|
33
+ | TODO | TODO | TODO |
34
+
35
+ ### 2.2 概念間の関係図
36
+
37
+ ```mermaid
38
+ graph TD
39
+ A[TODO] --> B[TODO]
40
+ ```
41
+
42
+ ## 3. アーキテクチャ仕様
43
+
44
+ ### 3.1 全体構造(レイヤー図)
45
+
46
+ ```
47
+ TODO: レイヤー構成
48
+ ```
49
+
50
+ ### 3.2 技術スタック
51
+
52
+ | レイヤー | 技術 | 選定理由 |
53
+ |---------|------|---------|
54
+ | TODO | TODO | TODO |
55
+
56
+ ### 3.3 分離方針
57
+
58
+ TODO: 認証/認可、同期/非同期 等の分離方針
59
+
60
+ ## 4. ADR Summary(技術決定記録)
61
+
62
+ | # | 決定事項 | 選択肢 | 決定 | 理由 |
63
+ |---|---------|-------|------|------|
64
+ | 1 | TODO | TODO | TODO | TODO |
65
+
66
+ ## 5. 制約
67
+
68
+ ### 5.1 運用上の制約
69
+
70
+ TODO
71
+
72
+ ### 5.2 実装上の制約
73
+
74
+ TODO
75
+
76
+ ### 5.3 パフォーマンス要件
77
+
78
+ TODO
79
+
80
+ ---
81
+
82
+ ## 注意事項
83
+
84
+ - ユビキタス言語はプロジェクト全体で一貫して使用する
85
+ - 技術選定の「なぜ」を必ず ADR Summary に記録する
@@ -0,0 +1,55 @@
1
+ # プロダクト設計計画
2
+
3
+ > **スキル**: `product-architect` Phase 1(計画)
4
+ > **成果物**: `docs/product/product_overview.md`(Phase 2 で作成)
5
+ > **作成日**: <YYYY-MM-DD>
6
+
7
+ このファイルは `phasegate scaffold-inception --kind product-overview-plan --apply`
8
+ が生成した雛形です。TODO を実体で埋めてください。
9
+ **QA セクションの `[Answer]` は人間が記入するもので、AI が埋めてはいけません。**
10
+
11
+ ---
12
+
13
+ ## 1. スコープ
14
+
15
+ - TODO: プロダクトの目的と対象ユーザー概要
16
+ - TODO: 設計対象セクション一覧
17
+
18
+ ## 2. ドメイン分析(ドラフト)
19
+
20
+ - TODO: 特定されたコアドメイン
21
+ - TODO: 主要業務概念の候補一覧(ユビキタス言語の種)
22
+
23
+ ## 3. アーキテクチャ方針(ドラフト)
24
+
25
+ - TODO: 想定されるアーキテクチャスタイル
26
+ - TODO: 技術スタック候補
27
+
28
+ ## 4. QA(不明点・確認事項)
29
+
30
+ ### [Question] Q1: <質問タイトル>
31
+
32
+ <質問の詳細と背景>
33
+
34
+ **推奨案:** <AI の推奨案>
35
+
36
+ > 下の `[Answer]` 行の直後に **人間が** 回答を記入してください。
37
+ > 空欄のままだと `planningMode: "embedded-qa"` のフェーズゲートは通りません(意図した挙動です)。
38
+
39
+ [Answer]
40
+
41
+ ## 5. 前提条件・リスク
42
+
43
+ - TODO: 前提条件
44
+ - TODO: リスクと対応方針
45
+
46
+ ---
47
+
48
+ ## フェーズゲートとの関係
49
+
50
+ - `planningMode.default: "interactive"`(既定)では、`## 4. QA(不明点・確認事項)`
51
+ という **QA セクション見出しの存在** が Level-1 ゲート通過条件です。
52
+ 見出しは `## QA` / `## Q&A` / `## 4. QA(...)` のいずれの表記でも構いません。
53
+ - `planningMode.default: "embedded-qa"` では、`[Question]` と `[Answer]` の
54
+ **個数一致かつ [Answer] に本文があること** が追加で要求されます。
55
+ この雛形のままではゲートを通りません(人間の回答が必要)。これは意図した挙動です。
@@ -0,0 +1,61 @@
1
+ # ストーリーマッピング計画
2
+
3
+ > **スキル**: `story-mapper` Phase 1(計画)
4
+ > **成果物**: `docs/product/user_story_mapping.md`(Phase 2 で作成)
5
+ > **入力**: `docs/product/user_stories.md`
6
+ > **作成日**: <YYYY-MM-DD>
7
+
8
+ このファイルは `phasegate scaffold-inception --kind story-mapping-plan --apply`
9
+ が生成した雛形です。TODO を実体で埋めてください。
10
+ **QA セクションの `[Answer]` は人間が記入するもので、AI が埋めてはいけません。**
11
+
12
+ ---
13
+
14
+ ## 1. スコープ
15
+
16
+ - TODO: 全ストーリー数
17
+ - TODO: MVP 選定の対象業務プロセス
18
+
19
+ ## 2. MVP選定基準
20
+
21
+ - TODO: 基盤 MVP と業務プロセス MVP の分類基準
22
+ - TODO: MVP / Post-MVP 判定の考え方
23
+
24
+ ## 3. MVPシナリオ(ドラフト)
25
+
26
+ - TODO: 想定されるメインユーザーフロー
27
+ - TODO: 最小限の業務プロセス単位
28
+
29
+ ## 4. ストーリー分類(ドラフト)
30
+
31
+ | ストーリーID | 概要 | MVP候補 | 分類理由 |
32
+ |------------|------|---------|---------|
33
+ | TODO | TODO | TODO | TODO |
34
+
35
+ ## 5. QA(不明点・確認事項)
36
+
37
+ ### [Question] Q1: <質問タイトル>
38
+
39
+ <質問の詳細と背景>
40
+
41
+ **推奨案:** <AI の推奨案>
42
+
43
+ > 下の `[Answer]` 行の直後に **人間が** 回答を記入してください。
44
+ > 空欄のままだと `planningMode: "embedded-qa"` のフェーズゲートは通りません(意図した挙動です)。
45
+
46
+ [Answer]
47
+
48
+ ## 6. 前提条件・リスク
49
+
50
+ - TODO: 前提条件
51
+ - TODO: リスクと対応方針
52
+
53
+ ---
54
+
55
+ ## フェーズゲートとの関係
56
+
57
+ - `planningMode.default: "interactive"`(既定)では、`## 5. QA(不明点・確認事項)`
58
+ という **QA セクション見出しの存在** が Level-1 ゲート通過条件です。
59
+ - `planningMode.default: "embedded-qa"` では、`[Question]` と `[Answer]` の
60
+ **個数一致かつ [Answer] に本文があること** が追加で要求されます。
61
+ この雛形のままではゲートを通りません(人間の回答が必要)。これは意図した挙動です。
@@ -0,0 +1,61 @@
1
+ # ユーザーストーリー作成計画
2
+
3
+ > **スキル**: `story-writer` Phase 1(計画)
4
+ > **成果物**: `docs/product/user_stories.md`(Phase 2 で作成)
5
+ > **入力**: `docs/product/product_overview.md`
6
+ > **作成日**: <YYYY-MM-DD>
7
+
8
+ このファイルは `phasegate scaffold-inception --kind story-writer-plan --apply`
9
+ が生成した雛形です。TODO を実体で埋めてください。
10
+ **QA セクションの `[Answer]` は人間が記入するもので、AI が埋めてはいけません。**
11
+
12
+ ---
13
+
14
+ ## 1. スコープ
15
+
16
+ - TODO: 対象の要求文書
17
+ - TODO: 想定される Epic 一覧
18
+
19
+ ## 2. アクター分析
20
+
21
+ - TODO: 特定されたアクター(ロール)一覧
22
+
23
+ ## 3. ストーリー作成方針
24
+
25
+ - TODO: ストーリーの粒度方針
26
+
27
+ ## 4. ストーリー一覧(ドラフト)
28
+
29
+ Epic 別のストーリー ID・概要の一覧(本文はまだ書かない)。
30
+
31
+ | Epic | ストーリーID | 概要 |
32
+ |------|------------|------|
33
+ | TODO | TODO | TODO |
34
+
35
+ ## 5. QA(不明点・確認事項)
36
+
37
+ ### [Question] Q1: <質問タイトル>
38
+
39
+ <質問の詳細と背景>
40
+
41
+ **推奨案:** <AI の推奨案>
42
+
43
+ > 下の `[Answer]` 行の直後に **人間が** 回答を記入してください。
44
+ > 空欄のままだと `planningMode: "embedded-qa"` のフェーズゲートは通りません(意図した挙動です)。
45
+
46
+ [Answer]
47
+
48
+ ## 6. 前提条件・リスク
49
+
50
+ - TODO: 前提条件
51
+ - TODO: リスクと対応方針
52
+
53
+ ---
54
+
55
+ ## フェーズゲートとの関係
56
+
57
+ - `planningMode.default: "interactive"`(既定)では、`## 5. QA(不明点・確認事項)`
58
+ という **QA セクション見出しの存在** が Level-1 ゲート通過条件です。
59
+ - `planningMode.default: "embedded-qa"` では、`[Question]` と `[Answer]` の
60
+ **個数一致かつ [Answer] に本文があること** が追加で要求されます。
61
+ この雛形のままではゲートを通りません(人間の回答が必要)。これは意図した挙動です。