@intellectronica/ruler 0.2.13 → 0.2.14
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/dist/lib.js +10 -0
- package/dist/mcp/propagateOpenCodeMcp.js +113 -0
- package/package.json +1 -1
package/dist/lib.js
CHANGED
|
@@ -59,6 +59,7 @@ const merge_1 = require("./mcp/merge");
|
|
|
59
59
|
const validate_1 = require("./mcp/validate");
|
|
60
60
|
const mcp_1 = require("./paths/mcp");
|
|
61
61
|
const propagateOpenHandsMcp_1 = require("./mcp/propagateOpenHandsMcp");
|
|
62
|
+
const propagateOpenCodeMcp_1 = require("./mcp/propagateOpenCodeMcp");
|
|
62
63
|
const constants_1 = require("./constants");
|
|
63
64
|
/**
|
|
64
65
|
* Gets all output paths for an agent, taking into account any config overrides.
|
|
@@ -267,6 +268,15 @@ async function applyAllAgentConfigs(projectRoot, includedAgents, configPath, cli
|
|
|
267
268
|
(0, constants_1.logVerbose)(`DRY RUN: AugmentCode MCP config handled internally via VSCode settings`, verbose);
|
|
268
269
|
}
|
|
269
270
|
}
|
|
271
|
+
else if (agent.getIdentifier() === 'opencode') {
|
|
272
|
+
// *** Special handling for OpenCode ***
|
|
273
|
+
if (dryRun) {
|
|
274
|
+
(0, constants_1.logVerbose)(`DRY RUN: Would apply MCP config by updating OpenCode config file: ${dest}`, verbose);
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
await (0, propagateOpenCodeMcp_1.propagateMcpToOpenCode)(rulerMcpFile, dest);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
270
280
|
else {
|
|
271
281
|
if (rulerMcpJson) {
|
|
272
282
|
const strategy = cliMcpStrategy ??
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.propagateMcpToOpenCode = propagateMcpToOpenCode;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const FileSystemUtils_1 = require("../core/FileSystemUtils");
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
/**
|
|
41
|
+
* Transform ruler MCP configuration to OpenCode's specific format
|
|
42
|
+
*/
|
|
43
|
+
function transformToOpenCodeFormat(rulerMcp) {
|
|
44
|
+
const rulerServers = rulerMcp.mcpServers || {};
|
|
45
|
+
const openCodeServers = {};
|
|
46
|
+
for (const [name, serverDef] of Object.entries(rulerServers)) {
|
|
47
|
+
const server = serverDef;
|
|
48
|
+
// Determine if this is a local or remote server
|
|
49
|
+
const isRemote = !!server.url;
|
|
50
|
+
const openCodeServer = {
|
|
51
|
+
type: isRemote ? 'remote' : 'local',
|
|
52
|
+
enabled: true, // Always true as per the issue requirements
|
|
53
|
+
};
|
|
54
|
+
if (isRemote) {
|
|
55
|
+
// Remote server configuration
|
|
56
|
+
openCodeServer.url = server.url;
|
|
57
|
+
if (server.headers) {
|
|
58
|
+
openCodeServer.headers = server.headers;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// Local server configuration
|
|
63
|
+
if (server.command) {
|
|
64
|
+
// Combine command and args into a single array
|
|
65
|
+
const command = Array.isArray(server.command)
|
|
66
|
+
? server.command
|
|
67
|
+
: [server.command];
|
|
68
|
+
const args = server.args || [];
|
|
69
|
+
openCodeServer.command = [...command, ...args];
|
|
70
|
+
}
|
|
71
|
+
if (server.env) {
|
|
72
|
+
openCodeServer.environment = server.env;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
openCodeServers[name] = openCodeServer;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
$schema: 'https://opencode.ai/config.json',
|
|
79
|
+
mcp: openCodeServers,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async function propagateMcpToOpenCode(rulerMcpPath, openCodeConfigPath) {
|
|
83
|
+
let rulerMcp;
|
|
84
|
+
try {
|
|
85
|
+
const rulerJsonContent = await fs.readFile(rulerMcpPath, 'utf8');
|
|
86
|
+
rulerMcp = JSON.parse(rulerJsonContent);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Read existing OpenCode config if it exists
|
|
92
|
+
let existingConfig = {};
|
|
93
|
+
try {
|
|
94
|
+
const existingContent = await fs.readFile(openCodeConfigPath, 'utf8');
|
|
95
|
+
existingConfig = JSON.parse(existingContent);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// File doesn't exist, we'll create it
|
|
99
|
+
}
|
|
100
|
+
// Transform ruler MCP to OpenCode format
|
|
101
|
+
const transformedConfig = transformToOpenCodeFormat(rulerMcp);
|
|
102
|
+
// Merge with existing config, preserving non-MCP settings
|
|
103
|
+
const finalConfig = {
|
|
104
|
+
...existingConfig,
|
|
105
|
+
$schema: transformedConfig.$schema,
|
|
106
|
+
mcp: {
|
|
107
|
+
...existingConfig.mcp,
|
|
108
|
+
...transformedConfig.mcp,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
await (0, FileSystemUtils_1.ensureDirExists)(path.dirname(openCodeConfigPath));
|
|
112
|
+
await fs.writeFile(openCodeConfigPath, JSON.stringify(finalConfig, null, 2) + '\n');
|
|
113
|
+
}
|