@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.
- package/dst/ase-artifact.js +19 -8
- package/dst/ase-config.js +12 -8
- package/dst/ase-hook.js +8 -0
- package/dst/ase-service.js +2 -0
- package/dst/ase-spec.js +241 -0
- package/dst/ase.js +2 -0
- package/package.json +10 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/agents/ase-code-lint.md +47 -3
- package/plugin/etc/stx.conf +5 -3
- package/plugin/meta/ase-common-grill.md +89 -0
- package/plugin/meta/ase-dialog.md +6 -0
- package/plugin/meta/ase-format-meta.md +23 -105
- package/plugin/meta/ase-format-spec.md +22 -1326
- package/plugin/meta/ase-tenets.md +63 -4
- package/plugin/package.json +6 -2
- package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
- package/plugin/skills/ase-code-analyze/SKILL.md +1 -1
- package/plugin/skills/ase-code-analyze/help.md +2 -1
- package/plugin/skills/ase-code-edit/SKILL.md +142 -140
- package/plugin/skills/ase-code-lint/SKILL.md +5 -5
- package/plugin/skills/ase-code-lint/help.md +23 -8
- package/plugin/skills/ase-help-skill/catalog.md +3 -0
- package/plugin/skills/ase-meta-review/help.md +1 -1
- package/plugin/skills/ase-spec-edit/SKILL.md +520 -0
- package/plugin/skills/ase-spec-edit/help.md +130 -0
- package/plugin/skills/ase-sync-export/SKILL.md +57 -116
- package/plugin/skills/ase-sync-export/help.md +30 -42
- package/plugin/skills/ase-sync-import/SKILL.md +37 -15
- package/plugin/skills/ase-sync-import/help.md +14 -10
- package/plugin/skills/ase-sync-reconcile/SKILL.md +37 -16
- package/plugin/skills/ase-sync-reconcile/help.md +19 -16
- package/plugin/skills/ase-task-grill/SKILL.md +120 -59
- package/plugin/skills/ase-task-grill/help.md +42 -12
- 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
|
|
153
|
-
|
|
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,
|
|
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.
|
package/plugin/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.
|
|
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.
|
|
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}
|
|
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
|
|
7
|
-
|
|
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.
|
|
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
|
-
|
|
151
|
+
4. Expand the following:
|
|
126
152
|
|
|
127
153
|
<expand name="todo-box" arg1="current state (after querying)"></expand>
|
|
128
154
|
|
|
129
|
-
|
|
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
|
-
-
|
|
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.
|
|
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.
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
<
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
3.
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
<
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
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
|
-
|
|
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
|
|
293
|
-
the answers gathered so far), and after item
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
346
|
-
|
|
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
|
-
|
|
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.
|
|
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="
|
|
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`...`
|
|
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`...`
|
|
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`...`
|
|
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
|
|
40
|
-
A02 COMPREHENSION
|
|
41
|
-
A03 CLEANLINESS
|
|
42
|
-
A04 SPELLING
|
|
43
|
-
A05 COMPLEXITY
|
|
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),
|