mcpman 1.0.0 → 2.0.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.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getRollbackDir
4
- } from "./chunk-DSCBWQ3W.js";
4
+ } from "./chunk-HQO4AO6B.js";
5
5
 
6
6
  // src/core/lockfile.ts
7
7
  import fs2 from "fs";
@@ -77,6 +77,29 @@ function resolveConfigPath(client) {
77
77
  return path.join(appData, "Code", "User", "settings.json");
78
78
  }
79
79
  return path.join(home, ".config", "Code", "User", "settings.json");
80
+ case "claude-code":
81
+ return path.join(home, ".claude", ".mcp.json");
82
+ case "roo-code":
83
+ return path.join(
84
+ appData,
85
+ "Code",
86
+ "User",
87
+ "globalStorage",
88
+ "rooveterinaryinc.roo-cline",
89
+ "settings",
90
+ "mcp_settings.json"
91
+ );
92
+ case "codex-cli":
93
+ return path.join(home, ".codex", "config.toml");
94
+ case "opencode":
95
+ return path.join(home, ".config", "opencode", "opencode.json");
96
+ case "continue":
97
+ return path.join(home, ".continue", "config.yaml");
98
+ case "zed":
99
+ if (process.platform === "darwin") {
100
+ return path.join(home, "Library", "Application Support", "Zed", "settings.json");
101
+ }
102
+ return path.join(home, ".config", "zed", "settings.json");
80
103
  }
81
104
  }
82
105
 
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ var __defProp = Object.defineProperty;
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, { get: all[name], enumerable: true });
6
+ };
7
+
8
+ export {
9
+ __export
10
+ };
@@ -0,0 +1,360 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ resolveConfigPath
4
+ } from "./chunk-HQO4AO6B.js";
5
+
6
+ // src/clients/base-client-handler.ts
7
+ import fs from "fs";
8
+ import path from "path";
9
+
10
+ // src/clients/types.ts
11
+ var ConfigParseError = class extends Error {
12
+ constructor(configPath, cause) {
13
+ super(`Failed to parse config: ${configPath} \u2014 ${String(cause)}`);
14
+ this.configPath = configPath;
15
+ this.name = "ConfigParseError";
16
+ }
17
+ };
18
+ var ConfigWriteError = class extends Error {
19
+ constructor(configPath, cause) {
20
+ super(`Failed to write config: ${configPath} \u2014 ${String(cause)}`);
21
+ this.configPath = configPath;
22
+ this.name = "ConfigWriteError";
23
+ }
24
+ };
25
+
26
+ // src/clients/base-client-handler.ts
27
+ async function atomicWrite(filePath, content) {
28
+ const tmpPath = `${filePath}.tmp`;
29
+ try {
30
+ await fs.promises.mkdir(path.dirname(filePath), { recursive: true });
31
+ await fs.promises.writeFile(tmpPath, content, { encoding: "utf-8", mode: 384 });
32
+ await fs.promises.rename(tmpPath, filePath);
33
+ } catch (err) {
34
+ try {
35
+ await fs.promises.unlink(tmpPath);
36
+ } catch {
37
+ }
38
+ throw err;
39
+ }
40
+ }
41
+ async function pathExists(p) {
42
+ try {
43
+ await fs.promises.access(p);
44
+ return true;
45
+ } catch {
46
+ return false;
47
+ }
48
+ }
49
+ var BaseClientHandler = class {
50
+ async isInstalled() {
51
+ const dir = path.dirname(this.getConfigPath());
52
+ return pathExists(dir);
53
+ }
54
+ /** Read raw JSON from disk, return empty object if file missing */
55
+ async readRaw() {
56
+ const configPath = this.getConfigPath();
57
+ try {
58
+ const raw = await fs.promises.readFile(configPath, "utf-8");
59
+ return JSON.parse(raw);
60
+ } catch (err) {
61
+ if (err.code === "ENOENT") {
62
+ return {};
63
+ }
64
+ throw new ConfigParseError(configPath, err);
65
+ }
66
+ }
67
+ /** Serialize raw object to disk atomically */
68
+ async writeRaw(data) {
69
+ const configPath = this.getConfigPath();
70
+ try {
71
+ await atomicWrite(configPath, JSON.stringify(data, null, 2));
72
+ } catch (err) {
73
+ throw new ConfigWriteError(configPath, err);
74
+ }
75
+ }
76
+ /** Convert raw JSON to ClientConfig — override for non-standard formats */
77
+ toClientConfig(raw) {
78
+ const mcpServers = raw.mcpServers ?? {};
79
+ return { servers: mcpServers };
80
+ }
81
+ /** Merge ClientConfig back into raw JSON — override for non-standard formats */
82
+ fromClientConfig(raw, config) {
83
+ return { ...raw, mcpServers: config.servers };
84
+ }
85
+ async readConfig() {
86
+ const raw = await this.readRaw();
87
+ return this.toClientConfig(raw);
88
+ }
89
+ async writeConfig(config) {
90
+ const raw = await this.readRaw();
91
+ await this.writeRaw(this.fromClientConfig(raw, config));
92
+ }
93
+ async addServer(name, entry) {
94
+ const config = await this.readConfig();
95
+ config.servers[name] = entry;
96
+ await this.writeConfig(config);
97
+ }
98
+ async removeServer(name) {
99
+ const config = await this.readConfig();
100
+ delete config.servers[name];
101
+ await this.writeConfig(config);
102
+ }
103
+ };
104
+
105
+ // src/clients/claude-code.ts
106
+ var ClaudeCodeHandler = class extends BaseClientHandler {
107
+ type = "claude-code";
108
+ displayName = "Claude Code";
109
+ getConfigPath() {
110
+ return resolveConfigPath("claude-code");
111
+ }
112
+ };
113
+
114
+ // src/clients/claude-desktop.ts
115
+ var ClaudeDesktopHandler = class extends BaseClientHandler {
116
+ type = "claude-desktop";
117
+ displayName = "Claude Desktop";
118
+ getConfigPath() {
119
+ return resolveConfigPath("claude-desktop");
120
+ }
121
+ };
122
+
123
+ // src/clients/codex-cli.ts
124
+ import fs2 from "fs";
125
+ import TOML from "@iarna/toml";
126
+ var CodexCliHandler = class extends BaseClientHandler {
127
+ type = "codex-cli";
128
+ displayName = "Codex CLI";
129
+ getConfigPath() {
130
+ return resolveConfigPath("codex-cli");
131
+ }
132
+ async readRaw() {
133
+ const configPath = this.getConfigPath();
134
+ try {
135
+ const raw = await fs2.promises.readFile(configPath, "utf-8");
136
+ return TOML.parse(raw);
137
+ } catch (err) {
138
+ if (err.code === "ENOENT") return {};
139
+ throw new ConfigParseError(configPath, err);
140
+ }
141
+ }
142
+ async writeRaw(data) {
143
+ const configPath = this.getConfigPath();
144
+ try {
145
+ await atomicWrite(configPath, TOML.stringify(data));
146
+ } catch (err) {
147
+ throw new ConfigWriteError(configPath, err);
148
+ }
149
+ }
150
+ toClientConfig(raw) {
151
+ const mcpServers = raw.mcp_servers ?? {};
152
+ return { servers: mcpServers };
153
+ }
154
+ fromClientConfig(raw, config) {
155
+ return { ...raw, mcp_servers: config.servers };
156
+ }
157
+ };
158
+
159
+ // src/clients/continue-client.ts
160
+ import fs3 from "fs";
161
+ import YAML from "yaml";
162
+ var ContinueHandler = class extends BaseClientHandler {
163
+ type = "continue";
164
+ displayName = "Continue";
165
+ getConfigPath() {
166
+ return resolveConfigPath("continue");
167
+ }
168
+ async readRaw() {
169
+ const configPath = this.getConfigPath();
170
+ try {
171
+ const raw = await fs3.promises.readFile(configPath, "utf-8");
172
+ return YAML.parse(raw) ?? {};
173
+ } catch (err) {
174
+ if (err.code === "ENOENT") return {};
175
+ throw new ConfigParseError(configPath, err);
176
+ }
177
+ }
178
+ async writeRaw(data) {
179
+ const configPath = this.getConfigPath();
180
+ try {
181
+ await atomicWrite(configPath, YAML.stringify(data));
182
+ } catch (err) {
183
+ throw new ConfigWriteError(configPath, err);
184
+ }
185
+ }
186
+ toClientConfig(raw) {
187
+ const mcpArray = raw.mcpServers ?? [];
188
+ const serverMap = /* @__PURE__ */ new Map();
189
+ for (const entry of mcpArray) {
190
+ const { name, ...rest } = entry;
191
+ serverMap.set(name, rest);
192
+ }
193
+ const servers = Object.fromEntries(serverMap);
194
+ return { servers };
195
+ }
196
+ fromClientConfig(raw, config) {
197
+ const mcpArray = Object.entries(config.servers).map(([name, entry]) => ({
198
+ name,
199
+ ...entry
200
+ }));
201
+ return { ...raw, mcpServers: mcpArray };
202
+ }
203
+ };
204
+
205
+ // src/clients/cursor.ts
206
+ var CursorHandler = class extends BaseClientHandler {
207
+ type = "cursor";
208
+ displayName = "Cursor";
209
+ getConfigPath() {
210
+ return resolveConfigPath("cursor");
211
+ }
212
+ };
213
+
214
+ // src/clients/opencode.ts
215
+ var OpenCodeHandler = class extends BaseClientHandler {
216
+ type = "opencode";
217
+ displayName = "OpenCode";
218
+ getConfigPath() {
219
+ return resolveConfigPath("opencode");
220
+ }
221
+ toClientConfig(raw) {
222
+ const mcp = raw.mcp ?? {};
223
+ const servers = {};
224
+ for (const [name, entry] of Object.entries(mcp)) {
225
+ const cmdArray = entry.command ?? [];
226
+ if (cmdArray.length === 0) continue;
227
+ servers[name] = {
228
+ command: cmdArray[0],
229
+ args: cmdArray.slice(1),
230
+ ...entry.environment ? { env: entry.environment } : {}
231
+ };
232
+ }
233
+ return { servers };
234
+ }
235
+ fromClientConfig(raw, config) {
236
+ const existingMcp = raw.mcp ?? {};
237
+ const mcp = {};
238
+ for (const [name, entry] of Object.entries(config.servers)) {
239
+ if (!entry.command) continue;
240
+ const existingEnabled = existingMcp[name]?.enabled;
241
+ const enabled = existingEnabled !== void 0 ? existingEnabled : true;
242
+ mcp[name] = {
243
+ type: "local",
244
+ command: [entry.command, ...entry.args ?? []],
245
+ enabled,
246
+ ...entry.env ? { environment: entry.env } : {}
247
+ };
248
+ }
249
+ const { mcp: _existing, ...rest } = raw;
250
+ return { ...rest, mcp };
251
+ }
252
+ };
253
+
254
+ // src/clients/roo-code.ts
255
+ var RooCodeHandler = class extends BaseClientHandler {
256
+ type = "roo-code";
257
+ displayName = "Roo Code";
258
+ getConfigPath() {
259
+ return resolveConfigPath("roo-code");
260
+ }
261
+ };
262
+
263
+ // src/clients/vscode.ts
264
+ var VSCodeHandler = class extends BaseClientHandler {
265
+ type = "vscode";
266
+ displayName = "VS Code";
267
+ getConfigPath() {
268
+ return resolveConfigPath("vscode");
269
+ }
270
+ toClientConfig(raw) {
271
+ const mcp = raw.mcp ?? {};
272
+ const servers = mcp.servers ?? {};
273
+ return { servers };
274
+ }
275
+ fromClientConfig(raw, config) {
276
+ const existingMcp = raw.mcp ?? {};
277
+ return {
278
+ ...raw,
279
+ mcp: { ...existingMcp, servers: config.servers }
280
+ };
281
+ }
282
+ };
283
+
284
+ // src/clients/windsurf.ts
285
+ var WindsurfHandler = class extends BaseClientHandler {
286
+ type = "windsurf";
287
+ displayName = "Windsurf";
288
+ getConfigPath() {
289
+ return resolveConfigPath("windsurf");
290
+ }
291
+ };
292
+
293
+ // src/clients/zed.ts
294
+ var ZedHandler = class extends BaseClientHandler {
295
+ type = "zed";
296
+ displayName = "Zed";
297
+ getConfigPath() {
298
+ return resolveConfigPath("zed");
299
+ }
300
+ toClientConfig(raw) {
301
+ const contextServers = raw.context_servers ?? {};
302
+ return { servers: contextServers };
303
+ }
304
+ fromClientConfig(raw, config) {
305
+ return { ...raw, context_servers: config.servers };
306
+ }
307
+ };
308
+
309
+ // src/clients/client-detector.ts
310
+ function getAllClientTypes() {
311
+ return [
312
+ "claude-desktop",
313
+ "cursor",
314
+ "vscode",
315
+ "windsurf",
316
+ "claude-code",
317
+ "roo-code",
318
+ "codex-cli",
319
+ "opencode",
320
+ "continue",
321
+ "zed"
322
+ ];
323
+ }
324
+ function getClient(type) {
325
+ switch (type) {
326
+ case "claude-desktop":
327
+ return new ClaudeDesktopHandler();
328
+ case "cursor":
329
+ return new CursorHandler();
330
+ case "vscode":
331
+ return new VSCodeHandler();
332
+ case "windsurf":
333
+ return new WindsurfHandler();
334
+ case "claude-code":
335
+ return new ClaudeCodeHandler();
336
+ case "roo-code":
337
+ return new RooCodeHandler();
338
+ case "codex-cli":
339
+ return new CodexCliHandler();
340
+ case "opencode":
341
+ return new OpenCodeHandler();
342
+ case "continue":
343
+ return new ContinueHandler();
344
+ case "zed":
345
+ return new ZedHandler();
346
+ }
347
+ }
348
+ async function getInstalledClients() {
349
+ const all = getAllClientTypes().map(getClient);
350
+ const results = await Promise.all(
351
+ all.map(async (handler) => ({ handler, installed: await handler.isInstalled() }))
352
+ );
353
+ return results.filter((r) => r.installed).map((r) => r.handler);
354
+ }
355
+
356
+ export {
357
+ getAllClientTypes,
358
+ getClient,
359
+ getInstalledClients
360
+ };
@@ -3,8 +3,9 @@ import {
3
3
  getAllClientTypes,
4
4
  getClient,
5
5
  getInstalledClients
6
- } from "./chunk-CC7ICP7U.js";
7
- import "./chunk-DSCBWQ3W.js";
6
+ } from "./chunk-NFQMBLT3.js";
7
+ import "./chunk-HQO4AO6B.js";
8
+ import "./chunk-K3NQKI34.js";
8
9
  export {
9
10
  getAllClientTypes,
10
11
  getClient,