@rse/ase 0.0.53 → 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.
Files changed (39) hide show
  1. package/dst/ase-config.js +8 -18
  2. package/dst/ase-diagram.js +1 -1
  3. package/dst/ase-hook.js +4 -3
  4. package/dst/ase-service.js +4 -4
  5. package/dst/ase-setup.js +67 -110
  6. package/dst/ase-statusline.js +1 -1
  7. package/dst/ase-task.js +4 -3
  8. package/package.json +1 -1
  9. package/plugin/.claude-plugin/plugin.json +1 -1
  10. package/plugin/.github/plugin/plugin.json +1 -1
  11. package/plugin/package.json +1 -1
  12. package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
  13. package/plugin/skills/ase-arch-discover/SKILL.md +2 -0
  14. package/plugin/skills/ase-code-analyze/SKILL.md +1 -1
  15. package/plugin/skills/ase-code-craft/SKILL.md +1 -1
  16. package/plugin/skills/ase-code-explain/SKILL.md +2 -0
  17. package/plugin/skills/ase-code-insight/SKILL.md +3 -1
  18. package/plugin/skills/ase-code-lint/SKILL.md +1 -1
  19. package/plugin/skills/ase-code-resolve/SKILL.md +1 -1
  20. package/plugin/skills/ase-docs-proofread/SKILL.md +1 -1
  21. package/plugin/skills/ase-meta-changes/SKILL.md +133 -62
  22. package/plugin/skills/ase-meta-commit/SKILL.md +19 -10
  23. package/plugin/skills/ase-meta-persona/SKILL.md +1 -0
  24. package/plugin/skills/ase-meta-quorum/SKILL.md +9 -1
  25. package/plugin/skills/ase-meta-search/SKILL.md +1 -1
  26. package/plugin/skills/ase-meta-why/SKILL.md +2 -0
  27. package/plugin/skills/ase-task-delete/SKILL.md +3 -1
  28. package/plugin/skills/ase-task-edit/SKILL.md +2 -0
  29. package/plugin/skills/ase-task-implement/SKILL.md +2 -0
  30. package/plugin/skills/ase-task-preflight/SKILL.md +2 -0
  31. package/plugin/skills/ase-task-reboot/SKILL.md +3 -1
  32. package/plugin/skills/ase-task-rename/SKILL.md +3 -0
  33. package/plugin/skills/ase-task-view/SKILL.md +3 -1
  34. package/plugin/commands/ase-code-lint/complete.md +0 -9
  35. package/plugin/commands/ase-code-lint/explain.md +0 -9
  36. package/plugin/commands/ase-code-lint/nope.md +0 -11
  37. package/plugin/commands/ase-code-lint/reassess.md +0 -15
  38. package/plugin/commands/ase-code-lint/recheck.md +0 -9
  39. package/plugin/commands/ase-code-lint/refine.md +0 -9
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 */
@@ -140,10 +140,10 @@ export class Service {
140
140
  const n = Math.min(CHUNK, pos);
141
141
  pos -= n;
142
142
  fs.readSync(fd, buf, 0, n, pos);
143
- tail = buf.toString("utf8", 0, n) + tail;
144
- count = 0;
145
- for (let i = 0; i < tail.length; i++)
146
- if (tail.charCodeAt(i) === 10)
143
+ const chunk = buf.toString("utf8", 0, n);
144
+ tail = chunk + tail;
145
+ for (let i = 0; i < chunk.length; i++)
146
+ if (chunk.charCodeAt(i) === 10)
147
147
  count++;
148
148
  }
149
149
  const all = tail.split("\n").filter((l) => l.length > 0);
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
  }
@@ -667,7 +624,7 @@ export default class SetupCommand {
667
624
  const devDflt = envDev !== "" && envDev !== "0" && envDev.toLowerCase() !== "false";
668
625
  /* default for --tool derived from ASE_TOOL environment variable */
669
626
  const envTool = process.env.ASE_TOOL ?? "";
670
- const toolDflt = envTool !== "" ? envTool : "claude";
627
+ const toolDflt = envTool !== "" ? this.parseTool(envTool) : "claude";
671
628
  /* register CLI top-level command "ase setup" */
672
629
  const setupCmd = program
673
630
  .command("setup")
@@ -182,7 +182,7 @@ export default class StatuslineCommand {
182
182
  register(program) {
183
183
  /* default for --tool derived from ASE_TOOL environment variable */
184
184
  const envTool = process.env.ASE_TOOL ?? "";
185
- const toolDflt = envTool !== "" ? envTool : "claude";
185
+ const toolDflt = envTool !== "" ? this.parseTool(envTool) : "claude";
186
186
  program
187
187
  .command("statusline")
188
188
  .description("Render Claude Code or GitHub Copilot CLI statusline from stdin JSON")
package/dst/ase-task.js CHANGED
@@ -384,6 +384,7 @@ export class TaskMCP {
384
384
  };
385
385
  }
386
386
  });
387
+ /* task delete */
387
388
  mcp.registerTool("ase_task_delete", {
388
389
  title: "ASE task delete",
389
390
  description: "Delete a previously persisted task by `id`. " +
@@ -396,8 +397,8 @@ export class TaskMCP {
396
397
  try {
397
398
  const removed = Task.delete(args.id);
398
399
  const msg = removed ?
399
- "OK: removed task" :
400
- "WARNING: task not found";
400
+ `task_delete: OK: removed task "${args.id}"` :
401
+ `task_delete: WARNING: no task "${args.id}" to remove`;
401
402
  return {
402
403
  content: [{ type: "text", text: msg }]
403
404
  };
@@ -427,7 +428,7 @@ export class TaskMCP {
427
428
  const renamed = Task.rename(args.old, args.new);
428
429
  const msg = renamed ?
429
430
  `task_rename: OK: renamed task "${args.old}" to "${args.new}"` :
430
- "WARNING: task not found";
431
+ `task_rename: WARNING: no task "${args.old}" to rename`;
431
432
  return {
432
433
  content: [{ type: "text", text: msg }]
433
434
  };
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.53",
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.53",
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.53",
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.53",
9
+ "version": "0.0.55",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -5,7 +5,7 @@ description: Review software architecture, including package cohesion and inter-
5
5
  user-invocable: true
6
6
  disable-model-invocation: false
7
7
  model: opus
8
- effort: medium
8
+ effort: high
9
9
  allowed-tools:
10
10
  - "Bash(wc:*)"
11
11
  - "Bash(ls:*)"
@@ -24,8 +24,10 @@ Discover Components
24
24
  Discover Components
25
25
  </skill>
26
26
 
27
+ <role>
27
28
  Your role is an experienced, *expert-level software architect*,
28
29
  specialized in *finding components* (libraries/frameworks) for the technology stack.
30
+ </role>
29
31
 
30
32
  <objective>
31
33
  *Discover* additional, *third-party components* (libraries/frameworks)
@@ -5,7 +5,7 @@ description: >
5
5
  Analyze the source code for problems in the logic and semantics and its related control flow.
6
6
  user-invocable: true
7
7
  disable-model-invocation: false
8
- effort: medium
8
+ effort: high
9
9
  allowed-tools:
10
10
  - "Agent"
11
11
  ---
@@ -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
@@ -22,8 +22,10 @@ Explain Source Code
22
22
  Explain Source Code
23
23
  </skill>
24
24
 
25
+ <role>
25
26
  Your role is an experienced, *expert-level software developer*,
26
27
  specialized in *explaining source code*.
28
+ </role>
27
29
 
28
30
  <objective>
29
31
  *Analyze* the source code of $ARGUMENTS, and its directly related source
@@ -5,7 +5,7 @@ description: >
5
5
  Give insights into the source code.
6
6
  user-invocable: true
7
7
  disable-model-invocation: false
8
- effort: low
8
+ effort: medium
9
9
  allowed-tools:
10
10
  - "Bash(git)"
11
11
  - "Bash(sort)"
@@ -25,8 +25,10 @@ Project Insight
25
25
  Project Insight
26
26
  </skill>
27
27
 
28
+ <role>
28
29
  Your role is an experienced, *expert-level software developer*,
29
30
  specialized in *analyzing source code* and giving insights.
31
+ </role>
30
32
 
31
33
  <objective>
32
34
  Give *insights* into the project through the source code of $ARGUMENTS.
@@ -6,7 +6,7 @@ description: >
6
6
  Use when the user wants to "lint" or "check" source code.
7
7
  user-invocable: true
8
8
  disable-model-invocation: false
9
- effort: medium
9
+ effort: high
10
10
  ---
11
11
 
12
12
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
@@ -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
@@ -6,7 +6,7 @@ description: >
6
6
  Use when the user wants to "proofread" or "spellcheck" a document.
7
7
  user-invocable: true
8
8
  disable-model-invocation: false
9
- effort: medium
9
+ effort: high
10
10
  ---
11
11
 
12
12
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
@@ -8,7 +8,7 @@ disable-model-invocation: false
8
8
  effort: medium
9
9
  allowed-tools:
10
10
  - "Bash(git log *)"
11
- - "Bash(git status *)"
11
+ - "Bash(git diff *)"
12
12
  - "Bash(git show *)"
13
13
  - "Write"
14
14
  - "Edit"
@@ -24,78 +24,149 @@ Update ChangeLog Entries
24
24
  Update ChangeLog Entries
25
25
  </skill>
26
26
 
27
+ <role>
27
28
  Your role is an experienced, *expert-level software developer*,
28
29
  specialized in *Git version control*.
30
+ </role>
29
31
 
30
32
  <objective>
31
- Help to complete, consolidate and sort *ChangeLog* entries,
32
- based on underlying *Git* commit messages.
33
+ Help to complete, consolidate and sort *ChangeLog* entries of the most
34
+ recent *ChangeLog* section, based on underlying *Git* commits and staged
35
+ changes.
33
36
  </objective>
34
37
 
35
- For this, understand that ChangeLog entries are
36
- always formatted `<prefix/>: <summary/>` where
37
- the <prefix/> is one of the following tags
38
- and their usual related changes...
38
+ Format
39
+ ------
39
40
 
40
- - `FEATURE`: new functionality or configuration
41
- - `IMPROVEMENT`: improved functionality or configuration
42
- - `BUGFIX`: corrected functionality or configuration
43
- - `UPDATE`: updated functionality or configuration
44
- - `CLEANUP`: cleaned up functionality or configuration
45
- - `REFACTOR`: refactored functionality or configuration
41
+ The *ChangeLog* file is a Markdown formatted file named `CHANGELOG.md`,
42
+ and contains sections with headers in the style `N.M.K (YYYY-MM-DD)`.
46
43
 
47
- ...and <summary/> is not longer than about 60-80 characters.
48
- The ChangeLog entries for a single product release version
49
- are also grouped and sorted according to the above <prefix/>es.
44
+ Each *ChangeLog* entry is always formatted as `<prefix/>: <summary/>`
45
+ where the <prefix/> is one of the following tags and their usual related
46
+ changes:
47
+
48
+ - `FEATURE`: new functionality or configuration
49
+ - `IMPROVEMENT`: improved functionality or configuration
50
+ - `BUGFIX`: corrected functionality or configuration
51
+ - `UPDATE`: updated functionality or configuration
52
+ - `CLEANUP`: cleaned up functionality or configuration
53
+ - `REFACTOR`: refactored functionality or configuration
54
+
55
+ The <summary/> is not longer than about 60-80 characters. The
56
+ *ChangeLog* entries for a single product release version are also always
57
+ grouped and sorted according to the above <prefix/> list.
58
+
59
+ Processing
60
+ ----------
50
61
 
51
62
  <flow>
52
63
 
53
- 1. <step id="STEP 1: Locate and read existing ChangeLog entries">
54
- The *ChangeLog* file `CHANGELOG.md` contains sections
55
- with headers in the style `N.M.K (YYYY-MM-DD)`.
56
- The `CHANGELOG.md` file is located in the *current* directory
57
- or one of the *parent* directories.
58
- </step>
59
-
60
- 2. <step id="STEP 2: Read corresponding Git commit log messages">
61
- *Ignore* the current Git *index* and Git *stash* and use the Git *commits* only.
62
- For finding the corresponding Git commits, use the `N.M.K`
63
- from the *second* header in the *ChangeLog* file as
64
- the corresponding Git tag and then check all Git commits
65
- between `HEAD` and this tag.
66
- </step>
67
-
68
- 3. <step id="STEP 3: Complete ChangeLog entries">
69
- Without immediately modifying the `CHANGELOG.md` file,
70
- *complete* the entries in the first (most recent) section only,
71
- by adding the corresponding (most recent) Git commits only.
72
- For each Git commit, reduce the Git commit messages to a single
73
- short sentence.
74
- </step>
75
-
76
- 4. <step id="STEP 4: Consolidate ChangeLog entries">
77
- Without immediately modifying the `CHANGELOG.md` file,
78
- *consolidate* the entries in the first (most recent) section only,
79
- by summarizing and merging closely related entries.
80
- Perform the entry consolidation per prefix group only.
81
- If a changelog <summary/> is too short or is not comprehensible enough
82
- because of too little context, add some context, especially references
83
- to the class/module/package, etc.
84
- </step>
85
-
86
- 5. <step id="STEP 5: Sort ChangeLog entries">
87
- Without immediately modifying the `CHANGELOG.md` file,
88
- *sort* the entries in the first (most recent) section only.
89
- Instead of the chronological commit order, group the entries
90
- by the prefixes.
91
- </step>
92
-
93
- 6. <step id="STEP 6: Write modified ChangeLog entries">
94
- Finally, *update* the `CHANGELOG.md` file with the
95
- completed, consolidated and sorted *ChangeLog* entries.
96
- Also, update the date `YYYY-MM-DD` in the `N.M.K (YYYY-MM-DD)`
97
- headline of the *first* (most recent) section.
98
- </step>
64
+ 1. <step id="STEP 1: Locate and read ChangeLog entries">
65
+
66
+ The *ChangeLog* file `CHANGELOG.md` is located in the *current*
67
+ directory or one of the *parent* directories of the current project.
68
+ Locate and read this file. Store its relative path in <filename/>.
69
+
70
+ You *MUST* *NOT* output anything, except the result with the
71
+ following <template/>:
72
+
73
+ <template>
74
+ &#x1F535; **CHANGELOG FILE:** `<filename/>`
75
+ </template>
76
+
77
+ </step>
78
+
79
+ 2. <step id="STEP 2: Determine artifact changes">
80
+
81
+ You *MUST* *NOT* output anything, except introduce the current
82
+ operation with an output based on the following <template/>:
83
+
84
+ <template>
85
+ &#x1F535; **DETERMINE ARTIFACT CHANGES:**
86
+ </template>
87
+
88
+ To update to entries of the most recent *ChangeLog* section, consult
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
+
92
+ For finding the corresponding Git *commits*, use the `N.M.K` from the
93
+ *second* level-2 header in the *ChangeLog* file as the corresponding
94
+ Git tag and then check all Git commits between `HEAD` and this tag
95
+ with the command `git log N.M.K..HEAD --numstat --pretty=format:'%h:
96
+ %s'`.
97
+
98
+ For finding the corresponding staged Git *changes* in the Git
99
+ *index*, use the command `git diff --cached --numstat`, but silently
100
+ skip already existing changes to the `CHANGELOG.md` file itself. If
101
+ still no corresponding *ChangeLog* entry exists for these staged
102
+ Git *changes*, derive a meaningful one from a `git diff --cached`
103
+ command.
104
+
105
+ </step>
106
+
107
+ 3. <step id="STEP 3: Complete ChangeLog entries">
108
+
109
+ You *MUST* *NOT* output anything, except introduce the current
110
+ operation with an output based on the following <template/>:
111
+
112
+ <template>
113
+ &#x1F535; **COMPLETE ENTRIES:**
114
+ </template>
115
+
116
+ Without immediately modifying the `CHANGELOG.md` file, *complete*
117
+ the entries in the first (most recent) section only, by adding the
118
+ corresponding (most recent) Git *commits* and *staged* changes only.
119
+
120
+ For each Git commit, reduce the Git commit messages to a single
121
+ short <summary/> sentence, not longer than 60-80 characters.
122
+
123
+ If a <summary/> is too short or especially is not comprehensible
124
+ enough because of too little context information, add some essential
125
+ context, especially references to the class/module/package, etc.
126
+ For this, if necessary, read the related source files with a
127
+ corresponding `git show` command to get a better understanding of
128
+ this context.
129
+
130
+ </step>
131
+
132
+ 4. <step id="STEP 4: Consolidate and sort ChangeLog entries">
133
+
134
+ You *MUST* *NOT* output anything, except introduce the current
135
+ operation with an output based on the following <template/>:
136
+
137
+ <template>
138
+ &#x1F535; **CONSOLIDATE ENTRIES:**
139
+ </template>
140
+
141
+ Without immediately modifying the `CHANGELOG.md` file, *consolidate*
142
+ the entries in the first (most recent) section only, by summarizing
143
+ and merging closely related entries. Perform the entry consolidation
144
+ per <prefix/> group only.
145
+
146
+ Without immediately modifying the `CHANGELOG.md` file, *sort* the
147
+ entries in the first (most recent) section only. Instead of the
148
+ chronological commit order, group the entries by the <prefix/>es.
149
+
150
+ </step>
151
+
152
+ 5. <step id="STEP 5: Write modified ChangeLog entries">
153
+
154
+ You *MUST* *NOT* output anything, except introduce the current
155
+ operation with an output based on the following <template/>:
156
+
157
+ <template>
158
+ &#x1F7E0; **UPDATING CHANGELOG:**
159
+ </template>
160
+
161
+ Finally, *update* the `CHANGELOG.md` file with the completed,
162
+ consolidated and sorted *ChangeLog* entries. Also, update the date
163
+ `YYYY-MM-DD` in the `N.M.K (YYYY-MM-DD)` header of the *first* (most
164
+ recent) section.
165
+
166
+ You *MUST* *NOT* output any further summary or give any further
167
+ explanations.
168
+
169
+ </step>
99
170
 
100
171
  </flow>
101
172
 
@@ -1,6 +1,5 @@
1
1
  ---
2
2
  name: ase-meta-commit
3
- argument-hint: ""
4
3
  description: >
5
4
  Determine commit message for staged Git changes.
6
5
  user-invocable: true
@@ -20,8 +19,10 @@ Git Commit
20
19
  Git Commit
21
20
  </skill>
22
21
 
22
+ <role>
23
23
  Your role is an experienced, *expert-level software developer*,
24
24
  specialized in *Git commit messages*.
25
+ </role>
25
26
 
26
27
  <objective>
27
28
  Help to *craft* a *concise commit message* for the
@@ -29,28 +30,34 @@ currently staged Git changes.
29
30
  </objective>
30
31
 
31
32
  <flow>
33
+
32
34
  1. <step id="STEP 1: Find out staged changes">
33
- Run the following command to find out details
34
- of what changes are currently staged for commit:
35
35
 
36
- `git diff --staged`
36
+ Run the following command to find out details of what changes are
37
+ currently staged in the Git *index* for commit:
38
+
39
+ `git diff --cached`
40
+
37
41
  </step>
38
42
 
39
43
  2. <step id="STEP 2: Craft a consolidated commit message">
44
+
40
45
  Craft a commit <message/> in the following format:
41
46
 
42
47
  `<type/>: <summary/>`
43
48
 
44
49
  The known <type/>s and their usual corresponding kind of change are:
45
- - `FEATURE`: new functionality or configuration
50
+
51
+ - `FEATURE`: new functionality or configuration
46
52
  - `IMPROVEMENT`: improved functionality or configuration
47
- - `BUGFIX`: corrected functionality or configuration
48
- - `UPDATE`: updated functionality or configuration
49
- - `CLEANUP`: cleaned up functionality or configuration
50
- - `REFACTOR`: refactored functionality or configuration
53
+ - `BUGFIX`: corrected functionality or configuration
54
+ - `UPDATE`: updated functionality or configuration
55
+ - `CLEANUP`: cleaned up functionality or configuration
56
+ - `REFACTOR`: refactored functionality or configuration
51
57
 
52
58
  The rules for generating <summary/> are:
53
- - Use a maximum of 70 characters
59
+
60
+ - Use a maximum of 60-80 characters
54
61
  - Use imperative mood ("add" not "added")
55
62
  - Use *no* period at the end
56
63
  - Use *no* Markdown formatting
@@ -63,6 +70,8 @@ currently staged Git changes.
63
70
  </template>
64
71
 
65
72
  Do *not* output any further explanation.
73
+
66
74
  </step>
75
+
67
76
  </flow>
68
77
 
@@ -10,6 +10,7 @@ description: >
10
10
  Use when user says "persona <persona>" or "be <persona>".
11
11
  user-invocable: true
12
12
  disable-model-invocation: false
13
+ effort: medium
13
14
  ---
14
15
 
15
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
@@ -88,7 +88,7 @@ by querying *multiple* AIs for an *optimal consensus*.
88
88
  3. <step id="STEP 3: Summarize Responses">
89
89
 
90
90
  Agents which returned a response with an `ERROR:` prefix are
91
- silently skipped and are treatd as not available.
91
+ silently skipped and are treated as not available.
92
92
 
93
93
  Summarize all responses, of both yourself and all available agents
94
94
  with just 1 to 7 corresponding bullet points and with short
@@ -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.
@@ -79,7 +79,7 @@ Your objective is to *search* the *Internet*/*Web* for the following query:
79
79
  calls above into a single response and output it without giving any
80
80
  further explanations.
81
81
 
82
- For the consolidation, do *NOT* remove any orginal information,
82
+ For the consolidation, do *NOT* remove any original information,
83
83
  just *MERGE* all overlapping information.
84
84
 
85
85
  </step>
@@ -18,7 +18,9 @@ Five-Whys Root-Cause Analysis
18
18
  Five-Whys Root-Cause Analysis
19
19
  </skill>
20
20
 
21
+ <role>
21
22
  Your role is an *expert-level assistant*.
23
+ </role>
22
24
 
23
25
  <objective>
24
26
  Apply the *Five-Whys* *root-cause analysis* technique to investigate
@@ -20,7 +20,9 @@ Delete a Task Plan
20
20
  Delete a Task Plan
21
21
  </skill>
22
22
 
23
+ <role>
23
24
  Your role is an experienced, *expert-level assistant*.
25
+ </role>
24
26
  *Delete* the task plan.
25
27
 
26
28
  Procedure
@@ -57,7 +59,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
57
59
  ⧉ **ASE**: ◉ task: **<id/>**, ▶ status: **<text/>**
58
60
  </template>
59
61
 
60
- - If <text/> starts NOT with `ERROR:`:
62
+ - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
61
63
  Only output the following <template/>:
62
64
 
63
65
  <template>
@@ -30,9 +30,11 @@ Iteratively Edit a Task Plan
30
30
  $ARGUMENTS
31
31
  </expand>
32
32
 
33
+ <role>
33
34
  Your role is an experienced, *expert-level assistant*,
34
35
  specialized in the *planning* of changes
35
36
  through *iterative conversational refinement*.
37
+ </role>
36
38
 
37
39
  Establish and refine the *task plan* purely through a *chat-driven
38
40
  loop*. The user steers each round via interactive dialog that offers
@@ -28,8 +28,10 @@ Implement a Task Plan
28
28
  $ARGUMENTS
29
29
  </expand>
30
30
 
31
+ <role>
31
32
  Your role is an experienced, *expert-level assistant*,
32
33
  specialized in the *implementation* of changes.
34
+ </role>
33
35
 
34
36
  *Implement* the task plan by modifying the *artifacts*
35
37
  with a corresponding, complete *change set*.
@@ -28,8 +28,10 @@ Preflight a Task Plan
28
28
  $ARGUMENTS
29
29
  </expand>
30
30
 
31
+ <role>
31
32
  Your role is an experienced, *expert-level assistant*,
32
33
  specialized in the *implementation* of changes.
34
+ </role>
33
35
 
34
36
  *Preflight* the implementation of a task plan by creating a draft
35
37
  for a corresponding, *complete source code change set*.
@@ -7,7 +7,7 @@ description: >
7
7
  the "task", "plan", "spec", or "specification".
8
8
  user-invocable: true
9
9
  disable-model-invocation: false
10
- effort: xhigh
10
+ effort: high
11
11
  ---
12
12
 
13
13
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
@@ -28,8 +28,10 @@ Reboot a Task Plan
28
28
  $ARGUMENTS
29
29
  </expand>
30
30
 
31
+ <role>
31
32
  Your role is an experienced, *expert-level assistant*,
32
33
  specialized in the *planning* of changes.
34
+ </role>
33
35
 
34
36
  *Reboot* the task plan by crafting it from scratch,
35
37
  based on the existing *WHAT* and *WHY*.
@@ -20,7 +20,10 @@ Rename a Task Plan
20
20
  Rename a Task Plan
21
21
  </skill>
22
22
 
23
+ <role>
23
24
  Your role is an experienced, *expert-level assistant*.
25
+ </role>
26
+
24
27
  *Rename* the task plan.
25
28
 
26
29
  Procedure
@@ -20,7 +20,9 @@ View a Task Plan
20
20
  View a Task Plan
21
21
  </skill>
22
22
 
23
+ <role>
23
24
  Your role is an experienced, *expert-level assistant*.
25
+ </role>
24
26
  *View* the task plan.
25
27
 
26
28
  Procedure
@@ -58,7 +60,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
58
60
  ⧉ **ASE**: ◉ task: **<id/>**, ▶ status: **<text/>**
59
61
  </template>
60
62
 
61
- - If <text/> starts NOT with `ERROR:`:
63
+ - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
62
64
  Set <content><text/></content> (set content to text).
63
65
  Calculate the number of words <words/> of <content/>.
64
66
  Only output the following <template/>:
@@ -1,9 +0,0 @@
1
- ---
2
- argument-hint: ""
3
- description: "During Lint: Complete Code Change"
4
- ---
5
-
6
- Sorry, your last proposed code change set seems to be not really *complete*,
7
- as some code changes seem to be missing.
8
- Please *re-assess* and propose the *entire necessary change set*, all *at once*.
9
-
@@ -1,9 +0,0 @@
1
- ---
2
- argument-hint: "<issue>"
3
- description: "During Lint: Improve Explanation"
4
- ---
5
-
6
- I am still *musing* on your last proposed code change.
7
- $ARGUMENTS.
8
- Please *improve your explanation* and *propose it again*.
9
-
@@ -1,11 +0,0 @@
1
- ---
2
- argument-hint: ""
3
- description: "During Lint: Reject Change and Continue"
4
- ---
5
-
6
- I *reject* your last proposed code change.
7
-
8
- Do *NOT apply* your last code change to the code.
9
- But please *continue* your plan and *continue*
10
- to propose further code changes.
11
-
@@ -1,15 +0,0 @@
1
- ---
2
- argument-hint: "<question>"
3
- description: "During Lint: Re-Assess Last Change"
4
- ---
5
-
6
- Are you *really sure*? $ARGUMENTS
7
-
8
- Please *re-assess* and *reason* on your last proposed code change!
9
-
10
- Then, if you are still sure that it is correct, please *propose the code
11
- change once again* before continuing with your plan.
12
-
13
- Otherwise, if you are unsure, be transparent and tell me your new
14
- reasoned concerns and continue with your plan immediately.
15
-
@@ -1,9 +0,0 @@
1
- ---
2
- argument-hint: ""
3
- description: "During Lint: Recheck Change"
4
- ---
5
-
6
- The source code was *updated externally*.
7
- Please update your last code change against the latest source code
8
- and *propose the code change again* before you continue following your review.
9
-
@@ -1,9 +0,0 @@
1
- ---
2
- argument-hint: "<hint>"
3
- description: "During Lint: Refine Change"
4
- ---
5
-
6
- Please *refine* your last proposed code change: $ARGUMENTS.
7
- Then please propose the refined code change again before
8
- you continue following your review.
9
-