@polymorphism-tech/morph-spec 4.11.1 → 4.13.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 (317) hide show
  1. package/README.md +21 -29
  2. package/bin/morph-spec.js +41 -24
  3. package/bin/task-manager.js +962 -1341
  4. package/bin/validate.js +1 -1
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +10 -11
  7. package/docs/QUICKSTART.md +15 -15
  8. package/framework/CLAUDE.md +5 -2
  9. package/framework/agents/README.md +3 -4
  10. package/framework/agents/ai-agents/ai-system-architect.md +6 -10
  11. package/framework/agents/architecture/seo-growth-hacker.md +166 -326
  12. package/framework/agents/architecture/standards-architect.md +21 -31
  13. package/framework/agents/backend/dotnet-senior.md +160 -86
  14. package/framework/agents/backend/ef-modeler.md +2 -6
  15. package/framework/agents/backend/hangfire-orchestrator.md +8 -9
  16. package/framework/agents/backend/ms-agent-expert.md +1 -1
  17. package/framework/agents/frontend/nextjs-expert.md +198 -133
  18. package/framework/agents/frontend/ui-ux-designer.md +226 -267
  19. package/framework/agents/infrastructure/infra-architect.md +191 -27
  20. package/framework/agents/integrations/clerk-auth.md +19 -26
  21. package/framework/agents/integrations/hangfire-integration.md +1 -4
  22. package/framework/agents.json +226 -1454
  23. package/framework/commands/morph-apply.md +4 -4
  24. package/framework/commands/morph-preflight.md +4 -26
  25. package/framework/commands/morph-proposal.md +19 -19
  26. package/framework/commands/morph-status.md +2 -2
  27. package/framework/commands/morph-troubleshoot.md +6 -13
  28. package/framework/hooks/README.md +1 -6
  29. package/framework/hooks/claude-code/post-tool-use/agent-complete.js +122 -0
  30. package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +4 -6
  31. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +12 -7
  32. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +2 -2
  33. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +2 -2
  34. package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +5 -10
  35. package/framework/hooks/claude-code/session-start/inject-morph-context.js +63 -30
  36. package/framework/hooks/claude-code/session-start/resume-context.js +77 -0
  37. package/framework/hooks/claude-code/statusline.py +4 -5
  38. package/framework/hooks/claude-code/stop/validate-completion.js +4 -4
  39. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +8 -8
  40. package/framework/hooks/shared/compact-restore.js +28 -5
  41. package/framework/hooks/shared/dispatch-helpers.js +17 -0
  42. package/framework/hooks/shared/phase-utils.js +4 -8
  43. package/framework/hooks/shared/state-reader.js +34 -3
  44. package/framework/phases.json +7 -45
  45. package/framework/rules/ai-agents-standards.md +15 -0
  46. package/framework/rules/asaas-standards.md +13 -0
  47. package/framework/rules/clerk-standards.md +13 -0
  48. package/framework/rules/csharp-standards.md +8 -4
  49. package/framework/rules/data-standards.md +18 -0
  50. package/framework/rules/dotnet-templates.md +87 -0
  51. package/framework/rules/frontend-standards.md +13 -13
  52. package/framework/rules/hangfire-standards.md +13 -0
  53. package/framework/rules/infrastructure-standards.md +27 -16
  54. package/framework/rules/morph-workflow.md +73 -13
  55. package/framework/rules/nextjs-standards.md +1 -0
  56. package/framework/rules/nextjs-templates.md +40 -0
  57. package/framework/rules/resend-standards.md +12 -0
  58. package/framework/rules/supabase-standards.md +29 -0
  59. package/framework/skills/README.md +6 -8
  60. package/framework/skills/level-0-meta/mcp-registry.json +21 -99
  61. package/framework/{standards/ai-agents/team-orchestration.md → skills/level-0-meta/morph-agent-teams/SKILL.md} +472 -479
  62. package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +28 -1
  63. package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
  64. package/framework/skills/level-0-meta/morph-code-review/SKILL.md +1 -5
  65. package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +1 -1
  66. package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +23 -41
  67. package/framework/skills/level-0-meta/morph-init/SKILL.md +18 -14
  68. package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +225 -0
  69. package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +20 -0
  70. package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +4 -8
  71. package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +15 -59
  72. package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +7 -19
  73. package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +8 -8
  74. package/framework/skills/level-1-workflows/README.md +1 -1
  75. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +49 -50
  76. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +58 -124
  77. package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +5 -50
  78. package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +1 -1
  79. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +127 -159
  80. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -3
  81. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +2 -2
  82. package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +1 -1
  83. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +17 -13
  84. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +22 -40
  85. package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +0 -2
  86. package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +5 -5
  87. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +275 -61
  88. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
  89. package/framework/squad-templates/backend-only.json +6 -6
  90. package/framework/squad-templates/frontend-only.json +17 -8
  91. package/framework/squad-templates/full-stack.json +29 -24
  92. package/framework/standards/STANDARDS.json +1021 -2338
  93. package/framework/standards/backend/dotnet/fluent-validation-vsa.md +200 -0
  94. package/framework/standards/backend/dotnet/result-pattern.md +213 -0
  95. package/framework/standards/backend/dotnet/scalar-ui.md +172 -0
  96. package/framework/standards/backend/dotnet/scrutor.md +158 -0
  97. package/framework/standards/backend/dotnet/vsa-handler-patterns.md +274 -0
  98. package/framework/standards/frontend/nextjs/motion-patterns.md +1 -1
  99. package/framework/standards/infrastructure/supabase/mcp-setup.md +83 -193
  100. package/framework/standards/integration/mcp/mcp-tools.md +91 -77
  101. package/framework/templates/IDE-SNIPPETS.md +2 -6
  102. package/framework/templates/README.md +709 -814
  103. package/framework/templates/REGISTRY.json +223 -762
  104. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -0
  105. package/framework/templates/code/dotnet/abstractions/error.cs +60 -0
  106. package/framework/templates/code/dotnet/abstractions/handler.cs +12 -0
  107. package/framework/templates/code/dotnet/abstractions/result.cs +74 -0
  108. package/framework/templates/code/dotnet/backend/repository.cs +148 -141
  109. package/framework/templates/code/dotnet/constants/api-tags.cs +6 -0
  110. package/framework/templates/code/dotnet/exceptions/exception-handler.cs +32 -0
  111. package/framework/templates/code/dotnet/extensions/database-extensions.cs +20 -0
  112. package/framework/templates/code/dotnet/extensions/handler-registration.cs +38 -0
  113. package/framework/templates/code/dotnet/extensions/health-checks.cs +24 -0
  114. package/framework/templates/code/dotnet/extensions/map-endpoints.cs +35 -0
  115. package/framework/templates/code/dotnet/extensions/result-extensions.cs +29 -0
  116. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -0
  117. package/framework/templates/code/dotnet/feature/entity.cs.hbs +8 -0
  118. package/framework/templates/code/dotnet/feature/errors.cs.hbs +8 -0
  119. package/framework/templates/code/dotnet/feature/handler.cs.hbs +24 -0
  120. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -0
  121. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -0
  122. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -0
  123. package/framework/templates/code/dotnet/jobs/job.cs +21 -17
  124. package/framework/templates/code/dotnet/pipelines/logging-decorator.cs +31 -0
  125. package/framework/templates/code/dotnet/pipelines/validation-decorator.cs +97 -0
  126. package/framework/templates/code/dotnet/test.cs +192 -106
  127. package/framework/templates/context/ARCHITECTURE.md +89 -0
  128. package/framework/templates/context/CONTEXT-FEATURE.md +2 -2
  129. package/framework/templates/context/CONTEXT.md +180 -181
  130. package/framework/templates/context/design-system.md +342 -211
  131. package/framework/templates/docs/onboarding.md +2 -3
  132. package/framework/templates/docs/proposal.md +171 -182
  133. package/framework/templates/docs/spec.md +1 -3
  134. package/framework/templates/docs/ui-components.md +0 -72
  135. package/framework/templates/examples/design-system-examples.md +4 -4
  136. package/framework/templates/feature/decisions.md +0 -66
  137. package/framework/templates/feature/recap.md +1 -2
  138. package/framework/templates/infrastructure/github/README.md +56 -593
  139. package/framework/templates/integrations/clerk-config.cs +0 -41
  140. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  141. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -2
  142. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +83 -126
  143. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +2 -2
  144. package/framework/templates/project/validate.js +2 -4
  145. package/framework/templates/ui/design-system.css +1 -1
  146. package/framework/workflows/README.md +8 -8
  147. package/framework/workflows/configs/fast-track.json +51 -0
  148. package/framework/workflows/configs/full.json +68 -0
  149. package/framework/workflows/configs/standard.json +7 -3
  150. package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +1 -1
  151. package/framework/workflows/docs/enforcement-pipeline.md +18 -19
  152. package/framework/workflows/docs/full-morph.md +69 -76
  153. package/framework/workflows/docs/standard.md +49 -44
  154. package/framework/workflows/docs/ui-refresh.md +1 -1
  155. package/package.json +3 -3
  156. package/src/commands/agents/dispatch-agents.js +55 -116
  157. package/src/commands/context/context-refresh.js +79 -0
  158. package/src/commands/mcp/mcp-setup.js +28 -6
  159. package/src/commands/phase/phase-reset.js +1 -1
  160. package/src/commands/project/doctor.js +10 -32
  161. package/src/commands/project/init.js +32 -1
  162. package/src/commands/project/status.js +6 -12
  163. package/src/commands/scaffold/scaffold.js +131 -0
  164. package/src/commands/scope/escalate.js +1 -1
  165. package/src/commands/state/advance-phase.js +15 -29
  166. package/src/commands/state/state.js +20 -5
  167. package/src/commands/tasks/task.js +0 -30
  168. package/src/commands/validation/validate-feature.js +3 -10
  169. package/src/core/paths/output-schema.js +12 -13
  170. package/src/core/state/phase-state-machine.js +211 -217
  171. package/src/core/state/state-manager.js +9 -9
  172. package/src/lib/agents/agents-manager.js +2 -2
  173. package/src/lib/agents/output-collector.js +1 -2
  174. package/src/lib/detectors/design-system-detector.js +4 -4
  175. package/src/lib/detectors/index.js +1 -11
  176. package/src/lib/generators/architecture-scanner.js +640 -0
  177. package/src/lib/generators/context-generator.js +3 -3
  178. package/src/lib/generators/design-system-generator.js +508 -298
  179. package/src/lib/generators/index.js +12 -10
  180. package/src/lib/generators/metadata-extractor.js +386 -387
  181. package/src/lib/generators/recap-generator.js +4 -4
  182. package/src/lib/generators/scaffold-generator.js +317 -0
  183. package/src/lib/generators/settings-generator.js +0 -1
  184. package/src/lib/phase-chain/phase-validator.js +64 -42
  185. package/src/lib/stack/stack-profile.js +2 -2
  186. package/src/lib/standards/digest-builder.js +72 -285
  187. package/src/lib/tasks/task-parser.js +11 -5
  188. package/src/lib/validators/architecture/architecture-validator.js +259 -387
  189. package/src/lib/validators/content/content-validator.js +287 -287
  190. package/src/lib/validators/css/css-validator.js +340 -352
  191. package/src/lib/validators/design-system/design-system-validator.js +11 -5
  192. package/src/lib/validators/packages/package-validator.js +347 -360
  193. package/src/lib/validators/shared/issue-counter.js +14 -18
  194. package/src/lib/validators/validation-runner.js +3 -19
  195. package/src/scripts/setup-infra.js +1 -1
  196. package/src/utils/agents-installer.js +24 -3
  197. package/src/utils/file-copier.js +1 -0
  198. package/src/utils/hooks-installer.js +21 -19
  199. package/src/utils/skills-installer.js +178 -178
  200. package/framework/agents/architecture/prompt-engineer.md +0 -195
  201. package/framework/agents/backend/api-designer.md +0 -106
  202. package/framework/agents/frontend/blazor-builder.md +0 -229
  203. package/framework/agents/frontend/nextjs-ui-specialist.md +0 -218
  204. package/framework/agents/infrastructure/azure-architect.md +0 -150
  205. package/framework/agents/infrastructure/azure-deploy-specialist.md +0 -707
  206. package/framework/agents/infrastructure/bicep-architect.md +0 -132
  207. package/framework/agents/infrastructure/container-specialist.md +0 -137
  208. package/framework/agents/infrastructure/devops-engineer.md +0 -126
  209. package/framework/agents/integrations/azure-identity.md +0 -148
  210. package/framework/agents/quality/code-analyzer.md +0 -239
  211. package/framework/agents/quality/testing-specialist.md +0 -130
  212. package/framework/hooks/claude-code/notification/approval-reminder.js +0 -57
  213. package/framework/hooks/claude-code/post-tool-use/context-refresh.js +0 -109
  214. package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +0 -78
  215. package/framework/index/troubleshooting-index.json +0 -184
  216. package/framework/rules/testing-standards.md +0 -14
  217. package/framework/skills/level-0-meta/morph-replicate/SKILL.md +0 -230
  218. package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +0 -70
  219. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +0 -256
  220. package/framework/skills/level-1-workflows/morph-phase-clarify/references/clarifications-example.md +0 -117
  221. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +0 -269
  222. package/framework/standards/ai-agents/blazor-ui.md +0 -364
  223. package/framework/standards/architecture/ddd/aggregates.md +0 -120
  224. package/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
  225. package/framework/standards/architecture/ddd/complexity-levels.md +0 -108
  226. package/framework/standards/architecture/ddd/entities.md +0 -99
  227. package/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
  228. package/framework/standards/architecture/ddd/value-objects.md +0 -124
  229. package/framework/standards/backend/api/minimal-api.md +0 -494
  230. package/framework/standards/backend/api/rest.md +0 -492
  231. package/framework/standards/backend/authentication/passkeys.md +0 -428
  232. package/framework/standards/backend/database/ef-core.md +0 -199
  233. package/framework/standards/backend/database/migrations.md +0 -393
  234. package/framework/standards/backend/database/repository-patterns.md +0 -528
  235. package/framework/standards/backend/dotnet/async.md +0 -366
  236. package/framework/standards/backend/dotnet/core.md +0 -117
  237. package/framework/standards/backend/dotnet/di.md +0 -439
  238. package/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
  239. package/framework/standards/context/analytics.md +0 -96
  240. package/framework/standards/context/bundles.md +0 -110
  241. package/framework/standards/context/priming.md +0 -78
  242. package/framework/standards/core/architecture.md +0 -185
  243. package/framework/standards/core/coding.md +0 -214
  244. package/framework/standards/core/git-branching-strategy.md +0 -403
  245. package/framework/standards/core/git.md +0 -185
  246. package/framework/standards/core/testing.md +0 -295
  247. package/framework/standards/data/nosql/blob-storage.md +0 -102
  248. package/framework/standards/data/vector-search/azure-ai-search.md +0 -121
  249. package/framework/standards/frontend/blazor/design-checklist.md +0 -222
  250. package/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  251. package/framework/standards/frontend/blazor/fluent-ui.md +0 -137
  252. package/framework/standards/frontend/blazor/html-conversion.md +0 -184
  253. package/framework/standards/frontend/blazor/lifecycle.md +0 -195
  254. package/framework/standards/frontend/blazor/pitfalls.md +0 -198
  255. package/framework/standards/frontend/blazor/state.md +0 -191
  256. package/framework/standards/frontend/design-system/aesthetic-direction.md +0 -213
  257. package/framework/standards/infrastructure/azure/azure.md +0 -624
  258. package/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  259. package/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  260. package/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
  261. package/framework/standards/infrastructure/azure/services/functions.md +0 -486
  262. package/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
  263. package/framework/standards/infrastructure/azure/services/storage.md +0 -407
  264. package/framework/standards/infrastructure/vercel/vercel-database.md +0 -106
  265. package/framework/standards/integration/api/graphql.md +0 -91
  266. package/framework/standards/integration/api/grpc.md +0 -114
  267. package/framework/standards/integration/api/rest-design.md +0 -95
  268. package/framework/standards/integration/event-driven/cqrs.md +0 -101
  269. package/framework/standards/integration/event-driven/event-sourcing.md +0 -124
  270. package/framework/standards/integration/event-driven/service-bus.md +0 -95
  271. package/framework/standards/observability/logging.md +0 -131
  272. package/framework/standards/observability/metrics.md +0 -121
  273. package/framework/standards/observability/monitoring.md +0 -114
  274. package/framework/standards/observability/tracing.md +0 -132
  275. package/framework/standards/workflows/parallel-execution.md +0 -112
  276. package/framework/standards/workflows/thread-management.md +0 -113
  277. package/framework/templates/code/dotnet/backend/service.cs +0 -139
  278. package/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
  279. package/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
  280. package/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
  281. package/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
  282. package/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
  283. package/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
  284. package/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
  285. package/framework/templates/code/dotnet/frontend/component.razor +0 -239
  286. package/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
  287. package/framework/templates/infrastructure/azure/README.md +0 -286
  288. package/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
  289. package/framework/templates/infrastructure/azure/app-service.bicep +0 -164
  290. package/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
  291. package/framework/templates/infrastructure/azure/container-app.bicep +0 -156
  292. package/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
  293. package/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
  294. package/framework/templates/infrastructure/azure/deploy.sh +0 -208
  295. package/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
  296. package/framework/templates/infrastructure/azure/main.bicep +0 -189
  297. package/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
  298. package/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
  299. package/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
  300. package/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
  301. package/framework/templates/infrastructure/azure/storage.bicep +0 -106
  302. package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
  303. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
  304. package/framework/templates/integrations/azure-identity-config.cs +0 -288
  305. package/framework/templates/project-structure/dotnet-ddd.md +0 -70
  306. package/framework/templates/saas/subscription.cs +0 -347
  307. package/framework/templates/saas/tenant.cs +0 -338
  308. package/framework/templates/ui/FluentDesignTheme.cs +0 -149
  309. package/framework/templates/ui/MudTheme.cs +0 -281
  310. package/framework/workflows/configs/nodejs-cli.json +0 -40
  311. package/src/commands/standards/context-budget.js +0 -89
  312. package/src/lib/standards/index.js +0 -7
  313. package/src/lib/standards/standards-context-injector.js +0 -302
  314. package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +0 -316
  315. package/src/lib/validators/blazor/blazor-state-validator.js +0 -279
  316. package/src/lib/validators/blazor/blazor-validator.js +0 -369
  317. package/src/lib/validators/blazor/index.js +0 -9
@@ -1,494 +0,0 @@
1
- # Minimal API Standards - .NET
2
-
3
- > **Scope:** universal
4
- > **Layer:** 0 (always load)
5
- > **Keywords:** minimal api, dotnet, asp.net, endpoint, mapget, mappost
6
- > **Load When:** always
7
-
8
- Patterns and best practices for .NET Minimal API endpoints.
9
-
10
- ---
11
-
12
- ## Route Handler Structure
13
-
14
- ### File Organization
15
-
16
- ```
17
- app/api/
18
- auth/
19
- login/
20
- route.ts # POST /api/auth/login
21
- logout/
22
- route.ts # POST /api/auth/logout
23
- users/
24
- route.ts # GET /api/users, POST /api/users
25
- [id]/
26
- route.ts # GET /api/users/:id, PATCH /api/users/:id
27
- ```
28
-
29
- ### HTTP Methods
30
-
31
- ```typescript
32
- // app/api/users/route.ts
33
- import { NextRequest, NextResponse } from 'next/server'
34
-
35
- // GET /api/users
36
- export async function GET(request: NextRequest) {
37
- const searchParams = request.nextUrl.searchParams
38
- const limit = searchParams.get('limit') || '10'
39
-
40
- // Fetch users
41
- return NextResponse.json({ users: [] })
42
- }
43
-
44
- // POST /api/users
45
- export async function POST(request: NextRequest) {
46
- const body = await request.json()
47
-
48
- // Create user
49
- return NextResponse.json({ user: {} }, { status: 201 })
50
- }
51
- ```
52
-
53
- ### Dynamic Routes
54
-
55
- ```typescript
56
- // app/api/users/[id]/route.ts
57
- interface RouteParams {
58
- params: { id: string }
59
- }
60
-
61
- export async function GET(
62
- request: NextRequest,
63
- { params }: RouteParams
64
- ) {
65
- const userId = params.id
66
-
67
- // Fetch user by ID
68
- return NextResponse.json({ user: {} })
69
- }
70
-
71
- export async function PATCH(
72
- request: NextRequest,
73
- { params }: RouteParams
74
- ) {
75
- const userId = params.id
76
- const updates = await request.json()
77
-
78
- // Update user
79
- return NextResponse.json({ user: {} })
80
- }
81
-
82
- export async function DELETE(
83
- request: NextRequest,
84
- { params }: RouteParams
85
- ) {
86
- const userId = params.id
87
-
88
- // Delete user
89
- return NextResponse.json(null, { status: 204 })
90
- }
91
- ```
92
-
93
- ---
94
-
95
- ## Request Handling
96
-
97
- ### Query Parameters
98
-
99
- ```typescript
100
- export async function GET(request: NextRequest) {
101
- const searchParams = request.nextUrl.searchParams
102
- const page = parseInt(searchParams.get('page') || '1')
103
- const limit = parseInt(searchParams.get('limit') || '10')
104
- const sort = searchParams.get('sort') || 'created_at'
105
-
106
- // Use query params
107
- }
108
- ```
109
-
110
- ### Request Body Validation (Zod)
111
-
112
- ```typescript
113
- import { z } from 'zod'
114
-
115
- const createUserSchema = z.object({
116
- name: z.string().min(1, 'Name is required'),
117
- email: z.string().email('Invalid email'),
118
- age: z.number().int().positive().optional()
119
- })
120
-
121
- export async function POST(request: NextRequest) {
122
- try {
123
- const body = await request.json()
124
- const validatedData = createUserSchema.parse(body)
125
-
126
- // Proceed with validated data
127
- return NextResponse.json({ user: validatedData }, { status: 201 })
128
- } catch (error) {
129
- if (error instanceof z.ZodError) {
130
- return NextResponse.json(
131
- { error: 'Validation failed', details: error.errors },
132
- { status: 400 }
133
- )
134
- }
135
- throw error
136
- }
137
- }
138
- ```
139
-
140
- ### Headers
141
-
142
- ```typescript
143
- export async function GET(request: NextRequest) {
144
- const authHeader = request.headers.get('authorization')
145
- const contentType = request.headers.get('content-type')
146
-
147
- // Set response headers
148
- return NextResponse.json(
149
- { data: {} },
150
- {
151
- headers: {
152
- 'Cache-Control': 'max-age=3600',
153
- 'X-Custom-Header': 'value'
154
- }
155
- }
156
- )
157
- }
158
- ```
159
-
160
- ---
161
-
162
- ## Response Patterns
163
-
164
- ### Success Responses
165
-
166
- ```typescript
167
- // 200 OK - Successful GET
168
- return NextResponse.json({ users: [] })
169
-
170
- // 201 Created - Successful POST
171
- return NextResponse.json({ user: {} }, { status: 201 })
172
-
173
- // 204 No Content - Successful DELETE
174
- return new NextResponse(null, { status: 204 })
175
- ```
176
-
177
- ### Error Responses
178
-
179
- ```typescript
180
- // 400 Bad Request
181
- return NextResponse.json(
182
- { error: 'Invalid input', details: errors },
183
- { status: 400 }
184
- )
185
-
186
- // 401 Unauthorized
187
- return NextResponse.json(
188
- { error: 'Authentication required' },
189
- { status: 401 }
190
- )
191
-
192
- // 403 Forbidden
193
- return NextResponse.json(
194
- { error: 'Insufficient permissions' },
195
- { status: 403 }
196
- )
197
-
198
- // 404 Not Found
199
- return NextResponse.json(
200
- { error: 'Resource not found' },
201
- { status: 404 }
202
- )
203
-
204
- // 500 Internal Server Error
205
- return NextResponse.json(
206
- { error: 'Internal server error' },
207
- { status: 500 }
208
- )
209
- ```
210
-
211
- ---
212
-
213
- ## Authentication & Authorization
214
-
215
- ### Middleware-based Auth
216
-
217
- ```typescript
218
- // middleware.ts
219
- import { createMiddlewareClient } from '@/lib/supabase/middleware'
220
- import { NextResponse } from 'next/server'
221
-
222
- export async function middleware(request: NextRequest) {
223
- const res = NextResponse.next()
224
- const supabase = createMiddlewareClient(request, res)
225
-
226
- const { data: { session } } = await supabase.auth.getSession()
227
-
228
- // Protected API routes
229
- if (request.nextUrl.pathname.startsWith('/api/protected') && !session) {
230
- return NextResponse.json(
231
- { error: 'Unauthorized' },
232
- { status: 401 }
233
- )
234
- }
235
-
236
- return res
237
- }
238
- ```
239
-
240
- ### Route-level Auth
241
-
242
- ```typescript
243
- import { createRouteHandlerClient } from '@/lib/supabase/server'
244
-
245
- export async function GET(request: NextRequest) {
246
- const supabase = createRouteHandlerClient()
247
- const { data: { session } } = await supabase.auth.getSession()
248
-
249
- if (!session) {
250
- return NextResponse.json(
251
- { error: 'Unauthorized' },
252
- { status: 401 }
253
- )
254
- }
255
-
256
- // Proceed with authenticated request
257
- const { data: profile } = await supabase
258
- .from('profiles')
259
- .select('*')
260
- .eq('user_id', session.user.id)
261
- .single()
262
-
263
- return NextResponse.json({ profile })
264
- }
265
- ```
266
-
267
- ### Role-based Authorization
268
-
269
- ```typescript
270
- const ADMIN_ROLES = ['admin', 'super_admin']
271
-
272
- export async function DELETE(
273
- request: NextRequest,
274
- { params }: { params: { id: string } }
275
- ) {
276
- const supabase = createRouteHandlerClient()
277
- const { data: { session } } = await supabase.auth.getSession()
278
-
279
- if (!session) {
280
- return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
281
- }
282
-
283
- // Check user role
284
- const { data: profile } = await supabase
285
- .from('profiles')
286
- .select('role')
287
- .eq('user_id', session.user.id)
288
- .single()
289
-
290
- if (!profile || !ADMIN_ROLES.includes(profile.role)) {
291
- return NextResponse.json({ error: 'Forbidden' }, { status: 403 })
292
- }
293
-
294
- // Proceed with admin-only operation
295
- }
296
- ```
297
-
298
- ---
299
-
300
- ## Error Handling
301
-
302
- ### Centralized Error Handler
303
-
304
- ```typescript
305
- // lib/api/errorHandler.ts
306
- import { NextResponse } from 'next/server'
307
- import { PostgrestError } from '@supabase/supabase-js'
308
- import { z } from 'zod'
309
-
310
- export function handleApiError(error: unknown) {
311
- console.error('API Error:', error)
312
-
313
- // Zod validation errors
314
- if (error instanceof z.ZodError) {
315
- return NextResponse.json(
316
- { error: 'Validation failed', details: error.errors },
317
- { status: 400 }
318
- )
319
- }
320
-
321
- // Supabase errors
322
- if (isPostgrestError(error)) {
323
- return NextResponse.json(
324
- { error: error.message, code: error.code },
325
- { status: 400 }
326
- )
327
- }
328
-
329
- // Default error
330
- return NextResponse.json(
331
- { error: 'Internal server error' },
332
- { status: 500 }
333
- )
334
- }
335
-
336
- function isPostgrestError(error: unknown): error is PostgrestError {
337
- return (error as PostgrestError).code !== undefined
338
- }
339
- ```
340
-
341
- ### Usage
342
-
343
- ```typescript
344
- import { handleApiError } from '@/lib/api/errorHandler'
345
-
346
- export async function POST(request: NextRequest) {
347
- try {
348
- // API logic
349
- return NextResponse.json({ success: true })
350
- } catch (error) {
351
- return handleApiError(error)
352
- }
353
- }
354
- ```
355
-
356
- ---
357
-
358
- ## Supabase Integration
359
-
360
- ### Database Operations
361
-
362
- ```typescript
363
- import { createRouteHandlerClient } from '@/lib/supabase/server'
364
-
365
- export async function GET(request: NextRequest) {
366
- const supabase = createRouteHandlerClient()
367
-
368
- const { data: users, error } = await supabase
369
- .from('users')
370
- .select('id, name, email')
371
- .order('created_at', { ascending: false })
372
- .limit(10)
373
-
374
- if (error) {
375
- return NextResponse.json({ error: error.message }, { status: 500 })
376
- }
377
-
378
- return NextResponse.json({ users })
379
- }
380
- ```
381
-
382
- ### Row Level Security (RLS)
383
-
384
- ```typescript
385
- // Supabase automatically enforces RLS based on authenticated user
386
- export async function GET(request: NextRequest) {
387
- const supabase = createRouteHandlerClient()
388
-
389
- // Only returns rows the authenticated user can access
390
- const { data: documents } = await supabase
391
- .from('documents')
392
- .select('*')
393
-
394
- return NextResponse.json({ documents })
395
- }
396
- ```
397
-
398
- ---
399
-
400
- ## Caching
401
-
402
- ### Static Data (ISR)
403
-
404
- ```typescript
405
- export async function GET() {
406
- const data = await fetchStaticData()
407
-
408
- return NextResponse.json(
409
- { data },
410
- {
411
- headers: {
412
- 'Cache-Control': 'public, s-maxage=3600, stale-while-revalidate=86400'
413
- }
414
- }
415
- )
416
- }
417
- ```
418
-
419
- ### Opt-out of Caching
420
-
421
- ```typescript
422
- export const dynamic = 'force-dynamic' // Opt out of caching
423
- export const revalidate = 0 // Disable ISR
424
-
425
- export async function GET() {
426
- // Always fetch fresh data
427
- return NextResponse.json({ data: [] })
428
- }
429
- ```
430
-
431
- ---
432
-
433
- ## CORS Configuration
434
-
435
- ```typescript
436
- // app/api/public/route.ts
437
- export async function GET(request: NextRequest) {
438
- const response = NextResponse.json({ data: [] })
439
-
440
- // Allow CORS
441
- response.headers.set('Access-Control-Allow-Origin', '*')
442
- response.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
443
- response.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization')
444
-
445
- return response
446
- }
447
-
448
- export async function OPTIONS() {
449
- return new NextResponse(null, {
450
- status: 204,
451
- headers: {
452
- 'Access-Control-Allow-Origin': '*',
453
- 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
454
- 'Access-Control-Allow-Headers': 'Content-Type, Authorization'
455
- }
456
- })
457
- }
458
- ```
459
-
460
- ---
461
-
462
- ## Testing API Routes
463
-
464
- ```typescript
465
- import { describe, it, expect } from 'vitest'
466
- import { GET, POST } from './route'
467
-
468
- describe('/api/users', () => {
469
- it('should return users list', async () => {
470
- const request = new Request('http://localhost:3000/api/users')
471
- const response = await GET(request)
472
- const data = await response.json()
473
-
474
- expect(response.status).toBe(200)
475
- expect(Array.isArray(data.users)).toBe(true)
476
- })
477
-
478
- it('should create a new user', async () => {
479
- const request = new Request('http://localhost:3000/api/users', {
480
- method: 'POST',
481
- body: JSON.stringify({ name: 'John', email: 'john@example.com' })
482
- })
483
- const response = await POST(request)
484
- const data = await response.json()
485
-
486
- expect(response.status).toBe(201)
487
- expect(data.user).toBeDefined()
488
- })
489
- })
490
- ```
491
-
492
- ---
493
-
494
- *API Routes Standards - MORPH-SPEC by Polymorphism Tech*