@rse/ase 0.9.15 → 0.9.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dst/ase-mcp.js +3 -15
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/package.json +1 -1
- package/plugin/skills/ase-meta-update/SKILL.md +189 -0
- package/plugin/skills/ase-meta-update/help.md +66 -0
package/dst/ase-mcp.js
CHANGED
|
@@ -56,13 +56,8 @@ export default class MCPCommand {
|
|
|
56
56
|
}
|
|
57
57
|
/* bridge stdio to a Streamable HTTP MCP endpoint on the local service */
|
|
58
58
|
async runBridge() {
|
|
59
|
-
/*
|
|
60
|
-
|
|
61
|
-
is funnelled into the same reconnect machinery used at runtime so
|
|
62
|
-
that a transient startup failure is recoverable instead of fatal */
|
|
63
|
-
const ctx0 = this.loadContext();
|
|
64
|
-
let projectId = ctx0.projectId;
|
|
65
|
-
let port = ctx0.port ?? 0;
|
|
59
|
+
/* ensure the service is running */
|
|
60
|
+
let { projectId, port } = await this.ensureService();
|
|
66
61
|
/* create MCP STDIO server (lives for the entire bridge lifetime) */
|
|
67
62
|
const server = new StdioServerTransport();
|
|
68
63
|
/* track active client and bridge-level closed state */
|
|
@@ -159,17 +154,10 @@ export default class MCPCommand {
|
|
|
159
154
|
/* start server and initial client */
|
|
160
155
|
await server.start();
|
|
161
156
|
try {
|
|
162
|
-
/* ensure the service is running, then connect; both the
|
|
163
|
-
service start/probe and the connect are covered here so that
|
|
164
|
-
an initial failure recovers via the reconnect machinery
|
|
165
|
-
(now in place) instead of crashing the bridge outright */
|
|
166
|
-
const ctx = await this.ensureService();
|
|
167
|
-
projectId = ctx.projectId;
|
|
168
|
-
port = ctx.port;
|
|
169
157
|
await connectClient();
|
|
170
158
|
}
|
|
171
159
|
catch (err) {
|
|
172
|
-
/*
|
|
160
|
+
/* service vanished between probe and connect — recover instead of crashing */
|
|
173
161
|
triggerReconnect(`initial connect failed: ${this.asError(err).message}`);
|
|
174
162
|
}
|
|
175
163
|
/* periodically probe the service; trigger reconnect if it is gone */
|
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.
|
|
9
|
+
"version": "0.9.17",
|
|
10
10
|
"license": "GPL-3.0-only",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "Dr. Ralf S. Engelschall",
|
package/plugin/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.
|
|
9
|
+
"version": "0.9.17",
|
|
10
10
|
"license": "GPL-3.0-only",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "Dr. Ralf S. Engelschall",
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ase-meta-update
|
|
3
|
+
argument-hint: "[--help|-h] <target>[,...] [<source>[,...]]"
|
|
4
|
+
description: >
|
|
5
|
+
Update one set of artifact kinds (the target) to reflect the current
|
|
6
|
+
state of another set of artifact kinds (the source). Use when the
|
|
7
|
+
user wants to "update", "reconcile", or "sync" artifacts like SPEC,
|
|
8
|
+
ARCH, CODE, DOCS, TASK, INFR, or OTHR against each other.
|
|
9
|
+
user-invocable: true
|
|
10
|
+
disable-model-invocation: false
|
|
11
|
+
effort: xhigh
|
|
12
|
+
allowed-tools:
|
|
13
|
+
- "Read"
|
|
14
|
+
- "Write"
|
|
15
|
+
- "Edit"
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
@${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
|
|
19
|
+
@${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
|
|
20
|
+
@${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
|
|
21
|
+
|
|
22
|
+
<skill name="ase-meta-update">
|
|
23
|
+
Update Artifacts from Artifacts
|
|
24
|
+
</skill>
|
|
25
|
+
|
|
26
|
+
<expand name="getopt" arg1="ase-meta-update">
|
|
27
|
+
$ARGUMENTS
|
|
28
|
+
</expand>
|
|
29
|
+
|
|
30
|
+
<objective>
|
|
31
|
+
*Update* the *target* artifact kinds to *reflect* the *current
|
|
32
|
+
state* of the *source* artifact kinds, by reading the source
|
|
33
|
+
artifacts and adjusting the target artifacts accordingly:
|
|
34
|
+
<request><getopt-arguments/></request>.
|
|
35
|
+
</objective>
|
|
36
|
+
|
|
37
|
+
@${CLAUDE_SKILL_DIR}/../../meta/ase-format-meta.md
|
|
38
|
+
@${CLAUDE_SKILL_DIR}/../../meta/ase-format-spec.md
|
|
39
|
+
@${CLAUDE_SKILL_DIR}/../../meta/ase-format-arch.md
|
|
40
|
+
@${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md
|
|
41
|
+
|
|
42
|
+
Procedure
|
|
43
|
+
---------
|
|
44
|
+
|
|
45
|
+
You *MUST* follow the following numbered items *strictly* *sequentially*!
|
|
46
|
+
You *MUST* not skip any numbered item during processing!
|
|
47
|
+
|
|
48
|
+
You *MUST* *NOT* output anything in this entire procedure, *except* when
|
|
49
|
+
explicitly requested by this procedure via outputs based on a <template/>!
|
|
50
|
+
|
|
51
|
+
<flow>
|
|
52
|
+
|
|
53
|
+
1. <step id="STEP 1: Determine Target and Source">
|
|
54
|
+
|
|
55
|
+
1. The recognized artifact kinds are the seven tokens `TASK`,
|
|
56
|
+
`SPEC`, `ARCH`, `CODE`, `DOCS`, `INFR`, and `OTHR`. Parse
|
|
57
|
+
<getopt-arguments/> as one or two whitespace-separated fields:
|
|
58
|
+
the *first* field is the comma-separated <target/> kind list, the
|
|
59
|
+
optional *second* field is the comma-separated <source/> kind list.
|
|
60
|
+
Upper-case and trim every parsed kind token.
|
|
61
|
+
|
|
62
|
+
2. <if condition="<target/> is empty">
|
|
63
|
+
|
|
64
|
+
Only output the following <template/> and then immediately *STOP*
|
|
65
|
+
processing the entire current skill:
|
|
66
|
+
|
|
67
|
+
<template>
|
|
68
|
+
⧉ **ASE**: ☻ skill: **ase-meta-update**, ▶ ERROR: missing target argument
|
|
69
|
+
</template>
|
|
70
|
+
|
|
71
|
+
</if>
|
|
72
|
+
|
|
73
|
+
3. If any token in <target/> or <source/> is *not* one of the seven
|
|
74
|
+
recognized kinds, only output the following <template/> (with
|
|
75
|
+
<kind/> set to the first offending token) and then immediately
|
|
76
|
+
*STOP* processing the entire current skill:
|
|
77
|
+
|
|
78
|
+
<template>
|
|
79
|
+
⧉ **ASE**: ☻ skill: **ase-meta-update**, ▶ ERROR: unknown artifact kind: **<kind/>**
|
|
80
|
+
</template>
|
|
81
|
+
|
|
82
|
+
4. <if condition="<source/> is empty">
|
|
83
|
+
|
|
84
|
+
Set <source/> to the seven recognized kinds
|
|
85
|
+
`TASK,SPEC,ARCH,CODE,DOCS,INFR,OTHR` *minus* all kinds present
|
|
86
|
+
in <target/> (preserving that fixed order). Do not output
|
|
87
|
+
anything.
|
|
88
|
+
|
|
89
|
+
</if>
|
|
90
|
+
|
|
91
|
+
5. Remove from <source/> any kind that is also present in <target/>
|
|
92
|
+
(a kind is never its own source). If <source/> is then empty,
|
|
93
|
+
only output the following <template/> and then immediately *STOP*
|
|
94
|
+
processing the entire current skill:
|
|
95
|
+
|
|
96
|
+
<template>
|
|
97
|
+
⧉ **ASE**: ☻ skill: **ase-meta-update**, ▶ ERROR: empty source -- nothing to update from
|
|
98
|
+
</template>
|
|
99
|
+
|
|
100
|
+
6. Report the resolved target and source with the following <template/>:
|
|
101
|
+
|
|
102
|
+
<template>
|
|
103
|
+
<ase-tpl-bullet-normal/> **TARGET**: <target/>
|
|
104
|
+
<ase-tpl-bullet-normal/> **SOURCE**: <source/>
|
|
105
|
+
</template>
|
|
106
|
+
|
|
107
|
+
</step>
|
|
108
|
+
|
|
109
|
+
2. <step id="STEP 2: Resolve Artifact Files">
|
|
110
|
+
|
|
111
|
+
1. For all kinds in the union of <target/> and <source/>,
|
|
112
|
+
call the `ase_artifact_list(kind: [ ... ])` tool of the `ase`
|
|
113
|
+
MCP server *once*, passing the lower-cased `kind` tokens, and
|
|
114
|
+
read the returned `artifacts` array of `{ kind, files }` objects
|
|
115
|
+
to obtain the project-relative file list per kind.
|
|
116
|
+
|
|
117
|
+
2. Do not output anything in this STEP 2.
|
|
118
|
+
|
|
119
|
+
</step>
|
|
120
|
+
|
|
121
|
+
3. <step id="STEP 3: Internalize Artifact Formats">
|
|
122
|
+
|
|
123
|
+
1. Internalize and honor the artifact-format conventions imported above:
|
|
124
|
+
|
|
125
|
+
- the artifact-set/artifact/aspect meta information of `ase-format-meta.md`,
|
|
126
|
+
- the `SPEC` format of `ase-format-spec.md`,
|
|
127
|
+
- the `ARCH` format of `ase-format-arch.md`,
|
|
128
|
+
- the `TASK` format of `ase-format-task.md`.
|
|
129
|
+
|
|
130
|
+
Whenever a target artifact belongs to one of these formatted
|
|
131
|
+
kinds, the update *MUST* keep it conformant to the
|
|
132
|
+
corresponding format (headings, structure, identifiers, and the
|
|
133
|
+
`<timestamp-modified/>` rule). The kinds `CODE`, `DOCS`, `INFR`,
|
|
134
|
+
and `OTHR` have no dedicated format contract and are treated as
|
|
135
|
+
free-form.
|
|
136
|
+
|
|
137
|
+
2. Do not output anything in this STEP 3.
|
|
138
|
+
|
|
139
|
+
</step>
|
|
140
|
+
|
|
141
|
+
4. <step id="STEP 4: Read Source Artifacts">
|
|
142
|
+
|
|
143
|
+
1. Read all <source/> artifact files resolved in STEP 2 and build a
|
|
144
|
+
precise understanding of the *current state* they represent.
|
|
145
|
+
|
|
146
|
+
2. Do not output anything in this STEP 4.
|
|
147
|
+
|
|
148
|
+
</step>
|
|
149
|
+
|
|
150
|
+
5. <step id="STEP 5: Update Target Artifacts">
|
|
151
|
+
|
|
152
|
+
1. *Update* the <target/> artifact files so that they faithfully
|
|
153
|
+
*reflect the current state* of the <source/> artifacts. Apply the
|
|
154
|
+
update *directly* to the target files via `Write`/`Edit`, keeping
|
|
155
|
+
changes as *surgical* as possible: change only what the source
|
|
156
|
+
state actually requires, and do *not* rewrite unrelated parts of a
|
|
157
|
+
target artifact.
|
|
158
|
+
|
|
159
|
+
For each formatted target kind, honor its format contract
|
|
160
|
+
internalized in STEP 3 and, whenever a target artifact is
|
|
161
|
+
changed, update its `<timestamp-modified/>` line via a call to
|
|
162
|
+
the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
|
|
163
|
+
`ase` MCP server.
|
|
164
|
+
|
|
165
|
+
2. Report the performed update with the following <template/>, listing
|
|
166
|
+
one bullet line per changed target file (with <file/> its
|
|
167
|
+
project-relative path and <note/> an ultra-brief description of
|
|
168
|
+
what was reconciled):
|
|
169
|
+
|
|
170
|
+
<template>
|
|
171
|
+
<ase-tpl-bullet-signal/> **UPDATED ARTIFACTS**:
|
|
172
|
+
|
|
173
|
+
- `<file/>`: <note/>
|
|
174
|
+
</template>
|
|
175
|
+
|
|
176
|
+
<if condition="no target artifact required any change">
|
|
177
|
+
|
|
178
|
+
Instead, only output the following <template/>:
|
|
179
|
+
|
|
180
|
+
<template>
|
|
181
|
+
<ase-tpl-bullet-normal/> **UPDATED ARTIFACTS**: none -- target already reflects source state.
|
|
182
|
+
</template>
|
|
183
|
+
|
|
184
|
+
</if>
|
|
185
|
+
|
|
186
|
+
</step>
|
|
187
|
+
|
|
188
|
+
</flow>
|
|
189
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
|
|
2
|
+
## NAME
|
|
3
|
+
|
|
4
|
+
`ase-meta-update` - Update Artifacts from Artifacts
|
|
5
|
+
|
|
6
|
+
## SYNOPSIS
|
|
7
|
+
|
|
8
|
+
`ase-meta-update`
|
|
9
|
+
[`--help`|`-h`]
|
|
10
|
+
*target*[,...]
|
|
11
|
+
[*source*[,...]]
|
|
12
|
+
|
|
13
|
+
## DESCRIPTION
|
|
14
|
+
|
|
15
|
+
The `ase-meta-update` skill updates one set of artifact kinds (the
|
|
16
|
+
*target*) to *reflect* the *current state* of another set of artifact
|
|
17
|
+
kinds (the *source*). It reads the source artifacts and then adjusts the
|
|
18
|
+
target artifacts *directly* and *surgically* to match the source state.
|
|
19
|
+
|
|
20
|
+
Both *target* and *source* are comma-separated lists over the seven
|
|
21
|
+
recognized artifact kinds `SPEC` (Specification), `ARCH` (Architecture),
|
|
22
|
+
`CODE` (Source Code), `DOCS` (Documentation), `TASK` (Task Plans), `INFR`
|
|
23
|
+
(Infrastructure), and `OTHR` (catch-all). When *source* is omitted, it
|
|
24
|
+
defaults to all seven kinds *minus* the kinds listed in *target*. A kind
|
|
25
|
+
present in *target* is never used as its own source.
|
|
26
|
+
|
|
27
|
+
The file lists for the kinds `SPEC`, `ARCH`, `CODE`, `DOCS`, `INFR`, and
|
|
28
|
+
`OTHR` are resolved via the `ase_artifact_list` MCP tool; the `TASK` kind
|
|
29
|
+
is resolved generically from the `.ase/task/*/plan.md` task plans. While
|
|
30
|
+
updating, the skill honors the artifact-format conventions of
|
|
31
|
+
`ase-format-meta.md`, `ase-format-spec.md`, `ase-format-arch.md`, and
|
|
32
|
+
`ase-format-task.md`; the kinds `CODE`, `DOCS`, `INFR`, and `OTHR` are
|
|
33
|
+
treated as free-form.
|
|
34
|
+
|
|
35
|
+
## ARGUMENTS
|
|
36
|
+
|
|
37
|
+
*target*[,...]:
|
|
38
|
+
The comma-separated list of artifact kinds to update.
|
|
39
|
+
|
|
40
|
+
*source*[,...]:
|
|
41
|
+
The comma-separated list of artifact kinds to update *from*. When
|
|
42
|
+
omitted, it defaults to all recognized kinds except those in *target*.
|
|
43
|
+
|
|
44
|
+
## EXAMPLES
|
|
45
|
+
|
|
46
|
+
Update the specification to reflect the current source code:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
❯ /ase-meta-update SPEC CODE
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Update specification and architecture from everything else:
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
❯ /ase-meta-update SPEC,ARCH
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Update the documentation from the code and the architecture:
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
❯ /ase-meta-update DOCS CODE,ARCH
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## SEE ALSO
|
|
65
|
+
|
|
66
|
+
[`ase-meta-changelog`](../ase-meta-changelog/help.md), [`ase-arch-analyze`](../ase-arch-analyze/help.md), [`ase-arch-discover`](../ase-arch-discover/help.md).
|