autodev-cli 1.4.139 → 1.4.140

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/out/cli.js CHANGED
@@ -51,6 +51,7 @@ const office_1 = require("./commands/office");
51
51
  const deprovision_1 = require("./commands/deprovision");
52
52
  const login_1 = require("./commands/login");
53
53
  const models_1 = require("./commands/models");
54
+ const mcp_1 = require("./commands/mcp");
54
55
  const connect_2 = require("./connect");
55
56
  const logger_1 = require("./logger");
56
57
  // eslint-disable-next-line @typescript-eslint/no-var-requires
@@ -130,6 +131,7 @@ const program = new commander_1.Command()
130
131
  (0, deprovision_1.deprovisionCommand)(program);
131
132
  (0, login_1.loginCommand)(program);
132
133
  (0, models_1.modelsCommand)(program);
134
+ (0, mcp_1.mcpCommand)(program);
133
135
  program.parseAsync(process.argv).catch((err) => {
134
136
  console.error(err.message);
135
137
  process.exit(1);
package/out/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { Command } from 'commander';
2
+ import { type McpJsonEntry } from '../core/projectMcp';
3
+ import { type BinDetectDeps } from '../core/binDetect';
4
+ import { type CreativeAppId } from '../core/mcpCatalog';
5
+ export interface DetectPrereq {
6
+ id: string;
7
+ installed: boolean;
8
+ installHint: string;
9
+ }
10
+ export interface DetectApp {
11
+ id: CreativeAppId;
12
+ name: string;
13
+ installed: boolean;
14
+ path: string | null;
15
+ source: string | null;
16
+ experimental: boolean;
17
+ server: McpJsonEntry;
18
+ serverName: string;
19
+ prerequisites: DetectPrereq[];
20
+ postSetup: string[];
21
+ notes: string[];
22
+ alreadyEnabled: boolean;
23
+ }
24
+ export interface DetectResult {
25
+ apps: DetectApp[];
26
+ }
27
+ export declare function buildDetect(root: string, deps?: Partial<BinDetectDeps>): DetectResult;
28
+ export declare function mcpCommand(program: Command): void;
@@ -0,0 +1,380 @@
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.buildDetect = buildDetect;
37
+ exports.mcpCommand = mcpCommand;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const logger_1 = require("../logger");
41
+ const projectMcp_1 = require("../core/projectMcp");
42
+ const configManager_1 = require("../configManager");
43
+ const mcpManager_1 = require("../mcpManager");
44
+ const binDetect_1 = require("../core/binDetect");
45
+ const mcpCatalog_1 = require("../core/mcpCatalog");
46
+ const settingsLoader_1 = require("../core/settingsLoader");
47
+ const secureFile_1 = require("../core/secureFile");
48
+ // Names autodev treats as built-in MCP servers (toggled via disabledBuiltinMcp,
49
+ // not via an enabled:false entry in .mcp.json).
50
+ const BUILTIN_NAMES = new Set([
51
+ ...mcpManager_1.DEFAULT_MCP_SERVERS.map((s) => s.name), 'memory', 'pixel-office',
52
+ ]);
53
+ function resolveRoot(p) {
54
+ return p ? path.resolve(p) : process.cwd();
55
+ }
56
+ /** Commander collector for repeatable single-value options (append into an array). */
57
+ function collect(val, acc) {
58
+ acc.push(val);
59
+ return acc;
60
+ }
61
+ function sync(root) {
62
+ configManager_1.ConfigManager.syncProjectMcpServers(root, (m) => logger_1.log.gray(m));
63
+ }
64
+ function saveSettings(root, settings) {
65
+ const file = (0, settingsLoader_1.settingsWritePath)(root);
66
+ const dir = path.dirname(file);
67
+ if (!fs.existsSync(dir)) {
68
+ fs.mkdirSync(dir, { recursive: true });
69
+ }
70
+ (0, secureFile_1.writeFileSecure)(file, JSON.stringify(settings, null, 2) + '\n');
71
+ }
72
+ /** Parse repeated K=V option values into an object (ignores malformed pairs). */
73
+ function parseKvPairs(pairs) {
74
+ if (!pairs || pairs.length === 0) {
75
+ return undefined;
76
+ }
77
+ const out = {};
78
+ for (const p of pairs) {
79
+ const i = p.indexOf('=');
80
+ if (i <= 0) {
81
+ logger_1.log.warn(`Ignoring malformed pair "${p}" (expected KEY=VALUE)`);
82
+ continue;
83
+ }
84
+ out[p.slice(0, i)] = p.slice(i + 1);
85
+ }
86
+ return Object.keys(out).length ? out : undefined;
87
+ }
88
+ function isBuiltinName(root, name) {
89
+ if (BUILTIN_NAMES.has(name)) {
90
+ return true;
91
+ }
92
+ const all = (0, projectMcp_1.loadProjectAllMcp)(root);
93
+ return all[name]?._meta?.kind === 'builtin';
94
+ }
95
+ function transportOf(e) {
96
+ if ((0, projectMcp_1.isRemoteMcp)(e)) {
97
+ return e.type === 'sse' ? 'sse' : 'http';
98
+ }
99
+ return 'stdio';
100
+ }
101
+ /** Is a prerequisite launcher present on PATH? (uvx / python[3]). */
102
+ function prereqInstalled(id, deps) {
103
+ if (id === 'python') {
104
+ return !!((0, binDetect_1.detectBinOnPath)('python3', deps) || (0, binDetect_1.detectBinOnPath)('python', deps));
105
+ }
106
+ return !!(0, binDetect_1.detectBinOnPath)(id, deps);
107
+ }
108
+ function buildDetect(root, deps) {
109
+ const platform = deps?.platform ?? process.platform;
110
+ const existing = (0, projectMcp_1.loadProjectAllMcp)(root);
111
+ const apps = (0, mcpCatalog_1.getCatalog)(platform).map((entry) => {
112
+ const det = (0, binDetect_1.detectApp)(entry.id, deps);
113
+ const server = (0, mcpCatalog_1.serverSpecFor)(entry.id, platform);
114
+ const prerequisites = entry.prerequisites.map((pr) => ({
115
+ id: pr.id,
116
+ installed: prereqInstalled(pr.id, deps),
117
+ installHint: pr.installHint,
118
+ }));
119
+ return {
120
+ id: entry.id,
121
+ name: entry.name,
122
+ installed: det.installed,
123
+ path: det.path,
124
+ source: det.source,
125
+ experimental: entry.experimental,
126
+ server,
127
+ serverName: entry.serverName,
128
+ prerequisites,
129
+ postSetup: entry.postSetup,
130
+ notes: entry.notes,
131
+ alreadyEnabled: !!existing[entry.serverName],
132
+ };
133
+ });
134
+ return { apps };
135
+ }
136
+ // ---------------------------------------------------------------------------
137
+ // --enable <app> — write the server spec + propagate + print manual steps.
138
+ // ---------------------------------------------------------------------------
139
+ function enableApp(root, app, opts) {
140
+ const platform = process.platform;
141
+ const entry = (0, mcpCatalog_1.catalogEntry)(app, platform);
142
+ const det = (0, binDetect_1.detectApp)(app);
143
+ if (app === 'blender') {
144
+ if (!det.installed) {
145
+ logger_1.log.error('Blender was not detected on this machine. Install Blender first, then re-run.');
146
+ logger_1.log.gray(' (checked PATH + Program Files / Applications / flatpak / snap)');
147
+ return 1;
148
+ }
149
+ const server = (0, mcpCatalog_1.serverSpecFor)('blender', platform);
150
+ const user = (0, projectMcp_1.loadProjectUserMcp)(root);
151
+ user[entry.serverName] = server;
152
+ (0, projectMcp_1.saveProjectUserMcp)(root, user);
153
+ sync(root);
154
+ logger_1.log.success(`Configured Blender MCP server "${entry.serverName}" (${det.path}).`);
155
+ const uvx = prereqInstalled('uvx');
156
+ if (!uvx) {
157
+ logger_1.log.warn('⚠ `uvx` is NOT on PATH — the server is written but will not start until you install uv:');
158
+ logger_1.log.plain(` ${entry.prerequisites[0].installHint}`);
159
+ }
160
+ logger_1.log.section('Next steps');
161
+ for (const s of entry.postSetup) {
162
+ logger_1.log.plain(` • ${s}`);
163
+ }
164
+ return 0;
165
+ }
166
+ // gimp — experimental.
167
+ logger_1.log.warn('⚠ GIMP MCP is EXPERIMENTAL — upstream ships no packaged launcher; expect manual wiring.');
168
+ const gimpClient = (opts.gimpClient && opts.gimpClient.trim()) || undefined;
169
+ const server = (0, mcpCatalog_1.serverSpecFor)('gimp', platform, { gimpClientPath: gimpClient });
170
+ const user = (0, projectMcp_1.loadProjectUserMcp)(root);
171
+ user[entry.serverName] = server;
172
+ (0, projectMcp_1.saveProjectUserMcp)(root, user);
173
+ sync(root);
174
+ if (gimpClient) {
175
+ logger_1.log.success(`Configured GIMP MCP client "${entry.serverName}" → ${gimpClient}`);
176
+ }
177
+ else {
178
+ logger_1.log.warn(`Wrote a DISABLED stub "${entry.serverName}" (args: ${mcpCatalog_1.GIMP_CLIENT_PLACEHOLDER}). Provide --gimp-client <path> to complete it.`);
179
+ }
180
+ if (!prereqInstalled('python')) {
181
+ logger_1.log.warn('⚠ No python/python3 on PATH:');
182
+ logger_1.log.plain(` ${entry.prerequisites[0].installHint}`);
183
+ }
184
+ logger_1.log.section('Manual steps');
185
+ for (const s of entry.postSetup) {
186
+ logger_1.log.plain(` • ${s}`);
187
+ }
188
+ for (const n of entry.notes) {
189
+ logger_1.log.gray(` ! ${n}`);
190
+ }
191
+ return 0;
192
+ }
193
+ // ---------------------------------------------------------------------------
194
+ // Command wiring
195
+ // ---------------------------------------------------------------------------
196
+ function mcpCommand(program) {
197
+ const cmd = program
198
+ .command('mcp')
199
+ .description('Manage this workspace\'s MCP servers (.mcp.json) and detect creative apps');
200
+ // autodev mcp list [path] [--json]
201
+ cmd
202
+ .command('list [path]')
203
+ .description('List MCP servers configured for this workspace')
204
+ .option('--json', 'Output the raw entries array as JSON')
205
+ .action((p, opts) => {
206
+ const root = resolveRoot(p);
207
+ const all = (0, projectMcp_1.loadProjectAllMcp)(root);
208
+ if (opts.json) {
209
+ const arr = Object.entries(all).map(([name, e]) => ({ name, ...e }));
210
+ process.stdout.write(JSON.stringify(arr, null, 2) + '\n');
211
+ return;
212
+ }
213
+ logger_1.log.section('🔌 MCP servers');
214
+ const names = Object.keys(all);
215
+ if (names.length === 0) {
216
+ logger_1.log.gray(' (none configured)');
217
+ return;
218
+ }
219
+ for (const name of names) {
220
+ const e = all[name];
221
+ const kind = e._meta?.kind === 'builtin' ? 'builtin' : 'user';
222
+ const enabled = e.enabled === false ? 'disabled' : 'enabled';
223
+ const detail = (0, projectMcp_1.isRemoteMcp)(e) ? e.url : [e.command, ...(e.args ?? [])].join(' ');
224
+ logger_1.log.plain(` ${name.padEnd(20)} ${kind.padEnd(8)} ${enabled.padEnd(9)} ${transportOf(e).padEnd(6)} ${detail}`);
225
+ }
226
+ });
227
+ // autodev mcp add <name> [options] [path]
228
+ cmd
229
+ .command('add <name> [path]')
230
+ .description('Add a user MCP server (stdio via --command, or remote via --url)')
231
+ .option('--command <c>', 'stdio launcher (e.g. uvx, npx, python)')
232
+ .option('--arg <a>', 'stdio argument (repeatable; use --arg=-y for dash-prefixed values)', collect, [])
233
+ .option('--env <kv>', 'stdio env var KEY=VALUE (repeatable)', collect, [])
234
+ .option('--url <u>', 'remote MCP endpoint URL (http/sse)')
235
+ .option('--header <kv>', 'remote header KEY=VALUE (repeatable)', collect, [])
236
+ .option('--sse', 'remote transport is SSE (default http)')
237
+ .action((name, p, opts) => {
238
+ const root = resolveRoot(p);
239
+ if (opts.command && opts.url) {
240
+ logger_1.log.error('Provide EITHER --command (stdio) OR --url (remote), not both.');
241
+ process.exit(1);
242
+ }
243
+ if (!opts.command && !opts.url) {
244
+ logger_1.log.error('Provide --command <c> for a stdio server or --url <u> for a remote server.');
245
+ process.exit(1);
246
+ }
247
+ let entry;
248
+ if (opts.url) {
249
+ entry = {
250
+ type: opts.sse ? 'sse' : 'http',
251
+ url: opts.url,
252
+ ...(parseKvPairs(opts.header) ? { headers: parseKvPairs(opts.header) } : {}),
253
+ };
254
+ }
255
+ else {
256
+ entry = {
257
+ command: opts.command,
258
+ args: opts.arg ?? [],
259
+ ...(parseKvPairs(opts.env) ? { env: parseKvPairs(opts.env) } : {}),
260
+ };
261
+ }
262
+ const user = (0, projectMcp_1.loadProjectUserMcp)(root);
263
+ user[name] = entry;
264
+ (0, projectMcp_1.saveProjectUserMcp)(root, user);
265
+ sync(root);
266
+ logger_1.log.success(`Added MCP server "${name}" and propagated to all providers.`);
267
+ });
268
+ // autodev mcp remove <name> [path]
269
+ cmd
270
+ .command('remove <name> [path]')
271
+ .alias('rm')
272
+ .description('Remove a user MCP server')
273
+ .action((name, p) => {
274
+ const root = resolveRoot(p);
275
+ const removed = (0, projectMcp_1.removeProjectUserMcp)(root, name);
276
+ if (!removed) {
277
+ logger_1.log.error(`No user MCP server named "${name}" (built-ins are managed via enable/disable).`);
278
+ process.exit(1);
279
+ }
280
+ sync(root);
281
+ logger_1.log.success(`Removed MCP server "${name}".`);
282
+ });
283
+ // autodev mcp enable <name> [path]
284
+ cmd
285
+ .command('enable <name> [path]')
286
+ .description('Enable an MCP server (user entry or built-in)')
287
+ .action((name, p) => {
288
+ const root = resolveRoot(p);
289
+ setEnabled(root, name, true);
290
+ });
291
+ // autodev mcp disable <name> [path]
292
+ cmd
293
+ .command('disable <name> [path]')
294
+ .description('Disable an MCP server (kept in config; not synced to providers)')
295
+ .action((name, p) => {
296
+ const root = resolveRoot(p);
297
+ setEnabled(root, name, false);
298
+ });
299
+ // autodev mcp detect [path] [--json] [--enable <app>] [--gimp-client <path>]
300
+ cmd
301
+ .command('detect [path]')
302
+ .description('Detect installed creative apps (Blender / GIMP) and optionally enable their MCP server')
303
+ .option('--json', 'Output the stable detection JSON (consumed by the app + extension)')
304
+ .option('--enable <app>', 'Write + propagate the MCP server for this app (blender | gimp)')
305
+ .option('--gimp-client <path>', 'Path to gimp_mcp_client.py (for --enable gimp)')
306
+ .action((p, opts) => {
307
+ const root = resolveRoot(p);
308
+ if (opts.enable) {
309
+ const app = opts.enable.toLowerCase();
310
+ if (app !== 'blender' && app !== 'gimp') {
311
+ logger_1.log.error(`--enable expects "blender" or "gimp" (got "${opts.enable}").`);
312
+ process.exit(1);
313
+ }
314
+ const code = enableApp(root, app, { gimpClient: opts.gimpClient });
315
+ if (code !== 0) {
316
+ process.exit(code);
317
+ }
318
+ return;
319
+ }
320
+ const result = buildDetect(root);
321
+ if (opts.json) {
322
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
323
+ return;
324
+ }
325
+ logger_1.log.section('🎨 Creative-app MCP detection');
326
+ for (const a of result.apps) {
327
+ const mark = a.installed ? '✅' : '⬜';
328
+ const exp = a.experimental ? ' (experimental)' : '';
329
+ logger_1.log.plain(` ${mark} ${a.name}${exp}`);
330
+ if (a.installed) {
331
+ logger_1.log.gray(` path: ${a.path} [${a.source}]`);
332
+ }
333
+ if (a.alreadyEnabled) {
334
+ logger_1.log.gray(' already configured in this workspace');
335
+ }
336
+ for (const pr of a.prerequisites) {
337
+ if (!pr.installed) {
338
+ logger_1.log.warn(` prerequisite "${pr.id}" missing → ${pr.installHint}`);
339
+ }
340
+ }
341
+ }
342
+ logger_1.log.plain('');
343
+ logger_1.log.gray(' Enable one with: autodev mcp detect --enable blender');
344
+ logger_1.log.gray(' GIMP (experimental): autodev mcp detect --enable gimp --gimp-client <gimp_mcp_client.py>');
345
+ });
346
+ }
347
+ /** Flip enabled state for a user entry, or toggle disabledBuiltinMcp for a built-in. */
348
+ function setEnabled(root, name, enabled) {
349
+ if (isBuiltinName(root, name)) {
350
+ const settings = (0, settingsLoader_1.loadSettingsForRoot)(root);
351
+ const disabled = new Set(settings.disabledBuiltinMcp ?? []);
352
+ if (enabled) {
353
+ disabled.delete(name);
354
+ }
355
+ else {
356
+ disabled.add(name);
357
+ }
358
+ settings.disabledBuiltinMcp = [...disabled];
359
+ saveSettings(root, settings);
360
+ sync(root);
361
+ logger_1.log.success(`${enabled ? 'Enabled' : 'Disabled'} built-in MCP server "${name}".`);
362
+ return;
363
+ }
364
+ const user = (0, projectMcp_1.loadProjectUserMcp)(root);
365
+ const entry = user[name];
366
+ if (!entry) {
367
+ logger_1.log.error(`No MCP server named "${name}" in this workspace.`);
368
+ process.exit(1);
369
+ }
370
+ if (enabled) {
371
+ delete entry.enabled;
372
+ }
373
+ else {
374
+ entry.enabled = false;
375
+ }
376
+ (0, projectMcp_1.saveProjectUserMcp)(root, user);
377
+ sync(root);
378
+ logger_1.log.success(`${enabled ? 'Enabled' : 'Disabled'} MCP server "${name}".`);
379
+ }
380
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface BinDetectDeps {
2
+ platform: NodeJS.Platform;
3
+ env: NodeJS.ProcessEnv;
4
+ homedir: () => string;
5
+ /** Existence probe (stat). Injected so tests can fake a filesystem. */
6
+ fileExists: (p: string) => boolean;
7
+ /** List a directory's immediate children. Returns [] on any error/missing dir. */
8
+ listDir: (p: string) => string[];
9
+ }
10
+ export declare function defaultBinDetectDeps(): BinDetectDeps;
11
+ /**
12
+ * Resolve a bare launcher name against PATH, plus a few well-known install
13
+ * dirs that are frequently missing from a GUI-launched process's PATH
14
+ * (~/.local/bin everywhere; %LOCALAPPDATA%\Programs and %APPDATA%\npm on win).
15
+ * Returns the absolute path of the first match, or null.
16
+ */
17
+ export declare function detectBinOnPath(bin: string, deps?: Partial<BinDetectDeps>): string | null;
18
+ export type AppSource = 'path' | 'program-files' | 'app-bundle' | 'flatpak' | 'snap' | 'known-dir';
19
+ export interface DetectAppResult {
20
+ installed: boolean;
21
+ path: string | null;
22
+ source: AppSource | null;
23
+ }
24
+ /**
25
+ * Detect a known creative app across PATH + platform default install locations.
26
+ * Never throws; never spawns the app.
27
+ */
28
+ export declare function detectApp(app: 'blender' | 'gimp', deps?: Partial<BinDetectDeps>): DetectAppResult;
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // binDetect — cross-platform detection of on-PATH launchers AND creative apps
4
+ // that install OUTSIDE PATH (Blender / GIMP).
5
+ //
6
+ // Everything is dependency-injected ({platform, env, homedir, fileExists}) so
7
+ // the detection logic is unit-testable without the app actually being present:
8
+ // a fake Program Files tree on win32, a PATH hit on linux, etc.
9
+ //
10
+ // We only ever stat / glob directories and read PATH — we never spawn the app.
11
+ // (Node fs/path/os only; no child_process here.)
12
+ // ---------------------------------------------------------------------------
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.defaultBinDetectDeps = defaultBinDetectDeps;
48
+ exports.detectBinOnPath = detectBinOnPath;
49
+ exports.detectApp = detectApp;
50
+ const fs = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ const os = __importStar(require("os"));
53
+ function realFileExists(p) {
54
+ try {
55
+ return fs.existsSync(p);
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
61
+ function realListDir(p) {
62
+ try {
63
+ return fs.readdirSync(p);
64
+ }
65
+ catch {
66
+ return [];
67
+ }
68
+ }
69
+ function defaultBinDetectDeps() {
70
+ return {
71
+ platform: process.platform,
72
+ env: process.env,
73
+ homedir: os.homedir,
74
+ fileExists: realFileExists,
75
+ listDir: realListDir,
76
+ };
77
+ }
78
+ function mergeDeps(deps) {
79
+ return { ...defaultBinDetectDeps(), ...(deps || {}) };
80
+ }
81
+ /** Windows executable extensions, honoring %PATHEXT% with a sane fallback. */
82
+ function winExts(env) {
83
+ const raw = (env.PATHEXT || '').split(';').map((e) => e.trim()).filter(Boolean);
84
+ const exts = raw.length ? raw : ['.EXE', '.CMD', '.BAT', '.COM'];
85
+ // Always allow the bare name too (e.g. a launcher that already carries an ext).
86
+ return ['', ...exts.map((e) => (e.startsWith('.') ? e : '.' + e))];
87
+ }
88
+ /**
89
+ * Resolve a bare launcher name against PATH, plus a few well-known install
90
+ * dirs that are frequently missing from a GUI-launched process's PATH
91
+ * (~/.local/bin everywhere; %LOCALAPPDATA%\Programs and %APPDATA%\npm on win).
92
+ * Returns the absolute path of the first match, or null.
93
+ */
94
+ function detectBinOnPath(bin, deps) {
95
+ const d = mergeDeps(deps);
96
+ const isWin = d.platform === 'win32';
97
+ // A caller that passes an explicit path (has a separator) just gets probed.
98
+ if (/[\\/]/.test(bin)) {
99
+ return d.fileExists(bin) ? bin : null;
100
+ }
101
+ const exts = isWin ? winExts(d.env) : [''];
102
+ const sep = isWin ? ';' : ':';
103
+ const pathDirs = (d.env.PATH || d.env.Path || '').split(sep).map((s) => s.trim()).filter(Boolean);
104
+ const extraDirs = [];
105
+ const home = d.homedir();
106
+ if (home) {
107
+ extraDirs.push(path.join(home, '.local', 'bin'));
108
+ }
109
+ if (isWin) {
110
+ const local = d.env.LOCALAPPDATA;
111
+ const appdata = d.env.APPDATA;
112
+ if (local) {
113
+ extraDirs.push(path.join(local, 'Programs'));
114
+ }
115
+ if (appdata) {
116
+ extraDirs.push(path.join(appdata, 'npm'));
117
+ }
118
+ }
119
+ for (const dir of [...pathDirs, ...extraDirs]) {
120
+ for (const ext of exts) {
121
+ const full = path.join(dir, bin + ext);
122
+ if (d.fileExists(full)) {
123
+ return full;
124
+ }
125
+ }
126
+ }
127
+ return null;
128
+ }
129
+ /** First candidate whose file exists wins (candidates are pre-ordered by preference). */
130
+ function firstExisting(cands, d) {
131
+ for (const c of cands) {
132
+ if (c.path && d.fileExists(c.path)) {
133
+ return { installed: true, path: c.path, source: c.source };
134
+ }
135
+ }
136
+ return { installed: false, path: null, source: null };
137
+ }
138
+ /** Children of `parent` matching `re`, joined back to absolute paths (safe on missing dirs). */
139
+ function globChildren(parent, re, d) {
140
+ return d.listDir(parent).filter((n) => re.test(n)).sort().map((n) => path.join(parent, n));
141
+ }
142
+ /** Flatpak per-app exported launcher path, checked in the user + system roots. */
143
+ function flatpakExportCandidates(appId, d) {
144
+ const roots = [];
145
+ const home = d.homedir();
146
+ if (home) {
147
+ roots.push(path.join(home, '.local', 'share', 'flatpak'));
148
+ }
149
+ roots.push('/var/lib/flatpak');
150
+ return roots.map((r) => ({ path: path.join(r, 'exports', 'bin', appId), source: 'flatpak' }));
151
+ }
152
+ /** Windows "Program Files" roots we know about (64-bit, 32-bit, and env overrides). */
153
+ function winProgramRoots(d) {
154
+ const roots = new Set();
155
+ for (const v of [d.env.PROGRAMFILES, d.env['ProgramW6432'], d.env['ProgramFiles(x86)']]) {
156
+ if (v) {
157
+ roots.add(v);
158
+ }
159
+ }
160
+ roots.add('C:\\Program Files');
161
+ roots.add('C:\\Program Files (x86)');
162
+ return [...roots];
163
+ }
164
+ function detectBlender(d) {
165
+ // 1) PATH (all platforms) — highest confidence.
166
+ const onPath = detectBinOnPath('blender', d);
167
+ if (onPath) {
168
+ return { installed: true, path: onPath, source: 'path' };
169
+ }
170
+ const cands = [];
171
+ if (d.platform === 'win32') {
172
+ // C:\Program Files\Blender Foundation\Blender X.Y\blender.exe
173
+ for (const root of winProgramRoots(d)) {
174
+ const foundation = path.join(root, 'Blender Foundation');
175
+ for (const verDir of globChildren(foundation, /^Blender/i, d)) {
176
+ cands.push({ path: path.join(verDir, 'blender.exe'), source: 'program-files' });
177
+ }
178
+ }
179
+ // %LOCALAPPDATA%\Programs\Blender Foundation\Blender X.Y\blender.exe
180
+ const local = d.env.LOCALAPPDATA;
181
+ if (local) {
182
+ const foundation = path.join(local, 'Programs', 'Blender Foundation');
183
+ for (const verDir of globChildren(foundation, /^Blender/i, d)) {
184
+ cands.push({ path: path.join(verDir, 'blender.exe'), source: 'program-files' });
185
+ }
186
+ }
187
+ // Steam: ...\Steam\steamapps\common\Blender\blender.exe
188
+ for (const root of winProgramRoots(d)) {
189
+ cands.push({ path: path.join(root, 'Steam', 'steamapps', 'common', 'Blender', 'blender.exe'), source: 'known-dir' });
190
+ }
191
+ }
192
+ else if (d.platform === 'darwin') {
193
+ cands.push({ path: '/Applications/Blender.app/Contents/MacOS/Blender', source: 'app-bundle' });
194
+ const home = d.homedir();
195
+ if (home) {
196
+ cands.push({ path: path.join(home, 'Applications', 'Blender.app', 'Contents', 'MacOS', 'Blender'), source: 'app-bundle' });
197
+ }
198
+ }
199
+ else {
200
+ cands.push({ path: '/usr/bin/blender', source: 'known-dir' });
201
+ cands.push({ path: '/usr/local/bin/blender', source: 'known-dir' });
202
+ cands.push({ path: '/snap/bin/blender', source: 'snap' });
203
+ cands.push(...flatpakExportCandidates('org.blender.Blender', d));
204
+ }
205
+ return firstExisting(cands, d);
206
+ }
207
+ function detectGimp(d) {
208
+ const binNames = ['gimp', 'gimp-3.0', 'gimp-2.99', 'gimp-2.10'];
209
+ // 1) PATH (all platforms).
210
+ for (const b of binNames) {
211
+ const onPath = detectBinOnPath(b, d);
212
+ if (onPath) {
213
+ return { installed: true, path: onPath, source: 'path' };
214
+ }
215
+ }
216
+ const cands = [];
217
+ if (d.platform === 'win32') {
218
+ // C:\Program Files\GIMP 2\bin\gimp-2.10.exe (version dirs + version'd exe)
219
+ for (const root of winProgramRoots(d)) {
220
+ for (const gimpDir of globChildren(root, /^GIMP/i, d)) {
221
+ const bin = path.join(gimpDir, 'bin');
222
+ for (const exe of globChildren(bin, /^gimp.*\.exe$/i, d)) {
223
+ cands.push({ path: exe, source: 'program-files' });
224
+ }
225
+ }
226
+ }
227
+ }
228
+ else if (d.platform === 'darwin') {
229
+ cands.push({ path: '/Applications/GIMP.app/Contents/MacOS/gimp', source: 'app-bundle' });
230
+ cands.push({ path: '/Applications/GIMP.app/Contents/MacOS/GIMP', source: 'app-bundle' });
231
+ // Versioned bundle naming (GIMP-2.10.app).
232
+ for (const appDir of globChildren('/Applications', /^GIMP[-.].*\.app$/i, d)) {
233
+ cands.push({ path: path.join(appDir, 'Contents', 'MacOS', 'gimp'), source: 'app-bundle' });
234
+ cands.push({ path: path.join(appDir, 'Contents', 'MacOS', 'GIMP'), source: 'app-bundle' });
235
+ }
236
+ }
237
+ else {
238
+ for (const b of binNames) {
239
+ cands.push({ path: `/usr/bin/${b}`, source: 'known-dir' });
240
+ cands.push({ path: `/usr/local/bin/${b}`, source: 'known-dir' });
241
+ }
242
+ cands.push({ path: '/snap/bin/gimp', source: 'snap' });
243
+ cands.push(...flatpakExportCandidates('org.gimp.GIMP', d));
244
+ }
245
+ return firstExisting(cands, d);
246
+ }
247
+ /**
248
+ * Detect a known creative app across PATH + platform default install locations.
249
+ * Never throws; never spawns the app.
250
+ */
251
+ function detectApp(app, deps) {
252
+ const d = mergeDeps(deps);
253
+ return app === 'blender' ? detectBlender(d) : detectGimp(d);
254
+ }
255
+ //# sourceMappingURL=binDetect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binDetect.js","sourceRoot":"","sources":["../../src/core/binDetect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { McpJsonEntry } from './projectMcp';
2
+ export type CreativeAppId = 'blender' | 'gimp';
3
+ export interface McpPrerequisiteSpec {
4
+ /** Launcher/interpreter the server needs on PATH (e.g. 'uvx', 'python'). */
5
+ id: string;
6
+ /** Copy-pasteable command to install it, per platform. */
7
+ installHint: string;
8
+ }
9
+ export interface McpCatalogEntry {
10
+ id: CreativeAppId;
11
+ name: string;
12
+ /** True = prototype/best-effort. UIs should surface it as such, never one-click. */
13
+ experimental: boolean;
14
+ /** The name the server is written under in .mcp.json. */
15
+ serverName: string;
16
+ prerequisites: McpPrerequisiteSpec[];
17
+ /** Ordered manual steps the user still performs after the config is written. */
18
+ postSetup: string[];
19
+ /** Caveats worth surfacing (port clashes, upstream bugs). */
20
+ notes: string[];
21
+ }
22
+ /** Placeholder the GIMP stub carries until the user points it at their checkout. */
23
+ export declare const GIMP_CLIENT_PLACEHOLDER = "<GIMP_MCP_CLIENT_PY>";
24
+ /** Per-platform install hint for the `uv`/`uvx` toolchain (never `pip install uv`). */
25
+ export declare function uvInstallHint(platform: NodeJS.Platform): string;
26
+ /** Per-platform install hint for Python 3. */
27
+ export declare function pythonInstallHint(platform: NodeJS.Platform): string;
28
+ /**
29
+ * The McpJsonEntry we would write for an app. Platform-aware.
30
+ * - Blender: `uvx blender-mcp` (wrapped in `cmd /c` on win32 so the .cmd shim resolves).
31
+ * - GIMP: a best-effort stdio stub `python <client.py>`, written enabled:false
32
+ * unless the caller supplies a real client path — GIMP ships no launcher, so
33
+ * we never pretend it's one-click.
34
+ */
35
+ export declare function serverSpecFor(app: CreativeAppId, platform: NodeJS.Platform, opts?: {
36
+ gimpClientPath?: string;
37
+ }): McpJsonEntry;
38
+ /** Build the catalog for a given platform (install hints are platform-specific). */
39
+ export declare function getCatalog(platform: NodeJS.Platform): McpCatalogEntry[];
40
+ /** Lookup a single catalog entry. */
41
+ export declare function catalogEntry(app: CreativeAppId, platform: NodeJS.Platform): McpCatalogEntry;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // mcpCatalog — the known creative-app MCP registry. Single source of truth that
4
+ // BOTH the Electron app and the VS Code extension consume via `autodev mcp
5
+ // detect --json`; the CLI is what actually writes the server into .mcp.json and
6
+ // propagates it to every provider, so the shapes here must stay stable.
7
+ //
8
+ // Each app declares: the McpJsonEntry we would write (platform-aware),
9
+ // prerequisites (with an install hint), and honest post-setup / notes. GIMP is
10
+ // flagged experimental because upstream ships no packaged launcher — see below.
11
+ // ---------------------------------------------------------------------------
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.GIMP_CLIENT_PLACEHOLDER = void 0;
14
+ exports.uvInstallHint = uvInstallHint;
15
+ exports.pythonInstallHint = pythonInstallHint;
16
+ exports.serverSpecFor = serverSpecFor;
17
+ exports.getCatalog = getCatalog;
18
+ exports.catalogEntry = catalogEntry;
19
+ /** Placeholder the GIMP stub carries until the user points it at their checkout. */
20
+ exports.GIMP_CLIENT_PLACEHOLDER = '<GIMP_MCP_CLIENT_PY>';
21
+ /** Per-platform install hint for the `uv`/`uvx` toolchain (never `pip install uv`). */
22
+ function uvInstallHint(platform) {
23
+ if (platform === 'win32') {
24
+ return 'powershell -ExecutionPolicy Bypass -c "irm https://astral.sh/uv/install.ps1 | iex"';
25
+ }
26
+ if (platform === 'darwin') {
27
+ return 'brew install uv (or: curl -LsSf https://astral.sh/uv/install.sh | sh)';
28
+ }
29
+ return 'curl -LsSf https://astral.sh/uv/install.sh | sh';
30
+ }
31
+ /** Per-platform install hint for Python 3. */
32
+ function pythonInstallHint(platform) {
33
+ if (platform === 'win32') {
34
+ return 'Install Python 3 from https://www.python.org/downloads/ (tick "Add to PATH")';
35
+ }
36
+ if (platform === 'darwin') {
37
+ return 'brew install python (or install from https://www.python.org)';
38
+ }
39
+ return 'Install python3 via your package manager (e.g. apt install python3)';
40
+ }
41
+ /**
42
+ * The McpJsonEntry we would write for an app. Platform-aware.
43
+ * - Blender: `uvx blender-mcp` (wrapped in `cmd /c` on win32 so the .cmd shim resolves).
44
+ * - GIMP: a best-effort stdio stub `python <client.py>`, written enabled:false
45
+ * unless the caller supplies a real client path — GIMP ships no launcher, so
46
+ * we never pretend it's one-click.
47
+ */
48
+ function serverSpecFor(app, platform, opts) {
49
+ if (app === 'blender') {
50
+ return platform === 'win32'
51
+ ? { command: 'cmd', args: ['/c', 'uvx', 'blender-mcp'] }
52
+ : { command: 'uvx', args: ['blender-mcp'] };
53
+ }
54
+ // gimp — experimental stub.
55
+ const client = (opts?.gimpClientPath && opts.gimpClientPath.trim()) || exports.GIMP_CLIENT_PLACEHOLDER;
56
+ const isStub = client === exports.GIMP_CLIENT_PLACEHOLDER;
57
+ return {
58
+ command: platform === 'win32' ? 'python' : 'python3',
59
+ args: [client],
60
+ // A stub (no real client path) is written disabled so it is preserved for the
61
+ // user to complete without being spawned as a broken server.
62
+ ...(isStub ? { enabled: false } : {}),
63
+ };
64
+ }
65
+ /** Build the catalog for a given platform (install hints are platform-specific). */
66
+ function getCatalog(platform) {
67
+ return [
68
+ {
69
+ id: 'blender',
70
+ name: 'Blender',
71
+ experimental: false,
72
+ serverName: 'blender',
73
+ prerequisites: [{ id: 'uvx', installHint: uvInstallHint(platform) }],
74
+ postSetup: [
75
+ 'Run `uvx blender-mcp install-addon` to install the Blender addon',
76
+ "In Blender: Preferences → Add-ons → enable 'Interface: MCP for Blender'",
77
+ "In the 3D viewport press N → 'MCP for Blender' → Start MCP Server (listens on localhost:9876)",
78
+ 'Run only one MCP client against Blender at a time',
79
+ ],
80
+ notes: [],
81
+ },
82
+ {
83
+ id: 'gimp',
84
+ name: 'GIMP',
85
+ experimental: true,
86
+ serverName: 'gimp',
87
+ prerequisites: [{ id: 'python', installHint: pythonInstallHint(platform) }],
88
+ postSetup: [
89
+ 'Clone https://github.com/libreearth/gimp-mcp and point the server at its gimp_mcp_client.py',
90
+ '`pip install mcp` (the client needs the MCP Python SDK)',
91
+ gimpPluginStep(platform),
92
+ 'In GIMP 3.0: Filters → Development → Start MCP Server (socket on :9876)',
93
+ 'Re-run `autodev mcp detect --enable gimp --gimp-client <path-to-gimp_mcp_client.py>` once you have the client',
94
+ ],
95
+ notes: [
96
+ 'Experimental prototype: upstream ships NO packaged launcher and the README contradicts its own code — expect manual wiring.',
97
+ 'Port 9876 collides with Blender — do not run both MCP servers at once.',
98
+ ],
99
+ },
100
+ ];
101
+ }
102
+ /** GIMP 3.0 plug-ins directory step, per OS. */
103
+ function gimpPluginStep(platform) {
104
+ const dir = platform === 'win32'
105
+ ? '%APPDATA%\\GIMP\\3.0\\plug-ins\\'
106
+ : platform === 'darwin'
107
+ ? '~/Library/Application Support/GIMP/3.0/plug-ins/'
108
+ : '~/.config/GIMP/3.0/plug-ins/';
109
+ return `Copy gimp_mcp_server.py into the GIMP 3.0 plug-ins dir (${dir}) and make it executable`;
110
+ }
111
+ /** Lookup a single catalog entry. */
112
+ function catalogEntry(app, platform) {
113
+ const e = getCatalog(platform).find((x) => x.id === app);
114
+ if (!e) {
115
+ throw new Error(`Unknown creative app: ${app}`);
116
+ }
117
+ return e;
118
+ }
119
+ //# sourceMappingURL=mcpCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpCatalog.js","sourceRoot":"","sources":["../../src/core/mcpCatalog.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autodev-cli",
3
- "version": "1.4.139",
3
+ "version": "1.4.140",
4
4
  "description": "AutoAIDev CLI — autonomous AI task loop with VS Code / Cursor launcher",
5
5
  "author": "Peter Ivanov <peter@microweber.com>",
6
6
  "license": "MIT",
@@ -33,7 +33,7 @@
33
33
  "start": "node bin/autodev.js",
34
34
  "test:coverage": "c8 npm test",
35
35
  "coverage:html": "c8 --reporter=html npm test",
36
- "test": "node test/smoke.mjs && node test/liveNarration.smoke.mjs && node test/liveNarration.edge.smoke.mjs && node test/normalizer.parity.smoke.mjs && node test/providerConfig.smoke.mjs && node test/providers.services.smoke.mjs && node test/providers.dummy.smoke.mjs && node test/mcpOnlyOperator.smoke.mjs && node test/opencodeEventFilter.smoke.mjs && node test/copilotMcpIsolation.smoke.mjs && node test/grokSpawnError.smoke.mjs && node test/initTemplate.smoke.mjs && node test/settingsAliases.smoke.mjs && node test/setupWritesOfficeMcp.smoke.mjs && node test/provisionNoGlobalMcp.smoke.mjs && node test/deprovisionCleans.smoke.mjs && node test/hooksElectronSafe.smoke.mjs && node test/claudePermissions.smoke.mjs && node test/presenceGuard.smoke.mjs && node test/cliExitHardFail.smoke.mjs && node test/redactSecrets.smoke.mjs && node test/claudeUsage.smoke.mjs && node test/graphStore.smoke.mjs && node test/programReminder.smoke.mjs && node test/agentBackup.smoke.mjs && node test/persona.smoke.mjs && node test/soulUpdate.smoke.mjs && node test/sessionsGlobal.smoke.mjs && node test/resumeSessionLoopDefault.smoke.mjs && node test/secureFilePerms.smoke.mjs && node test/providers.dummy.office.smoke.mjs"
36
+ "test": "node test/smoke.mjs && node test/liveNarration.smoke.mjs && node test/liveNarration.edge.smoke.mjs && node test/normalizer.parity.smoke.mjs && node test/providerConfig.smoke.mjs && node test/providers.services.smoke.mjs && node test/providers.dummy.smoke.mjs && node test/mcpOnlyOperator.smoke.mjs && node test/opencodeEventFilter.smoke.mjs && node test/copilotMcpIsolation.smoke.mjs && node test/grokSpawnError.smoke.mjs && node test/initTemplate.smoke.mjs && node test/settingsAliases.smoke.mjs && node test/setupWritesOfficeMcp.smoke.mjs && node test/provisionNoGlobalMcp.smoke.mjs && node test/deprovisionCleans.smoke.mjs && node test/hooksElectronSafe.smoke.mjs && node test/claudePermissions.smoke.mjs && node test/presenceGuard.smoke.mjs && node test/cliExitHardFail.smoke.mjs && node test/redactSecrets.smoke.mjs && node test/claudeUsage.smoke.mjs && node test/graphStore.smoke.mjs && node test/programReminder.smoke.mjs && node test/agentBackup.smoke.mjs && node test/persona.smoke.mjs && node test/soulUpdate.smoke.mjs && node test/sessionsGlobal.smoke.mjs && node test/resumeSessionLoopDefault.smoke.mjs && node test/secureFilePerms.smoke.mjs && node test/providers.dummy.office.smoke.mjs && node test/mcpDetect.smoke.mjs"
37
37
  },
38
38
  "dependencies": {
39
39
  "@opencode-ai/sdk": "^1.14.41",