@rse/ase 0.9.55 → 0.9.56

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 (78) hide show
  1. package/dst/ase-setup.js +4 -2
  2. package/dst/ase-statusline.js +6 -8
  3. package/dst/ase-task.js +36 -11
  4. package/package.json +5 -5
  5. package/plugin/.claude-plugin/plugin.json +1 -1
  6. package/plugin/.codex-plugin/plugin.json +1 -1
  7. package/plugin/.github/plugin/plugin.json +1 -1
  8. package/plugin/agents/ase-code-analyze.md +1 -1
  9. package/plugin/agents/ase-code-lint.md +4 -4
  10. package/plugin/agents/ase-meta-chat.md +1 -1
  11. package/plugin/agents/ase-meta-proximity.md +1 -1
  12. package/plugin/meta/ase-common-code.md +164 -1
  13. package/plugin/meta/ase-common-task.md +14 -13
  14. package/plugin/meta/ase-constitution.md +3 -3
  15. package/plugin/meta/ase-control.md +7 -7
  16. package/plugin/meta/ase-dialog.md +5 -4
  17. package/plugin/meta/ase-format-arch.md +7 -8
  18. package/plugin/meta/ase-format-spec.md +10 -11
  19. package/plugin/meta/ase-format-task.md +2 -2
  20. package/plugin/meta/ase-getopt.md +1 -1
  21. package/plugin/meta/ase-persona.md +3 -3
  22. package/plugin/meta/ase-skill.md +14 -24
  23. package/plugin/meta/ase-tenets.md +5 -5
  24. package/plugin/package.json +2 -2
  25. package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
  26. package/plugin/skills/ase-arch-analyze/help.md +1 -1
  27. package/plugin/skills/ase-arch-discover/SKILL.md +8 -6
  28. package/plugin/skills/ase-code-analyze/SKILL.md +1 -1
  29. package/plugin/skills/ase-code-analyze/help.md +1 -1
  30. package/plugin/skills/ase-code-craft/SKILL.md +2 -153
  31. package/plugin/skills/ase-code-craft/help.md +1 -1
  32. package/plugin/skills/ase-code-explain/SKILL.md +3 -3
  33. package/plugin/skills/ase-code-insight/SKILL.md +9 -7
  34. package/plugin/skills/ase-code-lint/SKILL.md +7 -5
  35. package/plugin/skills/ase-code-refactor/SKILL.md +4 -155
  36. package/plugin/skills/ase-code-resolve/SKILL.md +8 -159
  37. package/plugin/skills/ase-docs-distill/SKILL.md +2 -2
  38. package/plugin/skills/ase-docs-distill/help.md +1 -1
  39. package/plugin/skills/ase-docs-proofread/SKILL.md +7 -3
  40. package/plugin/skills/ase-help-intent/SKILL.md +33 -9
  41. package/plugin/skills/ase-help-skill/SKILL.md +1 -1
  42. package/plugin/skills/ase-meta-brainstorm/SKILL.md +11 -2
  43. package/plugin/skills/ase-meta-changelog/SKILL.md +12 -8
  44. package/plugin/skills/ase-meta-commit/SKILL.md +11 -1
  45. package/plugin/skills/ase-meta-compat/SKILL.md +2 -2
  46. package/plugin/skills/ase-meta-config/help.md +1 -1
  47. package/plugin/skills/ase-meta-diaboli/SKILL.md +12 -3
  48. package/plugin/skills/ase-meta-diff/SKILL.md +11 -13
  49. package/plugin/skills/ase-meta-eli5/SKILL.md +3 -3
  50. package/plugin/skills/ase-meta-eli5/help.md +1 -1
  51. package/plugin/skills/ase-meta-evaluate/SKILL.md +3 -3
  52. package/plugin/skills/ase-meta-quorum/SKILL.md +17 -17
  53. package/plugin/skills/ase-meta-quotes/SKILL.md +1 -1
  54. package/plugin/skills/ase-meta-review/SKILL.md +7 -5
  55. package/plugin/skills/ase-meta-review/help.md +2 -2
  56. package/plugin/skills/ase-meta-search/SKILL.md +18 -0
  57. package/plugin/skills/ase-meta-steelman/SKILL.md +11 -2
  58. package/plugin/skills/ase-meta-why/SKILL.md +15 -6
  59. package/plugin/skills/ase-meta-why/help.md +3 -3
  60. package/plugin/skills/ase-sync-export/SKILL.md +2 -1
  61. package/plugin/skills/ase-sync-export/help.md +1 -1
  62. package/plugin/skills/ase-sync-reconcile/SKILL.md +16 -2
  63. package/plugin/skills/ase-task-condense/SKILL.md +13 -67
  64. package/plugin/skills/ase-task-delete/SKILL.md +1 -1
  65. package/plugin/skills/ase-task-dissect/SKILL.md +5 -18
  66. package/plugin/skills/ase-task-edit/SKILL.md +49 -22
  67. package/plugin/skills/ase-task-grill/SKILL.md +31 -129
  68. package/plugin/skills/ase-task-id/SKILL.md +12 -2
  69. package/plugin/skills/ase-task-implement/SKILL.md +11 -7
  70. package/plugin/skills/ase-task-implement/help.md +1 -1
  71. package/plugin/skills/ase-task-list/SKILL.md +9 -0
  72. package/plugin/skills/ase-task-preflight/SKILL.md +13 -7
  73. package/plugin/skills/ase-task-reboot/SKILL.md +18 -61
  74. package/plugin/skills/ase-task-reboot/help.md +1 -1
  75. package/plugin/skills/ase-task-view/SKILL.md +4 -2
  76. package/dst/ase-guidance.js +0 -89
  77. package/dst/ase-persona.js +0 -87
  78. package/dst/ase-stdout.js +0 -18
@@ -21,7 +21,7 @@ Condense a Task Plan
21
21
 
22
22
  <expand name="getopt"
23
23
  arg1="ase-task-condense"
24
- arg2="--next|-n=(none|DONE|EDIT|IMPLEMENT|PREFLIGHT)...">
24
+ arg2="--next|-n=(none|DONE|EDIT|IMPLEMENT|PREFLIGHT)... --int-reuse-task">
25
25
  $ARGUMENTS
26
26
  </expand>
27
27
 
@@ -48,52 +48,21 @@ Set <args></args> (set args to empty).
48
48
 
49
49
  1. **Determine Task:**
50
50
 
51
- 1. Set <id><getopt-arguments/></id> initially.
51
+ 1. Set <instruction><getopt-arguments/></instruction> initially, with any
52
+ leading and trailing whitespace stripped.
52
53
  Inherit the always existing <ase-task-id/> from the current context.
53
54
  Inherit the always existing <ase-session-id/> from the current context.
54
55
  Do not output anything.
55
56
 
56
57
  2. React on task id:
57
58
 
58
- 1. <if condition="
59
- <id/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`
60
- ">
61
- Set <ase-task-id><id/></ase-task-id> (set task id) and
62
- call the `ase_task_id(id: "<ase-task-id/>",
63
- session: "<ase-session-id/>")` tool from the `ase` MCP
64
- server to switch the task, and then only output the
65
- following <template/>:
66
-
67
- <template>
68
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task given**
69
- </template>
70
- </if>
71
-
72
- 2. <elseif condition="<id/> is NOT empty">
73
- The argument is neither empty nor a valid task id. As this
74
- skill only accepts an optional `[<id>]` argument and *never*
75
- a free-text instruction, only output the following <template/>
76
- and then immediately *STOP* processing the entire current skill:
77
-
78
- <template>
79
- ⧉ **ASE**: ☻ skill: **ase-task-condense**, ▶ ERROR: expected single `[<id>]` argument
80
- </template>
81
- </elseif>
59
+ <expand name="task-react-id" arg1="ase-task-condense"></expand>
82
60
 
83
61
  2. **Determine Operation:**
84
62
 
85
- 1. Call the `ase_task_load(id: "<ase-task-id/>")` tool of the `ase` MCP
86
- server to load the current task plan content and set <text/> to
87
- the `text` output field of the `ase_task_load` tool call.
63
+ 1. Determine the current task plan content:
88
64
 
89
- - If <text/> starts with `ERROR:` or `WARNING:`:
90
- Silently ignore the MCP error.
91
- Set <task-content></task-content> (set task content to empty).
92
- Set <words/> to "0".
93
-
94
- - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
95
- Set <task-content><text/></task-content> (set task content to text).
96
- Calculate the number of words <words/> of <task-content/>.
65
+ <expand name="task-load-content"></expand>
97
66
 
98
67
  Set <words-before><words/></words-before> (remember the loaded
99
68
  word count for the strictly-smaller check in step 3).
@@ -104,12 +73,6 @@ Set <args></args> (set args to empty).
104
73
  into the condensed <task-content/> in step 3).
105
74
  </if>
106
75
 
107
- Only output the following <template/>:
108
-
109
- <template>
110
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan loaded**
111
- </template>
112
-
113
76
  2. <if condition="<task-content/> is empty">
114
77
  Complain and tell the user to use the `ase-code-resolve`,
115
78
  `ase-code-refactor`, `ase-code-craft`, or `ase-task-edit` skills
@@ -147,33 +110,14 @@ Set <args></args> (set args to empty).
147
110
  per-line convention of the plan <format/>, but *never*
148
111
  break a line *inside* an inline code span.
149
112
  - *Merge* genuinely-redundant bullets (the same aspect
150
- restated) and *drop* pure duplication - but *only* when
113
+ restated) and *drop* pure duplication -- but *only* when
151
114
  truly redundant; *never* lose a distinct aspect.
152
115
 
153
- 3. *Normalize the rendering artifacts*: the loaded
154
- <task-content/> is the *rendering-prepared* variant of the
155
- plan, whose artifacts *MUST NOT* be persisted back. Restore
156
- the *authoring form* of the plan <format/> before saving:
157
-
158
- - A bullet point rendered as `◯ ` is written back as
159
- `- ` -- the condensed <task-content/> *MUST NOT*
160
- contain a single `◯` marker.
161
-
162
- - An inline code span which the rendering split across two
163
- physical lines into two spans (`` `<head/>` `` at a line
164
- end and `` `<tail/>` `` at the next line start) is
165
- written back as the *one* original span
166
- `` `<head/> <tail/>` ``, and the line is then broken
167
- *before* its opening backtick.
168
-
169
- This normalization is *not* a semantic change and hence
170
- *never* violates the preserve-exactly rule 1.
171
-
172
- 4. *Persona override*: this condense ruleset *always wins* for
116
+ 3. *Persona override*: this condense ruleset *always wins* for
173
117
  the plan content. This ruleset-based compression is applied
174
118
  *regardless* of the currently active session persona style.
175
119
 
176
- 5. *Hard guardrail - semantics preserved EXACTLY*: condensing
120
+ 4. *Hard guardrail -- semantics preserved EXACTLY*: condensing
177
121
  *only* shortens wording. It *MUST NOT* drop, merge (except
178
122
  truly-redundant bullets per sub-item 2), reorder, or alter
179
123
  *any* factual claim, requirement, file path, rule, or
@@ -188,8 +132,10 @@ Set <args></args> (set args to empty).
188
132
  </if>
189
133
 
190
134
  - <if condition="<words/> is NOT strictly smaller than <words-before/>">
191
- Do *not* save and do *not* bump the timestamp. Only output
192
- the following <template/>:
135
+ Do *not* save and do *not* bump the timestamp. Set
136
+ <words><words-before/></words> (report the word count of the
137
+ *unchanged* stored plan, not of the discarded condensed one).
138
+ Only output the following <template/>:
193
139
 
194
140
  <template>
195
141
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan already condensed**
@@ -66,7 +66,7 @@ Procedure
66
66
  ⧉ **ASE**: ◉ task: **<id/>**, ▶ status: **<text/>**
67
67
  </template>
68
68
 
69
- - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
69
+ - If <text/> does NOT start with `ERROR:` and NOT with `WARNING:`:
70
70
  Set <deleted>true</deleted> and only output the following
71
71
  <template/>:
72
72
 
@@ -204,6 +204,11 @@ Procedure
204
204
  following the plan <format/>, where:
205
205
 
206
206
  - the <task-id/> is <part-id/>,
207
+ - the <task-status/> is `DRAFTED` and the <task-properties/>
208
+ is `none`, as every part is a *newly created* plan,
209
+ - the <task-kind/> is taken over from the epic *verbatim*,
210
+ or inferred from the part content if the epic carries no
211
+ `Kind:` key,
207
212
  - the <title/> is derived from the part's <scope/>,
208
213
  - the `## CONTEXT` section carries a part-local
209
214
  <summary-what/> and <summary-why/>, derived from the
@@ -225,24 +230,6 @@ Procedure
225
230
  *MUST* still reproduce the original bullet point *completely*
226
231
  and *without* duplication.
227
232
 
228
- The loaded <task-content/> is the *rendering-prepared*
229
- variant of the epic, so it carries artifacts which *MUST NOT*
230
- leak into the persisted <part-content/>. While copying, you
231
- *MUST* *normalize* every taken-over bullet point back into
232
- the authoring form of the plan <format/>:
233
-
234
- - *Restore the bullet markers*: a bullet point rendered as
235
- `◯ ` is written back as `- ` -- <part-content/>
236
- *MUST NOT* contain a single `◯` marker.
237
-
238
- - *Re-join split code spans*: an inline code span which the
239
- rendering split across two physical lines into two spans
240
- (`` `<head/>` `` at a line end and `` `<tail/>` `` at the
241
- next line start) is written back as the *one* original
242
- span `` `<head/> <tail/>` ``, and the line is then broken
243
- *before* its opening backtick, per the line-breaking
244
- rules of the plan <format/>.
245
-
246
233
  <if condition="<task-content/> does NOT contain a `## VERIFICATION` section heading">
247
234
  The epic itself deliberately *omits* the `## VERIFICATION`
248
235
  section, so you *MUST* omit this section (including its
@@ -177,22 +177,31 @@ Set <args></args> (set args to empty).
177
177
 
178
178
  <if condition="
179
179
  <getopt-option-int-reuse-task/> is equal `true`
180
- *and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call
180
+ *and* an `ase_task_save(id: '<ase-task-id/>', ...)` tool call
181
181
  exists earlier in the current session
182
182
  ">
183
- Set <text/> to the `text` *output* field of the most recent
183
+ Set <text/> to the `text` *argument* of the most recent
184
184
  `ase_task_save(id: '<ase-task-id/>', ...)` tool call -- this
185
- is the rendering-prepared plan content and *MUST NOT* be
186
- confused with the `text` *argument* passed into that call --
187
- *without* calling `ase_task_load` again. Set <status>plan
188
- reused</status>. Do not output anything.
185
+ is the *authoring form* of the plan and *MUST NOT* be
186
+ confused with the `text` *output* field of that call --
187
+ *without* calling `ase_task_load` again. Set
188
+ <task-render></task-render> (set the rendering-prepared plan
189
+ to empty, as it is re-derived in step 3.2 or 3.3). Set
190
+ <status>plan reused</status>. Do not output anything.
189
191
  </if>
190
192
  <else>
191
- Call the `ase_task_load(id: "<ase-task-id/>")` tool of the
192
- `ase` MCP server to load any existing plan content and set
193
- <text/> to the `text` output field of this `ase_task_load`
194
- tool call. Do not output anything related to this MCP tool
195
- call. Set <status>plan loaded</status>.
193
+ Call the `ase_task_load(id: "<ase-task-id/>", variant:
194
+ "both")` tool of the `ase` MCP server to load any existing
195
+ plan content in *both* of its forms. From the `text` output
196
+ field of this `ase_task_load` tool call, set <text/> to the
197
+ content enclosed in the `<task-plan-source>` delimiter lines
198
+ (the *authoring form*, the only form which is ever edited and
199
+ persisted) and set <task-render/> to the content enclosed in
200
+ the `<task-plan-render>` delimiter lines (the
201
+ *rendering-prepared* form, used for *display only*). The
202
+ delimiter lines themselves are *never* part of either form.
203
+ Do not output anything related to this MCP tool call. Set
204
+ <status>plan loaded</status>.
196
205
  </else>
197
206
 
198
207
  Set <task-content-dirty>false</task-content-dirty>.
@@ -200,6 +209,7 @@ Set <args></args> (set args to empty).
200
209
  - If <text/> starts with `ERROR:` or `WARNING:`:
201
210
  Silently ignore the MCP error.
202
211
  Set <task-content/> to empty.
212
+ Set <task-render/> to empty.
203
213
  Set <words/> to "0".
204
214
  Do not output anything.
205
215
 
@@ -232,7 +242,7 @@ Set <args></args> (set args to empty).
232
242
  *Determine previous-plan handling*:
233
243
 
234
244
  - If <getopt-option-plan/> matches the regex `^(OVERWRITE|REFINE|PRESERVE)$`:
235
- Honor the pre-selection what to do with the previous plan.
245
+ Honor the pre-selection of what to do with the previous plan.
236
246
  Set <result><getopt-option-plan/></result>.
237
247
 
238
248
  - If <getopt-option-plan/> is equal to `none`:
@@ -326,7 +336,7 @@ Set <args></args> (set args to empty).
326
336
  Update <timestamp-modified/> with the current time in
327
337
  ISO-style format, which has to be determined by calling the
328
338
  `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the `ase`
329
- MCP server and use the `text` field of its response. Update
339
+ MCP server and using the `text` field of its response. Update
330
340
  the `Modified: ...` frontmatter key of <task-content/> with the
331
341
  new <timestamp-modified/> value.
332
342
  Do not output anything.
@@ -334,18 +344,34 @@ Set <args></args> (set args to empty).
334
344
 
335
345
  2. *Persist plan*:
336
346
  <if condition="<task-content-dirty/> is 'true'">
337
- Call the `ase_task_save(id: "<ase-task-id/>", text: "<task-content/>")` tool
338
- of the `ase` MCP server to persist the current plan, and then
339
- set <task-content-dirty>false</task-content-dirty> again. Calculate the
340
- number of words <words/> of <task-content/>. Do not output anything
341
- related to this MCP tool call except the following <template/>:
347
+ Call the `ase_task_save(id: "<ase-task-id/>", text:
348
+ "<task-content/>", render: true)` tool of the `ase` MCP server to
349
+ persist the current plan -- <task-content/> always is the
350
+ *authoring form* of the plan and hence is persisted *as is* --
351
+ and then set <task-content-dirty>false</task-content-dirty>
352
+ again. Finally, set <task-render/> to the `text` *output* field
353
+ of this `ase_task_save` tool call -- the rendering-prepared form
354
+ of the just-persisted plan, which is for *display only* and
355
+ *MUST NOT* be confused with the `text` *argument* passed into
356
+ that call -- so the rendering in step 3.3 stays consistent across
357
+ all loop rounds. Calculate the number of words <words/> of
358
+ <task-content/>. Do not output anything related to this MCP tool
359
+ call except the following <template/>:
342
360
 
343
361
  <template>
344
362
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan saved**
345
363
  </template>
346
364
  </if>
347
365
 
348
- 3. *Render plan*: Treat <task-content/> as *verbatim* Markdown.
366
+ 3. *Render plan*:
367
+ <if condition="<task-render/> is empty">
368
+ Call the `ase_markdown_prepare(text: "<task-content/>")` tool of
369
+ the `ase` MCP server and set <task-render/> to the `text` output
370
+ field of this tool call. Do not output anything related to this
371
+ MCP tool call.
372
+ </if>
373
+
374
+ Treat <task-render/> as *verbatim* Markdown.
349
375
 
350
376
  For the *rendering only*, drop the leading *frontmatter* block --
351
377
  both `---` delimiters and all of their keys -- and instead place
@@ -356,7 +382,8 @@ Set <args></args> (set args to empty).
356
382
  frontmatter block sits in the plan file, and *MUST NOT* be moved
357
383
  below it. This keeps the `---` delimiters from rendering as a
358
384
  horizontal rule plus a *setext heading*. This rewrite is
359
- *display-only* and *MUST NOT* change <task-content/> itself:
385
+ *display-only* and *MUST NOT* change <task-render/> or
386
+ <task-content/> itself:
360
387
 
361
388
  <format>
362
389
  ◉ **Id:** <task-id/>
@@ -368,7 +395,7 @@ Set <args></args> (set args to empty).
368
395
  </format>
369
396
 
370
397
  Only output the following <template/>, so the user
371
- can read the plan and react to it. If <task-content/> is longer
398
+ can read the plan and react to it. If <task-render/> is longer
372
399
  than 90 lines and a `## IMPLEMENTATION DRAFT` section (from the
373
400
  companion skill `ase-task-preflight`) exists, replace the entire
374
401
  content of the `## IMPLEMENTATION DRAFT` section with `[...]`.
@@ -377,7 +404,7 @@ Set <args></args> (set args to empty).
377
404
 
378
405
  <template>
379
406
  <ase-tpl-head title="TASK" subtitle="<task-id/>"/>
380
- <task-content/>
407
+ <task-render/>
381
408
  <ase-tpl-foot title="TASK" subtitle="<task-id/>"/>
382
409
  </template>
383
410
 
@@ -32,6 +32,7 @@ task plan until reaching a shared understanding.
32
32
  </objective>
33
33
 
34
34
  @${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md
35
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-task.md
35
36
 
36
37
  Procedure
37
38
  ---------
@@ -45,80 +46,23 @@ Set <args>--int-reuse-task</args>.
45
46
 
46
47
  1. **Determine Task:**
47
48
 
48
- 1. Set <id><getopt-arguments/></id> initially.
49
+ 1. Set <instruction><getopt-arguments/></instruction> initially, with any
50
+ leading and trailing whitespace stripped.
49
51
  Inherit the always existing <ase-task-id/> from the current context.
50
52
  Inherit the always existing <ase-session-id/> from the current context.
51
53
  Do not output anything.
52
54
 
53
55
  2. React on task id:
54
56
 
55
- 1. <if condition="
56
- <id/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`
57
- ">
58
- Set <ase-task-id><id/></ase-task-id> (set task id) and
59
- call the `ase_task_id(id: "<ase-task-id/>", session:
60
- "<ase-session-id/>")` tool from the `ase` MCP server
61
- to switch the task, and then only output the following
62
- <template/>:
63
-
64
- <template>
65
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task given**
66
- </template>
67
- </if>
68
-
69
- 2. <elseif condition="<id/> is NOT empty">
70
- The argument is neither empty nor a valid task id. As this
71
- skill only accepts an optional `[<id>]` argument and *never*
72
- a free-text instruction, only output the following <template/>
73
- and then immediately *STOP* processing the entire current skill:
74
-
75
- <template>
76
- ⧉ **ASE**: ☻ skill: **ase-task-grill**, ▶ ERROR: expected single `[<id>]` argument
77
- </template>
78
- </elseif>
57
+ <expand name="task-react-id" arg1="ase-task-grill"></expand>
79
58
 
80
59
  2. **Determine Task Plan:**
81
60
 
82
61
  1. Determine the current task plan content:
83
62
 
84
- <if condition="
85
- <getopt-option-int-reuse-task/> is equal `true`
86
- *and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call
87
- exists earlier in the current session
88
- ">
89
- Set <text/> to the `text` *output* field of the most recent
90
- `ase_task_save(id: '<ase-task-id/>', ...)` tool call -- this
91
- is the rendering-prepared plan content and *MUST NOT* be
92
- confused with the `text` *argument* passed into that call --
93
- *without* calling `ase_task_load` again. Set <status>plan
94
- reused</status>. Do not output anything.
95
- </if>
96
- <else>
97
- Call the `ase_task_load(id: "<ase-task-id/>")` tool of the
98
- `ase` MCP server to load the current task plan content and
99
- set <text/> to the `text` output field of this `ase_task_load`
100
- tool call. Do not output anything related to this MCP tool
101
- call. Set <status>plan loaded</status>.
102
- </else>
103
-
104
- - If <text/> starts with `ERROR:` or `WARNING:`:
105
- Output the following <template/> and then immediately *STOP*
106
- processing the entire current skill:
107
-
108
- <template>
109
- ⧉ **ASE**: ☻ skill: **ase-task-grill**, ▶ **<text/>**
110
- </template>
111
-
112
- - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
113
- Set <plan><text/></plan> (set plan to text).
114
- Calculate the number of words <words/> of <plan/>.
115
- Then output the following <template/>:
63
+ <expand name="task-load-content"></expand>
116
64
 
117
- <template>
118
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<status/>**
119
- </template>
120
-
121
- 2. <if condition="<plan/> is empty">
65
+ 2. <if condition="<task-content/> is empty">
122
66
  Complain and tell the user to use the `ase-code-resolve`,
123
67
  `ase-code-refactor`, `ase-code-craft`, or `ase-task-edit` skills
124
68
  first to create a task plan. Then immediately stop processing
@@ -128,16 +72,16 @@ Set <args>--int-reuse-task</args>.
128
72
  3. **Iterate Over Task Plan Aspects:**
129
73
 
130
74
  Interactively interview the user *relentlessly* about every
131
- *essential aspect* of the task plan in <plan/> *until* reaching a
75
+ *essential aspect* of the task plan in <task-content/> *until* reaching a
132
76
  shared understanding and no decisions/questions are left open.
133
77
 
134
- This especially means, you *MUST* clarify as many aspects as
78
+ This especially means that you *MUST* clarify as many aspects as
135
79
  necessary to ensure that for at least the most important decisions,
136
- during a subsequent implementation, no essential freedom of choices
137
- exist any longer.
80
+ during a subsequent implementation, no essential freedom of choice
81
+ exists any longer.
138
82
 
139
83
  For this process, determine the <n/> essential aspects <aspect-N/>
140
- (a one or two word long short identifier like `Foo` or `Bar-Baz`)
84
+ (a one- or two-word-long short identifier like `Foo` or `Bar-Baz`)
141
85
  and the corresponding decision/question <question-N/> where a shared
142
86
  understanding is required.
143
87
 
@@ -165,7 +109,7 @@ Set <args>--int-reuse-task</args>.
165
109
  Then create a decisions/questions tree for them. Walk down each
166
110
  branch of this decision tree, resolving dependencies between
167
111
  decisions one-by-one. Ask the questions <question-N/> and determine
168
- corresponding answer <answer-N/>, one at a time.
112
+ the corresponding answer <answer-N/>, one at a time.
169
113
 
170
114
  1. For each question <question-N/> in the iteration cycle <N/>:
171
115
 
@@ -177,7 +121,7 @@ Set <args>--int-reuse-task</args>.
177
121
 
178
122
  2. Determine the answer alternatives:
179
123
 
180
- 1. Check the <plan/> for the answer <answer-N-1/>.
124
+ 1. Check the <task-content/> for the answer <answer-N-1/>.
181
125
 
182
126
  2. Check the code base and your world knowledge and
183
127
  use this information to find *up to three* grounded
@@ -214,75 +158,33 @@ Set <args>--int-reuse-task</args>.
214
158
  <ase-tpl-bullet-normal/> ASPECT <N/>/<n/>: **<aspect-N/>**, ANSWER: **<answer-N/>**
215
159
  </template>
216
160
 
217
- 2. Finally, update the plan in <plan/> based on all answers <answer-N/>.
161
+ 2. Finally, update <task-content/> based on all answers <answer-N/>.
218
162
 
219
- 3. <if condition="the frontmatter of <plan/> carries a `Created: <text/>` key">
163
+ 3. <if condition="the frontmatter of <task-content/> carries a `Created: <text/>` key">
220
164
  Set <timestamp-created><text/></timestamp-created> (set
221
- timestamp-created to extracted text)
165
+ timestamp-created to extracted text).
222
166
  </if>
223
167
 
224
- 4. Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
225
- `ase` MCP server and use the `text` field of its response for
226
- <timestamp-modified/> information. If <timestamp-created/> is
227
- still unset (because the previous <plan/> had no `Created:`
228
- frontmatter key), set <timestamp-created><timestamp-modified/></timestamp-created>
229
- (fall back to the modified timestamp). Then insert the current
230
- <ase-task-id/>, previous <timestamp-created/>, and refreshed
231
- <timestamp-modified/> information into the frontmatter keys `Id:`,
232
- `Created:`, and `Modified:` and calculate the number of
233
- words <words/> of <plan/>. Additionally *add* the value `grilled`
234
- to the `Properties:` frontmatter key if it is still absent,
235
- keeping all already present values and *creating* the whole key
236
- (with the single value `grilled`) if the plan carries none.
237
-
238
- 5. Call the `ase_task_save(id: "<ase-task-id/>",
239
- text: "<plan/>")` tool of the `ase` MCP server to save the updated
240
- task plan content. Do not output anything related to this MCP
241
- call.
242
-
243
- 6. Only output the following <template/> and continue processing:
244
-
245
- <template>
246
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated**
247
- </template>
168
+ 4. *Add* the value `grilled` to the `Properties:` frontmatter key of
169
+ <task-content/> if it is still absent, keeping all already
170
+ present values and *creating* the whole key (with the single
171
+ value `grilled`) if the plan carries none.
172
+
173
+ 5. <expand name="task-save-content" arg1="plan updated"></expand>
248
174
 
249
175
  4. **Decide Next Step:**
250
176
 
251
177
  1. *Determine next step*:
252
178
 
253
- - If <getopt-option-next/> is not equal to `none`:
254
- Treat <getopt-option-next/> as a comma-separated chronological
255
- list of pre-selected next-step tokens. *Split* it on `,`,
256
- take the *first* token as <head/>, and store the remaining
257
- tokens (joined back with `,`, or `none` if empty) into
258
- <getopt-option-next/> so downstream skills can consume the tail.
259
-
260
- - If <head/> matches the regex `^(DONE|EDIT|IMPLEMENT|PREFLIGHT)$`:
261
- Honor the pre-selected token.
262
- Set <result><head/></result>.
263
-
264
- - else:
265
- Only output the following <template/> and then immediately
266
- *STOP* processing the entire current skill:
267
-
268
- <template>
269
- ⧉ **ASE**: ☻ skill: **ase-task-grill**, ▶ ERROR: invalid `--next` token: **<head/>**
270
- </template>
271
-
272
- - If <getopt-option-next/> is equal to `none`:
273
-
274
- In the following, you *MUST* *NOT* use your built-in
275
- <user-dialog-tool/> tool! Instead, you *MUST* just show a
276
- custom dialog according to the expanded `custom-dialog`
277
- definition. You *MUST* closely follow this definition:
278
-
279
- <expand name="custom-dialog" arg1="--no-other">
280
- Next Step: How would you like to proceed with the plan?
281
- DONE: Stop processing.
282
- EDIT: Hand off plan to editing.
283
- PREFLIGHT: Hand off plan to pre-flighting.
284
- IMPLEMENT: Hand off plan to implementation.
285
- </expand>
179
+ <expand name="task-next-select"
180
+ arg1="ase-task-grill"
181
+ arg2="DONE|EDIT|IMPLEMENT|PREFLIGHT">
182
+ Next Step: How would you like to proceed with the plan?
183
+ DONE: Stop processing.
184
+ EDIT: Hand off plan to editing.
185
+ PREFLIGHT: Hand off plan to pre-flighting.
186
+ IMPLEMENT: Hand off plan to implementation.
187
+ </expand>
286
188
 
287
189
  2. Check the tool <result/> and dispatch accordingly:
288
190
 
@@ -60,8 +60,18 @@ Procedure
60
60
 
61
61
  4. <if condition="<request/> is NOT empty">
62
62
  - Call the `ase_task_id(id: "<request/>", session: "<ase-session-id/>")`
63
- tool from the `ase` MCP server. Check the response as mandated
64
- above; only on a clean response set <ase-task-id><request/></ase-task-id>.
63
+ tool from the `ase` MCP server and set <text/> to its `text`
64
+ output. On an `ERROR:`/`WARNING:` response, silently ignore the
65
+ MCP error (deviating from the generic MCP error rule), keep the
66
+ <ase-task-id/> inherited from the current context, and only
67
+ output the following <template/> and then immediately *STOP*
68
+ processing the entire current skill:
69
+
70
+ <template>
71
+ ⧉ **ASE**: ☻ skill: **ase-task-id**, ▶ ERROR: failed to switch to task `<request/>`
72
+ </template>
73
+
74
+ - Only on a clean response set <ase-task-id><request/></ase-task-id>.
65
75
 
66
76
  - Output:
67
77
  <template>
@@ -75,7 +75,7 @@ Procedure
75
75
  </if>
76
76
 
77
77
  1. Set <worktree-name><ase-task-id/></worktree-name>. The worktree
78
- is *never* named by an own option value: it always carries the
78
+ is *never* named by its own option value: it always carries the
79
79
  unique *task id*, so the worktree directory and its branch stay
80
80
  unambiguously tied to the very task plan implemented in them.
81
81
  The task id is a plain identifier by construction, hence it is
@@ -89,7 +89,7 @@ Procedure
89
89
  `git rev-parse --show-toplevel`
90
90
 
91
91
  <if condition="this command fails">
92
- The current directory is no Git repository, so no worktree can be
92
+ The current directory is not a Git repository, so no worktree can be
93
93
  created. Only output the following <template/> and then
94
94
  immediately *STOP* processing the entire current skill, leaving
95
95
  the working copy *untouched*:
@@ -204,17 +204,21 @@ Procedure
204
204
 
205
205
  - Set the `Status:` key to `COMPLETED`, but *only* if the
206
206
  change set was applied *completely* and *successfully* --
207
- this traverses the `start` and `complete` transitions of the
208
- state machine of the plan <format/> in one go. Otherwise
209
- leave the `Status:` key *untouched*, as an incomplete run
210
- transitioned nowhere.
207
+ this traverses the `approve`, `start`, and `complete`
208
+ transitions of the state machine of the plan <format/> in one
209
+ go, starting from the `DRAFTED` state which a freshly authored
210
+ plan carries. Otherwise leave the `Status:` key *untouched*,
211
+ as an incomplete run transitioned nowhere.
211
212
 
212
213
  - Refresh the `Modified:` key with the current time in
213
214
  ISO-style format, determined by calling the
214
215
  `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the `ase`
215
216
  MCP server.
216
217
 
217
- Then call the `ase_task_save(id: "<ase-task-id/>", text:
218
+ Apart from the frontmatter keys above, the plan body *MUST* stay
219
+ *exactly* as loaded.
220
+
221
+ Finally call the `ase_task_save(id: "<ase-task-id/>", text:
218
222
  "<task-content/>")` tool of the `ase` MCP server to persist the
219
223
  updated task plan. Do not output anything in this sub-step.
220
224
 
@@ -16,7 +16,7 @@
16
16
  The `ase-task-implement` skill performs the *final implementation* of
17
17
  a task plan by modifying the corresponding *artifacts* with a complete
18
18
  *change set*. The plan is loaded and any optional `IMPLEMENTATION DRAFT`
19
- section produced by `ase-task-preflight` is used as a hint - the plain
19
+ section produced by `ase-task-preflight` is used as a hint -- the plain
20
20
  plan content always overrules the draft. Afterwards the plan's
21
21
  `Properties:` frontmatter key gains the value `implemented` (plus
22
22
  `verified`, if the verification phase actually ran and succeeded), and
@@ -55,6 +55,15 @@ Procedure
55
55
  ⧉ **ASE**: ✪ skill: **ase-task-list**, ▶ ERROR: options `--include` and `--exclude` cancel out to an empty state set
56
56
  </template>
57
57
 
58
+ Directly *after* this error <template/>, and *before* stopping, give
59
+ the corrective hint by expanding the following (which, depending on
60
+ the configured <ase-guidance-level/>, may expand into nothing and
61
+ hence emit no output at all):
62
+
63
+ <ase-tpl-hint level="minimal">
64
+ The `--exclude` default `COMPLETED,CANCELLED` still applies -- add `--exclude none` to reach states like `COMPLETED` via `--include`.
65
+ </ase-tpl-hint>
66
+
58
67
  2. Call the `ase_task_list(verbose: <getopt-option-verbose/>)` tool from
59
68
  the `ase` MCP server. The result is a structured object with a
60
69
  `tasks` array where each entry has an `id` and a `status` field, and