phasegate 0.16.0 → 0.31.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 (215) hide show
  1. package/README.ja.md +71 -39
  2. package/README.md +69 -9
  3. package/docs/ADR/ADR-013-story-reflection-gate.md +100 -0
  4. package/docs/guide/configuration.md +244 -7
  5. package/package.json +4 -2
  6. package/scripts/harness/adr-foundation/domain/ports/adr-document-parser-port.ts +1 -0
  7. package/scripts/harness/adr-foundation/domain/ports/adr-frontmatter-parser-port.ts +1 -0
  8. package/scripts/harness/adr-foundation/domain/ports/adr-repository-port.ts +1 -0
  9. package/scripts/harness/adr-foundation/domain/value-objects/adr-status.ts +6 -6
  10. package/scripts/harness/agent-integration/application/dto/handle-pre-tool-use-dto.ts +3 -1
  11. package/scripts/harness/agent-integration/application/usecases/handle-pre-tool-use-usecase.ts +108 -2
  12. package/scripts/harness/agent-integration/domain/ports/config-query-port.ts +2 -0
  13. package/scripts/harness/agent-integration/domain/ports/phase-gate-query-port.ts +1 -1
  14. package/scripts/harness/agent-integration/domain/ports/story-reflection-query-port.ts +8 -0
  15. package/scripts/harness/agent-integration/domain/services/bash-write-target-extractor.ts +258 -0
  16. package/scripts/harness/agent-integration/domain/services/hook-to-cli-translator.ts +21 -4
  17. package/scripts/harness/agent-integration/domain/value-objects/protected-file-list.ts +20 -0
  18. package/scripts/harness/agent-integration/domain/value-objects/story-reflection-query-result.ts +63 -0
  19. package/scripts/harness/agent-integration/infrastructure/adapters/file-system-story-reflection-query-adapter.ts +122 -0
  20. package/scripts/harness/agent-integration/infrastructure/adapters/harness-config-config-query-adapter.ts +20 -0
  21. package/scripts/harness/agent-integration/infrastructure/adapters/phase-gate-query-adapter.ts +17 -3
  22. package/scripts/harness/agent-integration/presentation/pre-tool-use-hook.ts +29 -2
  23. package/scripts/harness/biome-ast-engine/domain/services/lint-runner.ts +24 -0
  24. package/scripts/harness/biome-ast-engine/domain/services/rule-definition-registry.ts +1 -1
  25. package/scripts/harness/biome-ast-engine/domain/value-objects/source-module-snapshot.ts +5 -2
  26. package/scripts/harness/biome-ast-engine/infrastructure/adapters/node-workspace-file-adapter.ts +1 -1
  27. package/scripts/harness/biome-ast-engine/infrastructure/adapters/typescript-source-module-analyzer-adapter.ts +1 -1
  28. package/scripts/harness/biome-ast-engine/infrastructure/parsers/unit-comment-parser.ts +12 -7
  29. package/scripts/harness/ci-governance/composition-root.ts +1 -0
  30. package/scripts/harness/config-foundation/application/mappers/phase-config-section-mapper.ts +44 -0
  31. package/scripts/harness/config-foundation/application/usecases/load-resolved-config-use-case.ts +20 -1
  32. package/scripts/harness/config-foundation/domain/harness-config.ts +2 -1
  33. package/scripts/harness/config-foundation/domain/value-objects/phase-dependencies-config.ts +18 -4
  34. package/scripts/harness/config-foundation/infrastructure/schemas/harness-config-v2.schema.json +185 -10
  35. package/scripts/harness/config-foundation/infrastructure/validators/ajv-config-schema-validator.ts +2 -1
  36. package/scripts/harness/harness-api/application/dto/command-dispatch-input.ts +1 -0
  37. package/scripts/harness/harness-api/application/dto/command-dispatch-output.ts +1 -0
  38. package/scripts/harness/harness-api/application/dto/exit-code-decision-input.ts +1 -0
  39. package/scripts/harness/harness-api/application/dto/exit-code-decision-output.ts +1 -0
  40. package/scripts/harness/harness-api/application/dto/harness-api-response-contract.ts +1 -0
  41. package/scripts/harness/harness-api/application/dto/initialize-registry-input.ts +1 -0
  42. package/scripts/harness/harness-api/application/dto/registry-summary-output.ts +1 -0
  43. package/scripts/harness/harness-api/application/dto/status-derivation-input.ts +1 -0
  44. package/scripts/harness/harness-api/application/mappers/harness-api-response-mapper.ts +1 -0
  45. package/scripts/harness/harness-api/application/usecases/decide-exit-code-usecase.ts +1 -0
  46. package/scripts/harness/harness-api/application/usecases/derive-harness-status-usecase.ts +1 -0
  47. package/scripts/harness/harness-api/application/usecases/dispatch-command-usecase.ts +1 -0
  48. package/scripts/harness/harness-api/application/usecases/initialize-command-registry-usecase.ts +1 -0
  49. package/scripts/harness/harness-api/composition-root.ts +1 -0
  50. package/scripts/harness/harness-api/domain/ports/artifact-scanner-port.ts +1 -0
  51. package/scripts/harness/harness-api/domain/ports/biome-lint-port.ts +1 -0
  52. package/scripts/harness/harness-api/domain/ports/config-query-port.ts +1 -0
  53. package/scripts/harness/harness-api/domain/ports/impact-analysis-port.ts +1 -0
  54. package/scripts/harness/harness-api/domain/ports/phase-gate-query-port.ts +1 -0
  55. package/scripts/harness/harness-api/domain/ports/validator-execution-port.ts +1 -0
  56. package/scripts/harness/harness-api/domain/services/command-dispatch-service.ts +1 -0
  57. package/scripts/harness/harness-api/domain/services/command-registry.ts +1 -0
  58. package/scripts/harness/harness-api/domain/services/status-derivation-service.ts +1 -0
  59. package/scripts/harness/harness-api/domain/value-objects/artifact-scan-result.ts +1 -0
  60. package/scripts/harness/harness-api/domain/value-objects/check-ready-result.ts +1 -0
  61. package/scripts/harness/harness-api/domain/value-objects/ci-check-result.ts +1 -0
  62. package/scripts/harness/harness-api/domain/value-objects/cli-command-definition.ts +1 -0
  63. package/scripts/harness/harness-api/domain/value-objects/command-input-spec.ts +1 -0
  64. package/scripts/harness/harness-api/domain/value-objects/drift-report-summary.ts +1 -0
  65. package/scripts/harness/harness-api/domain/value-objects/exit-code-spec.ts +1 -0
  66. package/scripts/harness/harness-api/domain/value-objects/harness-api-response.ts +1 -0
  67. package/scripts/harness/harness-api/domain/value-objects/harness-status-summary.ts +1 -0
  68. package/scripts/harness/harness-api/domain/value-objects/layer-health.ts +1 -0
  69. package/scripts/harness/harness-api/domain/value-objects/phase-info.ts +1 -0
  70. package/scripts/harness/harness-api/index.ts +1 -0
  71. package/scripts/harness/harness-api/infrastructure/adapters/biome-ast-engine-lint-adapter.ts +1 -0
  72. package/scripts/harness/harness-api/infrastructure/adapters/file-system-artifact-scanner-adapter.ts +1 -0
  73. package/scripts/harness/harness-api/infrastructure/adapters/harness-config-query-adapter.ts +1 -0
  74. package/scripts/harness/harness-api/infrastructure/adapters/nyquist-validation-impact-analysis-adapter.ts +1 -0
  75. package/scripts/harness/harness-api/infrastructure/adapters/phase-dependency-model-query-adapter.ts +1 -0
  76. package/scripts/harness/harness-api/infrastructure/adapters/validator-system-execution-adapter.ts +1 -0
  77. package/scripts/harness/harness-api/presentation/dto/cli-output-options.ts +1 -0
  78. package/scripts/harness/harness-api/presentation/formatters/harness-api-json-formatter.ts +1 -0
  79. package/scripts/harness/harness-api/presentation/handlers/check-phase-handler.ts +1 -0
  80. package/scripts/harness/harness-api/presentation/handlers/check-ready-handler.ts +1 -0
  81. package/scripts/harness/harness-api/presentation/handlers/ci-check-handler.ts +1 -0
  82. package/scripts/harness/harness-api/presentation/handlers/complete-check-handler.ts +1 -0
  83. package/scripts/harness/harness-api/presentation/handlers/detect-drift-handler.ts +1 -0
  84. package/scripts/harness/harness-api/presentation/handlers/impact-analysis-handler.ts +1 -0
  85. package/scripts/harness/harness-api/presentation/handlers/lint-handler.ts +1 -0
  86. package/scripts/harness/harness-api/presentation/handlers/status-handler.ts +1 -0
  87. package/scripts/harness/harness-error/infrastructure/adapters/legacy-error-reporter-adapter.ts +7 -1
  88. package/scripts/harness/integrations/pre-commit.ts +1 -0
  89. package/scripts/harness/main.ts +154 -34
  90. package/scripts/harness/phase-dependency-model/application/dto/resolve-gate-result-dto.ts +14 -0
  91. package/scripts/harness/phase-dependency-model/application/services/phase-gate-result-mapper.ts +20 -0
  92. package/scripts/harness/phase-dependency-model/application/usecases/check-story-reflection-usecase.ts +42 -0
  93. package/scripts/harness/phase-dependency-model/application/usecases/resolve-gate-usecase.ts +161 -0
  94. package/scripts/harness/phase-dependency-model/composition-root.ts +57 -1
  95. package/scripts/harness/phase-dependency-model/domain/definitions/{default-phase-dependencies.ts → full-phase-dependencies.ts} +3 -3
  96. package/scripts/harness/phase-dependency-model/domain/definitions/{default-phase-nodes.ts → full-phase-nodes.ts} +1 -1
  97. package/scripts/harness/phase-dependency-model/domain/definitions/full-story-reflection-defaults.ts +28 -0
  98. package/scripts/harness/phase-dependency-model/domain/definitions/minimal-phase-dependencies.ts +32 -0
  99. package/scripts/harness/phase-dependency-model/domain/definitions/minimal-phase-nodes.ts +50 -0
  100. package/scripts/harness/phase-dependency-model/domain/definitions/minimal-story-reflection-defaults.ts +8 -0
  101. package/scripts/harness/phase-dependency-model/domain/definitions/standard-phase-dependencies.ts +39 -0
  102. package/scripts/harness/phase-dependency-model/domain/definitions/standard-phase-nodes.ts +118 -0
  103. package/scripts/harness/phase-dependency-model/domain/definitions/standard-story-reflection-defaults.ts +23 -0
  104. package/scripts/harness/phase-dependency-model/domain/models/phase-structure.ts +95 -23
  105. package/scripts/harness/phase-dependency-model/domain/ports/glob-matcher-port.ts +8 -0
  106. package/scripts/harness/phase-dependency-model/domain/ports/phase-config-provider-port.ts +2 -0
  107. package/scripts/harness/phase-dependency-model/domain/ports/story-annotation-verifier-port.ts +14 -0
  108. package/scripts/harness/phase-dependency-model/domain/ports/story-reflection-file-system-port.ts +16 -0
  109. package/scripts/harness/phase-dependency-model/domain/services/gate-graph.ts +223 -0
  110. package/scripts/harness/phase-dependency-model/domain/services/story-reflection-checker.ts +66 -0
  111. package/scripts/harness/phase-dependency-model/domain/values/gate-definition.ts +127 -0
  112. package/scripts/harness/phase-dependency-model/domain/values/gate-name.ts +40 -0
  113. package/scripts/harness/phase-dependency-model/domain/values/gate-story-annotation.ts +39 -0
  114. package/scripts/harness/phase-dependency-model/domain/values/phase-customization-policy.ts +16 -4
  115. package/scripts/harness/phase-dependency-model/domain/values/story-reflection-config.ts +44 -0
  116. package/scripts/harness/phase-dependency-model/domain/values/story-reflection-mapping.ts +91 -0
  117. package/scripts/harness/phase-dependency-model/domain/values/story-reflection-result.ts +55 -0
  118. package/scripts/harness/phase-dependency-model/infrastructure/adapters/picomatch-glob-matcher.ts +17 -0
  119. package/scripts/harness/phase-dependency-model/infrastructure/adapters/story-annotation-verifier-adapter.ts +46 -0
  120. package/scripts/harness/phase-dependency-model/infrastructure/config/custom-gates-config-parser.ts +22 -0
  121. package/scripts/harness/phase-dependency-model/infrastructure/config/harness-config-phase-config-provider.ts +78 -2
  122. package/scripts/harness/phase-dependency-model/infrastructure/filesystem/file-system-story-reflection-adapter.ts +94 -0
  123. package/scripts/harness/phase-dependency-model/presentation/cli/check-phase-gate-command-handler.ts +12 -4
  124. package/scripts/harness/phase-dependency-model/presentation/cli/story-reflection-status-presenter.ts +87 -0
  125. package/scripts/harness/regression-suite/application/dto/analyze-migration-input.ts +1 -0
  126. package/scripts/harness/regression-suite/application/dto/analyze-migration-output.ts +1 -0
  127. package/scripts/harness/regression-suite/application/dto/configure-ci-gate-input.ts +1 -0
  128. package/scripts/harness/regression-suite/application/dto/configure-ci-gate-output.ts +1 -0
  129. package/scripts/harness/regression-suite/application/dto/migrate-v0-tests-input.ts +1 -0
  130. package/scripts/harness/regression-suite/application/dto/migrate-v0-tests-output.ts +1 -0
  131. package/scripts/harness/regression-suite/application/dto/run-regression-suite-input.ts +1 -0
  132. package/scripts/harness/regression-suite/application/dto/run-regression-suite-output.ts +1 -0
  133. package/scripts/harness/regression-suite/application/mappers/migration-mapping-mapper.ts +1 -0
  134. package/scripts/harness/regression-suite/application/mappers/test-execution-summary-mapper.ts +1 -0
  135. package/scripts/harness/regression-suite/application/usecases/analyze-v0-migration-usecase.ts +1 -0
  136. package/scripts/harness/regression-suite/application/usecases/configure-ci-gate-usecase.ts +1 -0
  137. package/scripts/harness/regression-suite/application/usecases/migrate-v0-tests-usecase.ts +1 -0
  138. package/scripts/harness/regression-suite/application/usecases/run-agent-independence-guard-usecase.ts +1 -0
  139. package/scripts/harness/regression-suite/application/usecases/run-gng-gate-regression-usecase.ts +1 -0
  140. package/scripts/harness/regression-suite/application/usecases/run-k-requirements-regression-usecase.ts +1 -0
  141. package/scripts/harness/regression-suite/application/usecases/run-k14-k15-regression-usecase.ts +1 -0
  142. package/scripts/harness/regression-suite/composition-root.ts +1 -0
  143. package/scripts/harness/regression-suite/domain/aggregates/v0-test-migration.ts +1 -0
  144. package/scripts/harness/regression-suite/domain/ports/ci-gate-result-writer-port.ts +1 -0
  145. package/scripts/harness/regression-suite/domain/ports/config-query-port.ts +1 -0
  146. package/scripts/harness/regression-suite/domain/ports/import-analyzer-port.ts +1 -0
  147. package/scripts/harness/regression-suite/domain/ports/migration-mapping-repository-port.ts +1 -0
  148. package/scripts/harness/regression-suite/domain/ports/suite-registry-port.ts +1 -0
  149. package/scripts/harness/regression-suite/domain/ports/test-runner-port.ts +1 -0
  150. package/scripts/harness/regression-suite/domain/ports/v0-spec-reader-port.ts +1 -0
  151. package/scripts/harness/regression-suite/domain/services/import-guard-service.ts +1 -0
  152. package/scripts/harness/regression-suite/domain/services/migration-analyzer.ts +1 -0
  153. package/scripts/harness/regression-suite/domain/services/regression-runner.ts +1 -0
  154. package/scripts/harness/regression-suite/domain/value-objects/agent-independence-test.ts +1 -0
  155. package/scripts/harness/regression-suite/domain/value-objects/biome-modification-spec.ts +1 -0
  156. package/scripts/harness/regression-suite/domain/value-objects/ci-gate-config.ts +1 -0
  157. package/scripts/harness/regression-suite/domain/value-objects/coverage-rate.ts +1 -0
  158. package/scripts/harness/regression-suite/domain/value-objects/gng-condition-test.ts +1 -0
  159. package/scripts/harness/regression-suite/domain/value-objects/import-violation.ts +1 -0
  160. package/scripts/harness/regression-suite/domain/value-objects/k-requirement-test.ts +1 -0
  161. package/scripts/harness/regression-suite/domain/value-objects/migration-mapping.ts +1 -0
  162. package/scripts/harness/regression-suite/domain/value-objects/regression-suite-definition.ts +1 -0
  163. package/scripts/harness/regression-suite/domain/value-objects/suite-id.ts +1 -0
  164. package/scripts/harness/regression-suite/domain/value-objects/test-execution-summary.ts +1 -0
  165. package/scripts/harness/regression-suite/domain/value-objects/test-failure-detail.ts +1 -0
  166. package/scripts/harness/regression-suite/domain/value-objects/v0-test-id.ts +1 -0
  167. package/scripts/harness/regression-suite/domain/value-objects/v1-test-path.ts +1 -0
  168. package/scripts/harness/regression-suite/infrastructure/adapters/biome-ast-import-analyzer-adapter.ts +1 -0
  169. package/scripts/harness/regression-suite/infrastructure/adapters/file-system-v0-spec-reader-adapter.ts +1 -0
  170. package/scripts/harness/regression-suite/infrastructure/adapters/harness-config-query-adapter.ts +1 -0
  171. package/scripts/harness/regression-suite/infrastructure/adapters/json-ci-gate-result-writer-adapter.ts +1 -0
  172. package/scripts/harness/regression-suite/infrastructure/adapters/markdown-migration-mapping-repository-adapter.ts +1 -0
  173. package/scripts/harness/regression-suite/infrastructure/adapters/static-suite-registry-adapter.ts +1 -0
  174. package/scripts/harness/regression-suite/infrastructure/adapters/vitest-test-runner-adapter.ts +1 -0
  175. package/scripts/harness/regression-suite/infrastructure/registry/agent-independence-suite-definition.ts +1 -0
  176. package/scripts/harness/regression-suite/infrastructure/registry/gng-gate-suite-definition.ts +1 -0
  177. package/scripts/harness/regression-suite/infrastructure/registry/k-requirements-suite-definition.ts +1 -0
  178. package/scripts/harness/regression-suite/infrastructure/registry/v0-migration-suite-definition.ts +1 -0
  179. package/scripts/harness/setup/skill-deployer.ts +82 -5
  180. package/scripts/harness/shared-kernel/harness-api.ts +1 -0
  181. package/scripts/harness/skill-quality/composition-root.ts +1 -0
  182. package/scripts/harness/skill-quality/infrastructure/adapters/ajv-lesson-artifact-schema-adapter.ts +5 -4
  183. package/scripts/harness/traceability-model/domain/services/metadata-validator.ts +12 -10
  184. package/scripts/harness/traceability-model/infrastructure/parsers/source-metadata-parser.ts +16 -2
  185. package/skills/cascade-updater/SKILL.md +16 -3
  186. package/skills/codebase-mapper/SKILL.md +9 -9
  187. package/skills/codex-delegator/SKILL.md +5 -56
  188. package/skills/consistency-checker/SKILL.md +5 -9
  189. package/skills/consistency-checker/references//343/203/201/343/202/247/343/203/203/343/202/257/343/203/252/343/202/271/343/203/210.md +6 -3
  190. package/skills/doc-freshness-checker/SKILL.md +6 -6
  191. package/skills/engineering-perspective/SKILL.md +2 -58
  192. package/skills/engineering-perspective/references/domain-model.md +4 -135
  193. package/skills/implementation-readiness-checker/SKILL.md +18 -72
  194. package/skills/it-test-designer/SKILL.md +25 -161
  195. package/skills/it-test-designer/references/it-test-design-template.md +131 -0
  196. package/skills/it-test-logic-designer/SKILL.md +13 -388
  197. package/skills/it-test-logic-designer/references/controller-test-patterns.md +100 -0
  198. package/skills/it-test-logic-designer/references/repository-test-patterns.md +206 -0
  199. package/skills/it-test-logic-designer/references/usecase-test-patterns.md +87 -0
  200. package/skills/pointer-validator/SKILL.md +4 -4
  201. package/skills/scenario-test-designer/SKILL.md +4 -68
  202. package/skills/scenario-test-designer/references/scenario-test-design-template.md +41 -0
  203. package/skills/scenario-test-designer/references/scenario-test-plan-template.md +35 -0
  204. package/skills/scenario-test-logic-designer/SKILL.md +21 -304
  205. package/skills/scenario-test-logic-designer/references/msw-patterns.md +36 -0
  206. package/skills/scenario-test-logic-designer/references/playwright-patterns.md +237 -0
  207. package/skills/test-coverage-checker/SKILL.md +39 -121
  208. package/skills/test-coverage-checker/references/coverage-report-template.md +99 -0
  209. package/skills/uiux-designer/SKILL.md +27 -92
  210. package/skills/uiux-designer/references/data-testid-convention.md +38 -0
  211. package/skills/uiux-designer/references/uiux-design-template.md +105 -0
  212. package/skills/unit-test-designer/SKILL.md +5 -106
  213. package/skills/unit-test-designer/references/unit-test-design-template.md +127 -0
  214. package/skills/unit-test-logic-designer/SKILL.md +28 -250
  215. package/skills/unit-test-logic-designer/references/test-patterns.md +207 -0
@@ -22,7 +22,7 @@ const createNode = (
22
22
  artifacts: artifacts.map((artifact) => Artifact.create(artifact)),
23
23
  });
24
24
 
25
- export const DEFAULT_PHASE_NODES: readonly PhaseNode[] = Object.freeze([
25
+ export const FULL_PHASE_NODES: readonly PhaseNode[] = Object.freeze([
26
26
  createNode(1, 'product-architect', [
27
27
  {
28
28
  name: 'product-overview-plan',
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @layer domain
3
+ * @unit phase-dependency-model
4
+ */
5
+
6
+ import { StoryReflectionConfig } from '../values/story-reflection-config.js';
7
+ import { StoryReflectionMapping } from '../values/story-reflection-mapping.js';
8
+
9
+ export const FULL_STORY_REFLECTION_DEFAULTS: StoryReflectionConfig = StoryReflectionConfig.create({
10
+ enabled: true,
11
+ mappings: [
12
+ StoryReflectionMapping.create({
13
+ inception: 'docs/inception/{unit}/{storyId}/logical_design.md',
14
+ product: 'docs/product/construction/{unit}/logical_design.md',
15
+ required: true,
16
+ }),
17
+ StoryReflectionMapping.create({
18
+ inception: 'docs/inception/{unit}/{storyId}/domain_model.md',
19
+ product: 'docs/product/construction/{unit}/domain_model.md',
20
+ required: true,
21
+ }),
22
+ StoryReflectionMapping.create({
23
+ inception: 'docs/inception/{unit}/{storyId}/uiux_design.md',
24
+ product: 'docs/product/construction/{unit}/uiux_design.md',
25
+ required: false,
26
+ }),
27
+ ],
28
+ });
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @layer domain
3
+ * @unit phase-dependency-model
4
+ */
5
+
6
+ import { MINIMAL_PHASE_NODES } from './minimal-phase-nodes.js';
7
+ import { PhaseDependency } from '../values/phase-dependency.js';
8
+ import { PhaseNode } from '../values/phase-node.js';
9
+
10
+ const nodeIndex = new Map<string, PhaseNode>(
11
+ MINIMAL_PHASE_NODES.map((node) => [node.nodeKey(), node]),
12
+ );
13
+
14
+ const getNode = (nodeKey: string): PhaseNode => {
15
+ const actual = nodeIndex.get(nodeKey);
16
+
17
+ if (!actual) {
18
+ throw new Error(`ノードが見つかりません: ${nodeKey}`);
19
+ }
20
+
21
+ return actual;
22
+ };
23
+
24
+ const createDependency = (
25
+ from: string,
26
+ to: string,
27
+ type: 'requires' | 'recommends' = 'requires',
28
+ ): PhaseDependency => PhaseDependency.create({ from: getNode(from), to: getNode(to), type });
29
+
30
+ export const MINIMAL_PHASE_DEPENDENCIES: readonly PhaseDependency[] = Object.freeze([
31
+ createDependency('1:product-architect', '2:logical-designer'),
32
+ ]);
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @layer domain
3
+ * @unit phase-dependency-model
4
+ */
5
+
6
+ import { Artifact } from '../values/artifact.js';
7
+ import { PhaseLevel } from '../values/phase-level.js';
8
+ import { PhaseNode } from '../values/phase-node.js';
9
+
10
+ const createNode = (
11
+ level: 1 | 2 | 3,
12
+ skillName: string,
13
+ artifacts: readonly {
14
+ readonly name: string;
15
+ readonly path: string;
16
+ readonly required: boolean;
17
+ }[],
18
+ ): PhaseNode =>
19
+ PhaseNode.create({
20
+ skillName,
21
+ level: PhaseLevel.create(level),
22
+ artifacts: artifacts.map((artifact) => Artifact.create(artifact)),
23
+ });
24
+
25
+ export const MINIMAL_PHASE_NODES: readonly PhaseNode[] = Object.freeze([
26
+ createNode(1, 'product-architect', [
27
+ {
28
+ name: 'product-overview-plan',
29
+ path: 'docs/inception/_shared/product_overview_plan.md',
30
+ required: true,
31
+ },
32
+ {
33
+ name: 'product-overview',
34
+ path: 'docs/product/product_overview.md',
35
+ required: true,
36
+ },
37
+ ]),
38
+ createNode(2, 'logical-designer', [
39
+ {
40
+ name: 'logical-design-plan',
41
+ path: 'docs/inception/{unit}/logical_design_plan.md',
42
+ required: true,
43
+ },
44
+ {
45
+ name: 'logical-design',
46
+ path: 'docs/product/construction/{unit}/logical_design.md',
47
+ required: true,
48
+ },
49
+ ]),
50
+ ]);
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @layer domain
3
+ * @unit phase-dependency-model
4
+ */
5
+
6
+ import { StoryReflectionConfig } from '../values/story-reflection-config.js';
7
+
8
+ export const MINIMAL_STORY_REFLECTION_DEFAULTS: StoryReflectionConfig = StoryReflectionConfig.disabled();
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @layer domain
3
+ * @unit phase-dependency-model
4
+ */
5
+
6
+ import { STANDARD_PHASE_NODES } from './standard-phase-nodes.js';
7
+ import { PhaseDependency } from '../values/phase-dependency.js';
8
+ import { PhaseNode } from '../values/phase-node.js';
9
+
10
+ const nodeIndex = new Map<string, PhaseNode>(
11
+ STANDARD_PHASE_NODES.map((node) => [node.nodeKey(), node]),
12
+ );
13
+
14
+ const getNode = (nodeKey: string): PhaseNode => {
15
+ const actual = nodeIndex.get(nodeKey);
16
+
17
+ if (!actual) {
18
+ throw new Error(`ノードが見つかりません: ${nodeKey}`);
19
+ }
20
+
21
+ return actual;
22
+ };
23
+
24
+ const createDependency = (
25
+ from: string,
26
+ to: string,
27
+ type: 'requires' | 'recommends' = 'requires',
28
+ ): PhaseDependency => PhaseDependency.create({ from: getNode(from), to: getNode(to), type });
29
+
30
+ export const STANDARD_PHASE_DEPENDENCIES: readonly PhaseDependency[] = Object.freeze([
31
+ createDependency('1:product-architect', '1:story-writer'),
32
+ createDependency('1:story-writer', '2:domain-designer'),
33
+ createDependency('2:domain-designer', '2:logical-designer'),
34
+ createDependency('2:logical-designer', '3:logical-designer'),
35
+ createDependency('3:logical-designer', '3:scenario-test-designer'),
36
+ createDependency('3:scenario-test-designer', '3:scenario-test-logic-designer'),
37
+ createDependency('3:scenario-test-logic-designer', '3:implementation-readiness-checker'),
38
+ createDependency('3:implementation-readiness-checker', '3:story-implementor'),
39
+ ]);
@@ -0,0 +1,118 @@
1
+ /**
2
+ * @layer domain
3
+ * @unit phase-dependency-model
4
+ */
5
+
6
+ import { Artifact } from '../values/artifact.js';
7
+ import { PhaseLevel } from '../values/phase-level.js';
8
+ import { PhaseNode } from '../values/phase-node.js';
9
+
10
+ const createNode = (
11
+ level: 1 | 2 | 3,
12
+ skillName: string,
13
+ artifacts: readonly {
14
+ readonly name: string;
15
+ readonly path: string;
16
+ readonly required: boolean;
17
+ }[],
18
+ ): PhaseNode =>
19
+ PhaseNode.create({
20
+ skillName,
21
+ level: PhaseLevel.create(level),
22
+ artifacts: artifacts.map((artifact) => Artifact.create(artifact)),
23
+ });
24
+
25
+ export const STANDARD_PHASE_NODES: readonly PhaseNode[] = Object.freeze([
26
+ createNode(1, 'product-architect', [
27
+ {
28
+ name: 'product-overview-plan',
29
+ path: 'docs/inception/_shared/product_overview_plan.md',
30
+ required: true,
31
+ },
32
+ {
33
+ name: 'product-overview',
34
+ path: 'docs/product/product_overview.md',
35
+ required: true,
36
+ },
37
+ ]),
38
+ createNode(1, 'story-writer', [
39
+ {
40
+ name: 'story-writer-plan',
41
+ path: 'docs/inception/_shared/story_writer_plan.md',
42
+ required: true,
43
+ },
44
+ {
45
+ name: 'user-stories',
46
+ path: 'docs/product/user_stories.md',
47
+ required: true,
48
+ },
49
+ ]),
50
+ createNode(2, 'domain-designer', [
51
+ {
52
+ name: 'domain-model-plan',
53
+ path: 'docs/inception/{unit}/domain_model_plan.md',
54
+ required: true,
55
+ },
56
+ {
57
+ name: 'domain-model',
58
+ path: 'docs/product/construction/{unit}/domain_model.md',
59
+ required: true,
60
+ },
61
+ ]),
62
+ createNode(2, 'logical-designer', [
63
+ {
64
+ name: 'logical-design-plan',
65
+ path: 'docs/inception/{unit}/logical_design_plan.md',
66
+ required: true,
67
+ },
68
+ {
69
+ name: 'logical-design',
70
+ path: 'docs/product/construction/{unit}/logical_design.md',
71
+ required: true,
72
+ },
73
+ ]),
74
+ createNode(3, 'logical-designer', [
75
+ {
76
+ name: 'story-logical-design-plan',
77
+ path: 'docs/inception/{unit}/{storyId}/logical_design_plan.md',
78
+ required: false,
79
+ },
80
+ {
81
+ name: 'story-logical-design',
82
+ path: 'docs/inception/{unit}/{storyId}/logical_design.md',
83
+ required: false,
84
+ },
85
+ ]),
86
+ createNode(3, 'scenario-test-designer', [
87
+ {
88
+ name: 'scenario-test-plan',
89
+ path: 'docs/inception/{unit}/{storyId}/scenario_test_plan.md',
90
+ required: false,
91
+ },
92
+ {
93
+ name: 'scenario-test-design',
94
+ path: 'docs/inception/{unit}/{storyId}/scenario_test_design.md',
95
+ required: false,
96
+ },
97
+ ]),
98
+ createNode(3, 'scenario-test-logic-designer', [
99
+ {
100
+ name: 'scenario-test-logic-plan',
101
+ path: 'docs/inception/{unit}/{storyId}/scenario_test_logic_plan.md',
102
+ required: false,
103
+ },
104
+ {
105
+ name: 'scenario-test-logic',
106
+ path: 'docs/inception/{unit}/{storyId}/scenario_test_logic.md',
107
+ required: false,
108
+ },
109
+ ]),
110
+ createNode(3, 'implementation-readiness-checker', []),
111
+ createNode(3, 'story-implementor', [
112
+ {
113
+ name: 'tdd-implementation-plan',
114
+ path: 'docs/inception/{unit}/{storyId}/tdd_implementation_plan.md',
115
+ required: false,
116
+ },
117
+ ]),
118
+ ]);
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @layer domain
3
+ * @unit phase-dependency-model
4
+ */
5
+
6
+ import { StoryReflectionConfig } from '../values/story-reflection-config.js';
7
+ import { StoryReflectionMapping } from '../values/story-reflection-mapping.js';
8
+
9
+ export const STANDARD_STORY_REFLECTION_DEFAULTS: StoryReflectionConfig = StoryReflectionConfig.create({
10
+ enabled: true,
11
+ mappings: [
12
+ StoryReflectionMapping.create({
13
+ inception: 'docs/inception/{unit}/{storyId}/logical_design.md',
14
+ product: 'docs/product/construction/{unit}/logical_design.md',
15
+ required: true,
16
+ }),
17
+ StoryReflectionMapping.create({
18
+ inception: 'docs/inception/{unit}/{storyId}/domain_model.md',
19
+ product: 'docs/product/construction/{unit}/domain_model.md',
20
+ required: false,
21
+ }),
22
+ ],
23
+ });
@@ -3,9 +3,16 @@
3
3
  * @unit phase-dependency-model
4
4
  */
5
5
 
6
- import { DEFAULT_PHASE_DEPENDENCIES } from '../definitions/default-phase-dependencies.js';
7
- import { DEFAULT_PHASE_NODES } from '../definitions/default-phase-nodes.js';
6
+ import { FULL_PHASE_DEPENDENCIES } from '../definitions/full-phase-dependencies.js';
7
+ import { FULL_PHASE_NODES } from '../definitions/full-phase-nodes.js';
8
+ import { MINIMAL_PHASE_DEPENDENCIES } from '../definitions/minimal-phase-dependencies.js';
9
+ import { MINIMAL_PHASE_NODES } from '../definitions/minimal-phase-nodes.js';
10
+ import { STANDARD_PHASE_DEPENDENCIES } from '../definitions/standard-phase-dependencies.js';
11
+ import { STANDARD_PHASE_NODES } from '../definitions/standard-phase-nodes.js';
12
+ import { GateGraph } from '../services/gate-graph.js';
13
+ import { Artifact } from '../values/artifact.js';
8
14
  import { CustomRule, InvalidCustomRuleError } from '../values/custom-rule.js';
15
+ import { GateDefinition } from '../values/gate-definition.js';
9
16
  import { PhaseCustomizationPolicy } from '../values/phase-customization-policy.js';
10
17
  import { PhaseDependency } from '../values/phase-dependency.js';
11
18
  import { PhaseGateResult } from '../values/phase-gate-result.js';
@@ -115,6 +122,34 @@ const createAuditPayload = (
115
122
  });
116
123
  };
117
124
 
125
+ const resolvePresetDefinitions = (preset: string): {
126
+ nodes: readonly PhaseNode[];
127
+ dependencies: readonly PhaseDependency[];
128
+ } => {
129
+ switch (preset) {
130
+ case 'standard':
131
+ return { nodes: STANDARD_PHASE_NODES, dependencies: STANDARD_PHASE_DEPENDENCIES };
132
+ case 'minimal':
133
+ return { nodes: MINIMAL_PHASE_NODES, dependencies: MINIMAL_PHASE_DEPENDENCIES };
134
+ case 'full':
135
+ case 'custom':
136
+ default:
137
+ return { nodes: FULL_PHASE_NODES, dependencies: FULL_PHASE_DEPENDENCIES };
138
+ }
139
+ };
140
+
141
+ const buildNonRelaxableDependencies = (
142
+ dependencies: readonly PhaseDependency[],
143
+ ): readonly PhaseDependency[] =>
144
+ Object.freeze(
145
+ dependencies.filter(
146
+ (dependency) =>
147
+ dependency.isLevelTransition() ||
148
+ dependency.to.nodeKey() === '3:implementation-readiness-checker' ||
149
+ dependency.to.nodeKey() === '3:story-implementor',
150
+ ),
151
+ );
152
+
118
153
  export class PhaseStructure {
119
154
  readonly levels: ReadonlyMap<1 | 2 | 3, readonly PhaseNode[]>;
120
155
  readonly nodeIndex: ReadonlyMap<string, PhaseNode>;
@@ -140,30 +175,43 @@ export class PhaseStructure {
140
175
  }
141
176
 
142
177
  static createDefault(policy: PhaseCustomizationPolicy): PhaseStructure {
143
- const levels = buildLevels(DEFAULT_PHASE_NODES);
144
- const nodeIndex = buildNodeIndex(DEFAULT_PHASE_NODES);
145
- const nonRelaxableDependencies = Object.freeze(
146
- DEFAULT_PHASE_DEPENDENCIES.filter(
147
- (dependency) =>
148
- dependency.isLevelTransition() ||
149
- dependency.to.nodeKey() === '3:implementation-readiness-checker' ||
150
- dependency.to.nodeKey() === '3:story-implementor',
178
+ const { nodes, dependencies } = resolvePresetDefinitions(policy.preset);
179
+
180
+ return PhaseStructure.createFromNodesAndDependencies(nodes, dependencies, policy);
181
+ }
182
+
183
+ static fromGates(gates: GateDefinition[], policy: PhaseCustomizationPolicy): PhaseStructure {
184
+ GateGraph.build(gates);
185
+
186
+ const nodes = gates.map((gate) =>
187
+ PhaseNode.create({
188
+ skillName: gate.name.value,
189
+ level: gate.level,
190
+ artifacts: gate.requires.map((requirement, index) =>
191
+ Artifact.create({
192
+ name: `${gate.name.value}-${index + 1}`,
193
+ path: requirement.path,
194
+ required: requirement.required,
195
+ }),
196
+ ),
197
+ }),
198
+ );
199
+ const nodeByGateName = new Map<string, PhaseNode>(
200
+ gates.map((gate, index) => [gate.name.value, nodes[index]]),
201
+ );
202
+ const dependencies = Object.freeze(
203
+ gates.flatMap((gate) =>
204
+ gate.dependsOn.map((dependencyName) =>
205
+ PhaseDependency.create({
206
+ from: nodeByGateName.get(dependencyName.value) as PhaseNode,
207
+ to: nodeByGateName.get(gate.name.value) as PhaseNode,
208
+ type: 'requires',
209
+ }),
210
+ ),
151
211
  ),
152
212
  );
153
- const base = new PhaseStructure({
154
- levels,
155
- nodeIndex,
156
- defaultDependencies: DEFAULT_PHASE_DEPENDENCIES,
157
- effectiveDependencies: DEFAULT_PHASE_DEPENDENCIES,
158
- customizationPolicy: policy,
159
- nonRelaxableDependencies,
160
- });
161
213
 
162
- if (!policy.hasRules()) {
163
- return base;
164
- }
165
-
166
- return base.applyCustomization(policy);
214
+ return PhaseStructure.createFromNodesAndDependencies(nodes, dependencies, policy);
167
215
  }
168
216
 
169
217
  checkPhaseGate(
@@ -486,4 +534,28 @@ export class PhaseStructure {
486
534
  visit(nodeKey);
487
535
  }
488
536
  }
537
+
538
+ private static createFromNodesAndDependencies(
539
+ nodes: readonly PhaseNode[],
540
+ dependencies: readonly PhaseDependency[],
541
+ policy: PhaseCustomizationPolicy,
542
+ ): PhaseStructure {
543
+ const levels = buildLevels(nodes);
544
+ const nodeIndex = buildNodeIndex(nodes);
545
+ const nonRelaxableDependencies = buildNonRelaxableDependencies(dependencies);
546
+ const base = new PhaseStructure({
547
+ levels,
548
+ nodeIndex,
549
+ defaultDependencies: dependencies,
550
+ effectiveDependencies: dependencies,
551
+ customizationPolicy: policy,
552
+ nonRelaxableDependencies,
553
+ });
554
+
555
+ if (!policy.hasRules()) {
556
+ return base;
557
+ }
558
+
559
+ return base.applyCustomization(policy);
560
+ }
489
561
  }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @layer domain
3
+ * @unit phase-dependency-model
4
+ */
5
+
6
+ export interface GlobMatcherPort {
7
+ match(pattern: string, path: string): boolean;
8
+ }
@@ -5,9 +5,11 @@
5
5
 
6
6
  import type { PhaseCustomizationPolicy } from '../values/phase-customization-policy.js';
7
7
  import type { PlanningMode } from '../values/planning-mode.js';
8
+ import type { StoryReflectionConfig } from '../values/story-reflection-config.js';
8
9
 
9
10
  export interface PhaseConfigProviderPort {
10
11
  getPlanningMode(scope: { unitId?: string; storyId?: string }): Promise<PlanningMode>;
11
12
  getCustomizationPolicy(): Promise<PhaseCustomizationPolicy>;
12
13
  getReportingOutputDir(): Promise<string>;
14
+ getStoryReflectionConfig(): Promise<StoryReflectionConfig>;
13
15
  }
@@ -0,0 +1,14 @@
1
+ // @unit phase-dependency-model
2
+ // @layer domain
3
+
4
+ export interface StoryAnnotationVerificationResult {
5
+ readonly hasAnnotation: boolean;
6
+ readonly storyId?: string;
7
+ }
8
+
9
+ export interface StoryAnnotationVerifierPort {
10
+ verify(
11
+ targetFilePath: string,
12
+ tag: string,
13
+ ): Promise<StoryAnnotationVerificationResult>;
14
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @layer domain
3
+ * @unit phase-dependency-model
4
+ */
5
+
6
+ export interface StoryReflectionFileSystemPort {
7
+ /** inception/{unit}/ 配下の storyId ディレクトリ名一覧を返す */
8
+ listStoryDirectories(unitId: string): Promise<readonly string[]>;
9
+ /** ファイルの存在チェック */
10
+ fileExists(path: string): Promise<boolean>;
11
+ /** product 文書内に @story-id {storyId} アノテーションが含まれているか */
12
+ fileContainsStoryAnnotation(
13
+ productPath: string,
14
+ storyId: string,
15
+ ): Promise<boolean>;
16
+ }