@polymorphism-tech/morph-spec 3.0.1 → 3.1.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 (273) hide show
  1. package/CLAUDE.md +52 -88
  2. package/LICENSE +72 -72
  3. package/README.md +198 -76
  4. package/bin/detect-agents.js +3 -1
  5. package/bin/morph-spec.js +10 -0
  6. package/bin/render-template.js +5 -4
  7. package/bin/semantic-detect-agents.js +2 -1
  8. package/bin/{task-manager.js → task-manager.cjs} +12 -1
  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/examples.md +328 -328
  25. package/docs/getting-started.md +3 -3
  26. package/docs/templates.md +418 -418
  27. package/package.json +3 -3
  28. package/scripts/postinstall.js +132 -132
  29. package/scripts/reorganize-skills.cjs +1 -1
  30. package/scripts/validate-agents-structure.cjs +1 -1
  31. package/scripts/validate-skills.cjs +2 -2
  32. package/src/commands/analyze-blazor-concurrency.js +193 -193
  33. package/src/commands/create-story.js +5 -2
  34. package/src/commands/deploy.js +780 -780
  35. package/src/commands/detect-agents.js +4 -2
  36. package/src/commands/generate.js +149 -149
  37. package/src/commands/lint-fluent.js +352 -352
  38. package/src/commands/rollback-phase.js +185 -185
  39. package/src/commands/session-summary.js +291 -291
  40. package/src/commands/shard-spec.js +224 -224
  41. package/src/commands/sprint-status.js +250 -250
  42. package/src/commands/task.js +1 -1
  43. package/src/commands/troubleshoot.js +222 -222
  44. package/src/commands/validate-blazor-state.js +210 -210
  45. package/src/commands/validate-blazor.js +156 -156
  46. package/src/commands/validate-css.js +84 -84
  47. package/src/commands/validate-phase.js +221 -221
  48. package/src/lib/blazor-concurrency-analyzer.js +288 -288
  49. package/src/lib/blazor-state-validator.js +291 -291
  50. package/src/lib/blazor-validator.js +374 -374
  51. package/src/lib/context-generator.js +7 -4
  52. package/src/lib/css-validator.js +352 -352
  53. package/src/lib/design-system-generator.js +298 -298
  54. package/src/lib/hook-executor.js +2 -1
  55. package/src/lib/learning-system.js +520 -520
  56. package/src/lib/mockup-generator.js +366 -366
  57. package/src/lib/stack-resolver.js +148 -0
  58. package/src/lib/standards-context-injector.js +4 -3
  59. package/src/lib/team-orchestrator.js +2 -1
  60. package/src/lib/troubleshoot-grep.js +204 -194
  61. package/src/lib/troubleshoot-index.js +144 -144
  62. package/src/lib/ui-detector.js +350 -350
  63. package/src/lib/validation-runner.js +2 -1
  64. package/src/lib/validators/architecture-validator.js +387 -387
  65. package/src/lib/validators/package-validator.js +360 -360
  66. package/src/lib/validators/ui-contrast-validator.js +422 -422
  67. package/src/utils/file-copier.js +3 -1
  68. package/src/utils/logger.js +32 -32
  69. package/src/utils/version-checker.js +175 -175
  70. package/{content → stacks/blazor-azure}/.azure/README.md +2 -2
  71. package/{content → stacks/blazor-azure}/.azure/pipelines/pipeline-variables.yml +1 -1
  72. package/{content → stacks/blazor-azure}/.azure/pipelines/prod-pipeline.yml +1 -1
  73. package/{content → stacks/blazor-azure}/.azure/pipelines/staging-pipeline.yml +1 -1
  74. package/{content → stacks/blazor-azure}/.claude/commands/morph-preflight.md +227 -227
  75. package/{content → stacks/blazor-azure}/.claude/commands/morph-troubleshoot.md +122 -122
  76. package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-setup.md +1 -1
  77. package/{content → stacks/blazor-azure}/.morph/docs/workflows/enforcement-pipeline.md +3 -3
  78. package/{content → stacks/blazor-azure}/.morph/hooks/README.md +12 -12
  79. package/{content → stacks/blazor-azure}/.morph/standards/agent-teams-workflow.md +2 -2
  80. package/{content → stacks/blazor-azure}/.morph/standards/migration-guide.md +2 -2
  81. package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy-checklist.md +426 -426
  82. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/backend/dotnet-supabase.md +244 -0
  83. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/frontend/nextjs-supabase.md +335 -0
  84. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/infrastructure/easypanel-deployer.md +189 -0
  85. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +170 -0
  86. package/stacks/nextjs-supabase/.morph/config/agents.json +345 -0
  87. package/stacks/nextjs-supabase/.morph/config/config.template.json +92 -0
  88. package/stacks/nextjs-supabase/.morph/docs/easypanel-setup.md +169 -0
  89. package/stacks/nextjs-supabase/.morph/docs/supabase-mcp-setup.md +247 -0
  90. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/README.md +697 -0
  91. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/spec.md +85 -0
  92. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/tasks.md +86 -0
  93. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/README.md +498 -0
  94. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/decisions.md +121 -0
  95. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/spec.md +138 -0
  96. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/tasks.md +162 -0
  97. package/stacks/nextjs-supabase/.morph/project.md +168 -0
  98. package/stacks/nextjs-supabase/.morph/standards/easypanel-deploy.md +191 -0
  99. package/stacks/nextjs-supabase/.morph/standards/nextjs-patterns.md +193 -0
  100. package/stacks/nextjs-supabase/.morph/standards/supabase-auth.md +171 -0
  101. package/stacks/nextjs-supabase/.morph/standards/supabase-pgvector.md +164 -0
  102. package/stacks/nextjs-supabase/.morph/standards/supabase-rls.md +179 -0
  103. package/stacks/nextjs-supabase/.morph/standards/supabase-storage.md +148 -0
  104. package/stacks/nextjs-supabase/.morph/templates/contracts.cs +173 -0
  105. package/stacks/nextjs-supabase/.morph/templates/contracts.ts +168 -0
  106. package/stacks/nextjs-supabase/.morph/templates/decisions.md +115 -0
  107. package/stacks/nextjs-supabase/.morph/templates/dockerfile-api.dockerfile +38 -0
  108. package/stacks/nextjs-supabase/.morph/templates/dockerfile-web.dockerfile +48 -0
  109. package/stacks/nextjs-supabase/.morph/templates/proposal.md +145 -0
  110. package/stacks/nextjs-supabase/.morph/templates/recap.md +134 -0
  111. package/stacks/nextjs-supabase/.morph/templates/rls-policy.sql +57 -0
  112. package/stacks/nextjs-supabase/.morph/templates/spec.md +231 -0
  113. package/stacks/nextjs-supabase/.morph/templates/supabase-migration.sql +100 -0
  114. package/stacks/nextjs-supabase/.morph/templates/tasks.md +257 -0
  115. package/stacks/nextjs-supabase/CLAUDE.md +149 -0
  116. package/stacks/nextjs-supabase/README.md +112 -0
  117. /package/{content → stacks/blazor-azure}/.azure/docs/azure-devops-setup.md +0 -0
  118. /package/{content → stacks/blazor-azure}/.azure/docs/branch-strategy.md +0 -0
  119. /package/{content → stacks/blazor-azure}/.azure/docs/local-development.md +0 -0
  120. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/build-dotnet.yml +0 -0
  121. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-app-service.yml +0 -0
  122. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-container-app.yml +0 -0
  123. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/infra-deploy.yml +0 -0
  124. /package/{content → stacks/blazor-azure}/.claude/commands/morph-apply.md +0 -0
  125. /package/{content → stacks/blazor-azure}/.claude/commands/morph-archive.md +0 -0
  126. /package/{content → stacks/blazor-azure}/.claude/commands/morph-deploy.md +0 -0
  127. /package/{content → stacks/blazor-azure}/.claude/commands/morph-infra.md +0 -0
  128. /package/{content → stacks/blazor-azure}/.claude/commands/morph-proposal.md +0 -0
  129. /package/{content → stacks/blazor-azure}/.claude/commands/morph-status.md +0 -0
  130. /package/{content → stacks/blazor-azure}/.claude/settings.local.json +0 -0
  131. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/README.md +0 -0
  132. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/code-review.md +0 -0
  133. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/morph-checklist.md +0 -0
  134. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/simulation-checklist.md +0 -0
  135. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/README.md +0 -0
  136. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/morph-replicate.md +0 -0
  137. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-clarify.md +0 -0
  138. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-design.md +0 -0
  139. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-tasks.md +0 -0
  140. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-uiux.md +0 -0
  141. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/README.md +0 -0
  142. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +0 -0
  143. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/po-pm-advisor.md +0 -0
  144. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/prompt-engineer.md +0 -0
  145. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/seo-growth-hacker.md +0 -0
  146. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/standards-architect.md +0 -0
  147. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/dotnet-senior.md +0 -0
  148. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ef-modeler.md +0 -0
  149. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +0 -0
  150. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ms-agent-expert.md +0 -0
  151. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/blazor-builder.md +0 -0
  152. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/nextjs-expert.md +0 -0
  153. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +0 -0
  154. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/azure-architect.md +0 -0
  155. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +0 -0
  156. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +0 -0
  157. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/container-specialist.md +0 -0
  158. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +0 -0
  159. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/asaas-financial.md +0 -0
  160. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/azure-identity.md +0 -0
  161. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/clerk-auth.md +0 -0
  162. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/resend-email.md +0 -0
  163. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/code-analyzer.md +0 -0
  164. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/testing-specialist.md +0 -0
  165. /package/{content → stacks/blazor-azure}/.claude/skills/level-3-technologies/README.md +0 -0
  166. /package/{content → stacks/blazor-azure}/.claude/skills/level-4-patterns/README.md +0 -0
  167. /package/{content → stacks/blazor-azure}/.morph/.morphversion +0 -0
  168. /package/{content → stacks/blazor-azure}/.morph/archive/.gitkeep +0 -0
  169. /package/{content → stacks/blazor-azure}/.morph/config/agents.json +0 -0
  170. /package/{content → stacks/blazor-azure}/.morph/config/config.template.json +0 -0
  171. /package/{content → stacks/blazor-azure}/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +0 -0
  172. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/design-impl.md +0 -0
  173. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/fast-track.md +0 -0
  174. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/full-morph.md +0 -0
  175. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/standard.md +0 -0
  176. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/ui-refresh.md +0 -0
  177. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/README.md +0 -0
  178. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/contracts.ts +0 -0
  179. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/spec.md +0 -0
  180. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/tasks.md +0 -0
  181. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/README.md +0 -0
  182. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/contracts.cs +0 -0
  183. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/decisions.md +0 -0
  184. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/spec.md +0 -0
  185. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/tasks.md +0 -0
  186. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/README.md +0 -0
  187. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/contracts.cs +0 -0
  188. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/spec.md +0 -0
  189. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/tasks.md +0 -0
  190. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/decisions.md +0 -0
  191. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/proposal.md +0 -0
  192. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/spec.md +0 -0
  193. /package/{content → stacks/blazor-azure}/.morph/examples/state-v3.json +0 -0
  194. /package/{content → stacks/blazor-azure}/.morph/features/.gitkeep +0 -0
  195. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-agents.sh +0 -0
  196. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-all.sh +0 -0
  197. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-specs.sh +0 -0
  198. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-tests.sh +0 -0
  199. /package/{content → stacks/blazor-azure}/.morph/hooks/task-completed.js +0 -0
  200. /package/{content → stacks/blazor-azure}/.morph/hooks/teammate-idle.js +0 -0
  201. /package/{content → stacks/blazor-azure}/.morph/project.md +0 -0
  202. /package/{content → stacks/blazor-azure}/.morph/schemas/agent.schema.json +0 -0
  203. /package/{content → stacks/blazor-azure}/.morph/schemas/tasks.schema.json +0 -0
  204. /package/{content → stacks/blazor-azure}/.morph/specs/.gitkeep +0 -0
  205. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-blazor-ui.md +0 -0
  206. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-production.md +0 -0
  207. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-setup.md +0 -0
  208. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-workflows.md +0 -0
  209. /package/{content → stacks/blazor-azure}/.morph/standards/architecture.md +0 -0
  210. /package/{content → stacks/blazor-azure}/.morph/standards/azure.md +0 -0
  211. /package/{content → stacks/blazor-azure}/.morph/standards/coding.md +0 -0
  212. /package/{content → stacks/blazor-azure}/.morph/standards/dotnet10-migration.md +0 -0
  213. /package/{content → stacks/blazor-azure}/.morph/standards/fluent-ui-setup.md +0 -0
  214. /package/{content → stacks/blazor-azure}/.morph/standards/passkeys-auth.md +0 -0
  215. /package/{content → stacks/blazor-azure}/.morph/standards/vector-search-rag.md +0 -0
  216. /package/{content → stacks/blazor-azure}/.morph/state.json +0 -0
  217. /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT-FEATURE.md +0 -0
  218. /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT.md +0 -0
  219. /package/{content → stacks/blazor-azure}/.morph/templates/FluentDesignTheme.cs +0 -0
  220. /package/{content → stacks/blazor-azure}/.morph/templates/MudTheme.cs +0 -0
  221. /package/{content → stacks/blazor-azure}/.morph/templates/agent.cs +0 -0
  222. /package/{content → stacks/blazor-azure}/.morph/templates/clarify-questions.md +0 -0
  223. /package/{content → stacks/blazor-azure}/.morph/templates/component.razor +0 -0
  224. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Commands.cs +0 -0
  225. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Entities.cs +0 -0
  226. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Queries.cs +0 -0
  227. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/README.md +0 -0
  228. /package/{content → stacks/blazor-azure}/.morph/templates/contracts.cs +0 -0
  229. /package/{content → stacks/blazor-azure}/.morph/templates/decisions.md +0 -0
  230. /package/{content → stacks/blazor-azure}/.morph/templates/design-system.css +0 -0
  231. /package/{content → stacks/blazor-azure}/.morph/templates/infra/.dockerignore.example +0 -0
  232. /package/{content → stacks/blazor-azure}/.morph/templates/infra/Dockerfile.example +0 -0
  233. /package/{content → stacks/blazor-azure}/.morph/templates/infra/README.md +0 -0
  234. /package/{content → stacks/blazor-azure}/.morph/templates/infra/app-insights.bicep +0 -0
  235. /package/{content → stacks/blazor-azure}/.morph/templates/infra/app-service.bicep +0 -0
  236. /package/{content → stacks/blazor-azure}/.morph/templates/infra/azure-pipelines-deploy.yml +0 -0
  237. /package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app-env.bicep +0 -0
  238. /package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app.bicep +0 -0
  239. /package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.ps1 +0 -0
  240. /package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.sh +0 -0
  241. /package/{content → stacks/blazor-azure}/.morph/templates/infra/key-vault.bicep +0 -0
  242. /package/{content → stacks/blazor-azure}/.morph/templates/infra/main.bicep +0 -0
  243. /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.dev.json +0 -0
  244. /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.prod.json +0 -0
  245. /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.staging.json +0 -0
  246. /package/{content → stacks/blazor-azure}/.morph/templates/infra/sql-database.bicep +0 -0
  247. /package/{content → stacks/blazor-azure}/.morph/templates/infra/storage.bicep +0 -0
  248. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-client.cs +0 -0
  249. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-webhook.cs +0 -0
  250. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/azure-identity-config.cs +0 -0
  251. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/clerk-config.cs +0 -0
  252. /package/{content → stacks/blazor-azure}/.morph/templates/job.cs +0 -0
  253. /package/{content → stacks/blazor-azure}/.morph/templates/migration.cs +0 -0
  254. /package/{content → stacks/blazor-azure}/.morph/templates/proposal.md +0 -0
  255. /package/{content → stacks/blazor-azure}/.morph/templates/recap.md +0 -0
  256. /package/{content → stacks/blazor-azure}/.morph/templates/repository.cs +0 -0
  257. /package/{content → stacks/blazor-azure}/.morph/templates/saas/subscription.cs +0 -0
  258. /package/{content → stacks/blazor-azure}/.morph/templates/saas/tenant.cs +0 -0
  259. /package/{content → stacks/blazor-azure}/.morph/templates/service.cs +0 -0
  260. /package/{content → stacks/blazor-azure}/.morph/templates/simulation.md +0 -0
  261. /package/{content → stacks/blazor-azure}/.morph/templates/spec.md +0 -0
  262. /package/{content → stacks/blazor-azure}/.morph/templates/sprint-status.yaml +0 -0
  263. /package/{content → stacks/blazor-azure}/.morph/templates/state.template.json +0 -0
  264. /package/{content → stacks/blazor-azure}/.morph/templates/story.md +0 -0
  265. /package/{content → stacks/blazor-azure}/.morph/templates/tasks.md +0 -0
  266. /package/{content → stacks/blazor-azure}/.morph/templates/test.cs +0 -0
  267. /package/{content → stacks/blazor-azure}/.morph/templates/ui-components.md +0 -0
  268. /package/{content → stacks/blazor-azure}/.morph/templates/ui-design-system.md +0 -0
  269. /package/{content → stacks/blazor-azure}/.morph/templates/ui-flows.md +0 -0
  270. /package/{content → stacks/blazor-azure}/.morph/templates/ui-mockups.md +0 -0
  271. /package/{content → stacks/blazor-azure}/.morph/test-infra/example.bicep +0 -0
  272. /package/{content → stacks/blazor-azure}/CLAUDE.md +0 -0
  273. /package/{content → stacks/blazor-azure}/README.md +0 -0
@@ -1,224 +1,224 @@
1
- /**
2
- * MORPH-SPEC Document Sharding
3
- * Splits large spec.md files into manageable shards (BMAD-inspired)
4
- * Achieves 90% token savings by loading only relevant sections
5
- */
6
-
7
- import fs from 'fs';
8
- import path from 'path';
9
- import ora from 'ora';
10
- import chalk from 'chalk';
11
- import { logger } from '../utils/logger.js';
12
- import { ensureDir, writeFile } from '../utils/file-copier.js';
13
-
14
- // ============================================================================
15
- // Helper Functions
16
- // ============================================================================
17
-
18
- function parseSpec(specContent) {
19
- const sections = [];
20
- const lines = specContent.split('\n');
21
-
22
- let currentSection = null;
23
- let currentContent = [];
24
-
25
- for (const line of lines) {
26
- // Detect level 2 heading (## Heading)
27
- if (line.match(/^## /)) {
28
- // Save previous section
29
- if (currentSection) {
30
- sections.push({
31
- title: currentSection,
32
- slug: toSlug(currentSection),
33
- content: currentContent.join('\n').trim(),
34
- });
35
- }
36
-
37
- // Start new section
38
- currentSection = line.replace(/^## /, '').trim();
39
- currentContent = [line]; // Include heading in content
40
- } else {
41
- currentContent.push(line);
42
- }
43
- }
44
-
45
- // Save last section
46
- if (currentSection) {
47
- sections.push({
48
- title: currentSection,
49
- slug: toSlug(currentSection),
50
- content: currentContent.join('\n').trim(),
51
- });
52
- }
53
-
54
- return sections;
55
- }
56
-
57
- function toSlug(title) {
58
- return title
59
- .toLowerCase()
60
- .replace(/[^a-z0-9]+/g, '-')
61
- .replace(/^-|-$/g, '');
62
- }
63
-
64
- function generateIndex(sections, featureName) {
65
- let index = `# ${toTitleCase(featureName)} - Technical Specification\n\n`;
66
- index += `> **Sharded Spec:** This spec has been split into sections for optimal token usage\n`;
67
- index += `> **BMAD Pattern:** Load only the section you need during implementation\n\n`;
68
- index += `---\n\n`;
69
- index += `## 📋 Table of Contents\n\n`;
70
-
71
- sections.forEach((section, i) => {
72
- index += `${i + 1}. **[${section.title}](${section.slug}.md)**\n`;
73
-
74
- // Add first 100 chars as description
75
- const firstLine = section.content.split('\n').find(l => l.trim() && !l.startsWith('#'));
76
- const description = firstLine ? firstLine.substring(0, 100) + '...' : 'See section for details';
77
- index += ` > ${description}\n\n`;
78
- });
79
-
80
- index += `---\n\n`;
81
- index += `## 💡 How to Use Sharded Specs\n\n`;
82
- index += `### In Planning Phases (1-3)\n`;
83
- index += `Load **all sections** to get complete context:\n`;
84
- index += `\`\`\`bash\n`;
85
- index += `# Read index.md + all section files\n`;
86
- index += `\`\`\`\n\n`;
87
-
88
- index += `### In Implementation Phase (4)\n`;
89
- index += `Load **only the relevant section** for your current story:\n`;
90
- index += `\`\`\`bash\n`;
91
- index += `# Example: Working on entity design story\n`;
92
- index += `# Read: spec/index.md + spec/entity-design.md (not the other 10 sections!)\n`;
93
- index += `\`\`\`\n\n`;
94
-
95
- index += `**Token Savings:** For a 10-section spec (30k tokens), selective loading = **90% savings**\n\n`;
96
- index += `---\n\n`;
97
- index += `*Generated by MORPH-SPEC Framework - Document Sharding*\n`;
98
- index += `*Inspired by BMAD Method: 90% token reduction for large specs*\n`;
99
-
100
- return index;
101
- }
102
-
103
- function toTitleCase(str) {
104
- return str
105
- .split('-')
106
- .map(word => word.charAt(0).toUpperCase() + word.slice(1))
107
- .join(' ');
108
- }
109
-
110
- function estimateTokens(text) {
111
- // Rough estimate: 1 token ≈ 4 characters
112
- return Math.ceil(text.length / 4);
113
- }
114
-
115
- // ============================================================================
116
- // Command Function
117
- // ============================================================================
118
-
119
- export async function shardSpecCommand(feature, options) {
120
- logger.header('MORPH-SPEC Document Sharding');
121
- logger.dim(`Feature: ${feature}`);
122
- logger.blank();
123
-
124
- const spinner = ora('Analyzing spec.md...').start();
125
-
126
- try {
127
- // Find spec.md
128
- const specPath = path.join(process.cwd(), `.morph/project/outputs/${feature}/spec.md`);
129
- if (!fs.existsSync(specPath)) {
130
- throw new Error(`Spec not found: ${specPath}`);
131
- }
132
-
133
- // Read spec content
134
- const specContent = fs.readFileSync(specPath, 'utf-8');
135
- const totalTokens = estimateTokens(specContent);
136
-
137
- spinner.info(`Original spec.md: ~${totalTokens.toLocaleString()} tokens`);
138
- logger.blank();
139
-
140
- // Parse into sections
141
- const sections = parseSpec(specContent);
142
-
143
- if (sections.length < 3) {
144
- spinner.warn(`Spec has only ${sections.length} sections - sharding not recommended`);
145
- logger.dim(' Sharding is most beneficial for specs with 5+ sections');
146
- return;
147
- }
148
-
149
- spinner.succeed(`Detected ${sections.length} sections`);
150
- logger.blank();
151
-
152
- // Generate index
153
- const indexContent = generateIndex(sections, feature);
154
-
155
- // Calculate savings
156
- const avgShardTokens = sections.reduce((sum, s) => sum + estimateTokens(s.content), 0) / sections.length;
157
- const savingsPercent = Math.round(((totalTokens - avgShardTokens) / totalTokens) * 100);
158
-
159
- logger.header('Token Savings (selective load):');
160
- logger.info(` ${chalk.green(`~${savingsPercent}%`)} reduction`);
161
- logger.dim(` - Full load: ~${totalTokens.toLocaleString()} tokens`);
162
- logger.dim(` - Selective load: ~${Math.round(avgShardTokens).toLocaleString()} tokens (index + 1 shard)`);
163
- logger.blank();
164
-
165
- if (options.verbose) {
166
- logger.header('Shard Details:');
167
- logger.blank();
168
- sections.forEach((section, i) => {
169
- const tokens = estimateTokens(section.content);
170
- logger.dim(` ${i + 1}. ${section.title}`);
171
- logger.dim(` File: ${section.slug}.md`);
172
- logger.dim(` Tokens: ~${tokens.toLocaleString()}`);
173
- logger.blank();
174
- });
175
- }
176
-
177
- // Output
178
- const outputDir = path.join(process.cwd(), `.morph/project/outputs/${feature}/spec`);
179
-
180
- if (options.dryRun) {
181
- logger.header('DRY RUN - Would create:');
182
- logger.dim(` ${outputDir}/index.md`);
183
- sections.forEach(s => logger.dim(` ${outputDir}/${s.slug}.md`));
184
- logger.blank();
185
- logger.success('Run without --dry-run to create files');
186
- } else {
187
- const createSpinner = ora('Creating sharded spec files...').start();
188
-
189
- // Create directory
190
- await ensureDir(outputDir);
191
-
192
- // Write index
193
- await writeFile(path.join(outputDir, 'index.md'), indexContent);
194
- createSpinner.text = 'Created index.md';
195
-
196
- // Write shards
197
- for (const section of sections) {
198
- const shardPath = path.join(outputDir, `${section.slug}.md`);
199
- await writeFile(shardPath, section.content);
200
- createSpinner.text = `Created ${section.slug}.md`;
201
- }
202
-
203
- createSpinner.succeed('Sharded spec created!');
204
- logger.blank();
205
-
206
- // Archive original spec.md
207
- const archivePath = specPath.replace('.md', '.original.md');
208
- fs.renameSync(specPath, archivePath);
209
- logger.dim(' Archived original: spec.original.md');
210
- logger.blank();
211
-
212
- logger.header('Next steps:');
213
- logger.dim(` 1. Review sharded spec in .morph/project/outputs/${feature}/spec/`);
214
- logger.dim(` 2. Create stories: morph-spec story create ${feature} SR-001`);
215
- logger.dim(' 3. Stories will auto-load only relevant shards (90% token savings)');
216
- logger.blank();
217
- }
218
-
219
- } catch (error) {
220
- spinner.fail('Sharding failed');
221
- logger.error(error.message);
222
- process.exit(1);
223
- }
224
- }
1
+ /**
2
+ * MORPH-SPEC Document Sharding
3
+ * Splits large spec.md files into manageable shards (BMAD-inspired)
4
+ * Achieves 90% token savings by loading only relevant sections
5
+ */
6
+
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import ora from 'ora';
10
+ import chalk from 'chalk';
11
+ import { logger } from '../utils/logger.js';
12
+ import { ensureDir, writeFile } from '../utils/file-copier.js';
13
+
14
+ // ============================================================================
15
+ // Helper Functions
16
+ // ============================================================================
17
+
18
+ function parseSpec(specContent) {
19
+ const sections = [];
20
+ const lines = specContent.split('\n');
21
+
22
+ let currentSection = null;
23
+ let currentContent = [];
24
+
25
+ for (const line of lines) {
26
+ // Detect level 2 heading (## Heading)
27
+ if (line.match(/^## /)) {
28
+ // Save previous section
29
+ if (currentSection) {
30
+ sections.push({
31
+ title: currentSection,
32
+ slug: toSlug(currentSection),
33
+ content: currentContent.join('\n').trim(),
34
+ });
35
+ }
36
+
37
+ // Start new section
38
+ currentSection = line.replace(/^## /, '').trim();
39
+ currentContent = [line]; // Include heading in content
40
+ } else {
41
+ currentContent.push(line);
42
+ }
43
+ }
44
+
45
+ // Save last section
46
+ if (currentSection) {
47
+ sections.push({
48
+ title: currentSection,
49
+ slug: toSlug(currentSection),
50
+ content: currentContent.join('\n').trim(),
51
+ });
52
+ }
53
+
54
+ return sections;
55
+ }
56
+
57
+ function toSlug(title) {
58
+ return title
59
+ .toLowerCase()
60
+ .replace(/[^a-z0-9]+/g, '-')
61
+ .replace(/^-|-$/g, '');
62
+ }
63
+
64
+ function generateIndex(sections, featureName) {
65
+ let index = `# ${toTitleCase(featureName)} - Technical Specification\n\n`;
66
+ index += `> **Sharded Spec:** This spec has been split into sections for optimal token usage\n`;
67
+ index += `> **BMAD Pattern:** Load only the section you need during implementation\n\n`;
68
+ index += `---\n\n`;
69
+ index += `## 📋 Table of Contents\n\n`;
70
+
71
+ sections.forEach((section, i) => {
72
+ index += `${i + 1}. **[${section.title}](${section.slug}.md)**\n`;
73
+
74
+ // Add first 100 chars as description
75
+ const firstLine = section.content.split('\n').find(l => l.trim() && !l.startsWith('#'));
76
+ const description = firstLine ? firstLine.substring(0, 100) + '...' : 'See section for details';
77
+ index += ` > ${description}\n\n`;
78
+ });
79
+
80
+ index += `---\n\n`;
81
+ index += `## 💡 How to Use Sharded Specs\n\n`;
82
+ index += `### In Planning Phases (1-3)\n`;
83
+ index += `Load **all sections** to get complete context:\n`;
84
+ index += `\`\`\`bash\n`;
85
+ index += `# Read index.md + all section files\n`;
86
+ index += `\`\`\`\n\n`;
87
+
88
+ index += `### In Implementation Phase (4)\n`;
89
+ index += `Load **only the relevant section** for your current story:\n`;
90
+ index += `\`\`\`bash\n`;
91
+ index += `# Example: Working on entity design story\n`;
92
+ index += `# Read: spec/index.md + spec/entity-design.md (not the other 10 sections!)\n`;
93
+ index += `\`\`\`\n\n`;
94
+
95
+ index += `**Token Savings:** For a 10-section spec (30k tokens), selective loading = **90% savings**\n\n`;
96
+ index += `---\n\n`;
97
+ index += `*Generated by MORPH-SPEC Framework - Document Sharding*\n`;
98
+ index += `*Inspired by BMAD Method: 90% token reduction for large specs*\n`;
99
+
100
+ return index;
101
+ }
102
+
103
+ function toTitleCase(str) {
104
+ return str
105
+ .split('-')
106
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
107
+ .join(' ');
108
+ }
109
+
110
+ function estimateTokens(text) {
111
+ // Rough estimate: 1 token ≈ 4 characters
112
+ return Math.ceil(text.length / 4);
113
+ }
114
+
115
+ // ============================================================================
116
+ // Command Function
117
+ // ============================================================================
118
+
119
+ export async function shardSpecCommand(feature, options) {
120
+ logger.header('MORPH-SPEC Document Sharding');
121
+ logger.dim(`Feature: ${feature}`);
122
+ logger.blank();
123
+
124
+ const spinner = ora('Analyzing spec.md...').start();
125
+
126
+ try {
127
+ // Find spec.md
128
+ const specPath = path.join(process.cwd(), `.morph/project/outputs/${feature}/spec.md`);
129
+ if (!fs.existsSync(specPath)) {
130
+ throw new Error(`Spec not found: ${specPath}`);
131
+ }
132
+
133
+ // Read spec content
134
+ const specContent = fs.readFileSync(specPath, 'utf-8');
135
+ const totalTokens = estimateTokens(specContent);
136
+
137
+ spinner.info(`Original spec.md: ~${totalTokens.toLocaleString()} tokens`);
138
+ logger.blank();
139
+
140
+ // Parse into sections
141
+ const sections = parseSpec(specContent);
142
+
143
+ if (sections.length < 3) {
144
+ spinner.warn(`Spec has only ${sections.length} sections - sharding not recommended`);
145
+ logger.dim(' Sharding is most beneficial for specs with 5+ sections');
146
+ return;
147
+ }
148
+
149
+ spinner.succeed(`Detected ${sections.length} sections`);
150
+ logger.blank();
151
+
152
+ // Generate index
153
+ const indexContent = generateIndex(sections, feature);
154
+
155
+ // Calculate savings
156
+ const avgShardTokens = sections.reduce((sum, s) => sum + estimateTokens(s.content), 0) / sections.length;
157
+ const savingsPercent = Math.round(((totalTokens - avgShardTokens) / totalTokens) * 100);
158
+
159
+ logger.header('Token Savings (selective load):');
160
+ logger.info(` ${chalk.green(`~${savingsPercent}%`)} reduction`);
161
+ logger.dim(` - Full load: ~${totalTokens.toLocaleString()} tokens`);
162
+ logger.dim(` - Selective load: ~${Math.round(avgShardTokens).toLocaleString()} tokens (index + 1 shard)`);
163
+ logger.blank();
164
+
165
+ if (options.verbose) {
166
+ logger.header('Shard Details:');
167
+ logger.blank();
168
+ sections.forEach((section, i) => {
169
+ const tokens = estimateTokens(section.content);
170
+ logger.dim(` ${i + 1}. ${section.title}`);
171
+ logger.dim(` File: ${section.slug}.md`);
172
+ logger.dim(` Tokens: ~${tokens.toLocaleString()}`);
173
+ logger.blank();
174
+ });
175
+ }
176
+
177
+ // Output
178
+ const outputDir = path.join(process.cwd(), `.morph/project/outputs/${feature}/spec`);
179
+
180
+ if (options.dryRun) {
181
+ logger.header('DRY RUN - Would create:');
182
+ logger.dim(` ${outputDir}/index.md`);
183
+ sections.forEach(s => logger.dim(` ${outputDir}/${s.slug}.md`));
184
+ logger.blank();
185
+ logger.success('Run without --dry-run to create files');
186
+ } else {
187
+ const createSpinner = ora('Creating sharded spec files...').start();
188
+
189
+ // Create directory
190
+ await ensureDir(outputDir);
191
+
192
+ // Write index
193
+ await writeFile(path.join(outputDir, 'index.md'), indexContent);
194
+ createSpinner.text = 'Created index.md';
195
+
196
+ // Write shards
197
+ for (const section of sections) {
198
+ const shardPath = path.join(outputDir, `${section.slug}.md`);
199
+ await writeFile(shardPath, section.content);
200
+ createSpinner.text = `Created ${section.slug}.md`;
201
+ }
202
+
203
+ createSpinner.succeed('Sharded spec created!');
204
+ logger.blank();
205
+
206
+ // Archive original spec.md
207
+ const archivePath = specPath.replace('.md', '.original.md');
208
+ fs.renameSync(specPath, archivePath);
209
+ logger.dim(' Archived original: spec.original.md');
210
+ logger.blank();
211
+
212
+ logger.header('Next steps:');
213
+ logger.dim(` 1. Review sharded spec in .morph/project/outputs/${feature}/spec/`);
214
+ logger.dim(` 2. Create stories: morph-spec story create ${feature} SR-001`);
215
+ logger.dim(' 3. Stories will auto-load only relevant shards (90% token savings)');
216
+ logger.blank();
217
+ }
218
+
219
+ } catch (error) {
220
+ spinner.fail('Sharding failed');
221
+ logger.error(error.message);
222
+ process.exit(1);
223
+ }
224
+ }