@mu-crew/mu 3.2.0 → 3.2.1
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/AGENTS.md +203 -599
- package/README.md +76 -327
- package/dist/cli.js.map +1 -1
- package/dist/extension/mu-pi.js +178 -45
- package/dist/extension/mu-pi.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/docs/ARCHITECTURE.md +175 -1072
- package/docs/ROADMAP.md +88 -169
- package/docs/VISION.md +205 -415
- package/docs/VOCABULARY.md +202 -466
- package/docs/architecture/control-socket.md +119 -0
- package/docs/architecture/dag.md +113 -0
- package/docs/architecture/mux.md +163 -0
- package/docs/architecture/ops-log.md +140 -0
- package/docs/architecture/sdk.md +185 -0
- package/docs/architecture/sync.md +129 -0
- package/docs/architecture/tui.md +146 -0
- package/docs/guide/README.md +25 -0
- package/docs/guide/backends.md +61 -0
- package/docs/guide/cleanup.md +74 -0
- package/docs/guide/delegate.md +87 -0
- package/docs/guide/dispatch.md +137 -0
- package/docs/guide/getting-started.md +177 -0
- package/docs/guide/recovery.md +133 -0
- package/docs/guide/remote.md +74 -0
- package/docs/guide/sql.md +76 -0
- package/docs/guide/stop-a-worker.md +64 -0
- package/docs/guide/sync.md +78 -0
- package/docs/guide/tui.md +98 -0
- package/docs/guide/upgrade.md +76 -0
- package/docs/history/CHANGELOG-pre-3.md +4866 -0
- package/docs/reference/env.md +87 -0
- package/docs/reference/naming.md +82 -0
- package/docs/specs/2026-09-28-agent-state-from-murmur.md +1 -1
- package/docs/specs/2026-09-29-task-substates.md +1 -1
- package/package.json +1 -1
- package/skills/mu/REMOTE_WORKERS.md +179 -504
- package/skills/mu/SKILL.md +116 -185
- package/docs/HANDOVER.md +0 -486
- package/docs/USAGE_GUIDE.md +0 -2738
package/docs/ROADMAP.md
CHANGED
|
@@ -1,192 +1,111 @@
|
|
|
1
1
|
# Roadmap
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
Canonical terms: [VOCABULARY.md](VOCABULARY.md). Pillars:
|
|
7
|
-
[VISION.md](VISION.md). Module layout:
|
|
8
|
-
[ARCHITECTURE.md](ARCHITECTURE.md). Shipped history:
|
|
9
|
-
[CHANGELOG.md](../CHANGELOG.md).
|
|
10
|
-
|
|
11
|
-
---
|
|
3
|
+
If a feature is not here, it is not planned. Shipped work is in
|
|
4
|
+
[CHANGELOG.md](../CHANGELOG.md). Pillars are in [VISION.md](VISION.md).
|
|
12
5
|
|
|
13
6
|
## Promotion criteria
|
|
14
7
|
|
|
15
|
-
A roadmap item
|
|
8
|
+
A roadmap item is built when all three hold:
|
|
16
9
|
|
|
17
|
-
1. **Proven friction.** A real user
|
|
18
|
-
|
|
19
|
-
2. **No pillar refactor.**
|
|
20
|
-
|
|
21
|
-
3. **Bounded scope.**
|
|
22
|
-
subset that does.
|
|
10
|
+
1. **Proven friction.** A real user hit the gap in a real workflow at
|
|
11
|
+
least twice.
|
|
12
|
+
2. **No pillar refactor.** It fits without bending a
|
|
13
|
+
[VISION](VISION.md) pillar.
|
|
14
|
+
3. **Bounded scope.** It fits in <300 LOC, or a smaller subset does.
|
|
23
15
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
need promotion at all; just ship clean (typecheck + lint + tests +
|
|
28
|
-
build).
|
|
29
|
-
|
|
30
|
-
---
|
|
16
|
+
Data-loss footguns ship on the first occurrence. Polish (bug fixes,
|
|
17
|
+
ergonomics, error wording, docs) needs no promotion: ship it through the
|
|
18
|
+
green gate.
|
|
31
19
|
|
|
32
20
|
## Anti-feature pledges
|
|
33
21
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
- **
|
|
38
|
-
- **
|
|
39
|
-
|
|
40
|
-
- **
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
- **
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
- **Bundle pi.** It's a peer dep.
|
|
53
|
-
- **Plugin runtime, web UI, RPC, chat/docs integrations, memory
|
|
54
|
-
system, workflow engine.** Rejected as a class — these are
|
|
55
|
-
exactly the accumulations a prior internal multi-agent runtime
|
|
56
|
-
collected, and not inheriting them is the point.
|
|
57
|
-
|
|
58
|
-
---
|
|
22
|
+
mu does not add these unless one earns its way back under the criteria:
|
|
23
|
+
|
|
24
|
+
- **A config file.** Config is CLI flags and env vars.
|
|
25
|
+
- **A daemon, watcher, or background process** beyond tmux and SQLite.
|
|
26
|
+
- **Abstractions with no current consumer** (the cautionary tale: a
|
|
27
|
+
`RunContext` trait with no implementor).
|
|
28
|
+
- **Wrappers around wrappers** (`TextStream`/`TextState`/`StreamResult`).
|
|
29
|
+
- **Codegen, an embedded JS engine, macros, or decorators.** No workflow
|
|
30
|
+
DSL.
|
|
31
|
+
- **Templates or definitions for agent roles.** Spawn flags and the first
|
|
32
|
+
message are the definition.
|
|
33
|
+
- **Render layers beyond `cli-table3` + `picocolors`**, except `ink` in
|
|
34
|
+
`src/cli/tui/`. If `ink` stops paying off, replace it. Never run two
|
|
35
|
+
TUI stacks.
|
|
36
|
+
- **Bundling pi.** It is a peer dependency.
|
|
37
|
+
- **A plugin runtime, web UI, RPC, chat or docs integrations, a memory
|
|
38
|
+
system, or a workflow engine.** A prior internal runtime collected all
|
|
39
|
+
of these. Not inheriting them is the point.
|
|
59
40
|
|
|
60
41
|
## Rejected sync substrates
|
|
61
42
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
was considered and rejected for the reason given.
|
|
43
|
+
mu syncs through the SQLite ops log plus append-only JSONL segments.
|
|
44
|
+
These alternatives were rejected:
|
|
65
45
|
|
|
66
46
|
| Substrate | Why not |
|
|
67
47
|
| --------- | ------- |
|
|
68
|
-
| **Litestream** | Daemon
|
|
69
|
-
| **LiteFS** | FUSE
|
|
70
|
-
| **rqlite / dqlite / Marmot** |
|
|
71
|
-
| **cr-sqlite** | Merges rows by primary key
|
|
72
|
-
| **RocksDB / LMDB for the op log** | No triggers, so
|
|
73
|
-
| **SQLite file per peer
|
|
74
|
-
| **`MU_SYNC_PEERS`
|
|
75
|
-
| **`mu sync --push/--pull <host>` <!-- doc-cli-drift:skip -->** |
|
|
76
|
-
|
|
77
|
-
The chosen design's net dependency change is **zero**: still just
|
|
78
|
-
`better-sqlite3`.
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
## Possible — small additions with an obvious shape
|
|
83
|
-
|
|
84
|
-
These have a clear design but haven't yet hit promotion criterion
|
|
85
|
-
1 (friction in ≥2 real workflows). They earn implementation when
|
|
86
|
-
real use surfaces them.
|
|
87
|
-
|
|
88
|
-
### A third mux backend (zellij, wezterm, kitty)
|
|
48
|
+
| **Litestream** | Daemon, single writer, one-way to object storage, and `restore` overwrites the whole file. It does disaster recovery, not laptop↔devserver merges. |
|
|
49
|
+
| **LiteFS** | FUSE, which on macOS means a macFUSE kernel extension. |
|
|
50
|
+
| **rqlite / dqlite / Marmot** | A consensus cluster and daemons to sync two machines that are rarely both awake. |
|
|
51
|
+
| **cr-sqlite** | Merges rows by primary key. mu's `INTEGER PRIMARY KEY AUTOINCREMENT` ids collide across machines and merge silently. Also WIP upstream, no DDL sync, and a native build matrix. |
|
|
52
|
+
| **RocksDB / LMDB for the op log** | No triggers, so a forgotten capture silently corrupts undo and sync. Single-process access forces a daemon. Loses SQL views, JOINs, and `mu sql`. |
|
|
53
|
+
| **SQLite file per peer** | A torn transfer makes the whole file unreadable instead of one JSONL line. `-wal`/`-shm` sidecars in a synced folder corrupt DBs. Page churn defeats delta transfer. |
|
|
54
|
+
| **`MU_SYNC_PEERS` list** | A config file that must match on every machine. Peers come from segment filenames instead. |
|
|
55
|
+
| **`mu sync --push/--pull <host>` <!-- doc-cli-drift:skip -->** | mu's first ssh egress, with ssh config, auth, and error mapping. mu prints an rsync line instead. |
|
|
89
56
|
|
|
90
|
-
|
|
91
|
-
is what justifies `MuxBackend` existing at all — the interface was
|
|
92
|
-
extracted to serve a concrete second case, not in anticipation of an
|
|
93
|
-
nth. A third backend needs its own friction evidence under the
|
|
94
|
-
[promotion criteria](#promotion-criteria) like anything else. "The
|
|
95
|
-
abstraction already exists" is not evidence.
|
|
57
|
+
The chosen design adds no dependency beyond `better-sqlite3`.
|
|
96
58
|
|
|
97
|
-
|
|
59
|
+
## Possible: small additions with an obvious shape
|
|
98
60
|
|
|
99
|
-
|
|
100
|
-
(via better-sqlite3) or `fs.watch` on the WAL would drop latency
|
|
101
|
-
at the cost of more machinery. Promote when someone hits the
|
|
102
|
-
cliff.
|
|
61
|
+
These have a design but no proven friction yet.
|
|
103
62
|
|
|
104
|
-
|
|
63
|
+
- **A third mux backend** (zellij, wezterm, kitty). tmux and herdr are
|
|
64
|
+
the two implementations that justify `MuxBackend`. A third needs its
|
|
65
|
+
own friction evidence. The existing interface is not evidence.
|
|
66
|
+
- **Subscription-based wakeups.** `mu log --tail` polls once a second.
|
|
67
|
+
SQLite update hooks or `fs.watch` on the WAL would cut latency for
|
|
68
|
+
more machinery. Build it when someone hits the limit.
|
|
105
69
|
|
|
106
70
|
## Open questions
|
|
107
71
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
##
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
**
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
the extension has logic that doesn't exist in the CLI.
|
|
149
|
-
3. **The skill teaches the CLI.** Pi sessions without the
|
|
150
|
-
extension still get a working mu by following
|
|
151
|
-
[skills/mu/SKILL.md](../skills/mu/SKILL.md).
|
|
152
|
-
|
|
153
|
-
If those three rules hold, mu stays driveable from a shell forever
|
|
154
|
-
and the extension stays thin.
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## Explicitly rejected (one-liners)
|
|
159
|
-
|
|
160
|
-
Listed so we don't rediscover them.
|
|
161
|
-
|
|
162
|
-
- **JS / Lisp DSL** (`mu run` / `mu eval` / `mu repl`) <!-- doc-cli-drift:skip --> — bash +
|
|
163
|
-
jq + `--json` covers the gap. A workflow DSL is a maintenance
|
|
164
|
-
liability.
|
|
165
|
-
- **`defineOperation()` registry framework** — no consumer left
|
|
166
|
-
after the DSL was rejected.
|
|
167
|
-
- **Markdown agent-definition discovery** — spawn flags + first
|
|
168
|
-
message already are the definition.
|
|
169
|
-
- **mu as a pi extension only (no CLI)** — children couldn't drive
|
|
170
|
-
mu; humans couldn't debug from a shell.
|
|
171
|
-
- **mu as a library only (no CLI)** — multiple processes would
|
|
172
|
-
fight over the DB.
|
|
173
|
-
- **Two binaries (`mu-agents` + `mu-tasks`)** — agent ↔ task
|
|
174
|
-
integration needs one transactional surface.
|
|
175
|
-
- **`TaskSurface` adapter abstraction** — the built-in graph IS
|
|
176
|
-
the killer feature.
|
|
177
|
-
- **Live cross-machine state sync via a daemon or remote backend** —
|
|
178
|
-
local-first SQLite. The ops-log sync is ambient but daemon-free
|
|
179
|
-
(flush/ingest ride on ordinary mu invocations) and transport-free
|
|
180
|
-
(mu reads and writes files; the user moves them). Rejected
|
|
181
|
-
storage/replication substrates are in
|
|
182
|
-
[§ Rejected sync substrates](#rejected-sync-substrates).
|
|
183
|
-
- **Network-opening remote verbs (`mu remote check`, `mu sync --push/--pull`)** <!-- doc-cli-drift:skip --> — mu manages panes and a task graph on one machine; every network hop is an operator-owned command, either passed through `agent spawn --command` for the mux to run or printed as a copy-pasteable next step. Keeping mu's own process ssh-free avoids an ssh config/auth/host/error model. Spawn does not violate this boundary: the mux, not mu, runs the operator's string.
|
|
184
|
-
- **HTTP API on top of SQLite** — write your own RPC if you need
|
|
185
|
-
one.
|
|
186
|
-
- **A "hosted" mu** — your machine is the deployment.
|
|
187
|
-
- **Anthropomorphic agent names (`alice`, `bob`)** — use
|
|
188
|
-
role-based names (`worker-1`, `reviewer-1`).
|
|
189
|
-
- **Pane scraping as an agent-state fallback** — absence of a state source is `unknown`, not a guessed state.
|
|
190
|
-
- **Storing runtime agent state in `mu.db`** — the copy goes stale; murmur or herdr owns the current reading.
|
|
191
|
-
- **Reading murmur's `state.db`** — use murmur's stable public contract, not its private schema.
|
|
192
|
-
- **murmur as a hard dependency** — installs that only use the task graph do not need murmur or its native dependencies.
|
|
72
|
+
- **Capability tags on operations.** Today the only authorization is
|
|
73
|
+
"the agent ran the verb". Enforce capabilities when an agent does real
|
|
74
|
+
damage.
|
|
75
|
+
- **Per-workstream config.** Resisted by the pledges, but "this
|
|
76
|
+
workstream uses a different pi binary" is a gap env vars solve poorly.
|
|
77
|
+
Revisit when a second user hits it.
|
|
78
|
+
|
|
79
|
+
## Next schema change
|
|
80
|
+
|
|
81
|
+
Drop the deprecated `agents.status` column in schema v12. In v11 it
|
|
82
|
+
stays for compatibility and always holds `spawning`.
|
|
83
|
+
|
|
84
|
+
## Explicitly rejected
|
|
85
|
+
|
|
86
|
+
- **A JS or Lisp DSL** (`mu run`, `mu eval`, `mu repl`) <!-- doc-cli-drift:skip -->. bash, `jq`,
|
|
87
|
+
and `--json` cover it.
|
|
88
|
+
- **A `defineOperation()` registry.** No consumer after the DSL went.
|
|
89
|
+
- **Markdown agent-definition discovery.** Spawn flags and the first
|
|
90
|
+
message are the definition.
|
|
91
|
+
- **mu as only a pi extension or only a library.** Children and humans
|
|
92
|
+
could not drive it from a shell, and processes would fight over the DB.
|
|
93
|
+
- **Two binaries (`mu-agents` + `mu-tasks`).** Agents and tasks need one
|
|
94
|
+
transactional surface.
|
|
95
|
+
- **A `TaskSurface` adapter.** The built-in graph is the point.
|
|
96
|
+
- **Live sync through a daemon or remote backend.** Sync rides on
|
|
97
|
+
ordinary mu calls and mu only reads and writes files. See
|
|
98
|
+
[Rejected sync substrates](#rejected-sync-substrates).
|
|
99
|
+
- **Network-opening verbs (`mu remote check`, `mu sync --push/--pull`)** <!-- doc-cli-drift:skip -->.
|
|
100
|
+
Every network hop is an operator command. Spawn passes it through
|
|
101
|
+
`--command` for the mux to run, or mu prints it as a next step. mu's
|
|
102
|
+
own process stays ssh-free.
|
|
103
|
+
- **An HTTP API over SQLite** or **a hosted mu.**
|
|
104
|
+
- **Personal agent names (`alice`, `bob`).** Use role names
|
|
105
|
+
(`worker-1`, `reviewer-1`).
|
|
106
|
+
- **Pane scraping as a state fallback.** No state source means `unknown`.
|
|
107
|
+
- **Runtime agent state in `mu.db`.** The copy goes stale. The control
|
|
108
|
+
socket, herdr, or murmur owns the current reading.
|
|
109
|
+
- **Reading murmur's `state.db`.** Use its public contract.
|
|
110
|
+
- **murmur as a hard dependency.** pi agents and the task graph do not
|
|
111
|
+
need it.
|