@rse/ase 0.9.51 → 0.9.52
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-task.js +7 -2
- package/package.json +7 -7
- 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/etc/stx.conf +2 -2
- package/plugin/meta/ase-common-dissect.md +110 -0
- package/plugin/meta/ase-common-task.md +5 -3
- package/plugin/meta/ase-control.md +53 -0
- package/plugin/meta/ase-format-task.md +6 -0
- package/plugin/meta/ase-skill.md +8 -8
- package/plugin/package.json +2 -2
- package/plugin/skills/ase-arch-analyze/SKILL.md +23 -12
- package/plugin/skills/ase-arch-analyze/help.md +16 -0
- package/plugin/skills/ase-arch-discover/SKILL.md +2 -2
- package/plugin/skills/ase-code-analyze/SKILL.md +27 -18
- package/plugin/skills/ase-code-analyze/help.md +15 -0
- package/plugin/skills/ase-code-craft/SKILL.md +2 -2
- package/plugin/skills/ase-code-dissect/SKILL.md +380 -0
- package/plugin/skills/ase-code-dissect/help.md +121 -0
- package/plugin/skills/ase-code-explain/SKILL.md +2 -2
- package/plugin/skills/ase-code-insight/SKILL.md +2 -2
- package/plugin/skills/ase-code-lint/SKILL.md +2 -2
- package/plugin/skills/ase-code-refactor/SKILL.md +2 -2
- package/plugin/skills/ase-code-resolve/SKILL.md +2 -2
- package/plugin/skills/ase-docs-distill/SKILL.md +2 -2
- package/plugin/skills/ase-docs-proofread/SKILL.md +2 -2
- package/plugin/skills/ase-help-intent/SKILL.md +2 -2
- package/plugin/skills/ase-help-skill/SKILL.md +2 -2
- package/plugin/skills/ase-help-skill/catalog.md +3 -0
- package/plugin/skills/ase-meta-brainstorm/SKILL.md +2 -2
- package/plugin/skills/ase-meta-changelog/SKILL.md +2 -2
- package/plugin/skills/ase-meta-chat/SKILL.md +2 -2
- package/plugin/skills/ase-meta-commit/SKILL.md +2 -2
- package/plugin/skills/ase-meta-config/SKILL.md +2 -2
- package/plugin/skills/ase-meta-diaboli/SKILL.md +2 -2
- package/plugin/skills/ase-meta-diff/SKILL.md +2 -2
- package/plugin/skills/ase-meta-eli5/SKILL.md +2 -2
- package/plugin/skills/ase-meta-evaluate/SKILL.md +2 -2
- package/plugin/skills/ase-meta-proximity/SKILL.md +2 -2
- package/plugin/skills/ase-meta-quorum/SKILL.md +2 -2
- package/plugin/skills/ase-meta-quotes/SKILL.md +2 -2
- package/plugin/skills/ase-meta-review/SKILL.md +2 -2
- package/plugin/skills/ase-meta-search/SKILL.md +2 -2
- package/plugin/skills/ase-meta-steelman/SKILL.md +2 -2
- package/plugin/skills/ase-meta-why/SKILL.md +2 -2
- package/plugin/skills/ase-meta-workflow/SKILL.md +378 -0
- package/plugin/skills/ase-meta-workflow/help.md +117 -0
- package/plugin/skills/ase-meta-workflow/sample.md +70 -0
- package/plugin/skills/ase-meta-workflow/workflow.txt +97 -0
- package/plugin/skills/ase-sync-export/SKILL.md +2 -2
- package/plugin/skills/ase-sync-import/SKILL.md +2 -2
- package/plugin/skills/ase-sync-reconcile/SKILL.md +2 -2
- package/plugin/skills/ase-task-condense/SKILL.md +26 -6
- package/plugin/skills/ase-task-delete/SKILL.md +2 -2
- package/plugin/skills/ase-task-dissect/SKILL.md +299 -0
- package/plugin/skills/ase-task-dissect/help.md +114 -0
- package/plugin/skills/ase-task-edit/SKILL.md +6 -4
- package/plugin/skills/ase-task-grill/SKILL.md +6 -4
- package/plugin/skills/ase-task-id/SKILL.md +2 -2
- package/plugin/skills/ase-task-implement/SKILL.md +2 -2
- package/plugin/skills/ase-task-list/SKILL.md +2 -2
- package/plugin/skills/ase-task-preflight/SKILL.md +2 -2
- package/plugin/skills/ase-task-reboot/SKILL.md +12 -6
- package/plugin/skills/ase-task-rename/SKILL.md +2 -2
- package/plugin/skills/ase-task-view/SKILL.md +2 -2
package/dst/ase-task.js
CHANGED
|
@@ -451,7 +451,8 @@ export class TaskMCP {
|
|
|
451
451
|
mcp.registerTool("ase_task_save", {
|
|
452
452
|
title: "ASE task save",
|
|
453
453
|
description: "Persist a task as `text` under `id`. " +
|
|
454
|
-
"Overwrites any existing task for the same `id`."
|
|
454
|
+
"Overwrites any existing task for the same `id`. " +
|
|
455
|
+
"Returns the persisted task as `text`, prepared for improved rendering.",
|
|
455
456
|
inputSchema: {
|
|
456
457
|
id: z.string()
|
|
457
458
|
.describe("task identifier (allowed characters: A-Z, a-z, 0-9, '_', '-')"),
|
|
@@ -461,8 +462,12 @@ export class TaskMCP {
|
|
|
461
462
|
}, async (args) => {
|
|
462
463
|
try {
|
|
463
464
|
Task.save(this.log, args.id, args.text);
|
|
465
|
+
/* return the prepared content, so a caller reusing the
|
|
466
|
+
just-saved plan instead of re-loading it still receives
|
|
467
|
+
the rendering-prepared variant */
|
|
468
|
+
const text = Markdown.prepare(args.text);
|
|
464
469
|
return {
|
|
465
|
-
content: [{ type: "text", text
|
|
470
|
+
content: [{ type: "text", text }]
|
|
466
471
|
};
|
|
467
472
|
}
|
|
468
473
|
catch (err) {
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"homepage": "https://ase.tools",
|
|
7
7
|
"repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
|
|
8
8
|
"bugs": { "url": "https://github.com/rse/ase/issues" },
|
|
9
|
-
"version": "0.9.
|
|
9
|
+
"version": "0.9.52",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "Dr. Ralf S. Engelschall",
|
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
"eslint-plugin-promise": "7.3.0",
|
|
24
24
|
"eslint-plugin-import": "2.32.0",
|
|
25
25
|
"neostandard": "0.13.0",
|
|
26
|
-
"globals": "17.
|
|
26
|
+
"globals": "17.8.0",
|
|
27
27
|
"typescript": "6.0.3",
|
|
28
28
|
|
|
29
29
|
"@rse/stx": "1.1.6",
|
|
30
30
|
"nodemon": "3.1.14",
|
|
31
31
|
"shx": "0.4.0",
|
|
32
32
|
|
|
33
|
-
"@types/node": "26.1.
|
|
33
|
+
"@types/node": "26.1.2",
|
|
34
34
|
"@types/luxon": "3.7.2",
|
|
35
35
|
"@types/which": "3.0.4",
|
|
36
36
|
"@types/update-notifier": "6.0.8",
|
|
@@ -42,18 +42,18 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"commander": "15.0.0",
|
|
45
|
-
"@dotenvx/dotenvx": "2.
|
|
45
|
+
"@dotenvx/dotenvx": "2.19.1",
|
|
46
46
|
"yaml": "2.9.0",
|
|
47
47
|
"valibot": "1.4.2",
|
|
48
|
-
"execa": "10.0.
|
|
48
|
+
"execa": "10.0.1",
|
|
49
49
|
"mkdirp": "3.0.1",
|
|
50
50
|
"@hapi/hapi": "21.4.10",
|
|
51
51
|
"beautiful-mermaid": "1.1.3",
|
|
52
52
|
"cli-table3": "0.6.5",
|
|
53
|
-
"chalk": "
|
|
53
|
+
"chalk": "6.0.0",
|
|
54
54
|
"pretty-ms": "9.3.0",
|
|
55
55
|
"luxon": "3.7.2",
|
|
56
|
-
"@modelcontextprotocol/sdk": "1.
|
|
56
|
+
"@modelcontextprotocol/sdk": "1.30.0",
|
|
57
57
|
"json-asty": "1.3.4",
|
|
58
58
|
"zod": "4.4.3",
|
|
59
59
|
"which": "7.0.0",
|
package/plugin/etc/stx.conf
CHANGED
|
@@ -12,9 +12,9 @@ lint
|
|
|
12
12
|
# [plugin] build project
|
|
13
13
|
build : lint
|
|
14
14
|
( for name in $(cd skills; ls -1 | grep -v ase-help-intent | sort); do
|
|
15
|
-
echo "<
|
|
15
|
+
echo "<purpose name=\"$name\">"
|
|
16
16
|
cat skills/$name/help.md | sed -e '/^## SEE ALSO/,$d'
|
|
17
|
-
echo "</
|
|
17
|
+
echo "</purpose>"
|
|
18
18
|
done
|
|
19
19
|
) >skills/ase-help-intent/data.md
|
|
20
20
|
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
|
|
2
|
+
Dissect Skill Common Steps
|
|
3
|
+
==========================
|
|
4
|
+
|
|
5
|
+
<define name="dissect-derive">
|
|
6
|
+
|
|
7
|
+
*Dissect* <content/> into *cohesive parts* by strictly honoring the
|
|
8
|
+
following ruleset:
|
|
9
|
+
|
|
10
|
+
1. *Separate domain-wise and logically*: every part *MUST* be a
|
|
11
|
+
*self-contained* unit of work with a *single*, coherent purpose (one
|
|
12
|
+
domain, one concern, one logical change), so it can be implemented,
|
|
13
|
+
reviewed, and committed entirely *on its own*. A *technical* split
|
|
14
|
+
-- one part per file, per directory, per file type, or per technical
|
|
15
|
+
layer -- is usually *not* the obvious and intended one: files are
|
|
16
|
+
merely *where* the change lands, while a part is defined by *what*
|
|
17
|
+
it achieves. Cut along the *semantics* first, and let a file-wise
|
|
18
|
+
boundary result only when it *coincides* with a domain boundary.
|
|
19
|
+
|
|
20
|
+
2. *Bound the part count*: derive at least *2* and at most
|
|
21
|
+
*<getopt-option-max-parts/>* parts. Prefer *fewer* and *larger*
|
|
22
|
+
cohesive parts over *many* and *tiny* ones.
|
|
23
|
+
|
|
24
|
+
3. *Assign totally and disjointly*: *every* input element of the epic
|
|
25
|
+
*MUST* be assigned to *exactly one* part -- no input element is
|
|
26
|
+
dropped, and no input element occurs in two parts. An input element
|
|
27
|
+
which itself spans *multiple* domains or concerns *MAY* be *split*
|
|
28
|
+
into two or more *sub-elements*, which are then assigned like
|
|
29
|
+
ordinary input elements, provided the sub-elements *together* cover
|
|
30
|
+
the original element *completely*, *never* overlap, and each one
|
|
31
|
+
stays *self-contained* in the input form the calling skill defines.
|
|
32
|
+
Split *only* when rule 1 forces it: an input element whose content
|
|
33
|
+
fits a *single* part stays *unsplit*.
|
|
34
|
+
|
|
35
|
+
4. *Keep mutually dependent elements together*: input elements which
|
|
36
|
+
only make sense *together* -- they reference each other, one is the
|
|
37
|
+
precondition of the other, or splitting them would leave a part
|
|
38
|
+
broken -- *MUST* land in the *same* part.
|
|
39
|
+
|
|
40
|
+
5. *Never invent*: parts are formed *exclusively* from the input
|
|
41
|
+
elements of the epic. Do *not* add scope, do *not* re-interpret the
|
|
42
|
+
input elements, and do *not* re-word them beyond what a part-local
|
|
43
|
+
summary requires.
|
|
44
|
+
|
|
45
|
+
6. *Slug and identify every part*: per part derive a <feature-slug/>
|
|
46
|
+
from its scope, matching the regexp `^[a-z][a-z0-9-]{0,23}$` and
|
|
47
|
+
*unique* across all parts, and then set
|
|
48
|
+
<part-id><arg3/>-<feature-slug/></part-id>, where <arg3/> is the
|
|
49
|
+
*id prefix* the calling skill passed in.
|
|
50
|
+
|
|
51
|
+
7. *Order for implementation*: order the parts so that a part *never*
|
|
52
|
+
depends on a later one, and number them consecutively as <part-no/>,
|
|
53
|
+
starting at `1`.
|
|
54
|
+
|
|
55
|
+
8. *Honor the dissection hint*:
|
|
56
|
+
<if condition="<arg2/> is not empty">
|
|
57
|
+
Set <hint><arg2/></hint>. The user explicitly told *how* the epic
|
|
58
|
+
should be split -- e.g. which input elements belong together, along
|
|
59
|
+
which axis to cut, or how many parts to aim at -- so you *MUST*
|
|
60
|
+
follow this <hint/> as closely as possible and let it *override* the
|
|
61
|
+
default grouping of rule 1. It *MUST NOT* override the rules 2-7,
|
|
62
|
+
though: the part count stays bounded, the assignment stays total and
|
|
63
|
+
disjoint, mutually dependent elements stay together, nothing is
|
|
64
|
+
invented, every part stays uniquely slugged, and the order stays
|
|
65
|
+
dependency-free. If the <hint/> conflicts with one of these rules,
|
|
66
|
+
honor the rule and follow the <hint/> only as far as the rule
|
|
67
|
+
permits.
|
|
68
|
+
</if>
|
|
69
|
+
<else>
|
|
70
|
+
No dissection hint was given, so the grouping follows the rules 1-7
|
|
71
|
+
alone. Do not output anything.
|
|
72
|
+
</else>
|
|
73
|
+
|
|
74
|
+
Per part, additionally derive an *ultra brief* <scope/> (*what* the part
|
|
75
|
+
covers) and an *ultra brief* <rationale/> (*why* exactly these input
|
|
76
|
+
elements form *one* cohesive part). Store the resulting parts in
|
|
77
|
+
<parts/> and their number in <n/>.
|
|
78
|
+
|
|
79
|
+
<if condition="fewer than 2 cohesive parts exist">
|
|
80
|
+
The epic is *not* dissectable, because it carries a *single* cohesive
|
|
81
|
+
purpose (or too few input elements) and splitting it would only produce
|
|
82
|
+
artificial fragments. Only output the following <template/> and then
|
|
83
|
+
immediately *STOP* processing the entire current skill:
|
|
84
|
+
|
|
85
|
+
<template>
|
|
86
|
+
⧉ **ASE**: ✪ skill: **<arg1/>**, ▶ status: **epic not dissectable**
|
|
87
|
+
</template>
|
|
88
|
+
</if>
|
|
89
|
+
|
|
90
|
+
</define>
|
|
91
|
+
|
|
92
|
+
<define name="dissect-report">
|
|
93
|
+
|
|
94
|
+
Report the derived <parts/> with the following <template/>, emitting
|
|
95
|
+
*one* table row per part in <parts/>, in their derived order. Keep
|
|
96
|
+
<scope/> and <rationale/> each to *one* ultra brief sentence, align all
|
|
97
|
+
column edges of the table, and do *not* output any further explanation:
|
|
98
|
+
|
|
99
|
+
<template>
|
|
100
|
+
<ase-tpl-head title="DISSECTION" subtitle="<arg1/>">
|
|
101
|
+
|
|
102
|
+
| Part | Id | Scope | Rationale |
|
|
103
|
+
| --------------- | ------------ | -------- | ------------ |
|
|
104
|
+
| **P<part-no/>** | `<part-id/>` | <scope/> | <rationale/> |
|
|
105
|
+
| [...] | [...] | [...] | [...] |
|
|
106
|
+
|
|
107
|
+
<ase-tpl-foot title="DISSECTION" subtitle="<arg1/>">
|
|
108
|
+
</template>
|
|
109
|
+
|
|
110
|
+
</define>
|
|
@@ -65,9 +65,11 @@ Task Skill Common Steps
|
|
|
65
65
|
*and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call
|
|
66
66
|
exists earlier in the current session
|
|
67
67
|
">
|
|
68
|
-
Set <text/> to the `text`
|
|
69
|
-
`ase_task_save(id: '<ase-task-id/>', ...)` tool call
|
|
70
|
-
|
|
68
|
+
Set <text/> to the `text` *output* field of the most recent
|
|
69
|
+
`ase_task_save(id: '<ase-task-id/>', ...)` tool call -- this is
|
|
70
|
+
the rendering-prepared plan content and *MUST NOT* be confused
|
|
71
|
+
with the `text` *argument* passed into that call -- *without*
|
|
72
|
+
calling `ase_task_load` again. Set <status>plan
|
|
71
73
|
reused</status>. Do not output anything.
|
|
72
74
|
</if>
|
|
73
75
|
<else>
|
|
@@ -95,3 +95,56 @@ Control Flow Constructs
|
|
|
95
95
|
is finished and no further repetitions are performed. This construct
|
|
96
96
|
is expanded into nothing. Do not output anything.
|
|
97
97
|
|
|
98
|
+
- *IMPORTANT*: You *MUST* honor the following control flow construct:
|
|
99
|
+
<agent <attr/>="<value/>" [...]><agent-body/></agent>:
|
|
100
|
+
|
|
101
|
+
This specifies the *invocation* of a *sub-agent* through the
|
|
102
|
+
`Agent` tool. Every XML attribute is passed *verbatim* as the
|
|
103
|
+
identically named parameter of the `Agent` tool (e.g. `description`,
|
|
104
|
+
`subagent_type`, `run_in_background`, `isolation`, `model`), and
|
|
105
|
+
<agent-body/> is passed as its `prompt` parameter.
|
|
106
|
+
|
|
107
|
+
The *sole exception* is the *reserved* attribute `result="<var/>"`,
|
|
108
|
+
which is *not* passed on but instead *binds* the result returned
|
|
109
|
+
by the sub-agent to the placeholder `<<var/>/>`. This construct is
|
|
110
|
+
expanded to the result returned by the sub-agent if `result` is
|
|
111
|
+
*absent*, or into nothing if `result` is *present*. Do not output
|
|
112
|
+
anything else.
|
|
113
|
+
|
|
114
|
+
- *IMPORTANT*: You *MUST* honor the following control flow construct:
|
|
115
|
+
<agent-consolidation [group=<agent-group/>]/>
|
|
116
|
+
|
|
117
|
+
This specifies the merging of all the Git WorkTrees created by the
|
|
118
|
+
<agent/> calls with either are identified with the unique group
|
|
119
|
+
<agent-group/> or all <agent/> calls in the last <parallel/> section
|
|
120
|
+
of the context. After merging a single Git WorkTree, remove the Git
|
|
121
|
+
WorkTree.
|
|
122
|
+
|
|
123
|
+
- *IMPORTANT*: You *MUST* honor the following control flow construct:
|
|
124
|
+
<skill name="<id/>" [args="<args/>"] [result="<var/>"]/>:
|
|
125
|
+
|
|
126
|
+
This specifies the *invocation* of another *skill* through the
|
|
127
|
+
`Skill` tool, with its `skill` parameter set to <id/> and its `args`
|
|
128
|
+
parameter set to <args/> (or to the empty string if the `args`
|
|
129
|
+
attribute is absent).
|
|
130
|
+
|
|
131
|
+
The *reserved* attribute `result="<var/>"` *binds* the result
|
|
132
|
+
returned by the skill to the placeholder `<<var/>/>`, exactly
|
|
133
|
+
as for <agent/>. This construct is *always* *self-closing*: a
|
|
134
|
+
*body-bearing* `<skill>` element is *never* an invocation. This
|
|
135
|
+
construct is expanded to the result returned by the skill if
|
|
136
|
+
`result` is *absent*, or into nothing if `result` is *present*. Do
|
|
137
|
+
not output anything else.
|
|
138
|
+
|
|
139
|
+
- *IMPORTANT*: You *MUST* honor the following control flow construct:
|
|
140
|
+
<parallel><parallel-body/></parallel>:
|
|
141
|
+
|
|
142
|
+
This specifies a <parallel-body/> whose <agent/> and <skill/>
|
|
143
|
+
invocations are *all* dispatched *concurrently*: you *MUST* emit
|
|
144
|
+
them *in one single message* instead of one per turn, and this
|
|
145
|
+
construct is finished only once *all* of them have returned. If two
|
|
146
|
+
or more of these invocations bind the *same* `result` name, the
|
|
147
|
+
corresponding placeholder carries an *array* of their results, in
|
|
148
|
+
the order of their occurrence in <parallel-body/>. This construct is
|
|
149
|
+
expanded to its <parallel-body/>. Do not output anything else.
|
|
150
|
+
|
|
@@ -70,3 +70,9 @@ You *MUST* honor the following hints on this *task* format:
|
|
|
70
70
|
after about 100 characters per line for better subsequent
|
|
71
71
|
manual editing.
|
|
72
72
|
|
|
73
|
+
- You *MUST* *NEVER* break a line *inside* an inline code span
|
|
74
|
+
<template>`<code/>`</template>, as a code span split across two
|
|
75
|
+
lines renders badly. Instead, break the line *before* its opening
|
|
76
|
+
backtick or *after* its closing backtick, even if this means
|
|
77
|
+
breaking the line noticeably earlier than after 100 characters.
|
|
78
|
+
|
package/plugin/meta/ase-skill.md
CHANGED
|
@@ -209,18 +209,18 @@ MCP Tool Calls
|
|
|
209
209
|
Skill Identification
|
|
210
210
|
--------------------
|
|
211
211
|
|
|
212
|
-
- *IMPORTANT*: Set <
|
|
212
|
+
- *IMPORTANT*: Set <purpose></purpose> (set to empty)
|
|
213
213
|
and <skill-name></skill-name> (set name to empty).
|
|
214
214
|
|
|
215
|
-
In case <
|
|
216
|
-
name="<name/>"><body/></
|
|
217
|
-
(set skill name to name), and then
|
|
218
|
-
to `-h` or `--help`) *AND*
|
|
219
|
-
or `verbose`))) you *MUST*
|
|
220
|
-
<template/>:
|
|
215
|
+
In case <purpose/> later becomes *not* empty by defining it as
|
|
216
|
+
<purpose name="<name/>"><body/></purpose>, set
|
|
217
|
+
<skill-name><name/></skill-name> (set skill name to name), and then
|
|
218
|
+
(but only if ((`$1` is *NOT* equal to `-h` or `--help`) *AND*
|
|
219
|
+
(<ase-guidance-level/> is equal to `normal` or `verbose`))) you *MUST*
|
|
220
|
+
once output the following output <template/>:
|
|
221
221
|
|
|
222
222
|
<template>
|
|
223
|
-
⧉ **ASE**: ✪ skill: **<skill-name/>**, ✦ purpose: **<
|
|
223
|
+
⧉ **ASE**: ✪ skill: **<skill-name/>**, ✦ purpose: **<purpose/>**, ▶ status: **skill started**
|
|
224
224
|
</template>
|
|
225
225
|
|
|
226
226
|
Later (but only if ((`$1` is *NOT* equal to `-h` or `--help`) *AND*
|
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.52",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "Dr. Ralf S. Engelschall",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"@rse/stx": "1.1.6",
|
|
18
18
|
"markdownlint": "0.41.1",
|
|
19
|
-
"markdownlint-cli2": "0.23.
|
|
19
|
+
"markdownlint-cli2": "0.23.2",
|
|
20
20
|
"eslint": "10.8.0",
|
|
21
21
|
"@eslint/markdown": "8.0.3",
|
|
22
22
|
"eslint-markdown": "0.12.1"
|
|
@@ -102,11 +102,13 @@ allowed-tools:
|
|
|
102
102
|
@${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
|
|
103
103
|
@${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
|
|
104
104
|
|
|
105
|
-
<
|
|
105
|
+
<purpose name="ase-arch-analyze">
|
|
106
106
|
Review Software Architecture
|
|
107
|
-
</
|
|
107
|
+
</purpose>
|
|
108
108
|
|
|
109
|
-
<expand name="getopt"
|
|
109
|
+
<expand name="getopt"
|
|
110
|
+
arg1="ase-arch-analyze"
|
|
111
|
+
arg2="--prefix|-P=">
|
|
110
112
|
$ARGUMENTS
|
|
111
113
|
</expand>
|
|
112
114
|
|
|
@@ -343,6 +345,14 @@ interface quality, quality attributes, and architecture governance.
|
|
|
343
345
|
</step>
|
|
344
346
|
|
|
345
347
|
3. <step id="STEP 3: Reconcile and Show Results">
|
|
348
|
+
Before reporting, determine the *finding id prefix* <id-prefix/>:
|
|
349
|
+
set <id-prefix><getopt-option-prefix/>-</id-prefix> if
|
|
350
|
+
<getopt-option-prefix/> is *not* empty, and set <id-prefix></id-prefix>
|
|
351
|
+
(set to empty) otherwise. Every reported `PROBLEM` and `TRADEOFF` id
|
|
352
|
+
and every persisted key below carries this <id-prefix/>, so that
|
|
353
|
+
analyses run under *distinct* prefixes occupy *distinct* id
|
|
354
|
+
namespaces and hence do not overwrite each other.
|
|
355
|
+
|
|
346
356
|
Before reporting, classify every finding into one of three
|
|
347
357
|
categories:
|
|
348
358
|
|
|
@@ -378,7 +388,7 @@ interface quality, quality attributes, and architecture governance.
|
|
|
378
388
|
Report each unpaired finding with the following <template/>:
|
|
379
389
|
|
|
380
390
|
<template>
|
|
381
|
-
<ase-tpl-bullet-signal/> **PROBLEM** P<n/> (Severity: <severity/>, Aspect: <aspect-id/>): **<title/>**
|
|
391
|
+
<ase-tpl-bullet-signal/> **PROBLEM** <id-prefix/>P<n/> (Severity: <severity/>, Aspect: <aspect-id/>): **<title/>**
|
|
382
392
|
|
|
383
393
|
<description/>
|
|
384
394
|
</template>
|
|
@@ -386,7 +396,7 @@ interface quality, quality attributes, and architecture governance.
|
|
|
386
396
|
Report each paired or clustered finding with the following <template/>:
|
|
387
397
|
|
|
388
398
|
<template>
|
|
389
|
-
<ase-tpl-bullet-normal/> **TRADEOFF** T<n/> (Severity: <severity/>): **<title/>**
|
|
399
|
+
<ase-tpl-bullet-normal/> **TRADEOFF** <id-prefix/>T<n/> (Severity: <severity/>): **<title/>**
|
|
390
400
|
|
|
391
401
|
- *Focal aspect*: <focal-aspect/> - <focal-state/>
|
|
392
402
|
- *In tension with*: <partner-list/>
|
|
@@ -458,12 +468,13 @@ interface quality, quality attributes, and architecture governance.
|
|
|
458
468
|
- *Additionally*, persist all reported findings in a *single*
|
|
459
469
|
`ase_kv_batch` call to the `ase` MCP server with `transactional`
|
|
460
470
|
set to `true`. The `commands` parameter array of this call
|
|
461
|
-
starts with one `{ command: "clear", prefix: "ase-issue-" }`
|
|
462
|
-
entry (which removes only the previously persisted
|
|
463
|
-
keys, leaving any unrelated keys in the
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
471
|
+
starts with one `{ command: "clear", prefix: "ase-issue-<id-prefix/>" }`
|
|
472
|
+
entry (which removes only the previously persisted
|
|
473
|
+
`ase-issue-<id-prefix/>*` keys, leaving any unrelated keys in the
|
|
474
|
+
shared store intact),
|
|
475
|
+
followed by one `{ command: "set", key: "ase-issue-<id-prefix/>P<n/>",
|
|
476
|
+
val: "<title/>: <description/>" }` entry per reported PROBLEM and one
|
|
477
|
+
`{ command: "set", key: "ase-issue-<id-prefix/>T<n/>", val: "<title/>:
|
|
467
478
|
<description/>" }` entry per reported TRADEOFF.
|
|
468
479
|
|
|
469
480
|
Finally, give a final hint by expanding the following (which,
|
|
@@ -471,7 +482,7 @@ interface quality, quality attributes, and architecture governance.
|
|
|
471
482
|
nothing and hence emit no output at all):
|
|
472
483
|
|
|
473
484
|
<ase-tpl-hint level="minimal">
|
|
474
|
-
For deeper analysis, suggestions on solution approaches and then final source code changes, use `/ase-code-resolve P{n}` or `/ase-code-resolve 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}` in the same or even a different session.
|
|
475
486
|
</ase-tpl-hint>
|
|
476
487
|
|
|
477
488
|
</step>
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
`ase-arch-analyze`
|
|
9
9
|
[`--help`|`-h`]
|
|
10
|
+
[`--prefix`|`-P` *prefix*]
|
|
10
11
|
*source-reference*
|
|
11
12
|
|
|
12
13
|
## DESCRIPTION
|
|
@@ -24,6 +25,15 @@ governance, and package cohesion), renders a high-level architecture
|
|
|
24
25
|
diagram, and reports findings as either `PROBLEM` or `TRADEOFF` entries
|
|
25
26
|
based on a built-in tension matrix.
|
|
26
27
|
|
|
28
|
+
The `--prefix`|`-P` *prefix* option prefixes every reported finding id
|
|
29
|
+
with *prefix* and a hyphen, so `P1` becomes `<prefix>-P1` and `T1`
|
|
30
|
+
becomes `<prefix>-T1`, with the persisted keys becoming
|
|
31
|
+
`ase-issue-<prefix>-P1` and `ase-issue-<prefix>-T1` accordingly. The
|
|
32
|
+
purge of stale results is narrowed to the same namespace, so analyses
|
|
33
|
+
run under *distinct* prefixes coexist instead of overwriting each other.
|
|
34
|
+
Without the option (the default), ids stay unprefixed and the purge
|
|
35
|
+
covers the *entire* `ase-issue-*` space, including any prefixed results.
|
|
36
|
+
|
|
27
37
|
## ARGUMENTS
|
|
28
38
|
|
|
29
39
|
*source-reference*:
|
|
@@ -44,6 +54,12 @@ Analyze a specific module:
|
|
|
44
54
|
❯ /ase-arch-analyze src/core
|
|
45
55
|
```
|
|
46
56
|
|
|
57
|
+
Analyze a module under an own id namespace, yielding `core-P1`, `core-T1`, ...:
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
❯ /ase-arch-analyze --prefix core src/core
|
|
61
|
+
```
|
|
62
|
+
|
|
47
63
|
## SEE ALSO
|
|
48
64
|
|
|
49
65
|
[`ase-arch-discover`](../ase-arch-discover/help.md), [`ase-code-analyze`](../ase-code-analyze/help.md), [`ase-code-resolve`](../ase-code-resolve/help.md),
|
|
@@ -19,9 +19,9 @@ allowed-tools:
|
|
|
19
19
|
@${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
|
|
20
20
|
@${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
|
|
21
21
|
|
|
22
|
-
<
|
|
22
|
+
<purpose name="ase-arch-discover">
|
|
23
23
|
Discover Components
|
|
24
|
-
</
|
|
24
|
+
</purpose>
|
|
25
25
|
|
|
26
26
|
<expand name="getopt"
|
|
27
27
|
arg1="ase-arch-discover"
|
|
@@ -17,13 +17,13 @@ allowed-tools:
|
|
|
17
17
|
@${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
|
|
18
18
|
@${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
|
|
19
19
|
|
|
20
|
-
<
|
|
20
|
+
<purpose name="ase-code-analyze">
|
|
21
21
|
Analyze Source Code
|
|
22
|
-
</
|
|
22
|
+
</purpose>
|
|
23
23
|
|
|
24
24
|
<expand name="getopt"
|
|
25
25
|
arg1="ase-code-analyze"
|
|
26
|
-
arg2="--performance|-p --security|-s --severity|-S=(LOW|MEDIUM|HIGH)">
|
|
26
|
+
arg2="--performance|-p --security|-s --severity|-S=(LOW|MEDIUM|HIGH) --prefix|-P=">
|
|
27
27
|
$ARGUMENTS
|
|
28
28
|
</expand>
|
|
29
29
|
|
|
@@ -123,6 +123,14 @@ problems in *performance* and *efficiency*, or problems in *security*.
|
|
|
123
123
|
|
|
124
124
|
3. <step id="STEP 3: Show Results">
|
|
125
125
|
|
|
126
|
+
Before reporting, determine the *problem id prefix* <id-prefix/>:
|
|
127
|
+
set <id-prefix><getopt-option-prefix/>-</id-prefix> if
|
|
128
|
+
<getopt-option-prefix/> is *not* empty, and set <id-prefix></id-prefix>
|
|
129
|
+
(set to empty) otherwise. Every reported problem id and every
|
|
130
|
+
persisted key below carries this <id-prefix/>, so that analyses run
|
|
131
|
+
under *distinct* prefixes occupy *distinct* id namespaces and hence
|
|
132
|
+
do not overwrite each other.
|
|
133
|
+
|
|
126
134
|
Before reporting, determine the *effective severity floor* <floor/>:
|
|
127
135
|
define the ordinal rank `LOW`=1, `MEDIUM`=2, `HIGH`=3, start from
|
|
128
136
|
<floor><getopt-option-severity/></floor> (default `LOW`), and - if
|
|
@@ -143,15 +151,15 @@ problems in *performance* and *efficiency*, or problems in *security*.
|
|
|
143
151
|
problem. Within the same severity, keep the `file`/`line` order
|
|
144
152
|
established in STEP 2.
|
|
145
153
|
|
|
146
|
-
Then renumber the surviving problems contiguously as
|
|
147
|
-
<n/> = 1, 2, ... in that sorted ordering, so
|
|
148
|
-
problem and the persisted `ase-issue-P<n/>`
|
|
149
|
-
sequence. If *all* problems are dropped, skip
|
|
150
|
-
but still purge any stale
|
|
154
|
+
Then renumber the surviving problems contiguously as `<id-prefix/>P<n/>`
|
|
155
|
+
with <n/> = 1, 2, ... in that sorted ordering, so `<id-prefix/>P1` is
|
|
156
|
+
the most severe problem and the persisted `ase-issue-<id-prefix/>P<n/>`
|
|
157
|
+
keys follow the reported sequence. If *all* problems are dropped, skip
|
|
158
|
+
the per-problem report but still purge any stale
|
|
151
159
|
persisted problems with a *single* `ase_kv_batch` call to the `ase`
|
|
152
160
|
MCP server with `transactional` set to `true` and a `commands`
|
|
153
161
|
parameter array holding exactly one `{ command: "clear", prefix:
|
|
154
|
-
"ase-issue-" }` entry,
|
|
162
|
+
"ase-issue-<id-prefix/>" }` entry,
|
|
155
163
|
and still emit the final hint <template/> below.
|
|
156
164
|
|
|
157
165
|
In this STEP 3, for *EVERY* surviving problem in <problems/>, set
|
|
@@ -165,7 +173,7 @@ problems in *performance* and *efficiency*, or problems in *security*.
|
|
|
165
173
|
|
|
166
174
|
<template>
|
|
167
175
|
|
|
168
|
-
<ase-tpl-bullet-signal/> **PROBLEM** (Severity: **<severity/>**):
|
|
176
|
+
<ase-tpl-bullet-signal/> **PROBLEM** (Severity: **<severity/>**): **<id-prefix/>P<n/>**: **<title/>**
|
|
169
177
|
|
|
170
178
|
<description/>
|
|
171
179
|
|
|
@@ -180,7 +188,7 @@ problems in *performance* and *efficiency*, or problems in *security*.
|
|
|
180
188
|
|
|
181
189
|
<template>
|
|
182
190
|
|
|
183
|
-
<ase-tpl-bullet-signal/> **PROBLEM** (Severity: **<severity/>**):
|
|
191
|
+
<ase-tpl-bullet-signal/> **PROBLEM** (Severity: **<severity/>**): **<id-prefix/>P<n/>**: **<title/>**
|
|
184
192
|
|
|
185
193
|
<description/>
|
|
186
194
|
|
|
@@ -193,23 +201,24 @@ problems in *performance* and *efficiency*, or problems in *security*.
|
|
|
193
201
|
- For the final results, do *not* output anything else, especially do
|
|
194
202
|
*not* give any further explanations or information.
|
|
195
203
|
|
|
196
|
-
- Uniquely identify the problems with
|
|
204
|
+
- Uniquely identify the problems with `<id-prefix/>P<n/>` where <n/> is 1, 2, ...
|
|
197
205
|
|
|
198
206
|
- *Additionally*, persist all reported problems in a *single*
|
|
199
207
|
`ase_kv_batch` call to the `ase` MCP server with `transactional`
|
|
200
208
|
set to `true`. The `commands` parameter array of this call
|
|
201
|
-
starts with one `{ command: "clear", prefix: "ase-issue-" }`
|
|
202
|
-
entry (which removes only the previously persisted
|
|
203
|
-
keys, leaving any unrelated keys in the
|
|
204
|
-
|
|
205
|
-
|
|
209
|
+
starts with one `{ command: "clear", prefix: "ase-issue-<id-prefix/>" }`
|
|
210
|
+
entry (which removes only the previously persisted
|
|
211
|
+
`ase-issue-<id-prefix/>*` keys, leaving any unrelated keys in the
|
|
212
|
+
shared store intact),
|
|
213
|
+
followed by one `{ command: "set", key: "ase-issue-<id-prefix/>P<n/>",
|
|
214
|
+
val: "<title/>: <description/>" }` entry per reported problem.
|
|
206
215
|
|
|
207
216
|
Finally, give a final hint by expanding the following (which,
|
|
208
217
|
depending on the configured <ase-guidance-level/>, may expand into
|
|
209
218
|
nothing and hence emit no output at all):
|
|
210
219
|
|
|
211
220
|
<ase-tpl-hint level="minimal">
|
|
212
|
-
For deeper analysis, suggestions on solution approaches and then final problem resolution, use `/ase-code-resolve 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}` in the same or even a different session.
|
|
213
222
|
</ase-tpl-hint>
|
|
214
223
|
|
|
215
224
|
You *MUST* not output anything else in this STEP 3,
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
[`--performance`|`-p`]
|
|
11
11
|
[`--security`|`-s`]
|
|
12
12
|
[`--severity`|`-S`=(`LOW`|`MEDIUM`|`HIGH`)]
|
|
13
|
+
[`--prefix`|`-P` *prefix*]
|
|
13
14
|
*source-reference*
|
|
14
15
|
|
|
15
16
|
## DESCRIPTION
|
|
@@ -38,6 +39,14 @@ severity* order `HIGH`, `MEDIUM`, `LOW`, `ACCEPTED` - keeping the
|
|
|
38
39
|
`file`/`line` order within the same severity - and are renumbered
|
|
39
40
|
contiguously as `P<n>`, so `P1` is the most severe problem.
|
|
40
41
|
|
|
42
|
+
The `--prefix`|`-P` *prefix* option prefixes every reported problem id
|
|
43
|
+
with *prefix* and a hyphen, so `P1` becomes `<prefix>-P1` and its
|
|
44
|
+
persisted key becomes `ase-issue-<prefix>-P1`. The purge of stale
|
|
45
|
+
results is narrowed to the same namespace accordingly, so analyses run
|
|
46
|
+
under *distinct* prefixes coexist instead of overwriting each other.
|
|
47
|
+
Without the option (the default), ids stay unprefixed and the purge
|
|
48
|
+
covers the *entire* `ase-issue-*` space, including any prefixed results.
|
|
49
|
+
|
|
41
50
|
The skill investigates the code base silently, reports each detected
|
|
42
51
|
problem as a `PROBLEM` entry with severity (`LOW`, `MEDIUM`, `HIGH`) and
|
|
43
52
|
inline file/line references (in the performance lens, each entry
|
|
@@ -83,6 +92,12 @@ Analyze a directory, reporting only `MEDIUM` and `HIGH` problems:
|
|
|
83
92
|
❯ /ase-code-analyze -S MEDIUM src/handlers/
|
|
84
93
|
```
|
|
85
94
|
|
|
95
|
+
Analyze a directory under an own id namespace, yielding `auth-P1`, `auth-P2`, ...:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
❯ /ase-code-analyze --prefix auth src/auth/
|
|
99
|
+
```
|
|
100
|
+
|
|
86
101
|
## SEE ALSO
|
|
87
102
|
|
|
88
103
|
[`ase-code-resolve`](../ase-code-resolve/help.md), [`ase-code-refactor`](../ase-code-refactor/help.md), [`ase-code-lint`](../ase-code-lint/help.md),
|
|
@@ -17,9 +17,9 @@ allowed-tools:
|
|
|
17
17
|
@${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
|
|
18
18
|
@${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
|
|
19
19
|
|
|
20
|
-
<
|
|
20
|
+
<purpose name="ase-code-craft">
|
|
21
21
|
Craft Source Code
|
|
22
|
-
</
|
|
22
|
+
</purpose>
|
|
23
23
|
|
|
24
24
|
<expand name="getopt"
|
|
25
25
|
arg1="ase-code-craft"
|