@rse/ase 0.9.7 → 0.9.8
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-getopt.js +11 -1
- package/dst/ase-task.js +20 -21
- package/package.json +2 -2
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/agents/ase-docs-proofread.md +2 -2
- package/plugin/meta/ase-constitution.md +7 -0
- package/plugin/meta/ase-control.md +24 -3
- package/plugin/meta/ase-format-task.md +2 -2
- package/plugin/meta/ase-getopt.md +2 -1
- package/plugin/meta/ase-skill.md +28 -9
- package/plugin/package.json +2 -2
- package/plugin/skills/ase-arch-analyze/SKILL.md +88 -89
- package/plugin/skills/ase-arch-discover/SKILL.md +18 -9
- package/plugin/skills/ase-code-analyze/SKILL.md +6 -5
- package/plugin/skills/ase-code-craft/SKILL.md +42 -35
- package/plugin/skills/ase-code-explain/SKILL.md +1 -1
- package/plugin/skills/ase-code-insight/SKILL.md +1 -1
- package/plugin/skills/ase-code-lint/SKILL.md +16 -8
- package/plugin/skills/ase-code-refactor/SKILL.md +42 -35
- package/plugin/skills/ase-code-resolve/SKILL.md +43 -35
- package/plugin/skills/ase-docs-distill/SKILL.md +1 -1
- package/plugin/skills/ase-docs-distill/help.md +3 -3
- package/plugin/skills/ase-docs-proofread/SKILL.md +22 -13
- package/plugin/skills/ase-meta-brainstorm/SKILL.md +25 -6
- package/plugin/skills/ase-meta-brainstorm/help.md +6 -10
- package/plugin/skills/ase-meta-diff/SKILL.md +5 -4
- package/plugin/skills/ase-meta-diff/help.md +10 -11
- package/plugin/skills/ase-meta-evaluate/SKILL.md +10 -9
- package/plugin/skills/ase-meta-quorum/SKILL.md +15 -5
- package/plugin/skills/ase-meta-review/SKILL.md +3 -3
- package/plugin/skills/ase-meta-review/help.md +3 -3
- package/plugin/skills/ase-meta-search/SKILL.md +9 -8
- package/plugin/skills/ase-meta-steelman/SKILL.md +1 -1
- package/plugin/skills/ase-meta-why/SKILL.md +16 -10
- package/plugin/skills/ase-task-condense/SKILL.md +32 -17
- package/plugin/skills/ase-task-condense/help.md +1 -1
- package/plugin/skills/ase-task-delete/SKILL.md +6 -3
- package/plugin/skills/ase-task-edit/SKILL.md +53 -32
- package/plugin/skills/ase-task-edit/help.md +2 -2
- package/plugin/skills/ase-task-grill/SKILL.md +53 -24
- package/plugin/skills/ase-task-id/SKILL.md +11 -2
- package/plugin/skills/ase-task-implement/SKILL.md +36 -15
- package/plugin/skills/ase-task-list/SKILL.md +1 -1
- package/plugin/skills/ase-task-preflight/SKILL.md +40 -20
- package/plugin/skills/ase-task-preflight/help.md +1 -1
- package/plugin/skills/ase-task-reboot/SKILL.md +27 -18
- package/plugin/skills/ase-task-rename/SKILL.md +5 -3
- package/plugin/skills/ase-task-view/help.md +24 -5
package/dst/ase-getopt.js
CHANGED
|
@@ -19,7 +19,9 @@ export class GetoptMCP {
|
|
|
19
19
|
"containing those remaining tokens (quotes preserved), and " +
|
|
20
20
|
"`info` is a markdown rendering of the parsed options in the " +
|
|
21
21
|
"form `key: **value**, key: **value**, ...` for printing at " +
|
|
22
|
-
"the top of a skill."
|
|
22
|
+
"the top of a skill. Options whose long name starts with " +
|
|
23
|
+
"`int-` are treated as internal and are excluded from both " +
|
|
24
|
+
"the usage help and the `info` rendering.",
|
|
23
25
|
inputSchema: {
|
|
24
26
|
name: z.string()
|
|
25
27
|
.describe("Name of the caller (e.g. skill name), used in error messages"),
|
|
@@ -53,6 +55,7 @@ export class GetoptMCP {
|
|
|
53
55
|
/* tokenize spec and add one option per token */
|
|
54
56
|
const tokens = args.spec.split(/\s+/).filter((e) => e.length > 0);
|
|
55
57
|
const re = /^--([A-Za-z][A-Za-z0-9-]*)(?:\|-([A-Za-z]))?(?:=(\((.*)\)(\.\.\.)?|.*))?$/;
|
|
58
|
+
const internals = new Set();
|
|
56
59
|
for (const tok of tokens) {
|
|
57
60
|
const m = re.exec(tok);
|
|
58
61
|
if (m === null)
|
|
@@ -76,6 +79,12 @@ export class GetoptMCP {
|
|
|
76
79
|
}
|
|
77
80
|
else
|
|
78
81
|
opt.default(false);
|
|
82
|
+
if (long !== undefined && long.startsWith("int-")) {
|
|
83
|
+
/* internal option: hide from usage help and remember
|
|
84
|
+
its camel-cased key for the info rendering below */
|
|
85
|
+
opt.hideHelp();
|
|
86
|
+
internals.add(long.replace(/-(.)/g, (_, c) => c.toUpperCase()));
|
|
87
|
+
}
|
|
79
88
|
cmd.addOption(opt);
|
|
80
89
|
}
|
|
81
90
|
/* parse args */
|
|
@@ -145,6 +154,7 @@ export class GetoptMCP {
|
|
|
145
154
|
/* build markdown info rendering of parsed options */
|
|
146
155
|
const opts = cmd.opts();
|
|
147
156
|
const info = Object.entries(opts)
|
|
157
|
+
.filter(([k]) => !internals.has(k))
|
|
148
158
|
.map(([k, v]) => `${k}: **${shQuote([String(v)])}**`)
|
|
149
159
|
.join(", ");
|
|
150
160
|
/* build result */
|
package/dst/ase-task.js
CHANGED
|
@@ -20,8 +20,8 @@ export class Task {
|
|
|
20
20
|
static validateId(id) {
|
|
21
21
|
if (typeof id !== "string" || id.length === 0)
|
|
22
22
|
throw new Error("task: id must be a non-empty string");
|
|
23
|
-
if (!/^[A-Za-z0-
|
|
24
|
-
throw new Error("task: id must match [A-Za-z0-
|
|
23
|
+
if (!/^[A-Za-z0-9_-]+$/.test(id))
|
|
24
|
+
throw new Error("task: id must match [A-Za-z0-9_-]+");
|
|
25
25
|
}
|
|
26
26
|
/* determine the project root (Git top-level if inside a Git
|
|
27
27
|
working tree, otherwise the current working directory) */
|
|
@@ -76,7 +76,7 @@ export class Task {
|
|
|
76
76
|
if (!fs.existsSync(dir))
|
|
77
77
|
return false;
|
|
78
78
|
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
79
|
-
if (!entry.isDirectory() || !/^[A-Za-z0-
|
|
79
|
+
if (!entry.isDirectory() || !/^[A-Za-z0-9_-]+$/.test(entry.name))
|
|
80
80
|
continue;
|
|
81
81
|
if (fs.existsSync(path.join(dir, entry.name, "plan.md")))
|
|
82
82
|
return true;
|
|
@@ -149,7 +149,7 @@ export class Task {
|
|
|
149
149
|
if (fs.existsSync(newFile))
|
|
150
150
|
throw new Error(`task: target id "${newId}" already exists`);
|
|
151
151
|
const text = fs.readFileSync(oldFile, "utf8");
|
|
152
|
-
const updated = text.replace(/(^#\s+
|
|
152
|
+
const updated = text.replace(/(^#\s+TASK\s+)[A-Za-z0-9_-]+(\s*:)/m, `$1${newId}$2`);
|
|
153
153
|
fs.mkdirSync(path.dirname(newFile), { recursive: true });
|
|
154
154
|
fs.writeFileSync(newFile, updated, "utf8");
|
|
155
155
|
fs.rmSync(oldFile, { force: true });
|
|
@@ -168,7 +168,7 @@ export class Task {
|
|
|
168
168
|
const isMatch = picomatch(files, { dot: true });
|
|
169
169
|
const out = [];
|
|
170
170
|
for (const entry of fs.readdirSync(dir)) {
|
|
171
|
-
const m = /^TASK-([A-Za-z0-
|
|
171
|
+
const m = /^TASK-([A-Za-z0-9_-]+)\.md$/.exec(entry);
|
|
172
172
|
if (m === null || !isMatch(entry))
|
|
173
173
|
continue;
|
|
174
174
|
const file = path.join(dir, entry);
|
|
@@ -194,7 +194,7 @@ export class Task {
|
|
|
194
194
|
const cutoff = Date.now() - maxAgeMs;
|
|
195
195
|
const removed = [];
|
|
196
196
|
for (const entry of fs.readdirSync(dir)) {
|
|
197
|
-
const m = /^TASK-([A-Za-z0-
|
|
197
|
+
const m = /^TASK-([A-Za-z0-9_-]+)\.md$/.exec(entry);
|
|
198
198
|
if (m === null || !isMatch(entry))
|
|
199
199
|
continue;
|
|
200
200
|
const file = path.join(dir, entry);
|
|
@@ -417,7 +417,7 @@ export class TaskMCP {
|
|
|
417
417
|
"Returns the task as `text`; returns an empty string if no task exists for the `id`.",
|
|
418
418
|
inputSchema: {
|
|
419
419
|
id: z.string()
|
|
420
|
-
.describe("task identifier (allowed characters: A-Z, a-z, 0-9, '-')")
|
|
420
|
+
.describe("task identifier (allowed characters: A-Z, a-z, 0-9, '_', '-')")
|
|
421
421
|
}
|
|
422
422
|
}, async (args) => {
|
|
423
423
|
try {
|
|
@@ -442,16 +442,15 @@ export class TaskMCP {
|
|
|
442
442
|
"Overwrites any existing task for the same `id`.",
|
|
443
443
|
inputSchema: {
|
|
444
444
|
id: z.string()
|
|
445
|
-
.describe("task identifier (allowed characters: A-Z, a-z, 0-9, '-')"),
|
|
445
|
+
.describe("task identifier (allowed characters: A-Z, a-z, 0-9, '_', '-')"),
|
|
446
446
|
text: z.string()
|
|
447
447
|
.describe("text content of the task")
|
|
448
448
|
}
|
|
449
449
|
}, async (args) => {
|
|
450
450
|
try {
|
|
451
|
-
|
|
452
|
-
Task.save(this.log, args.id, text);
|
|
451
|
+
Task.save(this.log, args.id, args.text);
|
|
453
452
|
return {
|
|
454
|
-
content: [{ type: "text", text: `
|
|
453
|
+
content: [{ type: "text", text: `OK: saved task "${args.id}"` }]
|
|
455
454
|
};
|
|
456
455
|
}
|
|
457
456
|
catch (err) {
|
|
@@ -469,14 +468,14 @@ export class TaskMCP {
|
|
|
469
468
|
"Returns a status `text` indicating whether a task existed and was removed.",
|
|
470
469
|
inputSchema: {
|
|
471
470
|
id: z.string()
|
|
472
|
-
.describe("task identifier (allowed characters: A-Z, a-z, 0-9, '-')")
|
|
471
|
+
.describe("task identifier (allowed characters: A-Z, a-z, 0-9, '_', '-')")
|
|
473
472
|
}
|
|
474
473
|
}, async (args) => {
|
|
475
474
|
try {
|
|
476
475
|
const removed = Task.delete(this.log, args.id);
|
|
477
476
|
const msg = removed ?
|
|
478
|
-
`
|
|
479
|
-
`
|
|
477
|
+
`OK: removed task "${args.id}"` :
|
|
478
|
+
`WARNING: no task "${args.id}" to remove`;
|
|
480
479
|
return {
|
|
481
480
|
content: [{ type: "text", text: msg }]
|
|
482
481
|
};
|
|
@@ -497,16 +496,16 @@ export class TaskMCP {
|
|
|
497
496
|
"Fails with an error if the target id already exists.",
|
|
498
497
|
inputSchema: {
|
|
499
498
|
old: z.string()
|
|
500
|
-
.describe("old task identifier (allowed characters: A-Z, a-z, 0-9, '-')"),
|
|
499
|
+
.describe("old task identifier (allowed characters: A-Z, a-z, 0-9, '_', '-')"),
|
|
501
500
|
new: z.string()
|
|
502
|
-
.describe("new task identifier (allowed characters: A-Z, a-z, 0-9, '-')")
|
|
501
|
+
.describe("new task identifier (allowed characters: A-Z, a-z, 0-9, '_', '-')")
|
|
503
502
|
}
|
|
504
503
|
}, async (args) => {
|
|
505
504
|
try {
|
|
506
505
|
const renamed = Task.rename(this.log, args.old, args.new);
|
|
507
506
|
const msg = renamed ?
|
|
508
|
-
`
|
|
509
|
-
`
|
|
507
|
+
`OK: renamed task "${args.old}" to "${args.new}"` :
|
|
508
|
+
`WARNING: no task "${args.old}" to rename`;
|
|
510
509
|
return {
|
|
511
510
|
content: [{ type: "text", text: msg }]
|
|
512
511
|
};
|
|
@@ -527,16 +526,16 @@ export class TaskMCP {
|
|
|
527
526
|
"otherwise it returns the current task `id` of the `session`.",
|
|
528
527
|
inputSchema: {
|
|
529
528
|
id: z.string().optional()
|
|
530
|
-
.describe("task identifier to set (allowed characters: A-Z, a-z, 0-9, '-'); " +
|
|
529
|
+
.describe("task identifier to set (allowed characters: A-Z, a-z, 0-9, '_', '-'); " +
|
|
531
530
|
"if omitted, the current task id is returned"),
|
|
532
531
|
session: z.string()
|
|
533
|
-
.describe("session identifier (allowed characters: A-Z, a-z, 0-9, '-')")
|
|
532
|
+
.describe("session identifier (allowed characters: A-Z, a-z, 0-9, '_', '-')")
|
|
534
533
|
}
|
|
535
534
|
}, async (args) => {
|
|
536
535
|
try {
|
|
537
536
|
if (args.id !== undefined) {
|
|
538
537
|
Task.setId(this.log, args.session, args.id);
|
|
539
|
-
const msg = `
|
|
538
|
+
const msg = `OK: set agent.task to "${args.id}" ` +
|
|
540
539
|
`for session "${args.session}"`;
|
|
541
540
|
return {
|
|
542
541
|
content: [{ type: "text", text: msg }]
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"homepage": "http://github.com/rse/ase",
|
|
7
7
|
"repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
|
|
8
8
|
"bugs": { "url": "http://github.com/rse/ase/issues" },
|
|
9
|
-
"version": "0.9.
|
|
9
|
+
"version": "0.9.8",
|
|
10
10
|
"license": "GPL-3.0-only",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "Dr. Ralf S. Engelschall",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"nodemon": "3.1.14",
|
|
31
31
|
"shx": "0.4.0",
|
|
32
32
|
|
|
33
|
-
"@types/node": "25.9.
|
|
33
|
+
"@types/node": "25.9.3",
|
|
34
34
|
"@types/luxon": "3.7.1",
|
|
35
35
|
"@types/which": "3.0.4",
|
|
36
36
|
"@types/update-notifier": "6.0.8",
|
|
@@ -62,9 +62,9 @@ Workflow
|
|
|
62
62
|
6. Set <context-after/> to exactly *up to two* lines of
|
|
63
63
|
*unchanged* text content which occurs in the document
|
|
64
64
|
directly *after* <old-text/>, i.e., the lines (<line/>
|
|
65
|
-
+ <n/>
|
|
65
|
+
+ <n/>) and (<line/> + <n/> + 1), where <n/> is the
|
|
66
66
|
number of lines in <old-text/>. Reduce to just one line
|
|
67
|
-
(<line/> + <n/>
|
|
67
|
+
(<line/> + <n/>) if <old-text/> is the second-last
|
|
68
68
|
line of the document. Set <context-after/> to empty if
|
|
69
69
|
<old-text/> is the last line in the document.
|
|
70
70
|
|
|
@@ -16,6 +16,13 @@ you *MUST* once and immediately output the following <template/> now:
|
|
|
16
16
|
⧉ **ASE**: ☯ persona: **<ase-persona-style/>**
|
|
17
17
|
</template>
|
|
18
18
|
|
|
19
|
+
In case your harness instructions indicate that the user is shown
|
|
20
|
+
only the *final* text message of each turn (e.g. *Claude Code* with
|
|
21
|
+
"focus mode" enabled), you *MUST* ensure this <template/> output (and
|
|
22
|
+
*every* <template/> output requested by ASE skills) lands in a final
|
|
23
|
+
text message (after the last tool call of a turn) instead of between
|
|
24
|
+
tool calls -- repeat it there if necessary.
|
|
25
|
+
|
|
19
26
|
Prohibitions
|
|
20
27
|
------------
|
|
21
28
|
|
|
@@ -14,7 +14,7 @@ Control Flow Constructs
|
|
|
14
14
|
Do not output anything.
|
|
15
15
|
|
|
16
16
|
- *IMPORTANT*: You *MUST* honor the following control flow construct:
|
|
17
|
-
<expand name="<define-name/>" [arg1="<expand-arg1/>" [arg2="<expand-arg2/>" [...]]]
|
|
17
|
+
<expand name="<define-name/>" [arg1="<expand-arg1/>" [arg2="<expand-arg2/>" [...]]]>[<expand-content/>]</expand>:
|
|
18
18
|
|
|
19
19
|
This specifies the *expansion* of previous <define/>. This
|
|
20
20
|
construct is expanded to the <define-body/> of <define/> with
|
|
@@ -48,14 +48,35 @@ Control Flow Constructs
|
|
|
48
48
|
|
|
49
49
|
This specifies a simple condition which is expanded to <if-body/>
|
|
50
50
|
if <if-condition/> is met, or to empty string if <if-condition/> is
|
|
51
|
-
*not* met.
|
|
51
|
+
*not* met. It can be optionally followed by one or more <elseif/>
|
|
52
|
+
constructs and/or one final <else/> construct. Do not output anything else.
|
|
53
|
+
|
|
54
|
+
- *IMPORTANT*: You *MUST* honor the following control flow construct:
|
|
55
|
+
<elseif condition="<elseif-condition/>"><elseif-body/></elseif>:
|
|
56
|
+
|
|
57
|
+
This specifies an *alternative condition* and has to directly
|
|
58
|
+
follow an <if/> or another <elseif/> construct. It is expanded
|
|
59
|
+
to <elseif-body/> if the conditions of all preceding <if/> and
|
|
60
|
+
<elseif/> constructs of the chain were *not* met and its own
|
|
61
|
+
<elseif-condition/> is met, or to the empty string otherwise.
|
|
62
|
+
Do not output anything else.
|
|
63
|
+
|
|
64
|
+
- *IMPORTANT*: You *MUST* honor the following control flow construct:
|
|
65
|
+
<else><else-body/></else>:
|
|
66
|
+
|
|
67
|
+
This specifies the *fallback alternative* and has to directly
|
|
68
|
+
follow an <if/> or <elseif/> construct. It is expanded to
|
|
69
|
+
<else-body/> if the conditions of all preceding <if/> and
|
|
70
|
+
<elseif/> constructs of the chain were *not* met, or to the empty
|
|
71
|
+
string otherwise. Do not output anything else.
|
|
52
72
|
|
|
53
73
|
- *IMPORTANT*: You *MUST* honor the following control flow construct:
|
|
54
74
|
<while condition="<while-condition/>"><while-body/></while>:
|
|
55
75
|
|
|
56
76
|
This specifies a <while-body/> which is *repeated* as long as
|
|
57
77
|
<while-condition/> is met. This construct is expanded to the
|
|
58
|
-
repetition of <while-body/>.
|
|
78
|
+
repetition of <while-body/>. A <break/> in <while-body/> can stop
|
|
79
|
+
the repetition early. Do not output anything else.
|
|
59
80
|
|
|
60
81
|
- *IMPORTANT*: You *MUST* honor the following control flow construct:
|
|
61
82
|
<for items="<for-item/> [...]"><for-body/></for>:
|
|
@@ -28,7 +28,8 @@ set placeholders into the context as a side-effect.
|
|
|
28
28
|
markdown rendering of the parsed options in the form `<longN/>:
|
|
29
29
|
**<valueN/>**, [...]` (joined with `, `, with each value
|
|
30
30
|
shell-quoted if value contains spaces or special characters, and
|
|
31
|
-
excluding the `help` option
|
|
31
|
+
excluding the `help` option and any *internal* option whose long
|
|
32
|
+
name starts with `int-`).
|
|
32
33
|
|
|
33
34
|
Then silently *SKIP* only the following steps 3-6
|
|
34
35
|
and proceed directly to step 7 to display the results.
|
package/plugin/meta/ase-skill.md
CHANGED
|
@@ -25,6 +25,18 @@ Skill Output
|
|
|
25
25
|
Unicode characters, and the potential reduction of prose according
|
|
26
26
|
to the currently defined persona style.
|
|
27
27
|
|
|
28
|
+
- *IMPORTANT*: For *Final-Message-Only Display* ("focus mode"):
|
|
29
|
+
some agent harnesses show the user only the *final* text message of
|
|
30
|
+
a turn and *hide* all text emitted *between* tool calls. If your
|
|
31
|
+
harness instructions indicate such a mode (e.g. *Claude Code* with
|
|
32
|
+
"focus mode" enabled), you *MUST* repeat *all* <template/> outputs
|
|
33
|
+
emitted since the last shown final text message -- *verbatim*, in
|
|
34
|
+
their *original order*, and each only *once* -- at the *top* of the
|
|
35
|
+
next final text message (i.e. the text after the last tool call of
|
|
36
|
+
a turn). Never *drop* or *summarize* a <template/> output just
|
|
37
|
+
because it would land between tool calls. If no such display mode
|
|
38
|
+
is indicated, do *not* repeat anything.
|
|
39
|
+
|
|
28
40
|
- *IMPORTANT*: The active *persona style* (see `ase-persona.md`) *MUST* be applied
|
|
29
41
|
to all *free-text placeholders* within <template/> sections - i.e. any placeholder
|
|
30
42
|
whose content you author yourself (such as `<description/>`, `<title/>`, `<objective/>`,
|
|
@@ -98,14 +110,21 @@ Skill Sequential Processing
|
|
|
98
110
|
- *IMPORTANT*: For each given <flow/>, you *MUST* use the
|
|
99
111
|
`TaskCreate` tool to create a corresponding set of processing steps.
|
|
100
112
|
|
|
101
|
-
Each `<step id="xxx" [...]
|
|
102
|
-
subject: "xxx", description: "xxx"
|
|
103
|
-
words, use the text of the `id` attribute of <step/>
|
|
104
|
-
|
|
113
|
+
Each `<step id="xxx" [...]>...</step>` corresponds to a
|
|
114
|
+
`TaskCreate({ subject: "xxx", description: "xxx" })`. In other
|
|
115
|
+
words, use the text of the `id` attribute of <step/> exactly
|
|
116
|
+
*as-is* for both the `subject`, and the `description` fields of
|
|
105
117
|
`TaskCreate`.
|
|
106
118
|
|
|
107
|
-
|
|
108
|
-
|
|
119
|
+
For speed, emit *all* `TaskCreate` calls together in a *single* turn
|
|
120
|
+
(issued in parallel), *not* one-per-turn sequentially. Do *not*
|
|
121
|
+
rely on the call order to establish the step order, as the parallel
|
|
122
|
+
results carry no guaranteed ordering. Instead, in the *immediately
|
|
123
|
+
following* turn, establish the strict order explicitly by chaining
|
|
124
|
+
the created tasks with `TaskUpdate`: for each <step/> after the
|
|
125
|
+
first one, call `TaskUpdate({ taskId: "<this/>", addBlockedBy:
|
|
126
|
+
[ "<prev/>" ] })` so that every step (with `taskId` <this/>) is
|
|
127
|
+
blocked by its predecessor step (with `taskId` <prev/>).
|
|
109
128
|
|
|
110
129
|
- *IMPORTANT*: For each <step/> you *MUST* use the `TaskUpdate` tool
|
|
111
130
|
for updating its status during processing.
|
|
@@ -208,7 +227,7 @@ Template Patterns
|
|
|
208
227
|
</template>
|
|
209
228
|
|
|
210
229
|
- When `<ase-tpl-head title="<title/>"/>` should be expanded, use
|
|
211
|
-
(where <bar/> = "─" x (70 -
|
|
230
|
+
(where <bar/> = "─" x (70 - 16 - length("<title/>")), i.e., <bar/> is
|
|
212
231
|
the "─" character repeated (70 - 16 - length("<title/>")) times):
|
|
213
232
|
|
|
214
233
|
<template>
|
|
@@ -226,8 +245,8 @@ Template Patterns
|
|
|
226
245
|
</template>
|
|
227
246
|
|
|
228
247
|
- When `<ase-tpl-foot title="<title/>"/>` should be expanded, use
|
|
229
|
-
(where <bar/> = "─" x (70 -
|
|
230
|
-
the "─" character repeated (
|
|
248
|
+
(where <bar/> = "─" x (70 - 16 - length("<title/>")), i.e., <bar/> is
|
|
249
|
+
the "─" character repeated (71 - 16 - length("<title/>")) times):
|
|
231
250
|
|
|
232
251
|
<template>
|
|
233
252
|
|
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.9.
|
|
9
|
+
"version": "0.9.8",
|
|
10
10
|
"license": "GPL-3.0-only",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "Dr. Ralf S. Engelschall",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"@rse/stx": "1.1.5",
|
|
18
|
-
"markdownlint": "0.
|
|
18
|
+
"markdownlint": "0.41.0",
|
|
19
19
|
"markdownlint-cli2": "0.22.1",
|
|
20
20
|
"eslint": "10.4.1",
|
|
21
21
|
"@eslint/markdown": "8.0.2",
|
|
@@ -7,94 +7,94 @@ disable-model-invocation: false
|
|
|
7
7
|
model: opus
|
|
8
8
|
effort: high
|
|
9
9
|
allowed-tools:
|
|
10
|
-
- "Bash(wc
|
|
11
|
-
- "Bash(ls
|
|
12
|
-
- "Bash(tree
|
|
13
|
-
- "Bash(file
|
|
14
|
-
- "Bash(du
|
|
15
|
-
- "Bash(stat
|
|
16
|
-
- "Bash(grep
|
|
17
|
-
- "Bash(awk
|
|
18
|
-
- "Bash(head
|
|
19
|
-
- "Bash(tail
|
|
20
|
-
- "Bash(sort
|
|
21
|
-
- "Bash(uniq
|
|
22
|
-
- "Bash(cat
|
|
23
|
-
- "Bash(cut
|
|
24
|
-
- "Bash(tr
|
|
25
|
-
- "Bash(nl
|
|
26
|
-
- "Bash(column
|
|
27
|
-
- "Bash(diff
|
|
28
|
-
- "Bash(cmp
|
|
29
|
-
- "Bash(jq
|
|
30
|
-
- "Bash(cloc
|
|
31
|
-
- "Bash(tokei
|
|
32
|
-
- "Bash(scc
|
|
33
|
-
- "Bash(basename
|
|
34
|
-
- "Bash(dirname
|
|
35
|
-
- "Bash(realpath
|
|
36
|
-
- "Bash(readlink
|
|
37
|
-
- "Bash(pwd
|
|
38
|
-
- "Bash(which
|
|
39
|
-
- "Bash(whereis
|
|
40
|
-
- "Bash(type
|
|
41
|
-
- "Bash(namei
|
|
42
|
-
- "Bash(git log
|
|
43
|
-
- "Bash(git show
|
|
44
|
-
- "Bash(git diff
|
|
45
|
-
- "Bash(git blame
|
|
46
|
-
- "Bash(git ls-files
|
|
47
|
-
- "Bash(git ls-tree
|
|
48
|
-
- "Bash(git grep
|
|
49
|
-
- "Bash(git status
|
|
50
|
-
- "Bash(git rev-list
|
|
51
|
-
- "Bash(git rev-parse
|
|
52
|
-
- "Bash(git for-each-ref
|
|
53
|
-
- "Bash(git reflog
|
|
54
|
-
- "Bash(git cat-file
|
|
55
|
-
- "Bash(git config --get
|
|
56
|
-
- "Bash(git config --list
|
|
57
|
-
- "Bash(git remote
|
|
58
|
-
- "Bash(git branch
|
|
59
|
-
- "Bash(git tag --list
|
|
60
|
-
- "Bash(git describe
|
|
61
|
-
- "Bash(git shortlog
|
|
62
|
-
- "Bash(find * -name
|
|
63
|
-
- "Bash(find * -type
|
|
64
|
-
- "Bash(find * -path
|
|
65
|
-
- "Bash(find * -maxdepth
|
|
66
|
-
- "Bash(find * -mindepth
|
|
67
|
-
- "Bash(find * -size
|
|
68
|
-
- "Bash(find * -mtime
|
|
69
|
-
- "Bash(find * -newer
|
|
70
|
-
- "Bash(git diff
|
|
71
|
-
- "Bash(git diff
|
|
72
|
-
- "Bash(git diff
|
|
73
|
-
- "Bash(git diff
|
|
74
|
-
- "Bash(git diff
|
|
75
|
-
- "Bash(git log
|
|
76
|
-
- "Bash(git log
|
|
77
|
-
- "Bash(git log
|
|
78
|
-
- "Bash(git show
|
|
79
|
-
- "Bash(git show
|
|
80
|
-
- "Bash(git grep
|
|
81
|
-
- "Bash(git grep
|
|
82
|
-
- "Bash(git ls-files
|
|
83
|
-
- "Bash(git ls-files
|
|
84
|
-
- "Bash(git ls-files
|
|
85
|
-
- "Bash(grep
|
|
86
|
-
- "Bash(grep
|
|
87
|
-
- "Bash(grep
|
|
88
|
-
- "Bash(grep
|
|
89
|
-
- "Bash(cat
|
|
90
|
-
- "Bash(cat
|
|
91
|
-
- "Bash(cat
|
|
92
|
-
- "Bash(cat
|
|
93
|
-
- "Bash(find
|
|
94
|
-
- "Bash(find
|
|
95
|
-
- "Bash(awk
|
|
96
|
-
- "Bash(sort
|
|
97
|
-
- "Bash(sort
|
|
10
|
+
- "Bash(wc *)"
|
|
11
|
+
- "Bash(ls *)"
|
|
12
|
+
- "Bash(tree *)"
|
|
13
|
+
- "Bash(file *)"
|
|
14
|
+
- "Bash(du *)"
|
|
15
|
+
- "Bash(stat *)"
|
|
16
|
+
- "Bash(grep *)"
|
|
17
|
+
- "Bash(awk *)"
|
|
18
|
+
- "Bash(head *)"
|
|
19
|
+
- "Bash(tail *)"
|
|
20
|
+
- "Bash(sort *)"
|
|
21
|
+
- "Bash(uniq *)"
|
|
22
|
+
- "Bash(cat *)"
|
|
23
|
+
- "Bash(cut *)"
|
|
24
|
+
- "Bash(tr *)"
|
|
25
|
+
- "Bash(nl *)"
|
|
26
|
+
- "Bash(column *)"
|
|
27
|
+
- "Bash(diff *)"
|
|
28
|
+
- "Bash(cmp *)"
|
|
29
|
+
- "Bash(jq *)"
|
|
30
|
+
- "Bash(cloc *)"
|
|
31
|
+
- "Bash(tokei *)"
|
|
32
|
+
- "Bash(scc *)"
|
|
33
|
+
- "Bash(basename *)"
|
|
34
|
+
- "Bash(dirname *)"
|
|
35
|
+
- "Bash(realpath *)"
|
|
36
|
+
- "Bash(readlink *)"
|
|
37
|
+
- "Bash(pwd *)"
|
|
38
|
+
- "Bash(which *)"
|
|
39
|
+
- "Bash(whereis *)"
|
|
40
|
+
- "Bash(type *)"
|
|
41
|
+
- "Bash(namei *)"
|
|
42
|
+
- "Bash(git log *)"
|
|
43
|
+
- "Bash(git show *)"
|
|
44
|
+
- "Bash(git diff *)"
|
|
45
|
+
- "Bash(git blame *)"
|
|
46
|
+
- "Bash(git ls-files *)"
|
|
47
|
+
- "Bash(git ls-tree *)"
|
|
48
|
+
- "Bash(git grep *)"
|
|
49
|
+
- "Bash(git status *)"
|
|
50
|
+
- "Bash(git rev-list *)"
|
|
51
|
+
- "Bash(git rev-parse *)"
|
|
52
|
+
- "Bash(git for-each-ref *)"
|
|
53
|
+
- "Bash(git reflog *)"
|
|
54
|
+
- "Bash(git cat-file *)"
|
|
55
|
+
- "Bash(git config --get *)"
|
|
56
|
+
- "Bash(git config --list *)"
|
|
57
|
+
- "Bash(git remote *)"
|
|
58
|
+
- "Bash(git branch *)"
|
|
59
|
+
- "Bash(git tag --list *)"
|
|
60
|
+
- "Bash(git describe *)"
|
|
61
|
+
- "Bash(git shortlog *)"
|
|
62
|
+
- "Bash(find * -name *)"
|
|
63
|
+
- "Bash(find * -type *)"
|
|
64
|
+
- "Bash(find * -path *)"
|
|
65
|
+
- "Bash(find * -maxdepth *)"
|
|
66
|
+
- "Bash(find * -mindepth *)"
|
|
67
|
+
- "Bash(find * -size *)"
|
|
68
|
+
- "Bash(find * -mtime *)"
|
|
69
|
+
- "Bash(find * -newer *)"
|
|
70
|
+
- "Bash(git diff * | awk *)"
|
|
71
|
+
- "Bash(git diff * | grep *)"
|
|
72
|
+
- "Bash(git diff * | head *)"
|
|
73
|
+
- "Bash(git diff * | tail *)"
|
|
74
|
+
- "Bash(git diff * | wc *)"
|
|
75
|
+
- "Bash(git log * | head *)"
|
|
76
|
+
- "Bash(git log * | grep *)"
|
|
77
|
+
- "Bash(git log * | wc *)"
|
|
78
|
+
- "Bash(git show * | head *)"
|
|
79
|
+
- "Bash(git show * | grep *)"
|
|
80
|
+
- "Bash(git grep * | head *)"
|
|
81
|
+
- "Bash(git grep * | wc *)"
|
|
82
|
+
- "Bash(git ls-files * | grep *)"
|
|
83
|
+
- "Bash(git ls-files * | head *)"
|
|
84
|
+
- "Bash(git ls-files * | wc *)"
|
|
85
|
+
- "Bash(grep * | head *)"
|
|
86
|
+
- "Bash(grep * | sort *)"
|
|
87
|
+
- "Bash(grep * | wc *)"
|
|
88
|
+
- "Bash(grep * | sort * | uniq *)"
|
|
89
|
+
- "Bash(cat * | grep *)"
|
|
90
|
+
- "Bash(cat * | awk *)"
|
|
91
|
+
- "Bash(cat * | head *)"
|
|
92
|
+
- "Bash(cat * | wc *)"
|
|
93
|
+
- "Bash(find * | head *)"
|
|
94
|
+
- "Bash(find * | wc *)"
|
|
95
|
+
- "Bash(awk * | head *)"
|
|
96
|
+
- "Bash(sort * | uniq *)"
|
|
97
|
+
- "Bash(sort * | head *)"
|
|
98
98
|
- "Agent"
|
|
99
99
|
- "Skill"
|
|
100
100
|
---
|
|
@@ -437,7 +437,6 @@ interface quality, quality attributes, and architecture governance.
|
|
|
437
437
|
Finally, output the following <template/> to give a final hint:
|
|
438
438
|
|
|
439
439
|
<template>
|
|
440
|
-
⧉ **ASE**: ☻ skill: **<skill-name/>**, ▶ status: **skill finished**
|
|
441
440
|
⧉ **ASE**: ↪ hint: **For deeper analysis, suggestions on solution approaches and then final source code changes, use `/ase-code-resolve P{n}` or `/ase-code-resolve T{n}` in the same or even a different session.**
|
|
442
441
|
</template>
|
|
443
442
|
</step>
|