@rse/ase 0.9.51 → 0.9.52

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 (66) hide show
  1. package/dst/ase-task.js +7 -2
  2. package/package.json +7 -7
  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/etc/stx.conf +2 -2
  7. package/plugin/meta/ase-common-dissect.md +110 -0
  8. package/plugin/meta/ase-common-task.md +5 -3
  9. package/plugin/meta/ase-control.md +53 -0
  10. package/plugin/meta/ase-format-task.md +6 -0
  11. package/plugin/meta/ase-skill.md +8 -8
  12. package/plugin/package.json +2 -2
  13. package/plugin/skills/ase-arch-analyze/SKILL.md +23 -12
  14. package/plugin/skills/ase-arch-analyze/help.md +16 -0
  15. package/plugin/skills/ase-arch-discover/SKILL.md +2 -2
  16. package/plugin/skills/ase-code-analyze/SKILL.md +27 -18
  17. package/plugin/skills/ase-code-analyze/help.md +15 -0
  18. package/plugin/skills/ase-code-craft/SKILL.md +2 -2
  19. package/plugin/skills/ase-code-dissect/SKILL.md +380 -0
  20. package/plugin/skills/ase-code-dissect/help.md +121 -0
  21. package/plugin/skills/ase-code-explain/SKILL.md +2 -2
  22. package/plugin/skills/ase-code-insight/SKILL.md +2 -2
  23. package/plugin/skills/ase-code-lint/SKILL.md +2 -2
  24. package/plugin/skills/ase-code-refactor/SKILL.md +2 -2
  25. package/plugin/skills/ase-code-resolve/SKILL.md +2 -2
  26. package/plugin/skills/ase-docs-distill/SKILL.md +2 -2
  27. package/plugin/skills/ase-docs-proofread/SKILL.md +2 -2
  28. package/plugin/skills/ase-help-intent/SKILL.md +2 -2
  29. package/plugin/skills/ase-help-skill/SKILL.md +2 -2
  30. package/plugin/skills/ase-help-skill/catalog.md +3 -0
  31. package/plugin/skills/ase-meta-brainstorm/SKILL.md +2 -2
  32. package/plugin/skills/ase-meta-changelog/SKILL.md +2 -2
  33. package/plugin/skills/ase-meta-chat/SKILL.md +2 -2
  34. package/plugin/skills/ase-meta-commit/SKILL.md +2 -2
  35. package/plugin/skills/ase-meta-config/SKILL.md +2 -2
  36. package/plugin/skills/ase-meta-diaboli/SKILL.md +2 -2
  37. package/plugin/skills/ase-meta-diff/SKILL.md +2 -2
  38. package/plugin/skills/ase-meta-eli5/SKILL.md +2 -2
  39. package/plugin/skills/ase-meta-evaluate/SKILL.md +2 -2
  40. package/plugin/skills/ase-meta-proximity/SKILL.md +2 -2
  41. package/plugin/skills/ase-meta-quorum/SKILL.md +2 -2
  42. package/plugin/skills/ase-meta-quotes/SKILL.md +2 -2
  43. package/plugin/skills/ase-meta-review/SKILL.md +2 -2
  44. package/plugin/skills/ase-meta-search/SKILL.md +2 -2
  45. package/plugin/skills/ase-meta-steelman/SKILL.md +2 -2
  46. package/plugin/skills/ase-meta-why/SKILL.md +2 -2
  47. package/plugin/skills/ase-meta-workflow/SKILL.md +378 -0
  48. package/plugin/skills/ase-meta-workflow/help.md +117 -0
  49. package/plugin/skills/ase-meta-workflow/sample.md +70 -0
  50. package/plugin/skills/ase-meta-workflow/workflow.txt +97 -0
  51. package/plugin/skills/ase-sync-export/SKILL.md +2 -2
  52. package/plugin/skills/ase-sync-import/SKILL.md +2 -2
  53. package/plugin/skills/ase-sync-reconcile/SKILL.md +2 -2
  54. package/plugin/skills/ase-task-condense/SKILL.md +26 -6
  55. package/plugin/skills/ase-task-delete/SKILL.md +2 -2
  56. package/plugin/skills/ase-task-dissect/SKILL.md +299 -0
  57. package/plugin/skills/ase-task-dissect/help.md +114 -0
  58. package/plugin/skills/ase-task-edit/SKILL.md +6 -4
  59. package/plugin/skills/ase-task-grill/SKILL.md +6 -4
  60. package/plugin/skills/ase-task-id/SKILL.md +2 -2
  61. package/plugin/skills/ase-task-implement/SKILL.md +2 -2
  62. package/plugin/skills/ase-task-list/SKILL.md +2 -2
  63. package/plugin/skills/ase-task-preflight/SKILL.md +2 -2
  64. package/plugin/skills/ase-task-reboot/SKILL.md +12 -6
  65. package/plugin/skills/ase-task-rename/SKILL.md +2 -2
  66. package/plugin/skills/ase-task-view/SKILL.md +2 -2
@@ -0,0 +1,299 @@
1
+ ---
2
+ name: ase-task-dissect
3
+ argument-hint: "[--help|-h] [--max-parts|-m <count>] [--dry|-d] [--force|-f] [<task-id>[:]] [<dissect-hint>]"
4
+ description: >
5
+ Dissect the current or given task plan, treated as an epic,
6
+ domain-wise and logically into cohesive parts and materialize each
7
+ part as its own separate task plan. Use when the user calls to
8
+ "dissect", "split", "break up", or "decompose" a large "task" or
9
+ "plan".
10
+ user-invocable: true
11
+ disable-model-invocation: false
12
+ effort: high
13
+ ---
14
+
15
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
16
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
17
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
18
+
19
+ <purpose name="ase-task-dissect">
20
+ Dissect a Task Plan
21
+ </purpose>
22
+
23
+ <expand name="getopt"
24
+ arg1="ase-task-dissect"
25
+ arg2="--max-parts|-m=8 --dry|-d --force|-f --int-reuse-task">
26
+ $ARGUMENTS
27
+ </expand>
28
+
29
+ <objective>
30
+ *Dissect* a task plan, treated as an *epic*, domain-wise and logically
31
+ into *cohesive parts*, and materialize every part as its own separate
32
+ *task plan*.
33
+ </objective>
34
+
35
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md
36
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-task.md
37
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-dissect.md
38
+
39
+ Procedure
40
+ ---------
41
+
42
+ 1. **Determine Task and Hint:**
43
+
44
+ 1. Set <instruction><getopt-arguments/></instruction> initially,
45
+ with any leading and trailing whitespace stripped. Inherit the
46
+ always existing <ase-task-id/> from the current context. Inherit
47
+ the always existing <ase-session-id/> from the current context.
48
+ Do not output anything.
49
+
50
+ 2. React on the task id:
51
+
52
+ <if condition="
53
+ <instruction/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*:?$`
54
+ ">
55
+ The lone token is the *task id* (with an optional and ignored
56
+ trailing `:`), never a hint. Set
57
+ <ase-task-id><instruction/></ase-task-id> (set task id to
58
+ instruction, with any trailing `:` stripped) and
59
+ <instruction></instruction> (set instruction empty), call the
60
+ `ase_task_id(id: "<ase-task-id/>", session: "<ase-session-id/>")`
61
+ tool from the `ase` MCP server to switch the task, and then only
62
+ output the following <template/>:
63
+
64
+ <template>
65
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task given**
66
+ </template>
67
+ </if>
68
+
69
+ <elseif condition="
70
+ <instruction/> has the format `<id/>: <text/>` where
71
+ <id/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`
72
+ ">
73
+ Set <instruction><text/></instruction> (set instruction to
74
+ text) and <ase-task-id><id/></ase-task-id> (set task id to
75
+ id), call the `ase_task_id(id: "<ase-task-id/>", session:
76
+ "<ase-session-id/>")` tool from the `ase` MCP server to switch
77
+ the task, and then only output the following <template/>:
78
+
79
+ <template>
80
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task given**
81
+ </template>
82
+ </elseif>
83
+
84
+ 3. React on the dissection hint:
85
+
86
+ Set <dissect-hint><instruction/></dissect-hint> (set the
87
+ dissection hint to the *remaining* instruction), with any
88
+ leading and trailing whitespace stripped.
89
+
90
+ <if condition="<dissect-hint/> is not empty">
91
+ Only output the following <template/>:
92
+
93
+ <template>
94
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇌ hint: **<dissect-hint/>**
95
+ </template>
96
+ </if>
97
+ <else>
98
+ No dissection hint was given, so the parts are derived from the
99
+ plan alone. Do not output anything.
100
+ </else>
101
+
102
+ 2. **Determine Operation:**
103
+
104
+ 1. Determine the current task plan content:
105
+
106
+ <expand name="task-load-content"></expand>
107
+
108
+ 2. If the <task-content/> is still empty, complain and tell
109
+ the user to use the `ase-code-resolve`, `ase-code-refactor`,
110
+ `ase-code-craft`, or `ase-task-edit` skills first to create a
111
+ task plan. Then immediately stop processing this skill.
112
+
113
+ 3. **Dissect Task Plan:**
114
+
115
+ 1. *Derive the parts* of the epic:
116
+
117
+ <expand
118
+ name="dissect-derive"
119
+ arg1="ase-task-dissect"
120
+ arg2="<dissect-hint/>"
121
+ arg3="<ase-task-id/>"
122
+ >
123
+ the individual bullet points of the `## CHANGES` and
124
+ `## VERIFICATION` sections of the loaded plan <task-content/>
125
+ </expand>
126
+
127
+ Each `## VERIFICATION` bullet point *MUST* land in the very part
128
+ which carries the `## CHANGES` bullet points it verifies.
129
+
130
+ A *single* bullet point is *not* the smallest unit here: a bullet
131
+ point which itself covers *multiple* domains or concerns *MAY* be
132
+ *split* per rule 3 into two or more *bullet point fragments*,
133
+ each of which is a complete bullet point of its own, is formed
134
+ *exclusively* from the wording of the original bullet point, and
135
+ is then assigned to a part like an ordinary bullet point. A split
136
+ `## VERIFICATION` bullet point follows the `## CHANGES` bullet
137
+ points its fragments verify, so its fragments *MAY* land in
138
+ *different* parts.
139
+
140
+ 2. *Report the parts*:
141
+
142
+ <expand name="dissect-report" arg1="<ase-task-id/>"></expand>
143
+
144
+ 4. **Materialize Sub-Task Plans:**
145
+
146
+ You *MUST* *NOT* modify, re-save, or delete the epic plan
147
+ <task-content/> of <ase-task-id/> itself -- it always stays
148
+ *untouched*.
149
+
150
+ 1. <if condition="<getopt-option-dry/> is equal `true`">
151
+ The dissection is *reported only*, so no artifacts are created at
152
+ all. Only output the following <template/> and then *SKIP* the
153
+ remaining sub-steps 4.2 to 4.4 and continue with step 5:
154
+
155
+ <template>
156
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ dissection: **<n/>** parts, ▶ status: **dry-run -- no sub-task plans created**
157
+ </template>
158
+ </if>
159
+
160
+ 2. *Detect target collisions*, strictly *before* writing anything:
161
+
162
+ Call the `ase_task_list(verbose: false)` tool of the `ase` MCP
163
+ server and set <existing/> to the `id` fields of the returned
164
+ `tasks` array. Do not output anything related to this MCP tool
165
+ call. Set <collisions/> to all <part-id/> of <parts/> which are
166
+ already present in <existing/>.
167
+
168
+ <if condition="<collisions/> is not empty AND <getopt-option-force/> is not equal `true`">
169
+ Only output the following <template/> -- with <collisions/>
170
+ rendered as a comma-separated list of code spans -- and then
171
+ immediately *STOP* processing the entire current skill, leaving
172
+ *all* existing task plans untouched:
173
+
174
+ <template>
175
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⊘ collisions: <collisions/>
176
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ dissection: **<n/>** parts, ▶ status: **targets exist**
177
+ </template>
178
+
179
+ Directly *after* this <template/>, and *before* stopping, give
180
+ the corrective hint by expanding the following (which, depending
181
+ on the configured <ase-guidance-level/>, may expand into nothing
182
+ and hence emit no output at all):
183
+
184
+ <ase-tpl-hint level="minimal">
185
+ Re-run `/ase-task-dissect --force` to overwrite the colliding sub-task plans.
186
+ </ase-tpl-hint>
187
+ </if>
188
+
189
+ <if condition="<collisions/> is not empty AND <getopt-option-force/> is equal `true`">
190
+ The colliding sub-task plans are *overwritten* in sub-step 4.3
191
+ below. Do not output anything.
192
+ </if>
193
+
194
+ 3. *Compose and persist one sub-task plan per part*:
195
+
196
+ Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
197
+ `ase` MCP server *once* and use the `text` field of its response
198
+ for both the <timestamp-created/> and <timestamp-modified/>
199
+ information of *all* parts.
200
+
201
+ Then, for *every* part in <parts/>, in their derived order:
202
+
203
+ 1. Compose a *complete* task plan <part-content/> by closely
204
+ following the plan <format/>, where:
205
+
206
+ - the <task-id/> is <part-id/>,
207
+ - the <title/> is derived from the part's <scope/>,
208
+ - the `## CONTEXT` section carries a part-local
209
+ <summary-what/> and <summary-why/>, derived from the
210
+ part's own input elements plus the `## CONTEXT` section
211
+ of the epic,
212
+ - the `## CHANGES` section carries *exactly* the
213
+ `## CHANGES` bullet points assigned to this part,
214
+ keeping their original wording, and
215
+ - the `## VERIFICATION` section carries *exactly* the
216
+ `## VERIFICATION` bullet points assigned to this part,
217
+ keeping their original wording.
218
+
219
+ For a bullet point which was *split* into fragments, the part
220
+ carries *only* its own fragment: the <specification/> keeps
221
+ the *original* wording of the portion this fragment covers,
222
+ with *no* re-interpretation and *no* added scope, and the
223
+ `**<aspect/>**` label is *narrowed* to exactly that portion.
224
+ Across all parts, the fragments of a split bullet point
225
+ *MUST* still reproduce the original bullet point *completely*
226
+ and *without* duplication.
227
+
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
+ <if condition="<task-content/> does NOT contain a `## VERIFICATION` section heading">
247
+ The epic itself deliberately *omits* the `## VERIFICATION`
248
+ section, so you *MUST* omit this section (including its
249
+ heading) from <part-content/>, too.
250
+ </if>
251
+ <elseif condition="no `## VERIFICATION` bullet point was assigned to this part">
252
+ This part carries *no* verification of its own, so you *MUST*
253
+ omit the `## VERIFICATION` section (including its heading)
254
+ from <part-content/>, too -- an *empty* section would violate
255
+ the plan <format/>, and rule 5 forbids inventing a bullet
256
+ point.
257
+ </elseif>
258
+
259
+ 2. Call the `ase_task_save(id: "<part-id/>", text:
260
+ "<part-content/>")` tool of the `ase` MCP server to persist
261
+ the sub-task plan, and calculate the number of words
262
+ <part-words/> of <part-content/>. Do not output anything
263
+ related to this MCP tool call except the following
264
+ <template/>:
265
+
266
+ <template>
267
+ ⧉ **ASE**: ◉ task: **<part-id/>**, ✪ plan: **<part-words/>** words, ▶ status: **sub-task plan created**
268
+ </template>
269
+
270
+ 4. *Report the overall result* with the following <template/>:
271
+
272
+ <template>
273
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ dissection: **<n/>** parts, ▶ status: **epic dissected**
274
+ </template>
275
+
276
+ 5. **Give Final Hints:**
277
+
278
+ Finally, give the closing hints by expanding the following (which,
279
+ depending on the configured <ase-guidance-level/>, may each expand
280
+ into nothing and hence emit no output at all):
281
+
282
+ <if condition="<getopt-option-dry/> is not equal `true`">
283
+ <ase-tpl-hint level="minimal">
284
+ Use `/ase-task-id <id>` to switch to one of the created sub-task plans and `/ase-task-implement` to implement it.
285
+ </ase-tpl-hint>
286
+ </if>
287
+ <else>
288
+ <ase-tpl-hint level="minimal">
289
+ Re-run `/ase-task-dissect` without `--dry` to actually create the reported sub-task plans, optionally with a `<dissect-hint>` argument if the reported split is not the intended one.
290
+ </ase-tpl-hint>
291
+ </else>
292
+
293
+ <ase-tpl-hint level="normal">
294
+ Use `/ase-task-list` to see the epic plan and all of its sub-task plans side by side.
295
+ </ase-tpl-hint>
296
+
297
+ <ase-tpl-hint level="verbose">
298
+ Use `/ase-task-dissect --max-parts <count>` to bound the number of parts, `/ase-task-dissect --force` to overwrite already existing sub-task plans, and `/ase-task-dissect <task-id>: <dissect-hint>` to address another task and steer its split.
299
+ </ase-tpl-hint>
@@ -0,0 +1,114 @@
1
+
2
+ ## NAME
3
+
4
+ `ase-task-dissect` - Dissect a Task Plan
5
+
6
+ ## SYNOPSIS
7
+
8
+ `ase-task-dissect`
9
+ [`--help`|`-h`]
10
+ [`--max-parts`|`-m` *count*]
11
+ [`--dry`|`-d`]
12
+ [`--force`|`-f`]
13
+ [*task-id*[`:`]]
14
+ [*dissect-hint*]
15
+
16
+ ## DESCRIPTION
17
+
18
+ The `ase-task-dissect` skill treats an existing task plan as an *epic*
19
+ and *dissects* it domain-wise and logically into *cohesive parts*. Each
20
+ part is a self-contained unit of work with a single coherent purpose, so
21
+ it can be implemented, reviewed, and committed entirely on its own.
22
+
23
+ The dissection follows a strict ruleset: at least *2* and at most
24
+ *count* parts are derived, *every* bullet point of the epic's
25
+ `## CHANGES` and `## VERIFICATION` sections is assigned to *exactly
26
+ one* part, mutually dependent bullet points are kept together, and
27
+ nothing beyond the epic's own content is invented. A bullet point which
28
+ itself covers *multiple* domains is *split* into fragments, which are
29
+ then assigned individually -- together they still reproduce the original
30
+ bullet point completely and without duplication. The cut follows the
31
+ *semantics*, not the technical structure -- a split by file, directory,
32
+ or technical layer is usually *not* the intended one. If the epic
33
+ carries only a single cohesive purpose, it is reported as *not
34
+ dissectable* and nothing is created.
35
+
36
+ An optional *dissect-hint* steers *how* the epic is split -- which
37
+ bullet points belong together, along which axis to cut, or how many
38
+ parts to aim at. It is especially useful after a `--dry` run showed an
39
+ unintended dissection. The hint overrides the default grouping, but
40
+ never the ruleset itself.
41
+
42
+ The derived parts are first reported as a *dissection table* (part
43
+ number, sub-task id, scope, and rationale). Then -- unless `--dry` is
44
+ given -- each part is materialized as its own *complete* sub-task plan
45
+ (with its own `## CONTEXT`, `## CHANGES`, and `## VERIFICATION`
46
+ sections) and persisted under the task id `<task-id>-<feature-slug>`.
47
+ The epic plan itself always stays *untouched*.
48
+
49
+ ## OPTIONS
50
+
51
+ `--max-parts`|`-m` *count*:
52
+ Upper bound for the number of derived parts (default: `8`). The
53
+ lower bound is always `2`, because fewer parts are no dissection.
54
+
55
+ `--dry`|`-d`:
56
+ *Report only* -- print the dissection table but create *no*
57
+ artifacts at all, so the decision stays fully reversible. Note that
58
+ this meaning differs from `--dry`/`-d` in `ase-code-craft`, where it
59
+ instead omits the `## VERIFICATION` section of the composed plan.
60
+
61
+ `--force`|`-f`:
62
+ Overwrite already existing sub-task plans. Without this option, the
63
+ skill detects colliding sub-task ids *before* writing anything,
64
+ reports them, and stops with status *targets exist*.
65
+
66
+ ## ARGUMENTS
67
+
68
+ *task-id*:
69
+ The unique identifier of the task whose plan should be dissected.
70
+ If omitted, the *current* task id is used. A *lone* argument
71
+ matching the task id syntax is always taken as the *task id*, never
72
+ as a hint; to combine both, separate them with a `:` character, as
73
+ in `auth: split by API and UI`.
74
+
75
+ *dissect-hint*:
76
+ A free-text hint telling *how* the epic should be split. If omitted,
77
+ the parts are derived from the plan alone.
78
+
79
+ ## EXAMPLES
80
+
81
+ Dissect the current task plan:
82
+
83
+ ```text
84
+ ❯ /ase-task-dissect
85
+ ```
86
+
87
+ Preview the dissection of a specific task into at most three parts:
88
+
89
+ ```text
90
+ ❯ /ase-task-dissect --dry --max-parts 3 auth
91
+ ```
92
+
93
+ Re-dissect a task, overwriting the previously created sub-task plans:
94
+
95
+ ```text
96
+ ❯ /ase-task-dissect --force auth
97
+ ```
98
+
99
+ Dissect the current task plan along an explicitly given axis:
100
+
101
+ ```text
102
+ ❯ /ase-task-dissect keep the meta file with the skills, docs separate
103
+ ```
104
+
105
+ Dissect a specific task plan with a hint:
106
+
107
+ ```text
108
+ ❯ /ase-task-dissect auth: one part per authentication provider
109
+ ```
110
+
111
+ ## SEE ALSO
112
+
113
+ [`ase-code-dissect`](../ase-code-dissect/help.md), [`ase-task-edit`](../ase-task-edit/help.md), [`ase-task-condense`](../ase-task-condense/help.md),
114
+ [`ase-task-implement`](../ase-task-implement/help.md), [`ase-task-list`](../ase-task-list/help.md), [`ase-task-delete`](../ase-task-delete/help.md).
@@ -17,9 +17,9 @@ effort: high
17
17
  @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
18
18
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
19
19
 
20
- <skill name="ase-task-edit">
20
+ <purpose name="ase-task-edit">
21
21
  Iteratively Edit a Task Plan
22
- </skill>
22
+ </purpose>
23
23
 
24
24
  <expand name="getopt"
25
25
  arg1="ase-task-edit"
@@ -180,8 +180,10 @@ Set <args></args> (set args to empty).
180
180
  *and* a `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` argument of the most recent
184
- `ase_task_save(id: '<ase-task-id/>', ...)` tool call,
183
+ Set <text/> to the `text` *output* field of the most recent
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 --
185
187
  *without* calling `ase_task_load` again. Set <status>plan
186
188
  reused</status>. Do not output anything.
187
189
  </if>
@@ -16,9 +16,9 @@ effort: high
16
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
17
17
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
18
18
 
19
- <skill name="ase-task-grill">
19
+ <purpose name="ase-task-grill">
20
20
  Iteratively Grill a Task Plan
21
- </skill>
21
+ </purpose>
22
22
 
23
23
  <expand name="getopt"
24
24
  arg1="ase-task-grill"
@@ -86,8 +86,10 @@ Set <args>--int-reuse-task</args>.
86
86
  *and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call
87
87
  exists earlier in the current session
88
88
  ">
89
- Set <text/> to the `text` argument of the most recent
90
- `ase_task_save(id: '<ase-task-id/>', ...)` tool call,
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 --
91
93
  *without* calling `ase_task_load` again. Set <status>plan
92
94
  reused</status>. Do not output anything.
93
95
  </if>
@@ -14,9 +14,9 @@ effort: high
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
16
16
 
17
- <skill name="ase-task-id">
17
+ <purpose name="ase-task-id">
18
18
  Configure Task Id
19
- </skill>
19
+ </purpose>
20
20
 
21
21
  <expand name="getopt" arg1="ase-task-id">
22
22
  $ARGUMENTS
@@ -15,9 +15,9 @@ effort: xhigh
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
16
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
17
17
 
18
- <skill name="ase-task-implement">
18
+ <purpose name="ase-task-implement">
19
19
  Implement a Task Plan
20
- </skill>
20
+ </purpose>
21
21
 
22
22
  <expand name="getopt"
23
23
  arg1="ase-task-implement"
@@ -13,9 +13,9 @@ effort: high
13
13
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
15
15
 
16
- <skill name="ase-task-list">
16
+ <purpose name="ase-task-list">
17
17
  List Task Plans
18
- </skill>
18
+ </purpose>
19
19
 
20
20
  <expand name="getopt"
21
21
  arg1="ase-task-list"
@@ -15,9 +15,9 @@ effort: xhigh
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
16
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
17
17
 
18
- <skill name="ase-task-preflight">
18
+ <purpose name="ase-task-preflight">
19
19
  Preflight a Task Plan
20
- </skill>
20
+ </purpose>
21
21
 
22
22
  <expand name="getopt"
23
23
  arg1="ase-task-preflight"
@@ -15,9 +15,9 @@ effort: high
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
16
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
17
17
 
18
- <skill name="ase-task-reboot">
18
+ <purpose name="ase-task-reboot">
19
19
  Reboot a Task Plan
20
- </skill>
20
+ </purpose>
21
21
 
22
22
  <expand name="getopt"
23
23
  arg1="ase-task-reboot"
@@ -103,19 +103,25 @@ Procedure
103
103
 
104
104
  1. Start with <instruction></instruction> (set instruction to empty).
105
105
 
106
- 2. <if condition="<task-content/> contains neither '- **WHAT**:' nor '- **WHY**:'">
106
+ The loaded <task-content/> is the *rendering-prepared* variant of
107
+ the plan, so its bullet markers can be rendered as `◯` instead
108
+ of the authored `-`. Set <marker>◯</marker> if the bullet points
109
+ of <task-content/> start with `◯`, and set <marker>-</marker>
110
+ otherwise. Do not output anything.
111
+
112
+ 2. <if condition="<task-content/> contains neither '<marker/> **WHAT**:' nor '<marker/> **WHY**:'">
107
113
  Set <instruction><task-content/></instruction> (set instruction to task content).
108
114
  </if>
109
115
 
110
- 3. <if condition="<task-content/> contains '- **WHAT**: <text/>'">
116
+ 3. <if condition="<task-content/> contains '<marker/> **WHAT**: <text/>'">
111
117
  Set <instruction><text/></instruction> (set instruction to extracted text).
112
118
  </if>
113
119
 
114
- 4. <if condition="<task-content/> contains '- **WHY**: <text/>' and <instruction/> is empty">
120
+ 4. <if condition="<task-content/> contains '<marker/> **WHY**: <text/>' and <instruction/> is empty">
115
121
  Set <instruction><text/></instruction> (set instruction to extracted text).
116
122
  </if>
117
123
 
118
- 5. <if condition="<task-content/> contains '- **WHY**: <text/>' and <instruction/> is NOT empty">
124
+ 5. <if condition="<task-content/> contains '<marker/> **WHY**: <text/>' and <instruction/> is NOT empty">
119
125
  Set <instruction><instruction/>, BECAUSE <text/></instruction>
120
126
  (append extracted text to instruction).
121
127
  </if>
@@ -14,9 +14,9 @@ effort: high
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
16
16
 
17
- <skill name="ase-task-rename">
17
+ <purpose name="ase-task-rename">
18
18
  Rename a Task Plan
19
- </skill>
19
+ </purpose>
20
20
 
21
21
  <expand name="getopt" arg1="ase-task-rename">
22
22
  $ARGUMENTS
@@ -14,9 +14,9 @@ effort: high
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
16
16
 
17
- <skill name="ase-task-view">
17
+ <purpose name="ase-task-view">
18
18
  View a Task Plan
19
- </skill>
19
+ </purpose>
20
20
 
21
21
  <expand name="getopt"
22
22
  arg1="ase-task-view"