@rse/ase 0.9.11 → 0.9.13

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 (44) hide show
  1. package/dst/ase-compat.js +68 -0
  2. package/dst/ase-diagram.js +5 -2
  3. package/dst/ase-getopt.js +2 -1
  4. package/dst/ase-hook.js +158 -67
  5. package/dst/ase-mcp.js +2 -0
  6. package/dst/ase-persona.js +4 -1
  7. package/dst/ase-service.js +2 -0
  8. package/dst/ase-setup.js +52 -23
  9. package/dst/ase-skills.js +13 -3
  10. package/dst/ase-statusline.js +9 -5
  11. package/dst/ase.js +3 -1
  12. package/package.json +2 -1
  13. package/plugin/.claude-plugin/plugin.json +1 -1
  14. package/plugin/.codex-plugin/mcp.json +8 -0
  15. package/plugin/.codex-plugin/plugin.json +17 -0
  16. package/plugin/.github/plugin/plugin.json +1 -1
  17. package/plugin/hooks/hooks-codex.json +67 -0
  18. package/plugin/meta/ase-dialog.md +21 -1
  19. package/plugin/meta/ase-format-arch.md +26 -9
  20. package/plugin/meta/ase-format-meta.md +7 -3
  21. package/plugin/meta/ase-format-spec.md +11 -6
  22. package/plugin/meta/ase-getopt.md +6 -2
  23. package/plugin/meta/ase-skill.md +43 -19
  24. package/plugin/package.json +1 -1
  25. package/plugin/skills/ase-arch-analyze/SKILL.md +17 -10
  26. package/plugin/skills/ase-code-craft/SKILL.md +17 -5
  27. package/plugin/skills/ase-code-explain/SKILL.md +0 -1
  28. package/plugin/skills/ase-code-insight/SKILL.md +1 -1
  29. package/plugin/skills/ase-code-lint/SKILL.md +13 -14
  30. package/plugin/skills/ase-code-refactor/SKILL.md +17 -5
  31. package/plugin/skills/ase-code-resolve/SKILL.md +18 -5
  32. package/plugin/skills/ase-docs-proofread/SKILL.md +11 -12
  33. package/plugin/skills/ase-meta-compat/SKILL.md +278 -0
  34. package/plugin/skills/ase-meta-compat/help.md +67 -0
  35. package/plugin/skills/ase-meta-diff/SKILL.md +3 -3
  36. package/plugin/skills/ase-meta-evaluate/SKILL.md +20 -18
  37. package/plugin/skills/ase-meta-quorum/SKILL.md +3 -3
  38. package/plugin/skills/ase-task-condense/SKILL.md +6 -0
  39. package/plugin/skills/ase-task-edit/SKILL.md +6 -2
  40. package/plugin/skills/ase-task-grill/SKILL.md +10 -7
  41. package/plugin/skills/ase-task-id/SKILL.md +3 -3
  42. package/plugin/skills/ase-task-implement/SKILL.md +6 -2
  43. package/plugin/skills/ase-task-preflight/SKILL.md +5 -1
  44. package/plugin/skills/ase-task-rename/SKILL.md +9 -0
@@ -119,15 +119,25 @@ Skill Sequential Processing
119
119
  For speed, emit *all* `TaskCreate` calls together in a *single* turn
120
120
  (issued in parallel), *not* one-per-turn sequentially. Do *not*
121
121
  rely on the call order to establish the step order, as the parallel
122
- results carry no guaranteed ordering. Instead, in the *immediately
123
- following* turn, establish the strict order explicitly by chaining
124
- the created tasks with `TaskUpdate`: for each <step/> after the
125
- first one, call `TaskUpdate({ taskId: "<this/>", addBlockedBy:
126
- [ "<prev/>" ] })` so that every step (with `taskId` <this/>) is
127
- blocked by its predecessor step (with `taskId` <prev/>).
122
+ results carry no guaranteed ordering.
123
+
124
+ Instead, in the *immediately single following* turn, first
125
+ reconstruct the step-id-to-taskId mapping: because each task's
126
+ `subject` equals the originating <step/> `id` (and <step/> ids are
127
+ unique), match every created task back to its <step/> by comparing
128
+ the task's `subject` to the step `id` -- read the ids straight from
129
+ the `TaskCreate` results, or call `TaskList` if the results are
130
+ no longer at hand.
131
+
132
+ Then establish the strict order explicitly by chaining the created
133
+ tasks with `TaskUpdate`: for each <step/> after the first one,
134
+ resolve <this/> and <prev/> to the mapped `taskId` values and
135
+ call `TaskUpdate({ taskId: "<this/>", addBlockedBy: [ "<prev/>" ]
136
+ })` so that every step (with `taskId` <this/>) is blocked by its
137
+ predecessor step (with `taskId` <prev/>).
128
138
 
129
139
  - *IMPORTANT*: For each <step/> you *MUST* use the `TaskUpdate` tool
130
- for updating its status during processing.
140
+ for updating its status *during* processing, once a <step/> finished.
131
141
 
132
142
  - *IMPORTANT*: You *MUST* sequentially execute every <step/> in
133
143
  a <flow/> *EXACTLY* as the instructions specify.
@@ -172,6 +182,12 @@ MCP Tool Calls
172
182
  ⧉ **ASE**: **ERROR:** MCP tool failed: <info/>
173
183
  </template>
174
184
 
185
+ *EXCEPTION*: this rule does *NOT* apply to the `ase_getopt` tool,
186
+ whose `ERROR:`-prefixed output is *expected* option-parsing
187
+ feedback handled exclusively by step 4 of the `getopt` procedure
188
+ (see `ase-getopt.md`); never emit this generic template for an
189
+ `ase_getopt` response.
190
+
175
191
  - Only on a clean response: proceed as the skill instructs.
176
192
 
177
193
  Skill Identification
@@ -232,9 +248,11 @@ Template Patterns
232
248
  </template>
233
249
 
234
250
  - When `<ase-tpl-head title="<title/>"/>` should be expanded, use
235
- (where <title-len/> is the number of characters in the string
236
- `⧉ ASE: <title/>`, and <bar/> is the `─` character repeated exactly
237
- (67 - <title-len/>) times):
251
+ (where <raw-title/> is the visible un-styled text `⧉ ASE: <title/>`,
252
+ <raw-title-len/> is the number of characters in <raw-title/>, and
253
+ <bar/> is the `─` character repeated exactly (67 - <raw-title-len/>)
254
+ times -- the very same bar-width rule as `<ase-tpl-foot/>` and
255
+ `<ase-tpl-boxed/>`, so equal visible text yields equal total width):
238
256
 
239
257
  <template>
240
258
 
@@ -251,9 +269,11 @@ Template Patterns
251
269
  </template>
252
270
 
253
271
  - When `<ase-tpl-foot title="<title/>"/>` should be expanded, use
254
- (where <title-len/> is the number of characters in the string
255
- `⧉ ASE: <title/>`, and <bar/> is the `─` character repeated exactly
256
- (67 - <title-len/>) times):
272
+ (where <raw-title/> is the visible un-styled text `⧉ ASE: <title/>`,
273
+ <raw-title-len/> is the number of characters in <raw-title/>, and
274
+ <bar/> is the `─` character repeated exactly (67 - <raw-title-len/>)
275
+ times -- the very same bar-width rule as `<ase-tpl-head/>` and
276
+ `<ase-tpl-boxed/>`, so equal visible text yields equal total width):
257
277
 
258
278
  <template>
259
279
 
@@ -275,19 +295,23 @@ Template Patterns
275
295
  </else>
276
296
 
277
297
  - When `<ase-tpl-boxed title="<title/>"[ subtitle="<subtitle/>"]><content/></ase-tpl-boxed>`
278
- should be expanded use the following helper placeholder and then the <template/>:
298
+ should be expanded use the following helper placeholders and then
299
+ the following <template/>:
279
300
 
280
301
  - <if condition="<subtitle/> is not empty">
281
- Set <raw-title>⧉ ASE: <title/>: <subtitle/><raw-title>.
302
+ Set <raw-title>⧉ ASE: <title/>: <subtitle/></raw-title>.
282
303
  Set <render-title>⧉ ASE: **`<title/>`**: `<subtitle/>`</render-title>.
283
304
  </if>
284
305
  <else>
285
- Set <raw-title>⧉ ASE: <title/><raw-title>.
306
+ Set <raw-title>⧉ ASE: <title/></raw-title>.
286
307
  Set <render-title>⧉ ASE: **`<title/>`**</render-title>.
287
308
  </else>
288
- - Set <raw-title-len/> to the number of characters in <raw-title/>.
289
- - Set <bar/> to the `─` character repeated exactly (67 - <raw-title-len/>) times.
290
- - Set <body> to <content/> with all line-starts prefixed with `│ `.
309
+ - Set <raw-title-len/> to the number of characters in the visible
310
+ un-styled text <raw-title/>.
311
+ - Set <bar/> to the `─` character repeated exactly (67 - <raw-title-len/>)
312
+ times -- the very same bar-width rule as `<ase-tpl-head/>` and
313
+ `<ase-tpl-foot/>`, so equal visible text yields equal total width.
314
+ - Set <body/> to <content/> with all line-starts prefixed with `│ `.
291
315
 
292
316
  <template>
293
317
 
@@ -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.11",
9
+ "version": "0.9.13",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -375,13 +375,19 @@ interface quality, quality attributes, and architecture governance.
375
375
  - *Focal aspect*: <focal-aspect/> - <focal-state/>
376
376
  - *In tension with*: <partner-list/>
377
377
 
378
- **RECOMMENDED**: lean toward *<focal|partners/>*
378
+ **RECOMMENDED**: lean toward *<lean-toward/>*
379
379
  *Reason*: <rationale/>
380
380
  *Implies*:
381
- - <partner-aspect-1/>: <partner-implication-1/>
382
- - <partner-aspect-2/>: <partner-implication-2/>
381
+ - <partner-aspect/>: <partner-implication/>
382
+ - ...
383
383
  </template>
384
384
 
385
+ For each partner in <partner-list/>, repeat the `*Implies*` line,
386
+ set <partner-aspect/> to the partner aspect, and set
387
+ <partner-implication/> to its brief implication. Set <lean-toward/>
388
+ to the aspect direction the recommendation favors (the *focal
389
+ aspect* or the *partners*).
390
+
385
391
  Hints:
386
392
 
387
393
  - For the final results, do *not* output anything else,
@@ -429,13 +435,14 @@ interface quality, quality attributes, and architecture governance.
429
435
  for the same aspect, and never emit both halves of a
430
436
  tension pair as separate PROBLEMs.
431
437
 
432
- - *Additionally*, first call the `ase_kv_clear()` tool of the `ase`
433
- MCP server to clear the in-memory key/value store, and then,
434
- for *every* reported PROBLEM and TRADEOFF, persist its finding
435
- result via the `ase_kv_set` tool of the `ase` MCP server, using
436
- `key` set to `ase-issue-P<n/>` (for PROBLEMs) or
437
- `ase-issue-T<n/>` (for TRADEOFFs) and `val` set to
438
- `<title/>: <description/>`.
438
+ - *Additionally*, persist all reported findings in a *single*
439
+ `ase_kv_batch` call to the `ase` MCP server with `transactional`
440
+ set to `true`. The `commands` parameter array of this call
441
+ starts with one `{ command: "clear" }` entry, followed by one
442
+ `{ command: "set", key: "ase-issue-P<n/>", val: "<title/>:
443
+ <description/>" }` entry per reported PROBLEM and one
444
+ `{ command: "set", key: "ase-issue-T<n/>", val: "<title/>:
445
+ <description/>" }` entry per reported TRADEOFF.
439
446
  </step>
440
447
 
441
448
  4. <step id="STEP 4: Give Final Hint">
@@ -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
 
@@ -319,7 +319,19 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
319
319
  as <head/> (or `none` if the list is `none`/empty).
320
320
  Set <args>--int-reuse-task</args>.
321
321
 
322
- 1. <if condition="<head/> is equal `IMPLEMENT`">
322
+ 1. <if condition="<head/> is equal `DONE`">
323
+ Consume the head: set <getopt-option-next/> to the remaining
324
+ tokens (joined back with `,`, or `none` if empty). `DONE`
325
+ means the freshly composed plan is finalized as-is, so do
326
+ *not* hand off to `ase-task-edit`. Only output the following
327
+ <template/> and then *STOP*. Do *not* implement the plan.
328
+
329
+ <template>
330
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- done**
331
+ </template>
332
+ </if>
333
+
334
+ 2. <elseif condition="<head/> is equal `IMPLEMENT`">
323
335
  Consume the head: set <getopt-option-next/> to the remaining
324
336
  tokens (joined back with `,`, or `none` if empty).
325
337
  <if condition="<getopt-option-next/> is not equal `none`">
@@ -327,9 +339,9 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
327
339
  </if>
328
340
  Call the tool `Skill(skill: "ase:ase-task-implement", args: "<args/>")`
329
341
  to *implement* the freshly composed plan, bypassing `ase-task-edit`.
330
- </if>
342
+ </elseif>
331
343
 
332
- 2. <elseif condition="<head/> is equal `PREFLIGHT`">
344
+ 3. <elseif condition="<head/> is equal `PREFLIGHT`">
333
345
  Consume the head: set <getopt-option-next/> to the remaining
334
346
  tokens (joined back with `,`, or `none` if empty).
335
347
  <if condition="<getopt-option-next/> is not equal `none`">
@@ -339,7 +351,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
339
351
  to *preflight* the freshly composed plan, bypassing `ase-task-edit`.
340
352
  </elseif>
341
353
 
342
- 3. <else>
354
+ 4. <else>
343
355
  Hand off to `ase-task-edit`.
344
356
  <if condition="<head/> is equal `EDIT`">
345
357
  Consume the head: set <getopt-option-next/> to the remaining
@@ -8,7 +8,6 @@ user-invocable: true
8
8
  disable-model-invocation: false
9
9
  effort: high
10
10
  allowed-tools:
11
- - "Skill"
12
11
  - "Agent"
13
12
  ---
14
13
 
@@ -12,7 +12,7 @@ allowed-tools:
12
12
  - "Bash(sort *)"
13
13
  - "Bash(uniq *)"
14
14
  - "Bash(head *)"
15
- - "Skill"
15
+ - "Bash(git log * | grep * | sort * | uniq * | sort * | head *)"
16
16
  - "Agent"
17
17
  ---
18
18
 
@@ -143,13 +143,24 @@ related to a set of code quality aspects.
143
143
  Set <new-text/> to the `new_text` field of <item/>.
144
144
  Set <context-after/> to the `context_after` field of <item/>.
145
145
 
146
- 2. If <context/> is not empty, set
146
+ 2. Set <old-start/> to the line of the first hunk line, i.e.,
147
+ the line of <context-before/> (one before <line/>).
148
+ Set <new-start/> to the same as <old-start/> (the unchanged
149
+ <context-before/> line shares the same start in both files).
150
+ Set <old-count/> to the total number of old-side hunk lines, i.e.,
151
+ the number of lines in <context-before/>, <old-text/>, and
152
+ <context-after/> combined.
153
+ Set <new-count/> to the total number of new-side hunk lines, i.e.,
154
+ the number of lines in <context-before/>, <new-text/>, and
155
+ <context-after/> combined.
156
+
157
+ 3. If <context/> is not empty, set
147
158
  <context><context/>,</context> (append a comma).
148
159
  Then append the following <template/> to <context/>:
149
160
 
150
161
  <template>`<file/>`:<line/></template>
151
162
 
152
- 3. Append the following <template/> to <diff-file/>:
163
+ 4. Append the following <template/> to <diff-file/>:
153
164
 
154
165
  <template>
155
166
  @@ -<old-start/>,<old-count/> +<new-start/>,<new-count/> @@
@@ -159,18 +170,6 @@ related to a set of code quality aspects.
159
170
  <context-after/>
160
171
  </template>
161
172
 
162
- Hints:
163
- - The <old-start/> is the line of the first hunk line, i.e.,
164
- the line of <context-before/> (one before <line/>).
165
- - The <new-start/> is the same as <old-start/> (the unchanged
166
- <context-before/> line shares the same start in both files).
167
- - The <old-count/> is the total number of old-side hunk lines, i.e.,
168
- the number of lines in <context-before/>, <old-text/>, and
169
- <context-after/> combined.
170
- - The <new-count/> is the total number of new-side hunk lines, i.e.,
171
- the number of lines in <context-before/>, <new-text/>, and
172
- <context-after/> combined.
173
-
174
173
  </for>
175
174
 
176
175
  3. Append <diff-file/> to <diff/>.
@@ -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
 
@@ -308,7 +308,19 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
308
308
  as <head/> (or `none` if the list is `none`/empty).
309
309
  Set <args>--int-reuse-task</args>.
310
310
 
311
- 1. <if condition="<head/> is equal `IMPLEMENT`">
311
+ 1. <if condition="<head/> is equal `DONE`">
312
+ Consume the head: set <getopt-option-next/> to the remaining
313
+ tokens (joined back with `,`, or `none` if empty). `DONE`
314
+ means the freshly composed plan is finalized as-is, so do
315
+ *not* hand off to `ase-task-edit`. Only output the following
316
+ <template/> and then *STOP*. Do *not* implement the plan.
317
+
318
+ <template>
319
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- done**
320
+ </template>
321
+ </if>
322
+
323
+ 2. <elseif condition="<head/> is equal `IMPLEMENT`">
312
324
  Consume the head: set <getopt-option-next/> to the remaining
313
325
  tokens (joined back with `,`, or `none` if empty).
314
326
  <if condition="<getopt-option-next/> is not equal `none`">
@@ -316,9 +328,9 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
316
328
  </if>
317
329
  Call the tool `Skill(skill: "ase:ase-task-implement", args: "<args/>")`
318
330
  to *implement* the freshly composed plan, bypassing `ase-task-edit`.
319
- </if>
331
+ </elseif>
320
332
 
321
- 2. <elseif condition="<head/> is equal `PREFLIGHT`">
333
+ 3. <elseif condition="<head/> is equal `PREFLIGHT`">
322
334
  Consume the head: set <getopt-option-next/> to the remaining
323
335
  tokens (joined back with `,`, or `none` if empty).
324
336
  <if condition="<getopt-option-next/> is not equal `none`">
@@ -328,7 +340,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
328
340
  to *preflight* the freshly composed plan, bypassing `ase-task-edit`.
329
341
  </elseif>
330
342
 
331
- 3. <else>
343
+ 4. <else>
332
344
  Hand off to `ase-task-edit`.
333
345
  <if condition="<head/> is equal `EDIT`">
334
346
  Consume the head: set <getopt-option-next/> to the remaining
@@ -71,6 +71,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
71
71
  <problem-id/> and stop processing.
72
72
 
73
73
  2. <if condition="
74
+ <problem-id/> is not set AND
74
75
  <problem/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`
75
76
  ">
76
77
  Set <ase-task-id><problem/></ase-task-id> (set task id to problem)
@@ -289,7 +290,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
289
290
  a question with the following custom dialog, where per
290
291
  approach A<n/>, you determine an ultra brief summary
291
292
  <short-summary/> and then use the answer option `A<n/>:
292
- ⚝ **RECOMMENDATION** ⚝: <short-summary/>` for your
293
+ ⚝ **RECOMMENDATION** - <short-summary/>` for your
293
294
  recommended approach plus zero or more answer options `A<n/>:
294
295
  <short-summary/>` for all other approaches:
295
296
 
@@ -366,7 +367,19 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
366
367
  as <head/> (or `none` if the list is `none`/empty).
367
368
  Set <args>--int-reuse-task</args>.
368
369
 
369
- 1. <if condition="<head/> is equal `IMPLEMENT`">
370
+ 1. <if condition="<head/> is equal `DONE`">
371
+ Consume the head: set <getopt-option-next/> to the remaining
372
+ tokens (joined back with `,`, or `none` if empty). `DONE`
373
+ means the freshly composed plan is finalized as-is, so do
374
+ *not* hand off to `ase-task-edit`. Only output the following
375
+ <template/> and then *STOP*. Do *not* implement the plan.
376
+
377
+ <template>
378
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- done**
379
+ </template>
380
+ </if>
381
+
382
+ 2. <elseif condition="<head/> is equal `IMPLEMENT`">
370
383
  Consume the head: set <getopt-option-next/> to the remaining
371
384
  tokens (joined back with `,`, or `none` if empty).
372
385
  <if condition="<getopt-option-next/> is not equal `none`">
@@ -374,9 +387,9 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
374
387
  </if>
375
388
  Call the tool `Skill(skill: "ase:ase-task-implement", args: "<args/>")`
376
389
  to *implement* the freshly composed plan, bypassing `ase-task-edit`.
377
- </if>
390
+ </elseif>
378
391
 
379
- 2. <elseif condition="<head/> is equal `PREFLIGHT`">
392
+ 3. <elseif condition="<head/> is equal `PREFLIGHT`">
380
393
  Consume the head: set <getopt-option-next/> to the remaining
381
394
  tokens (joined back with `,`, or `none` if empty).
382
395
  <if condition="<getopt-option-next/> is not equal `none`">
@@ -386,7 +399,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
386
399
  to *preflight* the freshly composed plan, bypassing `ase-task-edit`.
387
400
  </elseif>
388
401
 
389
- 3. <else>
402
+ 4. <else>
390
403
  Hand off to `ase-task-edit`.
391
404
  <if condition="<head/> is equal `EDIT`">
392
405
  Consume the head: set <getopt-option-next/> to the remaining
@@ -119,6 +119,17 @@ Analyze documents for spelling, punctuation, or grammar errors
119
119
 
120
120
  3. <if condition="<getopt-option-auto/> is not 'true'">
121
121
 
122
+ Set <old-start/> to the line of the first hunk line, i.e.,
123
+ the line of <context-before/> (one before <line/>).
124
+ Set <new-start/> to the same as <old-start/> (the unchanged
125
+ <context-before/> line shares the same start in both files).
126
+ Set <old-count/> to the total number of old-side hunk lines, i.e.,
127
+ the number of lines in <context-before/>, <old-text/>, and
128
+ <context-after/> combined.
129
+ Set <new-count/> to the total number of new-side hunk lines, i.e.,
130
+ the number of lines in <context-before/>, <new-text/>, and
131
+ <context-after/> combined.
132
+
122
133
  Render the proposed correction as a *unified diff* with *up to
123
134
  two* lines of context in a fenced block based on the following <template/>:
124
135
 
@@ -138,18 +149,6 @@ Analyze documents for spelling, punctuation, or grammar errors
138
149
 
139
150
  </template>
140
151
 
141
- Hints:
142
- - The <old-start/> is the line of the first hunk line, i.e.,
143
- the line of <context-before/> (one before <line/>).
144
- - The <new-start/> is the same as <old-start/> (the unchanged
145
- <context-before/> line shares the same start in both files).
146
- - The <old-count/> is the total number of old-side hunk lines, i.e.,
147
- the number of lines in <context-before/>, <old-text/>, and
148
- <context-after/> combined.
149
- - The <new-count/> is the total number of new-side hunk lines, i.e.,
150
- the number of lines in <context-before/>, <new-text/>, and
151
- <context-after/> combined.
152
-
153
152
  </if>
154
153
 
155
154
  4. <if condition="<getopt-option-auto/> is not 'true'">