@rse/ase 0.9.10 → 0.9.11

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 (29) hide show
  1. package/package.json +1 -1
  2. package/plugin/.claude-plugin/plugin.json +1 -1
  3. package/plugin/.github/plugin/plugin.json +1 -1
  4. package/plugin/package.json +1 -1
  5. package/plugin/skills/ase-arch-analyze/SKILL.md +6 -1
  6. package/plugin/skills/ase-arch-discover/SKILL.md +2 -2
  7. package/plugin/skills/ase-code-analyze/SKILL.md +12 -5
  8. package/plugin/skills/ase-code-craft/SKILL.md +5 -2
  9. package/plugin/skills/ase-code-explain/SKILL.md +6 -1
  10. package/plugin/skills/ase-code-insight/SKILL.md +6 -1
  11. package/plugin/skills/ase-code-lint/SKILL.md +9 -3
  12. package/plugin/skills/ase-code-refactor/SKILL.md +5 -2
  13. package/plugin/skills/ase-code-resolve/SKILL.md +12 -8
  14. package/plugin/skills/ase-docs-proofread/SKILL.md +9 -3
  15. package/plugin/skills/ase-meta-brainstorm/SKILL.md +3 -4
  16. package/plugin/skills/ase-meta-changelog/SKILL.md +16 -5
  17. package/plugin/skills/ase-meta-chat/SKILL.md +6 -1
  18. package/plugin/skills/ase-meta-commit/SKILL.md +5 -0
  19. package/plugin/skills/ase-meta-diaboli/SKILL.md +5 -1
  20. package/plugin/skills/ase-meta-diff/SKILL.md +1 -1
  21. package/plugin/skills/ase-meta-evaluate/SKILL.md +20 -12
  22. package/plugin/skills/ase-meta-persona/SKILL.md +6 -1
  23. package/plugin/skills/ase-meta-quorum/SKILL.md +15 -3
  24. package/plugin/skills/ase-meta-steelman/SKILL.md +5 -1
  25. package/plugin/skills/ase-task-delete/SKILL.md +6 -1
  26. package/plugin/skills/ase-task-grill/SKILL.md +30 -9
  27. package/plugin/skills/ase-task-id/SKILL.md +10 -3
  28. package/plugin/skills/ase-task-reboot/SKILL.md +2 -2
  29. package/plugin/skills/ase-task-rename/SKILL.md +15 -1
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.10",
9
+ "version": "0.9.11",
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.9.10",
3
+ "version": "0.9.11",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.10",
3
+ "version": "0.9.11",
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.9.10",
9
+ "version": "0.9.11",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -101,14 +101,19 @@ allowed-tools:
101
101
 
102
102
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
103
103
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
104
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
104
105
 
105
106
  <skill name="ase-arch-analyze">
106
107
  Review Software Architecture
107
108
  </skill>
108
109
 
110
+ <expand name="getopt" arg1="ase-arch-analyze">
111
+ $ARGUMENTS
112
+ </expand>
113
+
109
114
  <objective>
110
115
  With the mindset of an *expert-level software architect*,
111
- *review* the *software architecture* of $ARGUMENTS, and its directly
116
+ *review* the *software architecture* of <getopt-arguments/>, and its directly
112
117
  related source code, for *potential problems* across component
113
118
  boundaries, structural organization, architecture principles,
114
119
  interface quality, quality attributes, and architecture governance.
@@ -52,8 +52,8 @@ for the technology stack to *provide* the *needed functionality*
52
52
  Functionality: Which functionality should the components provide?
53
53
  <answer-1/>: (grounded candidate functionality 1)
54
54
  <answer-2/>: (grounded candidate functionality 2)
55
- <answer-3/>: (grounded candidate functionality 2)
56
- <answer-4/>: (grounded candidate functionality 3)
55
+ <answer-3/>: (grounded candidate functionality 3)
56
+ <answer-4/>: (grounded candidate functionality 4)
57
57
  </expand>
58
58
 
59
59
  Then use the <result/> and its corresponding grounded candidate
@@ -40,7 +40,8 @@ problems in *performance* and *efficiency*, or problems in *security*.
40
40
 
41
41
  <if condition="<getopt-option-performance/> is equal `true` and <getopt-option-security/> is equal `true`">
42
42
 
43
- Only output the following <template/> and then *STOP* immediately:
43
+ Only output the following <template/> and then *STOP* the entire flow
44
+ (do not perform any further steps):
44
45
 
45
46
  <template>
46
47
  ⧉ **ASE**: ✪ skill: **ase-code-analyze**, ▶ ERROR: options `--performance` and `--security` are mutually exclusive
@@ -146,10 +147,12 @@ problems in *performance* and *efficiency*, or problems in *security*.
146
147
  than or equal to `rank(<getopt-option-severity/>)`; *silently drop*
147
148
  all other problems (they are neither reported nor persisted). With
148
149
  the default floor `LOW`, all problems are kept. `ACCEPTED` problems
149
- are *never* dropped. Then renumber the surviving problems
150
- contiguously as `P<n/>` with <n/> = 1, 2, ... in the original
151
- ordering. If *all* problems are dropped, skip the per-problem report
152
- but still emit the final hint <template/> below.
150
+ are *never* dropped.
151
+
152
+ Then renumber the surviving problems contiguously as `P<n/>` with
153
+ <n/> = 1, 2, ... in the original ordering. If *all* problems are
154
+ dropped, skip the per-problem report but still emit the final hint
155
+ <template/> below.
153
156
 
154
157
  In this STEP 3, for *EVERY* surviving problem, immediately report
155
158
  it with the following output <template/>, based on concise bullet
@@ -209,6 +212,10 @@ problems in *performance* and *efficiency*, or problems in *security*.
209
212
  justified trade-off that should remain on record but is never
210
213
  dropped by the severity floor (see STEP 3).
211
214
 
215
+ - For <title/> ultra-compress the <description/> to a concise,
216
+ short, single sentence. Keep one inline reference to the code
217
+ position which is most relevant to the problem.
218
+
212
219
  - <if condition="<getopt-option-performance/> is equal `true`">
213
220
  In <evidence/>, ground the finding by citing either the inferred
214
221
  *Big-O* time/space complexity (e.g. `O(n²)` reducible to `O(n)`)
@@ -343,11 +343,14 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
343
343
  Hand off to `ase-task-edit`.
344
344
  <if condition="<head/> is equal `EDIT`">
345
345
  Consume the head: set <getopt-option-next/> to the remaining
346
- tokens (joined back with `,`, or `none` if empty).
346
+ tokens (joined back with `,`, or `none` if empty). `EDIT`
347
+ is this skill's own dispatch token, *not* part of
348
+ `ase-task-edit`'s `--next` vocabulary, so it must be
349
+ stripped here rather than forwarded.
347
350
  </if>
348
351
  All remaining tokens are `ase-task-edit`'s own vocabulary
349
352
  and are forwarded verbatim, so `ase-task-edit` consumes its
350
- head itself.
353
+ own head itself.
351
354
  <if condition="<getopt-option-next/> is not equal `none`">
352
355
  Set <args><args/> --next <getopt-option-next/></args>
353
356
  </if>
@@ -14,13 +14,18 @@ allowed-tools:
14
14
 
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
16
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
17
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
17
18
 
18
19
  <skill name="ase-code-explain">
19
20
  Explain Source Code
20
21
  </skill>
21
22
 
23
+ <expand name="getopt" arg1="ase-code-explain">
24
+ $ARGUMENTS
25
+ </expand>
26
+
22
27
  <objective>
23
- *Analyze* the source code of $ARGUMENTS, and its directly related source
28
+ *Analyze* the source code of <getopt-arguments/>, and its directly related source
24
29
  code and *explain* it in a *brief*, *standardized*, and *concise* way.
25
30
  </objective>
26
31
 
@@ -18,13 +18,18 @@ allowed-tools:
18
18
 
19
19
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
20
20
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
21
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
21
22
 
22
23
  <skill name="ase-code-insight">
23
24
  Project Insight
24
25
  </skill>
25
26
 
27
+ <expand name="getopt" arg1="ase-code-insight">
28
+ $ARGUMENTS
29
+ </expand>
30
+
26
31
  <objective>
27
- Give *insights* into the project through the source code of $ARGUMENTS.
32
+ Give *insights* into the project through the source code of <getopt-arguments/>.
28
33
  </objective>
29
34
 
30
35
  <flow>
@@ -248,9 +248,15 @@ related to a set of code quality aspects.
248
248
  - <if condition="<result/> starts with 'OTHER'">
249
249
  Generate a *new* proposal for the *same* <item/>
250
250
  (incorporating the user's free-text hint from <result/> if
251
- provided via the "OTHER" prefix) and loop back to substep 2
252
- of this iteration. There is *no* cap on refinement rounds -
253
- keep refining until the user picks `ACCEPT` or `REJECT`.
251
+ provided via the "OTHER" prefix). *Reassign* <description/>
252
+ and <change-set/> to reflect this refined proposal (each
253
+ change-hunk's `old_text` stays anchored to the existing
254
+ text at its `file`:`line`; `new_text` carries the
255
+ refinement) so that the substep 2/3 rebuild renders the new
256
+ <diff/> and any `Edit` applies the new proposal rather than
257
+ the original. Then loop back to substep 2 of this iteration.
258
+ There is *no* cap on refinement rounds - keep refining until
259
+ the user picks `ACCEPT` or `REJECT`.
254
260
  </if>
255
261
 
256
262
  - <if condition="
@@ -332,11 +332,14 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
332
332
  Hand off to `ase-task-edit`.
333
333
  <if condition="<head/> is equal `EDIT`">
334
334
  Consume the head: set <getopt-option-next/> to the remaining
335
- tokens (joined back with `,`, or `none` if empty).
335
+ tokens (joined back with `,`, or `none` if empty). `EDIT`
336
+ is this skill's own dispatch token, *not* part of
337
+ `ase-task-edit`'s `--next` vocabulary, so it must be
338
+ stripped here rather than forwarded.
336
339
  </if>
337
340
  All remaining tokens are `ase-task-edit`'s own vocabulary
338
341
  and are forwarded verbatim, so `ase-task-edit` consumes its
339
- head itself.
342
+ own head itself.
340
343
  <if condition="<getopt-option-next/> is not equal `none`">
341
344
  Set <args><args/> --next <getopt-option-next/></args>
342
345
  </if>
@@ -60,14 +60,15 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
60
60
  1. If <problem/> matches the regexp `^[PT]\d+$` (i.e. a bare issue
61
61
  identifier like `P1`, `P2`, `T1`, `T2`, ...),
62
62
  set <problem-id><problem/></problem-id> and
63
- <ase-task-id><problem/></ase-task-id>, call the `ase_task_id(id:
64
- "<ase-task-id/>", session: "<ase-session-id/>")` tool from the
65
- `ase` MCP server to implicitly switch the task, and then
66
- call the `ase_kv_get(key: "ase-issue-<problem-id/>")` tool of
63
+ <ase-task-id><problem/></ase-task-id>, then call the
64
+ `ase_kv_get(key: "ase-issue-<problem-id/>")` tool of
67
65
  the `ase` MCP server to retrieve the previously persisted
68
66
  problem description. If the returned `text` is non-empty, set
69
- <problem><text/></problem>, otherwise complain to the user that
70
- no analyzer result exists for <problem-id/> and stop processing.
67
+ <problem><text/></problem> and call the `ase_task_id(id:
68
+ "<ase-task-id/>", session: "<ase-session-id/>")` tool from the
69
+ `ase` MCP server to implicitly switch the task, otherwise
70
+ complain to the user that no analyzer result exists for
71
+ <problem-id/> and stop processing.
71
72
 
72
73
  2. <if condition="
73
74
  <problem/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`
@@ -389,11 +390,14 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
389
390
  Hand off to `ase-task-edit`.
390
391
  <if condition="<head/> is equal `EDIT`">
391
392
  Consume the head: set <getopt-option-next/> to the remaining
392
- tokens (joined back with `,`, or `none` if empty).
393
+ tokens (joined back with `,`, or `none` if empty). `EDIT`
394
+ is this skill's own dispatch token, *not* part of
395
+ `ase-task-edit`'s `--next` vocabulary, so it must be
396
+ stripped here rather than forwarded.
393
397
  </if>
394
398
  All remaining tokens are `ase-task-edit`'s own vocabulary
395
399
  and are forwarded verbatim, so `ase-task-edit` consumes its
396
- head itself.
400
+ own head itself.
397
401
  <if condition="<getopt-option-next/> is not equal `none`">
398
402
  Set <args><args/> --next <getopt-option-next/></args>
399
403
  </if>
@@ -188,9 +188,15 @@ Analyze documents for spelling, punctuation, or grammar errors
188
188
 
189
189
  Generate a *new* proposal for the *same* <item/>,
190
190
  incorporating the user's free-text hint from <result/>
191
- after the "OTHER:" prefix, and *go back* to substep 2 of
192
- this `for`-iteration. There is *no* cap on refinement rounds -
193
- keep refining until the user picks `ACCEPT` or `REJECT`.
191
+ after the "OTHER:" prefix. *Reassign* <description/>,
192
+ <old-text/>, and <new-text/> to reflect this refined
193
+ proposal (<old-text/> stays anchored to the existing text
194
+ at <file/>:<line/>; <new-text/> and <description/> carry the
195
+ refinement) so the subsequent rendering and any `Edit` use
196
+ the new proposal rather than the original. Then *go back* to
197
+ substep 2 of this `for`-iteration. There is *no* cap on
198
+ refinement rounds - keep refining until the user picks
199
+ `ACCEPT` or `REJECT`.
194
200
 
195
201
  </if>
196
202
 
@@ -129,10 +129,9 @@ Honor the following tenets throughout the brainstorming:
129
129
 
130
130
  <expand name="custom-dialog" arg1="--other">
131
131
  <facet-M/>: <question-M/>
132
- <answer-M-1/>: (first grounded candidate answer)
133
- <answer-M-2/>: (second grounded candidate answer)
134
- <answer-M-3/>: (third grounded candidate answer)
135
- <answer-M-4/>: (fourth grounded candidate answer)
132
+ <answer-M-1/>: (grounded candidate answer 1)
133
+ <answer-M-2/>: (grounded candidate answer 2)
134
+ [...]
136
135
  </expand>
137
136
 
138
137
  4. Dispatch on the dialog <result/>:
@@ -16,11 +16,16 @@ allowed-tools:
16
16
 
17
17
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
18
18
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
19
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
19
20
 
20
21
  <skill name="ase-meta-changelog">
21
22
  Update ChangeLog Entries
22
23
  </skill>
23
24
 
25
+ <expand name="getopt" arg1="ase-meta-changelog">
26
+ $ARGUMENTS
27
+ </expand>
28
+
24
29
  <objective>
25
30
  Help to complete, consolidate and sort *ChangeLog* entries of the most
26
31
  recent *ChangeLog* section, based on underlying *Git* commits and staged
@@ -81,11 +86,17 @@ Processing
81
86
  the Git *commits* plus the currently already staged changes in the Git
82
87
  *index*, but *ignore* the Git *stash* and still unstaged changes.
83
88
 
84
- For finding the corresponding Git *commits*, use the `N.M.K` from the
85
- *second* level-2 header in the *ChangeLog* file as the corresponding
86
- Git tag and then check all Git commits between `HEAD` and this tag
87
- with the command `git log N.M.K..HEAD --numstat --pretty=format:'%h:
88
- %s'`.
89
+ For finding the corresponding Git *commits*, first determine the
90
+ correct baseline Git tag. Take the `N.M.K` from the *first* (most
91
+ recent) level-2 header in the *ChangeLog* file and check whether a
92
+ corresponding Git tag already exists with the command `git tag --list
93
+ N.M.K`. If this command produces *no* output, the first section is
94
+ still in-progress/untagged, so use the `N.M.K` from the *second*
95
+ level-2 header as the baseline tag instead. If this command *does*
96
+ produce output, the first section is already released/tagged, so use
97
+ the `N.M.K` from the *first* level-2 header as the baseline tag. Then
98
+ check all Git commits between `HEAD` and this baseline tag with the
99
+ command `git log N.M.K..HEAD --numstat --pretty=format:'%h: %s'`.
89
100
 
90
101
  For finding the corresponding staged Git *changes* in the Git
91
102
  *index*, use the command `git diff --cached --numstat`, but silently
@@ -14,13 +14,18 @@ allowed-tools:
14
14
 
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
16
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
17
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
17
18
 
18
19
  <skill name="ase-meta-chat">
19
20
  Query Foreign LLM for Chat
20
21
  </skill>
21
22
 
23
+ <expand name="getopt" arg1="ase-meta-chat">
24
+ $ARGUMENTS
25
+ </expand>
26
+
22
27
  <objective>
23
- Query foreign LLM for: <query>$ARGUMENTS</query>
28
+ Query foreign LLM for: <query><getopt-arguments/></query>
24
29
  </objective>
25
30
 
26
31
  1. You *MUST* *NOT* output anything in this step.
@@ -12,11 +12,16 @@ allowed-tools:
12
12
 
13
13
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
15
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
15
16
 
16
17
  <skill name="ase-meta-commit">
17
18
  Git Commit
18
19
  </skill>
19
20
 
21
+ <expand name="getopt" arg1="ase-meta-commit">
22
+ $ARGUMENTS
23
+ </expand>
24
+
20
25
  <objective>
21
26
  Help to *craft* a *concise commit message* for the
22
27
  currently staged Git changes.
@@ -120,7 +120,11 @@ to <getopt-option-count/>; if <getopt-option-count/> is *non-numeric* or
120
120
  Anti-Theses or Counter-Arguments until you EITHER have found at
121
121
  least <count/> Anti-Theses or Counter-Arguments with at least a rank
122
122
  of 7 OR you have already checked a total of <count/> x 5 Anti-Theses
123
- or Counter-Arguments.
123
+ or Counter-Arguments. If the second condition is reached first and
124
+ fewer than <count/> Anti-Theses or Counter-Arguments reached a rank
125
+ of at least 7, nevertheless surface the <count/> highest-ranked ones
126
+ found so far, because <count/> is the *minimum* number of
127
+ Anti-Theses to surface.
124
128
 
125
129
  Then, for the top-<count/> highest-ranked Anti-Theses or
126
130
  Counter-Arguments, sort them by their rank from highest to lowest,
@@ -109,7 +109,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
109
109
 
110
110
  3. For each discovered *intent group*, emit the following row
111
111
  <template/>, where <intent/> is the intent label, <changes/>
112
- is the total number of lines changed per feature in format
112
+ is the total number of lines changed per intent group in format
113
113
  `+N/-M`, <files/> is the list of affected file references,
114
114
  and <description/> is a *brief* one-to-two-sentence
115
115
  narrative of what changed and why:
@@ -13,11 +13,16 @@ effort: high
13
13
 
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
16
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
16
17
 
17
18
  <skill name="ase-meta-evaluate">
18
19
  Evaluate Alternatives
19
20
  </skill>
20
21
 
22
+ <expand name="getopt" arg1="ase-meta-evaluate">
23
+ $ARGUMENTS
24
+ </expand>
25
+
21
26
  <objective>
22
27
  *Evaluate* *alternatives* through a weighted
23
28
  multi-*criteria* decision matrix.
@@ -25,7 +30,7 @@ multi-*criteria* decision matrix.
25
30
 
26
31
  <flow>
27
32
  1. <step id="STEP 1: Determine Reason">
28
- - From the <request>$ARGUMENTS</request>, try to derive the overall
33
+ - From the <request><getopt-arguments/></request>, try to derive the overall
29
34
  reason <reason/> for the evaluation. If no such reason can be
30
35
  derived, assume <reason>generic comparison</reason>.
31
36
 
@@ -38,7 +43,7 @@ multi-*criteria* decision matrix.
38
43
  </step>
39
44
 
40
45
  2. <step id="STEP 2: Determine Alternatives">
41
- - From the <request>$ARGUMENTS</request> derive the two or more
46
+ - From the <request><getopt-arguments/></request> derive the two or more
42
47
  alternatives <alternative-K/> (K=1-N) the user wants to be
43
48
  evaluated. Do not output anything.
44
49
 
@@ -105,7 +110,7 @@ multi-*criteria* decision matrix.
105
110
  </step>
106
111
 
107
112
  3. <step id="STEP 3: Derive Criteria">
108
- - From the <request>$ARGUMENTS</request>, try to derive the criteria
113
+ - From the <request><getopt-arguments/></request>, try to derive the criteria
109
114
  <criteria-L/> (L=1-M) for the evaluation. Do not output anything.
110
115
 
111
116
  - For each criterion <criteria-L/> (L=1-M), decide on its <weight-L/>
@@ -222,23 +227,26 @@ multi-*criteria* decision matrix.
222
227
  ⚠ *Please give some hints on the criteria to ensure a single best alternative!*
223
228
  </template>
224
229
 
225
- - Otherwise, if <percentage/> is less than 0.10, stop the flow after
226
- you output just the following <template/> and do not output anything
227
- else:
230
+ - Otherwise, if <rating-K/> is less than zero (i.e. all alternatives
231
+ rate negatively and the "best" is merely the least-bad), stop the
232
+ flow after you output just the following <template/> and do not
233
+ output anything else. This all-negative check is evaluated *before*
234
+ the small-distance check below, so that an all-negative alternative
235
+ set with a small winning gap surfaces the all-negative warning rather
236
+ than being masked by the small-distance branch:
228
237
 
229
238
  <template>
230
239
  <ase-tpl-bullet-signal/> **BEST ALTERNATIVE**: ⚑ **<alternative-K/>**
231
- ⚠ *ATTENTION: small distance to second best alternative!*
240
+ ⚠ *ATTENTION: all alternatives rate negatively; this is the least-bad choice, not a strong winner!*
232
241
  </template>
233
242
 
234
- - Otherwise, if <rating-K/> is less than zero (i.e. all alternatives
235
- rate negatively and the "best" is merely the least-bad), stop the
236
- flow after you output just the following <template/> and do not
237
- output anything else:
243
+ - Otherwise, if <percentage/> is less than 0.10, stop the flow after
244
+ you output just the following <template/> and do not output anything
245
+ else:
238
246
 
239
247
  <template>
240
248
  <ase-tpl-bullet-signal/> **BEST ALTERNATIVE**: ⚑ **<alternative-K/>**
241
- ⚠ *ATTENTION: all alternatives rate negatively; this is the least-bad choice, not a strong winner!*
249
+ ⚠ *ATTENTION: small distance to second best alternative!*
242
250
  </template>
243
251
 
244
252
  - Otherwise (<percentage/> is greater than or equal to 0.10), output
@@ -15,18 +15,23 @@ effort: high
15
15
 
16
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
17
17
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
18
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
18
19
 
19
20
  <skill name="ase-meta-persona">
20
21
  Persona Configuration
21
22
  </skill>
22
23
 
24
+ <expand name="getopt" arg1="ase-meta-persona">
25
+ $ARGUMENTS
26
+ </expand>
27
+
23
28
  <objective>
24
29
  *Configure* the *persona style* of the agent to adjust the communication
25
30
  style and token usage intensity.
26
31
  </objective>
27
32
 
28
33
  1. Determine request:
29
- <request>$ARGUMENTS</request>
34
+ <request><getopt-arguments/></request>
30
35
  Do not output anything.
31
36
 
32
37
  2. <if condition="<request/> is empty">
@@ -134,9 +134,17 @@ by querying *multiple* AIs for an *optimal consensus*.
134
134
 
135
135
  4. <step id="STEP 4: Determine Consensus Rating">
136
136
 
137
- Determine, on a Likert scale of 0..<n/>, the amount of the overall
138
- consensus <c/> of all the responses. The <n/> is the *total number of
139
- responders* (yourself plus all available foreign AIs above).
137
+ First, count the number of *available foreign AIs* (those queried in
138
+ STEP 2 which did *not* return an `ERROR:` response). If this count is
139
+ *zero* -- i.e., every foreign AI errored out or none were reachable
140
+ and only yourself (Anthropic Claude) remains -- a quorum is *not*
141
+ possible. In this case, set <c></c> and <n></n> to empty and instead
142
+ set <disagreement/> to `(no quorum: no foreign AIs were available)`,
143
+ then skip the rest of this step.
144
+
145
+ Otherwise, determine, on a Likert scale of 0..<n/>, the amount of the
146
+ overall consensus <c/> of all the responses. The <n/> is the *total
147
+ number of responders* (yourself plus all available foreign AIs above).
140
148
  If all responses disagree, the consensus <c/> is zero.
141
149
  If all responses agree, <c/> is <n/>.
142
150
 
@@ -165,6 +173,10 @@ by querying *multiple* AIs for an *optimal consensus*.
165
173
 
166
174
  **CONSENSUS RATE**: **<c/>/<n/>** <disagreement/>
167
175
 
176
+ When a quorum was *not* possible (see STEP 4), render this line
177
+ instead as just `**CONSENSUS RATE**: *n/a* <disagreement/>` (omitting
178
+ the `<c/>/<n/>` fraction), as a single AI cannot form a consensus.
179
+
168
180
  &#x25CB; **Anthropic Claude**:
169
181
  - [...]
170
182
  - [...]
@@ -142,7 +142,11 @@ to <getopt-option-count/>; if <getopt-option-count/> is *non-numeric* or
142
142
  more Pro-Theses or Supporting-Arguments until you EITHER have found
143
143
  at least <count/> Pro-Theses or Supporting-Arguments with at least a
144
144
  rank of 7 OR you have already checked a total of <count/> x 5
145
- Pro-Theses or Supporting-Arguments.
145
+ Pro-Theses or Supporting-Arguments. If the second condition is
146
+ reached first and fewer than <count/> Pro-Theses or
147
+ Supporting-Arguments reached a rank of at least 7, nevertheless
148
+ surface the <count/> highest-ranked ones found so far, because
149
+ <count/> is the *minimum* number of Pro-Theses to surface.
146
150
 
147
151
  Then, for the top-<count/> highest-ranked Pro-Theses or
148
152
  Supporting-Arguments, sort them by their rank from highest to lowest,
@@ -12,11 +12,16 @@ effort: high
12
12
 
13
13
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
15
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
15
16
 
16
17
  <skill name="ase-task-delete">
17
18
  Delete a Task Plan
18
19
  </skill>
19
20
 
21
+ <expand name="getopt" arg1="ase-task-delete">
22
+ $ARGUMENTS
23
+ </expand>
24
+
20
25
  <objective>
21
26
  *Delete* the task plan.
22
27
  </objective>
@@ -32,7 +37,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
32
37
 
33
38
  1. **Determine Task:**
34
39
 
35
- 1. Set <id>$ARGUMENTS</id> initially, with any leading and trailing
40
+ 1. Set <id><getopt-arguments/></id> initially, with any leading and trailing
36
41
  whitespace stripped.
37
42
  Inherit the always existing <ase-task-id/> from the current context.
38
43
  Inherit the always existing <ase-session-id/> from the current context.
@@ -175,14 +175,32 @@ explicitly requested by this procedure via outputs based on a <template/>!
175
175
 
176
176
  2. Check the code base and your world knowledge and
177
177
  use this information to find *up to three* grounded
178
- alternative answers <answer-N-K/> (K={2,3,4}).
179
-
180
- 3. Use an interactive user dialog
181
- with header <aspect-N/> and question <question-N/>, and
182
- let the user select the <answer-N/> out of <answer-N-K/>
183
- (K={1..4}). In this dialog, mark the <answer-N-1/> by
184
- appending ` ⚝ **CURRENT PLAN** ⚝` to its option name (not the
185
- description).
178
+ alternative answers <answer-N-K/> (K={2,3,4}), so there
179
+ are between two and four answer options in total.
180
+
181
+ 3. In the following, you *MUST* *NOT* use the
182
+ <user-dialog-tool/> tool! Instead, you *MUST* just show a
183
+ custom output, let the user enter input, and then you set
184
+ the result accordingly.
185
+
186
+ Let the user select the <answer-N/> out of the answer
187
+ alternatives <answer-N-K/> by raising a question with the
188
+ following custom dialog, where per alternative <answer-N-K/>
189
+ you determine a brief label <answer-N-K-label/> and a
190
+ description <answer-N-K-description/>, and you mark the
191
+ <answer-N-1/> by prefixing its description with
192
+ `⚝ **CURRENT PLAN** ⚝ `. Emit only the answer lines for the
193
+ alternatives <answer-N-K/> you actually determined in the
194
+ previous step (between two and four lines in total):
195
+
196
+ <expand name="custom-dialog" arg1="--other">
197
+ <aspect-N/>: <question-N/>
198
+ <answer-N-1-label/>: ⚝ **CURRENT PLAN** ⚝ <answer-N-1-description/>
199
+ <answer-N-K-label/>: <answer-N-K-description/>
200
+ [...]
201
+ </expand>
202
+
203
+ Set <answer-N/> to the selected <result/>.
186
204
 
187
205
  4. Output the following <template/>:
188
206
 
@@ -199,7 +217,10 @@ explicitly requested by this procedure via outputs based on a <template/>!
199
217
 
200
218
  4. Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
201
219
  `ase` MCP server and use the `text` field of its response for
202
- <timestamp-modified/> information. Then insert the current
220
+ <timestamp-modified/> information. If <timestamp-created/> is
221
+ still unset (because the previous <plan/> had no `Created:`
222
+ line), set <timestamp-created><timestamp-modified/></timestamp-created>
223
+ (fall back to the modified timestamp). Then insert the current
203
224
  <ase-task-id/>, previous <timestamp-created/>, and refreshed
204
225
  <timestamp-modified/> information and calculate the number of
205
226
  words <words/> of <plan/>.
@@ -12,17 +12,23 @@ effort: high
12
12
 
13
13
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
15
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
15
16
 
16
17
  <skill name="ase-task-id">
17
18
  Configure Task Id
18
19
  </skill>
19
20
 
21
+ <expand name="getopt" arg1="ase-task-id">
22
+ $ARGUMENTS
23
+ </expand>
24
+
20
25
  <objective>
21
26
  *Get* or *set* the unique *task id* of the current session.
22
27
  </objective>
23
28
 
24
29
  1. Determine request:
25
- <request>$ARGUMENTS</request>
30
+ <request><getopt-arguments/></request>
31
+ Inherit the always existing <ase-session-id/> from the current context.
26
32
 
27
33
  2. <if condition="<request/> is NOT empty AND <request/> does NOT match the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`">
28
34
  Only output the following <template/> and then immediately
@@ -35,8 +41,9 @@ Configure Task Id
35
41
 
36
42
  3. <if condition="<request/> is empty">
37
43
  - Call the `ase_task_id(session: "<ase-session-id/>")`
38
- tool from the `ase` MCP server and set
39
- <ase-task-id/> to its `text` output.
44
+ tool from the `ase` MCP server and set <text/> to its
45
+ `text` output. Check the response as mandated above; only
46
+ on a clean response set <ase-task-id><text/></ase-task-id>.
40
47
 
41
48
  - Output:
42
49
  <template>
@@ -119,10 +119,10 @@ explicitly requested by this procedure via outputs based on a <template/>!
119
119
  Set <instruction><text/></instruction> (set instruction to extracted text).
120
120
  </if>
121
121
 
122
- 5. <elseif condition="<content/> contains '- **WHY**: <text/>' and <instruction/> is NOT empty">
122
+ 5. <if condition="<content/> contains '- **WHY**: <text/>' and <instruction/> is NOT empty">
123
123
  Set <instruction><instruction/>, BECAUSE <text/></instruction>
124
124
  (append extracted text to instruction).
125
- </elseif>
125
+ </if>
126
126
 
127
127
  6. <if condition="<content/> contains 'Created: <text/>'">
128
128
  Set <timestamp-created><text/></timestamp-created> (set
@@ -12,11 +12,16 @@ effort: high
12
12
 
13
13
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
15
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
15
16
 
16
17
  <skill name="ase-task-rename">
17
18
  Rename a Task Plan
18
19
  </skill>
19
20
 
21
+ <expand name="getopt" arg1="ase-task-rename">
22
+ $ARGUMENTS
23
+ </expand>
24
+
20
25
  <objective>
21
26
  *Rename* the task plan.
22
27
  </objective>
@@ -32,7 +37,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
32
37
 
33
38
  1. **Determine Task:**
34
39
 
35
- 1. Parse <arguments>$ARGUMENTS</arguments> into a whitespace-separated
40
+ 1. Parse <arguments><getopt-arguments/></arguments> into a whitespace-separated
36
41
  list of tokens. Inherit the always existing <ase-task-id/> and
37
42
  <ase-session-id/> from the current context. Do not output anything.
38
43
 
@@ -57,6 +62,15 @@ explicitly requested by this procedure via outputs based on a <template/>!
57
62
  </template>
58
63
  </if>
59
64
 
65
+ 5. <if condition="<old/> does NOT match the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$` OR <new/> does NOT match the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`">
66
+ Only output the following <template/> and then immediately
67
+ *STOP* processing the entire current skill:
68
+
69
+ <template>
70
+ ⧉ **ASE**: ☻ skill: **ase-task-rename**, ▶ ERROR: invalid task id (expected `^[a-zA-Z][a-zA-Z0-9_-]*$`)
71
+ </template>
72
+ </if>
73
+
60
74
  2. **Perform Operation**:
61
75
 
62
76
  1. Call the `ase_task_rename(old: "<old/>", new: "<new/>")` tool of the