@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
@@ -6,13 +6,15 @@ import { logger } from '../utils/logger.js';
6
6
  import { analyzeRequestComplexity } from '../lib/complexity-analyzer.js';
7
7
  import { LearningSystem } from '../lib/learning-system.js';
8
8
  import { loadStandardsForAgent, getStandardsListForAgent } from '../lib/standards-context-injector.js';
9
+ import { resolveAgentsConfigPath } from '../lib/stack-resolver.js';
9
10
 
10
11
  const __dirname = dirname(fileURLToPath(import.meta.url));
11
- const AGENTS_CONFIG_PATH = join(__dirname, '../../content/.morph/config/agents.json');
12
+ const frameworkRoot = join(__dirname, '..', '..');
12
13
 
13
14
  function loadAgentsConfig() {
14
15
  try {
15
- const content = readFileSync(AGENTS_CONFIG_PATH, 'utf8');
16
+ const configPath = resolveAgentsConfigPath(frameworkRoot);
17
+ const content = readFileSync(configPath, 'utf8');
16
18
  return JSON.parse(content);
17
19
  } catch (err) {
18
20
  logger.error(`Failed to load agents config: ${err.message}`);
@@ -1,149 +1,276 @@
1
- /**
2
- * MORPH-SPEC Generate Command
3
- * CLI wrapper for code generation operations
4
- */
5
-
6
- import { mkdirSync, writeFileSync } from 'fs';
7
- import { dirname } from 'path';
8
- import ora from 'ora';
9
- import chalk from 'chalk';
10
- import { logger } from '../utils/logger.js';
11
- import * as DesignSystemGenerator from '../lib/design-system-generator.js';
12
-
13
- // ============================================================================
14
- // Design System Subcommand
15
- // ============================================================================
16
-
17
- /**
18
- * Generate design system files (CSS + themes) from ui-design-system.md
19
- * @param {string} designSystemPath - Path to ui-design-system.md
20
- * @param {Object} options - CLI options
21
- */
22
- export async function generateDesignSystemCommand(designSystemPath, options) {
23
- if (!designSystemPath) {
24
- logger.error('Design system file path required');
25
- logger.dim(' Usage: morph-spec generate design-system <ui-design-system.md>');
26
- logger.blank();
27
- logger.dim(' Example:');
28
- logger.dim(' morph-spec generate design-system .morph/project/outputs/my-feature/ui-design-system.md');
29
- process.exit(1);
30
- }
31
-
32
- logger.header('MORPH-SPEC Design System Generator');
33
- logger.blank();
34
-
35
- const spinner = ora('Parsing design system...').start();
36
-
37
- try {
38
- // Determine mode
39
- let mode = 'both';
40
- if (options.fluent && !options.mud) mode = 'fluent';
41
- if (options.mud && !options.fluent) mode = 'mud';
42
-
43
- // Generate design system
44
- const generated = DesignSystemGenerator.generateDesignSystem(designSystemPath, {
45
- mode,
46
- namespace: options.namespace || 'YourProject.Themes'
47
- });
48
-
49
- spinner.succeed('Design system parsed!');
50
- logger.blank();
51
-
52
- // Display stats
53
- logger.header('Parsed Design System:');
54
- logger.info(`Primary Colors: ${chalk.cyan(generated.stats.primaryColors)}`);
55
- logger.info(`Neutral Colors: ${chalk.cyan(generated.stats.neutralColors)}`);
56
- logger.info(`Semantic Colors: ${chalk.cyan(generated.stats.semanticColors)}`);
57
- logger.info(`Font Sizes: ${chalk.cyan(generated.stats.fontSizes)}`);
58
- logger.info(`Spacing Values: ${chalk.cyan(generated.stats.spacingValues)}`);
59
- logger.blank();
60
-
61
- if (options.dryRun) {
62
- logger.warn('Dry run - files not written');
63
- logger.blank();
64
- logger.header('Would generate:');
65
- logger.dim(' - wwwroot/css/design-system.css');
66
- if (generated.fluentTheme) logger.dim(' - Themes/FluentDesignTheme.cs');
67
- if (generated.mudTheme) logger.dim(' - Themes/MudDesignTheme.cs');
68
- logger.blank();
69
- return;
70
- }
71
-
72
- // Write files
73
- const writeSpinner = ora('Writing files...').start();
74
-
75
- // Write CSS
76
- const cssPath = options.cssOutput || 'wwwroot/css/design-system.css';
77
- mkdirSync(dirname(cssPath), { recursive: true });
78
- writeFileSync(cssPath, generated.css);
79
- writeSpinner.text = `Created ${cssPath}`;
80
-
81
- // Write Fluent theme
82
- if (generated.fluentTheme) {
83
- const fluentPath = options.fluentOutput || 'Themes/FluentDesignTheme.cs';
84
- mkdirSync(dirname(fluentPath), { recursive: true });
85
- writeFileSync(fluentPath, generated.fluentTheme);
86
- writeSpinner.text = `Created ${fluentPath}`;
87
- }
88
-
89
- // Write MudBlazor theme
90
- if (generated.mudTheme) {
91
- const mudPath = options.mudOutput || 'Themes/MudDesignTheme.cs';
92
- mkdirSync(dirname(mudPath), { recursive: true });
93
- writeFileSync(mudPath, generated.mudTheme);
94
- writeSpinner.text = `Created ${mudPath}`;
95
- }
96
-
97
- writeSpinner.succeed('Files generated!');
98
- logger.blank();
99
-
100
- // List generated files
101
- logger.header('Generated Files:');
102
- logger.success(` ✓ ${cssPath}`);
103
- if (generated.fluentTheme) logger.success(` ✓ ${options.fluentOutput || 'Themes/FluentDesignTheme.cs'}`);
104
- if (generated.mudTheme) logger.success(` ✓ ${options.mudOutput || 'Themes/MudDesignTheme.cs'}`);
105
- logger.blank();
106
-
107
- // Next steps
108
- logger.header('Next Steps:');
109
- logger.dim(' 1. Reference design-system.css in your layout');
110
- logger.dim(' 2. Register theme in Program.cs');
111
- logger.dim(' 3. Apply theme to your components');
112
- logger.blank();
113
-
114
- } catch (error) {
115
- spinner.fail('Generation failed');
116
- logger.error(error.message);
117
- process.exit(1);
118
- }
119
- }
120
-
121
- // ============================================================================
122
- // Main Generate Command (router for future subcommands)
123
- // ============================================================================
124
-
125
- /**
126
- * Main generate command router
127
- * Future: Could add more generation commands here
128
- */
129
- export async function generateCommand(subcommand, args, options) {
130
- switch (subcommand) {
131
- case 'design-system':
132
- await generateDesignSystemCommand(args[0], options);
133
- break;
134
-
135
- // Future: Add more generation commands
136
- // case 'component':
137
- // await generateComponentCommand(args[0], options);
138
- // break;
139
-
140
- default:
141
- logger.error(`Unknown subcommand: ${subcommand}`);
142
- logger.blank();
143
- logger.info('Available subcommands:');
144
- logger.dim(' design-system Generate CSS + theme files from ui-design-system.md');
145
- logger.blank();
146
- logger.dim('Run "morph-spec generate --help" for more information');
147
- process.exit(1);
148
- }
149
- }
1
+ /**
2
+ * MORPH-SPEC Generate Command
3
+ * CLI wrapper for code generation operations
4
+ */
5
+
6
+ import { mkdirSync, writeFileSync } from 'fs';
7
+ import { dirname, join } from 'path';
8
+ import ora from 'ora';
9
+ import chalk from 'chalk';
10
+ import { logger } from '../utils/logger.js';
11
+ import * as DesignSystemGenerator from '../lib/design-system-generator.js';
12
+ import { getFeature } from '../lib/state-manager.js';
13
+ import { extractFeatureMetadata } from '../lib/metadata-extractor.js';
14
+
15
+ // ============================================================================
16
+ // Design System Subcommand
17
+ // ============================================================================
18
+
19
+ /**
20
+ * Generate design system files (CSS + themes) from ui-design-system.md
21
+ * @param {string} designSystemPath - Path to ui-design-system.md
22
+ * @param {Object} options - CLI options
23
+ */
24
+ export async function generateDesignSystemCommand(designSystemPath, options) {
25
+ if (!designSystemPath) {
26
+ logger.error('Design system file path required');
27
+ logger.dim(' Usage: morph-spec generate design-system <ui-design-system.md>');
28
+ logger.blank();
29
+ logger.dim(' Example:');
30
+ logger.dim(' morph-spec generate design-system .morph/project/outputs/my-feature/ui-design-system.md');
31
+ process.exit(1);
32
+ }
33
+
34
+ logger.header('MORPH-SPEC Design System Generator');
35
+ logger.blank();
36
+
37
+ const spinner = ora('Parsing design system...').start();
38
+
39
+ try {
40
+ // Determine mode
41
+ let mode = 'both';
42
+ if (options.fluent && !options.mud) mode = 'fluent';
43
+ if (options.mud && !options.fluent) mode = 'mud';
44
+
45
+ // Generate design system
46
+ const generated = DesignSystemGenerator.generateDesignSystem(designSystemPath, {
47
+ mode,
48
+ namespace: options.namespace || 'YourProject.Themes'
49
+ });
50
+
51
+ spinner.succeed('Design system parsed!');
52
+ logger.blank();
53
+
54
+ // Display stats
55
+ logger.header('Parsed Design System:');
56
+ logger.info(`Primary Colors: ${chalk.cyan(generated.stats.primaryColors)}`);
57
+ logger.info(`Neutral Colors: ${chalk.cyan(generated.stats.neutralColors)}`);
58
+ logger.info(`Semantic Colors: ${chalk.cyan(generated.stats.semanticColors)}`);
59
+ logger.info(`Font Sizes: ${chalk.cyan(generated.stats.fontSizes)}`);
60
+ logger.info(`Spacing Values: ${chalk.cyan(generated.stats.spacingValues)}`);
61
+ logger.blank();
62
+
63
+ if (options.dryRun) {
64
+ logger.warn('Dry run - files not written');
65
+ logger.blank();
66
+ logger.header('Would generate:');
67
+ logger.dim(' - wwwroot/css/design-system.css');
68
+ if (generated.fluentTheme) logger.dim(' - Themes/FluentDesignTheme.cs');
69
+ if (generated.mudTheme) logger.dim(' - Themes/MudDesignTheme.cs');
70
+ logger.blank();
71
+ return;
72
+ }
73
+
74
+ // Write files
75
+ const writeSpinner = ora('Writing files...').start();
76
+
77
+ // Write CSS
78
+ const cssPath = options.cssOutput || 'wwwroot/css/design-system.css';
79
+ mkdirSync(dirname(cssPath), { recursive: true });
80
+ writeFileSync(cssPath, generated.css);
81
+ writeSpinner.text = `Created ${cssPath}`;
82
+
83
+ // Write Fluent theme
84
+ if (generated.fluentTheme) {
85
+ const fluentPath = options.fluentOutput || 'Themes/FluentDesignTheme.cs';
86
+ mkdirSync(dirname(fluentPath), { recursive: true });
87
+ writeFileSync(fluentPath, generated.fluentTheme);
88
+ writeSpinner.text = `Created ${fluentPath}`;
89
+ }
90
+
91
+ // Write MudBlazor theme
92
+ if (generated.mudTheme) {
93
+ const mudPath = options.mudOutput || 'Themes/MudDesignTheme.cs';
94
+ mkdirSync(dirname(mudPath), { recursive: true });
95
+ writeFileSync(mudPath, generated.mudTheme);
96
+ writeSpinner.text = `Created ${mudPath}`;
97
+ }
98
+
99
+ writeSpinner.succeed('Files generated!');
100
+ logger.blank();
101
+
102
+ // List generated files
103
+ logger.header('Generated Files:');
104
+ logger.success(` ✓ ${cssPath}`);
105
+ if (generated.fluentTheme) logger.success(` ✓ ${options.fluentOutput || 'Themes/FluentDesignTheme.cs'}`);
106
+ if (generated.mudTheme) logger.success(` ✓ ${options.mudOutput || 'Themes/MudDesignTheme.cs'}`);
107
+ logger.blank();
108
+
109
+ // Next steps
110
+ logger.header('Next Steps:');
111
+ logger.dim(' 1. Reference design-system.css in your layout');
112
+ logger.dim(' 2. Register theme in Program.cs');
113
+ logger.dim(' 3. Apply theme to your components');
114
+ logger.blank();
115
+
116
+ } catch (error) {
117
+ spinner.fail('Generation failed');
118
+ logger.error(error.message);
119
+ process.exit(1);
120
+ }
121
+ }
122
+
123
+ // ============================================================================
124
+ // Metadata Subcommand
125
+ // ============================================================================
126
+
127
+ /**
128
+ * Generate metadata.json from feature outputs
129
+ * @param {string} featureName - Feature name
130
+ * @param {Object} options - CLI options
131
+ */
132
+ export async function generateMetadataCommand(featureName, options) {
133
+ if (!featureName) {
134
+ logger.error('Feature name required');
135
+ logger.dim(' Usage: morph-spec generate metadata <feature>');
136
+ logger.blank();
137
+ logger.dim(' Example:');
138
+ logger.dim(' morph-spec generate metadata my-feature');
139
+ process.exit(1);
140
+ }
141
+
142
+ logger.header('MORPH-SPEC Metadata Generator');
143
+ logger.blank();
144
+
145
+ const spinner = ora('Extracting metadata...').start();
146
+
147
+ try {
148
+ // Get feature state
149
+ const feature = getFeature(featureName);
150
+ if (!feature) {
151
+ spinner.fail('Feature not found');
152
+ logger.error(`Feature not found: ${featureName}`);
153
+ process.exit(1);
154
+ }
155
+
156
+ // Extract metadata
157
+ const metadata = extractFeatureMetadata(feature);
158
+
159
+ spinner.succeed('Metadata extracted!');
160
+ logger.blank();
161
+
162
+ // Display summary
163
+ logger.header('Feature Summary:');
164
+ logger.info(`Feature: ${chalk.cyan(metadata.feature)}`);
165
+ logger.info(`Phase: ${chalk.cyan(metadata.phase)}`);
166
+ logger.info(`Status: ${chalk.cyan(metadata.status)}`);
167
+
168
+ if (metadata.progress) {
169
+ const progressBar = '█'.repeat(Math.floor(metadata.progress.percentage / 5)) +
170
+ '░'.repeat(20 - Math.floor(metadata.progress.percentage / 5));
171
+ logger.info(`Progress: ${chalk.cyan(`${metadata.progress.completed}/${metadata.progress.total}`)} ${progressBar} ${chalk.cyan(metadata.progress.percentage + '%')}`);
172
+ }
173
+
174
+ logger.info(`Active Agents: ${chalk.cyan(metadata.agents.length)}`);
175
+ logger.info(`Checkpoints: ${chalk.cyan(metadata.checkpoints.length)}`);
176
+ logger.blank();
177
+
178
+ // Show outputs
179
+ logger.header('Outputs Extracted:');
180
+ Object.entries(metadata.outputs).forEach(([type, data]) => {
181
+ if (data.error) {
182
+ logger.error(` ✗ ${type}: ${data.error}`);
183
+ } else {
184
+ logger.success(` ✓ ${type}`);
185
+
186
+ // Show key stats
187
+ if (type === 'spec' && data.summary) {
188
+ logger.dim(` Tags: ${data.summary.tags.join(', ')}`);
189
+ }
190
+ if (type === 'decisions' && data.total) {
191
+ logger.dim(` Decisions: ${data.total} ADRs`);
192
+ }
193
+ if (type === 'tasks' && data.total) {
194
+ logger.dim(` Tasks: ${data.total} (${data.regularTasks} regular + ${data.checkpoints} checkpoints)`);
195
+ }
196
+ }
197
+ });
198
+ logger.blank();
199
+
200
+ if (options.dryRun) {
201
+ logger.warn('Dry run - file not written');
202
+ logger.blank();
203
+ return;
204
+ }
205
+
206
+ // Determine output path
207
+ const outputPath = options.output ||
208
+ join(process.cwd(), `.morph/project/outputs/${featureName}/metadata.json`);
209
+
210
+ // Write metadata
211
+ const writeSpinner = ora('Writing metadata.json...').start();
212
+
213
+ mkdirSync(dirname(outputPath), { recursive: true });
214
+
215
+ const jsonContent = options.pretty !== false
216
+ ? JSON.stringify(metadata, null, 2)
217
+ : JSON.stringify(metadata);
218
+
219
+ writeFileSync(outputPath, jsonContent, 'utf8');
220
+
221
+ writeSpinner.succeed('Metadata generated!');
222
+ logger.blank();
223
+
224
+ logger.success(` ✓ ${outputPath}`);
225
+ logger.blank();
226
+
227
+ // Usage tip
228
+ logger.header('💡 Usage:');
229
+ logger.dim(` cat ${outputPath}`);
230
+ logger.dim(` # Quick status check - no need to read full markdown files`);
231
+ logger.blank();
232
+
233
+ } catch (error) {
234
+ spinner.fail('Generation failed');
235
+ logger.error(error.message);
236
+ if (error.stack) {
237
+ logger.dim(error.stack);
238
+ }
239
+ process.exit(1);
240
+ }
241
+ }
242
+
243
+ // ============================================================================
244
+ // Main Generate Command (router for future subcommands)
245
+ // ============================================================================
246
+
247
+ /**
248
+ * Main generate command router
249
+ * Future: Could add more generation commands here
250
+ */
251
+ export async function generateCommand(subcommand, args, options) {
252
+ switch (subcommand) {
253
+ case 'design-system':
254
+ await generateDesignSystemCommand(args[0], options);
255
+ break;
256
+
257
+ case 'metadata':
258
+ await generateMetadataCommand(args[0], options);
259
+ break;
260
+
261
+ // Future: Add more generation commands
262
+ // case 'component':
263
+ // await generateComponentCommand(args[0], options);
264
+ // break;
265
+
266
+ default:
267
+ logger.error(`Unknown subcommand: ${subcommand}`);
268
+ logger.blank();
269
+ logger.info('Available subcommands:');
270
+ logger.dim(' design-system Generate CSS + theme files from ui-design-system.md');
271
+ logger.dim(' metadata Generate metadata.json from feature outputs');
272
+ logger.blank();
273
+ logger.dim('Run "morph-spec generate --help" for more information');
274
+ process.exit(1);
275
+ }
276
+ }
@@ -18,6 +18,8 @@ import {
18
18
  createDirectoryLink
19
19
  } from '../utils/file-copier.js';
20
20
  import { saveProjectMorphVersion, getInstalledCLIVersion } from '../utils/version-checker.js';
21
+ import { AutoContextOrchestrator } from '../orchestrator.js';
22
+ import { detectClaudeCode } from '../llm/environment-detector.js';
21
23
 
22
24
  export async function initCommand(options) {
23
25
  const targetPath = options.path || process.cwd();
@@ -250,6 +252,41 @@ Run \`morph-spec detect\` to analyze your project.
250
252
 
251
253
  logger.blank();
252
254
 
255
+ // 12. Auto-detect project context (if Claude Code is available and not --skip-detection)
256
+ if (!options.skipDetection && detectClaudeCode()) {
257
+ logger.blank();
258
+ logger.header('Auto-Detecting Project Context');
259
+ logger.dim('Using Claude Code LLM to analyze your project...');
260
+ logger.blank();
261
+
262
+ try {
263
+ const orchestrator = new AutoContextOrchestrator();
264
+ const result = await orchestrator.execute(targetPath, {
265
+ skipReview: false,
266
+ fallbackOnError: true,
267
+ wizardMode: options.wizard || false
268
+ });
269
+
270
+ if (result.success) {
271
+ logger.success('Project context detected and saved to .morph/project.md');
272
+ } else {
273
+ logger.warn('Auto-detection incomplete. Run "morph-spec update" to retry.');
274
+ }
275
+ } catch (error) {
276
+ logger.warn(`Auto-detection failed: ${error.message}`);
277
+ logger.dim('You can run "morph-spec update" later to re-analyze your project.');
278
+ }
279
+ } else if (options.skipDetection) {
280
+ logger.dim('\nSkipped auto-detection (--skip-detection flag)');
281
+ logger.dim('Run "morph-spec update" later to analyze your project.');
282
+ } else {
283
+ logger.warn('\n⚠️ Claude Code not detected');
284
+ logger.dim('Auto-detection requires Claude Code CLI.');
285
+ logger.dim('Run "morph-spec update --wizard" to configure manually.');
286
+ }
287
+
288
+ logger.blank();
289
+
253
290
  } catch (error) {
254
291
  spinner.fail('Installation failed');
255
292
  logger.error(error.message);