@girardelli/architect 2.2.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/README.md +105 -116
  2. package/architect-run.sh +431 -0
  3. package/assets/banner-v3.html +561 -0
  4. package/dist/agent-generator/context-enricher.d.ts +58 -0
  5. package/dist/agent-generator/context-enricher.d.ts.map +1 -0
  6. package/dist/agent-generator/context-enricher.js +613 -0
  7. package/dist/agent-generator/context-enricher.js.map +1 -0
  8. package/dist/agent-generator/domain-inferrer.d.ts +52 -0
  9. package/dist/agent-generator/domain-inferrer.d.ts.map +1 -0
  10. package/dist/agent-generator/domain-inferrer.js +585 -0
  11. package/dist/agent-generator/domain-inferrer.js.map +1 -0
  12. package/dist/agent-generator/framework-detector.d.ts +40 -0
  13. package/dist/agent-generator/framework-detector.d.ts.map +1 -0
  14. package/dist/agent-generator/framework-detector.js +611 -0
  15. package/dist/agent-generator/framework-detector.js.map +1 -0
  16. package/dist/agent-generator/index.d.ts +47 -0
  17. package/dist/agent-generator/index.d.ts.map +1 -0
  18. package/dist/agent-generator/index.js +545 -0
  19. package/dist/agent-generator/index.js.map +1 -0
  20. package/dist/agent-generator/stack-detector.d.ts +14 -0
  21. package/dist/agent-generator/stack-detector.d.ts.map +1 -0
  22. package/dist/agent-generator/stack-detector.js +124 -0
  23. package/dist/agent-generator/stack-detector.js.map +1 -0
  24. package/dist/agent-generator/templates/core/agents.d.ts +17 -0
  25. package/dist/agent-generator/templates/core/agents.d.ts.map +1 -0
  26. package/dist/agent-generator/templates/core/agents.js +1256 -0
  27. package/dist/agent-generator/templates/core/agents.js.map +1 -0
  28. package/dist/agent-generator/templates/core/architecture-rules.d.ts +7 -0
  29. package/dist/agent-generator/templates/core/architecture-rules.d.ts.map +1 -0
  30. package/dist/agent-generator/templates/core/architecture-rules.js +274 -0
  31. package/dist/agent-generator/templates/core/architecture-rules.js.map +1 -0
  32. package/dist/agent-generator/templates/core/general-rules.d.ts +8 -0
  33. package/dist/agent-generator/templates/core/general-rules.d.ts.map +1 -0
  34. package/dist/agent-generator/templates/core/general-rules.js +301 -0
  35. package/dist/agent-generator/templates/core/general-rules.js.map +1 -0
  36. package/dist/agent-generator/templates/core/hooks-generator.d.ts +21 -0
  37. package/dist/agent-generator/templates/core/hooks-generator.d.ts.map +1 -0
  38. package/dist/agent-generator/templates/core/hooks-generator.js +233 -0
  39. package/dist/agent-generator/templates/core/hooks-generator.js.map +1 -0
  40. package/dist/agent-generator/templates/core/index-md.d.ts +7 -0
  41. package/dist/agent-generator/templates/core/index-md.d.ts.map +1 -0
  42. package/dist/agent-generator/templates/core/index-md.js +246 -0
  43. package/dist/agent-generator/templates/core/index-md.js.map +1 -0
  44. package/dist/agent-generator/templates/core/orchestrator.d.ts +8 -0
  45. package/dist/agent-generator/templates/core/orchestrator.d.ts.map +1 -0
  46. package/dist/agent-generator/templates/core/orchestrator.js +422 -0
  47. package/dist/agent-generator/templates/core/orchestrator.js.map +1 -0
  48. package/dist/agent-generator/templates/core/preflight.d.ts +8 -0
  49. package/dist/agent-generator/templates/core/preflight.d.ts.map +1 -0
  50. package/dist/agent-generator/templates/core/preflight.js +213 -0
  51. package/dist/agent-generator/templates/core/preflight.js.map +1 -0
  52. package/dist/agent-generator/templates/core/quality-gates.d.ts +11 -0
  53. package/dist/agent-generator/templates/core/quality-gates.d.ts.map +1 -0
  54. package/dist/agent-generator/templates/core/quality-gates.js +254 -0
  55. package/dist/agent-generator/templates/core/quality-gates.js.map +1 -0
  56. package/dist/agent-generator/templates/core/security-rules.d.ts +7 -0
  57. package/dist/agent-generator/templates/core/security-rules.d.ts.map +1 -0
  58. package/dist/agent-generator/templates/core/security-rules.js +528 -0
  59. package/dist/agent-generator/templates/core/security-rules.js.map +1 -0
  60. package/dist/agent-generator/templates/core/skills-generator.d.ts +19 -0
  61. package/dist/agent-generator/templates/core/skills-generator.d.ts.map +1 -0
  62. package/dist/agent-generator/templates/core/skills-generator.js +546 -0
  63. package/dist/agent-generator/templates/core/skills-generator.js.map +1 -0
  64. package/dist/agent-generator/templates/core/workflow-fix-bug.d.ts +7 -0
  65. package/dist/agent-generator/templates/core/workflow-fix-bug.d.ts.map +1 -0
  66. package/dist/agent-generator/templates/core/workflow-fix-bug.js +237 -0
  67. package/dist/agent-generator/templates/core/workflow-fix-bug.js.map +1 -0
  68. package/dist/agent-generator/templates/core/workflow-new-feature.d.ts +8 -0
  69. package/dist/agent-generator/templates/core/workflow-new-feature.d.ts.map +1 -0
  70. package/dist/agent-generator/templates/core/workflow-new-feature.js +321 -0
  71. package/dist/agent-generator/templates/core/workflow-new-feature.js.map +1 -0
  72. package/dist/agent-generator/templates/core/workflow-review.d.ts +7 -0
  73. package/dist/agent-generator/templates/core/workflow-review.d.ts.map +1 -0
  74. package/dist/agent-generator/templates/core/workflow-review.js +104 -0
  75. package/dist/agent-generator/templates/core/workflow-review.js.map +1 -0
  76. package/dist/agent-generator/templates/domain/index.d.ts +22 -0
  77. package/dist/agent-generator/templates/domain/index.d.ts.map +1 -0
  78. package/dist/agent-generator/templates/domain/index.js +1176 -0
  79. package/dist/agent-generator/templates/domain/index.js.map +1 -0
  80. package/dist/agent-generator/templates/stack/index.d.ts +8 -0
  81. package/dist/agent-generator/templates/stack/index.d.ts.map +1 -0
  82. package/dist/agent-generator/templates/stack/index.js +695 -0
  83. package/dist/agent-generator/templates/stack/index.js.map +1 -0
  84. package/dist/agent-generator/templates/template-helpers.d.ts +75 -0
  85. package/dist/agent-generator/templates/template-helpers.d.ts.map +1 -0
  86. package/dist/agent-generator/templates/template-helpers.js +726 -0
  87. package/dist/agent-generator/templates/template-helpers.js.map +1 -0
  88. package/dist/agent-generator/types.d.ts +196 -0
  89. package/dist/agent-generator/types.d.ts.map +1 -0
  90. package/dist/agent-generator/types.js +27 -0
  91. package/dist/agent-generator/types.js.map +1 -0
  92. package/dist/analyzer.d.ts +5 -0
  93. package/dist/analyzer.d.ts.map +1 -1
  94. package/dist/analyzer.js +46 -5
  95. package/dist/analyzer.js.map +1 -1
  96. package/dist/analyzers/forecast.d.ts +85 -0
  97. package/dist/analyzers/forecast.d.ts.map +1 -0
  98. package/dist/analyzers/forecast.js +337 -0
  99. package/dist/analyzers/forecast.js.map +1 -0
  100. package/dist/analyzers/git-cache.d.ts +7 -0
  101. package/dist/analyzers/git-cache.d.ts.map +1 -0
  102. package/dist/analyzers/git-cache.js +41 -0
  103. package/dist/analyzers/git-cache.js.map +1 -0
  104. package/dist/analyzers/git-history.d.ts +113 -0
  105. package/dist/analyzers/git-history.d.ts.map +1 -0
  106. package/dist/analyzers/git-history.js +333 -0
  107. package/dist/analyzers/git-history.js.map +1 -0
  108. package/dist/analyzers/index.d.ts +10 -0
  109. package/dist/analyzers/index.d.ts.map +1 -0
  110. package/dist/analyzers/index.js +7 -0
  111. package/dist/analyzers/index.js.map +1 -0
  112. package/dist/analyzers/temporal-scorer.d.ts +72 -0
  113. package/dist/analyzers/temporal-scorer.d.ts.map +1 -0
  114. package/dist/analyzers/temporal-scorer.js +140 -0
  115. package/dist/analyzers/temporal-scorer.js.map +1 -0
  116. package/dist/anti-patterns.d.ts +7 -0
  117. package/dist/anti-patterns.d.ts.map +1 -1
  118. package/dist/anti-patterns.js +25 -6
  119. package/dist/anti-patterns.js.map +1 -1
  120. package/dist/cli.d.ts +2 -3
  121. package/dist/cli.d.ts.map +1 -1
  122. package/dist/cli.js +275 -113
  123. package/dist/cli.js.map +1 -1
  124. package/dist/config.d.ts +6 -0
  125. package/dist/config.d.ts.map +1 -1
  126. package/dist/config.js +48 -11
  127. package/dist/config.js.map +1 -1
  128. package/dist/html-reporter.d.ts +3 -1
  129. package/dist/html-reporter.d.ts.map +1 -1
  130. package/dist/html-reporter.js +248 -12
  131. package/dist/html-reporter.js.map +1 -1
  132. package/dist/index.d.ts +16 -3
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +63 -4
  135. package/dist/index.js.map +1 -1
  136. package/dist/project-summarizer.d.ts +38 -0
  137. package/dist/project-summarizer.d.ts.map +1 -0
  138. package/dist/project-summarizer.js +463 -0
  139. package/dist/project-summarizer.js.map +1 -0
  140. package/dist/refactor-reporter.js +1 -1
  141. package/dist/scanner.d.ts +8 -2
  142. package/dist/scanner.d.ts.map +1 -1
  143. package/dist/scanner.js +153 -113
  144. package/dist/scanner.js.map +1 -1
  145. package/dist/scorer.d.ts.map +1 -1
  146. package/dist/scorer.js +24 -11
  147. package/dist/scorer.js.map +1 -1
  148. package/dist/types.d.ts +29 -0
  149. package/dist/types.d.ts.map +1 -1
  150. package/package.json +12 -3
  151. package/src/agent-generator/context-enricher.ts +672 -0
  152. package/src/agent-generator/domain-inferrer.ts +635 -0
  153. package/src/agent-generator/framework-detector.ts +669 -0
  154. package/src/agent-generator/index.ts +634 -0
  155. package/src/agent-generator/stack-detector.ts +115 -0
  156. package/src/agent-generator/templates/core/agents.ts +1296 -0
  157. package/src/agent-generator/templates/core/architecture-rules.ts +287 -0
  158. package/src/agent-generator/templates/core/general-rules.ts +306 -0
  159. package/src/agent-generator/templates/core/hooks-generator.ts +242 -0
  160. package/src/agent-generator/templates/core/index-md.ts +260 -0
  161. package/src/agent-generator/templates/core/orchestrator.ts +459 -0
  162. package/src/agent-generator/templates/core/preflight.ts +215 -0
  163. package/src/agent-generator/templates/core/quality-gates.ts +256 -0
  164. package/src/agent-generator/templates/core/security-rules.ts +543 -0
  165. package/src/agent-generator/templates/core/skills-generator.ts +585 -0
  166. package/src/agent-generator/templates/core/workflow-fix-bug.ts +239 -0
  167. package/src/agent-generator/templates/core/workflow-new-feature.ts +323 -0
  168. package/src/agent-generator/templates/core/workflow-review.ts +106 -0
  169. package/src/agent-generator/templates/domain/index.ts +1201 -0
  170. package/src/agent-generator/templates/stack/index.ts +705 -0
  171. package/src/agent-generator/templates/template-helpers.ts +776 -0
  172. package/src/agent-generator/types.ts +232 -0
  173. package/src/analyzer.ts +51 -5
  174. package/src/analyzers/forecast.ts +496 -0
  175. package/src/analyzers/git-cache.ts +52 -0
  176. package/src/analyzers/git-history.ts +488 -0
  177. package/src/analyzers/index.ts +33 -0
  178. package/src/analyzers/temporal-scorer.ts +227 -0
  179. package/src/anti-patterns.ts +29 -6
  180. package/src/cli.ts +316 -117
  181. package/src/config.ts +52 -11
  182. package/src/html-reporter.ts +263 -13
  183. package/src/index.ts +93 -10
  184. package/src/project-summarizer.ts +521 -0
  185. package/src/refactor-reporter.ts +1 -1
  186. package/src/scanner.ts +136 -90
  187. package/src/scorer.ts +26 -11
  188. package/src/types.ts +27 -0
  189. package/tests/agent-generator.test.ts +427 -0
  190. package/tests/analyzers-integration.test.ts +174 -0
  191. package/tests/architect-adapter-enrichment.test.ts +9 -0
  192. package/tests/context-enricher.test.ts +971 -0
  193. package/tests/fixtures/monorepo/package.json +6 -0
  194. package/tests/fixtures/monorepo/packages/app/package.json +12 -0
  195. package/tests/fixtures/monorepo/packages/app/src/index.ts +6 -0
  196. package/tests/fixtures/monorepo/packages/core/package.json +7 -0
  197. package/tests/fixtures/monorepo/packages/core/src/index.ts +7 -0
  198. package/tests/forecast.test.ts +509 -0
  199. package/tests/framework-detector.test.ts +1172 -0
  200. package/tests/git-history.test.ts +254 -0
  201. package/tests/monorepo-scan.test.ts +170 -0
  202. package/tests/scanner.test.ts +7 -8
  203. package/tests/scorer.test.ts +594 -0
  204. package/tests/stack-detector.test.ts +241 -0
  205. package/tests/template-generation.test.ts +706 -0
  206. package/tests/template-helpers.test.ts +1152 -0
  207. package/tests/temporal-scorer.test.ts +307 -0
  208. package/dist/agent-generator.d.ts +0 -106
  209. package/dist/agent-generator.d.ts.map +0 -1
  210. package/dist/agent-generator.js +0 -1398
  211. package/dist/agent-generator.js.map +0 -1
  212. package/src/agent-generator.ts +0 -1526
@@ -1,1526 +0,0 @@
1
- import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, statSync } from 'fs';
2
- import { join } from 'path';
3
- import { AnalysisReport, RefactoringPlan } from './types.js';
4
-
5
- /**
6
- * Stack detection result from project analysis.
7
- */
8
- export interface StackInfo {
9
- primary: string;
10
- languages: string[];
11
- frameworks: string[];
12
- hasBackend: boolean;
13
- hasFrontend: boolean;
14
- hasMobile: boolean;
15
- hasDatabase: boolean;
16
- testFramework: string;
17
- packageManager: string;
18
- }
19
-
20
- /**
21
- * Audit finding for existing agent directories.
22
- */
23
- export interface AgentAuditFinding {
24
- type: 'MISSING' | 'OUTDATED' | 'IMPROVEMENT' | 'OK';
25
- category: string;
26
- file: string;
27
- description: string;
28
- suggestion?: string;
29
- }
30
-
31
- /**
32
- * Status of each agent system item relative to existing .agent/ directory.
33
- */
34
- export type AgentItemStatus = 'KEEP' | 'MODIFY' | 'CREATE' | 'DELETE';
35
-
36
- export interface AgentItem {
37
- name: string;
38
- status: AgentItemStatus;
39
- reason?: string;
40
- description?: string;
41
- }
42
-
43
- /**
44
- * Result from suggest() — no files written, just recommendations.
45
- */
46
- export interface AgentSuggestion {
47
- stack: StackInfo;
48
- hasExistingAgents: boolean;
49
- suggestedAgents: AgentItem[];
50
- suggestedRules: AgentItem[];
51
- suggestedGuards: AgentItem[];
52
- suggestedWorkflows: AgentItem[];
53
- suggestedSkills: { name: string; source: string; description: string; status: AgentItemStatus }[];
54
- audit: AgentAuditFinding[];
55
- command: string;
56
- }
57
-
58
- /**
59
- * Agent Generator — Creates or audits .agent/ directories
60
- * customized to the analyzed project's stack and architecture.
61
- */
62
- export class AgentGenerator {
63
- private stack!: StackInfo;
64
- private report!: AnalysisReport;
65
- private plan!: RefactoringPlan;
66
-
67
- /**
68
- * Suggest agents without writing files — for unified report.
69
- */
70
- suggest(
71
- report: AnalysisReport,
72
- plan: RefactoringPlan,
73
- projectPath: string,
74
- ): AgentSuggestion {
75
- this.report = report;
76
- this.plan = plan;
77
- this.stack = this.detectStack(report);
78
-
79
- const agentDir = join(projectPath, '.agent');
80
- const isExisting = existsSync(agentDir);
81
-
82
- // Helper: scan existing files in a subdirectory
83
- const existingFiles = (subdir: string): Set<string> => {
84
- const dir = join(agentDir, subdir);
85
- if (!existsSync(dir)) return new Set();
86
- return new Set(readdirSync(dir).map(f => f.replace(/\.md$/, '')));
87
- };
88
-
89
- // Helper: determine status for an item
90
- const itemStatus = (name: string, existingSet: Set<string>, auditFindings: AgentAuditFinding[]): AgentItemStatus => {
91
- // Check if a matching file exists (case-insensitive comparison)
92
- const found = [...existingSet].some(e => e.toLowerCase() === name.toLowerCase());
93
- if (!found) return 'CREATE';
94
-
95
- // Exists — check if audit flagged it for improvement
96
- const hasImprovement = auditFindings.some(
97
- f => f.file.toLowerCase().includes(name.toLowerCase()) && (f.type === 'IMPROVEMENT' || f.type === 'OUTDATED')
98
- );
99
- return hasImprovement ? 'MODIFY' : 'KEEP';
100
- };
101
-
102
- // Build suggested agents with descriptions
103
- const agentDefs: { name: string; desc: string }[] = [
104
- { name: 'AGENT-ORCHESTRATOR', desc: 'Coordena todos os agentes, decompõe requisições e consolida entregas' },
105
- ];
106
- if (this.stack.hasBackend) agentDefs.push({
107
- name: `${this.stack.primary.toUpperCase()}-BACKEND-DEVELOPER`,
108
- desc: `Especialista em arquitetura ${this.stack.primary}, APIs, serviços e lógica de negócio`,
109
- });
110
- if (this.stack.hasFrontend) {
111
- const fw = this.stack.frameworks.find(f =>
112
- ['Angular', 'Vue', 'Next.js', 'React'].includes(f)) || 'FRONTEND';
113
- agentDefs.push({
114
- name: `${fw.toUpperCase().replace('.', '')}-FRONTEND-DEVELOPER`,
115
- desc: `Desenvolve componentes ${fw}, gerencia estado e garante UX responsiva`,
116
- });
117
- }
118
- if (this.stack.hasMobile) agentDefs.push({
119
- name: 'FLUTTER-UI-DEVELOPER',
120
- desc: 'Screens mobile, widgets, navegação e integração com APIs',
121
- });
122
- if (this.stack.hasDatabase) agentDefs.push({
123
- name: 'DATABASE-ENGINEER',
124
- desc: 'Schema design, migrations, indexação e performance de queries',
125
- });
126
- agentDefs.push(
127
- { name: 'SECURITY-AUDITOR', desc: 'Análise de ameaças, compliance LGPD/OWASP e prevenção de vulnerabilidades' },
128
- { name: 'QA-TEST-ENGINEER', desc: 'Planos de teste, cobertura mínima, BDD/TDD e testes de regressão' },
129
- { name: 'TECH-DEBT-CONTROLLER', desc: 'Controle de débito técnico, priorização de refatorações e metas de score' },
130
- );
131
-
132
- const ruleDefs: { name: string; desc: string }[] = [
133
- { name: '00-general', desc: 'Convenções de código, nomenclatura, commits e princípios gerais' },
134
- { name: '01-architecture', desc: 'Separação de camadas, dependency rules e padrões de módulo' },
135
- { name: '02-security', desc: 'Sanitização de inputs, secrets management e validação de dados' },
136
- ];
137
- if (this.stack.hasBackend) ruleDefs.push({
138
- name: `03-${this.stack.primary.toLowerCase()}`,
139
- desc: `Padrões específicos de ${this.stack.primary}: framework conventions e anti-patterns`,
140
- });
141
-
142
- const guardDefs: { name: string; desc: string }[] = [
143
- { name: 'PREFLIGHT', desc: 'Checklist pré-ação: branch, build, testes antes de qualquer mudança' },
144
- { name: 'QUALITY-GATES', desc: 'Score mínimo, cobertura, zero warnings e critérios de merge' },
145
- { name: 'CODE-REVIEW-CHECKLIST', desc: 'Pontos obrigatórios de revisão: segurança, performance, legibilidade' },
146
- ];
147
-
148
- const workflowDefs: { name: string; desc: string }[] = [
149
- { name: 'develop', desc: 'Fluxo completo: branch → mockup → spec → code → test → review → merge' },
150
- { name: 'fix-bug', desc: 'Diagnóstico → reprodução → root cause → fix → teste de regressão' },
151
- { name: 'review', desc: 'Code review estruturado com checklist de qualidade e segurança' },
152
- ];
153
-
154
- // Run audit first to inform status
155
- let audit: AgentAuditFinding[] = [];
156
- if (isExisting) {
157
- audit = this.auditExisting(agentDir);
158
- }
159
-
160
- // Get existing files
161
- const existingAgents = existingFiles('agents');
162
- const existingRules = existingFiles('rules');
163
- const existingGuards = existingFiles('guards');
164
- const existingWorkflows = existingFiles('workflows');
165
- const existingSkillsDir = join(agentDir, 'skills');
166
- const existingSkillNames = existsSync(existingSkillsDir)
167
- ? new Set(readdirSync(existingSkillsDir).filter(f => {
168
- try { return statSync(join(existingSkillsDir, f)).isDirectory(); } catch { return false; }
169
- }))
170
- : new Set<string>();
171
-
172
- // Build items with status and description
173
- const suggestedAgents: AgentItem[] = agentDefs.map(({ name, desc }) => ({
174
- name,
175
- status: itemStatus(name, existingAgents, audit),
176
- description: desc,
177
- }));
178
-
179
- // Detect files that exist but are NOT suggested → KEEP (custom)
180
- for (const existing of existingAgents) {
181
- if (!agentDefs.some(d => d.name.toLowerCase() === existing.toLowerCase())) {
182
- suggestedAgents.push({ name: existing, status: 'KEEP', reason: 'Custom agent', description: 'Agente customizado do projeto' });
183
- }
184
- }
185
-
186
- const suggestedRules: AgentItem[] = ruleDefs.map(({ name, desc }) => ({
187
- name,
188
- status: itemStatus(name, existingRules, audit),
189
- description: desc,
190
- }));
191
- for (const existing of existingRules) {
192
- if (!ruleDefs.some(d => d.name.toLowerCase() === existing.toLowerCase())) {
193
- suggestedRules.push({ name: existing, status: 'KEEP', reason: 'Custom rule', description: 'Regra customizada do projeto' });
194
- }
195
- }
196
-
197
- const suggestedGuards: AgentItem[] = guardDefs.map(({ name, desc }) => ({
198
- name,
199
- status: itemStatus(name, existingGuards, audit),
200
- description: desc,
201
- }));
202
-
203
- const suggestedWorkflows: AgentItem[] = workflowDefs.map(({ name, desc }) => ({
204
- name,
205
- status: itemStatus(name, existingWorkflows, audit),
206
- description: desc,
207
- }));
208
- for (const existing of existingWorkflows) {
209
- if (!workflowDefs.some(d => d.name.toLowerCase() === existing.toLowerCase())) {
210
- suggestedWorkflows.push({ name: existing, status: 'KEEP', reason: 'Custom workflow', description: 'Workflow customizado do projeto' });
211
- }
212
- }
213
-
214
- // Skills
215
- const skillEntries: { name: string; source: string; description: string; status: AgentItemStatus }[] = [
216
- { name: 'test-driven-development', source: 'anthropic/courses/test-driven-development', description: 'TDD workflow: Red → Green → Refactor', status: 'CREATE' as AgentItemStatus },
217
- { name: 'systematic-debugging', source: 'anthropic/courses/systematic-debugging', description: 'Structured debugging methodology', status: 'CREATE' as AgentItemStatus },
218
- { name: 'code-review', source: 'anthropic/courses/requesting-code-review', description: 'Code review best practices', status: 'CREATE' as AgentItemStatus },
219
- { name: 'security-best-practices', source: 'anthropic/courses/security-best-practices', description: 'Security patterns and vulnerability prevention', status: 'CREATE' as AgentItemStatus },
220
- { name: 'performance-optimization', source: 'anthropic/courses/performance-optimization', description: 'Performance analysis and optimization', status: 'CREATE' as AgentItemStatus },
221
- { name: 'git-workflow', source: 'anthropic/courses/git-workflow', description: 'Git branching, commits, and collaboration', status: 'CREATE' as AgentItemStatus },
222
- ];
223
-
224
- if (this.stack.languages.includes('TypeScript') || this.stack.languages.includes('JavaScript')) {
225
- skillEntries.push(
226
- { name: 'next-best-practices', source: 'vercel-labs/skills/next-best-practices', description: 'Next.js patterns and performance', status: 'CREATE' as AgentItemStatus },
227
- { name: 'api-design-principles', source: 'anthropic/courses/api-design-principles', description: 'REST/GraphQL API design', status: 'CREATE' as AgentItemStatus },
228
- );
229
- }
230
- if (this.stack.frameworks.includes('Angular') || this.stack.frameworks.includes('Vue') || this.stack.frameworks.includes('React') || this.stack.frameworks.includes('Next.js')) {
231
- skillEntries.push(
232
- { name: 'frontend-design', source: 'anthropic/courses/frontend-design', description: 'Modern frontend patterns and UI/UX', status: 'CREATE' as AgentItemStatus },
233
- { name: 'web-accessibility', source: 'anthropic/courses/web-accessibility', description: 'WCAG accessibility standards', status: 'CREATE' as AgentItemStatus },
234
- { name: 'ui-ux-pro-max', source: 'anthropic/courses/ui-ux-pro-max', description: '50 styles, 21 palettes, 50 font pairings', status: 'CREATE' as AgentItemStatus },
235
- );
236
- }
237
- if (this.stack.frameworks.includes('Vue')) {
238
- skillEntries.push(
239
- { name: 'vue-best-practices', source: 'anthropic/courses/vue-best-practices', description: 'Vue.js composition API and patterns', status: 'CREATE' as AgentItemStatus },
240
- );
241
- }
242
- if (this.stack.languages.includes('Dart') || this.stack.frameworks.includes('Flutter')) {
243
- skillEntries.push(
244
- { name: 'flutter-animations', source: 'anthropic/courses/flutter-animations', description: 'Flutter animation patterns', status: 'CREATE' as AgentItemStatus },
245
- );
246
- }
247
- if (this.stack.languages.includes('Python')) {
248
- skillEntries.push(
249
- { name: 'python-performance', source: 'anthropic/courses/python-performance-optimization', description: 'Python optimization and profiling', status: 'CREATE' as AgentItemStatus },
250
- );
251
- }
252
- if (this.stack.hasDatabase) {
253
- skillEntries.push(
254
- { name: 'database-schema-design', source: 'anthropic/courses/database-schema-design', description: 'Schema design, indexing, migrations', status: 'CREATE' as AgentItemStatus },
255
- );
256
- }
257
-
258
- // Update skill status based on existing skills directory
259
- for (const skill of skillEntries) {
260
- if (existingSkillNames.has(skill.name)) {
261
- skill.status = 'KEEP';
262
- }
263
- }
264
-
265
- return {
266
- stack: this.stack,
267
- hasExistingAgents: isExisting,
268
- suggestedAgents,
269
- suggestedRules,
270
- suggestedGuards,
271
- suggestedWorkflows,
272
- suggestedSkills: skillEntries,
273
- audit,
274
- command: `architect agents ${projectPath}`,
275
- };
276
- }
277
-
278
- /**
279
- * Main entry: generate or audit .agent/ for a project.
280
- */
281
- generate(
282
- report: AnalysisReport,
283
- plan: RefactoringPlan,
284
- projectPath: string,
285
- outputDir?: string
286
- ): { generated: string[]; audit: AgentAuditFinding[] } {
287
- this.report = report;
288
- this.plan = plan;
289
- this.stack = this.detectStack(report);
290
-
291
- const agentDir = outputDir || join(projectPath, '.agent');
292
- const isExisting = existsSync(agentDir);
293
-
294
- if (isExisting) {
295
- const audit = this.auditExisting(agentDir);
296
- const generated = this.generateMissing(agentDir, audit);
297
- return { generated, audit };
298
- }
299
-
300
- const generated = this.generateFull(agentDir);
301
- return { generated, audit: [] };
302
- }
303
-
304
- /**
305
- * Detect technology stack from the analysis report.
306
- */
307
- private detectStack(report: AnalysisReport): StackInfo {
308
- const files = report.dependencyGraph.nodes;
309
- const extensions = new Set<string>();
310
- const languages = new Set<string>();
311
- const frameworks = new Set<string>();
312
-
313
- for (const file of files) {
314
- const ext = file.split('.').pop()?.toLowerCase() || '';
315
- extensions.add(ext);
316
- }
317
-
318
- // Detect languages
319
- if (extensions.has('py')) languages.add('Python');
320
- if (extensions.has('ts') || extensions.has('tsx')) languages.add('TypeScript');
321
- if (extensions.has('js') || extensions.has('jsx')) languages.add('JavaScript');
322
- if (extensions.has('dart')) languages.add('Dart');
323
- if (extensions.has('go')) languages.add('Go');
324
- if (extensions.has('rs')) languages.add('Rust');
325
- if (extensions.has('java') || extensions.has('kt')) languages.add('Java/Kotlin');
326
- if (extensions.has('rb')) languages.add('Ruby');
327
- if (extensions.has('php')) languages.add('PHP');
328
- if (extensions.has('cs')) languages.add('C#');
329
-
330
- // Detect frameworks from file patterns
331
- const allFiles = files.join(' ');
332
- if (allFiles.includes('manage.py') || allFiles.includes('django')) frameworks.add('Django');
333
- if (allFiles.includes('flask') || allFiles.includes('app.py')) frameworks.add('Flask');
334
- if (allFiles.includes('fastapi')) frameworks.add('FastAPI');
335
- if (allFiles.includes('.module.ts') || allFiles.includes('nest')) frameworks.add('NestJS');
336
- if (allFiles.includes('.component.ts') || allFiles.includes('angular')) frameworks.add('Angular');
337
- if (allFiles.includes('.vue')) frameworks.add('Vue');
338
- if (allFiles.includes('.tsx') && allFiles.includes('next')) frameworks.add('Next.js');
339
- if (allFiles.includes('.dart')) frameworks.add('Flutter');
340
- if (allFiles.includes('go.mod')) frameworks.add('Go Modules');
341
- if (allFiles.includes('Cargo.toml')) frameworks.add('Cargo');
342
- if (allFiles.includes('pom.xml') || allFiles.includes('build.gradle')) frameworks.add('Spring');
343
-
344
- const primary = languages.size > 0 ? [...languages][0] : 'Unknown';
345
- const hasBackend = languages.has('Python') || languages.has('TypeScript') ||
346
- languages.has('Go') || languages.has('Java/Kotlin') || languages.has('Ruby') || languages.has('PHP');
347
- const hasFrontend = frameworks.has('Angular') || frameworks.has('Vue') ||
348
- frameworks.has('Next.js') || extensions.has('html');
349
- const hasMobile = languages.has('Dart') || frameworks.has('Flutter');
350
- const hasDatabase = allFiles.includes('migration') || allFiles.includes('entity') ||
351
- allFiles.includes('model') || allFiles.includes('schema');
352
-
353
- let testFramework = 'Jest';
354
- if (languages.has('Python')) testFramework = 'pytest';
355
- if (languages.has('Go')) testFramework = 'go test';
356
- if (languages.has('Dart')) testFramework = 'flutter_test';
357
-
358
- let packageManager = 'npm';
359
- if (languages.has('Python')) packageManager = 'pip';
360
- if (languages.has('Go')) packageManager = 'go mod';
361
- if (languages.has('Dart')) packageManager = 'pub';
362
-
363
- return {
364
- primary, languages: [...languages], frameworks: [...frameworks],
365
- hasBackend, hasFrontend, hasMobile, hasDatabase,
366
- testFramework, packageManager,
367
- };
368
- }
369
-
370
- // ── Audit Existing ──
371
-
372
- private auditExisting(agentDir: string): AgentAuditFinding[] {
373
- const findings: AgentAuditFinding[] = [];
374
-
375
- const checkExists = (subpath: string, category: string, desc: string): void => {
376
- const full = join(agentDir, subpath);
377
- if (!existsSync(full)) {
378
- findings.push({ type: 'MISSING', category, file: subpath, description: desc });
379
- } else {
380
- findings.push({ type: 'OK', category, file: subpath, description: `${subpath} exists` });
381
- }
382
- };
383
-
384
- // Check required structure
385
- checkExists('INDEX.md', 'core', 'Index file for agent navigation');
386
- checkExists('agents/AGENT-ORCHESTRATOR.md', 'agents', 'Orchestrator agent');
387
- checkExists('rules/00-general.md', 'rules', 'General rules');
388
- checkExists('guards/PREFLIGHT.md', 'guards', 'Preflight checklist');
389
- checkExists('workflows/develop.md', 'workflows', 'Development workflow');
390
-
391
- // Check stack-specific agents
392
- if (this.stack.hasBackend) {
393
- const backendAgent = this.findAgentByRole(agentDir, 'backend');
394
- if (!backendAgent) {
395
- findings.push({
396
- type: 'MISSING', category: 'agents',
397
- file: `agents/${this.stack.primary.toUpperCase()}-BACKEND-DEVELOPER.md`,
398
- description: `No backend developer agent for ${this.stack.primary}`,
399
- suggestion: `Create a ${this.stack.primary} backend agent with patterns, conventions, and architecture rules`,
400
- });
401
- }
402
- }
403
-
404
- if (this.stack.hasFrontend) {
405
- const frontAgent = this.findAgentByRole(agentDir, 'frontend');
406
- if (!frontAgent) {
407
- findings.push({
408
- type: 'MISSING', category: 'agents',
409
- file: 'agents/FRONTEND-DEVELOPER.md',
410
- description: 'No frontend developer agent',
411
- suggestion: `Create a frontend agent for ${this.stack.frameworks.join(', ')}`,
412
- });
413
- }
414
- }
415
-
416
- // Check for tech debt alignment
417
- if (this.plan.steps.length > 0) {
418
- const techDebtAgent = this.findAgentByRole(agentDir, 'tech-debt');
419
- if (!techDebtAgent) {
420
- findings.push({
421
- type: 'IMPROVEMENT', category: 'agents',
422
- file: 'agents/TECH-DEBT-CONTROLLER.md',
423
- description: `${this.plan.steps.length} refactoring steps found but no Tech Debt agent`,
424
- suggestion: 'Create a Tech Debt Controller with the refactoring backlog',
425
- });
426
- }
427
- }
428
-
429
- // Check quality gates match score
430
- if (this.report.score.overall < 80) {
431
- findings.push({
432
- type: 'IMPROVEMENT', category: 'guards',
433
- file: 'guards/QUALITY-GATES.md',
434
- description: `Score is ${this.report.score.overall}/100 — quality gates should enforce improvement`,
435
- suggestion: `Set minimum score threshold to ${this.report.score.overall + 5} and add regression guards`,
436
- });
437
- }
438
-
439
- // Check anti-pattern rules
440
- for (const ap of this.report.antiPatterns) {
441
- findings.push({
442
- type: 'IMPROVEMENT', category: 'rules',
443
- file: `rules/anti-pattern-${ap.name.toLowerCase().replace(/\s+/g, '-')}.md`,
444
- description: `Anti-pattern "${ap.name}" (${ap.severity}) detected but no prevention rule`,
445
- suggestion: `Add a rule to prevent "${ap.name}" from recurring`,
446
- });
447
- }
448
-
449
- return findings;
450
- }
451
-
452
- private findAgentByRole(agentDir: string, role: string): string | null {
453
- const agentsDir = join(agentDir, 'agents');
454
- if (!existsSync(agentsDir)) return null;
455
-
456
- const files = readdirSync(agentsDir);
457
- for (const file of files) {
458
- const content = readFileSync(join(agentsDir, file), 'utf-8').toLowerCase();
459
- if (content.includes(role)) return file;
460
- }
461
- return null;
462
- }
463
-
464
- private generateMissing(agentDir: string, audit: AgentAuditFinding[]): string[] {
465
- const generated: string[] = [];
466
- const missing = audit.filter(f => f.type === 'MISSING');
467
-
468
- for (const finding of missing) {
469
- const fullPath = join(agentDir, finding.file);
470
- const dir = join(fullPath, '..');
471
- if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
472
-
473
- const content = this.getTemplateFor(finding.category, finding.file);
474
- if (content) {
475
- writeFileSync(fullPath, content);
476
- generated.push(finding.file);
477
- }
478
- }
479
-
480
- return generated;
481
- }
482
-
483
- // ── Full Generation ──
484
-
485
- private generateFull(agentDir: string): string[] {
486
- const generated: string[] = [];
487
- const dirs = ['agents', 'rules', 'guards', 'workflows', 'skills'];
488
- for (const d of dirs) mkdirSync(join(agentDir, d), { recursive: true });
489
-
490
- // Core files
491
- const coreFiles: Record<string, string> = {
492
- 'INDEX.md': this.genIndex(),
493
- 'AGENT-CARD-SCHEMA.md': this.genSchema(),
494
- 'agents/AGENT-ORCHESTRATOR.md': this.genOrchestrator(),
495
- 'agents/SECURITY-AUDITOR.md': this.genSecurityAgent(),
496
- 'agents/QA-TEST-ENGINEER.md': this.genQAAgent(),
497
- 'agents/TECH-DEBT-CONTROLLER.md': this.genTechDebtAgent(),
498
- 'rules/00-general.md': this.genGeneralRules(),
499
- 'rules/01-architecture.md': this.genArchitectureRules(),
500
- 'rules/02-security.md': this.genSecurityRules(),
501
- 'guards/PREFLIGHT.md': this.genPreflight(),
502
- 'guards/QUALITY-GATES.md': this.genQualityGates(),
503
- 'guards/CODE-REVIEW-CHECKLIST.md': this.genCodeReview(),
504
- 'workflows/develop.md': this.genDevelopWorkflow(),
505
- 'workflows/fix-bug.md': this.genFixBugWorkflow(),
506
- 'workflows/review.md': this.genReviewWorkflow(),
507
- };
508
-
509
- // Stack-specific agents
510
- if (this.stack.hasBackend) {
511
- coreFiles[`agents/${this.stack.primary.toUpperCase()}-BACKEND-DEVELOPER.md`] =
512
- this.genBackendAgent();
513
- coreFiles[`rules/03-${this.stack.primary.toLowerCase()}.md`] =
514
- this.genStackRules();
515
- }
516
- if (this.stack.hasFrontend) {
517
- const fwName = this.stack.frameworks.find(f =>
518
- ['Angular', 'Vue', 'Next.js', 'React'].includes(f)) || 'Frontend';
519
- coreFiles[`agents/${fwName.toUpperCase().replace('.', '')}-FRONTEND-DEVELOPER.md`] =
520
- this.genFrontendAgent();
521
- }
522
- if (this.stack.hasMobile) {
523
- coreFiles['agents/FLUTTER-UI-DEVELOPER.md'] = this.genMobileAgent();
524
- }
525
- if (this.stack.hasDatabase) {
526
- coreFiles['agents/DATABASE-ENGINEER.md'] = this.genDatabaseAgent();
527
- }
528
-
529
- for (const [path, content] of Object.entries(coreFiles)) {
530
- writeFileSync(join(agentDir, path), content);
531
- generated.push(path);
532
- }
533
-
534
- return generated;
535
- }
536
-
537
- private getTemplateFor(category: string, file: string): string | null {
538
- if (file.includes('ORCHESTRATOR')) return this.genOrchestrator();
539
- if (file.includes('SECURITY')) return this.genSecurityAgent();
540
- if (file.includes('QA')) return this.genQAAgent();
541
- if (file.includes('TECH-DEBT')) return this.genTechDebtAgent();
542
- if (file.includes('BACKEND')) return this.genBackendAgent();
543
- if (file.includes('FRONTEND')) return this.genFrontendAgent();
544
- if (file.includes('INDEX')) return this.genIndex();
545
- if (file.includes('00-general')) return this.genGeneralRules();
546
- if (file.includes('PREFLIGHT')) return this.genPreflight();
547
- if (file.includes('develop')) return this.genDevelopWorkflow();
548
- return null;
549
- }
550
-
551
- // ── Template Generators ──
552
-
553
- private get projectName(): string {
554
- return this.report.projectInfo.name || 'Project';
555
- }
556
-
557
- private get stackLabel(): string {
558
- return [
559
- ...this.stack.languages,
560
- ...this.stack.frameworks,
561
- ].join(' + ');
562
- }
563
-
564
- private genIndex(): string {
565
- const agents = [
566
- 'AGENT-ORCHESTRATOR',
567
- ...(this.stack.hasBackend ? [`${this.stack.primary.toUpperCase()}-BACKEND-DEVELOPER`] : []),
568
- ...(this.stack.hasFrontend ? ['FRONTEND-DEVELOPER'] : []),
569
- ...(this.stack.hasMobile ? ['FLUTTER-UI-DEVELOPER'] : []),
570
- ...(this.stack.hasDatabase ? ['DATABASE-ENGINEER'] : []),
571
- 'SECURITY-AUDITOR',
572
- 'QA-TEST-ENGINEER',
573
- 'TECH-DEBT-CONTROLLER',
574
- ];
575
-
576
- return `# ${this.projectName} — Agent Framework
577
-
578
- > **Auto-generated by [Architect v2.1](https://github.com/camilooscargbaptista/architect)**
579
- > Stack: **${this.stackLabel}** | Score: **${this.report.score.overall}/100**
580
-
581
- ---
582
-
583
- ## 🔴 Leitura Obrigatória
584
-
585
- | # | Arquivo | Propósito |
586
- |---|---------|-----------|
587
- | 1 | [00-general.md](./rules/00-general.md) | Regras gerais do projeto |
588
- | 2 | [PREFLIGHT.md](./guards/PREFLIGHT.md) | Checklist pré-ação |
589
- | 3 | [QUALITY-GATES.md](./guards/QUALITY-GATES.md) | Critérios mínimos |
590
-
591
- ## 🤖 Agentes Disponíveis
592
-
593
- | Agente | Arquivo | Role |
594
- |--------|---------|------|
595
- ${agents.map(a => `| ${a} | [${a}.md](./agents/${a}.md) | ${a.includes('ORCHESTRATOR') ? 'coordination' : a.includes('SECURITY') || a.includes('QA') ? 'quality' : 'development'} |`).join('\n')}
596
-
597
- ## 📁 Estrutura
598
-
599
- \`\`\`
600
- .agent/
601
- ├── agents/ → Agentes especializados
602
- ├── rules/ → Regras de codificação
603
- ├── guards/ → Checklists e quality gates
604
- ├── workflows/ → Fluxos de trabalho
605
- └── skills/ → Padrões e referências
606
- \`\`\`
607
-
608
- ---
609
-
610
- **⚠️ REGRA DE OURO: Na dúvida, PARA e PERGUNTA.**
611
- `;
612
- }
613
-
614
- private genSchema(): string {
615
- return `---
616
- description: 'Schema de referência para Agent Cards — padrão A2A-inspired'
617
- version: 1.0.0
618
- ---
619
-
620
- # Agent Card Schema
621
-
622
- > Cada agente DEVE ter um bloco \`agent_card\` no frontmatter YAML.
623
-
624
- ## Schema
625
-
626
- \`\`\`yaml
627
- agent_card:
628
- id: "string" # kebab-case unique ID
629
- name: "string" # Human readable name
630
- role: "enum" # coordination | development | quality | protection | governance
631
- capabilities: [] # List of skills
632
- inputs: [] # What the agent needs
633
- outputs: [] # What the agent produces
634
- depends_on: [] # Agents that must run before
635
- \`\`\`
636
-
637
- ## Roles
638
-
639
- | Role | Description |
640
- |------|-------------|
641
- | coordination | Orchestrates other agents |
642
- | development | Writes production code |
643
- | quality | Testing and QA |
644
- | protection | Security and compliance |
645
- | governance | Standards and tech debt |
646
- `;
647
- }
648
-
649
- private genOrchestrator(): string {
650
- const layers = this.report.layers.map(l => l.name).join(', ');
651
- const antiPatterns = this.report.antiPatterns.map(a => a.name).join(', ') || 'None detected';
652
-
653
- return `---
654
- antigravity:
655
- trigger: 'always_on'
656
- globs: ['**/*']
657
- description: 'META-AGENT ORQUESTRADOR — Coordena todos os agentes para ${this.projectName}'
658
- priority: CRITICAL
659
- agent_card:
660
- id: 'orchestrator'
661
- name: 'Agent Orchestrator'
662
- role: 'coordination'
663
- capabilities: [request-decomposition, agent-dispatch, plan-consolidation, quality-verification]
664
- inputs: [user-story, feature-request, bug-report, refactoring-request]
665
- outputs: [consolidated-plan, implementation-blocks, effort-estimate]
666
- depends_on: []
667
- version: 1.0.0
668
- ---
669
-
670
- # 🎭 AGENT-ORCHESTRATOR: ${this.projectName}
671
-
672
- > **Centro de comando.** Toda requisição passa por aqui.
673
-
674
- ## Contexto do Projeto
675
-
676
- - **Projeto:** ${this.projectName}
677
- - **Stack:** ${this.stackLabel}
678
- - **Score Atual:** ${this.report.score.overall}/100
679
- - **Camadas:** ${layers}
680
- - **Anti-Patterns:** ${antiPatterns}
681
- - **Arquivos:** ${this.report.projectInfo.totalFiles} files, ${this.report.projectInfo.totalLines} lines
682
-
683
- ## Missão
684
-
685
- \`\`\`
686
- RECEBER REQUISIÇÃO
687
-
688
- ENTENDER CONTEXTO
689
-
690
- DISPARAR AGENTES (paralelo)
691
-
692
- CONSOLIDAR ANÁLISES
693
-
694
- APRESENTAR PLANO
695
-
696
- AGUARDAR APROVAÇÃO
697
-
698
- DELEGAR IMPLEMENTAÇÃO
699
-
700
- VERIFICAR QUALIDADE
701
- \`\`\`
702
-
703
- ## Protocolo de Recepção
704
-
705
- ### FASE 0: Parsing da Requisição
706
-
707
- \`\`\`
708
- ✓ Nome da feature/fix: _______________
709
- ✓ Tipo: [ ] Feature [ ] Bug Fix [ ] Refactoring [ ] Documentation
710
- ✓ Camadas tocadas: ${layers}
711
- ✓ Complexidade: [ ] XS [ ] S [ ] M [ ] L [ ] XL
712
- ✓ Assunções (listar): _______________
713
- \`\`\`
714
-
715
- ### FASE 1: Disparo de Agentes
716
-
717
- \`\`\`
718
- ORQUESTRADOR analisa requisição
719
-
720
- ${this.stack.hasBackend ? ` ├──→ [${this.stack.primary.toUpperCase()}-BACKEND]\n │ • Arquitetura de serviços\n │ • API contracts\n │ • Lógica de negócio\n │\n` : ''}${this.stack.hasFrontend ? ` ├──→ [FRONTEND-DEVELOPER]\n │ • Componentes e páginas\n │ • State management\n │ • UX/UI\n │\n` : ''}${this.stack.hasMobile ? ` ├──→ [FLUTTER-UI-DEVELOPER]\n │ • Screens mobile\n │ • Navigation\n │ • Widgets\n │\n` : ''}${this.stack.hasDatabase ? ` ├──→ [DATABASE-ENGINEER]\n │ • Schema design\n │ • Migrations\n │ • Performance\n │\n` : ''} ├──→ [SECURITY-AUDITOR]
721
- │ • Análise de ameaças
722
- │ • Compliance check
723
-
724
- ├──→ [QA-TEST-ENGINEER]
725
- │ • Test plan
726
- │ • Coverage targets
727
-
728
- └──→ [TECH-DEBT-CONTROLLER]
729
- • Débito técnico existente
730
- • Refatorações pré-requisito
731
- \`\`\`
732
-
733
- ### FASE 2: Consolidação
734
-
735
- O orquestrador consolida em um plano com:
736
- - Diagrama de arquitetura
737
- - Cenários BDD
738
- - Plano de testes
739
- - Estimativa de esforço
740
- - Riscos e mitigações
741
-
742
- ### FASE 3: Implementação
743
-
744
- Após \`/approved\`, delegar em blocos ordenados por dependência.
745
-
746
- ---
747
-
748
- ## Quality Gates
749
-
750
- \`\`\`
751
- □ Testes passando
752
- □ Build compilando
753
- □ Score >= ${Math.max(this.report.score.overall, 70)}/100
754
- □ Sem regressão de score
755
- □ Code review aprovado
756
- \`\`\`
757
-
758
- ---
759
-
760
- **Gerado por Architect v2.1 · Score: ${this.report.score.overall}/100**
761
- `;
762
- }
763
-
764
- private genBackendAgent(): string {
765
- const lang = this.stack.primary;
766
- const fw = this.stack.frameworks.filter(f =>
767
- ['Django', 'Flask', 'FastAPI', 'NestJS', 'Spring', 'Express'].includes(f)
768
- ).join(', ') || lang;
769
-
770
- return `---
771
- antigravity:
772
- trigger: 'on_demand'
773
- globs: ['**/*.${lang === 'Python' ? 'py' : 'ts'}']
774
- description: '${lang} Backend Developer — Arquitetura, APIs, serviços'
775
- agent_card:
776
- id: '${lang.toLowerCase()}-backend'
777
- name: '${lang} Backend Developer'
778
- role: 'development'
779
- capabilities: [api-design, service-architecture, business-logic, data-modeling]
780
- inputs: [user-story, api-contracts, business-rules]
781
- outputs: [controllers, services, entities, migrations, tests]
782
- depends_on: [${this.stack.hasDatabase ? 'database-engineer' : ''}]
783
- ---
784
-
785
- # 🔧 ${lang.toUpperCase()} BACKEND DEVELOPER
786
-
787
- > Especialista em backend ${fw} para ${this.projectName}
788
-
789
- ## Stack
790
-
791
- - **Linguagem:** ${lang}
792
- - **Framework:** ${fw}
793
- - **Teste:** ${this.stack.testFramework}
794
- - **Package Manager:** ${this.stack.packageManager}
795
-
796
- ## Princípios
797
-
798
- 1. **SOLID** — Single Responsibility, Open/Closed, Liskov, Interface Segregation, Dependency Inversion
799
- 2. **Clean Architecture** — Separação de camadas
800
- 3. **DRY** — Don't Repeat Yourself
801
- 4. **KISS** — Keep It Simple
802
- 5. **Fail Fast** — Validação na entrada
803
-
804
- ## Padrões de Código
805
-
806
- ### Estrutura de Módulo
807
-
808
- \`\`\`
809
- src/modules/[nome]/
810
- ├── [nome].module.${lang === 'Python' ? 'py' : 'ts'}
811
- ├── [nome].controller.${lang === 'Python' ? 'py' : 'ts'}
812
- ├── [nome].service.${lang === 'Python' ? 'py' : 'ts'}
813
- ├── dto/
814
- ├── entities/
815
- └── __tests__/
816
- \`\`\`
817
-
818
- ### Convenções
819
-
820
- | Item | Padrão | Exemplo |
821
- |------|--------|---------|
822
- | Classes | PascalCase | \`UserService\` |
823
- | Funções | camelCase / snake_case | \`get_user\` / \`getUser\` |
824
- | Constantes | UPPER_SNAKE | \`MAX_RETRIES\` |
825
- | Arquivos | kebab-case | \`user-service.${lang === 'Python' ? 'py' : 'ts'}\` |
826
-
827
- ## Checklist por Entrega
828
-
829
- \`\`\`
830
- □ Tipos/interfaces definidos
831
- □ Validação de entrada implementada
832
- □ Erros tratados com mensagens claras
833
- □ Testes unitários (mínimo 60%)
834
- □ Sem secrets hardcoded
835
- □ Logging adequado
836
- □ Documentação de API
837
- \`\`\`
838
-
839
- ---
840
-
841
- **Gerado por Architect v2.1 · Score: ${this.report.score.overall}/100**
842
- `;
843
- }
844
-
845
- private genFrontendAgent(): string {
846
- const fw = this.stack.frameworks.find(f =>
847
- ['Angular', 'Vue', 'Next.js', 'React'].includes(f)) || 'Frontend';
848
-
849
- return `---
850
- antigravity:
851
- trigger: 'on_demand'
852
- globs: ['src/**/*.{ts,tsx,vue,html,css}']
853
- description: '${fw} Frontend Developer — Componentes, páginas, UX'
854
- agent_card:
855
- id: 'frontend-developer'
856
- name: '${fw} Frontend Developer'
857
- role: 'development'
858
- capabilities: [component-design, state-management, responsive-ui, accessibility]
859
- inputs: [mockups, api-contracts, user-stories]
860
- outputs: [components, pages, services, styles, tests]
861
- depends_on: ['${this.stack.primary.toLowerCase()}-backend']
862
- ---
863
-
864
- # 🎨 ${fw.toUpperCase()} FRONTEND DEVELOPER
865
-
866
- > Especialista em frontend ${fw} para ${this.projectName}
867
-
868
- ## Princípios
869
-
870
- 1. **Component-Driven** — Componentes reutilizáveis
871
- 2. **Responsive First** — Mobile-first design
872
- 3. **Accessibility** — WCAG 2.1 AA compliance
873
- 4. **Performance** — Lazy loading, tree shaking
874
-
875
- ## Checklist
876
-
877
- \`\`\`
878
- □ Mockup HTML aprovado ANTES de codar
879
- □ Componentes reutilizáveis
880
- □ Estado gerenciado corretamente
881
- □ Responsivo testado (mobile/tablet/desktop)
882
- □ Loading states implementados
883
- □ Error states implementados
884
- □ Acessibilidade verificada
885
- □ Performance otimizada
886
- \`\`\`
887
-
888
- ---
889
-
890
- **Gerado por Architect v2.1**
891
- `;
892
- }
893
-
894
- private genMobileAgent(): string {
895
- return `---
896
- antigravity:
897
- trigger: 'on_demand'
898
- globs: ['lib/**/*.dart']
899
- description: 'Flutter UI Developer — Screens, widgets, navigation'
900
- agent_card:
901
- id: 'flutter-ui'
902
- name: 'Flutter UI Developer'
903
- role: 'development'
904
- capabilities: [screen-design, widget-composition, navigation, state-management]
905
- inputs: [mockups, api-contracts]
906
- outputs: [screens, widgets, blocs, tests]
907
- depends_on: ['${this.stack.primary.toLowerCase()}-backend']
908
- ---
909
-
910
- # 📱 FLUTTER UI DEVELOPER
911
-
912
- > Especialista em mobile Flutter para ${this.projectName}
913
-
914
- ## Padrões
915
-
916
- - **State:** BLoC / Provider
917
- - **Navigation:** GoRouter / Navigator 2.0
918
- - **Architecture:** Clean Architecture
919
- - **Tests:** flutter_test + integration_test
920
-
921
- ---
922
-
923
- **Gerado por Architect v2.1**
924
- `;
925
- }
926
-
927
- private genDatabaseAgent(): string {
928
- return `---
929
- antigravity:
930
- trigger: 'on_demand'
931
- globs: ['**/migrations/**', '**/entities/**', '**/models/**']
932
- description: 'Database Engineer — Schema, migrations, performance'
933
- agent_card:
934
- id: 'database-engineer'
935
- name: 'Database Engineer'
936
- role: 'development'
937
- capabilities: [schema-design, migrations, indexing, query-optimization]
938
- inputs: [business-rules, data-requirements]
939
- outputs: [migrations, entities, indexes, constraints]
940
- depends_on: []
941
- ---
942
-
943
- # 🗄️ DATABASE ENGINEER
944
-
945
- > Especialista em banco de dados para ${this.projectName}
946
-
947
- ## Regras
948
-
949
- 1. **NUNCA** usar DELETE físico — sempre soft delete
950
- 2. **SEMPRE** criar migration SQL (não ORM auto-generate)
951
- 3. **SEMPRE** adicionar indexes para FKs e campos de busca
952
- 4. **SEMPRE** validar constraints antes de deploy
953
-
954
- ---
955
-
956
- **Gerado por Architect v2.1**
957
- `;
958
- }
959
-
960
- private genSecurityAgent(): string {
961
- return `---
962
- antigravity:
963
- trigger: 'on_demand'
964
- globs: ['**/*']
965
- description: 'Security Auditor — Análise de vulnerabilidades e compliance'
966
- agent_card:
967
- id: 'security-auditor'
968
- name: 'Security Auditor'
969
- role: 'protection'
970
- capabilities: [threat-modeling, vulnerability-scan, compliance-check, auth-review]
971
- inputs: [source-code, api-contracts, deployment-config]
972
- outputs: [security-reports, threat-models, compliance-checklists]
973
- depends_on: []
974
- ---
975
-
976
- # 🛡️ SECURITY AUDITOR
977
-
978
- > Proteção contra ameaças para ${this.projectName}
979
-
980
- ## Checklist de Segurança
981
-
982
- \`\`\`
983
- □ Sem secrets/credentials hardcoded
984
- □ Sem logging de dados sensíveis (passwords, tokens, PII)
985
- □ Inputs sanitizados
986
- □ Queries parametrizadas (anti SQL injection)
987
- □ Autenticação validada em todas as rotas
988
- □ Autorização (RBAC) verificada
989
- □ Rate limiting configurado
990
- □ CORS configurado corretamente
991
- □ Headers de segurança (HSTS, CSP, X-Frame)
992
- □ Dependências sem vulnerabilidades conhecidas
993
- \`\`\`
994
-
995
- ## STRIDE Threat Model
996
-
997
- | Ameaça | Descrição | Mitigação |
998
- |--------|-----------|-----------|
999
- | **S**poofing | Falsificação de identidade | JWT + MFA |
1000
- | **T**ampering | Alteração de dados | Validação + Checksums |
1001
- | **R**epudiation | Negação de ações | Audit logs |
1002
- | **I**nformation Disclosure | Vazamento de dados | Encryption + RBAC |
1003
- | **D**enial of Service | Indisponibilidade | Rate limiting + WAF |
1004
- | **E**levation of Privilege | Escalação de permissões | RBAC + Least privilege |
1005
-
1006
- ---
1007
-
1008
- **Gerado por Architect v2.1 · Score: ${this.report.score.overall}/100**
1009
- `;
1010
- }
1011
-
1012
- private genQAAgent(): string {
1013
- return `---
1014
- antigravity:
1015
- trigger: 'on_demand'
1016
- globs: ['**/*.{test,spec}.*', '**/__tests__/**']
1017
- description: 'QA Test Engineer — Testes, cobertura, qualidade'
1018
- agent_card:
1019
- id: 'qa-test-engineer'
1020
- name: 'QA Test Engineer'
1021
- role: 'quality'
1022
- capabilities: [bdd-specs, unit-tests, integration-tests, e2e-tests, coverage-analysis]
1023
- inputs: [user-stories, api-contracts, business-rules]
1024
- outputs: [test-suites, bdd-scenarios, coverage-reports]
1025
- depends_on: []
1026
- ---
1027
-
1028
- # 🧪 QA TEST ENGINEER
1029
-
1030
- > Qualidade e testes para ${this.projectName}
1031
-
1032
- ## Stack de Testes
1033
-
1034
- - **Framework:** ${this.stack.testFramework}
1035
- - **Cobertura mínima:** 60%
1036
- - **Padrão:** TDD (Red → Green → Refactor)
1037
-
1038
- ## Fluxo TDD
1039
-
1040
- \`\`\`
1041
- 1. RED → Escrever teste que FALHA
1042
- 2. GREEN → Código MÍNIMO para passar
1043
- 3. REFACTOR → Limpar sem quebrar
1044
- \`\`\`
1045
-
1046
- ## Cenários Obrigatórios
1047
-
1048
- \`\`\`
1049
- □ Happy path (fluxo principal)
1050
- □ Validação de entrada (dados inválidos)
1051
- □ Edge cases (limites, null, empty)
1052
- □ Erro handling (exceptions, timeouts)
1053
- □ Permissões (autorizado vs não autorizado)
1054
- □ Fluxos existentes NÃO quebrados
1055
- \`\`\`
1056
-
1057
- ## Padrão BDD
1058
-
1059
- \`\`\`gherkin
1060
- Feature: [Nome]
1061
- Scenario: [Happy Path]
1062
- Given [contexto]
1063
- When [ação]
1064
- Then [resultado esperado]
1065
-
1066
- Scenario: [Erro]
1067
- Given [contexto]
1068
- When [ação inválida]
1069
- Then [erro esperado]
1070
- \`\`\`
1071
-
1072
- ---
1073
-
1074
- **Gerado por Architect v2.1**
1075
- `;
1076
- }
1077
-
1078
- private genTechDebtAgent(): string {
1079
- const steps = this.plan.steps.map(s =>
1080
- `| ${s.priority} | ${s.title} | ${s.operations.length} ops |`
1081
- ).join('\n');
1082
-
1083
- return `---
1084
- antigravity:
1085
- trigger: 'on_demand'
1086
- globs: ['**/*']
1087
- description: 'Tech Debt Controller — Identifica e prioriza débito técnico'
1088
- agent_card:
1089
- id: 'tech-debt-controller'
1090
- name: 'Tech Debt Controller'
1091
- role: 'governance'
1092
- capabilities: [debt-identification, refactoring-planning, pattern-enforcement]
1093
- inputs: [architecture-report, anti-patterns, code-metrics]
1094
- outputs: [debt-backlog, refactoring-plans, improvement-metrics]
1095
- depends_on: []
1096
- ---
1097
-
1098
- # 📊 TECH DEBT CONTROLLER
1099
-
1100
- > Governança de débito técnico para ${this.projectName}
1101
-
1102
- ## Estado Atual
1103
-
1104
- - **Score:** ${this.report.score.overall}/100
1105
- - **Anti-patterns:** ${this.report.antiPatterns.length}
1106
- - **Refactoring steps:** ${this.plan.steps.length}
1107
-
1108
- ## Backlog de Refactoring
1109
-
1110
- | Prioridade | Item | Operações |
1111
- |------------|------|-----------|
1112
- ${steps || '| — | Nenhum item pendente | — |'}
1113
-
1114
- ## Taxonomia de Dívida
1115
-
1116
- | Tipo | Descrição | Impacto |
1117
- |------|-----------|---------|
1118
- | Architecture | Violações de camadas, hubs | Score |
1119
- | Code Quality | Complexidade, duplicação | Manutenção |
1120
- | Testing | Cobertura baixa, sem testes | Confiabilidade |
1121
- | Security | Vulnerabilidades conhecidas | Risco |
1122
- | Documentation | Docs ausentes ou desatualizados | Onboarding |
1123
-
1124
- ---
1125
-
1126
- **Gerado por Architect v2.1 · Score: ${this.report.score.overall}/100**
1127
- `;
1128
- }
1129
-
1130
- private genGeneralRules(): string {
1131
- return `---
1132
- antigravity:
1133
- trigger: 'always_on'
1134
- globs: ['**/*']
1135
- description: 'Regras gerais obrigatórias — ${this.projectName}'
1136
- ---
1137
-
1138
- # ${this.projectName} — Regras Gerais
1139
-
1140
- > **LEIA TUDO ANTES DE QUALQUER AÇÃO.**
1141
-
1142
- ## 🥇 REGRAS DE OURO (INVIOLÁVEIS)
1143
-
1144
- \`\`\`
1145
- 🥇 1. GIT FLOW COMPLETO
1146
- → Verificar branch + status ANTES de tudo
1147
- → feature/* → develop → staging → main
1148
- → NUNCA codificar direto em main/staging/develop
1149
-
1150
- 🥇 2. DIAGNÓSTICO ANTES DE CODAR
1151
- → Ler código existente ANTES de implementar
1152
- → Verificar se já existe algo similar
1153
-
1154
- 🥇 3. TDD
1155
- → Testes ANTES do código
1156
- → Red → Green → Refactor
1157
-
1158
- 🥇 4. NÃO DECIDIR SOZINHO
1159
- → Dúvida? PARAR E PERGUNTAR
1160
-
1161
- 🥇 5. QUALIDADE > VELOCIDADE
1162
- → Nunca atalhos. Fazer certo da primeira vez.
1163
- \`\`\`
1164
-
1165
- ## Stack
1166
-
1167
- | Camada | Tecnologia |
1168
- |--------|------------|
1169
- ${this.stack.languages.map(l => `| ${l} | ${this.stack.frameworks.filter(f => f).join(', ') || l} |`).join('\n')}
1170
-
1171
- ## Convenções de Idioma
1172
-
1173
- | Contexto | Idioma |
1174
- |----------|--------|
1175
- | Código (variáveis, funções) | Inglês |
1176
- | Comentários | Português (Brasil) |
1177
- | Git commits | Inglês (Conventional Commits) |
1178
- | Documentação | Português (Brasil) |
1179
-
1180
- ## Nomenclatura
1181
-
1182
- | Tipo | Padrão | Exemplo |
1183
- |------|--------|---------|
1184
- | Classes | PascalCase | \`UserService\` |
1185
- | Funções | camelCase | \`getUser\` |
1186
- | Constantes | UPPER_SNAKE | \`MAX_RETRIES\` |
1187
- | Arquivos | kebab-case | \`user-service.ts\` |
1188
-
1189
- ## ⛔ O QUE NUNCA FAZER
1190
-
1191
- \`\`\`
1192
- ❌ Commitar em main/staging/develop
1193
- ❌ Pular Git Flow
1194
- ❌ Assumir — VERIFICAR
1195
- ❌ Dizer "pronto" sem testes
1196
- ❌ Hardcoded secrets
1197
- \`\`\`
1198
-
1199
- ---
1200
-
1201
- **Gerado por Architect v2.1 · Score: ${this.report.score.overall}/100**
1202
- `;
1203
- }
1204
-
1205
- private genArchitectureRules(): string {
1206
- const layers = this.report.layers.map(l =>
1207
- `| ${l.name} | ${l.files.length} files | ${l.description} |`
1208
- ).join('\n');
1209
-
1210
- return `---
1211
- antigravity:
1212
- trigger: 'always_on'
1213
- globs: ['**/*']
1214
- description: 'Regras de arquitetura — ${this.projectName}'
1215
- ---
1216
-
1217
- # Regras de Arquitetura
1218
-
1219
- ## Camadas Detectadas
1220
-
1221
- | Camada | Arquivos | Descrição |
1222
- |--------|----------|-----------|
1223
- ${layers}
1224
-
1225
- ## Score Atual: ${this.report.score.overall}/100
1226
-
1227
- | Métrica | Valor |
1228
- |---------|-------|
1229
- | Modularity | ${this.report.score.breakdown.modularity} |
1230
- | Coupling | ${this.report.score.breakdown.coupling} |
1231
- | Cohesion | ${this.report.score.breakdown.cohesion} |
1232
- | Layering | ${this.report.score.breakdown.layering} |
1233
-
1234
- ## Regras
1235
-
1236
- 1. **Respeitar camadas** — Nunca importar de camada superior
1237
- 2. **Máximo 5 dependências** — Acima disso, considerar split
1238
- 3. **Sem imports circulares** — Sempre unidirecional
1239
- 4. **Um propósito por arquivo** — Single Responsibility
1240
-
1241
- ---
1242
-
1243
- **Gerado por Architect v2.1**
1244
- `;
1245
- }
1246
-
1247
- private genSecurityRules(): string {
1248
- return `---
1249
- antigravity:
1250
- trigger: 'always_on'
1251
- globs: ['**/*']
1252
- description: 'Regras de segurança — ${this.projectName}'
1253
- ---
1254
-
1255
- # Regras de Segurança
1256
-
1257
- ## NUNCA (Zero Tolerância)
1258
-
1259
- \`\`\`
1260
- ❌ Hardcoded secrets, API keys, passwords
1261
- ❌ Logging de dados sensíveis (PII, tokens)
1262
- ❌ SQL sem parameterização
1263
- ❌ eval() ou exec() com input do usuário
1264
- ❌ Endpoints sem autenticação
1265
- ❌ CORS com wildcard (*) em produção
1266
- \`\`\`
1267
-
1268
- ## SEMPRE
1269
-
1270
- \`\`\`
1271
- ✅ Sanitizar inputs do usuário
1272
- ✅ Usar queries parametrizadas
1273
- ✅ Validar file uploads (tipo, tamanho)
1274
- ✅ Rate limiting em APIs públicas
1275
- ✅ Headers de segurança (HSTS, CSP)
1276
- ✅ Audit logs para ações sensíveis
1277
- \`\`\`
1278
-
1279
- ---
1280
-
1281
- **Gerado por Architect v2.1**
1282
- `;
1283
- }
1284
-
1285
- private genStackRules(): string {
1286
- const lang = this.stack.primary;
1287
- return `---
1288
- antigravity:
1289
- trigger: 'on_demand'
1290
- globs: ['**/*.${lang === 'Python' ? 'py' : lang === 'TypeScript' ? 'ts' : lang.toLowerCase()}']
1291
- description: 'Regras específicas de ${lang} — ${this.projectName}'
1292
- ---
1293
-
1294
- # Regras ${lang}
1295
-
1296
- ## Boas Práticas
1297
-
1298
- ${lang === 'Python' ? `
1299
- - Type hints em TODAS as funções
1300
- - Docstrings em classes e funções públicas
1301
- - PEP 8 compliance
1302
- - Use \`pathlib\` ao invés de \`os.path\`
1303
- - Use \`dataclasses\` ou \`pydantic\` para modelos
1304
- - Virtual environment obrigatório
1305
- ` : lang === 'TypeScript' ? `
1306
- - Strict mode ativado
1307
- - Interfaces para TODOS os contratos
1308
- - Sem \`any\` (use \`unknown\` se necessário)
1309
- - Async/await ao invés de callbacks
1310
- - Enum ao invés de magic strings
1311
- - JSDoc em funções públicas
1312
- ` : `
1313
- - Siga as convenções da linguagem
1314
- - Documentação obrigatória
1315
- - Testes unitários mínimo 60%
1316
- `}
1317
-
1318
- ---
1319
-
1320
- **Gerado por Architect v2.1**
1321
- `;
1322
- }
1323
-
1324
- private genPreflight(): string {
1325
- return `# PREFLIGHT Checklist — ${this.projectName}
1326
-
1327
- > **Execute ANTES de qualquer tarefa. Sem exceções.**
1328
-
1329
- ## 🔴 Fase 0: Preparação
1330
-
1331
- \`\`\`
1332
- □ Li e entendi a tarefa completamente?
1333
- □ Sei qual é o objetivo?
1334
- □ Identifiquei o tipo: [ ] Backend [ ] Frontend [ ] Database [ ] Bug Fix [ ] Feature
1335
- \`\`\`
1336
-
1337
- ## 🔴 Fase 1: Ambiente
1338
-
1339
- \`\`\`
1340
- □ Qual branch estou? → git branch --show-current
1341
- □ É main ou develop? → CRIAR BRANCH IMEDIATAMENTE
1342
- □ Branch atualizada? → git pull origin develop
1343
- \`\`\`
1344
-
1345
- ## 🔴 Fase 2: Diagnóstico
1346
-
1347
- \`\`\`
1348
- □ Verifiquei código existente similar?
1349
- □ Entendi a arquitetura afetada?
1350
- □ Li lessons-learned (se existir)?
1351
- \`\`\`
1352
-
1353
- ## ⚠️ Red Flags - PARE
1354
-
1355
- | Red Flag | Ação |
1356
- |----------|------|
1357
- | Não sei onde fica o código | Pesquisar ANTES |
1358
- | Vou assumir algo | PERGUNTAR |
1359
- | Estou em main/develop | CRIAR BRANCH |
1360
- | "Acho que funciona" | TESTAR |
1361
-
1362
- ---
1363
-
1364
- **Gerado por Architect v2.1**
1365
- `;
1366
- }
1367
-
1368
- private genQualityGates(): string {
1369
- const minScore = Math.max(this.report.score.overall - 5, 60);
1370
-
1371
- return `# Quality Gates — ${this.projectName}
1372
-
1373
- > Score atual: **${this.report.score.overall}/100**
1374
-
1375
- ## Gates Obrigatórios
1376
-
1377
- | Gate | Critério | Status |
1378
- |------|----------|--------|
1379
- | Build | Compila sem erros | ✅ Required |
1380
- | Lint | Sem erros de lint | ✅ Required |
1381
- | Tests | Todos passando | ✅ Required |
1382
- | Coverage | >= 60% | ✅ Required |
1383
- | Score | >= ${minScore}/100 | ✅ Required |
1384
- | No Regression | Score não pode cair | ⚠️ Warning |
1385
-
1386
- ## Métricas Atuais
1387
-
1388
- | Métrica | Valor | Meta |
1389
- |---------|-------|------|
1390
- | Modularity | ${this.report.score.breakdown.modularity} | >= 80 |
1391
- | Coupling | ${this.report.score.breakdown.coupling} | >= 70 |
1392
- | Cohesion | ${this.report.score.breakdown.cohesion} | >= 80 |
1393
- | Layering | ${this.report.score.breakdown.layering} | >= 80 |
1394
-
1395
- ---
1396
-
1397
- **Gerado por Architect v2.1**
1398
- `;
1399
- }
1400
-
1401
- private genCodeReview(): string {
1402
- return `# Code Review Checklist — ${this.projectName}
1403
-
1404
- ## Funcionalidade
1405
- \`\`\`
1406
- □ Resolve o problema descrito?
1407
- □ Edge cases tratados?
1408
- □ Erros tratados com mensagens claras?
1409
- \`\`\`
1410
-
1411
- ## Qualidade
1412
- \`\`\`
1413
- □ Código legível e bem nomeado?
1414
- □ Sem duplicação desnecessária?
1415
- □ Princípios SOLID respeitados?
1416
- □ Complexidade controlada?
1417
- \`\`\`
1418
-
1419
- ## Segurança
1420
- \`\`\`
1421
- □ Sem secrets hardcoded?
1422
- □ Inputs validados?
1423
- □ Queries parametrizadas?
1424
- \`\`\`
1425
-
1426
- ## Testes
1427
- \`\`\`
1428
- □ Testes unitários adicionados?
1429
- □ Cenários de erro testados?
1430
- □ Cobertura >= 60%?
1431
- \`\`\`
1432
-
1433
- ---
1434
-
1435
- **Gerado por Architect v2.1**
1436
- `;
1437
- }
1438
-
1439
- private genDevelopWorkflow(): string {
1440
- return `---
1441
- name: develop
1442
- description: Fluxo completo de desenvolvimento — ${this.projectName}
1443
- ---
1444
-
1445
- # Workflow: Desenvolvimento Completo
1446
-
1447
- ## 🎯 FLUXO OBRIGATÓRIO
1448
-
1449
- \`\`\`
1450
- 0️⃣ GIT FLOW → Criar feature branch
1451
- 1️⃣ ENTENDIMENTO → Perguntas de clarificação
1452
- 2️⃣ DIAGNÓSTICO → Verificar código existente
1453
- 3️⃣ BDD → Cenários Gherkin (APROVAÇÃO)
1454
- 4️⃣ TDD RED → Testes falhando
1455
- 5️⃣ TDD GREEN → Código mínimo
1456
- 6️⃣ REFACTOR → Código limpo
1457
- 7️⃣ GIT COMMIT → Conventional Commits + Push
1458
- \`\`\`
1459
-
1460
- ## Pontos de Aprovação
1461
-
1462
- 1. Após entendimento
1463
- 2. Após cenários BDD
1464
- 3. Após testes verdes
1465
- 4. Após refatoração
1466
- 5. Após commit e push
1467
-
1468
- ## 🚫 PROIBIDO
1469
-
1470
- - ❌ Trabalhar direto em develop/main
1471
- - ❌ Código antes de teste
1472
- - ❌ Avançar sem aprovação
1473
- - ❌ Commit sem Conventional Commits
1474
-
1475
- ---
1476
-
1477
- **Gerado por Architect v2.1**
1478
- `;
1479
- }
1480
-
1481
- private genFixBugWorkflow(): string {
1482
- return `---
1483
- name: fix-bug
1484
- description: Corrigir bug com diagnóstico completo — ${this.projectName}
1485
- ---
1486
-
1487
- # Workflow: Fix Bug
1488
-
1489
- \`\`\`
1490
- 1️⃣ Criar branch fix/nome-do-bug
1491
- 2️⃣ Reproduzir o bug
1492
- 3️⃣ Escrever teste que FALHA reproduzindo o bug
1493
- 4️⃣ Corrigir o código mínimo
1494
- 5️⃣ Teste passa (GREEN)
1495
- 6️⃣ Verificar que não quebrou nada
1496
- 7️⃣ Commit: fix(scope): description
1497
- \`\`\`
1498
-
1499
- ---
1500
-
1501
- **Gerado por Architect v2.1**
1502
- `;
1503
- }
1504
-
1505
- private genReviewWorkflow(): string {
1506
- return `---
1507
- name: review
1508
- description: Code review completo — ${this.projectName}
1509
- ---
1510
-
1511
- # Workflow: Code Review
1512
-
1513
- \`\`\`
1514
- 1️⃣ Ler a descrição do PR
1515
- 2️⃣ Verificar diff por arquivo
1516
- 3️⃣ Executar checklist de review
1517
- 4️⃣ Rodar testes localmente
1518
- 5️⃣ Aprovar ou solicitar mudanças
1519
- \`\`\`
1520
-
1521
- ---
1522
-
1523
- **Gerado por Architect v2.1**
1524
- `;
1525
- }
1526
- }