@polymorphism-tech/morph-spec 4.12.0 → 4.14.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 (316) hide show
  1. package/CLAUDE.md +7 -7
  2. package/README.md +28 -34
  3. package/bin/morph-spec.js +41 -24
  4. package/bin/task-manager.js +962 -1341
  5. package/bin/validate.js +1 -1
  6. package/claude-plugin.json +1 -1
  7. package/docs/CHEATSHEET.md +14 -16
  8. package/docs/QUICKSTART.md +15 -15
  9. package/framework/CLAUDE.md +5 -2
  10. package/framework/agents/README.md +3 -4
  11. package/framework/agents/ai-agents/ai-system-architect.md +6 -10
  12. package/framework/agents/architecture/seo-growth-hacker.md +166 -326
  13. package/framework/agents/architecture/standards-architect.md +21 -31
  14. package/framework/agents/backend/dotnet-senior.md +160 -86
  15. package/framework/agents/backend/ef-modeler.md +2 -6
  16. package/framework/agents/backend/hangfire-orchestrator.md +8 -9
  17. package/framework/agents/backend/ms-agent-expert.md +1 -1
  18. package/framework/agents/frontend/nextjs-expert.md +198 -133
  19. package/framework/agents/frontend/ui-ux-designer.md +226 -267
  20. package/framework/agents/infrastructure/infra-architect.md +191 -27
  21. package/framework/agents/integrations/clerk-auth.md +19 -26
  22. package/framework/agents/integrations/hangfire-integration.md +1 -4
  23. package/framework/agents.json +1084 -2278
  24. package/framework/commands/morph-apply.md +4 -6
  25. package/framework/commands/morph-preflight.md +192 -269
  26. package/framework/commands/morph-proposal.md +210 -238
  27. package/framework/commands/morph-status.md +72 -92
  28. package/framework/commands/morph-troubleshoot.md +6 -13
  29. package/framework/hooks/README.md +1 -6
  30. package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +4 -6
  31. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +12 -7
  32. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +2 -2
  33. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +2 -2
  34. package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +5 -10
  35. package/framework/hooks/claude-code/session-start/inject-morph-context.js +63 -30
  36. package/framework/hooks/claude-code/session-start/resume-context.js +77 -0
  37. package/framework/hooks/claude-code/statusline.py +4 -5
  38. package/framework/hooks/claude-code/stop/validate-completion.js +4 -4
  39. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +8 -8
  40. package/framework/hooks/shared/compact-restore.js +28 -5
  41. package/framework/hooks/shared/phase-utils.js +4 -8
  42. package/framework/hooks/shared/state-reader.js +34 -3
  43. package/framework/phases.json +162 -200
  44. package/framework/rules/ai-agents-standards.md +15 -0
  45. package/framework/rules/asaas-standards.md +13 -0
  46. package/framework/rules/clerk-standards.md +13 -0
  47. package/framework/rules/csharp-standards.md +8 -4
  48. package/framework/rules/data-standards.md +18 -0
  49. package/framework/rules/dotnet-templates.md +87 -0
  50. package/framework/rules/frontend-standards.md +13 -13
  51. package/framework/rules/hangfire-standards.md +13 -0
  52. package/framework/rules/infrastructure-standards.md +27 -16
  53. package/framework/rules/morph-workflow.md +73 -13
  54. package/framework/rules/nextjs-standards.md +1 -0
  55. package/framework/rules/nextjs-templates.md +40 -0
  56. package/framework/rules/resend-standards.md +12 -0
  57. package/framework/rules/supabase-standards.md +29 -0
  58. package/framework/skills/README.md +6 -8
  59. package/framework/skills/level-0-meta/mcp-registry.json +21 -99
  60. package/framework/{standards/ai-agents/team-orchestration.md → skills/level-0-meta/morph-agent-teams/SKILL.md} +472 -479
  61. package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +28 -1
  62. package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
  63. package/framework/skills/level-0-meta/morph-code-review/SKILL.md +1 -5
  64. package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +1 -1
  65. package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +23 -41
  66. package/framework/skills/level-0-meta/morph-init/SKILL.md +18 -14
  67. package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +225 -0
  68. package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +20 -0
  69. package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +4 -8
  70. package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +15 -59
  71. package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +7 -19
  72. package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +8 -8
  73. package/framework/skills/level-1-workflows/README.md +1 -1
  74. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +49 -50
  75. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +57 -123
  76. package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +5 -50
  77. package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +1 -1
  78. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +127 -159
  79. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/code-quality-reviewer-prompt.md +1 -1
  80. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -3
  81. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +2 -2
  82. package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +1 -1
  83. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +17 -13
  84. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +22 -40
  85. package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +143 -172
  86. package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +5 -5
  87. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +57 -77
  88. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
  89. package/framework/squad-templates/backend-only.json +6 -6
  90. package/framework/squad-templates/frontend-only.json +17 -8
  91. package/framework/squad-templates/full-stack.json +29 -24
  92. package/framework/standards/STANDARDS.json +1021 -2369
  93. package/framework/standards/backend/dotnet/fluent-validation-vsa.md +200 -0
  94. package/framework/standards/backend/dotnet/result-pattern.md +213 -0
  95. package/framework/standards/backend/dotnet/scalar-ui.md +172 -0
  96. package/framework/standards/backend/dotnet/scrutor.md +158 -0
  97. package/framework/standards/backend/dotnet/vsa-handler-patterns.md +274 -0
  98. package/framework/standards/frontend/nextjs/motion-patterns.md +1 -1
  99. package/framework/standards/infrastructure/supabase/mcp-setup.md +83 -193
  100. package/framework/standards/integration/mcp/mcp-tools.md +91 -77
  101. package/framework/templates/IDE-SNIPPETS.md +2 -6
  102. package/framework/templates/README.md +709 -814
  103. package/framework/templates/REGISTRY.json +223 -762
  104. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -0
  105. package/framework/templates/code/dotnet/abstractions/error.cs +60 -0
  106. package/framework/templates/code/dotnet/abstractions/handler.cs +12 -0
  107. package/framework/templates/code/dotnet/abstractions/result.cs +74 -0
  108. package/framework/templates/code/dotnet/backend/repository.cs +148 -141
  109. package/framework/templates/code/dotnet/constants/api-tags.cs +6 -0
  110. package/framework/templates/code/dotnet/exceptions/exception-handler.cs +32 -0
  111. package/framework/templates/code/dotnet/extensions/database-extensions.cs +20 -0
  112. package/framework/templates/code/dotnet/extensions/handler-registration.cs +38 -0
  113. package/framework/templates/code/dotnet/extensions/health-checks.cs +24 -0
  114. package/framework/templates/code/dotnet/extensions/map-endpoints.cs +35 -0
  115. package/framework/templates/code/dotnet/extensions/result-extensions.cs +29 -0
  116. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -0
  117. package/framework/templates/code/dotnet/feature/entity.cs.hbs +8 -0
  118. package/framework/templates/code/dotnet/feature/errors.cs.hbs +8 -0
  119. package/framework/templates/code/dotnet/feature/handler.cs.hbs +24 -0
  120. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -0
  121. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -0
  122. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -0
  123. package/framework/templates/code/dotnet/jobs/job.cs +21 -17
  124. package/framework/templates/code/dotnet/pipelines/logging-decorator.cs +31 -0
  125. package/framework/templates/code/dotnet/pipelines/validation-decorator.cs +97 -0
  126. package/framework/templates/code/dotnet/test.cs +192 -106
  127. package/framework/templates/context/ARCHITECTURE.md +89 -0
  128. package/framework/templates/context/CONTEXT-FEATURE.md +2 -2
  129. package/framework/templates/context/CONTEXT.md +180 -181
  130. package/framework/templates/context/design-system.md +1 -5
  131. package/framework/templates/docs/onboarding.md +2 -3
  132. package/framework/templates/docs/proposal.md +171 -182
  133. package/framework/templates/docs/spec.md +1 -3
  134. package/framework/templates/docs/ui-components.md +0 -72
  135. package/framework/templates/examples/design-system-examples.md +4 -4
  136. package/framework/templates/feature/decisions.md +0 -66
  137. package/framework/templates/feature/recap.md +1 -2
  138. package/framework/templates/infrastructure/github/README.md +56 -593
  139. package/framework/templates/integrations/clerk-config.cs +0 -41
  140. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  141. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -2
  142. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +83 -126
  143. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +2 -2
  144. package/framework/templates/project/validate.js +2 -4
  145. package/framework/templates/ui/design-system.css +1 -1
  146. package/framework/workflows/README.md +8 -8
  147. package/framework/workflows/configs/fast-track.json +51 -0
  148. package/framework/workflows/configs/full.json +68 -0
  149. package/framework/workflows/configs/standard.json +7 -3
  150. package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +1 -1
  151. package/framework/workflows/docs/enforcement-pipeline.md +18 -19
  152. package/framework/workflows/docs/full-morph.md +69 -76
  153. package/framework/workflows/docs/standard.md +49 -44
  154. package/framework/workflows/docs/ui-refresh.md +1 -1
  155. package/package.json +3 -3
  156. package/src/commands/agents/dispatch-agents.js +55 -116
  157. package/src/commands/context/context-refresh.js +79 -0
  158. package/src/commands/phase/phase-reset.js +1 -1
  159. package/src/commands/project/doctor.js +10 -32
  160. package/src/commands/project/init.js +12 -0
  161. package/src/commands/project/status.js +6 -12
  162. package/src/commands/scaffold/scaffold.js +131 -0
  163. package/src/commands/scope/escalate.js +1 -1
  164. package/src/commands/state/advance-phase.js +15 -29
  165. package/src/commands/state/state.js +20 -5
  166. package/src/commands/tasks/task.js +0 -30
  167. package/src/commands/validation/validate-feature.js +3 -10
  168. package/src/core/paths/output-schema.js +12 -13
  169. package/src/core/state/phase-state-machine.js +211 -217
  170. package/src/core/state/state-manager.js +9 -9
  171. package/src/lib/agents/agents-manager.js +2 -2
  172. package/src/lib/agents/output-collector.js +1 -2
  173. package/src/lib/detectors/design-system-detector.js +4 -4
  174. package/src/lib/detectors/index.js +1 -11
  175. package/src/lib/generators/architecture-scanner.js +640 -0
  176. package/src/lib/generators/context-generator.js +3 -3
  177. package/src/lib/generators/design-system-generator.js +508 -587
  178. package/src/lib/generators/index.js +12 -10
  179. package/src/lib/generators/metadata-extractor.js +386 -387
  180. package/src/lib/generators/recap-generator.js +4 -4
  181. package/src/lib/generators/scaffold-generator.js +317 -0
  182. package/src/lib/generators/settings-generator.js +0 -1
  183. package/src/lib/phase-chain/phase-validator.js +64 -42
  184. package/src/lib/stack/stack-profile.js +2 -2
  185. package/src/lib/standards/digest-builder.js +72 -285
  186. package/src/lib/tasks/task-parser.js +11 -5
  187. package/src/lib/validators/architecture/architecture-validator.js +259 -387
  188. package/src/lib/validators/content/content-validator.js +287 -287
  189. package/src/lib/validators/css/css-validator.js +340 -352
  190. package/src/lib/validators/packages/package-validator.js +347 -360
  191. package/src/lib/validators/shared/issue-counter.js +14 -18
  192. package/src/lib/validators/validation-runner.js +3 -19
  193. package/src/scripts/setup-infra.js +1 -1
  194. package/src/utils/agents-installer.js +61 -10
  195. package/src/utils/file-copier.js +1 -0
  196. package/src/utils/hooks-installer.js +11 -19
  197. package/src/utils/skills-installer.js +178 -178
  198. package/framework/agents/architecture/prompt-engineer.md +0 -195
  199. package/framework/agents/backend/api-designer.md +0 -106
  200. package/framework/agents/frontend/blazor-builder.md +0 -229
  201. package/framework/agents/frontend/nextjs-ui-specialist.md +0 -218
  202. package/framework/agents/infrastructure/azure-architect.md +0 -150
  203. package/framework/agents/infrastructure/azure-deploy-specialist.md +0 -707
  204. package/framework/agents/infrastructure/bicep-architect.md +0 -132
  205. package/framework/agents/infrastructure/container-specialist.md +0 -137
  206. package/framework/agents/infrastructure/devops-engineer.md +0 -126
  207. package/framework/agents/integrations/azure-identity.md +0 -148
  208. package/framework/agents/quality/code-analyzer.md +0 -239
  209. package/framework/agents/quality/testing-specialist.md +0 -130
  210. package/framework/hooks/claude-code/notification/approval-reminder.js +0 -57
  211. package/framework/hooks/claude-code/post-tool-use/context-refresh.js +0 -109
  212. package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +0 -78
  213. package/framework/index/troubleshooting-index.json +0 -184
  214. package/framework/rules/testing-standards.md +0 -14
  215. package/framework/skills/level-0-meta/morph-replicate/SKILL.md +0 -230
  216. package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +0 -70
  217. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +0 -256
  218. package/framework/skills/level-1-workflows/morph-phase-clarify/references/clarifications-example.md +0 -117
  219. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +0 -269
  220. package/framework/standards/ai-agents/blazor-ui.md +0 -364
  221. package/framework/standards/architecture/ddd/aggregates.md +0 -120
  222. package/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
  223. package/framework/standards/architecture/ddd/complexity-levels.md +0 -108
  224. package/framework/standards/architecture/ddd/entities.md +0 -99
  225. package/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
  226. package/framework/standards/architecture/ddd/value-objects.md +0 -124
  227. package/framework/standards/backend/api/minimal-api.md +0 -494
  228. package/framework/standards/backend/api/rest.md +0 -492
  229. package/framework/standards/backend/authentication/passkeys.md +0 -428
  230. package/framework/standards/backend/database/ef-core.md +0 -199
  231. package/framework/standards/backend/database/migrations.md +0 -393
  232. package/framework/standards/backend/database/repository-patterns.md +0 -528
  233. package/framework/standards/backend/dotnet/async.md +0 -366
  234. package/framework/standards/backend/dotnet/core.md +0 -117
  235. package/framework/standards/backend/dotnet/di.md +0 -439
  236. package/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
  237. package/framework/standards/context/analytics.md +0 -96
  238. package/framework/standards/context/bundles.md +0 -110
  239. package/framework/standards/context/priming.md +0 -78
  240. package/framework/standards/core/architecture.md +0 -185
  241. package/framework/standards/core/coding.md +0 -214
  242. package/framework/standards/core/git-branching-strategy.md +0 -403
  243. package/framework/standards/core/git.md +0 -185
  244. package/framework/standards/core/testing.md +0 -295
  245. package/framework/standards/data/nosql/blob-storage.md +0 -102
  246. package/framework/standards/data/vector-search/azure-ai-search.md +0 -121
  247. package/framework/standards/frontend/blazor/design-checklist.md +0 -222
  248. package/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  249. package/framework/standards/frontend/blazor/fluent-ui.md +0 -137
  250. package/framework/standards/frontend/blazor/html-conversion.md +0 -184
  251. package/framework/standards/frontend/blazor/lifecycle.md +0 -195
  252. package/framework/standards/frontend/blazor/pitfalls.md +0 -198
  253. package/framework/standards/frontend/blazor/state.md +0 -191
  254. package/framework/standards/frontend/design-system/aesthetic-direction.md +0 -266
  255. package/framework/standards/frontend/design-system/design-trends.md +0 -171
  256. package/framework/standards/infrastructure/azure/azure.md +0 -624
  257. package/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  258. package/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  259. package/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
  260. package/framework/standards/infrastructure/azure/services/functions.md +0 -486
  261. package/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
  262. package/framework/standards/infrastructure/azure/services/storage.md +0 -407
  263. package/framework/standards/infrastructure/vercel/vercel-database.md +0 -106
  264. package/framework/standards/integration/api/graphql.md +0 -91
  265. package/framework/standards/integration/api/grpc.md +0 -114
  266. package/framework/standards/integration/api/rest-design.md +0 -95
  267. package/framework/standards/integration/event-driven/cqrs.md +0 -101
  268. package/framework/standards/integration/event-driven/event-sourcing.md +0 -124
  269. package/framework/standards/integration/event-driven/service-bus.md +0 -95
  270. package/framework/standards/observability/logging.md +0 -131
  271. package/framework/standards/observability/metrics.md +0 -121
  272. package/framework/standards/observability/monitoring.md +0 -114
  273. package/framework/standards/observability/tracing.md +0 -132
  274. package/framework/standards/workflows/parallel-execution.md +0 -112
  275. package/framework/standards/workflows/thread-management.md +0 -113
  276. package/framework/templates/code/dotnet/backend/service.cs +0 -139
  277. package/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
  278. package/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
  279. package/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
  280. package/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
  281. package/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
  282. package/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
  283. package/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
  284. package/framework/templates/code/dotnet/frontend/component.razor +0 -239
  285. package/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
  286. package/framework/templates/infrastructure/azure/README.md +0 -286
  287. package/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
  288. package/framework/templates/infrastructure/azure/app-service.bicep +0 -164
  289. package/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
  290. package/framework/templates/infrastructure/azure/container-app.bicep +0 -156
  291. package/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
  292. package/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
  293. package/framework/templates/infrastructure/azure/deploy.sh +0 -208
  294. package/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
  295. package/framework/templates/infrastructure/azure/main.bicep +0 -189
  296. package/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
  297. package/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
  298. package/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
  299. package/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
  300. package/framework/templates/infrastructure/azure/storage.bicep +0 -106
  301. package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
  302. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
  303. package/framework/templates/integrations/azure-identity-config.cs +0 -288
  304. package/framework/templates/project-structure/dotnet-ddd.md +0 -70
  305. package/framework/templates/saas/subscription.cs +0 -347
  306. package/framework/templates/saas/tenant.cs +0 -338
  307. package/framework/templates/ui/FluentDesignTheme.cs +0 -149
  308. package/framework/templates/ui/MudTheme.cs +0 -281
  309. package/framework/workflows/configs/nodejs-cli.json +0 -40
  310. package/src/commands/standards/context-budget.js +0 -89
  311. package/src/lib/standards/index.js +0 -7
  312. package/src/lib/standards/standards-context-injector.js +0 -302
  313. package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +0 -316
  314. package/src/lib/validators/blazor/blazor-state-validator.js +0 -279
  315. package/src/lib/validators/blazor/blazor-validator.js +0 -369
  316. package/src/lib/validators/blazor/index.js +0 -9
@@ -1,76 +1,69 @@
1
- # Workflow: FULL MORPH (Alta Complexidade)
2
-
3
- > **Layer:** 1 | **Load:** on-keyword | **Keywords:** sistema, autenticação, integração, pattern, cqrs, subsistema
4
-
5
- ## Critérios
6
-
7
- - > 10 arquivos, > 500 linhas, múltiplos componentes novos
8
- - Infraestrutura Azure (Bicep), decisões arquiteturais estratégicas
9
-
10
- ## Fases (TODAS obrigatórias)
11
-
12
- ### FASE 0.5: CONTEXT (automática)
13
- 1. Detectar framework MORPH (`@polymorphism-tech/morph-spec`)
14
- 2. Detectar/criar estrutura `.morph/`
15
- 3. Análise automática: stack (glob patterns), arquitetura (pastas), configs, UI library
16
- 4. Analisar histórico: decisions.md passados, preferências do usuário
17
- 5. Gerar/atualizar `.morph/context/inferred.md`
18
- 6. Ativar agentes baseado em stack + keywords
19
-
20
- ### FASE 0: PROPOSAL
21
- 1. `morph-spec detect "{user-request}"`
22
- 2. Analisar solicitação, identificar stack, estimar complexidade
23
- 3. Gerar proposal.md, registrar agentes no state.json
24
- - **⛔ PAUSA:** 3 itens (1 ação + 1 pergunta + 1 sugestão)
25
-
26
- ### FASE 1: SETUP
27
- 1. Ler `.morph/config.json`
28
- 2. Confirmar stack, ativar agentes, criar pasta outputs
29
- 3. Carregar padrões (framework/standards/ > project/standards/)
30
-
31
- ### FASE 1.5: UI/UX (condicional - se keywords UI detectadas)
32
- 1. **Perguntar ao usuário:** layout, referências visuais, fluxo, imagens
33
- 2. Analisar referências fornecidas
34
- 3. Gerar deliverables AGNÓSTICOS de biblioteca (ui-mockups, ui-components, ui-flows)
35
- 4. Validar acessibilidade (WCAG 2.1) e responsividade
36
- - **⛔ PAUSA:** Aprovar / Ajustar wireframes / Adicionar fluxos
37
-
38
- ### FASE 2: DESIGN
39
- 1. Gerar spec.md com requisitos completos
40
- 2. **DECISION POINTS** (cada um requer aprovação):
41
- - Biblioteca UI (Fluent UI vs MudBlazor)
42
- - Padrões Arquiteturais (CQRS vs simples, Repository vs EF direto)
43
- - Estrutura de Dados (entidades, relacionamentos)
44
- - Infraestrutura Azure (recursos, SKUs, custos)
45
- - Bibliotecas/SDKs (NuGet packages)
46
- 3. Gerar contracts.cs, documentar decisões em decisions.md
47
- - **⛔ PAUSA:** Aprovar / Ajustar escopo / Modificar contracts
48
-
49
- ### FASE 3: CLARIFY
50
- 1. Identificar ambiguidades, fazer perguntas, documentar em spec.md, validar edge cases
51
-
52
- ### FASE 4: TASKS
53
- 1. Quebrar spec em tasks T001-TXXX, definir ordem, checkpoints, dependências
54
- - **⛔ PAUSA:** Aprovar / Repriorizar / Adicionar-remover tasks
55
-
56
- ### FASE 5: IMPLEMENT
57
- 1. Implementar task por task
58
- 2. `morph-spec task done {feature} {task-id}` após cada task
59
- 3. Framework gerencia checkpoints automaticamente (a cada 3 tasks)
60
- 4. Gerar recap.md ao final
61
-
62
- ### FASE 6: SYNC (condicional - se complexidade média/alta)
63
- 1. Revisar decisions.md, categorizar (coding, architecture, azure, integrations, ui-ux)
64
- 2. Promover para `.morph/context/{category}.md`
65
- 3. Gerar commit dedicado de sync
66
- - **⛔ PAUSA:** Aprovar promoção de decisões para standards
67
-
68
- ## Outputs Completos
69
- proposal.md, ui-design-system.md, ui-mockups.md, ui-components.md, ui-flows.md, spec.md, contracts.cs, tasks.json, decisions.md, recap.md
70
-
71
- ## Exemplos
72
- - "Sistema de relatórios com jobs agendados Hangfire"
73
- - "Autenticação completa com Clerk (login, signup, OAuth)"
74
- - "Dashboard com gráficos, tabelas e filtros complexos"
75
- - "RAG pipeline com Azure AI Search e embeddings"
76
- - "Infraestrutura Azure completa com Bicep"
1
+ # Workflow: FULL (Alta Complexidade)
2
+
3
+ > **Layer:** 1 | **Load:** on-keyword | **Keywords:** sistema, integração, arquitetura, migração, infraestrutura, plataforma
4
+
5
+ ## Critérios
6
+
7
+ - > 10 arquivos, > 500 linhas, múltiplos componentes novos
8
+ - Infraestrutura, decisões arquiteturais estratégicas, multi-domínio
9
+
10
+ ## Fases (TODAS obrigatórias)
11
+
12
+ ### FASE 0: PROPOSAL
13
+ 1. Analisar solicitação, identificar stack, estimar complexidade
14
+ 2. Gerar proposal.md, registrar agentes no state.json
15
+ 3. Avaliar complexidade → recomendar workflow full
16
+ - **⛔ PAUSA:** Aprovar proposta?
17
+
18
+ ### FASE 1: UI/UX (condicional — se keywords UI detectadas)
19
+ 1. **Perguntar ao usuário:** layout, referências visuais, fluxo, imagens
20
+ 2. Analisar referências fornecidas
21
+ 3. Gerar deliverables (design-system, mockups, components, flows)
22
+ 4. Validar acessibilidade (WCAG 2.1) e responsividade
23
+ - **⛔ PAUSA:** Aprovar UI/UX?
24
+
25
+ ### FASE 2: DESIGN (com clarificação integrada)
26
+ 1. Scan real do schema (Supabase MCP, EF Core, TypeScript)
27
+ 2. Validar schema com usuário (CHECKPOINT 1)
28
+ 3. Gerar blueprint arquitetural (CHECKPOINT 2)
29
+ 4. Gerar spec.md, contracts.cs/.ts, schema-analysis.md, decisions.md
30
+ 5. **Quality + Satisfaction scoring** (0-100):
31
+ - Quality: schema fidelity, functional coverage, blueprint, integrations, infra
32
+ - Satisfaction: functional completeness, failure coverage, edge cases, clarity, contracts
33
+ 6. Loop de refinamento: perguntas → atualizar spec.md direto → re-score
34
+ 7. Sai quando score ≥ 85 E usuário aprova
35
+ - **⛔ PAUSA:** Aprovar design?
36
+
37
+ ### FASE 3: PLAN
38
+ 1. Ler spec + contracts + decisions
39
+ 2. Analisar codebase existente (Glob + Grep)
40
+ 3. Determinar estratégia de execução (single/subagents/agent-teams)
41
+ 4. Gerar plan.md com tasks cross-referenciando FRs
42
+ - **⛔ PAUSA:** Aprovar plano?
43
+
44
+ ### FASE 4: TASKS
45
+ 1. Quebrar spec em tasks T001-TXXX com [FR refs]
46
+ 2. Definir ordem, checkpoints, dependências
47
+ - **⛔ PAUSA:** Aprovar tasks?
48
+
49
+ ### FASE 5: IMPLEMENT
50
+ 1. Para cada task: ler spec FRs → ler contracts → implementar → verificar
51
+ 2. `morph-spec task done {feature} {task-id}` após cada task
52
+ 3. Checkpoints automáticos a cada 3 tasks
53
+ 4. Gerar recap.md ao final
54
+
55
+ ### FASE 6: SYNC
56
+ 1. Revisar decisions.md, categorizar
57
+ 2. Promover para `.morph/context/{category}.md`
58
+ 3. Gerar commit dedicado de sync
59
+ - **⛔ PAUSA:** Aprovar promoção de decisões?
60
+
61
+ ## Outputs Completos
62
+ proposal.md, design-system.md, mockups.md, components.md, flows.md, spec.md, contracts.cs/.ts, schema-analysis.md, decisions.md, plan.md, tasks.md, recap.md
63
+
64
+ ## Exemplos
65
+ - "Sistema de relatórios com jobs agendados Hangfire"
66
+ - "Autenticação completa com Clerk (login, signup, OAuth)"
67
+ - "Dashboard com gráficos, tabelas e filtros complexos"
68
+ - "RAG pipeline com AI Search e embeddings"
69
+ - "Infraestrutura completa com Docker/Easypanel"
@@ -1,44 +1,49 @@
1
- # Workflow: STANDARD (Média Complexidade)
2
-
3
- > **Layer:** 1 | **Load:** on-keyword | **Keywords:** paginação, filtro, refatorar, performance, exportar
4
-
5
- ## Critérios
6
-
7
- - 3-10 arquivos, 50-500 linhas, 1-2 componentes simples
8
- - Sem infraestrutura complexa, decisões táticas (não estratégicas)
9
-
10
- ## Fases
11
-
12
- ### 1. FASE 0: PROPOSAL (simplificada)
13
- - Análise inicial em 1 parágrafo
14
- - Detecta agentes relevantes
15
- - **PAUSA:** Aprovar?
16
-
17
- ### 2. FASE 2: DESIGN (apenas spec.md)
18
- - Spec técnico conciso (1-2 páginas)
19
- - Sem contracts.cs se trivial
20
- - Decisões táticas em decisions.md
21
- - **PAUSA:** Aprovar?
22
-
23
- ### 3. FASE 4: TASKS (se > 5 tasks)
24
- - Breakdown em tasks
25
- - **PAUSA:** Aprovar?
26
-
27
- ### 4. FASE 5: IMPLEMENT
28
- - Implementa task por task
29
- - Gera recap.md ao final
30
-
31
- ## Outputs
32
- proposal.md, spec.md, recap.md (mínimo necessário)
33
-
34
- ## Fases Puladas
35
- - FASE 1 (SETUP) - contexto já carregado
36
- - FASE 1.5 (UI/UX) - se não tiver front-end significativo
37
- - FASE 3 (CLARIFY) - se spec for claro
38
- - FASE 6 (SYNC) - decisões não são estratégicas
39
-
40
- ## Exemplos
41
- - "Adicionar paginação na tabela de usuários"
42
- - "Criar filtro por data no relatório"
43
- - "Refatorar serviço de email para async"
44
- - "Adicionar botão de exportar CSV"
1
+ # Workflow: STANDARD (Média Complexidade)
2
+
3
+ > **Layer:** 1 | **Load:** on-keyword | **Keywords:** paginação, filtro, refatorar, performance, exportar
4
+
5
+ ## Critérios
6
+
7
+ - 3-10 arquivos, 50-500 linhas, 1-2 componentes simples
8
+ - Sem infraestrutura complexa, decisões táticas (não estratégicas)
9
+
10
+ ## Fases
11
+
12
+ ### 1. FASE 0: PROPOSAL (simplificada)
13
+ - Análise inicial em 1 parágrafo
14
+ - Detecta agentes relevantes
15
+ - Avalia complexidade e recomenda workflow
16
+ - **PAUSA:** Aprovar?
17
+
18
+ ### 2. FASE 2: DESIGN (spec.md + clarificação integrada)
19
+ - Spec técnico conciso (1-2 páginas)
20
+ - Quality loop com scoring (0-100) + clarificação embutida
21
+ - Spec editável até aprovação final
22
+ - Decisões táticas em decisions.md
23
+ - **PAUSA:** Aprovar?
24
+
25
+ ### 3. FASE 3: PLAN
26
+ - Plano de implementação com paths exatos e TDD
27
+ - Tasks com cross-references para FRs do spec
28
+ - **PAUSA:** Aprovar?
29
+
30
+ ### 4. FASE 4: TASKS
31
+ - Breakdown em tasks com [FR001, FR003] refs
32
+ - **PAUSA:** Aprovar? (se > 5 tasks)
33
+
34
+ ### 5. FASE 5: IMPLEMENT
35
+ - Implementa task por task consultando spec por FR
36
+ - Gera recap.md ao final
37
+
38
+ ## Outputs
39
+ proposal.md, spec.md, plan.md, tasks.md, recap.md
40
+
41
+ ## Fases Puladas
42
+ - UI/UX — se não tiver front-end significativo (skipIfCondition: !hasUIAgents)
43
+ - Sync — decisões não são estratégicas
44
+
45
+ ## Exemplos
46
+ - "Adicionar paginação na tabela de usuários"
47
+ - "Criar filtro por data no relatório"
48
+ - "Refatorar serviço de email para async"
49
+ - "Adicionar botão de exportar CSV"
@@ -16,7 +16,7 @@
16
16
  - Se protótipo existir: ler e extrair padrões
17
17
  - **PAUSA:** Escolher direção estética
18
18
 
19
- ### 2. DESIGN SYSTEM (FASE 1.5 simplificada)
19
+ ### 2. DESIGN SYSTEM (FASE 2 simplificada)
20
20
  - Definir variáveis CSS novas
21
21
  - Listar componentes CSS a criar (checklist)
22
22
  - Gerar/atualizar design-system.css
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polymorphism-tech/morph-spec",
3
- "version": "4.12.0",
3
+ "version": "4.14.0",
4
4
  "description": "MORPH-SPEC: AI-First development framework with validation pipeline and multi-stack support",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -10,9 +10,9 @@
10
10
  "spec-driven",
11
11
  "dotnet",
12
12
  "dotnet10",
13
- "blazor",
13
+ "nextjs",
14
14
  "agent-framework",
15
- "fluent-ui",
15
+ "vsa",
16
16
  "framework",
17
17
  "developer-tools",
18
18
  "morph",
@@ -1,8 +1,10 @@
1
1
  /**
2
- * dispatch-agents — Build dispatch config for parallel agent orchestration
2
+ * dispatch-agents — Advisor for native Claude Code agent dispatch
3
3
  *
4
- * Reads activeAgents from state.json + spawn_prompts from agents.json and
5
- * outputs a JSON dispatch config that phase skills use to spawn parallel subagents.
4
+ * Reads activeAgents from state.json + agents.json and outputs a
5
+ * recommendation of which agents to use and which tasks they handle.
6
+ * Agent .md files in .claude/agents/ are self-contained — dispatch
7
+ * does NOT compose prompts (except for tier-4 validators).
6
8
  *
7
9
  * Usage:
8
10
  * morph-spec dispatch-agents <feature> <phase>
@@ -11,8 +13,10 @@
11
13
  * Output (JSON):
12
14
  * {
13
15
  * feature, phase, shouldDispatch, reason,
14
- * agents: [{ id, title, tier, icon, role, parallelGroup, canRunParallel, taskPrompt }],
15
- * taskGroups: { [group]: { agentId, description, tasks, canRunParallel, taskPrompt } }
16
+ * recommended: { [group]: subagentType[] },
17
+ * tasks: { [group]: taskId[] },
18
+ * agents: [{ id, subagentType, title, tier, icon, group }],
19
+ * warnings: []
16
20
  * }
17
21
  */
18
22
 
@@ -20,7 +24,7 @@ import { readFileSync, existsSync } from 'fs';
20
24
  import { join, dirname } from 'path';
21
25
  import { fileURLToPath } from 'url';
22
26
  import { loadState, stateExists, logDispatch } from '../../core/state/state-manager.js';
23
- import { buildAgentBriefing, buildValidatorPrompt } from '../../lib/standards/digest-builder.js';
27
+ import { buildValidatorPrompt } from '../../lib/standards/digest-builder.js';
24
28
  import { agentIdToSubagentType } from '../../utils/agent-id-mapper.js';
25
29
  import { shouldInstall, getProjectTags } from '../../lib/stack-filter.js';
26
30
  import { parseAndGroupTasks } from '../../lib/tasks/task-parser.js';
@@ -179,8 +183,10 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
179
183
  return {
180
184
  shouldDispatch: false,
181
185
  reason: 'state.json not found — run morph-spec state init',
186
+ recommended: {},
187
+ tasks: {},
182
188
  agents: [],
183
- taskGroups: {},
189
+ warnings: [],
184
190
  };
185
191
  }
186
192
 
@@ -191,8 +197,10 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
191
197
  phase,
192
198
  shouldDispatch: false,
193
199
  reason: `Feature '${featureName}' not found in state.json`,
200
+ recommended: {},
201
+ tasks: {},
194
202
  agents: [],
195
- taskGroups: {},
203
+ warnings: [],
196
204
  };
197
205
  }
198
206
 
@@ -204,25 +212,16 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
204
212
  phase,
205
213
  shouldDispatch: false,
206
214
  reason: 'framework/agents.json not found',
215
+ recommended: {},
216
+ tasks: {},
207
217
  agents: [],
208
- taskGroups: {},
218
+ warnings: [],
209
219
  };
210
220
  }
211
221
 
212
222
  const agentsData = JSON.parse(readFileSync(agentsPath, 'utf8'));
213
223
  const allAgents = agentsData.agents || {};
214
224
 
215
- // Load phases.json for required skills injection (opts.phasesJsonPath allows override for testing)
216
- const phasesPath = opts.phasesJsonPath || PHASES_JSON_PATH;
217
- let phasesData = null;
218
- try {
219
- if (existsSync(phasesPath)) {
220
- phasesData = JSON.parse(readFileSync(phasesPath, 'utf8'));
221
- }
222
- } catch {
223
- // Non-blocking — fail silent, skills block will be omitted
224
- }
225
-
226
225
  // Load project config for stack filtering
227
226
  const configPath = join(projectPath, '.morph', 'config.json');
228
227
  let projectTags = [];
@@ -278,44 +277,28 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
278
277
 
279
278
  const group = getAgentGroup(agentId, agentData);
280
279
 
281
- // Build task prompt: validator prompt for tier-4 in validate mode, else spawn_prompt
282
- let rawPrompt;
283
- if (isValidateMode && isTier4) {
284
- rawPrompt = buildValidatorPrompt(agentId) || agentData.teammate?.spawn_prompt || '';
285
- } else {
286
- rawPrompt = agentData.teammate.spawn_prompt;
287
- }
288
-
289
- // Append standards digest as Constraints block, then skills block, then MCP block
290
- const briefing = buildAgentBriefing(agentId, phase);
291
- const skillsBlock = buildSkillsBlock(phase, phasesData);
292
- const mcpBlock = buildMcpBlock(phase, phasesData);
293
- const fullTaskPrompt = [
294
- rawPrompt,
295
- briefing ? `\n\nConstraints:\n${briefing}` : '',
296
- skillsBlock ? `\n\n${skillsBlock}` : '',
297
- mcpBlock ? `\n\n${mcpBlock}` : '',
298
- ].join('');
299
-
300
- dispatchableAgents.push({
280
+ // Tier-4 validators in validate mode still get taskPrompt (dynamically generated)
281
+ const agentEntry = {
301
282
  id: agentId,
302
283
  subagentType: agentIdToSubagentType(agentId, agentData.tier),
303
284
  title: agentData.title,
304
285
  tier: agentData.tier,
305
286
  icon: agentData.teammate?.icon || '🤖',
306
- role: agentData.teammate?.role || agentData.description || '',
307
- parallelGroup: group,
308
- canRunParallel: true,
309
- canWrite: !isTier4,
310
- taskPrompt: fullTaskPrompt,
311
- });
287
+ group,
288
+ };
289
+
290
+ if (isValidateMode && isTier4) {
291
+ agentEntry.taskPrompt = buildValidatorPrompt(agentId) || agentData.teammate?.spawn_prompt || '';
292
+ }
293
+
294
+ dispatchableAgents.push(agentEntry);
312
295
  }
313
296
 
314
297
  // Sort: domain-analysis first, then by tier (ascending), then alphabetically
315
298
  const groupOrder = ['domain-analysis', 'backend', 'frontend', 'infra', 'tests', 'docs', 'support'];
316
299
  dispatchableAgents.sort((a, b) => {
317
- const gi = groupOrder.indexOf(a.parallelGroup);
318
- const gj = groupOrder.indexOf(b.parallelGroup);
300
+ const gi = groupOrder.indexOf(a.group);
301
+ const gj = groupOrder.indexOf(b.group);
319
302
  if (gi !== gj) return gi - gj;
320
303
  if (a.tier !== b.tier) return a.tier - b.tier;
321
304
  return a.id.localeCompare(b.id);
@@ -323,56 +306,18 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
323
306
 
324
307
  const shouldDispatch = dispatchableAgents.length >= 2;
325
308
 
326
- // ── Execution mode recommendation ─────────────────────────────────────────
327
- // Derive recommended mode from agent composition:
328
- // - 'agent-teams' : 2+ distinct parallel groups AND 5+ total agents (critical multi-domain)
329
- // - 'subagents' : shouldDispatch=true but below agent-teams threshold
330
- // - 'single' : no dispatch benefit
331
- const distinctGroups = new Set(dispatchableAgents.map(a => a.parallelGroup)).size;
332
- let mode;
333
- if (shouldDispatch && distinctGroups >= 2 && dispatchableAgents.length >= 5) {
334
- mode = 'agent-teams';
335
- } else if (shouldDispatch) {
336
- mode = 'subagents';
337
- } else {
338
- mode = 'single';
309
+ // ── Recommended agents by group ───────────────────────────────────────────
310
+ const recommended = {};
311
+ for (const agent of dispatchableAgents) {
312
+ if (!recommended[agent.group]) recommended[agent.group] = [];
313
+ recommended[agent.group].push(agent.subagentType);
339
314
  }
340
315
 
341
- // ── Task groups ────────────────────────────────────────────────────────────
342
- const taskGroups = {};
343
-
316
+ // ── Tasks by group (implement phase only) ─────────────────────────────────
317
+ let tasks = {};
344
318
  if (phase === 'implement') {
345
- // Group tasks from tasks.md by domain category
346
319
  const tasksPath = join(projectPath, `.morph/features/${featureName}/4-tasks/tasks.md`);
347
- const tasksByGroup = parseAndGroupTasks(tasksPath);
348
-
349
- for (const [group, taskIds] of Object.entries(tasksByGroup)) {
350
- const groupAgent = dispatchableAgents.find(a => a.parallelGroup === group);
351
- taskGroups[group] = {
352
- agentId: groupAgent?.id ?? null,
353
- subagentType: groupAgent?.subagentType ?? null,
354
- description: `${group} implementation tasks for feature '${featureName}'`,
355
- tasks: taskIds,
356
- canRunParallel: true,
357
- taskPrompt: groupAgent?.taskPrompt ?? null,
358
- };
359
- }
360
- } else {
361
- // For design/tasks: one group per parallel group, no task IDs yet
362
- const seenGroups = new Set();
363
- for (const agent of dispatchableAgents) {
364
- if (seenGroups.has(agent.parallelGroup)) continue;
365
- seenGroups.add(agent.parallelGroup);
366
-
367
- taskGroups[agent.parallelGroup] = {
368
- agentId: agent.id,
369
- subagentType: agent.subagentType,
370
- description: agent.role,
371
- tasks: [],
372
- canRunParallel: true,
373
- taskPrompt: agent.taskPrompt,
374
- };
375
- }
320
+ tasks = parseAndGroupTasks(tasksPath);
376
321
  }
377
322
 
378
323
  // ── Pre-flight: check agent files exist ──────────────────────────────────
@@ -391,15 +336,15 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
391
336
  return {
392
337
  feature: featureName,
393
338
  phase,
394
- mode,
395
339
  shouldDispatch,
396
340
  reason: shouldDispatch
397
341
  ? `${dispatchableAgents.length} dispatchable agents for phase '${phase}'`
398
342
  : dispatchableAgents.length === 1
399
343
  ? `Only 1 dispatchable agent — sequential execution preferred`
400
344
  : `No dispatchable agents found for phase '${phase}'`,
345
+ recommended,
346
+ tasks,
401
347
  agents: dispatchableAgents,
402
- taskGroups,
403
348
  warnings,
404
349
  };
405
350
  }
@@ -440,18 +385,12 @@ export async function dispatchAgentsCommand(featureName, phase, options = {}) {
440
385
  logDispatch(featureName, {
441
386
  timestamp: new Date().toISOString(),
442
387
  phase: normalizedPhase,
443
- mode: config.mode,
444
- agents: config.agents.map(a => {
445
- const groupEntry = Object.entries(config.taskGroups || {}).find(
446
- ([, g]) => g.agentId === a.id
447
- );
448
- return {
449
- id: a.id,
450
- subagentType: a.subagentType,
451
- group: a.parallelGroup,
452
- tasks: groupEntry ? groupEntry[1].tasks : [],
453
- };
454
- }),
388
+ agents: config.agents.map(a => ({
389
+ id: a.id,
390
+ subagentType: a.subagentType,
391
+ group: a.group,
392
+ tasks: config.tasks?.[a.group] || [],
393
+ })),
455
394
  });
456
395
  } catch {
457
396
  // Non-blocking — dispatch output still succeeds even if log fails
@@ -474,7 +413,7 @@ export async function dispatchAgentsCommand(featureName, phase, options = {}) {
474
413
  for (const agent of config.agents) {
475
414
  console.log(
476
415
  ` ${(agent.icon + ' ' + agent.id).padEnd(28)} ` +
477
- `${chalk.cyan(agent.parallelGroup.padEnd(16))} ` +
416
+ `${chalk.cyan(agent.group.padEnd(16))} ` +
478
417
  `${agent.tier}`
479
418
  );
480
419
  }
@@ -482,17 +421,17 @@ export async function dispatchAgentsCommand(featureName, phase, options = {}) {
482
421
  console.log(chalk.gray('\n No dispatchable agents.'));
483
422
  }
484
423
 
485
- const groupEntries = Object.entries(config.taskGroups || {});
486
- if (groupEntries.length > 0) {
487
- console.log(`\n Task Groups:`);
488
- console.log(` ${'Group'.padEnd(20)} ${'Tasks'.padEnd(8)} Agent`);
424
+ const recEntries = Object.entries(config.recommended || {});
425
+ if (recEntries.length > 0) {
426
+ console.log(`\n Recommended:`);
427
+ console.log(` ${'Group'.padEnd(20)} ${'Tasks'.padEnd(8)} Agents`);
489
428
  console.log(' ' + '─'.repeat(50));
490
- for (const [group, data] of groupEntries) {
491
- const taskCount = data.tasks?.length || 0;
429
+ for (const [group, agentTypes] of recEntries) {
430
+ const taskCount = config.tasks?.[group]?.length || 0;
492
431
  console.log(
493
432
  ` ${group.padEnd(20)} ` +
494
433
  `${String(taskCount).padEnd(8)} ` +
495
- `${data.agentId || chalk.gray('none')}`
434
+ `${agentTypes.join(', ')}`
496
435
  );
497
436
  }
498
437
  }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * CLI handler for `morph-spec context refresh`
3
+ *
4
+ * Scans the project filesystem for architectural patterns and generates
5
+ * a rich .morph/context/README.md that Claude reads at session start.
6
+ *
7
+ * @module context-refresh
8
+ */
9
+
10
+ import { scanArchitecture, renderArchitectureContext } from '../../lib/generators/architecture-scanner.js';
11
+ import { logger } from '../../utils/logger.js';
12
+
13
+ /**
14
+ * @param {Object} options - Commander options
15
+ * @param {string} [options.path] - Target project path
16
+ * @param {boolean} [options.verbose] - Show detailed output
17
+ * @param {boolean} [options.json] - Output raw JSON
18
+ * @param {boolean} [options.quiet] - Suppress output (for programmatic use)
19
+ */
20
+ export async function contextRefreshCommand(options = {}) {
21
+ const projectPath = options.path || process.cwd();
22
+
23
+ if (!options.quiet) {
24
+ logger.header('Architecture Context Refresh');
25
+ logger.dim(`Scanning: ${projectPath}`);
26
+ logger.blank();
27
+ }
28
+
29
+ try {
30
+ const scanResult = await scanArchitecture(projectPath);
31
+
32
+ if (options.json) {
33
+ console.log(JSON.stringify(scanResult, null, 2));
34
+ return;
35
+ }
36
+
37
+ const outputPath = await renderArchitectureContext(projectPath, scanResult);
38
+
39
+ if (!options.quiet) {
40
+ const counts = [];
41
+ if (scanResult.entities.length > 0) counts.push(`${scanResult.entities.length} entities`);
42
+ if (scanResult.endpoints.length > 0) counts.push(`${scanResult.endpoints.length} endpoints`);
43
+ if (scanResult.nextjs.pages.length > 0) counts.push(`${scanResult.nextjs.pages.length} pages`);
44
+ if (scanResult.nextjs.components.length > 0) counts.push(`${scanResult.nextjs.components.length} components`);
45
+ if (scanResult.integrations.length > 0) counts.push(`${scanResult.integrations.length} integrations`);
46
+ if (scanResult.database.length > 0) counts.push(`${scanResult.database.length} tables`);
47
+ if (scanResult.stack.dotnet.length > 0) counts.push(`${scanResult.stack.dotnet.length} .NET packages`);
48
+ if (scanResult.stack.npm.length > 0) counts.push(`${scanResult.stack.npm.length} npm packages`);
49
+
50
+ if (counts.length > 0) {
51
+ logger.success(`Found: ${counts.join(', ')}`);
52
+ } else {
53
+ logger.warn('No architectural patterns detected (empty project?)');
54
+ }
55
+
56
+ logger.success(`Written to: ${outputPath}`);
57
+
58
+ if (options.verbose) {
59
+ logger.blank();
60
+ if (scanResult.entities.length > 0) {
61
+ logger.info('Entities:');
62
+ for (const e of scanResult.entities) logger.dim(` ${e.name} (${e.type}) — ${e.path}`);
63
+ }
64
+ if (scanResult.endpoints.length > 0) {
65
+ logger.info('Endpoints:');
66
+ for (const ep of scanResult.endpoints) logger.dim(` ${ep.method || '???'} ${ep.route} — ${ep.name}`);
67
+ }
68
+ if (scanResult.nextjs.pages.length > 0) {
69
+ logger.info('Pages:');
70
+ for (const p of scanResult.nextjs.pages) logger.dim(` ${p.route} — ${p.path}`);
71
+ }
72
+ }
73
+ }
74
+ } catch (err) {
75
+ if (options.quiet) throw err;
76
+ logger.error(`Scan failed: ${err.message}`);
77
+ process.exitCode = 1;
78
+ }
79
+ }
@@ -12,7 +12,7 @@ import chalk from 'chalk';
12
12
  import { loadState, saveState, derivePhase } from '../../core/state/state-manager.js';
13
13
  import { join } from 'path';
14
14
 
15
- const VALID_PHASES = ['proposal', 'setup', 'uiux', 'design', 'clarify', 'plan', 'tasks', 'implement', 'sync'];
15
+ const VALID_PHASES = ['proposal', 'uiux', 'design', 'plan', 'tasks', 'implement', 'sync'];
16
16
 
17
17
  /**
18
18
  * Core reset logic — exported for testing.