@polymorphism-tech/morph-spec 3.2.0 → 4.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 (319) hide show
  1. package/CLAUDE.md +352 -7
  2. package/README.md +1 -14
  3. package/bin/detect-agents.js +1 -1
  4. package/bin/morph-spec.js +122 -34
  5. package/bin/validate.js +1 -1
  6. package/docs/getting-started.md +0 -5
  7. package/docs/v3.0/AGENTS.md +521 -0
  8. package/docs/v3.0/ANALYSIS.md +555 -0
  9. package/docs/v3.0/ARCHITECTURE.md +436 -0
  10. package/docs/v3.0/EXECUTION-FLOW.md +1304 -0
  11. package/docs/v3.0/FEATURES.md +688 -0
  12. package/docs/v3.0/README.md +231 -0
  13. package/docs/v3.0/ROADMAP.md +801 -0
  14. package/docs/validation-checklist.md +0 -1
  15. package/package.json +1 -1
  16. package/src/commands/agents/index.js +4 -0
  17. package/src/commands/{spawn-team.js → agents/spawn-team.js} +172 -172
  18. package/src/commands/{create-story.js → feature/create-story.js} +357 -354
  19. package/src/commands/feature/index.js +6 -0
  20. package/src/commands/{shard-spec.js → feature/shard-spec.js} +2 -2
  21. package/src/commands/{sprint-status.js → feature/sprint-status.js} +1 -1
  22. package/src/commands/{generate-context.js → generation/generate-context.js} +40 -40
  23. package/src/commands/{generate.js → generation/generate.js} +4 -4
  24. package/src/commands/generation/index.js +5 -0
  25. package/src/commands/index.js +16 -0
  26. package/src/commands/{capture-pattern.js → learning/capture-pattern.js} +121 -121
  27. package/src/commands/learning/index.js +5 -0
  28. package/src/commands/{detect-agents.js → project/detect-agents.js} +178 -178
  29. package/src/commands/project/detect-workflow.js +174 -0
  30. package/src/commands/{detect.js → project/detect.js} +104 -104
  31. package/src/commands/{doctor.js → project/doctor.js} +356 -356
  32. package/src/commands/project/index.js +10 -0
  33. package/src/commands/{init.js → project/init.js} +305 -295
  34. package/src/commands/{sync.js → project/sync.js} +167 -167
  35. package/src/commands/{update.js → project/update.js} +240 -240
  36. package/src/commands/{advance-phase.js → state/advance-phase.js} +416 -357
  37. package/src/commands/{approve.js → state/approve.js} +221 -221
  38. package/src/commands/state/index.js +8 -0
  39. package/src/commands/{rollback-phase.js → state/rollback-phase.js} +185 -185
  40. package/src/commands/{state.js → state/state.js} +334 -334
  41. package/src/commands/{validate-phase.js → state/validate-phase.js} +221 -221
  42. package/src/commands/tasks/index.js +4 -0
  43. package/src/commands/{task.js → tasks/task.js} +78 -78
  44. package/src/commands/templates/index.js +8 -0
  45. package/src/commands/templates/template-customize.js +101 -0
  46. package/src/commands/templates/template-list.js +128 -0
  47. package/src/commands/templates/template-render.js +95 -0
  48. package/src/commands/templates/template-show.js +131 -0
  49. package/src/commands/templates/template-validate.js +91 -0
  50. package/src/commands/utils/index.js +7 -0
  51. package/src/commands/{session-summary.js → utils/session-summary.js} +291 -291
  52. package/src/commands/{troubleshoot.js → utils/troubleshoot.js} +222 -222
  53. package/src/commands/{analyze-blazor-concurrency.js → validation/analyze-blazor-concurrency.js} +193 -193
  54. package/src/commands/validation/index.js +8 -0
  55. package/src/commands/{lint-fluent.js → validation/lint-fluent.js} +352 -352
  56. package/src/commands/{validate-blazor-state.js → validation/validate-blazor-state.js} +210 -210
  57. package/src/commands/{validate-blazor.js → validation/validate-blazor.js} +156 -156
  58. package/src/commands/{validate-css.js → validation/validate-css.js} +84 -84
  59. package/src/core/index.js +10 -0
  60. package/src/core/registry/command-registry.js +302 -0
  61. package/src/core/registry/index.js +8 -0
  62. package/src/core/registry/validator-registry.js +204 -0
  63. package/src/core/state/index.js +8 -0
  64. package/src/{lib → core/state}/phase-state-machine.js +214 -214
  65. package/src/{lib → core/state}/state-manager.js +572 -534
  66. package/src/core/templates/index.js +9 -0
  67. package/src/core/templates/template-registry.js +335 -0
  68. package/src/core/templates/template-renderer.js +477 -0
  69. package/src/core/templates/template-validator.js +296 -0
  70. package/src/core/workflows/index.js +7 -0
  71. package/src/core/workflows/workflow-detector.js +354 -0
  72. package/src/lib/{complexity-analyzer.js → analysis/complexity-analyzer.js} +441 -441
  73. package/src/lib/analysis/index.js +7 -0
  74. package/src/lib/{checkpoint-hooks.js → checkpoints/checkpoint-hooks.js} +258 -258
  75. package/src/lib/checkpoints/index.js +7 -0
  76. package/src/lib/detectors/config-detector.js +223 -223
  77. package/src/lib/detectors/conversation-analyzer.js +163 -163
  78. package/src/lib/{design-system-detector.js → detectors/design-system-detector.js} +187 -187
  79. package/src/lib/detectors/index.js +87 -84
  80. package/src/lib/detectors/standards-generator.js +275 -275
  81. package/src/lib/detectors/structure-detector.js +245 -245
  82. package/src/lib/{context-generator.js → generators/context-generator.js} +526 -516
  83. package/src/lib/generators/index.js +10 -0
  84. package/src/lib/{metadata-extractor.js → generators/metadata-extractor.js} +387 -380
  85. package/src/lib/{recap-generator.js → generators/recap-generator.js} +205 -205
  86. package/src/lib/learning/index.js +7 -0
  87. package/src/lib/orchestration/index.js +7 -0
  88. package/src/lib/{team-orchestrator.js → orchestration/team-orchestrator.js} +323 -323
  89. package/src/lib/stacks/index.js +7 -0
  90. package/src/lib/{stack-resolver.js → stacks/stack-resolver.js} +180 -148
  91. package/src/lib/standards/index.js +7 -0
  92. package/src/lib/{standards-context-injector.js → standards/standards-context-injector.js} +298 -288
  93. package/src/lib/troubleshooting/index.js +8 -0
  94. package/src/lib/{troubleshoot-grep.js → troubleshooting/troubleshoot-grep.js} +204 -204
  95. package/src/lib/{troubleshoot-index.js → troubleshooting/troubleshoot-index.js} +144 -144
  96. package/src/lib/validators/architecture/architecture-validator.js +387 -0
  97. package/src/lib/validators/architecture/index.js +7 -0
  98. package/src/lib/validators/architecture-validator.js +40 -367
  99. package/src/lib/{blazor-concurrency-analyzer.js → validators/blazor/blazor-concurrency-analyzer.js} +277 -288
  100. package/src/lib/{blazor-state-validator.js → validators/blazor/blazor-state-validator.js} +279 -291
  101. package/src/lib/{blazor-validator.js → validators/blazor/blazor-validator.js} +369 -374
  102. package/src/lib/validators/blazor/index.js +9 -0
  103. package/src/lib/validators/content/content-validator.js +351 -0
  104. package/src/lib/validators/content/index.js +7 -0
  105. package/src/lib/validators/content-validator.js +164 -351
  106. package/src/lib/validators/{contract-compliance-validator.js → contracts/contract-compliance-validator.js} +273 -273
  107. package/src/lib/validators/contracts/index.js +7 -0
  108. package/src/lib/{css-validator.js → validators/css/css-validator.js} +352 -352
  109. package/src/lib/validators/css/index.js +7 -0
  110. package/src/lib/validators/{design-system-validator.js → design-system/design-system-validator.js} +231 -231
  111. package/src/lib/validators/design-system/index.js +7 -0
  112. package/src/lib/validators/package-validator.js +41 -340
  113. package/src/lib/validators/packages/index.js +7 -0
  114. package/src/lib/validators/packages/package-validator.js +360 -0
  115. package/src/lib/validators/shared/index.js +12 -0
  116. package/src/lib/validators/shared/issue-counter.js +18 -0
  117. package/src/lib/validators/shared/result-formatter.js +124 -0
  118. package/src/lib/{spec-validator.js → validators/spec-validator.js} +258 -258
  119. package/src/lib/validators/ui/index.js +7 -0
  120. package/src/lib/validators/ui/ui-contrast-validator.js +422 -0
  121. package/src/lib/validators/ui-contrast-validator.js +31 -409
  122. package/src/lib/{validation-runner.js → validators/validation-runner.js} +286 -284
  123. package/src/ui/wizard-questions.js +0 -2
  124. package/src/utils/color-utils.js +70 -0
  125. package/src/utils/file-copier.js +188 -189
  126. package/src/utils/process-handler.js +97 -0
  127. package/stacks/blazor-azure/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +3 -3
  128. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/api-designer.md +59 -0
  129. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/dotnet-senior.md +45 -255
  130. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ef-modeler.md +33 -88
  131. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ms-agent-expert.md +25 -89
  132. package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/hangfire-orchestrator.md +64 -0
  133. package/stacks/blazor-azure/.morph/config/agents.json +879 -764
  134. package/stacks/blazor-azure/.morph/hooks/{pre-commit-tests.sh → pre-commit/tests-csharp.sh} +3 -2
  135. package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +41 -0
  136. package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +24 -0
  137. package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +23 -0
  138. package/stacks/nextjs-supabase/.claude/commands/morph-apply.md +221 -0
  139. package/stacks/nextjs-supabase/.claude/commands/morph-archive.md +79 -0
  140. package/stacks/nextjs-supabase/.claude/commands/morph-deploy.md +529 -0
  141. package/stacks/nextjs-supabase/.claude/commands/morph-infra.md +209 -0
  142. package/stacks/nextjs-supabase/.claude/commands/morph-preflight.md +227 -0
  143. package/stacks/nextjs-supabase/.claude/commands/morph-proposal.md +122 -0
  144. package/stacks/nextjs-supabase/.claude/commands/morph-status.md +86 -0
  145. package/stacks/nextjs-supabase/.claude/commands/morph-troubleshoot.md +122 -0
  146. package/stacks/nextjs-supabase/.claude/settings.local.json +6 -0
  147. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +30 -150
  148. package/stacks/nextjs-supabase/.morph/config/agents.json +345 -345
  149. package/stacks/nextjs-supabase/.morph/hooks/pre-commit/tests-typescript.sh +61 -0
  150. package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +22 -0
  151. package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +22 -0
  152. package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +35 -0
  153. package/stacks/nextjs-supabase/README.md +6 -15
  154. package/bin/render-template.js +0 -349
  155. package/bin/semantic-detect-agents.js +0 -247
  156. package/bin/validate-agents-skills.js +0 -257
  157. package/bin/validate-agents.js +0 -70
  158. package/bin/validate-phase.js +0 -263
  159. package/docs/examples.md +0 -328
  160. package/scripts/reorganize-skills.cjs +0 -175
  161. package/scripts/validate-agents-structure.cjs +0 -52
  162. package/scripts/validate-skills.cjs +0 -180
  163. package/src/commands/deploy.js +0 -780
  164. package/src/lib/continuous-validator.js +0 -421
  165. package/src/lib/decision-constraint-loader.js +0 -109
  166. package/src/lib/design-system-scaffolder.js +0 -299
  167. package/src/lib/hook-executor.js +0 -257
  168. package/src/lib/mockup-generator.js +0 -366
  169. package/src/lib/ui-detector.js +0 -350
  170. package/src/llm/schema-validator.js +0 -121
  171. package/src/sanitizer/.gitkeep +0 -0
  172. package/src/scanner/.gitkeep +0 -0
  173. package/src/types/index.js +0 -477
  174. package/src/ui/.gitkeep +0 -0
  175. package/src/writer/.gitkeep +0 -0
  176. package/stacks/blazor-azure/.azure/README.md +0 -293
  177. package/stacks/blazor-azure/.azure/docs/azure-devops-setup.md +0 -454
  178. package/stacks/blazor-azure/.azure/docs/branch-strategy.md +0 -398
  179. package/stacks/blazor-azure/.azure/docs/local-development.md +0 -515
  180. package/stacks/blazor-azure/.azure/pipelines/pipeline-variables.yml +0 -34
  181. package/stacks/blazor-azure/.azure/pipelines/prod-pipeline.yml +0 -319
  182. package/stacks/blazor-azure/.azure/pipelines/staging-pipeline.yml +0 -234
  183. package/stacks/blazor-azure/.azure/pipelines/templates/build-dotnet.yml +0 -75
  184. package/stacks/blazor-azure/.azure/pipelines/templates/deploy-app-service.yml +0 -94
  185. package/stacks/blazor-azure/.azure/pipelines/templates/deploy-container-app.yml +0 -120
  186. package/stacks/blazor-azure/.azure/pipelines/templates/infra-deploy.yml +0 -90
  187. package/stacks/blazor-azure/.claude/settings.local.json +0 -15
  188. package/stacks/blazor-azure/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +0 -392
  189. package/stacks/blazor-azure/.morph/docs/workflows/design-impl.md +0 -37
  190. package/stacks/blazor-azure/.morph/docs/workflows/enforcement-pipeline.md +0 -668
  191. package/stacks/blazor-azure/.morph/docs/workflows/fast-track.md +0 -29
  192. package/stacks/blazor-azure/.morph/docs/workflows/full-morph.md +0 -76
  193. package/stacks/blazor-azure/.morph/docs/workflows/standard.md +0 -44
  194. package/stacks/blazor-azure/.morph/docs/workflows/ui-refresh.md +0 -39
  195. package/stacks/blazor-azure/.morph/examples/api-nextjs/README.md +0 -241
  196. package/stacks/blazor-azure/.morph/examples/api-nextjs/contracts.ts +0 -307
  197. package/stacks/blazor-azure/.morph/examples/api-nextjs/spec.md +0 -399
  198. package/stacks/blazor-azure/.morph/examples/api-nextjs/tasks.md +0 -168
  199. package/stacks/blazor-azure/.morph/examples/micro-saas/README.md +0 -125
  200. package/stacks/blazor-azure/.morph/examples/micro-saas/contracts.cs +0 -358
  201. package/stacks/blazor-azure/.morph/examples/micro-saas/decisions.md +0 -246
  202. package/stacks/blazor-azure/.morph/examples/micro-saas/spec.md +0 -236
  203. package/stacks/blazor-azure/.morph/examples/micro-saas/tasks.md +0 -150
  204. package/stacks/blazor-azure/.morph/examples/multi-agent/README.md +0 -309
  205. package/stacks/blazor-azure/.morph/examples/multi-agent/contracts.cs +0 -433
  206. package/stacks/blazor-azure/.morph/examples/multi-agent/spec.md +0 -479
  207. package/stacks/blazor-azure/.morph/examples/multi-agent/tasks.md +0 -185
  208. package/stacks/blazor-azure/.morph/examples/scheduled-reports/decisions.md +0 -158
  209. package/stacks/blazor-azure/.morph/examples/scheduled-reports/proposal.md +0 -95
  210. package/stacks/blazor-azure/.morph/examples/scheduled-reports/spec.md +0 -267
  211. package/stacks/blazor-azure/.morph/examples/state-v3.json +0 -188
  212. package/stacks/blazor-azure/.morph/hooks/README.md +0 -348
  213. package/stacks/blazor-azure/.morph/hooks/pre-commit-agents.sh +0 -24
  214. package/stacks/blazor-azure/.morph/hooks/pre-commit-all.sh +0 -48
  215. package/stacks/blazor-azure/.morph/hooks/pre-commit-specs.sh +0 -49
  216. package/stacks/blazor-azure/.morph/hooks/task-completed.js +0 -73
  217. package/stacks/blazor-azure/.morph/hooks/teammate-idle.js +0 -68
  218. package/stacks/blazor-azure/.morph/standards/agent-framework-blazor-ui.md +0 -359
  219. package/stacks/blazor-azure/.morph/standards/agent-framework-production.md +0 -410
  220. package/stacks/blazor-azure/.morph/standards/agent-framework-setup.md +0 -413
  221. package/stacks/blazor-azure/.morph/standards/agent-framework-workflows.md +0 -349
  222. package/stacks/blazor-azure/.morph/standards/agent-teams-workflow.md +0 -474
  223. package/stacks/blazor-azure/.morph/standards/architecture.md +0 -325
  224. package/stacks/blazor-azure/.morph/standards/azure.md +0 -605
  225. package/stacks/blazor-azure/.morph/standards/coding.md +0 -377
  226. package/stacks/blazor-azure/.morph/standards/dotnet10-migration.md +0 -520
  227. package/stacks/blazor-azure/.morph/standards/fluent-ui-setup.md +0 -590
  228. package/stacks/blazor-azure/.morph/standards/migration-guide.md +0 -514
  229. package/stacks/blazor-azure/.morph/standards/passkeys-auth.md +0 -423
  230. package/stacks/blazor-azure/.morph/standards/vector-search-rag.md +0 -536
  231. package/stacks/blazor-azure/.morph/templates/CONTEXT-FEATURE.md +0 -276
  232. package/stacks/blazor-azure/.morph/templates/CONTEXT.md +0 -170
  233. package/stacks/blazor-azure/.morph/templates/FluentDesignTheme.cs +0 -149
  234. package/stacks/blazor-azure/.morph/templates/MudTheme.cs +0 -281
  235. package/stacks/blazor-azure/.morph/templates/agent.cs +0 -163
  236. package/stacks/blazor-azure/.morph/templates/clarify-questions.md +0 -159
  237. package/stacks/blazor-azure/.morph/templates/component.razor +0 -239
  238. package/stacks/blazor-azure/.morph/templates/contracts/Commands.cs +0 -74
  239. package/stacks/blazor-azure/.morph/templates/contracts/Entities.cs +0 -25
  240. package/stacks/blazor-azure/.morph/templates/contracts/Queries.cs +0 -74
  241. package/stacks/blazor-azure/.morph/templates/contracts/README.md +0 -74
  242. package/stacks/blazor-azure/.morph/templates/contracts.cs +0 -217
  243. package/stacks/blazor-azure/.morph/templates/decisions.md +0 -123
  244. package/stacks/blazor-azure/.morph/templates/design-system.css +0 -226
  245. package/stacks/blazor-azure/.morph/templates/infra/.dockerignore.example +0 -89
  246. package/stacks/blazor-azure/.morph/templates/infra/Dockerfile.example +0 -82
  247. package/stacks/blazor-azure/.morph/templates/infra/README.md +0 -286
  248. package/stacks/blazor-azure/.morph/templates/infra/app-insights.bicep +0 -63
  249. package/stacks/blazor-azure/.morph/templates/infra/app-service.bicep +0 -164
  250. package/stacks/blazor-azure/.morph/templates/infra/azure-pipelines-deploy.yml +0 -480
  251. package/stacks/blazor-azure/.morph/templates/infra/container-app-env.bicep +0 -49
  252. package/stacks/blazor-azure/.morph/templates/infra/container-app.bicep +0 -156
  253. package/stacks/blazor-azure/.morph/templates/infra/deploy-checklist.md +0 -426
  254. package/stacks/blazor-azure/.morph/templates/infra/deploy.ps1 +0 -229
  255. package/stacks/blazor-azure/.morph/templates/infra/deploy.sh +0 -208
  256. package/stacks/blazor-azure/.morph/templates/infra/key-vault.bicep +0 -91
  257. package/stacks/blazor-azure/.morph/templates/infra/main.bicep +0 -189
  258. package/stacks/blazor-azure/.morph/templates/infra/parameters.dev.json +0 -29
  259. package/stacks/blazor-azure/.morph/templates/infra/parameters.prod.json +0 -29
  260. package/stacks/blazor-azure/.morph/templates/infra/parameters.staging.json +0 -29
  261. package/stacks/blazor-azure/.morph/templates/infra/sql-database.bicep +0 -103
  262. package/stacks/blazor-azure/.morph/templates/infra/storage.bicep +0 -106
  263. package/stacks/blazor-azure/.morph/templates/integrations/asaas-client.cs +0 -387
  264. package/stacks/blazor-azure/.morph/templates/integrations/asaas-webhook.cs +0 -351
  265. package/stacks/blazor-azure/.morph/templates/integrations/azure-identity-config.cs +0 -288
  266. package/stacks/blazor-azure/.morph/templates/integrations/clerk-config.cs +0 -258
  267. package/stacks/blazor-azure/.morph/templates/job.cs +0 -171
  268. package/stacks/blazor-azure/.morph/templates/migration.cs +0 -83
  269. package/stacks/blazor-azure/.morph/templates/proposal.md +0 -141
  270. package/stacks/blazor-azure/.morph/templates/recap.md +0 -94
  271. package/stacks/blazor-azure/.morph/templates/repository.cs +0 -141
  272. package/stacks/blazor-azure/.morph/templates/saas/subscription.cs +0 -347
  273. package/stacks/blazor-azure/.morph/templates/saas/tenant.cs +0 -338
  274. package/stacks/blazor-azure/.morph/templates/service.cs +0 -139
  275. package/stacks/blazor-azure/.morph/templates/simulation.md +0 -353
  276. package/stacks/blazor-azure/.morph/templates/spec.md +0 -149
  277. package/stacks/blazor-azure/.morph/templates/sprint-status.yaml +0 -68
  278. package/stacks/blazor-azure/.morph/templates/state.template.json +0 -222
  279. package/stacks/blazor-azure/.morph/templates/story.md +0 -143
  280. package/stacks/blazor-azure/.morph/templates/tasks.md +0 -257
  281. package/stacks/blazor-azure/.morph/templates/test.cs +0 -239
  282. package/stacks/blazor-azure/.morph/templates/ui-components.md +0 -362
  283. package/stacks/blazor-azure/.morph/templates/ui-design-system.md +0 -286
  284. package/stacks/blazor-azure/.morph/templates/ui-flows.md +0 -336
  285. package/stacks/blazor-azure/.morph/templates/ui-mockups.md +0 -133
  286. package/stacks/nextjs-supabase/.morph/docs/easypanel-setup.md +0 -169
  287. package/stacks/nextjs-supabase/.morph/docs/supabase-mcp-setup.md +0 -247
  288. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/README.md +0 -697
  289. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/spec.md +0 -85
  290. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/tasks.md +0 -86
  291. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/README.md +0 -498
  292. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/decisions.md +0 -121
  293. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/spec.md +0 -138
  294. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/tasks.md +0 -162
  295. package/stacks/nextjs-supabase/.morph/standards/easypanel-deploy.md +0 -191
  296. package/stacks/nextjs-supabase/.morph/standards/nextjs-patterns.md +0 -193
  297. package/stacks/nextjs-supabase/.morph/standards/supabase-auth.md +0 -171
  298. package/stacks/nextjs-supabase/.morph/standards/supabase-pgvector.md +0 -164
  299. package/stacks/nextjs-supabase/.morph/standards/supabase-rls.md +0 -179
  300. package/stacks/nextjs-supabase/.morph/standards/supabase-storage.md +0 -148
  301. package/stacks/nextjs-supabase/.morph/templates/contracts.cs +0 -173
  302. package/stacks/nextjs-supabase/.morph/templates/contracts.ts +0 -168
  303. package/stacks/nextjs-supabase/.morph/templates/decisions.md +0 -115
  304. package/stacks/nextjs-supabase/.morph/templates/dockerfile-api.dockerfile +0 -38
  305. package/stacks/nextjs-supabase/.morph/templates/dockerfile-web.dockerfile +0 -48
  306. package/stacks/nextjs-supabase/.morph/templates/proposal.md +0 -145
  307. package/stacks/nextjs-supabase/.morph/templates/recap.md +0 -134
  308. package/stacks/nextjs-supabase/.morph/templates/rls-policy.sql +0 -57
  309. package/stacks/nextjs-supabase/.morph/templates/spec.md +0 -231
  310. package/stacks/nextjs-supabase/.morph/templates/supabase-migration.sql +0 -100
  311. package/stacks/nextjs-supabase/.morph/templates/tasks.md +0 -257
  312. /package/src/commands/{search-patterns.js → learning/search-patterns.js} +0 -0
  313. /package/src/commands/{migrate-state.js → utils/migrate-state.js} +0 -0
  314. /package/src/commands/{upgrade.js → utils/upgrade.js} +0 -0
  315. /package/src/{lib → core/templates}/template-data-sources.js +0 -0
  316. /package/src/lib/{design-system-generator.js → generators/design-system-generator.js} +0 -0
  317. /package/src/lib/{learning-system.js → learning/learning-system.js} +0 -0
  318. /package/{src/generator → stacks/blazor-azure/.morph/templates}/.gitkeep +0 -0
  319. /package/{src/llm → stacks/nextjs-supabase/.morph/templates}/.gitkeep +0 -0
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env bash
2
+ # Scope: nextjs-supabase | Validates TypeScript test coverage
3
+ # MORPH-SPEC Pre-Commit Hook: Test Coverage
4
+ # Checks for .test.ts/.test.tsx files for modified TypeScript files
5
+
6
+ echo "🧪 Checking TypeScript test coverage..."
7
+
8
+ # Get modified .ts/.tsx files (excluding test files)
9
+ MODIFIED_TS=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(ts|tsx)$' | grep -v -E '\.(test|spec)\.(ts|tsx)$')
10
+
11
+ if [[ -z "$MODIFIED_TS" ]]; then
12
+ echo "✓ No TypeScript files modified"
13
+ exit 0
14
+ fi
15
+
16
+ HAS_WARNINGS=false
17
+
18
+ for ts_file in $MODIFIED_TS; do
19
+ # Skip trivial files (types, interfaces, DTOs)
20
+ if grep -qi "export type\|export interface\|DTO" "$ts_file"; then
21
+ echo " ℹ️ Skipping trivial file: $ts_file"
22
+ continue
23
+ fi
24
+
25
+ # Look for test file
26
+ base_name=$(basename "$ts_file" .ts)
27
+ base_name=$(basename "$base_name" .tsx)
28
+ dir_name=$(dirname "$ts_file")
29
+
30
+ TEST_PATTERNS=(
31
+ "$dir_name/$base_name.test.ts"
32
+ "$dir_name/$base_name.test.tsx"
33
+ "$dir_name/__tests__/$base_name.test.ts"
34
+ "$dir_name/__tests__/$base_name.test.tsx"
35
+ )
36
+
37
+ FOUND_TEST=false
38
+ for pattern in "${TEST_PATTERNS[@]}"; do
39
+ if [[ -f "$pattern" ]]; then
40
+ FOUND_TEST=true
41
+ break
42
+ fi
43
+ done
44
+
45
+ if [[ "$FOUND_TEST" == "false" ]]; then
46
+ echo " ⚠️ Missing test for: $ts_file"
47
+ HAS_WARNINGS=true
48
+ else
49
+ echo " ✓ Test found for: $ts_file"
50
+ fi
51
+ done
52
+
53
+ if [[ "$HAS_WARNINGS" == "true" ]]; then
54
+ echo ""
55
+ echo "⚠️ Warning: Some TypeScript files lack tests"
56
+ echo " Consider adding tests before committing"
57
+ echo " (Override with: git commit --no-verify)"
58
+ fi
59
+
60
+ # WARNING ONLY - don't block commit
61
+ exit 0
@@ -0,0 +1,22 @@
1
+ name: Deploy to Production
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+
7
+ jobs:
8
+ build-docker:
9
+ uses: ./.github/workflows/docker-build-push.yml
10
+ with:
11
+ registry: 'ghcr.io'
12
+ image-name: '{{GITHUB_OWNER}}/{{kebabCase APP_NAME}}'
13
+ dockerfile-path: 'Dockerfile'
14
+ secrets: inherit
15
+
16
+ deploy:
17
+ needs: build-docker
18
+ uses: ./.github/workflows/deploy-easypanel.yml
19
+ with:
20
+ environment: 'production'
21
+ image: ${{{{ needs.build-docker.outputs.image-tag }}}}
22
+ secrets: inherit
@@ -0,0 +1,22 @@
1
+ name: Deploy to Staging
2
+
3
+ on:
4
+ push:
5
+ branches: [develop]
6
+
7
+ jobs:
8
+ build-docker:
9
+ uses: ./.github/workflows/docker-build-push.yml
10
+ with:
11
+ registry: 'ghcr.io'
12
+ image-name: '{{GITHUB_OWNER}}/{{kebabCase APP_NAME}}'
13
+ dockerfile-path: 'Dockerfile'
14
+ secrets: inherit
15
+
16
+ deploy:
17
+ needs: build-docker
18
+ uses: ./.github/workflows/deploy-easypanel.yml
19
+ with:
20
+ environment: 'staging'
21
+ image: ${{{{ needs.build-docker.outputs.image-tag }}}}
22
+ secrets: inherit
@@ -0,0 +1,35 @@
1
+ name: CI Build
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main, develop]
6
+ push:
7
+ branches: [main, develop]
8
+
9
+ jobs:
10
+ backend:
11
+ uses: ./.github/workflows/dotnet-build.yml
12
+ with:
13
+ dotnet-version: '{{DOTNET_VERSION}}'
14
+ build-configuration: 'Release'
15
+ run-tests: true
16
+
17
+ frontend:
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+
22
+ - name: Setup Node.js
23
+ uses: actions/setup-node@v4
24
+ with:
25
+ node-version: '20'
26
+ cache: 'npm'
27
+
28
+ - name: Install dependencies
29
+ run: npm ci
30
+
31
+ - name: Build Next.js
32
+ run: npm run build
33
+
34
+ - name: Run tests
35
+ run: npm test
@@ -62,22 +62,13 @@ stacks/nextjs-supabase/
62
62
  ├── README.md # This file
63
63
  ├── .morph/
64
64
  │ ├── project.md # Project template
65
- ├── config/
66
- └── agents.json # 12 agents configured
67
- ├── standards/ # 6 standards
68
- │ │ ├── supabase-auth.md
69
- │ │ ├── supabase-rls.md
70
- │ │ ├── supabase-storage.md
71
- │ │ ├── supabase-pgvector.md
72
- │ │ ├── easypanel-deploy.md
73
- │ │ └── nextjs-patterns.md
65
+ └── config/
66
+ └── agents.json # 12 agents configured
67
+ # Note: All standards moved to framework/standards/ (universal knowledge)
74
68
  │ ├── templates/ # 11 templates
75
- ├── examples/ # 2 reference examples
76
- ├── crud-nextjs-supabase/
77
- └── saas-nextjs-supabase/
78
- │ └── docs/ # Setup guides
79
- │ ├── supabase-mcp-setup.md
80
- │ └── easypanel-setup.md
69
+ └── examples/ # 2 reference examples
70
+ ├── crud-nextjs-supabase/
71
+ └── saas-nextjs-supabase/
81
72
  └── .claude/
82
73
  └── skills/ # 4 agent skills
83
74
  └── level-2-domains/
@@ -1,349 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * MORPH-SPEC Template Renderer
5
- *
6
- * Renders templates by replacing {{PLACEHOLDER}} with actual values.
7
- *
8
- * Usage:
9
- * node bin/render-template.js <template-path> <output-path> <variables-json>
10
- *
11
- * Example:
12
- * node bin/render-template.js \
13
- * stacks/blazor-azure/.morph/templates/spec.md \
14
- * .morph/project/outputs/my-feature/spec.md \
15
- * '{"FEATURE_NAME":"my-feature","STACK":"Blazor","DATE":"2024-01-15"}'
16
- */
17
-
18
- import fs from 'fs';
19
- import path from 'path';
20
- import { fileURLToPath } from 'url';
21
- import { resolveConfigDir } from '../src/lib/stack-resolver.js';
22
- import { getAllTemplatePlaceholders } from '../src/lib/template-data-sources.js';
23
-
24
- const __filename = fileURLToPath(import.meta.url);
25
- const __dirname = path.dirname(__filename);
26
-
27
- // ANSI color codes
28
- const colors = {
29
- green: '\x1b[32m',
30
- red: '\x1b[31m',
31
- yellow: '\x1b[33m',
32
- cyan: '\x1b[36m',
33
- reset: '\x1b[0m'
34
- };
35
-
36
- /**
37
- * Load config to get default values
38
- */
39
- function loadConfig() {
40
- const configPaths = [
41
- path.join(process.cwd(), '.morph/config/config.json'),
42
- path.join(resolveConfigDir(process.cwd()), 'config.json'),
43
- path.join(resolveConfigDir(path.join(__dirname, '..')), 'config.template.json')
44
- ];
45
-
46
- for (const configPath of configPaths) {
47
- if (fs.existsSync(configPath)) {
48
- try {
49
- const content = fs.readFileSync(configPath, 'utf-8');
50
- return JSON.parse(content);
51
- } catch (error) {
52
- // Continue to next path
53
- }
54
- }
55
- }
56
-
57
- return null;
58
- }
59
-
60
- /**
61
- * Get default variables from config and environment
62
- */
63
- function getDefaultVariables() {
64
- const config = loadConfig();
65
- const now = new Date();
66
-
67
- return {
68
- DATE: now.toISOString().split('T')[0],
69
- YEAR: now.getFullYear().toString(),
70
- AUTHOR: config?.project?.author || 'MORPH-SPEC',
71
- PROJECT_NAME: config?.project?.name || 'Project',
72
- STACK: config?.project?.stack || 'Blazor',
73
- NAMESPACE: config?.project?.namespace || 'Project'
74
- };
75
- }
76
-
77
- /**
78
- * Convert string to various case formats
79
- */
80
- function transformCase(str) {
81
- return {
82
- // kebab-case → PascalCase
83
- pascal: str
84
- .split('-')
85
- .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
86
- .join(''),
87
-
88
- // kebab-case → camelCase
89
- camel: str
90
- .split('-')
91
- .map((word, index) =>
92
- index === 0
93
- ? word.toLowerCase()
94
- : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()
95
- )
96
- .join(''),
97
-
98
- // kebab-case → Title Case
99
- title: str
100
- .split('-')
101
- .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
102
- .join(' '),
103
-
104
- // kebab-case → UPPER_SNAKE_CASE
105
- upperSnake: str.toUpperCase().replace(/-/g, '_'),
106
-
107
- // kebab-case → lower_snake_case
108
- lowerSnake: str.toLowerCase().replace(/-/g, '_')
109
- };
110
- }
111
-
112
- /**
113
- * Render template by replacing placeholders
114
- */
115
- function renderTemplate(templatePath, variables, mcpData = null) {
116
- if (!fs.existsSync(templatePath)) {
117
- throw new Error(`Template file not found: ${templatePath}`);
118
- }
119
-
120
- let content = fs.readFileSync(templatePath, 'utf-8');
121
-
122
- // Get default variables
123
- const defaults = getDefaultVariables();
124
-
125
- // Merge: defaults → MCP data → provided variables (rightmost takes precedence)
126
- const allVariables = { ...defaults, ...(mcpData || {}), ...variables };
127
-
128
- // Auto-generate case transformations for FEATURE_NAME if provided
129
- if (allVariables.FEATURE_NAME) {
130
- const featureName = allVariables.FEATURE_NAME;
131
- const transformations = transformCase(featureName);
132
-
133
- allVariables.FEATURE_NAME_PASCAL = transformations.pascal;
134
- allVariables.FEATURE_NAME_CAMEL = transformations.camel;
135
- allVariables.FEATURE_NAME_TITLE = transformations.title;
136
- allVariables.FEATURE_NAME_UPPER_SNAKE = transformations.upperSnake;
137
- allVariables.FEATURE_NAME_LOWER_SNAKE = transformations.lowerSnake;
138
-
139
- // Backward compatibility: FEATURE_TITLE maps to FEATURE_NAME_TITLE
140
- if (!allVariables.FEATURE_TITLE) {
141
- allVariables.FEATURE_TITLE = transformations.title;
142
- }
143
- }
144
-
145
- // Track which placeholders were replaced
146
- const replacedPlaceholders = new Set();
147
- const unreplacedPlaceholders = new Set();
148
-
149
- // Replace all placeholders
150
- for (const [key, value] of Object.entries(allVariables)) {
151
- const placeholder = `{{${key}}}`;
152
- if (content.includes(placeholder)) {
153
- content = content.replaceAll(placeholder, value);
154
- replacedPlaceholders.add(key);
155
- }
156
- }
157
-
158
- // Find unreplaced placeholders
159
- const placeholderRegex = /\{\{([A-Z_]+)\}\}/g;
160
- let match;
161
- while ((match = placeholderRegex.exec(content)) !== null) {
162
- unreplacedPlaceholders.add(match[1]);
163
- }
164
-
165
- return {
166
- content,
167
- replacedPlaceholders: Array.from(replacedPlaceholders),
168
- unreplacedPlaceholders: Array.from(unreplacedPlaceholders)
169
- };
170
- }
171
-
172
- /**
173
- * Print help message
174
- */
175
- function printHelp() {
176
- console.log(`
177
- ${colors.cyan}MORPH-SPEC Template Renderer${colors.reset}
178
-
179
- ${colors.green}Usage:${colors.reset}
180
- node bin/render-template.js <template-path> <output-path> <variables-json>
181
-
182
- ${colors.green}Arguments:${colors.reset}
183
- template-path Path to the template file (required)
184
- output-path Path where rendered output will be written (required)
185
- variables-json JSON object with variables to replace (required)
186
-
187
- ${colors.green}Standard Placeholders:${colors.reset}
188
- {{FEATURE_NAME}} - kebab-case feature name (e.g., "scheduled-reports")
189
- {{FEATURE_NAME_PASCAL}} - PascalCase (e.g., "ScheduledReports")
190
- {{FEATURE_NAME_CAMEL}} - camelCase (e.g., "scheduledReports")
191
- {{FEATURE_NAME_TITLE}} - Title Case (e.g., "Scheduled Reports")
192
- {{FEATURE_NAME_UPPER_SNAKE}} - UPPER_SNAKE_CASE (e.g., "SCHEDULED_REPORTS")
193
- {{FEATURE_NAME_LOWER_SNAKE}} - lower_snake_case (e.g., "scheduled_reports")
194
- {{FEATURE_TITLE}} - Alias for FEATURE_NAME_TITLE
195
- {{STACK}} - Project stack (e.g., "Blazor", "Next.js")
196
- {{DATE}} - Current date (YYYY-MM-DD)
197
- {{YEAR}} - Current year
198
- {{AUTHOR}} - Author name (from config.json)
199
- {{PROJECT_NAME}} - Project name (from config.json)
200
- {{NAMESPACE}} - C# namespace (from config.json)
201
-
202
- ${colors.green}Example:${colors.reset}
203
- node bin/render-template.js \\
204
- stacks/blazor-azure/.morph/templates/spec.md \\
205
- .morph/project/outputs/scheduled-reports/spec.md \\
206
- '{"FEATURE_NAME":"scheduled-reports","STACK":"Blazor"}'
207
-
208
- ${colors.green}Flags:${colors.reset}
209
- --help, -h Show this help message
210
- --verbose, -v Show detailed replacement information
211
- --dry-run, -d Preview output without writing file
212
- --with-mcp-data Inject dynamic MCP data (project stats, compliance, activity)
213
-
214
- ${colors.green}MCP Data Placeholders:${colors.reset} (Available with --with-mcp-data flag)
215
- {{MCP_PROJECT_FILES}} - Total files in project
216
- {{MCP_TEST_COVERAGE}} - Test coverage percentage (or N/A)
217
- {{MCP_COMPLIANCE_SCORE}} - Overall compliance score (0-100)
218
- {{MCP_LAST_FEATURE}} - Name of last feature worked on
219
- {{MCP_LAST_COMMIT}} - Last git commit message
220
- {{MCP_LAST_COMMIT_AUTHOR}} - Author of last commit
221
- {{MCP_LAST_COMMIT_TIME}} - Relative time of last commit
222
- {{MCP_CS_FILES}} - Number of .cs files
223
- {{MCP_RAZOR_FILES}} - Number of .razor files
224
- {{MCP_TS_FILES}} - Number of .ts files
225
- {{MCP_JS_FILES}} - Number of .js files
226
- {{MCP_NUGET_PACKAGES}} - Number of NuGet packages
227
- {{MCP_NPM_PACKAGES}} - Number of npm packages
228
- {{MCP_ARCHITECTURE_VIOLATIONS}} - Architecture validator errors
229
- {{MCP_PACKAGE_CONFLICTS}} - Package conflict count
230
- {{MCP_SECURITY_ISSUES}} - Security validator issues
231
- {{MCP_RECENT_BRANCHES}} - Recent git branches (up to 3)
232
-
233
- ${colors.yellow}Note:${colors.reset} DATE, YEAR, AUTHOR, PROJECT_NAME, STACK, NAMESPACE are auto-populated from config.json
234
- `);
235
- }
236
-
237
- /**
238
- * Main CLI logic
239
- */
240
- async function main() {
241
- const args = process.argv.slice(2);
242
-
243
- // Check for help flag
244
- if (args.includes('--help') || args.includes('-h')) {
245
- printHelp();
246
- process.exit(0);
247
- }
248
-
249
- // Parse flags
250
- const verbose = args.includes('--verbose') || args.includes('-v');
251
- const dryRun = args.includes('--dry-run') || args.includes('-d');
252
- const withMcpData = args.includes('--with-mcp-data');
253
-
254
- // Filter out flags
255
- const flags = ['--verbose', '-v', '--dry-run', '-d', '--help', '-h', '--with-mcp-data'];
256
- const cleanArgs = args.filter(arg => !flags.includes(arg));
257
-
258
- // Validate arguments
259
- if (cleanArgs.length < 3) {
260
- console.error(`${colors.red}❌ Error: Missing required arguments${colors.reset}\n`);
261
- printHelp();
262
- process.exit(1);
263
- }
264
-
265
- const [templatePath, outputPath, variablesJson] = cleanArgs;
266
-
267
- // Parse variables JSON
268
- let variables;
269
- try {
270
- variables = JSON.parse(variablesJson);
271
- } catch (error) {
272
- console.error(`${colors.red}❌ Error: Invalid JSON in variables argument${colors.reset}`);
273
- console.error(` ${error.message}\n`);
274
- process.exit(1);
275
- }
276
-
277
- try {
278
- // Get MCP data if requested
279
- let mcpData = null;
280
- if (withMcpData) {
281
- try {
282
- console.log(`${colors.cyan}🔍 Gathering MCP data from project...${colors.reset}`);
283
- mcpData = await getAllTemplatePlaceholders(process.cwd());
284
-
285
- if (verbose) {
286
- console.log(`${colors.green}✅ MCP data loaded:${colors.reset}`);
287
- console.log(` Files: ${mcpData.MCP_PROJECT_FILES}`);
288
- console.log(` Coverage: ${mcpData.MCP_TEST_COVERAGE}`);
289
- console.log(` Compliance: ${mcpData.MCP_COMPLIANCE_SCORE}%`);
290
- console.log(` Last Feature: ${mcpData.MCP_LAST_FEATURE}\n`);
291
- }
292
- } catch (error) {
293
- console.error(`${colors.yellow}⚠️ Warning: Failed to load MCP data - ${error.message}${colors.reset}`);
294
- console.error(` Continuing with standard placeholders only...\n`);
295
- }
296
- }
297
-
298
- // Render template
299
- const { content, replacedPlaceholders, unreplacedPlaceholders } = renderTemplate(
300
- templatePath,
301
- variables,
302
- mcpData
303
- );
304
-
305
- // Dry run: just preview
306
- if (dryRun) {
307
- console.log(`${colors.cyan}📋 DRY RUN - Preview (file will NOT be written)${colors.reset}\n`);
308
- console.log(content);
309
- console.log(`\n${colors.cyan}═══════════════════════════════════════════${colors.reset}`);
310
- } else {
311
- // Create output directory if it doesn't exist
312
- const outputDir = path.dirname(outputPath);
313
- if (!fs.existsSync(outputDir)) {
314
- fs.mkdirSync(outputDir, { recursive: true });
315
- }
316
-
317
- // Write rendered content
318
- fs.writeFileSync(outputPath, content, 'utf-8');
319
- console.log(`${colors.green}✅ Template rendered successfully${colors.reset}`);
320
- console.log(` Output: ${outputPath}`);
321
- }
322
-
323
- // Verbose output
324
- if (verbose || unreplacedPlaceholders.length > 0) {
325
- console.log(`\n${colors.cyan}📊 Replacement Summary:${colors.reset}`);
326
- console.log(` ${colors.green}Replaced:${colors.reset} ${replacedPlaceholders.length} placeholders`);
327
-
328
- if (replacedPlaceholders.length > 0) {
329
- console.log(` ${replacedPlaceholders.map(p => `{{${p}}}`).join(', ')}`);
330
- }
331
-
332
- if (unreplacedPlaceholders.length > 0) {
333
- console.log(`\n ${colors.yellow}⚠️ Unreplaced:${colors.reset} ${unreplacedPlaceholders.length} placeholders`);
334
- console.log(` ${unreplacedPlaceholders.map(p => `{{${p}}}`).join(', ')}`);
335
- }
336
- }
337
-
338
- process.exit(0);
339
- } catch (error) {
340
- console.error(`${colors.red}❌ Error: ${error.message}${colors.reset}`);
341
- process.exit(1);
342
- }
343
- }
344
-
345
- // Run CLI
346
- main().catch(error => {
347
- console.error(`${colors.red}❌ Fatal error: ${error.message}${colors.reset}`);
348
- process.exit(1);
349
- });