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