@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.
Files changed (100) hide show
  1. package/README.md +2 -2
  2. package/bin/compose.js +55 -54
  3. package/dist/assets/{App-s4CulNkO.js → App-DR9pCiNE.js} +290 -290
  4. package/dist/assets/{abnfDiagram-VRR7QNED-CDwzQ5wr.js → abnfDiagram-VRR7QNED-CZ6p2bRe.js} +1 -1
  5. package/dist/assets/{arc-kIU8DDth.js → arc-6j04LBqn.js} +1 -1
  6. package/dist/assets/{architectureDiagram-ZJ3FMSHR-CleorO_0.js → architectureDiagram-ZJ3FMSHR-00QM3pmc.js} +1 -1
  7. package/dist/assets/{blockDiagram-677ZJIJ3-NvEFfoMk.js → blockDiagram-677ZJIJ3-BUb9Kjfd.js} +1 -1
  8. package/dist/assets/{c4Diagram-LMCZKHZV-BcDQdTVB.js → c4Diagram-LMCZKHZV-D1PkhmSm.js} +1 -1
  9. package/dist/assets/channel-BcWZM2KA.js +1 -0
  10. package/dist/assets/{chunk-2Q5K7J3B-BseRkpm4.js → chunk-2Q5K7J3B-CduDdMf4.js} +1 -1
  11. package/dist/assets/{chunk-32BRIVSS-DCHhvgFV.js → chunk-32BRIVSS-CH8Kj5rh.js} +1 -1
  12. package/dist/assets/{chunk-5VM5RSS4-DcTpMdJ4.js → chunk-5VM5RSS4-Cfts6Lix.js} +1 -1
  13. package/dist/assets/{chunk-EX3LRPZG-BdN8fvWs.js → chunk-EX3LRPZG-Dguk4yKZ.js} +1 -1
  14. package/dist/assets/{chunk-JWPE2WC7-DmZJP-8E.js → chunk-JWPE2WC7-DbCJp6t9.js} +1 -1
  15. package/dist/assets/{chunk-MOJQB5TN-V74uYM17.js → chunk-MOJQB5TN-CNjM_9_U.js} +1 -1
  16. package/dist/assets/{chunk-RYQCIY6F-CoXUXbn_.js → chunk-RYQCIY6F-D4k-BUbh.js} +1 -1
  17. package/dist/assets/{chunk-V7JOEXUC-DUscIydR.js → chunk-V7JOEXUC-O1sFoHf1.js} +1 -1
  18. package/dist/assets/{chunk-VR4S4FIN-C4UDHq_a.js → chunk-VR4S4FIN-CGbSXVPL.js} +1 -1
  19. package/dist/assets/{chunk-XXDRQBXY-DIH9i8mZ.js → chunk-XXDRQBXY-iIelV7SO.js} +1 -1
  20. package/dist/assets/classDiagram-OUVF2IWQ-Ce7YjlIK.js +1 -0
  21. package/dist/assets/classDiagram-v2-EOCWNBFH-Ce7YjlIK.js +1 -0
  22. package/dist/assets/{cose-bilkent-JH36ORCC-Dn6Gy6l1.js → cose-bilkent-JH36ORCC-BKmPLgw2.js} +1 -1
  23. package/dist/assets/{cynefin-VYW2F7L2-C2LW5fzB.js → cynefin-VYW2F7L2-CmT6ieC5.js} +1 -1
  24. package/dist/assets/{cynefinDiagram-TSTJHNR4-CGoAq7C9.js → cynefinDiagram-TSTJHNR4-Hn2vSVOw.js} +1 -1
  25. package/dist/assets/{dagre-VKFMJZFB-BaOKtuBE.js → dagre-VKFMJZFB-B0ifIwlU.js} +1 -1
  26. package/dist/assets/{diagram-FQU43EPY-BdQwqt4x.js → diagram-FQU43EPY-BuCDB-JG.js} +1 -1
  27. package/dist/assets/{diagram-G47NLZAW-Dkcf0o5z.js → diagram-G47NLZAW-D5avTZAQ.js} +1 -1
  28. package/dist/assets/{diagram-NH7WQ7WH-C_fDi59r.js → diagram-NH7WQ7WH-24QCIgpj.js} +1 -1
  29. package/dist/assets/{diagram-OA4YK3LP-jaTQcOxt.js → diagram-OA4YK3LP-A-bbUTK3.js} +1 -1
  30. package/dist/assets/{diagram-WEI45ONY-dEtqVj3s.js → diagram-WEI45ONY-BIMDm-Kj.js} +1 -1
  31. package/dist/assets/{ebnfDiagram-CCIWWBDH-s8ImqsSs.js → ebnfDiagram-CCIWWBDH-DCXMfG-M.js} +1 -1
  32. package/dist/assets/{erDiagram-Q63AITRT-5Zy29-SA.js → erDiagram-Q63AITRT-BlDrG0Ev.js} +1 -1
  33. package/dist/assets/{flowDiagram-23GEKE2U-DV74V9he.js → flowDiagram-23GEKE2U-aTyazY6P.js} +1 -1
  34. package/dist/assets/{ganttDiagram-NO4QXBWP-BND-CiLO.js → ganttDiagram-NO4QXBWP-Bxo-a80f.js} +1 -1
  35. package/dist/assets/{gitGraphDiagram-IHSO6WYX-B_-Mf9Jo.js → gitGraphDiagram-IHSO6WYX-COhKb9wR.js} +1 -1
  36. package/dist/assets/index-BcmsQZX-.js +119 -0
  37. package/dist/assets/{infoDiagram-FWYZ7A6U-Duyz8rZM.js → infoDiagram-FWYZ7A6U-DLCbpinV.js} +1 -1
  38. package/dist/assets/{ishikawaDiagram-FXEZZL3T-D2Qft0e5.js → ishikawaDiagram-FXEZZL3T-eyHF7GIj.js} +1 -1
  39. package/dist/assets/{journeyDiagram-5HDEW3XC-q6rG4Rig.js → journeyDiagram-5HDEW3XC-BsVocmlw.js} +1 -1
  40. package/dist/assets/{kanban-definition-HUTT4EX6-CsPX7gBL.js → kanban-definition-HUTT4EX6-CaFPSZxY.js} +1 -1
  41. package/dist/assets/{linear-CiccpAAd.js → linear-cqnI_wgW.js} +1 -1
  42. package/dist/assets/{mindmap-definition-LN4V7U3C-DRW2njpA.js → mindmap-definition-LN4V7U3C-B66BGqKn.js} +1 -1
  43. package/dist/assets/{pegDiagram-2B236MQR-DoDgm2S_.js → pegDiagram-2B236MQR-F6IN0_L5.js} +1 -1
  44. package/dist/assets/{pieDiagram-ENE6RG2P-CNSYLVAF.js → pieDiagram-ENE6RG2P-D5nOQxpo.js} +1 -1
  45. package/dist/assets/{quadrantDiagram-ABIIQ3AL-8-Nd6ony.js → quadrantDiagram-ABIIQ3AL-DwUAYbMO.js} +1 -1
  46. package/dist/assets/{railroadDiagram-RFXS5EU6-bfdg6Bo4.js → railroadDiagram-RFXS5EU6-Cvmlah5P.js} +1 -1
  47. package/dist/assets/{requirementDiagram-TGXJPOKE-slDkxCQy.js → requirementDiagram-TGXJPOKE-DoUtsFnL.js} +1 -1
  48. package/dist/assets/{sankeyDiagram-HTMAVEWB-CR3CboiK.js → sankeyDiagram-HTMAVEWB-D4XTwiKp.js} +1 -1
  49. package/dist/assets/{sequenceDiagram-DBY2YBRQ-BIXw1JS1.js → sequenceDiagram-DBY2YBRQ-CiG9yRIR.js} +1 -1
  50. package/dist/assets/{sizeCapture-X5ZJPWSS-BdKI7JyF.js → sizeCapture-X5ZJPWSS-zd7ydQ_Y.js} +1 -1
  51. package/dist/assets/{stateDiagram-2N3HPSRC-ktVgpBZS.js → stateDiagram-2N3HPSRC-BZesBHQ4.js} +1 -1
  52. package/dist/assets/stateDiagram-v2-6OUMAXLB-BnlLOJzB.js +1 -0
  53. package/dist/assets/{swimlanes-5IMT3BWC-CaXpC3FM.js → swimlanes-5IMT3BWC-Bg8exSE7.js} +2 -2
  54. package/dist/assets/swimlanesDiagram-G3AALYLV-DZMVxqbs.js +8 -0
  55. package/dist/assets/{timeline-definition-FHXFAJF6-CKWSlRUl.js → timeline-definition-FHXFAJF6-TKj_HY9k.js} +1 -1
  56. package/dist/assets/{vennDiagram-L72KCM5P-CwOhxDyv.js → vennDiagram-L72KCM5P-CJf-bqn0.js} +1 -1
  57. package/dist/assets/{wardleyDiagram-EHGQE667-DGavMpEB.js → wardleyDiagram-EHGQE667-CqizSfCL.js} +1 -1
  58. package/dist/assets/{xychartDiagram-FW5EYKEG-CWmnmLZz.js → xychartDiagram-FW5EYKEG-CK-OErMM.js} +1 -1
  59. package/dist/index.html +1 -1
  60. package/lib/build-all.js +0 -5
  61. package/lib/build-stream-schema.js +1 -1
  62. package/lib/build.js +1762 -2614
  63. package/lib/consumer-fanout.js +1317 -0
  64. package/lib/feature-validator.js +6 -4
  65. package/lib/flow-state.js +15 -14
  66. package/lib/gsd-budget.js +48 -10
  67. package/lib/gsd-prompt.js +3 -4
  68. package/lib/gsd-stuck.js +1 -1
  69. package/lib/gsd.js +303 -149
  70. package/lib/local-claude-connector.js +149 -0
  71. package/lib/new.js +162 -307
  72. package/lib/result-normalizer.js +233 -18
  73. package/lib/review-lenses.js +1 -1
  74. package/lib/step-prompt.js +41 -119
  75. package/lib/stratum-engine.js +297 -0
  76. package/lib/stratum-mcp-client.js +224 -213
  77. package/lib/vocabulary-compliance.js +268 -0
  78. package/lib/vocabulary-inject.js +1 -36
  79. package/package.json +6 -2
  80. package/pipelines/build-quick.stratum.yaml +5 -17
  81. package/pipelines/build.profiles.json +11 -0
  82. package/pipelines/build.stratum.yaml +288 -467
  83. package/pipelines/gsd.stratum.yaml +73 -125
  84. package/pipelines/new.stratum.yaml +68 -149
  85. package/server/build-routes.js +4 -1
  86. package/server/design-routes.js +37 -21
  87. package/server/index.js +13 -21
  88. package/server/lifecycle-guard.js +1 -1
  89. package/server/pipeline-routes.js +113 -31
  90. package/server/stratum-client.js +33 -47
  91. package/server/stratum-sync.js +3 -4
  92. package/server/vision-server.js +1 -1
  93. package/dist/assets/channel-DiJkE9og.js +0 -1
  94. package/dist/assets/classDiagram-OUVF2IWQ-DS76VBEL.js +0 -1
  95. package/dist/assets/classDiagram-v2-EOCWNBFH-DS76VBEL.js +0 -1
  96. package/dist/assets/index-CBWbmG7W.js +0 -119
  97. package/dist/assets/stateDiagram-v2-6OUMAXLB-CzPQnlan.js +0 -1
  98. package/dist/assets/swimlanesDiagram-G3AALYLV-rIDv6EuQ.js +0 -8
  99. package/lib/connector-factory-shim.js +0 -167
  100. 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 `stratum-mcp` on PATH (`pip install stratum-mcp`, requires Python 3.11+). Codex steps additionally need the OpenAI `codex` CLI. Full prereqs in [docs/install.md](docs/install.md).
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 stratum-mcp (alias: compose sync)
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 skill + register stratum-mcp (user-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 + register stratum-mcp (alias: sync)')
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. Detect / auto-install stratum
372
- let hasStratum = !noStratum && spawnSync('which', ['stratum-mcp'], { encoding: 'utf-8' }).status === 0
373
- if (!noStratum && !hasStratum) {
374
- console.log('stratum-mcp not found — installing via pip...')
375
- const pipResult = spawnSync('pip', ['install', 'stratum-mcp'], {
376
- stdio: 'inherit',
377
- encoding: 'utf-8',
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 stratum-mcp as stratum_agent_run.
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 && !mcpConfig.mcpServers.stratum) {
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: stratumPath || 'stratum-mcp',
542
+ command: stratumConnection.command,
543
+ args: stratumConnection.args,
533
544
  }
534
- console.log('Registered stratum-mcp in .mcp.json')
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 skill + stratum-mcp registration
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 and register stratum-mcp. The name `sync` better signals
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()