@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 +8 -18
- package/dst/ase-diagram.js +1 -1
- package/dst/ase-hook.js +4 -3
- package/dst/ase-setup.js +66 -109
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/package.json +1 -1
- package/plugin/skills/ase-code-craft/SKILL.md +1 -1
- package/plugin/skills/ase-code-resolve/SKILL.md +1 -1
- package/plugin/skills/ase-meta-changes/SKILL.md +2 -2
- package/plugin/skills/ase-meta-quorum/SKILL.md +8 -0
- package/plugin/skills/ase-task-delete/SKILL.md +1 -1
- package/plugin/skills/ase-task-view/SKILL.md +1 -1
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
|
|
395
|
-
if (
|
|
396
|
-
return
|
|
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
|
|
433
|
-
if (
|
|
434
|
-
result.push({ key: k, value:
|
|
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
|
|
560
|
-
table.push([e.key, String(
|
|
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
|
});
|
package/dst/ase-diagram.js
CHANGED
|
@@ -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 (
|
|
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
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
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
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
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
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
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
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
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
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
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
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
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.
|
|
9
|
+
"version": "0.0.55",
|
|
10
10
|
"license": "GPL-3.0-only",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "Dr. Ralf S. Engelschall",
|
package/plugin/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.
|
|
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_-]
|
|
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_-]
|
|
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
|
|
90
|
-
*index*, but *ignore* the Git *stash* and
|
|
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
|
○ **xAI Grok**:
|
|
151
151
|
- [...]
|
|
152
152
|
- [...]
|
|
153
|
+
|
|
154
|
+
○ **Z.AI GLM**:
|
|
155
|
+
- [...]
|
|
156
|
+
- [...]
|
|
157
|
+
|
|
158
|
+
○ **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/>:
|