@rse/ase 0.9.45 → 0.9.46

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": "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.45",
9
+ "version": "0.9.46",
10
10
  "license": "Apache-2.0",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -42,12 +42,12 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "commander": "15.0.0",
45
- "@dotenvx/dotenvx": "2.15.1",
45
+ "@dotenvx/dotenvx": "2.17.2",
46
46
  "yaml": "2.9.0",
47
47
  "valibot": "1.4.2",
48
48
  "execa": "10.0.0",
49
49
  "mkdirp": "3.0.1",
50
- "@hapi/hapi": "21.4.9",
50
+ "@hapi/hapi": "21.4.10",
51
51
  "beautiful-mermaid": "1.1.3",
52
52
  "cli-table3": "0.6.5",
53
53
  "chalk": "5.6.2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.45",
3
+ "version": "0.9.46",
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.45",
3
+ "version": "0.9.46",
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.45",
3
+ "version": "0.9.46",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -11,7 +11,12 @@ lint
11
11
 
12
12
  # [plugin] build project
13
13
  build : lint
14
- true
14
+ ( for name in $(cd skills; ls -1 | grep -v ase-meta-intent | sort); do
15
+ echo "<skill name=\"$name\">"
16
+ cat skills/$name/help.md | sed -e '/^## SEE ALSO/,$d'
17
+ echo "</skill>"
18
+ done
19
+ ) >skills/ase-meta-intent/data.md
15
20
 
16
21
  # [plugin] remove all generated files
17
22
  clean
@@ -50,7 +50,7 @@ following procedure:
50
50
  excluding the question label on line 1, and stopping at the first missing line --
51
51
  the same lines the entry loop below renders).
52
52
 
53
- <for items="2 3 4 5 6 7 8 9">
53
+ <for items="2 3 4 5 6 7 8 9 10">
54
54
  Take from <spec/> the line number <item/>.
55
55
  If this line does not exist, <break/>.
56
56
  If this line exists, parse it according to the format `<label/>: <description/>`.
@@ -103,7 +103,7 @@ following procedure:
103
103
  </text>
104
104
 
105
105
  If <n/> is less than 2:
106
- Set <result>ERROR: custom-dialog requires 2-8 answer lines, got <n/></result>
106
+ Set <result>ERROR: custom-dialog requires 2-9 answer lines, got <n/></result>
107
107
  and *SKIP* the following step 2.2 and continue with step 2.3 dispatch.
108
108
 
109
109
  2. Output the following <template/>, end the current turn, wait for the
@@ -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.45",
9
+ "version": "0.9.46",
10
10
  "license": "Apache-2.0",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -23,7 +23,7 @@ Craft Source Code
23
23
 
24
24
  <expand name="getopt"
25
25
  arg1="ase-code-craft"
26
- arg2="--auto|-a --dry|-d --quick|-Q --next|-n=(none|DONE|EDIT|PREFLIGHT|IMPLEMENT)...">
26
+ arg2="--auto|-a --dry|-d --quick|-Q --next|-n=(none|DONE|EDIT|GRILL|PREFLIGHT|IMPLEMENT)...">
27
27
  $ARGUMENTS
28
28
  </expand>
29
29
 
@@ -303,7 +303,21 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
303
303
  to *preflight* the freshly composed plan, bypassing `ase-task-edit`.
304
304
  </elseif>
305
305
 
306
- 4. <else>
306
+ 4. <elseif condition="<head/> is equal `GRILL`">
307
+ Consume the head: set <getopt-option-next/> to the remaining
308
+ tokens (joined back with `,`, or `none` if empty). `GRILL`
309
+ is this skill's own dispatch token, *not* part of
310
+ `ase-task-grill`'s `--next` vocabulary, so it must be
311
+ stripped here rather than forwarded. All remaining tokens are
312
+ `ase-task-grill`'s own vocabulary and are forwarded verbatim.
313
+ <if condition="<getopt-option-next/> is not equal `none`">
314
+ Set <args><args/> --next <getopt-option-next/></args>
315
+ </if>
316
+ Call the tool `Skill(skill: "ase:ase-task-grill", args: "<args/>")`
317
+ to *grill* the freshly composed plan, bypassing `ase-task-edit`.
318
+ </elseif>
319
+
320
+ 5. <else>
307
321
  Hand off to `ase-task-edit`.
308
322
  <if condition="<head/> is equal `EDIT`">
309
323
  Consume the head: set <getopt-option-next/> to the remaining
@@ -50,15 +50,16 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
50
50
  `--next`|`-n` *option*[,...]:
51
51
  Automatically choose the next step after composing the plan.
52
52
  *option* is a single token or a *comma-separated chronological
53
- list* of tokens; an `IMPLEMENT` or `PREFLIGHT` head token is
54
- consumed by this skill (bypassing `ase-task-edit`), and any
53
+ list* of tokens; an `IMPLEMENT`, `PREFLIGHT`, or `GRILL` head token
54
+ is consumed by this skill (bypassing `ase-task-edit`), and any
55
55
  remaining tokens are *forwarded* (via `--next`) to the downstream
56
56
  skill. For all other head tokens, the *entire* list is forwarded
57
57
  to `ase-task-edit`, which consumes its head itself. This lets an
58
58
  entire pipeline be pre-scripted in one shot. Recognized tokens at
59
59
  this skill: `none` (default, hand-off to `ase-task-edit`
60
60
  interactively), `DONE` (stop), `EDIT` (hand off to
61
- `ase-task-edit`), `PREFLIGHT` (hand off to `ase-task-preflight`),
61
+ `ase-task-edit`), `GRILL` (hand off to `ase-task-grill`),
62
+ `PREFLIGHT` (hand off to `ase-task-preflight`),
62
63
  or `IMPLEMENT` (hand off to `ase-task-implement`). Example:
63
64
  `--next PREFLIGHT,IMPLEMENT,DONE` crafts the plan, preflights it,
64
65
  implements it, and exits without further dialog.
@@ -87,4 +88,4 @@ Craft a feature under a named task and directly hand off to implementation:
87
88
  ## SEE ALSO
88
89
 
89
90
  [`ase-code-refactor`](../ase-code-refactor/help.md), [`ase-code-resolve`](../ase-code-resolve/help.md), [`ase-task-edit`](../ase-task-edit/help.md),
90
- [`ase-task-preflight`](../ase-task-preflight/help.md), [`ase-task-implement`](../ase-task-implement/help.md).
91
+ [`ase-task-grill`](../ase-task-grill/help.md), [`ase-task-preflight`](../ase-task-preflight/help.md), [`ase-task-implement`](../ase-task-implement/help.md).
@@ -23,7 +23,7 @@ Refactor Source Code
23
23
 
24
24
  <expand name="getopt"
25
25
  arg1="ase-code-refactor"
26
- arg2="--auto|-a --dry|-d --quick|-Q --next|-n=(none|DONE|EDIT|PREFLIGHT|IMPLEMENT)...">
26
+ arg2="--auto|-a --dry|-d --quick|-Q --next|-n=(none|DONE|EDIT|GRILL|PREFLIGHT|IMPLEMENT)...">
27
27
  $ARGUMENTS
28
28
  </expand>
29
29
 
@@ -303,7 +303,21 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
303
303
  to *preflight* the freshly composed plan, bypassing `ase-task-edit`.
304
304
  </elseif>
305
305
 
306
- 4. <else>
306
+ 4. <elseif condition="<head/> is equal `GRILL`">
307
+ Consume the head: set <getopt-option-next/> to the remaining
308
+ tokens (joined back with `,`, or `none` if empty). `GRILL`
309
+ is this skill's own dispatch token, *not* part of
310
+ `ase-task-grill`'s `--next` vocabulary, so it must be
311
+ stripped here rather than forwarded. All remaining tokens are
312
+ `ase-task-grill`'s own vocabulary and are forwarded verbatim.
313
+ <if condition="<getopt-option-next/> is not equal `none`">
314
+ Set <args><args/> --next <getopt-option-next/></args>
315
+ </if>
316
+ Call the tool `Skill(skill: "ase:ase-task-grill", args: "<args/>")`
317
+ to *grill* the freshly composed plan, bypassing `ase-task-edit`.
318
+ </elseif>
319
+
320
+ 5. <else>
307
321
  Hand off to `ase-task-edit`.
308
322
  <if condition="<head/> is equal `EDIT`">
309
323
  Consume the head: set <getopt-option-next/> to the remaining
@@ -50,15 +50,16 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
50
50
  `--next`|`-n` *option*[,...]:
51
51
  Automatically choose the next step after composing the plan.
52
52
  *option* is a single token or a *comma-separated chronological
53
- list* of tokens; an `IMPLEMENT` or `PREFLIGHT` head token is
54
- consumed by this skill (bypassing `ase-task-edit`), and any
53
+ list* of tokens; an `IMPLEMENT`, `PREFLIGHT`, or `GRILL` head token
54
+ is consumed by this skill (bypassing `ase-task-edit`), and any
55
55
  remaining tokens are *forwarded* (via `--next`) to the downstream
56
56
  skill. For all other head tokens, the *entire* list is forwarded
57
57
  to `ase-task-edit`, which consumes its head itself. This lets an
58
58
  entire pipeline be pre-scripted in one shot. Recognized tokens at
59
59
  this skill: `none` (default, hand off to `ase-task-edit`
60
60
  interactively), `DONE` (stop), `EDIT` (hand off to
61
- `ase-task-edit`), `PREFLIGHT` (hand off to `ase-task-preflight`),
61
+ `ase-task-edit`), `GRILL` (hand off to `ase-task-grill`),
62
+ `PREFLIGHT` (hand off to `ase-task-preflight`),
62
63
  or `IMPLEMENT` (hand off to `ase-task-implement`). Example:
63
64
  `--next PREFLIGHT,IMPLEMENT,DONE` refactors, preflights, implements,
64
65
  and exits without further dialog.
@@ -87,4 +88,4 @@ Refactor under a named task and directly hand off to implementation:
87
88
  ## SEE ALSO
88
89
 
89
90
  [`ase-code-craft`](../ase-code-craft/help.md), [`ase-code-resolve`](../ase-code-resolve/help.md), [`ase-task-edit`](../ase-task-edit/help.md),
90
- [`ase-task-preflight`](../ase-task-preflight/help.md), [`ase-task-implement`](../ase-task-implement/help.md).
91
+ [`ase-task-grill`](../ase-task-grill/help.md), [`ase-task-preflight`](../ase-task-preflight/help.md), [`ase-task-implement`](../ase-task-implement/help.md).
@@ -23,7 +23,7 @@ Resolve Problem
23
23
 
24
24
  <expand name="getopt"
25
25
  arg1="ase-code-resolve"
26
- arg2="--auto|-a --dry|-d --quick|-Q --next|-n=(none|DONE|EDIT|PREFLIGHT|IMPLEMENT)...">
26
+ arg2="--auto|-a --dry|-d --quick|-Q --next|-n=(none|DONE|EDIT|GRILL|PREFLIGHT|IMPLEMENT)...">
27
27
  $ARGUMENTS
28
28
  </expand>
29
29
 
@@ -364,7 +364,21 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
364
364
  to *preflight* the freshly composed plan, bypassing `ase-task-edit`.
365
365
  </elseif>
366
366
 
367
- 4. <else>
367
+ 4. <elseif condition="<head/> is equal `GRILL`">
368
+ Consume the head: set <getopt-option-next/> to the remaining
369
+ tokens (joined back with `,`, or `none` if empty). `GRILL`
370
+ is this skill's own dispatch token, *not* part of
371
+ `ase-task-grill`'s `--next` vocabulary, so it must be
372
+ stripped here rather than forwarded. All remaining tokens are
373
+ `ase-task-grill`'s own vocabulary and are forwarded verbatim.
374
+ <if condition="<getopt-option-next/> is not equal `none`">
375
+ Set <args><args/> --next <getopt-option-next/></args>
376
+ </if>
377
+ Call the tool `Skill(skill: "ase:ase-task-grill", args: "<args/>")`
378
+ to *grill* the freshly composed plan, bypassing `ase-task-edit`.
379
+ </elseif>
380
+
381
+ 5. <else>
368
382
  Hand off to `ase-task-edit`.
369
383
  <if condition="<head/> is equal `EDIT`">
370
384
  Consume the head: set <getopt-option-next/> to the remaining
@@ -55,15 +55,16 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
55
55
  `--next`|`-n` *option*[,...]:
56
56
  Automatically choose the next step after composing the plan.
57
57
  *option* is a single token or a *comma-separated chronological
58
- list* of tokens; an `IMPLEMENT` or `PREFLIGHT` head token is
59
- consumed by this skill (bypassing `ase-task-edit`), and any
58
+ list* of tokens; an `IMPLEMENT`, `PREFLIGHT`, or `GRILL` head token
59
+ is consumed by this skill (bypassing `ase-task-edit`), and any
60
60
  remaining tokens are *forwarded* (via `--next`) to the downstream
61
61
  skill. For all other head tokens, the *entire* list is forwarded
62
62
  to `ase-task-edit`, which consumes its head itself. This lets an
63
63
  entire pipeline be pre-scripted in one shot. Recognized tokens at
64
64
  this skill: `none` (default, hand off to `ase-task-edit`
65
65
  interactively), `DONE` (stop), `EDIT` (hand off to
66
- `ase-task-edit`), `PREFLIGHT` (hand off to `ase-task-preflight`),
66
+ `ase-task-edit`), `GRILL` (hand off to `ase-task-grill`),
67
+ `PREFLIGHT` (hand off to `ase-task-preflight`),
67
68
  or `IMPLEMENT` (hand off to `ase-task-implement`). Example:
68
69
  `--next IMPLEMENT,DONE` resolves the problem, implements it, and
69
70
  exits without further dialog.
@@ -93,5 +94,5 @@ Resolve a previously analyzed issue and hand off to implementation:
93
94
  ## SEE ALSO
94
95
 
95
96
  [`ase-code-craft`](../ase-code-craft/help.md), [`ase-code-refactor`](../ase-code-refactor/help.md), [`ase-code-analyze`](../ase-code-analyze/help.md),
96
- [`ase-arch-analyze`](../ase-arch-analyze/help.md), [`ase-task-edit`](../ase-task-edit/help.md), [`ase-task-preflight`](../ase-task-preflight/help.md),
97
- [`ase-task-implement`](../ase-task-implement/help.md).
97
+ [`ase-arch-analyze`](../ase-arch-analyze/help.md), [`ase-task-edit`](../ase-task-edit/help.md), [`ase-task-grill`](../ase-task-grill/help.md),
98
+ [`ase-task-preflight`](../ase-task-preflight/help.md), [`ase-task-implement`](../ase-task-implement/help.md).
@@ -0,0 +1,116 @@
1
+ ---
2
+ name: ase-meta-eli5
3
+ argument-hint: "[--help|-h] [--ground|-g] <topic>"
4
+ description: >
5
+ Explain a topic in "Explain Like I'm 5" (ELI5) style, optionally
6
+ grounded in Internet/Web facts. Use when the user wants a topic
7
+ explained in a very simple, child-friendly way, or mentions "eli5"
8
+ or "explain like I'm 5".
9
+ user-invocable: true
10
+ disable-model-invocation: false
11
+ effort: high
12
+ allowed-tools:
13
+ - "Agent"
14
+ ---
15
+
16
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
17
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
18
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
19
+
20
+ <skill name="ase-meta-eli5">
21
+ Explain a Topic Like I'm 5
22
+ </skill>
23
+
24
+ <expand name="getopt"
25
+ arg1="ase-meta-eli5"
26
+ arg2="--ground|-g">
27
+ $ARGUMENTS
28
+ </expand>
29
+
30
+ <objective>
31
+ *Explain* the following topic in "Explain Like I'm 5" (ELI5) style,
32
+ so that even a five year old child could understand it:
33
+ <topic><getopt-arguments/></topic>
34
+ </objective>
35
+
36
+ <flow>
37
+
38
+ 1. <step id="STEP 1: Check Topic">
39
+
40
+ <if condition="<topic/> is empty">
41
+ Only output the following <template/> and then immediately *STOP*
42
+ processing the entire current skill:
43
+
44
+ <template>
45
+ ⧉ **ASE**: ✪ skill: **ase-meta-eli5**, ▶ ERROR: expected a `<topic>` argument
46
+ </template>
47
+ </if>
48
+
49
+ Set <facts></facts> (set to empty)
50
+
51
+ </step>
52
+
53
+ 2. <step id="STEP 2: Ground Topic" condition="<getopt-option-ground/> is equal `true`">
54
+
55
+ Use the `ase-meta-search` skill in a sub-agent to gather facts
56
+ about the <topic/>: call the tool...
57
+
58
+ `Agent(
59
+ description: "Query Web Search Service",
60
+ subagent_type: "ase:ase-meta-search",
61
+ prompt: "Search the Internet/Web and gather facts about the following topic: <topic/>",
62
+ run_in_background: false
63
+ )`
64
+
65
+ ...and store the returned facts in <facts/>.
66
+
67
+ <if condition="<facts/> contains no usable facts about <topic/>">
68
+
69
+ Set <facts></facts> (set facts to empty), so the explanation below
70
+ falls back to model knowledge, and output the following <template/>:
71
+
72
+ <template>
73
+ <ase-tpl-bullet-secondary/> **WARNING**: grounding found no usable facts -- falling back to model knowledge.
74
+ </template>
75
+
76
+ </if>
77
+
78
+ </step>
79
+
80
+ 3. <step id="STEP 3: Explain Topic">
81
+
82
+ Explain the <topic/> in "Explain Like I'm 5" (ELI5) style: use
83
+ *simple*, *jargon-free* wording a five year old child could
84
+ understand -- short sentences, everyday words, and familiar images.
85
+ Do *not* use technical terms without immediately putting them into
86
+ child-friendly words.
87
+
88
+ <if condition="<facts/> is not empty">
89
+ Ground the explanation in the facts of <facts/> and do not
90
+ contradict them.
91
+ </if>
92
+
93
+ For this, first, explain *WHAT* the topic is and store it in
94
+ <what/>. Second, give an *ANALOGY* by comparing the topic to
95
+ something from the everyday life of a child and store this in
96
+ <analogy/>. Third, explain *WHY* the topic matters and store this in
97
+ <why/>.
98
+
99
+ Ensure that each of <what/>, <analogy/>, and <why/> is a *very
100
+ brief* and *concise* single text paragraph.
101
+
102
+ Output the result with the following <template/>:
103
+
104
+ <template>
105
+ <ase-tpl-bullet-secondary/> **TOPIC**: **<topic/>**
106
+
107
+ <ase-tpl-bullet-normal/> **WHAT**: <what/>.
108
+
109
+ <ase-tpl-bullet-normal/> **ANALOGY**: <analogy/>.
110
+
111
+ <ase-tpl-bullet-signal/> **WHY**: <why/>.
112
+ </template>
113
+
114
+ </step>
115
+
116
+ </flow>
@@ -0,0 +1,61 @@
1
+
2
+ ## NAME
3
+
4
+ `ase-meta-eli5` - Explain a Topic Like I'm 5
5
+
6
+ ## SYNOPSIS
7
+
8
+ `ase-meta-eli5`
9
+ [`--help`|`-h`]
10
+ [`--ground`|`-g`]
11
+ *topic*
12
+
13
+ ## DESCRIPTION
14
+
15
+ The `ase-meta-eli5` skill explains the supplied *topic* in "Explain
16
+ Like I'm 5" (ELI5) style, so that even a five year old child could
17
+ understand it. The explanation uses simple, jargon-free wording --
18
+ short sentences, everyday words, and familiar images -- and is
19
+ structured into three labeled blocks: *WHAT* (a plain-words summary),
20
+ *ANALOGY* (a concrete everyday-life comparison), and *WHY* (why the
21
+ topic matters), each kept brief with 1-3 bullet points.
22
+
23
+ By default the explanation is derived from model knowledge only. With
24
+ the `--ground`/`-g` option, the skill first searches the Internet/Web
25
+ for facts about the topic via the `ase-meta-search` skill (dispatched
26
+ in a sub-agent, querying all available search backends) and grounds
27
+ the explanation in the found facts. If the grounding yields no usable
28
+ facts, a warning is emitted and the explanation falls back to model
29
+ knowledge.
30
+
31
+ ## OPTIONS
32
+
33
+ `--ground`|`-g`:
34
+ Ground the explanation in Internet/Web facts gathered via the
35
+ `ase-meta-search` skill before explaining. Without this option,
36
+ the explanation is derived from model knowledge only.
37
+
38
+ ## ARGUMENTS
39
+
40
+ *topic*:
41
+ The topic to be explained. It may be a technical concept, a
42
+ phenomenon, or any other subject; the skill explains it in a
43
+ child-friendly way.
44
+
45
+ ## EXAMPLES
46
+
47
+ Explain a technical concept from model knowledge:
48
+
49
+ ```text
50
+ ❯ /ase-meta-eli5 What is a Fourier transform?
51
+ ```
52
+
53
+ Explain a recent topic grounded in Internet/Web facts:
54
+
55
+ ```text
56
+ ❯ /ase-meta-eli5 --ground What is Agentic Software Engineering?
57
+ ```
58
+
59
+ ## SEE ALSO
60
+
61
+ [`ase-code-explain`](../ase-code-explain/help.md), [`ase-meta-search`](../ase-meta-search/help.md), [`ase-docs-distill`](../ase-docs-distill/help.md).
@@ -0,0 +1,157 @@
1
+ ---
2
+ name: ase-meta-intent
3
+ argument-hint: "[--help|-h] <intent>"
4
+ description: >
5
+ Match a free-text intent against the accumulated help of all ASE
6
+ skills, generate the single best-fitting `/ase:ase-xxx-xxx` command
7
+ with concrete options and arguments, and let the user execute it,
8
+ refine the intent, or cancel. Use when the user knows what they want
9
+ but not which skill or flags realize it, or mentions "intent" or
10
+ requests "help".
11
+ user-invocable: true
12
+ disable-model-invocation: false
13
+ effort: high
14
+ allowed-tools:
15
+ - "Skill"
16
+ ---
17
+
18
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
19
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
20
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
21
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
22
+
23
+ <skill name="ase-meta-intent">
24
+ Match an Intent to an ASE Command
25
+ </skill>
26
+
27
+ <expand name="getopt"
28
+ arg1="ase-meta-intent"
29
+ arg2="">
30
+ $ARGUMENTS
31
+ </expand>
32
+
33
+ <objective>
34
+ *Match* the following free-text intent against the accumulated help of
35
+ all ASE skills and *generate* the single best-fitting `/ase:ase-xxx-xxx`
36
+ command that realizes it:
37
+ <intent><getopt-arguments/></intent>
38
+ </objective>
39
+
40
+ The following <corpus/> is the *accumulated help* of all ASE skills --
41
+ the concatenation of every skill's `help.md` file -- and is the *sole*
42
+ catalog you match <intent/> against:
43
+
44
+ <corpus>
45
+ @${CLAUDE_SKILL_DIR}/data.md
46
+ </corpus>
47
+
48
+ <flow>
49
+
50
+ 1. <step id="STEP 1: Check Intent">
51
+
52
+ <if condition="<intent/> is empty">
53
+ Only output the following <template/> and then immediately *STOP*
54
+ processing the entire current skill:
55
+
56
+ <template>
57
+ ⧉ **ASE**: ✪ skill: **ase-meta-intent**, ▶ ERROR: expected a `<intent>` argument
58
+ </template>
59
+ </if>
60
+
61
+ </step>
62
+
63
+ 2. <step id="STEP 2: Match Intent and Dialog">
64
+
65
+ *REPEAT* the following sub-steps in a *LOOP* until the user either
66
+ *executes* the generated command or *cancels* the dialog in sub-step 4:
67
+
68
+ 1. *Match Intent*:
69
+
70
+ Match the current <intent/> against the <corpus/> and select the
71
+ *single* best-fitting skill. From that skill's `## SYNOPSIS`,
72
+ `## OPTIONS`, and `## ARGUMENTS` sections in <corpus/>,
73
+ *generate* a concrete command that realizes <intent/>:
74
+
75
+ - Set <name/> to the selected skill's name (e.g. `ase-code-lint`).
76
+ - Set <arguments/> to the concrete option flags and positional
77
+ arguments -- derived from the skill's `## OPTIONS` and
78
+ `## ARGUMENTS` -- that best realize <intent/> (may be empty).
79
+ - Set <command>/ase:<name/> <arguments/></command> (the full
80
+ command line, with surplus inner spaces collapsed).
81
+ - Set <rationale/> to a *very brief*, single-sentence
82
+ justification of why the selected skill and its options match
83
+ <intent/>.
84
+
85
+ 2. *Guard No Match*:
86
+
87
+ <if condition="no skill in <corpus/> adequately matches <intent/>">
88
+ Output the following <template/> and then *continue* the *loop*
89
+ at sub-step 4 to prompt the user for a refined or clearer intent
90
+ via the dialog's free-text channel (do *not* stop and do *not*
91
+ render a command):
92
+
93
+ <template>
94
+ <ase-tpl-bullet-secondary/> **WARNING**: no confident match for the intent -- please refine or clarify it.
95
+ </template>
96
+ </if>
97
+
98
+ 3. *Render Command*:
99
+
100
+ Output the generated command with the following <template/>:
101
+
102
+ <template>
103
+ <ase-tpl-head title="SKILL COMMAND PROPOSAL"/>
104
+
105
+ ● **INTENT**:
106
+ ○ <intent/>
107
+
108
+ ● **COMMAND**:
109
+ ⌘ `<command/>`
110
+
111
+ ● **RATIONALE**:
112
+ ○ <rationale/>
113
+
114
+ <ase-tpl-foot title="SKILL COMMAND PROPOSAL"/>
115
+ </template>
116
+
117
+ 4. *Dispatch Command*:
118
+
119
+ In the following, you *MUST* *NOT* use your built-in
120
+ <user-dialog-tool/> tool! Instead, you *MUST* just show a custom
121
+ dialog according to the expanded `custom-dialog` definition. You
122
+ *MUST* closely follow this definition.
123
+
124
+ Let the user decide what to do with the generated command by
125
+ raising a question with the following custom dialog (invoked with
126
+ `--other`, so that any free-text instruction is accepted as an
127
+ intent refinement):
128
+
129
+ <expand name="custom-dialog" arg1="--other">
130
+ Dispatch: What would you like to do with the generated command?
131
+ EXECUTE: Execute the generated command now.
132
+ CANCEL: Cancel this dialog.
133
+ </expand>
134
+
135
+ Check the tool <result/> and dispatch accordingly:
136
+
137
+ - If <result/> is `CANCEL`:
138
+ *Break* out of the *loop* and stop processing without any
139
+ further output.
140
+
141
+ - If <result/> is `EXECUTE`:
142
+ *Break* out of the *loop*, output the following <template/>,
143
+ and then call the tool `Skill(skill: "ase:<name/>", args:
144
+ "<arguments/>")` to *execute* the generated command:
145
+
146
+ <template>
147
+ ⧉ **ASE**: ◉ intent: **<intent/>**, ⌘ command: **<command/>**, ▶ status: **command executing**
148
+ </template>
149
+
150
+ - If <result/> matches `OTHER: <text/>`:
151
+ Set <intent><intent/> <text/></intent> (fold the free-text
152
+ instruction into the intent). Then you *MUST* *continue* the
153
+ *loop* at sub-step **2.1** to re-match the refined intent.
154
+
155
+ </step>
156
+
157
+ </flow>
@@ -0,0 +1,56 @@
1
+
2
+ ## NAME
3
+
4
+ `ase-meta-intent` - Match an Intent to an ASE Command
5
+
6
+ ## SYNOPSIS
7
+
8
+ `ase-meta-intent`
9
+ [`--help`|`-h`]
10
+ *intent*
11
+
12
+ ## DESCRIPTION
13
+
14
+ The `ase-meta-intent` skill matches a free-text *intent* against the
15
+ *accumulated help* of all ASE skills -- the concatenation of every
16
+ skill's `help.md` file into `skills/ase-meta-intent/data.md`, built by
17
+ `npm start build` in `plugin/` -- and generates the *single* best-fitting
18
+ `/ase:ase-xxx-xxx` command that realizes the intent, complete with
19
+ concrete option flags and positional arguments derived from the selected
20
+ skill's `SYNOPSIS`, `OPTIONS`, and `ARGUMENTS`.
21
+
22
+ The generated command is presented together with a brief rationale in an
23
+ interactive dialog. The dialog lets the user *execute* the command (which
24
+ dispatches the target skill via its generated arguments), *cancel* the
25
+ operation, or *refine* the intent by typing any free-text instruction --
26
+ the instruction is folded into the intent and the best-fitting command is
27
+ re-matched and re-rendered. If no skill confidently matches the intent, a
28
+ warning is emitted and the user is prompted to refine or clarify it.
29
+
30
+ The skill exposes *no* option flags beyond `--help`/`-h`; it is driven
31
+ entirely through the intent argument and the interactive dialog.
32
+
33
+ ## ARGUMENTS
34
+
35
+ *intent*:
36
+ The free-text intent to be realized. It describes *what* the user
37
+ wants to achieve; the skill determines *which* ASE skill and *which*
38
+ options and arguments realize it.
39
+
40
+ ## EXAMPLES
41
+
42
+ Route an intent to the matching command and pick from the dialog:
43
+
44
+ ```text
45
+ ❯ /ase-meta-intent lint the TypeScript sources for high-severity issues only
46
+ ```
47
+
48
+ Route a planning intent to the matching command:
49
+
50
+ ```text
51
+ ❯ /ase-meta-intent explain how the authentication module works
52
+ ```
53
+
54
+ ## SEE ALSO
55
+
56
+ [`ase-meta-proximity`](../ase-meta-proximity/help.md), [`ase-meta-search`](../ase-meta-search/help.md), [`ase-code-craft`](../ase-code-craft/help.md).
@@ -0,0 +1,224 @@
1
+ ---
2
+ name: ase-meta-proximity
3
+ argument-hint: "[--help|-h] [--ground|-g] [--loop|-l] <topic>"
4
+ description: >
5
+ Determine the conceptual proximity of a topic -- its parent topic,
6
+ its most relevant sibling topics, and its most relevant child
7
+ topics -- optionally grounded in Internet/Web facts and optionally
8
+ navigable in an interactive loop. Use when the user wants to explore
9
+ the conceptual neighborhood of a topic, or mentions "proximity" or
10
+ "related topics".
11
+ user-invocable: true
12
+ disable-model-invocation: false
13
+ effort: high
14
+ allowed-tools:
15
+ - "Agent"
16
+ ---
17
+
18
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
19
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
20
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
21
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
22
+
23
+ <skill name="ase-meta-proximity">
24
+ Determine the Conceptual Proximity of a Topic
25
+ </skill>
26
+
27
+ <expand name="getopt"
28
+ arg1="ase-meta-proximity"
29
+ arg2="--ground|-g --loop|-l">
30
+ $ARGUMENTS
31
+ </expand>
32
+
33
+ <objective>
34
+ *Determine* the *conceptual proximity* of the following topic -- its
35
+ *parent* topic, its most relevant *sibling* topics, and its most
36
+ relevant *child* topics:
37
+ <topic><getopt-arguments/></topic>
38
+ </objective>
39
+
40
+ <define name="gather-facts">
41
+ <if condition="<getopt-option-ground/> is equal `true`">
42
+ Set <prompt>Search the Internet/Web and gather facts about
43
+ <arg1/></prompt>.
44
+
45
+ Then use the `ase-meta-search` skill in a sub-agent to gather facts with
46
+ the following tool call and store the returned facts in the placeholder
47
+ named `<arg2/>`:
48
+
49
+ `Agent(
50
+ description: "Query Web Search Service",
51
+ subagent_type: "ase:ase-meta-search",
52
+ prompt: "<prompt/>",
53
+ run_in_background: false
54
+ )`
55
+
56
+ <if condition="the placeholder named `<arg2/>` contains no usable facts">
57
+ Set the placeholder named `<arg2/>` to empty, so the determination below
58
+ falls back to model knowledge, and output the following <template/>:
59
+
60
+ <template>
61
+ <ase-tpl-bullet-secondary/> **WARNING**: grounding found no usable facts -- falling back to model knowledge.
62
+ </template>
63
+ </if>
64
+ </if>
65
+ <else>
66
+ Use the model's world knowledge and determine facts about <arg1/> and
67
+ store those facts in the placeholder named `<arg2/>`.
68
+ </else>
69
+ </define>
70
+
71
+ <flow>
72
+
73
+ 1. <step id="STEP 1: Check Topic">
74
+
75
+ <if condition="<topic/> is empty">
76
+ Only output the following <template/> and then immediately *STOP*
77
+ processing the entire current skill:
78
+
79
+ <template>
80
+ ⧉ **ASE**: ✪ skill: **ase-meta-proximity**, ▶ ERROR: expected a `<topic>` argument
81
+ </template>
82
+ </if>
83
+
84
+ </step>
85
+
86
+ 2. <step id="STEP 2: Explore Proximity">
87
+
88
+ *REPEAT* the following sub-steps in a *LOOP* until either
89
+ <getopt-option-loop/> is *not* equal `true` (then the loop runs
90
+ exactly *once* and stops after rendering), or the user declines/cancels
91
+ the dialog in sub-step 5:
92
+
93
+ 1. *Determine Topic*:
94
+
95
+ Determine the canonical name of the central *topic* which is stored
96
+ in <topic/>.
97
+
98
+ <expand name="gather-facts"
99
+ arg1="the following topic: <topic/>"
100
+ arg2="facts-topic"></expand>
101
+
102
+ Ground the determination of the canonical name of the topic
103
+ <topic/> in the facts of <facts-topic/> and do not contradict
104
+ them. Update <topic/> accordingly.
105
+
106
+ 2. *Determine Proximity*:
107
+
108
+ Determine the *conceptual proximity* of the current <topic/>
109
+ along three *dimensions*:
110
+
111
+ - **PARENT**:
112
+
113
+ The single most relevant *parent* topic (the broader topic
114
+ that <topic/> is a specialization of), which will be stored
115
+ in <parent/>.
116
+
117
+ <expand name="gather-facts"
118
+ arg1="the PARENT topic (the broader topic that the given topic is a specialization of) of the following topic: <topic/>"
119
+ arg2="facts-parent"></expand>
120
+
121
+ Ground the determination of the canonical name of the parent
122
+ topic <parent/> in the facts of <facts-parent/> and do not
123
+ contradict them.
124
+
125
+ - **SIBLINGS**:
126
+
127
+ The *four* most relevant *sibling* topics (topics on the
128
+ same level that share the same parent), which will be stored
129
+ in <sibling-1/> to <sibling-4/>.
130
+
131
+ <expand name="gather-facts"
132
+ arg1="the SIBLING topics (topics on the same level that share the same parent) of the following topic: <topic/>"
133
+ arg2="facts-siblings"></expand>
134
+
135
+ Ground the determination of the canonical names of the most
136
+ relevant sibling topics <sibling-1/> to <sibling-4/> in the
137
+ facts of <facts-siblings/> and do not contradict them.
138
+
139
+ - **CHILDREN**:
140
+
141
+ The *four* most relevant *children* topics (narrower topics
142
+ that are specializations of <topic/>), stored in <child-1/>
143
+ to <child-4/>.
144
+
145
+ <expand name="gather-facts"
146
+ arg1="the CHILDREN topics (narrower topics that are specializations) of the following topic: <topic/>"
147
+ arg2="facts-children"></expand>
148
+
149
+ Ground the determination of the canonical names of the most
150
+ relevant children topics <child-1/> to <child-4/> in the
151
+ facts of <facts-children/> and do not contradict them.
152
+
153
+ 3. *Render Proximity*:
154
+
155
+ Output the result with the following <template/>, listing each
156
+ proximity topic under its bullet-prefixed section header.
157
+
158
+ <template>
159
+ <ase-tpl-head title="PROXIMITY TOPICS"/>
160
+
161
+ ● **PARENT**:
162
+ ↑ <parent/>
163
+
164
+ ● **TOPIC**:
165
+ ○ **<topic/>**
166
+
167
+ ● **SIBLINGS**:
168
+ ⇄ <sibling-1/>
169
+ ⇄ <sibling-2/>
170
+ ⇄ <sibling-3/>
171
+ ⇄ <sibling-4/>
172
+
173
+ ● **CHILDREN**:
174
+ ↓ <child-1/>
175
+ ↓ <child-2/>
176
+ ↓ <child-3/>
177
+ ↓ <child-4/>
178
+
179
+ <ase-tpl-foot title="PROXIMITY TOPICS"/>
180
+ </template>
181
+
182
+ 4. <if condition="<getopt-option-loop/> is not equal `true`">
183
+ The loop runs only once in non-interactive mode: *break* out of
184
+ the *loop* and stop processing without any further output.
185
+ </if>
186
+
187
+ 5. *Navigate Proximity*:
188
+
189
+ In the following, you *MUST* *NOT* use your built-in
190
+ <user-dialog-tool/> tool! Instead, you *MUST* just show a custom
191
+ dialog according to the expanded `custom-dialog` definition. You
192
+ *MUST* closely follow this definition.
193
+
194
+ Let the user pick one of the nine proximity topics to navigate
195
+ to by raising a question with the following custom dialog:
196
+
197
+ <expand name="custom-dialog" arg1="--no-other">
198
+ Navigate: Which proximity topic would you like to navigate to?
199
+ PARENT: ↑ <parent/>
200
+ SIBLING-1: ⇄ <sibling-1/>
201
+ SIBLING-2: ⇄ <sibling-2/>
202
+ SIBLING-3: ⇄ <sibling-3/>
203
+ SIBLING-4: ⇄ <sibling-4/>
204
+ CHILD-1: ↓ <child-1/>
205
+ CHILD-2: ↓ <child-2/>
206
+ CHILD-3: ↓ <child-3/>
207
+ CHILD-4: ↓ <child-4/>
208
+ </expand>
209
+
210
+ Check the tool <result/> and dispatch accordingly:
211
+
212
+ - If <result/> is `CANCEL`:
213
+ *Break* out of the *loop* and stop processing without any
214
+ further output.
215
+
216
+ - Otherwise: Set <topic/> to the proximity topic corresponding
217
+ to the selected <result/> (the <parent/>, <sibling-K/>, or
218
+ <child-K/> value behind the chosen label).
219
+
220
+ Then you *MUST* *continue* the *loop* at step **2.1**.
221
+
222
+ </step>
223
+
224
+ </flow>
@@ -0,0 +1,78 @@
1
+
2
+ ## NAME
3
+
4
+ `ase-meta-proximity` - Determine the Conceptual Proximity of a Topic
5
+
6
+ ## SYNOPSIS
7
+
8
+ `ase-meta-proximity`
9
+ [`--help`|`-h`]
10
+ [`--ground`|`-g`]
11
+ [`--loop`|`-l`]
12
+ *topic*
13
+
14
+ ## DESCRIPTION
15
+
16
+ The `ase-meta-proximity` skill determines the *conceptual proximity* of
17
+ the supplied *topic* along three dimensions and reports the neighboring
18
+ topics grouped into three labeled sections: *PARENT* (the single broader
19
+ topic that *topic* specializes), *SIBLINGS* (the four most relevant
20
+ topics on the same level, sharing the same parent), and *CHILDREN* (the
21
+ four most relevant narrower topics that specialize *topic*).
22
+
23
+ By default the proximity is derived from model knowledge only. With the
24
+ `--ground`/`-g` option, the skill first searches the Internet/Web for
25
+ facts about the topic via the `ase-meta-search` skill (dispatched in a
26
+ sub-agent, querying all available search backends) and grounds the
27
+ determination in the found facts.
28
+
29
+ Without the `--loop`/`-l` option, the skill determines and prints the
30
+ proximity of the given topic once and then stops. With the `--loop`/`-l`
31
+ option, the skill instead presents the nine neighboring topics in an
32
+ interactive dialog; selecting one of them makes it the new *current
33
+ topic* and restarts the determination from the beginning, so the user
34
+ can *navigate* the topic taxonomy up (parent), sideways (siblings), and
35
+ down (children). Cancelling the dialog exits the loop. When `--loop` is
36
+ combined with `--ground`, each newly selected topic is re-grounded via
37
+ the `ase-meta-search` sub-agent before its proximity is re-determined.
38
+
39
+ ## OPTIONS
40
+
41
+ `--ground`|`-g`:
42
+ Ground the determination in Internet/Web facts gathered via the
43
+ `ase-meta-search` skill before determining the proximity. Without
44
+ this option, the determination is derived from model knowledge only.
45
+ When combined with `--loop`, every newly navigated-to topic is
46
+ re-grounded.
47
+
48
+ `--loop`|`-l`:
49
+ Present the neighboring topics in an interactive dialog and, upon
50
+ selection, adopt the picked topic as the new current topic and
51
+ restart the determination. Without this option, the proximity of the
52
+ given topic is printed once and the skill stops.
53
+
54
+ ## ARGUMENTS
55
+
56
+ *topic*:
57
+ The topic whose conceptual proximity is to be determined. It may be
58
+ a technical concept, a phenomenon, or any other subject; the skill
59
+ determines its parent, sibling, and child topics.
60
+
61
+ ## EXAMPLES
62
+
63
+ Determine the proximity of a topic from model knowledge:
64
+
65
+ ```text
66
+ ❯ /ase-meta-proximity Fourier transform
67
+ ```
68
+
69
+ Interactively navigate the conceptual neighborhood, grounded in
70
+ Internet/Web facts:
71
+
72
+ ```text
73
+ ❯ /ase-meta-proximity --ground --loop Agentic Software Engineering
74
+ ```
75
+
76
+ ## SEE ALSO
77
+
78
+ [`ase-meta-eli5`](../ase-meta-eli5/help.md), [`ase-meta-search`](../ase-meta-search/help.md), [`ase-code-explain`](../ase-code-explain/help.md).