@gigaflow/gmux 0.15.0 → 0.16.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 +110 -80
- package/README.md +81 -57
- package/dist/adapters/claude-code.js +5 -2
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/codex.js +5 -2
- package/dist/adapters/codex.js.map +1 -1
- package/dist/cli/border-client.d.ts +1 -1
- package/dist/cli/border-client.js +1 -1
- package/dist/cli/commands/cockpit.d.ts +16 -6
- package/dist/cli/commands/cockpit.js +288 -20
- package/dist/cli/commands/cockpit.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts +2 -19
- package/dist/cli/commands/daemon.js +39 -88
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/doctor.js +24 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/organize.d.ts +18 -0
- package/dist/cli/commands/organize.js +94 -0
- package/dist/cli/commands/organize.js.map +1 -0
- package/dist/cli/commands/setup.js +13 -1
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/tmux.d.ts +56 -0
- package/dist/cli/commands/tmux.js +158 -28
- package/dist/cli/commands/tmux.js.map +1 -1
- package/dist/cli/gmux-render.d.ts +12 -1
- package/dist/cli/gmux-render.js +18 -11
- package/dist/cli/gmux-render.js.map +1 -1
- package/dist/cli/main.js +2 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/organize-confirm.d.ts +45 -0
- package/dist/cli/organize-confirm.js +57 -0
- package/dist/cli/organize-confirm.js.map +1 -0
- package/dist/cli/overlay-ask.d.ts +3 -1
- package/dist/cli/overlay-ask.js +5 -3
- package/dist/cli/overlay-ask.js.map +1 -1
- package/dist/cli/tmux-label.d.ts +11 -4
- package/dist/cli/tmux-label.js +17 -6
- package/dist/cli/tmux-label.js.map +1 -1
- package/dist/cli/work-report.d.ts +18 -0
- package/dist/cli/work-report.js +50 -0
- package/dist/cli/work-report.js.map +1 -0
- package/dist/core/bytes.d.ts +6 -0
- package/dist/core/bytes.js +13 -0
- package/dist/core/bytes.js.map +1 -0
- package/dist/core/organize-types.d.ts +95 -0
- package/dist/core/organize-types.js +33 -0
- package/dist/core/organize-types.js.map +1 -0
- package/dist/core/paths.d.ts +13 -0
- package/dist/core/paths.js +20 -1
- package/dist/core/paths.js.map +1 -1
- package/dist/services/ask-router.d.ts +44 -0
- package/dist/services/ask-router.js +63 -0
- package/dist/services/ask-router.js.map +1 -0
- package/dist/services/daemon-lock.d.ts +31 -0
- package/dist/services/daemon-lock.js +77 -0
- package/dist/services/daemon-lock.js.map +1 -0
- package/dist/services/daemon.js +35 -6
- package/dist/services/daemon.js.map +1 -1
- package/dist/services/guardian.js +4 -4
- package/dist/services/guardian.js.map +1 -1
- package/dist/services/organize.d.ts +91 -0
- package/dist/services/organize.js +462 -0
- package/dist/services/organize.js.map +1 -0
- package/dist/services/tmux-gateway.d.ts +12 -0
- package/dist/services/tmux-gateway.js +7 -1
- package/dist/services/tmux-gateway.js.map +1 -1
- package/dist/services/tmux.d.ts +17 -1
- package/dist/services/tmux.js +34 -1
- package/dist/services/tmux.js.map +1 -1
- package/dist/services/work-view.d.ts +67 -0
- package/dist/services/work-view.js +155 -0
- package/dist/services/work-view.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,36 @@ Notable changes, newest first. Versions follow [semver](https://semver.org): whi
|
|
|
4
4
|
0.x, a **minor** bump means behavior changed in a way you should read about before
|
|
5
5
|
upgrading, and a **patch** is a fix that asks nothing of you.
|
|
6
6
|
|
|
7
|
+
## 0.16.0
|
|
8
|
+
|
|
9
|
+
### Cockpit prompt, work report, and an onboarding path that actually lands
|
|
10
|
+
|
|
11
|
+
The ctrl-g grid now takes plain English at the bottom. Type an intent: a
|
|
12
|
+
question is broadcast to every visible session and answered inline; a layout
|
|
13
|
+
request ("group these by project") is planned, previewed, and applied only on
|
|
14
|
+
confirm. `ctrl-v` writes a per-session HTML work report and shows a `file://`
|
|
15
|
+
link. `gmux organize` is the same planner from the shell (dry-run default,
|
|
16
|
+
`--apply` to run it).
|
|
17
|
+
|
|
18
|
+
The documented first-run path now works on Oh My Tmux. `gmux tmux install` (and
|
|
19
|
+
the setup wizard's bindings prompt) write to `~/.tmux.conf.local` when the live
|
|
20
|
+
conf sources it, never through Oh My Tmux's git-managed `~/.tmux.conf` symlink.
|
|
21
|
+
A leftover `# >>> gigamanage >>>` block is stripped so ctrl-g opens the cockpit
|
|
22
|
+
instead of `gm overlay`. Vanilla tmux and a dotfiles-repo symlink of
|
|
23
|
+
`~/.tmux.conf` still write through to that file. `gmux doctor` reports both.
|
|
24
|
+
|
|
25
|
+
**Upgrading from gigamanage / 0.15.0:**
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm uninstall -g gigamanage # if the old `gm` command is still around
|
|
29
|
+
npm install -g @gigaflow/gmux
|
|
30
|
+
gmux setup # provider, guardian, tmux bindings
|
|
31
|
+
tmux source-file ~/.tmux.conf
|
|
32
|
+
gmux daemon
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The package publishes as `@gigaflow/gmux` (not `@gigaflowai/gmux`).
|
|
36
|
+
|
|
7
37
|
## 0.15.0
|
|
8
38
|
|
|
9
39
|
### Always-on workspace awareness — daemon, cockpit, memory guardian
|
|
@@ -73,8 +103,8 @@ goes from here.
|
|
|
73
103
|
### Summaries follow the pane, even after you move panes around
|
|
74
104
|
|
|
75
105
|
When several panes share a directory and their agents were started fresh
|
|
76
|
-
(`claude --model=…`, no `--resume <id>`),
|
|
77
|
-
apart — no session id on the command line, no `
|
|
106
|
+
(`claude --model=…`, no `--resume <id>`), gmux had nothing to tell the panes
|
|
107
|
+
apart — no session id on the command line, no `gmux run` link — so it handed out the
|
|
78
108
|
newest sessions in the directory in pane-list order. Move a pane, or let a session
|
|
79
109
|
update, and the summaries reshuffled onto the wrong cards.
|
|
80
110
|
|
|
@@ -82,7 +112,7 @@ The overlay now pairs those panes to sessions by **process start order**: within
|
|
|
82
112
|
directory, the oldest agent process takes the oldest-started session, and so on.
|
|
83
113
|
A process's start time is stable and belongs to the pane's real process, so the
|
|
84
114
|
mapping holds when you move, swap, or join panes. A directory with a single agent
|
|
85
|
-
is unchanged. Exact matches — a `--resume <id>` on the command line, or a `
|
|
115
|
+
is unchanged. Exact matches — a `--resume <id>` on the command line, or a `gmux run`
|
|
86
116
|
link — still win outright.
|
|
87
117
|
|
|
88
118
|
## 0.13.5
|
|
@@ -98,7 +128,7 @@ the overlay stayed up. Esc still closes; the ask-box hint now reads `^G/Esc clos
|
|
|
98
128
|
|
|
99
129
|
### Codex summaries work again after an upgrade
|
|
100
130
|
|
|
101
|
-
A config written by an older `
|
|
131
|
+
A config written by an older `gmux` froze the codex command as `codex exec`. When
|
|
102
132
|
the catalog later gained `--skip-git-repo-check` (so codex can summarize outside a
|
|
103
133
|
trusted git checkout), that flag never reached an existing config: summary
|
|
104
134
|
resolution replayed the stored command verbatim, so every codex summary failed
|
|
@@ -106,8 +136,8 @@ with *"Not inside a trusted directory and --skip-git-repo-check was not
|
|
|
106
136
|
specified"* and the `ctrl-g` overlay stayed stuck on "no summary yet".
|
|
107
137
|
|
|
108
138
|
A **known** provider now re-derives its argv from the catalog rather than the
|
|
109
|
-
command frozen at setup time — the same self-healing `
|
|
110
|
-
`custom` provider is still run exactly as you wrote it. No re-run of `
|
|
139
|
+
command frozen at setup time — the same self-healing `gmux ask` already had. A
|
|
140
|
+
`custom` provider is still run exactly as you wrote it. No re-run of `gmux setup`
|
|
111
141
|
needed; upgrade and codex summaries resume.
|
|
112
142
|
|
|
113
143
|
## 0.13.3
|
|
@@ -128,9 +158,9 @@ one.
|
|
|
128
158
|
|
|
129
159
|
- **Force refresh:** press **ctrl-r** in the `ctrl-g` overlay to regenerate the
|
|
130
160
|
visible panes' summaries now, ignoring the divergence gate. From the shell:
|
|
131
|
-
`
|
|
132
|
-
`
|
|
133
|
-
- **Cross-window fix:** the overlay (and `
|
|
161
|
+
`gmux summarize <id> --force`, `gmux summarize --recent 20 --force`, or
|
|
162
|
+
`gmux summarize --all --force`.
|
|
163
|
+
- **Cross-window fix:** the overlay (and `gmux ask --window`) used to resolve only
|
|
134
164
|
the current window's panes, so a fresh agent with no session id on its command
|
|
135
165
|
line could grab the session another window's pane already owns — making two
|
|
136
166
|
panes show the same summary. They now resolve every pane in the server and keep
|
|
@@ -171,10 +201,10 @@ separate chat" with an integrated box on the overlay itself.
|
|
|
171
201
|
In the `ctrl-g` overlay, press **`a`** to open a chat that fans out over the agent
|
|
172
202
|
sessions in the current window. Ask high-level orienting questions — "what is each
|
|
173
203
|
one doing?", "what is most urgent?", "which are waiting on me?" — and keep asking;
|
|
174
|
-
it is `
|
|
204
|
+
it is `gmux ask`, scoped to the panes in front of you rather than your whole recent
|
|
175
205
|
list. Any other key still just closes the overlay.
|
|
176
206
|
|
|
177
|
-
Also available directly: `
|
|
207
|
+
Also available directly: `gmux ask --window <window-id>`.
|
|
178
208
|
|
|
179
209
|
## 0.10.2
|
|
180
210
|
|
|
@@ -200,7 +230,7 @@ halved.
|
|
|
200
230
|
A pane running a *fresh* session (no session id on its command line) fell back to
|
|
201
231
|
"newest session in this directory" — which is whatever another pane is actively
|
|
202
232
|
working on, so its summary got copied onto the fresh one, especially across
|
|
203
|
-
windows. Panes are now resolved together: an exact match (a `
|
|
233
|
+
windows. Panes are now resolved together: an exact match (a `gmux run` link or a
|
|
204
234
|
session id read from the agent's argv) claims its session, and no heuristic pane
|
|
205
235
|
may pick a session another pane already owns.
|
|
206
236
|
|
|
@@ -219,7 +249,7 @@ session:
|
|
|
219
249
|
- **summary** — new: a paragraph or two that actually reorients you, tracing how
|
|
220
250
|
the work evolved and where it stands.
|
|
221
251
|
|
|
222
|
-
`ctrl-g` (and `
|
|
252
|
+
`ctrl-g` (and `gmux show`) render all three — headline, overview, then the
|
|
223
253
|
drilldown — above the recent/open/next status. The label stays the one-liner;
|
|
224
254
|
the drilldown is one keypress away.
|
|
225
255
|
|
|
@@ -232,24 +262,24 @@ the drilldown is one keypress away.
|
|
|
232
262
|
|
|
233
263
|
## 0.9.0
|
|
234
264
|
|
|
235
|
-
|
|
265
|
+
gmux becomes what it was always meant to be: **a background agent that
|
|
236
266
|
keeps you up to date on your agents' latest work.**
|
|
237
267
|
|
|
238
|
-
**Upgrading:** re-run `
|
|
268
|
+
**Upgrading:** re-run `gmux tmux install` (or, on Oh My Tmux, keep the `Alt-g` line
|
|
239
269
|
in `~/.tmux.conf.local`) and reload. `Alt-g` now toggles a live service rather
|
|
240
270
|
than painting labels once. Nothing else changes.
|
|
241
271
|
|
|
242
272
|
### `Alt-g` runs a live label agent
|
|
243
273
|
|
|
244
|
-
`Alt-g` starts a single, lightweight background service (`
|
|
274
|
+
`Alt-g` starts a single, lightweight background service (`gmux watch`) that every
|
|
245
275
|
few seconds resolves every agent pane across all your windows and keeps its
|
|
246
276
|
border label current — the session's headline, where the pane is, with the
|
|
247
277
|
content still visible. A pane whose summary is being regenerated shows
|
|
248
|
-
`
|
|
278
|
+
`gmux summaries loading…` until it lands. `Alt-g` again stops it. `ctrl-g` is still
|
|
249
279
|
the full card when you want the detail; the two share one continuously-maintained
|
|
250
280
|
cache, so the popup opens already current.
|
|
251
281
|
|
|
252
|
-
You can also drive it directly: `
|
|
282
|
+
You can also drive it directly: `gmux watch` starts it, `gmux watch --stop` stops it.
|
|
253
283
|
|
|
254
284
|
### Summaries refresh when work *diverges*, not on every keystroke
|
|
255
285
|
|
|
@@ -259,8 +289,8 @@ characters, fixed size however long the session grows), and a session is
|
|
|
259
289
|
re-summarised only when that fingerprint has drifted past a threshold — with a
|
|
260
290
|
safety net: a new tool failure, a flip to ended-mid-task, or a change in the
|
|
261
291
|
files touched always refreshes, so a small-but-important change is never slept
|
|
262
|
-
through. Tune the threshold with `
|
|
263
|
-
with `
|
|
292
|
+
through. Tune the threshold with `GMUX_REFRESH_DISTANCE`; the loop interval
|
|
293
|
+
with `GMUX_WATCH_INTERVAL_MS`.
|
|
264
294
|
|
|
265
295
|
## 0.8.2
|
|
266
296
|
|
|
@@ -283,7 +313,7 @@ rather than wrapped — press `ctrl-g` for the full card when you need it.
|
|
|
283
313
|
|
|
284
314
|
### Resolving a pane skips a needless `lsof`
|
|
285
315
|
|
|
286
|
-
`
|
|
316
|
+
`gmux tmux label` and the `ctrl-g` overlay read each pane's agent process to find
|
|
287
317
|
its session. When the agent's command line already carries the session id (a
|
|
288
318
|
resumed session — the common case), the id is exact and the process's working
|
|
289
319
|
directory is never needed — but 0.8.0 looked it up anyway (`lsof` on macOS,
|
|
@@ -292,7 +322,7 @@ a window of resumed agents no longer pays for a directory lookup per pane.
|
|
|
292
322
|
|
|
293
323
|
## 0.8.0
|
|
294
324
|
|
|
295
|
-
**Upgrading:** re-run `
|
|
325
|
+
**Upgrading:** re-run `gmux tmux install` to pick up the new `Alt-g` binding, and
|
|
296
326
|
reload with `tmux source-file ~/.tmux.conf`. Everything is additive; nothing you
|
|
297
327
|
rely on changes.
|
|
298
328
|
|
|
@@ -300,11 +330,11 @@ rely on changes.
|
|
|
300
330
|
|
|
301
331
|
The overlay used to map a pane to a session by matching the pane's working
|
|
302
332
|
directory — but that's the *shell's* directory, usually `~`, not the agent's, so
|
|
303
|
-
panes resolved to the wrong session or to nothing.
|
|
333
|
+
panes resolved to the wrong session or to nothing. gmux now reads the pane's
|
|
304
334
|
own process: the agent's command line carries the session id verbatim (`codex
|
|
305
335
|
resume <id>`, `claude --resume <id>`), and that id *is* the session. Where there's
|
|
306
336
|
no id on the line (a fresh session), it uses the agent process's real working
|
|
307
|
-
directory instead of the shell's. No `
|
|
337
|
+
directory instead of the shell's. No `gmux run`, no setup — it just reads what's
|
|
308
338
|
already there.
|
|
309
339
|
|
|
310
340
|
### A label on every pane's border
|
|
@@ -313,7 +343,7 @@ already there.
|
|
|
313
343
|
headline, right where the pane is — while the pane content stays fully visible. It
|
|
314
344
|
answers "what is each of these agents doing?" without taking over the screen; the
|
|
315
345
|
`ctrl-g` full-card popup is still there when you want the detail. The label is
|
|
316
|
-
stored in a pane-local option
|
|
346
|
+
stored in a pane-local option gmux owns, so a running agent's own title
|
|
317
347
|
updates can't clobber it.
|
|
318
348
|
|
|
319
349
|
### The peek does less work
|
|
@@ -330,13 +360,13 @@ made it usable in practice.
|
|
|
330
360
|
|
|
331
361
|
### The `ctrl-g` binding now actually opens the overlay
|
|
332
362
|
|
|
333
|
-
`
|
|
363
|
+
`gmux tmux install` wrote `gmux overlay #{window_id}`, but tmux does not expand that
|
|
334
364
|
format inside `display-popup -E` — so the shell saw the `#` and treated the rest
|
|
335
|
-
of the line as a comment, and `
|
|
365
|
+
of the line as a comment, and `gmux overlay` ran with no window argument. The
|
|
336
366
|
result was a popup that flashed and vanished. The binding now resolves the window
|
|
337
|
-
id in-shell with `
|
|
367
|
+
id in-shell with `gmux overlay "$(tmux display -p "#{window_id}")"`, which works
|
|
338
368
|
whether or not tmux expands the format. If you installed 0.7.0's binding, re-run
|
|
339
|
-
`
|
|
369
|
+
`gmux tmux install` (or, on Oh My Tmux, replace the two lines in
|
|
340
370
|
`~/.tmux.conf.local`) and reload with `tmux source-file ~/.tmux.conf`.
|
|
341
371
|
|
|
342
372
|
### Panes are framed, so cards read as separate
|
|
@@ -361,50 +391,50 @@ is what tells them apart.
|
|
|
361
391
|
## 0.7.0
|
|
362
392
|
|
|
363
393
|
**Upgrading:** nothing changes unless you opt in. Everything below is additive and
|
|
364
|
-
gated behind tmux; if you don't run `
|
|
394
|
+
gated behind tmux; if you don't run `gmux tmux install`, `gmux` behaves exactly as it
|
|
365
395
|
did in 0.6.1. The overlay needs **tmux 3.2 or newer** (for `display-popup`), which
|
|
366
|
-
`
|
|
396
|
+
`gmux doctor` now checks for.
|
|
367
397
|
|
|
368
398
|
### Peek at every agent at once, from tmux
|
|
369
399
|
|
|
370
|
-
Drive your agents in tmux and `
|
|
371
|
-
these panes?" without you switching into any of them. `
|
|
400
|
+
Drive your agents in tmux and `gmux` can now answer "what's happening in each of
|
|
401
|
+
these panes?" without you switching into any of them. `gmux tmux install` writes two
|
|
372
402
|
key bindings to `~/.tmux.conf`:
|
|
373
403
|
|
|
374
404
|
- **ctrl-g** peeks — every pane in the current window is overlaid *in place* with
|
|
375
405
|
its summary card (what landed, what's still open, the next step, the `⚠`
|
|
376
406
|
mid-task flag). Cards paint instantly from the cache and refresh in the
|
|
377
407
|
background; any key dismisses the overlay and leaves your panes untouched.
|
|
378
|
-
- **ctrl-shift-g** opens the `
|
|
408
|
+
- **ctrl-shift-g** opens the `gmux` picker in a popup, and Enter resumes your choice
|
|
379
409
|
into a new tmux window — history and live panes, one keystroke apart.
|
|
380
410
|
|
|
381
411
|
The overlay maps a pane to its session by working directory and recency. For an
|
|
382
412
|
exact link — including resumed sessions that share a directory — launch through
|
|
383
|
-
`
|
|
413
|
+
`gmux run claude` / `gmux run codex resume`: it attaches your terminal as usual and
|
|
384
414
|
records which pane the session runs in.
|
|
385
415
|
|
|
386
|
-
`
|
|
416
|
+
`gmux doctor` reports whether the overlay is available and, if not, why. tmux joins
|
|
387
417
|
ripgrep and fzf as an optional companion; nothing here is required.
|
|
388
418
|
|
|
389
419
|
## 0.6.1
|
|
390
420
|
|
|
391
421
|
### The chat/summary split is coloured now
|
|
392
422
|
|
|
393
|
-
The picker's preview pane rendered monochrome — its stdout is a pipe, so
|
|
423
|
+
The picker's preview pane rendered monochrome — its stdout is a pipe, so gmux's
|
|
394
424
|
colour gated itself off, and even the `── ask ──` divider between the session
|
|
395
425
|
card and the chat came out plain. fzf paints the preview with `--ansi`, though,
|
|
396
|
-
so the seam can carry colour: the divider is now **cyan** (
|
|
397
|
-
the `you` / `
|
|
426
|
+
so the seam can carry colour: the divider is now **cyan** (gmux's own accent) and
|
|
427
|
+
the `you` / `gmux` speaker labels light up, while the card stays monochrome.
|
|
398
428
|
|
|
399
429
|
It's an accent, not the message — the divider's glyphs and the speakers' layout
|
|
400
430
|
still carry the structure, so `NO_COLOR` and `TERM=dumb` lose only the colour.
|
|
401
|
-
`
|
|
431
|
+
`gmux ls` and `gmux show` are unchanged and still pipe clean.
|
|
402
432
|
|
|
403
433
|
## 0.6.0
|
|
404
434
|
|
|
405
435
|
**Upgrading:** `ctrl-o` in the picker no longer suspends the list. It opens the
|
|
406
436
|
chat in the preview pane instead, so the session you were reading stays on
|
|
407
|
-
screen. Nothing else changes for you: bare `
|
|
437
|
+
screen. Nothing else changes for you: bare `gmux ask`, the `--json` form, and the
|
|
408
438
|
`fzf < 0.46` and no-fzf fallbacks all behave exactly as before.
|
|
409
439
|
|
|
410
440
|
### ctrl-o asks in the pane, not over the list
|
|
@@ -440,40 +470,40 @@ REPL, and the no-fzf numbered list keeps its `a` key.
|
|
|
440
470
|
|
|
441
471
|
## 0.5.0
|
|
442
472
|
|
|
443
|
-
**Upgrading:** the first time you run `
|
|
473
|
+
**Upgrading:** the first time you run `gmux` in a terminal, it will ask you to
|
|
444
474
|
choose a harness before doing any model work. Nothing prompts when the output
|
|
445
|
-
isn't a terminal, and `
|
|
475
|
+
isn't a terminal, and `GMUX_SUMMARY_CMD` still overrides everything — so
|
|
446
476
|
scripts, CI and agents are unaffected.
|
|
447
477
|
|
|
448
|
-
###
|
|
478
|
+
### gmux asks who to call, once, instead of assuming
|
|
449
479
|
|
|
450
|
-
The first time you run `
|
|
480
|
+
The first time you run `gmux` in a terminal it asks which harness should do its
|
|
451
481
|
model work — Claude Code, Codex, any command that reads a prompt on stdin, or
|
|
452
482
|
nothing at all. Before, it assumed `claude -p` and started spending tokens in the
|
|
453
483
|
background without ever mentioning it.
|
|
454
484
|
|
|
455
|
-
Your answer lives in `~/.config/
|
|
456
|
-
it. Choosing **nothing** is a real answer: `
|
|
485
|
+
Your answer lives in `~/.config/gmux/config.json`, and `gmux setup` changes
|
|
486
|
+
it. Choosing **nothing** is a real answer: `gmux ls` and `gmux show` still work on
|
|
457
487
|
hard facts alone, and nothing calls a model.
|
|
458
488
|
|
|
459
489
|
Nothing prompts unless there's a human at the other end. No TTY, `--json`, or an
|
|
460
|
-
internal command means
|
|
461
|
-
on. `
|
|
490
|
+
internal command means gmux behaves exactly as it did before: autodetect and carry
|
|
491
|
+
on. `GMUX_SUMMARY_CMD` still overrides everything, so existing scripts and
|
|
462
492
|
CI need no changes.
|
|
463
493
|
|
|
464
|
-
###
|
|
494
|
+
### gmux ask
|
|
465
495
|
|
|
466
|
-
`
|
|
496
|
+
`gmux ls` answers "what was I doing?" one row at a time. **`gmux ask`** answers the
|
|
467
497
|
question that spans them:
|
|
468
498
|
|
|
469
499
|
```bash
|
|
470
|
-
|
|
471
|
-
|
|
500
|
+
gmux ask "what's still broken?"
|
|
501
|
+
gmux ask "what did I already try for the retry?" --json
|
|
472
502
|
```
|
|
473
503
|
|
|
474
504
|
It starts from the summaries already on disk, so a question costs one model call
|
|
475
505
|
rather than a scan of your transcripts. When the summaries aren't enough it runs
|
|
476
|
-
`
|
|
506
|
+
`gmux grep` against the real thing and reads what you actually said.
|
|
477
507
|
|
|
478
508
|
**In the picker, `ctrl-o`** opens it on the session you're highlighting and drops
|
|
479
509
|
you back in the list, right where you were, when you're done. Without fzf, the
|
|
@@ -484,7 +514,7 @@ Not `shift+f`: fzf's query line eats plain letters, so `F` would just type an
|
|
|
484
514
|
|
|
485
515
|
### The picker explains its markers
|
|
486
516
|
|
|
487
|
-
`
|
|
517
|
+
`gmux ls` printed a key for `⚠`, `◐` and `○`. The picker — bare `gmux` — rendered the
|
|
488
518
|
same three markers and explained none of them, which put the explanation exactly
|
|
489
519
|
where you needed it least: `ls` is the command you run to read a list, and the
|
|
490
520
|
picker is the one you run to *choose*. `⚠` is the whole point of the tool, and in
|
|
@@ -494,7 +524,7 @@ Both picker paths now carry a key: a second header line under fzf, and a line
|
|
|
494
524
|
above the "install fzf" hint in the numbered fallback.
|
|
495
525
|
|
|
496
526
|
It is deliberately static — every marker, always, and never a count — while
|
|
497
|
-
`
|
|
527
|
+
`gmux ls` keeps its counted one. fzf sets its header once, at spawn; ctrl-r
|
|
498
528
|
replaces the list and leaves the header alone. Counts there would freeze at open
|
|
499
529
|
and be wrong after the first refresh, which is precisely when they change. A key
|
|
500
530
|
that is stale exactly when it matters is worse than no key at all.
|
|
@@ -512,26 +542,26 @@ that need one, without leaving the picker — so it's something you can navigate
|
|
|
512
542
|
while an agent works alongside you. Without fzf, the numbered list takes `r` for
|
|
513
543
|
the same thing.
|
|
514
544
|
|
|
515
|
-
Repeated presses are safe. The lock that already stopped five `
|
|
545
|
+
Repeated presses are safe. The lock that already stopped five `gmux ls` from
|
|
516
546
|
starting five summarizers stops this too: a press while a pass is running just
|
|
517
547
|
reloads. Sessions whose summary is already current are never rewritten, so ctrl-r
|
|
518
548
|
on a fresh list costs nothing.
|
|
519
549
|
|
|
520
|
-
### Bare `
|
|
550
|
+
### Bare `gmux` summarizes what it shows
|
|
521
551
|
|
|
522
|
-
Only `
|
|
552
|
+
Only `gmux ls` kicked off a background pass; the picker never did. It does now,
|
|
523
553
|
over the sessions it is about to offer, and rows being written are marked `◐`
|
|
524
|
-
there as well as in `
|
|
554
|
+
there as well as in `gmux ls`.
|
|
525
555
|
|
|
526
556
|
### Fixed: `--no-auto-summarize` never worked
|
|
527
557
|
|
|
528
|
-
`
|
|
558
|
+
`gmux --no-auto-summarize ls` spent tokens anyway. The flag is declared on the root
|
|
529
559
|
command, and commander does not copy root options into a subcommand's own
|
|
530
560
|
options — so the check read `undefined`, compared it against `false`, and
|
|
531
|
-
concluded you wanted summaries. Only `
|
|
561
|
+
concluded you wanted summaries. Only `GMUX_AUTO_SUMMARIZE=0` actually
|
|
532
562
|
turned them off.
|
|
533
563
|
|
|
534
|
-
The flag now works, on `
|
|
564
|
+
The flag now works, on `gmux ls` and in the picker, and it is carried across to the
|
|
535
565
|
process ctrl-r starts.
|
|
536
566
|
|
|
537
567
|
### Shorter headlines
|
|
@@ -543,19 +573,19 @@ are now one scannable clause, sized to the column they live in.
|
|
|
543
573
|
The summary cache key covers the prompt as well as the session, so this reaches
|
|
544
574
|
summaries already on disk: they regenerate in the background on first run rather
|
|
545
575
|
than keeping their old headlines forever. That costs a pass of model calls once.
|
|
546
|
-
`
|
|
576
|
+
`GMUX_AUTO_SUMMARIZE=0` still opts out of all of it.
|
|
547
577
|
|
|
548
578
|
## 0.3.0
|
|
549
579
|
|
|
550
580
|
### Summaries keep up with what you actually look at
|
|
551
581
|
|
|
552
|
-
The background pass used to cover a fixed **10** sessions while `
|
|
582
|
+
The background pass used to cover a fixed **10** sessions while `gmux ls` displayed
|
|
553
583
|
**20** — so the bottom half of the default view was permanently marked "no summary
|
|
554
584
|
yet", and the feature looked broken even though it was working exactly as built.
|
|
555
585
|
|
|
556
|
-
The window now follows the list: `
|
|
586
|
+
The window now follows the list: `gmux ls` keeps 20 summarized, `gmux ls -n 50` keeps
|
|
557
587
|
all fifty. Summaries are written **8 at a time** in parallel (tune with
|
|
558
|
-
`
|
|
588
|
+
`GMUX_SUMMARY_CONCURRENCY`), and a single pass writes at most 50, saying so
|
|
559
589
|
rather than truncating in silence.
|
|
560
590
|
|
|
561
591
|
### You can see it working
|
|
@@ -568,7 +598,7 @@ is true on the very run that starts the work.
|
|
|
568
598
|
|
|
569
599
|
The worker's stdio is discarded, so a broken provider used to mean summaries
|
|
570
600
|
simply never appeared, with nothing to look at. Failures now land in
|
|
571
|
-
`~/.cache/
|
|
601
|
+
`~/.cache/gmux/auto-summarize.log`, and `gmux doctor` surfaces the last one.
|
|
572
602
|
|
|
573
603
|
**Fixed:** the worker could silently write **zero** summaries. It resolved its
|
|
574
604
|
queue by loading "the N most recent sessions" and filtering — but with sidechains
|
|
@@ -585,14 +615,14 @@ installed) wraps as well.
|
|
|
585
615
|
|
|
586
616
|
## 0.2.0
|
|
587
617
|
|
|
588
|
-
**
|
|
618
|
+
**gmux now spends tokens on your behalf unless you tell it not to.** That is a
|
|
589
619
|
change of default behavior, which is why this is a minor bump rather than a patch —
|
|
590
620
|
everything in it already shipped as 0.1.3/0.1.4, but the version number was
|
|
591
621
|
under-selling it.
|
|
592
622
|
|
|
593
623
|
### Summaries write themselves
|
|
594
624
|
|
|
595
|
-
Any `
|
|
625
|
+
Any `gmux` command now checks the 10 most recent sessions and, if any lack a current
|
|
596
626
|
summary, writes them in a **detached background process**. The foreground command
|
|
597
627
|
never waits on a model: it prints, tells you on stderr what it started, and exits.
|
|
598
628
|
Summaries appear on your next run. Rows still waiting are marked `○`.
|
|
@@ -600,36 +630,36 @@ Summaries appear on your next run. Rows still waiting are marked `○`.
|
|
|
600
630
|
Three things this deliberately does not do:
|
|
601
631
|
|
|
602
632
|
- **Block.** A summary costs ~8s of model time. Ten of those inline would turn a
|
|
603
|
-
60ms `
|
|
604
|
-
- **Stampede.** A lock in `~/.cache/
|
|
633
|
+
60ms `gmux ls` into a minute of waiting.
|
|
634
|
+
- **Stampede.** A lock in `~/.cache/gmux` means five `gmux ls` in a row start
|
|
605
635
|
one summarizer, not five.
|
|
606
636
|
- **Loop.** The summarizer *is* `claude -p`, which writes a session of its own.
|
|
607
|
-
Automated runs and sidechains are excluded from the target set, so
|
|
637
|
+
Automated runs and sidechains are excluded from the target set, so gmux
|
|
608
638
|
cannot summarize its own summarizer forever.
|
|
609
639
|
|
|
610
640
|
**Turning it off**, because background model calls cost money:
|
|
611
641
|
|
|
612
642
|
```bash
|
|
613
|
-
|
|
614
|
-
export
|
|
643
|
+
gmux --no-auto-summarize ls # once
|
|
644
|
+
export GMUX_AUTO_SUMMARIZE=0 # for good
|
|
615
645
|
```
|
|
616
646
|
|
|
617
647
|
It also stays quiet when no summary provider is installed — a missing `claude`
|
|
618
|
-
never breaks a read command. `
|
|
648
|
+
never breaks a read command. `gmux doctor` reports the current state.
|
|
619
649
|
|
|
620
|
-
### `
|
|
650
|
+
### `gmux ls` wraps instead of truncating
|
|
621
651
|
|
|
622
652
|
Long descriptions were cut off at 72 characters, so the sessions with the most
|
|
623
653
|
informative summaries were exactly the ones you could not read. They now wrap to the
|
|
624
654
|
terminal, with continuation lines indented under the description column.
|
|
625
655
|
|
|
626
|
-
Piped output still emits **one line per session**, untruncated, so `
|
|
656
|
+
Piped output still emits **one line per session**, untruncated, so `gmux ls | grep`
|
|
627
657
|
behaves. The fzf picker's rows stay single-line, because fzf maps lines back to
|
|
628
658
|
session ids.
|
|
629
659
|
|
|
630
660
|
## 0.1.2
|
|
631
661
|
|
|
632
|
-
- `
|
|
662
|
+
- `gmux --version` reported a hardcoded `0.1.0` regardless of the installed version.
|
|
633
663
|
It now reads `package.json`.
|
|
634
664
|
|
|
635
665
|
## 0.1.1
|
|
@@ -648,7 +678,7 @@ First release.
|
|
|
648
678
|
the *tail* of each transcript, because a harness's own title is written in the
|
|
649
679
|
first few seconds and never revised.
|
|
650
680
|
- Sessions that ended mid-task are flagged `⚠`.
|
|
651
|
-
- `
|
|
681
|
+
- `gmux resume` hands off to the right CLI (`claude --resume` / `codex resume`) in the
|
|
652
682
|
session's original directory.
|
|
653
683
|
- `--json` on every read command, so agents can call it too.
|
|
654
684
|
- Read-only: never writes to a session file.
|