@cg3/equip 0.2.22 → 0.4.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 (57) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +26 -10
  3. package/bin/equip.js +159 -68
  4. package/demo/README.md +1 -1
  5. package/dist/index.d.ts +74 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +175 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/lib/cli.d.ts +22 -0
  10. package/dist/lib/cli.d.ts.map +1 -0
  11. package/dist/lib/cli.js +148 -0
  12. package/dist/lib/cli.js.map +1 -0
  13. package/dist/lib/commands/doctor.d.ts +2 -0
  14. package/dist/lib/commands/doctor.d.ts.map +1 -0
  15. package/dist/lib/commands/doctor.js +162 -0
  16. package/dist/lib/commands/doctor.js.map +1 -0
  17. package/dist/lib/commands/status.d.ts +2 -0
  18. package/dist/lib/commands/status.d.ts.map +1 -0
  19. package/dist/lib/commands/status.js +134 -0
  20. package/dist/lib/commands/status.js.map +1 -0
  21. package/dist/lib/commands/update.d.ts +2 -0
  22. package/dist/lib/commands/update.d.ts.map +1 -0
  23. package/dist/lib/commands/update.js +93 -0
  24. package/dist/lib/commands/update.js.map +1 -0
  25. package/dist/lib/detect.d.ts +12 -0
  26. package/dist/lib/detect.d.ts.map +1 -0
  27. package/dist/lib/detect.js +109 -0
  28. package/dist/lib/detect.js.map +1 -0
  29. package/dist/lib/hooks.d.ts +40 -0
  30. package/dist/lib/hooks.d.ts.map +1 -0
  31. package/dist/lib/hooks.js +226 -0
  32. package/dist/lib/hooks.js.map +1 -0
  33. package/dist/lib/mcp.d.ts +73 -0
  34. package/dist/lib/mcp.d.ts.map +1 -0
  35. package/dist/lib/mcp.js +418 -0
  36. package/dist/lib/mcp.js.map +1 -0
  37. package/dist/lib/platforms.d.ts +67 -0
  38. package/dist/lib/platforms.d.ts.map +1 -0
  39. package/dist/lib/platforms.js +353 -0
  40. package/dist/lib/platforms.js.map +1 -0
  41. package/dist/lib/rules.d.ts +35 -0
  42. package/dist/lib/rules.d.ts.map +1 -0
  43. package/dist/lib/rules.js +161 -0
  44. package/dist/lib/rules.js.map +1 -0
  45. package/dist/lib/state.d.ts +33 -0
  46. package/dist/lib/state.d.ts.map +1 -0
  47. package/dist/lib/state.js +130 -0
  48. package/dist/lib/state.js.map +1 -0
  49. package/package.json +19 -13
  50. package/registry.json +9 -0
  51. package/index.js +0 -244
  52. package/lib/cli.js +0 -99
  53. package/lib/detect.js +0 -242
  54. package/lib/hooks.js +0 -238
  55. package/lib/mcp.js +0 -503
  56. package/lib/platforms.js +0 -184
  57. package/lib/rules.js +0 -170
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ // Platform detection — discovers installed AI coding tools.
3
+ // Uses the platform registry as single source of truth.
4
+ // Zero dependencies.
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.whichSync = whichSync;
40
+ exports.dirExists = dirExists;
41
+ exports.fileExists = fileExists;
42
+ exports.detectPlatforms = detectPlatforms;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const child_process_1 = require("child_process");
46
+ const platforms_1 = require("./platforms");
47
+ const mcp_1 = require("./mcp");
48
+ // ─── Helpers ─────────────────────────────────────────────────
49
+ function whichSync(cmd) {
50
+ try {
51
+ const r = (0, child_process_1.execSync)(process.platform === "win32" ? `where ${cmd} 2>nul` : `which ${cmd} 2>/dev/null`, { encoding: "utf-8", timeout: 5000 });
52
+ return r.trim().split(/\r?\n/)[0] || null;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ function dirExists(p) {
59
+ try {
60
+ return fs.statSync(p).isDirectory();
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ function fileExists(p) {
67
+ try {
68
+ return fs.statSync(p).isFile();
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ // ─── Detection ──────────────────────────────────────────────
75
+ /**
76
+ * Detect installed AI coding platforms.
77
+ * Checks directories and files first (fast), then CLI presence.
78
+ * Skips --version calls for performance.
79
+ * @param serverName - MCP server name to check for existing config
80
+ */
81
+ function detectPlatforms(serverName) {
82
+ const platforms = [];
83
+ for (const [, def] of platforms_1.PLATFORM_REGISTRY) {
84
+ // Check dirs/files first (fast fs stat), CLI last (slow shell exec)
85
+ const dirFound = def.detection.dirs.some(fn => dirExists(fn()));
86
+ const fileFound = def.detection.files.some(fn => fileExists(fn()));
87
+ const parentDirFound = def.detection.files.some(fn => dirExists(path.dirname(fn())));
88
+ // Only shell out for `which` if no dir/file evidence found
89
+ const hasCli = (dirFound || fileFound || parentDirFound)
90
+ ? (def.detection.cli ? !!whichSync(def.detection.cli) : false)
91
+ : (def.detection.cli ? !!whichSync(def.detection.cli) : false);
92
+ if (!hasCli && !dirFound && !fileFound && !parentDirFound)
93
+ continue;
94
+ const configPath = def.configPath();
95
+ const rulesPath = def.rulesPath ? def.rulesPath() : null;
96
+ platforms.push({
97
+ platform: def.id,
98
+ version: "detected",
99
+ configPath,
100
+ rulesPath,
101
+ existingMcp: serverName ? (0, mcp_1.readMcpEntry)(configPath, def.rootKey, serverName, def.configFormat) : null,
102
+ hasCli,
103
+ rootKey: def.rootKey,
104
+ configFormat: def.configFormat,
105
+ });
106
+ }
107
+ return platforms;
108
+ }
109
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type DetectedPlatform, type PlatformHookCapabilities } from "./platforms";
2
+ export interface HookDefinition {
3
+ event: string;
4
+ matcher?: string;
5
+ script: string;
6
+ name: string;
7
+ }
8
+ /**
9
+ * Get hook capabilities for a platform (from registry).
10
+ */
11
+ export declare function getHookCapabilities(platformId: string): PlatformHookCapabilities | null;
12
+ /**
13
+ * Build platform-specific hooks config from consumer-defined hook definitions.
14
+ */
15
+ export declare function buildHooksConfig(hookDefs: HookDefinition[], hookDir: string, platformId: string): Record<string, unknown[]> | null;
16
+ /**
17
+ * Install hook scripts to disk and register them in platform settings.
18
+ */
19
+ export declare function installHooks(platform: DetectedPlatform, hookDefs: HookDefinition[], options?: {
20
+ hookDir?: string;
21
+ dryRun?: boolean;
22
+ }): {
23
+ installed: boolean;
24
+ scripts: string[];
25
+ hookDir: string;
26
+ } | null;
27
+ /**
28
+ * Uninstall hook scripts and remove from platform settings.
29
+ */
30
+ export declare function uninstallHooks(platform: DetectedPlatform, hookDefs: HookDefinition[], options?: {
31
+ hookDir?: string;
32
+ dryRun?: boolean;
33
+ }): boolean;
34
+ /**
35
+ * Check if hooks are installed for a platform.
36
+ */
37
+ export declare function hasHooks(platform: DetectedPlatform, hookDefs: HookDefinition[], options?: {
38
+ hookDir?: string;
39
+ }): boolean;
40
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAMA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAItG,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAEvF;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CA0BlI;AAID;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAuD5M;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAkDpJ;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAsB5H"}
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ // Hook installation for platforms that support lifecycle hooks.
3
+ // Reads capabilities from the platform registry.
4
+ // Zero dependencies.
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.getHookCapabilities = getHookCapabilities;
40
+ exports.buildHooksConfig = buildHooksConfig;
41
+ exports.installHooks = installHooks;
42
+ exports.uninstallHooks = uninstallHooks;
43
+ exports.hasHooks = hasHooks;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const platforms_1 = require("./platforms");
47
+ // ─── Capabilities ───────────────────────────────────────────
48
+ /**
49
+ * Get hook capabilities for a platform (from registry).
50
+ */
51
+ function getHookCapabilities(platformId) {
52
+ return platforms_1.PLATFORM_REGISTRY.get(platformId)?.hooks ?? null;
53
+ }
54
+ // ─── Hook Config Generation ─────────────────────────────────
55
+ /**
56
+ * Build platform-specific hooks config from consumer-defined hook definitions.
57
+ */
58
+ function buildHooksConfig(hookDefs, hookDir, platformId) {
59
+ const caps = getHookCapabilities(platformId);
60
+ if (!caps || !hookDefs || hookDefs.length === 0)
61
+ return null;
62
+ if (caps.format === "claude-code") {
63
+ const config = {};
64
+ for (const def of hookDefs) {
65
+ if (!caps.events.includes(def.event))
66
+ continue;
67
+ const entry = {
68
+ hooks: [{
69
+ type: "command",
70
+ command: `node "${path.join(hookDir, def.name + ".js")}"`,
71
+ }],
72
+ };
73
+ if (def.matcher)
74
+ entry.matcher = def.matcher;
75
+ if (!config[def.event])
76
+ config[def.event] = [];
77
+ config[def.event].push(entry);
78
+ }
79
+ return Object.keys(config).length > 0 ? config : null;
80
+ }
81
+ return null;
82
+ }
83
+ // ─── Installation ────────────────────────────────────────────
84
+ /**
85
+ * Install hook scripts to disk and register them in platform settings.
86
+ */
87
+ function installHooks(platform, hookDefs, options = {}) {
88
+ const caps = getHookCapabilities(platform.platform);
89
+ if (!caps || !hookDefs || hookDefs.length === 0)
90
+ return null;
91
+ if (!options.hookDir)
92
+ throw new Error("hookDir is required");
93
+ const hookDir = options.hookDir;
94
+ const dryRun = options.dryRun || false;
95
+ const installedScripts = [];
96
+ if (!dryRun) {
97
+ fs.mkdirSync(hookDir, { recursive: true });
98
+ }
99
+ for (const def of hookDefs) {
100
+ if (!caps.events.includes(def.event))
101
+ continue;
102
+ const filePath = path.join(hookDir, def.name + ".js");
103
+ if (!dryRun) {
104
+ fs.writeFileSync(filePath, def.script, { mode: 0o755 });
105
+ }
106
+ installedScripts.push(def.name + ".js");
107
+ }
108
+ if (installedScripts.length === 0)
109
+ return null;
110
+ const hooksConfig = buildHooksConfig(hookDefs, hookDir, platform.platform);
111
+ if (!hooksConfig)
112
+ return null;
113
+ if (!dryRun) {
114
+ const settingsPath = caps.settingsPath();
115
+ let settings = {};
116
+ try {
117
+ settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
118
+ }
119
+ catch { /* file doesn't exist yet */ }
120
+ if (!settings.hooks)
121
+ settings.hooks = {};
122
+ const hooks = settings.hooks;
123
+ for (const [event, hookGroups] of Object.entries(hooksConfig)) {
124
+ if (!hooks[event]) {
125
+ hooks[event] = hookGroups;
126
+ }
127
+ else {
128
+ const hookDirNorm = hookDir.replace(/\\/g, "/");
129
+ hooks[event] = hooks[event].filter(group => !group.hooks?.some(h => h.command && h.command.replace(/\\/g, "/").includes(hookDirNorm)));
130
+ hooks[event].push(...hookGroups);
131
+ }
132
+ }
133
+ fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
134
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
135
+ }
136
+ return { installed: true, scripts: installedScripts, hookDir };
137
+ }
138
+ /**
139
+ * Uninstall hook scripts and remove from platform settings.
140
+ */
141
+ function uninstallHooks(platform, hookDefs, options = {}) {
142
+ const caps = getHookCapabilities(platform.platform);
143
+ if (!caps || !hookDefs || hookDefs.length === 0)
144
+ return false;
145
+ if (!options.hookDir)
146
+ throw new Error("hookDir is required");
147
+ const hookDir = options.hookDir;
148
+ const dryRun = options.dryRun || false;
149
+ let removed = false;
150
+ for (const def of hookDefs) {
151
+ const filePath = path.join(hookDir, def.name + ".js");
152
+ try {
153
+ if (fs.statSync(filePath).isFile()) {
154
+ if (!dryRun)
155
+ fs.unlinkSync(filePath);
156
+ removed = true;
157
+ }
158
+ }
159
+ catch { /* doesn't exist */ }
160
+ }
161
+ if (!dryRun) {
162
+ try {
163
+ fs.rmdirSync(hookDir);
164
+ }
165
+ catch { /* not empty or doesn't exist */ }
166
+ }
167
+ if (!dryRun) {
168
+ const settingsPath = caps.settingsPath();
169
+ try {
170
+ const settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
171
+ if (settings.hooks) {
172
+ let changed = false;
173
+ const hookDirNorm = hookDir.replace(/\\/g, "/");
174
+ for (const event of Object.keys(settings.hooks)) {
175
+ const before = settings.hooks[event].length;
176
+ settings.hooks[event] = settings.hooks[event].filter((group) => !group.hooks?.some(h => h.command && h.command.replace(/\\/g, "/").includes(hookDirNorm)));
177
+ if (settings.hooks[event].length === 0) {
178
+ delete settings.hooks[event];
179
+ }
180
+ if (settings.hooks[event]?.length !== before)
181
+ changed = true;
182
+ }
183
+ if (Object.keys(settings.hooks).length === 0)
184
+ delete settings.hooks;
185
+ if (changed) {
186
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
187
+ removed = true;
188
+ }
189
+ }
190
+ }
191
+ catch { /* file doesn't exist */ }
192
+ }
193
+ return removed;
194
+ }
195
+ /**
196
+ * Check if hooks are installed for a platform.
197
+ */
198
+ function hasHooks(platform, hookDefs, options = {}) {
199
+ const caps = getHookCapabilities(platform.platform);
200
+ if (!caps || !hookDefs || hookDefs.length === 0)
201
+ return false;
202
+ if (!options.hookDir)
203
+ throw new Error("hookDir is required");
204
+ const hookDir = options.hookDir;
205
+ for (const def of hookDefs) {
206
+ try {
207
+ if (!fs.statSync(path.join(hookDir, def.name + ".js")).isFile())
208
+ return false;
209
+ }
210
+ catch {
211
+ return false;
212
+ }
213
+ }
214
+ try {
215
+ const settings = JSON.parse(fs.readFileSync(caps.settingsPath(), "utf-8"));
216
+ if (!settings.hooks)
217
+ return false;
218
+ const hookDirNorm = hookDir.replace(/\\/g, "/");
219
+ const hasRegistered = Object.values(settings.hooks).some(groups => groups.some(g => g.hooks?.some(h => h.command && h.command.replace(/\\/g, "/").includes(hookDirNorm))));
220
+ return hasRegistered;
221
+ }
222
+ catch {
223
+ return false;
224
+ }
225
+ }
226
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { type DetectedPlatform } from "./platforms";
2
+ /**
3
+ * Parse a TOML table entry for [mcp_servers.<name>].
4
+ * Returns key-value pairs as a plain object. Supports string, number, boolean, arrays.
5
+ * This is NOT a full TOML parser — only handles flat tables needed for MCP config.
6
+ */
7
+ export declare function parseTomlServerEntry(tomlContent: string, rootKey: string, serverName: string): Record<string, unknown> | null;
8
+ /**
9
+ * Parse nested TOML sub-tables (e.g., [mcp_servers.prior.env]).
10
+ */
11
+ export declare function parseTomlSubTables(tomlContent: string, rootKey: string, serverName: string): Record<string, Record<string, string>>;
12
+ /**
13
+ * Build TOML text for a server entry.
14
+ */
15
+ export declare function buildTomlEntry(rootKey: string, serverName: string, config: Record<string, unknown>): string;
16
+ /**
17
+ * Remove a TOML server entry block from content.
18
+ */
19
+ export declare function removeTomlEntry(tomlContent: string, rootKey: string, serverName: string): string;
20
+ /**
21
+ * Read an MCP server entry from a config file (JSON or TOML).
22
+ */
23
+ export declare function readMcpEntry(configPath: string, rootKey: string, serverName: string, configFormat?: string): Record<string, unknown> | null;
24
+ /**
25
+ * Build HTTP MCP config for a platform.
26
+ * Uses the platform registry to determine field names.
27
+ */
28
+ export declare function buildHttpConfig(serverUrl: string, platform: string): Record<string, unknown>;
29
+ /**
30
+ * Build HTTP MCP config with auth headers.
31
+ */
32
+ export declare function buildHttpConfigWithAuth(serverUrl: string, apiKey: string, platform: string, extraHeaders?: Record<string, string>): Record<string, unknown>;
33
+ /**
34
+ * Build stdio MCP config.
35
+ */
36
+ export declare function buildStdioConfig(command: string, args: string[], env: Record<string, string>): Record<string, unknown>;
37
+ /**
38
+ * Install MCP config for a platform.
39
+ * Tries platform CLI first (if available), falls back to file write.
40
+ */
41
+ export declare function installMcp(platform: DetectedPlatform, serverName: string, mcpEntry: Record<string, unknown>, options?: {
42
+ dryRun?: boolean;
43
+ serverUrl?: string;
44
+ }): {
45
+ success: boolean;
46
+ method: string;
47
+ };
48
+ /**
49
+ * Write MCP config directly to JSON file.
50
+ */
51
+ export declare function installMcpJson(platform: DetectedPlatform, serverName: string, mcpEntry: Record<string, unknown>, dryRun: boolean): {
52
+ success: boolean;
53
+ method: string;
54
+ };
55
+ /**
56
+ * Write MCP config to TOML file (Codex).
57
+ */
58
+ export declare function installMcpToml(platform: DetectedPlatform, serverName: string, mcpEntry: Record<string, unknown>, dryRun: boolean): {
59
+ success: boolean;
60
+ method: string;
61
+ };
62
+ /**
63
+ * Remove an MCP server entry from a platform config.
64
+ */
65
+ export declare function uninstallMcp(platform: DetectedPlatform, serverName: string, dryRun?: boolean): boolean;
66
+ /**
67
+ * Update API key in existing MCP config.
68
+ */
69
+ export declare function updateMcpKey(platform: DetectedPlatform, serverName: string, mcpEntry: Record<string, unknown>): {
70
+ success: boolean;
71
+ method: string;
72
+ };
73
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/lib/mcp.ts"],"names":[],"mappings":"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"}