@mmerterden/multi-agent-pipeline 12.9.0 → 12.10.0
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/CHANGELOG.md +53 -0
- package/install/_common.mjs +27 -6
- package/package.json +1 -1
- package/pipeline/scripts/smoke-schema-validation.sh +33 -7
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,59 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
16
16
|
|
|
17
17
|
## [Unreleased]
|
|
18
18
|
|
|
19
|
+
## [12.10.0] - 2026-07-26
|
|
20
|
+
|
|
21
|
+
Two pieces of abandoned residue, and a gate that had inverted.
|
|
22
|
+
|
|
23
|
+
### `~/.multi-agent/` is pruned on install
|
|
24
|
+
|
|
25
|
+
The "shared runtime" the Cursor / Antigravity / VS Code Copilot Chat adapters
|
|
26
|
+
needed, so their emitted agents could reach the gate scripts by absolute path.
|
|
27
|
+
Those adapters were deleted in v10.7.0 along with `installSharedRuntime`,
|
|
28
|
+
`_base.mjs`, `rewriteScriptRefs` and `smoke-shared-runtime.sh` - but not the tree
|
|
29
|
+
they had written. 222 files (174 scripts, 23 lib, 24 schemas) sat frozen at
|
|
30
|
+
whatever the last adapter-era install produced.
|
|
31
|
+
|
|
32
|
+
It is worse than dead weight because it is indistinguishable from a live install
|
|
33
|
+
when you look at it: same directory names, same file names. Its
|
|
34
|
+
`schemas/migrations/` is missing `prefs-2.3.0-to-2.4.0.mjs`, so reading it gives a
|
|
35
|
+
migration chain three versions short and a reasonable conclusion that the chain
|
|
36
|
+
itself is stale.
|
|
37
|
+
|
|
38
|
+
`ABANDONED_TREES` now takes `root: "home"` entries for trees beside `~/.claude`
|
|
39
|
+
rather than inside it, and 253 files (this plus the 31 in `~/.claude/eval`) are
|
|
40
|
+
removed on the next install.
|
|
41
|
+
|
|
42
|
+
### The live-prefs gate was rejecting the only correct state
|
|
43
|
+
|
|
44
|
+
`smoke-schema-validation.sh` step 7 read:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
if [ "$LVER" = "2.1.0" ]; then pass "live prefs already v2.1.0"
|
|
48
|
+
elif ... else fail "live prefs has unknown schemaVersion: $LVER"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
`migrate-prefs.mjs` `TARGET_VERSION` had since moved to 2.4.0, which inverted the
|
|
52
|
+
gate: a prefs file left behind at 2.1.0 passed as "already current", and a file
|
|
53
|
+
correctly migrated to 2.4.0 fell through to the else arm and FAILED as "unknown".
|
|
54
|
+
The gate rejected the fully-migrated state it exists to encourage.
|
|
55
|
+
|
|
56
|
+
It now reads the target from `migrate-prefs.mjs` and the accepted set from the
|
|
57
|
+
schema's own `schemaVersion` enum, so it cannot disagree with either again, and a
|
|
58
|
+
known-but-older version reports how far behind it is (`v2.1.0 -> v2.4.0`) instead
|
|
59
|
+
of reading as current. This is a CONSUMER smoke (`/multi-agent:update` runs it), so
|
|
60
|
+
it resolves both paths through `SMOKE_DIR`, which is `pipeline/scripts` in the repo
|
|
61
|
+
and `~/.claude/scripts` in an install.
|
|
62
|
+
|
|
63
|
+
### Dead-file sweep
|
|
64
|
+
|
|
65
|
+
Swept refs, schemas, agents, libs and scripts for files nothing references. No
|
|
66
|
+
orphans. The two candidates were both false positives from the sweep's own exclude
|
|
67
|
+
flags: `design-check-config.schema.json` is referenced as the instance filename by
|
|
68
|
+
the design-check command, and `count-lib.sh` is sourced by two siblings inside
|
|
69
|
+
`pipeline/lib/`, which the sweep had excluded. Recorded here so the next sweep does
|
|
70
|
+
not re-flag them.
|
|
71
|
+
|
|
19
72
|
## [12.9.0] - 2026-07-26
|
|
20
73
|
|
|
21
74
|
Context engineering follow-through, and a guard that was blocking safe commands.
|
package/install/_common.mjs
CHANGED
|
@@ -252,25 +252,46 @@ export function pruneLegacyMultiAgentSkills(skillsDir) {
|
|
|
252
252
|
* neither did uninstall - 31 stale files sat there with nothing left that could
|
|
253
253
|
* ever read or remove them.
|
|
254
254
|
*
|
|
255
|
-
*
|
|
255
|
+
* `~/.multi-agent/` is the larger case: the "shared runtime" the Cursor /
|
|
256
|
+
* Antigravity / VS Code Copilot Chat adapters needed, so their emitted agents
|
|
257
|
+
* could reach the gate scripts by absolute path. Those adapters were deleted in
|
|
258
|
+
* v10.7.0 along with `installSharedRuntime`, `_base.mjs`, `rewriteScriptRefs` and
|
|
259
|
+
* `smoke-shared-runtime.sh` - but not the tree they wrote. 221 files (174 scripts,
|
|
260
|
+
* 23 lib, 24 schemas) frozen at whatever the last adapter-era install produced,
|
|
261
|
+
* including a migrations directory missing `prefs-2.3.0-to-2.4.0.mjs`. Browsing it
|
|
262
|
+
* looks exactly like browsing a current install, which is how it comes to be
|
|
263
|
+
* mistaken for one.
|
|
264
|
+
*
|
|
265
|
+
* `root: "home"` entries sit beside `~/.claude`, not inside it.
|
|
266
|
+
*
|
|
267
|
+
* @type {ReadonlyArray<{dir: string, root?: "claude"|"home", reason: string}>}
|
|
256
268
|
*/
|
|
257
269
|
export const ABANDONED_TREES = Object.freeze([
|
|
258
270
|
{
|
|
259
271
|
dir: "eval",
|
|
260
272
|
reason: "eval corpora; the harnesses that read them are maintainer-only and no longer ship",
|
|
261
273
|
},
|
|
274
|
+
{
|
|
275
|
+
dir: ".multi-agent",
|
|
276
|
+
root: "home",
|
|
277
|
+
reason:
|
|
278
|
+
"shared runtime for the Cursor / Antigravity / Copilot Chat adapters, all deleted in v10.7.0",
|
|
279
|
+
},
|
|
262
280
|
]);
|
|
263
281
|
|
|
264
282
|
/**
|
|
265
|
-
* Remove trees an older install left behind
|
|
283
|
+
* Remove trees an older install left behind.
|
|
266
284
|
*
|
|
267
|
-
* @param {string}
|
|
285
|
+
* @param {string} claudeDir e.g. `$HOME/.claude`
|
|
286
|
+
* @param {string} [home] `$HOME`, for entries marked `root: "home"`. Defaults to
|
|
287
|
+
* the parent of `claudeDir`, which is the layout every installer uses.
|
|
268
288
|
* @returns {number} directories removed
|
|
269
289
|
*/
|
|
270
|
-
export function pruneAbandonedTrees(
|
|
290
|
+
export function pruneAbandonedTrees(claudeDir, home = dirname(claudeDir)) {
|
|
271
291
|
let removed = 0;
|
|
272
|
-
for (const { dir, reason } of ABANDONED_TREES) {
|
|
273
|
-
const
|
|
292
|
+
for (const { dir, root, reason } of ABANDONED_TREES) {
|
|
293
|
+
const base = root === "home" ? home : claudeDir;
|
|
294
|
+
const target = join(base, dir);
|
|
274
295
|
if (!existsSync(target)) continue;
|
|
275
296
|
if (dryRun) {
|
|
276
297
|
console.log(` [dry-run] would remove abandoned tree ${target} (${reason})`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "12.
|
|
3
|
+
"version": "12.10.0",
|
|
4
4
|
"description": "8-phase AI development pipeline with full orchestration on Claude Code and Copilot CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -174,14 +174,40 @@ echo ""
|
|
|
174
174
|
echo "→ 7. Live preferences (if exists) - post-migration check"
|
|
175
175
|
if [ -f "$LIVE_PREFS" ]; then
|
|
176
176
|
LVER=$(node -e "console.log(JSON.parse(require('fs').readFileSync('$LIVE_PREFS','utf8')).schemaVersion || 'none')" 2>/dev/null)
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
177
|
+
|
|
178
|
+
# The target is read from migrate-prefs.mjs, never hardcoded here.
|
|
179
|
+
#
|
|
180
|
+
# This block used to say `if [ "$LVER" = "2.1.0" ]; then pass "already v2.1.0"`
|
|
181
|
+
# with everything else falling through to `fail "unknown schemaVersion"`. The
|
|
182
|
+
# migration target had since moved to 2.4.0, which inverted the gate: a prefs
|
|
183
|
+
# file left behind at 2.1.0 reported PASS as "already current", while a file
|
|
184
|
+
# correctly migrated to 2.4.0 hit the else arm and FAILED as "unknown". The
|
|
185
|
+
# gate was rejecting the only fully-migrated state it exists to encourage.
|
|
186
|
+
#
|
|
187
|
+
# Reading the target from the migrator, and the accepted set from the schema
|
|
188
|
+
# enum, means this can never disagree with them again.
|
|
189
|
+
MIGRATOR="$SMOKE_DIR/migrate-prefs.mjs"
|
|
190
|
+
TARGET=$(grep -oE 'TARGET_VERSION = "[0-9.]+"' "$MIGRATOR" 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
|
|
191
|
+
KNOWN=$(node -e "
|
|
192
|
+
const s = require('$PREFS_SCHEMA');
|
|
193
|
+
process.stdout.write((s.properties.schemaVersion.enum || []).join(' '));
|
|
194
|
+
" 2>/dev/null)
|
|
195
|
+
|
|
196
|
+
if [ -z "$TARGET" ]; then
|
|
197
|
+
fail "cannot read TARGET_VERSION from migrate-prefs.mjs - the check has no reference point"
|
|
198
|
+
elif [ "$LVER" = "$TARGET" ]; then
|
|
199
|
+
pass "live prefs at the migration target (v$TARGET)"
|
|
200
|
+
elif [ "$LVER" = "none" ]; then
|
|
201
|
+
echo " ⓘ live prefs carries no schemaVersion - migration pending"
|
|
202
|
+
pass "live prefs present, needs migration (schemaVersion: none)"
|
|
203
|
+
elif printf '%s\n' $KNOWN | grep -qxF "$LVER"; then
|
|
204
|
+
# A known-but-older version is legitimately "migration pending", not a
|
|
205
|
+
# failure: migration is its own install step. Say how far behind it is, so a
|
|
206
|
+
# file sitting three versions back is visible instead of reading as current.
|
|
207
|
+
echo " ⓘ live prefs at v$LVER, target v$TARGET - migration pending"
|
|
208
|
+
pass "live prefs present, needs migration (v$LVER -> v$TARGET)"
|
|
183
209
|
else
|
|
184
|
-
fail "live prefs has
|
|
210
|
+
fail "live prefs has a schemaVersion the schema does not know: $LVER (known: $KNOWN)"
|
|
185
211
|
fi
|
|
186
212
|
else
|
|
187
213
|
echo " ⓘ no live prefs at $LIVE_PREFS - ok for fresh install"
|