agent-master-devsecops 3.9.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +205 -371
  2. package/agents/AGENT_DEVSECOPS.md +32 -417
  3. package/agents/AGENT_INFRA.md +31 -0
  4. package/agents/AGENT_ORCHESTRATOR.md +39 -264
  5. package/agents/AGENT_QA.md +58 -186
  6. package/agents/AGENT_SCRUM.md +23 -190
  7. package/agents/AGENT_SRE.md +22 -173
  8. package/agents/AGENT_UIUX.md +26 -162
  9. package/docs/ARCHITECTURE.md +152 -148
  10. package/docs/CALCULATIONS.md +17 -17
  11. package/docs/CHANGELOG.md +112 -49
  12. package/docs/ENGINEERING_RULES.md +56 -252
  13. package/docs/IDEAS.md +17 -17
  14. package/docs/LOCAL_BACKLOG.md +20 -0
  15. package/docs/STATE.md +111 -43
  16. package/docs/playbooks/PLAYBOOK_CIRCUIT_BREAKER_LLM.md +58 -58
  17. package/docs/playbooks/PLAYBOOK_OPENTELEMETRY_TRACING.md +58 -58
  18. package/package.json +59 -47
  19. package/scripts/auditors/a11y_auditor.js +462 -0
  20. package/scripts/auditors/code_quality_auditor.js +444 -0
  21. package/scripts/auditors/contract_test_validator.js +396 -0
  22. package/scripts/auditors/eval_harness.js +213 -0
  23. package/scripts/auditors/git_hygiene_linter.js +391 -0
  24. package/scripts/auditors/pr_reviewer.js +627 -0
  25. package/scripts/auditors/sast_scanner.js +442 -0
  26. package/scripts/auditors/sca_dependency_auditor.js +673 -0
  27. package/scripts/{bootstrap_cli.js → bin/bootstrap_cli.js} +597 -468
  28. package/scripts/bin/domain_idea_miner.js +658 -0
  29. package/scripts/bin/smart_onboarding.js +905 -0
  30. package/scripts/{web_inspector.js → bin/web_inspector.js} +578 -355
  31. package/scripts/core/architecture_advisor.js +378 -0
  32. package/scripts/core/ast_skeletonizer.js +413 -0
  33. package/scripts/core/autonomous_remediation_engine.js +305 -0
  34. package/scripts/{circuit_breaker.js → core/circuit_breaker.js} +546 -330
  35. package/scripts/core/context_compressor.js +237 -0
  36. package/scripts/core/fast_feature_scaffold.js +840 -0
  37. package/scripts/core/hot_state_cache.js +238 -0
  38. package/scripts/core/knowledge_gateway.js +888 -0
  39. package/scripts/{magic_prompt_generator.js → core/magic_prompt_generator.js} +250 -205
  40. package/scripts/{multi_agent_orchestrator.js → core/multi_agent_orchestrator.js} +421 -258
  41. package/scripts/{otel_tracer.js → core/otel_tracer.js} +335 -228
  42. package/scripts/{perf_benchmark.js → core/perf_benchmark.js} +212 -153
  43. package/scripts/core/sarif_engine.js +299 -0
  44. package/scripts/{sre_remediation_engine.js → core/sre_remediation_engine.js} +236 -174
  45. package/scripts/{universal_packager.js → core/universal_packager.js} +357 -313
  46. package/scripts/integrations/atlassian_client.js +600 -0
  47. package/scripts/integrations/atlassian_sync_action.js +576 -0
  48. package/scripts/integrations/confluence_sync.js +684 -0
  49. package/scripts/integrations/credentials_guard.js +500 -0
  50. package/scripts/integrations/jira_manager.js +722 -0
  51. package/scripts/mcp/handlers/atlassian_handlers.js +300 -0
  52. package/scripts/mcp/handlers/core_handlers.js +419 -0
  53. package/scripts/mcp/handlers/qa_handlers.js +502 -0
  54. package/scripts/mcp/handlers/rules_handlers.js +379 -0
  55. package/scripts/mcp/handlers/scaffold_handlers.js +334 -0
  56. package/scripts/mcp/handlers/sre_handlers.js +443 -0
  57. package/scripts/mcp/resources_registry.js +453 -0
  58. package/scripts/mcp/server.js +408 -0
  59. package/scripts/mcp/tool_handlers.js +444 -0
  60. package/scripts/mcp/tools_registry.js +1123 -0
  61. package/scripts/mcp_server.js +236 -1884
  62. package/.cursorignore +0 -23
  63. package/agents/compact/AGENT_ORCHESTRATOR_COMPACTO.md +0 -53
  64. package/scripts/a11y_auditor.js +0 -187
  65. package/scripts/ast_skeletonizer.js +0 -220
  66. package/scripts/atlassian_client.js +0 -238
  67. package/scripts/atlassian_sync_action.js +0 -269
  68. package/scripts/code_quality_auditor.js +0 -142
  69. package/scripts/confluence_sync.js +0 -337
  70. package/scripts/context_compressor.js +0 -139
  71. package/scripts/contract_test_validator.js +0 -166
  72. package/scripts/credentials_guard.js +0 -216
  73. package/scripts/domain_idea_miner.js +0 -364
  74. package/scripts/eval_harness.js +0 -100
  75. package/scripts/fast_feature_scaffold.js +0 -338
  76. package/scripts/git_hygiene_linter.js +0 -186
  77. package/scripts/hot_state_cache.js +0 -95
  78. package/scripts/jira_manager.js +0 -408
  79. package/scripts/pr_reviewer.js +0 -373
  80. package/scripts/sast_scanner.js +0 -180
  81. package/scripts/sca_dependency_auditor.js +0 -167
  82. package/scripts/smart_onboarding.js +0 -610
@@ -0,0 +1,378 @@
1
+ /**
2
+ * scripts/core/architecture_advisor.js
3
+ *
4
+ * Motor de Consultoria Arquitetural Agnóstica & Avaliação de Engenharia de Valor.
5
+ * Implementa o Architecture Tradeoff Analysis Method (ATAM) e Architecture Fitness Functions.
6
+ *
7
+ * Filosofia: "Linguagens são ferramentas. Pessoas são ideias."
8
+ * O Advisor atua como um Staff/Principal Architect independente: diagnostica requisitos
9
+ * funcionais e não-funcionais (Throughput, Consistência, Criticidade, Time-to-Market, TCO),
10
+ * avalia formalmente trade-offs de engenharia e recomenda o padrão arquitetural ideal,
11
+ * alertando friamente contra overengineering e complexidade acidental.
12
+ */
13
+
14
+ 'use strict';
15
+
16
+ // Estilos Arquiteturais Canônicos
17
+ const ARCHITECTURE_STYLES = Object.freeze({
18
+ ZERO_DEPENDENCY_WEB: 'Single-File Web App (Zero-Dependency Native Web)',
19
+ MODULAR_MONOLITH: 'Modular Monolith (DDD / Clean Core)',
20
+ HEXAGONAL_EVENT_SOURCED: 'Hexagonal / Ports & Adapters (Strict Transactional Ledger)',
21
+ EVENT_DRIVEN_PIPELINE: 'Event-Driven / Pipe & Filter (Reactive Stream Processing)',
22
+ DISTRIBUTED_MICROSERVICES: 'Distributed Microservices (Bounded Contexts with Event Mesh)'
23
+ });
24
+
25
+ // Perfis de Carga de Trabalho
26
+ const WORKLOAD_PROFILES = Object.freeze({
27
+ CLIENT_INTERACTIVE: 'client_interactive',
28
+ TRANSACTIONAL_OLTP: 'transactional_oltp',
29
+ STREAM_PROCESSING: 'stream_processing',
30
+ BATCH_ANALYTICS: 'batch_analytics',
31
+ STANDALONE_UTILITY: 'standalone_utility'
32
+ });
33
+
34
+ const { getKnowledgeGateway } = require('./knowledge_gateway.js');
35
+
36
+ class ArchitectureAdvisor {
37
+ constructor(options = {}) {
38
+ this.rootDir = options.rootDir || process.cwd();
39
+ this.gateway = options.gateway || getKnowledgeGateway(options);
40
+ }
41
+
42
+ /**
43
+ * Diagnostica a disponibilidade real das toolchains e compiladores no host local.
44
+ */
45
+ detectHostToolchains() {
46
+ const { spawnSync } = require('node:child_process');
47
+ const isWin = process.platform === 'win32';
48
+ const checker = isWin ? 'where.exe' : 'which';
49
+ const toolchains = {};
50
+ const tools = ['node', 'npm', 'go', 'rustc', 'javac', 'python', 'docker'];
51
+
52
+ for (const tool of tools) {
53
+ try {
54
+ const res = spawnSync(checker, [tool], { encoding: 'utf8', timeout: 500 });
55
+ if (res.status === 0 && res.stdout && res.stdout.trim().length > 0) {
56
+ toolchains[tool] = { installed: true, path: res.stdout.trim().split('\r\n')[0].split('\n')[0] };
57
+ } else {
58
+ toolchains[tool] = { installed: false, error: 'not_found' };
59
+ }
60
+ } catch {
61
+ toolchains[tool] = { installed: false, error: 'exception' };
62
+ }
63
+ }
64
+ return toolchains;
65
+ }
66
+
67
+ /**
68
+ * Normaliza os requisitos brutos em dimensões formais de engenharia de software.
69
+ */
70
+ normalizeRequirements(spec = {}) {
71
+ const rawDesc = (spec.description || '').toLowerCase();
72
+ const rawDomain = (spec.domain || '').toLowerCase();
73
+ const rawScale = (spec.scale || '').toLowerCase();
74
+ const rawCriticality = (spec.criticality || '').toLowerCase();
75
+ const rawTeam = (spec.teamSize || '').toLowerCase();
76
+
77
+ // 1. Workload Profile
78
+ let workload = spec.workloadProfile || null;
79
+ if (!workload) {
80
+ if (rawScale === 'prototype' || rawDesc.includes('calculadora') || rawDesc.includes('aprend') || rawDesc.includes('didático') || rawDesc.includes('didatico') || rawDesc.includes('interface leve') || rawDesc.includes('landing page')) {
81
+ workload = WORKLOAD_PROFILES.CLIENT_INTERACTIVE;
82
+ } else if (rawDomain.includes('pagamento') || rawDomain.includes('banco') || rawDomain.includes('financeiro') || rawDomain.includes('checkout') || rawCriticality === 'critical' || rawDesc.includes('transa')) {
83
+ workload = WORKLOAD_PROFILES.TRANSACTIONAL_OLTP;
84
+ } else if (rawDomain.includes('telemetria') || rawDesc.includes('iot') || rawDesc.includes('tempo real') || rawDesc.includes('stream') || rawDesc.includes('latência')) {
85
+ workload = WORKLOAD_PROFILES.STREAM_PROCESSING;
86
+ } else if (rawDomain.includes('analytics') || rawDesc.includes('relatório pesado') || rawDesc.includes('batch')) {
87
+ workload = WORKLOAD_PROFILES.BATCH_ANALYTICS;
88
+ } else {
89
+ workload = WORKLOAD_PROFILES.TRANSACTIONAL_OLTP;
90
+ }
91
+ }
92
+
93
+ // 2. Concurrency Scale (RPS / Volume)
94
+ let concurrency = spec.concurrencyScale || null;
95
+ if (!concurrency) {
96
+ if (rawScale === 'extreme') concurrency = 'extreme_scale';
97
+ else if (rawScale === 'high') concurrency = 'high_concurrent';
98
+ else if (rawScale === 'medium') concurrency = 'medium_concurrent';
99
+ else if (rawScale === 'prototype') concurrency = 'single_user_local';
100
+ else concurrency = 'low_concurrent';
101
+ }
102
+
103
+ // 3. Consistency Requirement
104
+ let consistency = spec.consistencyRequirement || null;
105
+ if (!consistency) {
106
+ if (rawCriticality === 'critical' || rawDomain.includes('pagamento') || rawDomain.includes('financeiro') || rawDomain.includes('ledger')) {
107
+ consistency = 'strict_acid_ledger';
108
+ } else if (workload === WORKLOAD_PROFILES.STREAM_PROCESSING) {
109
+ consistency = 'eventual_consistency';
110
+ } else if (workload === WORKLOAD_PROFILES.CLIENT_INTERACTIVE) {
111
+ consistency = 'stateless_client';
112
+ } else {
113
+ consistency = 'standard_relational_acid';
114
+ }
115
+ }
116
+
117
+ // 4. Compliance & Audit Level
118
+ let compliance = spec.complianceLevel || null;
119
+ if (!compliance) {
120
+ if (rawCriticality === 'critical' || consistency === 'strict_acid_ledger') {
121
+ compliance = 'regulatory_pci_dss_sox';
122
+ } else if (rawCriticality === 'high') {
123
+ compliance = 'business_audit_trail';
124
+ } else {
125
+ compliance = 'standard_logging';
126
+ }
127
+ }
128
+
129
+ // 5. Team Topology
130
+ let team = spec.teamTopology || null;
131
+ if (!team) {
132
+ if (rawTeam.includes('enterprise') || rawTeam.includes('multi')) team = 'multi_team_org';
133
+ else if (rawTeam.includes('small') || rawTeam.includes('pequeno')) team = 'small_team';
134
+ else team = 'solo_engineer';
135
+ }
136
+
137
+ return {
138
+ workload,
139
+ concurrency,
140
+ consistency,
141
+ compliance,
142
+ team,
143
+ userPreference: spec.userPreference || {}
144
+ };
145
+ }
146
+
147
+ /**
148
+ * Avalia os requisitos contra uma função de aptidão arquitetural (Architecture Fitness Function).
149
+ */
150
+ evaluate(spec = {}) {
151
+ const req = this.normalizeRequirements(spec);
152
+ const pref = req.userPreference;
153
+
154
+ // Pontuação de Aptidão para cada estilo
155
+ const scores = {
156
+ [ARCHITECTURE_STYLES.ZERO_DEPENDENCY_WEB]: 0,
157
+ [ARCHITECTURE_STYLES.MODULAR_MONOLITH]: 0,
158
+ [ARCHITECTURE_STYLES.HEXAGONAL_EVENT_SOURCED]: 0,
159
+ [ARCHITECTURE_STYLES.EVENT_DRIVEN_PIPELINE]: 0,
160
+ [ARCHITECTURE_STYLES.DISTRIBUTED_MICROSERVICES]: 0
161
+ };
162
+
163
+ // Heurísticas formais de ATAM
164
+ if (req.workload === WORKLOAD_PROFILES.CLIENT_INTERACTIVE && req.concurrency === 'single_user_local') {
165
+ scores[ARCHITECTURE_STYLES.ZERO_DEPENDENCY_WEB] += 40;
166
+ scores[ARCHITECTURE_STYLES.MODULAR_MONOLITH] += 10;
167
+ scores[ARCHITECTURE_STYLES.DISTRIBUTED_MICROSERVICES] -= 50;
168
+ }
169
+
170
+ if (req.consistency === 'strict_acid_ledger' || req.compliance === 'regulatory_pci_dss_sox') {
171
+ scores[ARCHITECTURE_STYLES.HEXAGONAL_EVENT_SOURCED] += 60;
172
+ scores[ARCHITECTURE_STYLES.MODULAR_MONOLITH] += 15;
173
+ scores[ARCHITECTURE_STYLES.ZERO_DEPENDENCY_WEB] -= 30;
174
+ }
175
+
176
+ if (req.workload === WORKLOAD_PROFILES.STREAM_PROCESSING || req.concurrency === 'extreme_scale' || req.concurrency === 'high_concurrent') {
177
+ scores[ARCHITECTURE_STYLES.EVENT_DRIVEN_PIPELINE] += 40;
178
+ scores[ARCHITECTURE_STYLES.MODULAR_MONOLITH] += 15;
179
+ }
180
+
181
+ if (req.workload === WORKLOAD_PROFILES.TRANSACTIONAL_OLTP && req.consistency !== 'strict_acid_ledger') {
182
+ scores[ARCHITECTURE_STYLES.MODULAR_MONOLITH] += 35;
183
+ scores[ARCHITECTURE_STYLES.HEXAGONAL_EVENT_SOURCED] += 15;
184
+ }
185
+
186
+ // Penalidade severa de Conway: Equipes individuais ou pequenas perdem tração com microsserviços
187
+ if (req.team === 'solo_engineer' || req.team === 'small_team') {
188
+ scores[ARCHITECTURE_STYLES.DISTRIBUTED_MICROSERVICES] -= 40;
189
+ scores[ARCHITECTURE_STYLES.MODULAR_MONOLITH] += 10;
190
+ } else if (req.team === 'multi_team_org') {
191
+ scores[ARCHITECTURE_STYLES.DISTRIBUTED_MICROSERVICES] += 20;
192
+ }
193
+
194
+ // Encontra o estilo vencedor
195
+ let winningStyle = ARCHITECTURE_STYLES.MODULAR_MONOLITH;
196
+ let highestScore = -Infinity;
197
+ for (const [style, score] of Object.entries(scores)) {
198
+ if (score > highestScore) {
199
+ highestScore = score;
200
+ winningStyle = style;
201
+ }
202
+ }
203
+
204
+ // Determina a Stack e os Pilares recomendados
205
+ let recommendedStack = 'TypeScript / Node.js (Clean DDD)';
206
+ let runtimePillars = [];
207
+ let rationale = '';
208
+
209
+ switch (winningStyle) {
210
+ case ARCHITECTURE_STYLES.ZERO_DEPENDENCY_WEB:
211
+ recommendedStack = pref.stack || 'HTML5 + CSS Moderno + Vanilla JS';
212
+ rationale = 'Para ferramentas didáticas, interfaces interativas locais e protótipos de alta velocidade, a eliminação de runtimes pesados e fricção de build garante entrega de valor imediata e manutenção trivial.';
213
+ runtimePillars = [
214
+ 'Acessibilidade e Semântica WAI-ARIA nativa',
215
+ 'Zero dependências de build ou bundlers intermediários',
216
+ 'Persistência local transparente (localStorage / Web Storage)',
217
+ 'Feedback visual e sonoro nativo via Web Audio API'
218
+ ];
219
+ break;
220
+
221
+ case ARCHITECTURE_STYLES.HEXAGONAL_EVENT_SOURCED:
222
+ recommendedStack = pref.stack || 'Go (Golang 1.22+) ou TypeScript';
223
+ rationale = 'Sistemas de missão crítica regulatória exigem isolamento estrito entre o domínio e os adaptadores de I/O, garantindo integridade transacional ACID e trilha de auditoria criptográfica.';
224
+ runtimePillars = [
225
+ 'Livro-razão criptográfico com encadeamento de hash SHA-256 (Anti-Tampering)',
226
+ 'Idempotência durável fim a fim contra double-spending',
227
+ 'Persistência relacional ACID com WAL mode e timeouts estritos',
228
+ 'Conformidade técnica direta com PCI-DSS 4.0 e OWASP Top 10'
229
+ ];
230
+ break;
231
+
232
+ case ARCHITECTURE_STYLES.EVENT_DRIVEN_PIPELINE:
233
+ recommendedStack = pref.stack || 'Go (Golang 1.22+) ou Rust';
234
+ rationale = 'Workloads reativos e streaming exigem baixo overhead de memória, concorrência nativa (goroutines/threads seguras) e tratamento de backpressure para sustentar picos sem estourar custos de nuvem.';
235
+ runtimePillars = [
236
+ 'Processamento de eventos não bloqueante com concorrência segura',
237
+ 'Footprint de memória estável e ausência de pausas de Garbage Collector longas',
238
+ 'Backpressure dinâmico contra sobrecarga de canais',
239
+ 'Instrumentação de tracing distribuído via W3C TraceContext'
240
+ ];
241
+ break;
242
+
243
+ case ARCHITECTURE_STYLES.MODULAR_MONOLITH:
244
+ default:
245
+ recommendedStack = pref.stack || 'TypeScript / Node.js ou Python FastAPI';
246
+ rationale = 'O Monólito Modular oferece a melhor relação custo-benefício e velocidade de iteração do mercado, garantindo fronteiras coesas entre módulos sem o overhead de rede distribuída.';
247
+ runtimePillars = [
248
+ 'Fronteiras explícitas de módulos com interfaces tipadas',
249
+ 'Validação estrita de contratos de domínio em runtime (Type Guards)',
250
+ 'Banco de dados relacional otimizado com isolamento ACID',
251
+ 'Suíte de testes de integração TDD ponta a ponta com cobertura de casos de borda'
252
+ ];
253
+ break;
254
+ }
255
+
256
+ // Análise Crítica de Overengineering e Riscos
257
+ let overengineeringRisk = 'BAIXO';
258
+ let overengineeringAlert = null;
259
+
260
+ if (pref.architecture) {
261
+ const pArch = pref.architecture.toLowerCase();
262
+ if ((pArch.includes('micro') || pArch.includes('distribu')) && (req.team === 'solo_engineer' || req.workload === WORKLOAD_PROFILES.CLIENT_INTERACTIVE)) {
263
+ overengineeringRisk = 'CRÍTICO';
264
+ overengineeringAlert = `Aviso Formal de Engenharia: A adoção de ${pref.architecture} para este perfil de carga adicionará complexidade acidental extrema (orquestração de rede, falhas parciais, latência de barramento e custos de deploy) sem qualquer benefício tangível para o produto. Recomendamos iniciar com ${winningStyle}.`;
265
+ } else if (pArch.includes('clean') && req.workload === WORKLOAD_PROFILES.CLIENT_INTERACTIVE) {
266
+ overengineeringRisk = 'MÉDIO';
267
+ overengineeringAlert = `Aviso: A separação estrita de 5 camadas do Clean Architecture em uma interface interativa pontual pode gerar excesso de boilerplate sem ganho prático de isolamento.`;
268
+ }
269
+ }
270
+
271
+ // Diagnóstico Honesto do Host Environment (Reality Check de Toolchains)
272
+ const hostToolchains = this.detectHostToolchains();
273
+ let hostEnvironmentAlert = null;
274
+ const targetStack = (pref.stack || recommendedStack).toLowerCase();
275
+
276
+ if (targetStack.includes('go') && !hostToolchains.go?.installed) {
277
+ hostEnvironmentAlert = 'Compilador Go (go build) não detectado no PATH do host Windows. Código Go gerado necessitará de container Docker ou instalação prévia da toolchain para compilação e testes reais.';
278
+ } else if (targetStack.includes('rust') && !hostToolchains.rust?.installed) {
279
+ hostEnvironmentAlert = 'Compilador Rust (rustc/cargo) não detectado no PATH do host. A compilação nativa falhará até que a toolchain Rust seja instalada.';
280
+ } else if ((targetStack.includes('java') || targetStack.includes('spring')) && !hostToolchains.java?.installed) {
281
+ hostEnvironmentAlert = 'JDK / javac não detectado no PATH do host. A compilação Maven/Gradle falhará no ambiente local direto.';
282
+ }
283
+
284
+ // Feedback da Preferência do Usuário
285
+ let userPreferenceFeedback = null;
286
+ if (pref.stack || pref.architecture) {
287
+ const pStack = pref.stack || 'conforme especificado';
288
+ const pArch = pref.architecture || 'conforme especificado';
289
+ userPreferenceFeedback = {
290
+ declaredStack: pStack,
291
+ declaredArchitecture: pArch,
292
+ verdict: 'RESPEITADO COM BLINDAGEM TÉCNICA',
293
+ observation: `O Agent Master DevSecOps executará com excelência em ${pStack} usando ${pArch}.${hostEnvironmentAlert ? ' [REALITY-CHECK]: ' + hostEnvironmentAlert : ''}`
294
+ };
295
+ }
296
+
297
+ // Plano de Entrega de Valor Ponta a Ponta
298
+ const valueDeliveryPlan = [
299
+ { step: 1, phase: 'Análise de Requisitos & Invariantes', outcome: 'Especificação formal do domínio, contratos de dados e análise de trade-offs.' },
300
+ { step: 2, phase: 'Walking Skeleton & Arquitetura', outcome: 'Estrutura compilável executável de ponta a ponta com esteira CI/CD blindada.' },
301
+ { step: 3, phase: 'Desenvolvimento TDD com Testes de Borda', outcome: 'Implementação de regras de negócio com suíte de testes automatizada.' },
302
+ { step: 4, phase: 'Auditoria DevSecOps Shift-Left', outcome: 'Varredura SAST real, validação de segredos e checagem de dependências CVE.' },
303
+ { step: 5, phase: 'Deploy Seguro & Provisionamento', outcome: 'Entrega contínua em infraestrutura estável com menor privilégio.' },
304
+ { step: 6, phase: 'Observabilidade & Geração de Valor', outcome: 'Monitoramento OTel/Prometheus, garantindo estabilidade e valor real em produção.' }
305
+ ];
306
+
307
+ const reportMarkdown = [
308
+ `# 🏛️ PARECER TÉCNICO DE ARQUITETURA & ENGENHARIA DE VALOR`,
309
+ ``,
310
+ `> **Diagnóstico de Engenharia:** ${spec.description || 'Necessidade de software'}`,
311
+ `> **Workload:** \`${req.workload}\` | **Concorrência:** \`${req.concurrency}\` | **Consistência:** \`${req.consistency}\``,
312
+ ``,
313
+ `---`,
314
+ ``,
315
+ `## 1. ARQUITETURA & STACK RECOMENDADAS`,
316
+ `- **Padrão Arquitetural Ideal:** \`${winningStyle}\``,
317
+ `- **Stack Tecnológica Indicada:** \`${recommendedStack}\``,
318
+ `- **Justificativa Técnica:** ${rationale}`,
319
+ ``,
320
+ `### Pilares Técnicos de Confiabilidade:`,
321
+ ...runtimePillars.map(p => `- ✅ ${p}`),
322
+ ``,
323
+ `---`,
324
+ ``,
325
+ `## 2. AVALIAÇÃO DE RISCO & OVERENGINEERING`,
326
+ `- **Classificação de Risco de Overengineering:** \`${overengineeringRisk}\``,
327
+ overengineeringAlert ? `> ⚠️ **ALERTA CRÍTICO DE ENGENHARIA:** ${overengineeringAlert}\n` : `- Nenhuma complexidade acidental desnecessária detectada.\n`,
328
+ userPreferenceFeedback ? [
329
+ `### Avaliação da Preferência Declarada pelo Usuário:`,
330
+ `- **Pretensão:** Stack: \`${userPreferenceFeedback.declaredStack}\` | Arquitetura: \`${userPreferenceFeedback.declaredArchitecture}\``,
331
+ `- **Posicionamento:** ${userPreferenceFeedback.observation}`,
332
+ ``
333
+ ].join('\n') : '',
334
+ `---`,
335
+ ``,
336
+ `## 3. ROTEIRO DE GERAÇÃO DE VALOR (PONTA A PONTA)`,
337
+ ...valueDeliveryPlan.map(p => `${p.step}. **${p.phase}:** ${p.outcome}`),
338
+ ``,
339
+ `*Engenharia de software real: sem prejuízos, com segurança, modernidade e foco estrito no valor de quem usa.*`
340
+ ].join('\n');
341
+
342
+ // Enriquecimento e Grounding em Padrões Oficiais via KnowledgeGateway
343
+ const stackToCheck = pref.stack || recommendedStack;
344
+ const docGrounding = this.gateway ? this.gateway.lookupDoc(stackToCheck) : null;
345
+ const knowledgeGrounding = {
346
+ groundedInStandards: true,
347
+ authoritativeSource: docGrounding ? docGrounding.authoritativeSource : 'https://standards.ieee.org',
348
+ recommendedPractices: docGrounding ? docGrounding.recommendedPractices : null
349
+ };
350
+
351
+ return {
352
+ status: 'SUCCESS',
353
+ recommendedArchitecture: winningStyle,
354
+ recommendedStack,
355
+ overengineeringRisk,
356
+ overengineeringAlert,
357
+ hostEnvironmentAlert,
358
+ hostToolchains,
359
+ runtimePillars,
360
+ userPreferenceFeedback,
361
+ valueDeliveryPlan,
362
+ knowledgeGrounding,
363
+ reportMarkdown
364
+ };
365
+ }
366
+ }
367
+
368
+ function recommendArchitecture(spec) {
369
+ const advisor = new ArchitectureAdvisor();
370
+ return advisor.evaluate(spec);
371
+ }
372
+
373
+ module.exports = {
374
+ ArchitectureAdvisor,
375
+ recommendArchitecture,
376
+ ARCHITECTURE_STYLES,
377
+ WORKLOAD_PROFILES
378
+ };