@polymorphism-tech/morph-spec 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/CLAUDE.md +68 -400
  2. package/README.md +198 -76
  3. package/bin/detect-agents.js +227 -225
  4. package/bin/morph-spec.js +10 -0
  5. package/bin/render-template.js +303 -302
  6. package/bin/semantic-detect-agents.js +247 -246
  7. package/bin/{task-manager.js → task-manager.cjs} +12 -1
  8. package/bin/validate-agents-skills.js +257 -251
  9. package/bin/validate-agents.js +70 -69
  10. package/bin/validate-phase.js +263 -263
  11. package/docs/getting-started.md +3 -3
  12. package/package.json +3 -4
  13. package/scripts/reorganize-skills.cjs +175 -0
  14. package/scripts/validate-agents-structure.cjs +52 -0
  15. package/scripts/validate-skills.cjs +180 -0
  16. package/src/commands/create-story.js +354 -351
  17. package/src/commands/detect-agents.js +13 -2
  18. package/src/commands/detect.js +104 -104
  19. package/src/commands/state.js +334 -333
  20. package/src/commands/sync.js +167 -167
  21. package/src/commands/task.js +1 -1
  22. package/src/commands/update.js +13 -1
  23. package/src/lib/context-generator.js +7 -4
  24. package/{detectors → src/lib/detectors}/config-detector.js +223 -223
  25. package/{detectors → src/lib/detectors}/conversation-analyzer.js +163 -163
  26. package/{detectors → src/lib/detectors}/index.js +84 -84
  27. package/{detectors → src/lib/detectors}/standards-generator.js +275 -275
  28. package/src/lib/hook-executor.js +2 -1
  29. package/src/lib/stack-resolver.js +148 -0
  30. package/src/lib/standards-context-injector.js +4 -3
  31. package/src/lib/state-manager.js +21 -4
  32. package/src/lib/team-orchestrator.js +2 -1
  33. package/src/lib/troubleshoot-grep.js +13 -3
  34. package/src/lib/validation-runner.js +2 -1
  35. package/src/utils/file-copier.js +3 -1
  36. package/{content → stacks/blazor-azure}/.azure/README.md +293 -293
  37. package/{content → stacks/blazor-azure}/.azure/docs/azure-devops-setup.md +454 -454
  38. package/{content → stacks/blazor-azure}/.azure/docs/branch-strategy.md +398 -398
  39. package/{content → stacks/blazor-azure}/.azure/docs/local-development.md +515 -515
  40. package/{content → stacks/blazor-azure}/.azure/pipelines/pipeline-variables.yml +34 -34
  41. package/{content → stacks/blazor-azure}/.azure/pipelines/prod-pipeline.yml +319 -319
  42. package/{content → stacks/blazor-azure}/.azure/pipelines/staging-pipeline.yml +234 -234
  43. package/{content → stacks/blazor-azure}/.azure/pipelines/templates/build-dotnet.yml +75 -75
  44. package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-app-service.yml +94 -94
  45. package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-container-app.yml +120 -120
  46. package/{content → stacks/blazor-azure}/.azure/pipelines/templates/infra-deploy.yml +90 -90
  47. package/{content → stacks/blazor-azure}/.claude/commands/morph-archive.md +79 -79
  48. package/{content → stacks/blazor-azure}/.claude/commands/morph-deploy.md +529 -529
  49. package/{content → stacks/blazor-azure}/.claude/commands/morph-infra.md +209 -209
  50. package/{content → stacks/blazor-azure}/.claude/commands/morph-troubleshoot.md +1 -1
  51. package/{content → stacks/blazor-azure}/.claude/settings.local.json +15 -15
  52. package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-setup.md +1 -1
  53. package/{content/.claude/skills/specialists → stacks/blazor-azure/.claude/skills/level-2-domains/architecture}/prompt-engineer.md +189 -189
  54. package/{content/.claude/skills/specialists → stacks/blazor-azure/.claude/skills/level-2-domains/architecture}/seo-growth-hacker.md +320 -320
  55. package/{content/.claude/skills/infra → stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure}/azure-deploy-specialist.md +699 -699
  56. package/{content → stacks/blazor-azure}/.morph/.morphversion +5 -5
  57. package/{content → stacks/blazor-azure}/.morph/archive/.gitkeep +25 -25
  58. package/{content → stacks/blazor-azure}/.morph/config/agents.json +7 -5
  59. package/{content → stacks/blazor-azure}/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
  60. package/{content → stacks/blazor-azure}/.morph/docs/workflows/enforcement-pipeline.md +3 -3
  61. package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/README.md +241 -241
  62. package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/contracts.ts +307 -307
  63. package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/spec.md +399 -399
  64. package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/tasks.md +168 -168
  65. package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/README.md +125 -125
  66. package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/contracts.cs +358 -358
  67. package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/decisions.md +246 -246
  68. package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/spec.md +236 -236
  69. package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/tasks.md +150 -150
  70. package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/README.md +309 -309
  71. package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/contracts.cs +433 -433
  72. package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/spec.md +479 -479
  73. package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/tasks.md +185 -185
  74. package/{content → stacks/blazor-azure}/.morph/examples/state-v3.json +188 -188
  75. package/{content → stacks/blazor-azure}/.morph/features/.gitkeep +25 -25
  76. package/{content → stacks/blazor-azure}/.morph/hooks/README.md +12 -12
  77. package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-all.sh +48 -48
  78. package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-specs.sh +49 -49
  79. package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-tests.sh +60 -60
  80. package/{content → stacks/blazor-azure}/.morph/project.md +160 -160
  81. package/{content → stacks/blazor-azure}/.morph/schemas/agent.schema.json +296 -296
  82. package/{content → stacks/blazor-azure}/.morph/specs/.gitkeep +20 -20
  83. package/{content → stacks/blazor-azure}/.morph/standards/agent-teams-workflow.md +2 -2
  84. package/{content → stacks/blazor-azure}/.morph/standards/coding.md +377 -377
  85. package/{content → stacks/blazor-azure}/.morph/standards/fluent-ui-setup.md +590 -590
  86. package/{content → stacks/blazor-azure}/.morph/standards/migration-guide.md +514 -514
  87. package/{content → stacks/blazor-azure}/.morph/standards/passkeys-auth.md +423 -423
  88. package/{content → stacks/blazor-azure}/.morph/standards/vector-search-rag.md +536 -536
  89. package/{content → stacks/blazor-azure}/.morph/state.json +17 -17
  90. package/{content → stacks/blazor-azure}/.morph/templates/FluentDesignTheme.cs +149 -149
  91. package/{content → stacks/blazor-azure}/.morph/templates/MudTheme.cs +281 -281
  92. package/{content → stacks/blazor-azure}/.morph/templates/component.razor +239 -239
  93. package/{content → stacks/blazor-azure}/.morph/templates/contracts.cs +217 -217
  94. package/{content → stacks/blazor-azure}/.morph/templates/design-system.css +226 -226
  95. package/{content → stacks/blazor-azure}/.morph/templates/infra/.dockerignore.example +89 -89
  96. package/{content → stacks/blazor-azure}/.morph/templates/infra/Dockerfile.example +82 -82
  97. package/{content → stacks/blazor-azure}/.morph/templates/infra/README.md +286 -286
  98. package/{content → stacks/blazor-azure}/.morph/templates/infra/app-insights.bicep +63 -63
  99. package/{content → stacks/blazor-azure}/.morph/templates/infra/app-service.bicep +164 -164
  100. package/{content → stacks/blazor-azure}/.morph/templates/infra/azure-pipelines-deploy.yml +480 -480
  101. package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app-env.bicep +49 -49
  102. package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app.bicep +156 -156
  103. package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.ps1 +229 -229
  104. package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.sh +208 -208
  105. package/{content → stacks/blazor-azure}/.morph/templates/infra/key-vault.bicep +91 -91
  106. package/{content → stacks/blazor-azure}/.morph/templates/infra/main.bicep +189 -189
  107. package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.dev.json +29 -29
  108. package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.prod.json +29 -29
  109. package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.staging.json +29 -29
  110. package/{content → stacks/blazor-azure}/.morph/templates/infra/sql-database.bicep +103 -103
  111. package/{content → stacks/blazor-azure}/.morph/templates/infra/storage.bicep +106 -106
  112. package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-client.cs +387 -387
  113. package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-webhook.cs +351 -351
  114. package/{content → stacks/blazor-azure}/.morph/templates/integrations/azure-identity-config.cs +288 -288
  115. package/{content → stacks/blazor-azure}/.morph/templates/integrations/clerk-config.cs +258 -258
  116. package/{content → stacks/blazor-azure}/.morph/templates/job.cs +171 -171
  117. package/{content → stacks/blazor-azure}/.morph/templates/migration.cs +83 -83
  118. package/{content → stacks/blazor-azure}/.morph/templates/repository.cs +141 -141
  119. package/{content → stacks/blazor-azure}/.morph/templates/saas/subscription.cs +347 -347
  120. package/{content → stacks/blazor-azure}/.morph/templates/saas/tenant.cs +338 -338
  121. package/{content → stacks/blazor-azure}/.morph/templates/service.cs +139 -139
  122. package/{content → stacks/blazor-azure}/.morph/templates/sprint-status.yaml +68 -68
  123. package/{content → stacks/blazor-azure}/.morph/templates/story.md +143 -143
  124. package/{content → stacks/blazor-azure}/.morph/templates/test.cs +239 -239
  125. package/{content → stacks/blazor-azure}/.morph/templates/ui-design-system.md +286 -286
  126. package/{content → stacks/blazor-azure}/.morph/templates/ui-flows.md +336 -336
  127. package/{content → stacks/blazor-azure}/.morph/templates/ui-mockups.md +133 -133
  128. package/{content → stacks/blazor-azure}/.morph/test-infra/example.bicep +59 -59
  129. package/{content → stacks/blazor-azure}/README.md +79 -79
  130. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/backend/dotnet-supabase.md +244 -0
  131. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/frontend/nextjs-supabase.md +335 -0
  132. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/infrastructure/easypanel-deployer.md +189 -0
  133. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +170 -0
  134. package/stacks/nextjs-supabase/.morph/config/agents.json +345 -0
  135. package/stacks/nextjs-supabase/.morph/config/config.template.json +92 -0
  136. package/stacks/nextjs-supabase/.morph/docs/easypanel-setup.md +169 -0
  137. package/stacks/nextjs-supabase/.morph/docs/supabase-mcp-setup.md +247 -0
  138. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/README.md +697 -0
  139. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/spec.md +85 -0
  140. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/tasks.md +86 -0
  141. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/README.md +498 -0
  142. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/decisions.md +121 -0
  143. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/spec.md +138 -0
  144. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/tasks.md +162 -0
  145. package/stacks/nextjs-supabase/.morph/project.md +168 -0
  146. package/stacks/nextjs-supabase/.morph/standards/easypanel-deploy.md +191 -0
  147. package/stacks/nextjs-supabase/.morph/standards/nextjs-patterns.md +193 -0
  148. package/stacks/nextjs-supabase/.morph/standards/supabase-auth.md +171 -0
  149. package/stacks/nextjs-supabase/.morph/standards/supabase-pgvector.md +164 -0
  150. package/stacks/nextjs-supabase/.morph/standards/supabase-rls.md +179 -0
  151. package/stacks/nextjs-supabase/.morph/standards/supabase-storage.md +148 -0
  152. package/stacks/nextjs-supabase/.morph/templates/contracts.cs +173 -0
  153. package/stacks/nextjs-supabase/.morph/templates/contracts.ts +168 -0
  154. package/stacks/nextjs-supabase/.morph/templates/decisions.md +115 -0
  155. package/stacks/nextjs-supabase/.morph/templates/dockerfile-api.dockerfile +38 -0
  156. package/stacks/nextjs-supabase/.morph/templates/dockerfile-web.dockerfile +48 -0
  157. package/stacks/nextjs-supabase/.morph/templates/proposal.md +145 -0
  158. package/stacks/nextjs-supabase/.morph/templates/recap.md +134 -0
  159. package/stacks/nextjs-supabase/.morph/templates/rls-policy.sql +57 -0
  160. package/stacks/nextjs-supabase/.morph/templates/spec.md +231 -0
  161. package/stacks/nextjs-supabase/.morph/templates/supabase-migration.sql +100 -0
  162. package/stacks/nextjs-supabase/.morph/templates/tasks.md +257 -0
  163. package/stacks/nextjs-supabase/CLAUDE.md +149 -0
  164. package/stacks/nextjs-supabase/README.md +112 -0
  165. /package/{detectors → src/lib/detectors}/structure-detector.js +0 -0
  166. /package/{content → stacks/blazor-azure}/.claude/commands/morph-apply.md +0 -0
  167. /package/{content → stacks/blazor-azure}/.claude/commands/morph-preflight.md +0 -0
  168. /package/{content → stacks/blazor-azure}/.claude/commands/morph-proposal.md +0 -0
  169. /package/{content → stacks/blazor-azure}/.claude/commands/morph-status.md +0 -0
  170. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/README.md +0 -0
  171. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/code-review.md +0 -0
  172. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/morph-checklist.md +0 -0
  173. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/simulation-checklist.md +0 -0
  174. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/README.md +0 -0
  175. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/morph-replicate.md +0 -0
  176. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-clarify.md +0 -0
  177. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-design.md +0 -0
  178. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-tasks.md +0 -0
  179. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-uiux.md +0 -0
  180. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/README.md +0 -0
  181. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +0 -0
  182. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/po-pm-advisor.md +0 -0
  183. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/standards-architect.md +0 -0
  184. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/dotnet-senior.md +0 -0
  185. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ef-modeler.md +0 -0
  186. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +0 -0
  187. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ms-agent-expert.md +0 -0
  188. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/blazor-builder.md +0 -0
  189. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/nextjs-expert.md +0 -0
  190. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +0 -0
  191. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/azure-architect.md +0 -0
  192. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +0 -0
  193. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/container-specialist.md +0 -0
  194. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +0 -0
  195. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/asaas-financial.md +0 -0
  196. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/azure-identity.md +0 -0
  197. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/clerk-auth.md +0 -0
  198. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/resend-email.md +0 -0
  199. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/code-analyzer.md +0 -0
  200. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/testing-specialist.md +0 -0
  201. /package/{content → stacks/blazor-azure}/.claude/skills/level-3-technologies/README.md +0 -0
  202. /package/{content → stacks/blazor-azure}/.claude/skills/level-4-patterns/README.md +0 -0
  203. /package/{content → stacks/blazor-azure}/.morph/config/config.template.json +0 -0
  204. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/design-impl.md +0 -0
  205. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/fast-track.md +0 -0
  206. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/full-morph.md +0 -0
  207. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/standard.md +0 -0
  208. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/ui-refresh.md +0 -0
  209. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/decisions.md +0 -0
  210. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/proposal.md +0 -0
  211. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/spec.md +0 -0
  212. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-agents.sh +0 -0
  213. /package/{content → stacks/blazor-azure}/.morph/hooks/task-completed.js +0 -0
  214. /package/{content → stacks/blazor-azure}/.morph/hooks/teammate-idle.js +0 -0
  215. /package/{content → stacks/blazor-azure}/.morph/schemas/tasks.schema.json +0 -0
  216. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-blazor-ui.md +0 -0
  217. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-production.md +0 -0
  218. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-setup.md +0 -0
  219. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-workflows.md +0 -0
  220. /package/{content → stacks/blazor-azure}/.morph/standards/architecture.md +0 -0
  221. /package/{content → stacks/blazor-azure}/.morph/standards/azure.md +0 -0
  222. /package/{content → stacks/blazor-azure}/.morph/standards/dotnet10-migration.md +0 -0
  223. /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT-FEATURE.md +0 -0
  224. /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT.md +0 -0
  225. /package/{content → stacks/blazor-azure}/.morph/templates/agent.cs +0 -0
  226. /package/{content → stacks/blazor-azure}/.morph/templates/clarify-questions.md +0 -0
  227. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Commands.cs +0 -0
  228. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Entities.cs +0 -0
  229. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Queries.cs +0 -0
  230. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/README.md +0 -0
  231. /package/{content → stacks/blazor-azure}/.morph/templates/decisions.md +0 -0
  232. /package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy-checklist.md +0 -0
  233. /package/{content → stacks/blazor-azure}/.morph/templates/proposal.md +0 -0
  234. /package/{content → stacks/blazor-azure}/.morph/templates/recap.md +0 -0
  235. /package/{content → stacks/blazor-azure}/.morph/templates/simulation.md +0 -0
  236. /package/{content → stacks/blazor-azure}/.morph/templates/spec.md +0 -0
  237. /package/{content → stacks/blazor-azure}/.morph/templates/state.template.json +0 -0
  238. /package/{content → stacks/blazor-azure}/.morph/templates/tasks.md +0 -0
  239. /package/{content → stacks/blazor-azure}/.morph/templates/ui-components.md +0 -0
  240. /package/{content → stacks/blazor-azure}/CLAUDE.md +0 -0
@@ -1,307 +1,307 @@
1
- // ==============================================================================
2
- // API .NET + Next.js - Frontend Contracts (TypeScript)
3
- // Types compartilhados entre API e Frontend
4
- // ==============================================================================
5
-
6
- // ==============================================================================
7
- // PAGINATION
8
- // ==============================================================================
9
-
10
- export interface PaginationParams {
11
- page?: number;
12
- pageSize?: number;
13
- sortBy?: string;
14
- sortDesc?: boolean;
15
- search?: string;
16
- }
17
-
18
- export interface PagedResult<T> {
19
- items: T[];
20
- totalItems: number;
21
- page: number;
22
- pageSize: number;
23
- totalPages: number;
24
- }
25
-
26
- // ==============================================================================
27
- // ENTITIES
28
- // ==============================================================================
29
-
30
- export interface Product {
31
- id: number;
32
- name: string;
33
- description?: string;
34
- price: number;
35
- stock: number;
36
- category?: string;
37
- imageUrl?: string;
38
- isActive: boolean;
39
- createdAt: string;
40
- updatedAt?: string;
41
- }
42
-
43
- export interface Order {
44
- id: number;
45
- orderNumber: string;
46
- customerId: number;
47
- customer?: Customer;
48
- status: OrderStatus;
49
- items: OrderItem[];
50
- subtotal: number;
51
- tax: number;
52
- total: number;
53
- notes?: string;
54
- createdAt: string;
55
- updatedAt?: string;
56
- }
57
-
58
- export interface OrderItem {
59
- id: number;
60
- productId: number;
61
- product?: Product;
62
- quantity: number;
63
- unitPrice: number;
64
- total: number;
65
- }
66
-
67
- export interface Customer {
68
- id: number;
69
- name: string;
70
- email: string;
71
- phone?: string;
72
- address?: Address;
73
- createdAt: string;
74
- }
75
-
76
- export interface Address {
77
- street: string;
78
- number: string;
79
- complement?: string;
80
- neighborhood: string;
81
- city: string;
82
- state: string;
83
- zipCode: string;
84
- country: string;
85
- }
86
-
87
- export interface User {
88
- id: string;
89
- email: string;
90
- name?: string;
91
- imageUrl?: string;
92
- role: UserRole;
93
- createdAt: string;
94
- lastLoginAt?: string;
95
- }
96
-
97
- // ==============================================================================
98
- // ENUMS
99
- // ==============================================================================
100
-
101
- export type OrderStatus =
102
- | "Pending"
103
- | "Confirmed"
104
- | "Processing"
105
- | "Shipped"
106
- | "Delivered"
107
- | "Cancelled";
108
-
109
- export type UserRole = "Admin" | "Manager" | "User" | "Viewer";
110
-
111
- export type ProductCategory =
112
- | "Electronics"
113
- | "Clothing"
114
- | "Food"
115
- | "Books"
116
- | "Other";
117
-
118
- // ==============================================================================
119
- // REQUEST DTOs
120
- // ==============================================================================
121
-
122
- export interface CreateProductRequest {
123
- name: string;
124
- description?: string;
125
- price: number;
126
- stock: number;
127
- category?: string;
128
- imageUrl?: string;
129
- }
130
-
131
- export interface UpdateProductRequest {
132
- name?: string;
133
- description?: string;
134
- price?: number;
135
- stock?: number;
136
- category?: string;
137
- imageUrl?: string;
138
- isActive?: boolean;
139
- }
140
-
141
- export interface CreateOrderRequest {
142
- customerId: number;
143
- items: CreateOrderItemRequest[];
144
- notes?: string;
145
- }
146
-
147
- export interface CreateOrderItemRequest {
148
- productId: number;
149
- quantity: number;
150
- }
151
-
152
- export interface UpdateOrderStatusRequest {
153
- status: OrderStatus;
154
- notes?: string;
155
- }
156
-
157
- export interface CreateCustomerRequest {
158
- name: string;
159
- email: string;
160
- phone?: string;
161
- address?: Address;
162
- }
163
-
164
- // ==============================================================================
165
- // RESPONSE DTOs
166
- // ==============================================================================
167
-
168
- export interface ApiResponse<T> {
169
- data: T;
170
- success: boolean;
171
- message?: string;
172
- }
173
-
174
- export interface ApiError {
175
- type: string;
176
- title: string;
177
- status: number;
178
- detail?: string;
179
- instance?: string;
180
- errors?: Record<string, string[]>;
181
- }
182
-
183
- export interface DashboardStats {
184
- totalProducts: number;
185
- totalOrders: number;
186
- totalCustomers: number;
187
- totalRevenue: number;
188
- ordersToday: number;
189
- revenueToday: number;
190
- recentOrders: Order[];
191
- topProducts: ProductSales[];
192
- }
193
-
194
- export interface ProductSales {
195
- product: Product;
196
- totalSold: number;
197
- totalRevenue: number;
198
- }
199
-
200
- // ==============================================================================
201
- // FILTER DTOs
202
- // ==============================================================================
203
-
204
- export interface ProductFilters extends PaginationParams {
205
- category?: string;
206
- minPrice?: number;
207
- maxPrice?: number;
208
- inStock?: boolean;
209
- isActive?: boolean;
210
- }
211
-
212
- export interface OrderFilters extends PaginationParams {
213
- status?: OrderStatus;
214
- customerId?: number;
215
- startDate?: string;
216
- endDate?: string;
217
- minTotal?: number;
218
- maxTotal?: number;
219
- }
220
-
221
- export interface CustomerFilters extends PaginationParams {
222
- city?: string;
223
- state?: string;
224
- }
225
-
226
- // ==============================================================================
227
- // FORM SCHEMAS (Zod)
228
- // ==============================================================================
229
-
230
- // Exemplo de uso com Zod:
231
- /*
232
- import { z } from "zod";
233
-
234
- export const createProductSchema = z.object({
235
- name: z.string().min(1, "Name is required").max(100),
236
- description: z.string().max(500).optional(),
237
- price: z.number().positive("Price must be positive"),
238
- stock: z.number().int().nonnegative("Stock cannot be negative"),
239
- category: z.string().optional(),
240
- imageUrl: z.string().url().optional(),
241
- });
242
-
243
- export type CreateProductFormData = z.infer<typeof createProductSchema>;
244
-
245
- export const createOrderSchema = z.object({
246
- customerId: z.number().int().positive(),
247
- items: z.array(z.object({
248
- productId: z.number().int().positive(),
249
- quantity: z.number().int().positive("Quantity must be at least 1"),
250
- })).min(1, "At least one item is required"),
251
- notes: z.string().max(500).optional(),
252
- });
253
-
254
- export type CreateOrderFormData = z.infer<typeof createOrderSchema>;
255
- */
256
-
257
- // ==============================================================================
258
- // REACT QUERY KEYS
259
- // ==============================================================================
260
-
261
- export const queryKeys = {
262
- products: {
263
- all: ["products"] as const,
264
- list: (filters: ProductFilters) => ["products", "list", filters] as const,
265
- detail: (id: number) => ["products", "detail", id] as const,
266
- },
267
- orders: {
268
- all: ["orders"] as const,
269
- list: (filters: OrderFilters) => ["orders", "list", filters] as const,
270
- detail: (id: number) => ["orders", "detail", id] as const,
271
- },
272
- customers: {
273
- all: ["customers"] as const,
274
- list: (filters: CustomerFilters) =>
275
- ["customers", "list", filters] as const,
276
- detail: (id: number) => ["customers", "detail", id] as const,
277
- },
278
- dashboard: ["dashboard"] as const,
279
- };
280
-
281
- // ==============================================================================
282
- // API ENDPOINTS
283
- // ==============================================================================
284
-
285
- export const apiEndpoints = {
286
- products: {
287
- list: "/api/products",
288
- detail: (id: number) => `/api/products/${id}`,
289
- create: "/api/products",
290
- update: (id: number) => `/api/products/${id}`,
291
- delete: (id: number) => `/api/products/${id}`,
292
- },
293
- orders: {
294
- list: "/api/orders",
295
- detail: (id: number) => `/api/orders/${id}`,
296
- create: "/api/orders",
297
- updateStatus: (id: number) => `/api/orders/${id}/status`,
298
- cancel: (id: number) => `/api/orders/${id}/cancel`,
299
- },
300
- customers: {
301
- list: "/api/customers",
302
- detail: (id: number) => `/api/customers/${id}`,
303
- create: "/api/customers",
304
- update: (id: number) => `/api/customers/${id}`,
305
- },
306
- dashboard: "/api/dashboard",
307
- };
1
+ // ==============================================================================
2
+ // API .NET + Next.js - Frontend Contracts (TypeScript)
3
+ // Types compartilhados entre API e Frontend
4
+ // ==============================================================================
5
+
6
+ // ==============================================================================
7
+ // PAGINATION
8
+ // ==============================================================================
9
+
10
+ export interface PaginationParams {
11
+ page?: number;
12
+ pageSize?: number;
13
+ sortBy?: string;
14
+ sortDesc?: boolean;
15
+ search?: string;
16
+ }
17
+
18
+ export interface PagedResult<T> {
19
+ items: T[];
20
+ totalItems: number;
21
+ page: number;
22
+ pageSize: number;
23
+ totalPages: number;
24
+ }
25
+
26
+ // ==============================================================================
27
+ // ENTITIES
28
+ // ==============================================================================
29
+
30
+ export interface Product {
31
+ id: number;
32
+ name: string;
33
+ description?: string;
34
+ price: number;
35
+ stock: number;
36
+ category?: string;
37
+ imageUrl?: string;
38
+ isActive: boolean;
39
+ createdAt: string;
40
+ updatedAt?: string;
41
+ }
42
+
43
+ export interface Order {
44
+ id: number;
45
+ orderNumber: string;
46
+ customerId: number;
47
+ customer?: Customer;
48
+ status: OrderStatus;
49
+ items: OrderItem[];
50
+ subtotal: number;
51
+ tax: number;
52
+ total: number;
53
+ notes?: string;
54
+ createdAt: string;
55
+ updatedAt?: string;
56
+ }
57
+
58
+ export interface OrderItem {
59
+ id: number;
60
+ productId: number;
61
+ product?: Product;
62
+ quantity: number;
63
+ unitPrice: number;
64
+ total: number;
65
+ }
66
+
67
+ export interface Customer {
68
+ id: number;
69
+ name: string;
70
+ email: string;
71
+ phone?: string;
72
+ address?: Address;
73
+ createdAt: string;
74
+ }
75
+
76
+ export interface Address {
77
+ street: string;
78
+ number: string;
79
+ complement?: string;
80
+ neighborhood: string;
81
+ city: string;
82
+ state: string;
83
+ zipCode: string;
84
+ country: string;
85
+ }
86
+
87
+ export interface User {
88
+ id: string;
89
+ email: string;
90
+ name?: string;
91
+ imageUrl?: string;
92
+ role: UserRole;
93
+ createdAt: string;
94
+ lastLoginAt?: string;
95
+ }
96
+
97
+ // ==============================================================================
98
+ // ENUMS
99
+ // ==============================================================================
100
+
101
+ export type OrderStatus =
102
+ | "Pending"
103
+ | "Confirmed"
104
+ | "Processing"
105
+ | "Shipped"
106
+ | "Delivered"
107
+ | "Cancelled";
108
+
109
+ export type UserRole = "Admin" | "Manager" | "User" | "Viewer";
110
+
111
+ export type ProductCategory =
112
+ | "Electronics"
113
+ | "Clothing"
114
+ | "Food"
115
+ | "Books"
116
+ | "Other";
117
+
118
+ // ==============================================================================
119
+ // REQUEST DTOs
120
+ // ==============================================================================
121
+
122
+ export interface CreateProductRequest {
123
+ name: string;
124
+ description?: string;
125
+ price: number;
126
+ stock: number;
127
+ category?: string;
128
+ imageUrl?: string;
129
+ }
130
+
131
+ export interface UpdateProductRequest {
132
+ name?: string;
133
+ description?: string;
134
+ price?: number;
135
+ stock?: number;
136
+ category?: string;
137
+ imageUrl?: string;
138
+ isActive?: boolean;
139
+ }
140
+
141
+ export interface CreateOrderRequest {
142
+ customerId: number;
143
+ items: CreateOrderItemRequest[];
144
+ notes?: string;
145
+ }
146
+
147
+ export interface CreateOrderItemRequest {
148
+ productId: number;
149
+ quantity: number;
150
+ }
151
+
152
+ export interface UpdateOrderStatusRequest {
153
+ status: OrderStatus;
154
+ notes?: string;
155
+ }
156
+
157
+ export interface CreateCustomerRequest {
158
+ name: string;
159
+ email: string;
160
+ phone?: string;
161
+ address?: Address;
162
+ }
163
+
164
+ // ==============================================================================
165
+ // RESPONSE DTOs
166
+ // ==============================================================================
167
+
168
+ export interface ApiResponse<T> {
169
+ data: T;
170
+ success: boolean;
171
+ message?: string;
172
+ }
173
+
174
+ export interface ApiError {
175
+ type: string;
176
+ title: string;
177
+ status: number;
178
+ detail?: string;
179
+ instance?: string;
180
+ errors?: Record<string, string[]>;
181
+ }
182
+
183
+ export interface DashboardStats {
184
+ totalProducts: number;
185
+ totalOrders: number;
186
+ totalCustomers: number;
187
+ totalRevenue: number;
188
+ ordersToday: number;
189
+ revenueToday: number;
190
+ recentOrders: Order[];
191
+ topProducts: ProductSales[];
192
+ }
193
+
194
+ export interface ProductSales {
195
+ product: Product;
196
+ totalSold: number;
197
+ totalRevenue: number;
198
+ }
199
+
200
+ // ==============================================================================
201
+ // FILTER DTOs
202
+ // ==============================================================================
203
+
204
+ export interface ProductFilters extends PaginationParams {
205
+ category?: string;
206
+ minPrice?: number;
207
+ maxPrice?: number;
208
+ inStock?: boolean;
209
+ isActive?: boolean;
210
+ }
211
+
212
+ export interface OrderFilters extends PaginationParams {
213
+ status?: OrderStatus;
214
+ customerId?: number;
215
+ startDate?: string;
216
+ endDate?: string;
217
+ minTotal?: number;
218
+ maxTotal?: number;
219
+ }
220
+
221
+ export interface CustomerFilters extends PaginationParams {
222
+ city?: string;
223
+ state?: string;
224
+ }
225
+
226
+ // ==============================================================================
227
+ // FORM SCHEMAS (Zod)
228
+ // ==============================================================================
229
+
230
+ // Exemplo de uso com Zod:
231
+ /*
232
+ import { z } from "zod";
233
+
234
+ export const createProductSchema = z.object({
235
+ name: z.string().min(1, "Name is required").max(100),
236
+ description: z.string().max(500).optional(),
237
+ price: z.number().positive("Price must be positive"),
238
+ stock: z.number().int().nonnegative("Stock cannot be negative"),
239
+ category: z.string().optional(),
240
+ imageUrl: z.string().url().optional(),
241
+ });
242
+
243
+ export type CreateProductFormData = z.infer<typeof createProductSchema>;
244
+
245
+ export const createOrderSchema = z.object({
246
+ customerId: z.number().int().positive(),
247
+ items: z.array(z.object({
248
+ productId: z.number().int().positive(),
249
+ quantity: z.number().int().positive("Quantity must be at least 1"),
250
+ })).min(1, "At least one item is required"),
251
+ notes: z.string().max(500).optional(),
252
+ });
253
+
254
+ export type CreateOrderFormData = z.infer<typeof createOrderSchema>;
255
+ */
256
+
257
+ // ==============================================================================
258
+ // REACT QUERY KEYS
259
+ // ==============================================================================
260
+
261
+ export const queryKeys = {
262
+ products: {
263
+ all: ["products"] as const,
264
+ list: (filters: ProductFilters) => ["products", "list", filters] as const,
265
+ detail: (id: number) => ["products", "detail", id] as const,
266
+ },
267
+ orders: {
268
+ all: ["orders"] as const,
269
+ list: (filters: OrderFilters) => ["orders", "list", filters] as const,
270
+ detail: (id: number) => ["orders", "detail", id] as const,
271
+ },
272
+ customers: {
273
+ all: ["customers"] as const,
274
+ list: (filters: CustomerFilters) =>
275
+ ["customers", "list", filters] as const,
276
+ detail: (id: number) => ["customers", "detail", id] as const,
277
+ },
278
+ dashboard: ["dashboard"] as const,
279
+ };
280
+
281
+ // ==============================================================================
282
+ // API ENDPOINTS
283
+ // ==============================================================================
284
+
285
+ export const apiEndpoints = {
286
+ products: {
287
+ list: "/api/products",
288
+ detail: (id: number) => `/api/products/${id}`,
289
+ create: "/api/products",
290
+ update: (id: number) => `/api/products/${id}`,
291
+ delete: (id: number) => `/api/products/${id}`,
292
+ },
293
+ orders: {
294
+ list: "/api/orders",
295
+ detail: (id: number) => `/api/orders/${id}`,
296
+ create: "/api/orders",
297
+ updateStatus: (id: number) => `/api/orders/${id}/status`,
298
+ cancel: (id: number) => `/api/orders/${id}/cancel`,
299
+ },
300
+ customers: {
301
+ list: "/api/customers",
302
+ detail: (id: number) => `/api/customers/${id}`,
303
+ create: "/api/customers",
304
+ update: (id: number) => `/api/customers/${id}`,
305
+ },
306
+ dashboard: "/api/dashboard",
307
+ };