@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,585 @@
1
+ import { EnrichedTemplateContext, TemplateContext } from '../../types.js';
2
+ import { getEnriched } from '../template-helpers.js';
3
+
4
+ /**
5
+ * Detecta padrões arquiteturais nos módulos do projeto
6
+ * e gera skills/documentação para o diretório skills/.
7
+ */
8
+
9
+ interface DetectedPattern {
10
+ name: string;
11
+ description: string;
12
+ examples: string[];
13
+ howToCreate: string;
14
+ }
15
+
16
+ /**
17
+ * Analisa módulos e detecta padrões recorrentes (adapters, factories, extractors, etc.)
18
+ */
19
+ function detectPatterns(ctx: TemplateContext | EnrichedTemplateContext): DetectedPattern[] {
20
+ const enriched = getEnriched(ctx);
21
+ const modules = enriched.modules || [];
22
+ const patterns: DetectedPattern[] = [];
23
+
24
+ // Collect all file/class names from modules
25
+ const allFiles: string[] = [];
26
+ const allServices: string[] = [];
27
+ const allControllers: string[] = [];
28
+ const allEntities: string[] = [];
29
+
30
+ for (const mod of modules) {
31
+ allServices.push(...mod.services);
32
+ allControllers.push(...mod.controllers);
33
+ allEntities.push(...mod.entities);
34
+ allFiles.push(...mod.testFiles);
35
+ }
36
+
37
+ const allNames = [...allServices, ...allControllers, ...allEntities, ...allFiles];
38
+
39
+ // Detect Adapter pattern
40
+ const adapters = allNames.filter(n => /adapter/i.test(n));
41
+ if (adapters.length > 0) {
42
+ patterns.push({
43
+ name: 'Adapter Pattern',
44
+ description: 'O projeto utiliza o padrão Adapter para abstrair integrações externas e garantir desacoplamento.',
45
+ examples: adapters.slice(0, 5),
46
+ howToCreate: `1. Criar interface no domínio: \`I{Nome}Port\`
47
+ 2. Implementar adapter: \`{Nome}Adapter implements I{Nome}Port\`
48
+ 3. Registrar no container de DI
49
+ 4. Escrever testes unitários com mock do adapter
50
+ 5. Garantir que o domínio nunca importe o adapter diretamente`,
51
+ });
52
+ }
53
+
54
+ // Detect Factory pattern
55
+ const factories = allNames.filter(n => /factory/i.test(n));
56
+ if (factories.length > 0) {
57
+ patterns.push({
58
+ name: 'Factory Pattern',
59
+ description: 'Factories são usadas para encapsular a lógica de criação de objetos complexos.',
60
+ examples: factories.slice(0, 5),
61
+ howToCreate: `1. Criar classe factory: \`{Nome}Factory\`
62
+ 2. Método principal: \`create({params}): {Tipo}\`
63
+ 3. Encapsular validações e defaults
64
+ 4. Escrever testes para cada variação de criação`,
65
+ });
66
+ }
67
+
68
+ // Detect Extractor pattern
69
+ const extractors = allNames.filter(n => /extractor|parser|reader/i.test(n));
70
+ if (extractors.length > 0) {
71
+ patterns.push({
72
+ name: 'Extractor/Parser Pattern',
73
+ description: 'Extractors/Parsers são usados para extrair e transformar dados de fontes externas (PDFs, APIs, arquivos).',
74
+ examples: extractors.slice(0, 5),
75
+ howToCreate: `1. Criar interface: \`I{Tipo}Extractor\`
76
+ 2. Implementar: \`{Tipo}Extractor implements I{Tipo}Extractor\`
77
+ 3. Método principal: \`extract(source): ExtractedData\`
78
+ 4. Testar com fixtures (dados de exemplo)
79
+ 5. Tratar edge cases: dados vazios, formato inválido, timeout`,
80
+ });
81
+ }
82
+
83
+ // Detect Repository pattern
84
+ const repositories = allNames.filter(n => /repository|repo/i.test(n));
85
+ if (repositories.length > 0) {
86
+ patterns.push({
87
+ name: 'Repository Pattern',
88
+ description: 'Repositories abstraem o acesso a dados, separando lógica de negócio da persistência.',
89
+ examples: repositories.slice(0, 5),
90
+ howToCreate: `1. Criar interface: \`I{Entidade}Repository\`
91
+ 2. Métodos padrão: findById, findAll, save, delete
92
+ 3. Implementar com ORM ou query builder
93
+ 4. Testar com banco in-memory ou mock`,
94
+ });
95
+ }
96
+
97
+ // Detect Middleware/Guard pattern
98
+ const middlewares = allNames.filter(n => /middleware|guard|interceptor|pipe/i.test(n));
99
+ if (middlewares.length > 0) {
100
+ patterns.push({
101
+ name: 'Middleware/Guard Pattern',
102
+ description: 'Middlewares e Guards implementam cross-cutting concerns (auth, logging, validation).',
103
+ examples: middlewares.slice(0, 5),
104
+ howToCreate: `1. Criar middleware/guard com interface do framework
105
+ 2. Implementar lógica de interceptação
106
+ 3. Registrar no pipeline de request
107
+ 4. Testar isoladamente com request mocking`,
108
+ });
109
+ }
110
+
111
+ // Detect DTO/Schema pattern
112
+ const dtos = allNames.filter(n => /dto|schema|model|entity/i.test(n));
113
+ if (dtos.length > 2) { // Only if there are several
114
+ patterns.push({
115
+ name: 'DTO/Schema Pattern',
116
+ description: 'DTOs e Schemas definem contratos de entrada/saída e validações.',
117
+ examples: dtos.slice(0, 5),
118
+ howToCreate: `1. Criar DTO/Schema para cada endpoint
119
+ 2. Validações no DTO (não no controller)
120
+ 3. Separar RequestDTO e ResponseDTO
121
+ 4. Documentar campos obrigatórios e opcionais
122
+ 5. Usar validação automática do framework`,
123
+ });
124
+ }
125
+
126
+ // Detect Service Layer pattern (almost always present)
127
+ if (allServices.length > 1) {
128
+ patterns.push({
129
+ name: 'Service Layer Pattern',
130
+ description: 'Services encapsulam toda a lógica de negócio, mantendo controllers finos.',
131
+ examples: allServices.slice(0, 5),
132
+ howToCreate: `1. Criar service: \`{Domínio}Service\`
133
+ 2. Injetar dependências via constructor
134
+ 3. Um método por caso de uso (SRP)
135
+ 4. Lançar exceções de domínio (não HTTP)
136
+ 5. Testar unitariamente com mocks de dependências`,
137
+ });
138
+ }
139
+
140
+ return patterns;
141
+ }
142
+
143
+ /**
144
+ * Gera conteúdo do skill principal do projeto
145
+ */
146
+ export function generateProjectSkills(ctx: TemplateContext | EnrichedTemplateContext): string | null {
147
+ const enriched = getEnriched(ctx);
148
+ const patterns = detectPatterns(ctx);
149
+ const stack = 'stack' in ctx ? ctx.stack : undefined;
150
+ const domain = enriched.domain;
151
+
152
+ if (patterns.length === 0) {
153
+ return null; // Não gerar se não houver padrões detectados
154
+ }
155
+
156
+ const langs = stack?.languages.map((l) => l.toLowerCase()) || [];
157
+ const isPython = langs.includes('python');
158
+ const isDart = langs.includes('dart');
159
+ const isGo = langs.includes('go');
160
+
161
+ // Naming convention per language
162
+ let fileConvention = 'camelCase para arquivos, PascalCase para classes';
163
+ if (isPython) fileConvention = 'snake_case para arquivos e funções, PascalCase para classes';
164
+ else if (isDart) fileConvention = 'snake_case para arquivos, camelCase para funções, PascalCase para classes';
165
+ else if (isGo) fileConvention = 'lowercase para pacotes, PascalCase para exports, camelCase para privados';
166
+
167
+ // Build frameworks label from enriched detectedFrameworks (most accurate) or stack.frameworks
168
+ const detectedFw = enriched.detectedFrameworks;
169
+ const frameworksLabel = detectedFw && detectedFw.length > 0
170
+ ? detectedFw.map(f => f.version ? `${f.name} v${f.version}` : f.name).join(', ')
171
+ : (stack?.frameworks.length ? stack.frameworks.join(', ') : 'Não detectados');
172
+
173
+ const patternsContent = patterns.map(p => `### ${p.name}
174
+
175
+ ${p.description}
176
+
177
+ **Exemplos no projeto:**
178
+ ${p.examples.map(e => `- \`${e}\``).join('\n')}
179
+
180
+ **Como criar um novo:**
181
+ ${p.howToCreate}
182
+ `).join('\n---\n\n');
183
+
184
+ const domainSection = domain ? `
185
+ ---
186
+
187
+ ## Padrões de Domínio: ${domain.domain}${domain.subDomain ? ` / ${domain.subDomain}` : ''}
188
+
189
+ ${domain.businessEntities?.length ? `### Entidades de Negócio
190
+ ${domain.businessEntities.map(e => `- **${e.name}**: ${e.fields?.join(', ') || 'campos detectados'}`).join('\n')}` : ''}
191
+
192
+ ${domain.integrations?.length ? `### Integrações
193
+ ${domain.integrations.map(i => `- **${i.name}** (${i.type})`).join('\n')}` : ''}
194
+
195
+ ${domain.compliance?.length ? `### Compliance
196
+ ${domain.compliance.map(c => `- **${c.name}**: ${c.reason}`).join('\n')}` : ''}
197
+ ` : '';
198
+
199
+ return `---
200
+ antigravity:
201
+ trigger: 'on_demand'
202
+ description: 'Padrões e convenções específicos do projeto'
203
+ version: 3.1.0
204
+ ---
205
+
206
+ # 📚 Skills: Padrões do Projeto
207
+
208
+ > Referência rápida dos padrões arquiteturais detectados e como seguí-los.
209
+
210
+ ---
211
+
212
+ ## Convenções
213
+
214
+ - **Nomenclatura de arquivos:** ${fileConvention}
215
+ - **Stack:** ${stack?.languages.join(', ') || 'Não detectada'}
216
+ - **Frameworks:** ${frameworksLabel}
217
+
218
+ ---
219
+
220
+ ## Padrões Arquiteturais Detectados
221
+
222
+ ${patternsContent}
223
+ ${domainSection}
224
+ ---
225
+
226
+ ## Checklist para Novo Código
227
+
228
+ \`\`\`
229
+ □ Segue os padrões acima?
230
+ □ Testes escritos antes do código (TDD)?
231
+ □ Nomenclatura consistente com convenções?
232
+ □ Sem duplicação de lógica existente?
233
+ □ Documentação atualizada (JSDoc/docstring)?
234
+ \`\`\`
235
+ `;
236
+ }
237
+
238
+ /**
239
+ * Generates ARCHITECT-INTEGRATION.md skill with real project data
240
+ */
241
+ export function generateArchitectIntegrationSkill(ctx: TemplateContext | EnrichedTemplateContext): string {
242
+ const enriched = getEnriched(ctx);
243
+ const projectName = ctx.projectName;
244
+ const report = ctx.report;
245
+ const config = ctx.config;
246
+
247
+ return `---
248
+ antigravity:
249
+ trigger: 'on_demand'
250
+ description: 'Como usar o Architect para análise contínua de arquitetura'
251
+ version: 5.1.0
252
+ ---
253
+
254
+ # 🏗️ Skill: Architect Integration — ${projectName}
255
+
256
+ > Como usar \`@girardelli/architect\` para manter a qualidade arquitetural.
257
+
258
+ ---
259
+
260
+ ## Instalação
261
+
262
+ \`\`\`bash
263
+ npm install -g @girardelli/architect
264
+ \`\`\`
265
+
266
+ ---
267
+
268
+ ## Comandos Disponíveis
269
+
270
+ ### Análise completa
271
+ \`\`\`bash
272
+ # Gera HTML report + JSON + .agent/ framework
273
+ architect analyze .
274
+
275
+ # Output:
276
+ # → architect-report.html (visual)
277
+ # → architect-report.json (dados)
278
+ # → .agent/ (framework de agentes)
279
+ \`\`\`
280
+
281
+ ### Score rápido
282
+ \`\`\`bash
283
+ # Verificação rápida do score
284
+ architect score .
285
+
286
+ # JSON output (para CI)
287
+ architect score . --json
288
+ \`\`\`
289
+
290
+ ### Regenerar agentes
291
+ \`\`\`bash
292
+ # Regenera .agent/ com dados atualizados
293
+ architect agents .
294
+ \`\`\`
295
+
296
+ ---
297
+
298
+ ## Estado Atual — ${projectName}
299
+
300
+ | Métrica | Valor |
301
+ |---------|-------|
302
+ | **Score** | ${report.score.overall}/100 |
303
+ | **Meta** | ${config.scoreThreshold}/100 (mínimo) |
304
+ | **Score Modularity** | ${report.score.breakdown.modularity}/100 |
305
+ | **Score Coupling** | ${report.score.breakdown.coupling}/100 |
306
+ | **Score Cohesion** | ${report.score.breakdown.cohesion}/100 |
307
+ | **Score Layering** | ${report.score.breakdown.layering}/100 |
308
+ | **Anti-patterns** | ${report.antiPatterns.length} |
309
+ | **Arquivos** | ${report.projectInfo.totalFiles} |
310
+ | **Linhas** | ${report.projectInfo.totalLines.toLocaleString()} |
311
+
312
+ ---
313
+
314
+ ## Integração no Workflow
315
+
316
+ ### Antes de criar PR
317
+ \`\`\`bash
318
+ # Verificar que o score não regrediu
319
+ architect score .
320
+ # Se score < ${config.scoreThreshold} → NÃO criar PR
321
+ \`\`\`
322
+
323
+ ### Após refatoração
324
+ \`\`\`bash
325
+ # Verificar melhoria
326
+ architect analyze .
327
+ # Comparar com score anterior
328
+ \`\`\`
329
+
330
+ ### Revisão de arquitetura
331
+ \`\`\`bash
332
+ # Gerar report completo para code review
333
+ architect analyze . --output-dir docs/
334
+ \`\`\`
335
+
336
+ ---
337
+
338
+ ## Quality Gates
339
+
340
+ \`\`\`
341
+ Score mínimo para PR: ${config.scoreThreshold}/100
342
+ Cobertura mínima: ${config.coverageMinimum}%
343
+ Zero anti-patterns CRITICAL: Obrigatório
344
+ Regressão de score: Proibida
345
+ \`\`\`
346
+
347
+ ---
348
+
349
+ **Gerado por Architect v5.1 · Score: ${report.score.overall}/100**
350
+ `;
351
+ }
352
+
353
+ /**
354
+ * Generates CI-PIPELINE.md skill with real toolchain data
355
+ */
356
+ export function generateCIPipelineSkill(ctx: TemplateContext | EnrichedTemplateContext): string {
357
+ const enriched = getEnriched(ctx);
358
+ const projectName = ctx.projectName;
359
+ const tc = enriched.toolchain;
360
+ const config = ctx.config;
361
+ const report = ctx.report;
362
+
363
+ const buildCmd = tc?.buildCmd || 'npm run build';
364
+ const testCmd = tc?.testCmd || 'npm test';
365
+ const lintCmd = tc?.lintCmd || 'npx eslint .';
366
+ const coverageCmd = tc?.coverageCmd || 'npm run test -- --coverage';
367
+ const installCmd = tc?.installCmd || 'npm install';
368
+
369
+ return `---
370
+ antigravity:
371
+ trigger: 'on_demand'
372
+ description: 'Integração CI/CD com verificação de arquitetura'
373
+ version: 5.1.0
374
+ ---
375
+
376
+ # 🔄 Skill: CI Pipeline — ${projectName}
377
+
378
+ > Pipeline de integração contínua com gates de qualidade arquitetural.
379
+
380
+ ---
381
+
382
+ ## GitHub Actions
383
+
384
+ \`\`\`yaml
385
+ # .github/workflows/architect-ci.yml
386
+ name: Architecture CI
387
+
388
+ on:
389
+ pull_request:
390
+ branches: [main, develop, staging]
391
+
392
+ jobs:
393
+ quality:
394
+ runs-on: ubuntu-latest
395
+ steps:
396
+ - uses: actions/checkout@v4
397
+
398
+ - uses: actions/setup-node@v4
399
+ with:
400
+ node-version: '20'
401
+ cache: 'npm'
402
+
403
+ - name: Install dependencies
404
+ run: ${installCmd}
405
+
406
+ - name: Build
407
+ run: ${buildCmd}
408
+
409
+ - name: Lint
410
+ run: ${lintCmd}
411
+
412
+ - name: Test
413
+ run: ${testCmd}
414
+
415
+ - name: Coverage
416
+ run: ${coverageCmd}
417
+
418
+ - name: Architecture Score
419
+ run: |
420
+ npm install -g @girardelli/architect
421
+ SCORE=$(architect score . --json | jq '.overall')
422
+ echo "Architecture Score: $SCORE/100"
423
+ if [ "$SCORE" -lt ${config.scoreThreshold} ]; then
424
+ echo "::error::Score ($SCORE) below threshold (${config.scoreThreshold})"
425
+ exit 1
426
+ fi
427
+
428
+ - name: No Score Regression
429
+ run: |
430
+ # Compare with main branch score
431
+ CURRENT=$(architect score . --json | jq '.overall')
432
+ echo "Current: $CURRENT/100, Minimum: ${config.scoreThreshold}/100"
433
+ \`\`\`
434
+
435
+ ---
436
+
437
+ ## Comandos do Pipeline
438
+
439
+ | Step | Comando | Gate |
440
+ |------|---------|------|
441
+ | Install | \`${installCmd}\` | — |
442
+ | Build | \`${buildCmd}\` | ❌ Bloqueia se falhar |
443
+ | Lint | \`${lintCmd}\` | ❌ Bloqueia se falhar |
444
+ | Test | \`${testCmd}\` | ❌ Bloqueia se falhar |
445
+ | Coverage | \`${coverageCmd}\` | ⚠️ Mínimo ${config.coverageMinimum}% |
446
+ | Score | \`architect score .\` | ❌ Mínimo ${config.scoreThreshold}/100 |
447
+
448
+ ---
449
+
450
+ ## GitLab CI
451
+
452
+ \`\`\`yaml
453
+ # .gitlab-ci.yml
454
+ stages:
455
+ - build
456
+ - test
457
+ - quality
458
+
459
+ build:
460
+ stage: build
461
+ script:
462
+ - ${installCmd}
463
+ - ${buildCmd}
464
+
465
+ test:
466
+ stage: test
467
+ script:
468
+ - ${testCmd}
469
+ - ${coverageCmd}
470
+
471
+ architecture:
472
+ stage: quality
473
+ script:
474
+ - npm install -g @girardelli/architect
475
+ - architect score . --json
476
+ allow_failure: false
477
+ \`\`\`
478
+
479
+ ---
480
+
481
+ **Gerado por Architect v5.1 · Score: ${report.score.overall}/100**
482
+ `;
483
+ }
484
+
485
+ /**
486
+ * Generates MONOREPO-GUIDE.md skill with real workspace data.
487
+ * Only generated when projectStructure === 'monorepo'.
488
+ */
489
+ export function generateMonorepoGuideSkill(ctx: TemplateContext | EnrichedTemplateContext): string | null {
490
+ const enriched = getEnriched(ctx);
491
+ if (enriched.projectStructure !== 'monorepo') return null;
492
+
493
+ const projectName = ctx.projectName;
494
+ const modules = enriched.modules || [];
495
+ const tc = enriched.toolchain;
496
+
497
+ if (modules.length === 0) return null;
498
+
499
+ const moduleTable = modules.map(m =>
500
+ `| ${m.name} | \`${m.path}\` | ${m.fileCount} | ${m.lineCount > 0 ? m.lineCount.toLocaleString() : '—'} | ${m.hasTests ? '✅' : '❌'} | ${m.layer} |`
501
+ ).join('\n');
502
+
503
+ return `---
504
+ antigravity:
505
+ trigger: 'on_demand'
506
+ description: 'Guia de navegação e desenvolvimento no monorepo'
507
+ version: 5.1.0
508
+ ---
509
+
510
+ # 📦 Skill: Monorepo Guide — ${projectName}
511
+
512
+ > Estrutura, convenções e fluxos de trabalho do monorepo.
513
+
514
+ ---
515
+
516
+ ## Workspace Map
517
+
518
+ | Package | Path | Arquivos | Linhas | Testes | Camada |
519
+ |---------|------|----------|--------|--------|--------|
520
+ ${moduleTable}
521
+
522
+ ---
523
+
524
+ ## Regras do Monorepo
525
+
526
+ ### Dependency Direction
527
+ \`\`\`
528
+ ╔════════════════════════════════════════════╗
529
+ ║ types → events → core → bridge → mcp ║
530
+ ║ ║
531
+ ║ Dependências SEMPRE de baixo para cima. ║
532
+ ║ NUNCA criar referência circular. ║
533
+ ╚════════════════════════════════════════════╝
534
+ \`\`\`
535
+
536
+ ### Boas Práticas
537
+
538
+ 1. **Cada package tem seu package.json** — versão independente
539
+ 2. **Types compartilhados** ficam no package \`types\`
540
+ 3. **Nunca importar de outro package via path relativo** — usar \`@scope/package\`
541
+ 4. **Testes rodam por package** — \`npm test --workspace=packages/<nome>\`
542
+ 5. **Build ordem** — respeitar dependências (types primeiro)
543
+
544
+ ### Comandos por Workspace
545
+
546
+ \`\`\`bash
547
+ # Rodar testes de um package específico
548
+ npm test --workspace=packages/<nome>
549
+
550
+ # Build de um package específico
551
+ npm run build --workspace=packages/<nome>
552
+
553
+ # Instalar deps de todos os workspaces
554
+ ${tc?.installCmd || 'npm install'}
555
+
556
+ # Build de todos
557
+ ${tc?.buildCmd || 'npm run build'}
558
+
559
+ # Testes de todos
560
+ ${tc?.testCmd || 'npm test'}
561
+ \`\`\`
562
+
563
+ ---
564
+
565
+ ## Quando Criar um Novo Package
566
+
567
+ 1. **Justificativa:** O código é reutilizável por 2+ packages?
568
+ 2. **Escopo:** O package tem responsabilidade única?
569
+ 3. **Testes:** O package pode ser testado isoladamente?
570
+ 4. **Deps:** As dependências são explícitas no package.json?
571
+
572
+ ### Template
573
+
574
+ \`\`\`bash
575
+ mkdir packages/<nome>
576
+ cd packages/<nome>
577
+ npm init -y
578
+ # Configurar tsconfig.json, jest.config, etc.
579
+ \`\`\`
580
+
581
+ ---
582
+
583
+ **Gerado por Architect v5.1 · ${modules.length} packages detectados**
584
+ `;
585
+ }