@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.
Files changed (66) hide show
  1. package/dst/ase-task.js +7 -2
  2. package/package.json +7 -7
  3. package/plugin/.claude-plugin/plugin.json +1 -1
  4. package/plugin/.codex-plugin/plugin.json +1 -1
  5. package/plugin/.github/plugin/plugin.json +1 -1
  6. package/plugin/etc/stx.conf +2 -2
  7. package/plugin/meta/ase-common-dissect.md +110 -0
  8. package/plugin/meta/ase-common-task.md +5 -3
  9. package/plugin/meta/ase-control.md +53 -0
  10. package/plugin/meta/ase-format-task.md +6 -0
  11. package/plugin/meta/ase-skill.md +8 -8
  12. package/plugin/package.json +2 -2
  13. package/plugin/skills/ase-arch-analyze/SKILL.md +23 -12
  14. package/plugin/skills/ase-arch-analyze/help.md +16 -0
  15. package/plugin/skills/ase-arch-discover/SKILL.md +2 -2
  16. package/plugin/skills/ase-code-analyze/SKILL.md +27 -18
  17. package/plugin/skills/ase-code-analyze/help.md +15 -0
  18. package/plugin/skills/ase-code-craft/SKILL.md +2 -2
  19. package/plugin/skills/ase-code-dissect/SKILL.md +380 -0
  20. package/plugin/skills/ase-code-dissect/help.md +121 -0
  21. package/plugin/skills/ase-code-explain/SKILL.md +2 -2
  22. package/plugin/skills/ase-code-insight/SKILL.md +2 -2
  23. package/plugin/skills/ase-code-lint/SKILL.md +2 -2
  24. package/plugin/skills/ase-code-refactor/SKILL.md +2 -2
  25. package/plugin/skills/ase-code-resolve/SKILL.md +2 -2
  26. package/plugin/skills/ase-docs-distill/SKILL.md +2 -2
  27. package/plugin/skills/ase-docs-proofread/SKILL.md +2 -2
  28. package/plugin/skills/ase-help-intent/SKILL.md +2 -2
  29. package/plugin/skills/ase-help-skill/SKILL.md +2 -2
  30. package/plugin/skills/ase-help-skill/catalog.md +3 -0
  31. package/plugin/skills/ase-meta-brainstorm/SKILL.md +2 -2
  32. package/plugin/skills/ase-meta-changelog/SKILL.md +2 -2
  33. package/plugin/skills/ase-meta-chat/SKILL.md +2 -2
  34. package/plugin/skills/ase-meta-commit/SKILL.md +2 -2
  35. package/plugin/skills/ase-meta-config/SKILL.md +2 -2
  36. package/plugin/skills/ase-meta-diaboli/SKILL.md +2 -2
  37. package/plugin/skills/ase-meta-diff/SKILL.md +2 -2
  38. package/plugin/skills/ase-meta-eli5/SKILL.md +2 -2
  39. package/plugin/skills/ase-meta-evaluate/SKILL.md +2 -2
  40. package/plugin/skills/ase-meta-proximity/SKILL.md +2 -2
  41. package/plugin/skills/ase-meta-quorum/SKILL.md +2 -2
  42. package/plugin/skills/ase-meta-quotes/SKILL.md +2 -2
  43. package/plugin/skills/ase-meta-review/SKILL.md +2 -2
  44. package/plugin/skills/ase-meta-search/SKILL.md +2 -2
  45. package/plugin/skills/ase-meta-steelman/SKILL.md +2 -2
  46. package/plugin/skills/ase-meta-why/SKILL.md +2 -2
  47. package/plugin/skills/ase-meta-workflow/SKILL.md +378 -0
  48. package/plugin/skills/ase-meta-workflow/help.md +117 -0
  49. package/plugin/skills/ase-meta-workflow/sample.md +70 -0
  50. package/plugin/skills/ase-meta-workflow/workflow.txt +97 -0
  51. package/plugin/skills/ase-sync-export/SKILL.md +2 -2
  52. package/plugin/skills/ase-sync-import/SKILL.md +2 -2
  53. package/plugin/skills/ase-sync-reconcile/SKILL.md +2 -2
  54. package/plugin/skills/ase-task-condense/SKILL.md +26 -6
  55. package/plugin/skills/ase-task-delete/SKILL.md +2 -2
  56. package/plugin/skills/ase-task-dissect/SKILL.md +299 -0
  57. package/plugin/skills/ase-task-dissect/help.md +114 -0
  58. package/plugin/skills/ase-task-edit/SKILL.md +6 -4
  59. package/plugin/skills/ase-task-grill/SKILL.md +6 -4
  60. package/plugin/skills/ase-task-id/SKILL.md +2 -2
  61. package/plugin/skills/ase-task-implement/SKILL.md +2 -2
  62. package/plugin/skills/ase-task-list/SKILL.md +2 -2
  63. package/plugin/skills/ase-task-preflight/SKILL.md +2 -2
  64. package/plugin/skills/ase-task-reboot/SKILL.md +12 -6
  65. package/plugin/skills/ase-task-rename/SKILL.md +2 -2
  66. 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: `OK: saved task "${args.id}"` }]
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.51",
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.7.0",
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.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.18.0",
45
+ "@dotenvx/dotenvx": "2.19.1",
46
46
  "yaml": "2.9.0",
47
47
  "valibot": "1.4.2",
48
- "execa": "10.0.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": "5.6.2",
53
+ "chalk": "6.0.0",
54
54
  "pretty-ms": "9.3.0",
55
55
  "luxon": "3.7.2",
56
- "@modelcontextprotocol/sdk": "1.29.0",
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",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.51",
3
+ "version": "0.9.52",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.51",
3
+ "version": "0.9.52",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.51",
3
+ "version": "0.9.52",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -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 "<skill name=\"$name\">"
15
+ echo "<purpose name=\"$name\">"
16
16
  cat skills/$name/help.md | sed -e '/^## SEE ALSO/,$d'
17
- echo "</skill>"
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` argument of the most recent
69
- `ase_task_save(id: '<ase-task-id/>', ...)` tool call,
70
- *without* calling `ase_task_load` again. Set <status>plan
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
+
@@ -209,18 +209,18 @@ MCP Tool Calls
209
209
  Skill Identification
210
210
  --------------------
211
211
 
212
- - *IMPORTANT*: Set <skill></skill> (set to empty)
212
+ - *IMPORTANT*: Set <purpose></purpose> (set to empty)
213
213
  and <skill-name></skill-name> (set name to empty).
214
214
 
215
- In case <skill/> later becomes *not* empty by defining it as <skill
216
- name="<name/>"><body/></skill>, set <skill-name><name/></skill-name>
217
- (set skill name to name), and then (but only if ((`$1` is *NOT* equal
218
- to `-h` or `--help`) *AND* (<ase-guidance-level/> is equal to `normal`
219
- or `verbose`))) you *MUST* once output the following output
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: **<skill/>**, ▶ status: **skill started**
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*
@@ -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.51",
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.1",
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
- <skill name="ase-arch-analyze">
105
+ <purpose name="ase-arch-analyze">
106
106
  Review Software Architecture
107
- </skill>
107
+ </purpose>
108
108
 
109
- <expand name="getopt" arg1="ase-arch-analyze">
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 `ase-issue-*`
463
- keys, leaving any unrelated keys in the shared store intact),
464
- followed by one `{ command: "set", key: "ase-issue-P<n/>", val:
465
- "<title/>: <description/>" }` entry per reported PROBLEM and one
466
- `{ command: "set", key: "ase-issue-T<n/>", val: "<title/>:
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
- <skill name="ase-arch-discover">
22
+ <purpose name="ase-arch-discover">
23
23
  Discover Components
24
- </skill>
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
- <skill name="ase-code-analyze">
20
+ <purpose name="ase-code-analyze">
21
21
  Analyze Source Code
22
- </skill>
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 `P<n/>` with
147
- <n/> = 1, 2, ... in that sorted ordering, so `P1` is the most severe
148
- problem and the persisted `ase-issue-P<n/>` keys follow the reported
149
- sequence. If *all* problems are dropped, skip the per-problem report
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/>**): **P<n/>**: **<title/>**
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/>**): **P<n/>**: **<title/>**
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 `P<n/>` where <n/> is 1, 2, ...
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 `ase-issue-*`
203
- keys, leaving any unrelated keys in the shared store intact),
204
- followed by one `{ command: "set", key: "ase-issue-P<n/>", val:
205
- "<title/>: <description/>" }` entry per reported problem.
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
- <skill name="ase-code-craft">
20
+ <purpose name="ase-code-craft">
21
21
  Craft Source Code
22
- </skill>
22
+ </purpose>
23
23
 
24
24
  <expand name="getopt"
25
25
  arg1="ase-code-craft"