@rse/ase 0.9.44 → 0.9.46

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 (57) hide show
  1. package/dst/ase-setup.js +50 -0
  2. package/package.json +3 -3
  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/etc/stx.conf +6 -1
  11. package/plugin/meta/ase-common-task.md +145 -0
  12. package/plugin/meta/ase-constitution.md +4 -1
  13. package/plugin/meta/ase-dialog.md +7 -7
  14. package/plugin/meta/ase-format-arch.md +4 -4
  15. package/plugin/meta/ase-format-spec.md +23 -23
  16. package/plugin/meta/ase-format-task.md +1 -1
  17. package/plugin/meta/ase-persona.md +3 -3
  18. package/plugin/meta/ase-skill.md +2 -2
  19. package/plugin/meta/ase-tenets.md +4 -4
  20. package/plugin/package.json +1 -1
  21. package/plugin/skills/ase-arch-analyze/SKILL.md +2 -3
  22. package/plugin/skills/ase-code-craft/SKILL.md +23 -9
  23. package/plugin/skills/ase-code-craft/help.md +5 -4
  24. package/plugin/skills/ase-code-lint/SKILL.md +19 -3
  25. package/plugin/skills/ase-code-refactor/SKILL.md +23 -9
  26. package/plugin/skills/ase-code-refactor/help.md +5 -4
  27. package/plugin/skills/ase-code-resolve/SKILL.md +22 -8
  28. package/plugin/skills/ase-code-resolve/help.md +6 -5
  29. package/plugin/skills/ase-docs-distill/SKILL.md +6 -6
  30. package/plugin/skills/ase-docs-proofread/SKILL.md +18 -3
  31. package/plugin/skills/ase-meta-changelog/SKILL.md +5 -2
  32. package/plugin/skills/ase-meta-commit/SKILL.md +4 -4
  33. package/plugin/skills/ase-meta-compat/SKILL.md +3 -3
  34. package/plugin/skills/ase-meta-diaboli/SKILL.md +2 -2
  35. package/plugin/skills/ase-meta-eli5/SKILL.md +116 -0
  36. package/plugin/skills/ase-meta-eli5/help.md +61 -0
  37. package/plugin/skills/ase-meta-evaluate/SKILL.md +6 -9
  38. package/plugin/skills/ase-meta-intent/SKILL.md +157 -0
  39. package/plugin/skills/ase-meta-intent/help.md +56 -0
  40. package/plugin/skills/ase-meta-proximity/SKILL.md +224 -0
  41. package/plugin/skills/ase-meta-proximity/help.md +78 -0
  42. package/plugin/skills/ase-meta-quorum/SKILL.md +33 -4
  43. package/plugin/skills/ase-meta-search/SKILL.md +1 -1
  44. package/plugin/skills/ase-meta-steelman/SKILL.md +3 -3
  45. package/plugin/skills/ase-meta-why/SKILL.md +1 -1
  46. package/plugin/skills/ase-sync-export/SKILL.md +7 -7
  47. package/plugin/skills/ase-sync-import/SKILL.md +20 -16
  48. package/plugin/skills/ase-sync-reconcile/SKILL.md +9 -9
  49. package/plugin/skills/ase-task-condense/SKILL.md +34 -79
  50. package/plugin/skills/ase-task-edit/SKILL.md +41 -49
  51. package/plugin/skills/ase-task-grill/SKILL.md +10 -12
  52. package/plugin/skills/ase-task-id/SKILL.md +7 -3
  53. package/plugin/skills/ase-task-implement/SKILL.md +18 -111
  54. package/plugin/skills/ase-task-list/SKILL.md +3 -0
  55. package/plugin/skills/ase-task-preflight/SKILL.md +22 -115
  56. package/plugin/skills/ase-task-reboot/SKILL.md +27 -63
  57. package/plugin/skills/ase-task-view/SKILL.md +7 -7
@@ -0,0 +1,78 @@
1
+
2
+ ## NAME
3
+
4
+ `ase-meta-proximity` - Determine the Conceptual Proximity of a Topic
5
+
6
+ ## SYNOPSIS
7
+
8
+ `ase-meta-proximity`
9
+ [`--help`|`-h`]
10
+ [`--ground`|`-g`]
11
+ [`--loop`|`-l`]
12
+ *topic*
13
+
14
+ ## DESCRIPTION
15
+
16
+ The `ase-meta-proximity` skill determines the *conceptual proximity* of
17
+ the supplied *topic* along three dimensions and reports the neighboring
18
+ topics grouped into three labeled sections: *PARENT* (the single broader
19
+ topic that *topic* specializes), *SIBLINGS* (the four most relevant
20
+ topics on the same level, sharing the same parent), and *CHILDREN* (the
21
+ four most relevant narrower topics that specialize *topic*).
22
+
23
+ By default the proximity is derived from model knowledge only. With the
24
+ `--ground`/`-g` option, the skill first searches the Internet/Web for
25
+ facts about the topic via the `ase-meta-search` skill (dispatched in a
26
+ sub-agent, querying all available search backends) and grounds the
27
+ determination in the found facts.
28
+
29
+ Without the `--loop`/`-l` option, the skill determines and prints the
30
+ proximity of the given topic once and then stops. With the `--loop`/`-l`
31
+ option, the skill instead presents the nine neighboring topics in an
32
+ interactive dialog; selecting one of them makes it the new *current
33
+ topic* and restarts the determination from the beginning, so the user
34
+ can *navigate* the topic taxonomy up (parent), sideways (siblings), and
35
+ down (children). Cancelling the dialog exits the loop. When `--loop` is
36
+ combined with `--ground`, each newly selected topic is re-grounded via
37
+ the `ase-meta-search` sub-agent before its proximity is re-determined.
38
+
39
+ ## OPTIONS
40
+
41
+ `--ground`|`-g`:
42
+ Ground the determination in Internet/Web facts gathered via the
43
+ `ase-meta-search` skill before determining the proximity. Without
44
+ this option, the determination is derived from model knowledge only.
45
+ When combined with `--loop`, every newly navigated-to topic is
46
+ re-grounded.
47
+
48
+ `--loop`|`-l`:
49
+ Present the neighboring topics in an interactive dialog and, upon
50
+ selection, adopt the picked topic as the new current topic and
51
+ restart the determination. Without this option, the proximity of the
52
+ given topic is printed once and the skill stops.
53
+
54
+ ## ARGUMENTS
55
+
56
+ *topic*:
57
+ The topic whose conceptual proximity is to be determined. It may be
58
+ a technical concept, a phenomenon, or any other subject; the skill
59
+ determines its parent, sibling, and child topics.
60
+
61
+ ## EXAMPLES
62
+
63
+ Determine the proximity of a topic from model knowledge:
64
+
65
+ ```text
66
+ ❯ /ase-meta-proximity Fourier transform
67
+ ```
68
+
69
+ Interactively navigate the conceptual neighborhood, grounded in
70
+ Internet/Web facts:
71
+
72
+ ```text
73
+ ❯ /ase-meta-proximity --ground --loop Agentic Software Engineering
74
+ ```
75
+
76
+ ## SEE ALSO
77
+
78
+ [`ase-meta-eli5`](../ase-meta-eli5/help.md), [`ase-meta-search`](../ase-meta-search/help.md), [`ase-code-explain`](../ase-code-explain/help.md).
@@ -2,13 +2,17 @@
2
2
  name: ase-meta-quorum
3
3
  argument-hint: "[--help|-h] [--models|-m <model>[,...]] <question>"
4
4
  description: >
5
- Query Multiple AIs for Quorum Answer.
5
+ Query multiple foreign AIs in parallel and synthesize a consensus
6
+ ("quorum") answer with a consensus rating. Use when the user wants
7
+ a quorum, a consensus answer, or the opinions of multiple AIs on a
8
+ question.
6
9
  user-invocable: true
7
10
  disable-model-invocation: false
8
11
  effort: high
9
12
  allowed-tools:
10
13
  - "Agent"
11
14
  - "TaskCreate"
15
+ - "TaskUpdate"
12
16
  ---
13
17
 
14
18
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
@@ -21,7 +25,7 @@ Query Multiple AIs for Quorum Answer
21
25
 
22
26
  <expand name="getopt"
23
27
  arg1="ase-meta-quorum"
24
- arg2="--models|-m=(all|chatgpt|gemini|deepseek|grok|glm|qwen)...">
28
+ arg2="--models|-m=(all|chatgpt|gemini|deepseek|grok|glm|qwen|claude|codex|copilot)...">
25
29
  $ARGUMENTS
26
30
  </expand>
27
31
 
@@ -65,7 +69,8 @@ by querying *multiple* AIs for an *optimal consensus*.
65
69
  as a comma-separated list of model tokens. The getopt parser
66
70
  validates only the *first* token, so you *MUST* validate each
67
71
  remaining token yourself against the allowed set `all`, `chatgpt`,
68
- `gemini`, `deepseek`, `grok`, `glm`, `qwen`. If any token is *not*
72
+ `gemini`, `deepseek`, `grok`, `glm`, `qwen`, `claude`, `codex`,
73
+ `copilot`. If any token is *not*
69
74
  in this set, bind <token/> to that offending token, then only output
70
75
  the following <template/> and then immediately *STOP* processing the
71
76
  entire current skill:
@@ -76,7 +81,10 @@ by querying *multiple* AIs for an *optimal consensus*.
76
81
 
77
82
  The default is the single token `all`. If <getopt-option-models/>
78
83
  contains the token `all`, you *MUST* treat it as the full list
79
- `chatgpt,gemini,deepseek,grok,glm,qwen` (all models). Anthropic
84
+ `chatgpt,gemini,deepseek,grok,glm,qwen` (all API-based models). The
85
+ harness-based models `claude`, `codex`, and `copilot` are *never*
86
+ part of `all` and are queried only when their token is given
87
+ *explicitly* (in addition to `all`, if wished). Anthropic
80
88
  Claude (yourself) is *always* included, independent of this option.
81
89
 
82
90
  <define name="agent">
@@ -116,6 +124,15 @@ by querying *multiple* AIs for an *optimal consensus*.
116
124
  <if condition="<getopt-option-models/> contains `all` OR <getopt-option-models/> contains `qwen`">
117
125
  <expand name="agent" arg1="Alibaba Qwen" arg2="qwen"></expand>
118
126
  </if>
127
+ <if condition="<getopt-option-models/> contains `claude`">
128
+ <expand name="agent" arg1="Anthropic Claude (harness)" arg2="claude"></expand>
129
+ </if>
130
+ <if condition="<getopt-option-models/> contains `codex`">
131
+ <expand name="agent" arg1="OpenAI Codex" arg2="codex"></expand>
132
+ </if>
133
+ <if condition="<getopt-option-models/> contains `copilot`">
134
+ <expand name="agent" arg1="GitHub Copilot" arg2="copilot"></expand>
135
+ </if>
119
136
 
120
137
  You *MUST* *NOT* output anything in this step.
121
138
 
@@ -202,6 +219,18 @@ by querying *multiple* AIs for an *optimal consensus*.
202
219
  &#x25CB; **Alibaba Qwen**:
203
220
  - [...]
204
221
  - [...]
222
+
223
+ &#x25CB; **Anthropic Claude (harness)**:
224
+ - [...]
225
+ - [...]
226
+
227
+ &#x25CB; **OpenAI Codex**:
228
+ - [...]
229
+ - [...]
230
+
231
+ &#x25CB; **GitHub Copilot**:
232
+ - [...]
233
+ - [...]
205
234
  </template>
206
235
 
207
236
  In this output, when a quorum was *not* possible (see STEP 4),
@@ -109,7 +109,7 @@ Your objective is to *search* the *Internet*/*Web* for the following query:
109
109
 
110
110
  2. <step id="STEP 2: Consolidate Search Answers">
111
111
 
112
- Consolidate all responses from the `ase:ase-meta-search` agents
112
+ Consolidate all responses from the `ase:ase-meta-search` agent
113
113
  calls above into a single response and output it without giving any
114
114
  further explanations.
115
115
 
@@ -15,7 +15,7 @@ effort: xhigh
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
16
16
 
17
17
  <skill name="ase-meta-steelman">
18
- Build the "Steelman" Argument
18
+ Build the "Steelman" Argument
19
19
  </skill>
20
20
 
21
21
  <expand name="getopt"
@@ -25,8 +25,8 @@ effort: xhigh
25
25
  </expand>
26
26
 
27
27
  <objective>
28
- Build the "Steelman" argument by constructing the strongest
29
- possible case for the thesis: <thesis><getopt-arguments/></thesis>
28
+ Build the "Steelman" argument by constructing the strongest
29
+ possible case for the thesis: <thesis><getopt-arguments/></thesis>
30
30
  </objective>
31
31
 
32
32
  Determine the number of *rounds* to perform: set <rounds/> to
@@ -47,7 +47,7 @@ addressing surface-level symptoms.
47
47
 
48
48
  2. <step id="STEP 2: Root-Cause Analysis">
49
49
 
50
- Find the root-cause of <problem/> by following the following iteration cycle.
50
+ Find the root-cause of <problem/> by following this iteration cycle.
51
51
  Start with a <question/> set equal to the <problem/>.
52
52
 
53
53
  Determine the *maximum chain length* from <getopt-option-depth/>:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-sync-export
3
- argument-hint: "[--help|-h] [--source|-s <source>[,...]] [<filter>]"
3
+ argument-hint: "[--help|-h] [--source|-s <source>[,...]] [<hint>]"
4
4
  description: >
5
5
  Export artifact content into side-by-side, ready-to-consume files,
6
6
  one per artifact that declares an export. Use when the user wants to
@@ -18,7 +18,7 @@ allowed-tools:
18
18
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
19
19
 
20
20
  <skill name="ase-sync-export">
21
- Export Artifact Set to Side-by-Side Files
21
+ Export Artifact Set to Side-by-Side Files
22
22
  </skill>
23
23
 
24
24
  <expand name="getopt"
@@ -28,11 +28,11 @@ allowed-tools:
28
28
  </expand>
29
29
 
30
30
  <objective>
31
- *Export* the *source* artifact kinds (optionally filtered by
32
- <hint/>) into side-by-side files, by reading the source artifacts
33
- and materializing, for every artifact that declares an export,
34
- the corresponding derived file next to the artifact itself.
35
- <hint><getopt-arguments/></hint>.
31
+ *Export* the *source* artifact kinds (optionally filtered by
32
+ <hint/>) into side-by-side files, by reading the source artifacts
33
+ and materializing, for every artifact that declares an export,
34
+ the corresponding derived file next to the artifact itself.
35
+ <hint><getopt-arguments/></hint>.
36
36
  </objective>
37
37
 
38
38
  @${CLAUDE_SKILL_DIR}/../../meta/ase-format-meta.md
@@ -17,7 +17,7 @@ effort: xhigh
17
17
  @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
18
18
 
19
19
  <skill name="ase-sync-import">
20
- Import Foreign Sources into Artifact Set
20
+ Import Foreign Sources into Artifact Set
21
21
  </skill>
22
22
 
23
23
  <expand name="getopt"
@@ -27,11 +27,11 @@ effort: xhigh
27
27
  </expand>
28
28
 
29
29
  <objective>
30
- *Import* the information of the *foreign sources* (named by the
31
- <hint/>) into the *target* artifact kinds, by reading the foreign
32
- sources and generating or updating the target artifacts to faithfully
33
- reflect the imported information:
34
- <hint><getopt-arguments/></hint>.
30
+ *Import* the information of the *foreign sources* (named by the
31
+ <hint/>) into the *target* artifact kinds, by reading the foreign
32
+ sources and generating or updating the target artifacts to faithfully
33
+ reflect the imported information:
34
+ <hint><getopt-arguments/></hint>.
35
35
  </objective>
36
36
 
37
37
  @${CLAUDE_SKILL_DIR}/../../meta/ase-format-meta.md
@@ -49,7 +49,7 @@ Procedure
49
49
 
50
50
  1. The recognized artifact kinds are the seven tokens `TASK`,
51
51
  `SPEC`, `ARCH`, `CODE`, `DOCS`, `INFR`, and `OTHR`. Parse
52
- <getopt-target/> as the comma-separated <target/> kind list.
52
+ <getopt-option-target/> as the comma-separated <target/> kind list.
53
53
  Upper-case and trim every parsed kind token. Do not output
54
54
  anything.
55
55
 
@@ -111,12 +111,15 @@ Procedure
111
111
 
112
112
  3. <step id="STEP 3: Generate or Update Artifacts">
113
113
 
114
- 1. For all kinds in <target/>, call the `ase_artifact_list(kind: [
115
- ... ])` tool of the `ase` MCP server *once*, passing the
116
- lower-cased `kind` tokens, and read the returned `artifacts`
117
- array of `{ kind, files }` objects to obtain the project-relative
118
- file list per kind. Read all *existing* target artifacts to
119
- understand their current state.
114
+ 1. For all kinds in <target/> except `TASK`, call the
115
+ `ase_artifact_list(kind: [ ... ])` tool of the `ase` MCP server
116
+ *once*, passing the lower-cased `kind` tokens, and read the
117
+ returned `artifacts` array of `{ kind, files }` objects to
118
+ obtain the project-relative file list per kind. The `TASK` kind
119
+ is *not* resolvable via `ase_artifact_list` (task plans are
120
+ managed by the `ase_task_*` tools), so resolve and read it via
121
+ the `ase_task_id` and `ase_task_load` tools instead. Read all
122
+ *existing* target artifacts to understand their current state.
120
123
 
121
124
  2. Internalize and honor the artifact-format conventions:
122
125
 
@@ -136,8 +139,8 @@ Procedure
136
139
  **ASE Tenets** when generating or updating in the following. Do
137
140
  not output anything.
138
141
 
139
- 4. Once call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of
140
- the `ase` MCP server to find out the current time and store it in
142
+ 4. Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
143
+ `ase` MCP server *once* to find out the current time and store it in
141
144
  <timestamp-modified/>.
142
145
 
143
146
  5. *Generate or update* the <target/> artifact files so that they
@@ -163,7 +166,8 @@ Procedure
163
166
  abstraction (a SPEC states intent, an ARCH states structure).
164
167
 
165
168
  Apply the generation/update directly to the target artifacts via
166
- the `Write`/`Edit` tools.
169
+ the `Write`/`Edit` tools. For a `TASK` target, apply it via the
170
+ `ase_task_save` tool instead.
167
171
 
168
172
  6. Report the performed changes with the following <template/>, listing
169
173
  one bullet line per generated or updated file (with <file/> its
@@ -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.