@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.
- package/dst/ase-log.js +5 -0
- package/dst/ase-service.js +45 -6
- package/dst/ase-setup.js +4 -2
- package/dst/ase-statusline.js +6 -8
- package/dst/ase-task.js +152 -28
- package/package.json +5 -5
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/agents/ase-code-analyze.md +1 -1
- package/plugin/agents/ase-code-lint.md +4 -4
- package/plugin/agents/ase-meta-chat.md +1 -1
- package/plugin/agents/ase-meta-proximity.md +1 -1
- package/plugin/meta/ase-common-code.md +165 -2
- package/plugin/meta/ase-common-task.md +17 -15
- package/plugin/meta/ase-constitution.md +3 -3
- package/plugin/meta/ase-control.md +7 -7
- package/plugin/meta/ase-dialog.md +5 -4
- package/plugin/meta/ase-format-arch.md +7 -8
- package/plugin/meta/ase-format-spec.md +10 -11
- package/plugin/meta/ase-format-task.md +90 -20
- package/plugin/meta/ase-getopt.md +1 -1
- package/plugin/meta/ase-persona.md +3 -3
- package/plugin/meta/ase-skill.md +14 -24
- package/plugin/meta/ase-tenets.md +5 -5
- package/plugin/package.json +2 -2
- package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
- package/plugin/skills/ase-arch-analyze/help.md +1 -1
- package/plugin/skills/ase-arch-discover/SKILL.md +8 -6
- package/plugin/skills/ase-code-analyze/SKILL.md +1 -1
- package/plugin/skills/ase-code-analyze/help.md +1 -1
- package/plugin/skills/ase-code-craft/SKILL.md +2 -153
- package/plugin/skills/ase-code-craft/help.md +1 -1
- package/plugin/skills/ase-code-explain/SKILL.md +3 -3
- package/plugin/skills/ase-code-insight/SKILL.md +9 -7
- package/plugin/skills/ase-code-lint/SKILL.md +7 -5
- package/plugin/skills/ase-code-lint/help.md +2 -2
- package/plugin/skills/ase-code-refactor/SKILL.md +4 -155
- package/plugin/skills/ase-code-resolve/SKILL.md +8 -159
- package/plugin/skills/ase-docs-distill/SKILL.md +2 -2
- package/plugin/skills/ase-docs-distill/help.md +1 -1
- package/plugin/skills/ase-docs-proofread/SKILL.md +7 -3
- package/plugin/skills/ase-help-intent/SKILL.md +33 -9
- package/plugin/skills/ase-help-skill/SKILL.md +1 -1
- package/plugin/skills/ase-meta-brainstorm/SKILL.md +11 -2
- package/plugin/skills/ase-meta-changelog/SKILL.md +12 -8
- package/plugin/skills/ase-meta-commit/SKILL.md +11 -1
- package/plugin/skills/ase-meta-compat/SKILL.md +2 -2
- package/plugin/skills/ase-meta-config/help.md +4 -4
- package/plugin/skills/ase-meta-diaboli/SKILL.md +12 -3
- package/plugin/skills/ase-meta-diff/SKILL.md +11 -13
- package/plugin/skills/ase-meta-eli5/SKILL.md +3 -3
- package/plugin/skills/ase-meta-eli5/help.md +1 -1
- package/plugin/skills/ase-meta-evaluate/SKILL.md +3 -3
- package/plugin/skills/ase-meta-quorum/SKILL.md +17 -17
- package/plugin/skills/ase-meta-quotes/SKILL.md +1 -1
- package/plugin/skills/ase-meta-quotes/help.md +4 -3
- package/plugin/skills/ase-meta-review/SKILL.md +7 -5
- package/plugin/skills/ase-meta-review/help.md +2 -2
- package/plugin/skills/ase-meta-search/SKILL.md +18 -0
- package/plugin/skills/ase-meta-steelman/SKILL.md +11 -2
- package/plugin/skills/ase-meta-why/SKILL.md +15 -6
- package/plugin/skills/ase-meta-why/help.md +3 -3
- package/plugin/skills/ase-sync-export/SKILL.md +2 -1
- package/plugin/skills/ase-sync-export/help.md +1 -1
- package/plugin/skills/ase-sync-reconcile/SKILL.md +16 -2
- package/plugin/skills/ase-task-condense/SKILL.md +19 -72
- package/plugin/skills/ase-task-condense/help.md +1 -1
- package/plugin/skills/ase-task-delete/SKILL.md +1 -1
- package/plugin/skills/ase-task-dissect/SKILL.md +5 -18
- package/plugin/skills/ase-task-edit/SKILL.md +74 -26
- package/plugin/skills/ase-task-grill/SKILL.md +30 -124
- package/plugin/skills/ase-task-grill/help.md +2 -1
- package/plugin/skills/ase-task-id/SKILL.md +12 -2
- package/plugin/skills/ase-task-implement/SKILL.md +37 -4
- package/plugin/skills/ase-task-implement/help.md +9 -5
- package/plugin/skills/ase-task-list/SKILL.md +60 -15
- package/plugin/skills/ase-task-list/help.md +49 -6
- package/plugin/skills/ase-task-preflight/SKILL.md +20 -8
- package/plugin/skills/ase-task-preflight/help.md +4 -3
- package/plugin/skills/ase-task-reboot/SKILL.md +19 -62
- package/plugin/skills/ase-task-reboot/help.md +1 -1
- package/plugin/skills/ase-task-view/SKILL.md +27 -4
- package/dst/ase-guidance.js +0 -89
- package/dst/ase-persona.js +0 -87
- 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
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
|
20
|
-
plan content always overrules the draft.
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
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.
|
|
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
|
|
36
|
-
<getopt-option-verbose/> is `true` -- additionally an `mtime`
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
18
|
-
each task plan
|
|
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 `
|
|
24
|
-
`YYYY-MM-DD HH:MM`
|
|
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
|
-
|
|
91
|
+
<fence/>text
|
|
86
92
|
<unified-diff/>
|
|
87
|
-
|
|
93
|
+
<fence/>
|
|
88
94
|
|
|
89
95
|
</template>
|
|
90
96
|
|
|
91
|
-
3.
|
|
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
|
|
96
|
-
the
|
|
97
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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 '
|
|
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 '
|
|
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 '
|
|
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/>
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
|
58
|
-
server to load the task plan content
|
|
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
|
|
package/dst/ase-guidance.js
DELETED
|
@@ -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
|
-
}
|