phasegate 0.15.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 (229) hide show
  1. package/README.ja.md +103 -71
  2. package/README.md +73 -13
  3. package/bin/{harness → phasegate} +1 -1
  4. package/docs/ADR/ADR-013-story-reflection-gate.md +100 -0
  5. package/docs/guide/cli-reference.md +9 -9
  6. package/docs/guide/configuration.md +245 -8
  7. package/docs/guide/hooks-integration.md +1 -1
  8. package/docs/guide/installation.md +6 -6
  9. package/docs/guide/layer-model.md +5 -5
  10. package/docs/guide/skills-overview.md +1 -1
  11. package/package.json +12 -10
  12. package/scripts/harness/adr-foundation/domain/ports/adr-document-parser-port.ts +1 -0
  13. package/scripts/harness/adr-foundation/domain/ports/adr-frontmatter-parser-port.ts +1 -0
  14. package/scripts/harness/adr-foundation/domain/ports/adr-repository-port.ts +1 -0
  15. package/scripts/harness/adr-foundation/domain/value-objects/adr-status.ts +6 -6
  16. package/scripts/harness/agent-integration/application/dto/handle-pre-tool-use-dto.ts +3 -1
  17. package/scripts/harness/agent-integration/application/usecases/handle-pre-tool-use-usecase.ts +109 -3
  18. package/scripts/harness/agent-integration/application/usecases/handle-stop-usecase.ts +1 -1
  19. package/scripts/harness/agent-integration/domain/ports/config-query-port.ts +2 -0
  20. package/scripts/harness/agent-integration/domain/ports/phase-gate-query-port.ts +1 -1
  21. package/scripts/harness/agent-integration/domain/ports/story-reflection-query-port.ts +8 -0
  22. package/scripts/harness/agent-integration/domain/services/bash-write-target-extractor.ts +258 -0
  23. package/scripts/harness/agent-integration/domain/services/hook-to-cli-translator.ts +25 -8
  24. package/scripts/harness/agent-integration/domain/value-objects/protected-file-list.ts +20 -0
  25. package/scripts/harness/agent-integration/domain/value-objects/story-reflection-query-result.ts +63 -0
  26. package/scripts/harness/agent-integration/infrastructure/adapters/child-process-cli-executor-adapter.ts +2 -2
  27. package/scripts/harness/agent-integration/infrastructure/adapters/file-system-story-reflection-query-adapter.ts +122 -0
  28. package/scripts/harness/agent-integration/infrastructure/adapters/harness-api-cli-command-registry-adapter.ts +10 -10
  29. package/scripts/harness/agent-integration/infrastructure/adapters/harness-config-config-query-adapter.ts +20 -0
  30. package/scripts/harness/agent-integration/infrastructure/adapters/phase-gate-query-adapter.ts +17 -3
  31. package/scripts/harness/agent-integration/presentation/pre-tool-use-hook.ts +29 -2
  32. package/scripts/harness/biome-ast-engine/domain/services/lint-runner.ts +24 -0
  33. package/scripts/harness/biome-ast-engine/domain/services/rule-definition-registry.ts +1 -1
  34. package/scripts/harness/biome-ast-engine/domain/value-objects/source-module-snapshot.ts +5 -2
  35. package/scripts/harness/biome-ast-engine/infrastructure/adapters/node-workspace-file-adapter.ts +1 -1
  36. package/scripts/harness/biome-ast-engine/infrastructure/adapters/typescript-source-module-analyzer-adapter.ts +1 -1
  37. package/scripts/harness/biome-ast-engine/infrastructure/parsers/unit-comment-parser.ts +12 -7
  38. package/scripts/harness/ci-governance/composition-root.ts +1 -0
  39. package/scripts/harness/ci-governance/infrastructure/adapters/agents-md-file-adapter.ts +2 -2
  40. package/scripts/harness/ci-governance/infrastructure/adapters/yaml-template-renderer-adapter.ts +2 -2
  41. package/scripts/harness/config-foundation/application/mappers/phase-config-section-mapper.ts +44 -0
  42. package/scripts/harness/config-foundation/application/usecases/load-resolved-config-use-case.ts +20 -1
  43. package/scripts/harness/config-foundation/domain/harness-config.ts +2 -1
  44. package/scripts/harness/config-foundation/domain/value-objects/phase-dependencies-config.ts +18 -4
  45. package/scripts/harness/config-foundation/infrastructure/schemas/harness-config-v2.schema.json +185 -10
  46. package/scripts/harness/config-foundation/infrastructure/validators/ajv-config-schema-validator.ts +2 -1
  47. package/scripts/harness/harness-api/application/dto/command-dispatch-input.ts +1 -0
  48. package/scripts/harness/harness-api/application/dto/command-dispatch-output.ts +1 -0
  49. package/scripts/harness/harness-api/application/dto/exit-code-decision-input.ts +1 -0
  50. package/scripts/harness/harness-api/application/dto/exit-code-decision-output.ts +1 -0
  51. package/scripts/harness/harness-api/application/dto/harness-api-response-contract.ts +1 -0
  52. package/scripts/harness/harness-api/application/dto/initialize-registry-input.ts +1 -0
  53. package/scripts/harness/harness-api/application/dto/registry-summary-output.ts +1 -0
  54. package/scripts/harness/harness-api/application/dto/status-derivation-input.ts +1 -0
  55. package/scripts/harness/harness-api/application/mappers/harness-api-response-mapper.ts +1 -0
  56. package/scripts/harness/harness-api/application/usecases/decide-exit-code-usecase.ts +4 -3
  57. package/scripts/harness/harness-api/application/usecases/derive-harness-status-usecase.ts +1 -0
  58. package/scripts/harness/harness-api/application/usecases/dispatch-command-usecase.ts +1 -0
  59. package/scripts/harness/harness-api/application/usecases/initialize-command-registry-usecase.ts +1 -0
  60. package/scripts/harness/harness-api/composition-root.ts +1 -0
  61. package/scripts/harness/harness-api/domain/ports/artifact-scanner-port.ts +1 -0
  62. package/scripts/harness/harness-api/domain/ports/biome-lint-port.ts +1 -0
  63. package/scripts/harness/harness-api/domain/ports/config-query-port.ts +1 -0
  64. package/scripts/harness/harness-api/domain/ports/impact-analysis-port.ts +1 -0
  65. package/scripts/harness/harness-api/domain/ports/phase-gate-query-port.ts +1 -0
  66. package/scripts/harness/harness-api/domain/ports/validator-execution-port.ts +1 -0
  67. package/scripts/harness/harness-api/domain/services/command-dispatch-service.ts +17 -16
  68. package/scripts/harness/harness-api/domain/services/command-registry.ts +4 -3
  69. package/scripts/harness/harness-api/domain/services/status-derivation-service.ts +1 -0
  70. package/scripts/harness/harness-api/domain/value-objects/artifact-scan-result.ts +1 -0
  71. package/scripts/harness/harness-api/domain/value-objects/check-ready-result.ts +1 -0
  72. package/scripts/harness/harness-api/domain/value-objects/ci-check-result.ts +1 -0
  73. package/scripts/harness/harness-api/domain/value-objects/cli-command-definition.ts +11 -10
  74. package/scripts/harness/harness-api/domain/value-objects/command-input-spec.ts +1 -0
  75. package/scripts/harness/harness-api/domain/value-objects/drift-report-summary.ts +1 -0
  76. package/scripts/harness/harness-api/domain/value-objects/exit-code-spec.ts +1 -0
  77. package/scripts/harness/harness-api/domain/value-objects/harness-api-response.ts +1 -0
  78. package/scripts/harness/harness-api/domain/value-objects/harness-status-summary.ts +1 -0
  79. package/scripts/harness/harness-api/domain/value-objects/layer-health.ts +1 -0
  80. package/scripts/harness/harness-api/domain/value-objects/phase-info.ts +1 -0
  81. package/scripts/harness/harness-api/index.ts +1 -0
  82. package/scripts/harness/harness-api/infrastructure/adapters/biome-ast-engine-lint-adapter.ts +1 -0
  83. package/scripts/harness/harness-api/infrastructure/adapters/file-system-artifact-scanner-adapter.ts +1 -0
  84. package/scripts/harness/harness-api/infrastructure/adapters/harness-config-query-adapter.ts +1 -0
  85. package/scripts/harness/harness-api/infrastructure/adapters/nyquist-validation-impact-analysis-adapter.ts +1 -0
  86. package/scripts/harness/harness-api/infrastructure/adapters/phase-dependency-model-query-adapter.ts +1 -0
  87. package/scripts/harness/harness-api/infrastructure/adapters/validator-system-execution-adapter.ts +1 -0
  88. package/scripts/harness/harness-api/presentation/dto/cli-output-options.ts +1 -0
  89. package/scripts/harness/harness-api/presentation/formatters/harness-api-json-formatter.ts +1 -0
  90. package/scripts/harness/harness-api/presentation/handlers/check-phase-handler.ts +2 -1
  91. package/scripts/harness/harness-api/presentation/handlers/check-ready-handler.ts +2 -1
  92. package/scripts/harness/harness-api/presentation/handlers/ci-check-handler.ts +2 -1
  93. package/scripts/harness/harness-api/presentation/handlers/complete-check-handler.ts +2 -1
  94. package/scripts/harness/harness-api/presentation/handlers/detect-drift-handler.ts +2 -1
  95. package/scripts/harness/harness-api/presentation/handlers/impact-analysis-handler.ts +2 -1
  96. package/scripts/harness/harness-api/presentation/handlers/lint-handler.ts +2 -1
  97. package/scripts/harness/harness-api/presentation/handlers/status-handler.ts +4 -3
  98. package/scripts/harness/harness-error/infrastructure/adapters/legacy-error-reporter-adapter.ts +7 -1
  99. package/scripts/harness/integrations/pre-commit.ts +1 -0
  100. package/scripts/harness/main.ts +173 -53
  101. package/scripts/harness/phase-dependency-model/application/dto/resolve-gate-result-dto.ts +14 -0
  102. package/scripts/harness/phase-dependency-model/application/services/phase-gate-result-mapper.ts +20 -0
  103. package/scripts/harness/phase-dependency-model/application/usecases/check-story-reflection-usecase.ts +42 -0
  104. package/scripts/harness/phase-dependency-model/application/usecases/resolve-gate-usecase.ts +161 -0
  105. package/scripts/harness/phase-dependency-model/composition-root.ts +57 -1
  106. package/scripts/harness/phase-dependency-model/domain/definitions/{default-phase-dependencies.ts → full-phase-dependencies.ts} +3 -3
  107. package/scripts/harness/phase-dependency-model/domain/definitions/{default-phase-nodes.ts → full-phase-nodes.ts} +1 -1
  108. package/scripts/harness/phase-dependency-model/domain/definitions/full-story-reflection-defaults.ts +28 -0
  109. package/scripts/harness/phase-dependency-model/domain/definitions/minimal-phase-dependencies.ts +32 -0
  110. package/scripts/harness/phase-dependency-model/domain/definitions/minimal-phase-nodes.ts +50 -0
  111. package/scripts/harness/phase-dependency-model/domain/definitions/minimal-story-reflection-defaults.ts +8 -0
  112. package/scripts/harness/phase-dependency-model/domain/definitions/standard-phase-dependencies.ts +39 -0
  113. package/scripts/harness/phase-dependency-model/domain/definitions/standard-phase-nodes.ts +118 -0
  114. package/scripts/harness/phase-dependency-model/domain/definitions/standard-story-reflection-defaults.ts +23 -0
  115. package/scripts/harness/phase-dependency-model/domain/models/phase-structure.ts +95 -23
  116. package/scripts/harness/phase-dependency-model/domain/ports/glob-matcher-port.ts +8 -0
  117. package/scripts/harness/phase-dependency-model/domain/ports/phase-config-provider-port.ts +2 -0
  118. package/scripts/harness/phase-dependency-model/domain/ports/story-annotation-verifier-port.ts +14 -0
  119. package/scripts/harness/phase-dependency-model/domain/ports/story-reflection-file-system-port.ts +16 -0
  120. package/scripts/harness/phase-dependency-model/domain/services/gate-graph.ts +223 -0
  121. package/scripts/harness/phase-dependency-model/domain/services/story-reflection-checker.ts +66 -0
  122. package/scripts/harness/phase-dependency-model/domain/values/gate-definition.ts +127 -0
  123. package/scripts/harness/phase-dependency-model/domain/values/gate-name.ts +40 -0
  124. package/scripts/harness/phase-dependency-model/domain/values/gate-story-annotation.ts +39 -0
  125. package/scripts/harness/phase-dependency-model/domain/values/phase-customization-policy.ts +16 -4
  126. package/scripts/harness/phase-dependency-model/domain/values/story-reflection-config.ts +44 -0
  127. package/scripts/harness/phase-dependency-model/domain/values/story-reflection-mapping.ts +91 -0
  128. package/scripts/harness/phase-dependency-model/domain/values/story-reflection-result.ts +55 -0
  129. package/scripts/harness/phase-dependency-model/infrastructure/adapters/picomatch-glob-matcher.ts +17 -0
  130. package/scripts/harness/phase-dependency-model/infrastructure/adapters/story-annotation-verifier-adapter.ts +46 -0
  131. package/scripts/harness/phase-dependency-model/infrastructure/config/custom-gates-config-parser.ts +22 -0
  132. package/scripts/harness/phase-dependency-model/infrastructure/config/harness-config-phase-config-provider.ts +78 -2
  133. package/scripts/harness/phase-dependency-model/infrastructure/filesystem/file-system-story-reflection-adapter.ts +94 -0
  134. package/scripts/harness/phase-dependency-model/presentation/cli/check-phase-gate-command-handler.ts +12 -4
  135. package/scripts/harness/phase-dependency-model/presentation/cli/story-reflection-status-presenter.ts +87 -0
  136. package/scripts/harness/quick-mode/application/usecases/execute-quick-ci-check-usecase.ts +1 -1
  137. package/scripts/harness/quick-mode/presentation/handlers/ci-check-quick-mode-handler.ts +1 -1
  138. package/scripts/harness/regression-suite/application/dto/analyze-migration-input.ts +1 -0
  139. package/scripts/harness/regression-suite/application/dto/analyze-migration-output.ts +1 -0
  140. package/scripts/harness/regression-suite/application/dto/configure-ci-gate-input.ts +1 -0
  141. package/scripts/harness/regression-suite/application/dto/configure-ci-gate-output.ts +1 -0
  142. package/scripts/harness/regression-suite/application/dto/migrate-v0-tests-input.ts +1 -0
  143. package/scripts/harness/regression-suite/application/dto/migrate-v0-tests-output.ts +1 -0
  144. package/scripts/harness/regression-suite/application/dto/run-regression-suite-input.ts +1 -0
  145. package/scripts/harness/regression-suite/application/dto/run-regression-suite-output.ts +1 -0
  146. package/scripts/harness/regression-suite/application/mappers/migration-mapping-mapper.ts +1 -0
  147. package/scripts/harness/regression-suite/application/mappers/test-execution-summary-mapper.ts +1 -0
  148. package/scripts/harness/regression-suite/application/usecases/analyze-v0-migration-usecase.ts +1 -0
  149. package/scripts/harness/regression-suite/application/usecases/configure-ci-gate-usecase.ts +1 -0
  150. package/scripts/harness/regression-suite/application/usecases/migrate-v0-tests-usecase.ts +1 -0
  151. package/scripts/harness/regression-suite/application/usecases/run-agent-independence-guard-usecase.ts +1 -0
  152. package/scripts/harness/regression-suite/application/usecases/run-gng-gate-regression-usecase.ts +1 -0
  153. package/scripts/harness/regression-suite/application/usecases/run-k-requirements-regression-usecase.ts +1 -0
  154. package/scripts/harness/regression-suite/application/usecases/run-k14-k15-regression-usecase.ts +1 -0
  155. package/scripts/harness/regression-suite/composition-root.ts +1 -0
  156. package/scripts/harness/regression-suite/domain/aggregates/v0-test-migration.ts +1 -0
  157. package/scripts/harness/regression-suite/domain/ports/ci-gate-result-writer-port.ts +1 -0
  158. package/scripts/harness/regression-suite/domain/ports/config-query-port.ts +1 -0
  159. package/scripts/harness/regression-suite/domain/ports/import-analyzer-port.ts +1 -0
  160. package/scripts/harness/regression-suite/domain/ports/migration-mapping-repository-port.ts +1 -0
  161. package/scripts/harness/regression-suite/domain/ports/suite-registry-port.ts +1 -0
  162. package/scripts/harness/regression-suite/domain/ports/test-runner-port.ts +1 -0
  163. package/scripts/harness/regression-suite/domain/ports/v0-spec-reader-port.ts +1 -0
  164. package/scripts/harness/regression-suite/domain/services/import-guard-service.ts +1 -0
  165. package/scripts/harness/regression-suite/domain/services/migration-analyzer.ts +1 -0
  166. package/scripts/harness/regression-suite/domain/services/regression-runner.ts +1 -0
  167. package/scripts/harness/regression-suite/domain/value-objects/agent-independence-test.ts +1 -0
  168. package/scripts/harness/regression-suite/domain/value-objects/biome-modification-spec.ts +1 -0
  169. package/scripts/harness/regression-suite/domain/value-objects/ci-gate-config.ts +1 -0
  170. package/scripts/harness/regression-suite/domain/value-objects/coverage-rate.ts +1 -0
  171. package/scripts/harness/regression-suite/domain/value-objects/gng-condition-test.ts +1 -0
  172. package/scripts/harness/regression-suite/domain/value-objects/import-violation.ts +1 -0
  173. package/scripts/harness/regression-suite/domain/value-objects/k-requirement-test.ts +1 -0
  174. package/scripts/harness/regression-suite/domain/value-objects/migration-mapping.ts +1 -0
  175. package/scripts/harness/regression-suite/domain/value-objects/regression-suite-definition.ts +1 -0
  176. package/scripts/harness/regression-suite/domain/value-objects/suite-id.ts +1 -0
  177. package/scripts/harness/regression-suite/domain/value-objects/test-execution-summary.ts +1 -0
  178. package/scripts/harness/regression-suite/domain/value-objects/test-failure-detail.ts +1 -0
  179. package/scripts/harness/regression-suite/domain/value-objects/v0-test-id.ts +1 -0
  180. package/scripts/harness/regression-suite/domain/value-objects/v1-test-path.ts +1 -0
  181. package/scripts/harness/regression-suite/infrastructure/adapters/biome-ast-import-analyzer-adapter.ts +1 -0
  182. package/scripts/harness/regression-suite/infrastructure/adapters/file-system-v0-spec-reader-adapter.ts +1 -0
  183. package/scripts/harness/regression-suite/infrastructure/adapters/harness-config-query-adapter.ts +1 -0
  184. package/scripts/harness/regression-suite/infrastructure/adapters/json-ci-gate-result-writer-adapter.ts +1 -0
  185. package/scripts/harness/regression-suite/infrastructure/adapters/markdown-migration-mapping-repository-adapter.ts +1 -0
  186. package/scripts/harness/regression-suite/infrastructure/adapters/static-suite-registry-adapter.ts +1 -0
  187. package/scripts/harness/regression-suite/infrastructure/adapters/vitest-test-runner-adapter.ts +1 -0
  188. package/scripts/harness/regression-suite/infrastructure/registry/agent-independence-suite-definition.ts +1 -0
  189. package/scripts/harness/regression-suite/infrastructure/registry/gng-gate-suite-definition.ts +1 -0
  190. package/scripts/harness/regression-suite/infrastructure/registry/k-requirements-suite-definition.ts +1 -0
  191. package/scripts/harness/regression-suite/infrastructure/registry/v0-migration-suite-definition.ts +1 -0
  192. package/scripts/harness/setup/skill-deployer.ts +82 -5
  193. package/scripts/harness/shared-kernel/harness-api.ts +1 -0
  194. package/scripts/harness/skill-quality/composition-root.ts +1 -0
  195. package/scripts/harness/skill-quality/infrastructure/adapters/ajv-lesson-artifact-schema-adapter.ts +5 -4
  196. package/scripts/harness/traceability-model/domain/services/metadata-validator.ts +12 -10
  197. package/scripts/harness/traceability-model/infrastructure/parsers/source-metadata-parser.ts +16 -2
  198. package/scripts/harness/validator-system/composition-root.ts +3 -3
  199. package/skills/cascade-updater/SKILL.md +16 -3
  200. package/skills/codebase-mapper/SKILL.md +9 -9
  201. package/skills/codex-delegator/SKILL.md +5 -56
  202. package/skills/consistency-checker/SKILL.md +5 -9
  203. 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
  204. package/skills/doc-freshness-checker/SKILL.md +6 -6
  205. package/skills/engineering-perspective/SKILL.md +2 -58
  206. package/skills/engineering-perspective/references/domain-model.md +4 -135
  207. package/skills/implementation-readiness-checker/SKILL.md +18 -72
  208. package/skills/it-test-designer/SKILL.md +25 -161
  209. package/skills/it-test-designer/references/it-test-design-template.md +131 -0
  210. package/skills/it-test-logic-designer/SKILL.md +13 -388
  211. package/skills/it-test-logic-designer/references/controller-test-patterns.md +100 -0
  212. package/skills/it-test-logic-designer/references/repository-test-patterns.md +206 -0
  213. package/skills/it-test-logic-designer/references/usecase-test-patterns.md +87 -0
  214. package/skills/pointer-validator/SKILL.md +4 -4
  215. package/skills/scenario-test-designer/SKILL.md +4 -68
  216. package/skills/scenario-test-designer/references/scenario-test-design-template.md +41 -0
  217. package/skills/scenario-test-designer/references/scenario-test-plan-template.md +35 -0
  218. package/skills/scenario-test-logic-designer/SKILL.md +21 -304
  219. package/skills/scenario-test-logic-designer/references/msw-patterns.md +36 -0
  220. package/skills/scenario-test-logic-designer/references/playwright-patterns.md +237 -0
  221. package/skills/test-coverage-checker/SKILL.md +39 -121
  222. package/skills/test-coverage-checker/references/coverage-report-template.md +99 -0
  223. package/skills/uiux-designer/SKILL.md +27 -92
  224. package/skills/uiux-designer/references/data-testid-convention.md +38 -0
  225. package/skills/uiux-designer/references/uiux-design-template.md +105 -0
  226. package/skills/unit-test-designer/SKILL.md +5 -106
  227. package/skills/unit-test-designer/references/unit-test-design-template.md +127 -0
  228. package/skills/unit-test-logic-designer/SKILL.md +28 -250
  229. package/skills/unit-test-logic-designer/references/test-patterns.md +207 -0
@@ -41,33 +41,26 @@ TDD実装フェーズ
41
41
 
42
42
  ---
43
43
 
44
- ## ⚠️ 上位レイヤー存在チェック
44
+ ## 上位レイヤー存在チェック
45
45
 
46
46
  **このスキルはテストケース設計完了後、TDD実装前に実行します。**
47
47
 
48
- ### 依存する上位設計文書
49
-
50
48
  | ファイル | 必須 | チェック方法 |
51
49
  |---------|------|------------|
52
- | `docs/inception/{unit}/{story_id}/scenario_test_design.md` | ✅ 必須 | シナリオテストケース設計の存在を確認 |
53
- | `docs/inception/{unit}/{story_id}/logical_design.md` | ✅ 必須 | 論理設計の存在を確認 |
54
- | `docs/product/construction/{unit}/coverage_report.md` | 📋 推奨 | カバレッジ検証済みか確認 |
55
-
56
- ### 上位設計が存在しない場合のアクション
50
+ | `docs/inception/{unit}/{story_id}/scenario_test_design.md` | 必須 | シナリオテストケース設計の存在を確認 |
51
+ | `docs/inception/{unit}/{story_id}/logical_design.md` | 必須 | 論理設計の存在を確認 |
52
+ | `docs/product/construction/{unit}/coverage_report.md` | 推奨 | カバレッジ検証済みか確認 |
57
53
 
58
54
  上位設計文書が存在しない場合、**ロジック設計を開始せず**、以下を行う:
59
55
 
60
56
  1. **状況報告** — ユーザーに不足している設計文書を明示
61
- 2. **選択肢提示** — 以下の選択肢を提示
62
- - 上位設計(scenario-test-designer)を先に実行する
63
- - 上位設計をスキップして進める(非推奨)
57
+ 2. **選択肢提示** — 上位設計(scenario-test-designer)を先に実行する / スキップして進める(非推奨)
64
58
  3. **ユーザー指示待ち** — 独自判断でロジック設計を開始しない
65
59
 
66
60
  ---
67
61
 
68
- ## ⚠️ 3フェーズ実行ルール
62
+ ## 3フェーズ実行ルール
69
63
 
70
- **このスキルは3フェーズで実行する。**
71
64
  - **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
72
65
  - **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`scripts/delegate-sonnet.sh` 経由)
73
66
  - **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
@@ -100,7 +93,7 @@ TDD実装フェーズ
100
93
  | `{story_id}-{feature}.spec.ts` | {シナリオ名} | X |
101
94
 
102
95
  ## 3. セレクタ戦略
103
- - data-testid命名規約
96
+ - data-testid命名規約(uiux-designerスキル準拠)
104
97
  - 既存コンポーネントの再利用
105
98
 
106
99
  ## 4. シードデータ設計
@@ -161,305 +154,29 @@ TDD実装フェーズ
161
154
 
162
155
  ### 出力ファイル
163
156
 
164
- | 種別 | 配置先 |
165
- |------|--------|
166
- | 成果物 | `docs/inception/{unit}/{story_id}/scenario_test_logic.md` |
157
+ `docs/inception/{unit}/{story_id}/scenario_test_logic.md`
167
158
 
168
159
  ### scenario_test_logic.md の構成
169
160
 
170
- ```markdown
171
- # シナリオテストロジック設計: {ストーリーID}
172
-
173
- ## 1. テストファイル構成
174
-
175
- | ファイルパス | シナリオ | ケース数 |
176
- |------------|---------|---------|
177
- | `e2e/tests/{context}/{story_id}-{feature}.spec.ts` | {シナリオ名} | X |
178
-
179
- ## 2. ヘルパー・シードデータ
180
-
181
- ### ヘルパーのインポート
182
-
183
- ```typescript
184
- import { test, expect } from '@playwright/test';
185
- import { loginAsUser } from '../../helpers/auth-helper';
186
- import { TEST_USERS } from '../../helpers/test-users';
187
- import { cleanup{Entity} } from '../../helpers/{context}-helper';
188
- ```
189
-
190
- ### シードデータ設計
191
-
192
- ```typescript
193
- // e2e/seeds/{context}/{seed-name}.ts
194
-
195
- export const {SEED_NAME}_SEED = {
196
- // シナリオ実行前に必要なデータ
197
- {entity}: {
198
- id: '{entity}-001',
199
- // ...
200
- },
201
- };
202
-
203
- export async function seed{SeedName}(): Promise<void> {
204
- // Supabase CLIまたはAPIでデータ投入
205
- }
206
-
207
- export async function cleanup{SeedName}(): Promise<void> {
208
- // クリーンアップ処理
209
- }
210
- ```
211
-
212
- ## 3. シナリオテスト詳細ロジック
213
-
214
- ### SC-001: {シナリオ名}
215
-
216
- #### ファイル: `{story_id}-{feature}.spec.ts`
217
-
218
- ```typescript
219
- import { test, expect } from '@playwright/test';
220
- import { loginAsUser } from '../../helpers/auth-helper';
221
- import { TEST_USERS } from '../../helpers/test-users';
222
- import { cleanup{Entity} } from '../../helpers/{context}-helper';
223
-
224
- /**
225
- * {ストーリーID}: {シナリオ概要}
226
- * {業務フローの説明}
227
- */
228
-
229
- test.describe('{ストーリーID}: {シナリオ名}', () => {
230
- let entityId: string | undefined;
231
-
232
- test.beforeEach(async ({ page }) => {
233
- // 認証済みユーザーでログイン
234
- await loginAsUser(page, TEST_USERS.{role}.email, TEST_USERS.{role}.password);
235
- });
236
-
237
- test.afterEach(async ({ page }) => {
238
- // クリーンアップ
239
- if (entityId) {
240
- await cleanup{Entity}(page, entityId);
241
- }
242
- });
243
-
244
- test('{テストケース名}', async ({ page }) => {
245
- try {
246
- // Step 1: {画面遷移または操作}
247
- await page.goto('/{path}');
248
- await page.waitForLoadState('networkidle');
249
-
250
- // Step 2: {操作}
251
- await page.click('[data-testid="{element-name}"]');
252
- await page.waitForURL('**/{expected-path}', { timeout: 10000 });
253
-
254
- // Step 3: {入力}
255
- await page.fill('[data-testid="{input-name}"]', '{入力値}');
256
- await page.click('[data-testid="{submit-button}"]');
257
-
258
- // Step 4: {結果確認}
259
- await expect(page.getByTestId('{result-element}')).toBeVisible();
260
- await expect(page.getByTestId('{result-element}')).toHaveText('{期待テキスト}');
261
-
262
- // URLからIDを取得(クリーンアップ用)
263
- const url = page.url();
264
- entityId = url.split('/').pop();
265
-
266
- // Step 5: {追加検証}
267
- await expect(page.getByTestId('{status}')).toHaveText('{期待ステータス}');
268
-
269
- } finally {
270
- // エラー時もクリーンアップ実行
271
- if (entityId) {
272
- await cleanup{Entity}(page, entityId);
273
- entityId = undefined;
274
- }
275
- }
276
- });
277
-
278
- test('{異常系テストケース名}', async ({ page }) => {
279
- // Step 1: {異常系操作}
280
- await page.goto('/{path}');
281
-
282
- // Step 2: {不正な入力}
283
- await page.fill('[data-testid="{input-name}"]', '{不正な値}');
284
- await page.click('[data-testid="{submit-button}"]');
285
-
286
- // Step 3: {エラー表示確認}
287
- await expect(page.getByTestId('{error-message}')).toBeVisible();
288
- await expect(page.getByTestId('{error-message}')).toContainText('{期待エラーメッセージ}');
289
- });
290
- });
291
- ```
292
-
293
- ### SC-002: {別シナリオ名}
294
-
295
- (同様の構造で記述)
296
-
297
- ## 4. セレクタ戦略
298
-
299
- ### data-testid命名規約
300
-
301
- | 要素タイプ | 命名パターン | 例 |
302
- |----------|------------|---|
303
- | ページコンテナ | `{page}-container` | `client-list-container` |
304
- | テーブル行 | `{entity}-row-{id}` | `client-row-001` |
305
- | ボタン | `{action}-{target}-button` | `submit-create-process-button` |
306
- | 入力フィールド | `{field}-input` | `process-label-input` |
307
- | ステータス表示 | `{entity}-{property}` | `process-status` |
308
- | エラーメッセージ | `{field}-error` | `amount-error` |
309
-
310
- ### ロケーター優先順位
311
-
312
- 1. `data-testid` — 最優先(テスト専用属性)
313
- 2. `role` — セマンティックなロケーター
314
- 3. `text` — 表示テキスト
315
- 4. `css/xpath` — 最終手段(避ける)
316
-
317
- ```typescript
318
- // 推奨
319
- await page.getByTestId('submit-button').click();
320
- await page.getByRole('button', { name: '保存' }).click();
321
-
322
- // 非推奨
323
- await page.click('button.primary'); // CSSセレクタ
324
- ```
325
-
326
- ## 5. 待機戦略
327
-
328
- ### ページ遷移待機
161
+ 成果物は以下のセクションで構成する。各セクションのコードテンプレート・パターン詳細は `references/` を参照。
329
162
 
330
- ```typescript
331
- // URLパターンで待機
332
- await page.waitForURL('**/processes/**', { timeout: 10000 });
333
-
334
- // ネットワーク安定待機
335
- await page.waitForLoadState('networkidle');
336
- ```
337
-
338
- ### 要素表示待機
339
-
340
- ```typescript
341
- // 要素の可視化待機
342
- await expect(page.getByTestId('result')).toBeVisible({ timeout: 5000 });
343
-
344
- // テキスト変化待機
345
- await expect(page.getByTestId('status')).toHaveText('完了', { timeout: 10000 });
346
- ```
347
-
348
- ### API応答待機
349
-
350
- ```typescript
351
- // 特定APIの応答を待機
352
- const responsePromise = page.waitForResponse('**/api/process');
353
- await page.click('[data-testid="submit-button"]');
354
- const response = await responsePromise;
355
- expect(response.ok()).toBe(true);
356
- ```
357
-
358
- ## 6. MSWモック設計(必要な場合)
359
-
360
- ```typescript
361
- // e2e/mocks/{context}/handlers.ts
362
- import { http, HttpResponse } from 'msw';
363
-
364
- export const {context}Handlers = [
365
- // 正常系モック
366
- http.get('/api/{endpoint}', () => {
367
- return HttpResponse.json({
368
- data: { /* モックデータ */ },
369
- });
370
- }),
371
-
372
- // エラー系モック
373
- http.post('/api/{endpoint}', () => {
374
- return HttpResponse.json(
375
- { error: { code: 'VALIDATION_ERROR', message: '...' } },
376
- { status: 400 }
377
- );
378
- }),
379
- ];
380
- ```
381
-
382
- ## 7. ヘルパー関数設計
383
-
384
- ```typescript
385
- // e2e/helpers/{context}-helper.ts
386
-
387
- /**
388
- * テスト用{Entity}のクリーンアップ
389
- */
390
- export async function cleanup{Entity}(page: Page, entityId: string): Promise<void> {
391
- // 管理画面経由でデータ削除
392
- // または直接APIコール
393
- }
394
-
395
- /**
396
- * テスト用{Entity}の作成
397
- */
398
- export async function create{Entity}(page: Page, data: {Entity}Data): Promise<string> {
399
- // UI操作またはAPIでエンティティ作成
400
- // 作成されたIDを返す
401
- }
402
- ```
403
-
404
- ## 8. テスト実行コマンド
405
-
406
- ```bash
407
- # 全シナリオテスト実行
408
- pnpm --filter e2e test
409
-
410
- # 特定ファイルのみ
411
- pnpm --filter e2e test -- {story_id}-{feature}.spec.ts
412
-
413
- # デバッグモード(ブラウザ表示)
414
- pnpm --filter e2e test -- --headed
415
-
416
- # UI モード
417
- pnpm --filter e2e test -- --ui
418
- ```
419
- ```
163
+ 1. **テストファイル構成** — ファイルパス・シナリオ・ケース数の一覧表
164
+ 2. **ヘルパー・シードデータ** — インポート定義とシードデータ設計(テンプレート: `references/playwright-patterns.md` セクション6, 7)
165
+ 3. **シナリオテスト詳細ロジック** — 各シナリオの疑似コード(テンプレート: `references/playwright-patterns.md` セクション5)
166
+ 4. **セレクタ戦略** — data-testid の命名規則は `uiux-designer` スキルを参照。ロケーター優先順位は `references/playwright-patterns.md` セクション1
167
+ 5. **待機戦略** — ページ遷移・要素表示・API応答(詳細: `references/playwright-patterns.md` セクション2)
168
+ 6. **MSWモック設計**(必要な場合) — 詳細: `references/msw-patterns.md`
169
+ 7. **ヘルパー関数設計** — テンプレート: `references/playwright-patterns.md` セクション7
170
+ 8. **テスト実行コマンド** — 実行方法一覧(`references/playwright-patterns.md` セクション8)
420
171
 
421
172
  ---
422
173
 
423
174
  ## 設計原則
424
175
 
425
- ### 1. ステップコメントの徹底
426
- ```typescript
427
- // Step 1: ダッシュボードからクライアント一覧へ遷移
428
- await page.goto('/dashboard');
429
-
430
- // Step 2: クライアントを選択
431
- await page.click('[data-testid="client-row-001"]');
432
-
433
- // Step 3: 結果を確認
434
- await expect(page.getByTestId('client-name')).toHaveText('テストクライアント');
435
- ```
436
-
437
- ### 2. try/finallyパターン
438
- ```typescript
439
- test('テスト', async ({ page }) => {
440
- let createdId: string | undefined;
441
- try {
442
- // テスト実行
443
- createdId = await createEntity(page);
444
- // ...
445
- } finally {
446
- // 必ずクリーンアップ
447
- if (createdId) await cleanupEntity(page, createdId);
448
- }
449
- });
450
- ```
451
-
452
- ### 3. 既存パターンの踏襲
453
- - `loginAsUser()` でログイン処理を共通化
454
- - `TEST_USERS` で認証情報を管理
455
- - ヘルパー関数でクリーンアップを共通化
456
-
457
- ### 4. 疑似コードの粒度
458
- - 実装エージェントが迷わないレベルの詳細さ
459
- - 具体的なセレクタ・URL・待機時間を記載
460
- - エッジケースのテストパターンを明示
461
-
462
- ---
176
+ 1. **ステップコメントの徹底** — 各テストステップに `// Step N: 操作内容` を付与(例: `references/playwright-patterns.md` セクション3)
177
+ 2. **try/finallyパターン** — クリーンアップを確実に実行(例: `references/playwright-patterns.md` セクション4)
178
+ 3. **既存パターンの踏襲** — `loginAsUser()` でログイン共通化、`TEST_USERS` で認証情報管理、ヘルパー関数でクリーンアップ共通化
179
+ 4. **疑似コードの粒度** — 実装エージェントが迷わないレベルの詳細さ。具体的なセレクタ・URL・待機時間を記載。エッジケースのテストパターンを明示
463
180
 
464
181
  ---
465
182
 
@@ -0,0 +1,36 @@
1
+ # MSW モックパターン集
2
+
3
+ scenario-test-logic-designer スキルで使用する MSW (Mock Service Worker) パターンのリファレンス。
4
+
5
+ ---
6
+
7
+ ## ハンドラー テンプレート
8
+
9
+ ```typescript
10
+ // e2e/mocks/{context}/handlers.ts
11
+ import { http, HttpResponse } from 'msw';
12
+
13
+ export const {context}Handlers = [
14
+ // 正常系モック
15
+ http.get('/api/{endpoint}', () => {
16
+ return HttpResponse.json({
17
+ data: { /* モックデータ */ },
18
+ });
19
+ }),
20
+
21
+ // エラー系モック
22
+ http.post('/api/{endpoint}', () => {
23
+ return HttpResponse.json(
24
+ { error: { code: 'VALIDATION_ERROR', message: '...' } },
25
+ { status: 400 }
26
+ );
27
+ }),
28
+ ];
29
+ ```
30
+
31
+ ## 設計時の考慮事項
32
+
33
+ - 正常系・異常系の両方のハンドラーを設計する
34
+ - レスポンス形態は実際のAPI仕様に合わせる
35
+ - テストシナリオごとに必要なモックを明示する
36
+ - モックデータはシードデータと整合性を保つ
@@ -0,0 +1,237 @@
1
+ # Playwright テストパターン集
2
+
3
+ scenario-test-logic-designer スキルで使用する Playwright テストパターンの詳細リファレンス。
4
+
5
+ ---
6
+
7
+ ## 1. セレクタ戦略
8
+
9
+ ### ロケーター優先順位
10
+
11
+ 1. `data-testid` — 最優先(テスト専用属性)
12
+ 2. `role` — セマンティックなロケーター
13
+ 3. `text` — 表示テキスト
14
+ 4. `css/xpath` — 最終手段(避ける)
15
+
16
+ ```typescript
17
+ // 推奨
18
+ await page.getByTestId('submit-button').click();
19
+ await page.getByRole('button', { name: '保存' }).click();
20
+
21
+ // 非推奨
22
+ await page.click('button.primary'); // CSSセレクタ
23
+ ```
24
+
25
+ > **data-testid の命名規則は `uiux-designer` スキルを参照。**
26
+
27
+ ---
28
+
29
+ ## 2. 待機戦略
30
+
31
+ ### ページ遷移待機
32
+
33
+ ```typescript
34
+ // URLパターンで待機
35
+ await page.waitForURL('**/processes/**', { timeout: 10000 });
36
+
37
+ // ネットワーク安定待機
38
+ await page.waitForLoadState('networkidle');
39
+ ```
40
+
41
+ ### 要素表示待機
42
+
43
+ ```typescript
44
+ // 要素の可視化待機
45
+ await expect(page.getByTestId('result')).toBeVisible({ timeout: 5000 });
46
+
47
+ // テキスト変化待機
48
+ await expect(page.getByTestId('status')).toHaveText('完了', { timeout: 10000 });
49
+ ```
50
+
51
+ ### API応答待機
52
+
53
+ ```typescript
54
+ // 特定APIの応答を待機
55
+ const responsePromise = page.waitForResponse('**/api/process');
56
+ await page.click('[data-testid="submit-button"]');
57
+ const response = await responsePromise;
58
+ expect(response.ok()).toBe(true);
59
+ ```
60
+
61
+ ---
62
+
63
+ ## 3. ステップコメントパターン
64
+
65
+ ```typescript
66
+ // Step 1: ダッシュボードからクライアント一覧へ遷移
67
+ await page.goto('/dashboard');
68
+
69
+ // Step 2: クライアントを選択
70
+ await page.click('[data-testid="client-row-001"]');
71
+
72
+ // Step 3: 結果を確認
73
+ await expect(page.getByTestId('client-name')).toHaveText('テストクライアント');
74
+ ```
75
+
76
+ ---
77
+
78
+ ## 4. try/finally クリーンアップパターン
79
+
80
+ ```typescript
81
+ test('テスト', async ({ page }) => {
82
+ let createdId: string | undefined;
83
+ try {
84
+ // テスト実行
85
+ createdId = await createEntity(page);
86
+ // ...
87
+ } finally {
88
+ // 必ずクリーンアップ
89
+ if (createdId) await cleanupEntity(page, createdId);
90
+ }
91
+ });
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 5. テストファイル テンプレート
97
+
98
+ ```typescript
99
+ import { test, expect } from '@playwright/test';
100
+ import { loginAsUser } from '../../helpers/auth-helper';
101
+ import { TEST_USERS } from '../../helpers/test-users';
102
+ import { cleanup{Entity} } from '../../helpers/{context}-helper';
103
+
104
+ /**
105
+ * {ストーリーID}: {シナリオ概要}
106
+ * {業務フローの説明}
107
+ */
108
+
109
+ test.describe('{ストーリーID}: {シナリオ名}', () => {
110
+ let entityId: string | undefined;
111
+
112
+ test.beforeEach(async ({ page }) => {
113
+ // 認証済みユーザーでログイン
114
+ await loginAsUser(page, TEST_USERS.{role}.email, TEST_USERS.{role}.password);
115
+ });
116
+
117
+ test.afterEach(async ({ page }) => {
118
+ // クリーンアップ
119
+ if (entityId) {
120
+ await cleanup{Entity}(page, entityId);
121
+ }
122
+ });
123
+
124
+ test('{テストケース名}', async ({ page }) => {
125
+ try {
126
+ // Step 1: {画面遷移または操作}
127
+ await page.goto('/{path}');
128
+ await page.waitForLoadState('networkidle');
129
+
130
+ // Step 2: {操作}
131
+ await page.click('[data-testid="{element-name}"]');
132
+ await page.waitForURL('**/{expected-path}', { timeout: 10000 });
133
+
134
+ // Step 3: {入力}
135
+ await page.fill('[data-testid="{input-name}"]', '{入力値}');
136
+ await page.click('[data-testid="{submit-button}"]');
137
+
138
+ // Step 4: {結果確認}
139
+ await expect(page.getByTestId('{result-element}')).toBeVisible();
140
+ await expect(page.getByTestId('{result-element}')).toHaveText('{期待テキスト}');
141
+
142
+ // URLからIDを取得(クリーンアップ用)
143
+ const url = page.url();
144
+ entityId = url.split('/').pop();
145
+
146
+ // Step 5: {追加検証}
147
+ await expect(page.getByTestId('{status}')).toHaveText('{期待ステータス}');
148
+
149
+ } finally {
150
+ // エラー時もクリーンアップ実行
151
+ if (entityId) {
152
+ await cleanup{Entity}(page, entityId);
153
+ entityId = undefined;
154
+ }
155
+ }
156
+ });
157
+
158
+ test('{異常系テストケース名}', async ({ page }) => {
159
+ // Step 1: {異常系操作}
160
+ await page.goto('/{path}');
161
+
162
+ // Step 2: {不正な入力}
163
+ await page.fill('[data-testid="{input-name}"]', '{不正な値}');
164
+ await page.click('[data-testid="{submit-button}"]');
165
+
166
+ // Step 3: {エラー表示確認}
167
+ await expect(page.getByTestId('{error-message}')).toBeVisible();
168
+ await expect(page.getByTestId('{error-message}')).toContainText('{期待エラーメッセージ}');
169
+ });
170
+ });
171
+ ```
172
+
173
+ ---
174
+
175
+ ## 6. シードデータ テンプレート
176
+
177
+ ```typescript
178
+ // e2e/seeds/{context}/{seed-name}.ts
179
+
180
+ export const {SEED_NAME}_SEED = {
181
+ // シナリオ実行前に必要なデータ
182
+ {entity}: {
183
+ id: '{entity}-001',
184
+ // ...
185
+ },
186
+ };
187
+
188
+ export async function seed{SeedName}(): Promise<void> {
189
+ // Supabase CLIまたはAPIでデータ投入
190
+ }
191
+
192
+ export async function cleanup{SeedName}(): Promise<void> {
193
+ // クリーンアップ処理
194
+ }
195
+ ```
196
+
197
+ ---
198
+
199
+ ## 7. ヘルパー関数 テンプレート
200
+
201
+ ```typescript
202
+ // e2e/helpers/{context}-helper.ts
203
+
204
+ /**
205
+ * テスト用{Entity}のクリーンアップ
206
+ */
207
+ export async function cleanup{Entity}(page: Page, entityId: string): Promise<void> {
208
+ // 管理画面経由でデータ削除
209
+ // または直接APIコール
210
+ }
211
+
212
+ /**
213
+ * テスト用{Entity}の作成
214
+ */
215
+ export async function create{Entity}(page: Page, data: {Entity}Data): Promise<string> {
216
+ // UI操作またはAPIでエンティティ作成
217
+ // 作成されたIDを返す
218
+ }
219
+ ```
220
+
221
+ ---
222
+
223
+ ## 8. テスト実行コマンド
224
+
225
+ ```bash
226
+ # 全シナリオテスト実行
227
+ pnpm --filter e2e test
228
+
229
+ # 特定ファイルのみ
230
+ pnpm --filter e2e test -- {story_id}-{feature}.spec.ts
231
+
232
+ # デバッグモード(ブラウザ表示)
233
+ pnpm --filter e2e test -- --headed
234
+
235
+ # UI モード
236
+ pnpm --filter e2e test -- --ui
237
+ ```