@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
@@ -0,0 +1,221 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { getFeature, setApprovalGate, getApprovalGate, getApprovalHistory } from '../lib/state-manager.js';
4
+
5
+ /**
6
+ * Approval Commands - Manage approval gates for MORPH workflow
7
+ *
8
+ * Commands:
9
+ * - approve: Mark a gate as approved
10
+ * - reject: Reject a gate with reason
11
+ * - approval-status: Show approval status for all gates
12
+ */
13
+
14
+ const program = new Command();
15
+
16
+ /**
17
+ * Valid approval gate names
18
+ */
19
+ const VALID_GATES = ['proposal', 'uiux', 'design', 'tasks'];
20
+
21
+ /**
22
+ * Approve action function - Mark a gate as approved
23
+ */
24
+ export async function approveCommand(featureName, gateName, options = {}) {
25
+ try {
26
+ // Validate gate name
27
+ if (!VALID_GATES.includes(gateName)) {
28
+ console.error(chalk.red(`\n❌ Invalid gate: ${gateName}`));
29
+ console.log(chalk.gray(`Valid gates: ${VALID_GATES.join(', ')}\n`));
30
+ process.exit(1);
31
+ }
32
+
33
+ // Get feature state
34
+ const feature = getFeature(featureName);
35
+ if (!feature) {
36
+ console.error(chalk.red(`\n❌ Feature not found: ${featureName}\n`));
37
+ process.exit(1);
38
+ }
39
+
40
+ // Check if already approved
41
+ const currentStatus = getApprovalGate(featureName, gateName);
42
+ if (currentStatus?.approved) {
43
+ console.log(chalk.yellow(`\n⚠️ Gate "${gateName}" is already approved`));
44
+ console.log(chalk.gray(`Approved at: ${currentStatus.timestamp}`));
45
+ console.log(chalk.gray(`Approved by: ${currentStatus.approvedBy || 'Unknown'}\n`));
46
+ return;
47
+ }
48
+
49
+ // Set approval
50
+ setApprovalGate(featureName, gateName, true, {
51
+ approvedBy: options.approver || process.env.USER || process.env.USERNAME || 'user',
52
+ approvedAt: new Date().toISOString(),
53
+ notes: options.notes
54
+ });
55
+
56
+ console.log(chalk.green(`\n✅ Gate "${gateName}" approved for feature: ${featureName}`));
57
+ console.log(chalk.gray(`Workflow can now proceed past ${gateName} phase\n`));
58
+
59
+ } catch (error) {
60
+ console.error(chalk.red(`\n❌ Error approving gate: ${error.message}\n`));
61
+ process.exit(1);
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Approve command - Mark a gate as approved
67
+ */
68
+ program
69
+ .command('approve <feature> <gate>')
70
+ .description('Approve a phase gate to allow workflow progression')
71
+ .action(approveCommand);
72
+
73
+ /**
74
+ * Reject action function - Reject a gate with optional reason
75
+ */
76
+ export async function rejectCommand(featureName, gateName, reason, options = {}) {
77
+ try {
78
+ // Validate gate name
79
+ if (!VALID_GATES.includes(gateName)) {
80
+ console.error(chalk.red(`\n❌ Invalid gate: ${gateName}`));
81
+ console.log(chalk.gray(`Valid gates: ${VALID_GATES.join(', ')}\n`));
82
+ process.exit(1);
83
+ }
84
+
85
+ // Get feature state
86
+ const feature = getFeature(featureName);
87
+ if (!feature) {
88
+ console.error(chalk.red(`\n❌ Feature not found: ${featureName}\n`));
89
+ process.exit(1);
90
+ }
91
+
92
+ // Set rejection
93
+ setApprovalGate(featureName, gateName, false, {
94
+ rejectedBy: process.env.USER || process.env.USERNAME || 'user',
95
+ rejectedAt: new Date().toISOString(),
96
+ reason: reason || 'No reason provided'
97
+ });
98
+
99
+ console.log(chalk.red(`\n❌ Gate "${gateName}" rejected for feature: ${featureName}`));
100
+ if (reason) {
101
+ console.log(chalk.gray(`Reason: ${reason}`));
102
+ }
103
+ console.log(chalk.yellow(`\n⚠️ Address the concerns and request approval again\n`));
104
+
105
+ } catch (error) {
106
+ console.error(chalk.red(`\n❌ Error rejecting gate: ${error.message}\n`));
107
+ process.exit(1);
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Reject command - Reject a gate with optional reason
113
+ */
114
+ program
115
+ .command('reject <feature> <gate> [reason]')
116
+ .description('Reject a phase gate with optional reason')
117
+ .action(rejectCommand);
118
+
119
+ /**
120
+ * Approval status action function - Show all gates and their status
121
+ */
122
+ export async function approvalStatusCommand(featureName, options = {}) {
123
+ try {
124
+ // Get feature state
125
+ const feature = getFeature(featureName);
126
+ if (!feature) {
127
+ console.error(chalk.red(`\n❌ Feature not found: ${featureName}\n`));
128
+ process.exit(1);
129
+ }
130
+
131
+ // JSON output
132
+ if (options.json) {
133
+ const status = {
134
+ feature: featureName,
135
+ phase: feature.phase,
136
+ status: feature.status,
137
+ gates: {}
138
+ };
139
+
140
+ for (const gateName of VALID_GATES) {
141
+ status.gates[gateName] = getApprovalGate(featureName, gateName) || { approved: false };
142
+ }
143
+
144
+ console.log(JSON.stringify(status, null, 2));
145
+ return;
146
+ }
147
+
148
+ console.log(chalk.bold(`\n📋 Approval Status for: ${featureName}`));
149
+ console.log('━'.repeat(60));
150
+
151
+ // Show current phase
152
+ console.log(chalk.cyan(`\nCurrent Phase: ${feature.phase || 'unknown'}`));
153
+ console.log(chalk.gray(`Feature Status: ${feature.status || 'unknown'}\n`));
154
+
155
+ // Show each gate
156
+ console.log(chalk.bold('Approval Gates:'));
157
+
158
+ for (const gateName of VALID_GATES) {
159
+ const gateStatus = getApprovalGate(featureName, gateName);
160
+
161
+ if (!gateStatus) {
162
+ console.log(` ${chalk.gray('○')} ${gateName}: ${chalk.gray('Not yet evaluated')}`);
163
+ continue;
164
+ }
165
+
166
+ if (gateStatus.approved) {
167
+ console.log(` ${chalk.green('✓')} ${gateName}: ${chalk.green('Approved')}`);
168
+ if (gateStatus.timestamp) {
169
+ console.log(chalk.gray(` Approved at: ${gateStatus.timestamp}`));
170
+ }
171
+ if (gateStatus.approvedBy) {
172
+ console.log(chalk.gray(` Approved by: ${gateStatus.approvedBy}`));
173
+ }
174
+ } else {
175
+ console.log(` ${chalk.red('✗')} ${gateName}: ${chalk.red('Rejected / Not Approved')}`);
176
+ if (gateStatus.reason) {
177
+ console.log(chalk.gray(` Reason: ${gateStatus.reason}`));
178
+ }
179
+ if (gateStatus.timestamp) {
180
+ console.log(chalk.gray(` Rejected at: ${gateStatus.timestamp}`));
181
+ }
182
+ }
183
+ }
184
+
185
+ // Show approval history if available
186
+ const history = getApprovalHistory(featureName);
187
+ if (history && history.length > 0) {
188
+ console.log(chalk.bold('\nApproval History:'));
189
+ history.slice(-5).forEach(entry => {
190
+ const status = entry.approved ? chalk.green('✓ Approved') : chalk.red('✗ Rejected');
191
+ console.log(` ${status} ${entry.gate} - ${entry.timestamp}`);
192
+ });
193
+ }
194
+
195
+ console.log('\n' + '━'.repeat(60) + '\n');
196
+
197
+ } catch (error) {
198
+ console.error(chalk.red(`\n❌ Error showing approval status: ${error.message}\n`));
199
+ process.exit(1);
200
+ }
201
+ }
202
+
203
+ /**
204
+ * Approval status command - Show all gates and their status
205
+ */
206
+ program
207
+ .command('approval-status <feature>')
208
+ .alias('status')
209
+ .description('Show approval status for all gates')
210
+ .action(approvalStatusCommand);
211
+
212
+ // Only parse if run directly (not imported as module)
213
+ if (import.meta.url === `file://${process.argv[1]}`) {
214
+ if (process.argv.length > 2) {
215
+ program.parse(process.argv);
216
+ } else {
217
+ program.help();
218
+ }
219
+ }
220
+
221
+ export default program;
@@ -0,0 +1,121 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { appendFileSync, existsSync, readFileSync } from 'fs';
4
+ import { join } from 'path';
5
+
6
+ /**
7
+ * Capture Pattern Command - Document lessons learned
8
+ *
9
+ * Appends patterns to patterns-learned.md for future reference
10
+ */
11
+
12
+ const program = new Command();
13
+
14
+ const VALID_CATEGORIES = ['success', 'avoid', 'optimization', 'security', 'convention', 'best-practice'];
15
+
16
+ program
17
+ .name('capture-pattern')
18
+ .description('Capture a pattern or lesson learned from a feature')
19
+ .argument('<feature>', 'Feature name')
20
+ .argument('<category>', `Pattern category (${VALID_CATEGORIES.join(', ')})`)
21
+ .argument('<description>', 'Brief description of the pattern')
22
+ .option('--auto', 'Auto-capture without opening editor', false)
23
+ .action(async (featureName, category, description, options) => {
24
+ try {
25
+ // Validate category
26
+ if (!VALID_CATEGORIES.includes(category)) {
27
+ console.error(chalk.red(`\n❌ Invalid category: ${category}`));
28
+ console.log(chalk.gray(`Valid categories: ${VALID_CATEGORIES.join(', ')}\n`));
29
+ process.exit(1);
30
+ }
31
+
32
+ // Get patterns file path
33
+ const patternsPath = join(process.cwd(), '.morph/memory/patterns-learned.md');
34
+
35
+ if (!existsSync(patternsPath)) {
36
+ console.error(chalk.red(`\n❌ Patterns file not found: ${patternsPath}`));
37
+ console.log(chalk.yellow('Run "morph-spec init" to create the file.\n'));
38
+ process.exit(1);
39
+ }
40
+
41
+ // Create pattern entry
42
+ const timestamp = new Date().toISOString().split('T')[0];
43
+ const categoryDisplay = category === 'avoid' ? 'Anti-Pattern to Avoid' :
44
+ category === 'success' ? 'Best Practice' :
45
+ category === 'optimization' ? 'Performance Optimization' :
46
+ category === 'security' ? 'Security Best Practice' :
47
+ category === 'convention' ? 'Convention' :
48
+ 'Best Practice';
49
+
50
+ const patternTemplate = `
51
+
52
+ ---
53
+
54
+ ## Pattern: ${description}
55
+
56
+ **Source:** Feature \`${featureName}\` (${timestamp})
57
+ **Category:** ${categoryDisplay}
58
+ **Date:** ${timestamp}
59
+
60
+ **Problem:**
61
+ [Describe the problem this pattern solves]
62
+
63
+ **Implementation:**
64
+ \`\`\`csharp
65
+ // Add code example here
66
+ \`\`\`
67
+
68
+ **Why:**
69
+ - [Reason 1]
70
+ - [Reason 2]
71
+
72
+ **When to Use:**
73
+ [Describe scenarios where this pattern applies]
74
+
75
+ **Reuse:** [List features/scenarios where this can be reused]
76
+
77
+ ---
78
+ `;
79
+
80
+ // Append to file
81
+ appendFileSync(patternsPath, patternTemplate, 'utf8');
82
+
83
+ console.log(chalk.green(`\n✅ Pattern captured successfully`));
84
+ console.log(chalk.cyan(` Feature: ${featureName}`));
85
+ console.log(chalk.cyan(` Category: ${categoryDisplay}`));
86
+ console.log(chalk.cyan(` Description: ${description}\n`));
87
+
88
+ if (!options.auto) {
89
+ console.log(chalk.bold('📝 Next Steps:'));
90
+ console.log(chalk.gray(`1. Edit ${patternsPath}`));
91
+ console.log(chalk.gray('2. Fill in: Problem, Implementation (code), Why, When to Use'));
92
+ console.log(chalk.gray('3. Add code examples and rationale\n'));
93
+ }
94
+
95
+ // Show location in file
96
+ const content = readFileSync(patternsPath, 'utf8');
97
+ const lines = content.split('\n');
98
+ const patternLine = lines.findIndex(line => line.includes(`Pattern: ${description}`));
99
+
100
+ if (patternLine !== -1) {
101
+ console.log(chalk.gray(`Pattern added at line ${patternLine + 1}`));
102
+ }
103
+
104
+ console.log(chalk.gray(`\nFile: ${patternsPath}\n`));
105
+
106
+ } catch (error) {
107
+ console.error(chalk.red(`\n❌ Error capturing pattern: ${error.message}\n`));
108
+ process.exit(1);
109
+ }
110
+ });
111
+
112
+ // Only parse if run directly (not imported as module)
113
+ if (import.meta.url === `file://${process.argv[1]}`) {
114
+ if (process.argv.length > 2) {
115
+ program.parse(process.argv);
116
+ } else {
117
+ program.help();
118
+ }
119
+ }
120
+
121
+ export default program;
@@ -11,17 +11,20 @@ import ora from 'ora';
11
11
  import chalk from 'chalk';
12
12
  import { logger } from '../utils/logger.js';
13
13
  import { ensureDir, writeFile } from '../utils/file-copier.js';
14
+ import { resolveTemplatesDir } from '../lib/stack-resolver.js';
14
15
 
15
16
  // ============================================================================
16
17
  // Helper Functions
17
18
  // ============================================================================
18
19
 
19
20
  function readTemplate(templateName) {
20
- const templatePath = path.join(process.cwd(), 'node_modules/@polymorphism-tech/morph-spec/content/.morph/templates', templateName);
21
+ // Try npm-installed package path first
22
+ const pkgTemplatesDir = resolveTemplatesDir(path.join(process.cwd(), 'node_modules/@polymorphism-tech/morph-spec'));
23
+ const templatePath = path.join(pkgTemplatesDir, templateName);
21
24
 
22
25
  // Fallback to local if in development
23
26
  if (!fs.existsSync(templatePath)) {
24
- const localPath = path.join(process.cwd(), `content/.morph/templates/${templateName}`);
27
+ const localPath = path.join(resolveTemplatesDir(process.cwd()), templateName);
25
28
  if (fs.existsSync(localPath)) {
26
29
  return fs.readFileSync(localPath, 'utf-8');
27
30
  }