@girardelli/architect 2.2.0 → 5.0.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 (212) hide show
  1. package/README.md +105 -116
  2. package/architect-run.sh +431 -0
  3. package/assets/banner-v3.html +561 -0
  4. package/dist/agent-generator/context-enricher.d.ts +58 -0
  5. package/dist/agent-generator/context-enricher.d.ts.map +1 -0
  6. package/dist/agent-generator/context-enricher.js +613 -0
  7. package/dist/agent-generator/context-enricher.js.map +1 -0
  8. package/dist/agent-generator/domain-inferrer.d.ts +52 -0
  9. package/dist/agent-generator/domain-inferrer.d.ts.map +1 -0
  10. package/dist/agent-generator/domain-inferrer.js +585 -0
  11. package/dist/agent-generator/domain-inferrer.js.map +1 -0
  12. package/dist/agent-generator/framework-detector.d.ts +40 -0
  13. package/dist/agent-generator/framework-detector.d.ts.map +1 -0
  14. package/dist/agent-generator/framework-detector.js +611 -0
  15. package/dist/agent-generator/framework-detector.js.map +1 -0
  16. package/dist/agent-generator/index.d.ts +47 -0
  17. package/dist/agent-generator/index.d.ts.map +1 -0
  18. package/dist/agent-generator/index.js +545 -0
  19. package/dist/agent-generator/index.js.map +1 -0
  20. package/dist/agent-generator/stack-detector.d.ts +14 -0
  21. package/dist/agent-generator/stack-detector.d.ts.map +1 -0
  22. package/dist/agent-generator/stack-detector.js +124 -0
  23. package/dist/agent-generator/stack-detector.js.map +1 -0
  24. package/dist/agent-generator/templates/core/agents.d.ts +17 -0
  25. package/dist/agent-generator/templates/core/agents.d.ts.map +1 -0
  26. package/dist/agent-generator/templates/core/agents.js +1256 -0
  27. package/dist/agent-generator/templates/core/agents.js.map +1 -0
  28. package/dist/agent-generator/templates/core/architecture-rules.d.ts +7 -0
  29. package/dist/agent-generator/templates/core/architecture-rules.d.ts.map +1 -0
  30. package/dist/agent-generator/templates/core/architecture-rules.js +274 -0
  31. package/dist/agent-generator/templates/core/architecture-rules.js.map +1 -0
  32. package/dist/agent-generator/templates/core/general-rules.d.ts +8 -0
  33. package/dist/agent-generator/templates/core/general-rules.d.ts.map +1 -0
  34. package/dist/agent-generator/templates/core/general-rules.js +301 -0
  35. package/dist/agent-generator/templates/core/general-rules.js.map +1 -0
  36. package/dist/agent-generator/templates/core/hooks-generator.d.ts +21 -0
  37. package/dist/agent-generator/templates/core/hooks-generator.d.ts.map +1 -0
  38. package/dist/agent-generator/templates/core/hooks-generator.js +233 -0
  39. package/dist/agent-generator/templates/core/hooks-generator.js.map +1 -0
  40. package/dist/agent-generator/templates/core/index-md.d.ts +7 -0
  41. package/dist/agent-generator/templates/core/index-md.d.ts.map +1 -0
  42. package/dist/agent-generator/templates/core/index-md.js +246 -0
  43. package/dist/agent-generator/templates/core/index-md.js.map +1 -0
  44. package/dist/agent-generator/templates/core/orchestrator.d.ts +8 -0
  45. package/dist/agent-generator/templates/core/orchestrator.d.ts.map +1 -0
  46. package/dist/agent-generator/templates/core/orchestrator.js +422 -0
  47. package/dist/agent-generator/templates/core/orchestrator.js.map +1 -0
  48. package/dist/agent-generator/templates/core/preflight.d.ts +8 -0
  49. package/dist/agent-generator/templates/core/preflight.d.ts.map +1 -0
  50. package/dist/agent-generator/templates/core/preflight.js +213 -0
  51. package/dist/agent-generator/templates/core/preflight.js.map +1 -0
  52. package/dist/agent-generator/templates/core/quality-gates.d.ts +11 -0
  53. package/dist/agent-generator/templates/core/quality-gates.d.ts.map +1 -0
  54. package/dist/agent-generator/templates/core/quality-gates.js +254 -0
  55. package/dist/agent-generator/templates/core/quality-gates.js.map +1 -0
  56. package/dist/agent-generator/templates/core/security-rules.d.ts +7 -0
  57. package/dist/agent-generator/templates/core/security-rules.d.ts.map +1 -0
  58. package/dist/agent-generator/templates/core/security-rules.js +528 -0
  59. package/dist/agent-generator/templates/core/security-rules.js.map +1 -0
  60. package/dist/agent-generator/templates/core/skills-generator.d.ts +19 -0
  61. package/dist/agent-generator/templates/core/skills-generator.d.ts.map +1 -0
  62. package/dist/agent-generator/templates/core/skills-generator.js +546 -0
  63. package/dist/agent-generator/templates/core/skills-generator.js.map +1 -0
  64. package/dist/agent-generator/templates/core/workflow-fix-bug.d.ts +7 -0
  65. package/dist/agent-generator/templates/core/workflow-fix-bug.d.ts.map +1 -0
  66. package/dist/agent-generator/templates/core/workflow-fix-bug.js +237 -0
  67. package/dist/agent-generator/templates/core/workflow-fix-bug.js.map +1 -0
  68. package/dist/agent-generator/templates/core/workflow-new-feature.d.ts +8 -0
  69. package/dist/agent-generator/templates/core/workflow-new-feature.d.ts.map +1 -0
  70. package/dist/agent-generator/templates/core/workflow-new-feature.js +321 -0
  71. package/dist/agent-generator/templates/core/workflow-new-feature.js.map +1 -0
  72. package/dist/agent-generator/templates/core/workflow-review.d.ts +7 -0
  73. package/dist/agent-generator/templates/core/workflow-review.d.ts.map +1 -0
  74. package/dist/agent-generator/templates/core/workflow-review.js +104 -0
  75. package/dist/agent-generator/templates/core/workflow-review.js.map +1 -0
  76. package/dist/agent-generator/templates/domain/index.d.ts +22 -0
  77. package/dist/agent-generator/templates/domain/index.d.ts.map +1 -0
  78. package/dist/agent-generator/templates/domain/index.js +1176 -0
  79. package/dist/agent-generator/templates/domain/index.js.map +1 -0
  80. package/dist/agent-generator/templates/stack/index.d.ts +8 -0
  81. package/dist/agent-generator/templates/stack/index.d.ts.map +1 -0
  82. package/dist/agent-generator/templates/stack/index.js +695 -0
  83. package/dist/agent-generator/templates/stack/index.js.map +1 -0
  84. package/dist/agent-generator/templates/template-helpers.d.ts +75 -0
  85. package/dist/agent-generator/templates/template-helpers.d.ts.map +1 -0
  86. package/dist/agent-generator/templates/template-helpers.js +726 -0
  87. package/dist/agent-generator/templates/template-helpers.js.map +1 -0
  88. package/dist/agent-generator/types.d.ts +196 -0
  89. package/dist/agent-generator/types.d.ts.map +1 -0
  90. package/dist/agent-generator/types.js +27 -0
  91. package/dist/agent-generator/types.js.map +1 -0
  92. package/dist/analyzer.d.ts +5 -0
  93. package/dist/analyzer.d.ts.map +1 -1
  94. package/dist/analyzer.js +46 -5
  95. package/dist/analyzer.js.map +1 -1
  96. package/dist/analyzers/forecast.d.ts +85 -0
  97. package/dist/analyzers/forecast.d.ts.map +1 -0
  98. package/dist/analyzers/forecast.js +337 -0
  99. package/dist/analyzers/forecast.js.map +1 -0
  100. package/dist/analyzers/git-cache.d.ts +7 -0
  101. package/dist/analyzers/git-cache.d.ts.map +1 -0
  102. package/dist/analyzers/git-cache.js +41 -0
  103. package/dist/analyzers/git-cache.js.map +1 -0
  104. package/dist/analyzers/git-history.d.ts +113 -0
  105. package/dist/analyzers/git-history.d.ts.map +1 -0
  106. package/dist/analyzers/git-history.js +333 -0
  107. package/dist/analyzers/git-history.js.map +1 -0
  108. package/dist/analyzers/index.d.ts +10 -0
  109. package/dist/analyzers/index.d.ts.map +1 -0
  110. package/dist/analyzers/index.js +7 -0
  111. package/dist/analyzers/index.js.map +1 -0
  112. package/dist/analyzers/temporal-scorer.d.ts +72 -0
  113. package/dist/analyzers/temporal-scorer.d.ts.map +1 -0
  114. package/dist/analyzers/temporal-scorer.js +140 -0
  115. package/dist/analyzers/temporal-scorer.js.map +1 -0
  116. package/dist/anti-patterns.d.ts +7 -0
  117. package/dist/anti-patterns.d.ts.map +1 -1
  118. package/dist/anti-patterns.js +25 -6
  119. package/dist/anti-patterns.js.map +1 -1
  120. package/dist/cli.d.ts +2 -3
  121. package/dist/cli.d.ts.map +1 -1
  122. package/dist/cli.js +275 -113
  123. package/dist/cli.js.map +1 -1
  124. package/dist/config.d.ts +6 -0
  125. package/dist/config.d.ts.map +1 -1
  126. package/dist/config.js +48 -11
  127. package/dist/config.js.map +1 -1
  128. package/dist/html-reporter.d.ts +3 -1
  129. package/dist/html-reporter.d.ts.map +1 -1
  130. package/dist/html-reporter.js +248 -12
  131. package/dist/html-reporter.js.map +1 -1
  132. package/dist/index.d.ts +16 -3
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +63 -4
  135. package/dist/index.js.map +1 -1
  136. package/dist/project-summarizer.d.ts +38 -0
  137. package/dist/project-summarizer.d.ts.map +1 -0
  138. package/dist/project-summarizer.js +463 -0
  139. package/dist/project-summarizer.js.map +1 -0
  140. package/dist/refactor-reporter.js +1 -1
  141. package/dist/scanner.d.ts +8 -2
  142. package/dist/scanner.d.ts.map +1 -1
  143. package/dist/scanner.js +153 -113
  144. package/dist/scanner.js.map +1 -1
  145. package/dist/scorer.d.ts.map +1 -1
  146. package/dist/scorer.js +24 -11
  147. package/dist/scorer.js.map +1 -1
  148. package/dist/types.d.ts +29 -0
  149. package/dist/types.d.ts.map +1 -1
  150. package/package.json +12 -3
  151. package/src/agent-generator/context-enricher.ts +672 -0
  152. package/src/agent-generator/domain-inferrer.ts +635 -0
  153. package/src/agent-generator/framework-detector.ts +669 -0
  154. package/src/agent-generator/index.ts +634 -0
  155. package/src/agent-generator/stack-detector.ts +115 -0
  156. package/src/agent-generator/templates/core/agents.ts +1296 -0
  157. package/src/agent-generator/templates/core/architecture-rules.ts +287 -0
  158. package/src/agent-generator/templates/core/general-rules.ts +306 -0
  159. package/src/agent-generator/templates/core/hooks-generator.ts +242 -0
  160. package/src/agent-generator/templates/core/index-md.ts +260 -0
  161. package/src/agent-generator/templates/core/orchestrator.ts +459 -0
  162. package/src/agent-generator/templates/core/preflight.ts +215 -0
  163. package/src/agent-generator/templates/core/quality-gates.ts +256 -0
  164. package/src/agent-generator/templates/core/security-rules.ts +543 -0
  165. package/src/agent-generator/templates/core/skills-generator.ts +585 -0
  166. package/src/agent-generator/templates/core/workflow-fix-bug.ts +239 -0
  167. package/src/agent-generator/templates/core/workflow-new-feature.ts +323 -0
  168. package/src/agent-generator/templates/core/workflow-review.ts +106 -0
  169. package/src/agent-generator/templates/domain/index.ts +1201 -0
  170. package/src/agent-generator/templates/stack/index.ts +705 -0
  171. package/src/agent-generator/templates/template-helpers.ts +776 -0
  172. package/src/agent-generator/types.ts +232 -0
  173. package/src/analyzer.ts +51 -5
  174. package/src/analyzers/forecast.ts +496 -0
  175. package/src/analyzers/git-cache.ts +52 -0
  176. package/src/analyzers/git-history.ts +488 -0
  177. package/src/analyzers/index.ts +33 -0
  178. package/src/analyzers/temporal-scorer.ts +227 -0
  179. package/src/anti-patterns.ts +29 -6
  180. package/src/cli.ts +316 -117
  181. package/src/config.ts +52 -11
  182. package/src/html-reporter.ts +263 -13
  183. package/src/index.ts +93 -10
  184. package/src/project-summarizer.ts +521 -0
  185. package/src/refactor-reporter.ts +1 -1
  186. package/src/scanner.ts +136 -90
  187. package/src/scorer.ts +26 -11
  188. package/src/types.ts +27 -0
  189. package/tests/agent-generator.test.ts +427 -0
  190. package/tests/analyzers-integration.test.ts +174 -0
  191. package/tests/architect-adapter-enrichment.test.ts +9 -0
  192. package/tests/context-enricher.test.ts +971 -0
  193. package/tests/fixtures/monorepo/package.json +6 -0
  194. package/tests/fixtures/monorepo/packages/app/package.json +12 -0
  195. package/tests/fixtures/monorepo/packages/app/src/index.ts +6 -0
  196. package/tests/fixtures/monorepo/packages/core/package.json +7 -0
  197. package/tests/fixtures/monorepo/packages/core/src/index.ts +7 -0
  198. package/tests/forecast.test.ts +509 -0
  199. package/tests/framework-detector.test.ts +1172 -0
  200. package/tests/git-history.test.ts +254 -0
  201. package/tests/monorepo-scan.test.ts +170 -0
  202. package/tests/scanner.test.ts +7 -8
  203. package/tests/scorer.test.ts +594 -0
  204. package/tests/stack-detector.test.ts +241 -0
  205. package/tests/template-generation.test.ts +706 -0
  206. package/tests/template-helpers.test.ts +1152 -0
  207. package/tests/temporal-scorer.test.ts +307 -0
  208. package/dist/agent-generator.d.ts +0 -106
  209. package/dist/agent-generator.d.ts.map +0 -1
  210. package/dist/agent-generator.js +0 -1398
  211. package/dist/agent-generator.js.map +0 -1
  212. package/src/agent-generator.ts +0 -1526
@@ -0,0 +1,287 @@
1
+ import { TemplateContext } from '../../types.js';
2
+
3
+ /**
4
+ * Generates 01-architecture.md — layer rules, dependency direction,
5
+ * module patterns, and anti-pattern prevention.
6
+ */
7
+ export function generateArchitectureRules(ctx: TemplateContext): string {
8
+ const { stack, projectName, report, config } = ctx;
9
+ const layerRules = buildLayerRules(ctx);
10
+ const modulePattern = buildModulePattern(ctx);
11
+
12
+ return `---
13
+ antigravity:
14
+ trigger: 'always_on'
15
+ globs: ['**/*']
16
+ description: 'Regras de arquitetura para ${projectName}'
17
+ priority: HIGH
18
+ ---
19
+
20
+ # 🏗️ Regras de Arquitetura — ${projectName}
21
+
22
+ > **Separação de camadas, direção de dependências, e padrões de módulo.**
23
+
24
+ ---
25
+
26
+ ## 📐 Camadas Arquiteturais
27
+
28
+ ${layerRules}
29
+
30
+ ### Direção de Dependência (OBRIGATÓRIA)
31
+
32
+ \`\`\`
33
+ UI / Controllers → Services → Repositories / Data → Entities
34
+ ↓ ↓ ↓
35
+ (pode usar) (pode usar) (pode usar)
36
+ Services Repositories Entities
37
+ DTOs Entities Value Objects
38
+ DTOs
39
+
40
+ ⚠️ NUNCA:
41
+ Entity → Controller
42
+ Repository → Controller
43
+ Service → Controller
44
+ Data Layer → UI Layer
45
+ \`\`\`
46
+
47
+ ### Regra de Ouro das Camadas
48
+
49
+ \`\`\`
50
+ ╔══════════════════════════════════════════════════════╗
51
+ ║ Uma camada SÓ pode depender de camadas ABAIXO. ║
52
+ ║ NUNCA de camadas acima ou da mesma camada lateral. ║
53
+ ╚══════════════════════════════════════════════════════╝
54
+ \`\`\`
55
+
56
+ ---
57
+
58
+ ## 📦 Padrão de Módulo
59
+
60
+ ${modulePattern}
61
+
62
+ ---
63
+
64
+ ## 🚫 Anti-Patterns a Prevenir
65
+
66
+ ### God Class (> 500 linhas ou > 10 métodos)
67
+ \`\`\`
68
+ ❌ PROIBIDO: Classe com múltiplas responsabilidades
69
+ ✅ CORRETO: Extrair em classes menores com responsabilidade única
70
+
71
+ Se um arquivo ultrapassar 500 linhas:
72
+ 1. PARAR
73
+ 2. Identificar responsabilidades distintas
74
+ 3. Extrair em módulos separados
75
+ 4. Atualizar imports
76
+ \`\`\`
77
+
78
+ ### Circular Dependencies
79
+ \`\`\`
80
+ ❌ PROIBIDO: A importa B, B importa A
81
+ ✅ CORRETO: Extrair interface comum ou usar event/mediator
82
+
83
+ Detecção:
84
+ $ npx madge --circular src/
85
+ $ architect anti-patterns .
86
+ \`\`\`
87
+
88
+ ### Leaky Abstractions
89
+ \`\`\`
90
+ ❌ PROIBIDO: Service expondo detalhes de implementação
91
+ ✅ CORRETO: Interface define contrato, implementação é encapsulada
92
+
93
+ Exemplos:
94
+ - Service retornando QueryBuilder → ERRADO (vaza ORM)
95
+ - Service retornando DTO → CORRETO (abstrai)
96
+ - Controller acessando Entity → ERRADO (vaza modelo)
97
+ - Controller acessando DTO → CORRETO (contrato)
98
+ \`\`\`
99
+
100
+ ### Feature Envy
101
+ \`\`\`
102
+ ❌ PROIBIDO: Método que usa mais atributos de outra classe que da própria
103
+ ✅ CORRETO: Mover método para a classe que possui os dados
104
+ \`\`\`
105
+
106
+ ### Shotgun Surgery
107
+ \`\`\`
108
+ ❌ PROIBIDO: Mudança em 1 feature exige alterar 10+ arquivos
109
+ ✅ CORRETO: Agrupar código relacionado no mesmo módulo
110
+
111
+ Se uma mudança toca > 5 arquivos:
112
+ 1. PARAR
113
+ 2. Reavaliar se o código está no lugar certo
114
+ 3. Considerar refatoração preventiva
115
+ \`\`\`
116
+
117
+ ---
118
+
119
+ ## 🏛️ Princípios Arquiteturais
120
+
121
+ ### DDD (Domain-Driven Design) — Quando Aplicável
122
+ \`\`\`
123
+ Entities: Objetos com identidade (ID único)
124
+ Value Objects: Objetos sem identidade (imutáveis)
125
+ Aggregates: Cluster de entidades com root
126
+ Repositories: Acesso a dados de Aggregates
127
+ Services: Lógica que não pertence a nenhuma entidade
128
+ \`\`\`
129
+
130
+ ### Clean Architecture
131
+ \`\`\`
132
+ Camada mais interna: Entities (regras de negócio)
133
+ Camada média: Use Cases / Services (lógica de aplicação)
134
+ Camada externa: Controllers, Gateways, Presenters (I/O)
135
+
136
+ Dependência: SEMPRE de fora para dentro, NUNCA o contrário.
137
+ \`\`\`
138
+
139
+ ### Event-Driven — Quando Aplicável
140
+ \`\`\`
141
+ Usar eventos quando:
142
+ - Desacoplamento entre módulos é necessário
143
+ - Processamento assíncrono é aceitável
144
+ - Múltiplos handlers para um mesmo trigger
145
+
146
+ NÃO usar eventos quando:
147
+ - Resposta síncrona é necessária
148
+ - Transação atômica é obrigatória
149
+ - Ordem de execução importa
150
+ \`\`\`
151
+
152
+ ---
153
+
154
+ ## 📊 Anti-Patterns Atuais do Projeto
155
+
156
+ ${report.antiPatterns.length > 0
157
+ ? report.antiPatterns.map(a =>
158
+ `- **${a.name}** (${a.severity}) em \`${a.location}\` — ${a.suggestion}`
159
+ ).join('\n')
160
+ : '✅ Nenhum anti-pattern detectado. Manter assim.'}
161
+
162
+ Score atual: **${report.score.overall}/100** | Meta: **${Math.min(100, report.score.overall + 10)}/100**
163
+
164
+ ---
165
+
166
+ ## ✅ Checklist de Arquitetura
167
+
168
+ Antes de criar qualquer módulo novo:
169
+
170
+ \`\`\`
171
+ □ Camada correta? (Controller vs Service vs Repository vs Entity)
172
+ □ Direção de dependência respeitada? (nunca de baixo para cima)
173
+ □ Módulo coeso? (tudo relacionado junto)
174
+ □ Sem circular dependency?
175
+ □ Sem God Class? (< 500 linhas, < 10 métodos)
176
+ □ Interface/abstração antes de implementação?
177
+ □ DTOs para comunicação entre camadas?
178
+ □ Testes por camada? (unit para service, integration para controller)
179
+ \`\`\`
180
+
181
+ ---
182
+
183
+ **Gerado por Architect v3.1 · Score: ${report.score.overall}/100**
184
+ `;
185
+ }
186
+
187
+ function buildLayerRules(ctx: TemplateContext): string {
188
+ const { stack } = ctx;
189
+
190
+ if (stack.frameworks.includes('NestJS')) {
191
+ return `| Camada | Responsabilidade | Padrão NestJS |
192
+ |--------|-----------------|---------------|
193
+ | **API** (Controllers) | Routing, validação de request, response shaping | \`*.controller.ts\` + \`@Controller()\` |
194
+ | **Service** | Lógica de negócio, orquestração | \`*.service.ts\` + \`@Injectable()\` |
195
+ | **Data** (Repository) | Acesso a dados, queries | \`*.repository.ts\` ou TypeORM Repository |
196
+ | **Entity** | Modelo de domínio | \`*.entity.ts\` + \`@Entity()\` |
197
+ | **DTO** | Contratos de request/response | \`*.dto.ts\` + class-validator |
198
+ | **Guard** | Autenticação/Autorização | \`*.guard.ts\` + \`@UseGuards()\` |
199
+ | **Pipe** | Validação/transformação | \`*.pipe.ts\` + \`@UsePipes()\` |`;
200
+ }
201
+
202
+ if (stack.frameworks.includes('Django') || stack.frameworks.includes('Flask') || stack.frameworks.includes('FastAPI')) {
203
+ return `| Camada | Responsabilidade | Padrão Python |
204
+ |--------|-----------------|---------------|
205
+ | **API** (Views/Routes) | Routing, serialização | views.py / routes.py |
206
+ | **Service** | Lógica de negócio | services.py |
207
+ | **Data** (Repository/ORM) | Acesso a dados | models.py + managers |
208
+ | **Schema** | Validação I/O | serializers.py / schemas.py |
209
+ | **Tasks** | Processamento assíncrono | tasks.py (Celery) |`;
210
+ }
211
+
212
+ if (stack.frameworks.includes('Angular')) {
213
+ return `| Camada | Responsabilidade | Padrão Angular |
214
+ |--------|-----------------|----------------|
215
+ | **Component** | UI rendering, user events | \`*.component.ts\` |
216
+ | **Service** | Lógica, API calls, state | \`*.service.ts\` + \`@Injectable()\` |
217
+ | **Model** | Interfaces/types | \`*.model.ts\` / \`*.interface.ts\` |
218
+ | **Guard** | Route protection | \`*.guard.ts\` + \`canActivate\` |
219
+ | **Interceptor** | HTTP middleware | \`*.interceptor.ts\` |
220
+ | **Pipe** | Data transformation | \`*.pipe.ts\` |`;
221
+ }
222
+
223
+ // Generic
224
+ return `| Camada | Responsabilidade | Padrão |
225
+ |--------|-----------------|--------|
226
+ | **API / Controllers** | Routing, validação HTTP | controllers/ |
227
+ | **Service** | Lógica de negócio | services/ |
228
+ | **Data / Repository** | Acesso a dados | repositories/ |
229
+ | **Entity / Model** | Modelo de domínio | entities/ ou models/ |
230
+ | **DTO / Schema** | Contratos I/O | dto/ ou schemas/ |`;
231
+ }
232
+
233
+ function buildModulePattern(ctx: TemplateContext): string {
234
+ const { stack } = ctx;
235
+ const ext = stack.primary === 'Python' ? 'py' : stack.primary === 'Dart' ? 'dart' : 'ts';
236
+
237
+ if (stack.frameworks.includes('NestJS')) {
238
+ return `\`\`\`
239
+ src/modules/[nome-do-modulo]/
240
+ ├── [nome].module.ts → NestJS Module (imports, providers, exports)
241
+ ├── [nome].controller.ts → HTTP endpoints
242
+ ├── [nome].controller.spec.ts → Testes do controller
243
+ ├── [nome].service.ts → Lógica de negócio
244
+ ├── [nome].service.spec.ts → Testes do service
245
+ ├── dto/
246
+ │ ├── create-[nome].dto.ts → Request de criação
247
+ │ ├── update-[nome].dto.ts → Request de atualização
248
+ │ └── [nome]-response.dto.ts → Response shape
249
+ ├── entities/
250
+ │ └── [nome].entity.ts → TypeORM entity
251
+ ├── guards/ → Guards específicos (se houver)
252
+ └── interfaces/ → Interfaces/types do módulo
253
+ \`\`\``;
254
+ }
255
+
256
+ if (stack.frameworks.includes('Angular')) {
257
+ return `\`\`\`
258
+ src/app/modules/[nome-do-modulo]/
259
+ ├── [nome].module.ts → Angular Module
260
+ ├── [nome]-routing.module.ts → Routes
261
+ ├── components/
262
+ │ ├── [nome]-list/
263
+ │ │ ├── [nome]-list.component.ts
264
+ │ │ ├── [nome]-list.component.html
265
+ │ │ ├── [nome]-list.component.scss
266
+ │ │ └── [nome]-list.component.spec.ts
267
+ │ └── [nome]-form/
268
+ │ └── ...
269
+ ├── services/
270
+ │ ├── [nome].service.ts
271
+ │ └── [nome].service.spec.ts
272
+ ├── models/
273
+ │ └── [nome].model.ts
274
+ └── guards/
275
+ \`\`\``;
276
+ }
277
+
278
+ return `\`\`\`
279
+ src/modules/[nome-do-modulo]/
280
+ ├── [nome].module.${ext}
281
+ ├── [nome].controller.${ext} → Endpoints / API
282
+ ├── [nome].service.${ext} → Lógica de negócio
283
+ ├── dto/ → Request/Response shapes
284
+ ├── entities/ → Modelos de domínio
285
+ └── __tests__/ → Testes do módulo
286
+ \`\`\``;
287
+ }
@@ -0,0 +1,306 @@
1
+ import { TemplateContext } from '../../types.js';
2
+ import { getEnriched } from '../template-helpers.js';
3
+
4
+ /**
5
+ * Generates enterprise-grade 00-general.md rules.
6
+ * Golden rules, git flow, project identity, naming conventions,
7
+ * diagnostic requirements, forbidden actions, compliance checklist.
8
+ */
9
+ export function generateGeneralRules(ctx: TemplateContext): string {
10
+ const { stack, projectName, stackLabel, config, report } = ctx;
11
+ const enriched = getEnriched(ctx);
12
+ const namingConventions = buildNamingConventions(ctx);
13
+
14
+ // Stack-aware forbidden type actions
15
+ const langs = stack.languages.map((l) => l.toLowerCase());
16
+ let typeProhibitions = `❌ any (TypeScript) sem justificativa em comentário
17
+ ❌ @ts-ignore / type: ignore sem justificativa`;
18
+
19
+ if (langs.includes('python')) {
20
+ typeProhibitions = `❌ type: ignore sem justificativa em comentário
21
+ ❌ # noqa sem justificativa
22
+ ❌ Any (typing) sem justificativa em comentário`;
23
+ } else if (langs.includes('dart')) {
24
+ typeProhibitions = `❌ dynamic sem justificativa em comentário
25
+ ❌ // ignore: sem justificativa
26
+ ❌ as dynamic sem type-check`;
27
+ } else if (langs.includes('java') || langs.includes('kotlin')) {
28
+ typeProhibitions = `❌ @SuppressWarnings sem justificativa em comentário
29
+ ❌ Object onde tipo específico é possível
30
+ ❌ Raw types sem justificativa`;
31
+ } else if (langs.includes('go')) {
32
+ typeProhibitions = `❌ interface{}/any sem justificativa em comentário
33
+ ❌ //nolint sem justificativa
34
+ ❌ _ (blank identifier) para erros sem tratamento`;
35
+ } else if (langs.includes('rust')) {
36
+ typeProhibitions = `❌ unwrap() em código de produção sem justificativa
37
+ ❌ #[allow(...)] sem justificativa em comentário
38
+ ❌ unsafe sem revisão e justificativa`;
39
+ }
40
+
41
+ return `---
42
+ antigravity:
43
+ trigger: 'always_on'
44
+ globs: ['**/*']
45
+ description: 'Regras gerais invioláveis para ${projectName}'
46
+ priority: CRITICAL
47
+ ---
48
+
49
+ # 📜 Regras Gerais — ${projectName}
50
+
51
+ > **Estas regras são INVIOLÁVEIS. Não há exceção.**
52
+
53
+ ---
54
+
55
+ ## 🏆 Regras de Ouro
56
+
57
+ \`\`\`
58
+ ╔══════════════════════════════════════════════════════════════╗
59
+ ║ 9 REGRAS DE OURO ║
60
+ ║ ║
61
+ ${config.goldenRules.map((r, i) => `║ ${i + 1}. ${r.padEnd(55)}║`).join('\n')}
62
+ ║ ║
63
+ ║ ⚠️ Violar qualquer regra = PARAR e RECOMEÇAR ║
64
+ ╚══════════════════════════════════════════════════════════════╝
65
+ \`\`\`
66
+
67
+ ---
68
+
69
+ ## 🏢 Identidade do Projeto
70
+
71
+ | Item | Valor |
72
+ |------|-------|
73
+ | **Nome** | ${projectName} |
74
+ | **Stack** | ${stackLabel} |
75
+ | **Score** | ${report.score.overall}/100 |
76
+ | **Linguagens** | ${stack.languages.join(', ')} |
77
+ | **Frameworks** | ${enriched.detectedFrameworks?.filter((f: any) => f.category === 'web' || f.category === 'orm').map((f: any) => `${f.name}${f.version ? ` v${f.version}` : ''}`).join(', ') || stack.frameworks.join(', ') || 'Nenhum detectado'} |
78
+ | **Cobertura Mínima** | ${config.coverageMinimum}% |
79
+ | **Score Mínimo** | ${config.scoreThreshold}/100 |
80
+
81
+ ---
82
+
83
+ ## 🔄 Fluxo Completo (Qualquer Ação)
84
+
85
+ \`\`\`
86
+ REQUISIÇÃO
87
+
88
+
89
+ LEITURA OBRIGATÓRIA (INDEX.md → 00-general → PREFLIGHT)
90
+
91
+
92
+ DIAGNÓSTICO (entender ANTES de agir)
93
+
94
+
95
+ ARTEFATOS (mockup → user story → arch → tasks → BDD → TDD)
96
+
97
+
98
+ APROVAÇÃO HUMANA (/approved)
99
+
100
+
101
+ IMPLEMENTAÇÃO (Backend → Integration Doc → Frontend/App)
102
+
103
+
104
+ QUALITY GATES (build + test + coverage + score)
105
+
106
+
107
+ CODE REVIEW
108
+
109
+
110
+ MERGE (via PR, nunca direto)
111
+ \`\`\`
112
+
113
+ ---
114
+
115
+ ## 🌿 Git Flow
116
+
117
+ ### Branch Naming
118
+
119
+ | Tipo | Padrão | Exemplo |
120
+ |------|--------|---------|
121
+ | Feature | \`feature/[ticket]-[descricao]\` | \`feature/PROJ-123-cancelled-tab\` |
122
+ | Bug fix | \`fix/[ticket]-[descricao]\` | \`fix/PROJ-456-null-balance\` |
123
+ | Hotfix | \`hotfix/[descricao]\` | \`hotfix/payment-crash\` |
124
+ | Refactor | \`refactor/[descricao]\` | \`refactor/extract-auth-service\` |
125
+
126
+ ### Commit Messages (Conventional Commits)
127
+
128
+ \`\`\`
129
+ feat: add cancelled refuelings tab
130
+ fix: prevent null balance on payment
131
+ refactor: extract auth service from user module
132
+ docs: update API documentation for v2
133
+ test: add integration tests for payment flow
134
+ chore: upgrade dependencies
135
+ \`\`\`
136
+
137
+ ### Cenários de Git Flow
138
+
139
+ **Cenário A: Feature nova**
140
+ \`\`\`
141
+ git checkout develop
142
+ git pull origin develop
143
+ git checkout -b feature/PROJ-XXX-nome
144
+ # ... implementar ...
145
+ git add [arquivos específicos]
146
+ git commit -m "feat: [descrição]"
147
+ git push -u origin feature/PROJ-XXX-nome
148
+ # Criar PR para develop
149
+ \`\`\`
150
+
151
+ **Cenário B: Bug fix**
152
+ \`\`\`
153
+ git checkout develop
154
+ git pull origin develop
155
+ git checkout -b fix/PROJ-XXX-descricao
156
+ # ... corrigir ...
157
+ git add [arquivos específicos]
158
+ git commit -m "fix: [descrição]"
159
+ git push -u origin fix/PROJ-XXX-descricao
160
+ # Criar PR para develop
161
+ \`\`\`
162
+
163
+ **Cenário C: Hotfix em produção**
164
+ \`\`\`
165
+ git checkout main
166
+ git pull origin main
167
+ git checkout -b hotfix/descricao
168
+ # ... corrigir ...
169
+ git add [arquivos específicos]
170
+ git commit -m "fix: [descrição] (hotfix)"
171
+ git push -u origin hotfix/descricao
172
+ # Criar PR para main E develop
173
+ \`\`\`
174
+
175
+ ---
176
+
177
+ ## 📝 Naming Conventions
178
+
179
+ ${namingConventions}
180
+
181
+ ---
182
+
183
+ ## 🔍 Diagnóstico Obrigatório
184
+
185
+ > **Antes de QUALQUER implementação, execute este diagnóstico.**
186
+
187
+ \`\`\`bash
188
+ # 1. Entender a estrutura
189
+ ls -la src/
190
+ find src/ -name "*.${stack.primary === 'Python' ? 'py' : stack.primary === 'Dart' ? 'dart' : 'ts'}" | head -30
191
+
192
+ # 2. Entender as dependências do módulo
193
+ grep -rn "import" --include="*.${stack.primary === 'Python' ? 'py' : 'ts'}" src/[modulo]/ | head -20
194
+
195
+ # 3. Testes existentes
196
+ find . -name "*.test.*" -o -name "*.spec.*" -o -name "*_test.*" | wc -l
197
+
198
+ # 4. Score atual
199
+ npx @girardelli/architect score .
200
+
201
+ # 5. Anti-patterns
202
+ npx @girardelli/architect anti-patterns .
203
+ \`\`\`
204
+
205
+ ---
206
+
207
+ ## ❌ Ações PROIBIDAS
208
+
209
+ \`\`\`
210
+ ❌ Commitar direto em main ou develop
211
+ ❌ Push --force sem aprovação explícita
212
+ ❌ Merge sem code review
213
+ ❌ Código sem testes
214
+ ❌ Ignorar falhas de build/test
215
+ ❌ Hardcodar secrets, tokens, senhas
216
+ ❌ console.log / print() em produção
217
+ ${typeProhibitions}
218
+ ❌ Testes com .skip() permanente
219
+ ❌ Copiar/colar código (extrair abstração)
220
+ ❌ Alterar mais de 10 arquivos sem reavaliar escopo
221
+ ❌ Implementar sem artefatos aprovados (mockup, US, BDD, TDD)
222
+ ❌ Decidir arquitetura sem consultar o humano
223
+ ❌ Refatorar código alheio ao escopo da task
224
+ \`\`\`
225
+
226
+ ---
227
+
228
+ ## ✅ Checklist de Compliance (Regras de Ouro)
229
+
230
+ Antes de marcar QUALQUER tarefa como "done":
231
+
232
+ \`\`\`
233
+ □ Regra 1: Git Flow completo (branch + PR + review)?
234
+ □ Regra 2: Arquitetura documentada (C4 se nova feature)?
235
+ □ Regra 3: BDD escrito antes do código?
236
+ □ Regra 4: TDD aplicado (RED → GREEN → REFACTOR)?
237
+ □ Regra 5: Diagnóstico feito antes de codar?
238
+ □ Regra 6: Mockup aprovado (se tem UI)?
239
+ □ Regra 7: Decisões validadas com humano?
240
+ □ Regra 8: Qualidade > Velocidade (sem atalhos)?
241
+ □ Regra 9: Apenas código (sem abrir browser, sem screenshots)?
242
+ \`\`\`
243
+
244
+ ---
245
+
246
+ **Gerado por Architect v3.1 · Score: ${report.score.overall}/100 · ${new Date().toISOString().split('T')[0]}**
247
+ `;
248
+ }
249
+
250
+ function buildNamingConventions(ctx: TemplateContext): string {
251
+ const { stack } = ctx;
252
+ const lang = stack.primary;
253
+
254
+ if (lang === 'Python') {
255
+ return `| Item | Padrão | Exemplo |
256
+ |------|--------|---------|
257
+ | Classes | PascalCase | \`UserService\` |
258
+ | Funções | snake_case | \`get_active_users\` |
259
+ | Variáveis | snake_case | \`user_count\` |
260
+ | Constantes | UPPER_SNAKE | \`MAX_RETRIES\` |
261
+ | Arquivos | snake_case | \`user_service.py\` |
262
+ | Módulos | snake_case | \`auth_module/\` |
263
+ | Testes | snake_case + \_test | \`user_service_test.py\` |`;
264
+ }
265
+
266
+ if (lang === 'Dart') {
267
+ return `| Item | Padrão | Exemplo |
268
+ |------|--------|---------|
269
+ | Classes | PascalCase | \`UserService\` |
270
+ | Funções | camelCase | \`getActiveUsers\` |
271
+ | Variáveis | camelCase | \`userCount\` |
272
+ | Constantes | camelCase (com const) | \`const maxRetries = 3\` |
273
+ | Arquivos | snake_case | \`user_service.dart\` |
274
+ | Widgets | PascalCase | \`UserProfileCard\` |
275
+ | Testes | snake_case + \_test | \`user_service_test.dart\` |`;
276
+ }
277
+
278
+ if (lang === 'Go') {
279
+ return `| Item | Padrão | Exemplo |
280
+ |------|--------|---------|
281
+ | Types/Structs | PascalCase (exported) | \`UserService\` |
282
+ | Functions (public) | PascalCase | \`GetActiveUsers\` |
283
+ | Functions (private) | camelCase | \`parseInput\` |
284
+ | Variables | camelCase | \`userCount\` |
285
+ | Constants | PascalCase | \`MaxRetries\` |
286
+ | Files | snake_case | \`user_service.go\` |
287
+ | Tests | snake_case + \_test | \`user_service_test.go\` |`;
288
+ }
289
+
290
+ // Default: TypeScript/JavaScript
291
+ return `| Item | Padrão | Exemplo |
292
+ |------|--------|---------|
293
+ | Classes | PascalCase | \`UserService\` |
294
+ | Interfaces | PascalCase (sem I prefix) | \`UserPayload\` |
295
+ | Funções | camelCase | \`getActiveUsers\` |
296
+ | Variáveis | camelCase | \`userCount\` |
297
+ | Constantes | UPPER_SNAKE | \`MAX_RETRIES\` |
298
+ | Enums | PascalCase | \`UserStatus\` |
299
+ | Arquivos | kebab-case | \`user-service.ts\` |
300
+ | Módulos (diretório) | kebab-case | \`user-management/\` |
301
+ | Testes | kebab-case + .spec/.test | \`user-service.spec.ts\` |
302
+ | Entities | PascalCase + .entity | \`User.entity.ts\` |
303
+ | DTOs | PascalCase + .dto | \`CreateUserDto\` |
304
+ | Controllers | PascalCase + .controller | \`user.controller.ts\` |
305
+ | Services | PascalCase + .service | \`user.service.ts\` |`;
306
+ }