@smartmemory/compose 0.3.7 → 0.4.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.
Files changed (217) hide show
  1. package/.claude/skills/compose/SKILL.md +12 -3
  2. package/.compose-deps.json +51 -25
  3. package/README.md +79 -7
  4. package/bin/compose.js +495 -360
  5. package/bin/judgment-migrate.js +387 -0
  6. package/contracts/comp-obs-contract.schema.json +9 -3
  7. package/contracts/fluid-record.schema.json +209 -0
  8. package/contracts/lifecycle-backfill.schema.json +322 -0
  9. package/dist/assets/App-Z4MU-H_F.js +916 -0
  10. package/dist/assets/{_baseUniq-Bo837sRJ.js → _baseUniq-ClWoCPFl.js} +1 -1
  11. package/dist/assets/{arc-BafGpyqE.js → arc-DY26UIVo.js} +1 -1
  12. package/dist/assets/{architectureDiagram-Q4EWVU46-BOBfUsqL.js → architectureDiagram-Q4EWVU46-6Ggq4DqJ.js} +1 -1
  13. package/dist/assets/{blockDiagram-DXYQGD6D-Dwodev1a.js → blockDiagram-DXYQGD6D-CH3Ked0l.js} +1 -1
  14. package/dist/assets/{browser-1ntj1-x_.js → browser-BWkrenen.js} +1 -1
  15. package/dist/assets/{c4Diagram-AHTNJAMY-CU_bhYag.js → c4Diagram-AHTNJAMY-Bk8dYilu.js} +1 -1
  16. package/dist/assets/channel-SnZzzh7k.js +1 -0
  17. package/dist/assets/{chunk-4BX2VUAB-p8WsDwnO.js → chunk-4BX2VUAB-BMR0XaAQ.js} +1 -1
  18. package/dist/assets/{chunk-4TB4RGXK-B8h7-eR0.js → chunk-4TB4RGXK-JytR14a9.js} +1 -1
  19. package/dist/assets/{chunk-55IACEB6-DxeEr98s.js → chunk-55IACEB6-B4Q97BCP.js} +1 -1
  20. package/dist/assets/{chunk-EDXVE4YY-BYt8F151.js → chunk-EDXVE4YY-R_qarkSf.js} +1 -1
  21. package/dist/assets/{chunk-FMBD7UC4-DGSOVeie.js → chunk-FMBD7UC4-C9s7KR9m.js} +1 -1
  22. package/dist/assets/{chunk-OYMX7WX6-B-QdgYR2.js → chunk-OYMX7WX6-BySQzVxc.js} +1 -1
  23. package/dist/assets/{chunk-QZHKN3VN-Du5UAZLs.js → chunk-QZHKN3VN-DdpSYZsW.js} +1 -1
  24. package/dist/assets/{chunk-YZCP3GAM-C8JbNBSk.js → chunk-YZCP3GAM-iE_tzriw.js} +1 -1
  25. package/dist/assets/classDiagram-6PBFFD2Q-CBu92dSH.js +1 -0
  26. package/dist/assets/classDiagram-v2-HSJHXN6E-CBu92dSH.js +1 -0
  27. package/dist/assets/clone-DgklGjHm.js +1 -0
  28. package/dist/assets/{cose-bilkent-S5V4N54A-O1ESaqge.js → cose-bilkent-S5V4N54A-BdlU6ZX_.js} +1 -1
  29. package/dist/assets/{dagre-KV5264BT-CPTmFPHw.js → dagre-KV5264BT-Cp3F5KTn.js} +1 -1
  30. package/dist/assets/{diagram-5BDNPKRD-B3PNrWs5.js → diagram-5BDNPKRD-DiR6_2q_.js} +1 -1
  31. package/dist/assets/{diagram-G4DWMVQ6-Cscfr6vc.js → diagram-G4DWMVQ6-w0i-p5HX.js} +1 -1
  32. package/dist/assets/{diagram-MMDJMWI5-CSfqZ-TM.js → diagram-MMDJMWI5-tIHhwUv3.js} +1 -1
  33. package/dist/assets/{diagram-TYMM5635-Cg4aYS7W.js → diagram-TYMM5635-BAeY3B19.js} +1 -1
  34. package/dist/assets/{erDiagram-SMLLAGMA-_ZqwG5pl.js → erDiagram-SMLLAGMA-Ckx_Knko.js} +1 -1
  35. package/dist/assets/{flowDiagram-DWJPFMVM-C83boxFT.js → flowDiagram-DWJPFMVM-DeoNka6J.js} +1 -1
  36. package/dist/assets/{ganttDiagram-T4ZO3ILL-CWnIjuEi.js → ganttDiagram-T4ZO3ILL-BmGnFbEg.js} +1 -1
  37. package/dist/assets/{gitGraphDiagram-UUTBAWPF-DrMdxZfH.js → gitGraphDiagram-UUTBAWPF-Dk48IHsx.js} +1 -1
  38. package/dist/assets/{graph-RE4I7Ty7.js → graph-BNzKGvoy.js} +1 -1
  39. package/dist/assets/{graph-Bi99_6Yf.js → graph-CI_1htl0.js} +1 -1
  40. package/dist/assets/{index-Rm2RE-c0.js → index-BEfrNBp8.js} +3 -3
  41. package/dist/assets/index-yyrA5OZd.css +1 -0
  42. package/dist/assets/{infoDiagram-42DDH7IO-BLmP4Epr.js → infoDiagram-42DDH7IO-BRf827i0.js} +1 -1
  43. package/dist/assets/{ishikawaDiagram-UXIWVN3A-yuWWshKN.js → ishikawaDiagram-UXIWVN3A-0kCZaeCM.js} +1 -1
  44. package/dist/assets/{journeyDiagram-VCZTEJTY-BOfhaJov.js → journeyDiagram-VCZTEJTY-rvU7ayRt.js} +1 -1
  45. package/dist/assets/{kanban-definition-6JOO6SKY-Bbolde15.js → kanban-definition-6JOO6SKY-DpQwX1C5.js} +1 -1
  46. package/dist/assets/{layout-BSf33zm8.js → layout-BI8cXFPI.js} +1 -1
  47. package/dist/assets/{linear-AvSTWMqx.js → linear-a0glcDiw.js} +1 -1
  48. package/dist/assets/{min-QBM8H4xN.js → min-vPHfnXcC.js} +1 -1
  49. package/dist/assets/{mindmap-definition-QFDTVHPH-BuvgtqIc.js → mindmap-definition-QFDTVHPH-D14eF-7C.js} +1 -1
  50. package/dist/assets/mobile-B7m9EO9D.js +17 -0
  51. package/dist/assets/{pieDiagram-DEJITSTG-DIzF16vh.js → pieDiagram-DEJITSTG-Cno-gETh.js} +1 -1
  52. package/dist/assets/{quadrantDiagram-34T5L4WZ-D-mbUIjS.js → quadrantDiagram-34T5L4WZ-BUQM1Hfm.js} +1 -1
  53. package/dist/assets/{requirementDiagram-MS252O5E-CEs4kCLd.js → requirementDiagram-MS252O5E-pOXlN2-q.js} +1 -1
  54. package/dist/assets/{sankeyDiagram-XADWPNL6-DFsnCr9n.js → sankeyDiagram-XADWPNL6-Crynd3_b.js} +1 -1
  55. package/dist/assets/{sequenceDiagram-FGHM5R23-BEJYdTjQ.js → sequenceDiagram-FGHM5R23-D9fZdCM8.js} +1 -1
  56. package/dist/assets/{stateDiagram-FHFEXIEX-BBXs57uY.js → stateDiagram-FHFEXIEX-CW9qVec8.js} +1 -1
  57. package/dist/assets/stateDiagram-v2-QKLJ7IA2-DkVLzHbY.js +1 -0
  58. package/dist/assets/{timeline-definition-GMOUNBTQ-BGvLoVAY.js → timeline-definition-GMOUNBTQ-BcHzhm_8.js} +1 -1
  59. package/dist/assets/{vennDiagram-DHZGUBPP-9LaBTMe0.js → vennDiagram-DHZGUBPP-BfytJcWk.js} +1 -1
  60. package/dist/assets/{wardley-RL74JXVD-P4MEqMTP.js → wardley-RL74JXVD-DLj-IjyB.js} +1 -1
  61. package/dist/assets/{wardleyDiagram-NUSXRM2D-o-tmxnlC.js → wardleyDiagram-NUSXRM2D-Ds0Ue68c.js} +1 -1
  62. package/dist/assets/{xychartDiagram-5P7HB3ND-Dpn7V6qk.js → xychartDiagram-5P7HB3ND-vjWDXFL6.js} +1 -1
  63. package/dist/index.html +3 -3
  64. package/lib/agent-string.js +7 -5
  65. package/lib/append-integrity.js +81 -0
  66. package/lib/backfill-evidence.js +109 -0
  67. package/lib/bug-escalation.js +9 -0
  68. package/lib/build-stream-schema.js +3 -1
  69. package/lib/build-stream-writer.js +25 -0
  70. package/lib/build.js +874 -170
  71. package/lib/canon-guard.js +28 -6
  72. package/lib/canon-override.js +196 -0
  73. package/lib/canon-registry.js +104 -0
  74. package/lib/cli-commands.js +144 -0
  75. package/lib/codex-preflight.js +26 -13
  76. package/lib/colleague/context.js +215 -0
  77. package/lib/colleague/writeback.js +95 -0
  78. package/lib/completion-gate.js +1421 -0
  79. package/lib/completion-writer.js +47 -47
  80. package/lib/consumer-fanout.js +105 -11
  81. package/lib/coverage-gate.js +200 -0
  82. package/lib/deps.js +164 -7
  83. package/lib/dir-lock.js +170 -0
  84. package/lib/dispatch-ledger.js +3 -3
  85. package/lib/feature-json.js +1 -1
  86. package/lib/feature-reconciler.js +8 -0
  87. package/lib/feature-validator.js +64 -1
  88. package/lib/feature-writer.js +57 -2
  89. package/lib/fluid/factory.js +167 -0
  90. package/lib/fluid/ideabox-dates.js +73 -0
  91. package/lib/fluid/ideabox-migrate.js +154 -0
  92. package/lib/fluid/ideabox-ops.js +585 -0
  93. package/lib/fluid/ideabox-view.js +146 -0
  94. package/lib/fluid/import-ideabox.js +186 -0
  95. package/lib/fluid/local-provider.js +606 -0
  96. package/lib/fluid/provider.js +684 -0
  97. package/lib/fluid/record-shape.js +214 -0
  98. package/lib/fluid/record-store.js +328 -0
  99. package/lib/fluid/render-ideabox.js +261 -0
  100. package/lib/fluid/schema.js +40 -0
  101. package/lib/fluid/smartmemory-provider.js +1695 -0
  102. package/lib/gsd.js +63 -23
  103. package/lib/guard-cli.js +175 -0
  104. package/lib/guard-custody.js +141 -0
  105. package/lib/guard-descriptors.js +530 -0
  106. package/lib/guard-enrol.js +254 -0
  107. package/lib/health-score.js +1 -1
  108. package/lib/ideabox-cli.js +315 -0
  109. package/lib/ideabox.js +121 -21
  110. package/lib/judgment/store/index.js +9 -1
  111. package/lib/judgment/store/records.js +1 -1
  112. package/lib/judgment/trace.js +380 -0
  113. package/lib/judgment-decision-write.js +277 -0
  114. package/lib/judgment-decisions.js +466 -0
  115. package/lib/judgment-gen.js +5 -1
  116. package/lib/judgment-writer.js +56 -2
  117. package/lib/lifecycle-modes.js +4 -4
  118. package/lib/lineage.js +400 -0
  119. package/lib/local-claude-connector.js +52 -1
  120. package/lib/maya-client.js +302 -0
  121. package/lib/maya-config.js +53 -0
  122. package/lib/maya-identity.js +283 -0
  123. package/lib/migrate-anon.js +5 -0
  124. package/lib/migrate-roadmap.js +15 -0
  125. package/lib/new.js +13 -1
  126. package/lib/pipeline-compat.js +104 -0
  127. package/lib/policy-catalog.js +295 -0
  128. package/lib/policy-check.js +0 -0
  129. package/lib/process-termination.js +98 -0
  130. package/lib/resolve-workspace.js +5 -1
  131. package/lib/result-normalizer.js +396 -199
  132. package/lib/roadmap-errors.js +65 -0
  133. package/lib/roadmap-preservers.js +24 -4
  134. package/lib/roadmap-residue.js +299 -0
  135. package/lib/smartmemory-client.js +614 -78
  136. package/lib/smartmemory-config.js +54 -0
  137. package/lib/smartmemory-ingest.js +19 -2
  138. package/lib/step-prompt.js +7 -6
  139. package/lib/stratum-engine.js +53 -4
  140. package/lib/stratum-mcp-client.js +271 -36
  141. package/lib/test-bootstrap.js +31 -0
  142. package/lib/tool-inventory.js +122 -0
  143. package/lib/version-check.js +91 -19
  144. package/lib/vision-writer.js +88 -1
  145. package/package.json +7 -6
  146. package/pipelines/bug-fix.stratum.yaml +205 -211
  147. package/pipelines/build-quick.profiles.json +12 -0
  148. package/pipelines/build-quick.stratum.yaml +263 -350
  149. package/pipelines/content.stratum.yaml +81 -77
  150. package/pipelines/coverage-sweep.stratum.yaml +49 -30
  151. package/pipelines/plan.stratum.yaml +76 -86
  152. package/pipelines/refactor.stratum.yaml +125 -125
  153. package/pipelines/research.stratum.yaml +56 -58
  154. package/pipelines/review-fix.profiles.json +6 -0
  155. package/pipelines/review-fix.stratum.yaml +110 -83
  156. package/presets/team-feature.profiles.json +6 -0
  157. package/presets/team-feature.stratum.yaml +93 -66
  158. package/presets/team-research.profiles.json +6 -0
  159. package/presets/team-research.stratum.yaml +89 -80
  160. package/presets/team-review.profiles.json +8 -0
  161. package/presets/team-review.stratum.yaml +98 -80
  162. package/scripts/cost-census.mjs +70 -0
  163. package/scripts/guard-sign/compose-guard-sign.sh +62 -0
  164. package/server/agent-health.js +22 -0
  165. package/server/agent-hooks.js +14 -1
  166. package/server/agent-server.js +5 -248
  167. package/server/agent-spawn.js +3 -4
  168. package/server/agent-workspace.js +294 -0
  169. package/server/build-routes.js +6 -5
  170. package/server/build-stream-bridge.js +53 -0
  171. package/server/cc-session-watcher.js +4 -1
  172. package/server/coalescing-buffer.js +7 -1
  173. package/server/completion-projection.js +228 -0
  174. package/server/compose-mcp-tools.js +109 -23
  175. package/server/compose-mcp.js +88 -882
  176. package/server/decision-event-emit.js +41 -2
  177. package/server/decision-event-id.js +17 -0
  178. package/server/decision-events-snapshot.js +3 -0
  179. package/server/design-routes.js +14 -8
  180. package/server/feature-scan.js +76 -2
  181. package/server/file-watcher.js +170 -21
  182. package/server/ideabox-routes.js +166 -224
  183. package/server/index.js +70 -100
  184. package/server/lifecycle-guard.js +240 -10
  185. package/server/lifecycle-phase-history.js +276 -0
  186. package/server/maya-routes.js +507 -0
  187. package/server/mcp-tool-defs.js +940 -0
  188. package/server/mcp-tool-policy.js +34 -2
  189. package/server/model-tiers.js +22 -5
  190. package/server/pipeline-routes.js +21 -11
  191. package/server/project-root.js +58 -19
  192. package/server/remote-utils.js +3 -1
  193. package/server/schema-validator.js +7 -1
  194. package/server/session-manager.js +5 -6
  195. package/server/session-routes.js +3 -1
  196. package/server/stratum-client.js +57 -10
  197. package/server/stratum-sync.js +6 -3
  198. package/server/summarizer.js +3 -4
  199. package/server/supervisor.js +0 -1
  200. package/server/vision-routes.js +208 -98
  201. package/server/vision-server.js +86 -23
  202. package/server/vision-store.js +60 -6
  203. package/server/vision-utils.js +3 -4
  204. package/server/workspace-activity.js +18 -0
  205. package/server/workspace-middleware.js +2 -2
  206. package/server/workspace-runtime.js +243 -0
  207. package/server/worktree-gc.js +1 -0
  208. package/dist/assets/App-PkZzHeMj.js +0 -894
  209. package/dist/assets/channel-qVK_qn4E.js +0 -1
  210. package/dist/assets/classDiagram-6PBFFD2Q-B8UcfC1q.js +0 -1
  211. package/dist/assets/classDiagram-v2-HSJHXN6E-B8UcfC1q.js +0 -1
  212. package/dist/assets/clone-Pu3RyLUh.js +0 -1
  213. package/dist/assets/index-LIwREYgH.css +0 -1
  214. package/dist/assets/mobile-BnXEOE3U.js +0 -17
  215. package/dist/assets/stateDiagram-v2-QKLJ7IA2-BqKuX4rj.js +0 -1
  216. package/lib/staleness.js +0 -87
  217. package/server/ideabox-cache.js +0 -77
@@ -537,7 +537,7 @@ When `/compose` is invoked, always scan first:
537
537
  | `refactor` | Phase 7 — when review finds large files |
538
538
  | `update-docs` | Phase 9 |
539
539
 
540
- **Note on dependencies:** these skills are referenced by name and must be installed on the user's machine. See `## Dependencies` below for the install contract — `compose setup` only ships compose-owned skills today; external deps are documented but not auto-installed.
540
+ **Note on dependencies:** these skills are referenced by name and must be installed on the user's machine. See `## Dependencies` below for the install contract — `compose setup` ships compose-owned skills and auto-installs the plugins behind missing REQUIRED external deps (COMP-DEPS-AUTOINSTALL); optional deps remain documented hints.
541
541
 
542
542
  ## Memory
543
543
 
@@ -559,11 +559,20 @@ After completing a feature OR bug-fix lifecycle, update project memory:
559
559
  | `stratum` | `compose/skills/stratum/` (if present) | Execution substrate |
560
560
  | `compose-explorer`, `compose-architect` | agents under `compose/.claude/agents/` | Required by Phases 1, 3, 4 |
561
561
 
562
- ### External dependencies (NOT auto-installed)
562
+ ### External dependencies
563
563
 
564
564
  Authoritative list lives in `compose/.compose-deps.json`. Run `compose doctor` to see what's installed locally and `compose doctor --json` for machine-readable output. The manifest is the single source of truth for external dep IDs and per-dep `fallback` behavior — this SKILL.md never duplicates per-dep fallback strings.
565
565
 
566
- The manifest declares 12 external skills/commands across `superpowers:*`, `interface-design:*`, `codex:review`, `refactor`, and `update-docs`. Each entry carries `id`, `required_for`, `install`, `fallback` (or null), and `optional`.
566
+ The manifest declares 12 external skills/commands across `superpowers:*`, `interface-design:*`, `codex:review`, `refactor`, and `update-docs`. Each entry carries `id`, `required_for`, `install`, `fallback` (or null), and `optional`, plus two optional fields used by auto-install: `plugin` (the `<plugin>@<marketplace>` spec passed to `claude plugin install`) and `marketplace_source` (the `owner/repo` registered first when that marketplace is not configured yet).
567
+
568
+ **Auto-install (COMP-DEPS-AUTOINSTALL).** `compose setup` / `init` / `update` install the plugins behind missing **required** deps before printing the dep report, so the report describes the state you end up in rather than the state you started from. Rules:
569
+
570
+ - Only deps with a `plugin` spec are installable. Deps whose `install` is prose (`refactor`, `update-docs`) stay hints.
571
+ - **Optional deps are never auto-installed** — the ones we ship live in third-party marketplaces that each need a separate `marketplace add`, a larger consent step than pulling from a marketplace the user already has.
572
+ - Specs are deduped: six `superpowers:*` deps produce one install.
573
+ - On a machine with no marketplaces registered the first install fails; compose registers the declared `marketplace_source` and retries once.
574
+ - Opt out with `--no-install-deps` or `COMPOSE_NO_PLUGIN_INSTALL=1`. Failures print the real stderr and never change the exit code.
575
+ - `compose doctor` stays read-only; it reports, it never installs.
567
576
 
568
577
  The manifest also has an optional `external_binaries` array for CLI tools (not skills). Today it declares `rtk` ([Rust Token Killer](https://github.com/rtk-ai/rtk), COMP-RTK-INTEROP) — a lossy output compressor compose routes its one LLM-bound `git diff` (the Codex review diff) through when present, degrading byte-identically when absent. `compose doctor` reports binaries alongside skills and surfaces each binary's `recommend` (for rtk: `rtk init -g`, which installs RTK's Claude Code hook so the agent's *own* Bash output is compressed too — the larger token win). Binary entries carry `id`, `detect`, `install`, `recommend` (or null), and `optional`; all are optional and never block the lifecycle.
569
578
 
@@ -3,100 +3,126 @@
3
3
  "external_skills": [
4
4
  {
5
5
  "id": "superpowers:systematic-debugging",
6
- "required_for": ["bug-fix Phase F3", "any unexpected failure"],
6
+ "required_for": [
7
+ "bug-fix Phase F3",
8
+ "any unexpected failure"
9
+ ],
7
10
  "install": "claude plugin install superpowers",
11
+ "plugin": "superpowers@claude-plugins-official",
12
+ "marketplace_source": "anthropics/claude-plugins-official",
8
13
  "fallback": "general-purpose Agent with debugging prompt",
9
14
  "optional": false
10
15
  },
11
16
  {
12
17
  "id": "superpowers:test-driven-development",
13
- "required_for": ["bug-fix Phase F2", "build Phase 7 step 1"],
18
+ "required_for": [
19
+ "bug-fix Phase F2",
20
+ "build Phase 7 step 1"
21
+ ],
14
22
  "install": "claude plugin install superpowers",
23
+ "plugin": "superpowers@claude-plugins-official",
24
+ "marketplace_source": "anthropics/claude-plugins-official",
15
25
  "fallback": "inline TDD instructions in SKILL.md",
16
26
  "optional": false
17
27
  },
18
28
  {
19
29
  "id": "superpowers:verification-before-completion",
20
- "required_for": ["all phase exits"],
30
+ "required_for": [
31
+ "all phase exits"
32
+ ],
21
33
  "install": "claude plugin install superpowers",
34
+ "plugin": "superpowers@claude-plugins-official",
35
+ "marketplace_source": "anthropics/claude-plugins-official",
22
36
  "fallback": "inline verification checklist in SKILL.md",
23
37
  "optional": false
24
38
  },
25
39
  {
26
40
  "id": "superpowers:requesting-code-review",
27
- "required_for": ["Phase 7 review fallback"],
41
+ "required_for": [
42
+ "Phase 7 review fallback"
43
+ ],
28
44
  "install": "claude plugin install superpowers",
45
+ "plugin": "superpowers@claude-plugins-official",
46
+ "marketplace_source": "anthropics/claude-plugins-official",
29
47
  "fallback": "general-purpose Agent reviewer with canonical ReviewResult prompt",
30
48
  "optional": true
31
49
  },
32
50
  {
33
51
  "id": "superpowers:executing-plans",
34
- "required_for": ["Phase 7 sequential execution"],
52
+ "required_for": [
53
+ "Phase 7 sequential execution"
54
+ ],
35
55
  "install": "claude plugin install superpowers",
56
+ "plugin": "superpowers@claude-plugins-official",
57
+ "marketplace_source": "anthropics/claude-plugins-official",
36
58
  "fallback": "inline plan-execution instructions",
37
59
  "optional": false
38
60
  },
39
61
  {
40
62
  "id": "superpowers:dispatching-parallel-agents",
41
- "required_for": ["Phase 7 parallel execution"],
63
+ "required_for": [
64
+ "Phase 7 parallel execution"
65
+ ],
42
66
  "install": "claude plugin install superpowers",
67
+ "plugin": "superpowers@claude-plugins-official",
68
+ "marketplace_source": "anthropics/claude-plugins-official",
43
69
  "fallback": "sequential execution",
44
70
  "optional": true
45
71
  },
46
72
  {
47
73
  "id": "interface-design:init",
48
- "required_for": ["Phase 7 — new UI components"],
74
+ "required_for": [
75
+ "Phase 7 \u2014 new UI components"
76
+ ],
49
77
  "install": "claude plugin install interface-design",
50
78
  "fallback": null,
51
79
  "optional": true
52
80
  },
53
81
  {
54
82
  "id": "interface-design:critique",
55
- "required_for": ["Phase 7 — UI critique pass"],
83
+ "required_for": [
84
+ "Phase 7 \u2014 UI critique pass"
85
+ ],
56
86
  "install": "claude plugin install interface-design",
57
87
  "fallback": null,
58
88
  "optional": true
59
89
  },
60
90
  {
61
91
  "id": "interface-design:audit",
62
- "required_for": ["Phase 7 — UI design-system audit"],
92
+ "required_for": [
93
+ "Phase 7 \u2014 UI design-system audit"
94
+ ],
63
95
  "install": "claude plugin install interface-design",
64
96
  "fallback": null,
65
97
  "optional": true
66
98
  },
67
99
  {
68
100
  "id": "codex:review",
69
- "required_for": ["Phase 7 review gate (human-driven)"],
101
+ "required_for": [
102
+ "Phase 7 review gate (human-driven)"
103
+ ],
70
104
  "install": "claude plugin install openai-codex",
71
105
  "fallback": "mcp__stratum__stratum_agent_run type=codex",
72
106
  "optional": true
73
107
  },
74
108
  {
75
109
  "id": "refactor",
76
- "required_for": ["Phase 7 large-file split"],
110
+ "required_for": [
111
+ "Phase 7 large-file split"
112
+ ],
77
113
  "install": "user-installed skill at ~/.claude/skills/refactor/",
78
114
  "fallback": null,
79
115
  "optional": true
80
116
  },
81
117
  {
82
118
  "id": "update-docs",
83
- "required_for": ["Phase 9 docs sync"],
119
+ "required_for": [
120
+ "Phase 9 docs sync"
121
+ ],
84
122
  "install": "user-installed skill at ~/.claude/skills/update-docs/",
85
123
  "fallback": "manual TODO surfaced in implementation report",
86
124
  "optional": true
87
125
  }
88
126
  ],
89
- "external_binaries": [
90
- {
91
- "id": "rtk",
92
- "detect": "rtk --version",
93
- "required_for": [
94
- "LLM-bound git-diff compression (build review)",
95
- "agent Bash output compression via `rtk init -g` hook"
96
- ],
97
- "install": "brew install rtk (or: cargo install --git https://github.com/rtk-ai/rtk)",
98
- "recommend": "rtk init -g",
99
- "optional": true
100
- }
101
- ]
127
+ "external_binaries": []
102
128
  }
package/README.md CHANGED
@@ -1,14 +1,47 @@
1
1
  # Compose
2
2
 
3
- Compose is a CLI that drives a product idea from intent to shipped code. It runs YAML-defined multi-step pipelines on top of [Stratum](https://github.com/smartmemory/stratum), dispatching each step to an AI agent (Claude or Codex), checking postconditions, and pausing at human gates between phases. Output: a feature folder with design, blueprint, plan, code, tests, review trail, and an updated `ROADMAP.md` — auditable end-to-end.
3
+ ### Structured AI dev pipeline: goal to shipped code, with gates that hold
4
+
5
+ #### *Your agent writes the code. Compose makes it prove it.*
6
+
7
+ > Describe what you want. Compose decomposes it, forces the design decisions before any code is written, hands each step to the right agent, and refuses to advance until that step proves it is done. What comes back is a feature folder with the design, the blueprint, the plan, the code, the tests, and the full review trail. Auditable end to end.
4
8
 
5
9
  ![Compose Cockpit Shell](Screenshot.png)
6
10
 
7
- ## Pitch
11
+ ## The problem
12
+
13
+ An agent finishes, reports done, and the suite is green. Weeks later you find the feature. It exists, it has tests, and nothing calls it. The tests exercise a path that real data never enters.
14
+
15
+ Nobody lied. The agent did what it was asked, the tests assert what they assert, and no step in between ever had to prove the thing was wired to anything. That gap does not show up in a diff review. It shows up in production, or it never shows up at all, which is worse.
16
+
17
+ Compose sits above Claude Code and Codex rather than in place of them. It decides what the next step is, hands it to whichever agent should do it, and will not advance until the step proves it finished.
18
+
19
+ ## Who it's for
20
+
21
+ - **Solo builders and small teams** shipping more code each week than they can personally review, who need something other than trust to decide when a feature is really done
22
+ - **Tech leads reviewing agent output** who keep finding work that passes its own tests and is wired to nothing
23
+ - **Anyone running more than one agent** (Claude for implementation, Codex for review) who wants the same standard applied no matter which model did the work
24
+ - **Developers who lose the thread at a session boundary** and want the plan, the decisions, and the open questions to outlive the context window instead of living in chat scrollback
25
+ - **Maintainers whose roadmap has drifted from reality** and want status derived from what actually shipped rather than from what someone remembered to update
26
+ - **Teams who have to explain a decision months later**, what was chosen, what was rejected and why, and cannot reconstruct any of it from a diff
8
27
 
9
- - **Gates everywhere** — every phase transition (design, plan, ship) is approve/revise/kill. Human or Codex review at any point.
10
- - **Stratum-backed** — pipelines are declarative `.stratum.yaml` specs with typed contracts, `ensure` postconditions, and retry/`on_fail` routing. Specs are editable.
11
- - **Multi-agent** Claude (via the Anthropic Agent SDK) and Codex (via the OpenAI CLI) plug in through a uniform connector interface; reviews can run on a different model than implementation.
28
+ ## Why Compose
29
+
30
+ | | Prompting the agent directly | A plan.md or TODO list | **Compose** |
31
+ | --- | --- | --- | --- |
32
+ | **Definition of done** | Whatever the agent says | A checkbox someone ticks | Postconditions checked before the step can pass |
33
+ | **Design decisions** | In the chat, then gone | Sometimes written down | Recorded artifacts, gated before any code |
34
+ | **Survives a session boundary** | No, only scrollback | The text, not the reasoning | Feature folder: design, blueprint, plan, review trail |
35
+ | **Review** | Whenever you remember | Manual | Enforced at every gate, and runnable on a different model than the one that wrote the code |
36
+ | **Catches wired-to-nothing code** | No | No | Implementation review keyed to wiring, not only to tests |
37
+ | **Roadmap status** | Manual | Manual, and it drifts | Generated from what actually shipped |
38
+ | **Recovery mid-build** | Start over | Re-read and guess | Resume from recorded state |
39
+
40
+ ## How it holds the line
41
+
42
+ - **Gates everywhere.** Every phase transition (design, plan, ship) is approve, revise, or kill. Human or Codex review at any point.
43
+ - **Stratum-backed.** Pipelines are declarative `.stratum.yaml` specs with typed contracts, `ensure` postconditions, and retry/`on_fail` routing. Specs are editable.
44
+ - **Multi-agent.** Claude (via the Anthropic Agent SDK) and Codex (via the OpenAI CLI) plug in through a uniform connector interface. Reviews can run on a different model than implementation.
12
45
 
13
46
  ## 30-second example
14
47
 
@@ -43,7 +76,7 @@ compose plan "a tool that summarizes my team's standups"
43
76
 
44
77
  ## Quick install
45
78
 
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).
79
+ Prerequisites: Node.js 18+. [Stratum](https://github.com/smartmemory/stratum) needs no separate install `@smartmemory/stratum` is a dependency, and `compose init` registers the installed copy's MCP entrypoint automatically (a sibling `stratum/` checkout is a development convenience, not a requirement; 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
80
 
48
81
  The package is published to npm as `@smartmemory/compose`. Pick one install style:
49
82
 
@@ -51,7 +84,7 @@ The package is published to npm as `@smartmemory/compose`. Pick one install styl
51
84
 
52
85
  ```bash
53
86
  npm install -g @smartmemory/compose
54
- compose setup # install bundled skills + register the Stratum MCP server (alias: compose sync)
87
+ compose setup # install bundled skills, auto-install missing required plugins, register the Stratum MCP server (alias: compose sync)
55
88
  ```
56
89
 
57
90
  **Option B — git clone (for development):**
@@ -85,6 +118,11 @@ One command — auto-detects whether compose was installed via npm or git clone:
85
118
  compose update
86
119
  ```
87
120
 
121
+ Versions across the three published packages move together: `@smartmemory/compose-mcp` carries
122
+ compose's exact version, and `@smartmemory/compose` shares a minor with `@smartmemory/stratum`
123
+ (patches move independently). So compose 0.4.x pairs with stratum 0.4.x. See
124
+ [.claude/rules/versioning.md](.claude/rules/versioning.md).
125
+
88
126
  For npm installs, this runs `npm install -g @smartmemory/compose@latest`. For git clones, it runs `git pull --ff-only && npm install`. Either way it then refreshes the global skill and (if invoked from inside a Compose project) re-runs `compose init` to refresh `.mcp.json` and pipeline templates. Use `compose update --force` to bypass the dirty-tree check on git clones.
89
127
 
90
128
  Check what you're running:
@@ -144,6 +182,17 @@ compose tracker sync # reconcile op-log against remote provider
144
182
 
145
183
  See [docs/configuration.md](docs/configuration.md) for the full `tracker` config reference.
146
184
 
185
+ ## Backfilling a completion (guarded workspaces)
186
+
187
+ Sometimes a feature is finished before its lifecycle was ever walked: it shipped before Compose existed, or the guard was switched off at the time. Compose can record that completion with evidence instead of an override token. Call the MCP tool `backfill_completion` (or `POST /api/vision/items/:id/lifecycle/backfill`) with the completing commit, a test attestation, a reason, and dated phase occurrences. The gate verifies the evidence, merges the occurrences into the phase history by their real dates, and moves the guard to `complete_backfilled`. Readers and the UI show which entries were backfilled.
188
+
189
+ Features that were never registered with the guard need nothing else. Features registered before this release carry an older policy, and the guard will only accept the new one under a signed upgrade descriptor. The signature is the one thing an agent must never be able to produce on its own, so it is the one thing a human confirms:
190
+
191
+ - **Once per Mac:** run `compose guard enrol` from a terminal. It installs a root-owned signing key and signer under `/Library/Compose/guard/`, a `sudo` rule that always re-authenticates (Touch ID via `pam_tid`), enrols the public key in stratum's trust root, and verifies the round trip. Two Touch ID prompts, then `done`.
192
+ - **Every later signature is one Touch ID prompt.** When a backfill needs a descriptor that is not yet signed, the gate generates it, asks, verifies, and continues. Nothing else is manual. `compose guard sign` does the same explicitly and `compose guard status` shows custody, enrolment, descriptor freshness and whether the signed generations are committed.
193
+
194
+ Signed descriptors live in `.compose/guard-upgrades/<sha256>/` (immutable) with `current` pointing at the live generation; commit them like any other workspace canon. A backfill refuses with `signature_not_approved` when the prompt is cancelled or cannot be shown (SSH session, `tmux` without `pam_reattach`), and with `upgrade_descriptor_unavailable` on a machine that has not run `enrol`. Admins who want the "one approval, one signature" property to hold against their own other `sudo` use can add `Defaults timestamp_timeout=0` to sudoers. Without macOS custody (Linux, CI), `compose guard descriptors` still writes the unsigned candidate and prints the `ssh-keygen -Y sign` command for an operator key.
195
+
147
196
  ## Remote access (mobile PWA from anywhere)
148
197
 
149
198
  The mobile cockpit at `/m` can be reached from outside localhost — bring your own tunnel, compose handles auth and pairing:
@@ -189,6 +238,29 @@ compose smartmemory sync --dry-run # preview counts without ingesting
189
238
  compose smartmemory sync --feature CODE # scope the sync to one feature
190
239
  ```
191
240
 
241
+ ### Maya colleague panel (opt-in, requires the SmartMemory service stack)
242
+
243
+ With the SmartMemory fluid provider configured, a `maya` block summons Maya (the SmartMemory
244
+ assistant) as a colleague inside the cockpit: a slide-over panel where you discuss ideas while
245
+ Compose computes the memory findings (challenge, conviction, contradictions) and hands them to
246
+ her as per-turn context. Her replies about a focused idea append to its discussion trail as
247
+ `author: maya`.
248
+
249
+ ```json
250
+ {
251
+ "maya": {
252
+ "baseUrl": "http://localhost:9005",
253
+ "auth": { "mode": "provision" }
254
+ }
255
+ }
256
+ ```
257
+
258
+ `auth.mode` is `provision` (a dedicated colleague identity minted lazily against the local
259
+ smart-memory-service test surface) or `static` (paste a token in the panel; it is verified
260
+ against the service before being stored). The colleague never runs degraded: without the
261
+ SmartMemory provider the panel explains what to connect instead of falling back to plain chat,
262
+ and capabilities the provider does not declare render as visibly unavailable.
263
+
192
264
  ## Documentation
193
265
 
194
266
  Topic-scoped reference: