@gigaflow/gmux 0.15.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 +654 -0
- package/LICENSE +21 -0
- package/README.md +351 -0
- package/dist/adapters/claude-code.d.ts +52 -0
- package/dist/adapters/claude-code.js +315 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/codex.d.ts +39 -0
- package/dist/adapters/codex.js +233 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/jsonl.d.ts +40 -0
- package/dist/adapters/jsonl.js +92 -0
- package/dist/adapters/jsonl.js.map +1 -0
- package/dist/adapters/registry.d.ts +11 -0
- package/dist/adapters/registry.js +21 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/types.d.ts +43 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli/border-client.d.ts +8 -0
- package/dist/cli/border-client.js +11 -0
- package/dist/cli/border-client.js.map +1 -0
- package/dist/cli/commands/__ask-cancel.d.ts +35 -0
- package/dist/cli/commands/__ask-cancel.js +91 -0
- package/dist/cli/commands/__ask-cancel.js.map +1 -0
- package/dist/cli/commands/__ask-refresh.d.ts +40 -0
- package/dist/cli/commands/__ask-refresh.js +54 -0
- package/dist/cli/commands/__ask-refresh.js.map +1 -0
- package/dist/cli/commands/__ask-run.d.ts +43 -0
- package/dist/cli/commands/__ask-run.js +126 -0
- package/dist/cli/commands/__ask-run.js.map +1 -0
- package/dist/cli/commands/__ask-send.d.ts +50 -0
- package/dist/cli/commands/__ask-send.js +138 -0
- package/dist/cli/commands/__ask-send.js.map +1 -0
- package/dist/cli/commands/__preview-card.d.ts +31 -0
- package/dist/cli/commands/__preview-card.js +72 -0
- package/dist/cli/commands/__preview-card.js.map +1 -0
- package/dist/cli/commands/ask.d.ts +50 -0
- package/dist/cli/commands/ask.js +240 -0
- package/dist/cli/commands/ask.js.map +1 -0
- package/dist/cli/commands/auto.d.ts +12 -0
- package/dist/cli/commands/auto.js +28 -0
- package/dist/cli/commands/auto.js.map +1 -0
- package/dist/cli/commands/cockpit.d.ts +14 -0
- package/dist/cli/commands/cockpit.js +52 -0
- package/dist/cli/commands/cockpit.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +75 -0
- package/dist/cli/commands/daemon.js +258 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +6 -0
- package/dist/cli/commands/doctor.js +159 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/grep.d.ts +2 -0
- package/dist/cli/commands/grep.js +52 -0
- package/dist/cli/commands/grep.js.map +1 -0
- package/dist/cli/commands/index-cmd.d.ts +2 -0
- package/dist/cli/commands/index-cmd.js +29 -0
- package/dist/cli/commands/index-cmd.js.map +1 -0
- package/dist/cli/commands/ls.d.ts +30 -0
- package/dist/cli/commands/ls.js +95 -0
- package/dist/cli/commands/ls.js.map +1 -0
- package/dist/cli/commands/overlay.d.ts +26 -0
- package/dist/cli/commands/overlay.js +216 -0
- package/dist/cli/commands/overlay.js.map +1 -0
- package/dist/cli/commands/pick.d.ts +59 -0
- package/dist/cli/commands/pick.js +254 -0
- package/dist/cli/commands/pick.js.map +1 -0
- package/dist/cli/commands/picker-rows.d.ts +17 -0
- package/dist/cli/commands/picker-rows.js +47 -0
- package/dist/cli/commands/picker-rows.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +25 -0
- package/dist/cli/commands/resume.js +88 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/run.d.ts +13 -0
- package/dist/cli/commands/run.js +78 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +37 -0
- package/dist/cli/commands/setup.js +200 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/show.d.ts +2 -0
- package/dist/cli/commands/show.js +24 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/summarize.d.ts +2 -0
- package/dist/cli/commands/summarize.js +59 -0
- package/dist/cli/commands/summarize.js.map +1 -0
- package/dist/cli/commands/tmux.d.ts +11 -0
- package/dist/cli/commands/tmux.js +90 -0
- package/dist/cli/commands/tmux.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +2 -0
- package/dist/cli/commands/watch.js +76 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/format.d.ts +74 -0
- package/dist/cli/format.js +242 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/gmux-render.d.ts +11 -0
- package/dist/cli/gmux-render.js +60 -0
- package/dist/cli/gmux-render.js.map +1 -0
- package/dist/cli/main.d.ts +8 -0
- package/dist/cli/main.js +145 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/overlay-ask.d.ts +13 -0
- package/dist/cli/overlay-ask.js +32 -0
- package/dist/cli/overlay-ask.js.map +1 -0
- package/dist/cli/overlay.d.ts +26 -0
- package/dist/cli/overlay.js +149 -0
- package/dist/cli/overlay.js.map +1 -0
- package/dist/cli/picker.d.ts +308 -0
- package/dist/cli/picker.js +642 -0
- package/dist/cli/picker.js.map +1 -0
- package/dist/cli/preview.d.ts +87 -0
- package/dist/cli/preview.js +292 -0
- package/dist/cli/preview.js.map +1 -0
- package/dist/cli/tmux-label.d.ts +50 -0
- package/dist/cli/tmux-label.js +146 -0
- package/dist/cli/tmux-label.js.map +1 -0
- package/dist/core/errors.d.ts +54 -0
- package/dist/core/errors.js +91 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/fingerprint.d.ts +21 -0
- package/dist/core/fingerprint.js +59 -0
- package/dist/core/fingerprint.js.map +1 -0
- package/dist/core/gmux-types.d.ts +102 -0
- package/dist/core/gmux-types.js +13 -0
- package/dist/core/gmux-types.js.map +1 -0
- package/dist/core/pane-state.d.ts +5 -0
- package/dist/core/pane-state.js +15 -0
- package/dist/core/pane-state.js.map +1 -0
- package/dist/core/paths.d.ts +68 -0
- package/dist/core/paths.js +106 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/proc-tree.d.ts +9 -0
- package/dist/core/proc-tree.js +33 -0
- package/dist/core/proc-tree.js.map +1 -0
- package/dist/core/text.d.ts +34 -0
- package/dist/core/text.js +126 -0
- package/dist/core/text.js.map +1 -0
- package/dist/core/types.d.ts +322 -0
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -0
- package/dist/services/ask-transcript.d.ts +256 -0
- package/dist/services/ask-transcript.js +544 -0
- package/dist/services/ask-transcript.js.map +1 -0
- package/dist/services/ask.d.ts +54 -0
- package/dist/services/ask.js +161 -0
- package/dist/services/ask.js.map +1 -0
- package/dist/services/auto-summarize.d.ts +188 -0
- package/dist/services/auto-summarize.js +415 -0
- package/dist/services/auto-summarize.js.map +1 -0
- package/dist/services/concurrency.d.ts +2 -0
- package/dist/services/concurrency.js +16 -0
- package/dist/services/concurrency.js.map +1 -0
- package/dist/services/config.d.ts +131 -0
- package/dist/services/config.js +325 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/daemon-client.d.ts +9 -0
- package/dist/services/daemon-client.js +34 -0
- package/dist/services/daemon-client.js.map +1 -0
- package/dist/services/daemon-socket.d.ts +30 -0
- package/dist/services/daemon-socket.js +76 -0
- package/dist/services/daemon-socket.js.map +1 -0
- package/dist/services/daemon.d.ts +43 -0
- package/dist/services/daemon.js +106 -0
- package/dist/services/daemon.js.map +1 -0
- package/dist/services/distill.d.ts +39 -0
- package/dist/services/distill.js +93 -0
- package/dist/services/distill.js.map +1 -0
- package/dist/services/guardian.d.ts +26 -0
- package/dist/services/guardian.js +71 -0
- package/dist/services/guardian.js.map +1 -0
- package/dist/services/index-store.d.ts +36 -0
- package/dist/services/index-store.js +125 -0
- package/dist/services/index-store.js.map +1 -0
- package/dist/services/log-rotation.d.ts +3 -0
- package/dist/services/log-rotation.js +28 -0
- package/dist/services/log-rotation.js.map +1 -0
- package/dist/services/pane-links.d.ts +10 -0
- package/dist/services/pane-links.js +47 -0
- package/dist/services/pane-links.js.map +1 -0
- package/dist/services/pane-process.d.ts +95 -0
- package/dist/services/pane-process.js +183 -0
- package/dist/services/pane-process.js.map +1 -0
- package/dist/services/pane-registry.d.ts +24 -0
- package/dist/services/pane-registry.js +40 -0
- package/dist/services/pane-registry.js.map +1 -0
- package/dist/services/provider-process.d.ts +37 -0
- package/dist/services/provider-process.js +105 -0
- package/dist/services/provider-process.js.map +1 -0
- package/dist/services/providers.d.ts +76 -0
- package/dist/services/providers.js +104 -0
- package/dist/services/providers.js.map +1 -0
- package/dist/services/resolve.d.ts +3 -0
- package/dist/services/resolve.js +18 -0
- package/dist/services/resolve.js.map +1 -0
- package/dist/services/resources.d.ts +17 -0
- package/dist/services/resources.js +113 -0
- package/dist/services/resources.js.map +1 -0
- package/dist/services/search.d.ts +29 -0
- package/dist/services/search.js +135 -0
- package/dist/services/search.js.map +1 -0
- package/dist/services/semantic-gate.d.ts +13 -0
- package/dist/services/semantic-gate.js +23 -0
- package/dist/services/semantic-gate.js.map +1 -0
- package/dist/services/semantic.d.ts +113 -0
- package/dist/services/semantic.js +216 -0
- package/dist/services/semantic.js.map +1 -0
- package/dist/services/sensors.d.ts +92 -0
- package/dist/services/sensors.js +246 -0
- package/dist/services/sensors.js.map +1 -0
- package/dist/services/summarize.d.ts +84 -0
- package/dist/services/summarize.js +230 -0
- package/dist/services/summarize.js.map +1 -0
- package/dist/services/tmux-gateway.d.ts +17 -0
- package/dist/services/tmux-gateway.js +10 -0
- package/dist/services/tmux-gateway.js.map +1 -0
- package/dist/services/tmux-resolve.d.ts +54 -0
- package/dist/services/tmux-resolve.js +0 -0
- package/dist/services/tmux-resolve.js.map +1 -0
- package/dist/services/tmux.d.ts +32 -0
- package/dist/services/tmux.js +107 -0
- package/dist/services/tmux.js.map +1 -0
- package/dist/services/views.d.ts +7 -0
- package/dist/services/views.js +18 -0
- package/dist/services/views.js.map +1 -0
- package/dist/services/watch.d.ts +36 -0
- package/dist/services/watch.js +98 -0
- package/dist/services/watch.js.map +1 -0
- package/dist/services/workspace.d.ts +19 -0
- package/dist/services/workspace.js +88 -0
- package/dist/services/workspace.js.map +1 -0
- package/package.json +64 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Notable changes, newest first. Versions follow [semver](https://semver.org): while
|
|
4
|
+
0.x, a **minor** bump means behavior changed in a way you should read about before
|
|
5
|
+
upgrading, and a **patch** is a fix that asks nothing of you.
|
|
6
|
+
|
|
7
|
+
## 0.15.0
|
|
8
|
+
|
|
9
|
+
### Always-on workspace awareness — daemon, cockpit, memory guardian
|
|
10
|
+
|
|
11
|
+
gmux gains the layer the name always implied: a resident daemon that watches your
|
|
12
|
+
whole tmux workspace and tells you, at a glance, what every pane is doing — without
|
|
13
|
+
focusing each one in turn. It builds on the existing sensing (transcript adapters,
|
|
14
|
+
summaries, border labels) and is **additive** — nothing about the picker changed.
|
|
15
|
+
|
|
16
|
+
- **Start it.** `gmux daemon` runs a resident daemon that senses every pane (agent
|
|
17
|
+
and plain shell) on a ~1.5s tick and serves one workspace model over a local
|
|
18
|
+
socket (with a snapshot-file fallback). `gmux tmux install` wires the border
|
|
19
|
+
labels and the `ctrl+g` cockpit into your `~/.tmux.conf`.
|
|
20
|
+
- **Ambient border labels.** Each pane's border shows a state glyph — ● working ·
|
|
21
|
+
◔ waiting · ✗ error · ✓ done · ○ idle — plus a one-liner: instant heuristic state
|
|
22
|
+
always, and an LLM-written "what it's doing" line a beat later (change-gated and
|
|
23
|
+
debounced, so it stays cheap).
|
|
24
|
+
- **The cockpit (`ctrl+g`).** A full-workspace grid: per-pane state, memory, a
|
|
25
|
+
one-liner, and last activity, with a ranked memory column that names the hog
|
|
26
|
+
(and surfaces memory it can't attribute honestly) and a guardian log up top.
|
|
27
|
+
- **Memory guardian.** Under host memory pressure the guardian can broadcast a
|
|
28
|
+
"checkpoint your work and pause non-essential tasks" message straight into your
|
|
29
|
+
agent panes, naming the top consumer. This is the one action gmux takes on your
|
|
30
|
+
behalf, so **`gmux setup` discloses it and asks for consent** — default `auto`,
|
|
31
|
+
with `notify` and `off` offered. It only ever types into known agent panes (never
|
|
32
|
+
a shell where a human is at the keyboard) and honors a cooldown so it can't spam.
|
|
33
|
+
|
|
34
|
+
Two lanes, one tool: the cockpit answers *"what's happening right now across my live
|
|
35
|
+
panes"*; the picker (`gmux`, `gmux ls`, `ctrl+shift+g`) still answers *"browse and
|
|
36
|
+
resume any session across time."*
|
|
37
|
+
|
|
38
|
+
The fast path — pane state, memory, and the guardian — is built to survive anything
|
|
39
|
+
the LLM or tmux does: a hung summarizer only lets labels go stale, and a tmux hiccup
|
|
40
|
+
idles a tick; neither freezes triage. See [`docs/gmux.md`](docs/gmux.md) for the
|
|
41
|
+
design, and the memory-attribution caveats (RSS ranks reliably but isn't an exact
|
|
42
|
+
total; detached/containerized children show as *unattributed*).
|
|
43
|
+
|
|
44
|
+
## 0.14.0
|
|
45
|
+
|
|
46
|
+
### Renamed to gmux
|
|
47
|
+
|
|
48
|
+
The project is now **gmux** — "giga multiplexer": tmux, but LLM-native. This is a
|
|
49
|
+
clean break from the old `gigamanage` / `gm` names, so it asks a few things of you
|
|
50
|
+
on upgrade:
|
|
51
|
+
|
|
52
|
+
- **Install the new package.** It publishes as `@gigaflow/gmux` and installs a
|
|
53
|
+
single command, `gmux`. The old `gm` and `gigamanage` commands are gone.
|
|
54
|
+
```bash
|
|
55
|
+
npm uninstall -g gigamanage # remove the old one
|
|
56
|
+
npm install -g @gigaflow/gmux # gives you `gmux`
|
|
57
|
+
```
|
|
58
|
+
- **Environment variables are now `GMUX_*`.** `GIGAMANAGE_SUMMARY_CMD` →
|
|
59
|
+
`GMUX_SUMMARY_CMD`, `GIGAMANAGE_AUTO_SUMMARIZE` → `GMUX_AUTO_SUMMARIZE`, and so
|
|
60
|
+
on. The old names are no longer read — update your shell profile.
|
|
61
|
+
- **State moved.** Config now lives in `~/.config/gmux` and the cache in
|
|
62
|
+
`~/.cache/gmux` (previously `…/gigamanage`). Nothing is migrated: run `gmux setup`
|
|
63
|
+
to choose your provider again, and summaries regenerate on first use. You can
|
|
64
|
+
delete the old `~/.config/gigamanage` and `~/.cache/gigamanage` directories.
|
|
65
|
+
|
|
66
|
+
Everything the tool *does* is unchanged — same picker, same summaries, same
|
|
67
|
+
cross-harness resume, same tmux overlay. Only the name and its surfaces moved. The
|
|
68
|
+
[design doc](docs/superpowers/specs/2026-08-11-gmux-design.md) lays out where gmux
|
|
69
|
+
goes from here.
|
|
70
|
+
|
|
71
|
+
## 0.13.6
|
|
72
|
+
|
|
73
|
+
### Summaries follow the pane, even after you move panes around
|
|
74
|
+
|
|
75
|
+
When several panes share a directory and their agents were started fresh
|
|
76
|
+
(`claude --model=…`, no `--resume <id>`), gigamanage had nothing to tell the panes
|
|
77
|
+
apart — no session id on the command line, no `gm run` link — so it handed out the
|
|
78
|
+
newest sessions in the directory in pane-list order. Move a pane, or let a session
|
|
79
|
+
update, and the summaries reshuffled onto the wrong cards.
|
|
80
|
+
|
|
81
|
+
The overlay now pairs those panes to sessions by **process start order**: within a
|
|
82
|
+
directory, the oldest agent process takes the oldest-started session, and so on.
|
|
83
|
+
A process's start time is stable and belongs to the pane's real process, so the
|
|
84
|
+
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 `gm run`
|
|
86
|
+
link — still win outright.
|
|
87
|
+
|
|
88
|
+
## 0.13.5
|
|
89
|
+
|
|
90
|
+
### ctrl-g closes the overlay it opened
|
|
91
|
+
|
|
92
|
+
The `ctrl-g` peek now toggles: press it again to dismiss, the same as the key that
|
|
93
|
+
opened it. Before, only Esc (or ctrl-c / ctrl-d) closed it — once the ask box
|
|
94
|
+
landed, every other key typed into that box, so a second ctrl-g was swallowed and
|
|
95
|
+
the overlay stayed up. Esc still closes; the ask-box hint now reads `^G/Esc close`.
|
|
96
|
+
|
|
97
|
+
## 0.13.4
|
|
98
|
+
|
|
99
|
+
### Codex summaries work again after an upgrade
|
|
100
|
+
|
|
101
|
+
A config written by an older `gm` froze the codex command as `codex exec`. When
|
|
102
|
+
the catalog later gained `--skip-git-repo-check` (so codex can summarize outside a
|
|
103
|
+
trusted git checkout), that flag never reached an existing config: summary
|
|
104
|
+
resolution replayed the stored command verbatim, so every codex summary failed
|
|
105
|
+
with *"Not inside a trusted directory and --skip-git-repo-check was not
|
|
106
|
+
specified"* and the `ctrl-g` overlay stayed stuck on "no summary yet".
|
|
107
|
+
|
|
108
|
+
A **known** provider now re-derives its argv from the catalog rather than the
|
|
109
|
+
command frozen at setup time — the same self-healing `gm ask` already had. A
|
|
110
|
+
`custom` provider is still run exactly as you wrote it. No re-run of `gm setup`
|
|
111
|
+
needed; upgrade and codex summaries resume.
|
|
112
|
+
|
|
113
|
+
## 0.13.3
|
|
114
|
+
|
|
115
|
+
### A fresh claude pane no longer shows a codex session (or vice versa)
|
|
116
|
+
|
|
117
|
+
Resolving a fresh session — one with no id on its command line — now reads the
|
|
118
|
+
harness from the agent's own argv (`claude` vs `codex`) and hard-filters to it, so
|
|
119
|
+
it can only match a session of the SAME harness in its directory. Before, a fresh
|
|
120
|
+
`claude` pane could grab the newest codex session in the repo (the harness guess
|
|
121
|
+
came from `pane_current_command`, which is just `node`). If no session of that
|
|
122
|
+
harness is known for the directory, the pane shows nothing rather than the wrong
|
|
123
|
+
one.
|
|
124
|
+
|
|
125
|
+
## 0.13.2
|
|
126
|
+
|
|
127
|
+
### Force a refresh, and no more cross-window duplicate panes
|
|
128
|
+
|
|
129
|
+
- **Force refresh:** press **ctrl-r** in the `ctrl-g` overlay to regenerate the
|
|
130
|
+
visible panes' summaries now, ignoring the divergence gate. From the shell:
|
|
131
|
+
`gm summarize <id> --force`, `gm summarize --recent 20 --force`, or
|
|
132
|
+
`gm summarize --all --force`.
|
|
133
|
+
- **Cross-window fix:** the overlay (and `gm ask --window`) used to resolve only
|
|
134
|
+
the current window's panes, so a fresh agent with no session id on its command
|
|
135
|
+
line could grab the session another window's pane already owns — making two
|
|
136
|
+
panes show the same summary. They now resolve every pane in the server and keep
|
|
137
|
+
this window's, so the de-duplication holds across windows.
|
|
138
|
+
|
|
139
|
+
## 0.13.1
|
|
140
|
+
|
|
141
|
+
### The broadcast answer appends to the card, it does not replace the summary
|
|
142
|
+
|
|
143
|
+
When you ask in the overlay, each card now keeps its summary and appends the
|
|
144
|
+
per-pane answer (`▸ answer`, or `▸ asking…` while it lands) beneath it — reserving
|
|
145
|
+
room so both show, instead of the answer swallowing the summary.
|
|
146
|
+
|
|
147
|
+
## 0.13.0
|
|
148
|
+
|
|
149
|
+
### The ask box broadcasts to every pane
|
|
150
|
+
|
|
151
|
+
A question typed in the `ctrl-g` ask box is now answered **per session**: it fans
|
|
152
|
+
out to each pane in parallel and every card shows ITS own answer, not one
|
|
153
|
+
synthesized blob. "What is the single most urgent next action?" → each agent's
|
|
154
|
+
card shows its own. While answers land, cards read `asking…`. Press Enter on an
|
|
155
|
+
empty box to clear the answers back to the summaries; Esc (or ctrl-c) closes.
|
|
156
|
+
|
|
157
|
+
## 0.12.0
|
|
158
|
+
|
|
159
|
+
### The ctrl-g overlay has an ask box built in
|
|
160
|
+
|
|
161
|
+
The `ctrl-g` overlay now carries a text box across the bottom. Just start typing a
|
|
162
|
+
question and press Enter — the answer renders above the cards, fanned out over the
|
|
163
|
+
current window's agents ("what is each doing?", "what is most urgent?"). Keep
|
|
164
|
+
asking; Esc (or ctrl-c) closes. This replaces 0.11.0's "press a to launch a
|
|
165
|
+
separate chat" with an integrated box on the overlay itself.
|
|
166
|
+
|
|
167
|
+
## 0.11.0
|
|
168
|
+
|
|
169
|
+
### Ask across the agents you are looking at
|
|
170
|
+
|
|
171
|
+
In the `ctrl-g` overlay, press **`a`** to open a chat that fans out over the agent
|
|
172
|
+
sessions in the current window. Ask high-level orienting questions — "what is each
|
|
173
|
+
one doing?", "what is most urgent?", "which are waiting on me?" — and keep asking;
|
|
174
|
+
it is `gm ask`, scoped to the panes in front of you rather than your whole recent
|
|
175
|
+
list. Any other key still just closes the overlay.
|
|
176
|
+
|
|
177
|
+
Also available directly: `gm ask --window <window-id>`.
|
|
178
|
+
|
|
179
|
+
## 0.10.2
|
|
180
|
+
|
|
181
|
+
### The ctrl-g cards say when they last updated
|
|
182
|
+
|
|
183
|
+
Each card in the `ctrl-g` overlay now shows when its summary last landed —
|
|
184
|
+
`updated 3m ago` (seconds, minutes, hours, days) — and while a refresh is in
|
|
185
|
+
flight it reads `refreshing… · updated 3m ago`, so you still know how old the
|
|
186
|
+
summary you are reading is.
|
|
187
|
+
|
|
188
|
+
## 0.10.1
|
|
189
|
+
|
|
190
|
+
### The overlay opens about twice as fast
|
|
191
|
+
|
|
192
|
+
Resolving which session each pane runs walked the pane's process tree with a
|
|
193
|
+
`pgrep` per node — dozens of process spawns down a deep agent tree (an agent with
|
|
194
|
+
MCP-server children), which dominated the `ctrl-g` latency. It now takes a single
|
|
195
|
+
`ps` snapshot and walks the tree in memory. Measured: the overlay path roughly
|
|
196
|
+
halved.
|
|
197
|
+
|
|
198
|
+
### A fresh agent no longer copies another pane's summary
|
|
199
|
+
|
|
200
|
+
A pane running a *fresh* session (no session id on its command line) fell back to
|
|
201
|
+
"newest session in this directory" — which is whatever another pane is actively
|
|
202
|
+
working on, so its summary got copied onto the fresh one, especially across
|
|
203
|
+
windows. Panes are now resolved together: an exact match (a `gm run` link or a
|
|
204
|
+
session id read from the agent's argv) claims its session, and no heuristic pane
|
|
205
|
+
may pick a session another pane already owns.
|
|
206
|
+
|
|
207
|
+
## 0.10.0
|
|
208
|
+
|
|
209
|
+
**Upgrading:** the summary prompt changed, so every summary regenerates on its
|
|
210
|
+
next background pass (once, in the background). No action needed.
|
|
211
|
+
|
|
212
|
+
### Summaries in three widening tiers
|
|
213
|
+
|
|
214
|
+
A summary now narrows your attention gradually, so you decide how much to give a
|
|
215
|
+
session:
|
|
216
|
+
|
|
217
|
+
- **headline** — the scannable one-liner (what the `alt-g` label shows);
|
|
218
|
+
- **overview** — 2-3 sentences framing it;
|
|
219
|
+
- **summary** — new: a paragraph or two that actually reorients you, tracing how
|
|
220
|
+
the work evolved and where it stands.
|
|
221
|
+
|
|
222
|
+
`ctrl-g` (and `gm show`) render all three — headline, overview, then the
|
|
223
|
+
drilldown — above the recent/open/next status. The label stays the one-liner;
|
|
224
|
+
the drilldown is one keypress away.
|
|
225
|
+
|
|
226
|
+
### Fixes
|
|
227
|
+
|
|
228
|
+
- `alt-g` off now fully clears the labels. Older versions set
|
|
229
|
+
`pane-border-status` per window, and that override kept the border (and its
|
|
230
|
+
headline) up even after the global was turned off. Toggling off now clears the
|
|
231
|
+
per-window override and wipes each pane's label.
|
|
232
|
+
|
|
233
|
+
## 0.9.0
|
|
234
|
+
|
|
235
|
+
gigamanage becomes what it was always meant to be: **a background agent that
|
|
236
|
+
keeps you up to date on your agents' latest work.**
|
|
237
|
+
|
|
238
|
+
**Upgrading:** re-run `gm tmux install` (or, on Oh My Tmux, keep the `Alt-g` line
|
|
239
|
+
in `~/.tmux.conf.local`) and reload. `Alt-g` now toggles a live service rather
|
|
240
|
+
than painting labels once. Nothing else changes.
|
|
241
|
+
|
|
242
|
+
### `Alt-g` runs a live label agent
|
|
243
|
+
|
|
244
|
+
`Alt-g` starts a single, lightweight background service (`gm watch`) that every
|
|
245
|
+
few seconds resolves every agent pane across all your windows and keeps its
|
|
246
|
+
border label current — the session's headline, where the pane is, with the
|
|
247
|
+
content still visible. A pane whose summary is being regenerated shows
|
|
248
|
+
`gm summaries loading…` until it lands. `Alt-g` again stops it. `ctrl-g` is still
|
|
249
|
+
the full card when you want the detail; the two share one continuously-maintained
|
|
250
|
+
cache, so the popup opens already current.
|
|
251
|
+
|
|
252
|
+
You can also drive it directly: `gm watch` starts it, `gm watch --stop` stops it.
|
|
253
|
+
|
|
254
|
+
### Summaries refresh when work *diverges*, not on every keystroke
|
|
255
|
+
|
|
256
|
+
A live session used to be re-summarised on essentially every message. Now each
|
|
257
|
+
summary carries a compact **SimHash fingerprint** of its content (16 hex
|
|
258
|
+
characters, fixed size however long the session grows), and a session is
|
|
259
|
+
re-summarised only when that fingerprint has drifted past a threshold — with a
|
|
260
|
+
safety net: a new tool failure, a flip to ended-mid-task, or a change in the
|
|
261
|
+
files touched always refreshes, so a small-but-important change is never slept
|
|
262
|
+
through. Tune the threshold with `GIGAMANAGE_REFRESH_DISTANCE`; the loop interval
|
|
263
|
+
with `GIGAMANAGE_WATCH_INTERVAL_MS`.
|
|
264
|
+
|
|
265
|
+
## 0.8.2
|
|
266
|
+
|
|
267
|
+
### Pane-border labels show on every pane, in full
|
|
268
|
+
|
|
269
|
+
Two fixes to the `Alt-g` label HUD:
|
|
270
|
+
|
|
271
|
+
- **Every pane, not just the active one.** The label inherited
|
|
272
|
+
`pane-border-style`, which themes like Oh My Tmux dim to near-background for
|
|
273
|
+
inactive panes — so every label but the active pane's was invisible. The label
|
|
274
|
+
now forces its own foreground colour and reads on all panes.
|
|
275
|
+
- **No truncation.** The headline was capped at 60 characters; it's now stored in
|
|
276
|
+
full and tmux clips it to the pane's width at render, so a wide pane shows the
|
|
277
|
+
whole thing.
|
|
278
|
+
|
|
279
|
+
A tmux pane border is a single line, so a headline wider than the pane is clipped
|
|
280
|
+
rather than wrapped — press `ctrl-g` for the full card when you need it.
|
|
281
|
+
|
|
282
|
+
## 0.8.1
|
|
283
|
+
|
|
284
|
+
### Resolving a pane skips a needless `lsof`
|
|
285
|
+
|
|
286
|
+
`gm tmux label` and the `ctrl-g` overlay read each pane's agent process to find
|
|
287
|
+
its session. When the agent's command line already carries the session id (a
|
|
288
|
+
resumed session — the common case), the id is exact and the process's working
|
|
289
|
+
directory is never needed — but 0.8.0 looked it up anyway (`lsof` on macOS,
|
|
290
|
+
~100ms per pane). It's now skipped unless there's no id on the line, so resolving
|
|
291
|
+
a window of resumed agents no longer pays for a directory lookup per pane.
|
|
292
|
+
|
|
293
|
+
## 0.8.0
|
|
294
|
+
|
|
295
|
+
**Upgrading:** re-run `gm tmux install` to pick up the new `Alt-g` binding, and
|
|
296
|
+
reload with `tmux source-file ~/.tmux.conf`. Everything is additive; nothing you
|
|
297
|
+
rely on changes.
|
|
298
|
+
|
|
299
|
+
### It knows which session each pane is running
|
|
300
|
+
|
|
301
|
+
The overlay used to map a pane to a session by matching the pane's working
|
|
302
|
+
directory — but that's the *shell's* directory, usually `~`, not the agent's, so
|
|
303
|
+
panes resolved to the wrong session or to nothing. gigamanage now reads the pane's
|
|
304
|
+
own process: the agent's command line carries the session id verbatim (`codex
|
|
305
|
+
resume <id>`, `claude --resume <id>`), and that id *is* the session. Where there's
|
|
306
|
+
no id on the line (a fresh session), it uses the agent process's real working
|
|
307
|
+
directory instead of the shell's. No `gm run`, no setup — it just reads what's
|
|
308
|
+
already there.
|
|
309
|
+
|
|
310
|
+
### A label on every pane's border
|
|
311
|
+
|
|
312
|
+
`Alt-g` toggles a one-line summary onto each pane's border — the session's
|
|
313
|
+
headline, right where the pane is — while the pane content stays fully visible. It
|
|
314
|
+
answers "what is each of these agents doing?" without taking over the screen; the
|
|
315
|
+
`ctrl-g` full-card popup is still there when you want the detail. The label is
|
|
316
|
+
stored in a pane-local option gigamanage owns, so a running agent's own title
|
|
317
|
+
updates can't clobber it.
|
|
318
|
+
|
|
319
|
+
### The peek does less work
|
|
320
|
+
|
|
321
|
+
`ctrl-g` paints from the cached index and resolves each pane once, then upgrades
|
|
322
|
+
to a full index read in the background. An open overlay no longer re-scans
|
|
323
|
+
thousands of session files every second — it re-reads only the summaries that
|
|
324
|
+
change.
|
|
325
|
+
|
|
326
|
+
## 0.7.1
|
|
327
|
+
|
|
328
|
+
Fixes and polish for the tmux peek overlay shipped in 0.7.0 — the first release
|
|
329
|
+
made it usable in practice.
|
|
330
|
+
|
|
331
|
+
### The `ctrl-g` binding now actually opens the overlay
|
|
332
|
+
|
|
333
|
+
`gm tmux install` wrote `gm overlay #{window_id}`, but tmux does not expand that
|
|
334
|
+
format inside `display-popup -E` — so the shell saw the `#` and treated the rest
|
|
335
|
+
of the line as a comment, and `gm overlay` ran with no window argument. The
|
|
336
|
+
result was a popup that flashed and vanished. The binding now resolves the window
|
|
337
|
+
id in-shell with `gm overlay "$(tmux display -p "#{window_id}")"`, which works
|
|
338
|
+
whether or not tmux expands the format. If you installed 0.7.0's binding, re-run
|
|
339
|
+
`gm tmux install` (or, on Oh My Tmux, replace the two lines in
|
|
340
|
+
`~/.tmux.conf.local`) and reload with `tmux source-file ~/.tmux.conf`.
|
|
341
|
+
|
|
342
|
+
### Panes are framed, so cards read as separate
|
|
343
|
+
|
|
344
|
+
Each card is now drawn inside a box border matching its pane's rectangle, so
|
|
345
|
+
adjacent summaries no longer blur into one another.
|
|
346
|
+
|
|
347
|
+
### The peek is instant
|
|
348
|
+
|
|
349
|
+
The overlay used to block on a tmux-version check and a summary-refresh pass
|
|
350
|
+
before painting anything. It now paints from cache immediately and kicks the
|
|
351
|
+
background refresh off afterwards, so `ctrl-g` feels like a peek rather than a
|
|
352
|
+
load.
|
|
353
|
+
|
|
354
|
+
### Cards lead with the headline
|
|
355
|
+
|
|
356
|
+
Each card now leads with the session's one-line headline — the scannable,
|
|
357
|
+
subject-first clause — instead of the multi-sentence overview, which tended to
|
|
358
|
+
open with a generic verb ("Implemented…"). Glancing across panes, the headline
|
|
359
|
+
is what tells them apart.
|
|
360
|
+
|
|
361
|
+
## 0.7.0
|
|
362
|
+
|
|
363
|
+
**Upgrading:** nothing changes unless you opt in. Everything below is additive and
|
|
364
|
+
gated behind tmux; if you don't run `gm tmux install`, `gm` behaves exactly as it
|
|
365
|
+
did in 0.6.1. The overlay needs **tmux 3.2 or newer** (for `display-popup`), which
|
|
366
|
+
`gm doctor` now checks for.
|
|
367
|
+
|
|
368
|
+
### Peek at every agent at once, from tmux
|
|
369
|
+
|
|
370
|
+
Drive your agents in tmux and `gm` can now answer "what's happening in each of
|
|
371
|
+
these panes?" without you switching into any of them. `gm tmux install` writes two
|
|
372
|
+
key bindings to `~/.tmux.conf`:
|
|
373
|
+
|
|
374
|
+
- **ctrl-g** peeks — every pane in the current window is overlaid *in place* with
|
|
375
|
+
its summary card (what landed, what's still open, the next step, the `⚠`
|
|
376
|
+
mid-task flag). Cards paint instantly from the cache and refresh in the
|
|
377
|
+
background; any key dismisses the overlay and leaves your panes untouched.
|
|
378
|
+
- **ctrl-shift-g** opens the `gm` picker in a popup, and Enter resumes your choice
|
|
379
|
+
into a new tmux window — history and live panes, one keystroke apart.
|
|
380
|
+
|
|
381
|
+
The overlay maps a pane to its session by working directory and recency. For an
|
|
382
|
+
exact link — including resumed sessions that share a directory — launch through
|
|
383
|
+
`gm run claude` / `gm run codex resume`: it attaches your terminal as usual and
|
|
384
|
+
records which pane the session runs in.
|
|
385
|
+
|
|
386
|
+
`gm doctor` reports whether the overlay is available and, if not, why. tmux joins
|
|
387
|
+
ripgrep and fzf as an optional companion; nothing here is required.
|
|
388
|
+
|
|
389
|
+
## 0.6.1
|
|
390
|
+
|
|
391
|
+
### The chat/summary split is coloured now
|
|
392
|
+
|
|
393
|
+
The picker's preview pane rendered monochrome — its stdout is a pipe, so gm's
|
|
394
|
+
colour gated itself off, and even the `── ask ──` divider between the session
|
|
395
|
+
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** (gm's own accent) and
|
|
397
|
+
the `you` / `gm` speaker labels light up, while the card stays monochrome.
|
|
398
|
+
|
|
399
|
+
It's an accent, not the message — the divider's glyphs and the speakers' layout
|
|
400
|
+
still carry the structure, so `NO_COLOR` and `TERM=dumb` lose only the colour.
|
|
401
|
+
`gm ls` and `gm show` are unchanged and still pipe clean.
|
|
402
|
+
|
|
403
|
+
## 0.6.0
|
|
404
|
+
|
|
405
|
+
**Upgrading:** `ctrl-o` in the picker no longer suspends the list. It opens the
|
|
406
|
+
chat in the preview pane instead, so the session you were reading stays on
|
|
407
|
+
screen. Nothing else changes for you: bare `gm ask`, the `--json` form, and the
|
|
408
|
+
`fzf < 0.46` and no-fzf fallbacks all behave exactly as before.
|
|
409
|
+
|
|
410
|
+
### ctrl-o asks in the pane, not over the list
|
|
411
|
+
|
|
412
|
+
`ctrl-o` used to suspend fzf and hand the child a full-screen REPL — so the first
|
|
413
|
+
thing it did was take away the very session you pressed it *to ask about*.
|
|
414
|
+
Browsing and asking are the same activity, and that made them mutually exclusive.
|
|
415
|
+
|
|
416
|
+
Now `ctrl-o` is a **mode**, not a launch. The list stays put, the card moves to
|
|
417
|
+
the top of the preview pane, and the answer arrives underneath it while you keep
|
|
418
|
+
arrowing around. It's **one continuous thread**: moving the cursor re-points
|
|
419
|
+
"this session" without forking or resetting what you've asked. `esc` leaves chat
|
|
420
|
+
and hands back the list exactly where you were.
|
|
421
|
+
|
|
422
|
+
`claude -p` buffers rather than streams, so there is no answer to render word by
|
|
423
|
+
word — instead a **1-second heartbeat** shows `thinking… 14s` while the request
|
|
424
|
+
is in flight, then the answer lands in one paint. The picker never freezes, and
|
|
425
|
+
`esc` cancels a request mid-answer.
|
|
426
|
+
|
|
427
|
+
Nothing regresses for people who never ask: with no conversation yet, the card
|
|
428
|
+
gets the full pane exactly as today. `fzf < 0.46` keeps the full-screen `execute`
|
|
429
|
+
REPL, and the no-fzf numbered list keeps its `a` key.
|
|
430
|
+
|
|
431
|
+
### Fixes
|
|
432
|
+
|
|
433
|
+
- The orphan-transcript sweep is now keyed on the **run**, not the transcript. A
|
|
434
|
+
picker killed between `ctrl-o` and the first question leaves a `.browseq` with
|
|
435
|
+
no `.jsonl` beside it; keyed on the transcript, the sweep could never see that
|
|
436
|
+
run, so the cache grew one file per killed picker. It now reaps every member of
|
|
437
|
+
a dead run.
|
|
438
|
+
- Multi-byte output from providers is no longer mangled at chunk boundaries, and
|
|
439
|
+
callers can watch a request as it streams.
|
|
440
|
+
|
|
441
|
+
## 0.5.0
|
|
442
|
+
|
|
443
|
+
**Upgrading:** the first time you run `gm` in a terminal, it will ask you to
|
|
444
|
+
choose a harness before doing any model work. Nothing prompts when the output
|
|
445
|
+
isn't a terminal, and `GIGAMANAGE_SUMMARY_CMD` still overrides everything — so
|
|
446
|
+
scripts, CI and agents are unaffected.
|
|
447
|
+
|
|
448
|
+
### gm asks who to call, once, instead of assuming
|
|
449
|
+
|
|
450
|
+
The first time you run `gm` in a terminal it asks which harness should do its
|
|
451
|
+
model work — Claude Code, Codex, any command that reads a prompt on stdin, or
|
|
452
|
+
nothing at all. Before, it assumed `claude -p` and started spending tokens in the
|
|
453
|
+
background without ever mentioning it.
|
|
454
|
+
|
|
455
|
+
Your answer lives in `~/.config/gigamanage/config.json`, and `gm setup` changes
|
|
456
|
+
it. Choosing **nothing** is a real answer: `gm ls` and `gm show` still work on
|
|
457
|
+
hard facts alone, and nothing calls a model.
|
|
458
|
+
|
|
459
|
+
Nothing prompts unless there's a human at the other end. No TTY, `--json`, or an
|
|
460
|
+
internal command means gm behaves exactly as it did before: autodetect and carry
|
|
461
|
+
on. `GIGAMANAGE_SUMMARY_CMD` still overrides everything, so existing scripts and
|
|
462
|
+
CI need no changes.
|
|
463
|
+
|
|
464
|
+
### gm ask
|
|
465
|
+
|
|
466
|
+
`gm ls` answers "what was I doing?" one row at a time. **`gm ask`** answers the
|
|
467
|
+
question that spans them:
|
|
468
|
+
|
|
469
|
+
```bash
|
|
470
|
+
gm ask "what's still broken?"
|
|
471
|
+
gm ask "what did I already try for the retry?" --json
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
It starts from the summaries already on disk, so a question costs one model call
|
|
475
|
+
rather than a scan of your transcripts. When the summaries aren't enough it runs
|
|
476
|
+
`gm grep` against the real thing and reads what you actually said.
|
|
477
|
+
|
|
478
|
+
**In the picker, `ctrl-o`** opens it on the session you're highlighting and drops
|
|
479
|
+
you back in the list, right where you were, when you're done. Without fzf, the
|
|
480
|
+
numbered list spells it `a`.
|
|
481
|
+
|
|
482
|
+
Not `shift+f`: fzf's query line eats plain letters, so `F` would just type an
|
|
483
|
+
`F`. Not `alt-a` either — macOS Terminal and iTerm2 send `å`.
|
|
484
|
+
|
|
485
|
+
### The picker explains its markers
|
|
486
|
+
|
|
487
|
+
`gm ls` printed a key for `⚠`, `◐` and `○`. The picker — bare `gm` — rendered the
|
|
488
|
+
same three markers and explained none of them, which put the explanation exactly
|
|
489
|
+
where you needed it least: `ls` is the command you run to read a list, and the
|
|
490
|
+
picker is the one you run to *choose*. `⚠` is the whole point of the tool, and in
|
|
491
|
+
the picker it was an unexplained glyph.
|
|
492
|
+
|
|
493
|
+
Both picker paths now carry a key: a second header line under fzf, and a line
|
|
494
|
+
above the "install fzf" hint in the numbered fallback.
|
|
495
|
+
|
|
496
|
+
It is deliberately static — every marker, always, and never a count — while
|
|
497
|
+
`gm ls` keeps its counted one. fzf sets its header once, at spawn; ctrl-r
|
|
498
|
+
replaces the list and leaves the header alone. Counts there would freeze at open
|
|
499
|
+
and be wrong after the first refresh, which is precisely when they change. A key
|
|
500
|
+
that is stale exactly when it matters is worse than no key at all.
|
|
501
|
+
|
|
502
|
+
## 0.4.0
|
|
503
|
+
|
|
504
|
+
### ctrl-r refreshes the picker
|
|
505
|
+
|
|
506
|
+
The picker used to be a dead end: the list it opened with was the list you were
|
|
507
|
+
stuck with. Sessions you started since never appeared, and rows marked `○` stayed
|
|
508
|
+
`○` however long you sat there.
|
|
509
|
+
|
|
510
|
+
**ctrl-r** now reloads to your most recent sessions and starts summaries for any
|
|
511
|
+
that need one, without leaving the picker — so it's something you can navigate in
|
|
512
|
+
while an agent works alongside you. Without fzf, the numbered list takes `r` for
|
|
513
|
+
the same thing.
|
|
514
|
+
|
|
515
|
+
Repeated presses are safe. The lock that already stopped five `gm ls` from
|
|
516
|
+
starting five summarizers stops this too: a press while a pass is running just
|
|
517
|
+
reloads. Sessions whose summary is already current are never rewritten, so ctrl-r
|
|
518
|
+
on a fresh list costs nothing.
|
|
519
|
+
|
|
520
|
+
### Bare `gm` summarizes what it shows
|
|
521
|
+
|
|
522
|
+
Only `gm ls` kicked off a background pass; the picker never did. It does now,
|
|
523
|
+
over the sessions it is about to offer, and rows being written are marked `◐`
|
|
524
|
+
there as well as in `gm ls`.
|
|
525
|
+
|
|
526
|
+
### Fixed: `--no-auto-summarize` never worked
|
|
527
|
+
|
|
528
|
+
`gm --no-auto-summarize ls` spent tokens anyway. The flag is declared on the root
|
|
529
|
+
command, and commander does not copy root options into a subcommand's own
|
|
530
|
+
options — so the check read `undefined`, compared it against `false`, and
|
|
531
|
+
concluded you wanted summaries. Only `GIGAMANAGE_AUTO_SUMMARIZE=0` actually
|
|
532
|
+
turned them off.
|
|
533
|
+
|
|
534
|
+
The flag now works, on `gm ls` and in the picker, and it is carried across to the
|
|
535
|
+
process ctrl-r starts.
|
|
536
|
+
|
|
537
|
+
### Shorter headlines
|
|
538
|
+
|
|
539
|
+
Row headlines asked the model for "max 80 chars" and then rendered them in a
|
|
540
|
+
72-char column — an overflow by construction, read as a truncated sentence. They
|
|
541
|
+
are now one scannable clause, sized to the column they live in.
|
|
542
|
+
|
|
543
|
+
The summary cache key covers the prompt as well as the session, so this reaches
|
|
544
|
+
summaries already on disk: they regenerate in the background on first run rather
|
|
545
|
+
than keeping their old headlines forever. That costs a pass of model calls once.
|
|
546
|
+
`GIGAMANAGE_AUTO_SUMMARIZE=0` still opts out of all of it.
|
|
547
|
+
|
|
548
|
+
## 0.3.0
|
|
549
|
+
|
|
550
|
+
### Summaries keep up with what you actually look at
|
|
551
|
+
|
|
552
|
+
The background pass used to cover a fixed **10** sessions while `gm ls` displayed
|
|
553
|
+
**20** — so the bottom half of the default view was permanently marked "no summary
|
|
554
|
+
yet", and the feature looked broken even though it was working exactly as built.
|
|
555
|
+
|
|
556
|
+
The window now follows the list: `gm ls` keeps 20 summarized, `gm ls -n 50` keeps
|
|
557
|
+
all fifty. Summaries are written **8 at a time** in parallel (tune with
|
|
558
|
+
`GIGAMANAGE_SUMMARY_CONCURRENCY`), and a single pass writes at most 50, saying so
|
|
559
|
+
rather than truncating in silence.
|
|
560
|
+
|
|
561
|
+
### You can see it working
|
|
562
|
+
|
|
563
|
+
Rows being summarized *right now* are marked `◐`, distinct from `○` ("no summary
|
|
564
|
+
yet, nothing running"). The decision is made before the list renders, so the icon
|
|
565
|
+
is true on the very run that starts the work.
|
|
566
|
+
|
|
567
|
+
### Background failures are no longer silent
|
|
568
|
+
|
|
569
|
+
The worker's stdio is discarded, so a broken provider used to mean summaries
|
|
570
|
+
simply never appeared, with nothing to look at. Failures now land in
|
|
571
|
+
`~/.cache/gigamanage/auto-summarize.log`, and `gm doctor` surfaces the last one.
|
|
572
|
+
|
|
573
|
+
**Fixed:** the worker could silently write **zero** summaries. It resolved its
|
|
574
|
+
queue by loading "the N most recent sessions" and filtering — but with sidechains
|
|
575
|
+
included, the most recent N are mostly subagent transcripts, so the filter matched
|
|
576
|
+
nothing. It now looks the queued sessions up across the whole store.
|
|
577
|
+
|
|
578
|
+
### The picker wraps too
|
|
579
|
+
|
|
580
|
+
fzf rows no longer truncate: a session is one NUL-delimited multi-line record
|
|
581
|
+
(`--read0`), so a long summary wraps and is still selected as a single item. fzf
|
|
582
|
+
below 0.46 has no multi-line display, so it falls back to single-line rows rather
|
|
583
|
+
than rendering one session as several bogus entries. The numbered fallback (no fzf
|
|
584
|
+
installed) wraps as well.
|
|
585
|
+
|
|
586
|
+
## 0.2.0
|
|
587
|
+
|
|
588
|
+
**gigamanage now spends tokens on your behalf unless you tell it not to.** That is a
|
|
589
|
+
change of default behavior, which is why this is a minor bump rather than a patch —
|
|
590
|
+
everything in it already shipped as 0.1.3/0.1.4, but the version number was
|
|
591
|
+
under-selling it.
|
|
592
|
+
|
|
593
|
+
### Summaries write themselves
|
|
594
|
+
|
|
595
|
+
Any `gm` command now checks the 10 most recent sessions and, if any lack a current
|
|
596
|
+
summary, writes them in a **detached background process**. The foreground command
|
|
597
|
+
never waits on a model: it prints, tells you on stderr what it started, and exits.
|
|
598
|
+
Summaries appear on your next run. Rows still waiting are marked `○`.
|
|
599
|
+
|
|
600
|
+
Three things this deliberately does not do:
|
|
601
|
+
|
|
602
|
+
- **Block.** A summary costs ~8s of model time. Ten of those inline would turn a
|
|
603
|
+
60ms `gm ls` into a minute of waiting.
|
|
604
|
+
- **Stampede.** A lock in `~/.cache/gigamanage` means five `gm ls` in a row start
|
|
605
|
+
one summarizer, not five.
|
|
606
|
+
- **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 gigamanage
|
|
608
|
+
cannot summarize its own summarizer forever.
|
|
609
|
+
|
|
610
|
+
**Turning it off**, because background model calls cost money:
|
|
611
|
+
|
|
612
|
+
```bash
|
|
613
|
+
gm --no-auto-summarize ls # once
|
|
614
|
+
export GIGAMANAGE_AUTO_SUMMARIZE=0 # for good
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
It also stays quiet when no summary provider is installed — a missing `claude`
|
|
618
|
+
never breaks a read command. `gm doctor` reports the current state.
|
|
619
|
+
|
|
620
|
+
### `gm ls` wraps instead of truncating
|
|
621
|
+
|
|
622
|
+
Long descriptions were cut off at 72 characters, so the sessions with the most
|
|
623
|
+
informative summaries were exactly the ones you could not read. They now wrap to the
|
|
624
|
+
terminal, with continuation lines indented under the description column.
|
|
625
|
+
|
|
626
|
+
Piped output still emits **one line per session**, untruncated, so `gm ls | grep`
|
|
627
|
+
behaves. The fzf picker's rows stay single-line, because fzf maps lines back to
|
|
628
|
+
session ids.
|
|
629
|
+
|
|
630
|
+
## 0.1.2
|
|
631
|
+
|
|
632
|
+
- `gm --version` reported a hardcoded `0.1.0` regardless of the installed version.
|
|
633
|
+
It now reads `package.json`.
|
|
634
|
+
|
|
635
|
+
## 0.1.1
|
|
636
|
+
|
|
637
|
+
- First release published through [trusted publishing](https://docs.npmjs.com/trusted-publishers/)
|
|
638
|
+
(OIDC): no long-lived npm token, and every release carries a provenance
|
|
639
|
+
attestation binding the package to the commit and workflow that built it.
|
|
640
|
+
|
|
641
|
+
## 0.1.0
|
|
642
|
+
|
|
643
|
+
First release.
|
|
644
|
+
|
|
645
|
+
- Index sessions from **Claude Code** and **Codex**; one adapter per harness, and
|
|
646
|
+
adding another is a single file.
|
|
647
|
+
- Summaries describe where a session **landed**, not where it started — built from
|
|
648
|
+
the *tail* of each transcript, because a harness's own title is written in the
|
|
649
|
+
first few seconds and never revised.
|
|
650
|
+
- Sessions that ended mid-task are flagged `⚠`.
|
|
651
|
+
- `gm resume` hands off to the right CLI (`claude --resume` / `codex resume`) in the
|
|
652
|
+
session's original directory.
|
|
653
|
+
- `--json` on every read command, so agents can call it too.
|
|
654
|
+
- Read-only: never writes to a session file.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 James Gao
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|