@rse/ase 0.9.58 → 0.9.60

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 (43) hide show
  1. package/dst/ase-hook.js +45 -5
  2. package/dst/ase-markdown.js +1 -1
  3. package/dst/ase-meta.js +1 -1
  4. package/dst/ase-service.js +2 -0
  5. package/dst/ase-setup.js +1 -1
  6. package/dst/ase-sleep.js +3 -3
  7. package/dst/ase-statusline.js +1 -1
  8. package/dst/ase-worktree.js +162 -0
  9. package/dst/ase.js +2 -0
  10. package/package.json +12 -13
  11. package/plugin/.claude-plugin/plugin.json +1 -1
  12. package/plugin/.codex-plugin/plugin.json +1 -1
  13. package/plugin/.github/plugin/plugin.json +1 -1
  14. package/plugin/agents/ase-code-lint.md +15 -0
  15. package/plugin/agents/ase-docs-proofread.md +15 -0
  16. package/plugin/meta/ase-common-code.md +1 -1
  17. package/plugin/meta/ase-common-task.md +8 -8
  18. package/plugin/meta/ase-control.md +26 -8
  19. package/plugin/meta/ase-dialog.md +4 -2
  20. package/plugin/package.json +4 -4
  21. package/plugin/skills/ase-code-craft/SKILL.md +43 -9
  22. package/plugin/skills/ase-code-craft/help.md +13 -0
  23. package/plugin/skills/ase-code-dissect/SKILL.md +30 -9
  24. package/plugin/skills/ase-code-edit/SKILL.md +472 -0
  25. package/plugin/skills/ase-code-edit/help.md +127 -0
  26. package/plugin/skills/ase-code-lint/SKILL.md +26 -0
  27. package/plugin/skills/ase-code-refactor/SKILL.md +7 -6
  28. package/plugin/skills/ase-code-resolve/SKILL.md +7 -6
  29. package/plugin/skills/ase-docs-proofread/SKILL.md +21 -0
  30. package/plugin/skills/ase-help-skill/catalog.md +1 -0
  31. package/plugin/skills/ase-sync-import/SKILL.md +2 -1
  32. package/plugin/skills/ase-sync-reconcile/SKILL.md +3 -1
  33. package/plugin/skills/ase-task-condense/SKILL.md +13 -13
  34. package/plugin/skills/ase-task-dissect/SKILL.md +6 -5
  35. package/plugin/skills/ase-task-edit/SKILL.md +42 -20
  36. package/plugin/skills/ase-task-edit/help.md +7 -0
  37. package/plugin/skills/ase-task-grill/SKILL.md +4 -4
  38. package/plugin/skills/ase-task-implement/SKILL.md +39 -24
  39. package/plugin/skills/ase-task-implement/help.md +4 -2
  40. package/plugin/skills/ase-task-preflight/SKILL.md +18 -4
  41. package/plugin/skills/ase-task-preflight/help.md +5 -1
  42. package/plugin/skills/ase-task-reboot/SKILL.md +1 -1
  43. package/plugin/skills/ase-task-view/SKILL.md +1 -2
@@ -48,8 +48,9 @@ Procedure
48
48
 
49
49
  <if condition="<getopt-option-direct/> is not equal to 'true'">
50
50
  You *MUST* *NOT* call `Edit`, `Write`, `NotebookEdit`, or any
51
- filesystem-modifying tool during this entire skill. The *only*
52
- permitted way to persist artifacts is via `ase_task_save(...)`.
51
+ filesystem-modifying tool, nor execute any filesystem-modifying
52
+ shell command, during this entire skill. The *only* permitted way
53
+ to persist artifacts is via the `ase_task_save(...)` MCP tool.
53
54
  </if>
54
55
  <else>
55
56
  The `--direct`/`-D` mode applies the resolution *in place*, so STEP 4
@@ -257,11 +258,11 @@ resolution actually demands, and you *MUST* *NOT* call
257
258
  `ase` MCP server and use the `text` field of its response for
258
259
  <timestamp-created/> and <timestamp-modified/> information. Then
259
260
  insert the current <ase-task-id/>, <timestamp-created/>,
260
- <timestamp-modified/>, and <task-kind/> information and calculate
261
- the number of words <words/> of <task-content/>.
261
+ <timestamp-modified/>, and <task-kind/> information.
262
262
 
263
263
  3. You then *MUST* *save* the resulting plan content with the
264
- `ase_task_save(id: "<ase-task-id/>", text: "<task-content/>")`.
264
+ `ase_task_save(id: "<ase-task-id/>", text: "<task-content/>")`
265
+ MCP tool call only -- *NEVER* by executing a shell command.
265
266
 
266
267
  4. If <problem-id/> is set (i.e. the <problem/> was retrieved from
267
268
  `ase_kv_get` in STEP 1.1 via key `ase-issue-<problem-id/>`),
@@ -273,7 +274,7 @@ resolution actually demands, and you *MUST* *NOT* call
273
274
  5. Output a hint with the following <template/>:
274
275
 
275
276
  <template>
276
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan created**
277
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan created**
277
278
  </template>
278
279
 
279
280
  6. Directly pass through control to the next skill:
@@ -163,6 +163,27 @@ Analyze documents for spelling, punctuation, or grammar errors
163
163
  <context-before/> to its *last* two lines and
164
164
  <context-after/> to its *first* two lines.
165
165
 
166
+ Then, unless <ase-project-boxing/> is equal `grey` (where
167
+ the full unified diff is suppressed and no context lines are
168
+ rendered at all), *silently* read the current content of
169
+ <file/> with the `Read` tool - reusing the content read for
170
+ the same <file/> earlier in this iteration, unless an `Edit`
171
+ was applied to it in between - and set <file-lines/> to its
172
+ lines, *stripped* of the line-number prefixes the tool adds.
173
+ Set <file-lines/> to empty if the file cannot be read.
174
+
175
+ Whenever <file-lines/> is non-empty, *re-derive* both
176
+ context parts from it, *overriding* the sub-agent supplied
177
+ values, so the rendered diff shows real context even when a
178
+ sub-agent supplied none: set <context-before/> to the *up to
179
+ two* lines of <file-lines/> directly *before* line <line/>
180
+ (empty if <line/> is `1`) and <context-after/> to the *up
181
+ to two* lines of <file-lines/> starting at line (<line/> +
182
+ <n/>), where <n/> is the number of lines in <old-text/>
183
+ (empty if that line is beyond the end of the document).
184
+ Keep the sub-agent supplied values only when <file-lines/>
185
+ is empty.
186
+
166
187
  2. Report the problem with the following <template/>:
167
188
 
168
189
  <template>
@@ -28,6 +28,7 @@
28
28
  ○ `ase-code-craft`: Craft Source Code
29
29
  ○ `ase-code-refactor`: Refactor Artifacts
30
30
  ○ `ase-code-resolve`: Resolve Problem
31
+ ○ `ase-code-edit`: Edit Source Code
31
32
  ○ `ase-sync-import`: Import Foreign Sources into Artifact Set
32
33
  ○ `ase-sync-reconcile`: Reconcile Artifact Set to Artifact Set
33
34
  ○ `ase-sync-export`: Export Artifact Set to Side-by-Side Files
@@ -167,7 +167,8 @@ Procedure
167
167
 
168
168
  Apply the generation/update directly to the target artifacts via
169
169
  the `Write`/`Edit` tools. For a `TASK` target, apply it via the
170
- `ase_task_save` tool instead.
170
+ `ase_task_save` MCP tool instead -- *NEVER* write a task plan
171
+ file via `Write`/`Edit` or by executing a shell command.
171
172
 
172
173
  6. Report the performed changes with the following <template/>, listing
173
174
  one bullet line per generated or updated file (with <file/> its
@@ -177,7 +177,9 @@ Procedure
177
177
  parts of an output artifact.
178
178
 
179
179
  Apply the update directly to the output artifacts via the
180
- `Write`/`Edit` tools.
180
+ `Write`/`Edit` tools. For a `TASK` output, apply it via the
181
+ `ase_task_save` MCP tool instead -- *NEVER* write a task plan
182
+ file via `Write`/`Edit` or by executing a shell command.
181
183
 
182
184
  For each formatted output artifact kind, strictly honor its
183
185
  format contract.
@@ -64,8 +64,8 @@ Set <args></args> (set args to empty).
64
64
 
65
65
  <expand name="task-load-content"></expand>
66
66
 
67
- Set <words-before><words/></words-before> (remember the loaded
68
- word count for the strictly-smaller check in step 3).
67
+ Set <content-before><task-content/></content-before> (remember the
68
+ loaded plan content for the strictly-shorter check in step 3).
69
69
 
70
70
  <if condition="the frontmatter of <task-content/> carries a `Created: <text/>` key">
71
71
  Set <timestamp-created><text/></timestamp-created> (extract the
@@ -124,21 +124,21 @@ Set <args></args> (set args to empty).
124
124
  example. If a shortening would change meaning, *keep the
125
125
  longer wording*.
126
126
 
127
- 2. *Persist only if smaller*: calculate the number of words <words/>
128
- of the condensed <task-content/>.
127
+ 2. *Persist only if smaller*: compare the condensed <task-content/>
128
+ against <content-before/>, without counting words.
129
129
 
130
- - <if condition="<words/> is strictly smaller than <words-before/>">
130
+ - <if condition="the condensed <task-content/> is strictly shorter than <content-before/>">
131
131
  <expand name="task-save-content" arg1="plan condensed"></expand>
132
132
  </if>
133
133
 
134
- - <if condition="<words/> is NOT strictly smaller than <words-before/>">
134
+ - <if condition="the condensed <task-content/> is NOT strictly shorter than <content-before/>">
135
135
  Do *not* save and do *not* bump the timestamp. Set
136
- <words><words-before/></words> (report the word count of the
137
- *unchanged* stored plan, not of the discarded condensed one).
136
+ <task-content><content-before/></task-content> (keep the
137
+ *unchanged* stored plan, discard the condensed one).
138
138
  Only output the following <template/>:
139
139
 
140
140
  <template>
141
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan already condensed**
141
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan already condensed**
142
142
  </template>
143
143
  </if>
144
144
 
@@ -162,7 +162,7 @@ Set <args></args> (set args to empty).
162
162
  Only output the following <template/> and then *STOP*.
163
163
 
164
164
  <template>
165
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan condensed -- done**
165
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan condensed -- done**
166
166
  </template>
167
167
 
168
168
  - If <result/> is `EDIT`:
@@ -174,7 +174,7 @@ Set <args></args> (set args to empty).
174
174
  skill once the `Skill` tool was used.
175
175
 
176
176
  <template>
177
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan condensed -- hand-off to edit**
177
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan condensed -- hand-off to edit**
178
178
  </template>
179
179
 
180
180
  - If <result/> is `IMPLEMENT`:
@@ -184,7 +184,7 @@ Set <args></args> (set args to empty).
184
184
  to *apply* the plan.
185
185
 
186
186
  <template>
187
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan condensed -- hand-off to implementation**
187
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan condensed -- hand-off to implementation**
188
188
  </template>
189
189
 
190
190
  - If <result/> is `PREFLIGHT`:
@@ -194,5 +194,5 @@ Set <args></args> (set args to empty).
194
194
  to *apply* the plan.
195
195
 
196
196
  <template>
197
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan condensed -- hand-off to pre-flight**
197
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan condensed -- hand-off to pre-flight**
198
198
  </template>
@@ -245,13 +245,14 @@ Procedure
245
245
 
246
246
  2. Call the `ase_task_save(id: "<part-id/>", text:
247
247
  "<part-content/>")` tool of the `ase` MCP server to persist
248
- the sub-task plan, and calculate the number of words
249
- <part-words/> of <part-content/>. Do not output anything
250
- related to this MCP tool call except the following
251
- <template/>:
248
+ the sub-task plan -- this MCP tool call is the *only*
249
+ permitted way to persist it, *NEVER* write the plan file
250
+ via `Write`/`Edit` or by executing a shell command. Do not
251
+ output anything related to this MCP tool call except the
252
+ following <template/>:
252
253
 
253
254
  <template>
254
- ⧉ **ASE**: ◉ task: **<part-id/>**, ✪ plan: **<part-words/>** words, ▶ status: **sub-task plan created**
255
+ ⧉ **ASE**: ◉ task: **<part-id/>**, ▶ status: **sub-task plan created**
255
256
  </template>
256
257
 
257
258
  4. *Report the overall result* with the following <template/>:
@@ -48,7 +48,17 @@ When refining the plan this way, preserve the overall structure of the
48
48
  plan and only modify what the user actually requested. Do *not* rewrite
49
49
  unrelated sections of the plan.
50
50
 
51
- Calculate the number of words <words/> of <task-content/>.
51
+ <if condition="<task-content/> contains a `## IMPLEMENTATION DRAFT`
52
+ section (from the companion skill `ase-task-preflight`) AND the
53
+ applied <instruction/> changed the plan text *outside* of that
54
+ section">
55
+ The implementation draft was created for the *previous* plan text and
56
+ hence is *stale* now. Remove the entire `## IMPLEMENTATION DRAFT`
57
+ section from <task-content/>, remove the value `preflighted` from the
58
+ `Properties:` frontmatter key (dropping the whole key if it carries no
59
+ values anymore), and set <draft-removed>true</draft-removed>.
60
+ </if>
61
+
52
62
  Set <task-content-dirty>true</task-content-dirty>.
53
63
  </define>
54
64
 
@@ -76,8 +86,7 @@ Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
76
86
  `ase` MCP server and use the `text` field of its response
77
87
  for fresh <timestamp-created/> and <timestamp-modified/>
78
88
  information. Then insert the current <ase-task-id/>,
79
- <timestamp-created/>, and <timestamp-modified/> information
80
- and calculate the number of words <words/> of <task-content/>.
89
+ <timestamp-created/>, and <timestamp-modified/> information.
81
90
  Set <task-content-dirty>true</task-content-dirty>.
82
91
  </define>
83
92
 
@@ -205,21 +214,20 @@ Set <args></args> (set args to empty).
205
214
  </else>
206
215
 
207
216
  Set <task-content-dirty>false</task-content-dirty>.
217
+ Set <draft-removed>false</draft-removed>.
208
218
 
209
219
  - If <text/> starts with `ERROR:` or `WARNING:`:
210
220
  Silently ignore the MCP error.
211
221
  Set <task-content/> to empty.
212
222
  Set <task-render/> to empty.
213
- Set <words/> to "0".
214
223
  Do not output anything.
215
224
 
216
225
  - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
217
226
  Set <task-content><text/></task-content> (set task content to text).
218
- Calculate the number of words <words/> of <task-content/>.
219
227
  Only output the following <template/>:
220
228
 
221
229
  <template>
222
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<status/>**
230
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **<status/>**
223
231
  </template>
224
232
 
225
233
  2. <if condition="<task-content/> is empty AND <instruction/> is empty">
@@ -267,7 +275,7 @@ Set <args></args> (set args to empty).
267
275
  *STOP* processing this skill:
268
276
 
269
277
  <template>
270
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan preserved**
278
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan preserved**
271
279
  </template>
272
280
 
273
281
  - If <result/> is `OVERWRITE`:
@@ -277,7 +285,7 @@ Set <args></args> (set args to empty).
277
285
  Only output the following <template/> and continue processing:
278
286
 
279
287
  <template>
280
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan overwritten**
288
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan overwritten**
281
289
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇌ instruction: **<instruction/>**, ▶ status: **instruction given**
282
290
  </template>
283
291
 
@@ -288,7 +296,7 @@ Set <args></args> (set args to empty).
288
296
  Only output the following <template/> and continue processing:
289
297
 
290
298
  <template>
291
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan refined**
299
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan refined**
292
300
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇌ instruction: **<instruction/>**, ▶ status: **instruction given**
293
301
  </template>
294
302
 
@@ -302,7 +310,7 @@ Set <args></args> (set args to empty).
302
310
  Only output the following <template/> and continue processing:
303
311
 
304
312
  <template>
305
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan refined**
313
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan refined**
306
314
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇌ instruction: **<instruction/>**, ▶ status: **instruction given**
307
315
  </template>
308
316
  </if>
@@ -321,7 +329,7 @@ Set <args></args> (set args to empty).
321
329
 
322
330
  <template>
323
331
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇌ instruction: **<instruction/>**, ▶ status: **instruction given**
324
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan generated**
332
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan generated**
325
333
  </template>
326
334
  </if>
327
335
 
@@ -349,18 +357,32 @@ Set <args></args> (set args to empty).
349
357
  persist the current plan -- <task-content/> always is the
350
358
  *authoring form* of the plan and hence is persisted *as is* --
351
359
  and then set <task-content-dirty>false</task-content-dirty>
352
- again. Finally, set <task-render/> to the `text` *output* field
360
+ again. This `ase_task_save` MCP tool call is the *only*
361
+ permitted way to persist the plan -- *NEVER* write the plan
362
+ file via `Write`/`Edit` or by executing a shell command.
363
+ Finally, set <task-render/> to the `text` *output* field
353
364
  of this `ase_task_save` tool call -- the rendering-prepared form
354
365
  of the just-persisted plan, which is for *display only* and
355
366
  *MUST NOT* be confused with the `text` *argument* passed into
356
367
  that call -- so the rendering in step 3.3 stays consistent across
357
- all loop rounds. Calculate the number of words <words/> of
358
- <task-content/>. Do not output anything related to this MCP tool
368
+ all loop rounds. Do not output anything related to this MCP tool
359
369
  call except the following <template/>:
360
370
 
361
371
  <template>
362
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan saved**
372
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan saved**
363
373
  </template>
374
+
375
+ <if condition="<draft-removed/> is equal `true`">
376
+ Directly *after* this <template/>, reset
377
+ <draft-removed>false</draft-removed> and give the corrective
378
+ hint by expanding the following (which, depending on the
379
+ configured <ase-guidance-level/>, may expand into nothing and
380
+ hence emit no output at all):
381
+
382
+ <ase-tpl-hint level="minimal">
383
+ The `IMPLEMENTATION DRAFT` section became stale through the plan change and was removed -- run `/ase-task-preflight` again to re-create the draft for the changed plan.
384
+ </ase-tpl-hint>
385
+ </if>
364
386
  </if>
365
387
 
366
388
  3. *Render plan*:
@@ -459,7 +481,7 @@ Set <args></args> (set args to empty).
459
481
  and then *STOP*. Do *not* implement the plan.
460
482
 
461
483
  <template>
462
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- done**
484
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan finalized -- done**
463
485
  </template>
464
486
 
465
487
  - If <result/> is `GRILL`:
@@ -471,7 +493,7 @@ Set <args></args> (set args to empty).
471
493
  to *grill* the finalized plan.
472
494
 
473
495
  <template>
474
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- hand-off to grilling**
496
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan finalized -- hand-off to grilling**
475
497
  </template>
476
498
 
477
499
  - If <result/> is `PREFLIGHT`:
@@ -483,7 +505,7 @@ Set <args></args> (set args to empty).
483
505
  to *apply* the finalized plan.
484
506
 
485
507
  <template>
486
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- hand-off to pre-flight**
508
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan finalized -- hand-off to pre-flight**
487
509
  </template>
488
510
 
489
511
  - If <result/> is `IMPLEMENT`:
@@ -495,7 +517,7 @@ Set <args></args> (set args to empty).
495
517
  to *apply* the finalized plan.
496
518
 
497
519
  <template>
498
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- hand-off to implementation**
520
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan finalized -- hand-off to implementation**
499
521
  </template>
500
522
 
501
523
  - If <result/> matches `OTHER: <text/>`:
@@ -517,6 +539,6 @@ Set <args></args> (set args to empty).
517
539
  and then *STOP*. Do *not* implement the plan.
518
540
 
519
541
  <template>
520
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan refinement cancelled**
542
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan refinement cancelled**
521
543
  </template>
522
544
 
@@ -19,6 +19,13 @@ through a *chat-driven loop*. The user steers each round via an
19
19
  interactive dialog that offers continued refinement, finalization, or
20
20
  hand-off to implementation or preflight.
21
21
 
22
+ When a refinement changes the plan text while an `IMPLEMENTATION
23
+ DRAFT` section (produced by `ase-task-preflight`) exists, that section
24
+ became *stale* and is *removed* -- together with the `preflighted`
25
+ value of the `Properties:` frontmatter key -- and a hint is emitted
26
+ that `ase-task-preflight` has to be run again to re-create the draft
27
+ for the changed plan.
28
+
22
29
  ## OPTIONS
23
30
 
24
31
  `--plan`|`-p` *option*:
@@ -193,7 +193,7 @@ Set <args>--int-reuse-task</args>.
193
193
  without output of any further information.
194
194
 
195
195
  <template>
196
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- done**
196
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- done**
197
197
  </template>
198
198
 
199
199
  - If <result/> is `EDIT`:
@@ -205,7 +205,7 @@ Set <args>--int-reuse-task</args>.
205
205
  skill once the `Skill` tool was used.
206
206
 
207
207
  <template>
208
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- hand-off to edit**
208
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- hand-off to edit**
209
209
  </template>
210
210
 
211
211
  - If <result/> is `PREFLIGHT`:
@@ -215,7 +215,7 @@ Set <args>--int-reuse-task</args>.
215
215
  to *apply* the plan.
216
216
 
217
217
  <template>
218
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- hand-off to pre-flight**
218
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- hand-off to pre-flight**
219
219
  </template>
220
220
 
221
221
  - If <result/> is `IMPLEMENT`:
@@ -225,5 +225,5 @@ Set <args>--int-reuse-task</args>.
225
225
  to *apply* the plan.
226
226
 
227
227
  <template>
228
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- hand-off to implementation**
228
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- hand-off to implementation**
229
229
  </template>
@@ -82,25 +82,29 @@ Procedure
82
82
  directly usable as both a directory and a branch name. Do not
83
83
  output anything.
84
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 not a 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*:
85
+ 2. Determine the *worktree directory* by calling the
86
+ `ase_worktree_path(id: "<worktree-name/>", create: true)` tool of
87
+ the `ase` MCP server and capturing its output into
88
+ <worktree-dir/>.
89
+
90
+ You *MUST* *NEVER* assemble this path yourself, as only this tool
91
+ rejects a path leading through a symbolic link, through a
92
+ non-directory, or out of the repository -- a path `git worktree
93
+ add` would otherwise silently follow and thereby write outside
94
+ the repository.
95
+
96
+ <if condition="this tool call fails">
97
+ Either the current directory is not a Git repository or the
98
+ worktree directory is unsafe, so no worktree can be created. Only
99
+ output the following <template/> and then immediately *STOP*
100
+ processing the entire current skill, leaving the working copy
101
+ *untouched*:
96
102
 
97
103
  <template>
98
- ⧉ **ASE**: ☻ skill: **ase-task-implement**, ▶ ERROR: no Git repository -- cannot create worktree
104
+ ⧉ **ASE**: ☻ skill: **ase-task-implement**, ▶ ERROR: no Git repository or unsafe worktree directory -- cannot create worktree
99
105
  </template>
100
106
  </if>
101
107
 
102
- Then set <worktree-dir><repo-root/>/.ase/worktree/<worktree-name/></worktree-dir>.
103
-
104
108
  3. Determine the *existing worktrees* and *existing branches* by
105
109
  running the corresponding commands (taken exactly as given) and
106
110
  capturing their outputs:
@@ -158,13 +162,21 @@ Procedure
158
162
  by modifying the *artifacts* with a corresponding, complete
159
163
  *change set*.
160
164
 
161
- For this, primarily follow and honor the task plan in <task-content/>.
165
+ <if condition="<task-content/> contains an `## IMPLEMENTATION DRAFT` section (from skill `ase-task-preflight`)">
166
+ Take over the implementation draft of this section *1:1* as
167
+ the change set: the draft is assumed to have been *reviewed*
168
+ by the user, so you *MUST* *NOT* create a fresh implementation
169
+ from scratch. Apply the draft *verbatim* and *adjust* only
170
+ those parts which actually *fail* -- because a hunk no longer
171
+ applies to meanwhile drifted artifacts, or because the
172
+ verification phase rejects the result. For such adjusted parts,
173
+ and for aspects the draft does not cover at all, follow the
174
+ task plan in <task-content/>.
175
+ </if>
162
176
 
163
- Secondarily, derive hints from the optionally existing
164
- `IMPLEMENTATION DRAFT` section (from skill `ase-task-preflight`)
165
- in <task-content/>. But the specification text in <task-content/> always
166
- overrules the implementation draft in the `IMPLEMENTATION DRAFT`
167
- section of <task-content/>.
177
+ <if condition="<task-content/> contains NO `## IMPLEMENTATION DRAFT` section">
178
+ Follow and honor the task plan in <task-content/>.
179
+ </if>
168
180
 
169
181
  <if condition="<worktree-dir/> is not empty">
170
182
  The change set *MUST* land *exclusively inside* the worktree
@@ -220,12 +232,15 @@ Procedure
220
232
 
221
233
  Finally call the `ase_task_save(id: "<ase-task-id/>", text:
222
234
  "<task-content/>")` tool of the `ase` MCP server to persist the
223
- updated task plan. Do not output anything in this sub-step.
235
+ updated task plan. This `ase_task_save` MCP tool call is the
236
+ *only* permitted way to persist the plan -- *NEVER* write the
237
+ plan file via `Write`/`Edit` or by executing a shell command.
238
+ Do not output anything in this sub-step.
224
239
 
225
240
  3. Only output the following <template/>:
226
241
 
227
242
  <template>
228
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan implemented**
243
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan implemented**
229
244
  </template>
230
245
 
231
246
  4. <if condition="<worktree-dir/> is not empty">
@@ -256,7 +271,7 @@ Procedure
256
271
  Only output the following <template/> and then *STOP*.
257
272
 
258
273
  <template>
259
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan implemented -- done**
274
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan implemented -- done**
260
275
  </template>
261
276
 
262
277
  - If <result/> is `DELETE`:
@@ -271,6 +286,6 @@ Procedure
271
286
  current skill once the `Skill` tool was used.
272
287
 
273
288
  <template>
274
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan implemented -- hand-off to delete task**
289
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan implemented -- hand-off to delete task**
275
290
  </template>
276
291
 
@@ -16,8 +16,10 @@
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. Afterwards the plan's
19
+ section produced by `ase-task-preflight` is taken over *1:1* as the
20
+ change set -- the draft is assumed to be user-reviewed, so no fresh
21
+ implementation is created and only parts which actually fail are
22
+ adjusted, guided by the plain plan content. Afterwards the plan's
21
23
  `Properties:` frontmatter key gains the value `implemented` (plus
22
24
  `verified`, if the verification phase actually ran and succeeded), and
23
25
  its `Status:` key becomes `COMPLETED` if the change set was applied
@@ -72,6 +72,18 @@ Procedure
72
72
  which *would* fully implement the task plan <task-content/>. Store
73
73
  this artifact change set in *unified diff* format in <unified-diff/>.
74
74
 
75
+ Create this draft with the *same rigor* as the final
76
+ implementation of the companion skill `ase-task-implement`,
77
+ because that skill later takes the draft over *1:1* -- the user
78
+ is assumed to review the draft in between. Hence *read* the
79
+ current content of *every* artifact the draft touches before
80
+ drafting its hunks, so all context lines match the artifacts
81
+ *exactly* and the diff would apply *cleanly*, and honor the
82
+ task plan and the internalized tenets just as the final
83
+ implementation would. Only the actual modification of the
84
+ artifacts and the verification phase are deferred to
85
+ `ase-task-implement`.
86
+
75
87
  2. Append this artifact change set <unified-diff/> to the end
76
88
  of the <task-content/> with the following <template/>. If a section
77
89
  named `## IMPLEMENTATION DRAFT` already exists from a
@@ -112,12 +124,14 @@ Procedure
112
124
 
113
125
  4. Finally, call the `ase_task_save(id: "<ase-task-id/>",
114
126
  text: "<task-content/>")` tool of the `ase` MCP server to save the updated
115
- task plan content. Calculate the number of words <words/> of
116
- <task-content/>. Do not output anything related to this MCP tool call
127
+ task plan content. This `ase_task_save` MCP tool call is the
128
+ *only* permitted way to persist the plan -- *NEVER* write the
129
+ plan file via `Write`/`Edit` or by executing a shell command.
130
+ Do not output anything related to this MCP tool call
117
131
  except the following <template/>:
118
132
 
119
133
  <template>
120
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated**
134
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated**
121
135
  </template>
122
136
 
123
137
  4. **Decide Next Step:**
@@ -139,7 +153,7 @@ Procedure
139
153
  Only output the following <template/> and then *STOP*.
140
154
 
141
155
  <template>
142
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- done**
156
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- done**
143
157
  </template>
144
158
 
145
159
  - If <result/> is `EDIT`:
@@ -18,7 +18,11 @@ draft for a corresponding, complete *artifact change set* in
18
18
  *unified diff* format. The draft is appended to the task plan as
19
19
  an `IMPLEMENTATION DRAFT` section (replacing any previous draft) and
20
20
  the plan's `Properties:` frontmatter key gains the value `preflighted`.
21
- No source files are modified.
21
+ No source files are modified. The draft is produced under the *same
22
+ tenets* and with the *same rigor* as a final implementation, because
23
+ `ase-task-implement` later takes it over *1:1* after user review --
24
+ only the actual artifact modification and the verification phase
25
+ are deferred.
22
26
 
23
27
  The *kind of change* stated by the plan's `Kind:` frontmatter key
24
28
  (`CRAFTING`, `REFACTORING`, or `RESOLVING`) selects which
@@ -139,7 +139,7 @@ Procedure
139
139
  Only output the following <template/> and then *STOP*.
140
140
 
141
141
  <template>
142
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan rebooted -- done**
142
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan rebooted -- done**
143
143
  </template>
144
144
 
145
145
  - If <result/> is `EDIT`:
@@ -71,11 +71,10 @@ Procedure
71
71
 
72
72
  - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
73
73
  Set <task-content><text/></task-content> (set task content to text).
74
- Calculate the number of words <words/> of <task-content/>.
75
74
  Only output the following <template/>:
76
75
 
77
76
  <template>
78
- ⧉ **ASE**: ◉ task: **<id/>**, ✪ plan: **<words/>** words, ▶ status: **plan loaded**
77
+ ⧉ **ASE**: ◉ task: **<id/>**, ▶ status: **plan loaded**
79
78
  </template>
80
79
 
81
80
  2. <if condition="<task-content/> is not empty">