@polymorphism-tech/morph-spec 4.12.0 → 4.13.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 (314) hide show
  1. package/README.md +21 -29
  2. package/bin/morph-spec.js +41 -24
  3. package/bin/task-manager.js +962 -1341
  4. package/bin/validate.js +1 -1
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +10 -11
  7. package/docs/QUICKSTART.md +15 -15
  8. package/framework/CLAUDE.md +5 -2
  9. package/framework/agents/README.md +3 -4
  10. package/framework/agents/ai-agents/ai-system-architect.md +6 -10
  11. package/framework/agents/architecture/seo-growth-hacker.md +166 -326
  12. package/framework/agents/architecture/standards-architect.md +21 -31
  13. package/framework/agents/backend/dotnet-senior.md +160 -86
  14. package/framework/agents/backend/ef-modeler.md +2 -6
  15. package/framework/agents/backend/hangfire-orchestrator.md +8 -9
  16. package/framework/agents/backend/ms-agent-expert.md +1 -1
  17. package/framework/agents/frontend/nextjs-expert.md +198 -133
  18. package/framework/agents/frontend/ui-ux-designer.md +226 -267
  19. package/framework/agents/infrastructure/infra-architect.md +191 -27
  20. package/framework/agents/integrations/clerk-auth.md +19 -26
  21. package/framework/agents/integrations/hangfire-integration.md +1 -4
  22. package/framework/agents.json +215 -1453
  23. package/framework/commands/morph-apply.md +4 -4
  24. package/framework/commands/morph-preflight.md +4 -26
  25. package/framework/commands/morph-proposal.md +19 -19
  26. package/framework/commands/morph-status.md +2 -2
  27. package/framework/commands/morph-troubleshoot.md +6 -13
  28. package/framework/hooks/README.md +1 -6
  29. package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +4 -6
  30. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +12 -7
  31. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +2 -2
  32. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +2 -2
  33. package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +5 -10
  34. package/framework/hooks/claude-code/session-start/inject-morph-context.js +63 -30
  35. package/framework/hooks/claude-code/session-start/resume-context.js +77 -0
  36. package/framework/hooks/claude-code/statusline.py +4 -5
  37. package/framework/hooks/claude-code/stop/validate-completion.js +4 -4
  38. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +8 -8
  39. package/framework/hooks/shared/compact-restore.js +28 -5
  40. package/framework/hooks/shared/phase-utils.js +4 -8
  41. package/framework/hooks/shared/state-reader.js +34 -3
  42. package/framework/phases.json +7 -45
  43. package/framework/rules/ai-agents-standards.md +15 -0
  44. package/framework/rules/asaas-standards.md +13 -0
  45. package/framework/rules/clerk-standards.md +13 -0
  46. package/framework/rules/csharp-standards.md +8 -4
  47. package/framework/rules/data-standards.md +18 -0
  48. package/framework/rules/dotnet-templates.md +87 -0
  49. package/framework/rules/frontend-standards.md +13 -13
  50. package/framework/rules/hangfire-standards.md +13 -0
  51. package/framework/rules/infrastructure-standards.md +27 -16
  52. package/framework/rules/morph-workflow.md +73 -13
  53. package/framework/rules/nextjs-standards.md +1 -0
  54. package/framework/rules/nextjs-templates.md +40 -0
  55. package/framework/rules/resend-standards.md +12 -0
  56. package/framework/rules/supabase-standards.md +29 -0
  57. package/framework/skills/README.md +6 -8
  58. package/framework/skills/level-0-meta/mcp-registry.json +21 -99
  59. package/framework/{standards/ai-agents/team-orchestration.md → skills/level-0-meta/morph-agent-teams/SKILL.md} +472 -479
  60. package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +28 -1
  61. package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
  62. package/framework/skills/level-0-meta/morph-code-review/SKILL.md +1 -5
  63. package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +1 -1
  64. package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +23 -41
  65. package/framework/skills/level-0-meta/morph-init/SKILL.md +18 -14
  66. package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +225 -0
  67. package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +20 -0
  68. package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +4 -8
  69. package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +15 -59
  70. package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +7 -19
  71. package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +8 -8
  72. package/framework/skills/level-1-workflows/README.md +1 -1
  73. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +49 -50
  74. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +58 -124
  75. package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +5 -50
  76. package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +1 -1
  77. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +127 -159
  78. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -3
  79. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +2 -2
  80. package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +1 -1
  81. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +17 -13
  82. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +22 -40
  83. package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +0 -2
  84. package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +5 -5
  85. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +57 -77
  86. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
  87. package/framework/squad-templates/backend-only.json +6 -6
  88. package/framework/squad-templates/frontend-only.json +17 -8
  89. package/framework/squad-templates/full-stack.json +29 -24
  90. package/framework/standards/STANDARDS.json +1021 -2369
  91. package/framework/standards/backend/dotnet/fluent-validation-vsa.md +200 -0
  92. package/framework/standards/backend/dotnet/result-pattern.md +213 -0
  93. package/framework/standards/backend/dotnet/scalar-ui.md +172 -0
  94. package/framework/standards/backend/dotnet/scrutor.md +158 -0
  95. package/framework/standards/backend/dotnet/vsa-handler-patterns.md +274 -0
  96. package/framework/standards/frontend/nextjs/motion-patterns.md +1 -1
  97. package/framework/standards/infrastructure/supabase/mcp-setup.md +83 -193
  98. package/framework/standards/integration/mcp/mcp-tools.md +91 -77
  99. package/framework/templates/IDE-SNIPPETS.md +2 -6
  100. package/framework/templates/README.md +709 -814
  101. package/framework/templates/REGISTRY.json +223 -762
  102. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -0
  103. package/framework/templates/code/dotnet/abstractions/error.cs +60 -0
  104. package/framework/templates/code/dotnet/abstractions/handler.cs +12 -0
  105. package/framework/templates/code/dotnet/abstractions/result.cs +74 -0
  106. package/framework/templates/code/dotnet/backend/repository.cs +148 -141
  107. package/framework/templates/code/dotnet/constants/api-tags.cs +6 -0
  108. package/framework/templates/code/dotnet/exceptions/exception-handler.cs +32 -0
  109. package/framework/templates/code/dotnet/extensions/database-extensions.cs +20 -0
  110. package/framework/templates/code/dotnet/extensions/handler-registration.cs +38 -0
  111. package/framework/templates/code/dotnet/extensions/health-checks.cs +24 -0
  112. package/framework/templates/code/dotnet/extensions/map-endpoints.cs +35 -0
  113. package/framework/templates/code/dotnet/extensions/result-extensions.cs +29 -0
  114. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -0
  115. package/framework/templates/code/dotnet/feature/entity.cs.hbs +8 -0
  116. package/framework/templates/code/dotnet/feature/errors.cs.hbs +8 -0
  117. package/framework/templates/code/dotnet/feature/handler.cs.hbs +24 -0
  118. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -0
  119. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -0
  120. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -0
  121. package/framework/templates/code/dotnet/jobs/job.cs +21 -17
  122. package/framework/templates/code/dotnet/pipelines/logging-decorator.cs +31 -0
  123. package/framework/templates/code/dotnet/pipelines/validation-decorator.cs +97 -0
  124. package/framework/templates/code/dotnet/test.cs +192 -106
  125. package/framework/templates/context/ARCHITECTURE.md +89 -0
  126. package/framework/templates/context/CONTEXT-FEATURE.md +2 -2
  127. package/framework/templates/context/CONTEXT.md +180 -181
  128. package/framework/templates/context/design-system.md +1 -5
  129. package/framework/templates/docs/onboarding.md +2 -3
  130. package/framework/templates/docs/proposal.md +171 -182
  131. package/framework/templates/docs/spec.md +1 -3
  132. package/framework/templates/docs/ui-components.md +0 -72
  133. package/framework/templates/examples/design-system-examples.md +4 -4
  134. package/framework/templates/feature/decisions.md +0 -66
  135. package/framework/templates/feature/recap.md +1 -2
  136. package/framework/templates/infrastructure/github/README.md +56 -593
  137. package/framework/templates/integrations/clerk-config.cs +0 -41
  138. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  139. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -2
  140. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +83 -126
  141. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +2 -2
  142. package/framework/templates/project/validate.js +2 -4
  143. package/framework/templates/ui/design-system.css +1 -1
  144. package/framework/workflows/README.md +8 -8
  145. package/framework/workflows/configs/fast-track.json +51 -0
  146. package/framework/workflows/configs/full.json +68 -0
  147. package/framework/workflows/configs/standard.json +7 -3
  148. package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +1 -1
  149. package/framework/workflows/docs/enforcement-pipeline.md +18 -19
  150. package/framework/workflows/docs/full-morph.md +69 -76
  151. package/framework/workflows/docs/standard.md +49 -44
  152. package/framework/workflows/docs/ui-refresh.md +1 -1
  153. package/package.json +3 -3
  154. package/src/commands/agents/dispatch-agents.js +55 -116
  155. package/src/commands/context/context-refresh.js +79 -0
  156. package/src/commands/phase/phase-reset.js +1 -1
  157. package/src/commands/project/doctor.js +10 -32
  158. package/src/commands/project/init.js +12 -0
  159. package/src/commands/project/status.js +6 -12
  160. package/src/commands/scaffold/scaffold.js +131 -0
  161. package/src/commands/scope/escalate.js +1 -1
  162. package/src/commands/state/advance-phase.js +15 -29
  163. package/src/commands/state/state.js +20 -5
  164. package/src/commands/tasks/task.js +0 -30
  165. package/src/commands/validation/validate-feature.js +3 -10
  166. package/src/core/paths/output-schema.js +12 -13
  167. package/src/core/state/phase-state-machine.js +211 -217
  168. package/src/core/state/state-manager.js +9 -9
  169. package/src/lib/agents/agents-manager.js +2 -2
  170. package/src/lib/agents/output-collector.js +1 -2
  171. package/src/lib/detectors/design-system-detector.js +4 -4
  172. package/src/lib/detectors/index.js +1 -11
  173. package/src/lib/generators/architecture-scanner.js +640 -0
  174. package/src/lib/generators/context-generator.js +3 -3
  175. package/src/lib/generators/design-system-generator.js +508 -587
  176. package/src/lib/generators/index.js +12 -10
  177. package/src/lib/generators/metadata-extractor.js +386 -387
  178. package/src/lib/generators/recap-generator.js +4 -4
  179. package/src/lib/generators/scaffold-generator.js +317 -0
  180. package/src/lib/generators/settings-generator.js +0 -1
  181. package/src/lib/phase-chain/phase-validator.js +64 -42
  182. package/src/lib/stack/stack-profile.js +2 -2
  183. package/src/lib/standards/digest-builder.js +72 -285
  184. package/src/lib/tasks/task-parser.js +11 -5
  185. package/src/lib/validators/architecture/architecture-validator.js +259 -387
  186. package/src/lib/validators/content/content-validator.js +287 -287
  187. package/src/lib/validators/css/css-validator.js +340 -352
  188. package/src/lib/validators/packages/package-validator.js +347 -360
  189. package/src/lib/validators/shared/issue-counter.js +14 -18
  190. package/src/lib/validators/validation-runner.js +3 -19
  191. package/src/scripts/setup-infra.js +1 -1
  192. package/src/utils/agents-installer.js +24 -3
  193. package/src/utils/file-copier.js +1 -0
  194. package/src/utils/hooks-installer.js +11 -19
  195. package/src/utils/skills-installer.js +178 -178
  196. package/framework/agents/architecture/prompt-engineer.md +0 -195
  197. package/framework/agents/backend/api-designer.md +0 -106
  198. package/framework/agents/frontend/blazor-builder.md +0 -229
  199. package/framework/agents/frontend/nextjs-ui-specialist.md +0 -218
  200. package/framework/agents/infrastructure/azure-architect.md +0 -150
  201. package/framework/agents/infrastructure/azure-deploy-specialist.md +0 -707
  202. package/framework/agents/infrastructure/bicep-architect.md +0 -132
  203. package/framework/agents/infrastructure/container-specialist.md +0 -137
  204. package/framework/agents/infrastructure/devops-engineer.md +0 -126
  205. package/framework/agents/integrations/azure-identity.md +0 -148
  206. package/framework/agents/quality/code-analyzer.md +0 -239
  207. package/framework/agents/quality/testing-specialist.md +0 -130
  208. package/framework/hooks/claude-code/notification/approval-reminder.js +0 -57
  209. package/framework/hooks/claude-code/post-tool-use/context-refresh.js +0 -109
  210. package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +0 -78
  211. package/framework/index/troubleshooting-index.json +0 -184
  212. package/framework/rules/testing-standards.md +0 -14
  213. package/framework/skills/level-0-meta/morph-replicate/SKILL.md +0 -230
  214. package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +0 -70
  215. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +0 -256
  216. package/framework/skills/level-1-workflows/morph-phase-clarify/references/clarifications-example.md +0 -117
  217. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +0 -269
  218. package/framework/standards/ai-agents/blazor-ui.md +0 -364
  219. package/framework/standards/architecture/ddd/aggregates.md +0 -120
  220. package/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
  221. package/framework/standards/architecture/ddd/complexity-levels.md +0 -108
  222. package/framework/standards/architecture/ddd/entities.md +0 -99
  223. package/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
  224. package/framework/standards/architecture/ddd/value-objects.md +0 -124
  225. package/framework/standards/backend/api/minimal-api.md +0 -494
  226. package/framework/standards/backend/api/rest.md +0 -492
  227. package/framework/standards/backend/authentication/passkeys.md +0 -428
  228. package/framework/standards/backend/database/ef-core.md +0 -199
  229. package/framework/standards/backend/database/migrations.md +0 -393
  230. package/framework/standards/backend/database/repository-patterns.md +0 -528
  231. package/framework/standards/backend/dotnet/async.md +0 -366
  232. package/framework/standards/backend/dotnet/core.md +0 -117
  233. package/framework/standards/backend/dotnet/di.md +0 -439
  234. package/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
  235. package/framework/standards/context/analytics.md +0 -96
  236. package/framework/standards/context/bundles.md +0 -110
  237. package/framework/standards/context/priming.md +0 -78
  238. package/framework/standards/core/architecture.md +0 -185
  239. package/framework/standards/core/coding.md +0 -214
  240. package/framework/standards/core/git-branching-strategy.md +0 -403
  241. package/framework/standards/core/git.md +0 -185
  242. package/framework/standards/core/testing.md +0 -295
  243. package/framework/standards/data/nosql/blob-storage.md +0 -102
  244. package/framework/standards/data/vector-search/azure-ai-search.md +0 -121
  245. package/framework/standards/frontend/blazor/design-checklist.md +0 -222
  246. package/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  247. package/framework/standards/frontend/blazor/fluent-ui.md +0 -137
  248. package/framework/standards/frontend/blazor/html-conversion.md +0 -184
  249. package/framework/standards/frontend/blazor/lifecycle.md +0 -195
  250. package/framework/standards/frontend/blazor/pitfalls.md +0 -198
  251. package/framework/standards/frontend/blazor/state.md +0 -191
  252. package/framework/standards/frontend/design-system/aesthetic-direction.md +0 -266
  253. package/framework/standards/frontend/design-system/design-trends.md +0 -171
  254. package/framework/standards/infrastructure/azure/azure.md +0 -624
  255. package/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  256. package/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  257. package/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
  258. package/framework/standards/infrastructure/azure/services/functions.md +0 -486
  259. package/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
  260. package/framework/standards/infrastructure/azure/services/storage.md +0 -407
  261. package/framework/standards/infrastructure/vercel/vercel-database.md +0 -106
  262. package/framework/standards/integration/api/graphql.md +0 -91
  263. package/framework/standards/integration/api/grpc.md +0 -114
  264. package/framework/standards/integration/api/rest-design.md +0 -95
  265. package/framework/standards/integration/event-driven/cqrs.md +0 -101
  266. package/framework/standards/integration/event-driven/event-sourcing.md +0 -124
  267. package/framework/standards/integration/event-driven/service-bus.md +0 -95
  268. package/framework/standards/observability/logging.md +0 -131
  269. package/framework/standards/observability/metrics.md +0 -121
  270. package/framework/standards/observability/monitoring.md +0 -114
  271. package/framework/standards/observability/tracing.md +0 -132
  272. package/framework/standards/workflows/parallel-execution.md +0 -112
  273. package/framework/standards/workflows/thread-management.md +0 -113
  274. package/framework/templates/code/dotnet/backend/service.cs +0 -139
  275. package/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
  276. package/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
  277. package/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
  278. package/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
  279. package/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
  280. package/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
  281. package/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
  282. package/framework/templates/code/dotnet/frontend/component.razor +0 -239
  283. package/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
  284. package/framework/templates/infrastructure/azure/README.md +0 -286
  285. package/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
  286. package/framework/templates/infrastructure/azure/app-service.bicep +0 -164
  287. package/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
  288. package/framework/templates/infrastructure/azure/container-app.bicep +0 -156
  289. package/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
  290. package/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
  291. package/framework/templates/infrastructure/azure/deploy.sh +0 -208
  292. package/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
  293. package/framework/templates/infrastructure/azure/main.bicep +0 -189
  294. package/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
  295. package/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
  296. package/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
  297. package/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
  298. package/framework/templates/infrastructure/azure/storage.bicep +0 -106
  299. package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
  300. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
  301. package/framework/templates/integrations/azure-identity-config.cs +0 -288
  302. package/framework/templates/project-structure/dotnet-ddd.md +0 -70
  303. package/framework/templates/saas/subscription.cs +0 -347
  304. package/framework/templates/saas/tenant.cs +0 -338
  305. package/framework/templates/ui/FluentDesignTheme.cs +0 -149
  306. package/framework/templates/ui/MudTheme.cs +0 -281
  307. package/framework/workflows/configs/nodejs-cli.json +0 -40
  308. package/src/commands/standards/context-budget.js +0 -89
  309. package/src/lib/standards/index.js +0 -7
  310. package/src/lib/standards/standards-context-injector.js +0 -302
  311. package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +0 -316
  312. package/src/lib/validators/blazor/blazor-state-validator.js +0 -279
  313. package/src/lib/validators/blazor/blazor-validator.js +0 -369
  314. package/src/lib/validators/blazor/index.js +0 -9
@@ -57,9 +57,9 @@ Do NOT proceed until all phases are complete and all gates approved.
57
57
  Read all prerequisite files in a single parallel call — every file listed here matters for implementation quality:
58
58
 
59
59
  ```
60
- Read: .morph/features/$ARGUMENTS/1-design/spec.md (→ functional requirements, API contracts)
61
- + Read: .morph/features/$ARGUMENTS/1-design/contracts.cs (or contracts.ts / contracts-vsa.cs → C# interfaces)
62
- + Read: .morph/features/$ARGUMENTS/1-design/decisions.md (→ ADRs, architectural choices)
60
+ Read: .morph/features/$ARGUMENTS/2-design/spec.md (→ functional requirements, API contracts)
61
+ + Read: .morph/features/$ARGUMENTS/2-design/contracts.cs (or contracts.ts / contracts-vsa.cs → C# interfaces)
62
+ + Read: .morph/features/$ARGUMENTS/2-design/decisions.md (→ ADRs, architectural choices)
63
63
  + Read: .morph/features/$ARGUMENTS/3-plan/plan.md (→ TDD structure, execution strategy)
64
64
  + Read: .morph/features/$ARGUMENTS/4-tasks/tasks.md (→ task breakdown with T### IDs)
65
65
  + Read: .morph/config/config.json (→ architecture.style for VSA routing)
@@ -96,7 +96,7 @@ This shows which agents are active for implementation and how tasks can be group
96
96
  morph-spec dispatch-agents $ARGUMENTS implement
97
97
  ```
98
98
 
99
- The JSON output includes `shouldDispatch`, `agents[]`, and `taskGroups` for multi-agent coordination.
99
+ The JSON output includes `shouldDispatch`, `recommended` (agents by group), and `tasks` (task IDs by group) for multi-agent coordination.
100
100
 
101
101
  ---
102
102
 
@@ -117,27 +117,7 @@ docker build --check .
117
117
 
118
118
  ---
119
119
 
120
- ### 4. Blazor .NET 10 Assets
121
-
122
- **What it checks:**
123
- - `RequiresAspNetWebAssets` is `true` (if Blazor + .NET 10)
124
- - Static web assets configured correctly
125
-
126
- **How to check:**
127
- ```bash
128
- grep -r "RequiresAspNetWebAssets" *.csproj
129
- ```
130
-
131
- **Fix:**
132
- ```xml
133
- <PropertyGroup>
134
- <RequiresAspNetWebAssets>true</RequiresAspNetWebAssets>
135
- </PropertyGroup>
136
- ```
137
-
138
- ---
139
-
140
- ### 5. Bicep Syntax Validation
120
+ ### 4. Bicep Syntax Validation
141
121
 
142
122
  **What it checks:**
143
123
  - `.bicep` files without syntax errors
@@ -151,7 +131,7 @@ az bicep build --file infra/main.bicep --stdout > /dev/null
151
131
 
152
132
  ---
153
133
 
154
- ### 6. Key Vault Configuration
134
+ ### 5. Key Vault Configuration
155
135
 
156
136
  **What it checks:**
157
137
  - Key Vault URI configured in `appsettings.json` or environment
@@ -175,7 +155,7 @@ if (!builder.Environment.IsDevelopment())
175
155
 
176
156
  ---
177
157
 
178
- ### 7. Connection Strings Security
158
+ ### 6. Connection Strings Security
179
159
 
180
160
  **What it checks:**
181
161
  - Connection strings not hardcoded in code
@@ -199,14 +179,13 @@ grep -rE "(Password=|Pwd=|Secret=)" appsettings*.json | grep -v Development
199
179
  ✅ Packages: No version conflicts detected
200
180
  ✅ Migrations: No pending model changes
201
181
  ✅ Dockerfile: Valid multi-stage build
202
- ✅ Blazor Assets: RequiresAspNetWebAssets=true
203
182
  ✅ Bicep: Syntax valid
204
183
  ❌ Key Vault: URI not configured in appsettings.Production.json
205
184
  ⚠️ Connection Strings: Found password in appsettings.Staging.json
206
185
 
207
186
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
208
187
 
209
- 📋 Summary: 5 passed, 1 failed, 1 warning
188
+ 📋 Summary: 4 passed, 1 failed, 1 warning
210
189
 
211
190
  ❌ BLOCKED: Fix Key Vault configuration before deploy!
212
191
 
@@ -262,7 +241,6 @@ Recommended fixes:
262
241
 
263
242
  - [azure.md](../../standards/azure.md) - Azure Standards
264
243
  - [dotnet10-migration.md](../../standards/dotnet10-migration.md) - Breaking changes .NET 10
265
- - [blazor-efcore.md](../../../../framework/standards/blazor-efcore.md) - EF Core patterns
266
244
 
267
245
  ---
268
246
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: MORPH Spec Pipeline — creates or resumes feature planning through phases 0-6 with mandatory approval pauses. Use whenever the user wants to plan, spec, or design a new feature, or when they say /morph-proposal. This is the primary entry point for all MORPH-SPEC feature work.
2
+ description: MORPH Spec Pipeline — creates or resumes feature planning through phases 0-8 with mandatory approval pauses. Use whenever the user wants to plan, spec, or design a new feature, or when they say /morph-proposal. This is the primary entry point for all MORPH-SPEC feature work.
3
3
  argument-hint: <feature-name>
4
4
  allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion
5
5
  ---
@@ -65,7 +65,7 @@ Fill every section of the template. In particular:
65
65
  - **Risks**: table with likelihood, impact, mitigation
66
66
  - **Dependencies**: checklist of prerequisites
67
67
  - **Estimated Effort**: broken down by phase (in hours)
68
- - **Questions & Clarifications**: seed 3-6 questions for the clarify phase — these become input for phase 3
68
+ - **Questions & Clarifications**: seed 3-6 questions for the clarify phase — these become input for phase 4
69
69
 
70
70
  ### Step 5: Register state
71
71
 
@@ -83,15 +83,15 @@ morph-spec state mark-output {feature-name} proposal
83
83
  ```
84
84
  TaskCreate: "Phase 0: Proposal" → description: "Define feature scope and approach" → activeForm: "Proposal"
85
85
  TaskCreate: "Phase 1: Setup" → description: "Load context, detect agents, confirm stack" → activeForm: "Setup"
86
- TaskCreate: "Phase 2: Design" → description: "Schema analysis, spec, contracts, decisions" → activeForm: "Design"
87
- TaskCreate: "Phase 3: Clarify" → description: "Resolve ambiguities and edge cases" → activeForm: "Clarify"
88
- TaskCreate: "Phase 4: Plan" → description: "Implementation plan with TDD and file paths" → activeForm: "Plan"
89
- TaskCreate: "Phase 5: Tasks" → description: "Break spec into T001-T00N with dependencies" → activeForm: "Tasks"
86
+ TaskCreate: "Phase 3: Design" → description: "Schema analysis, spec, contracts, decisions" → activeForm: "Design"
87
+ TaskCreate: "Phase 4: Clarify" → description: "Resolve ambiguities and edge cases" → activeForm: "Clarify"
88
+ TaskCreate: "Phase 5: Plan" → description: "Implementation plan with TDD and file paths" → activeForm: "Plan"
89
+ TaskCreate: "Phase 6: Tasks" → description: "Break spec into T001-T00N with dependencies" → activeForm: "Tasks"
90
90
  ```
91
91
 
92
92
  If `ui-designer` is among the activated agents, also create:
93
93
  ```
94
- TaskCreate: "Phase 1.5: UI/UX" → description: "Design system, mockups, components, flows" → activeForm: "UI/UX"
94
+ TaskCreate: "Phase 2: UI/UX" → description: "Design system, mockups, components, flows" → activeForm: "UI/UX"
95
95
  ```
96
96
 
97
97
  Wire dependencies (addBlockedBy) matching the phase sequence:
@@ -135,13 +135,13 @@ Summary: load project context, confirm stack, list active agents, update state.
135
135
 
136
136
  ---
137
137
 
138
- ## 4. PHASE 1.5: UI/UX (conditional)
138
+ ## 4. PHASE 2: UI/UX (conditional)
139
139
 
140
140
  Check if `ui-designer` is in `activeAgents`:
141
141
  - **Yes:** Invoke the `morph-phase-uiux` skill. **MANDATORY PAUSE** after generating UI deliverables.
142
- - **No:** Skip to PHASE 2.
142
+ - **No:** Skip to PHASE 3.
143
143
 
144
- > **Task lifecycle:** `TaskUpdate` the "Phase 1: Setup" task → `completed`. `TaskUpdate` the "Phase 1.5: UI/UX" task → `in_progress` (if UI/UX), or the "Phase 2: Design" task → `in_progress` (if skipping UI/UX).
144
+ > **Task lifecycle:** `TaskUpdate` the "Phase 1: Setup" task → `completed`. `TaskUpdate` the "Phase 2: UI/UX" task → `in_progress` (if UI/UX), or the "Phase 3: Design" task → `in_progress` (if skipping UI/UX).
145
145
 
146
146
  After approval:
147
147
  ```bash
@@ -151,9 +151,9 @@ morph-spec phase advance {feature-name}
151
151
 
152
152
  ---
153
153
 
154
- ## 5. PHASE 2: DESIGN
154
+ ## 5. PHASE 3: DESIGN
155
155
 
156
- > **Task lifecycle:** `TaskUpdate` the completing phase task (UI/UX or Setup) → `completed`. `TaskUpdate` the "Phase 2: Design" task → `in_progress`.
156
+ > **Task lifecycle:** `TaskUpdate` the completing phase task (UI/UX or Setup) → `completed`. `TaskUpdate` the "Phase 3: Design" task → `in_progress`.
157
157
 
158
158
  Invoke the `morph-phase-design` skill.
159
159
 
@@ -171,9 +171,9 @@ morph-spec phase advance {feature-name}
171
171
 
172
172
  ---
173
173
 
174
- ## 6. PHASE 3: CLARIFY (interactive)
174
+ ## 6. PHASE 4: CLARIFY (interactive)
175
175
 
176
- > **Task lifecycle:** `TaskUpdate` the "Phase 2: Design" task → `completed`. `TaskUpdate` the "Phase 3: Clarify" task → `in_progress`.
176
+ > **Task lifecycle:** `TaskUpdate` the "Phase 3: Design" task → `completed`. `TaskUpdate` the "Phase 4: Clarify" task → `in_progress`.
177
177
 
178
178
  Invoke the `morph-phase-clarify` skill.
179
179
 
@@ -183,9 +183,9 @@ Summary: identify ambiguities in spec.md, generate 3-7 targeted questions (build
183
183
 
184
184
  ---
185
185
 
186
- ## 7. PHASE 4: PLAN
186
+ ## 7. PHASE 5: PLAN
187
187
 
188
- > **Task lifecycle:** `TaskUpdate` the "Phase 3: Clarify" task → `completed`. `TaskUpdate` the "Phase 4: Plan" task → `in_progress`.
188
+ > **Task lifecycle:** `TaskUpdate` the "Phase 4: Clarify" task → `completed`. `TaskUpdate` the "Phase 5: Plan" task → `in_progress`.
189
189
 
190
190
  Invoke the `morph-phase-plan` skill.
191
191
 
@@ -203,9 +203,9 @@ morph-spec phase advance {feature-name}
203
203
 
204
204
  ---
205
205
 
206
- ## 8. PHASE 5: TASKS
206
+ ## 8. PHASE 6: TASKS
207
207
 
208
- > **Task lifecycle:** `TaskUpdate` the "Phase 4: Plan" task → `completed`. `TaskUpdate` the "Phase 5: Tasks" task → `in_progress`.
208
+ > **Task lifecycle:** `TaskUpdate` the "Phase 5: Plan" task → `completed`. `TaskUpdate` the "Phase 6: Tasks" task → `in_progress`.
209
209
 
210
210
  Invoke the `morph-phase-tasks` skill.
211
211
 
@@ -225,7 +225,7 @@ morph-spec phase advance {feature-name}
225
225
 
226
226
  ## 9. Planning Complete
227
227
 
228
- > **Task lifecycle:** `TaskUpdate` the "Phase 5: Tasks" task → `completed`.
228
+ > **Task lifecycle:** `TaskUpdate` the "Phase 6: Tasks" task → `completed`.
229
229
 
230
230
  After task approval:
231
231
 
@@ -58,13 +58,13 @@ The `morph-spec state list` command automatically generates a formatted dashboar
58
58
  ║ MORPH-SPEC PROJECT STATUS ║
59
59
  ╠════════════════════════════════════════════════════════════════╣
60
60
  ║ Project: {PROJECT_NAME} ║
61
- ║ Type: blazor-server ║
61
+ ║ Type: dotnet-nextjs ║
62
62
  ╠════════════════════════════════════════════════════════════════╣
63
63
  ║ FEATURES ║
64
64
  ╠════════════════════════════════════════════════════════════════╣
65
65
  ║ 📝 {feature-1} ║
66
66
  ║ Phase: implement │ Tasks: 5/12 ║
67
- ║ Agents: blazor-builder ef-modeler hangfire-orchestrator ║
67
+ ║ Agents: ef-modeler hangfire-orchestrator ║
68
68
  ╠════════════════════════════════════════════════════════════════╣
69
69
  ║ 📝 {feature-2} ║
70
70
  ║ Phase: design │ Tasks: 0/0 ║
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Find solutions for common .NET/Blazor/Azure development errors with root-cause analysis
2
+ description: Find solutions for common .NET/Next.js development errors with root-cause analysis
3
3
  argument-hint: "[error-message]"
4
4
  allowed-tools: Read, Bash, Glob, Grep
5
5
  ---
6
6
 
7
7
  # Troubleshoot - Find Solutions for Errors
8
8
 
9
- Find solutions for common .NET/Blazor/Azure development errors and problems.
9
+ Find solutions for common .NET/Next.js development errors and problems.
10
10
 
11
11
  ## Usage
12
12
 
@@ -17,11 +17,10 @@ Find solutions for common .NET/Blazor/Azure development errors and problems.
17
17
  ## Examples
18
18
 
19
19
  ```bash
20
- /morph-troubleshoot blazor.web.js 404
21
20
  /morph-troubleshoot DbContext second operation
22
- /morph-troubleshoot Azure.Identity NU1605
23
21
  /morph-troubleshoot Include returns empty
24
22
  /morph-troubleshoot PendingModelChanges
23
+ /morph-troubleshoot next/navigation error
25
24
  ```
26
25
 
27
26
  ## 3-Level Workflow
@@ -60,13 +59,11 @@ site:github.com/dotnet/aspnetcore {error}
60
59
  site:github.com/dotnet/efcore {error}
61
60
 
62
61
  # Stack Overflow
63
- site:stackoverflow.com [blazor] {error}
64
62
  site:stackoverflow.com [entity-framework-core] {error}
65
- site:stackoverflow.com [azure] {error}
63
+ site:stackoverflow.com [next.js] {error}
66
64
 
67
65
  # Microsoft Documentation
68
66
  site:learn.microsoft.com {error}
69
- site:learn.microsoft.com/azure {error}
70
67
  ```
71
68
 
72
69
  **WebSearch usage example:**
@@ -80,9 +77,8 @@ If the user asks about a SignalR error:
80
77
 
81
78
  | Category | Description |
82
79
  |-----------|-----------|
83
- | `blazor` | Blazor Server/WASM, components, lifecycle, rendering |
84
80
  | `efcore` | Entity Framework Core, DbContext, migrations, queries |
85
- | `azure` | Azure services, deploy, identity, Key Vault |
81
+ | `nextjs` | Next.js App Router, pages, components, routing |
86
82
  | `auth` | Authentication, authorization, tokens, claims |
87
83
  | `deploy` | Deployment, CI/CD, pipelines, containers |
88
84
 
@@ -118,13 +114,10 @@ When finding a solution, present in the following format:
118
114
 
119
115
  | Error | Quick Fix |
120
116
  |------|----------------|
121
- | `blazor.web.js 404` | `<RequiresAspNetWebAssets>true</RequiresAspNetWebAssets>` |
122
117
  | `PendingModelChangesWarning` | `dotnet ef migrations add <Name>` before update |
123
118
  | `DbContext second operation` | Use `IDbContextFactory` for background tasks |
124
119
  | `Include()` empty | Use `HasMany(x => x.Nav)` instead of `HasMany<T>()` |
125
- | `Azure.Identity NU1605` | Specify explicit version in .csproj |
126
- | `Key Vault won't load` | Don't condition on environment (IsDevelopment) |
127
- | `DefaultAzureCredential slow` | Disable unused credentials |
120
+ | `next/navigation error` | Check App Router vs Pages Router usage |
128
121
 
129
122
  ---
130
123
 
@@ -15,14 +15,11 @@ framework/hooks/
15
15
  │ │ ├── protect-spec-files.js # Block edits to approved spec artifacts
16
16
  │ │ └── enforce-phase-writes.js # Enforce writes to correct phase dir
17
17
  │ ├── post-tool-use/
18
- │ │ ├── dispatch.js # Dispatch on CLI commands (auto-checkpoint)
19
- │ │ └── context-refresh.js # Auto-refresh context on structural git commits
18
+ │ │ └── dispatch.js # Dispatch on CLI commands (auto-checkpoint)
20
19
  │ ├── stop/
21
20
  │ │ └── validate-completion.js # Advisory: warn about incomplete work
22
21
  │ ├── pre-compact/
23
22
  │ │ └── save-morph-context.js # Snapshot state before compaction
24
- │ └── notification/
25
- │ └── approval-reminder.js # Remind about pending approvals
26
23
  ├── shared/ # Reusable utilities for all hooks
27
24
  │ ├── state-reader.js # Read-only state.json accessor
28
25
  │ ├── phase-utils.js # Phase constants and path utilities
@@ -51,11 +48,9 @@ framework/hooks/
51
48
  | **PreToolUse** (Write\|Edit) | enforce-phase-writes.js | Block | Ensures writes go to current phase directory |
52
49
  | **PreToolUse** (Bash) | _(prompt-type inline guard)_ | Block | Blocks `rm -rf .morph/` and direct state edits via Claude's reasoning |
53
50
  | **PostToolUse** (Bash) | dispatch.js | Dispatch | Triggers checkpoints on task completion |
54
- | **PostToolUse** (Bash) | context-refresh.js | Inject context | Detects `git commit` with structural changes → instructs Claude to update `.morph/context/README.md` and `.morph/config/config.json` |
55
51
  | **PostToolUseFailure** | handle-tool-failure.js | Logging | Appends structured JSON to .morph/logs/tool-failures.log |
56
52
  | **Stop** | validate-completion.js | Advisory | Warns about incomplete tasks/missing outputs/pending gates |
57
53
  | **PreCompact** | save-morph-context.js | Snapshot | Saves state to .morph/memory/ before compaction |
58
- | **Notification** | approval-reminder.js | Advisory | Reminds about pending approval gates |
59
54
 
60
55
  ## Design Principles
61
56
 
@@ -24,12 +24,11 @@ import { parseTaskDoneCommand } from '../../shared/dispatch-helpers.js';
24
24
 
25
25
  // Standard IDs referenced in remediation messages
26
26
  const STANDARD_REFS = {
27
- 'di': 'backend/dotnet/core.md#dependency-injection',
28
- 'async': 'backend/dotnet/async.md#cancellation-token-pattern',
29
- 'security': 'core/architecture.md#security-patterns',
30
- 'packages': 'backend/dotnet/program-cs-checklist.md#nuget-packages',
27
+ 'di': 'dependency injection best practices',
28
+ 'async': 'async/await and CancellationToken patterns',
29
+ 'security': 'security best practices',
30
+ 'packages': 'NuGet package compatibility',
31
31
  'design-system': 'frontend/design-system/naming.md#css-class-conventions',
32
- 'blazor': 'frontend/blazor/pitfalls.md#dbcontext-in-blazor',
33
32
  };
34
33
 
35
34
  try {
@@ -142,6 +141,5 @@ function getRefKey(ruleOrValidator) {
142
141
  if (lower.includes('security') || lower.includes('sql') || lower.includes('xss')) return 'security';
143
142
  if (lower.includes('package') || lower.includes('nuget')) return 'packages';
144
143
  if (lower.includes('design') || lower.includes('css') || lower.includes('naming')) return 'design-system';
145
- if (lower.includes('blazor') || lower.includes('dbcontext')) return 'blazor';
146
144
  return null;
147
145
  }
@@ -26,9 +26,9 @@ import { logHookActivity } from '../../shared/activity-logger.js';
26
26
  import { buildRichContext, DECISIONS_MAX_CHARS, MAX_PENDING_TASKS } from '../../shared/compact-restore.js';
27
27
 
28
28
  const PHASE_POSITIONS = {
29
- proposal: 1, setup: 1,
29
+ proposal: 1,
30
30
  uiux: 2, design: 2,
31
- clarify: 3,
31
+ plan: 3,
32
32
  tasks: 4,
33
33
  implement: 5, sync: 5,
34
34
  };
@@ -39,7 +39,7 @@ const NEXT_STEP_HINT = {
39
39
  design: (n) => `Approve design gate: morph-spec approve ${n} design`,
40
40
  uiux: (n) => `Approve UI gate: morph-spec approve ${n} uiux`,
41
41
  tasks: (n) => `Approve tasks gate: morph-spec approve ${n} tasks`,
42
- implement: (n) => `Continue implementation: morph-spec task next ${n}`,
42
+ implement: (n) => `Continue implementation: morph-spec task start ${n} <next-task-id>`,
43
43
  };
44
44
 
45
45
  try {
@@ -77,11 +77,16 @@ try {
77
77
  const { name: activeName, feature: activeFeature } = active;
78
78
  const activePhase = derivePhaseForFeature(activeName);
79
79
  let decisionsContent = '';
80
- const decisionsPath = join(cwd, `.morph/features/${activeName}/1-design/decisions.md`);
80
+ const decisionsPath = join(cwd, `.morph/features/${activeName}/2-design/decisions.md`);
81
81
  if (existsSync(decisionsPath)) {
82
82
  try { decisionsContent = readFileSync(decisionsPath, 'utf-8'); } catch { /* ignore */ }
83
83
  }
84
- snapshot.richContext = buildRichContext(activeFeature, activePhase, decisionsContent);
84
+ let specContent = '';
85
+ const specPath2 = join(cwd, `.morph/features/${activeName}/2-design/spec.md`);
86
+ if (existsSync(specPath2)) {
87
+ try { specContent = readFileSync(specPath2, 'utf-8'); } catch { /* ignore */ }
88
+ }
89
+ snapshot.richContext = buildRichContext(activeFeature, activePhase, decisionsContent, specContent);
85
90
  } catch { /* fail-open: richContext is optional */ }
86
91
  }
87
92
  // ─────────────────────────────────────────────────────────────────────────
@@ -132,7 +137,7 @@ try {
132
137
  lines.push('Next pending tasks:');
133
138
  for (const t of pending) lines.push(` [${t.id}] ${t.title}`);
134
139
  if (taskList.filter(t => t.status === 'pending').length > MAX_PENDING_TASKS) {
135
- lines.push(` ... (use morph-spec task next ${name} for full list)`);
140
+ lines.push(` ... (see tasks.md for full list)`);
136
141
  }
137
142
  }
138
143
 
@@ -164,7 +169,7 @@ try {
164
169
  }
165
170
 
166
171
  // Key decisions (truncated to stay within context budget)
167
- const decisionsPath = join(cwd, `.morph/features/${name}/1-design/decisions.md`);
172
+ const decisionsPath = join(cwd, `.morph/features/${name}/2-design/decisions.md`);
168
173
  if (existsSync(decisionsPath)) {
169
174
  try {
170
175
  const raw = readFileSync(decisionsPath, 'utf-8');
@@ -7,8 +7,8 @@
7
7
  *
8
8
  * Ensures writes to .morph/features/{feature}/ go to the current phase's subfolder:
9
9
  * proposal → only 0-proposal/
10
- * design, clarify → only 1-design/
11
- * uiux → only 2-ui/
10
+ * uiux → only 1-ui/
11
+ * design, clarify → only 2-design/
12
12
  * tasks → only 4-tasks/
13
13
  * implement → 5-implement/ + any source code (unrestricted)
14
14
  *
@@ -6,9 +6,9 @@
6
6
  * Event: PreToolUse | Matcher: Write|Edit
7
7
  *
8
8
  * Blocks Write/Edit to spec artifacts after their approval gate has passed:
9
- * - 1-design/spec.md, contracts.cs, etc. → blocked if 'design' gate approved
9
+ * - 2-design/spec.md, contracts.cs, etc. → blocked if 'design' gate approved
10
10
  * - 4-tasks/tasks.md → blocked if 'tasks' gate approved
11
- * - 2-ui/design-system.md, etc. → blocked if 'uiux' gate approved
11
+ * - 1-ui/design-system.md, etc. → blocked if 'uiux' gate approved
12
12
  *
13
13
  * Fail-open: exits 0 on any error.
14
14
  */
@@ -36,23 +36,18 @@ try {
36
36
  const phase = feature.phase || derivePhaseForFeature(name);
37
37
  if (phase !== 'implement') pass();
38
38
 
39
- // Check if any task is in_progress
40
- // Method 1: tasks.inProgress counter (v3 state format)
39
+ // Check if any task is in_progress (read directly from taskList)
40
+ if (feature.taskList?.some(t => t.status === 'in_progress')) pass();
41
+ // Fallback: legacy counter check
41
42
  if (feature.tasks?.inProgress > 0) pass();
42
43
 
43
- // Method 2: taskList array (v2 state format)
44
- if (feature.taskList) {
45
- const hasActive = feature.taskList.some(t => t.status === 'in_progress');
46
- if (hasActive) pass();
47
- }
48
-
49
44
  // No task in_progress — inject advisory warning
50
45
  approve(
51
46
  `[morph-spec] WARNING: No active task tracking detected during implement phase.\n` +
52
47
  `Before writing code, start a task:\n` +
53
- ` morph-spec task next ${name} # see what's next\n` +
54
48
  ` morph-spec task start ${name} <id> # mark it in progress\n` +
55
- `Task tracking ensures validators run, checkpoints fire, and progress is recorded.`
49
+ `Task tracking ensures validators run, checkpoints fire, and progress is recorded.\n` +
50
+ `If a task is more complex than expected, use: morph-spec task expand ${name} <id> --into "T00Xa: Sub" "T00Xb: Sub"`
56
51
  );
57
52
  } catch {
58
53
  // Fail-open
@@ -11,17 +11,17 @@
11
11
  * Fail-open: exits 0 on any error.
12
12
  */
13
13
 
14
- import { loadState, getActiveFeature, getPendingGates, getMissingOutputs, derivePhaseForFeature } from '../../shared/state-reader.js';
14
+ import { loadState, getActiveFeature, getPendingGates, getMissingOutputs, derivePhaseForFeature, getTaskStats } from '../../shared/state-reader.js';
15
15
  import { stateExists } from '../../shared/state-reader.js';
16
16
  import { injectContext, pass } from '../../shared/hook-response.js';
17
17
  import { resetActivity, logHookActivity } from '../../shared/activity-logger.js';
18
- import { readFileSync, existsSync, writeFileSync, renameSync, unlinkSync } from 'fs';
18
+ import { readFileSync, existsSync, writeFileSync, renameSync, unlinkSync, statSync } from 'fs';
19
19
  import { join } from 'path';
20
20
  import { resetStaleTasks } from '../../shared/stale-task-reset.js';
21
21
  import { execSync as _execSync } from 'child_process';
22
22
  import { parseWorktreeResult, buildWorktreeContextLine, buildWorktreeResumeContext } from '../../shared/worktree-helpers.js';
23
23
 
24
- const DEFAULT_SPEC_MAX_CHARS = 3000;
24
+ const DEFAULT_SPEC_MAX_CHARS = 6000;
25
25
 
26
26
  function getSpecMaxChars() {
27
27
  try {
@@ -90,6 +90,29 @@ try {
90
90
  // ────────────────────────────────────────────────────────────────────────────
91
91
 
92
92
  const lines = ['MORPH-SPEC Status:'];
93
+
94
+ // ── Context freshness check ─────────────────────────────────────────────
95
+ // If .morph/context/README.md is missing or older than 24h, suggest refresh.
96
+ try {
97
+ const contextReadmePath = join(process.cwd(), '.morph/context/README.md');
98
+ let contextStale = false;
99
+ if (!existsSync(contextReadmePath)) {
100
+ contextStale = true;
101
+ } else {
102
+ const stat = statSync(contextReadmePath);
103
+ const ageMs = Date.now() - stat.mtimeMs;
104
+ const TWENTY_FOUR_HOURS = 24 * 60 * 60 * 1000;
105
+ contextStale = ageMs > TWENTY_FOUR_HOURS;
106
+ }
107
+ if (contextStale) {
108
+ lines.push('');
109
+ lines.push('⚠ Architecture context is stale or missing. Run: morph-spec context refresh');
110
+ }
111
+ } catch {
112
+ // Fail-open — context freshness check must never block the session
113
+ }
114
+ // ────────────────────────────────────────────────────────────────────────
115
+
93
116
  if (staleResetLog.length > 0) {
94
117
  lines.push(`⚠️ ${staleResetLog.length} task(s) auto-reset in_progress → pending (orphaned from previous session): ${staleResetLog.join(', ')}`);
95
118
  }
@@ -100,9 +123,10 @@ try {
100
123
  lines.push(`- Active feature: ${name} (phase: ${phase}, workflow: ${feature.workflow || 'auto'})`);
101
124
  lines.push(`- Status: ${feature.status}`);
102
125
 
103
- // Task progress
104
- if (feature.tasks) {
105
- lines.push(`- Tasks: ${feature.tasks.completed || 0}/${feature.tasks.total || 0} completed`);
126
+ // Task progress (read directly from taskList)
127
+ const stats = getTaskStats(feature);
128
+ if (stats.total > 0) {
129
+ lines.push(`- Tasks: ${stats.completed}/${stats.total} completed`);
106
130
  }
107
131
 
108
132
  // Pending approvals
@@ -124,16 +148,8 @@ try {
124
148
  lines.push(`- Last checkpoint: #${lastCp.checkpointNum} (${lastCp.passed ? 'passed' : 'failed'})`);
125
149
  }
126
150
 
127
- // Task tracking guidance for work phases
128
- if (['proposal', 'setup', 'uiux', 'design', 'clarify', 'plan', 'tasks', 'implement'].includes(phase)) {
129
- lines.push('');
130
- lines.push('⚠️ MANDATORY: Create session tasks (TaskCreate) BEFORE starting phase work.');
131
- lines.push(' Analyze the phase workflow and create tasks reflecting your planned actions.');
132
- lines.push(' Mark each in_progress → completed as you go. See phase skill for guidance.');
133
- }
134
-
135
151
  // Trust level visibility — warn when low trust may block approval gates
136
- const APPROVAL_GATE_PHASES = new Set(['proposal', 'setup', 'design', 'tasks']);
152
+ const APPROVAL_GATE_PHASES = new Set(['proposal', 'design', 'tasks']);
137
153
  if (APPROVAL_GATE_PHASES.has(phase)) {
138
154
  const config = getProjectConfig();
139
155
  const trustLevel = config?.trust?.level || config?.trustLevel || 'low';
@@ -150,15 +166,15 @@ try {
150
166
  }
151
167
 
152
168
  // Active feature spec (truncated for context budget)
153
- const specPath = join(process.cwd(), `.morph/features/${name}/1-design/spec.md`);
169
+ const specPath = join(process.cwd(), `.morph/features/${name}/2-design/spec.md`);
154
170
  if (existsSync(specPath)) {
155
171
  try {
156
172
  const specContent = readFileSync(specPath, 'utf-8');
157
173
  const truncated = specContent.length > SPEC_MAX_CHARS
158
- ? specContent.slice(0, SPEC_MAX_CHARS) + `\n\n[... spec truncated — full file at .morph/features/${name}/1-design/spec.md]`
174
+ ? specContent.slice(0, SPEC_MAX_CHARS) + `\n\n[... spec truncated — full file at .morph/features/${name}/2-design/spec.md]`
159
175
  : specContent;
160
176
  lines.push('');
161
- lines.push(`--- Active feature spec (${name}/1-design/spec.md) ---`);
177
+ lines.push(`--- Active feature spec (${name}/2-design/spec.md) ---`);
162
178
  lines.push(truncated);
163
179
  lines.push('--- End spec ---');
164
180
  } catch {
@@ -249,20 +265,37 @@ try {
249
265
  }
250
266
  // ────────────────────────────────────────────────────────────────────────────
251
267
 
252
- // Remind about key commands
253
- lines.push('');
254
- lines.push('Key commands: morph-spec status <feature> | morph-spec phase advance <feature> | morph-spec approve <feature> <gate>');
268
+ // ── CLI availability detection ─────────────────────────────────────────────
269
+ // Check which development CLIs are available for the current phase.
270
+ // Uses execSync with short timeout — fail-open on any error.
271
+ try {
272
+ const currentPhaseForCli = active ? derivePhaseForFeature(active.name) : '';
273
+ if (currentPhaseForCli) {
274
+ const cliChecks = [
275
+ { name: 'docker', cmd: 'docker --version', phases: ['design', 'implement'] },
276
+ { name: 'supabase', cmd: 'npx supabase --version', phases: ['design', 'implement'] },
277
+ { name: 'psql', cmd: 'psql --version', phases: ['design', 'implement'] },
278
+ { name: 'az', cmd: 'az version --output none', phases: ['implement'] },
279
+ { name: 'gh', cmd: 'gh --version', phases: ['design', 'tasks', 'implement'] },
280
+ ];
255
281
 
256
- // System Map — compact summary for sessions without a live monitor terminal
257
- if (active) {
258
- const { name } = active;
259
- const sysPhase = derivePhaseForFeature(name);
260
- lines.push('');
261
- lines.push('── MORPH SYSTEM MAP ─────────────────────────────────────────────');
262
- lines.push(`🪝 Hooks: 10 registrados | 📏 Rules: em .claude/rules/ | 🎯 Skills: em .claude/skills/`);
263
- lines.push(` Use \`morph-spec doctor\` para health check | \`morph-spec status ${name}\` para dashboard`);
264
- lines.push('─────────────────────────────────────────────────────────────────');
282
+ const relevant = cliChecks.filter(c => c.phases.includes(currentPhaseForCli));
283
+ if (relevant.length > 0) {
284
+ const cliStatus = relevant.map(c => {
285
+ try {
286
+ _execSync(c.cmd, { stdio: 'pipe', timeout: 5000 });
287
+ return `${c.name} ✓`;
288
+ } catch {
289
+ return `${c.name} ✗`;
290
+ }
291
+ });
292
+ lines.push(`CLIs: ${cliStatus.join(', ')}`);
293
+ }
294
+ }
295
+ } catch {
296
+ // Fail-open — CLI detection must never block the session
265
297
  }
298
+ // ────────────────────────────────────────────────────────────────────────────
266
299
 
267
300
  injectContext(lines.join('\n'));
268
301
  } catch {