@rse/ase 0.9.54 → 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 (86) hide show
  1. package/dst/ase-log.js +5 -0
  2. package/dst/ase-service.js +45 -6
  3. package/dst/ase-setup.js +4 -2
  4. package/dst/ase-statusline.js +6 -8
  5. package/dst/ase-task.js +152 -28
  6. package/package.json +5 -5
  7. package/plugin/.claude-plugin/plugin.json +1 -1
  8. package/plugin/.codex-plugin/plugin.json +1 -1
  9. package/plugin/.github/plugin/plugin.json +1 -1
  10. package/plugin/agents/ase-code-analyze.md +1 -1
  11. package/plugin/agents/ase-code-lint.md +4 -4
  12. package/plugin/agents/ase-meta-chat.md +1 -1
  13. package/plugin/agents/ase-meta-proximity.md +1 -1
  14. package/plugin/meta/ase-common-code.md +165 -2
  15. package/plugin/meta/ase-common-task.md +17 -15
  16. package/plugin/meta/ase-constitution.md +3 -3
  17. package/plugin/meta/ase-control.md +7 -7
  18. package/plugin/meta/ase-dialog.md +5 -4
  19. package/plugin/meta/ase-format-arch.md +7 -8
  20. package/plugin/meta/ase-format-spec.md +10 -11
  21. package/plugin/meta/ase-format-task.md +90 -20
  22. package/plugin/meta/ase-getopt.md +1 -1
  23. package/plugin/meta/ase-persona.md +3 -3
  24. package/plugin/meta/ase-skill.md +14 -24
  25. package/plugin/meta/ase-tenets.md +5 -5
  26. package/plugin/package.json +2 -2
  27. package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
  28. package/plugin/skills/ase-arch-analyze/help.md +1 -1
  29. package/plugin/skills/ase-arch-discover/SKILL.md +8 -6
  30. package/plugin/skills/ase-code-analyze/SKILL.md +1 -1
  31. package/plugin/skills/ase-code-analyze/help.md +1 -1
  32. package/plugin/skills/ase-code-craft/SKILL.md +2 -153
  33. package/plugin/skills/ase-code-craft/help.md +1 -1
  34. package/plugin/skills/ase-code-explain/SKILL.md +3 -3
  35. package/plugin/skills/ase-code-insight/SKILL.md +9 -7
  36. package/plugin/skills/ase-code-lint/SKILL.md +7 -5
  37. package/plugin/skills/ase-code-lint/help.md +2 -2
  38. package/plugin/skills/ase-code-refactor/SKILL.md +4 -155
  39. package/plugin/skills/ase-code-resolve/SKILL.md +8 -159
  40. package/plugin/skills/ase-docs-distill/SKILL.md +2 -2
  41. package/plugin/skills/ase-docs-distill/help.md +1 -1
  42. package/plugin/skills/ase-docs-proofread/SKILL.md +7 -3
  43. package/plugin/skills/ase-help-intent/SKILL.md +33 -9
  44. package/plugin/skills/ase-help-skill/SKILL.md +1 -1
  45. package/plugin/skills/ase-meta-brainstorm/SKILL.md +11 -2
  46. package/plugin/skills/ase-meta-changelog/SKILL.md +12 -8
  47. package/plugin/skills/ase-meta-commit/SKILL.md +11 -1
  48. package/plugin/skills/ase-meta-compat/SKILL.md +2 -2
  49. package/plugin/skills/ase-meta-config/help.md +4 -4
  50. package/plugin/skills/ase-meta-diaboli/SKILL.md +12 -3
  51. package/plugin/skills/ase-meta-diff/SKILL.md +11 -13
  52. package/plugin/skills/ase-meta-eli5/SKILL.md +3 -3
  53. package/plugin/skills/ase-meta-eli5/help.md +1 -1
  54. package/plugin/skills/ase-meta-evaluate/SKILL.md +3 -3
  55. package/plugin/skills/ase-meta-quorum/SKILL.md +17 -17
  56. package/plugin/skills/ase-meta-quotes/SKILL.md +1 -1
  57. package/plugin/skills/ase-meta-quotes/help.md +4 -3
  58. package/plugin/skills/ase-meta-review/SKILL.md +7 -5
  59. package/plugin/skills/ase-meta-review/help.md +2 -2
  60. package/plugin/skills/ase-meta-search/SKILL.md +18 -0
  61. package/plugin/skills/ase-meta-steelman/SKILL.md +11 -2
  62. package/plugin/skills/ase-meta-why/SKILL.md +15 -6
  63. package/plugin/skills/ase-meta-why/help.md +3 -3
  64. package/plugin/skills/ase-sync-export/SKILL.md +2 -1
  65. package/plugin/skills/ase-sync-export/help.md +1 -1
  66. package/plugin/skills/ase-sync-reconcile/SKILL.md +16 -2
  67. package/plugin/skills/ase-task-condense/SKILL.md +19 -72
  68. package/plugin/skills/ase-task-condense/help.md +1 -1
  69. package/plugin/skills/ase-task-delete/SKILL.md +1 -1
  70. package/plugin/skills/ase-task-dissect/SKILL.md +5 -18
  71. package/plugin/skills/ase-task-edit/SKILL.md +74 -26
  72. package/plugin/skills/ase-task-grill/SKILL.md +30 -124
  73. package/plugin/skills/ase-task-grill/help.md +2 -1
  74. package/plugin/skills/ase-task-id/SKILL.md +12 -2
  75. package/plugin/skills/ase-task-implement/SKILL.md +37 -4
  76. package/plugin/skills/ase-task-implement/help.md +9 -5
  77. package/plugin/skills/ase-task-list/SKILL.md +60 -15
  78. package/plugin/skills/ase-task-list/help.md +49 -6
  79. package/plugin/skills/ase-task-preflight/SKILL.md +20 -8
  80. package/plugin/skills/ase-task-preflight/help.md +4 -3
  81. package/plugin/skills/ase-task-reboot/SKILL.md +19 -62
  82. package/plugin/skills/ase-task-reboot/help.md +1 -1
  83. package/plugin/skills/ase-task-view/SKILL.md +27 -4
  84. package/dst/ase-guidance.js +0 -89
  85. package/dst/ase-persona.js +0 -87
  86. package/dst/ase-stdout.js +0 -18
@@ -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*:
@@ -189,13 +189,46 @@ Procedure
189
189
  way.
190
190
  </if>
191
191
 
192
- 2. Only output the following <template/>:
192
+ 2. Update the frontmatter of <task-content/> as follows, *creating*
193
+ each of the `Properties:`, `Status:`, and `Modified:` keys the
194
+ plan does not carry yet at its position in the key order of the
195
+ plan <format/>:
196
+
197
+ - *Add* the value `implemented` to the `Properties:` key if it
198
+ is still absent, keeping all already present values.
199
+
200
+ - *Add* the value `verified` to the `Properties:` key as well,
201
+ but *only* if the verification phase was actually performed
202
+ and succeeded -- hence *never* for a plan whose
203
+ `## VERIFICATION` section is deliberately omitted.
204
+
205
+ - Set the `Status:` key to `COMPLETED`, but *only* if the
206
+ change set was applied *completely* and *successfully* --
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.
212
+
213
+ - Refresh the `Modified:` key with the current time in
214
+ ISO-style format, determined by calling the
215
+ `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the `ase`
216
+ MCP server.
217
+
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:
222
+ "<task-content/>")` tool of the `ase` MCP server to persist the
223
+ updated task plan. Do not output anything in this sub-step.
224
+
225
+ 3. Only output the following <template/>:
193
226
 
194
227
  <template>
195
228
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan implemented**
196
229
  </template>
197
230
 
198
- 3. <if condition="<worktree-dir/> is not empty">
231
+ 4. <if condition="<worktree-dir/> is not empty">
199
232
  Give the closing hint by expanding the following (which,
200
233
  depending on the configured <ase-guidance-level/>, may expand
201
234
  into nothing and hence emit no output at all):
@@ -16,14 +16,18 @@
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
20
- plan content always overrules the draft.
21
-
22
- The *kind of change* stated by the plan's `☯ Kind:` header line
19
+ section produced by `ase-task-preflight` is used as a hint -- the plain
20
+ plan content always overrules the draft. Afterwards the plan's
21
+ `Properties:` frontmatter key gains the value `implemented` (plus
22
+ `verified`, if the verification phase actually ran and succeeded), and
23
+ its `Status:` key becomes `COMPLETED` if the change set was applied
24
+ completely and successfully.
25
+
26
+ The *kind of change* stated by the plan's `Kind:` frontmatter key
23
27
  (`CRAFTING`, `REFACTORING`, or `RESOLVING`) selects which
24
28
  *operation-specific tenet set* of the **ASE Tenets** is internalized
25
29
  before any artifact is touched, in addition to the always applying
26
- **GENERIC TENETS**. If a plan carries no such line, the kind is
30
+ **GENERIC TENETS**. If a plan carries no such key, the kind is
27
31
  *inferred* from the plan content, defaulting to `CRAFTING`.
28
32
 
29
33
  If the task plan deliberately *omits* the `## VERIFICATION` section
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-task-list
3
- argument-hint: "[--help|-h] [--verbose|-v]"
3
+ argument-hint: "[--help|-h] [--verbose|-v] [--include|-i=<state>[,...]] [--exclude|-e=<state>[,...]]"
4
4
  description: >
5
5
  List all available task ids.
6
6
  Use when user wants to see all tasks.
@@ -19,7 +19,7 @@ List Task Plans
19
19
 
20
20
  <expand name="getopt"
21
21
  arg1="ase-task-list"
22
- arg2="--verbose|-v">
22
+ arg2="--verbose|-v --include|-i=none --exclude|-e=COMPLETED,CANCELLED">
23
23
  $ARGUMENTS
24
24
  </expand>
25
25
 
@@ -30,13 +30,49 @@ List Task Plans
30
30
  Procedure
31
31
  ---------
32
32
 
33
- 1. Call the `ase_task_list(verbose: <getopt-option-verbose/>)` tool from
33
+ 1. Determine the *effective state set* <states/>, i.e., the lifecycle
34
+ states a task plan has to be in to be listed at all. For this, parse
35
+ <getopt-option-include/> and <getopt-option-exclude/> as
36
+ comma-separated token lists, silently dropping the `none` sentinel
37
+ and any empty token. If a token <token/> is *not* one of the eight
38
+ `Status:` values `DRAFTED`, `REJECTED`, `APPROVED`, `DEFERRED`,
39
+ `STARTED`, `BLOCKED`, `COMPLETED`, or `CANCELLED`, only output the
40
+ following <template/> and then *STOP* processing the entire current
41
+ skill:
42
+
43
+ <template>
44
+ ⧉ **ASE**: ✪ skill: **ase-task-list**, ▶ ERROR: invalid state: **<token/>**
45
+ </template>
46
+
47
+ Otherwise set <states/> to *all* eight states if both lists are
48
+ empty, to the *include* list if only it is non-empty, to all eight
49
+ *minus* the *exclude* list if only it is non-empty, and to the
50
+ *include* list *minus* the *exclude* list if both are non-empty. If
51
+ the resulting <states/> is *empty*, only output the following
52
+ <template/> and then *STOP* processing the entire current skill:
53
+
54
+ <template>
55
+ ⧉ **ASE**: ✪ skill: **ase-task-list**, ▶ ERROR: options `--include` and `--exclude` cancel out to an empty state set
56
+ </template>
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
+
67
+ 2. Call the `ase_task_list(verbose: <getopt-option-verbose/>)` tool from
34
68
  the `ase` MCP server. The result is a structured object with a
35
- `tasks` array where each entry has an `id` field, and -- if
36
- <getopt-option-verbose/> is `true` -- additionally an `mtime` field
37
- (formatted as `YYYY-MM-DD HH:MM`).
69
+ `tasks` array where each entry has an `id` and a `status` field, and
70
+ -- if <getopt-option-verbose/> is `true` -- additionally an `mtime`
71
+ field (formatted as `YYYY-MM-DD HH:MM`). *Drop* from the `tasks`
72
+ array every entry whose `status` is *not* contained in <states/>. Do
73
+ not output anything.
38
74
 
39
- 2. If the `tasks` array is empty, output the following <template/>:
75
+ 3. If the `tasks` array is empty, output the following <template/>:
40
76
 
41
77
  <template>
42
78
  ⧉ **ASE**: ◉ tasks: *(none)*
@@ -45,16 +81,16 @@ Procedure
45
81
  Else, dispatch on <getopt-option-verbose/>:
46
82
 
47
83
  - If <getopt-option-verbose/> is `true`, output the list of tasks
48
- with the following <template/>, where each <id/> and <mtime/>
49
- correspond to an entry in the task list:
84
+ with the following <template/>, where each <id/>, <status/>, and
85
+ <mtime/> correspond to an entry in the task list:
50
86
 
51
87
  <template>
52
88
  ⧉ **ASE**: ◉ tasks:
53
89
 
54
- | *Task Id* | *Last Modified* |
55
- |-----------|--------------------|
56
- | **<id/>** | `<mtime/>` |
57
- | [...] | [...] |
90
+ | *Task Id* | *Status* | *Last Modified* |
91
+ |-----------|-------------|--------------------|
92
+ | **<id/>** | `<status/>` | `<mtime/>` |
93
+ | [...] | [...] | [...] |
58
94
 
59
95
  </template>
60
96
 
@@ -72,7 +108,7 @@ Procedure
72
108
 
73
109
  </template>
74
110
 
75
- 3. Finally, give the closing hints by expanding the following (which,
111
+ 4. Finally, give the closing hints by expanding the following (which,
76
112
  depending on the configured <ase-guidance-level/>, may each expand
77
113
  into nothing and hence emit no output at all):
78
114
 
@@ -81,6 +117,11 @@ Procedure
81
117
  Use `/ase-task-id <id>` to switch to one of the listed tasks and `/ase-task-view` to inspect its plan.
82
118
  </ase-tpl-hint>
83
119
  </if>
120
+ <elseif condition="entries were dropped by the state filtering of step 2">
121
+ <ase-tpl-hint level="normal">
122
+ All task plans were filtered out by the effective state set -- use `/ase-task-list --exclude none` to list them regardless of their status.
123
+ </ase-tpl-hint>
124
+ </elseif>
84
125
  <else>
85
126
  <ase-tpl-hint level="normal">
86
127
  No task plan exists yet -- use `/ase-task-edit` to create one through a conversational loop.
@@ -89,7 +130,11 @@ Procedure
89
130
 
90
131
  <if condition="<getopt-option-verbose/> is not equal `true`">
91
132
  <ase-tpl-hint level="verbose">
92
- Use `/ase-task-list --verbose` to additionally show the last-modified timestamp of each task plan.
133
+ Use `/ase-task-list --verbose` to additionally show the status and the last-modified timestamp of each task plan.
93
134
  </ase-tpl-hint>
94
135
  </if>
95
136
 
137
+ <ase-tpl-hint level="verbose">
138
+ Use `/ase-task-list --include`/`--exclude` to narrow the listing to certain lifecycle states, e.g. `--include STARTED,BLOCKED`.
139
+ </ase-tpl-hint>
140
+
@@ -8,35 +8,78 @@
8
8
  `ase-task-list`
9
9
  [`--help`|`-h`]
10
10
  [`--verbose`|`-v`]
11
+ [`--include`|`-i`=*state*[`,`...]]
12
+ [`--exclude`|`-e`=*state*[`,`...]]
11
13
 
12
14
  ## DESCRIPTION
13
15
 
14
16
  The `ase-task-list` skill lists all available *task ids* in the
15
17
  current project by calling the `ase_task_list` MCP tool. In the
16
18
  default mode, only the task ids are rendered as a single-column
17
- Markdown table. In verbose mode, the last-modified timestamp of
18
- each task plan is rendered as an additional column.
19
+ Markdown table. In verbose mode, the lifecycle status and the
20
+ last-modified timestamp of each task plan are rendered as additional
21
+ columns.
22
+
23
+ The listing is restricted to an *effective state set*, derived from the
24
+ `Status:` frontmatter key of each task plan (which defaults to `DRAFTED`
25
+ for a plan carrying no such key): with `--include` only, exactly the
26
+ listed states are shown; with `--exclude` only, all states except the
27
+ listed ones; with both, the included ones minus the excluded ones. An
28
+ unknown state, or a combination which cancels out to an empty set,
29
+ aborts the skill with an error. By default,
30
+ `--exclude COMPLETED,CANCELLED` is in effect, so finished and
31
+ abandoned task plans stay out of the way. The eight states are:
32
+
33
+ ```text
34
+ DRAFTED APPROVED STARTED COMPLETED
35
+ REJECTED DEFERRED BLOCKED CANCELLED
36
+ ```
19
37
 
20
38
  ## OPTIONS
21
39
 
22
40
  `--verbose`|`-v`:
23
- Render an additional `Last Modified` column with the
24
- `YYYY-MM-DD HH:MM` timestamp of each task plan.
41
+ Render an additional `Status` column with the lifecycle state and an
42
+ additional `Last Modified` column with the `YYYY-MM-DD HH:MM`
43
+ timestamp of each task plan.
44
+
45
+ `--include`|`-i`=*state*[`,`...]:
46
+ Restrict the listed task plans to the given comma-separated list of
47
+ lifecycle states (e.g. `STARTED,BLOCKED`). Without this option, all
48
+ eight states are listed. The `none` sentinel selects no state at all.
49
+
50
+ `--exclude`|`-e`=*state*[`,`...]:
51
+ Remove the given comma-separated list of lifecycle states from the
52
+ listed task plans. Applied *after* `--include`, so
53
+ `-i DRAFTED,STARTED -e STARTED` lists `DRAFTED` only. Defaults to
54
+ `COMPLETED,CANCELLED`; pass `--exclude none` to suppress the
55
+ default and list task plans in every state.
25
56
 
26
57
  ## EXAMPLES
27
58
 
28
- List all task ids:
59
+ List all unfinished task ids:
29
60
 
30
61
  ```text
31
62
  ❯ /ase-task-list
32
63
  ```
33
64
 
34
- List all task ids together with their last-modified timestamps:
65
+ List all task ids together with their status and last-modified timestamps:
35
66
 
36
67
  ```text
37
68
  ❯ /ase-task-list --verbose
38
69
  ```
39
70
 
71
+ List the task ids of every task plan, including the finished ones:
72
+
73
+ ```text
74
+ ❯ /ase-task-list --exclude none
75
+ ```
76
+
77
+ List only the task ids of the task plans currently under work:
78
+
79
+ ```text
80
+ ❯ /ase-task-list --include STARTED,BLOCKED
81
+ ```
82
+
40
83
  ## SEE ALSO
41
84
 
42
85
  [`ase-task-id`](../ase-task-id/help.md), [`ase-task-view`](../ase-task-view/help.md), [`ase-task-edit`](../ase-task-edit/help.md),
@@ -78,25 +78,37 @@ Procedure
78
78
  previous run of this skill, *replace* this entire existing
79
79
  section.
80
80
 
81
+ Set <fence/> to a run of backtick characters *one longer* than
82
+ the longest backtick run occurring anywhere inside
83
+ <unified-diff/>, but to at least three, so a diff which itself
84
+ carries fenced code blocks (e.g. one over Markdown artifacts)
85
+ cannot terminate the block prematurely.
86
+
81
87
  <template>
82
88
 
83
89
  ## IMPLEMENTATION DRAFT
84
90
 
85
- ```text
91
+ <fence/>text
86
92
  <unified-diff/>
87
- ```
93
+ <fence/>
88
94
 
89
95
  </template>
90
96
 
91
- 3. <if condition="<task-content/> contains '⚙ Modified:'">
92
- Update <timestamp-modified/> with the current time in
97
+ 3. Update <timestamp-modified/> with the current time in
93
98
  ISO-style format, which has to be determined by calling the
94
99
  `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the `ase`
95
- MCP server and use the `text` field of its response. Update
96
- the `⚙ Modified: ...` line of <task-content/> with the new
97
- `⚙ Modified: <timestamp-modified/>`.
100
+ MCP server and using the `text` field of its response. Update
101
+ the `Modified: ...` frontmatter key of <task-content/> with the
102
+ new <timestamp-modified/> value, *creating* the whole key at its
103
+ position in the key order of the plan <format/> if the plan does
104
+ not carry it yet.
98
105
  Do not output anything.
99
- </if>
106
+
107
+ Additionally *add* the value `preflighted` to the `Properties:`
108
+ frontmatter key of <task-content/> if it is still absent, keeping
109
+ all already present values and *creating* the whole key (with the
110
+ single value `preflighted`) if the plan carries none. Do not
111
+ output anything.
100
112
 
101
113
  4. Finally, call the `ase_task_save(id: "<ase-task-id/>",
102
114
  text: "<task-content/>")` tool of the `ase` MCP server to save the updated
@@ -16,14 +16,15 @@ The `ase-task-preflight` skill performs a *preflight* (dry-run,
16
16
  test-drive) of the *implementation* of a task plan by creating a
17
17
  draft for a corresponding, complete *artifact change set* in
18
18
  *unified diff* format. The draft is appended to the task plan as
19
- an `IMPLEMENTATION DRAFT` section (replacing any previous draft).
19
+ an `IMPLEMENTATION DRAFT` section (replacing any previous draft) and
20
+ the plan's `Properties:` frontmatter key gains the value `preflighted`.
20
21
  No source files are modified.
21
22
 
22
- The *kind of change* stated by the plan's `☯ Kind:` header line
23
+ The *kind of change* stated by the plan's `Kind:` frontmatter key
23
24
  (`CRAFTING`, `REFACTORING`, or `RESOLVING`) selects which
24
25
  *operation-specific tenet set* of the **ASE Tenets** is internalized
25
26
  before the draft is produced, in addition to the always applying
26
- **GENERIC TENETS**. If a plan carries no such line, the kind is
27
+ **GENERIC TENETS**. If a plan carries no such key, the kind is
27
28
  *inferred* from the plan content, defaulting to `CRAFTING`.
28
29
 
29
30
  After the preflight, the user is asked whether to stop, hand
@@ -21,7 +21,7 @@ Reboot a Task Plan
21
21
 
22
22
  <expand name="getopt"
23
23
  arg1="ase-task-reboot"
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
 
@@ -46,51 +46,13 @@ Procedure
46
46
 
47
47
  2. React on task id:
48
48
 
49
- 1. <if condition="
50
- <instruction/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`
51
- ">
52
- Set <ase-task-id><instruction/></ase-task-id> (set task
53
- id to instruction) and <instruction></instruction> (set
54
- instruction empty), call the `ase_task_id(id: "<ase-task-id/>",
55
- session: "<ase-session-id/>")` tool from the `ase` MCP
56
- server to switch the task, and then only output the
57
- following <template/>:
58
-
59
- <template>
60
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task given**
61
- </template>
62
- </if>
63
-
64
- 2. <elseif condition="<instruction/> is NOT empty">
65
- The argument is neither empty nor a valid task id. As this
66
- skill only accepts an optional `[<id>]` argument and *never*
67
- a free-text instruction, only output the following <template/>
68
- and then immediately *STOP* processing the entire current skill:
69
-
70
- <template>
71
- ⧉ **ASE**: ☻ skill: **ase-task-reboot**, ▶ ERROR: expected single `[<id>]` argument
72
- </template>
73
- </elseif>
49
+ <expand name="task-react-id" arg1="ase-task-reboot"></expand>
74
50
 
75
51
  2. **Determine Operation:**
76
52
 
77
- 1. Call the `ase_task_load(id: "<ase-task-id/>")` tool of the `ase` MCP
78
- server to load the current task plan content and set <text/> to
79
- the `text` output field of the `ase_task_load` tool call.
80
-
81
- - If <text/> starts with `ERROR:` or `WARNING:`:
82
- Set <task-content></task-content> (set task content to empty).
83
- Set <words/> to "0".
84
-
85
- - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
86
- Set <task-content><text/></task-content> (set task content to text).
87
- Calculate the number of words <words/> of <task-content/>.
53
+ 1. Determine the current task plan content:
88
54
 
89
- Only output the following <template/>:
90
-
91
- <template>
92
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan loaded**
93
- </template>
55
+ <expand name="task-load-content"></expand>
94
56
 
95
57
  2. <if condition="<task-content/> is empty">
96
58
  Complain and tell the user to use the `ase-code-resolve`,
@@ -102,33 +64,28 @@ Procedure
102
64
  3. **Reboot Task Plan:**
103
65
 
104
66
  1. Start with <instruction></instruction> (set instruction to empty).
67
+ Do not output anything.
105
68
 
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**:'">
69
+ 2. <if condition="<task-content/> contains neither '- **WHAT**:' nor '- **WHY**:'">
113
70
  Set <instruction><task-content/></instruction> (set instruction to task content).
114
71
  </if>
115
72
 
116
- 3. <if condition="<task-content/> contains '<marker/> **WHAT**: <text/>'">
73
+ 3. <if condition="<task-content/> contains '- **WHAT**: <text/>'">
117
74
  Set <instruction><text/></instruction> (set instruction to extracted text).
118
75
  </if>
119
76
 
120
- 4. <if condition="<task-content/> contains '<marker/> **WHY**: <text/>' and <instruction/> is empty">
77
+ 4. <if condition="<task-content/> contains '- **WHY**: <text/>' and <instruction/> is empty">
121
78
  Set <instruction><text/></instruction> (set instruction to extracted text).
122
79
  </if>
123
80
 
124
- 5. <if condition="<task-content/> contains '<marker/> **WHY**: <text/>' and <instruction/> is NOT empty">
81
+ 5. <if condition="<task-content/> contains '- **WHY**: <text/>' and <instruction/> is NOT empty">
125
82
  Set <instruction><instruction/>, BECAUSE <text/></instruction>
126
83
  (append extracted text to instruction).
127
84
  </if>
128
85
 
129
- 6. <if condition="<task-content/> contains '⎈ Created: <text/>'">
86
+ 6. <if condition="the frontmatter of <task-content/> carries a `Created: <text/>` key">
130
87
  Set <timestamp-created><text/></timestamp-created> (set
131
- timestamp-created to extracted text)
88
+ timestamp-created to extracted text).
132
89
  </if>
133
90
 
134
91
  7. <if condition="<instruction/> is empty or contains only whitespace">
@@ -148,19 +105,19 @@ Procedure
148
105
  </if>
149
106
  </if>
150
107
 
151
- 8. Create a new plan from scratch and store the result as
108
+ 8. Only output the following <template/> and continue processing:
109
+
110
+ <template>
111
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇌ instruction: **<instruction/>**, ▶ status: **instruction given**
112
+ </template>
113
+
114
+ 9. Create a new plan from scratch and store the result as
152
115
  <task-content/> by closely following the defined plan format
153
116
  <format/> and injecting into it all the information from
154
117
  the <instruction/> and all decisions you derived from the
155
118
  <instruction/>.
156
119
 
157
- 9. <expand name="task-save-content" arg1="plan rebooted"></expand>
158
-
159
- 10. Only output the following <template/> and continue processing:
160
-
161
- <template>
162
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇌ instruction: **<instruction/>**, ▶ status: **instruction given**
163
- </template>
120
+ 10. <expand name="task-save-content" arg1="plan rebooted"></expand>
164
121
 
165
122
  4. **Decide Next Step:**
166
123
 
@@ -15,7 +15,7 @@
15
15
  The `ase-task-reboot` skill re-creates an existing task plan *from
16
16
  scratch* by extracting the original `**WHAT**` and `**WHY**` sections
17
17
  (if present) from the current plan, using them as the new instruction,
18
- preserving the original creation timestamp, and writing a fresh plan
18
+ preserving the original creation timestamp, and writing fresh plan
19
19
  content via `ase_task_save`.
20
20
 
21
21
  After the reboot, the user is asked whether to stop or hand off to
@@ -54,8 +54,10 @@ Procedure
54
54
 
55
55
  2. **Perform Operation**:
56
56
 
57
- 1. Call the `ase_task_load(id: "<id/>")` tool of the `ase` MCP
58
- server to load the task plan content and set <text/> to the
57
+ 1. Call the `ase_task_load(id: "<id/>", variant: "render")` tool
58
+ of the `ase` MCP server to load the task plan content in its
59
+ *rendering-prepared* form -- this skill is *display-only* and
60
+ hence never persists the plan again -- and set <text/> to the
59
61
  `text` output field of this `ase_task_load` tool call. Do not
60
62
  output anything related to this MCP tool call.
61
63
 
@@ -78,6 +80,27 @@ Procedure
78
80
 
79
81
  2. <if condition="<task-content/> is not empty">
80
82
  Treat <task-content/> as *verbatim* Markdown.
83
+
84
+ For the *rendering only*, drop the leading *frontmatter* block --
85
+ both `---` delimiters and all of their keys -- and instead place
86
+ the following column-aligned glyph lines *before* the
87
+ `# TASK: <title/>` heading, separated from it by an empty line,
88
+ omitting the line of every key absent from the frontmatter. The
89
+ glyph lines *MUST* stay *above* the heading, exactly where the
90
+ frontmatter block sits in the plan file, and *MUST NOT* be moved
91
+ below it. This keeps the `---` delimiters from rendering as a
92
+ horizontal rule plus a *setext heading*. This rewrite is
93
+ *display-only* and *MUST NOT* change <task-content/> itself:
94
+
95
+ <format>
96
+ ◉ **Id:** <task-id/>
97
+ ⎈ **Created:** <timestamp-created/>
98
+ ⚙ **Modified:** <timestamp-modified/>
99
+ ◐ **Status:** <task-status/>
100
+ ⚑ **Properties:** <task-properties/>
101
+ ☯ **Kind:** <task-kind/>
102
+ </format>
103
+
81
104
  *Render plan*: Only output the following <template/>. If
82
105
  <getopt-option-full/> is *not* `true`, <task-content/> is longer than
83
106
  90 lines, and a `## IMPLEMENTATION DRAFT` section (from the
@@ -87,9 +110,9 @@ Procedure
87
110
  Use the following <template/>:
88
111
 
89
112
  <template>
90
- <ase-tpl-head title="TASK"/>
113
+ <ase-tpl-head title="TASK" subtitle="<task-id/>"/>
91
114
  <task-content/>
92
- <ase-tpl-foot title="TASK"/>
115
+ <ase-tpl-foot title="TASK" subtitle="<task-id/>"/>
93
116
  </template>
94
117
  </if>
95
118
 
@@ -1,89 +0,0 @@
1
- /*
2
- ** Agentic Software Engineering (ASE)
3
- ** Copyright (c) 2025-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
- ** Licensed under Apache 2.0 <https://spdx.org/licenses/Apache-2.0>
5
- */
6
- import { isScalar } from "yaml";
7
- import { z } from "zod";
8
- import { Config, configSchema, parseScope, agentClassification } from "./ase-config.js";
9
- /* reusable functionality: ASE agent guidance level get/set */
10
- export class Guidance {
11
- /* allowed guidance level values */
12
- static levels = agentClassification.guidance;
13
- /* get the effective guidance level for an optional session;
14
- returns the default "normal" if nothing is configured */
15
- static get(log, session) {
16
- const scope = parseScope(session !== undefined ? `session:${session}` : undefined);
17
- const cfg = new Config("config", configSchema, log, scope);
18
- cfg.read();
19
- const val = cfg.get("agent.guidance");
20
- if (val === undefined)
21
- return "normal";
22
- const level = String(isScalar(val) ? val.value : val);
23
- return Guidance.levels.find((l) => l === level) ?? "normal";
24
- }
25
- /* set the guidance level on the strongest scope of an optional session */
26
- static set(log, level, session) {
27
- const scope = parseScope(session !== undefined ? `session:${session}` : undefined);
28
- const cfg = new Config("config", configSchema, log, scope);
29
- cfg.lock(() => {
30
- cfg.read();
31
- cfg.set("agent.guidance", level);
32
- cfg.write();
33
- });
34
- }
35
- }
36
- /* MCP registration entry point for guidance tools */
37
- export default class GuidanceMCP {
38
- log;
39
- constructor(log) {
40
- this.log = log;
41
- }
42
- register(mcp) {
43
- mcp.registerTool("ase_guidance", {
44
- title: "ASE guidance level get/set",
45
- description: "Get or set the active ASE agent guidance `level`. " +
46
- "If `level` is provided, it sets the guidance level, " +
47
- "otherwise it returns the current guidance `level`. " +
48
- "If `session` is provided, the operation is scoped to that session, " +
49
- "otherwise it operates on the strongest/closest scope (user/project cascade). " +
50
- "The guidance level controls the amount of unsolicited help hints -- " +
51
- "pointers to the available ASE skills, their options, and the recommended " +
52
- "next operations -- the agent emits. " +
53
- "Allowed levels: \"none\" (no help hints at all), " +
54
- "\"minimal\" (the single most essential help hint only), " +
55
- "\"normal\" (the essential help hints only), " +
56
- "\"verbose\" (all available help hints).",
57
- inputSchema: {
58
- level: z.enum(Guidance.levels).optional()
59
- .describe("guidance level to set; if omitted, the current guidance level is returned"),
60
- session: z.string().regex(/^[A-Za-z0-9._-]+$/).optional()
61
- .describe("session identifier (allowed characters: A-Z, a-z, 0-9, '.', '_', '-'); " +
62
- "if omitted, the operation is not scoped to a specific session")
63
- }
64
- }, async (args) => {
65
- try {
66
- if (args.level !== undefined) {
67
- Guidance.set(this.log, args.level, args.session);
68
- const where = args.session !== undefined ?
69
- ` for session "${args.session}"` : "";
70
- const msg = `OK: set agent.guidance to "${args.level}"${where}`;
71
- return {
72
- content: [{ type: "text", text: msg }]
73
- };
74
- }
75
- const text = Guidance.get(this.log, args.session);
76
- return {
77
- content: [{ type: "text", text }]
78
- };
79
- }
80
- catch (err) {
81
- const message = err instanceof Error ? err.message : String(err);
82
- return {
83
- isError: true,
84
- content: [{ type: "text", text: `ERROR: ${message}` }]
85
- };
86
- }
87
- });
88
- }
89
- }