@smartmemory/compose 0.2.58-beta → 0.3.1-beta
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/README.md +2 -2
- package/bin/compose.js +55 -54
- package/dist/assets/{App-s4CulNkO.js → App-DR9pCiNE.js} +290 -290
- package/dist/assets/{abnfDiagram-VRR7QNED-CDwzQ5wr.js → abnfDiagram-VRR7QNED-CZ6p2bRe.js} +1 -1
- package/dist/assets/{arc-kIU8DDth.js → arc-6j04LBqn.js} +1 -1
- package/dist/assets/{architectureDiagram-ZJ3FMSHR-CleorO_0.js → architectureDiagram-ZJ3FMSHR-00QM3pmc.js} +1 -1
- package/dist/assets/{blockDiagram-677ZJIJ3-NvEFfoMk.js → blockDiagram-677ZJIJ3-BUb9Kjfd.js} +1 -1
- package/dist/assets/{c4Diagram-LMCZKHZV-BcDQdTVB.js → c4Diagram-LMCZKHZV-D1PkhmSm.js} +1 -1
- package/dist/assets/channel-BcWZM2KA.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-BseRkpm4.js → chunk-2Q5K7J3B-CduDdMf4.js} +1 -1
- package/dist/assets/{chunk-32BRIVSS-DCHhvgFV.js → chunk-32BRIVSS-CH8Kj5rh.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-DcTpMdJ4.js → chunk-5VM5RSS4-Cfts6Lix.js} +1 -1
- package/dist/assets/{chunk-EX3LRPZG-BdN8fvWs.js → chunk-EX3LRPZG-Dguk4yKZ.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-DmZJP-8E.js → chunk-JWPE2WC7-DbCJp6t9.js} +1 -1
- package/dist/assets/{chunk-MOJQB5TN-V74uYM17.js → chunk-MOJQB5TN-CNjM_9_U.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-CoXUXbn_.js → chunk-RYQCIY6F-D4k-BUbh.js} +1 -1
- package/dist/assets/{chunk-V7JOEXUC-DUscIydR.js → chunk-V7JOEXUC-O1sFoHf1.js} +1 -1
- package/dist/assets/{chunk-VR4S4FIN-C4UDHq_a.js → chunk-VR4S4FIN-CGbSXVPL.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-DIH9i8mZ.js → chunk-XXDRQBXY-iIelV7SO.js} +1 -1
- package/dist/assets/classDiagram-OUVF2IWQ-Ce7YjlIK.js +1 -0
- package/dist/assets/classDiagram-v2-EOCWNBFH-Ce7YjlIK.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-Dn6Gy6l1.js → cose-bilkent-JH36ORCC-BKmPLgw2.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-C2LW5fzB.js → cynefin-VYW2F7L2-CmT6ieC5.js} +1 -1
- package/dist/assets/{cynefinDiagram-TSTJHNR4-CGoAq7C9.js → cynefinDiagram-TSTJHNR4-Hn2vSVOw.js} +1 -1
- package/dist/assets/{dagre-VKFMJZFB-BaOKtuBE.js → dagre-VKFMJZFB-B0ifIwlU.js} +1 -1
- package/dist/assets/{diagram-FQU43EPY-BdQwqt4x.js → diagram-FQU43EPY-BuCDB-JG.js} +1 -1
- package/dist/assets/{diagram-G47NLZAW-Dkcf0o5z.js → diagram-G47NLZAW-D5avTZAQ.js} +1 -1
- package/dist/assets/{diagram-NH7WQ7WH-C_fDi59r.js → diagram-NH7WQ7WH-24QCIgpj.js} +1 -1
- package/dist/assets/{diagram-OA4YK3LP-jaTQcOxt.js → diagram-OA4YK3LP-A-bbUTK3.js} +1 -1
- package/dist/assets/{diagram-WEI45ONY-dEtqVj3s.js → diagram-WEI45ONY-BIMDm-Kj.js} +1 -1
- package/dist/assets/{ebnfDiagram-CCIWWBDH-s8ImqsSs.js → ebnfDiagram-CCIWWBDH-DCXMfG-M.js} +1 -1
- package/dist/assets/{erDiagram-Q63AITRT-5Zy29-SA.js → erDiagram-Q63AITRT-BlDrG0Ev.js} +1 -1
- package/dist/assets/{flowDiagram-23GEKE2U-DV74V9he.js → flowDiagram-23GEKE2U-aTyazY6P.js} +1 -1
- package/dist/assets/{ganttDiagram-NO4QXBWP-BND-CiLO.js → ganttDiagram-NO4QXBWP-Bxo-a80f.js} +1 -1
- package/dist/assets/{gitGraphDiagram-IHSO6WYX-B_-Mf9Jo.js → gitGraphDiagram-IHSO6WYX-COhKb9wR.js} +1 -1
- package/dist/assets/index-BcmsQZX-.js +119 -0
- package/dist/assets/{infoDiagram-FWYZ7A6U-Duyz8rZM.js → infoDiagram-FWYZ7A6U-DLCbpinV.js} +1 -1
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-D2Qft0e5.js → ishikawaDiagram-FXEZZL3T-eyHF7GIj.js} +1 -1
- package/dist/assets/{journeyDiagram-5HDEW3XC-q6rG4Rig.js → journeyDiagram-5HDEW3XC-BsVocmlw.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-CsPX7gBL.js → kanban-definition-HUTT4EX6-CaFPSZxY.js} +1 -1
- package/dist/assets/{linear-CiccpAAd.js → linear-cqnI_wgW.js} +1 -1
- package/dist/assets/{mindmap-definition-LN4V7U3C-DRW2njpA.js → mindmap-definition-LN4V7U3C-B66BGqKn.js} +1 -1
- package/dist/assets/{pegDiagram-2B236MQR-DoDgm2S_.js → pegDiagram-2B236MQR-F6IN0_L5.js} +1 -1
- package/dist/assets/{pieDiagram-ENE6RG2P-CNSYLVAF.js → pieDiagram-ENE6RG2P-D5nOQxpo.js} +1 -1
- package/dist/assets/{quadrantDiagram-ABIIQ3AL-8-Nd6ony.js → quadrantDiagram-ABIIQ3AL-DwUAYbMO.js} +1 -1
- package/dist/assets/{railroadDiagram-RFXS5EU6-bfdg6Bo4.js → railroadDiagram-RFXS5EU6-Cvmlah5P.js} +1 -1
- package/dist/assets/{requirementDiagram-TGXJPOKE-slDkxCQy.js → requirementDiagram-TGXJPOKE-DoUtsFnL.js} +1 -1
- package/dist/assets/{sankeyDiagram-HTMAVEWB-CR3CboiK.js → sankeyDiagram-HTMAVEWB-D4XTwiKp.js} +1 -1
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-BIXw1JS1.js → sequenceDiagram-DBY2YBRQ-CiG9yRIR.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-BdKI7JyF.js → sizeCapture-X5ZJPWSS-zd7ydQ_Y.js} +1 -1
- package/dist/assets/{stateDiagram-2N3HPSRC-ktVgpBZS.js → stateDiagram-2N3HPSRC-BZesBHQ4.js} +1 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-BnlLOJzB.js +1 -0
- package/dist/assets/{swimlanes-5IMT3BWC-CaXpC3FM.js → swimlanes-5IMT3BWC-Bg8exSE7.js} +2 -2
- package/dist/assets/swimlanesDiagram-G3AALYLV-DZMVxqbs.js +8 -0
- package/dist/assets/{timeline-definition-FHXFAJF6-CKWSlRUl.js → timeline-definition-FHXFAJF6-TKj_HY9k.js} +1 -1
- package/dist/assets/{vennDiagram-L72KCM5P-CwOhxDyv.js → vennDiagram-L72KCM5P-CJf-bqn0.js} +1 -1
- package/dist/assets/{wardleyDiagram-EHGQE667-DGavMpEB.js → wardleyDiagram-EHGQE667-CqizSfCL.js} +1 -1
- package/dist/assets/{xychartDiagram-FW5EYKEG-CWmnmLZz.js → xychartDiagram-FW5EYKEG-CK-OErMM.js} +1 -1
- package/dist/index.html +1 -1
- package/lib/build-all.js +0 -5
- package/lib/build-stream-schema.js +1 -1
- package/lib/build.js +1762 -2614
- package/lib/consumer-fanout.js +1317 -0
- package/lib/feature-validator.js +6 -4
- package/lib/flow-state.js +15 -14
- package/lib/gsd-budget.js +48 -10
- package/lib/gsd-prompt.js +3 -4
- package/lib/gsd-stuck.js +1 -1
- package/lib/gsd.js +303 -149
- package/lib/local-claude-connector.js +149 -0
- package/lib/new.js +162 -307
- package/lib/result-normalizer.js +233 -18
- package/lib/review-lenses.js +1 -1
- package/lib/step-prompt.js +41 -119
- package/lib/stratum-engine.js +297 -0
- package/lib/stratum-mcp-client.js +224 -213
- package/lib/vocabulary-compliance.js +268 -0
- package/lib/vocabulary-inject.js +1 -36
- package/package.json +6 -2
- package/pipelines/build-quick.stratum.yaml +5 -17
- package/pipelines/build.profiles.json +11 -0
- package/pipelines/build.stratum.yaml +288 -467
- package/pipelines/gsd.stratum.yaml +73 -125
- package/pipelines/new.stratum.yaml +68 -149
- package/server/build-routes.js +4 -1
- package/server/design-routes.js +37 -21
- package/server/index.js +13 -21
- package/server/lifecycle-guard.js +1 -1
- package/server/pipeline-routes.js +113 -31
- package/server/stratum-client.js +33 -47
- package/server/stratum-sync.js +3 -4
- package/server/vision-server.js +1 -1
- package/dist/assets/channel-DiJkE9og.js +0 -1
- package/dist/assets/classDiagram-OUVF2IWQ-DS76VBEL.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-DS76VBEL.js +0 -1
- package/dist/assets/index-CBWbmG7W.js +0 -119
- package/dist/assets/stateDiagram-v2-6OUMAXLB-CzPQnlan.js +0 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-rIDv6EuQ.js +0 -8
- package/lib/connector-factory-shim.js +0 -167
- package/server/agent-mcp.js +0 -10
package/README.md
CHANGED
|
@@ -43,7 +43,7 @@ compose plan "a tool that summarizes my team's standups"
|
|
|
43
43
|
|
|
44
44
|
## Quick install
|
|
45
45
|
|
|
46
|
-
Prerequisites: Node.js 18+ and
|
|
46
|
+
Prerequisites: Node.js 18+ and a [Stratum](https://github.com/smartmemory/stratum) checkout as a sibling directory (the TS engine runs from source; `compose init` detects its MCP entrypoint automatically — the python `stratum-mcp` PyPI package is retired). Codex steps additionally need the OpenAI `codex` CLI. Full prereqs in [docs/install.md](docs/install.md).
|
|
47
47
|
|
|
48
48
|
The package is published to npm as `@smartmemory/compose`. Pick one install style:
|
|
49
49
|
|
|
@@ -51,7 +51,7 @@ The package is published to npm as `@smartmemory/compose`. Pick one install styl
|
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
53
|
npm install -g @smartmemory/compose
|
|
54
|
-
compose setup # install bundled skills + register
|
|
54
|
+
compose setup # install bundled skills + register the Stratum MCP server (alias: compose sync)
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
**Option B — git clone (for development):**
|
package/bin/compose.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* compose CLI
|
|
4
4
|
*
|
|
5
5
|
* compose init — initialize Compose in the current project (project-local)
|
|
6
|
-
* compose setup — install global
|
|
6
|
+
* compose setup — install global Compose skills
|
|
7
7
|
* compose install — run init + setup (backwards-compat alias)
|
|
8
8
|
* compose start — start the compose app (supervisor.js)
|
|
9
9
|
* compose build — headless feature lifecycle runner
|
|
@@ -21,6 +21,11 @@ import { resolvePort } from '../lib/resolve-port.js'
|
|
|
21
21
|
import { resolveRoadmapPath, resolveFeaturesPath, resolveContextPathFromConfig, resolveFeaturesPathFromConfig, resolveRoadmapPathFromConfig } from '../lib/project-paths.js'
|
|
22
22
|
import { installAgentDefs } from '../lib/install-agent-defs.js'
|
|
23
23
|
import { validateAgentString } from '../lib/agent-string.js'
|
|
24
|
+
import {
|
|
25
|
+
checkStratumWiring,
|
|
26
|
+
healStratumWiring,
|
|
27
|
+
resolveStratumMcpConnection,
|
|
28
|
+
} from '../lib/stratum-engine.js'
|
|
24
29
|
|
|
25
30
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
26
31
|
const PACKAGE_ROOT = resolve(__dirname, '..')
|
|
@@ -137,7 +142,7 @@ if (!cmd || cmd === '--help' || cmd === '-h') {
|
|
|
137
142
|
console.log(' gate list List pending gates (--item <id>, --status pending|all|resolved)')
|
|
138
143
|
console.log(' gate resolve <id> Resolve a gate (--approve|--revise|--kill, --comment <text>)')
|
|
139
144
|
console.log(' init Initialize Compose in the current project')
|
|
140
|
-
console.log(' setup Install/sync global skills
|
|
145
|
+
console.log(' setup Install/sync global Compose skills (alias: sync)')
|
|
141
146
|
console.log(' sync Re-sync global skills from this install (alias of setup)')
|
|
142
147
|
console.log(' update Pull latest compose, reinstall deps, refresh global skill')
|
|
143
148
|
console.log(' doctor Check external skill dependencies')
|
|
@@ -305,6 +310,17 @@ async function runDoctor(flags = []) {
|
|
|
305
310
|
const verbose = flags.includes('--verbose') || flags.includes('-v')
|
|
306
311
|
const refresh = flags.includes('--refresh-versions')
|
|
307
312
|
|
|
313
|
+
const wsId = getWorkspaceFlag(flags)
|
|
314
|
+
let cwd
|
|
315
|
+
try {
|
|
316
|
+
cwd = resolveWorkspace({ workspaceId: wsId }).root
|
|
317
|
+
} catch (err) {
|
|
318
|
+
if (err.code !== 'WorkspaceUnset') dieOnWorkspaceError(err)
|
|
319
|
+
cwd = process.cwd()
|
|
320
|
+
}
|
|
321
|
+
// Read-only: `compose doctor` reports stale wiring but never repairs it.
|
|
322
|
+
const stratumWiring = checkStratumWiring(cwd)
|
|
323
|
+
|
|
308
324
|
const deps = loadDeps(PACKAGE_ROOT)
|
|
309
325
|
if (!deps) {
|
|
310
326
|
console.error('Error: .compose-deps.json missing or invalid at package root')
|
|
@@ -324,7 +340,7 @@ async function runDoctor(flags = []) {
|
|
|
324
340
|
// so consumers like `JSON.parse(stdout)` work. (Previously two concatenated objects.)
|
|
325
341
|
const report = buildDepReport(result)
|
|
326
342
|
const binaries = buildBinaryReport(checkExternalBinaries(deps))
|
|
327
|
-
console.log(JSON.stringify({ ...report, binaries, version: versionInfo }, null, 2))
|
|
343
|
+
console.log(JSON.stringify({ ...report, binaries, version: versionInfo, stratumWiring }, null, 2))
|
|
328
344
|
const allRequiredPresent = result.missing.every(d => d.optional)
|
|
329
345
|
if (strict && !allRequiredPresent) process.exit(1)
|
|
330
346
|
return
|
|
@@ -346,6 +362,14 @@ async function runDoctor(flags = []) {
|
|
|
346
362
|
|
|
347
363
|
const allRequiredPresent = printDepReport(result, { json: false, verbose })
|
|
348
364
|
printBinaryReport(checkExternalBinaries(deps))
|
|
365
|
+
console.log('Stratum wiring:')
|
|
366
|
+
if (stratumWiring.skipped) {
|
|
367
|
+
console.log(` - skipped — ${stratumWiring.skipped}`)
|
|
368
|
+
} else if (stratumWiring.stale) {
|
|
369
|
+
console.log(' ⚠ stale — run `compose update` to repair it')
|
|
370
|
+
} else {
|
|
371
|
+
console.log(' ✓ ok')
|
|
372
|
+
}
|
|
349
373
|
if (strict && !allRequiredPresent) process.exit(1)
|
|
350
374
|
}
|
|
351
375
|
|
|
@@ -368,29 +392,17 @@ async function runInit(flags, cwdOverride) {
|
|
|
368
392
|
const composeDir = join(cwd, '.compose')
|
|
369
393
|
mkdirSync(composeDir, { recursive: true })
|
|
370
394
|
|
|
371
|
-
// 2.
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
if (pipResult.status === 0) {
|
|
380
|
-
// Verify the binary is now on PATH
|
|
381
|
-
hasStratum = spawnSync('which', ['stratum-mcp'], { encoding: 'utf-8' }).status === 0
|
|
382
|
-
if (hasStratum) {
|
|
383
|
-
console.log('stratum-mcp installed successfully')
|
|
384
|
-
} else {
|
|
385
|
-
console.warn('Warning: pip install stratum-mcp succeeded but stratum-mcp not found on PATH')
|
|
386
|
-
console.warn(' The binary may live in a pyenv version dir not on $PATH.')
|
|
387
|
-
console.warn(' Try: ln -sf "$(python -c \'import sys,os; print(os.path.join(sys.prefix, "bin", "stratum-mcp"))\')" ~/.local/bin/stratum-mcp')
|
|
388
|
-
}
|
|
389
|
-
} else {
|
|
390
|
-
console.warn('Warning: pip install stratum-mcp failed — Stratum will be disabled')
|
|
391
|
-
console.warn(' Install manually: pip install stratum-mcp (requires Python >= 3.11)')
|
|
395
|
+
// 2. Resolve the TS runtime through the same installed-package -> sibling
|
|
396
|
+
// chain used by the runtime client.
|
|
397
|
+
let stratumConnection
|
|
398
|
+
if (!noStratum) {
|
|
399
|
+
try {
|
|
400
|
+
stratumConnection = resolveStratumMcpConnection(cwd)
|
|
401
|
+
} catch (error) {
|
|
402
|
+
console.warn(`Warning: ${error.message}`)
|
|
392
403
|
}
|
|
393
404
|
}
|
|
405
|
+
const hasStratum = Boolean(stratumConnection)
|
|
394
406
|
const hasLifecycle = !noLifecycle
|
|
395
407
|
|
|
396
408
|
// 3. Detect agents
|
|
@@ -519,32 +531,22 @@ async function runInit(flags, cwdOverride) {
|
|
|
519
531
|
// T2-F5 retirement: remove legacy 'agents' entry. The file it points to is
|
|
520
532
|
// now a retirement shim that exits non-zero with a migration message;
|
|
521
533
|
// removing the entry prevents Claude Code from spawning the shim on session start.
|
|
522
|
-
// The agent_run capability lives on
|
|
534
|
+
// The agent_run capability lives on the Stratum TS MCP server.
|
|
523
535
|
if (mcpConfig.mcpServers.agents) {
|
|
524
536
|
delete mcpConfig.mcpServers.agents
|
|
525
537
|
console.log('Removed retired agents MCP server from .mcp.json (T2-F5). '
|
|
526
538
|
+ 'Use stratum_agent_run on the stratum MCP server instead.')
|
|
527
539
|
}
|
|
528
|
-
if (hasStratum
|
|
529
|
-
// Use absolute path — miniconda/pip binaries may not be on Claude Code's PATH
|
|
530
|
-
const stratumPath = spawnSync('which', ['stratum-mcp'], { encoding: 'utf-8' }).stdout.trim()
|
|
540
|
+
if (hasStratum) {
|
|
531
541
|
mcpConfig.mcpServers.stratum = {
|
|
532
|
-
command:
|
|
542
|
+
command: stratumConnection.command,
|
|
543
|
+
args: stratumConnection.args,
|
|
533
544
|
}
|
|
534
|
-
console.log('Registered
|
|
545
|
+
console.log('Registered the Stratum TS MCP server in .mcp.json')
|
|
535
546
|
}
|
|
536
547
|
writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2))
|
|
537
548
|
console.log(`Registered compose-mcp in ${mcpPath}`)
|
|
538
549
|
|
|
539
|
-
// 6b. Run stratum-mcp install to register hooks + CLAUDE.md in this project
|
|
540
|
-
if (hasStratum) {
|
|
541
|
-
console.log('Running stratum-mcp install for hooks...')
|
|
542
|
-
const stratumResult = spawnSync('stratum-mcp', ['install'], { cwd, stdio: 'inherit' })
|
|
543
|
-
if (stratumResult.status !== 0) {
|
|
544
|
-
console.warn('Warning: stratum-mcp install failed (hooks may not be registered)')
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
|
|
548
550
|
// 7. Scaffold ROADMAP.md from template if absent. COMP-PATHS-EXTERNAL:
|
|
549
551
|
// honor a configured (possibly relocated) paths.roadmap instead of always
|
|
550
552
|
// seeding <cwd>/ROADMAP.md. Byte-identical for the default.
|
|
@@ -590,7 +592,7 @@ async function runInit(flags, cwdOverride) {
|
|
|
590
592
|
}
|
|
591
593
|
|
|
592
594
|
// ---------------------------------------------------------------------------
|
|
593
|
-
// compose setup — user-global setup
|
|
595
|
+
// compose setup — user-global skill setup
|
|
594
596
|
// ---------------------------------------------------------------------------
|
|
595
597
|
|
|
596
598
|
function runSetup() {
|
|
@@ -603,18 +605,6 @@ function runSetup() {
|
|
|
603
605
|
}
|
|
604
606
|
syncSkills(agents)
|
|
605
607
|
|
|
606
|
-
// 2. Register stratum-mcp if available
|
|
607
|
-
const hasStratum = spawnSync('which', ['stratum-mcp'], { encoding: 'utf-8' }).status === 0
|
|
608
|
-
if (hasStratum) {
|
|
609
|
-
console.log('Registering stratum-mcp with Claude Code...')
|
|
610
|
-
const result = spawnSync('stratum-mcp', ['install'], { stdio: 'inherit' })
|
|
611
|
-
if (result.status !== 0) {
|
|
612
|
-
console.warn('Warning: stratum-mcp install failed (non-fatal)')
|
|
613
|
-
}
|
|
614
|
-
} else {
|
|
615
|
-
console.log('stratum-mcp not found — skipping global registration')
|
|
616
|
-
console.log(' Install later: pip install stratum && compose setup')
|
|
617
|
-
}
|
|
618
608
|
}
|
|
619
609
|
|
|
620
610
|
// ---------------------------------------------------------------------------
|
|
@@ -723,7 +713,7 @@ async function runUpdate(flags) {
|
|
|
723
713
|
if (ni.status !== 0) { process.exit(ni.status || 1) }
|
|
724
714
|
}
|
|
725
715
|
|
|
726
|
-
// Refresh global
|
|
716
|
+
// Refresh global skills.
|
|
727
717
|
console.log('')
|
|
728
718
|
console.log('Refreshing global skill installation...')
|
|
729
719
|
runSetup()
|
|
@@ -737,6 +727,17 @@ async function runUpdate(flags) {
|
|
|
737
727
|
// makes all of init's refresh — including its state-migration step — target
|
|
738
728
|
// the right workspace (COMP-MIGRATE-ON-UPGRADE finding 6).
|
|
739
729
|
await runInit([], cwd)
|
|
730
|
+
|
|
731
|
+
// State migrations have completed; now best-effort repair stale Stratum MCP
|
|
732
|
+
// wiring without making an otherwise successful update fail.
|
|
733
|
+
const wiring = healStratumWiring(cwd)
|
|
734
|
+
if (wiring.skipped) {
|
|
735
|
+
console.log(`Stratum wiring repair skipped: ${wiring.skipped}`)
|
|
736
|
+
} else if (wiring.healed) {
|
|
737
|
+
console.log('Healed Stratum MCP wiring in .mcp.json')
|
|
738
|
+
} else {
|
|
739
|
+
console.log('Stratum MCP wiring already current')
|
|
740
|
+
}
|
|
740
741
|
}
|
|
741
742
|
|
|
742
743
|
console.log('')
|
|
@@ -754,7 +755,7 @@ if (cmd === 'init') {
|
|
|
754
755
|
|
|
755
756
|
if (cmd === 'setup' || cmd === 'sync') {
|
|
756
757
|
// `sync` is an alias for `setup` — both mirror compose-owned skills into the
|
|
757
|
-
// agent skill dirs
|
|
758
|
+
// agent skill dirs. The name `sync` better signals
|
|
758
759
|
// the idempotent "reconcile local skills with this install" job (run it after
|
|
759
760
|
// editing skills locally, when there's no new version to `update` to).
|
|
760
761
|
runSetup()
|