@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 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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intellectronica/ruler",
3
- "version": "0.2.13",
3
+ "version": "0.2.14",
4
4
  "description": "Ruler — apply the same rules to all coding agents",
5
5
  "main": "dist/lib.js",
6
6
  "scripts": {