@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.
Files changed (229) hide show
  1. package/CHANGELOG.md +654 -0
  2. package/LICENSE +21 -0
  3. package/README.md +351 -0
  4. package/dist/adapters/claude-code.d.ts +52 -0
  5. package/dist/adapters/claude-code.js +315 -0
  6. package/dist/adapters/claude-code.js.map +1 -0
  7. package/dist/adapters/codex.d.ts +39 -0
  8. package/dist/adapters/codex.js +233 -0
  9. package/dist/adapters/codex.js.map +1 -0
  10. package/dist/adapters/jsonl.d.ts +40 -0
  11. package/dist/adapters/jsonl.js +92 -0
  12. package/dist/adapters/jsonl.js.map +1 -0
  13. package/dist/adapters/registry.d.ts +11 -0
  14. package/dist/adapters/registry.js +21 -0
  15. package/dist/adapters/registry.js.map +1 -0
  16. package/dist/adapters/types.d.ts +43 -0
  17. package/dist/adapters/types.js +2 -0
  18. package/dist/adapters/types.js.map +1 -0
  19. package/dist/cli/border-client.d.ts +8 -0
  20. package/dist/cli/border-client.js +11 -0
  21. package/dist/cli/border-client.js.map +1 -0
  22. package/dist/cli/commands/__ask-cancel.d.ts +35 -0
  23. package/dist/cli/commands/__ask-cancel.js +91 -0
  24. package/dist/cli/commands/__ask-cancel.js.map +1 -0
  25. package/dist/cli/commands/__ask-refresh.d.ts +40 -0
  26. package/dist/cli/commands/__ask-refresh.js +54 -0
  27. package/dist/cli/commands/__ask-refresh.js.map +1 -0
  28. package/dist/cli/commands/__ask-run.d.ts +43 -0
  29. package/dist/cli/commands/__ask-run.js +126 -0
  30. package/dist/cli/commands/__ask-run.js.map +1 -0
  31. package/dist/cli/commands/__ask-send.d.ts +50 -0
  32. package/dist/cli/commands/__ask-send.js +138 -0
  33. package/dist/cli/commands/__ask-send.js.map +1 -0
  34. package/dist/cli/commands/__preview-card.d.ts +31 -0
  35. package/dist/cli/commands/__preview-card.js +72 -0
  36. package/dist/cli/commands/__preview-card.js.map +1 -0
  37. package/dist/cli/commands/ask.d.ts +50 -0
  38. package/dist/cli/commands/ask.js +240 -0
  39. package/dist/cli/commands/ask.js.map +1 -0
  40. package/dist/cli/commands/auto.d.ts +12 -0
  41. package/dist/cli/commands/auto.js +28 -0
  42. package/dist/cli/commands/auto.js.map +1 -0
  43. package/dist/cli/commands/cockpit.d.ts +14 -0
  44. package/dist/cli/commands/cockpit.js +52 -0
  45. package/dist/cli/commands/cockpit.js.map +1 -0
  46. package/dist/cli/commands/daemon.d.ts +75 -0
  47. package/dist/cli/commands/daemon.js +258 -0
  48. package/dist/cli/commands/daemon.js.map +1 -0
  49. package/dist/cli/commands/doctor.d.ts +6 -0
  50. package/dist/cli/commands/doctor.js +159 -0
  51. package/dist/cli/commands/doctor.js.map +1 -0
  52. package/dist/cli/commands/grep.d.ts +2 -0
  53. package/dist/cli/commands/grep.js +52 -0
  54. package/dist/cli/commands/grep.js.map +1 -0
  55. package/dist/cli/commands/index-cmd.d.ts +2 -0
  56. package/dist/cli/commands/index-cmd.js +29 -0
  57. package/dist/cli/commands/index-cmd.js.map +1 -0
  58. package/dist/cli/commands/ls.d.ts +30 -0
  59. package/dist/cli/commands/ls.js +95 -0
  60. package/dist/cli/commands/ls.js.map +1 -0
  61. package/dist/cli/commands/overlay.d.ts +26 -0
  62. package/dist/cli/commands/overlay.js +216 -0
  63. package/dist/cli/commands/overlay.js.map +1 -0
  64. package/dist/cli/commands/pick.d.ts +59 -0
  65. package/dist/cli/commands/pick.js +254 -0
  66. package/dist/cli/commands/pick.js.map +1 -0
  67. package/dist/cli/commands/picker-rows.d.ts +17 -0
  68. package/dist/cli/commands/picker-rows.js +47 -0
  69. package/dist/cli/commands/picker-rows.js.map +1 -0
  70. package/dist/cli/commands/resume.d.ts +25 -0
  71. package/dist/cli/commands/resume.js +88 -0
  72. package/dist/cli/commands/resume.js.map +1 -0
  73. package/dist/cli/commands/run.d.ts +13 -0
  74. package/dist/cli/commands/run.js +78 -0
  75. package/dist/cli/commands/run.js.map +1 -0
  76. package/dist/cli/commands/setup.d.ts +37 -0
  77. package/dist/cli/commands/setup.js +200 -0
  78. package/dist/cli/commands/setup.js.map +1 -0
  79. package/dist/cli/commands/show.d.ts +2 -0
  80. package/dist/cli/commands/show.js +24 -0
  81. package/dist/cli/commands/show.js.map +1 -0
  82. package/dist/cli/commands/summarize.d.ts +2 -0
  83. package/dist/cli/commands/summarize.js +59 -0
  84. package/dist/cli/commands/summarize.js.map +1 -0
  85. package/dist/cli/commands/tmux.d.ts +11 -0
  86. package/dist/cli/commands/tmux.js +90 -0
  87. package/dist/cli/commands/tmux.js.map +1 -0
  88. package/dist/cli/commands/watch.d.ts +2 -0
  89. package/dist/cli/commands/watch.js +76 -0
  90. package/dist/cli/commands/watch.js.map +1 -0
  91. package/dist/cli/format.d.ts +74 -0
  92. package/dist/cli/format.js +242 -0
  93. package/dist/cli/format.js.map +1 -0
  94. package/dist/cli/gmux-render.d.ts +11 -0
  95. package/dist/cli/gmux-render.js +60 -0
  96. package/dist/cli/gmux-render.js.map +1 -0
  97. package/dist/cli/main.d.ts +8 -0
  98. package/dist/cli/main.js +145 -0
  99. package/dist/cli/main.js.map +1 -0
  100. package/dist/cli/overlay-ask.d.ts +13 -0
  101. package/dist/cli/overlay-ask.js +32 -0
  102. package/dist/cli/overlay-ask.js.map +1 -0
  103. package/dist/cli/overlay.d.ts +26 -0
  104. package/dist/cli/overlay.js +149 -0
  105. package/dist/cli/overlay.js.map +1 -0
  106. package/dist/cli/picker.d.ts +308 -0
  107. package/dist/cli/picker.js +642 -0
  108. package/dist/cli/picker.js.map +1 -0
  109. package/dist/cli/preview.d.ts +87 -0
  110. package/dist/cli/preview.js +292 -0
  111. package/dist/cli/preview.js.map +1 -0
  112. package/dist/cli/tmux-label.d.ts +50 -0
  113. package/dist/cli/tmux-label.js +146 -0
  114. package/dist/cli/tmux-label.js.map +1 -0
  115. package/dist/core/errors.d.ts +54 -0
  116. package/dist/core/errors.js +91 -0
  117. package/dist/core/errors.js.map +1 -0
  118. package/dist/core/fingerprint.d.ts +21 -0
  119. package/dist/core/fingerprint.js +59 -0
  120. package/dist/core/fingerprint.js.map +1 -0
  121. package/dist/core/gmux-types.d.ts +102 -0
  122. package/dist/core/gmux-types.js +13 -0
  123. package/dist/core/gmux-types.js.map +1 -0
  124. package/dist/core/pane-state.d.ts +5 -0
  125. package/dist/core/pane-state.js +15 -0
  126. package/dist/core/pane-state.js.map +1 -0
  127. package/dist/core/paths.d.ts +68 -0
  128. package/dist/core/paths.js +106 -0
  129. package/dist/core/paths.js.map +1 -0
  130. package/dist/core/proc-tree.d.ts +9 -0
  131. package/dist/core/proc-tree.js +33 -0
  132. package/dist/core/proc-tree.js.map +1 -0
  133. package/dist/core/text.d.ts +34 -0
  134. package/dist/core/text.js +126 -0
  135. package/dist/core/text.js.map +1 -0
  136. package/dist/core/types.d.ts +322 -0
  137. package/dist/core/types.js +10 -0
  138. package/dist/core/types.js.map +1 -0
  139. package/dist/services/ask-transcript.d.ts +256 -0
  140. package/dist/services/ask-transcript.js +544 -0
  141. package/dist/services/ask-transcript.js.map +1 -0
  142. package/dist/services/ask.d.ts +54 -0
  143. package/dist/services/ask.js +161 -0
  144. package/dist/services/ask.js.map +1 -0
  145. package/dist/services/auto-summarize.d.ts +188 -0
  146. package/dist/services/auto-summarize.js +415 -0
  147. package/dist/services/auto-summarize.js.map +1 -0
  148. package/dist/services/concurrency.d.ts +2 -0
  149. package/dist/services/concurrency.js +16 -0
  150. package/dist/services/concurrency.js.map +1 -0
  151. package/dist/services/config.d.ts +131 -0
  152. package/dist/services/config.js +325 -0
  153. package/dist/services/config.js.map +1 -0
  154. package/dist/services/daemon-client.d.ts +9 -0
  155. package/dist/services/daemon-client.js +34 -0
  156. package/dist/services/daemon-client.js.map +1 -0
  157. package/dist/services/daemon-socket.d.ts +30 -0
  158. package/dist/services/daemon-socket.js +76 -0
  159. package/dist/services/daemon-socket.js.map +1 -0
  160. package/dist/services/daemon.d.ts +43 -0
  161. package/dist/services/daemon.js +106 -0
  162. package/dist/services/daemon.js.map +1 -0
  163. package/dist/services/distill.d.ts +39 -0
  164. package/dist/services/distill.js +93 -0
  165. package/dist/services/distill.js.map +1 -0
  166. package/dist/services/guardian.d.ts +26 -0
  167. package/dist/services/guardian.js +71 -0
  168. package/dist/services/guardian.js.map +1 -0
  169. package/dist/services/index-store.d.ts +36 -0
  170. package/dist/services/index-store.js +125 -0
  171. package/dist/services/index-store.js.map +1 -0
  172. package/dist/services/log-rotation.d.ts +3 -0
  173. package/dist/services/log-rotation.js +28 -0
  174. package/dist/services/log-rotation.js.map +1 -0
  175. package/dist/services/pane-links.d.ts +10 -0
  176. package/dist/services/pane-links.js +47 -0
  177. package/dist/services/pane-links.js.map +1 -0
  178. package/dist/services/pane-process.d.ts +95 -0
  179. package/dist/services/pane-process.js +183 -0
  180. package/dist/services/pane-process.js.map +1 -0
  181. package/dist/services/pane-registry.d.ts +24 -0
  182. package/dist/services/pane-registry.js +40 -0
  183. package/dist/services/pane-registry.js.map +1 -0
  184. package/dist/services/provider-process.d.ts +37 -0
  185. package/dist/services/provider-process.js +105 -0
  186. package/dist/services/provider-process.js.map +1 -0
  187. package/dist/services/providers.d.ts +76 -0
  188. package/dist/services/providers.js +104 -0
  189. package/dist/services/providers.js.map +1 -0
  190. package/dist/services/resolve.d.ts +3 -0
  191. package/dist/services/resolve.js +18 -0
  192. package/dist/services/resolve.js.map +1 -0
  193. package/dist/services/resources.d.ts +17 -0
  194. package/dist/services/resources.js +113 -0
  195. package/dist/services/resources.js.map +1 -0
  196. package/dist/services/search.d.ts +29 -0
  197. package/dist/services/search.js +135 -0
  198. package/dist/services/search.js.map +1 -0
  199. package/dist/services/semantic-gate.d.ts +13 -0
  200. package/dist/services/semantic-gate.js +23 -0
  201. package/dist/services/semantic-gate.js.map +1 -0
  202. package/dist/services/semantic.d.ts +113 -0
  203. package/dist/services/semantic.js +216 -0
  204. package/dist/services/semantic.js.map +1 -0
  205. package/dist/services/sensors.d.ts +92 -0
  206. package/dist/services/sensors.js +246 -0
  207. package/dist/services/sensors.js.map +1 -0
  208. package/dist/services/summarize.d.ts +84 -0
  209. package/dist/services/summarize.js +230 -0
  210. package/dist/services/summarize.js.map +1 -0
  211. package/dist/services/tmux-gateway.d.ts +17 -0
  212. package/dist/services/tmux-gateway.js +10 -0
  213. package/dist/services/tmux-gateway.js.map +1 -0
  214. package/dist/services/tmux-resolve.d.ts +54 -0
  215. package/dist/services/tmux-resolve.js +0 -0
  216. package/dist/services/tmux-resolve.js.map +1 -0
  217. package/dist/services/tmux.d.ts +32 -0
  218. package/dist/services/tmux.js +107 -0
  219. package/dist/services/tmux.js.map +1 -0
  220. package/dist/services/views.d.ts +7 -0
  221. package/dist/services/views.js +18 -0
  222. package/dist/services/views.js.map +1 -0
  223. package/dist/services/watch.d.ts +36 -0
  224. package/dist/services/watch.js +98 -0
  225. package/dist/services/watch.js.map +1 -0
  226. package/dist/services/workspace.d.ts +19 -0
  227. package/dist/services/workspace.js +88 -0
  228. package/dist/services/workspace.js.map +1 -0
  229. 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.