@rse/ase 0.9.43 → 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 (86) hide show
  1. package/dst/ase-artifact.js +28 -24
  2. package/dst/ase-config.js +27 -36
  3. package/dst/ase-diagram.js +15 -35
  4. package/dst/ase-getopt.js +10 -15
  5. package/dst/ase-hook.js +29 -27
  6. package/dst/ase-kv.js +24 -29
  7. package/dst/ase-log.js +10 -3
  8. package/dst/ase-markdown.js +135 -102
  9. package/dst/ase-mcp.js +3 -10
  10. package/dst/ase-meta.js +6 -4
  11. package/dst/ase-persona.js +7 -11
  12. package/dst/ase-service.js +28 -28
  13. package/dst/ase-setup.js +65 -28
  14. package/dst/ase-skills.js +2 -2
  15. package/dst/ase-statusline.js +26 -34
  16. package/dst/ase-task.js +60 -63
  17. package/dst/ase-version.js +2 -1
  18. package/dst/ase.js +7 -11
  19. package/package.json +12 -10
  20. package/plugin/.claude-plugin/plugin.json +1 -1
  21. package/plugin/.codex-plugin/plugin.json +1 -1
  22. package/plugin/.github/plugin/plugin.json +2 -2
  23. package/plugin/agents/ase-code-lint.md +15 -4
  24. package/plugin/agents/ase-docs-proofread.md +9 -1
  25. package/plugin/agents/ase-meta-chat.md +19 -13
  26. package/plugin/agents/ase-meta-diagram.md +1 -1
  27. package/plugin/agents/ase-meta-search.md +1 -2
  28. package/plugin/etc/eslint.mjs +0 -2
  29. package/plugin/meta/ase-common-task.md +145 -0
  30. package/plugin/meta/ase-constitution.md +5 -2
  31. package/plugin/meta/ase-control.md +1 -1
  32. package/plugin/meta/ase-dialog.md +7 -7
  33. package/plugin/meta/ase-format-arch.md +12 -12
  34. package/plugin/meta/ase-format-spec.md +23 -23
  35. package/plugin/meta/ase-format-task.md +9 -11
  36. package/plugin/meta/ase-getopt.md +1 -1
  37. package/plugin/meta/ase-persona.md +3 -3
  38. package/plugin/meta/ase-skill.md +3 -3
  39. package/plugin/meta/ase-tenets.md +4 -4
  40. package/plugin/package.json +8 -8
  41. package/plugin/skills/ase-arch-analyze/SKILL.md +2 -3
  42. package/plugin/skills/ase-arch-analyze/help.md +2 -2
  43. package/plugin/skills/ase-arch-discover/SKILL.md +2 -2
  44. package/plugin/skills/ase-arch-discover/help.md +3 -2
  45. package/plugin/skills/ase-code-analyze/SKILL.md +0 -1
  46. package/plugin/skills/ase-code-craft/SKILL.md +11 -11
  47. package/plugin/skills/ase-code-lint/SKILL.md +31 -13
  48. package/plugin/skills/ase-code-refactor/SKILL.md +13 -13
  49. package/plugin/skills/ase-code-refactor/help.md +1 -1
  50. package/plugin/skills/ase-code-resolve/SKILL.md +10 -10
  51. package/plugin/skills/ase-code-resolve/help.md +1 -1
  52. package/plugin/skills/ase-docs-distill/SKILL.md +6 -6
  53. package/plugin/skills/ase-docs-distill/help.md +6 -4
  54. package/plugin/skills/ase-docs-proofread/SKILL.md +23 -8
  55. package/plugin/skills/ase-meta-brainstorm/help.md +1 -1
  56. package/plugin/skills/ase-meta-changelog/SKILL.md +9 -5
  57. package/plugin/skills/ase-meta-commit/SKILL.md +8 -6
  58. package/plugin/skills/ase-meta-compat/SKILL.md +14 -5
  59. package/plugin/skills/ase-meta-diaboli/SKILL.md +6 -6
  60. package/plugin/skills/ase-meta-diff/SKILL.md +10 -10
  61. package/plugin/skills/ase-meta-evaluate/SKILL.md +6 -9
  62. package/plugin/skills/ase-meta-persona/SKILL.md +1 -1
  63. package/plugin/skills/ase-meta-quorum/SKILL.md +43 -12
  64. package/plugin/skills/ase-meta-search/SKILL.md +1 -1
  65. package/plugin/skills/ase-meta-search/help.md +4 -2
  66. package/plugin/skills/ase-meta-steelman/SKILL.md +5 -5
  67. package/plugin/skills/ase-meta-steelman/help.md +5 -3
  68. package/plugin/skills/ase-meta-why/SKILL.md +2 -2
  69. package/plugin/skills/ase-meta-why/help.md +3 -1
  70. package/plugin/skills/ase-sync-export/SKILL.md +20 -17
  71. package/plugin/skills/ase-sync-import/SKILL.md +20 -16
  72. package/plugin/skills/ase-sync-import/help.md +2 -2
  73. package/plugin/skills/ase-sync-reconcile/SKILL.md +10 -10
  74. package/plugin/skills/ase-sync-reconcile/help.md +1 -1
  75. package/plugin/skills/ase-task-condense/SKILL.md +39 -85
  76. package/plugin/skills/ase-task-delete/SKILL.md +1 -1
  77. package/plugin/skills/ase-task-edit/SKILL.md +43 -51
  78. package/plugin/skills/ase-task-grill/SKILL.md +11 -13
  79. package/plugin/skills/ase-task-id/SKILL.md +7 -3
  80. package/plugin/skills/ase-task-implement/SKILL.md +18 -111
  81. package/plugin/skills/ase-task-implement/help.md +2 -2
  82. package/plugin/skills/ase-task-list/SKILL.md +3 -0
  83. package/plugin/skills/ase-task-preflight/SKILL.md +22 -115
  84. package/plugin/skills/ase-task-reboot/SKILL.md +39 -71
  85. package/plugin/skills/ase-task-reboot/help.md +2 -1
  86. package/plugin/skills/ase-task-view/SKILL.md +7 -7
@@ -48,19 +48,21 @@ The intent is constructive: building the best honest case for the
48
48
  thesis to arrive at a better final decision, not overselling or merely
49
49
  cheerleading.
50
50
 
51
- ## ARGUMENTS
51
+ ## OPTIONS
52
52
 
53
- `--count`, `-c` *count*:
53
+ `--count`|`-c` *count*:
54
54
  Surface at least *count* strong pro-theses (default *10*) per defense
55
55
  pass before sorting and reporting the top *count* and deriving the
56
56
  *FORTIFICATION*. An invalid or non-positive *count* reverts to the
57
57
  default *10*.
58
58
 
59
- `--rounds`, `-r` *rounds*:
59
+ `--rounds`|`-r` *rounds*:
60
60
  Run *rounds* iterative defense rounds (default *1*), feeding each
61
61
  round's *FORTIFICATION* in as the next round's *thesis*. An invalid
62
62
  or non-positive *rounds* reverts to the default *1*.
63
63
 
64
+ ## ARGUMENTS
65
+
64
66
  *thesis*:
65
67
  The statement, claim, or position to be charitably strengthened.
66
68
  It may be technical, factual, or opinion-based; the skill defends
@@ -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/>:
@@ -66,7 +66,7 @@ addressing surface-level symptoms.
66
66
 
67
67
  <while condition="<n/> is less than or equal to <depth/>">
68
68
 
69
- Ask <question/> and document the answer in <answer/> with the following template:
69
+ Ask <question/> and document the answer in <answer/> with the following template.
70
70
  Don't stop at symptoms, keep digging for systemic issues.
71
71
  Consider technical, domain-specific, process-related, or organizational causes.
72
72
 
@@ -29,7 +29,7 @@ wrong sub-cause. After identifying (and validating) the root cause it
29
29
  proposes a *SOLUTION* that addresses it, optionally including concrete
30
30
  source code changes.
31
31
 
32
- ## ARGUMENTS
32
+ ## OPTIONS
33
33
 
34
34
  `--depth`|`-d` *N*:
35
35
  The *maximum* number of "why" iterations (the Five-Whys chain
@@ -49,6 +49,8 @@ source code changes.
49
49
  single, but better-justified, root-cause. A non-numeric or non-positive
50
50
  value falls back to the default.
51
51
 
52
+ ## ARGUMENTS
53
+
52
54
  *fact*:
53
55
  The observed *fact* (symptom, problem, or surprising outcome)
54
56
  whose root cause should be investigated. The skill implicitly
@@ -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
@@ -48,7 +48,7 @@ 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-source/> as the comma-separated <source/> kind list.
51
+ <getopt-option-source/> as the comma-separated <source/> kind list.
52
52
  Upper-case and trim every parsed kind token. Do not output
53
53
  anything.
54
54
 
@@ -84,11 +84,13 @@ Procedure
84
84
 
85
85
  1. Do not output anything in this STEP 2.
86
86
 
87
- 2. For all kinds in <source/>, call the `ase_artifact_list(kind: [
88
- ... ])` tool of the `ase` MCP server *once*, passing the
89
- lower-cased `kind` tokens, and read the returned `artifacts`
90
- array of `{ kind, files }` objects to obtain the project-relative
91
- file list per kind.
87
+ 2. For all kinds in <source/> except `TASK`, call the
88
+ `ase_artifact_list(kind: [ ... ])` tool of the `ase` MCP server
89
+ *once*, passing the lower-cased `kind` tokens, and read the
90
+ returned `artifacts` array of `{ kind, files }` objects to obtain
91
+ the project-relative file list per kind. The `TASK` kind is *not*
92
+ resolvable via `ase_artifact_list` (task plans are managed by the
93
+ `ase_task_*` tools) and declares no export, so *silently skip* it.
92
94
 
93
95
  3. <if condition="<hint/> is not empty">
94
96
 
@@ -139,11 +141,12 @@ Procedure
139
141
 
140
142
  - *Determine* the side-by-side target file name
141
143
  <export-filename/>
142
- as `<basedir/>/<artifact-set-id/>-<artifact-no/>-<artifact-id/>-<artifact-slug/>-<export-name/>.<export-ext/>`
144
+ as `<artifact-set-id/>-<artifact-no/>-<artifact-id/>-<artifact-slug/>-<export-name/>.<export-ext/>`
143
145
  and resolve it to a project-relative path inside the
144
- artifact's own base directory by calling the
145
- `ase_artifact_name(filename: "<file-name/>", kind:
146
- "<export-filename/>")` tool of the `ase` MCP server.
146
+ artifact's own base directory (`<basedir/>`) by calling the
147
+ `ase_artifact_name(filename: "<export-filename/>", kind:
148
+ "<artifact-kind/>")` tool of the `ase` MCP server, with
149
+ <artifact-kind/> the artifact's own lower-cased kind.
147
150
 
148
151
  - *Write* the derived rendering to that resolved path via the
149
152
  `Write` tool, overwriting any pre-existing export file of the
@@ -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
@@ -61,7 +61,7 @@ Import a foreign requirements document into the specification:
61
61
  ❯ /ase-sync-import -t SPEC docs/legacy/requirements.txt
62
62
  ```
63
63
 
64
- Import an external design write-up into the architecture, defaulting
64
+ Import an external design write-up into the architecture, defaulting to
65
65
  both specification and architecture as targets:
66
66
 
67
67
  ```text
@@ -78,4 +78,4 @@ Import a pasted feature description into a task plan:
78
78
 
79
79
  [`ase-sync-reconcile`](../ase-sync-reconcile/help.md),
80
80
  [`ase-sync-export`](../ase-sync-export/help.md),
81
- [`ase-task-implement`](../ase-task-implement/help.md)
81
+ [`ase-task-implement`](../ase-task-implement/help.md).
@@ -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
 
@@ -78,10 +78,10 @@ Procedure
78
78
  *STOP* processing the entire current skill:
79
79
 
80
80
  <template>
81
- ⧉ **ASE**: ☻ skill: **ase-sync-reconcile**, ▶ ERROR: unknown artifact kind: **<kind/>**
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
@@ -86,4 +86,4 @@ each other, limited to the authentication aspect:
86
86
  ## SEE ALSO
87
87
 
88
88
  [`ase-meta-changelog`](../ase-meta-changelog/help.md),
89
- [`ase-task-implement`](../ase-task-implement/help.md)
89
+ [`ase-task-implement`](../ase-task-implement/help.md).
@@ -31,13 +31,24 @@ 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
- 1. Set <instruction><getopt-arguments/></instruction> initially.
51
+ 1. Set <id><getopt-arguments/></id> initially.
41
52
  Inherit the always existing <ase-task-id/> from the current context.
42
53
  Inherit the always existing <ase-session-id/> from the current context.
43
54
  Do not output anything.
@@ -45,11 +56,10 @@ Procedure
45
56
  2. React on task id:
46
57
 
47
58
  1. <if condition="
48
- <instruction/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`
59
+ <id/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`
49
60
  ">
50
- Set <ase-task-id><instruction/></ase-task-id> (set task
51
- id to instruction) and <instruction></instruction> (set
52
- instruction empty), call the `ase_task_id(id: "<ase-task-id/>",
61
+ Set <ase-task-id><id/></ase-task-id> (set task id) and
62
+ call the `ase_task_id(id: "<ase-task-id/>",
53
63
  session: "<ase-session-id/>")` tool from the `ase` MCP
54
64
  server to switch the task, and then only output the
55
65
  following <template/>:
@@ -59,7 +69,7 @@ Procedure
59
69
  </template>
60
70
  </if>
61
71
 
62
- 2. <elseif condition="<instruction/> is NOT empty">
72
+ 2. <elseif condition="<id/> is NOT empty">
63
73
  The argument is neither empty nor a valid task id. As this
64
74
  skill only accepts an optional `[<id>]` argument and *never*
65
75
  a free-text instruction, only output the following <template/>
@@ -77,20 +87,21 @@ Procedure
77
87
  the `text` output field of the `ase_task_load` tool call.
78
88
 
79
89
  - If <text/> starts with `ERROR:` or `WARNING:`:
80
- Set <content></content> (set content to empty).
90
+ Silently ignore the MCP error.
91
+ Set <task-content></task-content> (set task content to empty).
81
92
  Set <words/> to "0".
82
93
 
83
94
  - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
84
- Set <content><text/></content> (set content to text).
85
- 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/>.
86
97
 
87
98
  Set <words-before><words/></words-before> (remember the loaded
88
99
  word count for the strictly-smaller check in step 3).
89
100
 
90
- <if condition="<content/> contains '⎈ Created: <text/>'">
101
+ <if condition="<task-content/> contains '⎈ Created: <text/>'">
91
102
  Set <timestamp-created><text/></timestamp-created> (extract the
92
103
  original creation timestamp so it can be re-inserted unchanged
93
- into the condensed <content/> in step 3).
104
+ into the condensed <task-content/> in step 3).
94
105
  </if>
95
106
 
96
107
  Only output the following <template/>:
@@ -99,7 +110,7 @@ Procedure
99
110
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan loaded**
100
111
  </template>
101
112
 
102
- 2. <if condition="<content/> is empty">
113
+ 2. <if condition="<task-content/> is empty">
103
114
  Complain and tell the user to use the `ase-code-resolve`,
104
115
  `ase-code-refactor`, `ase-code-craft`, or `ase-task-edit` skills
105
116
  first to create a task plan. Then immediately stop processing
@@ -108,8 +119,8 @@ Procedure
108
119
 
109
120
  3. **Condense Task Plan:**
110
121
 
111
- 1. *Apply the condense ruleset* to <content/>, producing a shorter
112
- <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
113
124
  reading* as possible while all semantics remain *fully preserved
114
125
  and unchanged*. Honor the following ruleset *strictly*:
115
126
 
@@ -149,25 +160,10 @@ Procedure
149
160
  longer wording*.
150
161
 
151
162
  2. *Persist only if smaller*: calculate the number of words <words/>
152
- of the condensed <content/>.
163
+ of the condensed <task-content/>.
153
164
 
154
165
  - <if condition="<words/> is strictly smaller than <words-before/>">
155
- Update <timestamp-modified/> with the current time in
156
- ISO-style format, which has to be determined by calling
157
- the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool
158
- of the `ase` MCP server and use the `text` field of
159
- its response. Keep the original <timestamp-created/>,
160
- re-insert the current <ase-task-id/> and the refreshed
161
- <timestamp-modified/> into <content/>.
162
-
163
- Call the `ase_task_save(id: "<ase-task-id/>", text:
164
- "<content/>")` tool of the `ase` MCP server to save the
165
- condensed task plan content. Do not output anything related
166
- to this MCP call except the following <template/>:
167
-
168
- <template>
169
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan condensed**
170
- </template>
166
+ <expand name="task-save-content" arg1="plan condensed"></expand>
171
167
  </if>
172
168
 
173
169
  - <if condition="<words/> is NOT strictly smaller than <words-before/>">
@@ -183,39 +179,15 @@ Procedure
183
179
 
184
180
  1. *Determine next step*:
185
181
 
186
- - If <getopt-option-next/> is not equal to `none`:
187
- Treat <getopt-option-next/> as a comma-separated chronological
188
- list of pre-selected next-step tokens. *Split* it on `,`,
189
- take the *first* token as <head/>, and store the remaining
190
- tokens (joined back with `,`, or `none` if empty) into
191
- <getopt-option-next/> so downstream skills can consume the tail.
192
-
193
- - If <head/> matches the regex `^(DONE|EDIT|IMPLEMENT|PREFLIGHT)$`:
194
- Honor the pre-selected token.
195
- Set <result><head/></result>.
196
-
197
- - else:
198
- Only output the following <template/> and then immediately
199
- *STOP* processing the entire current skill:
200
-
201
- <template>
202
- ⧉ **ASE**: ☻ skill: **ase-task-condense**, ▶ ERROR: invalid `--next` token: **<head/>**
203
- </template>
204
-
205
- - If <getopt-option-next/> is equal to `none`:
206
-
207
- In the following, you *MUST* *NOT* use your built-in
208
- <user-dialog-tool/> tool! Instead, you *MUST* just show a
209
- custom dialog according to the expanded `custom-dialog`
210
- definition. You *MUST* closely follow this definition:
211
-
212
- <expand name="custom-dialog" arg1="--no-other">
213
- Next Step: How would you like to proceed with the plan?
214
- DONE: Stop processing.
215
- EDIT: Hand off plan to editing.
216
- IMPLEMENT: Hand off plan to implementation.
217
- PREFLIGHT: Hand off plan to pre-flighting.
218
- </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>
219
191
 
220
192
  2. Check the tool <result/> and dispatch accordingly:
221
193
 
@@ -227,13 +199,7 @@ Procedure
227
199
  </template>
228
200
 
229
201
  - If <result/> is `EDIT`:
230
- Set <args></args> (set args to empty).
231
- <if condition="the condensed plan was saved via `ase_task_save` in step 3">
232
- Set <args>--int-reuse-task</args>.
233
- </if>
234
- <if condition="<getopt-option-next/> is not equal `none`">
235
- Set <args><args/> --next <getopt-option-next/></args>
236
- </if>
202
+ <expand name="handoff-args"/>
237
203
  Only output the following <template/> and then call the
238
204
  tool `Skill(skill: "ase:ase-task-edit", args: "<args/>")`
239
205
  to invoke the `ase:ase-task-edit` skill in order to *edit*
@@ -245,13 +211,7 @@ Procedure
245
211
  </template>
246
212
 
247
213
  - If <result/> is `IMPLEMENT`:
248
- Set <args></args> (set args to empty).
249
- <if condition="the condensed plan was saved via `ase_task_save` in step 3">
250
- Set <args>--int-reuse-task</args>.
251
- </if>
252
- <if condition="<getopt-option-next/> is not equal `none`">
253
- Set <args><args/> --next <getopt-option-next/></args>
254
- </if>
214
+ <expand name="handoff-args"/>
255
215
  Only output the following <template/> and then call the
256
216
  `Skill(skill: "ase:ase-task-implement", args: "<args/>")` tool
257
217
  to *apply* the plan.
@@ -261,13 +221,7 @@ Procedure
261
221
  </template>
262
222
 
263
223
  - If <result/> is `PREFLIGHT`:
264
- Set <args></args> (set args to empty).
265
- <if condition="the condensed plan was saved via `ase_task_save` in step 3">
266
- Set <args>--int-reuse-task</args>.
267
- </if>
268
- <if condition="<getopt-option-next/> is not equal `none`">
269
- Set <args><args/> --next <getopt-option-next/></args>
270
- </if>
224
+ <expand name="handoff-args"/>
271
225
  Only output the following <template/> and then call the
272
226
  `Skill(skill: "ase:ase-task-preflight", args: "<args/>")` tool
273
227
  to *apply* the plan.
@@ -51,7 +51,7 @@ Procedure
51
51
  </template>
52
52
  </if>
53
53
 
54
- 2. **Perform Operation**:
54
+ 2. **Perform Operation:**
55
55
 
56
56
  1. Call the `ase_task_delete(id: "<id/>")` tool of the `ase` MCP
57
57
  server to delete the task plan content and set <text/> to the