From e75c165adcd2da0078423175923b625063c366e9 Mon Sep 17 00:00:00 2001 From: Edison Augusthy Date: Fri, 5 Jun 2026 14:10:24 +0200 Subject: [PATCH 1/7] fix: revert absolute plugin path, use package name for OpenCode Bun install --- scripts/setup.ts | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/scripts/setup.ts b/scripts/setup.ts index 02204c8..4bfb3ab 100644 --- a/scripts/setup.ts +++ b/scripts/setup.ts @@ -19,7 +19,6 @@ const HOME = os.homedir(); const IS_WINDOWS = process.platform === "win32"; const PKG_NAME = "token-optimizer"; const SERVER_ENTRY = "dist/src/mcp-server.js"; -const PLUGIN_ENTRY = "dist/src/plugin.js"; // ── URL pathname → filesystem path (handles Windows /C:/... prefix) ─────────── @@ -185,7 +184,7 @@ const MCP_ENTRY = (serverPath: string) => ({ args: [serverPath], }); -function patchOpenCodeJson(configPath: string, serverPath: string, pluginPath: string, remove: boolean): boolean { +function patchOpenCodeJson(configPath: string, serverPath: string, remove: boolean): boolean { let raw = "{}"; if (fs.existsSync(configPath)) raw = fs.readFileSync(configPath, "utf8"); @@ -213,22 +212,22 @@ function patchOpenCodeJson(configPath: string, serverPath: string, pluginPath: s servers[PKG_NAME] = MCP_ENTRY(serverPath); } - // ── Plugin entry (absolute path to plugin.js in the "plugin" array) ───────── - // OpenCode resolves plugin entries as absolute paths — package names only work - // if the package is locally installed, which it won't be for global installs. + // ── Plugin entry (package name in the "plugin" array) ─────────────────────── + // OpenCode installs npm plugins automatically via Bun at startup and caches + // them in ~/.cache/opencode/node_modules/. Use the package name, not a path. if (!Array.isArray(cfg.plugin)) { cfg.plugin = []; } const plugins = cfg.plugin as string[]; - // Remove any stale entries (old package-name form or old path) + // Remove any stale absolute-path entries written by older versions const filtered = plugins.filter( - (p) => p !== PKG_NAME && p !== pluginPath + (p) => p !== PKG_NAME && !p.includes(path.join(PKG_NAME, "dist")) ); if (remove) { cfg.plugin = filtered; } else { - cfg.plugin = [...filtered, pluginPath]; + cfg.plugin = [...filtered, PKG_NAME]; } fs.mkdirSync(path.dirname(configPath), { recursive: true }); @@ -321,14 +320,9 @@ function patchAgentsMd(configPath: string, serverPath: string, remove: boolean): function patchAgent(agent: AgentConfig, serverPath: string, remove: boolean): void { let ok = false; - // Derive plugin path from server path: same package root, different entry file. - const pluginPath = serverPath.replace( - SERVER_ENTRY.replace(/\//g, path.sep), - PLUGIN_ENTRY.replace(/\//g, path.sep), - ); switch (agent.type) { case "opencode-json": - ok = patchOpenCodeJson(agent.configPath, serverPath, pluginPath, remove); + ok = patchOpenCodeJson(agent.configPath, serverPath, remove); break; case "mcp-json": ok = patchMcpJson(agent.configPath, serverPath, remove); From f14efa1cf417ec5ea6dd54e49764ea9bbd036ac1 Mon Sep 17 00:00:00 2001 From: Edison Augusthy Date: Fri, 5 Jun 2026 14:10:24 +0200 Subject: [PATCH 2/7] 0.1.9 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ab75fb..bc7f36b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "token-optimizer", - "version": "0.1.8", + "version": "0.1.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "token-optimizer", - "version": "0.1.8", + "version": "0.1.9", "license": "MIT", "dependencies": { "@opencode-ai/plugin": "latest" diff --git a/package.json b/package.json index 084037b..094be74 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "token-optimizer", "type": "module", - "version": "0.1.8", + "version": "0.1.9", "description": "60-75% token reduction for all AI coding agents (OpenCode, Codex, Cursor, Claude Desktop) via output compression, schema slimming, and read compaction. Runs as a persistent MCP server.", "main": "dist/src/plugin.js", "types": "dist/src/plugin.d.ts", From 9796fc810bc48152ddfa3a1c83b9c599ea433c5f Mon Sep 17 00:00:00 2001 From: Edison Augusthy Date: Fri, 5 Jun 2026 14:12:14 +0200 Subject: [PATCH 3/7] fix: remove plugin registration until hooks are compatible with current API --- scripts/setup.ts | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/scripts/setup.ts b/scripts/setup.ts index 4bfb3ab..51eb3e1 100644 --- a/scripts/setup.ts +++ b/scripts/setup.ts @@ -212,22 +212,14 @@ function patchOpenCodeJson(configPath: string, serverPath: string, remove: boole servers[PKG_NAME] = MCP_ENTRY(serverPath); } - // ── Plugin entry (package name in the "plugin" array) ─────────────────────── - // OpenCode installs npm plugins automatically via Bun at startup and caches - // them in ~/.cache/opencode/node_modules/. Use the package name, not a path. - if (!Array.isArray(cfg.plugin)) { - cfg.plugin = []; - } - const plugins = cfg.plugin as string[]; - // Remove any stale absolute-path entries written by older versions - const filtered = plugins.filter( - (p) => p !== PKG_NAME && !p.includes(path.join(PKG_NAME, "dist")) - ); - - if (remove) { - cfg.plugin = filtered; - } else { - cfg.plugin = [...filtered, PKG_NAME]; + // ── Plugin entry — clean up any stale entries written by older versions ────── + // The plugin.ts hooks are not yet compatible with the current @opencode-ai/plugin + // API and crash OpenCode on startup. Remove any entries we may have written. + if (Array.isArray(cfg.plugin)) { + cfg.plugin = (cfg.plugin as string[]).filter( + (p) => p !== PKG_NAME && !p.includes(path.join(PKG_NAME, "dist")) + ); + if ((cfg.plugin as string[]).length === 0) delete cfg.plugin; } fs.mkdirSync(path.dirname(configPath), { recursive: true }); From 3b2e47a06b47ccf358251c5341d2c16cac4701a8 Mon Sep 17 00:00:00 2001 From: Edison Augusthy Date: Fri, 5 Jun 2026 14:12:14 +0200 Subject: [PATCH 4/7] 0.2.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc7f36b..7ea61d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "token-optimizer", - "version": "0.1.9", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "token-optimizer", - "version": "0.1.9", + "version": "0.2.0", "license": "MIT", "dependencies": { "@opencode-ai/plugin": "latest" diff --git a/package.json b/package.json index 094be74..3320ff3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "token-optimizer", "type": "module", - "version": "0.1.9", + "version": "0.2.0", "description": "60-75% token reduction for all AI coding agents (OpenCode, Codex, Cursor, Claude Desktop) via output compression, schema slimming, and read compaction. Runs as a persistent MCP server.", "main": "dist/src/plugin.js", "types": "dist/src/plugin.d.ts", From cfed4b7643cdcd7cf0493a6c2bb186529ab4aa25 Mon Sep 17 00:00:00 2001 From: Edison Augusthy Date: Fri, 5 Jun 2026 14:15:56 +0200 Subject: [PATCH 5/7] fix: correct OpenCode MCP entry format (type:local, command array, not mcp.servers) --- scripts/setup.ts | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/scripts/setup.ts b/scripts/setup.ts index 51eb3e1..3d65cfb 100644 --- a/scripts/setup.ts +++ b/scripts/setup.ts @@ -179,6 +179,14 @@ function detectAgents(): AgentConfig[] { // ── Patchers ────────────────────────────────────────────────────────────────── +// OpenCode MCP entry format (matches opencode.json schema) +const OPENCODE_MCP_ENTRY = (serverPath: string) => ({ + enabled: true, + type: "local", + command: ["node", serverPath], +}); + +// Other agents (Cursor, Claude Desktop, Windsurf) use the flat { command, args } shape const MCP_ENTRY = (serverPath: string) => ({ command: "node", args: [serverPath], @@ -197,19 +205,23 @@ function patchOpenCodeJson(configPath: string, serverPath: string, remove: boole } // ── MCP server entry ──────────────────────────────────────────────────────── + // OpenCode schema: mcp entries sit directly under the "mcp" key, NOT mcp.servers. if (!cfg.mcp || typeof cfg.mcp !== "object") { cfg.mcp = {}; } const mcp = cfg.mcp as Record; - if (!mcp.servers || typeof mcp.servers !== "object") { - mcp.servers = {}; + + // Clean up stale mcp.servers entries written by older versions + if (mcp.servers && typeof mcp.servers === "object") { + const servers = mcp.servers as Record; + delete servers[PKG_NAME]; + if (Object.keys(servers).length === 0) delete mcp.servers; } - const servers = mcp.servers as Record; if (remove) { - delete servers[PKG_NAME]; + delete mcp[PKG_NAME]; } else { - servers[PKG_NAME] = MCP_ENTRY(serverPath); + mcp[PKG_NAME] = OPENCODE_MCP_ENTRY(serverPath); } // ── Plugin entry — clean up any stale entries written by older versions ────── From db05354b4e17b0cd8f6ec2d082667950ea0e73c2 Mon Sep 17 00:00:00 2001 From: Edison Augusthy Date: Fri, 5 Jun 2026 14:17:23 +0200 Subject: [PATCH 6/7] fix: export plugin as 'server', re-enable plugin registration in setup --- scripts/setup.ts | 20 ++++++++++++-------- src/plugin.ts | 4 ++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/scripts/setup.ts b/scripts/setup.ts index 3d65cfb..e2214d7 100644 --- a/scripts/setup.ts +++ b/scripts/setup.ts @@ -224,14 +224,18 @@ function patchOpenCodeJson(configPath: string, serverPath: string, remove: boole mcp[PKG_NAME] = OPENCODE_MCP_ENTRY(serverPath); } - // ── Plugin entry — clean up any stale entries written by older versions ────── - // The plugin.ts hooks are not yet compatible with the current @opencode-ai/plugin - // API and crash OpenCode on startup. Remove any entries we may have written. - if (Array.isArray(cfg.plugin)) { - cfg.plugin = (cfg.plugin as string[]).filter( - (p) => p !== PKG_NAME && !p.includes(path.join(PKG_NAME, "dist")) - ); - if ((cfg.plugin as string[]).length === 0) delete cfg.plugin; + // ── Plugin entry ───────────────────────────────────────────────────────────── + // OpenCode installs npm plugins via Bun at startup. Use the package name. + // Clean up any stale absolute-path entries written by older versions first. + if (!Array.isArray(cfg.plugin)) cfg.plugin = []; + const plugins = (cfg.plugin as string[]).filter( + (p) => p !== PKG_NAME && !p.includes(path.join(PKG_NAME, "dist")) + ); + if (remove) { + cfg.plugin = plugins; + if (plugins.length === 0) delete cfg.plugin; + } else { + cfg.plugin = [...plugins, PKG_NAME]; } fs.mkdirSync(path.dirname(configPath), { recursive: true }); diff --git a/src/plugin.ts b/src/plugin.ts index 3185c37..caf37af 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -374,7 +374,7 @@ function compressGrepOutput(raw: string, workingDirectory: string): string { // ─── Plugin definition ──────────────────────────────────────────────────────── -export const TokenOptimizerPlugin: Plugin = async ({ directory, client }) => { +export const server: Plugin = async ({ directory, client }) => { const stats = createStats() /** @@ -924,4 +924,4 @@ export const TokenOptimizerPlugin: Plugin = async ({ directory, client }) => { } } -export default TokenOptimizerPlugin +export default server From d82e3dfc3528965ac82f425f11dbcba1c117025c Mon Sep 17 00:00:00 2001 From: Edison Augusthy Date: Fri, 5 Jun 2026 14:17:23 +0200 Subject: [PATCH 7/7] 0.2.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ea61d5..23ec4e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "token-optimizer", - "version": "0.2.0", + "version": "0.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "token-optimizer", - "version": "0.2.0", + "version": "0.2.1", "license": "MIT", "dependencies": { "@opencode-ai/plugin": "latest" diff --git a/package.json b/package.json index 3320ff3..acb08e1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "token-optimizer", "type": "module", - "version": "0.2.0", + "version": "0.2.1", "description": "60-75% token reduction for all AI coding agents (OpenCode, Codex, Cursor, Claude Desktop) via output compression, schema slimming, and read compaction. Runs as a persistent MCP server.", "main": "dist/src/plugin.js", "types": "dist/src/plugin.d.ts",