@rse/ase 0.9.4 → 0.9.5

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/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "homepage": "http://github.com/rse/ase",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.4",
9
+ "version": "0.9.5",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.4",
3
+ "version": "0.9.5",
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.4",
3
+ "version": "0.9.5",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -6,7 +6,7 @@
6
6
  "homepage": "http://github.com/rse/ase",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.4",
9
+ "version": "0.9.5",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -299,7 +299,7 @@ interface quality, quality attributes, and architecture governance.
299
299
  specification <mermaid-spec/> for a `flowchart TB` of the
300
300
  high-level component or layer structure and dispatch the rendering
301
301
  to the `ase-meta-diagram` sub-agent by calling the tool
302
- `Agent(name: "ase:ase-meta-diagram", description: "Diagram Rendering",
302
+ `Agent(name: "ase-meta-diagram", description: "Diagram Rendering",
303
303
  subagent_type: "ase:ase-meta-diagram", prompt: <mermaid-spec/>)`,
304
304
  using its returned fenced code block verbatim. Show layers /
305
305
  slices / major components and their dependency direction.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-arch-discover
3
- argument-hint: "[--help|-h] <functionality>"
3
+ argument-hint: "[--help|-h] [--limit|-l=12] <functionality>"
4
4
  description: >
5
5
  Discover additional, third-party components (libraries/frameworks) for
6
6
  the technology stack to provide needed functionality.
@@ -16,15 +16,23 @@ allowed-tools:
16
16
 
17
17
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
18
18
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
19
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
20
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
19
21
 
20
22
  <skill name="ase-arch-discover">
21
23
  Discover Components
22
24
  </skill>
23
25
 
26
+ <expand name="getopt"
27
+ arg1="ase-arch-discover"
28
+ arg2="--limit|-l=12">
29
+ $ARGUMENTS
30
+ </expand>
31
+
24
32
  <objective>
25
33
  *Discover* additional, *third-party components* (libraries/frameworks)
26
34
  for the technology stack to *provide* the *needed functionality*
27
- <request>$ARGUMENTS</request>.
35
+ <request><getopt-arguments/></request>.
28
36
  </objective>
29
37
 
30
38
  <flow>
@@ -93,13 +101,13 @@ for the technology stack to *provide* the *needed functionality*
93
101
 
94
102
  - Based on the essential keywords <keyword-L/> (L=1-M),
95
103
  use the `ase-meta-search` skill in a subagent to *generally*
96
- discover an initial set of a maximum of 12 *NPM packages*
104
+ discover an initial set of a maximum of <getopt-option-limit/> *NPM packages*
97
105
  <component-K/> and at least their real name <name-K/> and
98
106
  their unique package names <package-K/>.
99
107
 
100
- - Use the shell command `npm search --json --searchlimit 12
108
+ - Use the shell command `npm search --json --searchlimit <getopt-option-limit/>
101
109
  "<keyword-1/>" [...] "<keyword-M/>"` to *specifically*
102
- discover an additional set of a maximum of 12 *NPM packages*
110
+ discover an additional set of a maximum of <getopt-option-limit/> *NPM packages*
103
111
  <component-K/> and at least their unique package names
104
112
  <package-K/>, based on the essential keywords <keyword-L/>
105
113
  (L=1-M). Merge the results into the already existing result
@@ -109,14 +117,14 @@ for the technology stack to *provide* the *needed functionality*
109
117
 
110
118
  - Based on the essential keywords <keyword-L/> (L=1-M),
111
119
  use the `ase-meta-search` skill in a subagent to *generally*
112
- discover an initial set of a maximum of 12 *Maven packages*
120
+ discover an initial set of a maximum of <getopt-option-limit/> *Maven packages*
113
121
  <component-K/> and at least their real name <name-K/> and
114
122
  their unique Maven coordinates <package-K/> of the form
115
123
  `groupId:artifactId`.
116
124
 
117
- - Use the shell command `curl -s 'https://search.maven.org/solrsearch/select?q=<keyword-1/>+<keyword-M/>&rows=12&wt=json'`
125
+ - Use the shell command `curl -s 'https://search.maven.org/solrsearch/select?q=<keyword-1/>+<keyword-M/>&rows=<getopt-option-limit/>&wt=json'`
118
126
  to *specifically* discover an additional set of a maximum
119
- of 12 *Maven packages* <component-K/> and at least their
127
+ of <getopt-option-limit/> *Maven packages* <component-K/> and at least their
120
128
  unique Maven coordinates <package-K/> (i.e. `<g/>:<a/>` from
121
129
  each result document's `g` and `a` fields), based on the
122
130
  essential keywords <keyword-L/> (L=1-M). Merge the results
@@ -139,7 +147,7 @@ for the technology stack to *provide* the *needed functionality*
139
147
 
140
148
  - Sort, in descending order, the discovered components
141
149
  <component-K/> (K=1-N) by their `rank` field and trim the result
142
- list to just a maximum of 12 total components.
150
+ list to just a maximum of <getopt-option-limit/> total components.
143
151
 
144
152
  - For each component <component-K/> (K=1-N), research and then
145
153
  decide which *one* of *USP* (Unique Selling Point -- what makes
@@ -7,6 +7,7 @@
7
7
 
8
8
  `ase-arch-discover`
9
9
  [`--help`|`-h`]
10
+ [`--limit`|`-l=12`]
10
11
  *functionality*
11
12
 
12
13
  ## DESCRIPTION
@@ -23,6 +24,13 @@ stars, dates) via the `ase_component_info` MCP tool, and reports
23
24
  the top-ranked components as a Markdown table together with a single
24
25
  distinguishing hint (USP, Crux, or Gotcha) per component.
25
26
 
27
+ ## OPTIONS
28
+
29
+ `--limit`|`-l=12`:
30
+ The *maximum* number of components searched per source and retained
31
+ in the final ranking (default: 12). Raise it for a broader, more
32
+ exhaustive survey, lower it for a quicker, narrower lookup.
33
+
26
34
  ## ARGUMENTS
27
35
 
28
36
  *functionality*:
@@ -43,6 +51,12 @@ Discover components for HTTP client functionality:
43
51
  ❯ /ase-arch-discover HTTP client with retries
44
52
  ```
45
53
 
54
+ Discover a broader set of up to 20 HTTP client components:
55
+
56
+ ```text
57
+ ❯ /ase-arch-discover --limit 20 HTTP client with retries
58
+ ```
59
+
46
60
  ## SEE ALSO
47
61
 
48
62
  `ase-arch-analyze`, `ase-meta-search`, `ase-meta-evaluate`.
@@ -228,7 +228,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
228
228
  TB`, `stateDiagram-v2`, `sequenceDiagram`, `classDiagram`,
229
229
  or `erDiagram`, depending on intent) and dispatching the
230
230
  rendering to the `ase-meta-diagram` sub-agent by calling
231
- the tool `Agent(name: "ase:ase-meta-diagram", description:
231
+ the tool `Agent(name: "ase-meta-diagram", description:
232
232
  "Diagram Rendering", subagent_type: "ase:ase-meta-diagram",
233
233
  prompt: <mermaid-spec/>)`, reproducing its returned fenced
234
234
  code block verbatim. For *current vs. proposed* comparisons,
@@ -89,7 +89,7 @@ Give *insights* into the project through the source code of $ARGUMENTS.
89
89
  <mermaid-spec/> for a `flowchart TB` diagram with all modules as
90
90
  boxes and the imports between modules as the directed edges. Then
91
91
  dispatch the rendering to the `ase-meta-diagram` sub-agent by
92
- calling the tool `Agent(name: "ase:ase-meta-diagram", description:
92
+ calling the tool `Agent(name: "ase-meta-diagram", description:
93
93
  "Diagram Rendering", subagent_type: "ase:ase-meta-diagram", prompt:
94
94
  <mermaid-spec/>)` and reproduce its returned fenced code block
95
95
  verbatim in the response text. Do not display any further
@@ -48,7 +48,7 @@ related to a set of code quality aspects.
48
48
 
49
49
  ```text
50
50
  Agent(
51
- name: "ase:ase-code-lint",
51
+ name: "ase-code-lint",
52
52
  description: "Lint Investigation",
53
53
  subagent_type: "ase:ase-code-lint",
54
54
  mode: "plan",
@@ -218,7 +218,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
218
218
  (e.g. `flowchart TB`, `stateDiagram-v2`, `sequenceDiagram`,
219
219
  `classDiagram`, or `erDiagram`, depending on intent) and
220
220
  dispatching the rendering to the `ase-meta-diagram`
221
- sub-agent by calling the tool `Agent(name: "ase:ase-meta-diagram",
221
+ sub-agent by calling the tool `Agent(name: "ase-meta-diagram",
222
222
  description: "Diagram Rendering", subagent_type:
223
223
  "ase:ase-meta-diagram", prompt: <mermaid-spec/>)`, reproducing
224
224
  its returned fenced code block verbatim. For *current
@@ -154,7 +154,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
154
154
  TB`, `stateDiagram-v2`, `sequenceDiagram`, `classDiagram`, or
155
155
  `erDiagram`, depending on intent) and dispatching the rendering
156
156
  to the `ase-meta-diagram` sub-agent by calling the tool
157
- `Agent(name: "ase:ase-meta-diagram", description: "Diagram
157
+ `Agent(name: "ase-meta-diagram", description: "Diagram
158
158
  Rendering", subagent_type: "ase:ase-meta-diagram", prompt:
159
159
  <mermaid-spec/>)`, reproducing its returned fenced code block
160
160
  verbatim. Omit <optional-diagram/> entirely for simple or
@@ -267,7 +267,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
267
267
  (e.g. `flowchart TB`, `stateDiagram-v2`, `sequenceDiagram`,
268
268
  `classDiagram`, or `erDiagram`, depending on intent) and
269
269
  dispatching the rendering to the `ase-meta-diagram`
270
- sub-agent by calling the tool `Agent(name: "ase:ase-meta-diagram",
270
+ sub-agent by calling the tool `Agent(name: "ase-meta-diagram",
271
271
  description: "Diagram Rendering", subagent_type:
272
272
  "ase:ase-meta-diagram", prompt: <mermaid-spec/>)`, reproducing
273
273
  its returned fenced code block verbatim. For *current
@@ -48,7 +48,7 @@ Analyze documents for spelling, punctuation, or grammar errors
48
48
 
49
49
  ```text
50
50
  Agent(
51
- name: "ase:ase-docs-proofread",
51
+ name: "ase-docs-proofread",
52
52
  description: "Proofread Investigation",
53
53
  subagent_type: "ase:ase-docs-proofread",
54
54
  mode: "plan",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-meta-brainstorm
3
- argument-hint: "[--help|-h] [--count|-c=12] <topic>"
3
+ argument-hint: "[--help|-h] [--max-clarify|-c=3] [--min-ideas|-i=12] [--min-rank|-r=7] [--max-shortlist|-s=4] <topic>"
4
4
  description: >
5
5
  Collaboratively brainstorm a topic by diverging on ideas, converging
6
6
  through clustering and scoring, and distilling a shortlist with
@@ -23,15 +23,15 @@ Collaboratively Brainstorm a Topic
23
23
 
24
24
  <expand name="getopt"
25
25
  arg1="ase-meta-brainstorm"
26
- arg2="--count|-c=12">
26
+ arg2="--max-clarify|-c=3 --min-ideas|-i=12 --min-rank|-r=7 --max-shortlist|-s=4">
27
27
  $ARGUMENTS
28
28
  </expand>
29
29
 
30
30
  <objective>
31
- Collaboratively brainstorm the topic <topic><getopt-arguments/></topic> by first
32
- *diverging* into a broad space of candidate ideas, then *converging*
33
- through clustering and scoring, and finally distilling a *shortlist*
34
- with a single recommended direction.
31
+ Collaboratively brainstorm the topic <topic><getopt-arguments/></topic>
32
+ by first *diverging* into a broad space of candidate ideas, then
33
+ *converging* through clustering and scoring, and finally distilling a
34
+ *shortlist* with a single recommended direction.
35
35
  </objective>
36
36
 
37
37
  Guiding Tenets
@@ -90,19 +90,20 @@ Honor the following tenets throughout the brainstorming:
90
90
 
91
91
  Before generating any ideas, *explore the project context* (review
92
92
  relevant existing files, documentation, and recent changes) and
93
- determine the <m/> (<m/>=1-3) *essential unknowns* about the topic
94
- - the purpose, constraints, scope boundaries, and success criteria
95
- that must be pinned down for the brainstorming to be reasonably
96
- grounded.
93
+ determine the <m/> (<m/> = 1..<getopt-option-max-clarify/>)
94
+ *essential unknowns* about the topic - the purpose, constraints,
95
+ scope boundaries, and success criteria that must be pinned down for
96
+ the brainstorming to be reasonably grounded.
97
97
 
98
- Notice: you are intentionally constrained to just 1-3 unknowns,
99
- as too much upfront intent clarification kills the brainstorming
100
- of ideas later. So, you *MUST* reduce the clarifications of the
101
- unknowns to the absolute minimum!
98
+ Notice: you are intentionally constrained to just
99
+ 1..<getopt-option-max-clarify/> unknowns, as too much upfront intent
100
+ clarification kills the brainstorming of ideas later. So, you *MUST*
101
+ reduce the clarifications of the unknowns to the absolute minimum in
102
+ general and cap it at <getopt-option-max-clarify/>!
102
103
 
103
- For each essential unknown, derive a short 1-3 word facet <facet-M/>
104
- and a corresponding question <question-M/> whose answer materially
105
- changes which ideas make sense at all.
104
+ For each essential unknown to clarify, derive a short 1-3 word facet
105
+ <facet-M/> and a corresponding question <question-M/> whose answer
106
+ materially changes which ideas make sense at all.
106
107
 
107
108
  1. For each <question-M/> in the iteration cycle <M/> (<M/>=1...<m/>):
108
109
 
@@ -159,7 +160,7 @@ Honor the following tenets throughout the brainstorming:
159
160
  variety in outcome.
160
161
 
161
162
  Do still *not* judge, rank, or prune ideas in this step. Generate
162
- ideas until you either reach at least <getopt-option-count/> distinct
163
+ ideas until you either reach at least <getopt-option-min-ideas/> distinct
163
164
  candidate ideas or have clearly exhausted the meaningfully distinct
164
165
  space.
165
166
 
@@ -199,10 +200,10 @@ Honor the following tenets throughout the brainstorming:
199
200
  purpose and constraints on a Likert scale of 0 (poor) to 10
200
201
  (excellent), considering *value*, *uniqueness*, *risk*, and
201
202
  *alignment with the existing code base*. Keep only ideas in the
202
- clusters with a rank of at least 7.
203
+ clusters with a rank of at least <getopt-option-min-rank/>.
203
204
 
204
205
  3. From the scored ideas <idea-N/>, distill a *shortlist* of the top
205
- 3-4 options, sorted by rank from highest to lowest.
206
+ <getopt-option-max-shortlist/> options, sorted by rank from highest to lowest.
206
207
 
207
208
  For this, draw the shortlist from *distinct* clusters <cluster-C/>
208
209
  wherever possible - prefer a diverse shortlist spanning different
@@ -216,7 +217,7 @@ Honor the following tenets throughout the brainstorming:
216
217
  and its primary trade-off), and output the following <template/>:
217
218
 
218
219
  <template>
219
- <ase-tpl-bullet-normal/> **DISTILLED IDEA <N/>**: <option-N/>
220
+ <ase-tpl-bullet-normal/> **DISTILLED IDEA**: <option-N/>
220
221
  </template>
221
222
 
222
223
  4. Finally, derive a single *recommended idea* - the highest-ranked
@@ -7,7 +7,10 @@
7
7
 
8
8
  `ase-meta-brainstorm`
9
9
  [`--help`|`-h`]
10
- [`--count`|`-c=12`]
10
+ [`--max-clarify=3`]
11
+ [`--min-ideas`|`-i=12`]
12
+ [`--min-rank=7`]
13
+ [`--max-shortlist=4`]
11
14
  *topic*
12
15
 
13
16
  ## DESCRIPTION
@@ -16,18 +19,19 @@ The `ase-meta-brainstorm` skill guides a collaborative ideation
16
19
  session on a *topic* *before* any implementation begins. It first
17
20
  *clarifies intent* by exploring the project context and interviewing
18
21
  the user - one grounded, multiple-choice question at a time - about
19
- purpose, constraints, scope, and success criteria. It then *diverges*
20
- into a broad space of candidate ideas (at least `--count`, default 12)
21
- pursued from deliberately diverse angles (MVP-first, risk-first,
22
- UX-first, reuse-first, and wildcard), without judging them.
22
+ purpose, constraints, scope, and success criteria (asking at most
23
+ `--max-clarify`, default 3, questions). It then *diverges* into a broad
24
+ space of candidate ideas (at least `--min-ideas`, default 12) pursued from
25
+ deliberately diverse angles (MVP-first, risk-first, UX-first,
26
+ reuse-first, and wildcard), without judging them.
23
27
 
24
28
  Next it *converges* by clustering the ideas into coherent themes,
25
29
  pruning speculative or out-of-scope ones via *YAGNI*, and scoring the
26
- survivors on a 0-10 fit scale (keeping only those ranked 7 or higher).
27
- Finally it distills a *shortlist* of the top 3-4 directions - drawn from
28
- distinct clusters wherever possible - and derives a single
29
- *RECOMMENDATION*, being either the highest-ranked option or a principled
30
- synthesis of the shortlist.
30
+ survivors on a 0-10 fit scale (keeping only those ranked `--min-rank`,
31
+ default 7, or higher). Finally it distills a *shortlist* of the top
32
+ `--max-shortlist`, default 4, directions - drawn from distinct clusters
33
+ wherever possible - and derives a single *RECOMMENDATION*, being either
34
+ the highest-ranked option or a principled synthesis of the shortlist.
31
35
 
32
36
  On completion the skill offers a *next step*: stop, or hand the
33
37
  recommended direction off to the `ase-task-edit`, `ase-code-craft`, or
@@ -35,11 +39,26 @@ recommended direction off to the `ase-task-edit`, `ase-code-craft`, or
35
39
 
36
40
  ## OPTIONS
37
41
 
38
- `--count`|`-c=12`:
42
+ `--max-clarify=3`:
43
+ The *maximum* number of essential-unknown clarification questions
44
+ asked in the *clarify intent* phase (default: 3). Lower it for a
45
+ faster, leaner intake, raise it for more upfront grounding.
46
+
47
+ `--min-ideas`|`-i=12`:
39
48
  The *minimum* number of candidate ideas to generate in the *diverge*
40
49
  phase before converging (default: 12). Raise it for a broader idea
41
50
  space, lower it for a quicker, narrower session.
42
51
 
52
+ `--min-rank=7`:
53
+ The *minimum* 0-10 fit rank an idea must score to survive the
54
+ *converge* phase (default: 7). Raise it for a stricter filter, lower
55
+ it to retain more ideas.
56
+
57
+ `--max-shortlist=4`:
58
+ The *maximum* number of distilled options on the final *shortlist*
59
+ (default: 4). Lower it for a sharper focus, raise it for more
60
+ finalists.
61
+
43
62
  ## ARGUMENTS
44
63
 
45
64
  *topic*:
@@ -57,7 +76,14 @@ Brainstorm an approach for a new feature:
57
76
  Brainstorm with a broader idea space of at least 20 candidates:
58
77
 
59
78
  ```text
60
- ❯ /ase-meta-brainstorm --count 20 an offline-first sync layer
79
+ ❯ /ase-meta-brainstorm --min-ideas 20 an offline-first sync layer
80
+ ```
81
+
82
+ Brainstorm quickly with a single clarification, a stricter score floor,
83
+ and a tighter shortlist:
84
+
85
+ ```text
86
+ ❯ /ase-meta-brainstorm --max-clarify 1 --min-rank 8 --max-shortlist 3 an offline-first sync layer
61
87
  ```
62
88
 
63
89
  ## SEE ALSO
@@ -28,7 +28,7 @@ Query foreign LLM for: <query>$ARGUMENTS</query>
28
28
 
29
29
  ```text
30
30
  Agent(
31
- name: "ase:ase-meta-chat",
31
+ name: "ase-meta-chat",
32
32
  description: "Query Foreign LLM for Chat",
33
33
  subagent_type: "ase:ase-meta-chat",
34
34
  prompt: <query/>
@@ -35,7 +35,7 @@ to <getopt-option-count/>; if <getopt-option-count/> is *non-numeric* or
35
35
 
36
36
  <flow>
37
37
 
38
- 1. <step id="STEP 1: Repeat Thesis">
38
+ 1. <step id="STEP 1: Restate Thesis">
39
39
 
40
40
  Output the thesis with the following <template/>:
41
41
 
@@ -306,7 +306,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
306
306
  labels ultra short (basenames or module names only).
307
307
 
308
308
  2. Dispatch the rendering to the `ase-meta-diagram` sub-agent by
309
- calling the tool `Agent(name: "ase:ase-meta-diagram",
309
+ calling the tool `Agent(name: "ase-meta-diagram",
310
310
  description: "Diagram Rendering", subagent_type:
311
311
  "ase:ase-meta-diagram", prompt: "<mermaid-spec/>")` and capture
312
312
  its returned `text` field as <diagram/>.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-meta-quorum
3
- argument-hint: "[--help|-h] <question>"
3
+ argument-hint: "[--help|-h] [--models|-m <model>[,...]] <question>"
4
4
  description: >
5
5
  Query Multiple AIs for Quorum Answer.
6
6
  user-invocable: true
@@ -13,11 +13,18 @@ allowed-tools:
13
13
 
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
16
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
16
17
 
17
18
  <skill name="ase-meta-quorum">
18
19
  Query Multiple AIs for Quorum Answer
19
20
  </skill>
20
21
 
22
+ <expand name="getopt"
23
+ arg1="ase-meta-quorum"
24
+ arg2="--models|-m=(all|chatgpt|gemini|deepseek|grok|glm|qwen)...">
25
+ $ARGUMENTS
26
+ </expand>
27
+
21
28
  <objective>
22
29
  Find a *quorum answer* on an arbitrary question,
23
30
  by querying *multiple* AIs for an *optimal consensus*.
@@ -30,7 +37,7 @@ by querying *multiple* AIs for an *optimal consensus*.
30
37
  Prepare the LLM query by setting <query/> to the following <template/>:
31
38
 
32
39
  <template>
33
- $ARGUMENTS.
40
+ <getopt-arguments/>.
34
41
  Please respond with facts and very concise and brief only,
35
42
  usually with just 1 to 7 corresponding bullet points and with short sentences.
36
43
  Optionally, mention potential cruxes which should be noticed.
@@ -53,12 +60,20 @@ by querying *multiple* AIs for an *optimal consensus*.
53
60
 
54
61
  2. <step id="STEP 2: Query Foreign AIs">
55
62
 
63
+ The user-selectable foreign models are restricted by the
64
+ `--models`/`-m` option, parsed into <getopt-option-models/>
65
+ as a comma-separated list of model tokens. The default is
66
+ the single token `all`. If <getopt-option-models/> contains
67
+ the token `all`, you *MUST* treat it as the full list
68
+ `chatgpt,gemini,deepseek,grok,glm,qwen` (all models). Anthropic
69
+ Claude (yourself) is *always* included, independent of this option.
70
+
56
71
  <define name="agent">
57
72
  Call the `Agent` tool:
58
73
 
59
74
  ```text
60
75
  Agent(
61
- name: "ase:ase-meta-chat",
76
+ name: "ase-meta-chat-<arg2/>",
62
77
  description: "Query Foreign LLM: <arg1/>",
63
78
  subagent_type: "ase:ase-meta-chat",
64
79
  prompt: "<arg2/> <query/>"
@@ -67,12 +82,28 @@ by querying *multiple* AIs for an *optimal consensus*.
67
82
 
68
83
  </define>
69
84
 
85
+ Query only those foreign models whose token is contained in
86
+ <getopt-option-models/> (where `all` selects every model); silently
87
+ skip all others:
88
+
89
+ <if condition="<getopt-option-models/> contains `all` OR <getopt-option-models/> contains `chatgpt`">
70
90
  <expand name="agent" arg1="OpenAI ChatGPT" arg2="chatgpt"></expand>
91
+ </if>
92
+ <if condition="<getopt-option-models/> contains `all` OR <getopt-option-models/> contains `gemini`">
71
93
  <expand name="agent" arg1="Google Gemini" arg2="gemini"></expand>
94
+ </if>
95
+ <if condition="<getopt-option-models/> contains `all` OR <getopt-option-models/> contains `deepseek`">
72
96
  <expand name="agent" arg1="DeepSeek" arg2="deepseek"></expand>
97
+ </if>
98
+ <if condition="<getopt-option-models/> contains `all` OR <getopt-option-models/> contains `grok`">
73
99
  <expand name="agent" arg1="xAI Grok" arg2="grok"></expand>
100
+ </if>
101
+ <if condition="<getopt-option-models/> contains `all` OR <getopt-option-models/> contains `glm`">
74
102
  <expand name="agent" arg1="Z.AI GLM" arg2="glm"></expand>
103
+ </if>
104
+ <if condition="<getopt-option-models/> contains `all` OR <getopt-option-models/> contains `qwen`">
75
105
  <expand name="agent" arg1="Alibaba Qwen" arg2="qwen"></expand>
106
+ </if>
76
107
 
77
108
  You *MUST* *NOT* output anything in this step.
78
109
 
@@ -116,7 +147,7 @@ by querying *multiple* AIs for an *optimal consensus*.
116
147
 
117
148
  <template>
118
149
  **QUESTION**:
119
- $ARGUMENTS
150
+ <getopt-arguments/>
120
151
 
121
152
  &#x25CF; **CONSENSUS ANSWER**:
122
153
  - [...]
@@ -153,7 +184,8 @@ by querying *multiple* AIs for an *optimal consensus*.
153
184
  - [...]
154
185
  </template>
155
186
 
156
- In this output, remove the sections of those AIs which were not available.
187
+ In this output, remove the sections of those AIs which were not
188
+ queried (excluded via `--models`/`-m`) or were not available.
157
189
  You *MUST* *NOT* output any further explanations yourself.
158
190
 
159
191
  </step>
@@ -7,6 +7,7 @@
7
7
 
8
8
  `ase-meta-quorum`
9
9
  [`--help`|`-h`]
10
+ [`--models`|`-m` *model*[,...]]
10
11
  *question*
11
12
 
12
13
  ## DESCRIPTION
@@ -23,6 +24,17 @@ a Likert scale of `0..N` (where `N` is the number of available
23
24
  responders), and reports the consensus answer alongside the
24
25
  complete, unmodified individual responses.
25
26
 
27
+ ## OPTIONS
28
+
29
+ `--models`|`-m` *model*[,...]:
30
+ Restrict the *foreign* LLMs that are queried to the given
31
+ comma-separated list of *model* tokens. Recognized tokens are
32
+ `all`, `chatgpt`, `gemini`, `deepseek`, `grok`, `glm`, and `qwen`,
33
+ where `all` selects every model. The default is `all`. Models that
34
+ are not selected (or not available) are *silently skipped*.
35
+ Anthropic Claude (the skill itself) is *always* included,
36
+ independent of this option.
37
+
26
38
  ## ARGUMENTS
27
39
 
28
40
  *question*:
@@ -36,6 +48,12 @@ Ask the quorum a factual question:
36
48
  ❯ /ase-meta-quorum What are the most common causes of memory leaks in Node.js?
37
49
  ```
38
50
 
51
+ Ask only a subset of the foreign models:
52
+
53
+ ```text
54
+ ❯ /ase-meta-quorum --models chatgpt,gemini,grok Which sorting algorithm is fastest in practice?
55
+ ```
56
+
39
57
  ## SEE ALSO
40
58
 
41
59
  `ase-meta-chat`, `ase-meta-search`, `ase-meta-evaluate`.
@@ -90,7 +90,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
90
90
 
91
91
  ```text
92
92
  Agent(
93
- name: "ase:ase-meta-review",
93
+ name: "ase-meta-review",
94
94
  description: "Review Investigation",
95
95
  subagent_type: "ase:ase-meta-review",
96
96
  mode: "plan",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-meta-search
3
- argument-hint: "[--help|-h] <query>"
3
+ argument-hint: "[--help|-h] [--services|-s=(all|perplexity|brave|exa|websearch)...] <query>"
4
4
  description: >
5
5
  Search the Internet/Web with a query.
6
6
  Prefer this skill before using Perplexity, Brave and WebSearch.
@@ -17,14 +17,21 @@ allowed-tools:
17
17
 
18
18
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
19
19
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
20
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
20
21
 
21
22
  <skill name="ase-meta-search">
22
23
  Search the Internet/Web
23
24
  </skill>
24
25
 
26
+ <expand name="getopt"
27
+ arg1="ase-meta-search"
28
+ arg2="--services|-s=(all|perplexity|brave|exa|websearch)...">
29
+ $ARGUMENTS
30
+ </expand>
31
+
25
32
  <objective>
26
33
  Your objective is to *search* the *Internet*/*Web* for the following query:
27
- <query>$ARGUMENTS</query>
34
+ <query><getopt-arguments/></query>
28
35
  </objective>
29
36
 
30
37
  <flow>
@@ -34,7 +41,7 @@ Your objective is to *search* the *Internet*/*Web* for the following query:
34
41
  <define name="agent">
35
42
  ```text
36
43
  Agent(
37
- name: "ase:ase-meta-search",
44
+ name: "ase-meta-search",
38
45
  description: "Query Web Search Service",
39
46
  subagent_type: "ase:ase-meta-search",
40
47
  prompt: <content/>
@@ -42,24 +49,46 @@ Your objective is to *search* the *Internet*/*Web* for the following query:
42
49
  ```
43
50
  </define>
44
51
 
45
- If the MCP tool `perplexity_search` from the MCP server `search-perplexity` is available:
52
+ Treat <getopt-option-services/> as a comma-separated list of
53
+ *backend tokens*. The getopt parser validates only the *first*
54
+ token, so you *MUST* validate each remaining token yourself against
55
+ the allowed set `all`, `perplexity`, `brave`, `exa`, `websearch`. If
56
+ any token is *not* in this set, only output the following <template/>
57
+ and then immediately *STOP* processing the entire current skill:
58
+
59
+ <template>
60
+ ⧉ **ASE**: ✪ skill: **ase-meta-search**, ▶ ERROR: invalid `--services` token: **<token/>**
61
+ </template>
62
+
63
+ A backend is *selected* if `all` is in <getopt-option-services/> *OR*
64
+ that backend's own name is in <getopt-option-services/>.
65
+
66
+ If the `perplexity` backend is *selected* and the MCP tool
67
+ `perplexity_search` from the MCP server `search-perplexity` is available:
68
+
46
69
  <expand name="agent">
47
70
  Call the MCP tool `perplexity_search(query: "<query/>")`
48
71
  from the MCP server `search-perplexity`.
49
72
  </expand>
50
73
 
51
- If the MCP tool `brave_web_search` from the MCP server `search-brave` is available:
74
+ If the `brave` backend is *selected* and the MCP tool
75
+ `brave_web_search` from the MCP server `search-brave` is available:
76
+
52
77
  <expand name="agent">
53
78
  Call the MCP tool `brave_web_search(query: "<query/>")`
54
79
  from the MCP server `search-brave`.
55
80
  </expand>
56
81
 
57
- If the MCP tool `web_search_exa` from the MCP server `search-exa` is available:
82
+ If the `exa` backend is *selected* and the MCP tool
83
+ `web_search_exa` from the MCP server `search-exa` is available:
84
+
58
85
  <expand name="agent">
59
86
  Call the MCP tool `web_search_exa(query: "<query/>")`
60
87
  from the MCP server `search-exa`.
61
88
  </expand>
62
89
 
90
+ If the `websearch` backend is *selected*:
91
+
63
92
  <expand name="agent">
64
93
  Call the tool `WebSearch(query: "<query/>")`.
65
94
  </expand>
@@ -7,12 +7,13 @@
7
7
 
8
8
  `ase-meta-search`
9
9
  [`--help`|`-h`]
10
+ [`--services`|`-s`=(`all`|`perplexity`|`brave`|`exa`|`websearch`)...]
10
11
  *query*
11
12
 
12
13
  ## DESCRIPTION
13
14
 
14
15
  The `ase-meta-search` skill searches the *Internet*/*Web* for the
15
- given *query*. It dispatches the query in parallel to all available
16
+ given *query*. It dispatches the query in parallel to the *selected*
16
17
  search services (Perplexity, Brave, Exa, and Claude's built-in
17
18
  `WebSearch`) via the `ase:ase-meta-search` sub-agent and consolidates
18
19
  all responses into a single answer without removing original
@@ -23,17 +24,28 @@ Brave, or `WebSearch` individually.
23
24
 
24
25
  ## ARGUMENTS
25
26
 
27
+ `--services`|`-s`=(`all`|`perplexity`|`brave`|`exa`|`websearch`)...:
28
+ The comma-separated list of search backends to query. The default
29
+ `all` queries every available backend (the original behavior);
30
+ otherwise only the listed backends are queried.
31
+
26
32
  *query*:
27
33
  The search query to dispatch to the search services.
28
34
 
29
35
  ## EXAMPLES
30
36
 
31
- Search the Web for a topic:
37
+ Search the Web for a topic across all backends:
32
38
 
33
39
  ```text
34
40
  ❯ /ase-meta-search latest stable release of TypeScript and release notes
35
41
  ```
36
42
 
43
+ Search the Web using only the Brave and Exa backends:
44
+
45
+ ```text
46
+ ❯ /ase-meta-search --services=brave,exa latest stable release of TypeScript
47
+ ```
48
+
37
49
  ## SEE ALSO
38
50
 
39
51
  `ase-meta-chat`, `ase-meta-quorum`, `ase-arch-discover`.
@@ -39,7 +39,7 @@ to <getopt-option-count/>; if <getopt-option-count/> is *non-numeric* or
39
39
 
40
40
  <flow>
41
41
 
42
- 1. <step id="STEP 1: Repeat Thesis">
42
+ 1. <step id="STEP 1: Restate Thesis">
43
43
 
44
44
  Begin a *round* of fortification and consolidating reasoning. On
45
45
  the first visit, set <i>1</i> (set round counter to one); on each
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-meta-why
3
- argument-hint: "[--help|-h] [--depth|-d <N>] <fact>"
3
+ argument-hint: "[--help|-h] [--depth|-d <N>] [--width|-w <M>] <fact>"
4
4
  description: >
5
5
  Five-Whys Root-Cause Analysis.
6
6
  user-invocable: true
@@ -18,7 +18,7 @@ Five-Whys Root-Cause Analysis
18
18
 
19
19
  <expand name="getopt"
20
20
  arg1="ase-meta-why"
21
- arg2="--depth|-d=5">
21
+ arg2="--depth|-d=5 --width|-w=1">
22
22
  $ARGUMENTS
23
23
  </expand>
24
24
 
@@ -34,48 +34,140 @@ addressing surface-level symptoms.
34
34
  </objective>
35
35
 
36
36
  <flow>
37
- 1. <step id="STEP 1: Determine Problem">
37
+
38
+ 1. <step id="STEP 1: Restate Problem">
39
+
38
40
  State the problem statement.
39
41
 
40
42
  <template>
41
43
  <ase-tpl-bullet-signal/> **PROBLEM**: <problem/>
42
44
  </template>
45
+
43
46
  </step>
44
47
 
45
48
  2. <step id="STEP 2: Root-Cause Analysis">
49
+
46
50
  Find the root-cause of <problem/> by following the following iteration cycle.
47
51
  Start with a <question/> set equal to the <problem/>.
48
52
 
49
- Determine the *maximum chain length* from <getopt-option-depth/>: if
50
- <getopt-option-depth/> is *non-numeric* or *less than or equal to 0*,
51
- use the default *5* instead.
52
-
53
- Start with <n>1</n> (set iteration counter to one).
54
- <while condition="<n/> is less than or equal to <getopt-option-depth/>">
55
- Ask <question/> and document the answer in <answer/> with the following template:
56
- Don't stop at symptoms, keep digging for systemic issues.
57
- Multiple root-causes may exist -- explore different branches.
58
- Consider technical, domain-specific, process-related, or organizational causes.
59
-
60
- <template>
61
- <ase-tpl-bullet-secondary/> **WHY <n/>**: <answer/>
62
- </template>
63
-
64
- Then, for the next iteration set <question/> now to be the last <answer/>.
65
- The magic is NOT in exactly <getopt-option-depth/> "Why" -- you can <break/>
66
- the iteration when you already reached the root-cause.
67
- Finally, set <n/> to <n/> + 1 (increment iteration counter).
68
- </while>
53
+ Determine the *maximum chain length* from <getopt-option-depth/>:
54
+ set <depth/> to <getopt-option-depth/>; if <getopt-option-depth/>
55
+ is *non-numeric* or *less than or equal to 0*, use the default *5* instead.
56
+
57
+ Determine the *maximum chain width* from <getopt-option-width/>:
58
+ set <width/> to <getopt-option-width/>; if <getopt-option-width/>
59
+ is *non-numeric* or *less than or equal to 0*, use the default *1* instead.
60
+
61
+ - <if condition="<width/> is less than or equal to 1">
62
+
63
+ Walk a *single* causality chain (the classic Five-Whys):
64
+
65
+ Start with <n>1</n> (set iteration counter to one).
66
+
67
+ <while condition="<n/> is less than or equal to <depth/>">
68
+
69
+ Ask <question/> and document the answer in <answer/> with the following template:
70
+ Don't stop at symptoms, keep digging for systemic issues.
71
+ Consider technical, domain-specific, process-related, or organizational causes.
72
+
73
+ <template>
74
+ <ase-tpl-bullet-secondary/> **WHY <n/>**: <answer/>
75
+ </template>
76
+
77
+ Then, for the next iteration set <question/> now to be the last <answer/>.
78
+ The magic is NOT in exactly <depth/> "Why" -- you can <break/>
79
+ the iteration when you already reached the root-cause.
80
+ Finally, set <n/> to <n/> + 1 (increment iteration counter).
81
+
82
+ </while>
83
+
84
+ </if>
85
+
86
+ - <if condition="<width/> is greater than 1">
87
+
88
+ Walk a *widened* causality chain: at each "why" level, surface up to
89
+ <width/> *candidate* sub-causes, then commit to the single most
90
+ significant one and descend into it (the chain stays single-rooted --
91
+ the extra candidates are *not* each drilled to their own root-cause).
92
+ Their purpose is to guard against *premature commitment* to the wrong
93
+ sub-cause: by enumerating the plausible alternatives at each level, the
94
+ chosen descent is a *justified* selection rather than the first
95
+ plausible answer, and the unchosen candidates remain on record as
96
+ *fallbacks* to backtrack into (see STEP 3) should the chosen path fail
97
+ validation.
98
+
99
+ Remember the *unchosen* candidates of every level (keep them in
100
+ <fallbacks/>, tagged by their level <n/>), so STEP 3 can backtrack
101
+ into them.
102
+
103
+ Start with <n>1</n> (set iteration counter to one).
104
+
105
+ <while condition="<n/> is less than or equal to <depth/>">
106
+
107
+ Ask <question/> and surface up to <width/> *distinct*,
108
+ *non-overlapping* candidate sub-causes, each documented in <answer-k/>.
109
+ Don't stop at symptoms, keep digging for systemic issues.
110
+ Explore *different* candidates -- technical, domain-specific,
111
+ process-related, or organizational causes -- and avoid restating
112
+ the same cause in different words.
113
+
114
+ Start with <k>1</k> (set candidate counter to one).
115
+ <while condition="<k/> is less than or equal to <width/>">
116
+ <template>
117
+ <ase-tpl-bullet-secondary/> **WHY <n/>.<k/>**: <answer-k/>
118
+ </template>
119
+ Set <k/> to <k/> + 1 (increment candidate counter).
120
+ </while>
121
+
122
+ Then choose, among the <answer-k/>, the *most causally-significant*
123
+ candidate -- the one most likely to lead to the true root-cause --
124
+ and *justify* the choice in one line (state explicitly *why* it
125
+ beats the other candidates, e.g. it alone also explains the timing,
126
+ scope, or magnitude of the level's fact). A bare "most significant"
127
+ is *not* sufficient; if no candidate clearly dominates, say so.
128
+
129
+ <template>
130
+ <ase-tpl-bullet-secondary/> **WHY <n/> → chosen <n/>.<chosen-k/>**: <justification/>
131
+ </template>
132
+
133
+ Record the remaining candidates as <fallbacks/> for level <n/>.
134
+ Then, for the next iteration, set <question/> to the chosen candidate.
135
+ You can <break/> the iteration when the chosen candidate already
136
+ reached its root-cause.
137
+ Finally, set <n/> to <n/> + 1 (increment iteration counter).
138
+
139
+ </while>
140
+
141
+ </if>
142
+
69
143
  </step>
70
144
 
71
145
  3. <step id="STEP 3: Report Solution">
72
- Validate the root-cause by working backwards the causality chain.
73
- Propose a solution that addresses and solves the root-cause.
146
+
147
+ Validate the root-cause by working backwards along the chosen causality
148
+ chain: check, level by level, that each chosen sub-cause genuinely *causes*
149
+ the fact above it (and that fixing the final root-cause would dissolve the
150
+ whole chain up to the original <problem/>).
151
+
152
+ When <width/> is *greater than 1* and this backward validation *fails* at
153
+ some level -- i.e. the chosen sub-cause does *not* adequately explain the
154
+ fact above it -- *backtrack*: discard the chosen sub-cause from that level
155
+ downward, pick the next-best candidate from that level's <fallbacks/>, set
156
+ <question/> to it, and re-run the STEP 2 widened descent from there. Repeat
157
+ until a chain survives backward validation or that level's <fallbacks/> are
158
+ exhausted (then report the strongest chain found and note that no candidate
159
+ fully validated). This is the payoff of <width/> *greater than 1*: the
160
+ enumerated alternatives let the analysis *recover* from a wrong turn instead
161
+ of committing to a mis-rooted chain.
162
+
163
+ Propose a solution that addresses and solves the validated root-cause.
74
164
  For the proposed solution, optionally directly propose corresponding source code changes.
75
165
 
76
166
  <template>
77
167
  <ase-tpl-bullet-signal/> **SOLUTION**: <solution/>
78
168
  </template>
169
+
79
170
  </step>
171
+
80
172
  </flow>
81
173
 
@@ -8,6 +8,7 @@
8
8
  `ase-meta-why`
9
9
  [`--help`|`-h`]
10
10
  [`--depth`|`-d` *N*]
11
+ [`--width`|`-w` *M*]
11
12
  *fact*
12
13
 
13
14
  ## DESCRIPTION
@@ -17,8 +18,16 @@ analysis* technique to the supplied *fact*. The skill iteratively
17
18
  asks "why" - up to *N* times (see `--depth`, default five) - to drill
18
19
  down from surface symptoms to the underlying root cause, considering
19
20
  technical, domain-specific, process-related, and organizational
20
- causes. After identifying the root cause it proposes a *SOLUTION* that
21
- addresses it, optionally including concrete source code changes.
21
+ causes. By default it walks a *single* causality chain, but with
22
+ `--width` *M* (> 1) it walks a *widened* chain: at each level it surfaces
23
+ up to *M* candidate sub-causes, descends into the most significant one
24
+ with an explicit justification for the choice, and keeps the unchosen
25
+ candidates as *fallbacks*. If backward validation later shows the chosen
26
+ path was mis-rooted, it *backtracks* into a fallback and re-descends -
27
+ guarding against the classic Five-Whys failure of committing early to the
28
+ wrong sub-cause. After identifying (and validating) the root cause it
29
+ proposes a *SOLUTION* that addresses it, optionally including concrete
30
+ source code changes.
22
31
 
23
32
  ## ARGUMENTS
24
33
 
@@ -28,6 +37,18 @@ addresses it, optionally including concrete source code changes.
28
37
  early once the root cause is reached. Defaults to *5*. A non-numeric
29
38
  or non-positive value falls back to the default.
30
39
 
40
+ `--width`|`-w` *M*:
41
+ The *maximum* number of *candidate sub-causes* to surface per "why"
42
+ level. With the default *1*, the skill walks a single causality chain
43
+ (classic Five-Whys); with *M* > 1, each level surfaces up to *M*
44
+ candidate sub-causes, descends into the single most significant one
45
+ (justifying the choice), and retains the rest as *fallbacks*. During
46
+ backward validation a mis-rooted choice is *backtracked* into a fallback
47
+ and re-descended, so the widening actively improves which root-cause is
48
+ reached rather than merely listing alternatives. The result is still a
49
+ single, but better-justified, root-cause. A non-numeric or non-positive
50
+ value falls back to the default.
51
+
31
52
  *fact*:
32
53
  The observed *fact* (symptom, problem, or surprising outcome)
33
54
  whose root cause should be investigated. The skill implicitly
@@ -47,6 +68,13 @@ Drill down deeper with a tunable chain length of seven:
47
68
  ❯ /ase-meta-why -d 7 the production latency spiked after the last deploy
48
69
  ```
49
70
 
71
+ Weigh several candidate sub-causes per level (with backtracking) to avoid
72
+ committing early to the wrong root-cause:
73
+
74
+ ```text
75
+ ❯ /ase-meta-why -w 3 the release was delayed by two weeks
76
+ ```
77
+
50
78
  ## SEE ALSO
51
79
 
52
80
  `ase-code-analyze`, `ase-code-resolve`, `ase-arch-analyze`.