@rse/ase 0.9.44 → 0.9.45

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 (47) hide show
  1. package/dst/ase-setup.js +50 -0
  2. package/package.json +1 -1
  3. package/plugin/.claude-plugin/plugin.json +1 -1
  4. package/plugin/.codex-plugin/plugin.json +1 -1
  5. package/plugin/.github/plugin/plugin.json +1 -1
  6. package/plugin/agents/ase-code-lint.md +11 -0
  7. package/plugin/agents/ase-docs-proofread.md +8 -0
  8. package/plugin/agents/ase-meta-chat.md +13 -7
  9. package/plugin/agents/ase-meta-search.md +0 -1
  10. package/plugin/meta/ase-common-task.md +145 -0
  11. package/plugin/meta/ase-constitution.md +4 -1
  12. package/plugin/meta/ase-dialog.md +5 -5
  13. package/plugin/meta/ase-format-arch.md +4 -4
  14. package/plugin/meta/ase-format-spec.md +23 -23
  15. package/plugin/meta/ase-format-task.md +1 -1
  16. package/plugin/meta/ase-persona.md +3 -3
  17. package/plugin/meta/ase-skill.md +2 -2
  18. package/plugin/meta/ase-tenets.md +4 -4
  19. package/plugin/package.json +1 -1
  20. package/plugin/skills/ase-arch-analyze/SKILL.md +2 -3
  21. package/plugin/skills/ase-code-craft/SKILL.md +7 -7
  22. package/plugin/skills/ase-code-lint/SKILL.md +19 -3
  23. package/plugin/skills/ase-code-refactor/SKILL.md +7 -7
  24. package/plugin/skills/ase-code-resolve/SKILL.md +6 -6
  25. package/plugin/skills/ase-docs-distill/SKILL.md +6 -6
  26. package/plugin/skills/ase-docs-proofread/SKILL.md +18 -3
  27. package/plugin/skills/ase-meta-changelog/SKILL.md +5 -2
  28. package/plugin/skills/ase-meta-commit/SKILL.md +4 -4
  29. package/plugin/skills/ase-meta-compat/SKILL.md +3 -3
  30. package/plugin/skills/ase-meta-diaboli/SKILL.md +2 -2
  31. package/plugin/skills/ase-meta-evaluate/SKILL.md +6 -9
  32. package/plugin/skills/ase-meta-quorum/SKILL.md +33 -4
  33. package/plugin/skills/ase-meta-search/SKILL.md +1 -1
  34. package/plugin/skills/ase-meta-steelman/SKILL.md +3 -3
  35. package/plugin/skills/ase-meta-why/SKILL.md +1 -1
  36. package/plugin/skills/ase-sync-export/SKILL.md +7 -7
  37. package/plugin/skills/ase-sync-import/SKILL.md +20 -16
  38. package/plugin/skills/ase-sync-reconcile/SKILL.md +9 -9
  39. package/plugin/skills/ase-task-condense/SKILL.md +34 -79
  40. package/plugin/skills/ase-task-edit/SKILL.md +41 -49
  41. package/plugin/skills/ase-task-grill/SKILL.md +10 -12
  42. package/plugin/skills/ase-task-id/SKILL.md +7 -3
  43. package/plugin/skills/ase-task-implement/SKILL.md +18 -111
  44. package/plugin/skills/ase-task-list/SKILL.md +3 -0
  45. package/plugin/skills/ase-task-preflight/SKILL.md +22 -115
  46. package/plugin/skills/ase-task-reboot/SKILL.md +27 -63
  47. package/plugin/skills/ase-task-view/SKILL.md +7 -7
@@ -17,7 +17,7 @@ effort: xhigh
17
17
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
18
18
 
19
19
  <skill name="ase-sync-reconcile">
20
- Reconcile Artifact Set to Artifact Set
20
+ Reconcile Artifact Set to Artifact Set
21
21
  </skill>
22
22
 
23
23
  <expand name="getopt"
@@ -27,10 +27,10 @@ effort: xhigh
27
27
  </expand>
28
28
 
29
29
  <objective>
30
- *Reconcile* the *target* artifact kinds to *reflect* the *current
31
- state* of the *source* artifact kinds, by reading the source
32
- artifacts and aligning the target artifacts accordingly:
33
- <hint><getopt-arguments/></hint>.
30
+ *Reconcile* the *target* artifact kinds to *reflect* the *current
31
+ state* of the *source* artifact kinds, by reading the source
32
+ artifacts and aligning the target artifacts accordingly:
33
+ <hint><getopt-arguments/></hint>.
34
34
  </objective>
35
35
 
36
36
  @${CLAUDE_SKILL_DIR}/../../meta/ase-format-meta.md
@@ -48,8 +48,8 @@ Procedure
48
48
 
49
49
  1. The recognized artifact kinds are the seven tokens `TASK`,
50
50
  `SPEC`, `ARCH`, `CODE`, `DOCS`, `INFR`, and `OTHR`. Parse
51
- <getopt-target/> as the comma-separated <target/> kind list and
52
- <getopt-source/> as the comma-separated <source/> kind list.
51
+ <getopt-option-target/> as the comma-separated <target/> kind list and
52
+ <getopt-option-source/> as the comma-separated <source/> kind list.
53
53
  Upper-case and trim every parsed kind token. Do not output
54
54
  anything.
55
55
 
@@ -81,7 +81,7 @@ Procedure
81
81
  ⧉ **ASE**: ☻ skill: **ase-sync-reconcile**, ▶ ERROR: unknown or unsupported artifact kind: **<kind/>**
82
82
  </template>
83
83
 
84
- 5. <if condition="<getopt-bidirectional/> is not 'true'">
84
+ 5. <if condition="<getopt-option-bidirectional/> is not 'true'">
85
85
 
86
86
  Remove from <source/> any kind that is also present in <target/>
87
87
  (a kind is never its own source).
@@ -157,7 +157,7 @@ Procedure
157
157
  the `ase` MCP server to find out the current time and store it in
158
158
  <timestamp-modified/>.
159
159
 
160
- 4. <if condition="<getopt-bidirectional/> is equal 'true'">
160
+ 4. <if condition="<getopt-option-bidirectional/> is equal 'true'">
161
161
 
162
162
  *Bidirectionally update* the <target/> and <source/> artifacts
163
163
  so that they faithfully *reflect the current state* of each
@@ -31,10 +31,21 @@ semantics exactly.
31
31
  </objective>
32
32
 
33
33
  @${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md
34
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-task.md
34
35
 
35
36
  Procedure
36
37
  ---------
37
38
 
39
+ <define name="handoff-args">
40
+ Set <args></args> (set args to empty).
41
+ <if condition="the condensed plan was saved via `ase_task_save` in step 3">
42
+ Set <args>--int-reuse-task</args>.
43
+ </if>
44
+ <if condition="<getopt-option-next/> is not equal `none`">
45
+ Set <args><args/> --next <getopt-option-next/></args>
46
+ </if>
47
+ </define>
48
+
38
49
  1. **Determine Task:**
39
50
 
40
51
  1. Set <id><getopt-arguments/></id> initially.
@@ -76,20 +87,21 @@ Procedure
76
87
  the `text` output field of the `ase_task_load` tool call.
77
88
 
78
89
  - If <text/> starts with `ERROR:` or `WARNING:`:
79
- Set <content></content> (set content to empty).
90
+ Silently ignore the MCP error.
91
+ Set <task-content></task-content> (set task content to empty).
80
92
  Set <words/> to "0".
81
93
 
82
94
  - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
83
- Set <content><text/></content> (set content to text).
84
- Calculate the number of words <words/> of <content/>.
95
+ Set <task-content><text/></task-content> (set task content to text).
96
+ Calculate the number of words <words/> of <task-content/>.
85
97
 
86
98
  Set <words-before><words/></words-before> (remember the loaded
87
99
  word count for the strictly-smaller check in step 3).
88
100
 
89
- <if condition="<content/> contains '⎈ Created: <text/>'">
101
+ <if condition="<task-content/> contains '⎈ Created: <text/>'">
90
102
  Set <timestamp-created><text/></timestamp-created> (extract the
91
103
  original creation timestamp so it can be re-inserted unchanged
92
- into the condensed <content/> in step 3).
104
+ into the condensed <task-content/> in step 3).
93
105
  </if>
94
106
 
95
107
  Only output the following <template/>:
@@ -98,7 +110,7 @@ Procedure
98
110
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan loaded**
99
111
  </template>
100
112
 
101
- 2. <if condition="<content/> is empty">
113
+ 2. <if condition="<task-content/> is empty">
102
114
  Complain and tell the user to use the `ase-code-resolve`,
103
115
  `ase-code-refactor`, `ase-code-craft`, or `ase-task-edit` skills
104
116
  first to create a task plan. Then immediately stop processing
@@ -107,8 +119,8 @@ Procedure
107
119
 
108
120
  3. **Condense Task Plan:**
109
121
 
110
- 1. *Apply the condense ruleset* to <content/>, producing a shorter
111
- <content/>. The goal is to make the plan require as *little
122
+ 1. *Apply the condense ruleset* to <task-content/>, producing a shorter
123
+ <task-content/>. The goal is to make the plan require as *little
112
124
  reading* as possible while all semantics remain *fully preserved
113
125
  and unchanged*. Honor the following ruleset *strictly*:
114
126
 
@@ -148,25 +160,10 @@ Procedure
148
160
  longer wording*.
149
161
 
150
162
  2. *Persist only if smaller*: calculate the number of words <words/>
151
- of the condensed <content/>.
163
+ of the condensed <task-content/>.
152
164
 
153
165
  - <if condition="<words/> is strictly smaller than <words-before/>">
154
- Update <timestamp-modified/> with the current time in
155
- ISO-style format, which has to be determined by calling
156
- the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool
157
- of the `ase` MCP server and use the `text` field of
158
- its response. Keep the original <timestamp-created/>,
159
- re-insert the current <ase-task-id/> and the refreshed
160
- <timestamp-modified/> into <content/>.
161
-
162
- Call the `ase_task_save(id: "<ase-task-id/>", text:
163
- "<content/>")` tool of the `ase` MCP server to save the
164
- condensed task plan content. Do not output anything related
165
- to this MCP call except the following <template/>:
166
-
167
- <template>
168
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan condensed**
169
- </template>
166
+ <expand name="task-save-content" arg1="plan condensed"></expand>
170
167
  </if>
171
168
 
172
169
  - <if condition="<words/> is NOT strictly smaller than <words-before/>">
@@ -182,39 +179,15 @@ Procedure
182
179
 
183
180
  1. *Determine next step*:
184
181
 
185
- - If <getopt-option-next/> is not equal to `none`:
186
- Treat <getopt-option-next/> as a comma-separated chronological
187
- list of pre-selected next-step tokens. *Split* it on `,`,
188
- take the *first* token as <head/>, and store the remaining
189
- tokens (joined back with `,`, or `none` if empty) into
190
- <getopt-option-next/> so downstream skills can consume the tail.
191
-
192
- - If <head/> matches the regex `^(DONE|EDIT|IMPLEMENT|PREFLIGHT)$`:
193
- Honor the pre-selected token.
194
- Set <result><head/></result>.
195
-
196
- - else:
197
- Only output the following <template/> and then immediately
198
- *STOP* processing the entire current skill:
199
-
200
- <template>
201
- ⧉ **ASE**: ☻ skill: **ase-task-condense**, ▶ ERROR: invalid `--next` token: **<head/>**
202
- </template>
203
-
204
- - If <getopt-option-next/> is equal to `none`:
205
-
206
- In the following, you *MUST* *NOT* use your built-in
207
- <user-dialog-tool/> tool! Instead, you *MUST* just show a
208
- custom dialog according to the expanded `custom-dialog`
209
- definition. You *MUST* closely follow this definition:
210
-
211
- <expand name="custom-dialog" arg1="--no-other">
212
- Next Step: How would you like to proceed with the plan?
213
- DONE: Stop processing.
214
- EDIT: Hand off plan to editing.
215
- PREFLIGHT: Hand off plan to pre-flighting.
216
- IMPLEMENT: Hand off plan to implementation.
217
- </expand>
182
+ <expand name="task-next-select"
183
+ arg1="ase-task-condense"
184
+ arg2="DONE|EDIT|IMPLEMENT|PREFLIGHT">
185
+ Next Step: How would you like to proceed with the plan?
186
+ DONE: Stop processing.
187
+ EDIT: Hand off plan to editing.
188
+ PREFLIGHT: Hand off plan to pre-flighting.
189
+ IMPLEMENT: Hand off plan to implementation.
190
+ </expand>
218
191
 
219
192
  2. Check the tool <result/> and dispatch accordingly:
220
193
 
@@ -226,13 +199,7 @@ Procedure
226
199
  </template>
227
200
 
228
201
  - If <result/> is `EDIT`:
229
- Set <args></args> (set args to empty).
230
- <if condition="the condensed plan was saved via `ase_task_save` in step 3">
231
- Set <args>--int-reuse-task</args>.
232
- </if>
233
- <if condition="<getopt-option-next/> is not equal `none`">
234
- Set <args><args/> --next <getopt-option-next/></args>
235
- </if>
202
+ <expand name="handoff-args"/>
236
203
  Only output the following <template/> and then call the
237
204
  tool `Skill(skill: "ase:ase-task-edit", args: "<args/>")`
238
205
  to invoke the `ase:ase-task-edit` skill in order to *edit*
@@ -244,13 +211,7 @@ Procedure
244
211
  </template>
245
212
 
246
213
  - If <result/> is `IMPLEMENT`:
247
- Set <args></args> (set args to empty).
248
- <if condition="the condensed plan was saved via `ase_task_save` in step 3">
249
- Set <args>--int-reuse-task</args>.
250
- </if>
251
- <if condition="<getopt-option-next/> is not equal `none`">
252
- Set <args><args/> --next <getopt-option-next/></args>
253
- </if>
214
+ <expand name="handoff-args"/>
254
215
  Only output the following <template/> and then call the
255
216
  `Skill(skill: "ase:ase-task-implement", args: "<args/>")` tool
256
217
  to *apply* the plan.
@@ -260,13 +221,7 @@ Procedure
260
221
  </template>
261
222
 
262
223
  - If <result/> is `PREFLIGHT`:
263
- Set <args></args> (set args to empty).
264
- <if condition="the condensed plan was saved via `ase_task_save` in step 3">
265
- Set <args>--int-reuse-task</args>.
266
- </if>
267
- <if condition="<getopt-option-next/> is not equal `none`">
268
- Set <args><args/> --next <getopt-option-next/></args>
269
- </if>
224
+ <expand name="handoff-args"/>
270
225
  Only output the following <template/> and then call the
271
226
  `Skill(skill: "ase:ase-task-preflight", args: "<args/>")` tool
272
227
  to *apply* the plan.
@@ -41,20 +41,20 @@ Procedure
41
41
 
42
42
  <define name="apply-refinement">
43
43
  Treat the <instruction/> as a *refinement instruction* for
44
- the plan, and update <content/> in-place by *applying* the
44
+ the plan, and update <task-content/> in-place by *applying* the
45
45
  requested <instruction/> to the *plan*.
46
46
 
47
47
  When refining the plan this way, preserve the overall structure of the
48
48
  plan and only modify what the user actually requested. Do *not* rewrite
49
49
  unrelated sections of the plan.
50
50
 
51
- Calculate the number of words <words/> of <content/>.
52
- Set <content-dirty>true</content-dirty>.
51
+ Calculate the number of words <words/> of <task-content/>.
52
+ Set <task-content-dirty>true</task-content-dirty>.
53
53
  </define>
54
54
 
55
55
  <define name="generate-plan">
56
56
  Create a new plan from scratch and store the result as
57
- <content/> by closely following the defined plan format
57
+ <task-content/> by closely following the defined plan format
58
58
  <format/> and injecting into it all the information from
59
59
  the <instruction/> and all decisions you derived from the
60
60
  <instruction/>.
@@ -69,7 +69,7 @@ and conventions.
69
69
  <if condition="<getopt-option-dry/> is equal `true`">
70
70
  You *MUST* completely omit the `## VERIFICATION` section
71
71
  (including its heading and all of its bullet points) from
72
- <content/>.
72
+ <task-content/>.
73
73
  </if>
74
74
 
75
75
  Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
@@ -77,8 +77,18 @@ Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
77
77
  for fresh <timestamp-created/> and <timestamp-modified/>
78
78
  information. Then insert the current <ase-task-id/>,
79
79
  <timestamp-created/>, and <timestamp-modified/> information
80
- and calculate the number of words <words/> of <content/>.
81
- Set <content-dirty>true</content-dirty>.
80
+ and calculate the number of words <words/> of <task-content/>.
81
+ Set <task-content-dirty>true</task-content-dirty>.
82
+ </define>
83
+
84
+ <define name="handoff-args">
85
+ Set <args></args> (set args to empty).
86
+ <if condition="the plan was saved via `ase_task_save` in step 3.2">
87
+ Set <args>--int-reuse-task</args>.
88
+ </if>
89
+ <if condition="<getopt-option-next/> is not equal `none`">
90
+ Set <args><args/> --next <getopt-option-next/></args>
91
+ </if>
82
92
  </define>
83
93
 
84
94
  1. **Determine Task and Instruction:**
@@ -183,24 +193,24 @@ Set <content-dirty>true</content-dirty>.
183
193
  call. Set <status>plan loaded</status>.
184
194
  </else>
185
195
 
186
- Set <content-dirty>false</content-dirty>.
196
+ Set <task-content-dirty>false</task-content-dirty>.
187
197
 
188
198
  - If <text/> starts with `ERROR:` or `WARNING:`:
189
199
  Silently ignore the MCP error.
190
- Set <content/> to empty.
200
+ Set <task-content/> to empty.
191
201
  Set <words/> to "0".
192
202
  Do not output anything.
193
203
 
194
204
  - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
195
- Set <content><text/></content> (set content to text).
196
- Calculate the number of words <words/> of <content/>.
205
+ Set <task-content><text/></task-content> (set task content to text).
206
+ Calculate the number of words <words/> of <task-content/>.
197
207
  Only output the following <template/>:
198
208
 
199
209
  <template>
200
210
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<status/>**
201
211
  </template>
202
212
 
203
- 2. <if condition="<content/> is empty AND <instruction/> is empty">
213
+ 2. <if condition="<task-content/> is empty AND <instruction/> is empty">
204
214
  Ask the user interactively, without a special tool, for the
205
215
  initial plan content with a single question:
206
216
 
@@ -214,9 +224,9 @@ Set <content-dirty>true</content-dirty>.
214
224
  </template>
215
225
  </if>
216
226
 
217
- 3. <if condition="<content/> is not empty AND
227
+ 3. <if condition="<task-content/> is not empty AND
218
228
  <instruction/> is not empty AND
219
- <instruction/> is not equal <content/>">
229
+ <instruction/> is not equal <task-content/>">
220
230
  *Determine previous-plan handling*:
221
231
 
222
232
  - If <getopt-option-plan/> matches the regex `^(OVERWRITE|REFINE|PRESERVE)$`:
@@ -285,14 +295,14 @@ Set <content-dirty>true</content-dirty>.
285
295
  </template>
286
296
  </if>
287
297
 
288
- 4. <if condition="no line of <content/> matches the case-insensitive regex `^\s*#+\s*TASK\b` AND <instruction/> is empty">
289
- Set <instruction><content/></instruction> (set instruction to content).
290
- Set <content></content> (set content to empty).
291
- Set <content-dirty>true</content-dirty>.
298
+ 4. <if condition="no line of <task-content/> matches the case-insensitive regex `^\s*#+\s*TASK\b` AND <instruction/> is empty">
299
+ Set <instruction><task-content/></instruction> (set instruction to task content).
300
+ Set <task-content></task-content> (set task content to empty).
301
+ Set <task-content-dirty>true</task-content-dirty>.
292
302
  Do not output anything.
293
303
  </if>
294
304
 
295
- 5. <if condition="<content/> is empty AND <instruction/> is not empty">
305
+ 5. <if condition="<task-content/> is empty AND <instruction/> is not empty">
296
306
  <expand name="generate-plan"/>
297
307
 
298
308
  Only output the following <template/> and continue processing:
@@ -310,22 +320,22 @@ Set <content-dirty>true</content-dirty>.
310
320
  `PREFLIGHT`, or declines/cancels in the dialog of step 3.4:
311
321
 
312
322
  1. *Update timestamp*:
313
- <if condition="<content/> contains '⚙ Modified:' AND <content-dirty/> is 'true'">
323
+ <if condition="<task-content/> contains '⚙ Modified:' AND <task-content-dirty/> is 'true'">
314
324
  Update <timestamp-modified/> with the current time in
315
325
  ISO-style format, which has to be determined by calling the
316
326
  `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the `ase`
317
327
  MCP server and use the `text` field of its response. Update
318
- the `⚙ Modified: ...` line of <content/> with the new
328
+ the `⚙ Modified: ...` line of <task-content/> with the new
319
329
  `⚙ Modified: <timestamp-modified/>`.
320
330
  Do not output anything.
321
331
  </if>
322
332
 
323
333
  2. *Persist plan*:
324
- <if condition="<content-dirty/> is 'true'">
325
- Call the `ase_task_save(id: "<ase-task-id/>", text: "<content/>")` tool
334
+ <if condition="<task-content-dirty/> is 'true'">
335
+ Call the `ase_task_save(id: "<ase-task-id/>", text: "<task-content/>")` tool
326
336
  of the `ase` MCP server to persist the current plan, and then
327
- set <content-dirty>false</content-dirty> again. Calculate the
328
- number of words <words/> of <content/>. Do not output anything
337
+ set <task-content-dirty>false</task-content-dirty> again. Calculate the
338
+ number of words <words/> of <task-content/>. Do not output anything
329
339
  related to this MCP tool call except the following <template/>:
330
340
 
331
341
  <template>
@@ -333,9 +343,9 @@ Set <content-dirty>true</content-dirty>.
333
343
  </template>
334
344
  </if>
335
345
 
336
- 3. *Render plan*: Treat <content/> as *verbatim* Markdown.
346
+ 3. *Render plan*: Treat <task-content/> as *verbatim* Markdown.
337
347
  Only output the following <template/>, so the user
338
- can read the plan and react to it. If <content/> is longer
348
+ can read the plan and react to it. If <task-content/> is longer
339
349
  than 90 lines and a `## IMPLEMENTATION DRAFT` section (from the
340
350
  companion skill `ase-task-preflight`) exists, replace the entire
341
351
  content of the `## IMPLEMENTATION DRAFT` section with `[...]`.
@@ -344,7 +354,7 @@ Set <content-dirty>true</content-dirty>.
344
354
 
345
355
  <template>
346
356
  <ase-tpl-head title="TASK"/>
347
- <content/>
357
+ <task-content/>
348
358
  <ase-tpl-foot title="TASK"/>
349
359
  </template>
350
360
 
@@ -405,13 +415,7 @@ Set <content-dirty>true</content-dirty>.
405
415
  - If <result/> is `GRILL`:
406
416
 
407
417
  *Break* out of the *loop*.
408
- Set <args></args> (set args to empty).
409
- <if condition="the plan was saved via `ase_task_save` in step 3.2">
410
- Set <args>--int-reuse-task</args>.
411
- </if>
412
- <if condition="<getopt-option-next/> is not equal `none`">
413
- Set <args><args/> --next <getopt-option-next/></args>
414
- </if>
418
+ <expand name="handoff-args"/>
415
419
  Only output the following <template/> and then call the
416
420
  `Skill(skill: "ase:ase-task-grill", args: "<args/>")` tool
417
421
  to *grill* the finalized plan.
@@ -423,13 +427,7 @@ Set <content-dirty>true</content-dirty>.
423
427
  - If <result/> is `PREFLIGHT`:
424
428
 
425
429
  *Break* out of the *loop*.
426
- Set <args></args> (set args to empty).
427
- <if condition="the plan was saved via `ase_task_save` in step 3.2">
428
- Set <args>--int-reuse-task</args>.
429
- </if>
430
- <if condition="<getopt-option-next/> is not equal `none`">
431
- Set <args><args/> --next <getopt-option-next/></args>
432
- </if>
430
+ <expand name="handoff-args"/>
433
431
  Only output the following <template/> and then call the
434
432
  `Skill(skill: "ase:ase-task-preflight", args: "<args/>")` tool
435
433
  to *apply* the finalized plan.
@@ -441,13 +439,7 @@ Set <content-dirty>true</content-dirty>.
441
439
  - If <result/> is `IMPLEMENT`:
442
440
 
443
441
  *Break* out of the *loop*.
444
- Set <args></args> (set args to empty).
445
- <if condition="the plan was saved via `ase_task_save` in step 3.2">
446
- Set <args>--int-reuse-task</args>.
447
- </if>
448
- <if condition="<getopt-option-next/> is not equal `none`">
449
- Set <args><args/> --next <getopt-option-next/></args>
450
- </if>
442
+ <expand name="handoff-args"/>
451
443
  Only output the following <template/> and then call the
452
444
  `Skill(skill: "ase:ase-task-implement", args: "<args/>")` tool
453
445
  to *apply* the finalized plan.
@@ -36,6 +36,13 @@ task plan until reaching a shared understanding.
36
36
  Procedure
37
37
  ---------
38
38
 
39
+ <define name="handoff-args">
40
+ Set <args>--int-reuse-task</args>.
41
+ <if condition="<getopt-option-next/> is not equal `none`">
42
+ Set <args><args/> --next <getopt-option-next/></args>
43
+ </if>
44
+ </define>
45
+
39
46
  1. **Determine Task:**
40
47
 
41
48
  1. Set <id><getopt-arguments/></id> initially.
@@ -282,10 +289,7 @@ Procedure
282
289
  </template>
283
290
 
284
291
  - If <result/> is `EDIT`:
285
- Set <args>--int-reuse-task</args>.
286
- <if condition="<getopt-option-next/> is not equal `none`">
287
- Set <args><args/> --next <getopt-option-next/></args>
288
- </if>
292
+ <expand name="handoff-args"/>
289
293
  Only output the following <template/> and then call the
290
294
  tool `Skill(skill: "ase:ase-task-edit", args: "<args/>")`
291
295
  to invoke the `ase:ase-task-edit` skill in order to *edit*
@@ -297,10 +301,7 @@ Procedure
297
301
  </template>
298
302
 
299
303
  - If <result/> is `PREFLIGHT`:
300
- Set <args>--int-reuse-task</args>.
301
- <if condition="<getopt-option-next/> is not equal `none`">
302
- Set <args><args/> --next <getopt-option-next/></args>
303
- </if>
304
+ <expand name="handoff-args"/>
304
305
  Only output the following <template/> and then call the
305
306
  `Skill(skill: "ase:ase-task-preflight", args: "<args/>")` tool
306
307
  to *apply* the plan.
@@ -310,10 +311,7 @@ Procedure
310
311
  </template>
311
312
 
312
313
  - If <result/> is `IMPLEMENT`:
313
- Set <args>--int-reuse-task</args>.
314
- <if condition="<getopt-option-next/> is not equal `none`">
315
- Set <args><args/> --next <getopt-option-next/></args>
316
- </if>
314
+ <expand name="handoff-args"/>
317
315
  Only output the following <template/> and then call the
318
316
  `Skill(skill: "ase:ase-task-implement", args: "<args/>")` tool
319
317
  to *apply* the plan.
@@ -26,6 +26,9 @@ Configure Task Id
26
26
  *Get* or *set* the unique *task id* of the current session.
27
27
  </objective>
28
28
 
29
+ Procedure
30
+ ---------
31
+
29
32
  1. Determine request:
30
33
  <request><getopt-arguments/></request>
31
34
  Inherit the always existing <ase-session-id/> and the current
@@ -43,9 +46,10 @@ Configure Task Id
43
46
  3. <if condition="<request/> is empty">
44
47
  - Call the `ase_task_id(session: "<ase-session-id/>")`
45
48
  tool from the `ase` MCP server and set <text/> to its
46
- `text` output. Check the response as mandated above; only
47
- on a clean response set <ase-task-id><text/></ase-task-id>.
48
- On an `ERROR:`/`WARNING:` response, keep the <ase-task-id/>
49
+ `text` output. Only on a clean response set
50
+ <ase-task-id><text/></ase-task-id>. On an `ERROR:`/`WARNING:`
51
+ response, silently ignore the MCP error (deviating from the
52
+ generic MCP error rule) and keep the <ase-task-id/>
49
53
  inherited from the current context as the fallback.
50
54
 
51
55
  - Output: