agent-master-devsecops 0.0.0-stage → 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 (61) hide show
  1. package/README.md +204 -2
  2. package/agents/AGENT_DEVSECOPS.md +32 -0
  3. package/agents/AGENT_INFRA.md +31 -0
  4. package/agents/AGENT_ORCHESTRATOR.md +39 -0
  5. package/agents/AGENT_QA.md +58 -0
  6. package/agents/AGENT_SCRUM.md +23 -0
  7. package/agents/AGENT_SRE.md +22 -0
  8. package/agents/AGENT_UIUX.md +26 -0
  9. package/docs/ARCHITECTURE.md +152 -0
  10. package/docs/CALCULATIONS.md +17 -0
  11. package/docs/CHANGELOG.md +112 -0
  12. package/docs/ENGINEERING_RULES.md +56 -0
  13. package/docs/IDEAS.md +17 -0
  14. package/docs/LOCAL_BACKLOG.md +20 -0
  15. package/docs/STATE.md +111 -0
  16. package/docs/playbooks/PLAYBOOK_CIRCUIT_BREAKER_LLM.md +58 -0
  17. package/docs/playbooks/PLAYBOOK_OPENTELEMETRY_TRACING.md +58 -0
  18. package/package.json +57 -4
  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/bin/bootstrap_cli.js +597 -0
  28. package/scripts/bin/domain_idea_miner.js +658 -0
  29. package/scripts/bin/smart_onboarding.js +905 -0
  30. package/scripts/bin/web_inspector.js +578 -0
  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/core/circuit_breaker.js +546 -0
  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/core/magic_prompt_generator.js +250 -0
  40. package/scripts/core/multi_agent_orchestrator.js +421 -0
  41. package/scripts/core/otel_tracer.js +335 -0
  42. package/scripts/core/perf_benchmark.js +212 -0
  43. package/scripts/core/sarif_engine.js +299 -0
  44. package/scripts/core/sre_remediation_engine.js +236 -0
  45. package/scripts/core/universal_packager.js +357 -0
  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 -0
@@ -0,0 +1,502 @@
1
+ /**
2
+ * scripts/mcp/handlers/qa_handlers.js
3
+ *
4
+ * QA, Security & DevSecOps MCP Handlers.
5
+ * Despacha chamadas JSON-RPC 2.0 para auditorias de código estático (SAST),
6
+ * revisão de PR, qualidade/complexidade ciclomática, acessibilidade WCAG,
7
+ * higiene Git (Regra 11), composição de software (SCA), conformidade OpenAPI,
8
+ * benchmark de LLMs e autocura autônoma (OODA).
9
+ *
10
+ * Versão: 5.1.0 Enterprise
11
+ */
12
+
13
+ 'use strict';
14
+
15
+ const fs = require('node:fs');
16
+ const path = require('node:path');
17
+ const { createSarifReport } = require('../../core/sarif_engine.js');
18
+
19
+ /**
20
+ * Helpers funcionais puros para construção determinística de respostas JSON-RPC 2.0 (DRY)
21
+ */
22
+ function buildSuccessResponse(id, data) {
23
+ const textContent = typeof data === 'string' ? data : JSON.stringify(data, null, 2);
24
+ return {
25
+ jsonrpc: '2.0',
26
+ id,
27
+ result: {
28
+ content: [
29
+ {
30
+ type: 'text',
31
+ text: textContent
32
+ }
33
+ ]
34
+ }
35
+ };
36
+ }
37
+
38
+ function buildErrorResponse(id, code, message, data = null) {
39
+ const errObj = { code, message };
40
+ if (data) errObj.data = data;
41
+ return {
42
+ jsonrpc: '2.0',
43
+ id,
44
+ error: errObj
45
+ };
46
+ }
47
+
48
+ /**
49
+ * 1. Auditoria de Segurança Rápida de Snippets / Diffs (agent_audit_code / qa_gate)
50
+ * Inspeciona código contra CWE-94/CWE-78, CWE-798 e CWE-116/CWE-79.
51
+ */
52
+ function handleAuditCode(id, args) {
53
+ try {
54
+ const safeArgs = args && typeof args === 'object' ? args : {};
55
+ let codeDiff = safeArgs.codeDiff || safeArgs.code || safeArgs.codeContent || '';
56
+
57
+ if (!codeDiff && safeArgs.filePath && typeof safeArgs.filePath === 'string') {
58
+ try {
59
+ if (fs.existsSync(safeArgs.filePath)) {
60
+ codeDiff = fs.readFileSync(safeArgs.filePath, 'utf8');
61
+ }
62
+ } catch (_) {}
63
+ }
64
+ codeDiff = String(codeDiff || '');
65
+
66
+ const issues = [];
67
+
68
+ if (/eval\(|new Function\(|child_process\.exec\(/i.test(codeDiff)) {
69
+ issues.push({
70
+ tipo: 'Command / Code Injection',
71
+ gravidade: 'CRÍTICA',
72
+ cwe: 'CWE-94 / CWE-78',
73
+ detalhe: 'Uso de funções perigosas de execução dinâmica de strings.'
74
+ });
75
+ }
76
+
77
+ if (/(["'][a-zA-Z0-9_\-]{20,}["'])/.test(codeDiff) && /token|secret|password|key/i.test(codeDiff)) {
78
+ issues.push({
79
+ tipo: 'Hardcoded Secret Exposure',
80
+ gravidade: 'CRÍTICA',
81
+ cwe: 'CWE-798',
82
+ detalhe: 'Possível segredo ou credencial embutida em texto plano no diff.'
83
+ });
84
+ }
85
+
86
+ if (/<[^>]+>.*<[^>]+>/i.test(codeDiff) && !/stripHtml|sanitize|recursiv/i.test(codeDiff)) {
87
+ issues.push({
88
+ tipo: 'HTML Sanitization Bypass',
89
+ gravidade: 'ALTA',
90
+ cwe: 'CWE-116 / CWE-79',
91
+ detalhe: 'Manipulação de strings HTML sem sanitização recursiva comprovada.'
92
+ });
93
+ }
94
+
95
+ const verdict = issues.length === 0
96
+ ? 'APROVADO'
97
+ : (issues.some(i => i.gravidade === 'CRÍTICA') ? 'REPROVADO' : 'APROVADO COM RESSALVAS');
98
+
99
+ const format = safeArgs.format || 'json';
100
+
101
+ if (format === 'sarif') {
102
+ const ruleMapping = {
103
+ 'Command / Code Injection': { ruleId: 'RULE-SEC-094', severity: 'CRITICAL' },
104
+ 'Hardcoded Secret Exposure': { ruleId: 'RULE-SEC-798', severity: 'CRITICAL' },
105
+ 'HTML Sanitization Bypass': { ruleId: 'RULE-SEC-116', severity: 'HIGH' }
106
+ };
107
+
108
+ const findings = issues.map(iss => ({
109
+ ruleId: (ruleMapping[iss.tipo] && ruleMapping[iss.tipo].ruleId) || 'RULE-SEC-GENERIC',
110
+ severity: (ruleMapping[iss.tipo] && ruleMapping[iss.tipo].severity) || 'HIGH',
111
+ filename: safeArgs.filename || safeArgs.filePath || 'snippet.js',
112
+ line: 1,
113
+ column: 1,
114
+ snippet: codeDiff.slice(0, 100),
115
+ message: `${iss.tipo} (${iss.cwe}): ${iss.detalhe}`,
116
+ remediation: 'Remover funções dinâmicas perigosas, extrair credenciais para variáveis de ambiente e sanitizar saída HTML.'
117
+ }));
118
+
119
+ const sarifReport = createSarifReport({
120
+ toolName: 'agent-master-qa-gate',
121
+ toolVersion: '5.1.0',
122
+ findings,
123
+ properties: {
124
+ verdict,
125
+ totalIssues: issues.length,
126
+ auditor: 'Revisor Crítico Adversário (AGENT_QA.md)'
127
+ }
128
+ });
129
+ return buildSuccessResponse(id, sarifReport);
130
+ }
131
+
132
+ return buildSuccessResponse(id, {
133
+ veredito: verdict,
134
+ defeitosEncontrados: issues,
135
+ auditor: 'Revisor Crítico Adversário (AGENT_QA.md)',
136
+ totalIssues: issues.length
137
+ });
138
+ } catch (err) {
139
+ return buildErrorResponse(id, -32603, `Falha em handleAuditCode: ${err.message}`);
140
+ }
141
+ }
142
+
143
+ /**
144
+ * 2. Revisor Autônomo de Pull Requests & Blast Radius (agent_review_pr / review_pr)
145
+ */
146
+ function handleReviewPr(id, args) {
147
+ try {
148
+ const safeArgs = args && typeof args === 'object' ? args : {};
149
+ const { analyzeDiff, formatReport, PrReviewer } = require('../../auditors/pr_reviewer.js');
150
+ const diff = safeArgs.diff || safeArgs.codeDiff || '';
151
+ const files = Array.isArray(safeArgs.files) ? safeArgs.files : [];
152
+ const format = safeArgs.format || 'json';
153
+
154
+ if (format === 'sarif') {
155
+ const reviewer = new PrReviewer();
156
+ const sarifReport = reviewer.auditToSarif({
157
+ diff,
158
+ files,
159
+ branchName: safeArgs.branchName,
160
+ commitMessage: safeArgs.commitMessage
161
+ });
162
+ return buildSuccessResponse(id, sarifReport);
163
+ }
164
+
165
+ const analysis = analyzeDiff(diff, files, safeArgs);
166
+ const report = formatReport(analysis);
167
+
168
+ return buildSuccessResponse(id, {
169
+ veredito: analysis.verdict,
170
+ analise: analysis,
171
+ relatorioCanonico: report
172
+ });
173
+ } catch (err) {
174
+ return buildErrorResponse(id, -32603, `Falha em handleReviewPr: ${err.message}`);
175
+ }
176
+ }
177
+
178
+ /**
179
+ * 3. Auditoria SAST & Varredura de Vulnerabilidades / Segredos (agent_sast_scan)
180
+ */
181
+ function handleSastScan(id, args) {
182
+ try {
183
+ const safeArgs = args && typeof args === 'object' ? args : {};
184
+ const { SastScanner } = require('../../auditors/sast_scanner.js');
185
+ const scanner = new SastScanner();
186
+ const code = safeArgs.code;
187
+ const targetPath = safeArgs.filePath || safeArgs.targetPath || safeArgs.path;
188
+ const filename = safeArgs.filename || 'snippet.js';
189
+ const format = safeArgs.format || 'json';
190
+
191
+ let output;
192
+ if (targetPath) {
193
+ output = format === 'sarif'
194
+ ? scanner.scanToSarif(targetPath)
195
+ : (fs.existsSync(targetPath) && fs.statSync(targetPath).isFile() ? scanner.scanFile(targetPath) : scanner.scanDirectory(targetPath));
196
+ } else {
197
+ output = format === 'sarif'
198
+ ? scanner.scanCodeToSarif(code || '', filename)
199
+ : scanner.scanCode(code || '', filename);
200
+ }
201
+
202
+ return buildSuccessResponse(id, output);
203
+ } catch (err) {
204
+ return buildErrorResponse(id, -32603, `Falha em handleSastScan: ${err.message}`);
205
+ }
206
+ }
207
+
208
+ /**
209
+ * 4. Auditoria de Qualidade de Código & McCabe (agent_audit_quality)
210
+ */
211
+ function handleAuditQuality(id, args) {
212
+ try {
213
+ const safeArgs = args && typeof args === 'object' ? args : {};
214
+ const { CodeQualityAuditor } = require('../../auditors/code_quality_auditor.js');
215
+ const maxComplexity = Number(safeArgs.maxComplexity) || 15;
216
+ const auditor = new CodeQualityAuditor({ maxComplexity });
217
+ const format = safeArgs.format || 'json';
218
+
219
+ let code = safeArgs.code || '';
220
+ let filename = safeArgs.filename || 'snippet.js';
221
+
222
+ if (safeArgs.filePath && !safeArgs.code && fs.existsSync(safeArgs.filePath)) {
223
+ code = fs.readFileSync(safeArgs.filePath, 'utf8');
224
+ filename = path.basename(safeArgs.filePath);
225
+ }
226
+
227
+ if (format === 'sarif') {
228
+ const sarifOutput = auditor.auditToSarif(code, filename);
229
+ return buildSuccessResponse(id, sarifOutput);
230
+ }
231
+
232
+ const auditResult = auditor.auditCode(code, filename);
233
+ return buildSuccessResponse(id, auditResult);
234
+ } catch (err) {
235
+ return buildErrorResponse(id, -32603, `Falha em handleAuditQuality: ${err.message}`);
236
+ }
237
+ }
238
+
239
+ /**
240
+ * 5. Auditoria de Acessibilidade Digital & WCAG 2.1 AA (agent_audit_a11y)
241
+ */
242
+ function handleAuditA11y(id, args) {
243
+ try {
244
+ const safeArgs = args && typeof args === 'object' ? args : {};
245
+ const { A11yAuditor } = require('../../auditors/a11y_auditor.js');
246
+ const auditor = new A11yAuditor();
247
+ const code = safeArgs.code || '';
248
+ const filename = safeArgs.filename || 'component.tsx';
249
+ const format = safeArgs.format || 'json';
250
+
251
+ if (format === 'sarif') {
252
+ const sarifOutput = auditor.auditToSarif(code, filename);
253
+ return buildSuccessResponse(id, sarifOutput);
254
+ }
255
+
256
+ const auditResult = auditor.auditCode(code, filename);
257
+ const report = auditor.formatReport(auditResult);
258
+
259
+ return buildSuccessResponse(id, { ...auditResult, formattedReport: report });
260
+ } catch (err) {
261
+ return buildErrorResponse(id, -32603, `Falha em handleAuditA11y: ${err.message}`);
262
+ }
263
+ }
264
+
265
+ /**
266
+ * 6. Linter de Higiene Git & Governança da Regra 11 (agent_lint_git_hygiene)
267
+ */
268
+ function handleLintGitHygiene(id, args) {
269
+ try {
270
+ const safeArgs = args && typeof args === 'object' ? args : {};
271
+ const { GitHygieneLinter, lintCommitMessage, lintBranchName, auditGitState } = require('../../auditors/git_hygiene_linter.js');
272
+ const format = safeArgs.format || 'json';
273
+
274
+ if (format === 'sarif') {
275
+ const linter = new GitHygieneLinter();
276
+ const sarifOutput = linter.auditToSarif(safeArgs);
277
+ return buildSuccessResponse(id, sarifOutput);
278
+ }
279
+
280
+ const res = {};
281
+ if (safeArgs.commitMessage) {
282
+ res.commitAudit = lintCommitMessage(safeArgs.commitMessage);
283
+ }
284
+ if (safeArgs.branchName) {
285
+ res.branchAudit = lintBranchName(safeArgs.branchName);
286
+ }
287
+ if (safeArgs.auditState) {
288
+ res.gitState = auditGitState();
289
+ }
290
+ if (!safeArgs.commitMessage && !safeArgs.branchName && !safeArgs.auditState) {
291
+ res.gitState = auditGitState();
292
+ }
293
+
294
+ return buildSuccessResponse(id, res);
295
+ } catch (err) {
296
+ return buildErrorResponse(id, -32603, `Falha em handleLintGitHygiene: ${err.message}`);
297
+ }
298
+ }
299
+
300
+ /**
301
+ * 7. Auditoria de Composição de Software (SCA) & Licenças (agent_audit_dependencies_sca)
302
+ */
303
+ function handleAuditDependenciesSca(id, args) {
304
+ try {
305
+ const safeArgs = args && typeof args === 'object' ? args : {};
306
+ const { ScaDependencyAuditor } = require('../../auditors/sca_dependency_auditor.js');
307
+ const input = safeArgs.packageJson || safeArgs.manifest || safeArgs.path || path.join(process.cwd(), 'package.json');
308
+ const format = safeArgs.format || 'json';
309
+ const auditor = new ScaDependencyAuditor();
310
+
311
+ const res = format === 'sarif'
312
+ ? auditor.auditToSarif(input)
313
+ : auditor.audit(input);
314
+
315
+ return buildSuccessResponse(id, res);
316
+ } catch (err) {
317
+ return buildErrorResponse(id, -32603, `Falha em handleAuditDependenciesSca: ${err.message}`);
318
+ }
319
+ }
320
+
321
+ /**
322
+ * 8. Validação de Contratos OpenAPI & Drift de API (agent_validate_api_contract)
323
+ */
324
+ function handleValidateApiContract(id, args) {
325
+ try {
326
+ const safeArgs = args && typeof args === 'object' ? args : {};
327
+ const { ContractTestValidator, validateOpenApiContract } = require('../../auditors/contract_test_validator.js');
328
+ const spec = safeArgs.spec || {};
329
+ const implementedRoutes = safeArgs.implementedRoutes || [];
330
+ const format = safeArgs.format || 'json';
331
+
332
+ if (format === 'sarif') {
333
+ const validator = new ContractTestValidator();
334
+ const sarifOutput = validator.auditToSarif(spec, implementedRoutes);
335
+ return buildSuccessResponse(id, sarifOutput);
336
+ }
337
+
338
+ const res = validateOpenApiContract(spec, implementedRoutes);
339
+ return buildSuccessResponse(id, res);
340
+ } catch (err) {
341
+ return buildErrorResponse(id, -32603, `Falha em handleValidateApiContract: ${err.message}`);
342
+ }
343
+ }
344
+
345
+ /**
346
+ * 9. Benchmark & Avaliação Empírica de LLMs (agent_eval_harness)
347
+ */
348
+ function handleEvalHarness(id, args) {
349
+ try {
350
+ const safeArgs = args && typeof args === 'object' ? args : {};
351
+ const { LlmEvalHarness, evaluateResponse } = require('../../auditors/eval_harness.js');
352
+ const { modelName, promptSent, responseReceived, format } = safeArgs;
353
+
354
+ if (format === 'sarif') {
355
+ const harness = new LlmEvalHarness();
356
+ const sarifOutput = harness.auditToSarif(modelName, promptSent, responseReceived);
357
+ return buildSuccessResponse(id, sarifOutput);
358
+ }
359
+
360
+ const report = evaluateResponse(modelName, promptSent, responseReceived);
361
+ return buildSuccessResponse(id, report);
362
+ } catch (err) {
363
+ return buildErrorResponse(id, -32603, `Falha em handleEvalHarness: ${err.message}`);
364
+ }
365
+ }
366
+
367
+ /**
368
+ * 10. Autocura Autônoma em Ciclo OODA (agent_remediate_code)
369
+ */
370
+ async function handleRemediateCode(id, args) {
371
+ try {
372
+ const safeArgs = args && typeof args === 'object' ? args : {};
373
+ const { AutonomousRemediationEngine } = require('../../core/autonomous_remediation_engine.js');
374
+ const engine = new AutonomousRemediationEngine();
375
+ const targetFile = safeArgs.targetFile || '';
376
+ const testCommand = safeArgs.testCommand || '';
377
+ const projectRoot = safeArgs.projectRoot || '';
378
+
379
+ const result = await engine.remediateFile({ targetFile, testCommand, projectRoot });
380
+ return buildSuccessResponse(id, result);
381
+ } catch (err) {
382
+ return buildErrorResponse(id, -32603, `Falha na execução da autocura autônoma: ${err.message}`);
383
+ }
384
+ }
385
+
386
+ /**
387
+ * Classe Canônica QaHandlers
388
+ * Fornece API orientada a objetos com suporte a métodos estáticos e de instância.
389
+ */
390
+ class QaHandlers {
391
+ static buildSuccessResponse(id, data) {
392
+ return buildSuccessResponse(id, data);
393
+ }
394
+
395
+ static buildErrorResponse(id, code, message, data = null) {
396
+ return buildErrorResponse(id, code, message, data);
397
+ }
398
+
399
+ static handleAuditCode(id, args) {
400
+ return handleAuditCode(id, args);
401
+ }
402
+
403
+ static handleReviewPr(id, args) {
404
+ return handleReviewPr(id, args);
405
+ }
406
+
407
+ static handleSastScan(id, args) {
408
+ return handleSastScan(id, args);
409
+ }
410
+
411
+ static handleAuditQuality(id, args) {
412
+ return handleAuditQuality(id, args);
413
+ }
414
+
415
+ static handleAuditA11y(id, args) {
416
+ return handleAuditA11y(id, args);
417
+ }
418
+
419
+ static handleLintGitHygiene(id, args) {
420
+ return handleLintGitHygiene(id, args);
421
+ }
422
+
423
+ static handleAuditDependenciesSca(id, args) {
424
+ return handleAuditDependenciesSca(id, args);
425
+ }
426
+
427
+ static handleValidateApiContract(id, args) {
428
+ return handleValidateApiContract(id, args);
429
+ }
430
+
431
+ static handleEvalHarness(id, args) {
432
+ return handleEvalHarness(id, args);
433
+ }
434
+
435
+ static async handleRemediateCode(id, args) {
436
+ return handleRemediateCode(id, args);
437
+ }
438
+
439
+ buildSuccessResponse(id, data) {
440
+ return QaHandlers.buildSuccessResponse(id, data);
441
+ }
442
+
443
+ buildErrorResponse(id, code, message, data = null) {
444
+ return QaHandlers.buildErrorResponse(id, code, message, data);
445
+ }
446
+
447
+ handleAuditCode(id, args) {
448
+ return QaHandlers.handleAuditCode(id, args);
449
+ }
450
+
451
+ handleReviewPr(id, args) {
452
+ return QaHandlers.handleReviewPr(id, args);
453
+ }
454
+
455
+ handleSastScan(id, args) {
456
+ return QaHandlers.handleSastScan(id, args);
457
+ }
458
+
459
+ handleAuditQuality(id, args) {
460
+ return QaHandlers.handleAuditQuality(id, args);
461
+ }
462
+
463
+ handleAuditA11y(id, args) {
464
+ return QaHandlers.handleAuditA11y(id, args);
465
+ }
466
+
467
+ handleLintGitHygiene(id, args) {
468
+ return QaHandlers.handleLintGitHygiene(id, args);
469
+ }
470
+
471
+ handleAuditDependenciesSca(id, args) {
472
+ return QaHandlers.handleAuditDependenciesSca(id, args);
473
+ }
474
+
475
+ handleValidateApiContract(id, args) {
476
+ return QaHandlers.handleValidateApiContract(id, args);
477
+ }
478
+
479
+ handleEvalHarness(id, args) {
480
+ return QaHandlers.handleEvalHarness(id, args);
481
+ }
482
+
483
+ async handleRemediateCode(id, args) {
484
+ return QaHandlers.handleRemediateCode(id, args);
485
+ }
486
+ }
487
+
488
+ module.exports = {
489
+ QaHandlers,
490
+ buildSuccessResponse,
491
+ buildErrorResponse,
492
+ handleAuditCode,
493
+ handleReviewPr,
494
+ handleSastScan,
495
+ handleAuditQuality,
496
+ handleAuditA11y,
497
+ handleLintGitHygiene,
498
+ handleAuditDependenciesSca,
499
+ handleValidateApiContract,
500
+ handleEvalHarness,
501
+ handleRemediateCode
502
+ };