@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.
@@ -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
- await this.run(spec.cli, ["plugin", "marketplace", "add", source]);
166
- await this.run(spec.cli, ["plugin", spec.pInstall, "ase@ase"], { retries: 3 });
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
- args.push("--scope", "user");
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 args = tool === "claude" ?
422
- ["mcp", "remove", "--scope", "user", name] :
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.33",
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.0",
22
- "@typescript-eslint/eslint-plugin": "8.62.0",
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.1",
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.75.1",
45
+ "@dotenvx/dotenvx": "2.1.4",
46
46
  "yaml": "2.9.0",
47
- "valibot": "1.4.1",
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.4"
66
+ "picomatch": "4.0.5"
67
67
  },
68
68
  "engines": {
69
69
  "npm": ">=10.0.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.33",
3
+ "version": "0.9.35",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.33",
3
+ "version": "0.9.35",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.33",
3
+ "version": "0.9.35",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",