@rse/ase 0.0.54 → 0.0.55

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-config.js CHANGED
@@ -391,19 +391,9 @@ export class Config {
391
391
  return this.docs[this.target].doc.contents;
392
392
  const segs = this.resolveKey(key).split(".");
393
393
  for (let i = this.docs.length - 1; i >= 0; i--) {
394
- const v = this.docs[i].doc.getIn(segs);
395
- if (v !== undefined)
396
- return v;
397
- }
398
- return undefined;
399
- }
400
- /* retrieve the effective value together with the scope it came from */
401
- getWithOrigin(key) {
402
- const segs = this.resolveKey(key).split(".");
403
- for (let i = this.docs.length - 1; i >= 0; i--) {
404
- const v = this.docs[i].doc.getIn(segs);
405
- if (v !== undefined)
406
- return { value: v, scope: this.docs[i].scope };
394
+ const node = this.docs[i].doc.getIn(segs);
395
+ if (node !== undefined)
396
+ return node;
407
397
  }
408
398
  return undefined;
409
399
  }
@@ -429,9 +419,9 @@ export class Config {
429
419
  for (const k of keys) {
430
420
  const segs = k.split(".");
431
421
  for (let i = this.docs.length - 1; i >= 0; i--) {
432
- const v = this.docs[i].doc.getIn(segs);
433
- if (v !== undefined) {
434
- result.push({ key: k, value: v, scope: this.docs[i].scope });
422
+ const node = this.docs[i].doc.getIn(segs);
423
+ if (node !== undefined) {
424
+ result.push({ key: k, value: node, scope: this.docs[i].scope });
435
425
  break;
436
426
  }
437
427
  }
@@ -556,8 +546,8 @@ export default class ConfigCommand {
556
546
  style: { head: ["blue"] }
557
547
  });
558
548
  for (const e of cfg.entries()) {
559
- const v = isScalar(e.value) ? e.value.value : e.value;
560
- table.push([e.key, String(v), Config.scopeLabel(e.scope)]);
549
+ const val = isScalar(e.value) ? e.value.value : e.value;
550
+ table.push([e.key, String(val), Config.scopeLabel(e.scope)]);
561
551
  }
562
552
  process.stdout.write(`${table.toString()}\n`);
563
553
  });
@@ -126,7 +126,7 @@ export class Diagram {
126
126
  let mode = "none";
127
127
  /* attempt 1: query environment variable (explicitly) */
128
128
  if (process.env.ASE_TERM_COLORS !== undefined)
129
- if (process.env.ASE_TERM_COLORS.match(/^(?:none|ansi16|ansi256)$/) !== null)
129
+ if (/^(?:none|ansi16|ansi256)$/.test(process.env.ASE_TERM_COLORS))
130
130
  mode = process.env.ASE_TERM_COLORS;
131
131
  /* attempt 2: query stdout */
132
132
  if (mode === "none" && process.stdout.isTTY) {
package/dst/ase-hook.js CHANGED
@@ -140,9 +140,6 @@ export default class HookCommand {
140
140
  /* establish config context (session-scoped only if a valid sessionId is present) */
141
141
  const hasSession = this.isValidSessionId(sessionId);
142
142
  const cfg = new Config("config", configSchema, this.log, hasSession ? parseScope(`session:${sessionId}`) : parseScope(undefined));
143
- cfg.lock(() => {
144
- cfg.read();
145
- });
146
143
  /* determine task id (only persist when scoped to a real session) */
147
144
  const taskId = process.env.ASE_TASK_ID ?? "default";
148
145
  if (hasSession)
@@ -151,6 +148,10 @@ export default class HookCommand {
151
148
  cfg.set("agent.task", taskId);
152
149
  cfg.write();
153
150
  });
151
+ else
152
+ cfg.lock(() => {
153
+ cfg.read();
154
+ });
154
155
  /* initialize agent activity status */
155
156
  this.writeAgentStatus("ready");
156
157
  /* determine project id */
package/dst/ase-setup.js CHANGED
@@ -397,30 +397,23 @@ export default class SetupCommand {
397
397
  server: "chat-openai-chatgpt",
398
398
  skills: ["ase-meta-chat", "ase-meta-quorum"],
399
399
  handler: async (spec, tool, action, envKey, envVal) => {
400
- if (action === "activate") {
401
- if (envKey === "OPENROUTER")
402
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
403
- type: "stdio", command: [
404
- "npx", "-y", "mcp-to-openai",
405
- "--service", spec.name,
406
- "--mcp-tool", "query",
400
+ if (action === "activate")
401
+ await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
402
+ type: "stdio", command: [
403
+ "npx", "-y", "mcp-to-openai",
404
+ "--service", spec.name,
405
+ "--mcp-tool", "query",
406
+ ...(envKey === "OPENROUTER" ? [
407
407
  "--openai-url", "https://openrouter.ai/api/v1",
408
408
  "--openai-api", "completion",
409
409
  "--openai-model", "openai/gpt-5.5"
410
- ]
411
- });
412
- else
413
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
414
- type: "stdio", command: [
415
- "npx", "-y", "mcp-to-openai",
416
- "--service", spec.name,
417
- "--mcp-tool", "query",
410
+ ] : [
418
411
  "--openai-url", "https://api.openai.com/v1",
419
412
  "--openai-api", "responses",
420
413
  "--openai-model", "gpt-5.5"
421
- ]
422
- });
423
- }
414
+ ])
415
+ ]
416
+ });
424
417
  else
425
418
  await this.mcpRemove(tool, spec.server);
426
419
  }
@@ -433,30 +426,23 @@ export default class SetupCommand {
433
426
  server: "chat-google-gemini",
434
427
  skills: ["ase-meta-chat", "ase-meta-quorum"],
435
428
  handler: async (spec, tool, action, envKey, envVal) => {
436
- if (action === "activate") {
437
- if (envKey === "OPENROUTER")
438
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
439
- type: "stdio", command: [
440
- "npx", "-y", "mcp-to-openai",
441
- "--service", spec.name,
442
- "--mcp-tool", "query",
429
+ if (action === "activate")
430
+ await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
431
+ type: "stdio", command: [
432
+ "npx", "-y", "mcp-to-openai",
433
+ "--service", spec.name,
434
+ "--mcp-tool", "query",
435
+ ...(envKey === "OPENROUTER" ? [
443
436
  "--openai-url", "https://openrouter.ai/api/v1",
444
437
  "--openai-api", "completion",
445
438
  "--openai-model", "google/gemini-3.5-flash"
446
- ]
447
- });
448
- else
449
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
450
- type: "stdio", command: [
451
- "npx", "-y", "mcp-to-openai",
452
- "--service", spec.name,
453
- "--mcp-tool", "query",
439
+ ] : [
454
440
  "--openai-url", "https://generativelanguage.googleapis.com/v1beta/openai/",
455
441
  "--openai-api", "completion",
456
442
  "--openai-model", "gemini-3.5-flash"
457
- ]
458
- });
459
- }
443
+ ])
444
+ ]
445
+ });
460
446
  else
461
447
  await this.mcpRemove(tool, spec.server);
462
448
  }
@@ -469,31 +455,23 @@ export default class SetupCommand {
469
455
  server: "chat-deepseek",
470
456
  skills: ["ase-meta-chat", "ase-meta-quorum"],
471
457
  handler: async (spec, tool, action, envKey, envVal) => {
472
- if (action === "activate") {
473
- if (envKey === "OPENROUTER")
474
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
475
- type: "stdio",
476
- command: [
477
- "npx", "-y", "mcp-to-openai",
478
- "--service", spec.name,
479
- "--mcp-tool", "query",
458
+ if (action === "activate")
459
+ await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
460
+ type: "stdio", command: [
461
+ "npx", "-y", "mcp-to-openai",
462
+ "--service", spec.name,
463
+ "--mcp-tool", "query",
464
+ ...(envKey === "OPENROUTER" ? [
480
465
  "--openai-url", "https://openrouter.ai/api/v1",
481
466
  "--openai-api", "completion",
482
467
  "--openai-model", "deepseek/deepseek-v4-flash"
483
- ]
484
- });
485
- else
486
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
487
- type: "stdio", command: [
488
- "npx", "-y", "mcp-to-openai",
489
- "--service", spec.name,
490
- "--mcp-tool", "query",
468
+ ] : [
491
469
  "--openai-url", "https://api.deepseek.com/v1",
492
470
  "--openai-api", "completion",
493
471
  "--openai-model", "deepseek-v4-flash"
494
- ]
495
- });
496
- }
472
+ ])
473
+ ]
474
+ });
497
475
  else
498
476
  await this.mcpRemove(tool, spec.server);
499
477
  }
@@ -506,30 +484,23 @@ export default class SetupCommand {
506
484
  server: "chat-xai-grok",
507
485
  skills: ["ase-meta-chat", "ase-meta-quorum"],
508
486
  handler: async (spec, tool, action, envKey, envVal) => {
509
- if (action === "activate") {
510
- if (envKey === "OPENROUTER")
511
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
512
- type: "stdio", command: [
513
- "npx", "-y", "mcp-to-openai",
514
- "--service", spec.name,
515
- "--mcp-tool", "query",
487
+ if (action === "activate")
488
+ await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
489
+ type: "stdio", command: [
490
+ "npx", "-y", "mcp-to-openai",
491
+ "--service", spec.name,
492
+ "--mcp-tool", "query",
493
+ ...(envKey === "OPENROUTER" ? [
516
494
  "--openai-url", "https://openrouter.ai/api/v1",
517
495
  "--openai-api", "completion",
518
496
  "--openai-model", "x-ai/grok-4.3"
519
- ]
520
- });
521
- else
522
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
523
- type: "stdio", command: [
524
- "npx", "-y", "mcp-to-openai",
525
- "--service", spec.name,
526
- "--mcp-tool", "query",
497
+ ] : [
527
498
  "--openai-url", "https://api.x.ai/v1",
528
499
  "--openai-api", "completion",
529
500
  "--openai-model", "grok-4.3"
530
- ]
531
- });
532
- }
501
+ ])
502
+ ]
503
+ });
533
504
  else
534
505
  await this.mcpRemove(tool, spec.server);
535
506
  }
@@ -542,30 +513,23 @@ export default class SetupCommand {
542
513
  server: "chat-alibaba-qwen",
543
514
  skills: ["ase-meta-chat", "ase-meta-quorum"],
544
515
  handler: async (spec, tool, action, envKey, envVal) => {
545
- if (action === "activate") {
546
- if (envKey === "OPENROUTER")
547
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
548
- type: "stdio", command: [
549
- "npx", "-y", "mcp-to-openai",
550
- "--service", spec.name,
551
- "--mcp-tool", "query",
516
+ if (action === "activate")
517
+ await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
518
+ type: "stdio", command: [
519
+ "npx", "-y", "mcp-to-openai",
520
+ "--service", spec.name,
521
+ "--mcp-tool", "query",
522
+ ...(envKey === "OPENROUTER" ? [
552
523
  "--openai-url", "https://openrouter.ai/api/v1",
553
524
  "--openai-api", "completion",
554
525
  "--openai-model", "qwen/qwen3.7-max"
555
- ]
556
- });
557
- else
558
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
559
- type: "stdio", command: [
560
- "npx", "-y", "mcp-to-openai",
561
- "--service", spec.name,
562
- "--mcp-tool", "query",
526
+ ] : [
563
527
  "--openai-url", "https://dashscope.aliyuncs.com/compatible-mode/v1",
564
528
  "--openai-api", "completion",
565
529
  "--openai-model", "qwen3.7-max"
566
- ]
567
- });
568
- }
530
+ ])
531
+ ]
532
+ });
569
533
  else
570
534
  await this.mcpRemove(tool, spec.server);
571
535
  }
@@ -578,30 +542,23 @@ export default class SetupCommand {
578
542
  server: "chat-zai-glm",
579
543
  skills: ["ase-meta-chat", "ase-meta-quorum"],
580
544
  handler: async (spec, tool, action, envKey, envVal) => {
581
- if (action === "activate") {
582
- if (envKey === "OPENROUTER")
583
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
584
- type: "stdio", command: [
585
- "npx", "-y", "mcp-to-openai",
586
- "--service", spec.name,
587
- "--mcp-tool", "query",
545
+ if (action === "activate")
546
+ await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
547
+ type: "stdio", command: [
548
+ "npx", "-y", "mcp-to-openai",
549
+ "--service", spec.name,
550
+ "--mcp-tool", "query",
551
+ ...(envKey === "OPENROUTER" ? [
588
552
  "--openai-url", "https://openrouter.ai/api/v1",
589
553
  "--openai-api", "completion",
590
554
  "--openai-model", "z-ai/glm-5.1"
591
- ]
592
- });
593
- else
594
- await this.mcpAdd(tool, spec.server, { OPENAI_KEY: envVal }, {
595
- type: "stdio", command: [
596
- "npx", "-y", "mcp-to-openai",
597
- "--service", spec.name,
598
- "--mcp-tool", "query",
555
+ ] : [
599
556
  "--openai-url", "https://api.z.ai/api/paas/v4/",
600
557
  "--openai-api", "completion",
601
558
  "--openai-model", "glm-5.1"
602
- ]
603
- });
604
- }
559
+ ])
560
+ ]
561
+ });
605
562
  else
606
563
  await this.mcpRemove(tool, spec.server);
607
564
  }
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.0.54",
9
+ "version": "0.0.55",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.0.54",
3
+ "version": "0.0.55",
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.0.54",
3
+ "version": "0.0.55",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -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.0.54",
9
+ "version": "0.0.55",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -71,7 +71,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
71
71
  </if>
72
72
 
73
73
  2. If <feature/> has the format `<id/>: <text/>` where <id/> matches
74
- the regexp `^[a-zA-Z][a-zA-Z0-9_-]+$`, then set
74
+ the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`, then set
75
75
  <feature><text/></feature> and <ase-task-id><id/></ase-task-id>
76
76
  and call the `ase_task_id(id: <ase-task-id/>, session:
77
77
  <ase-session-id/>)` tool from the `ase` MCP server to
@@ -83,7 +83,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
83
83
  </if>
84
84
 
85
85
  3. If <problem/> has the format `<id/>: <text/>` where <id/> matches
86
- the regexp `^[a-zA-Z][a-zA-Z0-9_-]+$`, then set
86
+ the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`, then set
87
87
  <problem><text/></problem> and <ase-task-id><id/></ase-task-id>
88
88
  and call the `ase_task_id(id: <ase-task-id/>, session:
89
89
  <ase-session-id/>)` tool from the `ase` MCP server to
@@ -86,8 +86,8 @@ Processing
86
86
  </template>
87
87
 
88
88
  To update to entries of the most recent *ChangeLog* section, consult
89
- the Git *commits* plus the currenly already staged changes in the Git
90
- *index*, but *ignore* the Git *stash* and and still unstaged changes.
89
+ the Git *commits* plus the currently already staged changes in the Git
90
+ *index*, but *ignore* the Git *stash* and still unstaged changes.
91
91
 
92
92
  For finding the corresponding Git *commits*, use the `N.M.K` from the
93
93
  *second* level-2 header in the *ChangeLog* file as the corresponding
@@ -150,6 +150,14 @@ by querying *multiple* AIs for an *optimal consensus*.
150
150
  &#x25CB; **xAI Grok**:
151
151
  - [...]
152
152
  - [...]
153
+
154
+ &#x25CB; **Z.AI GLM**:
155
+ - [...]
156
+ - [...]
157
+
158
+ &#x25CB; **Alibaba Qwen**:
159
+ - [...]
160
+ - [...]
153
161
  </template>
154
162
 
155
163
  In this output, remove the sections of those AIs which were not available.
@@ -59,7 +59,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
59
59
  ⧉ **ASE**: ◉ task: **<id/>**, ▶ status: **<text/>**
60
60
  </template>
61
61
 
62
- - If <text/> starts NOT with `ERROR:`:
62
+ - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
63
63
  Only output the following <template/>:
64
64
 
65
65
  <template>
@@ -60,7 +60,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
60
60
  ⧉ **ASE**: ◉ task: **<id/>**, ▶ status: **<text/>**
61
61
  </template>
62
62
 
63
- - If <text/> starts NOT with `ERROR:`:
63
+ - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
64
64
  Set <content><text/></content> (set content to text).
65
65
  Calculate the number of words <words/> of <content/>.
66
66
  Only output the following <template/>: