@rse/ase 0.9.33 → 0.9.35
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/dst/ase-service.js +4 -0
- package/dst/ase-setup.js +77 -45
- package/package.json +7 -7
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/agents/ase-code-analyze.md +262 -0
- package/plugin/meta/ase-dialog.md +10 -171
- package/plugin/package.json +5 -5
- package/plugin/skills/ase-arch-analyze/SKILL.md +5 -4
- package/plugin/skills/ase-code-analyze/SKILL.md +58 -217
- package/plugin/skills/ase-code-explain/SKILL.md +5 -5
- package/plugin/skills/ase-code-insight/SKILL.md +5 -5
- package/plugin/skills/ase-code-lint/SKILL.md +30 -13
- package/plugin/skills/ase-code-resolve/SKILL.md +5 -5
- package/plugin/skills/ase-docs-proofread/SKILL.md +28 -14
- package/plugin/skills/ase-meta-chat/SKILL.md +4 -4
- package/plugin/skills/ase-meta-diff/SKILL.md +3 -3
- package/plugin/skills/ase-meta-quorum/SKILL.md +6 -5
- package/plugin/skills/ase-meta-review/SKILL.md +5 -6
- package/plugin/skills/ase-meta-search/SKILL.md +7 -4
- package/dst/ase-hello.js +0 -23
package/dst/ase-service.js
CHANGED
|
@@ -295,6 +295,10 @@ export default class ServiceCommand {
|
|
|
295
295
|
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
296
296
|
const mcp = buildMcpServer();
|
|
297
297
|
request.raw.res.on("close", () => {
|
|
298
|
+
/* "h.abandon" (see below) bypasses "onPreResponse",
|
|
299
|
+
so undo the "onRequest" accounting here instead */
|
|
300
|
+
inFlight = Math.max(0, inFlight - 1);
|
|
301
|
+
lastActivity = Date.now();
|
|
298
302
|
transport.close().catch(() => { });
|
|
299
303
|
mcp.close().catch(() => { });
|
|
300
304
|
});
|
package/dst/ase-setup.js
CHANGED
|
@@ -153,7 +153,8 @@ export default class SetupCommand {
|
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
/* handler for "ase setup install" (both tools) */
|
|
156
|
-
async doInstall(tool, dev) {
|
|
156
|
+
async doInstall(tool, dev, scope) {
|
|
157
|
+
this.requireClaudeScope(tool, scope);
|
|
157
158
|
const spec = toolSpecs[tool];
|
|
158
159
|
await this.ensureTool("npm");
|
|
159
160
|
await this.ensureTool(spec.cli);
|
|
@@ -162,15 +163,18 @@ export default class SetupCommand {
|
|
|
162
163
|
`installing ASE ${spec.label} plugin (origin: ${dev ? "local" : "remote/bundled"})`);
|
|
163
164
|
const pkgdir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
164
165
|
const source = dev ? path.resolve(pkgdir, "..") : pkgdir;
|
|
165
|
-
|
|
166
|
-
await this.run(spec.cli, ["plugin",
|
|
166
|
+
const scopeArgs = tool === "claude" && scope !== "user" ? ["--scope", scope] : [];
|
|
167
|
+
await this.run(spec.cli, ["plugin", "marketplace", "add", source, ...scopeArgs]);
|
|
168
|
+
await this.run(spec.cli, ["plugin", spec.pInstall, "ase@ase", ...scopeArgs], { retries: 3 });
|
|
167
169
|
return 0;
|
|
168
170
|
}
|
|
169
171
|
/* handler for "ase setup update" (both tools) */
|
|
170
|
-
async doUpdate(tool, force, dev) {
|
|
172
|
+
async doUpdate(tool, force, dev, scope) {
|
|
173
|
+
this.requireClaudeScope(tool, scope);
|
|
171
174
|
const spec = toolSpecs[tool];
|
|
172
175
|
await this.ensureTool("npm");
|
|
173
176
|
await this.ensureTool(spec.cli);
|
|
177
|
+
const scopeArgs = tool === "claude" && scope !== "user" ? ["--scope", scope] : [];
|
|
174
178
|
/* best-effort stop of background service */
|
|
175
179
|
this.log.write("info", `setup: update${dev ? "[dev]" : ""}: ` +
|
|
176
180
|
"stopping potentially running ASE service");
|
|
@@ -186,8 +190,8 @@ export default class SetupCommand {
|
|
|
186
190
|
but there is no version change in the plugin manifest,
|
|
187
191
|
so just re-install the plugin to let the tool update its copy */
|
|
188
192
|
this.log.write("info", `setup: update[dev]: re-install ASE ${spec.label} plugin (origin: local)`);
|
|
189
|
-
await this.run(spec.cli, ["plugin", spec.pRemove, "ase@ase"], { ignoreError: `ASE ${spec.label} plugin not installed` });
|
|
190
|
-
await this.run(spec.cli, ["plugin", spec.pInstall, "ase@ase"], { retries: 3 });
|
|
193
|
+
await this.run(spec.cli, ["plugin", spec.pRemove, "ase@ase", ...scopeArgs], { ignoreError: `ASE ${spec.label} plugin not installed` });
|
|
194
|
+
await this.run(spec.cli, ["plugin", spec.pInstall, "ase@ase", ...scopeArgs], { retries: 3 });
|
|
191
195
|
}
|
|
192
196
|
else {
|
|
193
197
|
/* perform NPM version check */
|
|
@@ -204,49 +208,57 @@ export default class SetupCommand {
|
|
|
204
208
|
await this.run(updateCmd.cmd, updateCmd.args);
|
|
205
209
|
/* update ASE plugin (refresh the marketplace snapshot, then
|
|
206
210
|
update the plugin itself; the OpenAI Codex CLI has no
|
|
207
|
-
"plugin update" subcommand, so re-install it instead
|
|
211
|
+
"plugin update" subcommand, so re-install it instead;
|
|
212
|
+
"plugin marketplace update" has no "--scope" option at all,
|
|
213
|
+
so it never receives one) */
|
|
208
214
|
this.log.write("info", `setup: update: updating ASE ${spec.label} plugin`);
|
|
209
215
|
await this.run(spec.cli, ["plugin", "marketplace", spec.pUpdate, "ase"]);
|
|
210
216
|
if (tool !== "codex")
|
|
211
|
-
await this.run(spec.cli, ["plugin", "update", "ase@ase"]);
|
|
217
|
+
await this.run(spec.cli, ["plugin", "update", "ase@ase", ...scopeArgs]);
|
|
212
218
|
else {
|
|
213
|
-
await this.run(spec.cli, ["plugin", spec.pRemove, "ase@ase"], { ignoreError: `ASE ${spec.label} plugin not installed` });
|
|
214
|
-
await this.run(spec.cli, ["plugin", spec.pInstall, "ase@ase"], { retries: 3 });
|
|
219
|
+
await this.run(spec.cli, ["plugin", spec.pRemove, "ase@ase", ...scopeArgs], { ignoreError: `ASE ${spec.label} plugin not installed` });
|
|
220
|
+
await this.run(spec.cli, ["plugin", spec.pInstall, "ase@ase", ...scopeArgs], { retries: 3 });
|
|
215
221
|
}
|
|
216
222
|
}
|
|
217
223
|
return 0;
|
|
218
224
|
}
|
|
219
225
|
/* handler for "ase setup enable" (both tools) */
|
|
220
|
-
async doEnable(tool) {
|
|
226
|
+
async doEnable(tool, scope) {
|
|
227
|
+
this.requireClaudeScope(tool, scope);
|
|
221
228
|
const spec = toolSpecs[tool];
|
|
222
229
|
await this.ensureTool(spec.cli);
|
|
223
230
|
this.log.write("info", `setup: enable: enabling ASE ${spec.label} plugin`);
|
|
224
231
|
/* the GitHub Copilot CLI and OpenAI Codex CLI have no "plugin
|
|
225
232
|
enable" subcommand, so (re-)install the plugin instead */
|
|
233
|
+
const scopeArgs = scope !== "user" ? ["--scope", scope] : [];
|
|
226
234
|
const args = tool === "claude" ?
|
|
227
|
-
["plugin", "enable", "ase@ase"] :
|
|
235
|
+
["plugin", "enable", "ase@ase", ...scopeArgs] :
|
|
228
236
|
["plugin", spec.pInstall, "ase@ase"];
|
|
229
237
|
await this.run(spec.cli, args, { retries: tool === "claude" ? 1 : 3 });
|
|
230
238
|
return 0;
|
|
231
239
|
}
|
|
232
240
|
/* handler for "ase setup disable" (both tools) */
|
|
233
|
-
async doDisable(tool) {
|
|
241
|
+
async doDisable(tool, scope) {
|
|
242
|
+
this.requireClaudeScope(tool, scope);
|
|
234
243
|
const spec = toolSpecs[tool];
|
|
235
244
|
await this.ensureTool(spec.cli);
|
|
236
245
|
this.log.write("info", `setup: disable: disabling ASE ${spec.label} plugin`);
|
|
237
246
|
/* the GitHub Copilot CLI and OpenAI Codex CLI have no "plugin
|
|
238
247
|
disable" subcommand, so uninstall the plugin instead */
|
|
248
|
+
const scopeArgs = scope !== "user" ? ["--scope", scope] : [];
|
|
239
249
|
const args = tool === "claude" ?
|
|
240
|
-
["plugin", "disable", "ase@ase"] :
|
|
250
|
+
["plugin", "disable", "ase@ase", ...scopeArgs] :
|
|
241
251
|
["plugin", spec.pRemove, "ase@ase"];
|
|
242
252
|
await this.run(spec.cli, args, { retries: tool === "claude" ? 1 : 3 });
|
|
243
253
|
return 0;
|
|
244
254
|
}
|
|
245
255
|
/* handler for "ase setup uninstall" (both tools) */
|
|
246
|
-
async doUninstall(tool, dev) {
|
|
256
|
+
async doUninstall(tool, dev, scope) {
|
|
257
|
+
this.requireClaudeScope(tool, scope);
|
|
247
258
|
const spec = toolSpecs[tool];
|
|
248
259
|
await this.ensureTool("npm");
|
|
249
260
|
await this.ensureTool(spec.cli);
|
|
261
|
+
const scopeArgs = tool === "claude" && scope !== "user" ? ["--scope", scope] : [];
|
|
250
262
|
/* best-effort stop of background service */
|
|
251
263
|
this.log.write("info", `setup: uninstall${dev ? "[dev]" : ""}: ` +
|
|
252
264
|
"stopping potentially running ASE service");
|
|
@@ -254,8 +266,8 @@ export default class SetupCommand {
|
|
|
254
266
|
/* uninstall ASE plugin */
|
|
255
267
|
this.log.write("info", `setup: uninstall${dev ? "[dev]" : ""}: ` +
|
|
256
268
|
`uninstalling ASE ${spec.label} plugin (origin: ${dev ? "local" : "remote/bundled"})`);
|
|
257
|
-
await this.run(spec.cli, ["plugin", spec.pRemove, "ase@ase"], { ignoreError: `ASE ${spec.label} plugin not installed` });
|
|
258
|
-
await this.run(spec.cli, ["plugin", "marketplace", "remove", "ase"], { ignoreError: `ASE ${spec.label} plugin marketplace not registered` });
|
|
269
|
+
await this.run(spec.cli, ["plugin", spec.pRemove, "ase@ase", ...scopeArgs], { ignoreError: `ASE ${spec.label} plugin not installed` });
|
|
270
|
+
await this.run(spec.cli, ["plugin", "marketplace", "remove", "ase", ...scopeArgs], { ignoreError: `ASE ${spec.label} plugin marketplace not registered` });
|
|
259
271
|
/* uninstall ASE CLI tool (non-development only) */
|
|
260
272
|
if (!dev) {
|
|
261
273
|
this.log.write("info", "setup: uninstall: uninstalling ASE CLI tool (origin: remote)");
|
|
@@ -286,7 +298,8 @@ export default class SetupCommand {
|
|
|
286
298
|
return 0;
|
|
287
299
|
}
|
|
288
300
|
/* handler for "ase setup mcp activate|deactivate [<servers>]" */
|
|
289
|
-
async doMcp(action, tool, servers) {
|
|
301
|
+
async doMcp(action, tool, servers, scope) {
|
|
302
|
+
this.requireClaudeScope(tool, scope);
|
|
290
303
|
await this.ensureTool(toolSpecs[tool].cli);
|
|
291
304
|
/* source .env files into the environment so the per-server
|
|
292
305
|
API keys (ASE_MCP_KEY_<XXX>) can live in a .env file instead
|
|
@@ -336,7 +349,7 @@ export default class SetupCommand {
|
|
|
336
349
|
if (installed) {
|
|
337
350
|
this.log.write("info", `setup: mcp: activate: [${id}]: MCP server "${handle.server}" ` +
|
|
338
351
|
"already registered: removing stale registration first");
|
|
339
|
-
await this.mcpRemove(tool, handle.server);
|
|
352
|
+
await this.mcpRemove(tool, handle.server, scope);
|
|
340
353
|
}
|
|
341
354
|
}
|
|
342
355
|
else if (!installed) {
|
|
@@ -348,7 +361,7 @@ export default class SetupCommand {
|
|
|
348
361
|
/* call the handler */
|
|
349
362
|
this.log.write("info", `setup: mcp: ${action}: [${id}]: MCP server "${handle.server}" ` +
|
|
350
363
|
`(name: ${handle.name}${handle.version ? (", version: " + handle.version) : ""})`);
|
|
351
|
-
await handle.handler(handle, tool, action, envKey, envVal);
|
|
364
|
+
await handle.handler(handle, tool, scope, action, envKey, envVal);
|
|
352
365
|
}
|
|
353
366
|
return 0;
|
|
354
367
|
}
|
|
@@ -362,10 +375,11 @@ export default class SetupCommand {
|
|
|
362
375
|
(a local subprocess command) and "http" (a remote URL, optionally
|
|
363
376
|
with HTTP headers) transports; the per-tool command line differs
|
|
364
377
|
between Anthropic Claude Code CLI, GitHub Copilot CLI, and OpenAI Codex CLI */
|
|
365
|
-
async mcpAdd(tool, name, env, transport) {
|
|
378
|
+
async mcpAdd(tool, name, env, transport, scope) {
|
|
366
379
|
const args = ["mcp", "add"];
|
|
367
380
|
if (tool === "claude") {
|
|
368
|
-
|
|
381
|
+
if (scope !== "user")
|
|
382
|
+
args.push("--scope", scope);
|
|
369
383
|
args.push("--transport", transport.type);
|
|
370
384
|
if (transport.type === "stdio") {
|
|
371
385
|
for (const [key, val] of Object.entries(env))
|
|
@@ -417,17 +431,16 @@ export default class SetupCommand {
|
|
|
417
431
|
}
|
|
418
432
|
/* unregister an MCP server from the tool; the per-tool command line
|
|
419
433
|
differs between Anthropic Claude Code CLI, GitHub Copilot CLI, and OpenAI Codex CLI */
|
|
420
|
-
async mcpRemove(tool, name) {
|
|
421
|
-
const
|
|
422
|
-
|
|
423
|
-
["mcp", "remove", name];
|
|
434
|
+
async mcpRemove(tool, name, scope) {
|
|
435
|
+
const scopeArgs = tool === "claude" && scope !== "user" ? ["--scope", scope] : [];
|
|
436
|
+
const args = ["mcp", "remove", ...scopeArgs, name];
|
|
424
437
|
await this.run(toolSpecs[tool].cli, args, { ignoreError: `MCP server "${name}" not registered` });
|
|
425
438
|
}
|
|
426
439
|
/* build a chat-model MCP handler from the per-model direct and
|
|
427
440
|
OPENROUTER url/api/model triples, factoring out the shared
|
|
428
441
|
mcp-to-openai stdio scaffold common to all chat-model servers */
|
|
429
442
|
chatMcpHandler(direct, router) {
|
|
430
|
-
return async (spec, tool, action, envKey, envVal) => {
|
|
443
|
+
return async (spec, tool, scope, action, envKey, envVal) => {
|
|
431
444
|
if (action === "activate")
|
|
432
445
|
await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
|
|
433
446
|
type: "stdio", command: [
|
|
@@ -444,9 +457,9 @@ export default class SetupCommand {
|
|
|
444
457
|
"--openai-model", direct.model
|
|
445
458
|
])
|
|
446
459
|
]
|
|
447
|
-
});
|
|
460
|
+
}, scope);
|
|
448
461
|
else
|
|
449
|
-
await this.mcpRemove(tool, spec.server);
|
|
462
|
+
await this.mcpRemove(tool, spec.server, scope);
|
|
450
463
|
};
|
|
451
464
|
}
|
|
452
465
|
/* registry of pre-defined MCP servers: maps each server id onto its
|
|
@@ -513,14 +526,14 @@ export default class SetupCommand {
|
|
|
513
526
|
env: ["BRAVE"],
|
|
514
527
|
server: "search-brave",
|
|
515
528
|
skills: ["ase-meta-search", "ase-meta-evaluate", "ase-arch-discover"],
|
|
516
|
-
handler: async (spec, tool, action, _envKey, envVal) => {
|
|
529
|
+
handler: async (spec, tool, scope, action, _envKey, envVal) => {
|
|
517
530
|
if (action === "activate")
|
|
518
531
|
await this.mcpAdd(tool, spec.server, {
|
|
519
532
|
"BRAVE_API_KEY": envVal,
|
|
520
533
|
"BRAVE_MCP_ENABLED_TOOLS": "brave_web_search"
|
|
521
|
-
}, { type: "stdio", command: ["npx", "-y", "@brave/brave-search-mcp-server"] });
|
|
534
|
+
}, { type: "stdio", command: ["npx", "-y", "@brave/brave-search-mcp-server"] }, scope);
|
|
522
535
|
else
|
|
523
|
-
await this.mcpRemove(tool, spec.server);
|
|
536
|
+
await this.mcpRemove(tool, spec.server, scope);
|
|
524
537
|
}
|
|
525
538
|
},
|
|
526
539
|
{
|
|
@@ -530,13 +543,13 @@ export default class SetupCommand {
|
|
|
530
543
|
env: ["PERPLEXITY"],
|
|
531
544
|
server: "search-perplexity",
|
|
532
545
|
skills: ["ase-meta-search", "ase-meta-evaluate", "ase-arch-discover"],
|
|
533
|
-
handler: async (spec, tool, action, _envKey, envVal) => {
|
|
546
|
+
handler: async (spec, tool, scope, action, _envKey, envVal) => {
|
|
534
547
|
if (action === "activate")
|
|
535
548
|
await this.mcpAdd(tool, spec.server, {
|
|
536
549
|
"PERPLEXITY_API_KEY": envVal
|
|
537
|
-
}, { type: "stdio", command: ["npx", "-y", "@perplexity-ai/mcp-server"] });
|
|
550
|
+
}, { type: "stdio", command: ["npx", "-y", "@perplexity-ai/mcp-server"] }, scope);
|
|
538
551
|
else
|
|
539
|
-
await this.mcpRemove(tool, spec.server);
|
|
552
|
+
await this.mcpRemove(tool, spec.server, scope);
|
|
540
553
|
}
|
|
541
554
|
},
|
|
542
555
|
{
|
|
@@ -546,11 +559,11 @@ export default class SetupCommand {
|
|
|
546
559
|
env: ["EXA"],
|
|
547
560
|
server: "search-exa",
|
|
548
561
|
skills: ["ase-meta-search", "ase-meta-evaluate", "ase-arch-discover"],
|
|
549
|
-
handler: async (spec, tool, action, _envKey, envVal) => {
|
|
562
|
+
handler: async (spec, tool, scope, action, _envKey, envVal) => {
|
|
550
563
|
if (action === "activate")
|
|
551
|
-
await this.mcpAdd(tool, spec.server, {}, { type: "http", url: `https://mcp.exa.ai/mcp?exaApiKey=${envVal}` });
|
|
564
|
+
await this.mcpAdd(tool, spec.server, {}, { type: "http", url: `https://mcp.exa.ai/mcp?exaApiKey=${envVal}` }, scope);
|
|
552
565
|
else
|
|
553
|
-
await this.mcpRemove(tool, spec.server);
|
|
566
|
+
await this.mcpRemove(tool, spec.server, scope);
|
|
554
567
|
}
|
|
555
568
|
}
|
|
556
569
|
];
|
|
@@ -560,6 +573,18 @@ export default class SetupCommand {
|
|
|
560
573
|
throw new Error(`invalid --tool value: "${value}" (expected "claude", "copilot", or "codex")`);
|
|
561
574
|
return value;
|
|
562
575
|
}
|
|
576
|
+
/* parse and validate the --scope option */
|
|
577
|
+
parseScope(value) {
|
|
578
|
+
if (value !== "user" && value !== "project" && value !== "local")
|
|
579
|
+
throw new Error(`invalid --scope value: "${value}" (expected "user", "project", or "local")`);
|
|
580
|
+
return value;
|
|
581
|
+
}
|
|
582
|
+
/* reject a non-default --scope for tools which have no scope concept
|
|
583
|
+
at all (only Anthropic Claude Code CLI supports plugin/MCP scopes) */
|
|
584
|
+
requireClaudeScope(tool, scope) {
|
|
585
|
+
if (tool !== "claude" && scope !== "user")
|
|
586
|
+
throw new Error("--scope is only supported for --tool claude");
|
|
587
|
+
}
|
|
563
588
|
/* register commands */
|
|
564
589
|
register(program) {
|
|
565
590
|
/* default for --dev derived from ASE_SETUP_DEV environment variable */
|
|
@@ -581,44 +606,49 @@ export default class SetupCommand {
|
|
|
581
606
|
.command("install")
|
|
582
607
|
.description("install the ASE plugin for a tool")
|
|
583
608
|
.option("-t, --tool <tool>", "target tool (\"claude\", \"copilot\", or \"codex\")", toolDflt)
|
|
609
|
+
.option("-s, --scope <scope>", "target scope (\"user\", \"project\", or \"local\")", "user")
|
|
584
610
|
.option("-d, --dev", "use local working copy instead of remote/bundled repository", devDflt)
|
|
585
611
|
.action(async (opts) => {
|
|
586
|
-
process.exit(await this.doInstall(this.parseTool(opts.tool), opts.dev));
|
|
612
|
+
process.exit(await this.doInstall(this.parseTool(opts.tool), opts.dev, this.parseScope(opts.scope)));
|
|
587
613
|
});
|
|
588
614
|
/* register CLI sub-command "ase setup update" */
|
|
589
615
|
setupCmd
|
|
590
616
|
.command("update")
|
|
591
617
|
.description("update the ASE tool and the ASE plugin for a tool")
|
|
592
618
|
.option("-t, --tool <tool>", "target tool (\"claude\", \"copilot\", or \"codex\")", toolDflt)
|
|
619
|
+
.option("-s, --scope <scope>", "target scope (\"user\", \"project\", or \"local\")", "user")
|
|
593
620
|
.option("-f, --force", "always perform the update, even if already at latest version", false)
|
|
594
621
|
.option("-d, --dev", "use local working copy instead of remote/bundled repository", devDflt)
|
|
595
622
|
.action(async (opts) => {
|
|
596
|
-
process.exit(await this.doUpdate(this.parseTool(opts.tool), opts.force, opts.dev));
|
|
623
|
+
process.exit(await this.doUpdate(this.parseTool(opts.tool), opts.force, opts.dev, this.parseScope(opts.scope)));
|
|
597
624
|
});
|
|
598
625
|
/* register CLI sub-command "ase setup uninstall" */
|
|
599
626
|
setupCmd
|
|
600
627
|
.command("uninstall")
|
|
601
628
|
.description("uninstall the ASE plugin for a tool and the ASE tool")
|
|
602
629
|
.option("-t, --tool <tool>", "target tool (\"claude\", \"copilot\", or \"codex\")", toolDflt)
|
|
630
|
+
.option("-s, --scope <scope>", "target scope (\"user\", \"project\", or \"local\")", "user")
|
|
603
631
|
.option("-d, --dev", "use local working copy instead of remote/bundled repository", devDflt)
|
|
604
632
|
.action(async (opts) => {
|
|
605
|
-
process.exit(await this.doUninstall(this.parseTool(opts.tool), opts.dev));
|
|
633
|
+
process.exit(await this.doUninstall(this.parseTool(opts.tool), opts.dev, this.parseScope(opts.scope)));
|
|
606
634
|
});
|
|
607
635
|
/* register CLI sub-command "ase setup enable" */
|
|
608
636
|
setupCmd
|
|
609
637
|
.command("enable")
|
|
610
638
|
.description("enable the ASE plugin for a tool")
|
|
611
639
|
.option("-t, --tool <tool>", "target tool (\"claude\", \"copilot\", or \"codex\")", toolDflt)
|
|
640
|
+
.option("-s, --scope <scope>", "target scope (\"user\", \"project\", or \"local\")", "user")
|
|
612
641
|
.action(async (opts) => {
|
|
613
|
-
process.exit(await this.doEnable(this.parseTool(opts.tool)));
|
|
642
|
+
process.exit(await this.doEnable(this.parseTool(opts.tool), this.parseScope(opts.scope)));
|
|
614
643
|
});
|
|
615
644
|
/* register CLI sub-command "ase setup disable" */
|
|
616
645
|
setupCmd
|
|
617
646
|
.command("disable")
|
|
618
647
|
.description("disable the ASE plugin for a tool")
|
|
619
648
|
.option("-t, --tool <tool>", "target tool (\"claude\", \"copilot\", or \"codex\")", toolDflt)
|
|
649
|
+
.option("-s, --scope <scope>", "target scope (\"user\", \"project\", or \"local\")", "user")
|
|
620
650
|
.action(async (opts) => {
|
|
621
|
-
process.exit(await this.doDisable(this.parseTool(opts.tool)));
|
|
651
|
+
process.exit(await this.doDisable(this.parseTool(opts.tool), this.parseScope(opts.scope)));
|
|
622
652
|
});
|
|
623
653
|
/* register CLI sub-command "ase setup mcp" */
|
|
624
654
|
const mcpCmd = setupCmd
|
|
@@ -640,16 +670,18 @@ export default class SetupCommand {
|
|
|
640
670
|
.command("activate [servers]")
|
|
641
671
|
.description("activate pre-defined MCP servers (comma-separated list, or \"all\")")
|
|
642
672
|
.option("-t, --tool <tool>", "target tool (\"claude\", \"copilot\", or \"codex\")", toolDflt)
|
|
673
|
+
.option("-s, --scope <scope>", "target scope (\"user\", \"project\", or \"local\")", "user")
|
|
643
674
|
.action(async (servers, opts) => {
|
|
644
|
-
process.exit(await this.doMcp("activate", this.parseTool(opts.tool), servers ?? "all"));
|
|
675
|
+
process.exit(await this.doMcp("activate", this.parseTool(opts.tool), servers ?? "all", this.parseScope(opts.scope)));
|
|
645
676
|
});
|
|
646
677
|
/* register CLI sub-command "ase setup mcp deactivate" */
|
|
647
678
|
mcpCmd
|
|
648
679
|
.command("deactivate [servers]")
|
|
649
680
|
.description("deactivate pre-defined MCP servers (comma-separated list, or \"all\")")
|
|
650
681
|
.option("-t, --tool <tool>", "target tool (\"claude\", \"copilot\", or \"codex\")", toolDflt)
|
|
682
|
+
.option("-s, --scope <scope>", "target scope (\"user\", \"project\", or \"local\")", "user")
|
|
651
683
|
.action(async (servers, opts) => {
|
|
652
|
-
process.exit(await this.doMcp("deactivate", this.parseTool(opts.tool), servers ?? "all"));
|
|
684
|
+
process.exit(await this.doMcp("deactivate", this.parseTool(opts.tool), servers ?? "all", this.parseScope(opts.scope)));
|
|
653
685
|
});
|
|
654
686
|
}
|
|
655
687
|
}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"homepage": "http://github.com/rse/ase",
|
|
7
7
|
"repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
|
|
8
8
|
"bugs": { "url": "http://github.com/rse/ase/issues" },
|
|
9
|
-
"version": "0.9.
|
|
9
|
+
"version": "0.9.35",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "Dr. Ralf S. Engelschall",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"eslint": "9.39.4",
|
|
20
20
|
"@eslint/js": "9.39.4",
|
|
21
|
-
"@typescript-eslint/parser": "8.62.
|
|
22
|
-
"@typescript-eslint/eslint-plugin": "8.62.
|
|
21
|
+
"@typescript-eslint/parser": "8.62.1",
|
|
22
|
+
"@typescript-eslint/eslint-plugin": "8.62.1",
|
|
23
23
|
"eslint-plugin-promise": "7.3.0",
|
|
24
24
|
"eslint-plugin-import": "2.32.0",
|
|
25
25
|
"neostandard": "0.13.0",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"nodemon": "3.1.14",
|
|
31
31
|
"shx": "0.4.0",
|
|
32
32
|
|
|
33
|
-
"@types/node": "26.0
|
|
33
|
+
"@types/node": "26.1.0",
|
|
34
34
|
"@types/luxon": "3.7.2",
|
|
35
35
|
"@types/which": "3.0.4",
|
|
36
36
|
"@types/update-notifier": "6.0.8",
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"commander": "15.0.0",
|
|
45
|
-
"@dotenvx/dotenvx": "1.
|
|
45
|
+
"@dotenvx/dotenvx": "2.1.4",
|
|
46
46
|
"yaml": "2.9.0",
|
|
47
|
-
"valibot": "1.4.
|
|
47
|
+
"valibot": "1.4.2",
|
|
48
48
|
"execa": "9.6.1",
|
|
49
49
|
"mkdirp": "3.0.1",
|
|
50
50
|
"@hapi/hapi": "21.4.9",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"write-file-atomic": "8.0.0",
|
|
64
64
|
"pacote": "22.0.0",
|
|
65
65
|
"ofetch": "1.5.1",
|
|
66
|
-
"picomatch": "4.0.
|
|
66
|
+
"picomatch": "4.0.5"
|
|
67
67
|
},
|
|
68
68
|
"engines": {
|
|
69
69
|
"npm": ">=10.0.0",
|