@rse/ase 0.9.53 → 0.9.55

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 (31) hide show
  1. package/dst/ase-log.js +5 -0
  2. package/dst/ase-service.js +45 -6
  3. package/dst/ase-task.js +117 -18
  4. package/package.json +2 -2
  5. package/plugin/.claude-plugin/plugin.json +1 -1
  6. package/plugin/.codex-plugin/plugin.json +1 -1
  7. package/plugin/.github/plugin/plugin.json +1 -1
  8. package/plugin/meta/ase-common-code.md +34 -0
  9. package/plugin/meta/ase-common-task.md +3 -2
  10. package/plugin/meta/ase-constitution.md +6 -1
  11. package/plugin/meta/ase-format-task.md +96 -11
  12. package/plugin/package.json +1 -1
  13. package/plugin/skills/ase-code-craft/SKILL.md +8 -7
  14. package/plugin/skills/ase-code-lint/help.md +2 -2
  15. package/plugin/skills/ase-code-refactor/SKILL.md +8 -7
  16. package/plugin/skills/ase-code-resolve/SKILL.md +8 -7
  17. package/plugin/skills/ase-meta-config/help.md +3 -3
  18. package/plugin/skills/ase-meta-quotes/help.md +4 -3
  19. package/plugin/skills/ase-task-condense/SKILL.md +6 -5
  20. package/plugin/skills/ase-task-condense/help.md +1 -1
  21. package/plugin/skills/ase-task-edit/SKILL.md +26 -5
  22. package/plugin/skills/ase-task-grill/SKILL.md +8 -4
  23. package/plugin/skills/ase-task-grill/help.md +2 -1
  24. package/plugin/skills/ase-task-implement/SKILL.md +150 -5
  25. package/plugin/skills/ase-task-implement/help.md +40 -1
  26. package/plugin/skills/ase-task-list/SKILL.md +51 -15
  27. package/plugin/skills/ase-task-list/help.md +49 -6
  28. package/plugin/skills/ase-task-preflight/SKILL.md +15 -3
  29. package/plugin/skills/ase-task-preflight/help.md +9 -1
  30. package/plugin/skills/ase-task-reboot/SKILL.md +1 -1
  31. package/plugin/skills/ase-task-view/SKILL.md +23 -2
@@ -40,6 +40,7 @@ From scratch *craft* the following feature:
40
40
 
41
41
  @${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md
42
42
  @${CLAUDE_SKILL_DIR}/../../meta/ase-tenets.md
43
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-code.md
43
44
 
44
45
  Procedure
45
46
  ---------
@@ -127,11 +128,11 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
127
128
 
128
129
  3. <step id="STEP 3: Internalize Crafting Tenets">
129
130
 
130
- 1. You *MUST* internalize and strictly honor the **GENERIC TENETS**,
131
- and the **CRAFTING TENETS** of the **ASE Tenets** when updating
132
- in the following. Do not output anything.
131
+ 1. <task-kind>CRAFTING</task-kind>
133
132
 
134
- 2. Do not output anything in this STEP 3.
133
+ 2. <expand name="code-tenets" arg1="<task-kind/>"></expand>
134
+
135
+ 3. Do not output anything in this STEP 3.
135
136
 
136
137
  </step>
137
138
 
@@ -251,9 +252,9 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
251
252
  2. Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
252
253
  `ase` MCP server and use the `text` field of its response for
253
254
  <timestamp-created/> and <timestamp-modified/> information. Then
254
- insert the current <ase-task-id/>, <timestamp-created/>, and
255
- <timestamp-modified/> information and calculate the number of
256
- words <words/> of <task-content/>.
255
+ insert the current <ase-task-id/>, <timestamp-created/>,
256
+ <timestamp-modified/>, and <task-kind/> information and calculate
257
+ the number of words <words/> of <task-content/>.
257
258
 
258
259
  3. You then *MUST* *save* the resulting plan content with the
259
260
  `ase_task_save(id: "<ase-task-id/>", text: "<task-content/>")`.
@@ -64,8 +64,8 @@ A05 COMPLEXITY A10 SMELLS A15 PERFORMANCE A20 DEAD-CODE
64
64
 
65
65
  `--exclude`|`-e`=*aspect*[`,`...]:
66
66
  Remove the given comma-separated list of aspect ids from the checked
67
- code quality aspects. Applied *after* `--include`, so `-i A01,A02 -e
68
- A02` checks `A01` only.
67
+ code quality aspects. Applied *after* `--include`, so
68
+ `-i A01,A02 -e A02` checks `A01` only.
69
69
 
70
70
  ## ARGUMENTS
71
71
 
@@ -40,6 +40,7 @@ to `true`, <getopt-option-dry/> to `true`, and <getopt-option-next/> to
40
40
 
41
41
  @${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md
42
42
  @${CLAUDE_SKILL_DIR}/../../meta/ase-tenets.md
43
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-code.md
43
44
 
44
45
  Procedure
45
46
  ---------
@@ -127,11 +128,11 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
127
128
 
128
129
  3. <step id="STEP 3: Internalize Refactoring Tenets">
129
130
 
130
- 1. You *MUST* internalize and strictly honor the **GENERIC TENETS**,
131
- and the **REFACTORING TENETS** of the **ASE Tenets** when updating
132
- in the following. Do not output anything.
131
+ 1. <task-kind>REFACTORING</task-kind>
133
132
 
134
- 2. Do not output anything in this STEP 3.
133
+ 2. <expand name="code-tenets" arg1="<task-kind/>"></expand>
134
+
135
+ 3. Do not output anything in this STEP 3.
135
136
 
136
137
  </step>
137
138
 
@@ -251,9 +252,9 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
251
252
  2. Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
252
253
  `ase` MCP server and use the `text` field of its response for
253
254
  <timestamp-created/> and <timestamp-modified/> information. Then
254
- insert the current <ase-task-id/>, <timestamp-created/>, and
255
- <timestamp-modified/> information and calculate the number of
256
- words <words/> of <task-content/>.
255
+ insert the current <ase-task-id/>, <timestamp-created/>,
256
+ <timestamp-modified/>, and <task-kind/> information and calculate
257
+ the number of words <words/> of <task-content/>.
257
258
 
258
259
  3. You then *MUST* *save* the resulting plan content with the
259
260
  `ase_task_save(id: "<ase-task-id/>", text: "<task-content/>")`.
@@ -40,6 +40,7 @@ to `true`, <getopt-option-dry/> to `true`, and <getopt-option-next/> to
40
40
 
41
41
  @${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md
42
42
  @${CLAUDE_SKILL_DIR}/../../meta/ase-tenets.md
43
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-code.md
43
44
 
44
45
  Procedure
45
46
  ---------
@@ -181,11 +182,11 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
181
182
 
182
183
  3. <step id="STEP 3: Internalize Problem Resolution Tenets">
183
184
 
184
- 1. You *MUST* internalize and strictly honor the **GENERIC TENETS**,
185
- and the **RESOLVING TENETS** of the **ASE Tenets** when updating
186
- in the following. Do not output anything.
185
+ 1. <task-kind>RESOLVING</task-kind>
187
186
 
188
- 2. Do not output anything in this STEP 3.
187
+ 2. <expand name="code-tenets" arg1="<task-kind/>"></expand>
188
+
189
+ 3. Do not output anything in this STEP 3.
189
190
 
190
191
  </step>
191
192
 
@@ -305,9 +306,9 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
305
306
  2. Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
306
307
  `ase` MCP server and use the `text` field of its response for
307
308
  <timestamp-created/> and <timestamp-modified/> information. Then
308
- insert the current <ase-task-id/>, <timestamp-created/>, and
309
- <timestamp-modified/> information and calculate the number of
310
- words <words/> of <task-content/>.
309
+ insert the current <ase-task-id/>, <timestamp-created/>,
310
+ <timestamp-modified/>, and <task-kind/> information and calculate
311
+ the number of words <words/> of <task-content/>.
311
312
 
312
313
  3. You then *MUST* *save* the resulting plan content with the
313
314
  `ase_task_save(id: "<ase-task-id/>", text: "<task-content/>")`.
@@ -67,9 +67,9 @@ The following *operations* exist:
67
67
  The `init` and `edit` subcommands of the `ase config` CLI are
68
68
  deliberately *not* mirrored: `edit` is bound to the interactive `$EDITOR`
69
69
  and therefore has no meaning inside an assistant turn, and `init` is a
70
- preset-bootstrapping operation that stays a shell concern next to `ase
71
- setup`. Both remain available as `ase config init` and `ase config edit`
72
- on the command line.
70
+ preset-bootstrapping operation that stays a shell concern next to
71
+ `ase setup`. Both remain available as `ase config init` and
72
+ `ase config edit` on the command line.
73
73
 
74
74
  ## OPTIONS
75
75
 
@@ -39,9 +39,10 @@ without any quote is rendered as `(none)`.
39
39
 
40
40
  Every quote is rendered on its own line and carries, where applicable,
41
41
  the suffixes `— <author>, <origin>` (in the two `ATTRIBUTED`
42
- quadrants, omitting whichever part is unknown), `[from proximity:
43
- <source-topic>]` (when the quote was contributed by a neighborhood topic
44
- under `--proximity` instead of by *topic-keywords* itself), and
42
+ quadrants, omitting whichever part is unknown),
43
+ `[from proximity: <source-topic>]` (when the quote was contributed by a
44
+ neighborhood topic under `--proximity` instead of by *topic-keywords*
45
+ itself), and
45
46
  `(unverified)` (when the exact wording or the attribution could not be
46
47
  established with confidence). The `(unverified)` marker is dropped as
47
48
  soon as the Internet/Web search under `--ground` confirms the wording and
@@ -98,7 +98,7 @@ Set <args></args> (set args to empty).
98
98
  Set <words-before><words/></words-before> (remember the loaded
99
99
  word count for the strictly-smaller check in step 3).
100
100
 
101
- <if condition="<task-content/> contains '⎈ Created: <text/>'">
101
+ <if condition="the frontmatter of <task-content/> carries a `Created: <text/>` key">
102
102
  Set <timestamp-created><text/></timestamp-created> (extract the
103
103
  original creation timestamp so it can be re-inserted unchanged
104
104
  into the condensed <task-content/> in step 3).
@@ -125,10 +125,11 @@ Set <args></args> (set args to empty).
125
125
  and unchanged*. Honor the following ruleset *strictly*:
126
126
 
127
127
  1. *Preserve-exactly (never alter)*: the plan <format/>
128
- structure (the headings `#`/`##`, all three `## CONTEXT`,
129
- `## CHANGES`, and `## VERIFICATION` sections, the
130
- `Created:`/`Modified:` lines, and
131
- the `- **<aspect/>**:` bullet labels), all *code spans* and
128
+ structure (the frontmatter block with its `Id:`, `Created:`,
129
+ `Modified:`, `Status:`, `Properties:`, and `Kind:` keys,
130
+ the headings `#`/`##`, all
131
+ three `## CONTEXT`, `## CHANGES`, and `## VERIFICATION`
132
+ sections, and the `- **<aspect/>**:` bullet labels), all *code spans* and
132
133
  code blocks, technical terms, file paths, identifiers,
133
134
  numbers, severities (`LOW`/`MEDIUM`/`HIGH`/`ACCEPTED`), and
134
135
  the `*<aspect/>*` emphasis highlighting convention.
@@ -30,7 +30,7 @@ telegrapher-like even under the `writer` persona.
30
30
 
31
31
  The plan is saved *only* when condensing actually makes it smaller; if no
32
32
  further reduction is possible, the plan is left untouched (including its
33
- `⚙ Modified:` timestamp) and reported as *already condensed*.
33
+ `Modified:` frontmatter timestamp) and reported as *already condensed*.
34
34
 
35
35
  After condensing, the user is asked whether to stop or hand off to
36
36
  `ase-task-edit`, `ase-task-implement`, or `ase-task-preflight`, unless
@@ -322,13 +322,13 @@ Set <args></args> (set args to empty).
322
322
  `PREFLIGHT`, or declines/cancels in the dialog of step 3.4:
323
323
 
324
324
  1. *Update timestamp*:
325
- <if condition="<task-content/> contains '⚙ Modified:' AND <task-content-dirty/> is 'true'">
325
+ <if condition="the frontmatter of <task-content/> carries a `Modified:` key AND <task-content-dirty/> is 'true'">
326
326
  Update <timestamp-modified/> with the current time in
327
327
  ISO-style format, which has to be determined by calling the
328
328
  `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the `ase`
329
329
  MCP server and use the `text` field of its response. Update
330
- the `⚙ Modified: ...` line of <task-content/> with the new
331
- `⚙ Modified: <timestamp-modified/>`.
330
+ the `Modified: ...` frontmatter key of <task-content/> with the
331
+ new <timestamp-modified/> value.
332
332
  Do not output anything.
333
333
  </if>
334
334
 
@@ -346,6 +346,27 @@ Set <args></args> (set args to empty).
346
346
  </if>
347
347
 
348
348
  3. *Render plan*: Treat <task-content/> as *verbatim* Markdown.
349
+
350
+ For the *rendering only*, drop the leading *frontmatter* block --
351
+ both `---` delimiters and all of their keys -- and instead place
352
+ the following column-aligned glyph lines *before* the
353
+ `# TASK: <title/>` heading, separated from it by an empty line,
354
+ omitting the line of every key absent from the frontmatter. The
355
+ glyph lines *MUST* stay *above* the heading, exactly where the
356
+ frontmatter block sits in the plan file, and *MUST NOT* be moved
357
+ below it. This keeps the `---` delimiters from rendering as a
358
+ horizontal rule plus a *setext heading*. This rewrite is
359
+ *display-only* and *MUST NOT* change <task-content/> itself:
360
+
361
+ <format>
362
+ ◉ **Id:** <task-id/>
363
+ ⎈ **Created:** <timestamp-created/>
364
+ ⚙ **Modified:** <timestamp-modified/>
365
+ ◐ **Status:** <task-status/>
366
+ ⚑ **Properties:** <task-properties/>
367
+ ☯ **Kind:** <task-kind/>
368
+ </format>
369
+
349
370
  Only output the following <template/>, so the user
350
371
  can read the plan and react to it. If <task-content/> is longer
351
372
  than 90 lines and a `## IMPLEMENTATION DRAFT` section (from the
@@ -355,9 +376,9 @@ Set <args></args> (set args to empty).
355
376
  Use the following <template/>:
356
377
 
357
378
  <template>
358
- <ase-tpl-head title="TASK"/>
379
+ <ase-tpl-head title="TASK" subtitle="<task-id/>"/>
359
380
  <task-content/>
360
- <ase-tpl-foot title="TASK"/>
381
+ <ase-tpl-foot title="TASK" subtitle="<task-id/>"/>
361
382
  </template>
362
383
 
363
384
  4. *Determine next step*:
@@ -216,7 +216,7 @@ Set <args>--int-reuse-task</args>.
216
216
 
217
217
  2. Finally, update the plan in <plan/> based on all answers <answer-N/>.
218
218
 
219
- 3. <if condition="<plan/> contains '⎈ Created: <text/>'">
219
+ 3. <if condition="the frontmatter of <plan/> carries a `Created: <text/>` key">
220
220
  Set <timestamp-created><text/></timestamp-created> (set
221
221
  timestamp-created to extracted text)
222
222
  </if>
@@ -225,11 +225,15 @@ Set <args>--int-reuse-task</args>.
225
225
  `ase` MCP server and use the `text` field of its response for
226
226
  <timestamp-modified/> information. If <timestamp-created/> is
227
227
  still unset (because the previous <plan/> had no `Created:`
228
- line), set <timestamp-created><timestamp-modified/></timestamp-created>
228
+ frontmatter key), set <timestamp-created><timestamp-modified/></timestamp-created>
229
229
  (fall back to the modified timestamp). Then insert the current
230
230
  <ase-task-id/>, previous <timestamp-created/>, and refreshed
231
- <timestamp-modified/> information and calculate the number of
232
- words <words/> of <plan/>.
231
+ <timestamp-modified/> information into the frontmatter keys `Id:`,
232
+ `Created:`, and `Modified:` and calculate the number of
233
+ words <words/> of <plan/>. Additionally *add* the value `grilled`
234
+ to the `Properties:` frontmatter key if it is still absent,
235
+ keeping all already present values and *creating* the whole key
236
+ (with the single value `grilled`) if the plan carries none.
233
237
 
234
238
  5. Call the `ase_task_save(id: "<ase-task-id/>",
235
239
  text: "<plan/>")` tool of the `ase` MCP server to save the updated
@@ -24,7 +24,8 @@ the code base and world knowledge), marks the current-plan choice, and
24
24
  lets the user pick via an interactive dialog. It honors checks for
25
25
  *fuzzy language*, *conflicting terminology*, *conflicting code*, and
26
26
  *non-concrete scenarios*. Once all aspects are resolved, the plan is
27
- updated and persisted, and the user is offered a hand-off to editing,
27
+ updated and persisted, its `Properties:` frontmatter key gains the value
28
+ `grilled`, and the user is offered a hand-off to editing,
28
29
  implementation, or preflight.
29
30
 
30
31
  ## OPTIONS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-task-implement
3
- argument-hint: "[--help|-h] [--next|-n <option>[,...]] [<id>]"
3
+ argument-hint: "[--help|-h] [--next|-n <option>[,...]] [--worktree|-w] [<id>]"
4
4
  description: >
5
5
  Implement current or given task plan.
6
6
  Use when the user calls to "implement", "realize" or "apply" the
@@ -21,7 +21,7 @@ Implement a Task Plan
21
21
 
22
22
  <expand name="getopt"
23
23
  arg1="ase-task-implement"
24
- arg2="--next|-n=(none|DONE|DELETE)... --int-reuse-task">
24
+ arg2="--next|-n=(none|DONE|DELETE)... --worktree|-w --int-reuse-task">
25
25
  $ARGUMENTS
26
26
  </expand>
27
27
 
@@ -32,6 +32,8 @@ with a corresponding, complete *change set*.
32
32
 
33
33
  @${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md
34
34
  @${CLAUDE_SKILL_DIR}/../../meta/ase-common-task.md
35
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-tenets.md
36
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-code.md
35
37
 
36
38
  Procedure
37
39
  ---------
@@ -59,7 +61,98 @@ Procedure
59
61
  or `ase-task-edit` skills first to create a task plan. Then
60
62
  immediately stop processing this skill.
61
63
 
62
- 3. **Create Implementation:**
64
+ 3. Internalize the tenets stated by the plan:
65
+
66
+ <expand name="code-tenets-from-plan"></expand>
67
+
68
+ 3. **Prepare WorkTree:**
69
+
70
+ <if condition="<getopt-option-worktree/> is not equal `true`">
71
+ No worktree was requested, so the implementation is applied directly
72
+ to the *current* working copy. Set <worktree-dir></worktree-dir>
73
+ (empty) and *skip* all remaining sub-steps of this step. Do not
74
+ output anything.
75
+ </if>
76
+
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
79
+ unique *task id*, so the worktree directory and its branch stay
80
+ unambiguously tied to the very task plan implemented in them.
81
+ The task id is a plain identifier by construction, hence it is
82
+ directly usable as both a directory and a branch name. Do not
83
+ output anything.
84
+
85
+ 2. Determine the *repository root* by running the corresponding
86
+ command (taken exactly as given) and capturing its output into
87
+ <repo-root/>:
88
+
89
+ `git rev-parse --show-toplevel`
90
+
91
+ <if condition="this command fails">
92
+ The current directory is no Git repository, so no worktree can be
93
+ created. Only output the following <template/> and then
94
+ immediately *STOP* processing the entire current skill, leaving
95
+ the working copy *untouched*:
96
+
97
+ <template>
98
+ ⧉ **ASE**: ☻ skill: **ase-task-implement**, ▶ ERROR: no Git repository -- cannot create worktree
99
+ </template>
100
+ </if>
101
+
102
+ Then set <worktree-dir><repo-root/>/.ase/worktree/<worktree-name/></worktree-dir>.
103
+
104
+ 3. Determine the *existing worktrees* and *existing branches* by
105
+ running the corresponding commands (taken exactly as given) and
106
+ capturing their outputs:
107
+
108
+ `git worktree list --porcelain`
109
+
110
+ `git branch --list`
111
+
112
+ <if condition="the worktree directory <worktree-dir/> or the branch <worktree-name/> already exists">
113
+ Only output the following <template/> and then immediately *STOP*
114
+ processing the entire current skill, leaving the existing
115
+ worktree, its branch, and the working copy *untouched*:
116
+
117
+ <template>
118
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: worktree or branch **<worktree-name/>** already exists
119
+ </template>
120
+
121
+ Directly *after* this error <template/>, and *before* stopping,
122
+ give the corrective hint by expanding the following (which,
123
+ depending on the configured <ase-guidance-level/>, may expand
124
+ into nothing and hence emit no output at all):
125
+
126
+ <ase-tpl-hint level="minimal">
127
+ Remove the existing worktree via `git worktree remove` and `git branch -d`, or rename the task via `/ase-task-rename` to implement it under a still unused worktree name.
128
+ </ase-tpl-hint>
129
+ </if>
130
+
131
+ 4. Create the worktree by running the corresponding command (taken
132
+ exactly as given), which creates the directory *and* -- named
133
+ after its last path component -- the branch <worktree-name/> from
134
+ `HEAD`. The `.ase` directory is usually git-ignored, so the
135
+ worktree itself never shows up as a change:
136
+
137
+ `git worktree add "<worktree-dir/>"`
138
+
139
+ <if condition="this command fails">
140
+ Only output the following <template/> and then immediately *STOP*
141
+ processing the entire current skill, leaving the working copy
142
+ *untouched*:
143
+
144
+ <template>
145
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: worktree **<worktree-name/>** failed to create
146
+ </template>
147
+ </if>
148
+
149
+ 5. Only output the following <template/>:
150
+
151
+ <template>
152
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ◉ worktree: **.ase/worktree/<worktree-name/>**, ▶ status: **worktree created**
153
+ </template>
154
+
155
+ 4. **Create Implementation:**
63
156
 
64
157
  1. Perform a *final implementation* of the task plan
65
158
  by modifying the *artifacts* with a corresponding, complete
@@ -73,6 +166,19 @@ Procedure
73
166
  overrules the implementation draft in the `IMPLEMENTATION DRAFT`
74
167
  section of <task-content/>.
75
168
 
169
+ <if condition="<worktree-dir/> is not empty">
170
+ The change set *MUST* land *exclusively inside* the worktree
171
+ <worktree-dir/>: resolve *every* file path of the task plan
172
+ relative to <worktree-dir/> instead of the original working copy,
173
+ and run *every* verification command (build, tests, linter,
174
+ type-checker, program execution) with <worktree-dir/> as its
175
+ working directory. You *MUST* *NEVER* modify, stage, stash,
176
+ revert, or commit anything *outside* of this worktree. Leave the
177
+ worktree *uncommitted*: do *not* run `git add` and do *not* run
178
+ `git commit`, so the user keeps full control over the final
179
+ commit.
180
+ </if>
181
+
76
182
  <if condition="<task-content/> does NOT contain a `## VERIFICATION` section heading">
77
183
  The task plan deliberately *omits* the `## VERIFICATION`
78
184
  section. You *MUST* therefore *strictly skip* the entire
@@ -83,13 +189,52 @@ Procedure
83
189
  way.
84
190
  </if>
85
191
 
86
- 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 `start` and `complete` transitions of the
208
+ state machine of the plan <format/> in one go. Otherwise
209
+ leave the `Status:` key *untouched*, as an incomplete run
210
+ transitioned nowhere.
211
+
212
+ - Refresh the `Modified:` key with the current time in
213
+ ISO-style format, determined by calling the
214
+ `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the `ase`
215
+ MCP server.
216
+
217
+ Then call the `ase_task_save(id: "<ase-task-id/>", text:
218
+ "<task-content/>")` tool of the `ase` MCP server to persist the
219
+ updated task plan. Do not output anything in this sub-step.
220
+
221
+ 3. Only output the following <template/>:
87
222
 
88
223
  <template>
89
224
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan implemented**
90
225
  </template>
91
226
 
92
- 4. **Decide Next Step:**
227
+ 4. <if condition="<worktree-dir/> is not empty">
228
+ Give the closing hint by expanding the following (which,
229
+ depending on the configured <ase-guidance-level/>, may expand
230
+ into nothing and hence emit no output at all):
231
+
232
+ <ase-tpl-hint level="minimal">
233
+ The change set is uncommitted in `.ase/worktree/<worktree-name/>` on branch `<worktree-name/>` -- review and commit it there, then remove the worktree via `git worktree remove`.
234
+ </ase-tpl-hint>
235
+ </if>
236
+
237
+ 5. **Decide Next Step:**
93
238
 
94
239
  1. *Determine next step*:
95
240
 
@@ -8,6 +8,7 @@
8
8
  `ase-task-implement`
9
9
  [`--help`|`-h`]
10
10
  [`--next`|`-n` *option*[,...]]
11
+ [`--worktree`|`-w`]
11
12
  [*id*]
12
13
 
13
14
  ## DESCRIPTION
@@ -16,7 +17,18 @@ The `ase-task-implement` skill performs the *final implementation* of
16
17
  a task plan by modifying the corresponding *artifacts* with a complete
17
18
  *change set*. The plan is loaded and any optional `IMPLEMENTATION DRAFT`
18
19
  section produced by `ase-task-preflight` is used as a hint - the plain
19
- plan content always overrules the draft.
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
27
+ (`CRAFTING`, `REFACTORING`, or `RESOLVING`) selects which
28
+ *operation-specific tenet set* of the **ASE Tenets** is internalized
29
+ before any artifact is touched, in addition to the always applying
30
+ **GENERIC TENETS**. If a plan carries no such key, the kind is
31
+ *inferred* from the plan content, defaulting to `CRAFTING`.
20
32
 
21
33
  If the task plan deliberately *omits* the `## VERIFICATION` section
22
34
  (as produced by `ase-code-craft`, `ase-code-refactor`,
@@ -25,6 +37,17 @@ the entire verification phase is strictly skipped: no build, tests,
25
37
  linter, type-checker, or program execution is performed once the
26
38
  source files have been modified.
27
39
 
40
+ With `--worktree`|`-w`, the change set is *not* applied to the current
41
+ working copy: a *fresh Git WorkTree* `.ase/worktree/<id>` and its
42
+ equally named branch are created from `HEAD` *before* any artifact is
43
+ touched, and the entire implementation -- including all verification
44
+ runs -- then happens *inside* that worktree, which is left
45
+ *uncommitted*. The worktree is *not* named by an option value: it
46
+ always carries the unique *task id*, so worktree and branch stay tied
47
+ to the very task plan implemented in them. As the worktree branches off
48
+ `HEAD`, *uncommitted* changes of the current working copy are *not*
49
+ carried over into it.
50
+
28
51
  After implementation, the user is asked whether to preserve or
29
52
  delete the task plan, unless `--next` pre-selects this choice.
30
53
 
@@ -40,6 +63,14 @@ delete the task plan, unless `--next` pre-selects this choice.
40
63
  answer required), `DONE` (preserve task plan and stop), or
41
64
  `DELETE` (hand off to `ase-task-delete`).
42
65
 
66
+ `--worktree`|`-w`:
67
+ Apply the change set inside a dedicated *Git WorkTree* instead of
68
+ the current working copy. The worktree directory `.ase/worktree/<id>`
69
+ and its equally named branch are derived from the *task id* and
70
+ created from `HEAD`. If either the directory or the branch already
71
+ exists, the skill stops and touches nothing. By default, the change
72
+ set is applied to the current working copy.
73
+
43
74
  ## ARGUMENTS
44
75
 
45
76
  *id*:
@@ -60,7 +91,15 @@ Implement a specific task and delete the plan when done:
60
91
  ❯ /ase-task-implement --next DELETE hello
61
92
  ```
62
93
 
94
+ Implement the task `hello` inside the isolated Git WorkTree
95
+ `.ase/worktree/hello`:
96
+
97
+ ```text
98
+ ❯ /ase-task-implement --worktree hello
99
+ ```
100
+
63
101
  ## SEE ALSO
64
102
 
65
103
  [`ase-task-edit`](../ase-task-edit/help.md), [`ase-task-preflight`](../ase-task-preflight/help.md), [`ase-task-reboot`](../ase-task-reboot/help.md),
66
104
  [`ase-task-view`](../ase-task-view/help.md), [`ase-task-delete`](../ase-task-delete/help.md).
105
+