@rse/ase 0.9.9 → 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 (40) 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/meta/ase-dialog.md +52 -24
  5. package/plugin/meta/ase-format-arch.md +3 -3
  6. package/plugin/meta/ase-format-spec.md +13 -4
  7. package/plugin/meta/ase-getopt.md +11 -7
  8. package/plugin/meta/ase-skill.md +17 -10
  9. package/plugin/package.json +1 -1
  10. package/plugin/skills/ase-arch-analyze/SKILL.md +6 -1
  11. package/plugin/skills/ase-arch-discover/SKILL.md +9 -6
  12. package/plugin/skills/ase-code-analyze/SKILL.md +12 -5
  13. package/plugin/skills/ase-code-craft/SKILL.md +20 -16
  14. package/plugin/skills/ase-code-explain/SKILL.md +6 -1
  15. package/plugin/skills/ase-code-insight/SKILL.md +11 -5
  16. package/plugin/skills/ase-code-lint/SKILL.md +16 -10
  17. package/plugin/skills/ase-code-refactor/SKILL.md +20 -16
  18. package/plugin/skills/ase-code-resolve/SKILL.md +27 -22
  19. package/plugin/skills/ase-docs-proofread/SKILL.md +16 -10
  20. package/plugin/skills/ase-meta-brainstorm/SKILL.md +26 -10
  21. package/plugin/skills/ase-meta-changelog/SKILL.md +16 -5
  22. package/plugin/skills/ase-meta-chat/SKILL.md +6 -1
  23. package/plugin/skills/ase-meta-commit/SKILL.md +5 -0
  24. package/plugin/skills/ase-meta-diaboli/SKILL.md +9 -5
  25. package/plugin/skills/ase-meta-diff/SKILL.md +1 -1
  26. package/plugin/skills/ase-meta-evaluate/SKILL.md +20 -12
  27. package/plugin/skills/ase-meta-persona/SKILL.md +6 -1
  28. package/plugin/skills/ase-meta-quorum/SKILL.md +15 -3
  29. package/plugin/skills/ase-meta-search/SKILL.md +9 -1
  30. package/plugin/skills/ase-meta-steelman/SKILL.md +5 -1
  31. package/plugin/skills/ase-meta-why/SKILL.md +6 -4
  32. package/plugin/skills/ase-task-condense/SKILL.md +5 -4
  33. package/plugin/skills/ase-task-delete/SKILL.md +6 -1
  34. package/plugin/skills/ase-task-edit/SKILL.md +10 -8
  35. package/plugin/skills/ase-task-grill/SKILL.md +35 -13
  36. package/plugin/skills/ase-task-id/SKILL.md +10 -3
  37. package/plugin/skills/ase-task-implement/SKILL.md +5 -4
  38. package/plugin/skills/ase-task-preflight/SKILL.md +5 -4
  39. package/plugin/skills/ase-task-reboot/SKILL.md +7 -6
  40. 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.9",
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.9",
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.9",
3
+ "version": "0.9.11",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -11,6 +11,7 @@ User Dialog
11
11
  </if>
12
12
 
13
13
  <define name="user-dialog">
14
+
14
15
  Let the *user interactively choose* an answer.
15
16
 
16
17
  1. Take the following question specification:
@@ -140,13 +141,17 @@ Let the *user interactively choose* an answer.
140
141
  </define>
141
142
 
142
143
  <define name="custom-dialog">
143
- Let the *user interactively choose* an answer.
144
+
145
+ In the following, you *MUST* *NOT* use the <user-dialog-tool/> tool!
146
+ Instead, you *MUST* just show a custom output, let the user enter input,
147
+ and then you set the result accordingly. For this, closely follow the
148
+ following procedure:
144
149
 
145
150
  1. Take the following question specification:
151
+ <spec><content/></spec>
146
152
 
147
- <spec>
148
- <content/>
149
- </spec>
153
+ Take the following options:
154
+ <opts><arg1/></opts>
150
155
 
151
156
  The first line of <spec/> (separated by newlines) is of the format:
152
157
  `<question-label/>: <question-description/>`
@@ -166,13 +171,17 @@ Let the *user interactively choose* an answer.
166
171
 
167
172
  Set <text></text> (set to empty).
168
173
  Set <keys></keys> (set to empty).
169
- Set <n>1</n> (set entry count to one).
170
- Set <width/> to the maximum length plus 3 of all <label/> strings in <spec/>.
174
+ Set <n>0</n> (set entry count to zero).
175
+ Set <width/> to the maximum length plus 3 of the <label/> strings in the
176
+ contiguous answer lines of <spec/> starting at line 2 (the answer labels only,
177
+ excluding the question label on line 1, and stopping at the first missing line --
178
+ the same lines the entry loop below renders).
171
179
 
172
180
  <for items="2 3 4 5 6 7 8 9">
173
181
  Take from <spec/> the line number <item/>.
174
182
  If this line does not exist, <break/>.
175
183
  If this line exists, parse it according to the format `<label/>: <description/>`.
184
+ Set <n/> to <n/> + 1 (increment entry count).
176
185
  Set <label-key/> to <ase-tpl-key digit="<n/>"/>.
177
186
  Set <label-text/> to `<ase-tpl-pad width="<width/>" text="<label/>:"/>`.
178
187
  Append an entry to <text/>:
@@ -182,7 +191,6 @@ Let the *user interactively choose* an answer.
182
191
  <ase-tpl-boxline><label-key/> ▶ **<label-text/>** <description/></ase-tpl-boxline>
183
192
  </text>
184
193
 
185
- Set <n/> to <n/> + 1 (increment entry count).
186
194
  <if condition="<keys/> is empty">
187
195
  Set <keys><label-key/></keys>
188
196
  </if>
@@ -191,47 +199,67 @@ Let the *user interactively choose* an answer.
191
199
  </else>
192
200
  </for>
193
201
 
202
+ <if condition="<opts/> contains `--other`">
203
+ Set <hint>Please choose *one* option by typing <keys/>/**CANCEL**, or other free-text instruction.</hint>.
204
+ </if>
205
+ <else>
206
+ Set <hint>Please choose *one* option by typing <keys/>/**CANCEL**.</hint>.
207
+ </else>
208
+
194
209
  Set:
195
210
 
196
211
  <text>
197
- <ase-tpl-boxed title="QUESTION" subtitle="<question-label/>">
212
+ <ase-tpl-boxed title="DIALOG" subtitle="<question-label/>">
198
213
 
199
214
  <ase-tpl-boxline>**<question-description/>**</ase-tpl-boxline>
200
215
 
201
216
  <text/>
202
217
 
203
- Please choose *one* option by typing <keys/>/**CANCEL** or free-text instruction.
218
+ <hint/>
204
219
 
205
220
  </ase-tpl-boxed>
206
221
  </text>
207
222
 
208
- If <n/> is less than 3:
209
- Set <result>ERROR: user-dialog requires 2-8 answer lines, got less</result>
210
- and *SKIP* the following step 2 and continue with step 3 dispatch.
223
+ If <n/> is less than 2:
224
+ Set <result>ERROR: custom-dialog requires 2-8 answer lines, got <n/></result>
225
+ and *SKIP* the following step 2.2 and continue with step 2.3 dispatch.
211
226
 
212
227
  2. Output the following <template/>, end the current turn, wait for the
213
- user input, store the user input in <result/> and then continue with step 3:
228
+ user input, store the user input in <result/> and then continue with
229
+ step 2.3 below:
214
230
 
215
231
  <template>
216
232
  <text/>
217
233
  </template>
218
234
 
219
- 3. Check the result and dispatch accordingly:
235
+ 3. Do not output anything in this step!
236
+ Check the <result/> and dispatch accordingly:
220
237
 
221
- - If <result/> indicates that the user doesn't want to proceed,
222
- or the user declined to answer the question, or that the dialog
223
- was cancelled, rejected or skipped, set <result>CANCEL</result>.
238
+ 1. If <result/> is `cancel`, `CANCEL`, `reject`, `REJECT`, or
239
+ otherwise indicates that the user doesn't want to proceed,
240
+ or the user declined to answer the question, or that
241
+ the dialog was cancelled, rejected or skipped, set
242
+ <result>CANCEL</result>.
224
243
 
225
- - Otherwise, determine the selected <label/>
244
+ 2. Otherwise, determine the selected <label/>
226
245
  by mapping the <result/> (usually containing one of the
227
- "key" or "label" strings) to one of the answer labels. Set
228
- <result><label/></result>.
246
+ "key" or "label" strings) to one of the answer labels in
247
+ <spec/>. Set <result><label/></result>.
229
248
 
230
- If <result/> is then *NOT* one of the "label" values from
231
- <spec/>, set <result>OTHER: <result/></result> (prefix
232
- result with "OTHER").
249
+ 3. If <result/> is then *NEITHER* one of the "key"
250
+ *NOR* "label" values from <spec/>:
251
+ <if condition="<opts/> contains `--other`">
252
+ Set <result>OTHER: <result/></result>
253
+ (prefix result with "OTHER").
254
+ </if>
255
+ <else>
256
+ Output the following <template/> and then *START OVER*
257
+ by *GOING* to step 2.2 above.
233
258
 
234
- Do not output anything in this step!
259
+ <template>
260
+ ⧉ **ASE**: ERROR: **Invalid option selected!**
261
+ </template>
262
+ </else>
235
263
 
236
264
  </define>
237
265
 
@@ -77,14 +77,14 @@ distinct **Artifact**s (listed under their <artifact-name/> and their
77
77
  The **Artifact**s have the following cross-references:
78
78
 
79
79
  ```text
80
- ARCH-02-FV Functionality View ──(depends on)─► ARCH-02-FV Functionality View
81
- ARCH-03-IV Information View ──(entity)─► SPEC-05-DM Data Model
80
+ ARCH-02-FV Functionality View ──(depends on)─► ARCH-01-CV Context View
81
+ ARCH-03-IV Information View ──(entity)─► SPEC-07-DM Data Model
82
82
  ARCH-03-IV Information View ──(owner)─► ARCH-02-FV Functionality View
83
83
  ARCH-04-CO Concurrency View ──(hosts)─► ARCH-02-FV Functionality View
84
84
  ARCH-06-DP Deployment View ──(hosts)─► ARCH-02-FV Functionality View
85
85
  ARCH-07-OV Operations View ──(element)─► ARCH-02-FV Functionality View
86
86
  ARCH-07-OV Operations View ──(element)─► ARCH-06-DP Deployment View
87
- ARCH-08-QP Quality Perspectives ──(addresses)─► SPEC-04-NR Non-Functional Requirements
87
+ ARCH-08-QP Quality Perspectives ──(addresses)─► SPEC-05-NR Non-Functional Requirements
88
88
  ARCH-08-QP Quality Perspectives ──(affects)─► ARCH-02-FV Functionality View
89
89
  ARCH-08-QP Quality Perspectives ──(affects)─► ARCH-06-DP Deployment View
90
90
  ARCH-09-DR Decision Record ──(affects)─► ARCH-02-FV Functionality View
@@ -563,7 +563,7 @@ manages, defining how information is organized and connected.
563
563
 
564
564
  ### RELATIONS
565
565
 
566
- - `<spec-dm-relation-id/>`: [`<spec-dm-relation-target/>`](#<spec-dm-relation-id/>)(`<spec-dm-relation-cardinality/>`):<br/>
566
+ - `<spec-dm-relation-id/>`: [`<spec-dm-relation-target/>`](#<spec-dm-relation-target-id/>)(`<spec-dm-relation-cardinality/>`):<br/>
567
567
  <spec-dm-relation-description/>,
568
568
  **BECAUSE** <spec-dm-relation-rationale/>.
569
569
 
@@ -615,7 +615,7 @@ manages, defining how information is organized and connected.
615
615
  - <spec-dm-relation-target/>: the <spec-dm-entity-name/> of the
616
616
  entity the directed relation targets.
617
617
 
618
- - <spec-dm-relation-id/>: the <spec-dm-entity-id/> of the
618
+ - <spec-dm-relation-target-id/>: the <spec-dm-entity-id/> of the
619
619
  entity the directed relation targets.
620
620
 
621
621
  - <spec-dm-relation-cardinality/>: the cardinality of the entity
@@ -724,8 +724,17 @@ making the forbidden moves as explicit as the allowed ones.
724
724
  is implicitly forbidden.
725
725
 
726
726
  - Every <spec-sm-state-name/> used in a transition *MUST* be
727
- declared in the `### STATES` block, and every non-final state
728
- *MUST* have at least one outgoing transition.
727
+ declared in the `### STATES` block, and every state with no
728
+ outgoing transition *MUST* be listed in <spec-sm-lifecycle-final/>
729
+ (a state with no outgoing transition that is not final would be a
730
+ stuck dead-end). The converse does *not* hold: a
731
+ <spec-sm-lifecycle-final/> state *MAY* still have outgoing
732
+ transitions, modeling a resting state that can later be left again
733
+ (e.g. a `Closed` state with a `reopen` transition back to
734
+ `Active`). Thus <spec-sm-lifecycle-final/> designates the states in
735
+ which the entity may legally come to rest, which is a superset of,
736
+ but not necessarily equal to, the set of declared states that have
737
+ no outgoing transition.
729
738
 
730
739
  - In case a transition has no side effect, the
731
740
  entire `<spec-sm-transition-effect/>,` clause is omitted.
@@ -26,8 +26,10 @@ set placeholders into the context as a side-effect.
26
26
  For each option token in <getopt-spec/> of the form
27
27
  `--<long/>[|-<short/>][=<default/>|=(<c1/>|<c2/>|...)[...]]`, set
28
28
  <getopt-option-<long/>/> to <default/> (for `=<default/>`
29
- form), or to <c1/> (the first choice, for `=(<c1/>|<c2>/|...)`
30
- form, or for the list form `=(<c1/>|<c2>/|...)...`),
29
+ form), or to the *single token* <c1/> (the first choice, both
30
+ for the choice form `=(<c1/>|<c2>/|...)` and for the list form
31
+ `=(<c1/>|<c2>/|...)...` -- an *unsupplied* list-option always
32
+ defaults to the single token <c1/>, *not* to a whole list),
31
33
  or to `false` (for value-less options). Then set
32
34
  <getopt-arguments><getopt-args/></getopt-arguments>.
33
35
 
@@ -52,11 +54,13 @@ set placeholders into the context as a side-effect.
52
54
  `=(<c1>|<c2>|...)` declares a value-taking option restricted to the
53
55
  listed fixed choices (the first choice acts as the default), and the
54
56
  trailing `...` (as in `=(<c1>|<c2>|...)...`) declares a value-taking
55
- option whose value is a *comma-separated list* of choice tokens
56
- (the first choice still acts as the default; only the *first*
57
- token of the list is validated by the parser against the choice
58
- set -- subsequent tokens are *not* validated, and skills validate
59
- each remaining token themselves as they consume it).
57
+ option whose *supplied* value is a *comma-separated list* of choice
58
+ tokens (when *unsupplied*, the option defaults to the *single
59
+ token* `<c1>`, identical to the non-list choice form -- the list
60
+ semantics apply only to an explicitly supplied value; only the
61
+ *first* token of a supplied list is validated by the parser against
62
+ the choice set -- subsequent tokens are *not* validated, and skills
63
+ validate each remaining token themselves as they consume it).
60
64
 
61
65
  4. **Short-Circuit for Error**:
62
66
  If <text/> starts with `ERROR:`:
@@ -215,6 +215,11 @@ Skill Identification
215
215
  @${CLAUDE_SKILL_DIR}/help.md
216
216
  </template>
217
217
 
218
+ - *IMPORTANT*:
219
+ You *MUST* *NOT* output any summaries, explanations, or next
220
+ steps at the end of a skill beside the explicit outputs via any
221
+ <template/>.
222
+
218
223
  Template Patterns
219
224
  -----------------
220
225
 
@@ -227,12 +232,13 @@ Template Patterns
227
232
  </template>
228
233
 
229
234
  - When `<ase-tpl-head title="<title/>"/>` should be expanded, use
230
- (where <bar/> = "─" x (67 - length("⧉ ASE: <title/>")), i.e., <bar/> is
231
- the "─" character repeated (67 - length("⧉ ASE: <title/>")) times):
235
+ (where <title-len/> is the number of characters in the string
236
+ `⧉ ASE: <title/>`, and <bar/> is the `─` character repeated exactly
237
+ (67 - <title-len/>) times):
232
238
 
233
239
  <template>
234
240
 
235
- ╭────━━━━**(** `⧉ ASE`: **`<title/>`** **)**━━━━────<bar/>┈┈┈┈┈┈┈┈┈┈
241
+ ╭────━━━━**(** ASE: **`<title/>`** **)**━━━━────<bar/>┈┈┈┈┈┈┈┈┈┈
236
242
 
237
243
  </template>
238
244
 
@@ -245,12 +251,13 @@ Template Patterns
245
251
  </template>
246
252
 
247
253
  - When `<ase-tpl-foot title="<title/>"/>` should be expanded, use
248
- (where <bar/> = "─" x (67 - length("⧉ ASE: <title/>")), i.e., <bar/> is
249
- the "─" character repeated (67 - length("⧉ ASE: <title/>")) times):
254
+ (where <title-len/> is the number of characters in the string
255
+ `⧉ ASE: <title/>`, and <bar/> is the `─` character repeated exactly
256
+ (67 - <title-len/>) times):
250
257
 
251
258
  <template>
252
259
 
253
- ╰────━━━━**(** `⧉ ASE`: **`<title/>`** **)**━━━━────<bar/>┈┈┈┈┈┈┈┈┈┈
260
+ ╰────━━━━**(** ASE: **`<title/>`** **)**━━━━────<bar/>┈┈┈┈┈┈┈┈┈┈
254
261
 
255
262
  </template>
256
263
 
@@ -272,14 +279,14 @@ Template Patterns
272
279
 
273
280
  - <if condition="<subtitle/> is not empty">
274
281
  Set <raw-title>⧉ ASE: <title/>: <subtitle/><raw-title>.
275
- Set <render-title>`⧉ ASE`: **`<title/>`**: `<subtitle/>`</render-title>.
282
+ Set <render-title>⧉ ASE: **`<title/>`**: `<subtitle/>`</render-title>.
276
283
  </if>
277
284
  <else>
278
285
  Set <raw-title>⧉ ASE: <title/><raw-title>.
279
- Set <render-title>`⧉ ASE`: **`<title/>`**</render-title>.
286
+ Set <render-title>⧉ ASE: **`<title/>`**</render-title>.
280
287
  </else>
281
- - Set <bar/> to ("─" x (67 - length("<raw-title/>"))),
282
- i.e., set <bar/> to the "─" character repeated (67 - length("<raw-title/>")) times.
288
+ - Set <raw-title-len/> to the number of characters in <raw-title/>.
289
+ - Set <bar/> to the `─` character repeated exactly (67 - <raw-title-len/>) times.
283
290
  - Set <body> to <content/> with all line-starts prefixed with `│ `.
284
291
 
285
292
  <template>
@@ -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",
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.
@@ -42,15 +42,18 @@ for the technology stack to *provide* the *needed functionality*
42
42
 
43
43
  2. If <functionality/> is not clear, not precise, or not specific
44
44
  enough, let the *user interactively choose* the intended
45
- functionality. For this you *MUST* use the custom `custom-dialog`
46
- and *NOT* the `AskUserQuestion` based "user-dialog":
45
+ functionality.
47
46
 
48
- <expand name="custom-dialog">
47
+ In the following, you *MUST* *NOT* use the <user-dialog-tool/>
48
+ tool! Instead, you *MUST* just show a custom output, let the
49
+ user enter input, and then you set the result accordingly.
50
+
51
+ <expand name="custom-dialog" arg1="--no-other">
49
52
  Functionality: Which functionality should the components provide?
50
53
  <answer-1/>: (grounded candidate functionality 1)
51
54
  <answer-2/>: (grounded candidate functionality 2)
52
- <answer-3/>: (grounded candidate functionality 2)
53
- <answer-4/>: (grounded candidate functionality 3)
55
+ <answer-3/>: (grounded candidate functionality 3)
56
+ <answer-4/>: (grounded candidate functionality 4)
54
57
  </expand>
55
58
 
56
59
  Then use the <result/> and its corresponding grounded candidate
@@ -112,7 +115,7 @@ for the technology stack to *provide* the *needed functionality*
112
115
  <keyword-L/> (L=1-M), which allow you to search for suitable
113
116
  components.
114
117
 
115
- 3.. In the to be discovered result set of components <component-K/>
118
+ 3. In the to be discovered result set of components <component-K/>
116
119
  (K=1-N), remember the component name as <name-K/>, the
117
120
  official package name as <package-K/>, the latest version as
118
121
  <version-K/>, the stars as <stars-K/>, the created date as
@@ -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)`)
@@ -220,10 +220,10 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
220
220
  anything else in this step:
221
221
 
222
222
  <template>
223
- ● **APPROACH A<n/>**<annotation/>: *<summary/>*
223
+ ● **APPROACH A<n/>**<annotation/>: **<summary/>**
224
224
  ○ [...]
225
- **PRO**: [...]
226
- **CON**: [...]
225
+ *PRO*: [...]
226
+ *CON*: [...]
227
227
  </template>
228
228
 
229
229
  Hints:
@@ -241,18 +241,19 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
241
241
 
242
242
  7. <if condition="<getopt-option-auto/> is not equal `true`">
243
243
 
244
- You *MUST* use the custom `custom-dialog` and *NOT* the
245
- `AskUserQuestion`-based `user-dialog` to let the *user
246
- interactively choose* the preferred approach A<n/>.
244
+ In the following, you *MUST* *NOT* use the <user-dialog-tool/>
245
+ tool! Instead, you *MUST* just show a custom output, let the
246
+ user enter input, and then you set the result accordingly.
247
247
 
248
- Per approach A<n/>, use the option `A<n/>: <short-summary/>`
249
- where <short-summary/> is an ultra brief summary of the approach
250
- A<n/>. For your recommended approach, use
251
- `A<n/>: **RECOMMENDATION** ⚝: <short-summary/>` instead.
248
+ Let the user choose the preferred approach A<n/> by raising
249
+ a question with the following custom dialog, where per
250
+ approach A<n/>, you determine an ultra brief summary
251
+ <short-summary/> and then use the answer option `A<n/>:
252
+ ⚝ **RECOMMENDATION** ⚝: <short-summary/>` for your
253
+ recommended approach plus zero or more answer options `A<n/>:
254
+ <short-summary/>` for all other approaches:
252
255
 
253
- Now raise the user dialog:
254
-
255
- <expand name="custom-dialog">
256
+ <expand name="custom-dialog" arg1="--no-other">
256
257
  Select Approach: Select your preferred crafting approach to follow?
257
258
  A<n/>: <short-summary/>
258
259
  [...]
@@ -342,17 +343,20 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
342
343
  Hand off to `ase-task-edit`.
343
344
  <if condition="<head/> is equal `EDIT`">
344
345
  Consume the head: set <getopt-option-next/> to the remaining
345
- 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.
346
350
  </if>
347
351
  All remaining tokens are `ase-task-edit`'s own vocabulary
348
352
  and are forwarded verbatim, so `ase-task-edit` consumes its
349
- head itself.
353
+ own head itself.
350
354
  <if condition="<getopt-option-next/> is not equal `none`">
351
355
  Set <args><args/> --next <getopt-option-next/></args>
352
356
  </if>
353
357
  Then call the tool `Skill(skill: "ase:ase-task-edit", args: "<args/>")`.
354
358
  </else>
355
359
 
356
- <step>
360
+ </step>
357
361
 
358
362
  </flow>
@@ -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
 
@@ -7,23 +7,29 @@ user-invocable: true
7
7
  disable-model-invocation: false
8
8
  effort: high
9
9
  allowed-tools:
10
- - "Bash(git)"
11
- - "Bash(sort)"
12
- - "Bash(uniq)"
13
- - "Bash(head)"
10
+ - "Bash(git *)"
11
+ - "Bash(grep *)"
12
+ - "Bash(sort *)"
13
+ - "Bash(uniq *)"
14
+ - "Bash(head *)"
14
15
  - "Skill"
15
16
  - "Agent"
16
17
  ---
17
18
 
18
19
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
19
20
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
21
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
20
22
 
21
23
  <skill name="ase-code-insight">
22
24
  Project Insight
23
25
  </skill>
24
26
 
27
+ <expand name="getopt" arg1="ase-code-insight">
28
+ $ARGUMENTS
29
+ </expand>
30
+
25
31
  <objective>
26
- Give *insights* into the project through the source code of $ARGUMENTS.
32
+ Give *insights* into the project through the source code of <getopt-arguments/>.
27
33
  </objective>
28
34
 
29
35
  <flow>
@@ -152,7 +152,7 @@ related to a set of code quality aspects.
152
152
  3. Append the following <template/> to <diff-file/>:
153
153
 
154
154
  <template>
155
- @@ -<old-start/>,<n/> +<new-start/>,<m/> @@
155
+ @@ -<old-start/>,<old-count/> +<new-start/>,<new-count/> @@
156
156
  <context-before/>
157
157
  -<old-text/>
158
158
  +<new-text/>
@@ -164,10 +164,10 @@ related to a set of code quality aspects.
164
164
  the line of <context-before/> (one before <line/>).
165
165
  - The <new-start/> is the same as <old-start/> (the unchanged
166
166
  <context-before/> line shares the same start in both files).
167
- - The <n/> is the total number of old-side hunk lines, i.e.,
167
+ - The <old-count/> is the total number of old-side hunk lines, i.e.,
168
168
  the number of lines in <context-before/>, <old-text/>, and
169
169
  <context-after/> combined.
170
- - The <m/> is the total number of new-side hunk lines, i.e.,
170
+ - The <new-count/> is the total number of new-side hunk lines, i.e.,
171
171
  the number of lines in <context-before/>, <new-text/>, and
172
172
  <context-after/> combined.
173
173
 
@@ -215,11 +215,11 @@ related to a set of code quality aspects.
215
215
 
216
216
  6. <if condition="<getopt-option-auto/> is not 'true'">
217
217
 
218
- Let the *user interactively choose* what to do as the next
219
- step. For this you *MUST* use the custom `custom-dialog` and
220
- not the `AskUserQuestion` based `user-dialog`:
218
+ In the following, you *MUST* *NOT* use the <user-dialog-tool/>
219
+ tool! Instead, you *MUST* just show a custom output, let the
220
+ user enter input, and then you set the result accordingly.
221
221
 
222
- <expand name="custom-dialog">
222
+ <expand name="custom-dialog" arg1="--other">
223
223
  CORRECTION: How would you like to proceed with this proposed correction?
224
224
  ACCEPT: Apply the proposed correction.
225
225
  REJECT: Skip this proposed correction.
@@ -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="