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
@@ -1,313 +1,357 @@
1
- /**
2
- * Universal Multi-Platform Packager & Profile Generator
3
- * Exportador universal de perfis, manifestos e configurações do Agent Master DevSecOps
4
- * para Cursor IDE, Windsurf, Claude Desktop, ChatGPT Custom GPTs e Ollama local.
5
- * Conforme especificado em AGDEV-5 e README.md.
6
- */
7
-
8
- const fs = require('node:fs');
9
- const path = require('node:path');
10
-
11
- const SUPPORTED_PLATFORMS = ['cursor', 'windsurf', 'vscode', 'claude_desktop', 'chatgpt', 'ollama', 'antigravity', 'all'];
12
-
13
- class UniversalPackager {
14
- constructor(baseDir = path.resolve(__dirname, '..')) {
15
- this.baseDir = baseDir;
16
- }
17
-
18
- getCanonicalRules() {
19
- const rulesPath = path.join(this.baseDir, 'docs', 'ENGINEERING_RULES.md');
20
- if (fs.existsSync(rulesPath)) {
21
- return fs.readFileSync(rulesPath, 'utf8');
22
- }
23
- return '14 Regras Fundamentais de Engenharia DevSecOps';
24
- }
25
-
26
- getCompactPrompt() {
27
- const compactPath = path.join(this.baseDir, 'agents', 'compact', 'AGENT_ORCHESTRATOR_COMPACTO.md');
28
- if (fs.existsSync(compactPath)) {
29
- return fs.readFileSync(compactPath, 'utf8');
30
- }
31
- return 'Agente Mestre Universal DevSecOps - 14 Regras e 5 Modos';
32
- }
33
-
34
- generateCursorProfile(targetDir, options = {}) {
35
- const cursorRulesContent = `# Cursor Rules — Agent Master DevSecOps\n\n${this.getCompactPrompt()}`;
36
- const mcpConfig = {
37
- mcpServers: {
38
- 'agent-master-devsecops': {
39
- command: 'node',
40
- args: [options.mcpServerPath || path.resolve(this.baseDir, 'scripts', 'mcp_server.js')]
41
- }
42
- }
43
- };
44
-
45
- const files = [
46
- { path: path.join(targetDir, '.cursorrules'), content: cursorRulesContent },
47
- { path: path.join(targetDir, '.cursor', 'mcp.json'), content: JSON.stringify(mcpConfig, null, 2) }
48
- ];
49
-
50
- if (!options.dryRun) {
51
- files.forEach(f => {
52
- fs.mkdirSync(path.dirname(f.path), { recursive: true });
53
- fs.writeFileSync(f.path, f.content, 'utf8');
54
- });
55
- }
56
-
57
- return { platform: 'cursor', filesCount: files.length, files: files.map(f => f.path) };
58
- }
59
-
60
- generateWindsurfProfile(targetDir, options = {}) {
61
- const content = `# Windsurf Rules — Agent Master DevSecOps\n\n${this.getCompactPrompt()}`;
62
- const filePath = path.join(targetDir, '.windsurfrules');
63
-
64
- if (!options.dryRun) {
65
- fs.mkdirSync(targetDir, { recursive: true });
66
- fs.writeFileSync(filePath, content, 'utf8');
67
- }
68
-
69
- return { platform: 'windsurf', filesCount: 1, files: [filePath] };
70
- }
71
-
72
- generateClaudeDesktopProfile(targetDir, options = {}) {
73
- const mcpConfig = {
74
- mcpServers: {
75
- 'agent-master-devsecops': {
76
- command: 'node',
77
- args: [options.mcpServerPath || path.resolve(this.baseDir, 'scripts', 'mcp_server.js')]
78
- }
79
- }
80
- };
81
- const filePath = path.join(targetDir, 'claude_desktop_config.json');
82
-
83
- if (!options.dryRun) {
84
- fs.mkdirSync(targetDir, { recursive: true });
85
- fs.writeFileSync(filePath, JSON.stringify(mcpConfig, null, 2), 'utf8');
86
- }
87
-
88
- return { platform: 'claude_desktop', filesCount: 1, files: [filePath] };
89
- }
90
-
91
- generateChatGptProfile(targetDir, options = {}) {
92
- const openApiSchema = {
93
- openapi: '3.1.0',
94
- info: {
95
- title: 'Agent Master DevSecOps API',
96
- version: '3.2.0',
97
- description: 'Serviço de auditoria e governança autônoma DevSecOps para Custom GPTs.'
98
- },
99
- paths: {
100
- '/audit': {
101
- post: {
102
- summary: 'Audita código contra as 14 Regras e OWASP',
103
- operationId: 'auditCode',
104
- responses: { '200': { description: 'Relatório de auditoria' } }
105
- }
106
- }
107
- }
108
- };
109
-
110
- const files = [
111
- { path: path.join(targetDir, 'chatgpt_custom_instructions.md'), content: this.getCompactPrompt() },
112
- { path: path.join(targetDir, 'agent_master_openapi.json'), content: JSON.stringify(openApiSchema, null, 2) }
113
- ];
114
-
115
- if (!options.dryRun) {
116
- files.forEach(f => {
117
- fs.mkdirSync(path.dirname(f.path), { recursive: true });
118
- fs.writeFileSync(f.path, f.content, 'utf8');
119
- });
120
- }
121
-
122
- return { platform: 'chatgpt', filesCount: files.length, files: files.map(f => f.path) };
123
- }
124
-
125
- generateOllamaProfile(targetDir, options = {}) {
126
- const baseModel = options.baseModel || 'qwen2.5-coder:7b';
127
- const modelfileContent = 'FROM ' + baseModel + '\n\nSYSTEM """\n' + this.getCompactPrompt() + '\n"""\n\nPARAMETER temperature 0.2\nPARAMETER stop "```"\n';
128
- const filePath = path.join(targetDir, 'Modelfile');
129
-
130
- if (!options.dryRun) {
131
- fs.mkdirSync(targetDir, { recursive: true });
132
- fs.writeFileSync(filePath, modelfileContent, 'utf8');
133
- }
134
-
135
- return { platform: 'ollama', filesCount: 1, files: [filePath] };
136
- }
137
-
138
- generateAntigravityConfig(targetDir, options = {}) {
139
- const homeDir = process.env.USERPROFILE || process.env.HOME || '';
140
- const mcpServerPath = options.mcpServerPath || path.resolve(this.baseDir, 'scripts', 'mcp_server.js');
141
- const geminiConfigDir = path.join(homeDir, '.gemini', 'config');
142
- const mcpConfigPath = path.join(geminiConfigDir, 'mcp_config.json');
143
-
144
- const files = [];
145
-
146
- if (!options.dryRun) {
147
- if (!fs.existsSync(geminiConfigDir)) {
148
- fs.mkdirSync(geminiConfigDir, { recursive: true });
149
- }
150
-
151
- let mcpJson = { mcpServers: {} };
152
- if (fs.existsSync(mcpConfigPath)) {
153
- try {
154
- mcpJson = JSON.parse(fs.readFileSync(mcpConfigPath, 'utf8'));
155
- if (!mcpJson.mcpServers) mcpJson.mcpServers = {};
156
- } catch (_) {}
157
- }
158
-
159
- mcpJson.mcpServers['agent-master-devsecops'] = {
160
- command: 'node',
161
- args: [mcpServerPath]
162
- };
163
-
164
- fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpJson, null, 2), 'utf8');
165
- files.push(mcpConfigPath);
166
- }
167
-
168
- return { platform: 'antigravity', filesCount: 1, files };
169
- }
170
-
171
- generateVsCodeProfile(targetDir, options = {}) {
172
- const vscodeDir = path.join(targetDir, '.vscode');
173
- const mcpConfigPath = path.join(vscodeDir, 'mcp.json');
174
- const mcpConfig = {
175
- mcpServers: {
176
- 'agent-master-devsecops': {
177
- command: 'node',
178
- args: [options.mcpServerPath || path.resolve(this.baseDir, 'scripts', 'mcp_server.js')]
179
- }
180
- }
181
- };
182
-
183
- const files = [mcpConfigPath];
184
- if (!options.dryRun) {
185
- if (!fs.existsSync(vscodeDir)) fs.mkdirSync(vscodeDir, { recursive: true });
186
- fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2), 'utf8');
187
- }
188
-
189
- return { platform: 'vscode', filesCount: 1, files };
190
- }
191
-
192
- exportProfile(platform, targetDir, options = {}) {
193
- const cleanPlatform = String(platform).toLowerCase();
194
- switch (cleanPlatform) {
195
- case 'cursor':
196
- return this.generateCursorProfile(targetDir, options);
197
- case 'windsurf':
198
- return this.generateWindsurfProfile(targetDir, options);
199
- case 'vscode':
200
- case 'code':
201
- return this.generateVsCodeProfile(targetDir, options);
202
- case 'claude_desktop':
203
- case 'claude':
204
- return this.generateClaudeDesktopProfile(targetDir, options);
205
- case 'chatgpt':
206
- return this.generateChatGptProfile(targetDir, options);
207
- case 'ollama':
208
- return this.generateOllamaProfile(targetDir, options);
209
- case 'antigravity':
210
- case 'gemini':
211
- return this.generateAntigravityConfig(targetDir, options);
212
- case 'all': {
213
- const r1 = this.generateCursorProfile(targetDir, options);
214
- const r2 = this.generateWindsurfProfile(targetDir, options);
215
- const r3 = this.generateClaudeDesktopProfile(targetDir, options);
216
- const r4 = this.generateChatGptProfile(targetDir, options);
217
- const r5 = this.generateOllamaProfile(targetDir, options);
218
- const r6 = this.generateVsCodeProfile(targetDir, options);
219
- const r7 = this.generateAntigravityConfig(targetDir, options);
220
- return {
221
- platform: 'all',
222
- totalFiles: r1.filesCount + r2.filesCount + r3.filesCount + r4.filesCount + r5.filesCount + r6.filesCount + r7.filesCount,
223
- results: [r1, r2, r3, r4, r5, r6, r7]
224
- };
225
- }
226
- default:
227
- throw new Error(`Plataforma não suportada: "${platform}". Plataformas suportadas: ${SUPPORTED_PLATFORMS.join(', ')}`);
228
- }
229
- }
230
- }
231
-
232
-
233
- function generateVsCodeSettings() {
234
- return {
235
- "mcp.servers": {
236
- "agent-master-devsecops": {
237
- "command": "node",
238
- "args": ["${workspaceFolder}/node_modules/agent-master-devsecops/scripts/mcp_server.js"]
239
- }
240
- },
241
- "customInstructions": [
242
- {
243
- "role": "system",
244
- "content": "Siga rigorosamente as 15 Regras de Engenharia da suíte multi-agente e responda no formato de saída compacta com links diretos."
245
- }
246
- ],
247
- "shortcuts": {
248
- "orchestrator": "modo: orchestrator",
249
- "devsecops": "modo: devsecops",
250
- "qa": "modo: qa",
251
- "scrum": "modo: scrum",
252
- "sre": "modo: sre",
253
- "full-dev": "modo: full-dev"
254
- }
255
- };
256
- }
257
-
258
- function generateJetBrainsConfig() {
259
- return {
260
- "agentMasterDevSecOps": {
261
- "version": "3.6.0",
262
- "mcpEnabled": true,
263
- "mcpTransport": "stdio",
264
- "mcpCommand": "node scripts/mcp_server.js",
265
- "modes": ["orchestrator", "devsecops", "qa", "scrum", "sre", "full-dev"],
266
- "ruleSet": "docs/ENGINEERING_RULES.md",
267
- "dualLayerOutput": true
268
- }
269
- };
270
- }
271
-
272
- function exportIdeConfigs(targetDir, options = {}) {
273
- const results = {
274
- vscodeConfigured: false,
275
- jetbrainsConfigured: false
276
- };
277
-
278
- const vscodeDir = path.join(targetDir, '.vscode');
279
- const jetbrainsDir = path.join(targetDir, '.idea');
280
-
281
- if (!options.dryRun) {
282
- if (!fs.existsSync(vscodeDir)) fs.mkdirSync(vscodeDir, { recursive: true });
283
- if (!fs.existsSync(jetbrainsDir)) fs.mkdirSync(jetbrainsDir, { recursive: true });
284
-
285
- fs.writeFileSync(
286
- path.join(vscodeDir, 'agent-master.json'),
287
- JSON.stringify(generateVsCodeSettings(), null, 2),
288
- 'utf8'
289
- );
290
- results.vscodeConfigured = true;
291
-
292
- fs.writeFileSync(
293
- path.join(jetbrainsDir, 'agent-master.json'),
294
- JSON.stringify(generateJetBrainsConfig(), null, 2),
295
- 'utf8'
296
- );
297
- results.jetbrainsConfigured = true;
298
- } else {
299
- results.vscodeConfigured = true;
300
- results.jetbrainsConfigured = true;
301
- }
302
-
303
- return results;
304
- }
305
-
306
- module.exports = {
307
- UniversalPackager,
308
- SUPPORTED_PLATFORMS,
309
- generateVsCodeSettings,
310
- generateJetBrainsConfig,
311
- exportIdeConfigs,
312
- generateIdeConfigs: exportIdeConfigs
313
- };
1
+ /**
2
+ * Universal Multi-Platform Packager & Profile Generator
3
+ * Exportador universal de perfis, manifestos e configurações do Agent Master DevSecOps
4
+ * para Cursor IDE, Windsurf, Claude Desktop, ChatGPT Custom GPTs e Ollama local.
5
+ * Conforme especificado em AGDEV-5 e README.md.
6
+ */
7
+
8
+ const fs = require('node:fs');
9
+ const path = require('node:path');
10
+ const { version: PKG_VERSION } = require('../../package.json');
11
+ const { generateCompactPrompt } = require('./context_compressor.js');
12
+ const { createSarifReport } = require('./sarif_engine.js');
13
+
14
+ const SUPPORTED_PLATFORMS = ['cursor', 'windsurf', 'vscode', 'claude_desktop', 'chatgpt', 'ollama', 'antigravity', 'all'];
15
+
16
+ class UniversalPackager {
17
+ constructor(baseDir = path.resolve(__dirname, '../..')) {
18
+ this.baseDir = baseDir;
19
+ }
20
+
21
+ getCanonicalRules() {
22
+ const rulesPath = path.join(this.baseDir, 'docs', 'ENGINEERING_RULES.md');
23
+ if (fs.existsSync(rulesPath)) {
24
+ return fs.readFileSync(rulesPath, 'utf8');
25
+ }
26
+ return '10 Princípios Canônicos de Engenharia de Software & Governança';
27
+ }
28
+
29
+ getCompactPrompt() {
30
+ return generateCompactPrompt();
31
+ }
32
+
33
+ generateCursorProfile(targetDir, options = {}) {
34
+ const cursorRulesContent = `# Cursor Rules — Agent Master DevSecOps\n\n${this.getCompactPrompt()}`;
35
+ const mcpConfig = {
36
+ mcpServers: {
37
+ 'agent-master-devsecops': {
38
+ command: 'node',
39
+ args: [options.mcpServerPath || path.resolve(this.baseDir, 'scripts', 'mcp_server.js')]
40
+ }
41
+ }
42
+ };
43
+
44
+ const files = [
45
+ { path: path.join(targetDir, '.cursorrules'), content: cursorRulesContent },
46
+ { path: path.join(targetDir, '.cursor', 'mcp.json'), content: JSON.stringify(mcpConfig, null, 2) }
47
+ ];
48
+
49
+ if (!options.dryRun) {
50
+ files.forEach(f => {
51
+ fs.mkdirSync(path.dirname(f.path), { recursive: true });
52
+ fs.writeFileSync(f.path, f.content, 'utf8');
53
+ });
54
+ }
55
+
56
+ return { platform: 'cursor', filesCount: files.length, files: files.map(f => f.path) };
57
+ }
58
+
59
+ generateWindsurfProfile(targetDir, options = {}) {
60
+ const content = `# Windsurf Rules — Agent Master DevSecOps\n\n${this.getCompactPrompt()}`;
61
+ const filePath = path.join(targetDir, '.windsurfrules');
62
+
63
+ if (!options.dryRun) {
64
+ fs.mkdirSync(targetDir, { recursive: true });
65
+ fs.writeFileSync(filePath, content, 'utf8');
66
+ }
67
+
68
+ return { platform: 'windsurf', filesCount: 1, files: [filePath] };
69
+ }
70
+
71
+ generateClaudeDesktopProfile(targetDir, options = {}) {
72
+ const mcpConfig = {
73
+ mcpServers: {
74
+ 'agent-master-devsecops': {
75
+ command: 'node',
76
+ args: [options.mcpServerPath || path.resolve(this.baseDir, 'scripts', 'mcp_server.js')]
77
+ }
78
+ }
79
+ };
80
+ const filePath = path.join(targetDir, 'claude_desktop_config.json');
81
+
82
+ if (!options.dryRun) {
83
+ fs.mkdirSync(targetDir, { recursive: true });
84
+ fs.writeFileSync(filePath, JSON.stringify(mcpConfig, null, 2), 'utf8');
85
+ }
86
+
87
+ return { platform: 'claude_desktop', filesCount: 1, files: [filePath] };
88
+ }
89
+
90
+ generateChatGptProfile(targetDir, options = {}) {
91
+ const openApiSchema = {
92
+ openapi: '3.1.0',
93
+ info: {
94
+ title: 'Agent Master DevSecOps API',
95
+ version: PKG_VERSION,
96
+ description: 'Serviço de auditoria e governança autônoma DevSecOps para Custom GPTs.'
97
+ },
98
+ paths: {
99
+ '/audit': {
100
+ post: {
101
+ summary: 'Audita código contra os 10 Princípios Canônicos e OWASP',
102
+ operationId: 'auditCode',
103
+ responses: { '200': { description: 'Relatório de auditoria' } }
104
+ }
105
+ }
106
+ }
107
+ };
108
+
109
+ const files = [
110
+ { path: path.join(targetDir, 'chatgpt_custom_instructions.md'), content: this.getCompactPrompt() },
111
+ { path: path.join(targetDir, 'agent_master_openapi.json'), content: JSON.stringify(openApiSchema, null, 2) }
112
+ ];
113
+
114
+ if (!options.dryRun) {
115
+ files.forEach(f => {
116
+ fs.mkdirSync(path.dirname(f.path), { recursive: true });
117
+ fs.writeFileSync(f.path, f.content, 'utf8');
118
+ });
119
+ }
120
+
121
+ return { platform: 'chatgpt', filesCount: files.length, files: files.map(f => f.path) };
122
+ }
123
+
124
+ generateOllamaProfile(targetDir, options = {}) {
125
+ const baseModel = options.baseModel || 'qwen2.5-coder:7b';
126
+ const modelfileContent = 'FROM ' + baseModel + '\n\nSYSTEM """\n' + this.getCompactPrompt() + '\n"""\n\nPARAMETER temperature 0.2\n';
127
+ const filePath = path.join(targetDir, 'Modelfile');
128
+
129
+ if (!options.dryRun) {
130
+ fs.mkdirSync(targetDir, { recursive: true });
131
+ fs.writeFileSync(filePath, modelfileContent, 'utf8');
132
+ }
133
+
134
+ return { platform: 'ollama', filesCount: 1, files: [filePath] };
135
+ }
136
+
137
+ generateAntigravityConfig(targetDir, options = {}) {
138
+ const homeDir = process.env.USERPROFILE || process.env.HOME || '';
139
+ const mcpServerPath = options.mcpServerPath || path.resolve(this.baseDir, 'scripts', 'mcp_server.js');
140
+ const geminiConfigDir = path.join(homeDir, '.gemini', 'config');
141
+ const mcpConfigPath = path.join(geminiConfigDir, 'mcp_config.json');
142
+
143
+ const files = [];
144
+
145
+ if (!options.dryRun) {
146
+ if (!fs.existsSync(geminiConfigDir)) {
147
+ fs.mkdirSync(geminiConfigDir, { recursive: true });
148
+ }
149
+
150
+ let mcpJson = { mcpServers: {} };
151
+ if (fs.existsSync(mcpConfigPath)) {
152
+ try {
153
+ mcpJson = JSON.parse(fs.readFileSync(mcpConfigPath, 'utf8'));
154
+ if (!mcpJson.mcpServers) mcpJson.mcpServers = {};
155
+ } catch (err) {
156
+ mcpJson = { mcpServers: {} };
157
+ void err;
158
+ }
159
+ }
160
+
161
+ mcpJson.mcpServers['agent-master-devsecops'] = {
162
+ command: 'node',
163
+ args: [mcpServerPath]
164
+ };
165
+
166
+ fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpJson, null, 2), 'utf8');
167
+ files.push(mcpConfigPath);
168
+ }
169
+
170
+ return { platform: 'antigravity', filesCount: 1, files };
171
+ }
172
+
173
+ generateVsCodeProfile(targetDir, options = {}) {
174
+ const vscodeDir = path.join(targetDir, '.vscode');
175
+ const mcpConfigPath = path.join(vscodeDir, 'mcp.json');
176
+ const mcpConfig = {
177
+ mcpServers: {
178
+ 'agent-master-devsecops': {
179
+ command: 'node',
180
+ args: [options.mcpServerPath || path.resolve(this.baseDir, 'scripts', 'mcp_server.js')]
181
+ }
182
+ }
183
+ };
184
+
185
+ const files = [mcpConfigPath];
186
+ if (!options.dryRun) {
187
+ if (!fs.existsSync(vscodeDir)) fs.mkdirSync(vscodeDir, { recursive: true });
188
+ fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2), 'utf8');
189
+ }
190
+
191
+ return { platform: 'vscode', filesCount: 1, files };
192
+ }
193
+
194
+ exportProfile(platform, targetDir, options = {}) {
195
+ const cleanPlatform = String(platform).toLowerCase();
196
+ switch (cleanPlatform) {
197
+ case 'cursor':
198
+ return this.generateCursorProfile(targetDir, options);
199
+ case 'windsurf':
200
+ return this.generateWindsurfProfile(targetDir, options);
201
+ case 'vscode':
202
+ case 'code':
203
+ return this.generateVsCodeProfile(targetDir, options);
204
+ case 'claude_desktop':
205
+ case 'claude':
206
+ return this.generateClaudeDesktopProfile(targetDir, options);
207
+ case 'chatgpt':
208
+ return this.generateChatGptProfile(targetDir, options);
209
+ case 'ollama':
210
+ return this.generateOllamaProfile(targetDir, options);
211
+ case 'antigravity':
212
+ case 'gemini':
213
+ return this.generateAntigravityConfig(targetDir, options);
214
+ case 'all': {
215
+ const r1 = this.generateCursorProfile(targetDir, options);
216
+ const r2 = this.generateWindsurfProfile(targetDir, options);
217
+ const r3 = this.generateClaudeDesktopProfile(targetDir, options);
218
+ const r4 = this.generateChatGptProfile(targetDir, options);
219
+ const r5 = this.generateOllamaProfile(targetDir, options);
220
+ const r6 = this.generateVsCodeProfile(targetDir, options);
221
+ const r7 = this.generateAntigravityConfig(targetDir, options);
222
+ return {
223
+ platform: 'all',
224
+ totalFiles: r1.filesCount + r2.filesCount + r3.filesCount + r4.filesCount + r5.filesCount + r6.filesCount + r7.filesCount,
225
+ results: [r1, r2, r3, r4, r5, r6, r7]
226
+ };
227
+ }
228
+ default:
229
+ throw new Error(`Plataforma não suportada: "${platform}". Plataformas suportadas: ${SUPPORTED_PLATFORMS.join(', ')}`);
230
+ }
231
+ }
232
+
233
+ auditToSarif(targetPlatform = 'all') {
234
+ const findings = [];
235
+ const supported = SUPPORTED_PLATFORMS.includes(String(targetPlatform).toLowerCase());
236
+
237
+ if (!supported) {
238
+ findings.push({
239
+ ruleId: 'RULE-PKG-001',
240
+ name: 'UnsupportedPackagingPlatform',
241
+ severity: 'WARNING',
242
+ message: `Plataforma "${targetPlatform}" não é suportada nativamente.`,
243
+ remediation: `Utilize uma das plataformas homologadas: ${SUPPORTED_PLATFORMS.join(', ')}.`
244
+ });
245
+ }
246
+
247
+ return createSarifReport({
248
+ toolName: 'agent-master-universal-packager',
249
+ rules: [
250
+ {
251
+ id: 'RULE-PKG-001',
252
+ name: 'UnsupportedPackagingPlatform',
253
+ description: 'Identifica tentativas de exportação para plataformas sem blueprint homologado',
254
+ severity: 'MEDIUM',
255
+ cwe: 'CWE-400'
256
+ }
257
+ ],
258
+ findings,
259
+ properties: {
260
+ platform: targetPlatform,
261
+ supportedPlatforms: SUPPORTED_PLATFORMS
262
+ }
263
+ });
264
+ }
265
+
266
+ formatReport() {
267
+ return [
268
+ '### Relatório de Empacotador Universal de Perfis & IDEs',
269
+ `- **Plataformas Homologadas:** \`${SUPPORTED_PLATFORMS.join('`, `')}\``,
270
+ `- **Modo MCP Padrão:** stdio via \`scripts/mcp_server.js\``,
271
+ `- **Suporte:** Cursor, Windsurf, Claude Desktop, Antigravity, VS Code, Ollama, ChatGPT`
272
+ ].join('\n');
273
+ }
274
+ }
275
+
276
+
277
+ function generateVsCodeSettings() {
278
+ return {
279
+ "mcp.servers": {
280
+ "agent-master-devsecops": {
281
+ "command": "node",
282
+ "args": ["${workspaceFolder}/node_modules/agent-master-devsecops/scripts/mcp_server.js"]
283
+ }
284
+ },
285
+ "customInstructions": [
286
+ {
287
+ "role": "system",
288
+ "content": "Siga rigorosamente as 15 Regras de Engenharia da suíte multi-agente e responda no formato de saída compacta com links diretos."
289
+ }
290
+ ],
291
+ "shortcuts": {
292
+ "orchestrator": "modo: orchestrator",
293
+ "devsecops": "modo: devsecops",
294
+ "qa": "modo: qa",
295
+ "scrum": "modo: scrum",
296
+ "sre": "modo: sre",
297
+ "full-dev": "modo: full-dev"
298
+ }
299
+ };
300
+ }
301
+
302
+ function generateJetBrainsConfig() {
303
+ return {
304
+ "agentMasterDevSecOps": {
305
+ "version": PKG_VERSION,
306
+ "mcpEnabled": true,
307
+ "mcpTransport": "stdio",
308
+ "mcpCommand": "node scripts/mcp_server.js",
309
+ "modes": ["orchestrator", "devsecops", "qa", "scrum", "sre", "full-dev"],
310
+ "ruleSet": "docs/ENGINEERING_RULES.md",
311
+ "dualLayerOutput": true
312
+ }
313
+ };
314
+ }
315
+
316
+ function exportIdeConfigs(targetDir, options = {}) {
317
+ const results = {
318
+ vscodeConfigured: false,
319
+ jetbrainsConfigured: false
320
+ };
321
+
322
+ const vscodeDir = path.join(targetDir, '.vscode');
323
+ const jetbrainsDir = path.join(targetDir, '.idea');
324
+
325
+ if (!options.dryRun) {
326
+ if (!fs.existsSync(vscodeDir)) fs.mkdirSync(vscodeDir, { recursive: true });
327
+ if (!fs.existsSync(jetbrainsDir)) fs.mkdirSync(jetbrainsDir, { recursive: true });
328
+
329
+ fs.writeFileSync(
330
+ path.join(vscodeDir, 'agent-master.json'),
331
+ JSON.stringify(generateVsCodeSettings(), null, 2),
332
+ 'utf8'
333
+ );
334
+ results.vscodeConfigured = true;
335
+
336
+ fs.writeFileSync(
337
+ path.join(jetbrainsDir, 'agent-master.json'),
338
+ JSON.stringify(generateJetBrainsConfig(), null, 2),
339
+ 'utf8'
340
+ );
341
+ results.jetbrainsConfigured = true;
342
+ } else {
343
+ results.vscodeConfigured = true;
344
+ results.jetbrainsConfigured = true;
345
+ }
346
+
347
+ return results;
348
+ }
349
+
350
+ module.exports = {
351
+ UniversalPackager,
352
+ SUPPORTED_PLATFORMS,
353
+ generateVsCodeSettings,
354
+ generateJetBrainsConfig,
355
+ exportIdeConfigs,
356
+ generateIdeConfigs: exportIdeConfigs
357
+ };