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