@polymorphism-tech/morph-spec 3.0.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/CLAUDE.md +561 -63
  2. package/LICENSE +72 -72
  3. package/README.md +275 -79
  4. package/bin/detect-agents.js +3 -1
  5. package/bin/morph-spec.js +60 -1
  6. package/bin/render-template.js +61 -14
  7. package/bin/semantic-detect-agents.js +2 -1
  8. package/bin/{task-manager.js → task-manager.cjs} +113 -8
  9. package/bin/validate-agents-skills.js +10 -4
  10. package/bin/validate-agents.js +4 -3
  11. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
  12. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
  13. package/docs/api/scripts/collapse.js +38 -38
  14. package/docs/api/scripts/commonNav.js +28 -28
  15. package/docs/api/scripts/linenumber.js +25 -25
  16. package/docs/api/scripts/nav.js +12 -12
  17. package/docs/api/scripts/polyfill.js +3 -3
  18. package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
  19. package/docs/api/scripts/prettify/lang-css.js +2 -2
  20. package/docs/api/scripts/prettify/prettify.js +28 -28
  21. package/docs/api/scripts/search.js +98 -98
  22. package/docs/api/styles/jsdoc.css +776 -776
  23. package/docs/api/styles/prettify.css +80 -80
  24. package/docs/cli-auto-detection.md +219 -0
  25. package/docs/examples.md +328 -328
  26. package/docs/getting-started.md +3 -3
  27. package/docs/llm-interaction-config.md +735 -0
  28. package/docs/templates.md +418 -418
  29. package/docs/troubleshooting.md +269 -0
  30. package/package.json +7 -3
  31. package/scripts/postinstall.js +132 -132
  32. package/scripts/reorganize-skills.cjs +1 -1
  33. package/scripts/validate-agents-structure.cjs +1 -1
  34. package/scripts/validate-skills.cjs +2 -2
  35. package/src/commands/advance-phase.js +93 -2
  36. package/src/commands/analyze-blazor-concurrency.js +193 -193
  37. package/src/commands/approve.js +221 -0
  38. package/src/commands/capture-pattern.js +121 -0
  39. package/src/commands/create-story.js +5 -2
  40. package/src/commands/deploy.js +780 -780
  41. package/src/commands/detect-agents.js +4 -2
  42. package/src/commands/generate.js +276 -149
  43. package/src/commands/init.js +37 -0
  44. package/src/commands/lint-fluent.js +352 -352
  45. package/src/commands/migrate-state.js +158 -0
  46. package/src/commands/rollback-phase.js +185 -185
  47. package/src/commands/search-patterns.js +126 -0
  48. package/src/commands/session-summary.js +291 -291
  49. package/src/commands/shard-spec.js +224 -224
  50. package/src/commands/spawn-team.js +172 -0
  51. package/src/commands/sprint-status.js +250 -250
  52. package/src/commands/task.js +3 -3
  53. package/src/commands/troubleshoot.js +222 -222
  54. package/src/commands/update.js +36 -0
  55. package/src/commands/upgrade.js +346 -0
  56. package/src/commands/validate-blazor-state.js +210 -210
  57. package/src/commands/validate-blazor.js +156 -156
  58. package/src/commands/validate-css.js +84 -84
  59. package/src/commands/validate-phase.js +221 -221
  60. package/src/generator/.gitkeep +0 -0
  61. package/src/generator/config-generator.js +206 -0
  62. package/src/generator/templates/config.json.template +40 -0
  63. package/src/generator/templates/project.md.template +67 -0
  64. package/src/lib/blazor-concurrency-analyzer.js +288 -288
  65. package/src/lib/blazor-state-validator.js +291 -291
  66. package/src/lib/blazor-validator.js +374 -374
  67. package/src/lib/checkpoint-hooks.js +258 -0
  68. package/src/lib/context-generator.js +7 -4
  69. package/src/lib/css-validator.js +352 -352
  70. package/src/lib/design-system-generator.js +298 -298
  71. package/src/lib/hook-executor.js +2 -1
  72. package/src/lib/learning-system.js +520 -520
  73. package/src/lib/metadata-extractor.js +380 -0
  74. package/src/lib/mockup-generator.js +366 -366
  75. package/src/lib/phase-state-machine.js +214 -0
  76. package/src/lib/stack-resolver.js +148 -0
  77. package/src/lib/standards-context-injector.js +4 -3
  78. package/src/lib/state-manager.js +120 -0
  79. package/src/lib/team-orchestrator.js +2 -1
  80. package/src/lib/template-data-sources.js +325 -0
  81. package/src/lib/troubleshoot-grep.js +204 -194
  82. package/src/lib/troubleshoot-index.js +144 -144
  83. package/src/lib/ui-detector.js +350 -350
  84. package/src/lib/validation-runner.js +2 -1
  85. package/src/lib/validators/architecture-validator.js +387 -387
  86. package/src/lib/validators/content-validator.js +351 -0
  87. package/src/lib/validators/package-validator.js +360 -360
  88. package/src/lib/validators/ui-contrast-validator.js +422 -422
  89. package/src/llm/.gitkeep +0 -0
  90. package/src/llm/analyzer.js +215 -0
  91. package/src/llm/environment-detector.js +43 -0
  92. package/src/llm/few-shot-examples.js +216 -0
  93. package/src/llm/project-config-schema.json +188 -0
  94. package/src/llm/prompt-builder.js +96 -0
  95. package/src/llm/schema-validator.js +121 -0
  96. package/src/orchestrator.js +206 -0
  97. package/src/sanitizer/.gitkeep +0 -0
  98. package/src/sanitizer/context-sanitizer.js +221 -0
  99. package/src/sanitizer/patterns.js +163 -0
  100. package/src/scanner/.gitkeep +0 -0
  101. package/src/scanner/project-scanner.js +242 -0
  102. package/src/types/index.js +477 -0
  103. package/src/ui/.gitkeep +0 -0
  104. package/src/ui/diff-display.js +91 -0
  105. package/src/ui/interactive-wizard.js +96 -0
  106. package/src/ui/user-review.js +211 -0
  107. package/src/ui/wizard-questions.js +190 -0
  108. package/src/utils/file-copier.js +3 -1
  109. package/src/utils/logger.js +32 -32
  110. package/src/utils/version-checker.js +175 -175
  111. package/src/writer/.gitkeep +0 -0
  112. package/src/writer/file-writer.js +86 -0
  113. package/{content → stacks/blazor-azure}/.azure/README.md +2 -2
  114. package/{content → stacks/blazor-azure}/.azure/pipelines/pipeline-variables.yml +1 -1
  115. package/{content → stacks/blazor-azure}/.azure/pipelines/prod-pipeline.yml +1 -1
  116. package/{content → stacks/blazor-azure}/.azure/pipelines/staging-pipeline.yml +1 -1
  117. package/{content → stacks/blazor-azure}/.claude/commands/morph-preflight.md +227 -227
  118. package/{content → stacks/blazor-azure}/.claude/commands/morph-troubleshoot.md +122 -122
  119. package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-setup.md +1 -1
  120. package/{content → stacks/blazor-azure}/.morph/docs/workflows/enforcement-pipeline.md +3 -3
  121. package/{content → stacks/blazor-azure}/.morph/hooks/README.md +12 -12
  122. package/{content → stacks/blazor-azure}/.morph/standards/agent-teams-workflow.md +2 -2
  123. package/{content → stacks/blazor-azure}/.morph/standards/migration-guide.md +2 -2
  124. package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy-checklist.md +426 -426
  125. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/backend/dotnet-supabase.md +244 -0
  126. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/frontend/nextjs-supabase.md +335 -0
  127. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/infrastructure/easypanel-deployer.md +189 -0
  128. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +170 -0
  129. package/stacks/nextjs-supabase/.morph/config/agents.json +345 -0
  130. package/stacks/nextjs-supabase/.morph/config/config.template.json +92 -0
  131. package/stacks/nextjs-supabase/.morph/docs/easypanel-setup.md +169 -0
  132. package/stacks/nextjs-supabase/.morph/docs/supabase-mcp-setup.md +247 -0
  133. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/README.md +697 -0
  134. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/spec.md +85 -0
  135. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/tasks.md +86 -0
  136. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/README.md +498 -0
  137. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/decisions.md +121 -0
  138. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/spec.md +138 -0
  139. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/tasks.md +162 -0
  140. package/stacks/nextjs-supabase/.morph/project.md +168 -0
  141. package/stacks/nextjs-supabase/.morph/standards/easypanel-deploy.md +191 -0
  142. package/stacks/nextjs-supabase/.morph/standards/nextjs-patterns.md +193 -0
  143. package/stacks/nextjs-supabase/.morph/standards/supabase-auth.md +171 -0
  144. package/stacks/nextjs-supabase/.morph/standards/supabase-pgvector.md +164 -0
  145. package/stacks/nextjs-supabase/.morph/standards/supabase-rls.md +179 -0
  146. package/stacks/nextjs-supabase/.morph/standards/supabase-storage.md +148 -0
  147. package/stacks/nextjs-supabase/.morph/templates/contracts.cs +173 -0
  148. package/stacks/nextjs-supabase/.morph/templates/contracts.ts +168 -0
  149. package/stacks/nextjs-supabase/.morph/templates/decisions.md +115 -0
  150. package/stacks/nextjs-supabase/.morph/templates/dockerfile-api.dockerfile +38 -0
  151. package/stacks/nextjs-supabase/.morph/templates/dockerfile-web.dockerfile +48 -0
  152. package/stacks/nextjs-supabase/.morph/templates/proposal.md +145 -0
  153. package/stacks/nextjs-supabase/.morph/templates/recap.md +134 -0
  154. package/stacks/nextjs-supabase/.morph/templates/rls-policy.sql +57 -0
  155. package/stacks/nextjs-supabase/.morph/templates/spec.md +231 -0
  156. package/stacks/nextjs-supabase/.morph/templates/supabase-migration.sql +100 -0
  157. package/stacks/nextjs-supabase/.morph/templates/tasks.md +257 -0
  158. package/stacks/nextjs-supabase/CLAUDE.md +149 -0
  159. package/stacks/nextjs-supabase/README.md +112 -0
  160. /package/{content → stacks/blazor-azure}/.azure/docs/azure-devops-setup.md +0 -0
  161. /package/{content → stacks/blazor-azure}/.azure/docs/branch-strategy.md +0 -0
  162. /package/{content → stacks/blazor-azure}/.azure/docs/local-development.md +0 -0
  163. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/build-dotnet.yml +0 -0
  164. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-app-service.yml +0 -0
  165. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-container-app.yml +0 -0
  166. /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/infra-deploy.yml +0 -0
  167. /package/{content → stacks/blazor-azure}/.claude/commands/morph-apply.md +0 -0
  168. /package/{content → stacks/blazor-azure}/.claude/commands/morph-archive.md +0 -0
  169. /package/{content → stacks/blazor-azure}/.claude/commands/morph-deploy.md +0 -0
  170. /package/{content → stacks/blazor-azure}/.claude/commands/morph-infra.md +0 -0
  171. /package/{content → stacks/blazor-azure}/.claude/commands/morph-proposal.md +0 -0
  172. /package/{content → stacks/blazor-azure}/.claude/commands/morph-status.md +0 -0
  173. /package/{content → stacks/blazor-azure}/.claude/settings.local.json +0 -0
  174. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/README.md +0 -0
  175. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/code-review.md +0 -0
  176. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/morph-checklist.md +0 -0
  177. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/simulation-checklist.md +0 -0
  178. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/README.md +0 -0
  179. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/morph-replicate.md +0 -0
  180. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-clarify.md +0 -0
  181. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-design.md +0 -0
  182. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-tasks.md +0 -0
  183. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-uiux.md +0 -0
  184. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/README.md +0 -0
  185. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +0 -0
  186. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/po-pm-advisor.md +0 -0
  187. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/prompt-engineer.md +0 -0
  188. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/seo-growth-hacker.md +0 -0
  189. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/standards-architect.md +0 -0
  190. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/dotnet-senior.md +0 -0
  191. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ef-modeler.md +0 -0
  192. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +0 -0
  193. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ms-agent-expert.md +0 -0
  194. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/blazor-builder.md +0 -0
  195. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/nextjs-expert.md +0 -0
  196. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +0 -0
  197. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/azure-architect.md +0 -0
  198. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +0 -0
  199. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +0 -0
  200. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/container-specialist.md +0 -0
  201. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +0 -0
  202. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/asaas-financial.md +0 -0
  203. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/azure-identity.md +0 -0
  204. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/clerk-auth.md +0 -0
  205. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/resend-email.md +0 -0
  206. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/code-analyzer.md +0 -0
  207. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/testing-specialist.md +0 -0
  208. /package/{content → stacks/blazor-azure}/.claude/skills/level-3-technologies/README.md +0 -0
  209. /package/{content → stacks/blazor-azure}/.claude/skills/level-4-patterns/README.md +0 -0
  210. /package/{content → stacks/blazor-azure}/.morph/.morphversion +0 -0
  211. /package/{content → stacks/blazor-azure}/.morph/archive/.gitkeep +0 -0
  212. /package/{content → stacks/blazor-azure}/.morph/config/agents.json +0 -0
  213. /package/{content → stacks/blazor-azure}/.morph/config/config.template.json +0 -0
  214. /package/{content → stacks/blazor-azure}/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +0 -0
  215. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/design-impl.md +0 -0
  216. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/fast-track.md +0 -0
  217. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/full-morph.md +0 -0
  218. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/standard.md +0 -0
  219. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/ui-refresh.md +0 -0
  220. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/README.md +0 -0
  221. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/contracts.ts +0 -0
  222. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/spec.md +0 -0
  223. /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/tasks.md +0 -0
  224. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/README.md +0 -0
  225. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/contracts.cs +0 -0
  226. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/decisions.md +0 -0
  227. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/spec.md +0 -0
  228. /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/tasks.md +0 -0
  229. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/README.md +0 -0
  230. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/contracts.cs +0 -0
  231. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/spec.md +0 -0
  232. /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/tasks.md +0 -0
  233. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/decisions.md +0 -0
  234. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/proposal.md +0 -0
  235. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/spec.md +0 -0
  236. /package/{content → stacks/blazor-azure}/.morph/examples/state-v3.json +0 -0
  237. /package/{content → stacks/blazor-azure}/.morph/features/.gitkeep +0 -0
  238. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-agents.sh +0 -0
  239. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-all.sh +0 -0
  240. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-specs.sh +0 -0
  241. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-tests.sh +0 -0
  242. /package/{content → stacks/blazor-azure}/.morph/hooks/task-completed.js +0 -0
  243. /package/{content → stacks/blazor-azure}/.morph/hooks/teammate-idle.js +0 -0
  244. /package/{content → stacks/blazor-azure}/.morph/project.md +0 -0
  245. /package/{content → stacks/blazor-azure}/.morph/schemas/agent.schema.json +0 -0
  246. /package/{content → stacks/blazor-azure}/.morph/schemas/tasks.schema.json +0 -0
  247. /package/{content → stacks/blazor-azure}/.morph/specs/.gitkeep +0 -0
  248. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-blazor-ui.md +0 -0
  249. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-production.md +0 -0
  250. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-setup.md +0 -0
  251. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-workflows.md +0 -0
  252. /package/{content → stacks/blazor-azure}/.morph/standards/architecture.md +0 -0
  253. /package/{content → stacks/blazor-azure}/.morph/standards/azure.md +0 -0
  254. /package/{content → stacks/blazor-azure}/.morph/standards/coding.md +0 -0
  255. /package/{content → stacks/blazor-azure}/.morph/standards/dotnet10-migration.md +0 -0
  256. /package/{content → stacks/blazor-azure}/.morph/standards/fluent-ui-setup.md +0 -0
  257. /package/{content → stacks/blazor-azure}/.morph/standards/passkeys-auth.md +0 -0
  258. /package/{content → stacks/blazor-azure}/.morph/standards/vector-search-rag.md +0 -0
  259. /package/{content → stacks/blazor-azure}/.morph/state.json +0 -0
  260. /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT-FEATURE.md +0 -0
  261. /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT.md +0 -0
  262. /package/{content → stacks/blazor-azure}/.morph/templates/FluentDesignTheme.cs +0 -0
  263. /package/{content → stacks/blazor-azure}/.morph/templates/MudTheme.cs +0 -0
  264. /package/{content → stacks/blazor-azure}/.morph/templates/agent.cs +0 -0
  265. /package/{content → stacks/blazor-azure}/.morph/templates/clarify-questions.md +0 -0
  266. /package/{content → stacks/blazor-azure}/.morph/templates/component.razor +0 -0
  267. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Commands.cs +0 -0
  268. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Entities.cs +0 -0
  269. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Queries.cs +0 -0
  270. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/README.md +0 -0
  271. /package/{content → stacks/blazor-azure}/.morph/templates/contracts.cs +0 -0
  272. /package/{content → stacks/blazor-azure}/.morph/templates/decisions.md +0 -0
  273. /package/{content → stacks/blazor-azure}/.morph/templates/design-system.css +0 -0
  274. /package/{content → stacks/blazor-azure}/.morph/templates/infra/.dockerignore.example +0 -0
  275. /package/{content → stacks/blazor-azure}/.morph/templates/infra/Dockerfile.example +0 -0
  276. /package/{content → stacks/blazor-azure}/.morph/templates/infra/README.md +0 -0
  277. /package/{content → stacks/blazor-azure}/.morph/templates/infra/app-insights.bicep +0 -0
  278. /package/{content → stacks/blazor-azure}/.morph/templates/infra/app-service.bicep +0 -0
  279. /package/{content → stacks/blazor-azure}/.morph/templates/infra/azure-pipelines-deploy.yml +0 -0
  280. /package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app-env.bicep +0 -0
  281. /package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app.bicep +0 -0
  282. /package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.ps1 +0 -0
  283. /package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.sh +0 -0
  284. /package/{content → stacks/blazor-azure}/.morph/templates/infra/key-vault.bicep +0 -0
  285. /package/{content → stacks/blazor-azure}/.morph/templates/infra/main.bicep +0 -0
  286. /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.dev.json +0 -0
  287. /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.prod.json +0 -0
  288. /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.staging.json +0 -0
  289. /package/{content → stacks/blazor-azure}/.morph/templates/infra/sql-database.bicep +0 -0
  290. /package/{content → stacks/blazor-azure}/.morph/templates/infra/storage.bicep +0 -0
  291. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-client.cs +0 -0
  292. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-webhook.cs +0 -0
  293. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/azure-identity-config.cs +0 -0
  294. /package/{content → stacks/blazor-azure}/.morph/templates/integrations/clerk-config.cs +0 -0
  295. /package/{content → stacks/blazor-azure}/.morph/templates/job.cs +0 -0
  296. /package/{content → stacks/blazor-azure}/.morph/templates/migration.cs +0 -0
  297. /package/{content → stacks/blazor-azure}/.morph/templates/proposal.md +0 -0
  298. /package/{content → stacks/blazor-azure}/.morph/templates/recap.md +0 -0
  299. /package/{content → stacks/blazor-azure}/.morph/templates/repository.cs +0 -0
  300. /package/{content → stacks/blazor-azure}/.morph/templates/saas/subscription.cs +0 -0
  301. /package/{content → stacks/blazor-azure}/.morph/templates/saas/tenant.cs +0 -0
  302. /package/{content → stacks/blazor-azure}/.morph/templates/service.cs +0 -0
  303. /package/{content → stacks/blazor-azure}/.morph/templates/simulation.md +0 -0
  304. /package/{content → stacks/blazor-azure}/.morph/templates/spec.md +0 -0
  305. /package/{content → stacks/blazor-azure}/.morph/templates/sprint-status.yaml +0 -0
  306. /package/{content → stacks/blazor-azure}/.morph/templates/state.template.json +0 -0
  307. /package/{content → stacks/blazor-azure}/.morph/templates/story.md +0 -0
  308. /package/{content → stacks/blazor-azure}/.morph/templates/tasks.md +0 -0
  309. /package/{content → stacks/blazor-azure}/.morph/templates/test.cs +0 -0
  310. /package/{content → stacks/blazor-azure}/.morph/templates/ui-components.md +0 -0
  311. /package/{content → stacks/blazor-azure}/.morph/templates/ui-design-system.md +0 -0
  312. /package/{content → stacks/blazor-azure}/.morph/templates/ui-flows.md +0 -0
  313. /package/{content → stacks/blazor-azure}/.morph/templates/ui-mockups.md +0 -0
  314. /package/{content → stacks/blazor-azure}/.morph/test-infra/example.bicep +0 -0
  315. /package/{content → stacks/blazor-azure}/CLAUDE.md +0 -0
  316. /package/{content → stacks/blazor-azure}/README.md +0 -0
@@ -0,0 +1,189 @@
1
+ # EasyPanel Deployer
2
+
3
+ > **Layer:** 2 | **Load:** on-keyword | **Keywords:** easypanel, deploy, docker, ssl, domain, vps, container
4
+
5
+ ## Identity
6
+
7
+ Infrastructure and deployment specialist for EasyPanel on VPS. Builds multi-stage Dockerfiles for .NET API and Next.js frontend, configures GitHub integration for auto-deploy, manages SSL certificates, and sets up health check endpoints.
8
+
9
+ ## Domains
10
+
11
+ - deployment
12
+ - docker
13
+ - ssl
14
+ - monitoring
15
+
16
+ ## Standards
17
+
18
+ - architecture.md -- Layer separation reflected in Docker build stages
19
+ - coding.md -- Health check endpoint patterns
20
+
21
+ ## Patterns
22
+
23
+ ### Dockerfile Multi-Stage (.NET API)
24
+
25
+ ```dockerfile
26
+ # Stage 1: Build
27
+ FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
28
+ WORKDIR /src
29
+ COPY *.csproj .
30
+ RUN dotnet restore
31
+ COPY . .
32
+ RUN dotnet publish -c Release -o /app/publish --no-restore
33
+
34
+ # Stage 2: Runtime
35
+ FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
36
+ WORKDIR /app
37
+ COPY --from=build /app/publish .
38
+ ENV ASPNETCORE_URLS=http://+:8080
39
+ ENV ASPNETCORE_ENVIRONMENT=Production
40
+ EXPOSE 8080
41
+ HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
42
+ CMD curl -f http://localhost:8080/health || exit 1
43
+ ENTRYPOINT ["dotnet", "Api.dll"]
44
+ ```
45
+
46
+ ### Dockerfile Multi-Stage (Next.js)
47
+
48
+ ```dockerfile
49
+ # Stage 1: Dependencies
50
+ FROM node:22-alpine AS deps
51
+ WORKDIR /app
52
+ COPY package.json package-lock.json ./
53
+ RUN npm ci --omit=dev
54
+
55
+ # Stage 2: Build
56
+ FROM node:22-alpine AS builder
57
+ WORKDIR /app
58
+ COPY --from=deps /app/node_modules ./node_modules
59
+ COPY . .
60
+ ENV NEXT_TELEMETRY_DISABLED=1
61
+ RUN npm run build
62
+
63
+ # Stage 3: Runtime
64
+ FROM node:22-alpine AS runner
65
+ WORKDIR /app
66
+ ENV NODE_ENV=production
67
+ ENV NEXT_TELEMETRY_DISABLED=1
68
+ RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs
69
+ COPY --from=builder /app/public ./public
70
+ COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
71
+ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
72
+ USER nextjs
73
+ EXPOSE 3000
74
+ ENV PORT=3000
75
+ ENV HOSTNAME="0.0.0.0"
76
+ CMD ["node", "server.js"]
77
+ ```
78
+
79
+ ### EasyPanel GitHub Integration
80
+
81
+ ```yaml
82
+ # EasyPanel service configuration (via UI or API)
83
+ # 1. Connect GitHub repository
84
+ # 2. Configure build settings:
85
+ Service:
86
+ name: my-app-api
87
+ source: github
88
+ repository: org/repo
89
+ branch: main
90
+ dockerfile: ./backend/Dockerfile
91
+ port: 8080
92
+ env:
93
+ - SUPABASE_URL=https://xxx.supabase.co
94
+ - SUPABASE_SERVICE_KEY=${SECRET}
95
+ - ASPNETCORE_ENVIRONMENT=Production
96
+
97
+ # Auto-deploy: triggers on push to configured branch
98
+ # Rollback: EasyPanel keeps previous image for instant rollback
99
+ ```
100
+
101
+ ### SSL Setup
102
+
103
+ ```
104
+ # EasyPanel handles SSL automatically via Let's Encrypt
105
+ # Configuration steps:
106
+ # 1. Add custom domain in EasyPanel service settings
107
+ # 2. Point DNS A record to VPS IP
108
+ # 3. EasyPanel auto-provisions SSL certificate
109
+ # 4. Auto-renewal handled by EasyPanel
110
+
111
+ # Force HTTPS redirect (handled by EasyPanel reverse proxy)
112
+ # No application-level SSL configuration needed
113
+
114
+ # Multi-domain setup:
115
+ # - api.myapp.com -> API service (port 8080)
116
+ # - myapp.com -> Web service (port 3000)
117
+ ```
118
+
119
+ ### Health Checks
120
+
121
+ ```csharp
122
+ // .NET API health check endpoint
123
+ // Program.cs
124
+ builder.Services.AddHealthChecks()
125
+ .AddNpgSql(connectionString, name: "supabase-db")
126
+ .AddUrlGroup(new Uri($"{supabaseUrl}/rest/v1/"), name: "supabase-api");
127
+
128
+ app.MapHealthChecks("/health", new HealthCheckOptions
129
+ {
130
+ ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
131
+ });
132
+
133
+ app.MapGet("/health/ready", () => Results.Ok(new { status = "ready", timestamp = DateTime.UtcNow }));
134
+ app.MapGet("/health/live", () => Results.Ok(new { status = "alive" }));
135
+ ```
136
+
137
+ ```typescript
138
+ // Next.js health check (app/api/health/route.ts)
139
+ export async function GET() {
140
+ return Response.json({
141
+ status: "healthy",
142
+ timestamp: new Date().toISOString(),
143
+ version: process.env.npm_package_version ?? "unknown",
144
+ });
145
+ }
146
+ ```
147
+
148
+ ### Docker Compose (Local Development)
149
+
150
+ ```yaml
151
+ services:
152
+ api:
153
+ build:
154
+ context: ./backend
155
+ dockerfile: Dockerfile
156
+ ports: ["8080:8080"]
157
+ environment:
158
+ - SUPABASE_URL=http://supabase-kong:8000
159
+ - SUPABASE_SERVICE_KEY=${SERVICE_ROLE_KEY}
160
+ - ASPNETCORE_ENVIRONMENT=Development
161
+ depends_on: [supabase-db]
162
+
163
+ web:
164
+ build:
165
+ context: ./frontend
166
+ dockerfile: Dockerfile
167
+ ports: ["3000:3000"]
168
+ environment:
169
+ - NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321
170
+ - NEXT_PUBLIC_SUPABASE_ANON_KEY=${ANON_KEY}
171
+ - NEXT_PUBLIC_API_URL=http://localhost:8080
172
+ ```
173
+
174
+ ## Checklist
175
+
176
+ - [ ] Dockerfiles use multi-stage builds (small final images)
177
+ - [ ] Next.js uses standalone output mode
178
+ - [ ] .dockerignore excludes node_modules, .next, .git, .env*
179
+ - [ ] Health check endpoints configured
180
+ - [ ] Environment variables set in EasyPanel (not hardcoded)
181
+ - [ ] SSL certificates provisioned via EasyPanel
182
+ - [ ] DNS records point to VPS IP
183
+ - [ ] Auto-deploy configured on main branch
184
+ - [ ] Resource limits set (CPU/memory) in EasyPanel
185
+ - [ ] Logs accessible via EasyPanel dashboard
186
+
187
+ ---
188
+
189
+ *MORPH-SPEC by Polymorphism Tech*
@@ -0,0 +1,170 @@
1
+ # Supabase Expert
2
+
3
+ > **Layer:** 2 | **Load:** on-keyword | **Keywords:** supabase, postgres, rls, auth, storage, realtime, pgvector, migration
4
+
5
+ ## Identity
6
+
7
+ Database and backend-as-a-service specialist for Supabase. Designs PostgreSQL schemas, Row Level Security policies, Auth flows, Storage buckets, Realtime subscriptions, and pgvector embeddings. Ensures all data access goes through RLS-protected paths.
8
+
9
+ ## Domains
10
+
11
+ - database-design
12
+ - auth-flows
13
+ - rls-policies
14
+ - storage
15
+ - vector-search
16
+ - realtime
17
+
18
+ ## Standards
19
+
20
+ - coding.md -- C# naming and async patterns for backend consumers
21
+ - architecture.md -- Layer boundaries when Supabase replaces traditional ORM
22
+
23
+ ## Patterns
24
+
25
+ ### RLS Policy Creation
26
+
27
+ ```sql
28
+ -- Enable RLS on table
29
+ alter table public.documents enable row level security;
30
+
31
+ -- Users can only read their own documents
32
+ create policy "Users read own documents"
33
+ on public.documents for select
34
+ using (auth.uid() = user_id);
35
+
36
+ -- Users can insert documents for themselves
37
+ create policy "Users insert own documents"
38
+ on public.documents for insert
39
+ with check (auth.uid() = user_id);
40
+
41
+ -- Users can update their own documents
42
+ create policy "Users update own documents"
43
+ on public.documents for update
44
+ using (auth.uid() = user_id)
45
+ with check (auth.uid() = user_id);
46
+
47
+ -- Users can delete their own documents
48
+ create policy "Users delete own documents"
49
+ on public.documents for delete
50
+ using (auth.uid() = user_id);
51
+
52
+ -- Service role bypasses RLS (for .NET API with service_role key)
53
+ -- No policy needed: service_role key skips RLS automatically
54
+ ```
55
+
56
+ ### Supabase Auth Setup
57
+
58
+ ```sql
59
+ -- Auth is built-in. Configure providers via Supabase Dashboard or config.toml.
60
+ -- Key tables: auth.users (managed), public.profiles (custom)
61
+
62
+ -- Auto-create profile on signup via trigger
63
+ create or replace function public.handle_new_user()
64
+ returns trigger as $$
65
+ begin
66
+ insert into public.profiles (id, email, display_name, avatar_url)
67
+ values (
68
+ new.id,
69
+ new.email,
70
+ coalesce(new.raw_user_meta_data ->> 'full_name', split_part(new.email, '@', 1)),
71
+ new.raw_user_meta_data ->> 'avatar_url'
72
+ );
73
+ return new;
74
+ end;
75
+ $$ language plpgsql security definer;
76
+
77
+ create trigger on_auth_user_created
78
+ after insert on auth.users
79
+ for each row execute function public.handle_new_user();
80
+ ```
81
+
82
+ ### Storage Bucket Configuration
83
+
84
+ ```sql
85
+ -- Create a private bucket (RLS-protected)
86
+ insert into storage.buckets (id, name, public, file_size_limit, allowed_mime_types)
87
+ values (
88
+ 'documents',
89
+ 'documents',
90
+ false,
91
+ 5242880, -- 5MB
92
+ array['application/pdf', 'image/png', 'image/jpeg']
93
+ );
94
+
95
+ -- Storage RLS: users access their own folder
96
+ create policy "Users manage own files"
97
+ on storage.objects for all
98
+ using (bucket_id = 'documents' and (storage.foldername(name))[1] = auth.uid()::text)
99
+ with check (bucket_id = 'documents' and (storage.foldername(name))[1] = auth.uid()::text);
100
+ ```
101
+
102
+ ### pgvector Queries
103
+
104
+ ```sql
105
+ -- Enable extension
106
+ create extension if not exists vector;
107
+
108
+ -- Table with embedding column
109
+ create table public.document_chunks (
110
+ id bigint generated always as identity primary key,
111
+ document_id uuid references public.documents(id) on delete cascade,
112
+ content text not null,
113
+ embedding vector(1536), -- OpenAI text-embedding-3-small
114
+ metadata jsonb default '{}'::jsonb,
115
+ created_at timestamptz default now()
116
+ );
117
+
118
+ -- HNSW index for fast similarity search
119
+ create index on public.document_chunks
120
+ using hnsw (embedding vector_cosine_ops)
121
+ with (m = 16, ef_construction = 64);
122
+
123
+ -- Similarity search function
124
+ create or replace function match_documents(
125
+ query_embedding vector(1536),
126
+ match_threshold float default 0.78,
127
+ match_count int default 10
128
+ )
129
+ returns table (id bigint, content text, similarity float)
130
+ language sql stable
131
+ as $$
132
+ select
133
+ dc.id,
134
+ dc.content,
135
+ 1 - (dc.embedding <=> query_embedding) as similarity
136
+ from public.document_chunks dc
137
+ where 1 - (dc.embedding <=> query_embedding) > match_threshold
138
+ order by dc.embedding <=> query_embedding
139
+ limit match_count;
140
+ $$;
141
+ ```
142
+
143
+ ### Migration Management
144
+
145
+ ```bash
146
+ # Supabase CLI migration workflow
147
+ supabase migration new create_documents_table # creates timestamped SQL file
148
+ supabase db push # apply migrations to remote
149
+ supabase db reset # reset local DB and replay all migrations
150
+ supabase db diff --schema public # generate migration from schema diff
151
+
152
+ # Migration file naming: supabase/migrations/{timestamp}_description.sql
153
+ # Always include: CREATE TABLE, indexes, RLS enable, policies
154
+ # Never include: seed data (use supabase/seed.sql)
155
+ ```
156
+
157
+ ## Checklist
158
+
159
+ - [ ] All tables have RLS enabled
160
+ - [ ] Every table has at least one SELECT policy
161
+ - [ ] service_role key used only in backend (never exposed to client)
162
+ - [ ] Storage buckets have file size limits and MIME type restrictions
163
+ - [ ] Auth trigger creates profile on signup
164
+ - [ ] pgvector index type matches query pattern (HNSW for recall, IVFFlat for speed)
165
+ - [ ] Migrations are idempotent (use IF NOT EXISTS)
166
+ - [ ] Foreign keys have ON DELETE behavior defined
167
+
168
+ ---
169
+
170
+ *MORPH-SPEC by Polymorphism Tech*