@rse/ase 0.9.55 → 0.9.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dst/ase-setup.js +4 -2
  2. package/dst/ase-statusline.js +6 -8
  3. package/dst/ase-task.js +36 -11
  4. package/package.json +5 -5
  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/agents/ase-code-analyze.md +1 -1
  9. package/plugin/agents/ase-code-lint.md +4 -4
  10. package/plugin/agents/ase-meta-chat.md +1 -1
  11. package/plugin/agents/ase-meta-proximity.md +1 -1
  12. package/plugin/meta/ase-common-code.md +164 -1
  13. package/plugin/meta/ase-common-task.md +14 -13
  14. package/plugin/meta/ase-constitution.md +3 -3
  15. package/plugin/meta/ase-control.md +7 -7
  16. package/plugin/meta/ase-dialog.md +5 -4
  17. package/plugin/meta/ase-format-arch.md +7 -8
  18. package/plugin/meta/ase-format-spec.md +10 -11
  19. package/plugin/meta/ase-format-task.md +2 -2
  20. package/plugin/meta/ase-getopt.md +1 -1
  21. package/plugin/meta/ase-persona.md +3 -3
  22. package/plugin/meta/ase-skill.md +14 -24
  23. package/plugin/meta/ase-tenets.md +5 -5
  24. package/plugin/package.json +2 -2
  25. package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
  26. package/plugin/skills/ase-arch-analyze/help.md +1 -1
  27. package/plugin/skills/ase-arch-discover/SKILL.md +8 -6
  28. package/plugin/skills/ase-code-analyze/SKILL.md +1 -1
  29. package/plugin/skills/ase-code-analyze/help.md +1 -1
  30. package/plugin/skills/ase-code-craft/SKILL.md +2 -153
  31. package/plugin/skills/ase-code-craft/help.md +1 -1
  32. package/plugin/skills/ase-code-explain/SKILL.md +3 -3
  33. package/plugin/skills/ase-code-insight/SKILL.md +9 -7
  34. package/plugin/skills/ase-code-lint/SKILL.md +7 -5
  35. package/plugin/skills/ase-code-refactor/SKILL.md +4 -155
  36. package/plugin/skills/ase-code-resolve/SKILL.md +8 -159
  37. package/plugin/skills/ase-docs-distill/SKILL.md +2 -2
  38. package/plugin/skills/ase-docs-distill/help.md +1 -1
  39. package/plugin/skills/ase-docs-proofread/SKILL.md +7 -3
  40. package/plugin/skills/ase-help-intent/SKILL.md +33 -9
  41. package/plugin/skills/ase-help-skill/SKILL.md +1 -1
  42. package/plugin/skills/ase-meta-brainstorm/SKILL.md +11 -2
  43. package/plugin/skills/ase-meta-changelog/SKILL.md +12 -8
  44. package/plugin/skills/ase-meta-commit/SKILL.md +11 -1
  45. package/plugin/skills/ase-meta-compat/SKILL.md +2 -2
  46. package/plugin/skills/ase-meta-config/help.md +1 -1
  47. package/plugin/skills/ase-meta-diaboli/SKILL.md +12 -3
  48. package/plugin/skills/ase-meta-diff/SKILL.md +11 -13
  49. package/plugin/skills/ase-meta-eli5/SKILL.md +3 -3
  50. package/plugin/skills/ase-meta-eli5/help.md +1 -1
  51. package/plugin/skills/ase-meta-evaluate/SKILL.md +3 -3
  52. package/plugin/skills/ase-meta-quorum/SKILL.md +17 -17
  53. package/plugin/skills/ase-meta-quotes/SKILL.md +1 -1
  54. package/plugin/skills/ase-meta-review/SKILL.md +7 -5
  55. package/plugin/skills/ase-meta-review/help.md +2 -2
  56. package/plugin/skills/ase-meta-search/SKILL.md +18 -0
  57. package/plugin/skills/ase-meta-steelman/SKILL.md +11 -2
  58. package/plugin/skills/ase-meta-why/SKILL.md +15 -6
  59. package/plugin/skills/ase-meta-why/help.md +3 -3
  60. package/plugin/skills/ase-sync-export/SKILL.md +2 -1
  61. package/plugin/skills/ase-sync-export/help.md +1 -1
  62. package/plugin/skills/ase-sync-reconcile/SKILL.md +16 -2
  63. package/plugin/skills/ase-task-condense/SKILL.md +13 -67
  64. package/plugin/skills/ase-task-delete/SKILL.md +1 -1
  65. package/plugin/skills/ase-task-dissect/SKILL.md +5 -18
  66. package/plugin/skills/ase-task-edit/SKILL.md +49 -22
  67. package/plugin/skills/ase-task-grill/SKILL.md +31 -129
  68. package/plugin/skills/ase-task-id/SKILL.md +12 -2
  69. package/plugin/skills/ase-task-implement/SKILL.md +11 -7
  70. package/plugin/skills/ase-task-implement/help.md +1 -1
  71. package/plugin/skills/ase-task-list/SKILL.md +9 -0
  72. package/plugin/skills/ase-task-preflight/SKILL.md +13 -7
  73. package/plugin/skills/ase-task-reboot/SKILL.md +18 -61
  74. package/plugin/skills/ase-task-reboot/help.md +1 -1
  75. package/plugin/skills/ase-task-view/SKILL.md +4 -2
  76. package/dst/ase-guidance.js +0 -89
  77. package/dst/ase-persona.js +0 -87
  78. package/dst/ase-stdout.js +0 -18
package/dst/ase-setup.js CHANGED
@@ -808,9 +808,11 @@ export default class SetupCommand {
808
808
  /* default for --dev derived from ASE_SETUP_DEV environment variable */
809
809
  const envDev = process.env.ASE_SETUP_DEV ?? "";
810
810
  const devDflt = envDev !== "" && envDev !== "0" && envDev.toLowerCase() !== "false";
811
- /* default for --tool derived from ASE_TOOL environment variable */
811
+ /* default for --tool derived from ASE_TOOL environment variable
812
+ (validated lazily by "parseTool" in each action, so an invalid
813
+ value cannot break unrelated "ase" commands at startup) */
812
814
  const envTool = process.env.ASE_TOOL ?? "";
813
- const toolDflt = envTool !== "" ? this.parseTool(envTool) : "claude";
815
+ const toolDflt = envTool !== "" ? envTool : "claude";
814
816
  /* register CLI top-level command "ase setup" */
815
817
  const setupCmd = program
816
818
  .command("setup")
@@ -388,25 +388,23 @@ export default class StatuslineCommand {
388
388
  /* ==== RATE LIMITS ==== */
389
389
  S: () => {
390
390
  const pct5h = data.rate_limits?.five_hour?.used_percentage;
391
- if (pct5h !== undefined)
392
- emit(`${prefix("⏲", "session-usage")}${c.bold(`${pct5h.toFixed(1)}%`)}`);
391
+ const s = pct5h !== undefined ? `${pct5h.toFixed(1)}%` : "-";
392
+ emit(`${prefix("⏲", "5h-usage")}${c.bold(s)}`);
393
393
  },
394
394
  D: () => {
395
395
  const until5h = data.rate_limits?.five_hour?.resets_at;
396
396
  const s = formatTimeUntil(until5h);
397
- if (s !== "")
398
- emit(`${prefix("⏱", "session-resets")}${c.bold(s)}`);
397
+ emit(`${prefix("⏱", "5h-resets")}${c.bold(s !== "" ? s : "-")}`);
399
398
  },
400
399
  W: () => {
401
400
  const pctWk = data.rate_limits?.seven_day?.used_percentage;
402
- if (pctWk !== undefined)
403
- emit(`${prefix("⏲", "weekly-usage")}${c.bold(`${pctWk.toFixed(1)}%`)}`);
401
+ const s = pctWk !== undefined ? `${pctWk.toFixed(1)}%` : "-";
402
+ emit(`${prefix("⏲", "7d-usage")}${c.bold(s)}`);
404
403
  },
405
404
  Q: () => {
406
405
  const untilWk = data.rate_limits?.seven_day?.resets_at;
407
406
  const s = formatTimeUntil(untilWk);
408
- if (s !== "")
409
- emit(`${prefix("⏱", "weekly-resets")}${c.bold(s)}`);
407
+ emit(`${prefix("⏱", "7d-resets")}${c.bold(s !== "" ? s : "-")}`);
410
408
  },
411
409
  /* ==== COSTS ==== */
412
410
  H: () => {
package/dst/ase-task.js CHANGED
@@ -529,15 +529,33 @@ export class TaskMCP {
529
529
  title: "ASE task load",
530
530
  description: "Load a previously persisted task by `id`. " +
531
531
  "Returns the task as `text`, normalized into the current Markdown frontmatter shape; " +
532
- "returns an empty string if no task exists for the `id`.",
532
+ "returns an empty string if no task exists for the `id`. " +
533
+ "The `variant` argument selects the returned form of the plan: " +
534
+ "`source` (the default) is the *authoring* form and the *only* form which may be " +
535
+ "edited and passed back into `ase_task_save`; " +
536
+ "`render` is the *rendering-prepared* form, which is for *display only* and " +
537
+ "MUST NOT be persisted; " +
538
+ "`both` returns the source form enclosed in `<task-plan-source>` delimiter lines, " +
539
+ "followed by the render form enclosed in `<task-plan-render>` delimiter lines.",
533
540
  inputSchema: {
534
541
  id: z.string()
535
- .describe("task identifier (allowed characters: A-Z, a-z, 0-9, '_', '-')")
542
+ .describe("task identifier (allowed characters: A-Z, a-z, 0-9, '_', '-')"),
543
+ variant: z.enum(["source", "render", "both"]).optional()
544
+ .describe("returned form of the plan: `source` (authoring form, the default), " +
545
+ "`render` (rendering-prepared form, display only), or `both` " +
546
+ "(both forms, each enclosed in its delimiter lines)")
536
547
  }
537
548
  }, async (args) => {
538
549
  try {
539
- const raw = Task.load(this.log, args.id);
540
- const text = Markdown.prepare(raw);
550
+ const source = Task.load(this.log, args.id);
551
+ const variant = args.variant ?? "source";
552
+ let text = source;
553
+ if (source !== "" && variant === "render")
554
+ text = Markdown.prepare(source);
555
+ else if (source !== "" && variant === "both")
556
+ text =
557
+ `<task-plan-source>\n${source}\n</task-plan-source>\n\n` +
558
+ `<task-plan-render>\n${Markdown.prepare(source)}\n</task-plan-render>\n`;
541
559
  return {
542
560
  content: [{ type: "text", text }]
543
561
  };
@@ -550,21 +568,28 @@ export class TaskMCP {
550
568
  mcp.registerTool("ase_task_save", {
551
569
  title: "ASE task save",
552
570
  description: "Persist a task as `text` under `id`. " +
553
- "Overwrites any existing task for the same `id`. " +
554
- "Returns the persisted task as `text`, prepared for improved rendering.",
571
+ "The `text` MUST be the *authoring* form of the plan (as returned by the " +
572
+ "`source` variant of `ase_task_load`) and hence MUST NOT carry any rendering " +
573
+ "artifacts. Overwrites any existing task for the same `id`. " +
574
+ "Returns a status `text` by default, or, if `render` is `true`, the " +
575
+ "*rendering-prepared* form of the just-saved plan, for display purposes only.",
555
576
  inputSchema: {
556
577
  id: z.string()
557
578
  .describe("task identifier (allowed characters: A-Z, a-z, 0-9, '_', '-')"),
558
579
  text: z.string()
559
- .describe("text content of the task")
580
+ .describe("text content of the task, in its authoring form"),
581
+ render: z.boolean().optional()
582
+ .describe("if true, return the rendering-prepared form of the just-saved " +
583
+ "plan instead of a status message (default: false)")
560
584
  }
561
585
  }, async (args) => {
562
586
  try {
563
587
  Task.save(this.log, args.id, args.text);
564
- /* return the prepared content, so a caller reusing the
565
- just-saved plan instead of re-loading it still receives
566
- the rendering-prepared variant */
567
- const text = Markdown.prepare(args.text);
588
+ /* return the rendering-prepared content on demand, so a caller
589
+ displaying the just-saved plan does not have to re-load it */
590
+ const text = (args.render ?? false) ?
591
+ Markdown.prepare(args.text) :
592
+ `OK: saved task "${args.id}"`;
568
593
  return {
569
594
  content: [{ type: "text", text }]
570
595
  };
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "homepage": "https://ase.tools",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "https://github.com/rse/ase/issues" },
9
- "version": "0.9.55",
9
+ "version": "0.9.56",
10
10
  "license": "Apache-2.0",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -18,12 +18,12 @@
18
18
  "devDependencies": {
19
19
  "eslint": "9.39.4",
20
20
  "@eslint/js": "9.39.4",
21
- "@typescript-eslint/parser": "8.65.0",
22
- "@typescript-eslint/eslint-plugin": "8.65.0",
21
+ "@typescript-eslint/parser": "8.66.0",
22
+ "@typescript-eslint/eslint-plugin": "8.66.0",
23
23
  "eslint-plugin-promise": "7.3.0",
24
24
  "eslint-plugin-import": "2.32.0",
25
25
  "neostandard": "0.13.0",
26
- "globals": "17.8.0",
26
+ "globals": "17.9.0",
27
27
  "typescript": "6.0.3",
28
28
 
29
29
  "@rse/stx": "1.1.6",
@@ -42,7 +42,7 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "commander": "15.0.0",
45
- "@dotenvx/dotenvx": "2.19.1",
45
+ "@dotenvx/dotenvx": "2.19.2",
46
46
  "yaml": "2.9.0",
47
47
  "valibot": "1.4.2",
48
48
  "execa": "10.0.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.55",
3
+ "version": "0.9.56",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.55",
3
+ "version": "0.9.56",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.55",
3
+ "version": "0.9.56",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -63,7 +63,7 @@ Workflow
63
63
  - incorrect short-circuit evaluation or operator precedence
64
64
  - logical vs. bitwise operator confusion
65
65
  - negation mistakes in compound predicates
66
- - wrong comparison operator (`==` instead of `===`, `<` vs. `<=`, etc)
66
+ - wrong comparison operator (`==` instead of `===`, `<` vs. `<=`, etc.)
67
67
  - inverted condition or swapped if/else branches
68
68
  - dead or duplicated conditional branches
69
69
  - fall-through where a break or return was intended
@@ -65,10 +65,10 @@ Workflow
65
65
  identifiers, string literals and comments.
66
66
 
67
67
  Especially, for comments ensure English language only and
68
- prefer short very brief one-line descriptions.
68
+ prefer short, very brief one-line descriptions.
69
69
 
70
70
  - **A05 - COMPLEXITY**:
71
- Check for extremely long functions, and deeply nested code
71
+ Check for extremely long functions and deeply nested code
72
72
  constructs.
73
73
 
74
74
  Especially, for functions prefer fewer than 100 lines, and for
@@ -185,8 +185,8 @@ Workflow
185
185
  - **A15 - PERFORMANCE**:
186
186
  Check for bad performance and inefficiency issues.
187
187
 
188
- Especially, check for code constructs with a high (i.e., not
189
- constant/O(1), or linear/O(n) complexity) in its execution time
188
+ Especially, check for code constructs with a high complexity (i.e., not
189
+ constant/O(1), or linear/O(n)) in their execution time
190
190
  and/or memory consumption.
191
191
 
192
192
  - **A16 - SECURITY**:
@@ -56,5 +56,5 @@ tools:
56
56
  4. Now call the MCP tool `query(prompt: <query/>)` from the MCP server
57
57
  <server/> and then return its result `text` *verbatim* and *without
58
58
  any modifications* as the last message. Especially, do *NOT* add or
59
- remove any text to the MCP server response on your own and do not
59
+ remove any text to or from the MCP server response on your own and do not
60
60
  interpret the result in any way.
@@ -102,7 +102,7 @@ store those facts in the placeholder named `<arg2/>`.
102
102
  <child-4/>.
103
103
 
104
104
  <expand name="gather-facts"
105
- arg1="the CHILDREN topics (narrower topics that are specializations) of the following topic: <topic/>"
105
+ arg1="the CHILD topics (narrower topics that are specializations) of the following topic: <topic/>"
106
106
  arg2="facts-children"></expand>
107
107
 
108
108
  Ground the determination of the canonical names of the most
@@ -4,7 +4,7 @@ Code Skill Common Steps
4
4
 
5
5
  <define name="code-tenets">
6
6
 
7
- You *MUST* internalize and strictly honor the **GENERIC TENETS**, and
7
+ You *MUST* internalize and strictly honor the **GENERIC TENETS** and
8
8
  the **<arg1/> TENETS** of the **ASE Tenets** in the following creation
9
9
  and updating of code. Do not output anything.
10
10
 
@@ -32,3 +32,166 @@ Then honor the tenet sets of <task-kind/>:
32
32
  <expand name="code-tenets" arg1="<task-kind/>"></expand>
33
33
 
34
34
  </define>
35
+
36
+ <define name="code-approaches">
37
+
38
+ You *MUST* perform the following sub-steps *internally* and *without
39
+ any output* until and including the recommendation decision. Only
40
+ sub-steps 4-7 below are allowed to produce output; sub-steps 4-6 only if
41
+ <getopt-option-auto/> is equal `false` *and* <ase-project-boxing/>
42
+ is *not* equal `black`.
43
+
44
+ If <getopt-option-auto/> is equal `true` or <ase-project-boxing/> is
45
+ equal `black`, *skip* the reporting sub-steps 4-6 entirely (they
46
+ perform no output at all) to speed up processing.
47
+
48
+ 1. *Propose* a corresponding *<arg1/> approach*, optionally including
49
+ some *alternative* <arg1/> approaches. Do *not* output anything
50
+ in this sub-step.
51
+
52
+ 2. *Reflect* on and *critique* the proposed approaches by deriving,
53
+ per approach, a small set of concrete *pros* and *cons*. Do
54
+ *not* output anything in this sub-step.
55
+
56
+ 3. Based on the reflection, *decide* which approach to recommend
57
+ and annotate it with an <annotation/> of
58
+ ` ⚝ **RECOMMENDATION** ⚝`. All other approaches receive an
59
+ empty <annotation/>. Do *not* output anything in this sub-step.
60
+
61
+ 4. Indicate start of reporting by showing the following <template/>:
62
+
63
+ <template>
64
+ <ase-tpl-head title="APPROACHES"/>
65
+ </template>
66
+
67
+ 5. Now report each approach with the following <template/>,
68
+ inlining its pros/cons derived in sub-step 2, and do not output
69
+ anything else in this step:
70
+
71
+ <template>
72
+ ● **APPROACH A<n/>**<annotation/>: **<summary/>**
73
+ ○ [...]
74
+ ⊕ *PRO*: [...]
75
+ ⊖ *CON*: [...]
76
+ </template>
77
+
78
+ Hints:
79
+
80
+ - Give a short one-sentence <summary/> of the <arg1/> approach
81
+ plus *precise* and *ultra brief and concise* <arg1/>
82
+ information. Try to keep the number of bullet points
83
+ (`○ [...]`) in the range of 1-4.
84
+
85
+ 6. Indicate end of reporting by showing the following <template/>:
86
+
87
+ <template>
88
+ <ase-tpl-foot title="APPROACHES"/>
89
+ </template>
90
+
91
+ 7. <if condition="<getopt-option-auto/> is not equal `true` and <ase-project-boxing/> is not equal `black`">
92
+
93
+ In the following, you *MUST* *NOT* use your built-in
94
+ <user-dialog-tool/> tool! Instead, you *MUST* just show a
95
+ custom dialog according to the expanded `custom-dialog`
96
+ definition. You *MUST* closely follow this definition.
97
+
98
+ Let the user choose the preferred approach A<n/> by raising
99
+ a question with the following custom dialog, where per
100
+ approach A<n/>, you determine an ultra brief summary
101
+ <short-summary/> and then use the answer option `A<n/>:
102
+ ⚝ **RECOMMENDATION** ⚝ - <short-summary/>` for your
103
+ recommended approach plus zero or more answer options `A<n/>:
104
+ <short-summary/>` for all other approaches:
105
+
106
+ <expand name="custom-dialog" arg1="--no-other">
107
+ Select Approach: Select your preferred <arg2/> approach to follow?
108
+ A<n/>: <short-summary/>
109
+ [...]
110
+ </expand>
111
+
112
+ </if>
113
+ <else>
114
+
115
+ Set <n/> to the number of the <arg1/> approach A<n/> you recommend.
116
+ Output a hint with the following <template/>:
117
+
118
+ <template>
119
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **auto-chosen approach A<n/>**
120
+ </template>
121
+
122
+ </else>
123
+
124
+ </define>
125
+
126
+ <define name="code-next-dispatch">
127
+
128
+ Treat <getopt-option-next/> as a comma-separated chronological
129
+ list of pre-selected next-step tokens. *Peek* the *first* token
130
+ as <head/> (or `none` if the list is `none`/empty).
131
+ Set <args>--int-reuse-task</args>.
132
+
133
+ 1. <if condition="<head/> is equal `DONE`">
134
+ Consume the head: set <getopt-option-next/> to the remaining
135
+ tokens (joined back with `,`, or `none` if empty). `DONE`
136
+ means the freshly composed plan is finalized as-is, so do
137
+ *not* hand off to `ase-task-edit`. Only output the following
138
+ <template/> and then *STOP*. Do *not* implement the plan.
139
+
140
+ <template>
141
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- done**
142
+ </template>
143
+ </if>
144
+
145
+ 2. <elseif condition="<head/> is equal `IMPLEMENT`">
146
+ Consume the head: set <getopt-option-next/> to the remaining
147
+ tokens (joined back with `,`, or `none` if empty).
148
+ <if condition="<getopt-option-next/> is not equal `none`">
149
+ Set <args><args/> --next <getopt-option-next/></args>
150
+ </if>
151
+ Call the tool `Skill(skill: "ase:ase-task-implement", args: "<args/>")`
152
+ to *implement* the freshly composed plan, bypassing `ase-task-edit`.
153
+ </elseif>
154
+
155
+ 3. <elseif condition="<head/> is equal `PREFLIGHT`">
156
+ Consume the head: set <getopt-option-next/> to the remaining
157
+ tokens (joined back with `,`, or `none` if empty).
158
+ <if condition="<getopt-option-next/> is not equal `none`">
159
+ Set <args><args/> --next <getopt-option-next/></args>
160
+ </if>
161
+ Call the tool `Skill(skill: "ase:ase-task-preflight", args: "<args/>")`
162
+ to *preflight* the freshly composed plan, bypassing `ase-task-edit`.
163
+ </elseif>
164
+
165
+ 4. <elseif condition="<head/> is equal `GRILL`">
166
+ Consume the head: set <getopt-option-next/> to the remaining
167
+ tokens (joined back with `,`, or `none` if empty). `GRILL`
168
+ is this skill's own dispatch token, *not* part of
169
+ `ase-task-grill`'s `--next` vocabulary, so it must be
170
+ stripped here rather than forwarded. All remaining tokens are
171
+ `ase-task-grill`'s own vocabulary and are forwarded verbatim.
172
+ <if condition="<getopt-option-next/> is not equal `none`">
173
+ Set <args><args/> --next <getopt-option-next/></args>
174
+ </if>
175
+ Call the tool `Skill(skill: "ase:ase-task-grill", args: "<args/>")`
176
+ to *grill* the freshly composed plan, bypassing `ase-task-edit`.
177
+ </elseif>
178
+
179
+ 5. <else>
180
+ Hand off to `ase-task-edit`.
181
+ <if condition="<head/> is equal `EDIT`">
182
+ Consume the head: set <getopt-option-next/> to the remaining
183
+ tokens (joined back with `,`, or `none` if empty). `EDIT`
184
+ is this skill's own dispatch token, *not* part of
185
+ `ase-task-edit`'s `--next` vocabulary, so it must be
186
+ stripped here rather than forwarded.
187
+ </if>
188
+ All remaining tokens are `ase-task-edit`'s own vocabulary
189
+ and are forwarded verbatim, so `ase-task-edit` consumes its
190
+ own head itself.
191
+ <if condition="<getopt-option-next/> is not equal `none`">
192
+ Set <args><args/> --next <getopt-option-next/></args>
193
+ </if>
194
+ Then call the tool `Skill(skill: "ase:ase-task-edit", args: "<args/>")`.
195
+ </else>
196
+
197
+ </define>
@@ -62,29 +62,30 @@ Task Skill Common Steps
62
62
 
63
63
  <if condition="
64
64
  <getopt-option-int-reuse-task/> is equal `true`
65
- *and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call
65
+ *and* an `ase_task_save(id: '<ase-task-id/>', ...)` tool call
66
66
  exists earlier in the current session
67
67
  ">
68
- Set <text/> to the `text` *output* field of the most recent
68
+ Set <text/> to the `text` *argument* of the most recent
69
69
  `ase_task_save(id: '<ase-task-id/>', ...)` tool call -- this is
70
- the rendering-prepared plan content and *MUST NOT* be confused
71
- with the `text` *argument* passed into that call -- *without*
70
+ the *authoring form* of the plan and *MUST NOT* be confused
71
+ with the `text` *output* field of that call -- *without*
72
72
  calling `ase_task_load` again. Set <status>plan
73
73
  reused</status>. Do not output anything.
74
74
  </if>
75
75
  <else>
76
76
  Call the `ase_task_load(id: "<ase-task-id/>")` tool of the
77
- `ase` MCP server to load the current task plan content and
78
- set <text/> to the `text` output field of this `ase_task_load`
79
- tool call. Do not output anything related to this MCP tool
80
- call. Set <status>plan loaded</status>.
77
+ `ase` MCP server to load the current task plan content in its
78
+ *authoring form* -- the `variant` argument defaults to `source`
79
+ -- and set <text/> to the `text` output field of this
80
+ `ase_task_load` tool call. Do not output anything related to
81
+ this MCP tool call. Set <status>plan loaded</status>.
81
82
  </else>
82
83
 
83
84
  - If <text/> starts with `ERROR:` or `WARNING:`:
84
85
  Set <task-content></task-content> (set task content to empty).
85
86
  Set <words/> to "0".
86
87
 
87
- - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
88
+ - If <text/> does NOT start with `ERROR:` and NOT with `WARNING:`:
88
89
  Set <task-content><text/></task-content> (set task content to text).
89
90
  Calculate the number of words <words/> of <task-content/>.
90
91
 
@@ -101,7 +102,7 @@ Only output the following <template/>:
101
102
  Update <timestamp-modified/> with the current time in ISO-style
102
103
  format, which has to be determined by calling the
103
104
  `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the `ase`
104
- MCP server and use the `text` field of its response. If
105
+ MCP server and using the `text` field of its response. If
105
106
  <timestamp-created/> is still unset (because the plan content
106
107
  had no `Created:` frontmatter key), set
107
108
  <timestamp-created><timestamp-modified/></timestamp-created>
@@ -113,8 +114,8 @@ the number of words <words/> of <task-content/>.
113
114
 
114
115
  Call the `ase_task_save(id: "<ase-task-id/>", text:
115
116
  "<task-content/>")` tool of the `ase` MCP server to save the task
116
- plan content. Do not output anything related to this MCP call
117
- except the following <template/>:
117
+ plan content in its *authoring form*. Do not output anything
118
+ related to this MCP call except the following <template/>:
118
119
 
119
120
  <template>
120
121
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<arg1/>**
@@ -143,7 +144,7 @@ except the following <template/>:
143
144
  ⧉ **ASE**: ☻ skill: **<arg1/>**, ▶ ERROR: invalid `--next` token: **<head/>**
144
145
  </template>
145
146
 
146
- - If <getopt-option-next/> is equal to `none`:
147
+ - Else, i.e. <getopt-option-next/> was *originally* equal to `none`:
147
148
 
148
149
  In the following, you *MUST* *NOT* use your built-in
149
150
  <user-dialog-tool/> tool! Instead, you *MUST* just show a
@@ -13,7 +13,7 @@ which boosts you to an expert-level Software Engineering AI agent.
13
13
  - Do *not* use braces around single-statement blocks in "if" and "while" constructs unless the language requires them.
14
14
  - Do *not* insist on early "return" in "if" blocks, if an "else" block exists.
15
15
  - Do *not* remove any whitespace in the code formatting -- keep whitespace aligned with code base.
16
- - Do *not* produce any trailing white-spaces on any lines.
16
+ - Do *not* produce any trailing whitespace on any lines.
17
17
  - Do *not* guess missing tool call parameters or fill them with invented placeholder values.
18
18
 
19
19
  ## Commandments
@@ -24,7 +24,7 @@ which boosts you to an expert-level Software Engineering AI agent.
24
24
  - Assume your *internal knowledge of dependencies* (libraries, frameworks, tools, and their implementations)
25
25
  is *outdated*; always verify the current API, version, and usage pattern against the local sources
26
26
  or the web before writing any code against them.
27
- - Before proposing any code changes, explain *WHAT* the proposed changes do and *WHY* it is necessary.
27
+ - Before proposing any code changes, explain *WHAT* the proposed changes do and *WHY* they are necessary.
28
28
  - Use *concise* and *type-safe code* only.
29
29
  - Use *precise* and *surgical code changes* only.
30
30
  - Be very *pedantic* on code style.
@@ -36,7 +36,7 @@ which boosts you to an expert-level Software Engineering AI agent.
36
36
  - Always use *parentheses around arrow function parameters*, even for a single parameter.
37
37
  - Make a line break before the keywords "else", "catch", and "finally".
38
38
  - Try to *vertically align similar operators* on consecutive, similar lines.
39
- - Place spaces after opening and before closing angle brackets
39
+ - Place spaces after opening and before closing square brackets
40
40
  (except for array access and array types) and braces (except for regular expression ranges).
41
41
  - Use *double-quotes* (`"[...]"`) instead of single-quotes (`'[...]'`) for all strings.
42
42
  - Use K&R coding style with *opening braces* at the end of lines and *closing braces* at the beginning of lines.
@@ -6,9 +6,9 @@ Control Flow Constructs
6
6
  <define name="<define-name/>"><define-body/></define>:
7
7
 
8
8
  This specifies a *reusable definition* named <define-name/> and
9
- an <define-body/> which can contain arbitrary information with
9
+ a <define-body/> which can contain arbitrary information with
10
10
  optional `<args/>` (or alternatively, individual `<arg1/>`,
11
- `<arg2/>`, etc) and optional `<content/>` references from
11
+ `<arg2/>`, etc.) and optional `<content/>` references from
12
12
  subsequent <expand/> calls.
13
13
  This construct is expanded into nothing.
14
14
  Do not output anything.
@@ -20,7 +20,7 @@ Control Flow Constructs
20
20
  construct is expanded to the <define-body/> of <define/> with
21
21
  `<args/>` substituted with `<expand-arg1/> <expand-arg2/> [...]`,
22
22
  `<arg1/>` substituted with <expand-arg1/>, `<arg2/>` substituted
23
- with <expand-arg2/>, etc, and `<content/>` substituted with
23
+ with <expand-arg2/>, etc., and `<content/>` substituted with
24
24
  <expand-content/>. Do not output anything else.
25
25
 
26
26
  - *IMPORTANT*: You *MUST* honor the following control flow construct:
@@ -47,7 +47,7 @@ Control Flow Constructs
47
47
  <if condition="<if-condition/>"><if-body/></if>:
48
48
 
49
49
  This specifies a simple condition which is expanded to <if-body/>
50
- if <if-condition/> is met, or to empty string if <if-condition/> is
50
+ if <if-condition/> is met, or to the empty string if <if-condition/> is
51
51
  *not* met. It can be optionally followed by one or more <elseif/>
52
52
  constructs and/or one final <else/> construct. Do not output anything else.
53
53
 
@@ -112,11 +112,11 @@ Control Flow Constructs
112
112
  anything else.
113
113
 
114
114
  - *IMPORTANT*: You *MUST* honor the following control flow construct:
115
- <agent-consolidation [group=<agent-group/>]/>
115
+ <agent-consolidation [group=<agent-group/>]/>:
116
116
 
117
117
  This specifies the merging of all the Git WorkTrees created by the
118
- <agent/> calls with either are identified with the unique group
119
- <agent-group/> or all <agent/> calls in the last <parallel/> section
118
+ <agent/> calls which either are identified with the unique group
119
+ <agent-group/> or occur in the last <parallel/> section
120
120
  of the context. After merging a single Git WorkTree, remove the Git
121
121
  WorkTree.
122
122
 
@@ -63,7 +63,7 @@ following procedure:
63
63
 
64
64
  <text>
65
65
  <text/>
66
- <ase-tpl-boxline><label-key/> ▶ <label-text/><label-pad/> <description/></ase-tpl-boxline>
66
+ <label-key/> ▶ <label-text/><label-pad/> <description/>
67
67
  </text>
68
68
 
69
69
  <if condition="<keys/> is empty">
@@ -82,7 +82,7 @@ following procedure:
82
82
  </else>
83
83
 
84
84
  <if condition="<opts/> contains `--other` and does *not* contain `--no-other`">
85
- Set <hint>Please choose *one* option by typing <keys/>, or other free-text instruction.</hint>.
85
+ Set <hint>Please choose *one* option by typing <keys/>, or any other free-text instruction.</hint>.
86
86
  </if>
87
87
  <else>
88
88
  Set <hint>Please choose *one* option by typing <keys/>.</hint>.
@@ -93,7 +93,7 @@ following procedure:
93
93
  <text>
94
94
  <ase-tpl-boxed title="DIALOG" subtitle="<question-label/>">
95
95
 
96
- <ase-tpl-boxline>**<question-description/>**</ase-tpl-boxline>
96
+ **<question-description/>**
97
97
 
98
98
  <text/>
99
99
 
@@ -125,7 +125,8 @@ following procedure:
125
125
  otherwise indicates that the user doesn't want to proceed,
126
126
  or the user declined to answer the question, or that
127
127
  the dialog was cancelled, rejected or skipped, set
128
- <result>CANCEL</result>.
128
+ <result>CANCEL</result> and *SKIP* all remaining steps
129
+ 2.3.3 - 2.3.4 of this dispatch.
129
130
 
130
131
  3. Otherwise, determine the selected <label/>
131
132
  by mapping the <result/> (usually containing one of the