@polymorphism-tech/morph-spec 3.0.1 → 3.2.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 +561 -63
  2. package/LICENSE +72 -72
  3. package/README.md +275 -79
  4. package/bin/detect-agents.js +3 -1
  5. package/bin/morph-spec.js +60 -1
  6. package/bin/render-template.js +61 -14
  7. package/bin/semantic-detect-agents.js +2 -1
  8. package/bin/{task-manager.js → task-manager.cjs} +113 -8
  9. package/bin/validate-agents-skills.js +10 -4
  10. package/bin/validate-agents.js +4 -3
  11. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
  12. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
  13. package/docs/api/scripts/collapse.js +38 -38
  14. package/docs/api/scripts/commonNav.js +28 -28
  15. package/docs/api/scripts/linenumber.js +25 -25
  16. package/docs/api/scripts/nav.js +12 -12
  17. package/docs/api/scripts/polyfill.js +3 -3
  18. package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
  19. package/docs/api/scripts/prettify/lang-css.js +2 -2
  20. package/docs/api/scripts/prettify/prettify.js +28 -28
  21. package/docs/api/scripts/search.js +98 -98
  22. package/docs/api/styles/jsdoc.css +776 -776
  23. package/docs/api/styles/prettify.css +80 -80
  24. package/docs/cli-auto-detection.md +219 -0
  25. package/docs/examples.md +328 -328
  26. package/docs/getting-started.md +3 -3
  27. package/docs/llm-interaction-config.md +735 -0
  28. package/docs/templates.md +418 -418
  29. package/docs/troubleshooting.md +269 -0
  30. package/package.json +7 -3
  31. package/scripts/postinstall.js +132 -132
  32. package/scripts/reorganize-skills.cjs +1 -1
  33. package/scripts/validate-agents-structure.cjs +1 -1
  34. package/scripts/validate-skills.cjs +2 -2
  35. package/src/commands/advance-phase.js +93 -2
  36. package/src/commands/analyze-blazor-concurrency.js +193 -193
  37. package/src/commands/approve.js +221 -0
  38. package/src/commands/capture-pattern.js +121 -0
  39. package/src/commands/create-story.js +5 -2
  40. package/src/commands/deploy.js +780 -780
  41. package/src/commands/detect-agents.js +4 -2
  42. package/src/commands/generate.js +276 -149
  43. package/src/commands/init.js +37 -0
  44. package/src/commands/lint-fluent.js +352 -352
  45. package/src/commands/migrate-state.js +158 -0
  46. package/src/commands/rollback-phase.js +185 -185
  47. package/src/commands/search-patterns.js +126 -0
  48. package/src/commands/session-summary.js +291 -291
  49. package/src/commands/shard-spec.js +224 -224
  50. package/src/commands/spawn-team.js +172 -0
  51. package/src/commands/sprint-status.js +250 -250
  52. package/src/commands/task.js +3 -3
  53. package/src/commands/troubleshoot.js +222 -222
  54. package/src/commands/update.js +36 -0
  55. package/src/commands/upgrade.js +346 -0
  56. package/src/commands/validate-blazor-state.js +210 -210
  57. package/src/commands/validate-blazor.js +156 -156
  58. package/src/commands/validate-css.js +84 -84
  59. package/src/commands/validate-phase.js +221 -221
  60. package/src/generator/.gitkeep +0 -0
  61. package/src/generator/config-generator.js +206 -0
  62. package/src/generator/templates/config.json.template +40 -0
  63. package/src/generator/templates/project.md.template +67 -0
  64. package/src/lib/blazor-concurrency-analyzer.js +288 -288
  65. package/src/lib/blazor-state-validator.js +291 -291
  66. package/src/lib/blazor-validator.js +374 -374
  67. package/src/lib/checkpoint-hooks.js +258 -0
  68. package/src/lib/context-generator.js +7 -4
  69. package/src/lib/css-validator.js +352 -352
  70. package/src/lib/design-system-generator.js +298 -298
  71. package/src/lib/hook-executor.js +2 -1
  72. package/src/lib/learning-system.js +520 -520
  73. package/src/lib/metadata-extractor.js +380 -0
  74. package/src/lib/mockup-generator.js +366 -366
  75. package/src/lib/phase-state-machine.js +214 -0
  76. package/src/lib/stack-resolver.js +148 -0
  77. package/src/lib/standards-context-injector.js +4 -3
  78. package/src/lib/state-manager.js +120 -0
  79. package/src/lib/team-orchestrator.js +2 -1
  80. package/src/lib/template-data-sources.js +325 -0
  81. package/src/lib/troubleshoot-grep.js +204 -194
  82. package/src/lib/troubleshoot-index.js +144 -144
  83. package/src/lib/ui-detector.js +350 -350
  84. package/src/lib/validation-runner.js +2 -1
  85. package/src/lib/validators/architecture-validator.js +387 -387
  86. package/src/lib/validators/content-validator.js +351 -0
  87. package/src/lib/validators/package-validator.js +360 -360
  88. package/src/lib/validators/ui-contrast-validator.js +422 -422
  89. package/src/llm/.gitkeep +0 -0
  90. package/src/llm/analyzer.js +215 -0
  91. package/src/llm/environment-detector.js +43 -0
  92. package/src/llm/few-shot-examples.js +216 -0
  93. package/src/llm/project-config-schema.json +188 -0
  94. package/src/llm/prompt-builder.js +96 -0
  95. package/src/llm/schema-validator.js +121 -0
  96. package/src/orchestrator.js +206 -0
  97. package/src/sanitizer/.gitkeep +0 -0
  98. package/src/sanitizer/context-sanitizer.js +221 -0
  99. package/src/sanitizer/patterns.js +163 -0
  100. package/src/scanner/.gitkeep +0 -0
  101. package/src/scanner/project-scanner.js +242 -0
  102. package/src/types/index.js +477 -0
  103. package/src/ui/.gitkeep +0 -0
  104. package/src/ui/diff-display.js +91 -0
  105. package/src/ui/interactive-wizard.js +96 -0
  106. package/src/ui/user-review.js +211 -0
  107. package/src/ui/wizard-questions.js +190 -0
  108. package/src/utils/file-copier.js +3 -1
  109. package/src/utils/logger.js +32 -32
  110. package/src/utils/version-checker.js +175 -175
  111. package/src/writer/.gitkeep +0 -0
  112. package/src/writer/file-writer.js +86 -0
  113. package/{content → stacks/blazor-azure}/.azure/README.md +2 -2
  114. package/{content → stacks/blazor-azure}/.azure/pipelines/pipeline-variables.yml +1 -1
  115. package/{content → stacks/blazor-azure}/.azure/pipelines/prod-pipeline.yml +1 -1
  116. package/{content → stacks/blazor-azure}/.azure/pipelines/staging-pipeline.yml +1 -1
  117. package/{content → stacks/blazor-azure}/.claude/commands/morph-preflight.md +227 -227
  118. package/{content → stacks/blazor-azure}/.claude/commands/morph-troubleshoot.md +122 -122
  119. package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-setup.md +1 -1
  120. package/{content → stacks/blazor-azure}/.morph/docs/workflows/enforcement-pipeline.md +3 -3
  121. package/{content → stacks/blazor-azure}/.morph/hooks/README.md +12 -12
  122. package/{content → stacks/blazor-azure}/.morph/standards/agent-teams-workflow.md +2 -2
  123. package/{content → stacks/blazor-azure}/.morph/standards/migration-guide.md +2 -2
  124. package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy-checklist.md +426 -426
  125. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/backend/dotnet-supabase.md +244 -0
  126. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/frontend/nextjs-supabase.md +335 -0
  127. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/infrastructure/easypanel-deployer.md +189 -0
  128. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +170 -0
  129. package/stacks/nextjs-supabase/.morph/config/agents.json +345 -0
  130. package/stacks/nextjs-supabase/.morph/config/config.template.json +92 -0
  131. package/stacks/nextjs-supabase/.morph/docs/easypanel-setup.md +169 -0
  132. package/stacks/nextjs-supabase/.morph/docs/supabase-mcp-setup.md +247 -0
  133. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/README.md +697 -0
  134. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/spec.md +85 -0
  135. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/tasks.md +86 -0
  136. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/README.md +498 -0
  137. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/decisions.md +121 -0
  138. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/spec.md +138 -0
  139. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/tasks.md +162 -0
  140. package/stacks/nextjs-supabase/.morph/project.md +168 -0
  141. package/stacks/nextjs-supabase/.morph/standards/easypanel-deploy.md +191 -0
  142. package/stacks/nextjs-supabase/.morph/standards/nextjs-patterns.md +193 -0
  143. package/stacks/nextjs-supabase/.morph/standards/supabase-auth.md +171 -0
  144. package/stacks/nextjs-supabase/.morph/standards/supabase-pgvector.md +164 -0
  145. package/stacks/nextjs-supabase/.morph/standards/supabase-rls.md +179 -0
  146. package/stacks/nextjs-supabase/.morph/standards/supabase-storage.md +148 -0
  147. package/stacks/nextjs-supabase/.morph/templates/contracts.cs +173 -0
  148. package/stacks/nextjs-supabase/.morph/templates/contracts.ts +168 -0
  149. package/stacks/nextjs-supabase/.morph/templates/decisions.md +115 -0
  150. package/stacks/nextjs-supabase/.morph/templates/dockerfile-api.dockerfile +38 -0
  151. package/stacks/nextjs-supabase/.morph/templates/dockerfile-web.dockerfile +48 -0
  152. package/stacks/nextjs-supabase/.morph/templates/proposal.md +145 -0
  153. package/stacks/nextjs-supabase/.morph/templates/recap.md +134 -0
  154. package/stacks/nextjs-supabase/.morph/templates/rls-policy.sql +57 -0
  155. package/stacks/nextjs-supabase/.morph/templates/spec.md +231 -0
  156. package/stacks/nextjs-supabase/.morph/templates/supabase-migration.sql +100 -0
  157. package/stacks/nextjs-supabase/.morph/templates/tasks.md +257 -0
  158. package/stacks/nextjs-supabase/CLAUDE.md +149 -0
  159. package/stacks/nextjs-supabase/README.md +112 -0
  160. /package/{content → stacks/blazor-azure}/.azure/docs/azure-devops-setup.md +0 -0
  161. /package/{content → stacks/blazor-azure}/.azure/docs/branch-strategy.md +0 -0
  162. /package/{content → stacks/blazor-azure}/.azure/docs/local-development.md +0 -0
  163. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/build-dotnet.yml +0 -0
  164. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-app-service.yml +0 -0
  165. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-container-app.yml +0 -0
  166. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/infra-deploy.yml +0 -0
  167. /package/{content → stacks/blazor-azure}/.claude/commands/morph-apply.md +0 -0
  168. /package/{content → stacks/blazor-azure}/.claude/commands/morph-archive.md +0 -0
  169. /package/{content → stacks/blazor-azure}/.claude/commands/morph-deploy.md +0 -0
  170. /package/{content → stacks/blazor-azure}/.claude/commands/morph-infra.md +0 -0
  171. /package/{content → stacks/blazor-azure}/.claude/commands/morph-proposal.md +0 -0
  172. /package/{content → stacks/blazor-azure}/.claude/commands/morph-status.md +0 -0
  173. /package/{content → stacks/blazor-azure}/.claude/settings.local.json +0 -0
  174. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/README.md +0 -0
  175. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/code-review.md +0 -0
  176. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/morph-checklist.md +0 -0
  177. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/simulation-checklist.md +0 -0
  178. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/README.md +0 -0
  179. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/morph-replicate.md +0 -0
  180. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-clarify.md +0 -0
  181. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-design.md +0 -0
  182. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-tasks.md +0 -0
  183. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-uiux.md +0 -0
  184. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/README.md +0 -0
  185. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +0 -0
  186. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/po-pm-advisor.md +0 -0
  187. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/prompt-engineer.md +0 -0
  188. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/seo-growth-hacker.md +0 -0
  189. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/standards-architect.md +0 -0
  190. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/dotnet-senior.md +0 -0
  191. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ef-modeler.md +0 -0
  192. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +0 -0
  193. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ms-agent-expert.md +0 -0
  194. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/blazor-builder.md +0 -0
  195. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/nextjs-expert.md +0 -0
  196. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +0 -0
  197. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/azure-architect.md +0 -0
  198. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +0 -0
  199. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +0 -0
  200. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/container-specialist.md +0 -0
  201. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +0 -0
  202. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/asaas-financial.md +0 -0
  203. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/azure-identity.md +0 -0
  204. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/clerk-auth.md +0 -0
  205. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/resend-email.md +0 -0
  206. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/code-analyzer.md +0 -0
  207. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/testing-specialist.md +0 -0
  208. /package/{content → stacks/blazor-azure}/.claude/skills/level-3-technologies/README.md +0 -0
  209. /package/{content → stacks/blazor-azure}/.claude/skills/level-4-patterns/README.md +0 -0
  210. /package/{content → stacks/blazor-azure}/.morph/.morphversion +0 -0
  211. /package/{content → stacks/blazor-azure}/.morph/archive/.gitkeep +0 -0
  212. /package/{content → stacks/blazor-azure}/.morph/config/agents.json +0 -0
  213. /package/{content → stacks/blazor-azure}/.morph/config/config.template.json +0 -0
  214. /package/{content → stacks/blazor-azure}/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +0 -0
  215. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/design-impl.md +0 -0
  216. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/fast-track.md +0 -0
  217. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/full-morph.md +0 -0
  218. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/standard.md +0 -0
  219. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/ui-refresh.md +0 -0
  220. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/README.md +0 -0
  221. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/contracts.ts +0 -0
  222. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/spec.md +0 -0
  223. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/tasks.md +0 -0
  224. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/README.md +0 -0
  225. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/contracts.cs +0 -0
  226. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/decisions.md +0 -0
  227. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/spec.md +0 -0
  228. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/tasks.md +0 -0
  229. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/README.md +0 -0
  230. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/contracts.cs +0 -0
  231. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/spec.md +0 -0
  232. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/tasks.md +0 -0
  233. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/decisions.md +0 -0
  234. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/proposal.md +0 -0
  235. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/spec.md +0 -0
  236. /package/{content → stacks/blazor-azure}/.morph/examples/state-v3.json +0 -0
  237. /package/{content → stacks/blazor-azure}/.morph/features/.gitkeep +0 -0
  238. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-agents.sh +0 -0
  239. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-all.sh +0 -0
  240. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-specs.sh +0 -0
  241. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-tests.sh +0 -0
  242. /package/{content → stacks/blazor-azure}/.morph/hooks/task-completed.js +0 -0
  243. /package/{content → stacks/blazor-azure}/.morph/hooks/teammate-idle.js +0 -0
  244. /package/{content → stacks/blazor-azure}/.morph/project.md +0 -0
  245. /package/{content → stacks/blazor-azure}/.morph/schemas/agent.schema.json +0 -0
  246. /package/{content → stacks/blazor-azure}/.morph/schemas/tasks.schema.json +0 -0
  247. /package/{content → stacks/blazor-azure}/.morph/specs/.gitkeep +0 -0
  248. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-blazor-ui.md +0 -0
  249. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-production.md +0 -0
  250. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-setup.md +0 -0
  251. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-workflows.md +0 -0
  252. /package/{content → stacks/blazor-azure}/.morph/standards/architecture.md +0 -0
  253. /package/{content → stacks/blazor-azure}/.morph/standards/azure.md +0 -0
  254. /package/{content → stacks/blazor-azure}/.morph/standards/coding.md +0 -0
  255. /package/{content → stacks/blazor-azure}/.morph/standards/dotnet10-migration.md +0 -0
  256. /package/{content → stacks/blazor-azure}/.morph/standards/fluent-ui-setup.md +0 -0
  257. /package/{content → stacks/blazor-azure}/.morph/standards/passkeys-auth.md +0 -0
  258. /package/{content → stacks/blazor-azure}/.morph/standards/vector-search-rag.md +0 -0
  259. /package/{content → stacks/blazor-azure}/.morph/state.json +0 -0
  260. /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT-FEATURE.md +0 -0
  261. /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT.md +0 -0
  262. /package/{content → stacks/blazor-azure}/.morph/templates/FluentDesignTheme.cs +0 -0
  263. /package/{content → stacks/blazor-azure}/.morph/templates/MudTheme.cs +0 -0
  264. /package/{content → stacks/blazor-azure}/.morph/templates/agent.cs +0 -0
  265. /package/{content → stacks/blazor-azure}/.morph/templates/clarify-questions.md +0 -0
  266. /package/{content → stacks/blazor-azure}/.morph/templates/component.razor +0 -0
  267. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Commands.cs +0 -0
  268. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Entities.cs +0 -0
  269. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Queries.cs +0 -0
  270. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/README.md +0 -0
  271. /package/{content → stacks/blazor-azure}/.morph/templates/contracts.cs +0 -0
  272. /package/{content → stacks/blazor-azure}/.morph/templates/decisions.md +0 -0
  273. /package/{content → stacks/blazor-azure}/.morph/templates/design-system.css +0 -0
  274. /package/{content → stacks/blazor-azure}/.morph/templates/infra/.dockerignore.example +0 -0
  275. /package/{content → stacks/blazor-azure}/.morph/templates/infra/Dockerfile.example +0 -0
  276. /package/{content → stacks/blazor-azure}/.morph/templates/infra/README.md +0 -0
  277. /package/{content → stacks/blazor-azure}/.morph/templates/infra/app-insights.bicep +0 -0
  278. /package/{content → stacks/blazor-azure}/.morph/templates/infra/app-service.bicep +0 -0
  279. /package/{content → stacks/blazor-azure}/.morph/templates/infra/azure-pipelines-deploy.yml +0 -0
  280. /package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app-env.bicep +0 -0
  281. /package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app.bicep +0 -0
  282. /package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.ps1 +0 -0
  283. /package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.sh +0 -0
  284. /package/{content → stacks/blazor-azure}/.morph/templates/infra/key-vault.bicep +0 -0
  285. /package/{content → stacks/blazor-azure}/.morph/templates/infra/main.bicep +0 -0
  286. /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.dev.json +0 -0
  287. /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.prod.json +0 -0
  288. /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.staging.json +0 -0
  289. /package/{content → stacks/blazor-azure}/.morph/templates/infra/sql-database.bicep +0 -0
  290. /package/{content → stacks/blazor-azure}/.morph/templates/infra/storage.bicep +0 -0
  291. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-client.cs +0 -0
  292. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-webhook.cs +0 -0
  293. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/azure-identity-config.cs +0 -0
  294. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/clerk-config.cs +0 -0
  295. /package/{content → stacks/blazor-azure}/.morph/templates/job.cs +0 -0
  296. /package/{content → stacks/blazor-azure}/.morph/templates/migration.cs +0 -0
  297. /package/{content → stacks/blazor-azure}/.morph/templates/proposal.md +0 -0
  298. /package/{content → stacks/blazor-azure}/.morph/templates/recap.md +0 -0
  299. /package/{content → stacks/blazor-azure}/.morph/templates/repository.cs +0 -0
  300. /package/{content → stacks/blazor-azure}/.morph/templates/saas/subscription.cs +0 -0
  301. /package/{content → stacks/blazor-azure}/.morph/templates/saas/tenant.cs +0 -0
  302. /package/{content → stacks/blazor-azure}/.morph/templates/service.cs +0 -0
  303. /package/{content → stacks/blazor-azure}/.morph/templates/simulation.md +0 -0
  304. /package/{content → stacks/blazor-azure}/.morph/templates/spec.md +0 -0
  305. /package/{content → stacks/blazor-azure}/.morph/templates/sprint-status.yaml +0 -0
  306. /package/{content → stacks/blazor-azure}/.morph/templates/state.template.json +0 -0
  307. /package/{content → stacks/blazor-azure}/.morph/templates/story.md +0 -0
  308. /package/{content → stacks/blazor-azure}/.morph/templates/tasks.md +0 -0
  309. /package/{content → stacks/blazor-azure}/.morph/templates/test.cs +0 -0
  310. /package/{content → stacks/blazor-azure}/.morph/templates/ui-components.md +0 -0
  311. /package/{content → stacks/blazor-azure}/.morph/templates/ui-design-system.md +0 -0
  312. /package/{content → stacks/blazor-azure}/.morph/templates/ui-flows.md +0 -0
  313. /package/{content → stacks/blazor-azure}/.morph/templates/ui-mockups.md +0 -0
  314. /package/{content → stacks/blazor-azure}/.morph/test-infra/example.bicep +0 -0
  315. /package/{content → stacks/blazor-azure}/CLAUDE.md +0 -0
  316. /package/{content → stacks/blazor-azure}/README.md +0 -0
@@ -10,10 +10,12 @@
10
10
  */
11
11
 
12
12
  import chalk from 'chalk';
13
- import { loadState, saveState, getFeature } from '../lib/state-manager.js';
13
+ import { loadState, saveState, getFeature, getApprovalGate } from '../lib/state-manager.js';
14
14
  import { PHASES, validatePhase } from './validate-phase.js';
15
15
  import { detectDesignSystem, hasUIAgentsActive } from '../lib/design-system-detector.js';
16
16
  import { validateSpec } from '../lib/spec-validator.js';
17
+ import { validateTransition, getPhaseDisplayName } from '../lib/phase-state-machine.js';
18
+ import { validateSpecContent, validateTasksContent, validateFeatureOutputs } from '../lib/validators/content-validator.js';
17
19
 
18
20
  // Phase order for advancing (skips optional phases unless active)
19
21
  const PHASE_ORDER = ['proposal', 'setup', 'uiux', 'design', 'clarify', 'tasks', 'implement', 'sync'];
@@ -96,6 +98,42 @@ export async function advancePhaseCommand(feature, options = {}) {
96
98
  const nextPhaseDef = PHASES[nextPhase];
97
99
  console.log(chalk.gray('Next Phase:'), nextPhaseDef.name);
98
100
 
101
+ // === GATE 1: State Machine Validation ===
102
+ // Ensure phase transition is valid (no skipping required phases)
103
+ if (!options.force) {
104
+ try {
105
+ validateTransition(currentPhase, nextPhase);
106
+ } catch (error) {
107
+ console.log(chalk.red('\n✗ Invalid phase transition'));
108
+ console.log(chalk.yellow(error.message));
109
+ console.log(chalk.gray('\nUse --force to override (not recommended)\n'));
110
+ process.exit(1);
111
+ }
112
+ }
113
+
114
+ // === GATE 2: Approval Gate Check ===
115
+ // Check if current phase requires approval before advancing
116
+ const approvalGateMap = {
117
+ 'design': 'design',
118
+ 'tasks': 'tasks',
119
+ 'uiux': 'uiux'
120
+ };
121
+
122
+ const requiredGate = approvalGateMap[currentPhase];
123
+ if (requiredGate && !options.skipApproval) {
124
+ const gateStatus = getApprovalGate(feature, requiredGate);
125
+
126
+ if (!gateStatus || !gateStatus.approved) {
127
+ console.log(chalk.red(`\n✗ Phase "${currentPhase}" requires approval before advancing`));
128
+ console.log(chalk.yellow(`\nRun: morph-spec approve ${feature} ${requiredGate}`));
129
+ console.log(chalk.gray('Or use --skip-approval to bypass (not recommended)\n'));
130
+ process.exit(1);
131
+ }
132
+
133
+ console.log(chalk.green(`✓ Approval gate "${requiredGate}" passed`));
134
+ }
135
+
136
+ // === GATE 3: Output Requirements ===
99
137
  // Validate that current phase requirements are met before advancing
100
138
  const validation = validatePhase(feature, nextPhase);
101
139
 
@@ -112,8 +150,34 @@ export async function advancePhaseCommand(feature, options = {}) {
112
150
  console.log(chalk.yellow(`\n⚠️ ${validation.stateWarning}`));
113
151
  }
114
152
 
115
- // Gate: Validate spec.md and contracts.cs when advancing from design phase
153
+ // === GATE 4: Content Validation ===
154
+ // Validate spec.md and contracts.cs when advancing from design phase
116
155
  if (currentPhase === 'design' && (nextPhase === 'clarify' || nextPhase === 'tasks')) {
156
+ // Check spec.md structure and content
157
+ if (featureData.outputs?.spec?.created) {
158
+ const specContentValidation = validateSpecContent(featureData.outputs.spec.path);
159
+
160
+ if (!specContentValidation.valid) {
161
+ console.log(chalk.red('\n✗ Spec content validation failed:'));
162
+ specContentValidation.missing.forEach(section => {
163
+ console.log(chalk.red(` - Missing section: ${section}`));
164
+ });
165
+ specContentValidation.errors.forEach(error => {
166
+ console.log(chalk.red(` - ${error}`));
167
+ });
168
+ console.log('');
169
+ process.exit(1);
170
+ }
171
+
172
+ if (specContentValidation.warnings?.length > 0 && !options.skipWarnings) {
173
+ console.log(chalk.yellow('\n⚠️ Spec content warnings:'));
174
+ specContentValidation.warnings.forEach(warning => {
175
+ console.log(chalk.yellow(` - ${warning}`));
176
+ });
177
+ }
178
+ }
179
+
180
+ // Run existing spec validator (anti-patterns, IaC checks)
117
181
  const specValidation = await validateSpec('.', feature);
118
182
 
119
183
  if (specValidation.errors > 0) {
@@ -135,6 +199,33 @@ export async function advancePhaseCommand(feature, options = {}) {
135
199
  }
136
200
  }
137
201
 
202
+ // === GATE 5: Tasks Content Validation ===
203
+ // Validate tasks.json structure when advancing to implement
204
+ if (currentPhase === 'tasks' && nextPhase === 'implement') {
205
+ if (featureData.outputs?.tasks?.created) {
206
+ const tasksContentValidation = validateTasksContent(featureData.outputs.tasks.path);
207
+
208
+ if (!tasksContentValidation.valid) {
209
+ console.log(chalk.red('\n✗ Tasks content validation failed:'));
210
+ tasksContentValidation.errors.forEach(error => {
211
+ console.log(chalk.red(` - ${error}`));
212
+ });
213
+ console.log('');
214
+ process.exit(1);
215
+ }
216
+
217
+ if (tasksContentValidation.warnings?.length > 0 && !options.skipWarnings) {
218
+ console.log(chalk.yellow('\n⚠️ Tasks content warnings:'));
219
+ tasksContentValidation.warnings.forEach(warning => {
220
+ console.log(chalk.yellow(` - ${warning}`));
221
+ });
222
+ }
223
+
224
+ // Show tasks stats
225
+ console.log(chalk.green(`\n✓ Tasks validated: ${tasksContentValidation.stats.totalTasks} total (${tasksContentValidation.stats.regularTasks} tasks + ${tasksContentValidation.stats.checkpoints} checkpoints)`));
226
+ }
227
+ }
228
+
138
229
  // Gate: Check design system when advancing to implement with UI agents
139
230
  if (nextPhase === 'implement') {
140
231
  const gateResult = designSystemGate(feature);
@@ -1,193 +1,193 @@
1
- /**
2
- * analyze-blazor-concurrency command
3
- *
4
- * Analyzes Blazor Server code for DbContext concurrency issues.
5
- *
6
- * Usage:
7
- * morph-spec analyze-blazor-concurrency [path]
8
- * morph-spec analyze-blazor-concurrency src/Services --verbose
9
- */
10
-
11
- import { glob } from 'glob';
12
- import { readFileSync, existsSync, statSync } from 'fs';
13
- import { join, resolve } from 'path';
14
- import chalk from 'chalk';
15
- import ora from 'ora';
16
-
17
- import {
18
- analyzeConcurrency,
19
- countIssues,
20
- } from '../lib/blazor-concurrency-analyzer.js';
21
-
22
- /**
23
- * Main command handler for analyze-blazor-concurrency.
24
- *
25
- * @param {string} [targetPath] - Path to analyze (file or directory)
26
- * @param {Object} options - Command options
27
- * @param {boolean} [options.verbose] - Show detailed output
28
- */
29
- export async function analyzeBlazorConcurrencyCommand(targetPath, options = {}) {
30
- const { verbose = false } = options;
31
-
32
- console.log('');
33
- console.log(
34
- chalk.cyan('\uD83D\uDD0D Analisando concorrencia DbContext em Blazor Server...')
35
- );
36
- console.log('');
37
-
38
- // Determine target path
39
- const basePath = targetPath ? resolve(targetPath) : process.cwd();
40
-
41
- if (!existsSync(basePath)) {
42
- console.log(chalk.red(`\u274C Path not found: ${basePath}`));
43
- process.exit(1);
44
- }
45
-
46
- const spinner = ora('Scanning for C# files...').start();
47
-
48
- let files = [];
49
-
50
- try {
51
- const stats = statSync(basePath);
52
-
53
- if (stats.isFile()) {
54
- if (basePath.endsWith('.cs')) {
55
- files = [basePath];
56
- } else {
57
- spinner.fail('File must be .cs');
58
- process.exit(1);
59
- }
60
- } else {
61
- // Find all C# files (services, repositories, handlers)
62
- const pattern = join(basePath, '**/*.cs');
63
- files = await glob(pattern, {
64
- ignore: [
65
- '**/node_modules/**',
66
- '**/bin/**',
67
- '**/obj/**',
68
- '**/Migrations/**',
69
- ],
70
- windowsPathsNoEscape: true,
71
- });
72
- }
73
-
74
- spinner.succeed(`Found ${files.length} C# file(s)`);
75
- } catch (error) {
76
- spinner.fail(`Error scanning files: ${error.message}`);
77
- process.exit(1);
78
- }
79
-
80
- if (files.length === 0) {
81
- console.log(chalk.yellow('\n\u26A0\uFE0F No C# files found to analyze'));
82
- return;
83
- }
84
-
85
- // Analyze each file
86
- const allIssues = [];
87
- const fileResults = [];
88
-
89
- for (const file of files) {
90
- try {
91
- const content = readFileSync(file, 'utf-8');
92
- const issues = analyzeConcurrency(content, file);
93
-
94
- if (issues.length > 0) {
95
- allIssues.push(...issues);
96
- fileResults.push({ file, issues });
97
- }
98
- } catch (error) {
99
- if (verbose) {
100
- console.log(chalk.red(`\u274C Error reading ${file}: ${error.message}`));
101
- }
102
- }
103
- }
104
-
105
- // Output results
106
- console.log('');
107
-
108
- if (allIssues.length === 0) {
109
- console.log(
110
- chalk.green(
111
- '\u2705 Nenhum problema de concorrencia detectado!'
112
- )
113
- );
114
- console.log(
115
- chalk.gray(
116
- ' Dica: Certifique-se de usar IDbContextFactory para operacoes background.'
117
- )
118
- );
119
- console.log('');
120
- return;
121
- }
122
-
123
- // Display issues
124
- if (verbose) {
125
- fileResults.forEach(({ file, issues }) => {
126
- console.log(chalk.white.bold(`\n${file}`));
127
- console.log(chalk.gray('-'.repeat(60)));
128
-
129
- issues.forEach((issue) => {
130
- const icon =
131
- issue.type === 'error'
132
- ? '\u274C'
133
- : issue.type === 'warning'
134
- ? '\u26A0\uFE0F'
135
- : '\u2139\uFE0F';
136
-
137
- console.log(`${icon} ${issue.message}`);
138
- if (issue.suggestion) {
139
- console.log(chalk.gray(` \u2192 ${issue.suggestion}`));
140
- }
141
- if (issue.line) {
142
- console.log(chalk.dim(` Linha: ${issue.line}`));
143
- }
144
- if (issue.code) {
145
- console.log(chalk.dim(` Codigo: ${issue.code}`));
146
- }
147
- console.log('');
148
- });
149
- });
150
- } else {
151
- allIssues.forEach((issue) => {
152
- const icon =
153
- issue.type === 'error'
154
- ? '\u274C'
155
- : issue.type === 'warning'
156
- ? '\u26A0\uFE0F'
157
- : '\u2139\uFE0F';
158
-
159
- const location = issue.line ? `${issue.file}:${issue.line}` : issue.file;
160
-
161
- console.log(`${icon} ${issue.message}`);
162
- if (issue.suggestion) {
163
- console.log(chalk.gray(` \u2192 ${issue.suggestion}`));
164
- }
165
- console.log(chalk.dim(` ${location}`));
166
- console.log('');
167
- });
168
- }
169
-
170
- // Summary
171
- const { errors, warnings, infos } = countIssues(allIssues);
172
- const summaryColor = errors > 0 ? chalk.red : chalk.yellow;
173
-
174
- console.log(chalk.gray('-'.repeat(60)));
175
- console.log(
176
- summaryColor(
177
- `\n${files.length} arquivo(s) analisado(s) | ${errors} erro(s) | ${warnings} warning(s) | ${infos} info(s)\n`
178
- )
179
- );
180
-
181
- // Recommendation
182
- if (errors > 0) {
183
- console.log(
184
- chalk.cyan(
185
- '\uD83D\uDCD6 Consulte: framework/standards/blazor-efcore.md para padroes corretos'
186
- )
187
- );
188
- console.log('');
189
- process.exit(1);
190
- }
191
- }
192
-
193
- export default analyzeBlazorConcurrencyCommand;
1
+ /**
2
+ * analyze-blazor-concurrency command
3
+ *
4
+ * Analyzes Blazor Server code for DbContext concurrency issues.
5
+ *
6
+ * Usage:
7
+ * morph-spec analyze-blazor-concurrency [path]
8
+ * morph-spec analyze-blazor-concurrency src/Services --verbose
9
+ */
10
+
11
+ import { glob } from 'glob';
12
+ import { readFileSync, existsSync, statSync } from 'fs';
13
+ import { join, resolve } from 'path';
14
+ import chalk from 'chalk';
15
+ import ora from 'ora';
16
+
17
+ import {
18
+ analyzeConcurrency,
19
+ countIssues,
20
+ } from '../lib/blazor-concurrency-analyzer.js';
21
+
22
+ /**
23
+ * Main command handler for analyze-blazor-concurrency.
24
+ *
25
+ * @param {string} [targetPath] - Path to analyze (file or directory)
26
+ * @param {Object} options - Command options
27
+ * @param {boolean} [options.verbose] - Show detailed output
28
+ */
29
+ export async function analyzeBlazorConcurrencyCommand(targetPath, options = {}) {
30
+ const { verbose = false } = options;
31
+
32
+ console.log('');
33
+ console.log(
34
+ chalk.cyan('\uD83D\uDD0D Analisando concorrencia DbContext em Blazor Server...')
35
+ );
36
+ console.log('');
37
+
38
+ // Determine target path
39
+ const basePath = targetPath ? resolve(targetPath) : process.cwd();
40
+
41
+ if (!existsSync(basePath)) {
42
+ console.log(chalk.red(`\u274C Path not found: ${basePath}`));
43
+ process.exit(1);
44
+ }
45
+
46
+ const spinner = ora('Scanning for C# files...').start();
47
+
48
+ let files = [];
49
+
50
+ try {
51
+ const stats = statSync(basePath);
52
+
53
+ if (stats.isFile()) {
54
+ if (basePath.endsWith('.cs')) {
55
+ files = [basePath];
56
+ } else {
57
+ spinner.fail('File must be .cs');
58
+ process.exit(1);
59
+ }
60
+ } else {
61
+ // Find all C# files (services, repositories, handlers)
62
+ const pattern = join(basePath, '**/*.cs');
63
+ files = await glob(pattern, {
64
+ ignore: [
65
+ '**/node_modules/**',
66
+ '**/bin/**',
67
+ '**/obj/**',
68
+ '**/Migrations/**',
69
+ ],
70
+ windowsPathsNoEscape: true,
71
+ });
72
+ }
73
+
74
+ spinner.succeed(`Found ${files.length} C# file(s)`);
75
+ } catch (error) {
76
+ spinner.fail(`Error scanning files: ${error.message}`);
77
+ process.exit(1);
78
+ }
79
+
80
+ if (files.length === 0) {
81
+ console.log(chalk.yellow('\n\u26A0\uFE0F No C# files found to analyze'));
82
+ return;
83
+ }
84
+
85
+ // Analyze each file
86
+ const allIssues = [];
87
+ const fileResults = [];
88
+
89
+ for (const file of files) {
90
+ try {
91
+ const content = readFileSync(file, 'utf-8');
92
+ const issues = analyzeConcurrency(content, file);
93
+
94
+ if (issues.length > 0) {
95
+ allIssues.push(...issues);
96
+ fileResults.push({ file, issues });
97
+ }
98
+ } catch (error) {
99
+ if (verbose) {
100
+ console.log(chalk.red(`\u274C Error reading ${file}: ${error.message}`));
101
+ }
102
+ }
103
+ }
104
+
105
+ // Output results
106
+ console.log('');
107
+
108
+ if (allIssues.length === 0) {
109
+ console.log(
110
+ chalk.green(
111
+ '\u2705 Nenhum problema de concorrencia detectado!'
112
+ )
113
+ );
114
+ console.log(
115
+ chalk.gray(
116
+ ' Dica: Certifique-se de usar IDbContextFactory para operacoes background.'
117
+ )
118
+ );
119
+ console.log('');
120
+ return;
121
+ }
122
+
123
+ // Display issues
124
+ if (verbose) {
125
+ fileResults.forEach(({ file, issues }) => {
126
+ console.log(chalk.white.bold(`\n${file}`));
127
+ console.log(chalk.gray('-'.repeat(60)));
128
+
129
+ issues.forEach((issue) => {
130
+ const icon =
131
+ issue.type === 'error'
132
+ ? '\u274C'
133
+ : issue.type === 'warning'
134
+ ? '\u26A0\uFE0F'
135
+ : '\u2139\uFE0F';
136
+
137
+ console.log(`${icon} ${issue.message}`);
138
+ if (issue.suggestion) {
139
+ console.log(chalk.gray(` \u2192 ${issue.suggestion}`));
140
+ }
141
+ if (issue.line) {
142
+ console.log(chalk.dim(` Linha: ${issue.line}`));
143
+ }
144
+ if (issue.code) {
145
+ console.log(chalk.dim(` Codigo: ${issue.code}`));
146
+ }
147
+ console.log('');
148
+ });
149
+ });
150
+ } else {
151
+ allIssues.forEach((issue) => {
152
+ const icon =
153
+ issue.type === 'error'
154
+ ? '\u274C'
155
+ : issue.type === 'warning'
156
+ ? '\u26A0\uFE0F'
157
+ : '\u2139\uFE0F';
158
+
159
+ const location = issue.line ? `${issue.file}:${issue.line}` : issue.file;
160
+
161
+ console.log(`${icon} ${issue.message}`);
162
+ if (issue.suggestion) {
163
+ console.log(chalk.gray(` \u2192 ${issue.suggestion}`));
164
+ }
165
+ console.log(chalk.dim(` ${location}`));
166
+ console.log('');
167
+ });
168
+ }
169
+
170
+ // Summary
171
+ const { errors, warnings, infos } = countIssues(allIssues);
172
+ const summaryColor = errors > 0 ? chalk.red : chalk.yellow;
173
+
174
+ console.log(chalk.gray('-'.repeat(60)));
175
+ console.log(
176
+ summaryColor(
177
+ `\n${files.length} arquivo(s) analisado(s) | ${errors} erro(s) | ${warnings} warning(s) | ${infos} info(s)\n`
178
+ )
179
+ );
180
+
181
+ // Recommendation
182
+ if (errors > 0) {
183
+ console.log(
184
+ chalk.cyan(
185
+ '\uD83D\uDCD6 Consulte: framework/standards/blazor-efcore.md para padroes corretos'
186
+ )
187
+ );
188
+ console.log('');
189
+ process.exit(1);
190
+ }
191
+ }
192
+
193
+ export default analyzeBlazorConcurrencyCommand;