@rse/ase 0.9.10 → 0.9.12

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 (41) hide show
  1. package/dst/ase-compat.js +68 -0
  2. package/dst/ase-hook.js +158 -67
  3. package/dst/ase-service.js +2 -0
  4. package/dst/ase-setup.js +52 -23
  5. package/dst/ase-statusline.js +7 -3
  6. package/dst/ase.js +2 -0
  7. package/package.json +2 -1
  8. package/plugin/.claude-plugin/plugin.json +1 -1
  9. package/plugin/.codex-plugin/mcp.json +8 -0
  10. package/plugin/.codex-plugin/plugin.json +17 -0
  11. package/plugin/.github/plugin/plugin.json +1 -1
  12. package/plugin/hooks/hooks-codex.json +67 -0
  13. package/plugin/meta/ase-dialog.md +20 -0
  14. package/plugin/package.json +1 -1
  15. package/plugin/skills/ase-arch-analyze/SKILL.md +6 -1
  16. package/plugin/skills/ase-arch-discover/SKILL.md +2 -2
  17. package/plugin/skills/ase-code-analyze/SKILL.md +12 -5
  18. package/plugin/skills/ase-code-craft/SKILL.md +6 -3
  19. package/plugin/skills/ase-code-explain/SKILL.md +6 -1
  20. package/plugin/skills/ase-code-insight/SKILL.md +6 -1
  21. package/plugin/skills/ase-code-lint/SKILL.md +9 -3
  22. package/plugin/skills/ase-code-refactor/SKILL.md +6 -3
  23. package/plugin/skills/ase-code-resolve/SKILL.md +13 -9
  24. package/plugin/skills/ase-docs-proofread/SKILL.md +9 -3
  25. package/plugin/skills/ase-meta-brainstorm/SKILL.md +3 -4
  26. package/plugin/skills/ase-meta-changelog/SKILL.md +16 -5
  27. package/plugin/skills/ase-meta-chat/SKILL.md +6 -1
  28. package/plugin/skills/ase-meta-commit/SKILL.md +5 -0
  29. package/plugin/skills/ase-meta-compat/SKILL.md +288 -0
  30. package/plugin/skills/ase-meta-compat/help.md +67 -0
  31. package/plugin/skills/ase-meta-diaboli/SKILL.md +5 -1
  32. package/plugin/skills/ase-meta-diff/SKILL.md +1 -1
  33. package/plugin/skills/ase-meta-evaluate/SKILL.md +20 -12
  34. package/plugin/skills/ase-meta-persona/SKILL.md +6 -1
  35. package/plugin/skills/ase-meta-quorum/SKILL.md +15 -3
  36. package/plugin/skills/ase-meta-steelman/SKILL.md +5 -1
  37. package/plugin/skills/ase-task-delete/SKILL.md +6 -1
  38. package/plugin/skills/ase-task-grill/SKILL.md +30 -9
  39. package/plugin/skills/ase-task-id/SKILL.md +10 -3
  40. package/plugin/skills/ase-task-reboot/SKILL.md +2 -2
  41. package/plugin/skills/ase-task-rename/SKILL.md +15 -1
@@ -184,8 +184,8 @@ export default class StatuslineCommand {
184
184
  }
185
185
  /* parse and validate the --tool option */
186
186
  parseTool(value) {
187
- if (value !== "claude" && value !== "copilot")
188
- throw new InvalidArgumentError(`invalid --tool value: "${value}" (expected "claude" or "copilot")`);
187
+ if (value !== "claude" && value !== "copilot" && value !== "codex")
188
+ throw new InvalidArgumentError(`invalid --tool value: "${value}" (expected "claude", "copilot", or "codex")`);
189
189
  return value;
190
190
  }
191
191
  /* register commands */
@@ -196,7 +196,7 @@ export default class StatuslineCommand {
196
196
  program
197
197
  .command("statusline")
198
198
  .description("Render Claude Code or GitHub Copilot CLI statusline from stdin JSON")
199
- .option("-t, --tool <tool>", "target tool (\"claude\" or \"copilot\")", toolDflt)
199
+ .option("-t, --tool <tool>", "target tool (\"claude\" or \"copilot\"; \"codex\" is unsupported)", toolDflt)
200
200
  .option("-w, --width <n>", "force terminal width to <n> characters (0 = auto-detect via /dev/tty)", parseInteger("--width"), 0)
201
201
  .option("-m, --margin <n>", "reduce maximum used terminal width by <n> characters on each side", parseInteger("--margin"), 2)
202
202
  .option("--no-icons", "disable icons in placeholder rendering")
@@ -208,6 +208,10 @@ export default class StatuslineCommand {
208
208
  .action(async (lines, opts) => {
209
209
  /* validate target tool */
210
210
  const tool = this.parseTool(opts.tool);
211
+ /* OpenAI Codex CLI has no scriptable custom statusline
212
+ mechanism, so reject the request explicitly */
213
+ if (tool === "codex")
214
+ throw new Error("OpenAI Codex CLI does not support a custom statusline");
211
215
  /* read all of stdin */
212
216
  const input = await readStdin();
213
217
  /* parse JSON data */
package/dst/ase.js CHANGED
@@ -15,6 +15,7 @@ import SetupCommand from "./ase-setup.js";
15
15
  import StatuslineCommand from "./ase-statusline.js";
16
16
  import TaskCommand from "./ase-task.js";
17
17
  import ArtifactCommand from "./ase-artifact.js";
18
+ import CompatCommand from "./ase-compat.js";
18
19
  import pkg from "../package.json" with { type: "json" };
19
20
  /* globally initialize logger */
20
21
  const log = new Log("ase", "warning", "-");
@@ -51,6 +52,7 @@ const main = async () => {
51
52
  new StatuslineCommand(log).register(program);
52
53
  new TaskCommand(log).register(program);
53
54
  new ArtifactCommand(log).register(program);
55
+ new CompatCommand().register(program);
54
56
  new DiagramCommand(log).register(program);
55
57
  /* parse program arguments */
56
58
  await program.parseAsync(process.argv);
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "homepage": "http://github.com/rse/ase",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.10",
9
+ "version": "0.9.12",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -58,6 +58,7 @@
58
58
  "which": "7.0.0",
59
59
  "update-notifier": "7.3.1",
60
60
  "shell-quote": "1.8.4",
61
+ "get-stdin": "10.0.0",
61
62
  "proper-lockfile": "4.1.2",
62
63
  "write-file-atomic": "8.0.0",
63
64
  "pacote": "21.5.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.10",
3
+ "version": "0.9.12",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "ase": {
4
+ "command": "ase",
5
+ "args": [ "mcp" ]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "ase",
3
+ "version": "0.9.12",
4
+ "description": "Agentic Software Engineering (ASE)",
5
+ "keywords": [ "agentic", "software", "engineering" ],
6
+ "homepage": "https://ase.tools",
7
+ "repository": "https://github.com/rse/ase",
8
+ "license": "GPL-3.0",
9
+ "author": {
10
+ "name": "Dr. Ralf S. Engelschall",
11
+ "email": "rse@engelschall.com",
12
+ "url": "https://engelschall.com"
13
+ },
14
+ "skills": "./skills/",
15
+ "hooks": "./hooks/hooks-codex.json",
16
+ "mcpServers": "./.codex-plugin/mcp.json"
17
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.10",
3
+ "version": "0.9.12",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -0,0 +1,67 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "type": "command",
8
+ "command": "ase hook session-start --tool codex",
9
+ "statusMessage": "Loading ASE..."
10
+ }
11
+ ]
12
+ }
13
+ ],
14
+ "SessionEnd": [
15
+ {
16
+ "hooks": [
17
+ {
18
+ "type": "command",
19
+ "command": "ase hook session-end --tool codex",
20
+ "statusMessage": "Cleaning up ASE..."
21
+ }
22
+ ]
23
+ }
24
+ ],
25
+ "PreToolUse": [
26
+ {
27
+ "hooks": [
28
+ {
29
+ "type": "command",
30
+ "command": "ase hook pre-tool-use --tool codex"
31
+ }
32
+ ]
33
+ }
34
+ ],
35
+ "PermissionRequest": [
36
+ {
37
+ "hooks": [
38
+ {
39
+ "type": "command",
40
+ "command": "ase hook permission-request --tool codex",
41
+ "statusMessage": "Approve ASE..."
42
+ }
43
+ ]
44
+ }
45
+ ],
46
+ "UserPromptSubmit": [
47
+ {
48
+ "hooks": [
49
+ {
50
+ "type": "command",
51
+ "command": "ase hook user-prompt-submit --tool codex"
52
+ }
53
+ ]
54
+ }
55
+ ],
56
+ "Stop": [
57
+ {
58
+ "hooks": [
59
+ {
60
+ "type": "command",
61
+ "command": "ase hook stop --tool codex"
62
+ }
63
+ ]
64
+ }
65
+ ]
66
+ }
67
+ }
@@ -9,6 +9,9 @@ User Dialog
9
9
  <if condition="<ase-agent-tool/> is 'copilot'">
10
10
  <user-dialog-tool>ask_user</user-dialog-tool>
11
11
  </if>
12
+ <if condition="<ase-agent-tool/> is 'codex'">
13
+ <user-dialog-tool>none</user-dialog-tool>
14
+ </if>
12
15
 
13
16
  <define name="user-dialog">
14
17
 
@@ -138,6 +141,23 @@ Let the *user interactively choose* an answer.
138
141
 
139
142
  </if>
140
143
 
144
+ - <if condition="<ase-agent-tool/> is 'codex'">
145
+
146
+ OpenAI Codex CLI has *no* interactive user-dialog tool, so you
147
+ *MUST* *NOT* call any tool here. Instead, render the question and
148
+ answers as a custom Markdown dialog and let the user reply with a
149
+ free-text choice -- exactly as defined by the following expansion,
150
+ passing <spec/> as its question specification, and set <result/> to
151
+ the result of that custom dialog:
152
+
153
+ <expand name="custom-dialog" arg1="--other">
154
+ <spec/>
155
+ </expand>
156
+
157
+ Do not output anything in this step!
158
+
159
+ </if>
160
+
141
161
  </define>
142
162
 
143
163
  <define name="custom-dialog">
@@ -6,7 +6,7 @@
6
6
  "homepage": "http://github.com/rse/ase",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.10",
9
+ "version": "0.9.12",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -101,14 +101,19 @@ allowed-tools:
101
101
 
102
102
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
103
103
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
104
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
104
105
 
105
106
  <skill name="ase-arch-analyze">
106
107
  Review Software Architecture
107
108
  </skill>
108
109
 
110
+ <expand name="getopt" arg1="ase-arch-analyze">
111
+ $ARGUMENTS
112
+ </expand>
113
+
109
114
  <objective>
110
115
  With the mindset of an *expert-level software architect*,
111
- *review* the *software architecture* of $ARGUMENTS, and its directly
116
+ *review* the *software architecture* of <getopt-arguments/>, and its directly
112
117
  related source code, for *potential problems* across component
113
118
  boundaries, structural organization, architecture principles,
114
119
  interface quality, quality attributes, and architecture governance.
@@ -52,8 +52,8 @@ for the technology stack to *provide* the *needed functionality*
52
52
  Functionality: Which functionality should the components provide?
53
53
  <answer-1/>: (grounded candidate functionality 1)
54
54
  <answer-2/>: (grounded candidate functionality 2)
55
- <answer-3/>: (grounded candidate functionality 2)
56
- <answer-4/>: (grounded candidate functionality 3)
55
+ <answer-3/>: (grounded candidate functionality 3)
56
+ <answer-4/>: (grounded candidate functionality 4)
57
57
  </expand>
58
58
 
59
59
  Then use the <result/> and its corresponding grounded candidate
@@ -40,7 +40,8 @@ problems in *performance* and *efficiency*, or problems in *security*.
40
40
 
41
41
  <if condition="<getopt-option-performance/> is equal `true` and <getopt-option-security/> is equal `true`">
42
42
 
43
- Only output the following <template/> and then *STOP* immediately:
43
+ Only output the following <template/> and then *STOP* the entire flow
44
+ (do not perform any further steps):
44
45
 
45
46
  <template>
46
47
  ⧉ **ASE**: ✪ skill: **ase-code-analyze**, ▶ ERROR: options `--performance` and `--security` are mutually exclusive
@@ -146,10 +147,12 @@ problems in *performance* and *efficiency*, or problems in *security*.
146
147
  than or equal to `rank(<getopt-option-severity/>)`; *silently drop*
147
148
  all other problems (they are neither reported nor persisted). With
148
149
  the default floor `LOW`, all problems are kept. `ACCEPTED` problems
149
- are *never* dropped. Then renumber the surviving problems
150
- contiguously as `P<n/>` with <n/> = 1, 2, ... in the original
151
- ordering. If *all* problems are dropped, skip the per-problem report
152
- but still emit the final hint <template/> below.
150
+ are *never* dropped.
151
+
152
+ Then renumber the surviving problems contiguously as `P<n/>` with
153
+ <n/> = 1, 2, ... in the original ordering. If *all* problems are
154
+ dropped, skip the per-problem report but still emit the final hint
155
+ <template/> below.
153
156
 
154
157
  In this STEP 3, for *EVERY* surviving problem, immediately report
155
158
  it with the following output <template/>, based on concise bullet
@@ -209,6 +212,10 @@ problems in *performance* and *efficiency*, or problems in *security*.
209
212
  justified trade-off that should remain on record but is never
210
213
  dropped by the severity floor (see STEP 3).
211
214
 
215
+ - For <title/> ultra-compress the <description/> to a concise,
216
+ short, single sentence. Keep one inline reference to the code
217
+ position which is most relevant to the problem.
218
+
212
219
  - <if condition="<getopt-option-performance/> is equal `true`">
213
220
  In <evidence/>, ground the finding by citing either the inferred
214
221
  *Big-O* time/space complexity (e.g. `O(n²)` reducible to `O(n)`)
@@ -249,7 +249,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
249
249
  a question with the following custom dialog, where per
250
250
  approach A<n/>, you determine an ultra brief summary
251
251
  <short-summary/> and then use the answer option `A<n/>:
252
- ⚝ **RECOMMENDATION** ⚝: <short-summary/>` for your
252
+ ⚝ **RECOMMENDATION** - <short-summary/>` for your
253
253
  recommended approach plus zero or more answer options `A<n/>:
254
254
  <short-summary/>` for all other approaches:
255
255
 
@@ -343,11 +343,14 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
343
343
  Hand off to `ase-task-edit`.
344
344
  <if condition="<head/> is equal `EDIT`">
345
345
  Consume the head: set <getopt-option-next/> to the remaining
346
- tokens (joined back with `,`, or `none` if empty).
346
+ tokens (joined back with `,`, or `none` if empty). `EDIT`
347
+ is this skill's own dispatch token, *not* part of
348
+ `ase-task-edit`'s `--next` vocabulary, so it must be
349
+ stripped here rather than forwarded.
347
350
  </if>
348
351
  All remaining tokens are `ase-task-edit`'s own vocabulary
349
352
  and are forwarded verbatim, so `ase-task-edit` consumes its
350
- head itself.
353
+ own head itself.
351
354
  <if condition="<getopt-option-next/> is not equal `none`">
352
355
  Set <args><args/> --next <getopt-option-next/></args>
353
356
  </if>
@@ -14,13 +14,18 @@ allowed-tools:
14
14
 
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
16
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
17
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
17
18
 
18
19
  <skill name="ase-code-explain">
19
20
  Explain Source Code
20
21
  </skill>
21
22
 
23
+ <expand name="getopt" arg1="ase-code-explain">
24
+ $ARGUMENTS
25
+ </expand>
26
+
22
27
  <objective>
23
- *Analyze* the source code of $ARGUMENTS, and its directly related source
28
+ *Analyze* the source code of <getopt-arguments/>, and its directly related source
24
29
  code and *explain* it in a *brief*, *standardized*, and *concise* way.
25
30
  </objective>
26
31
 
@@ -18,13 +18,18 @@ allowed-tools:
18
18
 
19
19
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
20
20
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
21
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
21
22
 
22
23
  <skill name="ase-code-insight">
23
24
  Project Insight
24
25
  </skill>
25
26
 
27
+ <expand name="getopt" arg1="ase-code-insight">
28
+ $ARGUMENTS
29
+ </expand>
30
+
26
31
  <objective>
27
- Give *insights* into the project through the source code of $ARGUMENTS.
32
+ Give *insights* into the project through the source code of <getopt-arguments/>.
28
33
  </objective>
29
34
 
30
35
  <flow>
@@ -248,9 +248,15 @@ related to a set of code quality aspects.
248
248
  - <if condition="<result/> starts with 'OTHER'">
249
249
  Generate a *new* proposal for the *same* <item/>
250
250
  (incorporating the user's free-text hint from <result/> if
251
- provided via the "OTHER" prefix) and loop back to substep 2
252
- of this iteration. There is *no* cap on refinement rounds -
253
- keep refining until the user picks `ACCEPT` or `REJECT`.
251
+ provided via the "OTHER" prefix). *Reassign* <description/>
252
+ and <change-set/> to reflect this refined proposal (each
253
+ change-hunk's `old_text` stays anchored to the existing
254
+ text at its `file`:`line`; `new_text` carries the
255
+ refinement) so that the substep 2/3 rebuild renders the new
256
+ <diff/> and any `Edit` applies the new proposal rather than
257
+ the original. Then loop back to substep 2 of this iteration.
258
+ There is *no* cap on refinement rounds - keep refining until
259
+ the user picks `ACCEPT` or `REJECT`.
254
260
  </if>
255
261
 
256
262
  - <if condition="
@@ -238,7 +238,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
238
238
  a question with the following custom dialog, where per
239
239
  approach A<n/>, you determine an ultra brief summary
240
240
  <short-summary/> and then use the answer option `A<n/>:
241
- ⚝ **RECOMMENDATION** ⚝: <short-summary/>` for your
241
+ ⚝ **RECOMMENDATION** - <short-summary/>` for your
242
242
  recommended approach plus zero or more answer options `A<n/>:
243
243
  <short-summary/>` for all other approaches:
244
244
 
@@ -332,11 +332,14 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
332
332
  Hand off to `ase-task-edit`.
333
333
  <if condition="<head/> is equal `EDIT`">
334
334
  Consume the head: set <getopt-option-next/> to the remaining
335
- tokens (joined back with `,`, or `none` if empty).
335
+ tokens (joined back with `,`, or `none` if empty). `EDIT`
336
+ is this skill's own dispatch token, *not* part of
337
+ `ase-task-edit`'s `--next` vocabulary, so it must be
338
+ stripped here rather than forwarded.
336
339
  </if>
337
340
  All remaining tokens are `ase-task-edit`'s own vocabulary
338
341
  and are forwarded verbatim, so `ase-task-edit` consumes its
339
- head itself.
342
+ own head itself.
340
343
  <if condition="<getopt-option-next/> is not equal `none`">
341
344
  Set <args><args/> --next <getopt-option-next/></args>
342
345
  </if>
@@ -60,14 +60,15 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
60
60
  1. If <problem/> matches the regexp `^[PT]\d+$` (i.e. a bare issue
61
61
  identifier like `P1`, `P2`, `T1`, `T2`, ...),
62
62
  set <problem-id><problem/></problem-id> and
63
- <ase-task-id><problem/></ase-task-id>, call the `ase_task_id(id:
64
- "<ase-task-id/>", session: "<ase-session-id/>")` tool from the
65
- `ase` MCP server to implicitly switch the task, and then
66
- call the `ase_kv_get(key: "ase-issue-<problem-id/>")` tool of
63
+ <ase-task-id><problem/></ase-task-id>, then call the
64
+ `ase_kv_get(key: "ase-issue-<problem-id/>")` tool of
67
65
  the `ase` MCP server to retrieve the previously persisted
68
66
  problem description. If the returned `text` is non-empty, set
69
- <problem><text/></problem>, otherwise complain to the user that
70
- no analyzer result exists for <problem-id/> and stop processing.
67
+ <problem><text/></problem> and call the `ase_task_id(id:
68
+ "<ase-task-id/>", session: "<ase-session-id/>")` tool from the
69
+ `ase` MCP server to implicitly switch the task, otherwise
70
+ complain to the user that no analyzer result exists for
71
+ <problem-id/> and stop processing.
71
72
 
72
73
  2. <if condition="
73
74
  <problem/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`
@@ -288,7 +289,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
288
289
  a question with the following custom dialog, where per
289
290
  approach A<n/>, you determine an ultra brief summary
290
291
  <short-summary/> and then use the answer option `A<n/>:
291
- ⚝ **RECOMMENDATION** ⚝: <short-summary/>` for your
292
+ ⚝ **RECOMMENDATION** - <short-summary/>` for your
292
293
  recommended approach plus zero or more answer options `A<n/>:
293
294
  <short-summary/>` for all other approaches:
294
295
 
@@ -389,11 +390,14 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
389
390
  Hand off to `ase-task-edit`.
390
391
  <if condition="<head/> is equal `EDIT`">
391
392
  Consume the head: set <getopt-option-next/> to the remaining
392
- tokens (joined back with `,`, or `none` if empty).
393
+ tokens (joined back with `,`, or `none` if empty). `EDIT`
394
+ is this skill's own dispatch token, *not* part of
395
+ `ase-task-edit`'s `--next` vocabulary, so it must be
396
+ stripped here rather than forwarded.
393
397
  </if>
394
398
  All remaining tokens are `ase-task-edit`'s own vocabulary
395
399
  and are forwarded verbatim, so `ase-task-edit` consumes its
396
- head itself.
400
+ own head itself.
397
401
  <if condition="<getopt-option-next/> is not equal `none`">
398
402
  Set <args><args/> --next <getopt-option-next/></args>
399
403
  </if>
@@ -188,9 +188,15 @@ Analyze documents for spelling, punctuation, or grammar errors
188
188
 
189
189
  Generate a *new* proposal for the *same* <item/>,
190
190
  incorporating the user's free-text hint from <result/>
191
- after the "OTHER:" prefix, and *go back* to substep 2 of
192
- this `for`-iteration. There is *no* cap on refinement rounds -
193
- keep refining until the user picks `ACCEPT` or `REJECT`.
191
+ after the "OTHER:" prefix. *Reassign* <description/>,
192
+ <old-text/>, and <new-text/> to reflect this refined
193
+ proposal (<old-text/> stays anchored to the existing text
194
+ at <file/>:<line/>; <new-text/> and <description/> carry the
195
+ refinement) so the subsequent rendering and any `Edit` use
196
+ the new proposal rather than the original. Then *go back* to
197
+ substep 2 of this `for`-iteration. There is *no* cap on
198
+ refinement rounds - keep refining until the user picks
199
+ `ACCEPT` or `REJECT`.
194
200
 
195
201
  </if>
196
202
 
@@ -129,10 +129,9 @@ Honor the following tenets throughout the brainstorming:
129
129
 
130
130
  <expand name="custom-dialog" arg1="--other">
131
131
  <facet-M/>: <question-M/>
132
- <answer-M-1/>: (first grounded candidate answer)
133
- <answer-M-2/>: (second grounded candidate answer)
134
- <answer-M-3/>: (third grounded candidate answer)
135
- <answer-M-4/>: (fourth grounded candidate answer)
132
+ <answer-M-1/>: (grounded candidate answer 1)
133
+ <answer-M-2/>: (grounded candidate answer 2)
134
+ [...]
136
135
  </expand>
137
136
 
138
137
  4. Dispatch on the dialog <result/>:
@@ -16,11 +16,16 @@ allowed-tools:
16
16
 
17
17
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
18
18
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
19
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
19
20
 
20
21
  <skill name="ase-meta-changelog">
21
22
  Update ChangeLog Entries
22
23
  </skill>
23
24
 
25
+ <expand name="getopt" arg1="ase-meta-changelog">
26
+ $ARGUMENTS
27
+ </expand>
28
+
24
29
  <objective>
25
30
  Help to complete, consolidate and sort *ChangeLog* entries of the most
26
31
  recent *ChangeLog* section, based on underlying *Git* commits and staged
@@ -81,11 +86,17 @@ Processing
81
86
  the Git *commits* plus the currently already staged changes in the Git
82
87
  *index*, but *ignore* the Git *stash* and still unstaged changes.
83
88
 
84
- For finding the corresponding Git *commits*, use the `N.M.K` from the
85
- *second* level-2 header in the *ChangeLog* file as the corresponding
86
- Git tag and then check all Git commits between `HEAD` and this tag
87
- with the command `git log N.M.K..HEAD --numstat --pretty=format:'%h:
88
- %s'`.
89
+ For finding the corresponding Git *commits*, first determine the
90
+ correct baseline Git tag. Take the `N.M.K` from the *first* (most
91
+ recent) level-2 header in the *ChangeLog* file and check whether a
92
+ corresponding Git tag already exists with the command `git tag --list
93
+ N.M.K`. If this command produces *no* output, the first section is
94
+ still in-progress/untagged, so use the `N.M.K` from the *second*
95
+ level-2 header as the baseline tag instead. If this command *does*
96
+ produce output, the first section is already released/tagged, so use
97
+ the `N.M.K` from the *first* level-2 header as the baseline tag. Then
98
+ check all Git commits between `HEAD` and this baseline tag with the
99
+ command `git log N.M.K..HEAD --numstat --pretty=format:'%h: %s'`.
89
100
 
90
101
  For finding the corresponding staged Git *changes* in the Git
91
102
  *index*, use the command `git diff --cached --numstat`, but silently
@@ -14,13 +14,18 @@ allowed-tools:
14
14
 
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
16
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
17
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
17
18
 
18
19
  <skill name="ase-meta-chat">
19
20
  Query Foreign LLM for Chat
20
21
  </skill>
21
22
 
23
+ <expand name="getopt" arg1="ase-meta-chat">
24
+ $ARGUMENTS
25
+ </expand>
26
+
22
27
  <objective>
23
- Query foreign LLM for: <query>$ARGUMENTS</query>
28
+ Query foreign LLM for: <query><getopt-arguments/></query>
24
29
  </objective>
25
30
 
26
31
  1. You *MUST* *NOT* output anything in this step.
@@ -12,11 +12,16 @@ allowed-tools:
12
12
 
13
13
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
15
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
15
16
 
16
17
  <skill name="ase-meta-commit">
17
18
  Git Commit
18
19
  </skill>
19
20
 
21
+ <expand name="getopt" arg1="ase-meta-commit">
22
+ $ARGUMENTS
23
+ </expand>
24
+
20
25
  <objective>
21
26
  Help to *craft* a *concise commit message* for the
22
27
  currently staged Git changes.