@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,726 @@
1
+ /**
2
+ * Template Helpers v3.1 — Utilitários compartilhados por todos os templates.
3
+ *
4
+ * v3.1: Adicionados helpers framework-aware:
5
+ * - frameworkBadge(): exibe framework com versão
6
+ * - toolchainCommands(): exibe comandos detectados
7
+ * - frameworkModuleStructure(): exibe estrutura de projeto real por framework
8
+ * - frameworkSecurityChecklist(): checklist de segurança por framework
9
+ * - projectStructureBadge(): exibe padrão arquitetural detectado
10
+ */
11
+ /** Safely extract enriched context fields, returning defaults if not available */
12
+ export function getEnriched(ctx) {
13
+ if ('domain' in ctx)
14
+ return ctx;
15
+ return {};
16
+ }
17
+ /** Check if context is enriched */
18
+ export function isEnriched(ctx) {
19
+ return 'domain' in ctx;
20
+ }
21
+ /**
22
+ * Depth-based content scaling.
23
+ */
24
+ export function depthScale(ctx, options) {
25
+ const enriched = getEnriched(ctx);
26
+ const depth = (enriched.projectDepth || 'medium');
27
+ return options[depth];
28
+ }
29
+ /**
30
+ * Returns true if the current project depth >= the minimum required depth.
31
+ */
32
+ export function depthAtLeast(ctx, minDepth) {
33
+ const enriched = getEnriched(ctx);
34
+ const depth = enriched.projectDepth || 'medium';
35
+ const order = ['small', 'medium', 'large', 'enterprise'];
36
+ return order.indexOf(depth) >= order.indexOf(minDepth);
37
+ }
38
+ /**
39
+ * Generate cross-reference block to related agents.
40
+ */
41
+ export function crossRef(agentId, ctx) {
42
+ const { stack } = ctx;
43
+ const agentRelations = {
44
+ 'backend': [
45
+ { id: 'database-engineer', name: 'Database Engineer', when: 'Criar/alterar entities, migrations, queries' },
46
+ { id: 'security-auditor', name: 'Security Auditor', when: 'Novo endpoint, auth flow, dados sensíveis' },
47
+ { id: 'qa-test', name: 'QA Test Engineer', when: 'Após implementação — plano de testes' },
48
+ { id: 'tech-debt', name: 'Tech Debt Controller', when: 'Antes de criar novo módulo — verificar débito' },
49
+ ],
50
+ 'frontend': [
51
+ { id: 'backend', name: 'Backend Developer', when: 'Antes de integrar — doc de integração obrigatória' },
52
+ { id: 'qa-test', name: 'QA Test Engineer', when: 'Após implementação — testes e2e' },
53
+ { id: 'security-auditor', name: 'Security Auditor', when: 'Forms, auth UI, dados sensíveis' },
54
+ ],
55
+ 'flutter': [
56
+ { id: 'backend', name: 'Backend Developer', when: 'Antes de integrar — doc de integração obrigatória' },
57
+ { id: 'qa-test', name: 'QA Test Engineer', when: 'Após implementação — testes de widget e integração' },
58
+ { id: 'security-auditor', name: 'Security Auditor', when: 'Armazenamento local, biometria, deep links' },
59
+ ],
60
+ 'database-engineer': [
61
+ { id: 'backend', name: 'Backend Developer', when: 'Após migration — atualizar entities e queries' },
62
+ { id: 'security-auditor', name: 'Security Auditor', when: 'Dados sensíveis, PII, encryption at rest' },
63
+ { id: 'tech-debt', name: 'Tech Debt Controller', when: 'Schema com N+1, índices faltantes' },
64
+ ],
65
+ 'security-auditor': [
66
+ { id: 'backend', name: 'Backend Developer', when: 'Falha de segurança em endpoint/service' },
67
+ { id: 'database-engineer', name: 'Database Engineer', when: 'Encryption at rest, data masking' },
68
+ { id: 'qa-test', name: 'QA Test Engineer', when: 'Testes de segurança (fuzzing, pentest)' },
69
+ ],
70
+ 'qa-test': [
71
+ { id: 'backend', name: 'Backend Developer', when: 'Cobertura insuficiente em services' },
72
+ { id: 'frontend', name: 'Frontend Developer', when: 'Testes e2e falhando, componentes sem testes' },
73
+ { id: 'tech-debt', name: 'Tech Debt Controller', when: 'Testes com .skip(), mocks frágeis' },
74
+ ],
75
+ 'tech-debt': [
76
+ { id: 'backend', name: 'Backend Developer', when: 'Refatoração de módulo, god class' },
77
+ { id: 'database-engineer', name: 'Database Engineer', when: 'N+1 queries, índices, schema refactoring' },
78
+ { id: 'security-auditor', name: 'Security Auditor', when: 'Débito de segurança (dependencies, configs)' },
79
+ ],
80
+ 'code-review': [
81
+ { id: 'security-auditor', name: 'Security Auditor', when: 'Review de endpoints, auth, dados sensíveis' },
82
+ { id: 'qa-test', name: 'QA Test Engineer', when: 'Verificar cobertura e qualidade dos testes' },
83
+ { id: 'tech-debt', name: 'Tech Debt Controller', when: 'Avaliar impacto em débito técnico' },
84
+ ],
85
+ 'orchestrator': [
86
+ { id: 'backend', name: 'Backend Developer', when: 'Features que tocam backend' },
87
+ { id: 'frontend', name: 'Frontend Developer', when: 'Features que tocam frontend' },
88
+ { id: 'flutter', name: 'Flutter UI Developer', when: 'Features que tocam app mobile' },
89
+ { id: 'database-engineer', name: 'Database Engineer', when: 'Features que tocam banco de dados' },
90
+ { id: 'security-auditor', name: 'Security Auditor', when: 'TODA feature — revisão obrigatória' },
91
+ { id: 'qa-test', name: 'QA Test Engineer', when: 'TODA feature — plano de testes obrigatório' },
92
+ { id: 'tech-debt', name: 'Tech Debt Controller', when: 'Antes de nova feature — checar débito' },
93
+ ],
94
+ };
95
+ const relations = agentRelations[agentId] || [];
96
+ const filtered = relations.filter(r => {
97
+ if (r.id === 'frontend' && !stack.hasFrontend)
98
+ return false;
99
+ if (r.id === 'flutter' && !stack.hasMobile)
100
+ return false;
101
+ if (r.id === 'database-engineer' && !stack.hasDatabase)
102
+ return false;
103
+ return true;
104
+ });
105
+ if (filtered.length === 0)
106
+ return '';
107
+ return `
108
+ ## 🔗 Cross-References (Agentes Relacionados)
109
+
110
+ | Agente | Quando Consultar |
111
+ |--------|-----------------|
112
+ ${filtered.map(r => `| **${r.name}** | ${r.when} |`).join('\n')}
113
+
114
+ > **Regra:** Nunca implementar isoladamente. Sempre verificar se o agente relacionado precisa ser consultado.
115
+ `;
116
+ }
117
+ /**
118
+ * Generate domain badge for agent headers.
119
+ */
120
+ export function domainBadge(ctx) {
121
+ const enriched = getEnriched(ctx);
122
+ if (!enriched.domain)
123
+ return '';
124
+ const { domain } = enriched;
125
+ return `
126
+ > 📌 **Domínio:** ${domain.domain} · **Sub-domínio:** ${domain.subDomain} · **Confiança:** ${Math.round(domain.confidence * 100)}%
127
+ `;
128
+ }
129
+ /**
130
+ * Generate compliance badges.
131
+ */
132
+ export function complianceBadges(ctx) {
133
+ const enriched = getEnriched(ctx);
134
+ if (!enriched.domain?.compliance?.length)
135
+ return '';
136
+ return `
137
+ ### ⚖️ Compliance Obrigatório
138
+
139
+ ${enriched.domain.compliance.map((c) => `- **${c.name}** — ${c.reason}
140
+ - Checks: ${c.mandatoryChecks.join(', ')}`).join('\n')}
141
+ `;
142
+ }
143
+ /**
144
+ * Generate project depth indicator for headers.
145
+ */
146
+ export function depthIndicator(ctx) {
147
+ const enriched = getEnriched(ctx);
148
+ const depth = enriched.projectDepth || 'medium';
149
+ const labels = {
150
+ small: '🟢 Projeto Pequeno (< 50 arquivos)',
151
+ medium: '🟡 Projeto Médio (50-200 arquivos)',
152
+ large: '🟠 Projeto Grande (200-500 arquivos)',
153
+ enterprise: '🔴 Enterprise (500+ arquivos)',
154
+ };
155
+ return labels[depth];
156
+ }
157
+ /**
158
+ * Build a summary table of modules for context sections.
159
+ */
160
+ export function modulesSummaryTable(ctx) {
161
+ const enriched = getEnriched(ctx);
162
+ if (!enriched.modules?.length)
163
+ return '';
164
+ const maxModules = depthScale(ctx, { small: 5, medium: 10, large: 20, enterprise: 50 });
165
+ const modules = enriched.modules.slice(0, maxModules);
166
+ return `
167
+ | Módulo | Arquivos | Linhas | Testes | Camada |
168
+ |--------|----------|--------|--------|--------|
169
+ ${modules.map((m) => `| ${m.name} | ${m.fileCount} | ${m.lineCount > 0 ? m.lineCount.toLocaleString() : '—'} | ${m.hasTests ? '✅' : '❌'} | ${m.layer} |`).join('\n')}
170
+ ${enriched.modules.length > maxModules ? `\n> ... e mais ${enriched.modules.length - maxModules} módulos.` : ''}
171
+ `;
172
+ }
173
+ /**
174
+ * Build integrations summary.
175
+ */
176
+ export function integrationsSummary(ctx) {
177
+ const enriched = getEnriched(ctx);
178
+ if (!enriched.domain?.integrations?.length)
179
+ return '';
180
+ return `
181
+ ### Integrações Externas Detectadas
182
+
183
+ ${enriched.domain.integrations.map((i) => `- **${i.name}** (${i.type}) — detectado em \`${i.detectedFrom}\``).join('\n')}
184
+ `;
185
+ }
186
+ // ═══════════════════════════════════════════════════════════════════════
187
+ // v3.1: FRAMEWORK-AWARE HELPERS
188
+ // ═══════════════════════════════════════════════════════════════════════
189
+ /**
190
+ * v3.1: Generate framework badge with version.
191
+ * Example: "🚀 **Framework:** FastAPI 0.104.1 · SQLAlchemy 2.0 · pytest"
192
+ */
193
+ export function frameworkBadge(ctx) {
194
+ const enriched = getEnriched(ctx);
195
+ if (!enriched.detectedFrameworks?.length)
196
+ return '';
197
+ const fws = enriched.detectedFrameworks
198
+ .filter((f) => f.category === 'web' || f.category === 'orm')
199
+ .map((f) => `**${f.name}**${f.version ? ` ${f.version}` : ''}`);
200
+ const testFws = enriched.detectedFrameworks
201
+ .filter((f) => f.category === 'test')
202
+ .map((f) => f.name);
203
+ const lintFws = enriched.detectedFrameworks
204
+ .filter((f) => f.category === 'lint')
205
+ .map((f) => f.name);
206
+ const parts = [];
207
+ if (fws.length)
208
+ parts.push(fws.join(' + '));
209
+ if (testFws.length)
210
+ parts.push(`Testes: ${testFws.join(', ')}`);
211
+ if (lintFws.length)
212
+ parts.push(`Lint: ${lintFws.join(', ')}`);
213
+ return `> 🚀 **Stack Detectada:** ${parts.join(' · ')}`;
214
+ }
215
+ /**
216
+ * v3.1: Generate project structure badge.
217
+ */
218
+ export function projectStructureBadge(ctx) {
219
+ const enriched = getEnriched(ctx);
220
+ const structure = enriched.projectStructure || 'unknown';
221
+ const labels = {
222
+ 'clean-architecture': '🏛️ Clean Architecture / DDD',
223
+ 'mvc': '📐 MVC (Model-View-Controller)',
224
+ 'modular': '📦 Modular (Feature-based)',
225
+ 'flat': '📄 Flat Structure',
226
+ 'monorepo': '🏗️ Monorepo',
227
+ 'unknown': '❓ Estrutura não identificada',
228
+ };
229
+ return labels[structure] || labels['unknown'];
230
+ }
231
+ /**
232
+ * v3.1: Generate toolchain commands block.
233
+ */
234
+ export function toolchainCommands(ctx) {
235
+ const enriched = getEnriched(ctx);
236
+ if (!enriched.toolchain)
237
+ return '';
238
+ const tc = enriched.toolchain;
239
+ return `
240
+ ## 🔧 Toolchain Detectado
241
+
242
+ \`\`\`bash
243
+ # Build
244
+ ${tc.buildCmd}
245
+
246
+ # Testes
247
+ ${tc.testCmd}
248
+
249
+ # Lint
250
+ ${tc.lintCmd}
251
+
252
+ # Coverage
253
+ ${tc.coverageCmd}
254
+
255
+ # Dev Server
256
+ ${tc.runCmd}
257
+
258
+ # Instalar dependências
259
+ ${tc.installCmd}
260
+ ${tc.migrateCmd ? `\n# Migrations\n${tc.migrateCmd}` : ''}
261
+ \`\`\`
262
+
263
+ > **Deps file:** \`${tc.depsFile}\`
264
+ `;
265
+ }
266
+ /**
267
+ * v3.1: Generate framework-specific module structure.
268
+ * Shows the REAL expected project structure based on detected framework.
269
+ */
270
+ export function frameworkModuleStructure(ctx) {
271
+ const enriched = getEnriched(ctx);
272
+ const fw = enriched.primaryFramework?.name || '';
273
+ const structure = enriched.projectStructure || 'unknown';
274
+ const lang = ctx.stack.primary;
275
+ // Clean Architecture (Python, any framework)
276
+ if (structure === 'clean-architecture') {
277
+ if (lang === 'Python') {
278
+ return `
279
+ \`\`\`
280
+ src/[projeto]/
281
+ ├── domain/ → Regras de negócio puras
282
+ │ ├── entities/ → Entidades com identidade
283
+ │ ├── value_objects/ → Objetos de valor (imutáveis)
284
+ │ ├── services/ → Serviços de domínio
285
+ │ ├── events/ → Eventos de domínio
286
+ │ ├── enums/ → Enumerações
287
+ │ └── exceptions/ → Exceções customizadas
288
+ ├── application/ → Casos de uso
289
+ │ ├── services/ → Application services
290
+ │ └── interfaces/ → Contratos (ports)
291
+ ├── infrastructure/ → Implementações externas
292
+ │ ├── persistence/ → Repositórios concretos
293
+ │ ├── storage/ → MinIO, S3, filesystem
294
+ │ ├── extraction/ → Extração de dados
295
+ │ │ ├── extractors/ → Extractors por tipo
296
+ │ │ ├── ocr/ → OCR engine
297
+ │ │ └── guards/ → Validadores
298
+ │ └── agents/ → Agentes de automação
299
+ ├── presentation/ → Interface com o mundo
300
+ │ ├── api/ → REST API
301
+ │ │ ├── routes/ → Endpoints${fw === 'FastAPI' ? ' (FastAPI routers)' : ''}
302
+ │ │ └── dependencies/ → ${fw === 'FastAPI' ? 'FastAPI Depends()' : 'Injeção de deps'}
303
+ │ └── workers/ → Background workers
304
+ └── tests/
305
+ ├── unit/ → Testes unitários
306
+ ├── integration/ → Testes de integração
307
+ └── fixtures/ → Dados de teste
308
+ \`\`\``;
309
+ }
310
+ // TypeScript Clean Architecture
311
+ return `
312
+ \`\`\`
313
+ src/
314
+ ├── domain/ → Regras de negócio puras
315
+ │ ├── entities/ → Entidades com identidade
316
+ │ ├── value-objects/ → Objetos de valor
317
+ │ ├── services/ → Serviços de domínio
318
+ │ └── events/ → Eventos de domínio
319
+ ├── application/ → Casos de uso
320
+ │ ├── use-cases/ → Casos de uso
321
+ │ └── ports/ → Interfaces (contratos)
322
+ ├── infrastructure/ → Implementações externas
323
+ │ ├── repositories/ → Repositórios concretos
324
+ │ ├── adapters/ → Adaptadores externos
325
+ │ └── config/ → Configuração
326
+ ├── presentation/ → Interface com o mundo
327
+ │ ├── controllers/ → Endpoints da API
328
+ │ ├── dto/ → Data Transfer Objects
329
+ │ └── middleware/ → Middleware
330
+ └── tests/
331
+ \`\`\``;
332
+ }
333
+ // FastAPI (non-clean-arch)
334
+ if (fw === 'FastAPI') {
335
+ return `
336
+ \`\`\`
337
+ app/
338
+ ├── main.py → Entrypoint (FastAPI app)
339
+ ├── api/
340
+ │ ├── routes/ → APIRouter por recurso
341
+ │ │ ├── __init__.py
342
+ │ │ ├── users.py → @router.get("/users")
343
+ │ │ └── items.py → @router.get("/items")
344
+ │ └── dependencies.py → Depends() compartilhados
345
+ ├── core/
346
+ │ ├── config.py → Settings (pydantic BaseSettings)
347
+ │ └── security.py → JWT, OAuth2
348
+ ├── models/ → SQLAlchemy / Pydantic models
349
+ ├── schemas/ → Pydantic schemas (request/response)
350
+ ├── services/ → Lógica de negócio
351
+ ├── db/ → Database session, migrations
352
+ └── tests/
353
+ ├── conftest.py → Fixtures (TestClient, db session)
354
+ ├── test_users.py
355
+ └── test_items.py
356
+ \`\`\``;
357
+ }
358
+ // Django
359
+ if (fw === 'Django' || fw === 'DRF') {
360
+ return `
361
+ \`\`\`
362
+ project/
363
+ ├── manage.py
364
+ ├── config/ → Settings, URLs, WSGI
365
+ │ ├── settings/
366
+ │ │ ├── base.py
367
+ │ │ ├── local.py
368
+ │ │ └── production.py
369
+ │ └── urls.py → Root URL config
370
+ ├── apps/
371
+ │ └── [app_name]/ → Django app
372
+ │ ├── models.py → Django ORM models
373
+ │ ├── views.py → ViewSets / APIViews
374
+ │ ├── serializers.py → DRF serializers
375
+ │ ├── urls.py → App URLs
376
+ │ ├── admin.py → Django admin
377
+ │ ├── forms.py → Forms
378
+ │ ├── signals.py → Django signals
379
+ │ └── tests/
380
+ │ ├── test_models.py
381
+ │ └── test_views.py
382
+ └── requirements/
383
+ \`\`\``;
384
+ }
385
+ // Flask
386
+ if (fw === 'Flask') {
387
+ return `
388
+ \`\`\`
389
+ app/
390
+ ├── __init__.py → create_app() factory
391
+ ├── blueprints/ → Flask Blueprints
392
+ │ ├── auth/
393
+ │ │ ├── __init__.py → Blueprint registration
394
+ │ │ ├── routes.py → @bp.route()
395
+ │ │ └── models.py
396
+ │ └── api/
397
+ ├── models/ → SQLAlchemy models
398
+ ├── services/ → Lógica de negócio
399
+ ├── extensions.py → db, migrate, login_manager
400
+ ├── config.py → Configuração
401
+ └── tests/
402
+ \`\`\``;
403
+ }
404
+ // NestJS
405
+ if (fw === 'NestJS') {
406
+ return `
407
+ \`\`\`
408
+ src/
409
+ ├── main.ts → Bootstrap (NestFactory)
410
+ ├── app.module.ts → Root module
411
+ ├── modules/
412
+ │ └── [module-name]/
413
+ │ ├── [name].module.ts → @Module()
414
+ │ ├── [name].controller.ts → @Controller() endpoints
415
+ │ ├── [name].service.ts → @Injectable() lógica
416
+ │ ├── dto/
417
+ │ │ ├── create-[name].dto.ts → class-validator DTOs
418
+ │ │ └── update-[name].dto.ts
419
+ │ ├── entities/
420
+ │ │ └── [name].entity.ts → TypeORM/Prisma entity
421
+ │ └── __tests__/
422
+ │ ├── [name].service.spec.ts
423
+ │ └── [name].controller.spec.ts
424
+ ├── common/ → Guards, pipes, interceptors
425
+ └── config/ → ConfigModule
426
+ \`\`\``;
427
+ }
428
+ // Express
429
+ if (fw === 'Express' || fw === 'Fastify') {
430
+ return `
431
+ \`\`\`
432
+ src/
433
+ ├── index.ts → Entrypoint
434
+ ├── routes/ → Route handlers
435
+ │ ├── users.router.ts
436
+ │ └── items.router.ts
437
+ ├── controllers/ → Request handlers
438
+ ├── services/ → Business logic
439
+ ├── models/ → Data models
440
+ ├── middleware/ → Auth, validation, error handler
441
+ ├── config/ → Environment config
442
+ └── tests/
443
+ \`\`\``;
444
+ }
445
+ // Spring Boot
446
+ if (fw === 'Spring Boot') {
447
+ return `
448
+ \`\`\`
449
+ src/main/java/com/company/project/
450
+ ├── Application.java → @SpringBootApplication
451
+ ├── controller/ → @RestController
452
+ │ └── UserController.java
453
+ ├── service/ → @Service
454
+ │ └── UserService.java
455
+ ├── repository/ → @Repository (Spring Data JPA)
456
+ │ └── UserRepository.java
457
+ ├── model/ → @Entity
458
+ │ └── User.java
459
+ ├── dto/ → Request/Response DTOs
460
+ ├── config/ → @Configuration
461
+ ├── exception/ → @ControllerAdvice
462
+ └── security/ → Spring Security config
463
+ \`\`\``;
464
+ }
465
+ // Laravel
466
+ if (fw === 'Laravel') {
467
+ return `
468
+ \`\`\`
469
+ app/
470
+ ├── Http/
471
+ │ ├── Controllers/ → Controllers
472
+ │ ├── Middleware/ → Middleware
473
+ │ └── Requests/ → Form Requests (validation)
474
+ ├── Models/ → Eloquent Models
475
+ ├── Services/ → Business Logic
476
+ ├── Repositories/ → Data Access
477
+ ├── Providers/ → Service Providers
478
+ ├── Events/ → Event classes
479
+ ├── Listeners/ → Event listeners
480
+ ├── Policies/ → Authorization policies
481
+ database/
482
+ ├── migrations/ → Database migrations
483
+ ├── seeders/ → Database seeders
484
+ └── factories/ → Model factories
485
+ \`\`\``;
486
+ }
487
+ // Go
488
+ if (fw === 'Gin' || fw === 'Echo' || fw === 'Fiber' || fw === 'Chi') {
489
+ return `
490
+ \`\`\`
491
+ .
492
+ ├── cmd/
493
+ │ └── server/
494
+ │ └── main.go → Entrypoint
495
+ ├── internal/
496
+ │ ├── handler/ → HTTP handlers
497
+ │ ├── service/ → Business logic
498
+ │ ├── repository/ → Data access
499
+ │ ├── model/ → Domain models
500
+ │ ├── middleware/ → HTTP middleware
501
+ │ └── config/ → Configuration
502
+ ├── pkg/ → Public packages
503
+ ├── go.mod
504
+ └── go.sum
505
+ \`\`\``;
506
+ }
507
+ // Ruby on Rails
508
+ if (fw === 'Ruby on Rails') {
509
+ return `
510
+ \`\`\`
511
+ app/
512
+ ├── controllers/ → ActionController
513
+ ├── models/ → ActiveRecord models
514
+ ├── views/ → ERB/HAML templates
515
+ ├── services/ → Service objects
516
+ ├── jobs/ → ActiveJob
517
+ ├── mailers/ → ActionMailer
518
+ ├── serializers/ → JSON serializers
519
+ config/
520
+ ├── routes.rb → Route definitions
521
+ ├── database.yml → Database config
522
+ db/
523
+ ├── migrate/ → Migrations
524
+ ├── seeds.rb → Seed data
525
+ spec/ (ou test/)
526
+ \`\`\``;
527
+ }
528
+ // Generic fallback
529
+ const ext = lang === 'Python' ? 'py' : lang === 'Go' ? 'go' : lang === 'PHP' ? 'php' : lang === 'Ruby' ? 'rb' : 'ts';
530
+ return `
531
+ \`\`\`
532
+ src/
533
+ ├── controllers/ → Endpoints / HTTP handlers
534
+ ├── services/ → Lógica de negócio
535
+ ├── models/ → Modelos de dados
536
+ ├── repositories/ → Acesso a dados
537
+ ├── dto/ → Data Transfer Objects
538
+ ├── middleware/ → Middleware
539
+ ├── config/ → Configuração
540
+ └── tests/ → Testes (.${ext})
541
+ \`\`\``;
542
+ }
543
+ /**
544
+ * v3.1: Generate framework-specific security checklist.
545
+ */
546
+ export function frameworkSecurityChecklist(ctx) {
547
+ const enriched = getEnriched(ctx);
548
+ const fw = enriched.primaryFramework?.name || '';
549
+ const lang = ctx.stack.primary;
550
+ if (fw === 'FastAPI') {
551
+ return `
552
+ ## Checklist Segurança — FastAPI
553
+
554
+ \`\`\`
555
+ □ Pydantic models para validação de TODOS os inputs
556
+ □ OAuth2PasswordBearer / OAuth2AuthorizationCodeBearer configurado
557
+ □ Depends() para injeção segura de autenticação
558
+ □ CORS via CORSMiddleware com origins whitelist (não usar "*")
559
+ □ Rate limiting via slowapi ou middleware customizado
560
+ □ Security headers via middleware (X-Content-Type-Options, etc.)
561
+ □ Senhas hasheadas com passlib (bcrypt/argon2)
562
+ □ JWT tokens com expiração curta + refresh token
563
+ □ HTTPS obrigatório em produção (redirect HTTP → HTTPS)
564
+ □ Logs estruturados SEM dados sensíveis (loguru/structlog)
565
+ □ SQLAlchemy com queries parametrizadas (nunca string concat)
566
+ □ Background tasks validadas contra injection
567
+ □ File uploads com validação de tipo e tamanho
568
+ □ Dependency scanning: pip-audit / safety
569
+ \`\`\``;
570
+ }
571
+ if (fw === 'Django' || fw === 'DRF') {
572
+ return `
573
+ ## Checklist Segurança — Django
574
+
575
+ \`\`\`
576
+ □ CSRF protection habilitado (CsrfViewMiddleware)
577
+ □ XSS protection via auto-escaping nos templates
578
+ □ SQL Injection prevenido via ORM (nunca raw SQL sem parametrize)
579
+ □ Clickjacking protection (X-Frame-Options)
580
+ □ SECURE_SSL_REDIRECT = True em produção
581
+ □ SESSION_COOKIE_SECURE = True
582
+ □ CSRF_COOKIE_SECURE = True
583
+ □ ALLOWED_HOSTS configurado corretamente
584
+ □ DEBUG = False em produção
585
+ □ SECRET_KEY rotacionado e não commitado
586
+ □ django-rest-framework permissions e throttling
587
+ □ django-cors-headers com whitelist
588
+ □ Senhas hasheadas com PBKDF2/Argon2 (PASSWORD_HASHERS)
589
+ □ Dependency scanning: pip-audit / safety
590
+ \`\`\``;
591
+ }
592
+ if (fw === 'Flask') {
593
+ return `
594
+ ## Checklist Segurança — Flask
595
+
596
+ \`\`\`
597
+ □ Flask-Talisman para security headers
598
+ □ Flask-CORS com origins whitelist
599
+ □ Flask-Limiter para rate limiting
600
+ □ Flask-Login / Flask-JWT-Extended para auth
601
+ □ CSRF via Flask-WTF
602
+ □ SECRET_KEY seguro e rotacionado
603
+ □ Session cookie seguro (httponly, secure, samesite)
604
+ □ SQLAlchemy com queries parametrizadas
605
+ □ Jinja2 auto-escaping habilitado
606
+ □ File uploads validados (tipo, tamanho, path traversal)
607
+ □ Dependency scanning: pip-audit / safety
608
+ \`\`\``;
609
+ }
610
+ if (fw === 'NestJS') {
611
+ return `
612
+ ## Checklist Segurança — NestJS
613
+
614
+ \`\`\`
615
+ □ Helmet habilitado (app.use(helmet()))
616
+ □ CORS com origins whitelist
617
+ □ Rate limiting via @nestjs/throttler
618
+ □ class-validator em TODOS os DTOs
619
+ □ Guards para autenticação/autorização
620
+ □ JWT via @nestjs/jwt com expiração curta
621
+ □ CSRF protection (se serve HTML)
622
+ □ TypeORM/Prisma com queries parametrizadas
623
+ □ Pipes de validação globais (ValidationPipe)
624
+ □ Exception filters customizados (sem stack traces em prod)
625
+ □ npm audit sem vulnerabilidades críticas
626
+ □ strict: true em tsconfig.json
627
+ \`\`\``;
628
+ }
629
+ if (fw === 'Express' || fw === 'Fastify') {
630
+ return `
631
+ ## Checklist Segurança — ${fw}
632
+
633
+ \`\`\`
634
+ □ Helmet.js habilitado
635
+ □ CORS configurado restritivamente
636
+ □ Rate limiting (express-rate-limit)
637
+ □ Input validation (joi / zod / express-validator)
638
+ □ JWT com expiração + refresh
639
+ □ CSRF protection (csurf)
640
+ □ Queries parametrizadas (nunca string interpolation)
641
+ □ Error handler que não vaza stack traces
642
+ □ npm audit sem vulnerabilidades críticas
643
+ □ HTTPS obrigatório
644
+ \`\`\``;
645
+ }
646
+ if (fw === 'Spring Boot') {
647
+ return `
648
+ ## Checklist Segurança — Spring Boot
649
+
650
+ \`\`\`
651
+ □ Spring Security configurado
652
+ □ CSRF habilitado para endpoints com estado
653
+ □ CORS via WebMvcConfigurer com whitelist
654
+ □ @Valid / @Validated em DTOs
655
+ □ BCrypt para senhas (PasswordEncoder)
656
+ □ JPA parametrizado (nunca JPQL com concat)
657
+ □ Actuator endpoints protegidos em produção
658
+ □ OAuth2/JWT via Spring Security OAuth
659
+ □ Content-Security-Policy configurado
660
+ □ Dependências: OWASP Dependency-Check
661
+ \`\`\``;
662
+ }
663
+ if (fw === 'Laravel') {
664
+ return `
665
+ ## Checklist Segurança — Laravel
666
+
667
+ \`\`\`
668
+ □ CSRF token em todos os forms (@csrf)
669
+ □ Eloquent parametrizado (nunca DB::raw sem bind)
670
+ □ Form Requests para validação
671
+ □ Sanctum/Passport para API auth
672
+ □ Gate/Policy para autorização
673
+ □ Encryption via Crypt facade
674
+ □ Rate limiting via RateLimiter
675
+ □ APP_DEBUG=false em produção
676
+ □ CORS via config/cors.php com whitelist
677
+ □ Composer audit sem vulnerabilidades
678
+ \`\`\``;
679
+ }
680
+ // Fallback by language
681
+ if (lang === 'Python') {
682
+ return `
683
+ ## Checklist Segurança — Python
684
+
685
+ \`\`\`
686
+ □ Inputs validados (pydantic / marshmallow / WTForms)
687
+ □ Queries parametrizadas (SQLAlchemy / Django ORM)
688
+ □ CORS configurado com whitelist
689
+ □ Rate limiting implementado
690
+ □ Security headers configurados
691
+ □ Senhas hasheadas com bcrypt/argon2
692
+ □ Sem pickle para dados untrusted
693
+ □ HTTPS obrigatório em produção
694
+ □ pip-audit / safety para vulnerabilidades
695
+ □ Logging sem dados sensíveis
696
+ \`\`\``;
697
+ }
698
+ if (lang === 'Go') {
699
+ return `
700
+ ## Checklist Segurança — Go
701
+
702
+ \`\`\`
703
+ □ Inputs validados via validator package
704
+ □ Prepared statements para SQL
705
+ □ TLS/mTLS para comunicação inter-serviços
706
+ □ CORS headers explícitos
707
+ □ Rate limiting implementado
708
+ □ Logging de ações críticas (sem PII)
709
+ □ go vet / staticcheck no CI
710
+ □ govulncheck para vulnerabilidades
711
+ \`\`\``;
712
+ }
713
+ return `
714
+ ## Checklist Segurança — ${lang}
715
+
716
+ \`\`\`
717
+ □ Inputs sanitizados e validados
718
+ □ Queries parametrizadas obrigatoriamente
719
+ □ CSRF tokens em formulários
720
+ □ Rate limiting em APIs
721
+ □ Secrets em variáveis de ambiente
722
+ □ HTTPS obrigatório em produção
723
+ □ Dependency scanning no CI
724
+ \`\`\``;
725
+ }
726
+ //# sourceMappingURL=template-helpers.js.map