@polymorphism-tech/morph-spec 4.6.0 → 4.7.1

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 (239) hide show
  1. package/README.md +414 -700
  2. package/docs/ARCHITECTURE.md +331 -0
  3. package/docs/CHEATSHEET.md +221 -0
  4. package/docs/COMMAND-FLOWS.md +368 -0
  5. package/docs/QUICKSTART.md +212 -0
  6. package/docs/examples/order-management/contracts.cs +84 -0
  7. package/docs/examples/order-management/proposal.md +24 -0
  8. package/docs/examples/order-management/spec.md +162 -0
  9. package/docs/plans/2026-02-23-ddd-architecture-refactor.md +1153 -0
  10. package/docs/plans/2026-02-23-ddd-nextsteps.md +682 -0
  11. package/docs/plans/2026-02-23-infra-architect-refactor.md +437 -0
  12. package/docs/plans/2026-02-23-nextjs-code-review-design.md +156 -0
  13. package/docs/plans/2026-02-23-nextjs-code-review-impl.md +1254 -0
  14. package/docs/plans/2026-02-23-nextjs-standards-design.md +149 -0
  15. package/docs/plans/2026-02-23-nextjs-standards-impl.md +1846 -0
  16. package/framework/agents/README.md +14 -14
  17. package/framework/agents/architecture/standards-architect.md +159 -159
  18. package/framework/agents/frontend/nextjs-expert.md +87 -127
  19. package/framework/agents/infrastructure/azure-architect.md +147 -147
  20. package/framework/agents/infrastructure/infra-architect.md +45 -0
  21. package/framework/agents.json +1145 -278
  22. package/framework/rules/frontend-standards.md +0 -3
  23. package/framework/rules/nextjs-standards.md +17 -0
  24. package/framework/skills/level-0-meta/code-review-nextjs/SKILL.md +147 -0
  25. package/framework/skills/level-0-meta/code-review-nextjs/references/review-example-nextjs.md +254 -0
  26. package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +3 -3
  27. package/framework/skills/level-1-workflows/phase-design/SKILL.md +45 -9
  28. package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +38 -0
  29. package/framework/standards/STANDARDS.json +121 -0
  30. package/framework/standards/architecture/ddd/bounded-contexts.md +105 -0
  31. package/framework/standards/architecture/ddd/complexity-levels.md +108 -0
  32. package/framework/standards/architecture/ddd/ubiquitous-language.md +58 -0
  33. package/framework/standards/frontend/nextjs/app-router.md +123 -0
  34. package/framework/standards/frontend/nextjs/components.md +132 -0
  35. package/framework/standards/frontend/nextjs/data-fetching.md +126 -0
  36. package/framework/standards/frontend/nextjs/forms.md +128 -0
  37. package/framework/standards/frontend/nextjs/naming-conventions.md +67 -0
  38. package/framework/standards/frontend/nextjs/project-structure.md +102 -0
  39. package/framework/standards/frontend/nextjs/state-management.md +72 -0
  40. package/framework/standards/frontend/nextjs/testing.md +111 -0
  41. package/framework/templates/REGISTRY.json +538 -142
  42. package/framework/templates/code/dotnet/contracts/contracts-level1.cs +69 -0
  43. package/framework/templates/code/dotnet/contracts/contracts-level2.cs +86 -0
  44. package/framework/templates/code/dotnet/contracts/contracts-level3.cs +41 -0
  45. package/framework/templates/docs/spec.md +49 -0
  46. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -0
  47. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -0
  48. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -0
  49. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -0
  50. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -0
  51. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -0
  52. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -0
  53. package/framework/templates/project-structure/dotnet-ddd.md +70 -0
  54. package/framework/workflows/docs/enforcement-pipeline.md +2 -1
  55. package/package.json +1 -1
  56. package/scripts/scan-nextjs.mjs +169 -0
  57. package/src/commands/project/doctor.js +52 -1
  58. package/src/commands/project/init.js +15 -1
  59. package/src/commands/project/update.js +6 -1
  60. package/src/lib/standards/standards-context-injector.js +5 -0
  61. package/src/lib/validators/nextjs/index.js +6 -0
  62. package/src/lib/validators/nextjs/next-component-validator.js +181 -0
  63. package/src/lib/validators/validation-runner.js +5 -0
  64. package/src/utils/agents-installer.js +14 -2
  65. package/.morph/.morphversion +0 -5
  66. package/.morph/analytics/threads-log.jsonl +0 -6
  67. package/.morph/config/config.json +0 -8
  68. package/.morph/framework/agents.json +0 -948
  69. package/.morph/framework/standards/STANDARDS.json +0 -812
  70. package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
  71. package/.morph/framework/standards/ai-agents/production.md +0 -415
  72. package/.morph/framework/standards/ai-agents/setup.md +0 -418
  73. package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
  74. package/.morph/framework/standards/ai-agents/workflows.md +0 -354
  75. package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
  76. package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
  77. package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
  78. package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
  79. package/.morph/framework/standards/backend/api/rest.md +0 -492
  80. package/.morph/framework/standards/backend/api/validation.md +0 -88
  81. package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
  82. package/.morph/framework/standards/backend/database/ef-core.md +0 -199
  83. package/.morph/framework/standards/backend/database/migrations.md +0 -393
  84. package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
  85. package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
  86. package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
  87. package/.morph/framework/standards/backend/dotnet/async.md +0 -366
  88. package/.morph/framework/standards/backend/dotnet/core.md +0 -117
  89. package/.morph/framework/standards/backend/dotnet/di.md +0 -439
  90. package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
  91. package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
  92. package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
  93. package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
  94. package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
  95. package/.morph/framework/standards/context/analytics.md +0 -96
  96. package/.morph/framework/standards/context/bundles.md +0 -110
  97. package/.morph/framework/standards/context/priming.md +0 -78
  98. package/.morph/framework/standards/core/architecture.md +0 -185
  99. package/.morph/framework/standards/core/coding.md +0 -214
  100. package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
  101. package/.morph/framework/standards/core/git.md +0 -185
  102. package/.morph/framework/standards/core/testing.md +0 -295
  103. package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
  104. package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
  105. package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
  106. package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
  107. package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
  108. package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
  109. package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  110. package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
  111. package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
  112. package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
  113. package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
  114. package/.morph/framework/standards/frontend/blazor/state.md +0 -191
  115. package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
  116. package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
  117. package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -215
  118. package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
  119. package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  120. package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  121. package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
  122. package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
  123. package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
  124. package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
  125. package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
  126. package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
  127. package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
  128. package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
  129. package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
  130. package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
  131. package/.morph/framework/standards/integration/api/graphql.md +0 -91
  132. package/.morph/framework/standards/integration/api/grpc.md +0 -114
  133. package/.morph/framework/standards/integration/api/rest-design.md +0 -95
  134. package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
  135. package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
  136. package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
  137. package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
  138. package/.morph/framework/standards/observability/logging.md +0 -131
  139. package/.morph/framework/standards/observability/metrics.md +0 -121
  140. package/.morph/framework/standards/observability/monitoring.md +0 -114
  141. package/.morph/framework/standards/observability/tracing.md +0 -132
  142. package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
  143. package/.morph/framework/standards/workflows/thread-management.md +0 -113
  144. package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
  145. package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  146. package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
  147. package/.morph/framework/templates/README.md +0 -814
  148. package/.morph/framework/templates/REGISTRY.json +0 -1492
  149. package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
  150. package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
  151. package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
  152. package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
  153. package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
  154. package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
  155. package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
  156. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
  157. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
  158. package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
  159. package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
  160. package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
  161. package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
  162. package/.morph/framework/templates/code/dotnet/test.cs +0 -239
  163. package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
  164. package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
  165. package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
  166. package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
  167. package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
  168. package/.morph/framework/templates/context/CONTEXT.md +0 -181
  169. package/.morph/framework/templates/docs/clarifications.md +0 -253
  170. package/.morph/framework/templates/docs/onboarding.md +0 -123
  171. package/.morph/framework/templates/docs/proposal.md +0 -182
  172. package/.morph/framework/templates/docs/schema-analysis.md +0 -119
  173. package/.morph/framework/templates/docs/spec.md +0 -149
  174. package/.morph/framework/templates/docs/ui-components.md +0 -124
  175. package/.morph/framework/templates/docs/ui-design-system.md +0 -76
  176. package/.morph/framework/templates/docs/ui-flows.md +0 -167
  177. package/.morph/framework/templates/docs/ui-mockups.md +0 -98
  178. package/.morph/framework/templates/docs/user-stories.md +0 -34
  179. package/.morph/framework/templates/examples/design-system-examples.md +0 -357
  180. package/.morph/framework/templates/examples/spec-examples.md +0 -90
  181. package/.morph/framework/templates/feature/decisions.md +0 -187
  182. package/.morph/framework/templates/feature/recap.md +0 -146
  183. package/.morph/framework/templates/feature/tasks.md +0 -199
  184. package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
  185. package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
  186. package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
  187. package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
  188. package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
  189. package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
  190. package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
  191. package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
  192. package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
  193. package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
  194. package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
  195. package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
  196. package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
  197. package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
  198. package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
  199. package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
  200. package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
  201. package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
  202. package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
  203. package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
  204. package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
  205. package/.morph/framework/templates/infrastructure/github/README.md +0 -593
  206. package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
  207. package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
  208. package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
  209. package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
  210. package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
  211. package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
  212. package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
  213. package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
  214. package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
  215. package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
  216. package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
  217. package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
  218. package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
  219. package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
  220. package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
  221. package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
  222. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
  223. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
  224. package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
  225. package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
  226. package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
  227. package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
  228. package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
  229. package/.morph/framework/templates/saas/subscription.cs +0 -347
  230. package/.morph/framework/templates/saas/tenant.cs +0 -338
  231. package/.morph/framework/templates/state.template.json +0 -17
  232. package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
  233. package/.morph/framework/templates/ui/MudTheme.cs +0 -281
  234. package/.morph/framework/templates/ui/design-system.css +0 -226
  235. package/.morph/logs/tool-failures.log +0 -7
  236. package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +0 -16
  237. package/.morph/state.json +0 -48
  238. package/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
  239. package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
@@ -0,0 +1,1153 @@
1
+ # DDD Architecture Refactor Implementation Plan
2
+
3
+ > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
4
+
5
+ **Goal:** Integrar DDD tático de forma calibrada ao MORPH-SPEC — sem overengineering. 3 níveis de complexidade, detecção automática na fase de design, domain-architect como Tier 2 líder de modelagem de domínio.
6
+
7
+ **Architecture:** Mantém Clean Architecture como estrutura de camadas. Adiciona DDD tático (Aggregates, Value Objects, Domain Events) como padrão obrigatório calibrado por nível. O `domain-architect` (Tier 2) detecta o nível correto antes de gerar `contracts.cs`. Nível 1 = CRUD simples. Nível 2 = regras de negócio + Aggregate. Nível 3 = múltiplos domínios distintos (opt-in explícito).
8
+
9
+ **Tech Stack:** Node.js (ESM), Handlebars v2.0, `node:test`, C# templates (não compilados), Markdown.
10
+
11
+ ---
12
+
13
+ ## Contexto Importante
14
+
15
+ - `framework/agents.json` — 38 agentes, 4 tiers. `ddd-expert` está em Tier 3 sob `dotnet-senior`
16
+ - `framework/templates/code/dotnet/contracts/contracts.cs` — template único flat (domain entity **comentado**)
17
+ - `framework/templates/docs/spec.md` — sem seções de DDD ou complexidade de domínio
18
+ - `framework/skills/level-1-workflows/phase-design/SKILL.md` — sem detecção de nível de domínio
19
+ - `framework/standards/architecture/ddd/` — 3 arquivos existem (aggregates, entities, value-objects) mas não são referenciados na fase de design
20
+ - `test/commands/doctor.test.js` — valida tier sums; Tier 2 hoje = 3 agentes
21
+ - Standards Registry: `framework/standards/STANDARDS.json` — 74 entradas, regenerar após novos standards
22
+
23
+ ---
24
+
25
+ ## Parte A — Standards (base de tudo)
26
+
27
+ ### Task 1: Criar `complexity-levels.md`
28
+
29
+ **Files:**
30
+ - Create: `framework/standards/architecture/ddd/complexity-levels.md`
31
+
32
+ **Step 1: Escrever o standard**
33
+
34
+ ```markdown
35
+ # DDD Complexity Levels
36
+
37
+ > **Scope:** universal
38
+ > **Layer:** 2 (load when: ddd, domain, aggregate, entity, bounded context)
39
+ > **Keywords:** ddd, complexity, aggregate, crud, bounded-context, domain
40
+
41
+ Define o nível de complexidade de domínio para cada feature. O nível determina qual
42
+ template de contracts.cs será usado e quais padrões DDD são mandatórios.
43
+
44
+ ---
45
+
46
+ ## Os 3 Níveis
47
+
48
+ ### Nível 1 — CRUD
49
+
50
+ **Quando usar:**
51
+ - Feature é essencialmente Create/Read/Update/Delete
52
+ - Entidade não tem regras de negócio (apenas validações de campos)
53
+ - Nenhum outro domínio precisa reagir às mudanças desta entidade
54
+ - Exemplos: `Category`, `Tag`, `UserProfile`, `Notification`
55
+
56
+ **O que gerar:**
57
+ - `Entity` simples (sem AggregateRoot)
58
+ - Service interface CRUD
59
+ - DTOs (record)
60
+ - Repository interface básica
61
+ - **SEM** Domain Events, **SEM** Value Objects (a menos que óbvio), **SEM** CQRS
62
+
63
+ ---
64
+
65
+ ### Nível 2 — Business Logic
66
+
67
+ **Quando usar:**
68
+ - Entidade tem estados com transições controladas por regras (ex: Draft → Confirmed → Shipped)
69
+ - Invariants existem: "só pode cancelar se estiver Ativo"
70
+ - Cálculos derivados (Total, Saldo, Desconto)
71
+ - Outros módulos precisam reagir a mudanças desta entidade
72
+ - Exemplos: `Order`, `Subscription`, `Invoice`, `Project`, `Ticket`
73
+
74
+ **O que gerar:**
75
+ - `AggregateRoot` com factory method estático
76
+ - Value Objects para tipos com regras (Money, Email, PhoneNumber)
77
+ - Domain Events para mudanças de estado relevantes
78
+ - Commands + Queries (CQRS com MediatR)
79
+ - Repository interface por aggregate root
80
+ - **SEM** Bounded Context isolation (módulos se comunicam diretamente)
81
+
82
+ ---
83
+
84
+ ### Nível 3 — Bounded Context
85
+
86
+ **Quando usar (opt-in explícito apenas):**
87
+ - Sistema tem 3+ domínios distintos onde o mesmo conceito tem modelos diferentes
88
+ - Exemplo: "Customer" em Billing ≠ "Customer" em Support
89
+ - Times distintos vão trabalhar em cada domínio
90
+ - Domínios precisam evoluir independentemente
91
+ - Exemplos: plataforma multi-produto, marketplace, ERP
92
+
93
+ **O que gerar:**
94
+ - Tudo do Nível 2 +
95
+ - Pasta `{BoundedContext}/` em Domain + Application
96
+ - Domain Events para comunicação cross-BC (via MediatR/Service Bus)
97
+ - Referências cross-BC por ID (nunca navigation properties)
98
+ - Glossário de Linguagem Ubíqua por BC
99
+
100
+ **⚠️ Não use Nível 3 por default.** Declare explicitamente na proposta.
101
+
102
+ ---
103
+
104
+ ## Como Detectar o Nível (fase de design)
105
+
106
+ O `domain-architect` analisa a proposta e responde:
107
+
108
+ ```
109
+ 1. A entidade principal tem estados com transições? → Sim = Nível 2+
110
+ 2. Existem invariants de negócio? → Sim = Nível 2+
111
+ 3. Outros domínios precisam reagir a mudanças? → Sim = Nível 2+
112
+ 4. Diferentes contextos usam modelos diferentes do mesmo conceito? → Sim = Nível 3
113
+ 5. O usuário declarou explicitamente Bounded Context? → Sim = Nível 3
114
+ Se nenhuma das anteriores: Nível 1
115
+ ```
116
+
117
+ ---
118
+
119
+ ## Anti-Patterns por Nível
120
+
121
+ | Anti-Pattern | Nível Afetado | Correção |
122
+ |---|---|---|
123
+ | AggregateRoot para CRUD simples | Nível 1 desnecessário | Use Entity simples |
124
+ | Domain Events sem consumidores | Nível 2 excessivo | Remova ou use Nível 1 |
125
+ | Bounded Context para app single-domain | Nível 3 prematuro | Use Nível 2 |
126
+ | Entidade anêmica com regras no Service | Todos | Mova regras para o Aggregate |
127
+ | Value Objects para todo primitivo | Nível 2 excessivo | Só quando há regras/validação |
128
+
129
+ ---
130
+
131
+ *MORPH-SPEC by Polymorphism Tech*
132
+ ```
133
+
134
+ **Step 2: Verificar que o arquivo foi criado corretamente**
135
+
136
+ ```bash
137
+ ls framework/standards/architecture/ddd/
138
+ ```
139
+ Esperado: `aggregates.md`, `complexity-levels.md`, `entities.md`, `value-objects.md`
140
+
141
+ **Step 3: Commit**
142
+
143
+ ```bash
144
+ git add framework/standards/architecture/ddd/complexity-levels.md
145
+ git commit -m "feat(standards): add DDD complexity levels — Level 1 CRUD, Level 2 Aggregate, Level 3 BC"
146
+ ```
147
+
148
+ ---
149
+
150
+ ### Task 2: Criar `bounded-contexts.md`
151
+
152
+ **Files:**
153
+ - Create: `framework/standards/architecture/ddd/bounded-contexts.md`
154
+
155
+ **Step 1: Escrever o standard**
156
+
157
+ ```markdown
158
+ # DDD Bounded Contexts
159
+
160
+ > **Scope:** universal
161
+ > **Layer:** 2 (load when: bounded context, bc, multi-domain, context map)
162
+ > **Keywords:** bounded-context, ddd, domain, ubiquitous-language, context-map
163
+
164
+ Bounded Context (BC) é a fronteira onde um modelo de domínio tem significado único.
165
+ Use apenas em sistemas com múltiplos domínios distintos (Nível 3 de complexidade).
166
+
167
+ ---
168
+
169
+ ## Estrutura de Pastas (Nível 3)
170
+
171
+ ```
172
+ src/{App}.Domain/
173
+ Billing/ ← Bounded Context
174
+ Aggregates/
175
+ Subscription.cs
176
+ Invoice.cs
177
+ ValueObjects/
178
+ PlanTier.cs
179
+ BillingCycle.cs
180
+ Events/
181
+ SubscriptionCreatedEvent.cs
182
+ SubscriptionCancelledEvent.cs
183
+ Exceptions/
184
+ SubscriptionNotFoundException.cs
185
+
186
+ Orders/ ← Bounded Context
187
+ Aggregates/
188
+ Order.cs
189
+ ValueObjects/
190
+ Money.cs
191
+ Events/
192
+ OrderConfirmedEvent.cs
193
+
194
+ src/{App}.Application/
195
+ Billing/ ← espelha Domain
196
+ Commands/
197
+ CreateSubscriptionCommand.cs
198
+ Queries/
199
+ GetActiveSubscriptionQuery.cs
200
+ Handlers/
201
+ CreateSubscriptionHandler.cs
202
+
203
+ src/{App}.Infrastructure/
204
+ Billing/ ← espelha Application
205
+ Repositories/
206
+ SubscriptionRepository.cs
207
+ Configurations/
208
+ SubscriptionConfiguration.cs
209
+ ```
210
+
211
+ ---
212
+
213
+ ## Regras de Comunicação Cross-BC
214
+
215
+ ```csharp
216
+ // ✅ CORRETO: referenciar outro BC por ID
217
+ public class Order : AggregateRoot
218
+ {
219
+ public Guid CustomerId { get; private set; } // ID, não navigation property
220
+ // NÃO: public Customer Customer { get; } // cross-BC navigation PROIBIDO
221
+ }
222
+
223
+ // ✅ CORRETO: comunicação via Domain Events (MediatR ou Service Bus)
224
+ public class OrderConfirmedHandler : INotificationHandler<OrderConfirmedEvent>
225
+ {
226
+ // Billing BC reage ao evento do Orders BC
227
+ public async Task Handle(OrderConfirmedEvent notification, CancellationToken ct)
228
+ {
229
+ await _billingService.ChargeForOrderAsync(notification.OrderId, ct);
230
+ }
231
+ }
232
+
233
+ // ❌ ERRADO: acesso direto ao repositório de outro BC
234
+ public class OrderService
235
+ {
236
+ private readonly ICustomerRepository _customerRepo; // cross-BC — PROIBIDO
237
+ }
238
+ ```
239
+
240
+ ---
241
+
242
+ ## Linguagem Ubíqua por BC
243
+
244
+ Cada BC define seu próprio glossário. O mesmo termo pode ter significados diferentes:
245
+
246
+ | Termo | BC: Orders | BC: Support |
247
+ |-------|-----------|-------------|
248
+ | `Customer` | Quem fez um pedido, tem `Orders[]` | Quem abriu ticket, tem `SLA` e `Priority` |
249
+ | `Status` | `Draft/Confirmed/Shipped` | `Open/InProgress/Resolved` |
250
+
251
+ Documente em `1-design/ubiquitous-language.md` por feature (ver standard).
252
+
253
+ ---
254
+
255
+ ## Quando NÃO usar Bounded Contexts
256
+
257
+ - App single-domain (ex: sistema de agendamentos)
258
+ - MVP ou projeto com um único time
259
+ - Quando os "domínios" compartilham o mesmo modelo de dados sem conflito
260
+
261
+ Em todos esses casos: use Nível 2 (Aggregates sem BC isolation).
262
+
263
+ ---
264
+
265
+ *MORPH-SPEC by Polymorphism Tech*
266
+ ```
267
+
268
+ **Step 2: Commit**
269
+
270
+ ```bash
271
+ git add framework/standards/architecture/ddd/bounded-contexts.md
272
+ git commit -m "feat(standards): add Bounded Contexts standard — structure, cross-BC rules, when NOT to use"
273
+ ```
274
+
275
+ ---
276
+
277
+ ### Task 3: Criar `ubiquitous-language.md`
278
+
279
+ **Files:**
280
+ - Create: `framework/standards/architecture/ddd/ubiquitous-language.md`
281
+
282
+ **Step 1: Escrever o standard**
283
+
284
+ ```markdown
285
+ # DDD Ubiquitous Language
286
+
287
+ > **Scope:** universal
288
+ > **Layer:** 2 (load when: ubiquitous language, glossary, domain language)
289
+ > **Keywords:** ubiquitous-language, ddd, glossary, domain-terms
290
+
291
+ Linguagem Ubíqua é o vocabulário compartilhado entre devs e domínio de negócio.
292
+ Usada em Nível 2+ para nomear Aggregates, Value Objects, Events e métodos.
293
+
294
+ ---
295
+
296
+ ## Formato do Glossário (output: `ubiquitous-language.md`)
297
+
298
+ ```markdown
299
+ # Ubiquitous Language: {Feature/BoundedContext}
300
+
301
+ ## Termos do Domínio
302
+
303
+ | Termo | Definição | Contexto | Mapeamento em Código |
304
+ |-------|-----------|----------|---------------------|
305
+ | Subscription | Contrato ativo de uso da plataforma por um tenant | Billing | `Subscription` (AggregateRoot) |
306
+ | PlanTier | Nível do plano (Free/Pro/Enterprise) | Billing | `PlanTier` (ValueObject) |
307
+ | Activation | Ato de ativar uma Subscription após pagamento | Billing | `Subscription.Activate()` |
308
+ | Churn | Cancelamento não-renovado de Subscription | Billing | `SubscriptionCancelledEvent` |
309
+
310
+ ## Estados e Transições
311
+
312
+ | Estado | Descrição | Transições Permitidas |
313
+ |--------|-----------|----------------------|
314
+ | Draft | Subscription criada, aguardando pagamento | → Active |
315
+ | Active | Subscription paga e em uso | → Suspended, Cancelled |
316
+ | Suspended | Pagamento falhou, acesso bloqueado | → Active, Cancelled |
317
+ | Cancelled | Encerrada definitivamente | (terminal) |
318
+
319
+ ## Invariants em Linguagem Natural
320
+
321
+ - "Uma Subscription só pode ser Cancelada se estiver Active ou Suspended"
322
+ - "Um Tenant não pode ter duas Subscriptions Active simultaneamente"
323
+ - "PlanTier não pode ser rebaixado durante um ciclo de cobrança ativo"
324
+ ```
325
+
326
+ ---
327
+
328
+ ## Regras de Nomenclatura
329
+
330
+ 1. Use termos do glossário como nomes de classe/método — nunca invente sinonimos
331
+ 2. Eventos no passado: `OrderConfirmed`, não `OrderConfirmation` ou `ConfirmOrder`
332
+ 3. Commands no imperativo: `CreateOrder`, não `OrderCreation`
333
+ 4. Value Objects no substantivo: `Money`, `Email`, não `MoneyValue` ou `EmailAddress`
334
+ 5. Métodos do Aggregate espelham ações do negócio: `order.Confirm()`, não `order.SetStatusToConfirmed()`
335
+
336
+ ---
337
+
338
+ ## Quando Gerar
339
+
340
+ - **Nível 2:** Gerar junto com `contracts.cs` na fase de design (seção inline no spec.md)
341
+ - **Nível 3:** Gerar arquivo separado `1-design/ubiquitous-language.md` por BC
342
+
343
+ ---
344
+
345
+ *MORPH-SPEC by Polymorphism Tech*
346
+ ```
347
+
348
+ **Step 2: Commit**
349
+
350
+ ```bash
351
+ git add framework/standards/architecture/ddd/ubiquitous-language.md
352
+ git commit -m "feat(standards): add Ubiquitous Language standard — glossary format, naming rules, when to generate"
353
+ ```
354
+
355
+ ---
356
+
357
+ ### Task 4: Regenerar Standards Registry
358
+
359
+ **Files:**
360
+ - Modify: `framework/standards/STANDARDS.json` (via script)
361
+
362
+ **Step 1: Rodar o script gerador**
363
+
364
+ ```bash
365
+ node scripts/generate-standards-registry.js
366
+ ```
367
+
368
+ **Step 2: Verificar que os 3 novos standards foram adicionados**
369
+
370
+ ```bash
371
+ node -e "
372
+ const s = JSON.parse(require('fs').readFileSync('framework/standards/STANDARDS.json'));
373
+ const ddd = s.filter(x => x.id.includes('ddd'));
374
+ console.log(ddd.map(x => x.id));
375
+ "
376
+ ```
377
+ Esperado: lista incluindo `complexity-levels`, `bounded-contexts`, `ubiquitous-language`.
378
+
379
+ **Step 3: Commit**
380
+
381
+ ```bash
382
+ git add framework/standards/STANDARDS.json
383
+ git commit -m "chore(standards): regenerate registry — 3 new DDD standards (77 total)"
384
+ ```
385
+
386
+ ---
387
+
388
+ ## Parte B — Templates
389
+
390
+ ### Task 5: Atualizar `spec.md` — Adicionar seções DDD
391
+
392
+ **Files:**
393
+ - Modify: `framework/templates/docs/spec.md`
394
+
395
+ Adicionar **após** a seção `## Technical Design` e **antes** de `## UI/UX Design`:
396
+
397
+ ```markdown
398
+ ---
399
+
400
+ ## Domain Complexity
401
+
402
+ **Nível:** {1 — CRUD / 2 — Business Logic / 3 — Bounded Context}
403
+
404
+ **Justificativa:** {Por que este nível foi escolhido — mencionar invariants, eventos ou BCs se Nível 2+}
405
+
406
+ **Padrões Aplicados:**
407
+ - {Nível 1: Entity simples, Service CRUD, DTOs}
408
+ - {Nível 2: AggregateRoot, Value Objects, Domain Events, CQRS}
409
+ - {Nível 3: Bounded Context isolation, cross-BC events, ubiquitous language por BC}
410
+
411
+ **Padrões Omitidos e Motivo:**
412
+ - {ex: Bounded Contexts — sistema single-domain, desnecessário}
413
+
414
+ ---
415
+
416
+ ## Aggregate Blueprint (Nível 2+ apenas)
417
+
418
+ > Omitir esta seção se Nível 1 (CRUD).
419
+
420
+ ### Aggregate Root: {EntityName}
421
+
422
+ **Invariants:**
423
+ - {Invariant 1 em linguagem natural}
424
+ - {Invariant 2}
425
+
426
+ **Estados e Transições:**
427
+ ```
428
+ {Status.Draft} → Confirm() → {Status.Confirmed} → Ship() → {Status.Shipped}
429
+ → Cancel() → {Status.Cancelled}
430
+ ```
431
+
432
+ **Domain Events:**
433
+ - `{EntityName}CreatedEvent` — publicado ao criar
434
+ - `{EntityName}ConfirmedEvent` — publicado ao confirmar
435
+
436
+ **Value Objects:**
437
+ - `{ValueObjectName}` — {por que não é um primitivo simples}
438
+
439
+ **Referências Cross-Aggregate (por ID apenas):**
440
+ - `{OtherEntity}Id: Guid` — nunca navigation property
441
+
442
+ ### Ubiquitous Language (Nível 2)
443
+
444
+ | Termo | Definição | Código |
445
+ |-------|-----------|--------|
446
+ | {Termo} | {Definição do negócio} | `{ClassName.MethodName()}` |
447
+
448
+ ---
449
+ ```
450
+
451
+ **Step 1: Ler o template atual para confirmar localização exata**
452
+
453
+ ```bash
454
+ # Verificar linha da seção Technical Design
455
+ grep -n "Technical Design\|UI/UX Design" framework/templates/docs/spec.md
456
+ ```
457
+
458
+ **Step 2: Editar o template** — inserir o bloco acima entre as duas seções.
459
+
460
+ **Step 3: Verificar que o template ainda renderiza corretamente**
461
+
462
+ ```bash
463
+ npx morph-spec template validate docs/spec
464
+ ```
465
+
466
+ **Step 4: Commit**
467
+
468
+ ```bash
469
+ git add framework/templates/docs/spec.md
470
+ git commit -m "feat(templates): add Domain Complexity + Aggregate Blueprint sections to spec.md"
471
+ ```
472
+
473
+ ---
474
+
475
+ ### Task 6: Criar `contracts-level1.cs` (CRUD)
476
+
477
+ **Files:**
478
+ - Create: `framework/templates/code/dotnet/contracts/contracts-level1.cs`
479
+
480
+ O template Nível 1 é o que existe hoje, porém sem domain entity comentada e sem Aggregate patterns. Cópia limpa do atual com ajustes:
481
+
482
+ ```csharp
483
+ // ============================================================
484
+ // CONTRACTS: {{titleCase FEATURE_NAME}} — Level 1 (CRUD)
485
+ // Generated by MORPH Framework | Date: {{DATE}}
486
+ // Domain Complexity: CRUD — Entity simples, sem invariants de negócio
487
+ // ============================================================
488
+
489
+ using System;
490
+ using System.Collections.Generic;
491
+ using System.Threading;
492
+ using System.Threading.Tasks;
493
+
494
+ namespace {{NAMESPACE}}.Application.Features.{{pascalCase FEATURE_NAME}};
495
+
496
+ #region Service Interfaces
497
+
498
+ public interface I{{pascalCase FEATURE_NAME}}Service
499
+ {
500
+ Task<{{pascalCase FEATURE_NAME}}Dto?> GetByIdAsync(Guid id, CancellationToken ct = default);
501
+ Task<List<{{pascalCase FEATURE_NAME}}Dto>> GetAllAsync(CancellationToken ct = default);
502
+ Task<{{pascalCase FEATURE_NAME}}Dto> CreateAsync(Create{{pascalCase FEATURE_NAME}}Request request, CancellationToken ct = default);
503
+ Task UpdateAsync(Guid id, Update{{pascalCase FEATURE_NAME}}Request request, CancellationToken ct = default);
504
+ Task DeleteAsync(Guid id, CancellationToken ct = default);
505
+ }
506
+
507
+ #endregion
508
+
509
+ #region DTOs
510
+
511
+ public record {{pascalCase FEATURE_NAME}}Dto(
512
+ Guid Id,
513
+ string Name,
514
+ DateTime CreatedAt,
515
+ DateTime? UpdatedAt
516
+ );
517
+
518
+ public record Create{{pascalCase FEATURE_NAME}}Request(
519
+ string Name
520
+ // Add fields
521
+ );
522
+
523
+ public record Update{{pascalCase FEATURE_NAME}}Request(
524
+ string Name
525
+ // Add fields
526
+ );
527
+
528
+ #endregion
529
+
530
+ #region Repository Interface
531
+
532
+ public interface I{{pascalCase FEATURE_NAME}}Repository
533
+ {
534
+ Task<{{pascalCase FEATURE_NAME}}?> GetByIdAsync(Guid id, CancellationToken ct = default);
535
+ Task<List<{{pascalCase FEATURE_NAME}}>> GetAllAsync(CancellationToken ct = default);
536
+ Task AddAsync({{pascalCase FEATURE_NAME}} entity, CancellationToken ct = default);
537
+ void Update({{pascalCase FEATURE_NAME}} entity);
538
+ void Remove({{pascalCase FEATURE_NAME}} entity);
539
+ Task SaveChangesAsync(CancellationToken ct = default);
540
+ }
541
+
542
+ #endregion
543
+
544
+ #region Exceptions
545
+
546
+ public class {{pascalCase FEATURE_NAME}}NotFoundException(Guid id)
547
+ : Exception($"{{pascalCase FEATURE_NAME}} '{id}' not found.");
548
+
549
+ #endregion
550
+ ```
551
+
552
+ **Step 1: Criar o arquivo** com o conteúdo acima.
553
+
554
+ **Step 2: Verificar que o template renderiza sem erros**
555
+
556
+ ```bash
557
+ npx morph-spec template render \
558
+ code/dotnet/contracts/contracts-level1.cs \
559
+ /tmp/test-level1.cs \
560
+ '{"FEATURE_NAME":"category","NAMESPACE":"MyApp","DATE":"2026-02-23"}'
561
+ cat /tmp/test-level1.cs
562
+ ```
563
+ Esperado: C# válido sem placeholders Handlebars não substituídos.
564
+
565
+ **Step 3: Commit**
566
+
567
+ ```bash
568
+ git add framework/templates/code/dotnet/contracts/contracts-level1.cs
569
+ git commit -m "feat(templates): add contracts-level1.cs — CRUD pattern, no Domain Events or Aggregates"
570
+ ```
571
+
572
+ ---
573
+
574
+ ### Task 7: Criar `contracts-level2.cs` (Aggregate)
575
+
576
+ **Files:**
577
+ - Create: `framework/templates/code/dotnet/contracts/contracts-level2.cs`
578
+
579
+ ```csharp
580
+ // ============================================================
581
+ // CONTRACTS: {{titleCase FEATURE_NAME}} — Level 2 (Business Logic)
582
+ // Generated by MORPH Framework | Date: {{DATE}}
583
+ // Domain Complexity: Aggregate com invariants, Domain Events, CQRS
584
+ // Ref: framework/standards/architecture/ddd/aggregates.md
585
+ // ============================================================
586
+
587
+ using System;
588
+ using System.Collections.Generic;
589
+ using System.Threading;
590
+ using System.Threading.Tasks;
591
+ using MediatR;
592
+
593
+ namespace {{NAMESPACE}}.Domain.{{pascalCase FEATURE_NAME}}s;
594
+
595
+ // ===== AGGREGATE ROOT =====
596
+ // Implemente em: Domain/{{pascalCase FEATURE_NAME}}s/Aggregates/{{pascalCase FEATURE_NAME}}.cs
597
+ //
598
+ // Invariants documentados no spec.md > Aggregate Blueprint:
599
+ // - {Invariant 1}
600
+ // - {Invariant 2}
601
+ //
602
+ // public sealed class {{pascalCase FEATURE_NAME}} : AggregateRoot
603
+ // {
604
+ // private {{pascalCase FEATURE_NAME}}() { } // EF constructor
605
+ //
606
+ // public static {{pascalCase FEATURE_NAME}} Create(/* params */) { /* validate + RaiseDomainEvent */ }
607
+ // public void {Action}() { /* validate invariant + mutate + RaiseDomainEvent */ }
608
+ // }
609
+
610
+ // ===== VALUE OBJECTS =====
611
+ // Implemente em: Domain/{{pascalCase FEATURE_NAME}}s/ValueObjects/
612
+ // (inclua apenas se houver primitivos com regras de validação/negócio)
613
+
614
+ // ===== DOMAIN EVENTS =====
615
+
616
+ namespace {{NAMESPACE}}.Domain.{{pascalCase FEATURE_NAME}}s.Events;
617
+
618
+ public record {{pascalCase FEATURE_NAME}}CreatedEvent(
619
+ Guid {{pascalCase FEATURE_NAME}}Id,
620
+ Guid UserId
621
+ ) : DomainEvent;
622
+
623
+ // Adicione eventos para cada mudança de estado relevante
624
+ // public record {{pascalCase FEATURE_NAME}}ConfirmedEvent(Guid {{pascalCase FEATURE_NAME}}Id) : DomainEvent;
625
+
626
+ // ===== COMMANDS (CQRS) =====
627
+
628
+ namespace {{NAMESPACE}}.Application.{{pascalCase FEATURE_NAME}}s.Commands;
629
+
630
+ public record Create{{pascalCase FEATURE_NAME}}Command(
631
+ Guid UserId
632
+ // Add fields
633
+ ) : IRequest<Create{{pascalCase FEATURE_NAME}}Result>;
634
+
635
+ public record Create{{pascalCase FEATURE_NAME}}Result(Guid Id);
636
+
637
+ // public record Update{{pascalCase FEATURE_NAME}}Command(...) : IRequest;
638
+ // public record Delete{{pascalCase FEATURE_NAME}}Command(Guid Id) : IRequest;
639
+
640
+ // ===== QUERIES =====
641
+
642
+ namespace {{NAMESPACE}}.Application.{{pascalCase FEATURE_NAME}}s.Queries;
643
+
644
+ public record Get{{pascalCase FEATURE_NAME}}Query(Guid Id) : IRequest<{{pascalCase FEATURE_NAME}}Dto?>;
645
+ public record List{{pascalCase FEATURE_NAME}}sQuery(/* filters */) : IRequest<List<{{pascalCase FEATURE_NAME}}Dto>>;
646
+
647
+ // ===== DTOs (read models — nunca expõe o Aggregate) =====
648
+
649
+ namespace {{NAMESPACE}}.Application.{{pascalCase FEATURE_NAME}}s;
650
+
651
+ public record {{pascalCase FEATURE_NAME}}Dto(
652
+ Guid Id,
653
+ string Status,
654
+ DateTime CreatedAt,
655
+ DateTime? UpdatedAt
656
+ );
657
+
658
+ // ===== REPOSITORY (um por Aggregate Root) =====
659
+
660
+ namespace {{NAMESPACE}}.Domain.{{pascalCase FEATURE_NAME}}s;
661
+
662
+ public interface I{{pascalCase FEATURE_NAME}}Repository
663
+ {
664
+ Task<{{pascalCase FEATURE_NAME}}?> GetAsync(Guid id, CancellationToken ct = default);
665
+ Task AddAsync({{pascalCase FEATURE_NAME}} aggregate, CancellationToken ct = default);
666
+ Task UpdateAsync({{pascalCase FEATURE_NAME}} aggregate, CancellationToken ct = default);
667
+ Task<bool> ExistsAsync(Guid id, CancellationToken ct = default);
668
+ }
669
+
670
+ // ===== EXCEPTIONS =====
671
+
672
+ public class {{pascalCase FEATURE_NAME}}NotFoundException(Guid id)
673
+ : DomainException($"{{pascalCase FEATURE_NAME}} '{id}' not found.");
674
+
675
+ public class {{pascalCase FEATURE_NAME}}InvalidStateException(string message)
676
+ : DomainException(message);
677
+ ```
678
+
679
+ **Step 1: Criar o arquivo.**
680
+
681
+ **Step 2: Verificar renderização**
682
+
683
+ ```bash
684
+ npx morph-spec template render \
685
+ code/dotnet/contracts/contracts-level2.cs \
686
+ /tmp/test-level2.cs \
687
+ '{"FEATURE_NAME":"order","NAMESPACE":"MyApp","DATE":"2026-02-23"}'
688
+ ```
689
+ Esperado: sem placeholders não resolvidos, namespaces corretos.
690
+
691
+ **Step 3: Commit**
692
+
693
+ ```bash
694
+ git add framework/templates/code/dotnet/contracts/contracts-level2.cs
695
+ git commit -m "feat(templates): add contracts-level2.cs — Aggregate, Domain Events, CQRS pattern"
696
+ ```
697
+
698
+ ---
699
+
700
+ ### Task 8: Criar `contracts-level3.cs` (Bounded Context)
701
+
702
+ **Files:**
703
+ - Create: `framework/templates/code/dotnet/contracts/contracts-level3.cs`
704
+
705
+ Nível 3 estende o Nível 2 com isolamento de BC e comunicação cross-BC explícita:
706
+
707
+ ```csharp
708
+ // ============================================================
709
+ // CONTRACTS: {{titleCase FEATURE_NAME}} — Level 3 (Bounded Context)
710
+ // Generated by MORPH Framework | Date: {{DATE}}
711
+ // Bounded Context: {{BOUNDED_CONTEXT}}
712
+ // Ref: framework/standards/architecture/ddd/bounded-contexts.md
713
+ // ============================================================
714
+ //
715
+ // ⚠️ LEMBRE-SE DAS REGRAS DE BC:
716
+ // 1. Referências cross-BC APENAS por ID (nunca navigation property)
717
+ // 2. Comunicação cross-BC APENAS via Domain Events
718
+ // 3. Cada BC tem seu próprio repositório (nunca compartilhar DbContext)
719
+ // 4. Linguagem Ubíqua documentada em 1-design/ubiquitous-language.md
720
+
721
+ // ===== TUDO DO NÍVEL 2 + ISOLAMENTO DE BC =====
722
+ // (inclua todos os contracts do Level 2 aqui com o namespace do BC)
723
+
724
+ namespace {{NAMESPACE}}.Domain.{{BOUNDED_CONTEXT}}.{{pascalCase FEATURE_NAME}}s;
725
+
726
+ // Aggregates, Value Objects, Domain Events — mesma estrutura do Level 2
727
+ // mas dentro do namespace do Bounded Context
728
+
729
+ // ===== INTEGRATION EVENTS (comunicação cross-BC) =====
730
+
731
+ namespace {{NAMESPACE}}.Domain.{{BOUNDED_CONTEXT}}.IntegrationEvents;
732
+
733
+ // Integration Events são diferentes de Domain Events:
734
+ // - Domain Event: dentro do mesmo BC (MediatR, síncrono)
735
+ // - Integration Event: cross-BC (Service Bus ou MediatR INotification, assíncrono)
736
+
737
+ public record {{pascalCase FEATURE_NAME}}IntegrationEvent(
738
+ Guid {{pascalCase FEATURE_NAME}}Id,
739
+ string EventType,
740
+ DateTime OccurredAt
741
+ );
742
+
743
+ // ===== CROSS-BC REFERENCES (por ID apenas) =====
744
+ //
745
+ // Exemplo de como referenciar outro BC:
746
+ // public sealed class {{pascalCase FEATURE_NAME}} : AggregateRoot
747
+ // {
748
+ // public Guid ExternalBcEntityId { get; private set; } // ✅ por ID
749
+ // // public ExternalEntity External { get; } // ❌ proibido
750
+ // }
751
+ ```
752
+
753
+ **Step 1: Criar o arquivo.**
754
+
755
+ **Step 2: Verificar renderização com BOUNDED_CONTEXT**
756
+
757
+ ```bash
758
+ npx morph-spec template render \
759
+ code/dotnet/contracts/contracts-level3.cs \
760
+ /tmp/test-level3.cs \
761
+ '{"FEATURE_NAME":"subscription","NAMESPACE":"MyApp","BOUNDED_CONTEXT":"Billing","DATE":"2026-02-23"}'
762
+ ```
763
+
764
+ **Step 3: Commit**
765
+
766
+ ```bash
767
+ git add framework/templates/code/dotnet/contracts/contracts-level3.cs
768
+ git commit -m "feat(templates): add contracts-level3.cs — Bounded Context, Integration Events, cross-BC rules"
769
+ ```
770
+
771
+ ---
772
+
773
+ ### Task 9: Criar template de estrutura de pastas por nível
774
+
775
+ **Files:**
776
+ - Create: `framework/templates/project-structure/dotnet-ddd.md`
777
+
778
+ ```markdown
779
+ # Estrutura de Pastas .NET + DDD
780
+
781
+ > Template de referência. O nível determina quais subpastas são criadas.
782
+ > Gerado durante a fase de Design baseado no Domain Complexity Level.
783
+
784
+ ## Nível 1 — CRUD
785
+
786
+ ```
787
+ src/{App}.Domain/
788
+ Entities/
789
+ {EntityName}.cs
790
+ Interfaces/
791
+ I{EntityName}Repository.cs
792
+
793
+ src/{App}.Application/
794
+ Features/{FeatureName}/
795
+ {FeatureName}Service.cs
796
+ DTOs/
797
+ {FeatureName}Dto.cs
798
+ Create{FeatureName}Request.cs
799
+ ```
800
+
801
+ ## Nível 2 — Business Logic
802
+
803
+ ```
804
+ src/{App}.Domain/
805
+ {EntityName}s/ ← pasta por aggregate
806
+ Aggregates/
807
+ {EntityName}.cs ← AggregateRoot
808
+ ValueObjects/
809
+ {ValueObjectName}.cs
810
+ Events/
811
+ {EntityName}CreatedEvent.cs
812
+ Exceptions/
813
+ {EntityName}NotFoundException.cs
814
+ I{EntityName}Repository.cs
815
+
816
+ src/{App}.Application/
817
+ {EntityName}s/
818
+ Commands/
819
+ Create{EntityName}Command.cs
820
+ Create{EntityName}Handler.cs
821
+ Queries/
822
+ Get{EntityName}Query.cs
823
+ Get{EntityName}Handler.cs
824
+ {EntityName}Dto.cs
825
+ ```
826
+
827
+ ## Nível 3 — Bounded Context
828
+
829
+ ```
830
+ src/{App}.Domain/
831
+ {BoundedContext}/ ← pasta por BC
832
+ {EntityName}s/ ← mesma estrutura do Nível 2
833
+ Aggregates/
834
+ ValueObjects/
835
+ Events/
836
+ IntegrationEvents/ ← eventos cross-BC
837
+
838
+ src/{App}.Application/
839
+ {BoundedContext}/ ← espelha Domain
840
+ {EntityName}s/
841
+ Commands/
842
+ Queries/
843
+ ```
844
+ ```
845
+
846
+ **Step 1: Criar o arquivo.**
847
+
848
+ **Step 2: Commit**
849
+
850
+ ```bash
851
+ git add framework/templates/project-structure/dotnet-ddd.md
852
+ git commit -m "feat(templates): add dotnet-ddd.md folder structure template — 3 levels"
853
+ ```
854
+
855
+ ---
856
+
857
+ ## Parte C — Agentes
858
+
859
+ ### Task 10: Elevar `domain-architect` para Tier 2 em `agents.json`
860
+
861
+ **Files:**
862
+ - Modify: `framework/agents.json`
863
+
864
+ **Contexto:**
865
+ - `ddd-expert` está em Tier 3 na lista de coordinatedBy `dotnet-senior`
866
+ - Precisamos: elevar para Tier 2, renomear para `domain-architect`, remover de `dotnet-senior`
867
+
868
+ **Step 1: Ler o agents.json para localizar ddd-expert e dotnet-senior**
869
+
870
+ ```bash
871
+ node -e "
872
+ const a = JSON.parse(require('fs').readFileSync('framework/agents.json'));
873
+ const ddd = a.agents.find(x => x.id === 'ddd-expert');
874
+ const dotnet = a.agents.find(x => x.id === 'dotnet-senior');
875
+ console.log('ddd-expert tier:', ddd?.tier);
876
+ console.log('ddd-expert:', JSON.stringify(ddd, null, 2));
877
+ console.log('dotnet-senior coordinates:', dotnet?.coordinates);
878
+ "
879
+ ```
880
+
881
+ **Step 2: Aplicar as mudanças no agents.json**
882
+
883
+ Mudanças necessárias:
884
+ 1. Localizar o agente `ddd-expert` (Tier 3)
885
+ 2. Alterar:
886
+ - `id`: `ddd-expert` → `domain-architect`
887
+ - `tier`: `3` → `2`
888
+ - `name`: atualizar para "Domain Architect"
889
+ - `role`: "Domain modeling leader — detects complexity level, designs aggregates and bounded contexts"
890
+ - `alwaysActive`: `false` → `true` (ativo nas fases design + implement)
891
+ - `activePhases`: adicionar `["design", "implement"]`
892
+ - `coordinates`: adicionar `["ef-modeler", "event-architect"]` (especialistas que o domain-architect precisa)
893
+ - `reportsTo`: `"dotnet-senior"` → `"standards-architect"`
894
+ 3. Em `dotnet-senior.coordinates`: remover `"ddd-expert"`, adicionar `"domain-architect"` como peer (não subordinado)
895
+ 4. Atualizar tier sums: Tier 2 de `3` → `4`
896
+ 5. Atualizar total de agentes se necessário (renomear não muda count)
897
+ 6. Atualizar `version` de `3.1.0-hierarchical` → `3.2.0-hierarchical`
898
+
899
+ **Step 3: Verificar integridade do JSON**
900
+
901
+ ```bash
902
+ node -e "
903
+ const a = JSON.parse(require('fs').readFileSync('framework/agents.json'));
904
+ const tier2 = a.agents.filter(x => x.tier === 2);
905
+ console.log('Tier 2 agents:', tier2.map(x => x.id));
906
+ console.log('Count:', tier2.length);
907
+ const da = a.agents.find(x => x.id === 'domain-architect');
908
+ console.log('domain-architect:', da ? 'FOUND' : 'NOT FOUND');
909
+ "
910
+ ```
911
+ Esperado: Tier 2 com 4 agentes: `dotnet-senior`, `infra-architect`, `ui-designer`, `domain-architect`.
912
+
913
+ **Step 4: Commit**
914
+
915
+ ```bash
916
+ git add framework/agents.json
917
+ git commit -m "feat(agents): elevate domain-architect to Tier 2 — leads domain modeling, detects complexity level"
918
+ ```
919
+
920
+ ---
921
+
922
+ ## Parte D — Skills
923
+
924
+ ### Task 11: Atualizar `phase-design` — Adicionar detecção de nível de domínio
925
+
926
+ **Files:**
927
+ - Modify: `framework/skills/level-1-workflows/phase-design/SKILL.md`
928
+
929
+ Adicionar **entre** "Passo 1: Carregar Contexto" e "Passo 2: Analisar Código Existente":
930
+
931
+ ```markdown
932
+ ### Passo 1.5: Detectar Nível de Domínio (domain-architect)
933
+
934
+ **⚠️ OBRIGATÓRIO:** Execute antes de gerar qualquer contrato.
935
+
936
+ **Ref:** `framework/standards/architecture/ddd/complexity-levels.md`
937
+
938
+ O `domain-architect` analisa a proposta e determina o nível:
939
+
940
+ ```
941
+ Responda às perguntas (da proposal.md):
942
+ 1. A entidade principal tem estados com transições? (Draft → Confirmed → Shipped)
943
+ 2. Existem invariants de negócio? ("só cancela se estiver Ativo")
944
+ 3. Cálculos derivados existem? (Total, Saldo, Desconto)
945
+ 4. Outros módulos precisam reagir a mudanças? (Domain Events com consumidores)
946
+ 5. O usuário declarou Bounded Context na proposta?
947
+
948
+ → Nenhuma acima: Nível 1 (CRUD)
949
+ → 1-4 verdadeiros: Nível 2 (Business Logic)
950
+ → 5 verdadeiro OU múltiplos domínios com modelos conflitantes: Nível 3 (BC)
951
+ ```
952
+
953
+ **Documente no spec.md** (seção Domain Complexity) antes de continuar.
954
+
955
+ **Template a usar no Passo 4:**
956
+
957
+ | Nível | Template |
958
+ |-------|----------|
959
+ | 1 | `code/dotnet/contracts/contracts-level1.cs` |
960
+ | 2 | `code/dotnet/contracts/contracts-level2.cs` |
961
+ | 3 | `code/dotnet/contracts/contracts-level3.cs` |
962
+
963
+ **Para Nível 2+:** Defina o Aggregate Blueprint (section no spec.md) antes de gerar contracts.cs.
964
+
965
+ **Para Nível 3:** Adicione `BOUNDED_CONTEXT` como variável ao renderizar o template.
966
+ ```
967
+
968
+ **Step 1: Editar o SKILL.md** — inserir o bloco acima na posição correta.
969
+
970
+ **Step 2: Verificar que a referência ao template de complexity-levels.md está correta**
971
+
972
+ ```bash
973
+ grep -n "complexity-levels" framework/skills/level-1-workflows/phase-design/SKILL.md
974
+ ```
975
+
976
+ **Step 3: Commit**
977
+
978
+ ```bash
979
+ git add framework/skills/level-1-workflows/phase-design/SKILL.md
980
+ git commit -m "feat(skills): add domain complexity detection step to phase-design — levels 1/2/3 drive template choice"
981
+ ```
982
+
983
+ ---
984
+
985
+ ## Parte E — Tests
986
+
987
+ ### Task 12: Atualizar testes do doctor para Tier 2 = 4 agentes
988
+
989
+ **Files:**
990
+ - Modify: `test/commands/doctor.test.js`
991
+
992
+ **Step 1: Ler o arquivo de teste para localizar as asserções de tier**
993
+
994
+ ```bash
995
+ grep -n "tier\|Tier\|domain-architect\|ddd-expert" test/commands/doctor.test.js
996
+ ```
997
+
998
+ **Step 2: Atualizar as asserções**
999
+
1000
+ Mudar qualquer asserção que espera Tier 2 = 3 agentes para Tier 2 = 4 agentes.
1001
+ Mudar referências a `ddd-expert` para `domain-architect` se existirem.
1002
+
1003
+ **Step 3: Rodar os testes do doctor**
1004
+
1005
+ ```bash
1006
+ node --test test/commands/doctor.test.js
1007
+ ```
1008
+ Esperado: todos os testes passam.
1009
+
1010
+ **Step 4: Se falhar**, revisar o agents.json — verificar que tier sums no JSON batem com o que o doctor valida.
1011
+
1012
+ **Step 5: Commit**
1013
+
1014
+ ```bash
1015
+ git add test/commands/doctor.test.js
1016
+ git commit -m "test(doctor): update tier-2 count to 4 — domain-architect elevated from Tier 3"
1017
+ ```
1018
+
1019
+ ---
1020
+
1021
+ ### Task 13: Adicionar testes de renderização dos 3 templates de contracts
1022
+
1023
+ **Files:**
1024
+ - Create: `test/templates/contracts-levels.test.js`
1025
+
1026
+ **Step 1: Escrever os testes**
1027
+
1028
+ ```javascript
1029
+ import { test } from 'node:test';
1030
+ import assert from 'node:assert/strict';
1031
+ import { execSync } from 'node:child_process';
1032
+ import { existsSync, unlinkSync } from 'node:fs';
1033
+ import { join } from 'node:path';
1034
+ import { tmpdir } from 'node:os';
1035
+
1036
+ const BASE_VARS = { NAMESPACE: 'MyApp', DATE: '2026-01-01' };
1037
+
1038
+ function renderTemplate(templateId, vars) {
1039
+ const out = join(tmpdir(), `morph-test-${Date.now()}.cs`);
1040
+ const varsJson = JSON.stringify({ ...BASE_VARS, ...vars });
1041
+ execSync(`node bin/morph-spec.js template render "${templateId}" "${out}" '${varsJson}'`);
1042
+ const content = require('fs').readFileSync(out, 'utf8');
1043
+ try { unlinkSync(out); } catch {}
1044
+ return content;
1045
+ }
1046
+
1047
+ test('Level 1 contracts render without Handlebars placeholders', () => {
1048
+ const out = renderTemplate('code/dotnet/contracts/contracts-level1.cs', {
1049
+ FEATURE_NAME: 'category'
1050
+ });
1051
+ assert.ok(!out.includes('{{'), 'Should have no unresolved Handlebars');
1052
+ assert.ok(out.includes('ICategoryService'), 'Should contain service interface');
1053
+ assert.ok(!out.includes('AggregateRoot'), 'Level 1 should NOT have AggregateRoot');
1054
+ assert.ok(!out.includes('DomainEvent'), 'Level 1 should NOT have Domain Events');
1055
+ });
1056
+
1057
+ test('Level 2 contracts render without Handlebars placeholders', () => {
1058
+ const out = renderTemplate('code/dotnet/contracts/contracts-level2.cs', {
1059
+ FEATURE_NAME: 'order'
1060
+ });
1061
+ assert.ok(!out.includes('{{'), 'Should have no unresolved Handlebars');
1062
+ assert.ok(out.includes('DomainEvent'), 'Level 2 should have Domain Events');
1063
+ assert.ok(out.includes('IRequest'), 'Level 2 should have CQRS commands');
1064
+ assert.ok(out.includes('IOrderRepository'), 'Level 2 should have Repository');
1065
+ });
1066
+
1067
+ test('Level 3 contracts render with BOUNDED_CONTEXT variable', () => {
1068
+ const out = renderTemplate('code/dotnet/contracts/contracts-level3.cs', {
1069
+ FEATURE_NAME: 'subscription',
1070
+ BOUNDED_CONTEXT: 'Billing'
1071
+ });
1072
+ assert.ok(!out.includes('{{'), 'Should have no unresolved Handlebars');
1073
+ assert.ok(out.includes('Billing'), 'Should include Bounded Context name');
1074
+ assert.ok(out.includes('IntegrationEvent'), 'Level 3 should have Integration Events');
1075
+ });
1076
+
1077
+ test('Level 1 uses Guid not int for Id', () => {
1078
+ const out = renderTemplate('code/dotnet/contracts/contracts-level1.cs', {
1079
+ FEATURE_NAME: 'tag'
1080
+ });
1081
+ assert.ok(out.includes('Guid id'), 'Should use Guid not int');
1082
+ assert.ok(!out.includes('int id'), 'Should NOT use int id');
1083
+ });
1084
+ ```
1085
+
1086
+ **Step 2: Rodar os testes**
1087
+
1088
+ ```bash
1089
+ node --test test/templates/contracts-levels.test.js
1090
+ ```
1091
+ Esperado: 4 testes passam.
1092
+
1093
+ **Step 3: Rodar a suite completa para garantir nada quebrou**
1094
+
1095
+ ```bash
1096
+ node --test
1097
+ ```
1098
+ Esperado: todos os testes anteriores continuam passando.
1099
+
1100
+ **Step 4: Commit**
1101
+
1102
+ ```bash
1103
+ git add test/templates/contracts-levels.test.js
1104
+ git commit -m "test(templates): add Level 1/2/3 contracts rendering tests — 4 tests"
1105
+ ```
1106
+
1107
+ ---
1108
+
1109
+ ## Verificação Final
1110
+
1111
+ ```bash
1112
+ # 1. Suite completa de testes
1113
+ node --test
1114
+
1115
+ # 2. Verificar standards adicionados
1116
+ npx morph-spec standards --list --category ddd
1117
+
1118
+ # 3. Verificar templates existem
1119
+ ls framework/templates/code/dotnet/contracts/
1120
+
1121
+ # 4. Verificar domain-architect no Tier 2
1122
+ node -e "
1123
+ const a = JSON.parse(require('fs').readFileSync('framework/agents.json'));
1124
+ const tier2 = a.agents.filter(x => x.tier === 2).map(x => x.id);
1125
+ console.log('Tier 2:', tier2);
1126
+ "
1127
+
1128
+ # 5. Verificar phase-design skill atualizado
1129
+ grep -n "1.5\|Detectar Nível\|complexity-levels" \
1130
+ framework/skills/level-1-workflows/phase-design/SKILL.md
1131
+ ```
1132
+
1133
+ ---
1134
+
1135
+ ## Resumo das Mudanças
1136
+
1137
+ | Categoria | Arquivos | Tipo |
1138
+ |-----------|---------|------|
1139
+ | Standards | `complexity-levels.md`, `bounded-contexts.md`, `ubiquitous-language.md` | Novo |
1140
+ | Standards | `STANDARDS.json` | Atualizado (77 entradas) |
1141
+ | Templates | `contracts-level1.cs`, `contracts-level2.cs`, `contracts-level3.cs` | Novo |
1142
+ | Templates | `spec.md` | Atualizado (+2 seções) |
1143
+ | Templates | `project-structure/dotnet-ddd.md` | Novo |
1144
+ | Agents | `agents.json` | Atualizado (domain-architect → Tier 2) |
1145
+ | Skills | `phase-design/SKILL.md` | Atualizado (+Passo 1.5) |
1146
+ | Tests | `doctor.test.js` | Atualizado (tier 2 count) |
1147
+ | Tests | `contracts-levels.test.js` | Novo (4 testes) |
1148
+
1149
+ **13 tarefas — ~2h de execução com TDD.**
1150
+
1151
+ ---
1152
+
1153
+ *MORPH-SPEC by Polymorphism Tech*