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.
- package/README.md +205 -371
- package/agents/AGENT_DEVSECOPS.md +32 -417
- package/agents/AGENT_INFRA.md +31 -0
- package/agents/AGENT_ORCHESTRATOR.md +39 -264
- package/agents/AGENT_QA.md +58 -186
- package/agents/AGENT_SCRUM.md +23 -190
- package/agents/AGENT_SRE.md +22 -173
- package/agents/AGENT_UIUX.md +26 -162
- package/docs/ARCHITECTURE.md +152 -148
- package/docs/CALCULATIONS.md +17 -17
- package/docs/CHANGELOG.md +112 -49
- package/docs/ENGINEERING_RULES.md +56 -252
- package/docs/IDEAS.md +17 -17
- package/docs/LOCAL_BACKLOG.md +20 -0
- package/docs/STATE.md +111 -43
- package/docs/playbooks/PLAYBOOK_CIRCUIT_BREAKER_LLM.md +58 -58
- package/docs/playbooks/PLAYBOOK_OPENTELEMETRY_TRACING.md +58 -58
- package/package.json +59 -47
- package/scripts/auditors/a11y_auditor.js +462 -0
- package/scripts/auditors/code_quality_auditor.js +444 -0
- package/scripts/auditors/contract_test_validator.js +396 -0
- package/scripts/auditors/eval_harness.js +213 -0
- package/scripts/auditors/git_hygiene_linter.js +391 -0
- package/scripts/auditors/pr_reviewer.js +627 -0
- package/scripts/auditors/sast_scanner.js +442 -0
- package/scripts/auditors/sca_dependency_auditor.js +673 -0
- package/scripts/{bootstrap_cli.js → bin/bootstrap_cli.js} +597 -468
- package/scripts/bin/domain_idea_miner.js +658 -0
- package/scripts/bin/smart_onboarding.js +905 -0
- package/scripts/{web_inspector.js → bin/web_inspector.js} +578 -355
- package/scripts/core/architecture_advisor.js +378 -0
- package/scripts/core/ast_skeletonizer.js +413 -0
- package/scripts/core/autonomous_remediation_engine.js +305 -0
- package/scripts/{circuit_breaker.js → core/circuit_breaker.js} +546 -330
- package/scripts/core/context_compressor.js +237 -0
- package/scripts/core/fast_feature_scaffold.js +840 -0
- package/scripts/core/hot_state_cache.js +238 -0
- package/scripts/core/knowledge_gateway.js +888 -0
- package/scripts/{magic_prompt_generator.js → core/magic_prompt_generator.js} +250 -205
- package/scripts/{multi_agent_orchestrator.js → core/multi_agent_orchestrator.js} +421 -258
- package/scripts/{otel_tracer.js → core/otel_tracer.js} +335 -228
- package/scripts/{perf_benchmark.js → core/perf_benchmark.js} +212 -153
- package/scripts/core/sarif_engine.js +299 -0
- package/scripts/{sre_remediation_engine.js → core/sre_remediation_engine.js} +236 -174
- package/scripts/{universal_packager.js → core/universal_packager.js} +357 -313
- package/scripts/integrations/atlassian_client.js +600 -0
- package/scripts/integrations/atlassian_sync_action.js +576 -0
- package/scripts/integrations/confluence_sync.js +684 -0
- package/scripts/integrations/credentials_guard.js +500 -0
- package/scripts/integrations/jira_manager.js +722 -0
- package/scripts/mcp/handlers/atlassian_handlers.js +300 -0
- package/scripts/mcp/handlers/core_handlers.js +419 -0
- package/scripts/mcp/handlers/qa_handlers.js +502 -0
- package/scripts/mcp/handlers/rules_handlers.js +379 -0
- package/scripts/mcp/handlers/scaffold_handlers.js +334 -0
- package/scripts/mcp/handlers/sre_handlers.js +443 -0
- package/scripts/mcp/resources_registry.js +453 -0
- package/scripts/mcp/server.js +408 -0
- package/scripts/mcp/tool_handlers.js +444 -0
- package/scripts/mcp/tools_registry.js +1123 -0
- package/scripts/mcp_server.js +236 -1884
- package/.cursorignore +0 -23
- package/agents/compact/AGENT_ORCHESTRATOR_COMPACTO.md +0 -53
- package/scripts/a11y_auditor.js +0 -187
- package/scripts/ast_skeletonizer.js +0 -220
- package/scripts/atlassian_client.js +0 -238
- package/scripts/atlassian_sync_action.js +0 -269
- package/scripts/code_quality_auditor.js +0 -142
- package/scripts/confluence_sync.js +0 -337
- package/scripts/context_compressor.js +0 -139
- package/scripts/contract_test_validator.js +0 -166
- package/scripts/credentials_guard.js +0 -216
- package/scripts/domain_idea_miner.js +0 -364
- package/scripts/eval_harness.js +0 -100
- package/scripts/fast_feature_scaffold.js +0 -338
- package/scripts/git_hygiene_linter.js +0 -186
- package/scripts/hot_state_cache.js +0 -95
- package/scripts/jira_manager.js +0 -408
- package/scripts/pr_reviewer.js +0 -373
- package/scripts/sast_scanner.js +0 -180
- package/scripts/sca_dependency_auditor.js +0 -167
- package/scripts/smart_onboarding.js +0 -610
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/mcp/handlers/atlassian_handlers.js
|
|
3
|
+
*
|
|
4
|
+
* Atlassian, Jira & Confluence MCP Handlers.
|
|
5
|
+
* Despacha chamadas JSON-RPC 2.0 para Sincronização Jira/Confluence, Remote Links,
|
|
6
|
+
* Diagnóstico de Credenciais (Regra 15) e Governança de Fluxo Kanban.
|
|
7
|
+
*
|
|
8
|
+
* Versão: 5.1.0 Enterprise
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const { ROOT_DIR } = require('../resources_registry.js');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Helpers funcionais puros para construção determinística de respostas JSON-RPC 2.0 (DRY)
|
|
17
|
+
*/
|
|
18
|
+
function buildSuccessResponse(id, data) {
|
|
19
|
+
const textContent = typeof data === 'string' ? data : JSON.stringify(data, null, 2);
|
|
20
|
+
return {
|
|
21
|
+
jsonrpc: '2.0',
|
|
22
|
+
id,
|
|
23
|
+
result: {
|
|
24
|
+
content: [
|
|
25
|
+
{
|
|
26
|
+
type: 'text',
|
|
27
|
+
text: textContent
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function buildErrorResponse(id, code, message, data = null) {
|
|
35
|
+
const errObj = { code, message };
|
|
36
|
+
if (data) errObj.data = data;
|
|
37
|
+
return {
|
|
38
|
+
jsonrpc: '2.0',
|
|
39
|
+
id,
|
|
40
|
+
error: errObj
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Handler para sincronização de Remote Links e páginas do Confluence (agent_sync_atlassian).
|
|
46
|
+
*/
|
|
47
|
+
function handleSyncAtlassian(id, args) {
|
|
48
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
49
|
+
const {
|
|
50
|
+
extractIssueKeys,
|
|
51
|
+
formatRemoteLinkPayload,
|
|
52
|
+
getAuth,
|
|
53
|
+
auditSyncToSarif,
|
|
54
|
+
formatReport
|
|
55
|
+
} = require('../../integrations/atlassian_sync_action.js');
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
const { issueKey, url, title, type, format } = safeArgs;
|
|
59
|
+
const authConfigured = Boolean(getAuth());
|
|
60
|
+
const payload = formatRemoteLinkPayload(url, title, type || 'commit');
|
|
61
|
+
|
|
62
|
+
if (format === 'sarif') {
|
|
63
|
+
const sarif = auditSyncToSarif({
|
|
64
|
+
keys: issueKey ? [issueKey] : [],
|
|
65
|
+
results: url ? [{ key: issueKey || 'UNKNOWN', type: type || 'commit', ref: url, status: 'SUCCESS' }] : []
|
|
66
|
+
});
|
|
67
|
+
return buildSuccessResponse(id, sarif);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (format === 'markdown' && typeof formatReport === 'function') {
|
|
71
|
+
const report = formatReport({
|
|
72
|
+
keys: issueKey ? [issueKey] : [],
|
|
73
|
+
results: url ? [{ key: issueKey || 'UNKNOWN', type: type || 'commit', ref: url, status: 'SUCCESS' }] : []
|
|
74
|
+
});
|
|
75
|
+
return buildSuccessResponse(id, report);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return buildSuccessResponse(id, {
|
|
79
|
+
status: authConfigured ? 'READY_TO_SYNC' : 'SKIPPED_NO_AUTH',
|
|
80
|
+
issueKey: issueKey || null,
|
|
81
|
+
authConfigured,
|
|
82
|
+
remoteLinkPayload: payload
|
|
83
|
+
});
|
|
84
|
+
} catch (err) {
|
|
85
|
+
return buildErrorResponse(id, -32603, `Falha na sincronização Atlassian: ${err.message}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Handler para auditoria e healthcheck de credenciais Atlassian e GitHub (agent_check_credentials).
|
|
91
|
+
*/
|
|
92
|
+
function handleCheckCredentials(id, args) {
|
|
93
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
94
|
+
const targetDir = safeArgs.targetDir || ROOT_DIR;
|
|
95
|
+
const format = safeArgs.format || 'json';
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
const {
|
|
99
|
+
runCredentialHealthcheck,
|
|
100
|
+
formatReport,
|
|
101
|
+
auditToSarif
|
|
102
|
+
} = require('../../integrations/credentials_guard.js');
|
|
103
|
+
|
|
104
|
+
const check = runCredentialHealthcheck(targetDir);
|
|
105
|
+
|
|
106
|
+
if (format === 'sarif') {
|
|
107
|
+
const { auditToSarif: auditAtlassianClient } = require('../../integrations/atlassian_client.js');
|
|
108
|
+
const sarif = auditAtlassianClient(targetDir);
|
|
109
|
+
return buildSuccessResponse(id, sarif);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (format === 'markdown') {
|
|
113
|
+
const report = formatReport(check);
|
|
114
|
+
return buildSuccessResponse(id, report);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return buildSuccessResponse(id, check);
|
|
118
|
+
} catch (err) {
|
|
119
|
+
return buildErrorResponse(id, -32603, `Falha ao auditar credenciais: ${err.message}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Handler para configuração segura de credenciais no arquivo .env local (agent_configure_credentials).
|
|
125
|
+
*/
|
|
126
|
+
function handleConfigureCredentials(id, args) {
|
|
127
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
128
|
+
const { configureCredentials, auditToSarif } = require('../../integrations/credentials_guard.js');
|
|
129
|
+
const targetDir = safeArgs.targetDir || ROOT_DIR;
|
|
130
|
+
const { domain, email, token, jiraKey, confluenceSpace, format } = safeArgs;
|
|
131
|
+
|
|
132
|
+
if (!domain || !email || !token) {
|
|
133
|
+
return buildErrorResponse(
|
|
134
|
+
id,
|
|
135
|
+
-32602,
|
|
136
|
+
'Parâmetros obrigatórios ausentes: domain, email e token são requeridos.'
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
const result = configureCredentials(targetDir, { domain, email, token, jiraKey, confluenceSpace });
|
|
142
|
+
|
|
143
|
+
if (format === 'sarif') {
|
|
144
|
+
const sarif = auditToSarif({ allReady: result.success, envProtected: true });
|
|
145
|
+
return buildSuccessResponse(id, sarif);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return buildSuccessResponse(id, result);
|
|
149
|
+
} catch (err) {
|
|
150
|
+
return buildErrorResponse(id, -32603, `Falha ao configurar credenciais: ${err.message}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Handler para padronização de quadros Kanban e JQLs canônicos (agent_standardize_kanban).
|
|
156
|
+
*/
|
|
157
|
+
function handleStandardizeKanban(id, args) {
|
|
158
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
159
|
+
const {
|
|
160
|
+
CANONICAL_COLUMNS_LIST,
|
|
161
|
+
standardizeBoardColumns,
|
|
162
|
+
buildCanonicalJql,
|
|
163
|
+
auditToSarif
|
|
164
|
+
} = require('../../integrations/jira_manager.js');
|
|
165
|
+
|
|
166
|
+
const projectKey = safeArgs.projectKey || 'AGDEV';
|
|
167
|
+
const boardConfig = safeArgs.boardConfig;
|
|
168
|
+
const format = safeArgs.format || 'json';
|
|
169
|
+
|
|
170
|
+
try {
|
|
171
|
+
const jqls = {
|
|
172
|
+
todo: buildCanonicalJql(projectKey, 'A fazer'),
|
|
173
|
+
inProgress: buildCanonicalJql(projectKey, 'Em andamento'),
|
|
174
|
+
done: buildCanonicalJql(projectKey, 'Concluído')
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const boardStandardization = boardConfig ? standardizeBoardColumns(boardConfig) : null;
|
|
178
|
+
|
|
179
|
+
if (format === 'sarif') {
|
|
180
|
+
const sarif = auditToSarif({ wipStatus: { isSaturated: false } });
|
|
181
|
+
return buildSuccessResponse(id, sarif);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return buildSuccessResponse(id, {
|
|
185
|
+
status: 'SUCCESS',
|
|
186
|
+
projectKey,
|
|
187
|
+
canonicalColumns: CANONICAL_COLUMNS_LIST,
|
|
188
|
+
standardQueries: jqls,
|
|
189
|
+
boardStandardization
|
|
190
|
+
});
|
|
191
|
+
} catch (err) {
|
|
192
|
+
return buildErrorResponse(id, -32603, `Falha ao padronizar Kanban: ${err.message}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Handler para o Modo Full Developer Pipeline com filtro de sanidade (agent_full_dev_pipeline).
|
|
198
|
+
*/
|
|
199
|
+
function handleFullDevPipeline(id, args) {
|
|
200
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
201
|
+
const {
|
|
202
|
+
processFullDevPipeline,
|
|
203
|
+
auditToSarif,
|
|
204
|
+
formatReport
|
|
205
|
+
} = require('../../integrations/jira_manager.js');
|
|
206
|
+
|
|
207
|
+
const tasks = Array.isArray(safeArgs.tasks) ? safeArgs.tasks : [];
|
|
208
|
+
const projectContext = safeArgs.projectContext && typeof safeArgs.projectContext === 'object'
|
|
209
|
+
? safeArgs.projectContext
|
|
210
|
+
: {};
|
|
211
|
+
const maxWip = safeArgs.maxWip || 2;
|
|
212
|
+
const format = safeArgs.format || 'json';
|
|
213
|
+
|
|
214
|
+
try {
|
|
215
|
+
const pipelineResult = processFullDevPipeline(tasks, projectContext, maxWip);
|
|
216
|
+
|
|
217
|
+
if (format === 'sarif') {
|
|
218
|
+
const sarif = auditToSarif(pipelineResult);
|
|
219
|
+
return buildSuccessResponse(id, sarif);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (format === 'markdown') {
|
|
223
|
+
const report = formatReport(pipelineResult);
|
|
224
|
+
return buildSuccessResponse(id, report);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return buildSuccessResponse(id, pipelineResult);
|
|
228
|
+
} catch (err) {
|
|
229
|
+
return buildErrorResponse(id, -32603, `Falha no pipeline Full Dev: ${err.message}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Classe Canônica AtlassianHandlers
|
|
235
|
+
*/
|
|
236
|
+
class AtlassianHandlers {
|
|
237
|
+
constructor(options = {}) {
|
|
238
|
+
this.rootDir = options.rootDir || ROOT_DIR;
|
|
239
|
+
this.logger = options.logger || console;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
handleSyncAtlassian(id, args) {
|
|
243
|
+
return AtlassianHandlers.handleSyncAtlassian(id, args);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
handleCheckCredentials(id, args) {
|
|
247
|
+
return AtlassianHandlers.handleCheckCredentials(id, args);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
handleConfigureCredentials(id, args) {
|
|
251
|
+
return AtlassianHandlers.handleConfigureCredentials(id, args);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
handleStandardizeKanban(id, args) {
|
|
255
|
+
return AtlassianHandlers.handleStandardizeKanban(id, args);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
handleFullDevPipeline(id, args) {
|
|
259
|
+
return AtlassianHandlers.handleFullDevPipeline(id, args);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
static handleSyncAtlassian(id, args) {
|
|
263
|
+
return handleSyncAtlassian(id, args);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
static handleCheckCredentials(id, args) {
|
|
267
|
+
return handleCheckCredentials(id, args);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
static handleConfigureCredentials(id, args) {
|
|
271
|
+
return handleConfigureCredentials(id, args);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
static handleStandardizeKanban(id, args) {
|
|
275
|
+
return handleStandardizeKanban(id, args);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
static handleFullDevPipeline(id, args) {
|
|
279
|
+
return handleFullDevPipeline(id, args);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
static buildSuccessResponse(id, data) {
|
|
283
|
+
return buildSuccessResponse(id, data);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
static buildErrorResponse(id, code, msg, data) {
|
|
287
|
+
return buildErrorResponse(id, code, msg, data);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
module.exports = {
|
|
292
|
+
AtlassianHandlers,
|
|
293
|
+
buildSuccessResponse,
|
|
294
|
+
buildErrorResponse,
|
|
295
|
+
handleSyncAtlassian,
|
|
296
|
+
handleCheckCredentials,
|
|
297
|
+
handleConfigureCredentials,
|
|
298
|
+
handleStandardizeKanban,
|
|
299
|
+
handleFullDevPipeline
|
|
300
|
+
};
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/mcp/handlers/core_handlers.js
|
|
3
|
+
*
|
|
4
|
+
* Core & Governance MCP Handlers.
|
|
5
|
+
* Despacha chamadas JSON-RPC 2.0 para status do Full Dev, eventos multi-agente,
|
|
6
|
+
* gates de governança da Tríade (Regra 16), mineração de ideias de domínio,
|
|
7
|
+
* consultoria arquitetural (Princípio 7) e Dynamic Knowledge Gateway (ADR-008).
|
|
8
|
+
*
|
|
9
|
+
* Versão: 5.1.0 Enterprise
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
'use strict';
|
|
13
|
+
|
|
14
|
+
const fs = require('node:fs');
|
|
15
|
+
const path = require('node:path');
|
|
16
|
+
const { ROOT_DIR } = require('../resources_registry.js');
|
|
17
|
+
const { setMcpProfile } = require('../tools_registry.js');
|
|
18
|
+
const { createSarifReport } = require('../../core/sarif_engine.js');
|
|
19
|
+
|
|
20
|
+
let _orchestratorInstance = null;
|
|
21
|
+
function getOrchestrator() {
|
|
22
|
+
if (!_orchestratorInstance) {
|
|
23
|
+
const { MultiAgentOrchestrator } = require('../../core/multi_agent_orchestrator.js');
|
|
24
|
+
_orchestratorInstance = new MultiAgentOrchestrator();
|
|
25
|
+
}
|
|
26
|
+
return _orchestratorInstance;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Helpers funcionais puros para construção determinística de respostas JSON-RPC 2.0 (DRY)
|
|
31
|
+
*/
|
|
32
|
+
function buildSuccessResponse(id, data) {
|
|
33
|
+
const textContent = typeof data === 'string' ? data : JSON.stringify(data, null, 2);
|
|
34
|
+
return {
|
|
35
|
+
jsonrpc: '2.0',
|
|
36
|
+
id,
|
|
37
|
+
result: {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: textContent
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function buildErrorResponse(id, code, message, data = null) {
|
|
49
|
+
const errObj = { code, message };
|
|
50
|
+
if (data) errObj.data = data;
|
|
51
|
+
return {
|
|
52
|
+
jsonrpc: '2.0',
|
|
53
|
+
id,
|
|
54
|
+
error: errObj
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Helper puro para extração da próxima ideia pendente do IDEAS.md
|
|
60
|
+
* @param {string} ideasContent
|
|
61
|
+
* @returns {string}
|
|
62
|
+
*/
|
|
63
|
+
function extractNextIdea(ideasContent = '') {
|
|
64
|
+
if (!ideasContent || typeof ideasContent !== 'string') {
|
|
65
|
+
return 'Nenhuma ideia pendente no backlog aberto.';
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const lines = ideasContent.split(/\r?\n/);
|
|
69
|
+
for (const line of lines) {
|
|
70
|
+
const trimmed = line.trim();
|
|
71
|
+
if (/^- I-\d+/i.test(trimmed)) {
|
|
72
|
+
if (!/\[(CONCLUÍDO|EM PRODUÇÃO|DONE|DROP|REJEITAD[OA]|ARCHIVED)\]/i.test(trimmed)) {
|
|
73
|
+
return trimmed.replace(/^- /, '');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return 'Nenhuma ideia pendente no backlog aberto.';
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Handler para verificação de status do Modo Full Dev (agent_full_dev_status).
|
|
83
|
+
*/
|
|
84
|
+
function handleFullDevStatus(id, args) {
|
|
85
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
86
|
+
const rootDir = safeArgs.rootDir || ROOT_DIR;
|
|
87
|
+
const ideasPath = path.join(rootDir, 'docs', 'IDEAS.md');
|
|
88
|
+
|
|
89
|
+
let ideasContent = '';
|
|
90
|
+
if (fs.existsSync(ideasPath)) {
|
|
91
|
+
try {
|
|
92
|
+
ideasContent = fs.readFileSync(ideasPath, 'utf8');
|
|
93
|
+
} catch {
|
|
94
|
+
// tolerância defensiva
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const nextIdea = extractNextIdea(ideasContent);
|
|
99
|
+
const statusPayload = {
|
|
100
|
+
modo: 'full-dev',
|
|
101
|
+
status: 'ATIVO',
|
|
102
|
+
proximaIdeia: nextIdea,
|
|
103
|
+
regrasAtivas: 27,
|
|
104
|
+
principiosCanonicos: 10,
|
|
105
|
+
versao: '5.1.0',
|
|
106
|
+
governance: 'Tríplice Registro Obrigatório (Git, Jira, Confluence)'
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
if (safeArgs.format === 'sarif') {
|
|
110
|
+
const rules = [
|
|
111
|
+
{
|
|
112
|
+
id: 'RULE-DEV-001',
|
|
113
|
+
name: 'FullDevStatusCheck',
|
|
114
|
+
severity: 'NOTE',
|
|
115
|
+
message: 'Status operacional do modo Full Dev inspecionado com sucesso.'
|
|
116
|
+
}
|
|
117
|
+
];
|
|
118
|
+
const sarif = createSarifReport({
|
|
119
|
+
toolName: 'agent-master-full-dev',
|
|
120
|
+
toolVersion: '5.1.0',
|
|
121
|
+
rules,
|
|
122
|
+
findings: [
|
|
123
|
+
{
|
|
124
|
+
ruleId: 'RULE-DEV-001',
|
|
125
|
+
message: `Modo Full Dev ${statusPayload.status}. Próxima ideia: ${statusPayload.proximaIdeia}`,
|
|
126
|
+
filePath: 'docs/IDEAS.md',
|
|
127
|
+
line: 1,
|
|
128
|
+
column: 1
|
|
129
|
+
}
|
|
130
|
+
]
|
|
131
|
+
});
|
|
132
|
+
return buildSuccessResponse(id, sarif);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return buildSuccessResponse(id, statusPayload);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Handler para despacho de eventos pelo barramento multi-agente (agent_orchestrate_event).
|
|
140
|
+
*/
|
|
141
|
+
function handleOrchestrateEvent(id, args) {
|
|
142
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
143
|
+
const eventType = safeArgs.eventType;
|
|
144
|
+
const payload = safeArgs.payload || {};
|
|
145
|
+
|
|
146
|
+
if (!eventType) {
|
|
147
|
+
return buildErrorResponse(id, -32602, 'Parâmetro obrigatório ausente: eventType é requerido.');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
const orchestrator = getOrchestrator();
|
|
152
|
+
const eventRecord = orchestrator.dispatch(eventType, payload);
|
|
153
|
+
return buildSuccessResponse(id, {
|
|
154
|
+
status: 'SUCCESS',
|
|
155
|
+
eventRecord
|
|
156
|
+
});
|
|
157
|
+
} catch (err) {
|
|
158
|
+
return buildErrorResponse(id, -32603, `Falha ao despachar evento: ${err.message}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Handler para telemetria e metadados do Web Dashboard Inspector (agent_inspector_info).
|
|
164
|
+
*/
|
|
165
|
+
function handleInspectorInfo(id, args) {
|
|
166
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
167
|
+
const { getTelemetry, auditTelemetryToSarif } = require('../../bin/web_inspector.js');
|
|
168
|
+
const port = Number(safeArgs.port) || 4040;
|
|
169
|
+
const format = safeArgs.format ? String(safeArgs.format).toLowerCase() : 'json';
|
|
170
|
+
|
|
171
|
+
try {
|
|
172
|
+
if (format === 'sarif') {
|
|
173
|
+
const sarif = auditTelemetryToSarif();
|
|
174
|
+
return buildSuccessResponse(id, sarif);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return buildSuccessResponse(id, {
|
|
178
|
+
status: 'READY',
|
|
179
|
+
dashboardUrl: `http://localhost:${port}`,
|
|
180
|
+
endpoints: {
|
|
181
|
+
dashboard: '/',
|
|
182
|
+
status: '/api/status',
|
|
183
|
+
mcpProxy: '/api/mcp',
|
|
184
|
+
evalHarness: '/api/eval',
|
|
185
|
+
magicPrompt: '/api/magic-prompt'
|
|
186
|
+
},
|
|
187
|
+
telemetry: getTelemetry()
|
|
188
|
+
});
|
|
189
|
+
} catch (err) {
|
|
190
|
+
return buildErrorResponse(id, -32603, `Falha ao obter telemetria do Inspector: ${err.message}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Handler para diagnóstico bimodal de onboarding e stack (agent_smart_onboarding).
|
|
196
|
+
*/
|
|
197
|
+
function handleSmartOnboarding(id, args) {
|
|
198
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
199
|
+
const { detectProjectMode, inspectProjectContext } = require('../../bin/smart_onboarding.js');
|
|
200
|
+
const targetDir = safeArgs.targetDir || process.cwd();
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
const mode = detectProjectMode(targetDir);
|
|
204
|
+
const context = inspectProjectContext(targetDir);
|
|
205
|
+
return buildSuccessResponse(id, { mode, context });
|
|
206
|
+
} catch (err) {
|
|
207
|
+
return buildErrorResponse(id, -32603, `Falha ao executar Smart Onboarding: ${err.message}`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Handler para fiscalização do Gate da Tríade - Regra 16 (agent_verify_triad_gate).
|
|
213
|
+
*/
|
|
214
|
+
function handleVerifyTriadGate(id, args) {
|
|
215
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
216
|
+
const { verifyTriadGateSync, auditTriadToSarif } = require('../../bin/smart_onboarding.js');
|
|
217
|
+
const targetDir = safeArgs.targetDir || process.cwd();
|
|
218
|
+
const format = safeArgs.format ? String(safeArgs.format).toLowerCase() : 'json';
|
|
219
|
+
|
|
220
|
+
try {
|
|
221
|
+
if (format === 'sarif') {
|
|
222
|
+
const sarif = auditTriadToSarif(targetDir, safeArgs);
|
|
223
|
+
return buildSuccessResponse(id, sarif);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
let gateResult;
|
|
227
|
+
try {
|
|
228
|
+
gateResult = verifyTriadGateSync(targetDir, safeArgs);
|
|
229
|
+
} catch (err) {
|
|
230
|
+
gateResult = {
|
|
231
|
+
canDevelop: false,
|
|
232
|
+
verdict: 'BLOQUEADO_REGRA_16',
|
|
233
|
+
gateMessage: `⛔ Erro ao verificar Gate da Tríade: ${err.message}`,
|
|
234
|
+
blockers: [err.message]
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return buildSuccessResponse(id, gateResult);
|
|
239
|
+
} catch (err) {
|
|
240
|
+
return buildErrorResponse(id, -32603, `Falha ao verificar Gate da Tríade: ${err.message}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Handler para alternância dinâmica de perfis MCP (agent_set_mcp_profile).
|
|
246
|
+
*/
|
|
247
|
+
function handleSetMcpProfile(id, args) {
|
|
248
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
249
|
+
const target = safeArgs.profile || 'all';
|
|
250
|
+
|
|
251
|
+
try {
|
|
252
|
+
const res = setMcpProfile(target);
|
|
253
|
+
return buildSuccessResponse(id, res);
|
|
254
|
+
} catch (err) {
|
|
255
|
+
return buildErrorResponse(id, -32603, `Falha ao alternar perfil MCP: ${err.message}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Handler para mineração de oportunidades e ideação de domínio (agent_mine_domain_ideas).
|
|
261
|
+
*/
|
|
262
|
+
function handleMineDomainIdeas(id, args) {
|
|
263
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
264
|
+
const { mineDomainIdeas, DomainIdeaMiner } = require('../../bin/domain_idea_miner.js');
|
|
265
|
+
const targetDir = safeArgs.targetDir ? path.resolve(safeArgs.targetDir) : process.cwd();
|
|
266
|
+
const autoApply = safeArgs.autoApply === true;
|
|
267
|
+
const dryRun = safeArgs.dryRun === true;
|
|
268
|
+
const format = safeArgs.format ? String(safeArgs.format).toLowerCase() : 'json';
|
|
269
|
+
|
|
270
|
+
try {
|
|
271
|
+
if (format === 'sarif') {
|
|
272
|
+
const miner = new DomainIdeaMiner({ rootDir: targetDir });
|
|
273
|
+
const sarif = miner.mineToSarif(targetDir);
|
|
274
|
+
return buildSuccessResponse(id, sarif);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const report = mineDomainIdeas(targetDir, {
|
|
278
|
+
autoApply,
|
|
279
|
+
dryRun,
|
|
280
|
+
ideasFilePath: path.join(targetDir, 'docs', 'IDEAS.md')
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
return buildSuccessResponse(id, {
|
|
284
|
+
status: 'SUCCESS',
|
|
285
|
+
targetDir,
|
|
286
|
+
scannedFilesCount: report.scannedFilesCount,
|
|
287
|
+
opportunitiesFound: report.opportunitiesFound,
|
|
288
|
+
opportunities: report.opportunities,
|
|
289
|
+
syncResult: report.syncResult
|
|
290
|
+
});
|
|
291
|
+
} catch (err) {
|
|
292
|
+
return buildErrorResponse(id, -32603, `Falha ao minerar ideias de domínio: ${err.message}`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Handler para consultoria e recomendação arquitetural - Princípio 7 (agent_recommend_architecture).
|
|
298
|
+
*/
|
|
299
|
+
function handleRecommendArchitecture(id, args) {
|
|
300
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
301
|
+
const { recommendArchitecture } = require('../../core/architecture_advisor.js');
|
|
302
|
+
|
|
303
|
+
try {
|
|
304
|
+
const report = recommendArchitecture(safeArgs);
|
|
305
|
+
return buildSuccessResponse(id, report.reportMarkdown);
|
|
306
|
+
} catch (err) {
|
|
307
|
+
return buildErrorResponse(id, -32603, `Falha ao gerar recomendação arquitetural: ${err.message}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Handler para consulta ao Dynamic Knowledge Gateway - ADR-008 (agent_ground_knowledge).
|
|
313
|
+
*/
|
|
314
|
+
async function handleGroundKnowledge(id, args) {
|
|
315
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
316
|
+
const { getKnowledgeGateway } = require('../../core/knowledge_gateway.js');
|
|
317
|
+
const gateway = getKnowledgeGateway();
|
|
318
|
+
const action = safeArgs.action || 'lookup_doc';
|
|
319
|
+
|
|
320
|
+
try {
|
|
321
|
+
let resultPayload = null;
|
|
322
|
+
|
|
323
|
+
if (action === 'query_osv') {
|
|
324
|
+
resultPayload = await gateway.queryOsv(safeArgs.package || safeArgs.name, safeArgs.version, safeArgs.ecosystem || 'npm');
|
|
325
|
+
} else if (action === 'get_wcag_spec') {
|
|
326
|
+
resultPayload = gateway.getWcagSpec(safeArgs.criterion || safeArgs.ruleId);
|
|
327
|
+
} else if (action === 'get_spring_blueprint') {
|
|
328
|
+
resultPayload = await gateway.getSpringBlueprint(safeArgs);
|
|
329
|
+
} else if (action === 'get_runtime_lts') {
|
|
330
|
+
resultPayload = await gateway.getRuntimeLts(safeArgs.tech || safeArgs.stack);
|
|
331
|
+
} else if (action === 'get_cache_stats') {
|
|
332
|
+
resultPayload = gateway.getCacheStats();
|
|
333
|
+
} else if (action === 'clear_cache') {
|
|
334
|
+
resultPayload = gateway.clearCache();
|
|
335
|
+
} else {
|
|
336
|
+
resultPayload = gateway.lookupDoc(safeArgs.tech || safeArgs.stack || 'general', safeArgs.topic || 'architecture');
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return buildSuccessResponse(id, resultPayload);
|
|
340
|
+
} catch (err) {
|
|
341
|
+
return buildErrorResponse(id, -32603, `Falha ao consultar Knowledge Gateway: ${err.message}`);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Classe Canônica CoreHandlers
|
|
347
|
+
*/
|
|
348
|
+
class CoreHandlers {
|
|
349
|
+
constructor(options = {}) {
|
|
350
|
+
this.rootDir = options.rootDir || ROOT_DIR;
|
|
351
|
+
this.logger = options.logger || console;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
handleFullDevStatus(id, args) {
|
|
355
|
+
return CoreHandlers.handleFullDevStatus(id, args);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
handleOrchestrateEvent(id, args) {
|
|
359
|
+
return CoreHandlers.handleOrchestrateEvent(id, args);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
handleInspectorInfo(id, args) {
|
|
363
|
+
return CoreHandlers.handleInspectorInfo(id, args);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
handleSmartOnboarding(id, args) {
|
|
367
|
+
return CoreHandlers.handleSmartOnboarding(id, args);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
handleVerifyTriadGate(id, args) {
|
|
371
|
+
return CoreHandlers.handleVerifyTriadGate(id, args);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
handleSetMcpProfile(id, args) {
|
|
375
|
+
return CoreHandlers.handleSetMcpProfile(id, args);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
handleMineDomainIdeas(id, args) {
|
|
379
|
+
return CoreHandlers.handleMineDomainIdeas(id, args);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
handleRecommendArchitecture(id, args) {
|
|
383
|
+
return CoreHandlers.handleRecommendArchitecture(id, args);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
async handleGroundKnowledge(id, args) {
|
|
387
|
+
return CoreHandlers.handleGroundKnowledge(id, args);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Métodos estáticos canônicos
|
|
391
|
+
static buildSuccessResponse(id, data) { return buildSuccessResponse(id, data); }
|
|
392
|
+
static buildErrorResponse(id, code, msg, data) { return buildErrorResponse(id, code, msg, data); }
|
|
393
|
+
static extractNextIdea(content) { return extractNextIdea(content); }
|
|
394
|
+
static handleFullDevStatus(id, args) { return handleFullDevStatus(id, args); }
|
|
395
|
+
static handleOrchestrateEvent(id, args) { return handleOrchestrateEvent(id, args); }
|
|
396
|
+
static handleInspectorInfo(id, args) { return handleInspectorInfo(id, args); }
|
|
397
|
+
static handleSmartOnboarding(id, args) { return handleSmartOnboarding(id, args); }
|
|
398
|
+
static handleVerifyTriadGate(id, args) { return handleVerifyTriadGate(id, args); }
|
|
399
|
+
static handleSetMcpProfile(id, args) { return handleSetMcpProfile(id, args); }
|
|
400
|
+
static handleMineDomainIdeas(id, args) { return handleMineDomainIdeas(id, args); }
|
|
401
|
+
static handleRecommendArchitecture(id, args) { return handleRecommendArchitecture(id, args); }
|
|
402
|
+
static handleGroundKnowledge(id, args) { return handleGroundKnowledge(id, args); }
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
module.exports = {
|
|
406
|
+
CoreHandlers,
|
|
407
|
+
buildSuccessResponse,
|
|
408
|
+
buildErrorResponse,
|
|
409
|
+
extractNextIdea,
|
|
410
|
+
handleFullDevStatus,
|
|
411
|
+
handleOrchestrateEvent,
|
|
412
|
+
handleInspectorInfo,
|
|
413
|
+
handleSmartOnboarding,
|
|
414
|
+
handleVerifyTriadGate,
|
|
415
|
+
handleSetMcpProfile,
|
|
416
|
+
handleMineDomainIdeas,
|
|
417
|
+
handleRecommendArchitecture,
|
|
418
|
+
handleGroundKnowledge
|
|
419
|
+
};
|