@rse/ase 0.9.61 → 0.9.63

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 (37) hide show
  1. package/dst/ase-artifact.js +19 -8
  2. package/dst/ase-config.js +12 -8
  3. package/dst/ase-hook.js +8 -0
  4. package/dst/ase-service.js +2 -0
  5. package/dst/ase-spec.js +241 -0
  6. package/dst/ase.js +2 -0
  7. package/package.json +10 -8
  8. package/plugin/.claude-plugin/plugin.json +1 -1
  9. package/plugin/.codex-plugin/plugin.json +1 -1
  10. package/plugin/.github/plugin/plugin.json +1 -1
  11. package/plugin/agents/ase-code-lint.md +47 -3
  12. package/plugin/etc/stx.conf +5 -3
  13. package/plugin/meta/ase-common-grill.md +89 -0
  14. package/plugin/meta/ase-dialog.md +6 -0
  15. package/plugin/meta/ase-format-meta.md +23 -105
  16. package/plugin/meta/ase-format-spec.md +22 -1326
  17. package/plugin/meta/ase-tenets.md +63 -4
  18. package/plugin/package.json +6 -2
  19. package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
  20. package/plugin/skills/ase-code-analyze/SKILL.md +1 -1
  21. package/plugin/skills/ase-code-analyze/help.md +2 -1
  22. package/plugin/skills/ase-code-edit/SKILL.md +142 -140
  23. package/plugin/skills/ase-code-lint/SKILL.md +5 -5
  24. package/plugin/skills/ase-code-lint/help.md +23 -8
  25. package/plugin/skills/ase-help-skill/catalog.md +3 -0
  26. package/plugin/skills/ase-meta-review/help.md +1 -1
  27. package/plugin/skills/ase-spec-edit/SKILL.md +520 -0
  28. package/plugin/skills/ase-spec-edit/help.md +130 -0
  29. package/plugin/skills/ase-sync-export/SKILL.md +57 -116
  30. package/plugin/skills/ase-sync-export/help.md +30 -42
  31. package/plugin/skills/ase-sync-import/SKILL.md +37 -15
  32. package/plugin/skills/ase-sync-import/help.md +14 -10
  33. package/plugin/skills/ase-sync-reconcile/SKILL.md +37 -16
  34. package/plugin/skills/ase-sync-reconcile/help.md +19 -16
  35. package/plugin/skills/ase-task-grill/SKILL.md +120 -59
  36. package/plugin/skills/ase-task-grill/help.md +42 -12
  37. package/plugin/meta/ase-format-arch.md +0 -1164
@@ -6,7 +6,7 @@ The following are the **ASE Tenets** -- the guiding principles you
6
6
  *MUST* internalize when requested. They are organized into *Generic
7
7
  Tenets*, which always apply, and *Operation-Specific Tenets*, which
8
8
  apply only to a particular kind of operation (Crafting, Reconciling,
9
- Refactoring, Resolving).
9
+ Refactoring, Resolving, Specifying).
10
10
 
11
11
  GENERIC TENETS
12
12
  --------------
@@ -149,11 +149,11 @@ you *MUST* honor the following so-called **RECONCILIATION TENETS**:
149
149
  - **Level-Appropriate Translation**:
150
150
  Re-express source facts at the *target's* level of abstraction and
151
151
  altitude; do not copy verbatim across artifact levels. A SPEC states
152
- intent, an ARCH states structure, CODE states realization, DOCS
153
- states facts, etc. -- align the *meaning*, not the wording.
152
+ intent and structure, CODE states realization, DOCS states facts,
153
+ etc. -- align the *meaning*, not the wording.
154
154
 
155
155
  - **Format Conformance**:
156
- Keep every formatted target (SPEC, ARCH, TASK) conformant to its
156
+ Keep every formatted target (SPEC, TASK) conformant to its
157
157
  format contract (headings, structure, identifiers). Treat CODE,
158
158
  DOCS, INFR, and OTHR kinds of artifacts as foreign-defined, but not
159
159
  as free-form.
@@ -221,3 +221,62 @@ you *MUST* honor the following so-called **RESOLVING TENETS**:
221
221
  handled *near the origin*. Problems for *theoretical, fictive, or
222
222
  unexpected* errors *should* be handled more generally and in parent
223
223
  scopes.
224
+
225
+ SPECIFYING TENETS
226
+ -----------------
227
+
228
+ When *specifying* -- creating, revising, or editing the statements of a
229
+ specification artifact set -- you *MUST* honor the following so-called
230
+ **SPECIFYING TENETS**:
231
+
232
+ - **Intent over Realization**:
233
+ A specification, in its domain-specific and non-architecture related
234
+ aspects, states only the *WHAT* and the *WHY*, never the *HOW*.
235
+ Record intent, structure, constraints, and relationships here.
236
+ Implementation steps, algorithms, technologies, and code-level
237
+ details describe the *WHAT* and *HOW* and belong only into
238
+ the domain-unspecific and architecture-related aspects of the
239
+ specification.
240
+
241
+ - **Statement with Rationale**:
242
+ Every statement carries its *WHY* behind the `, BECAUSE ` clause in
243
+ a description. A statement without a rationale can neither be judged
244
+ nor revised, so never leave the rationale implicit and never restate
245
+ the statement as its own rationale.
246
+
247
+ - **Unambiguous and Verifiable**:
248
+ Every statement is precise enough that two readers derive the same
249
+ meaning and that its fulfillment is decidable. Replace vague
250
+ qualifiers ("fast", "user-friendly", "robust") with the concrete
251
+ property, threshold, or scenario actually meant.
252
+
253
+ - **Single Source of Truth**:
254
+ Every fact resides in exactly *one* object of the specification. Do
255
+ not restate a fact in a second place -- point at its owning object
256
+ with a `[[xxx]]` reference instead, so a later change has exactly
257
+ one place to land.
258
+
259
+ - **Atomic Statement**:
260
+ Every statement expresses exactly *one* fact with exactly *one*
261
+ rationale. Split a statement that joins independent facts with
262
+ "and"/"or" -- otherwise its fulfillment is only partially decidable
263
+ and its rationale covers more than it explains.
264
+
265
+ - **Schema Conformance**:
266
+ Every object stays conformant to the **SpecBook SCHEMA Model** of
267
+ the project: allowed kinds, allowed nesting, mandatory and optional
268
+ properties, and the configured value constraints. Never invent an
269
+ object kind or a property key the schema does not define.
270
+
271
+ - **Referential Integrity**:
272
+ Every `[[xxx]]` reference resolves to exactly one object. When an
273
+ object is renamed, moved, or removed, follow *all* references to it
274
+ through the entire specification corpus and adjust or remove them
275
+ in the same change set -- a dangling or ambiguous reference is a
276
+ defect.
277
+
278
+ - **No Fabrication**:
279
+ Never invent specification content the request does not warrant. If
280
+ the request is silent, ambiguous, or contradictory on something the
281
+ specification needs, surface the gap explicitly rather than papering
282
+ over it with a plausible guess.
@@ -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.61",
9
+ "version": "0.9.63",
10
10
  "license": "Apache-2.0",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -15,9 +15,10 @@
15
15
  },
16
16
  "devDependencies": {
17
17
  "@rse/stx": "1.1.6",
18
+ "@rse/specbook": "1.0.2",
18
19
  "markdownlint": "0.41.1",
19
20
  "markdownlint-cli2": "0.23.2",
20
- "eslint": "10.9.0",
21
+ "eslint": "10.9.1",
21
22
  "@eslint/markdown": "8.0.3",
22
23
  "eslint-markdown": "0.14.0"
23
24
  },
@@ -25,6 +26,9 @@
25
26
  "npm": ">=10.0.0",
26
27
  "node": ">=22.13.0"
27
28
  },
29
+ "allowScripts": {
30
+ "fsevents": true
31
+ },
28
32
  "scripts": {
29
33
  "start": "stx -v4 -l warning -c etc/stx.conf"
30
34
  }
@@ -482,7 +482,7 @@ interface quality, quality attributes, and architecture governance.
482
482
  nothing and hence emit no output at all):
483
483
 
484
484
  <ase-tpl-hint level="minimal">
485
- For deeper analysis, suggestions on solution approaches and then final source code changes, use `/ase-code-resolve <id-prefix/>P{n}` or `/ase-code-resolve <id-prefix/>T{n}` in the same or even a different session.
485
+ For deeper analysis, suggestions on solution approaches and then final source code changes, use `/ase-code-resolve <id-prefix/>P{n}` or `/ase-code-resolve <id-prefix/>T{n}`, or for a direct one-shot fix use `/ase-code-edit <id-prefix/>P{n}` or `/ase-code-edit <id-prefix/>T{n}`, in the same or even a different session.
486
486
  </ase-tpl-hint>
487
487
 
488
488
  </step>
@@ -218,7 +218,7 @@ problems in *performance* and *efficiency*, or problems in *security*.
218
218
  nothing and hence emit no output at all):
219
219
 
220
220
  <ase-tpl-hint level="minimal">
221
- For deeper analysis, suggestions on solution approaches and then final problem resolution, use `/ase-code-resolve <id-prefix/>P{n}` in the same or even a different session.
221
+ For deeper analysis, suggestions on solution approaches and then final problem resolution, use `/ase-code-resolve <id-prefix/>P{n}`, or for a direct one-shot fix use `/ase-code-edit <id-prefix/>P{n}`, in the same or even a different session.
222
222
  </ase-tpl-hint>
223
223
 
224
224
  You *MUST* not output anything else in this STEP 3,
@@ -52,7 +52,8 @@ problem as a `PROBLEM` entry with severity (`LOW`, `MEDIUM`, `HIGH`) and
52
52
  inline file/line references (in the performance lens, each entry
53
53
  additionally carries an *evidence* and a *trade-off* line), and persists
54
54
  results in the `ase` MCP key/value store as `ase-issue-P<n>` entries so
55
- they can later be resolved via `ase-code-resolve P<n>`.
55
+ they can later be resolved via `ase-code-resolve P<n>` or directly
56
+ fixed via `ase-code-edit P<n>`.
56
57
 
57
58
  ## ARGUMENTS
58
59
 
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: ase-code-edit
3
- argument-hint: "[--help|-h] [--mode|-m auto|craft|refactor|resolve] [--grill|-g] [--grill-rounds|-r <n>] [--verify|-v] [--worktree|-w] [--loop|-l] [<query>]"
3
+ argument-hint: "[--help|-h] [--mode|-m auto|craft|refactor|resolve] [--grill|-g] [--grill-rounds|-r <n>] [--verify|-v] [--worktree|-w] [--loop|-l] [<query>|<issue-id>]"
4
4
  description: >
5
5
  Edit Source Code: Use when the user wants to "edit" the code base in
6
- one shot from a query, fusing crafting, refactoring, and resolving
7
- with optional grilling, verification, looping, and Git worktree
8
- isolation.
6
+ one shot from a query or a bare analyzer issue id like "P1", fusing
7
+ crafting, refactoring, and resolving with optional grilling,
8
+ verification, looping, and Git worktree isolation.
9
9
  user-invocable: true
10
10
  disable-model-invocation: false
11
11
  effort: xhigh
@@ -33,6 +33,7 @@ resolving in one shot -- through the states *querying*, *discovering*,
33
33
  </objective>
34
34
 
35
35
  @${CLAUDE_SKILL_DIR}/../../meta/ase-tenets.md
36
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-grill.md
36
37
 
37
38
  Procedure
38
39
  ---------
@@ -114,7 +115,32 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
114
115
 
115
116
  </if>
116
117
 
117
- 2. Convert the <query/> *fresh* into <todo-what/> -- the
118
+ 2. <if condition="<query/> matches the regexp `^([a-zA-Z][a-zA-Z0-9_]*-)?[PT]\d+$`">
119
+
120
+ The <query/> is a bare issue identifier (like `P1`, `T1`, or
121
+ `<prefix>-P1`) previously produced by `ase-code-analyze` or
122
+ `ase-arch-analyze`. Set <issue-id><query/></issue-id> and call
123
+ the `ase_kv_get(key: "ase-issue-<issue-id/>")` tool of the
124
+ `ase` MCP server to retrieve the persisted problem description.
125
+ If the returned `text` is non-empty, set <query><text/></query>
126
+ and only output the following <template/>:
127
+
128
+ <template>
129
+ ⧉ **ASE**: ✪ skill: **ase-code-edit**, ⇌ issue: **<issue-id/>**, ▶ status: **issue retrieved**
130
+ </template>
131
+
132
+ Otherwise, set <issue-id></issue-id> (empty) and only output the
133
+ following <template/>, then, under `--loop`, continue with the
134
+ *next* iteration at item 3.1 above, or, without `--loop`,
135
+ immediately *STOP* processing the entire current skill:
136
+
137
+ <template>
138
+ ⧉ **ASE**: ✪ skill: **ase-code-edit**, ▶ ERROR: no analyzer result exists for issue **<query/>**
139
+ </template>
140
+
141
+ </if>
142
+
143
+ 3. Convert the <query/> *fresh* into <todo-what/> -- the
118
144
  domain-specific, non-implementation-detail information -- and
119
145
  <todo-how/> -- the remaining information -- discarding all
120
146
  <todo-what/>/<todo-how/> content of any previous iteration.
@@ -122,11 +148,11 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
122
148
  and during later implementation just interpret the query best-effort.
123
149
  Do not output anything.
124
150
 
125
- 3. Expand the following:
151
+ 4. Expand the following:
126
152
 
127
153
  <expand name="todo-box" arg1="current state (after querying)"></expand>
128
154
 
129
- 4. Set <query></query> (clear the query, so every further `--loop`
155
+ 5. Set <query></query> (clear the query, so every further `--loop`
130
156
  iteration asks for a fresh one). Do not output anything.
131
157
 
132
158
  4. **State: discovering:**
@@ -144,85 +170,16 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
144
170
 
145
171
  1. Understand what "grilling" is about:
146
172
 
147
- - GOAL:
148
-
149
- Interactively interviewing the user *relentlessly* about every
150
- *essential aspect* of the edit query in <todo-what/> and
151
- <todo-how/> *until* reaching a shared understanding and no
152
- major decisions/questions are left open.
153
-
154
- This especially means that you *MUST* clarify as many aspects as
155
- necessary to ensure that for at least the most important decisions,
156
- during a subsequent implementation, no essential freedom of choice
157
- exists any longer.
158
-
159
- - FOCUS:
160
-
161
- Focusing on the following outside-in *Focus Areas*, in order of
162
- descending importance for the grilling operation:
163
-
164
- 1. *DOMAIN*: Aspects affecting domain-specifics. These
165
- aspects *MUST* be clarified, as they are about
166
- the "what" of the solution and they
167
- non-technically shape the solution noticeably.
168
-
169
- 2. *INTERFACE*: Aspects affecting externally observable
170
- behavior or interfaces, especially aspects about user (UI)
171
- and machine (API) interfaces. These aspects *MUST* be
172
- clarified, as they are externally visible and
173
- shape the boundary of the solution.
174
-
175
- 3. *ARCHITECTURE*: Aspects affecting software and system
176
- architecture, especially decisions on structure, wiring,
177
- placement, or dependencies. These aspects *SHOULD*
178
- be clarified, as they technically shape the solution noticeably.
179
-
180
- 4. *IMPLEMENTATION*: Aspects affecting any other
181
- implementation details, especially how the edit query
182
- is realized in the code base. These aspects *CAN* be
183
- clarified, as they shape technical inner details only.
184
-
185
- - INDICATORS:
186
-
187
- Check the following indicators for identifying problematic
188
- aspects:
189
-
190
- - *Fuzzy Language*:
191
- When the user uses vague or overloaded terms instead of
192
- a precise or canonical term.
193
-
194
- - *Conflicting Terminology*:
195
- When the user uses a term that conflicts with the
196
- existing terminology in the code base.
197
-
198
- - *Conflicting Code*:
199
- When the user states how something works, check whether the
200
- current code state really agrees.
201
-
202
- - *Non-Concrete Scenarios*:
203
- When domain relationships are being discussed,
204
- stress-test them with specific scenarios. Theoretically
205
- invent realistic scenarios that probe edge cases and
206
- force the user to be precise about the boundaries
207
- between concepts.
208
-
209
- - *Unspecified Architecture Patterns*:
210
- When the realization of the functionality is known to
211
- be reasonably realizable with more than one decent
212
- architecture pattern, but no such pattern was
213
- mentioned.
214
-
215
- - *Unspecified Dependencies*:
216
- When the realization of functionality usually is known
217
- to be supported by the use of frameworks or libraries,
218
- but no dependencies on such solutions were mentioned.
173
+ <expand name="grill-understanding" arg1="the edit query in <todo-what/> and <todo-how/>"></expand>
219
174
 
220
175
  2. Perform <getopt-option-grill-rounds/> grilling *rounds*,
221
176
  numbered <m/> (1-<getopt-option-grill-rounds/>).
222
177
 
223
178
  For each round:
224
179
 
225
- 1. Explicitly start *from scratch* from *only* the current
180
+ 1. INITIALIZE TODO:
181
+
182
+ Explicitly start *from scratch* from *only* the current
226
183
  <todo-what/> and <todo-how/> and *forget* all information
227
184
  gathered in previous rounds. Set <round-id/> to
228
185
  `GRILLING ROUND <m/>/<getopt-option-grill-rounds/>` if
@@ -230,50 +187,76 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
230
187
  `GRILLING` otherwise (a single round needs no round
231
188
  numbering). Do not output anything.
232
189
 
233
- 2. Determine the very brief but precise questions <question-N/>,
234
- chosen to resolve the open points related to the above
235
- understanding of grilling, by focusing on the mentioned
236
- *Focus Areas*.
237
-
238
- For each <question-N/> determine its <focus-area-N/> and a
239
- <topic-N/>, a 1-2 word hint describing what the question is
240
- about. Render <focus-area-N/> in the tables below as
241
- `**DOMAIN** (MUST)`, `**INTERFACE** (MUST)`,
242
- `**ARCHITECTURE** (SHOULD)`, or `**IMPLEMENTATION** (MAY)`
243
- correspondingly.
244
-
245
- Use the format `Shall...?` for questions of
246
- focus area *DOMAIN* and *INTERFACE*, the format `Should...?`
247
- for questions of focus area *ARCHITECTURE*, and the format
248
- `May...?` for questions of focus area *IMPLEMENTATION*.
249
-
250
- In every <question-N/>, encode all *literal aspects* -- file
251
- and directory paths, identifiers, symbols, types, commands,
252
- options, configuration keys, and literal values -- with
253
- backticks.
254
-
255
- Keep every <question-N/> at most *200 characters* long, as a
256
- longer question overflows its table cell and silently
257
- degrades the entire table into a plain text rendering.
258
-
259
- 3. Finally, *sort* the questions by descending
260
- focus area order -- first all `DOMAIN`, then all
261
- `INTERFACE`, then all `ARCHITECTURE`, and then all
262
- `IMPLEMENTATION` ones -- and renumber <N/> according to this
263
- order. Truncate the list after a maximum of 10 questions and
264
- set <n/> to the number of remaining questions. Do not output
190
+ 2. DETERMINE QUESTIONS:
191
+
192
+ Determine the questions, comprised of a round-local id
193
+ <question-N-id/> of `Q<N/>` -- where <N/> restarts at `1`
194
+ in *every* round, independent of the numbering of previous
195
+ rounds --, and a very brief but precise question text
196
+ <question-N-text/>. Each question is chosen to
197
+ resolve the open points related to the above understanding
198
+ of grilling, by focusing on the mentioned *Focus Areas*.
199
+
200
+ For <question-N-text/> use the format `Shall...?` for
201
+ questions of focus area `DOMAIN` and `INTERFACE`, the format
202
+ `Should...?` for questions of focus area `ARCHITECTURE`,
203
+ and the format `May...?` for questions of focus area
204
+ `IMPLEMENTATION`.
205
+
206
+ In every <question-N-text/>, encode all *literal aspects*
207
+ -- file and directory paths, identifiers, symbols, types,
208
+ commands, options, configuration keys, and literal values --
209
+ with backticks.
210
+
211
+ Keep every <question-N-text/> at most *200 characters* long
212
+ -- compact the text until it fits --, as a longer question
213
+ overflows its table cell and silently degrades the entire
214
+ table into a plain text rendering.
215
+
216
+ 3. DETERMINE CONTEXT:
217
+
218
+ For each question, determine its focus area
219
+ <context-N-focus/> from the mentioned *Focus Areas*, a 1-3
220
+ word hint <context-N-topic/>, describing what the question
221
+ is about, and a <context-N-severity/>, describing how
222
+ important this question is.
223
+
224
+ Set <context-N-id/> to `DOM` for <context-N-focus/> of
225
+ `DOMAIN`, `IFC` for <context-N-focus/> of `INTERFACE`, `ARC`
226
+ for <context-N-focus/> of `ARCHITECTURE`, and `IMP` for
227
+ <context-N-focus/> of `IMPLEMENTATION`.
228
+
229
+ 4. SORT QUESTIONS:
230
+
231
+ Finally, *sort* the questions by descending focus area
232
+ order -- first all `DOMAIN`, then all `INTERFACE`, then all
233
+ `ARCHITECTURE`, and then all `IMPLEMENTATION` ones -- and
234
+ renumber <N/> according to this order, starting at `1`.
235
+ Truncate the list after a maximum of 10 questions and set
236
+ <n/> to the number of remaining questions. Do not output
265
237
  anything.
266
238
 
267
- 4. For all remaining <question-N/>, check the code base
268
- and your world knowledge to find *two to three*
269
- grounded answer alternatives <answer-N-K/> with a
270
- 1-3 word label <answer-N-K-label/> and an ultra brief description
271
- <answer-N-K-description/> of at most *10 words*. For the answer
272
- which reflects the current
273
- <todo-what/>/<todo-how/> understanding prefixing its
274
- description with `✻ **CURRENT** ✻`. Assemble a <answer-N/>
275
- out of `**A1**: **<answer-N-1-label/>**: <answer-N-1-description/> ─◇─
276
- **A2**: **<answer-N-2-label/>**: <answer-N-2-description/> ─◇─ [...]`.
239
+ Finally, assemble the <question-N/> out of
240
+ `**<question-N-id/>** **<context-N-id/>**
241
+ **<context-N-topic/>**: <question-N-text/>`.
242
+
243
+ 5. DETERMINE ANSWERS:
244
+
245
+ For all remaining <question-N/>, check the code base and
246
+ your world knowledge to find *two to three* grounded answer
247
+ alternatives <answer-N-K/> with a question-local id
248
+ <answer-N-K-id/> of `A<K/>` -- where <K/> restarts at `1`
249
+ for *every* question, independent of the numbering of other
250
+ questions --, a 1-3 word label <answer-N-K-label/>, and
251
+ an ultra brief description <answer-N-K-description/> of
252
+ at most *10 words*. For the answer which reflects the
253
+ current <todo-what/>/<todo-how/> understanding, append
254
+ ` ⚑` to its <answer-N-K-label/>.
255
+
256
+ Assemble an <answer-N/> out of `**<answer-N-1-id/>**
257
+ ▶ **<answer-N-1-label/>**: <answer-N-1-description/>,
258
+ **<answer-N-2-id/>** ▶ **<answer-N-2-label/>**:
259
+ <answer-N-2-description/>[, ...]`.
277
260
 
278
261
  Keep every assembled <answer-N/> at most *240 characters*
279
262
  long -- drop the least relevant alternative and compact the
@@ -281,7 +264,9 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
281
264
  its table cell and silently degrades the entire table into a
282
265
  plain text rendering.
283
266
 
284
- 5. In the following, you *MUST* *NOT* use your built-in
267
+ 6. INTERACTIVE DIALOG:
268
+
269
+ In the following, you *MUST* *NOT* use your built-in
285
270
  <user-dialog-tool/> tool! Instead, you *MUST* just show a
286
271
  custom dialog according to the expanded `custom-dialog`
287
272
  definition. You *MUST* closely follow this definition. The
@@ -289,8 +274,8 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
289
274
  `SKIP GRILLING` and `STOP SKILL`, dispatched as follows:
290
275
 
291
276
  - If a <result/> is `SKIP GRILLING` or `CANCEL`, ask no
292
- further questions, continue with item 6 below (merging
293
- the answers gathered so far), and after item 7 skip all
277
+ further questions, continue with item 7 below (merging
278
+ the answers gathered so far), and after item 8 skip all
294
279
  remaining rounds and continue with the *implementing*
295
280
  state.
296
281
 
@@ -305,9 +290,7 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
305
290
  1. Output only the following <template/> -- it lists *all*
306
291
  questions of the round up-front, one table row per
307
292
  aspect, so the subsequent dialog only has to ask for the
308
- combined answer. Align all column edges of the table. If
309
- <getopt-option-grill-rounds/> is equal `1`, *omit* the
310
- leading `<round-id/>` line.
293
+ combined answer. Align all column edges of the table.
311
294
 
312
295
  In every table cell you *MUST* escape each literal pipe
313
296
  character outside a code span as `\|` and you *MUST*
@@ -317,13 +300,16 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
317
300
  entire table into a plain text rendering:
318
301
 
319
302
  <template>
320
- ⧉ **ASE**: <round-id/>:
303
+ ⧉ **ASE**: <round-id/>: *Relentless Interviewing Until Clarity*
304
+
305
+ | QUESTION | ANSWERS |
306
+ | ------------- | ----------- |
307
+ | <question-1/> | <answer-1/> |
308
+ | <question-2/> | <answer-2/> |
309
+ | [...] | [...] |
321
310
 
322
- | # | FOCUS TOPIC | **QUESTION** | **ANSWERS** |
323
- | :----: | ----------------------------- | ----------------- | ----------- |
324
- | **Q1** | <focus-area-1/> ▶ <topic-1/> | **<question-1/>** | <answer-1/> |
325
- | **Q2** | <focus-area-2/> ▶ <topic-2/> | **<question-2/>** | <answer-2/> |
326
- | [..] | [...] | [...] | [...] |
311
+ Legend: **DOM**: Domain (MUST), **IFC**: Interface (MUST), **ARC**: Architecture (SHOULD), **IMP**: Implementation (MAY)
312
+ **Qn**: round-local question id, **An**: question-local answer id, ⚑: current decision state
327
313
  </template>
328
314
 
329
315
  2. Show a custom dialog. Its only answer options are the
@@ -331,7 +317,7 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
331
317
  *one* free-text reply:
332
318
 
333
319
  <expand name="custom-dialog" arg1="--other">
334
- <round-id/>: What is your (combined) answer to all (or a subset) of the above questions? (keywords are sufficient)
320
+ <round-id/>: What is your (combined) answer to all (or a subset) of the above questions? (keywords or `Qn:An` references are sufficient)
335
321
  SKIP GRILLING: skip all remaining grilling and continue with the implementation
336
322
  STOP SKILL: stop the entire skill immediately
337
323
  </expand>
@@ -342,11 +328,15 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
342
328
  combined free-text answers to all questions of the
343
329
  round.
344
330
 
345
- 6. Merge all gathered answers of the round -- the combined
346
- reply -- *exclusively* back into <todo-what/> and
331
+ 7. MERGE ANSWERS INTO TODO:
332
+
333
+ Merge all gathered answers in <result/> of the round -- the
334
+ combined reply -- *exclusively* back into <todo-what/> and
347
335
  <todo-how/>. Do not output anything.
348
336
 
349
- 7. Set <round-suffix/> to
337
+ 8. SHOW CURRENT TODO:
338
+
339
+ Set <round-suffix/> to
350
340
  ` round <m/>/<getopt-option-grill-rounds/>` if
351
341
  <getopt-option-grill-rounds/> is greater than 1, or to
352
342
  empty otherwise, and expand the following -- this
@@ -363,6 +353,10 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
363
353
  `resolve`: Set <task-kind/> to `CRAFTING`, `REFACTORING`,
364
354
  or `RESOLVING` correspondingly.
365
355
 
356
+ - Else if <issue-id/> is not empty (`auto` with a retrieved
357
+ analyzer issue): Set <task-kind/> to `RESOLVING`, as the
358
+ edit fixes a reported problem.
359
+
366
360
  - Else (`auto`): *Infer* the <task-kind/> from <todo-what/> and
367
361
  <todo-how/>: set to `RESOLVING` if the edit predominantly
368
362
  fixes a defect, set to `REFACTORING` if it predominantly
@@ -447,7 +441,15 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
447
441
  user keeps full control over the final commit.
448
442
  </if>
449
443
 
450
- 4. Output only the following <template/>. You *MUST* *NOT* output a
444
+ 4. <if condition="<issue-id/> is not empty">
445
+ Call the `ase_kv_delete(key: "ase-issue-<issue-id/>")` tool of
446
+ the `ase` MCP server to remove the now-resolved analyzer result
447
+ from the key/value store, then set <issue-id></issue-id> (empty),
448
+ so every further `--loop` iteration starts without an issue.
449
+ Do not output anything.
450
+ </if>
451
+
452
+ 5. Output only the following <template/>. You *MUST* *NOT* output a
451
453
  change summary, a list of modified artifacts, a rationale, or a
452
454
  unified diff of the changes -- *independent* of
453
455
  <ase-project-boxing/>, whose exposure rules are explicitly
@@ -467,7 +469,7 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
467
469
  1. Verify whether the implementation fulfills <todo-what/> and
468
470
  <todo-how/> by running available verification commands
469
471
  (build, tests, linter, type-checker)
470
- <if condition=" <worktree-dir/> is not empty">
472
+ <if condition="<worktree-dir/> is not empty">
471
473
  , each with <worktree-dir/> as its working directory
472
474
  </if>.
473
475
 
@@ -20,7 +20,7 @@ Lint Source Code
20
20
 
21
21
  <expand name="getopt"
22
22
  arg1="ase-code-lint"
23
- arg2="--auto|-a --severity|-S=(LOW|MEDIUM|HIGH) --include|-i=(none|A01|A02|A03|A04|A05|A06|A07|A08|A09|A10|A11|A12|A13|A14|A15|A16|A17|A18|A19|A20)... --exclude|-e=(none|A01|A02|A03|A04|A05|A06|A07|A08|A09|A10|A11|A12|A13|A14|A15|A16|A17|A18|A19|A20)...">
23
+ arg2="--auto|-a --severity|-S=(LOW|MEDIUM|HIGH) --include|-i=(none|A01|A02|A03|A04|A05|A06|A07|A08|A09|A10|A11|A12|A13|A14|A15|A16|A17|A18|A19|A20|A21)... --exclude|-e=(none|A01|A02|A03|A04|A05|A06|A07|A08|A09|A10|A11|A12|A13|A14|A15|A16|A17|A18|A19|A20|A21)...">
24
24
  $ARGUMENTS
25
25
  </expand>
26
26
 
@@ -53,16 +53,16 @@ related to a set of code quality aspects.
53
53
  <getopt-option-include/> and <getopt-option-exclude/> as
54
54
  comma-separated token lists, silently dropping the `none` sentinel
55
55
  and any empty token. If a token <token/> is *not* one of the aspect
56
- ids `A01`...`A20`, only output the following <template/> and then
56
+ ids `A01`...`A21`, only output the following <template/> and then
57
57
  *STOP* the entire flow (do not perform any further steps):
58
58
 
59
59
  <template>
60
60
  ⧉ **ASE**: ✪ skill: **ase-code-lint**, ▶ ERROR: invalid aspect id: **<token/>**
61
61
  </template>
62
62
 
63
- Otherwise set <aspects/> to *all* twenty aspect ids `A01`...`A20`
63
+ Otherwise set <aspects/> to *all* twenty-one aspect ids `A01`...`A21`
64
64
  if both lists are empty, to the *include* list if only it is
65
- non-empty, to all twenty *minus* the *exclude* list if only it is
65
+ non-empty, to all twenty-one *minus* the *exclude* list if only it is
66
66
  non-empty, and to the *include* list *minus* the *exclude* list if
67
67
  both are non-empty. If the resulting <aspects/> is *empty*, only
68
68
  output the following <template/> and then *STOP* the entire flow
@@ -143,7 +143,7 @@ related to a set of code quality aspects.
143
143
 
144
144
  Use the following <template/> to output a summary of the detected
145
145
  problems in <problems/> (if any were found), in the original aspect
146
- ordering `A01 - XXX`...`A20 - XXX`.
146
+ ordering `A01 - XXX`...`A21 - XXX`.
147
147
 
148
148
  <template>
149
149
  <ase-tpl-bullet-secondary/> **LINT SUMMARY**:
@@ -27,22 +27,31 @@ correction interactively (or refine it via a free-text hint, which
27
27
  re-proposes the correction without limit) or - with `--auto` - applies
28
28
  all corrections automatically.
29
29
 
30
- By default all twenty code quality aspects are checked. The `--include`
30
+ By default all twenty-one code quality aspects are checked. The `--include`
31
31
  and `--exclude` options narrow this to an *effective aspect set*: with
32
32
  `--include` only, exactly the listed aspects are checked; with
33
33
  `--exclude` only, all aspects except the listed ones; with both, the
34
34
  included ones minus the excluded ones. An unknown aspect id, or a
35
35
  combination which cancels out to an empty set, aborts the skill with an
36
- error. The twenty aspect ids are:
36
+ error. The twenty-one aspect ids are:
37
37
 
38
38
  ```text
39
- A01 FORMATTING A06 REDUNDANCY A11 TYPING A16 SECURITY
40
- A02 COMPREHENSION A07 PATTERNS A12 ERROR-HANDLING A17 ARCHITECTURE
41
- A03 CLEANLINESS A08 COMPLICATEDNESS A13 MEMORY-LEAK A18 LOGIC
42
- A04 SPELLING A09 CONCISENESS A14 CONCURRENCY A19 FLOW
43
- A05 COMPLEXITY A10 SMELLS A15 PERFORMANCE A20 DEAD-CODE
39
+ A01 FORMATTING A07 PATTERNS A13 MEMORY-LEAK A19 FLOW
40
+ A02 COMPREHENSION A08 COMPLICATEDNESS A14 CONCURRENCY A20 DEAD-CODE
41
+ A03 CLEANLINESS A09 CONCISENESS A15 PERFORMANCE A21 DOCUMENTATION
42
+ A04 SPELLING A10 SMELLS A16 SECURITY
43
+ A05 COMPLEXITY A11 TYPING A17 ARCHITECTURE
44
+ A06 REDUNDANCY A12 ERROR-HANDLING A18 LOGIC
44
45
  ```
45
46
 
47
+ The `A21 DOCUMENTATION` aspect checks the code documentation in *both*
48
+ directions: it flags functions, methods, classes, and modules - *private
49
+ ones included* - which lack a minimal 1-2 line description in the
50
+ idiomatic documentation convention of the target language, *and* it
51
+ flags excessive comments (narrated decision logs, change history,
52
+ line-by-line explanations of the obvious), comments merely restating
53
+ the code, and comments contradicting the code.
54
+
46
55
  ## OPTIONS
47
56
 
48
57
  `--auto`|`-a`:
@@ -60,7 +69,7 @@ A05 COMPLEXITY A10 SMELLS A15 PERFORMANCE A20 DEAD-CODE
60
69
  `--include`|`-i`=*aspect*[`,`...]:
61
70
  Restrict the checked code quality aspects to the given
62
71
  comma-separated list of aspect ids (e.g. `A01,A04`). Without this
63
- option, all twenty aspects are checked.
72
+ option, all twenty-one aspects are checked.
64
73
 
65
74
  `--exclude`|`-e`=*aspect*[`,`...]:
66
75
  Remove the given comma-separated list of aspect ids from the checked
@@ -104,6 +113,12 @@ Lint a directory for all aspects except dead code:
104
113
  ❯ /ase-code-lint --exclude A20 src/handlers/
105
114
  ```
106
115
 
116
+ Lint a directory for the documentation aspect only:
117
+
118
+ ```text
119
+ ❯ /ase-code-lint -i A21 src/handlers/
120
+ ```
121
+
107
122
  ## SEE ALSO
108
123
 
109
124
  [`ase-code-analyze`](../ase-code-analyze/help.md), [`ase-code-resolve`](../ase-code-resolve/help.md), [`ase-code-refactor`](../ase-code-refactor/help.md),