phasegate 0.32.0 → 0.44.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 (37) hide show
  1. package/CHANGELOG.md +87 -1
  2. package/README.ja.md +498 -660
  3. package/README.md +8 -11
  4. package/docs/folder_management_rules.md +251 -0
  5. package/docs/guide/cli-reference.md +15 -0
  6. package/package.json +3 -1
  7. package/scripts/delegate-sonnet.sh +105 -0
  8. package/scripts/harness/ci-governance/application/usecases/generate-ci-template-usecase.ts +6 -2
  9. package/scripts/harness/harness-api/infrastructure/adapters/validator-system-execution-adapter.ts +11 -2
  10. package/scripts/harness/integrations/pre-commit.ts +64 -130
  11. package/scripts/harness/main.ts +134 -9
  12. package/scripts/harness/phase2-extensions/infrastructure/adapters/git-log-document-age-adapter.ts +7 -1
  13. package/scripts/harness/quick-mode/infrastructure/adapters/git-diff-changed-files-adapter.ts +20 -1
  14. package/scripts/harness/regression-suite/composition-root.ts +4 -1
  15. package/scripts/harness/setup/skill-deployer.ts +99 -0
  16. package/scripts/harness/validator-system/application/dto/run-full-validation-input.ts +5 -0
  17. package/scripts/harness/validator-system/application/use-cases/run-full-validation-usecase.ts +40 -12
  18. package/scripts/harness/validator-system/composition-root.ts +2 -0
  19. package/scripts/harness/validator-system/domain/services/l4/drift-detection-service.ts +29 -2
  20. package/scripts/harness/validator-system/infrastructure/adapters/biome-ast-source-code-analyzer-adapter.ts +17 -0
  21. package/scripts/harness/validator-system/infrastructure/adapters/markdown-design-document-adapter.ts +65 -5
  22. package/scripts/harness/validator-system/presentation/handlers/run-validators-handler.ts +9 -0
  23. package/skills/environment-designer/SKILL.md +1 -1
  24. package/skills/implementation-planner/SKILL.md +1 -1
  25. package/skills/it-test-designer/SKILL.md +3 -3
  26. package/skills/it-test-logic-designer/SKILL.md +2 -2
  27. package/skills/mock-designer/SKILL.md +1 -1
  28. package/skills/scenario-test-designer/SKILL.md +3 -3
  29. package/skills/scenario-test-logic-designer/SKILL.md +2 -2
  30. package/skills/story-mapper/SKILL.md +1 -1
  31. package/skills/story-writer/SKILL.md +1 -1
  32. package/skills/unit-designer/SKILL.md +1 -1
  33. package/skills/unit-test-designer/SKILL.md +3 -3
  34. package/skills/unit-test-logic-designer/SKILL.md +2 -2
  35. package/templates/.claude/settings.json +3 -3
  36. package/templates/.husky/pre-commit +1 -1
  37. package/templates/phasegate.config.json +0 -30
@@ -32,22 +32,50 @@ export class RunFullValidationUseCase {
32
32
  }
33
33
 
34
34
  async execute(input: RunFullValidationInput): Promise<AggregatedValidationReport> {
35
+ // ISSUE-005 P1-4: targetLayers で絞り込み。未指定時は従来の includeL4 挙動を維持。
35
36
  const includeL4 = input.includeL4 !== false;
37
+ const defaultLayers: readonly ('L2' | 'L3' | 'L4')[] = includeL4
38
+ ? ['L2', 'L3', 'L4']
39
+ : ['L2', 'L3'];
40
+ const effectiveLayers = input.targetLayers ?? defaultLayers;
41
+ const runL2 = effectiveLayers.includes('L2');
42
+ const runL3 = effectiveLayers.includes('L3');
43
+ const runL4 = effectiveLayers.includes('L4');
36
44
 
37
- const l2Results = await this.l2UseCase.execute({
38
- targetPaths: input.targetPaths,
39
- unitName: input.unitName,
40
- currentPhase: input.currentPhase,
41
- });
45
+ type Result = {
46
+ validatorId: string;
47
+ passed: boolean;
48
+ errors: readonly {
49
+ code: string;
50
+ severity: string;
51
+ message: string;
52
+ suggestion: string;
53
+ [key: string]: unknown;
54
+ }[];
55
+ durationMs: number;
56
+ skipped?: boolean;
57
+ };
42
58
 
43
- const l3Results = await this.l3UseCase.execute({
44
- targetPaths: input.targetPaths,
45
- coverageReportPath: input.coverageReportPath,
46
- requirementMatrixPath: input.requirementMatrixPath,
47
- });
59
+ let l2Results: readonly Result[] = [];
60
+ if (runL2) {
61
+ l2Results = await this.l2UseCase.execute({
62
+ targetPaths: input.targetPaths,
63
+ unitName: input.unitName,
64
+ currentPhase: input.currentPhase,
65
+ });
66
+ }
67
+
68
+ let l3Results: readonly Result[] = [];
69
+ if (runL3) {
70
+ l3Results = await this.l3UseCase.execute({
71
+ targetPaths: input.targetPaths,
72
+ coverageReportPath: input.coverageReportPath,
73
+ requirementMatrixPath: input.requirementMatrixPath,
74
+ });
75
+ }
48
76
 
49
- let l4Results: readonly { validatorId: string; passed: boolean; errors: readonly { code: string; severity: string; message: string; suggestion: string; [key: string]: unknown }[]; durationMs: number; skipped?: boolean }[] = [];
50
- if (includeL4) {
77
+ let l4Results: readonly Result[] = [];
78
+ if (runL4) {
51
79
  l4Results = await this.l4UseCase.execute({
52
80
  targetUnits: input.targetUnits,
53
81
  });
@@ -100,6 +100,7 @@ export interface ValidatorSystemModule {
100
100
  runQuickModeUseCase: RunQuickModeUseCase;
101
101
  aggregateValidationResultsUseCase: AggregateValidationResultsUseCase;
102
102
  runFullValidationUseCase: RunFullValidationUseCase;
103
+ driftDetectionService: DriftDetectionService;
103
104
  handlers: {
104
105
  runValidators: RunValidatorsHandler;
105
106
  runQuickMode: RunQuickModeHandler;
@@ -229,6 +230,7 @@ export function createValidatorSystemModule(config?: object): ValidatorSystemMod
229
230
  runQuickModeUseCase,
230
231
  aggregateValidationResultsUseCase,
231
232
  runFullValidationUseCase,
233
+ driftDetectionService,
232
234
  handlers,
233
235
  };
234
236
  }
@@ -9,10 +9,20 @@ import { DriftReport } from '../../value-objects/drift-report.js';
9
9
 
10
10
  export interface DriftDetectionDesignDocumentPort {
11
11
  getElements(targetUnits?: readonly string[]): Promise<string[]>;
12
+ /**
13
+ * ISSUE-005 P3-9: element → unit 名のマップ。
14
+ * 実装されていれば DriftReport.unitName の解決に使われる (fallback: 'unknown')。
15
+ */
16
+ getElementUnitMap?(targetUnits?: readonly string[]): Promise<Record<string, string>>;
12
17
  }
13
18
 
14
19
  export interface DriftDetectionSourceCodeAnalyzerPort {
15
20
  getElements(targetUnits?: readonly string[]): Promise<string[]>;
21
+ /**
22
+ * ISSUE-005 P3-9: element → unit 名のマップ。
23
+ * 実装されていれば DriftReport.unitName の解決に使われる (fallback: 'unknown')。
24
+ */
25
+ getElementUnitMap?(targetUnits?: readonly string[]): Promise<Record<string, string>>;
16
26
  }
17
27
 
18
28
  export interface DriftDetectionServiceDeps {
@@ -33,6 +43,23 @@ export class DriftDetectionService {
33
43
  const designElements = await this.designDocumentPort.getElements(targetUnits);
34
44
  const codeElements = await this.sourceCodeAnalyzerPort.getElements(targetUnits);
35
45
 
46
+ // ISSUE-005 P3-9: element → unit のマップを取得し、DriftReport.unitName の解決に使う
47
+ const designUnitMap = this.designDocumentPort.getElementUnitMap
48
+ ? await this.designDocumentPort.getElementUnitMap(targetUnits)
49
+ : {};
50
+ const codeUnitMap = this.sourceCodeAnalyzerPort.getElementUnitMap
51
+ ? await this.sourceCodeAnalyzerPort.getElementUnitMap(targetUnits)
52
+ : {};
53
+
54
+ const resolveUnit = (element: string): string => {
55
+ return (
56
+ designUnitMap[element] ??
57
+ codeUnitMap[element] ??
58
+ targetUnits?.[0] ??
59
+ 'unknown'
60
+ );
61
+ };
62
+
36
63
  const designSet = new Set(designElements);
37
64
  const codeSet = new Set(codeElements);
38
65
 
@@ -44,7 +71,7 @@ export class DriftDetectionService {
44
71
  reports.push(
45
72
  DriftReport.create({
46
73
  direction: 'design→code',
47
- unitName: (targetUnits?.[0]) ?? 'unknown',
74
+ unitName: resolveUnit(element),
48
75
  element,
49
76
  description: `設計に存在するがコードに存在しない: ${element}`,
50
77
  recommendation: `${element} をコードに実装してください`,
@@ -59,7 +86,7 @@ export class DriftDetectionService {
59
86
  reports.push(
60
87
  DriftReport.create({
61
88
  direction: 'code→design',
62
- unitName: (targetUnits?.[0]) ?? 'unknown',
89
+ unitName: resolveUnit(element),
63
90
  element,
64
91
  description: `コードに存在するが設計に存在しない: ${element}`,
65
92
  recommendation: `${element} を設計文書に追記するか、コードから削除してください`,
@@ -44,6 +44,23 @@ export class BiomeAstSourceCodeAnalyzerAdapter implements SourceCodeAnalyzerPort
44
44
  const results = await this.analyzeExports(targetUnits);
45
45
  return results.flatMap((result) => result.exports.map((entry) => entry.name));
46
46
  }
47
+
48
+ /**
49
+ * ISSUE-005 P3-9: element 名から unit 名を引けるマップを返す。
50
+ * 同名 export が複数 unit に存在する場合は最初に見つかった unit を採用する。
51
+ */
52
+ async getElementUnitMap(targetUnits?: readonly string[]): Promise<Record<string, string>> {
53
+ const results = await this.analyzeExports(targetUnits);
54
+ const map: Record<string, string> = {};
55
+ for (const result of results) {
56
+ for (const entry of result.exports) {
57
+ if (!(entry.name in map)) {
58
+ map[entry.name] = result.unitName;
59
+ }
60
+ }
61
+ }
62
+ return map;
63
+ }
47
64
  }
48
65
 
49
66
  type ExportType = SourceAnalysisResult['exports'][number]['type'];
@@ -8,9 +8,55 @@ import type { DesignDocumentPort, StructuredDesignDoc } from '../../domain/ports
8
8
  import { readFile, readdir } from 'node:fs/promises';
9
9
  import { join } from 'node:path';
10
10
 
11
- const SECTION_PATTERN = /^#{2,3}\s+(.+)/gm;
12
11
  const ADR_PATTERN = /ADR-\d{3}/g;
13
12
 
13
+ // ISSUE-005 P3-8: メタ見出し / 議論用セクションを drift 対象から除外するマーカー。
14
+ // 見出し行の直後 (同一行末 or 次の非空行) に置かれたコメントを拾う。
15
+ const SKIP_MARKER = /<!--\s*@drift-check\s*:\s*skip\s*-->/i;
16
+
17
+ // 見出し文字列のうち、デフォルトで drift 対象から外す既知のメタパターン。
18
+ // Unit 設計ドキュメントで頻出する「議論用」「自己評価」系セクション。
19
+ const DEFAULT_META_HEADING_PATTERNS = [
20
+ /engineering[- ]perspective/i,
21
+ /自己評価/,
22
+ /レビュー(観点|コメント)/,
23
+ /議論/,
24
+ /TODO|未決事項|Open\s+Questions?/i,
25
+ /変更履歴|Change\s*Log/i,
26
+ /参考文献|References?/i,
27
+ ];
28
+
29
+ function isMetaHeading(name: string): boolean {
30
+ return DEFAULT_META_HEADING_PATTERNS.some((p) => p.test(name));
31
+ }
32
+
33
+ function extractConceptNames(markdown: string): string[] {
34
+ const lines = markdown.split(/\r?\n/);
35
+ const headings: string[] = [];
36
+ const headingRegex = /^(#{2,3})\s+(.+?)\s*$/;
37
+ for (let i = 0; i < lines.length; i++) {
38
+ const m = headingRegex.exec(lines[i]);
39
+ if (!m) continue;
40
+ const name = m[2].trim();
41
+ // 見出し行自体にスキップマーカーが付いている
42
+ if (SKIP_MARKER.test(lines[i])) continue;
43
+ // 次の非空行にスキップマーカーが付いている
44
+ // ただし、次行が新しい見出しの場合はそれ自身の注釈なので無視する
45
+ let j = i + 1;
46
+ while (j < lines.length && lines[j].trim() === '') j++;
47
+ if (
48
+ j < lines.length &&
49
+ !headingRegex.test(lines[j]) &&
50
+ SKIP_MARKER.test(lines[j])
51
+ ) continue;
52
+ // 既知のメタ見出しは暗黙的にスキップ
53
+ if (isMetaHeading(name)) continue;
54
+ // 名前から末尾のスキップマーカーを落とす (念のため)
55
+ headings.push(name.replace(SKIP_MARKER, '').trim());
56
+ }
57
+ return headings;
58
+ }
59
+
14
60
  export class MarkdownDesignDocumentAdapter implements DesignDocumentPort {
15
61
  private readonly docsRoot: string;
16
62
  private readonly cache = new Map<string, StructuredDesignDoc>();
@@ -38,10 +84,7 @@ export class MarkdownDesignDocumentAdapter implements DesignDocumentPort {
38
84
  const doc: StructuredDesignDoc = {
39
85
  unitName,
40
86
  docPath,
41
- concepts: Array.from(markdown.matchAll(SECTION_PATTERN), (match) => ({
42
- name: match[1].trim(),
43
- type: 'class',
44
- })),
87
+ concepts: extractConceptNames(markdown).map((name) => ({ name, type: 'class' })),
45
88
  layerDependencies: [],
46
89
  adrRefs: Array.from(new Set(markdown.match(ADR_PATTERN) ?? [])),
47
90
  };
@@ -64,6 +107,23 @@ export class MarkdownDesignDocumentAdapter implements DesignDocumentPort {
64
107
  return docs.flatMap((doc) => doc.concepts.map((concept) => concept.name));
65
108
  }
66
109
 
110
+ /**
111
+ * ISSUE-005 P3-9: element 名から unit 名を引けるマップを返す。
112
+ * 同名 element が複数 unit に存在する場合は最初に見つかった unit を採用する。
113
+ */
114
+ async getElementUnitMap(targetUnits?: readonly string[]): Promise<Record<string, string>> {
115
+ const docs = await this.loadDesignDocuments(targetUnits);
116
+ const map: Record<string, string> = {};
117
+ for (const doc of docs) {
118
+ for (const concept of doc.concepts) {
119
+ if (!(concept.name in map)) {
120
+ map[concept.name] = doc.unitName;
121
+ }
122
+ }
123
+ }
124
+ return map;
125
+ }
126
+
67
127
  private async listUnitNames(): Promise<string[]> {
68
128
  try {
69
129
  const entries = await readdir(this.docsRoot, { withFileTypes: true });
@@ -110,12 +110,21 @@ export class RunValidatorsHandler {
110
110
  return { output, exitCode: l1Report.overallPassed ? 0 : 1 };
111
111
  }
112
112
 
113
+ // ISSUE-005 P1-4: args.layer を targetLayers にマップ
114
+ let targetLayers: readonly ('L2' | 'L3' | 'L4')[] | undefined;
115
+ if (args.layer === 'L2') targetLayers = ['L2'];
116
+ else if (args.layer === 'L3') targetLayers = ['L3'];
117
+ else if (args.layer === 'L4') targetLayers = ['L4'];
118
+ else if (args.layer === 'all') targetLayers = ['L2', 'L3', 'L4'];
119
+ // undefined → フィルタなし(従来挙動)
120
+
113
121
  const report = await this.useCase.execute({
114
122
  targetPaths: args.targetPaths ?? [],
115
123
  unitName: args.unit ?? '',
116
124
  currentPhase: args.phase ?? '',
117
125
  includeL4: !args.noL4,
118
126
  failOnWarning: args.failOnWarning,
127
+ targetLayers,
119
128
  });
120
129
 
121
130
  const format = args.format ?? 'human';
@@ -68,7 +68,7 @@ review: opus
68
68
 
69
69
  **このスキルは3フェーズで実行する。**
70
70
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
71
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
71
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
72
72
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
73
73
 
74
74
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -26,7 +26,7 @@ UnitドキュメントとConstructionのドメインモデル設計を元に、*
26
26
 
27
27
  **このスキルは3フェーズで実行する。**
28
28
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
29
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
29
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
30
30
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
31
31
 
32
32
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -18,7 +18,7 @@ review: opus
18
18
  ### 任意インプット(あれば参照)
19
19
  - **ドメインモデル** — `docs/product/construction/{unit}/domain_model.md`
20
20
  - **環境設計** — `docs/product/environment_contract.md`
21
- - **テスト規約** — `docs/principles/testing_rules.md`
21
+ - **テスト規約** — `docs/principles/testing-rules.md`
22
22
  - **既存ITテスト** — 既存パターンの参考
23
23
 
24
24
  ---
@@ -68,7 +68,7 @@ review: opus
68
68
 
69
69
  **このスキルは3フェーズで実行する。**
70
70
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
71
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
71
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
72
72
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
73
73
 
74
74
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -183,7 +183,7 @@ ITテスト設計のスコープ・テスト対象・不明点を整理し、人
183
183
  - **テストコードは生成しない**(設計文書のみ)— 実装は `story-implementor` スキル(codex-delegator経由、またはメインセッションで直接実行)が行う
184
184
  - 論理設計のすべてのユースケース・エンドポイントをカバーする
185
185
  - TDDプロセスの「正しくRED」になる状態を目指す設計を行う
186
- - テスト規約(`docs/principles/testing_rules.md`)がある場合は遵守する
186
+ - テスト規約(`docs/principles/testing-rules.md`)がある場合は遵守する
187
187
  - AAAパターン(Arrange-Act-Assert)を前提としたケース設計を行う
188
188
 
189
189
  ---
@@ -38,7 +38,7 @@ TDD実装フェーズ
38
38
  ### 推奨インプット(あれば参照)
39
39
  - **カバレッジレポート** — `docs/product/construction/{unit}/coverage_report.md`
40
40
  - **既存ITテスト** — `backend/test/integration/**/*.test.ts`(パターン参考)
41
- - **テスト規約** — `docs/principles/testing_rules.md`
41
+ - **テスト規約** — `docs/principles/testing-rules.md`
42
42
  - **ストーリー固有論理設計** — `docs/inception/{unit}/{story_id}/logical_design.md`
43
43
 
44
44
  ---
@@ -71,7 +71,7 @@ TDD実装フェーズ
71
71
 
72
72
  **このスキルは3フェーズで実行する。**
73
73
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
74
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
74
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
75
75
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
76
76
 
77
77
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -64,7 +64,7 @@ review: opus
64
64
 
65
65
  **このスキルは3フェーズで実行する。**
66
66
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
67
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
67
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
68
68
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
69
69
 
70
70
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -17,7 +17,7 @@ review: opus
17
17
 
18
18
  ### 任意インプット(あれば参照)
19
19
  - **UIモック** — `/mock/*.html`(画面フローの参考)
20
- - **テスト規約** — `docs/principles/testing_rules.md`
20
+ - **テスト規約** — `docs/principles/testing-rules.md`
21
21
  - **既存シナリオテスト** — 既存パターンの参考
22
22
 
23
23
  ---
@@ -95,7 +95,7 @@ story-implementor ← TDD実装
95
95
 
96
96
  **このスキルは3フェーズで実行する。**
97
97
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
98
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
98
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
99
99
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
100
100
 
101
101
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -200,7 +200,7 @@ story-implementor ← TDD実装
200
200
  - **テストコードは生成しない**(設計文書のみ)— 実装は `story-implementor` スキル(codex-delegator経由、またはメインセッションで直接実行)が行う
201
201
  - 受け入れ基準を漏れなくカバーする
202
202
  - TDDプロセスの「正しくRED」になる状態を目指す設計を行う
203
- - テスト規約(`docs/principles/testing_rules.md`)がある場合は遵守する
203
+ - テスト規約(`docs/principles/testing-rules.md`)がある場合は遵守する
204
204
  - Playwrightの使用を前提とする(プロジェクト固有の要件がある場合は調整)
205
205
 
206
206
  ---
@@ -37,7 +37,7 @@ TDD実装フェーズ
37
37
  - **カバレッジレポート** — `docs/product/construction/{unit}/coverage_report.md`
38
38
  - **既存シナリオテスト** — `e2e/tests/**/*.spec.ts`(パターン参考)
39
39
  - **UIUX設計** — `docs/inception/{unit}/{story_id}/uiux_design.md`
40
- - **テスト規約** — `docs/principles/testing_rules.md`
40
+ - **テスト規約** — `docs/principles/testing-rules.md`
41
41
 
42
42
  ---
43
43
 
@@ -62,7 +62,7 @@ TDD実装フェーズ
62
62
  ## 3フェーズ実行ルール
63
63
 
64
64
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
65
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
65
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
66
66
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
67
67
 
68
68
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -65,7 +65,7 @@ review: opus
65
65
 
66
66
  **このスキルは3フェーズで実行する。**
67
67
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
68
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
68
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
69
69
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
70
70
 
71
71
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -24,7 +24,7 @@ review: opus
24
24
 
25
25
  **このスキルは3フェーズで実行する。**
26
26
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
27
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
27
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
28
28
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
29
29
 
30
30
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -64,7 +64,7 @@ review: opus
64
64
 
65
65
  **このスキルは3フェーズで実行する。**
66
66
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
67
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
67
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
68
68
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
69
69
 
70
70
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -16,7 +16,7 @@ review: opus
16
16
 
17
17
  ### 任意インプット(あれば参照)
18
18
  - **論理設計** — `docs/product/construction/{unit}/logical_design.md`
19
- - **テスト規約** — `docs/principles/testing_rules.md`
19
+ - **テスト規約** — `docs/principles/testing-rules.md`
20
20
  - **既存ユニットテスト** — 既存パターンの参考
21
21
 
22
22
  ---
@@ -77,7 +77,7 @@ story-implementor ← TDD実装
77
77
 
78
78
  **このスキルは3フェーズで実行する。**
79
79
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
80
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
80
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
81
81
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
82
82
 
83
83
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -182,7 +182,7 @@ story-implementor ← TDD実装
182
182
  - **テストコードは生成しない**(設計文書のみ)— 実装は `story-implementor` スキル(codex-delegator経由、またはメインセッションで直接実行)が行う
183
183
  - ドメインモデルの不変条件を漏れなくカバーする
184
184
  - TDDプロセスの「正しくRED」になる状態を目指す設計を行う
185
- - テスト規約(`docs/principles/testing_rules.md`)がある場合は遵守する
185
+ - テスト規約(`docs/principles/testing-rules.md`)がある場合は遵守する
186
186
  - Vitest/Jest等のテストフレームワークを前提とする
187
187
 
188
188
  ---
@@ -36,7 +36,7 @@ TDD実装フェーズ
36
36
  ### 推奨インプット(あれば参照)
37
37
  - **カバレッジレポート** — `docs/product/construction/{unit}/coverage_report.md`
38
38
  - **既存ユニットテスト** — `backend/test/unit/**/*.test.ts`(パターン参考)
39
- - **テスト規約** — `docs/principles/testing_rules.md`
39
+ - **テスト規約** — `docs/principles/testing-rules.md`
40
40
 
41
41
  ---
42
42
 
@@ -60,7 +60,7 @@ TDD実装フェーズ
60
60
  ## 3フェーズ実行ルール
61
61
 
62
62
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
63
- - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
63
+ - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
64
64
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
65
65
 
66
66
  **Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
@@ -15,7 +15,7 @@
15
15
  "hooks": [
16
16
  {
17
17
  "type": "command",
18
- "command": "npx tsx scripts/harness/agent-integration/presentation/pre-tool-use-hook.ts"
18
+ "command": "npx phasegate hook pre-tool-use"
19
19
  }
20
20
  ]
21
21
  }
@@ -38,7 +38,7 @@
38
38
  },
39
39
  {
40
40
  "type": "command",
41
- "command": "npx tsx scripts/harness/agent-integration/presentation/post-tool-use-hook.ts"
41
+ "command": "npx phasegate hook post-tool-use"
42
42
  }
43
43
  ]
44
44
  }
@@ -49,7 +49,7 @@
49
49
  "hooks": [
50
50
  {
51
51
  "type": "command",
52
- "command": "npx tsx scripts/harness/agent-integration/presentation/stop-hook.ts"
52
+ "command": "npx phasegate hook stop"
53
53
  }
54
54
  ]
55
55
  }
@@ -1,2 +1,2 @@
1
1
  npx lint-staged
2
- npx tsx scripts/harness/integrations/pre-commit.ts
2
+ npx phasegate pre-commit
@@ -1,30 +0,0 @@
1
- {
2
- "version": "1.0",
3
- "preset": "standard",
4
- "project": {
5
- "name": "my-project",
6
- "architecture": "clean-architecture",
7
- "paths": {
8
- "source": [
9
- "backend/src",
10
- "frontend/src"
11
- ],
12
- "docs": {
13
- "units": "docs/product/units",
14
- "inception": "docs/inception",
15
- "construction": "docs/product/construction"
16
- }
17
- },
18
- "naming": {
19
- "fileCase": "kebab-case",
20
- "classCase": "PascalCase",
21
- "unitToPath": "kebab-to-snake"
22
- }
23
- },
24
- "layers": {
25
- "L1_editor": { "enabled": true },
26
- "L2_precommit": { "enabled": true },
27
- "L3_ci": { "enabled": true },
28
- "L4_scheduled": { "enabled": false }
29
- }
30
- }