@girardelli/architect-agents 8.1.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 (258) hide show
  1. package/dist/src/core/agent-generator/context-enricher.d.ts +17 -0
  2. package/dist/src/core/agent-generator/context-enricher.js +51 -0
  3. package/dist/src/core/agent-generator/context-enricher.js.map +1 -0
  4. package/dist/src/core/agent-generator/detectors/base-detector.d.ts +8 -0
  5. package/dist/src/core/agent-generator/detectors/base-detector.js +12 -0
  6. package/dist/src/core/agent-generator/detectors/base-detector.js.map +1 -0
  7. package/dist/src/core/agent-generator/detectors/dart-detector.d.ts +5 -0
  8. package/dist/src/core/agent-generator/detectors/dart-detector.js +16 -0
  9. package/dist/src/core/agent-generator/detectors/dart-detector.js.map +1 -0
  10. package/dist/src/core/agent-generator/detectors/framework-registry.d.ts +5 -0
  11. package/dist/src/core/agent-generator/detectors/framework-registry.js +81 -0
  12. package/dist/src/core/agent-generator/detectors/framework-registry.js.map +1 -0
  13. package/dist/src/core/agent-generator/detectors/go-detector.d.ts +5 -0
  14. package/dist/src/core/agent-generator/detectors/go-detector.js +25 -0
  15. package/dist/src/core/agent-generator/detectors/go-detector.js.map +1 -0
  16. package/dist/src/core/agent-generator/detectors/java-detector.d.ts +5 -0
  17. package/dist/src/core/agent-generator/detectors/java-detector.js +44 -0
  18. package/dist/src/core/agent-generator/detectors/java-detector.js.map +1 -0
  19. package/dist/src/core/agent-generator/detectors/node-detector.d.ts +5 -0
  20. package/dist/src/core/agent-generator/detectors/node-detector.js +28 -0
  21. package/dist/src/core/agent-generator/detectors/node-detector.js.map +1 -0
  22. package/dist/src/core/agent-generator/detectors/php-detector.d.ts +5 -0
  23. package/dist/src/core/agent-generator/detectors/php-detector.js +28 -0
  24. package/dist/src/core/agent-generator/detectors/php-detector.js.map +1 -0
  25. package/dist/src/core/agent-generator/detectors/python-detector.d.ts +7 -0
  26. package/dist/src/core/agent-generator/detectors/python-detector.js +116 -0
  27. package/dist/src/core/agent-generator/detectors/python-detector.js.map +1 -0
  28. package/dist/src/core/agent-generator/detectors/ruby-detector.d.ts +5 -0
  29. package/dist/src/core/agent-generator/detectors/ruby-detector.js +23 -0
  30. package/dist/src/core/agent-generator/detectors/ruby-detector.js.map +1 -0
  31. package/dist/src/core/agent-generator/detectors/rust-detector.d.ts +5 -0
  32. package/dist/src/core/agent-generator/detectors/rust-detector.js +18 -0
  33. package/dist/src/core/agent-generator/detectors/rust-detector.js.map +1 -0
  34. package/dist/src/core/agent-generator/detectors/structure-detector.d.ts +4 -0
  35. package/dist/src/core/agent-generator/detectors/structure-detector.js +35 -0
  36. package/dist/src/core/agent-generator/detectors/structure-detector.js.map +1 -0
  37. package/dist/src/core/agent-generator/detectors/toolchain-detector.d.ts +5 -0
  38. package/dist/src/core/agent-generator/detectors/toolchain-detector.js +164 -0
  39. package/dist/src/core/agent-generator/detectors/toolchain-detector.js.map +1 -0
  40. package/dist/src/core/agent-generator/domain-inferrer.d.ts +51 -0
  41. package/dist/src/core/agent-generator/domain-inferrer.js +585 -0
  42. package/dist/src/core/agent-generator/domain-inferrer.js.map +1 -0
  43. package/dist/src/core/agent-generator/engines/audit-engine.d.ts +8 -0
  44. package/dist/src/core/agent-generator/engines/audit-engine.js +84 -0
  45. package/dist/src/core/agent-generator/engines/audit-engine.js.map +1 -0
  46. package/dist/src/core/agent-generator/engines/context-builder.d.ts +12 -0
  47. package/dist/src/core/agent-generator/engines/context-builder.js +84 -0
  48. package/dist/src/core/agent-generator/engines/context-builder.js.map +1 -0
  49. package/dist/src/core/agent-generator/engines/generation-engine.d.ts +7 -0
  50. package/dist/src/core/agent-generator/engines/generation-engine.js +160 -0
  51. package/dist/src/core/agent-generator/engines/generation-engine.js.map +1 -0
  52. package/dist/src/core/agent-generator/engines/generation-engine_deps.d.ts +21 -0
  53. package/dist/src/core/agent-generator/engines/generation-engine_deps.js +17 -0
  54. package/dist/src/core/agent-generator/engines/generation-engine_deps.js.map +1 -0
  55. package/dist/src/core/agent-generator/engines/suggestion-engine.d.ts +13 -0
  56. package/dist/src/core/agent-generator/engines/suggestion-engine.js +171 -0
  57. package/dist/src/core/agent-generator/engines/suggestion-engine.js.map +1 -0
  58. package/dist/src/core/agent-generator/engines/suggestion-engine_deps.d.ts +8 -0
  59. package/dist/src/core/agent-generator/engines/suggestion-engine_deps.js +5 -0
  60. package/dist/src/core/agent-generator/engines/suggestion-engine_deps.js.map +1 -0
  61. package/dist/src/core/agent-generator/enrichers/analysis-helpers.d.ts +9 -0
  62. package/dist/src/core/agent-generator/enrichers/analysis-helpers.js +51 -0
  63. package/dist/src/core/agent-generator/enrichers/analysis-helpers.js.map +1 -0
  64. package/dist/src/core/agent-generator/enrichers/description-generator.d.ts +4 -0
  65. package/dist/src/core/agent-generator/enrichers/description-generator.js +82 -0
  66. package/dist/src/core/agent-generator/enrichers/description-generator.js.map +1 -0
  67. package/dist/src/core/agent-generator/enrichers/endpoint-extractor.d.ts +7 -0
  68. package/dist/src/core/agent-generator/enrichers/endpoint-extractor.js +90 -0
  69. package/dist/src/core/agent-generator/enrichers/endpoint-extractor.js.map +1 -0
  70. package/dist/src/core/agent-generator/enrichers/layer-classifier.d.ts +12 -0
  71. package/dist/src/core/agent-generator/enrichers/layer-classifier.js +152 -0
  72. package/dist/src/core/agent-generator/enrichers/layer-classifier.js.map +1 -0
  73. package/dist/src/core/agent-generator/enrichers/module-extractor.d.ts +10 -0
  74. package/dist/src/core/agent-generator/enrichers/module-extractor.js +173 -0
  75. package/dist/src/core/agent-generator/enrichers/module-extractor.js.map +1 -0
  76. package/dist/src/core/agent-generator/framework-detector.d.ts +17 -0
  77. package/dist/src/core/agent-generator/framework-detector.js +56 -0
  78. package/dist/src/core/agent-generator/framework-detector.js.map +1 -0
  79. package/dist/src/core/agent-generator/index.d.ts +25 -0
  80. package/dist/src/core/agent-generator/index.js +37 -0
  81. package/dist/src/core/agent-generator/index.js.map +1 -0
  82. package/dist/src/core/agent-generator/stack-detector.d.ts +13 -0
  83. package/dist/src/core/agent-generator/stack-detector.js +124 -0
  84. package/dist/src/core/agent-generator/stack-detector.js.map +1 -0
  85. package/dist/src/core/agent-generator/templates/core/agents.d.ts +9 -0
  86. package/dist/src/core/agent-generator/templates/core/agents.js +1127 -0
  87. package/dist/src/core/agent-generator/templates/core/agents.js.map +1 -0
  88. package/dist/src/core/agent-generator/templates/core/architecture-rules.d.ts +6 -0
  89. package/dist/src/core/agent-generator/templates/core/architecture-rules.js +275 -0
  90. package/dist/src/core/agent-generator/templates/core/architecture-rules.js.map +1 -0
  91. package/dist/src/core/agent-generator/templates/core/general-rules.d.ts +7 -0
  92. package/dist/src/core/agent-generator/templates/core/general-rules.js +301 -0
  93. package/dist/src/core/agent-generator/templates/core/general-rules.js.map +1 -0
  94. package/dist/src/core/agent-generator/templates/core/hooks-generator.d.ts +20 -0
  95. package/dist/src/core/agent-generator/templates/core/hooks-generator.js +235 -0
  96. package/dist/src/core/agent-generator/templates/core/hooks-generator.js.map +1 -0
  97. package/dist/src/core/agent-generator/templates/core/index-md.d.ts +6 -0
  98. package/dist/src/core/agent-generator/templates/core/index-md.js +247 -0
  99. package/dist/src/core/agent-generator/templates/core/index-md.js.map +1 -0
  100. package/dist/src/core/agent-generator/templates/core/orchestrator.d.ts +7 -0
  101. package/dist/src/core/agent-generator/templates/core/orchestrator.js +423 -0
  102. package/dist/src/core/agent-generator/templates/core/orchestrator.js.map +1 -0
  103. package/dist/src/core/agent-generator/templates/core/preflight.d.ts +7 -0
  104. package/dist/src/core/agent-generator/templates/core/preflight.js +213 -0
  105. package/dist/src/core/agent-generator/templates/core/preflight.js.map +1 -0
  106. package/dist/src/core/agent-generator/templates/core/quality-gates.d.ts +10 -0
  107. package/dist/src/core/agent-generator/templates/core/quality-gates.js +255 -0
  108. package/dist/src/core/agent-generator/templates/core/quality-gates.js.map +1 -0
  109. package/dist/src/core/agent-generator/templates/core/security-rules.d.ts +6 -0
  110. package/dist/src/core/agent-generator/templates/core/security-rules.js +529 -0
  111. package/dist/src/core/agent-generator/templates/core/security-rules.js.map +1 -0
  112. package/dist/src/core/agent-generator/templates/core/skills-generator.d.ts +18 -0
  113. package/dist/src/core/agent-generator/templates/core/skills-generator.js +547 -0
  114. package/dist/src/core/agent-generator/templates/core/skills-generator.js.map +1 -0
  115. package/dist/src/core/agent-generator/templates/core/workflow-fix-bug.d.ts +6 -0
  116. package/dist/src/core/agent-generator/templates/core/workflow-fix-bug.js +238 -0
  117. package/dist/src/core/agent-generator/templates/core/workflow-fix-bug.js.map +1 -0
  118. package/dist/src/core/agent-generator/templates/core/workflow-new-feature.d.ts +7 -0
  119. package/dist/src/core/agent-generator/templates/core/workflow-new-feature.js +321 -0
  120. package/dist/src/core/agent-generator/templates/core/workflow-new-feature.js.map +1 -0
  121. package/dist/src/core/agent-generator/templates/core/workflow-review.d.ts +6 -0
  122. package/dist/src/core/agent-generator/templates/core/workflow-review.js +105 -0
  123. package/dist/src/core/agent-generator/templates/core/workflow-review.js.map +1 -0
  124. package/dist/src/core/agent-generator/templates/domain/index.d.ts +21 -0
  125. package/dist/src/core/agent-generator/templates/domain/index.js +1179 -0
  126. package/dist/src/core/agent-generator/templates/domain/index.js.map +1 -0
  127. package/dist/src/core/agent-generator/templates/helpers/base-helpers.d.ts +10 -0
  128. package/dist/src/core/agent-generator/templates/helpers/base-helpers.js +20 -0
  129. package/dist/src/core/agent-generator/templates/helpers/base-helpers.js.map +1 -0
  130. package/dist/src/core/agent-generator/templates/helpers/cross-ref-helpers.d.ts +2 -0
  131. package/dist/src/core/agent-generator/templates/helpers/cross-ref-helpers.js +77 -0
  132. package/dist/src/core/agent-generator/templates/helpers/cross-ref-helpers.js.map +1 -0
  133. package/dist/src/core/agent-generator/templates/helpers/security-helpers.d.ts +2 -0
  134. package/dist/src/core/agent-generator/templates/helpers/security-helpers.js +182 -0
  135. package/dist/src/core/agent-generator/templates/helpers/security-helpers.js.map +1 -0
  136. package/dist/src/core/agent-generator/templates/helpers/stack-helpers.d.ts +4 -0
  137. package/dist/src/core/agent-generator/templates/helpers/stack-helpers.js +69 -0
  138. package/dist/src/core/agent-generator/templates/helpers/stack-helpers.js.map +1 -0
  139. package/dist/src/core/agent-generator/templates/helpers/structure-helpers.d.ts +2 -0
  140. package/dist/src/core/agent-generator/templates/helpers/structure-helpers.js +275 -0
  141. package/dist/src/core/agent-generator/templates/helpers/structure-helpers.js.map +1 -0
  142. package/dist/src/core/agent-generator/templates/helpers/summary-helpers.d.ts +6 -0
  143. package/dist/src/core/agent-generator/templates/helpers/summary-helpers.js +56 -0
  144. package/dist/src/core/agent-generator/templates/helpers/summary-helpers.js.map +1 -0
  145. package/dist/src/core/agent-generator/templates/stack/index.d.ts +7 -0
  146. package/dist/src/core/agent-generator/templates/stack/index.js +695 -0
  147. package/dist/src/core/agent-generator/templates/stack/index.js.map +1 -0
  148. package/dist/src/core/agent-generator/templates/template-helpers.d.ts +11 -0
  149. package/dist/src/core/agent-generator/templates/template-helpers.js +12 -0
  150. package/dist/src/core/agent-generator/templates/template-helpers.js.map +1 -0
  151. package/dist/src/core/agent-generator/types/agent.d.ts +39 -0
  152. package/dist/src/core/agent-generator/types/agent.js +27 -0
  153. package/dist/src/core/agent-generator/types/agent.js.map +1 -0
  154. package/dist/src/core/agent-generator/types/domain.d.ts +58 -0
  155. package/dist/src/core/agent-generator/types/domain.js +2 -0
  156. package/dist/src/core/agent-generator/types/domain.js.map +1 -0
  157. package/dist/src/core/agent-generator/types/stack.d.ts +36 -0
  158. package/dist/src/core/agent-generator/types/stack.js +2 -0
  159. package/dist/src/core/agent-generator/types/stack.js.map +1 -0
  160. package/dist/src/core/agent-generator/types/template.d.ts +29 -0
  161. package/dist/src/core/agent-generator/types/template.js +2 -0
  162. package/dist/src/core/agent-generator/types/template.js.map +1 -0
  163. package/dist/src/core/agent-runtime/ai-provider.d.ts +33 -0
  164. package/dist/src/core/agent-runtime/ai-provider.js +146 -0
  165. package/dist/src/core/agent-runtime/ai-provider.js.map +1 -0
  166. package/dist/src/core/agent-runtime/executor.d.ts +13 -0
  167. package/dist/src/core/agent-runtime/executor.js +138 -0
  168. package/dist/src/core/agent-runtime/executor.js.map +1 -0
  169. package/dist/src/core/agent-runtime/human-gate.d.ts +16 -0
  170. package/dist/src/core/agent-runtime/human-gate.js +70 -0
  171. package/dist/src/core/agent-runtime/human-gate.js.map +1 -0
  172. package/dist/tests/agent-generator.test.d.ts +1 -0
  173. package/dist/tests/agent-generator.test.js +349 -0
  174. package/dist/tests/agent-generator.test.js.map +1 -0
  175. package/dist/tests/agent-runtime.test.d.ts +1 -0
  176. package/dist/tests/agent-runtime.test.js +107 -0
  177. package/dist/tests/agent-runtime.test.js.map +1 -0
  178. package/dist/tests/context-enricher.test.d.ts +1 -0
  179. package/dist/tests/context-enricher.test.js +875 -0
  180. package/dist/tests/context-enricher.test.js.map +1 -0
  181. package/dist/tests/framework-detector.test.d.ts +1 -0
  182. package/dist/tests/framework-detector.test.js +882 -0
  183. package/dist/tests/framework-detector.test.js.map +1 -0
  184. package/dist/tests/stack-detector.test.d.ts +1 -0
  185. package/dist/tests/stack-detector.test.js +183 -0
  186. package/dist/tests/stack-detector.test.js.map +1 -0
  187. package/dist/tests/template-generation.test.d.ts +1 -0
  188. package/dist/tests/template-generation.test.js +571 -0
  189. package/dist/tests/template-generation.test.js.map +1 -0
  190. package/dist/tests/template-helpers.test.d.ts +1 -0
  191. package/dist/tests/template-helpers.test.js +967 -0
  192. package/dist/tests/template-helpers.test.js.map +1 -0
  193. package/package.json +24 -0
  194. package/src/core/agent-generator/context-enricher.ts +67 -0
  195. package/src/core/agent-generator/detectors/base-detector.ts +18 -0
  196. package/src/core/agent-generator/detectors/dart-detector.ts +17 -0
  197. package/src/core/agent-generator/detectors/framework-registry.ts +82 -0
  198. package/src/core/agent-generator/detectors/go-detector.ts +26 -0
  199. package/src/core/agent-generator/detectors/java-detector.ts +46 -0
  200. package/src/core/agent-generator/detectors/node-detector.ts +28 -0
  201. package/src/core/agent-generator/detectors/php-detector.ts +28 -0
  202. package/src/core/agent-generator/detectors/python-detector.ts +125 -0
  203. package/src/core/agent-generator/detectors/ruby-detector.ts +24 -0
  204. package/src/core/agent-generator/detectors/rust-detector.ts +19 -0
  205. package/src/core/agent-generator/detectors/structure-detector.ts +38 -0
  206. package/src/core/agent-generator/detectors/toolchain-detector.ts +181 -0
  207. package/src/core/agent-generator/domain-inferrer.ts +630 -0
  208. package/src/core/agent-generator/engines/audit-engine.ts +98 -0
  209. package/src/core/agent-generator/engines/context-builder.ts +96 -0
  210. package/src/core/agent-generator/engines/generation-engine.ts +184 -0
  211. package/src/core/agent-generator/engines/generation-engine_deps.ts +21 -0
  212. package/src/core/agent-generator/engines/suggestion-engine.ts +202 -0
  213. package/src/core/agent-generator/engines/suggestion-engine_deps.ts +8 -0
  214. package/src/core/agent-generator/enrichers/analysis-helpers.ts +58 -0
  215. package/src/core/agent-generator/enrichers/description-generator.ts +91 -0
  216. package/src/core/agent-generator/enrichers/endpoint-extractor.ts +114 -0
  217. package/src/core/agent-generator/enrichers/layer-classifier.ts +156 -0
  218. package/src/core/agent-generator/enrichers/module-extractor.ts +203 -0
  219. package/src/core/agent-generator/framework-detector.ts +66 -0
  220. package/src/core/agent-generator/index.ts +55 -0
  221. package/src/core/agent-generator/stack-detector.ts +115 -0
  222. package/src/core/agent-generator/templates/core/agents.ts +1168 -0
  223. package/src/core/agent-generator/templates/core/architecture-rules.ts +288 -0
  224. package/src/core/agent-generator/templates/core/general-rules.ts +306 -0
  225. package/src/core/agent-generator/templates/core/hooks-generator.ts +244 -0
  226. package/src/core/agent-generator/templates/core/index-md.ts +261 -0
  227. package/src/core/agent-generator/templates/core/orchestrator.ts +462 -0
  228. package/src/core/agent-generator/templates/core/preflight.ts +216 -0
  229. package/src/core/agent-generator/templates/core/quality-gates.ts +257 -0
  230. package/src/core/agent-generator/templates/core/security-rules.ts +544 -0
  231. package/src/core/agent-generator/templates/core/skills-generator.ts +586 -0
  232. package/src/core/agent-generator/templates/core/workflow-fix-bug.ts +240 -0
  233. package/src/core/agent-generator/templates/core/workflow-new-feature.ts +323 -0
  234. package/src/core/agent-generator/templates/core/workflow-review.ts +107 -0
  235. package/src/core/agent-generator/templates/domain/index.ts +1204 -0
  236. package/src/core/agent-generator/templates/helpers/base-helpers.ts +33 -0
  237. package/src/core/agent-generator/templates/helpers/cross-ref-helpers.ts +79 -0
  238. package/src/core/agent-generator/templates/helpers/security-helpers.ts +198 -0
  239. package/src/core/agent-generator/templates/helpers/stack-helpers.ts +80 -0
  240. package/src/core/agent-generator/templates/helpers/structure-helpers.ts +293 -0
  241. package/src/core/agent-generator/templates/helpers/summary-helpers.ts +67 -0
  242. package/src/core/agent-generator/templates/stack/index.ts +705 -0
  243. package/src/core/agent-generator/templates/template-helpers.ts +12 -0
  244. package/src/core/agent-generator/types/agent.ts +65 -0
  245. package/src/core/agent-generator/types/domain.ts +63 -0
  246. package/src/core/agent-generator/types/stack.ts +38 -0
  247. package/src/core/agent-generator/types/template.ts +31 -0
  248. package/src/core/agent-runtime/ai-provider.ts +178 -0
  249. package/src/core/agent-runtime/executor.ts +148 -0
  250. package/src/core/agent-runtime/human-gate.ts +69 -0
  251. package/tests/agent-generator.test.ts +428 -0
  252. package/tests/agent-runtime.test.ts +125 -0
  253. package/tests/context-enricher.test.ts +972 -0
  254. package/tests/framework-detector.test.ts +1172 -0
  255. package/tests/stack-detector.test.ts +241 -0
  256. package/tests/template-generation.test.ts +709 -0
  257. package/tests/template-helpers.test.ts +1130 -0
  258. package/tsconfig.json +14 -0
@@ -0,0 +1,1168 @@
1
+ import { TemplateContext, EnrichedTemplateContext } from '@girardelli/architect-agents/src/core/agent-generator/types/template.js';
2
+ // @ts-ignore - Audit cleanup unused variable
3
+ import { crossRef, depthIndicator, depthAtLeast, getEnriched, frameworkBadge, frameworkModuleStructure, frameworkSecurityChecklist, toolchainCommands, projectStructureBadge } from '../template-helpers.js';
4
+
5
+ /**
6
+ * Generates all specialist agent cards.
7
+ * Each is stack-aware and enterprise-grade detailed.
8
+ *
9
+ * All functions support both TemplateContext (backward compat) and EnrichedTemplateContext.
10
+ * Use getEnriched() to safely extract enriched fields when available.
11
+ */
12
+
13
+ import { i18n } from '@girardelli/architect-core/src/core/i18n.js';
14
+
15
+ export function generateBackendAgent(ctx: TemplateContext | EnrichedTemplateContext): string {
16
+ const { stack, projectName, config, report } = ctx;
17
+ const enriched = getEnriched(ctx);
18
+ const lang = stack.primary;
19
+ // v8.1: Use detected primary framework instead of generic stack.frameworks
20
+ const primaryFw = enriched.primaryFramework;
21
+ const fw = primaryFw ? primaryFw.name : (stack.frameworks.filter(f =>
22
+ ['Django', 'Flask', 'FastAPI', 'NestJS', 'Spring', 'Express', 'Fastify', 'Rails', 'Laravel'].includes(f)
23
+ ).join(', ') || lang);
24
+
25
+ // Build module structure section if enriched data available
26
+ const modulesSection = enriched.modules && enriched.modules.length > 0
27
+ ? `
28
+ ## ${i18n.t('agents.backend.modules')}
29
+
30
+ ${enriched.modules.map(m => `### ${m.name}
31
+ - **Path:** \`${m.path}\`
32
+ - **${i18n.t('cli.results.files')}:** ${m.fileCount}${m.lineCount > 0 ? ` · **${i18n.t('cli.results.lines')}:** ${m.lineCount.toLocaleString()}` : ''}
33
+ - **Descrição:** ${m.description}
34
+ - **Testes:** ${m.hasTests ? '✅ ' + i18n.t('common.yes') : '❌ ' + i18n.t('common.no')}
35
+ ${m.entities.length > 0 ? `- **Entidades:** ${m.entities.join(', ')}` : ''}
36
+ `).join('\n')}
37
+ `
38
+ : '';
39
+
40
+ // Build endpoints section if enriched data available
41
+ const endpointsSection = enriched.endpoints && enriched.endpoints.length > 0
42
+ ? `
43
+ ## ${i18n.t('enriched.endpoints')}
44
+
45
+ ${enriched.endpoints.map(e => `- \`${e.method}\` \`${e.path}\` — ${e.handler} (Auth: ${e.hasAuth ? i18n.t('common.yes') : i18n.t('common.no')}, Validação: ${e.hasValidation ? i18n.t('common.yes') : i18n.t('common.no')})`).join('\n')}
46
+ `
47
+ : '';
48
+
49
+ // Build domain section if enriched data available
50
+ const domainSection = enriched.domain
51
+ ? `
52
+ ## ${i18n.t('agents.backend.domainContext')}
53
+
54
+ - **Domínio:** ${enriched.domain.domain}
55
+ - **Sub-domínio:** ${enriched.domain.subDomain}
56
+ - **Descrição:** ${enriched.domain.description}
57
+ - **Confiança na Inferência:** ${Math.round(enriched.domain.confidence * 100)}%
58
+ ${enriched.domain.businessEntities && enriched.domain.businessEntities.length > 0
59
+ ? `
60
+ ### Entidades de Negócio Detectadas
61
+
62
+ ${enriched.domain.businessEntities.map(e => `- **${e.name}** (${e.layer}) — de \`${e.source}\`
63
+ - Campos: ${e.fields.join(', ')}
64
+ - Relacionamentos: ${e.relationships.length > 0 ? e.relationships.join(', ') : 'nenhum'}`).join('\n')}
65
+ `
66
+ : ''}
67
+ `
68
+ : '';
69
+
70
+ return `---
71
+ antigravity:
72
+ trigger: 'on_demand'
73
+ globs: ['**/*.${lang === 'Python' ? 'py' : lang === 'Dart' ? 'dart' : lang === 'Go' ? 'go' : 'ts'}']
74
+ description: '${i18n.t('agents.backend.description', { lang })}'
75
+ agent_card:
76
+ id: '${lang.toLowerCase()}-backend'
77
+ name: '${lang} Backend Developer'
78
+ role: 'development'
79
+ capabilities: [api-design, service-architecture, business-logic, data-modeling, testing]
80
+ inputs: [user-story, api-contracts, business-rules, integration-doc]
81
+ outputs: [controllers, services, entities, migrations, tests, integration-doc]
82
+ depends_on: [${stack.hasDatabase ? 'database-engineer' : ''}]
83
+ version: 3.1.0
84
+ ---
85
+
86
+ # ${i18n.t('agents.backend.title', { lang: lang.toUpperCase() })}
87
+
88
+ ${depthIndicator(ctx)}
89
+
90
+ > ${i18n.t('agents.backend.specialistIn', { fw, projectName })}
91
+
92
+ ## ${i18n.t('agents.backend.stack')}
93
+
94
+ - **${i18n.t('agents.backend.language')}:** ${lang}
95
+ - **${i18n.t('agents.backend.framework')}:** ${fw}${primaryFw?.version ? ` v${primaryFw.version}` : ''}
96
+ - **${i18n.t('agents.backend.architecture')}:** ${projectStructureBadge(ctx)}
97
+ - **${i18n.t('agents.backend.test')}:** ${stack.testFramework}
98
+ - **${i18n.t('agents.backend.packageManager')}:** ${stack.packageManager}
99
+ - **${i18n.t('agents.backend.currentScore')}:** ${report.score.overall}/100
100
+
101
+ ${frameworkBadge(ctx)}
102
+ ${domainSection}
103
+
104
+ ## ${i18n.t('agents.backend.principles')}
105
+
106
+ 1. **S** — Single Responsibility
107
+ 2. **O** — Open/Closed
108
+ 3. **L** — Liskov Substitution
109
+ 4. **I** — Interface Segregation
110
+ 5. **D** — Dependency Inversion
111
+ ${modulesSection}
112
+
113
+ ## ${i18n.t('agents.backend.projectStructure')}
114
+
115
+ ${frameworkModuleStructure(ctx)}
116
+ ${endpointsSection}
117
+
118
+ ## ${i18n.t('agents.backend.implementationRules')}
119
+
120
+ \`\`\`
121
+ ${i18n.t('agents.backend.implementationRulesBody', { coverage: config.coverageMinimum })}
122
+ \`\`\`
123
+
124
+ ## ${i18n.t('agents.backend.afterImplementation')}
125
+
126
+ ${i18n.t('agents.backend.afterImplementationBody')}
127
+
128
+ ${crossRef('backend', ctx)}
129
+
130
+ ---
131
+
132
+ **${i18n.t('agents.generatedBy')}**
133
+ `;
134
+ }
135
+
136
+ export function generateFrontendAgent(ctx: TemplateContext | EnrichedTemplateContext): string {
137
+ const { stack, projectName, config, report } = ctx;
138
+ const enriched = getEnriched(ctx);
139
+ // v5.1: Use enriched primaryFramework or detect from all frameworks
140
+ const FRONTEND_FWS = ['Angular', 'Vue', 'Vue.js', 'Next.js', 'React', 'Nuxt', 'Svelte', 'Remix'];
141
+ const detectedFw = enriched.detectedFrameworks?.find(f => FRONTEND_FWS.includes(f.name));
142
+ const fw = detectedFw?.name ||
143
+ stack.frameworks.find(f => FRONTEND_FWS.includes(f)) || 'Frontend';
144
+
145
+ // Build endpoints integration guide if available
146
+ const endpointsGuide = enriched.endpoints && enriched.endpoints.length > 0
147
+ ? `
148
+ ## ${i18n.t('enriched.endpoints')}
149
+
150
+ ${enriched.endpoints.filter(e => ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'].includes(e.method))
151
+ .slice(0, 15) // limit to 15 most important
152
+ .map(e => `- \`${e.method}\` \`${e.path}\` (${e.handler})`)
153
+ .join('\n')}
154
+ ${enriched.endpoints.length > 15 ? `
155
+ ... e mais ${enriched.endpoints.length - 15} endpoints. Ver documento de integração completo.` : ''}
156
+ `
157
+ : '';
158
+
159
+ // Build modules structure if available
160
+ const modulesGuide = enriched.modules && enriched.modules.length > 0
161
+ ? `
162
+ ## ${i18n.t('agents.backend.modules')}
163
+
164
+ ${enriched.modules.map(m => `- \`${m.path}\` — ${m.description}`).join('\n')}
165
+ `
166
+ : '';
167
+
168
+ return `---
169
+ antigravity:
170
+ trigger: 'on_demand'
171
+ globs: ['**/*.{ts,tsx,vue,jsx,html,css,scss}']
172
+ description: '${i18n.t('agents.frontend.description', { fw })}'
173
+ agent_card:
174
+ id: '${fw.toLowerCase().replace('.', '')}-frontend'
175
+ name: '${fw} Frontend Developer'
176
+ role: 'development'
177
+ capabilities: [component-development, state-management, responsive-design, form-handling, api-integration]
178
+ inputs: [mockup, integration-doc, user-story, design-system]
179
+ outputs: [components, pages, services, tests]
180
+ depends_on: [orchestrator]
181
+ version: 3.1.0
182
+ ---
183
+
184
+ # ${i18n.t('agents.frontend.title', { fw: fw.toUpperCase().replace('.', '') })}
185
+
186
+ ${depthIndicator(ctx)}
187
+
188
+ > ${i18n.t('agents.frontend.specialistIn', { fw, projectName })}
189
+
190
+ ## ${i18n.t('agents.backend.stack')}
191
+
192
+ - **${i18n.t('agents.backend.framework')}:** ${fw}
193
+ - **${i18n.t('agents.backend.language')}s:** ${stack.languages.join(', ')}
194
+ - **${i18n.t('agents.backend.test')}:** ${stack.testFramework}
195
+ - **${i18n.t('agents.backend.currentScore')}:** ${report.score.overall}/100
196
+
197
+ ## ${i18n.t('agents.frontend.prerequisites')}
198
+
199
+ \`\`\`
200
+ ${i18n.t('agents.frontend.prerequisitesBody')}
201
+ \`\`\`
202
+ ${modulesGuide}${endpointsGuide}
203
+
204
+ ## ${i18n.t('agents.frontend.implementationRules')}
205
+
206
+ \`\`\`
207
+ ${i18n.t('agents.frontend.implementationRulesBody', { coverage: config.coverageMinimum })}
208
+ \`\`\`
209
+
210
+ ${crossRef('frontend', ctx)}
211
+
212
+ ---
213
+
214
+ **${i18n.t('agents.generatedBy')}**
215
+ `;
216
+ }
217
+
218
+ export function generateSecurityAgent(ctx: TemplateContext | EnrichedTemplateContext): string {
219
+ // @ts-ignore - Audit cleanup unused variable
220
+ const { projectName, config, stack } = ctx;
221
+ const enriched = getEnriched(ctx);
222
+
223
+ // Build compliance section if available
224
+ const complianceSection = enriched.domain && enriched.domain.compliance && enriched.domain.compliance.length > 0
225
+ ? `
226
+ ## ${i18n.t('dynamic.compliance.title')}
227
+
228
+ ${enriched.domain.compliance.map(c => `### ${c.name}
229
+ **${i18n.t('dynamic.compliance.reason')}:** ${c.reason}
230
+
231
+ **${i18n.t('dynamic.compliance.mandatoryChecks')}:**
232
+ ${c.mandatoryChecks.map(check => `- □ ${check}`).join('\n')}
233
+ `).join('\n')}
234
+ `
235
+ : '';
236
+
237
+ // Build integrations security section if available
238
+ const integrationsSection = enriched.domain && enriched.domain.integrations && enriched.domain.integrations.length > 0
239
+ ? `
240
+ ## ${i18n.t('dynamic.integrations.title')}
241
+
242
+ ${enriched.domain.integrations.map(i => {
243
+ let threat = '';
244
+ if (i.type === 'payment') threat = i18n.t('dynamic.integrations.types.payment');
245
+ else if (i.type === 'auth') threat = i18n.t('dynamic.integrations.types.auth');
246
+ else if (i.type === 'api') threat = i18n.t('dynamic.integrations.types.api');
247
+ else if (i.type === 'database') threat = i18n.t('dynamic.integrations.types.database');
248
+ else if (i.type === 'government') threat = i18n.t('dynamic.integrations.types.government');
249
+ else threat = i18n.t('dynamic.integrations.types.default');
250
+
251
+ return `- **${i.name}** (${i.type}) — ${i18n.t('dynamic.integrations.threats')}: ${threat}`;
252
+ }).join('\n')}
253
+ `
254
+ : '';
255
+
256
+ // Domain-specific threats
257
+ const domainThreatsSection = enriched.domain
258
+ ? `
259
+ ## ${i18n.t('dynamic.domainThreats.title', { domain: enriched.domain.domain })}
260
+
261
+ ${enriched.domain.domain === 'fintech' || enriched.domain.domain === 'payments'
262
+ ? i18n.t('dynamic.domainThreats.fintech')
263
+ : enriched.domain.domain === 'healthtech'
264
+ ? i18n.t('dynamic.domainThreats.healthtech')
265
+ : enriched.domain.domain === 'e-commerce'
266
+ ? i18n.t('dynamic.domainThreats.ecommerce')
267
+ : i18n.t('dynamic.domainThreats.default')}
268
+ `
269
+ : '';
270
+
271
+ // v8.1: Framework-specific security checklist
272
+ const stackSecuritySection = frameworkSecurityChecklist(ctx);
273
+
274
+ return `---
275
+ antigravity:
276
+ trigger: 'on_demand'
277
+ description: '${i18n.t('agents.security.description')}'
278
+ agent_card:
279
+ id: 'security-auditor'
280
+ name: 'Security Auditor'
281
+ role: 'quality'
282
+ capabilities: [threat-modeling, owasp-analysis, compliance-check, vulnerability-detection]
283
+ inputs: [architecture-doc, source-code, api-contracts]
284
+ outputs: [threat-model, security-findings, compliance-report]
285
+ depends_on: []
286
+ version: 3.1.0
287
+ ---
288
+
289
+ # ${i18n.t('agents.security.title')}
290
+
291
+ ${depthIndicator(ctx)}
292
+
293
+ > ${i18n.t('agents.security.analysisFor', { projectName })}
294
+
295
+ ## ${i18n.t('agents.security.checklist')}
296
+
297
+ \`\`\`
298
+ ${i18n.t('agents.security.checklistBody')}
299
+ \`\`\`
300
+ ${stackSecuritySection}
301
+ ${complianceSection}${integrationsSection}${domainThreatsSection}
302
+
303
+ ## ${i18n.t('agents.security.whenToActivate')}
304
+
305
+ ${i18n.t('agents.security.whenToActivateBody')}
306
+
307
+ ## ${i18n.t('agents.security.expectedOutput')}
308
+
309
+ ${i18n.t('agents.security.expectedOutputBody')}
310
+
311
+ ${crossRef('security-auditor', ctx)}
312
+
313
+ ---
314
+
315
+ **${i18n.t('agents.generatedBy')}**
316
+ `;
317
+ }
318
+
319
+ export function generateQAAgent(ctx: TemplateContext | EnrichedTemplateContext): string {
320
+ const { projectName, config, stack, plan } = ctx;
321
+ const enriched = getEnriched(ctx);
322
+
323
+ // Build untested modules warning (reference canonical source)
324
+ const untestedCount = enriched.untestedModules?.length || 0;
325
+ const unterstedWarning = untestedCount > 0
326
+ ? `
327
+ ## ⚠️ ${i18n.t('enriched.untestedModules')}
328
+
329
+ ${i18n.t('enriched.untestedModulesBody', { count: untestedCount })}
330
+ `
331
+ : '';
332
+
333
+ // Build test scenarios from endpoints
334
+ const testScenariosSection = enriched.endpoints && enriched.endpoints.length > 0
335
+ ? `
336
+ ## Cenários de Teste por Endpoint
337
+
338
+ ${enriched.endpoints.slice(0, 10).map(e => `### \`${e.method}\` \`${e.path}\`
339
+
340
+ **Casos de teste:**
341
+ - ✅ Sucesso com dados válidos
342
+ - ⚠️ Validação: entrada inválida
343
+ ${e.hasAuth ? `- 🔒 Autenticação: sem token, token inválido
344
+ - 🔒 Autorização: usuário sem permissão` : ''}
345
+ - ❌ Erro: recurso não encontrado (404)
346
+ - ❌ Erro: conflito (409)
347
+ `).join('\n')}
348
+
349
+ ${enriched.endpoints.length > 10 ? `... e mais ${enriched.endpoints.length - 10} endpoints para testar.` : ''}
350
+ `
351
+ : '';
352
+
353
+ // Build domain-specific test scenarios
354
+ const domainTestsSection = enriched.domain
355
+ ? `
356
+ ## ${i18n.t('dynamic.qaDomain.title', { domain: enriched.domain.domain })}
357
+
358
+ ${enriched.domain.domain === 'fintech' || enriched.domain.domain === 'payments'
359
+ ? i18n.t('dynamic.qaDomain.fintech')
360
+ : enriched.domain.domain === 'healthtech'
361
+ ? i18n.t('dynamic.qaDomain.healthtech')
362
+ : enriched.domain.domain === 'e-commerce'
363
+ ? i18n.t('dynamic.qaDomain.ecommerce')
364
+ : i18n.t('dynamic.qaDomain.default')}
365
+ `
366
+ : '';
367
+
368
+ return `---
369
+ antigravity:
370
+ trigger: 'on_demand'
371
+ description: '${i18n.t('agents.qa.description')}'
372
+ agent_card:
373
+ id: 'qa-test-engineer'
374
+ name: 'QA Test Engineer'
375
+ role: 'quality'
376
+ capabilities: [test-planning, bdd-scenarios, tdd-implementation, coverage-analysis, regression-testing]
377
+ inputs: [user-story, bdd-scenarios, source-code]
378
+ outputs: [test-plan, test-cases, coverage-report]
379
+ depends_on: []
380
+ version: 3.1.0
381
+ ---
382
+
383
+ # ${i18n.t('agents.qa.title')}
384
+
385
+ ${depthIndicator(ctx)}
386
+
387
+ > ${i18n.t('agents.qa.qualityFor', { projectName })}
388
+
389
+ ## ${i18n.t('agents.qa.nonNegotiable')}
390
+
391
+ \`\`\`
392
+ ${i18n.t('agents.qa.nonNegotiableBody', { coverage: config.coverageMinimum })}
393
+ \`\`\`
394
+ ${unterstedWarning}
395
+
396
+ ## ${i18n.t('agents.qa.pyramid')}
397
+
398
+ \`\`\`
399
+ ${i18n.t('agents.qa.pyramidBody')}
400
+ \`\`\`
401
+
402
+ ## ${i18n.t('agents.qa.process')}
403
+
404
+ ${i18n.t('agents.qa.processBody')}
405
+
406
+ ## Framework: ${stack.testFramework}
407
+ ${testScenariosSection}${domainTestsSection}
408
+
409
+ ## ${i18n.t('agents.qa.refactoringRoadmap')}
410
+
411
+ ${plan.steps.slice(0, 5).map((step, idx) => `${idx + 1}. ${step.description} (${step.priority || 'MEDIUM'})`).join('\n')}
412
+ ${plan.steps.length > 5 ? `\n... e mais ${plan.steps.length - 5} steps.` : ''}
413
+
414
+ ${crossRef('qa-test', ctx)}
415
+
416
+ ---
417
+
418
+ **${i18n.t('agents.generatedBy')}**
419
+ `;
420
+ }
421
+
422
+ export function generateTechDebtAgent(ctx: TemplateContext | EnrichedTemplateContext): string {
423
+ const { projectName, report, plan, config } = ctx;
424
+ const enriched = getEnriched(ctx);
425
+
426
+ // Group anti-patterns by severity
427
+ const criticalPatterns = report.antiPatterns.filter(a => a.severity === 'CRITICAL');
428
+ const highPatterns = report.antiPatterns.filter(a => a.severity === 'HIGH');
429
+ const mediumPatterns = report.antiPatterns.filter(a => a.severity === 'MEDIUM');
430
+ const lowPatterns = report.antiPatterns.filter(a => a.severity === 'LOW');
431
+
432
+ const antiPatternsSection = `
433
+ ## Anti-Patterns Detectados (Agrupados por Severidade)
434
+
435
+ ${criticalPatterns.length > 0 ? `
436
+ ### 🔴 CRÍTICOS (${criticalPatterns.length})
437
+ ${criticalPatterns.map(a => `- **${a.name}** — \`${a.location}\`
438
+ Ação: Resolver no próximo sprint`).join('\n')}
439
+ ` : ''}
440
+
441
+ ${highPatterns.length > 0 ? `
442
+ ### 🟠 ALTOS (${highPatterns.length})
443
+ ${highPatterns.map(a => `- **${a.name}** — \`${a.location}\`
444
+ Ação: Planejar correção para próximas 2 semanas`).join('\n')}
445
+ ` : ''}
446
+
447
+ ${mediumPatterns.length > 0 ? `
448
+ ### 🟡 MÉDIOS (${mediumPatterns.length})
449
+ ${mediumPatterns.map(a => `- **${a.name}** — \`${a.location}\`
450
+ Ação: Adicionar ao backlog de técnico`).join('\n')}
451
+ ` : ''}
452
+
453
+ ${lowPatterns.length > 0 ? `
454
+ ### 🟢 BAIXOS (${lowPatterns.length})
455
+ ${lowPatterns.map(a => `- **${a.name}** — \`${a.location}\`
456
+ Ação: Considerar em refatorações futuras`).join('\n')}
457
+ ` : ''}
458
+
459
+ ${report.antiPatterns.length === 0 ? '✅ Nenhum anti-pattern detectado.' : ''}
460
+ `;
461
+
462
+ // Critical coupling hotspots
463
+ const couplingSection = enriched.criticalPaths && enriched.criticalPaths.length > 0
464
+ ? `
465
+ ## Hotspots de Acoplamento (Tech Debt)
466
+
467
+ Arquivos com alta complexidade de acoplamento — priorizar refatoração:
468
+
469
+ ${enriched.criticalPaths.slice(0, 10).map(p => `- \`${p}\` — Alto acoplamento detectado`).join('\n')}
470
+ ${enriched.criticalPaths.length > 10 ? `\n... e mais ${enriched.criticalPaths.length - 10} caminhos críticos.` : ''}
471
+ `
472
+ : '';
473
+
474
+ // Untested modules as debt (reference canonical source)
475
+ const untestedDebtCount = enriched.untestedModules?.length || 0;
476
+ const unterstedDebtSection = untestedDebtCount > 0
477
+ ? `
478
+ ## Débito em Cobertura de Teste
479
+
480
+ **${untestedDebtCount} módulos sem testes adequados detectados.**
481
+
482
+ > 📋 Lista canônica e gates de cobertura: ver [QUALITY-GATES.md](../guards/QUALITY-GATES.md#módulos-sem-testes)
483
+
484
+ **Plano de ação:**
485
+ 1. Priorizar módulos com mais dependências
486
+ 2. Seguir workflow TDD para cada módulo
487
+ 3. Meta: reduzir lista a zero em ${Math.ceil(untestedDebtCount / 3)} sprints
488
+ `
489
+ : '';
490
+
491
+ return `---
492
+ antigravity:
493
+ trigger: 'on_demand'
494
+ description: '${i18n.t('agents.techDebt.description')}'
495
+ agent_card:
496
+ id: 'tech-debt-controller'
497
+ name: 'Tech Debt Controller'
498
+ role: 'governance'
499
+ capabilities: [debt-tracking, score-monitoring, refactoring-prioritization]
500
+ inputs: [architecture-report, anti-patterns, score-history]
501
+ outputs: [debt-backlog, refactoring-plan, score-targets]
502
+ depends_on: []
503
+ version: 3.1.0
504
+ ---
505
+
506
+ # ${i18n.t('agents.techDebt.title')}
507
+
508
+ ${depthIndicator(ctx)}
509
+
510
+ > ${i18n.t('agents.techDebt.controlFor', { projectName })}
511
+
512
+ ## ${i18n.t('agents.techDebt.currentState')}
513
+
514
+ ${i18n.t('agents.techDebt.stateTable', { score: report.score.overall, target: Math.min(100, report.score.overall + 10), antiPatterns: report.antiPatterns.length, refactoringSteps: plan.steps.length, improvement: plan.estimatedScoreAfter.overall - report.score.overall })}
515
+ ${antiPatternsSection}${couplingSection}${unterstedDebtSection}
516
+
517
+ ## ${i18n.t('agents.techDebt.refactoringRoadmap')}
518
+
519
+ Prioridade por impacto:
520
+
521
+ ${plan.steps.slice(0, 8).map((step, idx) => `
522
+ ${idx + 1}. **${step.title}** — ${step.description}
523
+ - Tier: ${step.tier === 1 ? 'Crítico' : 'Importante'}
524
+ - Prioridade: ${step.priority}
525
+ `).join('\n')}
526
+
527
+ ${plan.steps.length > 8 ? `
528
+ ... e mais ${plan.steps.length - 8} steps no plano completo.
529
+ ` : ''}
530
+
531
+ ## ${i18n.t('agents.techDebt.scoreTargets')}
532
+
533
+ \`\`\`
534
+ ${i18n.t('agents.techDebt.scoreTargetsBody', { score: report.score.overall, targetShort: Math.min(100, report.score.overall + 5), targetMedium: Math.min(100, report.score.overall + 10), threshold: config.scoreThreshold })}
535
+ \`\`\`
536
+
537
+ ## ${i18n.t('agents.techDebt.rules')}
538
+
539
+ \`\`\`
540
+ ${i18n.t('agents.techDebt.rulesBody', { threshold: config.scoreThreshold })}
541
+ \`\`\`
542
+
543
+ ${crossRef('tech-debt', ctx)}
544
+
545
+ ---
546
+
547
+ **${i18n.t('agents.generatedBy')}**
548
+ `;
549
+ }
550
+
551
+ export function generateCodeReviewChecklist(ctx: TemplateContext | EnrichedTemplateContext): string {
552
+ const { projectName, config, stack } = ctx;
553
+ const enriched = getEnriched(ctx);
554
+
555
+ // Domain-specific review items
556
+ const domainReviewItems = enriched.domain
557
+ ? `
558
+ ## Itens de Revisão Específicos do Domínio: ${enriched.domain.domain}
559
+
560
+ ${enriched.domain.domain === 'fintech' || enriched.domain.domain === 'payments'
561
+ ? `□ Transações são idempotentes?
562
+ □ Auditoria completa de todas as operações?
563
+ □ Sem exposição de dados sensíveis em logs?
564
+ □ Valores monetários não usam float (usar Decimal)?
565
+ □ PCI-DSS compliance verificado?`
566
+ : enriched.domain.domain === 'healthtech'
567
+ ? `□ LGPD compliance verificado (consentimento, retenção)?
568
+ □ Dados sensíveis criptografados em repouso?
569
+ □ Acesso auditado e logado?
570
+ □ Anonimização implementada corretamente?
571
+ □ 2FA em operações sensíveis?`
572
+ : enriched.domain.domain === 'e-commerce'
573
+ ? `□ Carrinho é idempotente?
574
+ □ Inventário é atualizado corretamente (race conditions)?
575
+ □ Preços são validados (sem manipulação client-side)?
576
+ □ Cupons/descontos aplicados corretamente?
577
+ □ Fraude detection implementado?`
578
+ : `□ Fluxo crítico de negócio não quebrou?
579
+ □ Rollback é seguro?
580
+ □ Concorrência tratada?
581
+ □ State final é consistente?`}
582
+ `
583
+ : '';
584
+
585
+ // Stack-specific review items
586
+ const stackReviewItems = `
587
+ ## Checklist Específico para ${stack.primary}
588
+
589
+ ${stack.primary === 'TypeScript' || stack.primary === 'JavaScript'
590
+ ? `□ \`strict: true\` em tsconfig (sem any sem justificativa)?
591
+ □ Imports circulares?
592
+ □ Async/await tratado (sem unhandled promises)?
593
+ □ Memory leaks (EventListeners desinscritos)?
594
+ □ Console.log/debugger removidos?`
595
+ : stack.primary === 'Python'
596
+ ? `□ Type hints em todas as funções públicas?
597
+ □ Docstrings formatadas (Google ou NumPy style)?
598
+ □ Sem mutable default arguments?
599
+ □ Context managers usados para resources?
600
+ □ F-strings em vez de % ou .format()?
601
+ □ Sem \`eval()\` ou \`exec()\`?`
602
+ : stack.primary === 'Go'
603
+ ? `□ Erros tratados (não ignorados com _)?
604
+ □ Defer para cleanup?
605
+ □ Goroutines com contexto?
606
+ □ Race conditions testadas?
607
+ □ Timeouts implementados?`
608
+ : stack.primary === 'Dart'
609
+ ? `□ Null-safety (! evitado)?
610
+ □ Widgets têm keys quando em listas?
611
+ □ BuildContext acessado apenas em build?
612
+ □ Listeners desinscritos?
613
+ □ Imagens/assets fazem lazy-load?`
614
+ : `□ Código segue padrões do projeto?
615
+ □ Dependencies atualizadas?
616
+ □ Sem warnings do compilador/linter?`}
617
+ `;
618
+
619
+ // Integration/endpoint specific items
620
+ const integrationReviewItems = enriched.endpoints && enriched.endpoints.length > 0
621
+ ? `
622
+ ## Itens de Revisão de Integração
623
+
624
+ □ Endpoint trata todos os status codes esperados?
625
+ □ Validação do payload de entrada?
626
+ ${enriched.endpoints.some(e => e.hasAuth) ? '□ Autenticação/autorização verificadas?' : ''}
627
+ ${enriched.endpoints.some(e => e.hasValidation) ? '□ Validação de input implementada?' : ''}
628
+ □ Resposta segue o contrato documentado?
629
+ □ Erros retornam mensagens claras?
630
+ □ Rate limiting aplicado?
631
+ □ Logging estruturado?
632
+ `
633
+ : '';
634
+
635
+ return `---
636
+ antigravity:
637
+ trigger: 'on_demand'
638
+ description: 'Code Review Checklist — Pontos obrigatórios de revisão'
639
+ ---
640
+
641
+ # 🔍 CODE REVIEW CHECKLIST — ${projectName}
642
+
643
+ ${depthIndicator(ctx)}
644
+
645
+ > **Todo PR deve ser verificado contra este checklist.**
646
+
647
+ ## Obrigatório
648
+
649
+ \`\`\`
650
+ □ Código compila sem erros
651
+ □ Todos os testes passam
652
+ □ Cobertura ≥ ${config.coverageMinimum}%
653
+ □ Lint sem errors
654
+ □ Nenhum secret hardcoded
655
+ □ Score não regrediu
656
+ \`\`\`
657
+
658
+ ## Funcional
659
+
660
+ \`\`\`
661
+ □ Atende aos critérios de aceite
662
+ □ Edge cases tratados
663
+ □ Erros tratados adequadamente
664
+ □ Não quebra features existentes
665
+ \`\`\`
666
+
667
+ ## Qualidade
668
+
669
+ \`\`\`
670
+ □ Código legível sem comentários explicativos
671
+ □ Naming descritivo e consistente
672
+ □ Sem duplicação (DRY)
673
+ □ Sem magic numbers
674
+ □ Sem any / type: ignore injustificado
675
+ □ Arquivos < 500 linhas
676
+ \`\`\`
677
+
678
+ ## Segurança
679
+
680
+ \`\`\`
681
+ □ Inputs validados
682
+ □ Queries parametrizadas
683
+ □ Auth/authz verificados
684
+ □ Dados sensíveis protegidos
685
+ \`\`\`
686
+ ${stackReviewItems}${domainReviewItems}${integrationReviewItems}
687
+
688
+ ${crossRef('code-review', ctx)}
689
+
690
+ ---
691
+
692
+ **Gerado por Architect v8.1**
693
+ `;
694
+ }
695
+
696
+ export function generateDatabaseAgent(ctx: TemplateContext | EnrichedTemplateContext): string {
697
+ // @ts-ignore - Audit cleanup unused variable
698
+ const { projectName, config, stack } = ctx;
699
+ const enriched = getEnriched(ctx);
700
+
701
+ // Detect ORM/database framework
702
+ const dbFramework = stack.frameworks.filter(f =>
703
+ ['TypeORM', 'Prisma', 'SQLAlchemy', 'Django ORM', 'Sequelize', 'Knex'].includes(f)
704
+ ).join(', ') || 'SQL';
705
+
706
+ // Build business entities section
707
+ const entitiesSection = enriched.domain && enriched.domain.businessEntities && enriched.domain.businessEntities.length > 0
708
+ ? `
709
+ ## Entidades de Negócio (Entity Relationship)
710
+
711
+ ${enriched.domain.businessEntities.map(e => `
712
+ ### ${e.name}
713
+ **Camada:** ${e.layer} | **Fonte:** \`${e.source}\`
714
+
715
+ **Campos:**
716
+ ${e.fields.map(f => `- ${f}`).join('\n')}
717
+
718
+ **Relacionamentos:**
719
+ ${e.relationships.length > 0 ? e.relationships.map(r => `- ${r}`).join('\n') : '- Nenhum'}
720
+ `).join('\n')}
721
+ `
722
+ : '';
723
+
724
+ // Migration strategy based on framework
725
+ const migrationStrategy = `
726
+ ## Estratégia de Migrations
727
+
728
+ ### Framework: ${dbFramework}
729
+
730
+ ${dbFramework.includes('TypeORM')
731
+ ? `\`\`\`bash
732
+ # Criar migration
733
+ npm run typeorm migration:generate -- -n DescricaoDaMigracao
734
+
735
+ # Executar
736
+ npm run typeorm migration:run
737
+
738
+ # Reverter
739
+ npm run typeorm migration:revert
740
+ \`\`\`
741
+
742
+ **Padrão:**
743
+ - Uma migration por feature
744
+ - Naming: \`YYYY-MM-DD-HH-mm-ss-description.ts\`
745
+ - Ambos up() e down() implementados
746
+ - Testar reverter em staging antes de produção`
747
+ : dbFramework.includes('Prisma')
748
+ ? `\`\`\`bash
749
+ # Criar migration
750
+ npx prisma migrate dev --name DescricaoDaMigracao
751
+
752
+ # Produção
753
+ npx prisma migrate deploy
754
+ \`\`\`
755
+
756
+ **Padrão:**
757
+ - Schema.prisma é source of truth
758
+ - Migrations em \`prisma/migrations/\`
759
+ - Sempre testar \`prisma migrate resolve\` se houver problema
760
+ - Usar \`@relation\` para relacionamentos`
761
+ : dbFramework.includes('SQLAlchemy')
762
+ ? `\`\`\`bash
763
+ # Criar migration
764
+ alembic revision --autogenerate -m "description"
765
+
766
+ # Executar
767
+ alembic upgrade head
768
+
769
+ # Reverter
770
+ alembic downgrade -1
771
+ \`\`\`
772
+
773
+ **Padrão:**
774
+ - Alembic em \`alembic/versions/\`
775
+ - Sempre revisar .py autogenerado
776
+ - Testar em staging antes de produção`
777
+ : `\`\`\`bash
778
+ # Criar arquivos .sql com:
779
+ -- migrations/001-create-table.up.sql
780
+ -- migrations/001-create-table.down.sql
781
+ \`\`\`
782
+
783
+ **Padrão:**
784
+ - Um arquivo up/down por migration
785
+ - Idempotent (IF NOT EXISTS, etc.)
786
+ - Testar reverter`}
787
+ `;
788
+
789
+ // Indexing strategy
790
+ const indexingStrategy = `
791
+ ## Estratégia de Indexing
792
+
793
+ ### Índices Obrigatórios:
794
+
795
+ \`\`\`
796
+ □ PRIMARY KEY em toda tabela
797
+ □ FOREIGN KEYS entre entidades relacionadas
798
+ □ Índice em campos usados em WHERE frequente
799
+ □ Índice em campos de JOIN
800
+ □ Índice em campos de ORDER BY
801
+ \`\`\`
802
+
803
+ ### Exemplo:
804
+
805
+ \`\`\`sql
806
+ -- Por frequência de query
807
+ CREATE INDEX idx_user_email ON users(email);
808
+ CREATE INDEX idx_order_user_id ON orders(user_id);
809
+ CREATE INDEX idx_order_status_created ON orders(status, created_at);
810
+
811
+ -- Composto para filtros múltiplos
812
+ CREATE INDEX idx_order_user_status ON orders(user_id, status);
813
+ \`\`\`
814
+
815
+ ### Cuidado:
816
+
817
+ \`\`\`
818
+ □ Não criar índice para CADA coluna (overhead)
819
+ □ Medir com EXPLAIN PLAN antes/depois
820
+ □ Índices consomem storage e memória
821
+ □ Atualizar índices em ALTER TABLE é lento
822
+ \`\`\`
823
+ `;
824
+
825
+ // Build domain patterns section with conditional content
826
+ let domainPatternsContent = '';
827
+ if (enriched.domain) {
828
+ if (enriched.domain.domain === 'fintech' || enriched.domain.domain === 'payments') {
829
+ domainPatternsContent = `### Requisitos:
830
+ - **Audit Trail:** TODA transação registrada com timestamp/user
831
+ - **Soft Deletes:** Nunca deletar, marcar como inativo
832
+ - **Idempotência:** Transação com mesmo ID é processada 1x
833
+ - **Timestamps:** created_at, updated_at, deleted_at em todas as tabelas
834
+ - **Denormalização:** Guardar valor em repouso na transação
835
+
836
+ ### Exemplo Schema:
837
+ \`\`\`sql
838
+ CREATE TABLE transactions (
839
+ id UUID PRIMARY KEY,
840
+ user_id UUID NOT NULL REFERENCES users(id),
841
+ amount DECIMAL(19,2) NOT NULL,
842
+ status VARCHAR(20) NOT NULL, -- PENDING, COMPLETED, FAILED
843
+ idempotency_key VARCHAR(255) UNIQUE, -- para replay-safety
844
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
845
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
846
+ deleted_at TIMESTAMP NULL
847
+ );
848
+
849
+ CREATE TABLE transaction_audit (
850
+ id UUID PRIMARY KEY,
851
+ transaction_id UUID REFERENCES transactions(id),
852
+ action VARCHAR(50),
853
+ user_id UUID,
854
+ old_value JSONB,
855
+ new_value JSONB,
856
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
857
+ );
858
+ \`\`\``;
859
+ } else if (enriched.domain.domain === 'healthtech') {
860
+ domainPatternsContent = `### Requisitos:
861
+ - **Criptografia:** Dados sensíveis criptografados em repouso
862
+ - **Anonimização:** Poder remover PII mantendo histórico
863
+ - **Retention:** Política de retenção de dados
864
+ - **Access Logs:** Quem acessou o que, quando
865
+ - **Consentimento:** Rastrear consentimento de paciente
866
+
867
+ ### Exemplo Schema:
868
+ \`\`\`sql
869
+ CREATE TABLE patients (
870
+ id UUID PRIMARY KEY,
871
+ name_encrypted BYTEA NOT NULL, -- criptografado
872
+ ssn_encrypted BYTEA NOT NULL,
873
+ created_at TIMESTAMP,
874
+ deleted_at TIMESTAMP NULL
875
+ );
876
+
877
+ CREATE TABLE access_logs (
878
+ id UUID PRIMARY KEY,
879
+ patient_id UUID REFERENCES patients(id),
880
+ accessed_by UUID REFERENCES users(id),
881
+ accessed_at TIMESTAMP,
882
+ data_type VARCHAR(50),
883
+ purpose VARCHAR(100)
884
+ );
885
+
886
+ CREATE TABLE consents (
887
+ id UUID PRIMARY KEY,
888
+ patient_id UUID REFERENCES patients(id),
889
+ type VARCHAR(50),
890
+ granted_at TIMESTAMP,
891
+ expires_at TIMESTAMP
892
+ );
893
+ \`\`\``;
894
+ } else if (enriched.domain.domain === 'e-commerce') {
895
+ domainPatternsContent = `### Requisitos:
896
+ - **Inventário:** Stock é crítico (race condition)
897
+ - **Preços:** Histórico de preço por produto
898
+ - **Pedidos:** Snapshot do preço no momento da venda
899
+ - **Cupons:** Validação e uso limitado
900
+ - **Pagamento:** Separado de pedido (pode estar pendente)
901
+
902
+ ### Exemplo Schema:
903
+ \`\`\`sql
904
+ CREATE TABLE products (
905
+ id UUID PRIMARY KEY,
906
+ name VARCHAR(255),
907
+ price DECIMAL(19,2), -- preço atual
908
+ stock INT DEFAULT 0
909
+ );
910
+
911
+ CREATE TABLE product_prices (
912
+ id UUID PRIMARY KEY,
913
+ product_id UUID REFERENCES products(id),
914
+ price DECIMAL(19,2),
915
+ effective_from TIMESTAMP,
916
+ effective_to TIMESTAMP NULL
917
+ );
918
+
919
+ CREATE TABLE orders (
920
+ id UUID PRIMARY KEY,
921
+ user_id UUID REFERENCES users(id),
922
+ total DECIMAL(19,2),
923
+ status VARCHAR(20),
924
+ created_at TIMESTAMP
925
+ );
926
+
927
+ CREATE TABLE order_items (
928
+ id UUID PRIMARY KEY,
929
+ order_id UUID REFERENCES orders(id),
930
+ product_id UUID REFERENCES products(id),
931
+ quantity INT,
932
+ price_at_purchase DECIMAL(19,2) -- snapshot
933
+ );
934
+ \`\`\``;
935
+ } else {
936
+ domainPatternsContent = `### Requisitos Genéricos:
937
+ - Timestamps: created_at, updated_at
938
+ - Soft deletes: deleted_at (se aplicável)
939
+ - Índices em ForeignKeys
940
+ - Constraints em integridade`;
941
+ }
942
+ }
943
+
944
+ const domainPatternsSection = enriched.domain
945
+ ? `
946
+ ## Padrões de Dados Específicos do Domínio: ${enriched.domain.domain}
947
+
948
+ ${domainPatternsContent}
949
+ `
950
+ : '';
951
+
952
+ // Compliance section
953
+ const complianceSection = enriched.domain && enriched.domain.compliance && enriched.domain.compliance.length > 0
954
+ ? `
955
+ ## Compliance & Dados
956
+
957
+ ${enriched.domain.compliance.map(c => `### ${c.name}
958
+ ${c.mandatoryChecks.map(check => `- □ ${check}`).join('\n')}
959
+ `).join('\n')}
960
+ `
961
+ : '';
962
+
963
+ return `---
964
+ antigravity:
965
+ trigger: 'on_demand'
966
+ description: 'Database Engineer — Schema, migrations, performance'
967
+ agent_card:
968
+ id: 'database-engineer'
969
+ name: 'Database Engineer'
970
+ role: 'development'
971
+ capabilities: [schema-design, migration-management, indexing, query-optimization]
972
+ inputs: [entity-model, business-rules, performance-requirements]
973
+ outputs: [migrations, indexes, seeds, query-optimization]
974
+ depends_on: []
975
+ version: 3.1.0
976
+ ---
977
+
978
+ # 🗄️ DATABASE ENGINEER
979
+
980
+ ${depthIndicator(ctx)}
981
+
982
+ > Schema design, migrations, e performance para ${projectName}
983
+ ${entitiesSection}${migrationStrategy}${indexingStrategy}${domainPatternsSection}${complianceSection}
984
+
985
+ ## Regras Gerais
986
+
987
+ \`\`\`
988
+ □ TODA migration deve ser reversível (up + down)
989
+ □ Índices para queries frequentes (validar com EXPLAIN)
990
+ □ Foreign keys onde há relacionamento
991
+ □ Constraints (NOT NULL, UNIQUE, CHECK) por negócio
992
+ □ Sem ALTER TABLE em tabelas grandes sem plano
993
+ □ Seed data atualizado para dev/test
994
+ □ Queries otimizadas (sem N+1, sem full scan)
995
+ □ Performance de migrations testada em staging
996
+ \`\`\`
997
+
998
+ ${crossRef('database-engineer', ctx)}
999
+
1000
+ ---
1001
+
1002
+ **Gerado por Architect v8.1**
1003
+ `;
1004
+ }
1005
+
1006
+ export function generateMobileAgent(ctx: TemplateContext | EnrichedTemplateContext): string {
1007
+ const { projectName, config, stack } = ctx;
1008
+ const enriched = getEnriched(ctx);
1009
+
1010
+ // Build endpoints for mobile integration
1011
+ const endpointsSection = enriched.endpoints && enriched.endpoints.length > 0
1012
+ ? `
1013
+ ## Endpoints para Integração Mobile
1014
+
1015
+ ${enriched.endpoints.slice(0, 12).map(e => `- \`${e.method}\` \`${e.path}\` — ${e.handler}`).join('\n')}
1016
+ ${enriched.endpoints.length > 12 ? `\n... e mais ${enriched.endpoints.length - 12} endpoints. Ver documento de integração.` : ''}
1017
+ `
1018
+ : '';
1019
+
1020
+ // Build modules structure
1021
+ const modulesSection = enriched.modules && enriched.modules.length > 0
1022
+ ? `
1023
+ ## Estrutura de Módulos
1024
+
1025
+ ${enriched.modules.map(m => `- \`${m.path}\` — ${m.description}`).join('\n')}
1026
+ `
1027
+ : '';
1028
+
1029
+ // Build domain-specific mobile considerations
1030
+ let domainMobileContent = '';
1031
+ if (enriched.domain) {
1032
+ if (enriched.domain.domain === 'fintech' || enriched.domain.domain === 'payments') {
1033
+ domainMobileContent = `### Screens Críticas:
1034
+ - **Carteira:** Saldo disponível, histórico de transações
1035
+ - **Enviar Dinheiro:** Validação de conta destino, confirmação
1036
+ - **Pagamentos:** 2FA, biometria, confirmação final
1037
+ - **Segurança:** Definir PIN, mudar senha, 2FA setup
1038
+
1039
+ ### Estados Especiais:
1040
+ - Offline: Mostrar saldo em cache, desabilitar transações
1041
+ - Sincronizando: Indicator de atualização
1042
+ - Erro de rede: Retry com backoff exponencial
1043
+ - Transação pendente: Status em tempo real`;
1044
+ } else if (enriched.domain.domain === 'healthtech') {
1045
+ domainMobileContent = `### Screens Críticas:
1046
+ - **Prontuário:** Histórico médico, medicações
1047
+ - **Agendamento:** Calendário, confirmação SMS
1048
+ - **Consulta:** Receitas, encaminhamentos
1049
+ - **Privacidade:** Consentimento, biometria
1050
+
1051
+ ### Estados Especiais:
1052
+ - Offline: Dados sincronizam quando online
1053
+ - Dados sensíveis: Sempre requer biometria
1054
+ - Consulta em andamento: Status em tempo real
1055
+ - Privacidade: Diálogos de consentimento antes de acessar`;
1056
+ } else if (enriched.domain.domain === 'e-commerce') {
1057
+ domainMobileContent = `### Screens Críticas:
1058
+ - **Catálogo:** Filtros, busca, avaliações
1059
+ - **Carrinho:** Quantidade, preço atualizado, cupom
1060
+ - **Checkout:** Endereço, cartão, 3D Secure
1061
+ - **Pedidos:** Status, rastreamento, devolução
1062
+
1063
+ ### Estados Especiais:
1064
+ - Offline: Carrinho em cache, sincroniza depois
1065
+ - Estoque zerado: Mostrar de forma clara
1066
+ - Frete: Calcular por CEP em tempo real
1067
+ - Promoção: Aplicar cupom com feedback imediato`;
1068
+ } else {
1069
+ domainMobileContent = `### Screens Padrão:
1070
+ - Lista: Com busca, filtro, paginação
1071
+ - Detalhe: Completo com ações
1072
+ - Formulário: Validação em tempo real
1073
+ - Confirmação: Antes de ação crítica
1074
+
1075
+ ### Estados Especiais:
1076
+ - Loading: Skeleton ou spinner
1077
+ - Empty: Mensagem clara
1078
+ - Error: Com retry
1079
+ - Offline: Modo read-only`;
1080
+ }
1081
+ }
1082
+
1083
+ const domainSection = enriched.domain
1084
+ ? `
1085
+ ## Considerações de UX por Domínio: ${enriched.domain.domain}
1086
+
1087
+ ${domainMobileContent}
1088
+ `
1089
+ : '';
1090
+
1091
+ return `---
1092
+ antigravity:
1093
+ trigger: 'on_demand'
1094
+ globs: ['**/*.dart']
1095
+ description: 'Flutter UI Developer — Screens, widgets, navegação'
1096
+ agent_card:
1097
+ id: 'flutter-ui-developer'
1098
+ name: 'Flutter UI Developer'
1099
+ role: 'development'
1100
+ capabilities: [screen-development, widget-composition, navigation, api-integration, state-management]
1101
+ inputs: [mockup, integration-doc, user-story]
1102
+ outputs: [screens, widgets, services, tests]
1103
+ depends_on: [orchestrator]
1104
+ version: 3.1.0
1105
+ ---
1106
+
1107
+ # 📱 FLUTTER UI DEVELOPER
1108
+
1109
+ ${depthIndicator(ctx)}
1110
+
1111
+ > Screens mobile, widgets, navegação para ${projectName}
1112
+
1113
+ ## Stack
1114
+
1115
+ - **Framework:** Flutter / Dart
1116
+ - **Package Manager:** ${stack.packageManager}
1117
+ - **Teste:** ${stack.testFramework}
1118
+
1119
+ ## Pré-Requisitos
1120
+
1121
+ \`\`\`
1122
+ □ MOCKUP do app aprovado (com todos os estados e fluxos)
1123
+ □ Documento de Integração disponível
1124
+ □ User stories com critérios de aceite
1125
+ □ Design system aprovado (cores, tipografia, componentes)
1126
+ \`\`\`
1127
+ ${modulesSection}${endpointsSection}${domainSection}
1128
+
1129
+ ## Regras
1130
+
1131
+ \`\`\`
1132
+ □ TODOS os estados: normal, loading, error, empty
1133
+ □ Padrão visual do app (cores, fontes, espaçamentos) consistente
1134
+ □ Navegação consistente (back button, deep link funcionando)
1135
+ □ Sem lógica de negócio em widgets (usar ChangeNotifier/Bloc)
1136
+ □ ListView.builder para listas longas (NUNCA Column com itens dinâmicos)
1137
+ □ Offline graceful quando aplicável (cache local)
1138
+ □ Imagens com lazy-load e placeholder
1139
+ □ Screens responsivas (testar orientação portrait + landscape)
1140
+ □ Acessibilidade (Semantics, labels)
1141
+ □ Cobertura ≥ ${config.coverageMinimum}%
1142
+ \`\`\`
1143
+
1144
+ ## Estrutura de Projeto
1145
+
1146
+ \`\`\`
1147
+ lib/
1148
+ ├── main.dart
1149
+ ├── models/
1150
+ │ └── [domain].dart
1151
+ ├── screens/
1152
+ │ └── [feature]/
1153
+ │ ├── [feature]_screen.dart
1154
+ │ └── widgets/
1155
+ │ └── [component].dart
1156
+ ├── services/
1157
+ │ └── api_service.dart
1158
+ └── __tests__/
1159
+ └── [feature]_test.dart
1160
+ \`\`\`
1161
+
1162
+ ${crossRef('flutter', ctx)}
1163
+
1164
+ ---
1165
+
1166
+ **Gerado por Architect v8.1**
1167
+ `;
1168
+ }