sessionview 0.3.0__tar.gz → 0.3.1__tar.gz

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 (50) hide show
  1. {sessionview-0.3.0 → sessionview-0.3.1}/PKG-INFO +175 -66
  2. {sessionview-0.3.0 → sessionview-0.3.1}/README.md +174 -65
  3. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview +45 -6
  4. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-app-install +9 -0
  5. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-autostart +25 -1
  6. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-config +68 -14
  7. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-frame +41 -13
  8. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-from +5 -0
  9. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-install +85 -4
  10. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-messages +25 -2
  11. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-newtab +21 -4
  12. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-send +10 -2
  13. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-session +15 -4
  14. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-sidebar-toggle +11 -5
  15. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-terminal +8 -0
  16. {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-usermail +9 -6
  17. {sessionview-0.3.0 → sessionview-0.3.1}/bin/tmux-send-agent +14 -4
  18. {sessionview-0.3.0 → sessionview-0.3.1}/bin/tmux-sidebar +65 -14
  19. sessionview-0.3.1/docs/configuration.md +183 -0
  20. sessionview-0.3.1/docs/dependencies.md +161 -0
  21. sessionview-0.3.1/docs/sessionview.md +92 -0
  22. sessionview-0.3.1/docs/settings.md +133 -0
  23. {sessionview-0.3.0 → sessionview-0.3.1}/pyproject.toml +8 -2
  24. {sessionview-0.3.0 → sessionview-0.3.1}/src/sessionview/__init__.py +1 -1
  25. {sessionview-0.3.0 → sessionview-0.3.1}/tmux/frame.conf +4 -1
  26. {sessionview-0.3.0 → sessionview-0.3.1}/.gitignore +0 -0
  27. {sessionview-0.3.0 → sessionview-0.3.1}/LICENSE +0 -0
  28. {sessionview-0.3.0 → sessionview-0.3.1}/config/README.md +0 -0
  29. {sessionview-0.3.0 → sessionview-0.3.1}/config/config.json +0 -0
  30. {sessionview-0.3.0 → sessionview-0.3.1}/config/keys.md +0 -0
  31. {sessionview-0.3.0 → sessionview-0.3.1}/config/neomuttrc +0 -0
  32. {sessionview-0.3.0 → sessionview-0.3.1}/lib/client.sh +0 -0
  33. {sessionview-0.3.0 → sessionview-0.3.1}/lib/python.sh +0 -0
  34. {sessionview-0.3.0 → sessionview-0.3.1}/lib/sessionview-config-screen +0 -0
  35. {sessionview-0.3.0 → sessionview-0.3.1}/lib/state.sh +0 -0
  36. {sessionview-0.3.0 → sessionview-0.3.1}/macos/SessionView.applescript +0 -0
  37. {sessionview-0.3.0 → sessionview-0.3.1}/macos/dreamcatcher.icns +0 -0
  38. {sessionview-0.3.0 → sessionview-0.3.1}/plugins/session/plugin.toml +0 -0
  39. {sessionview-0.3.0 → sessionview-0.3.1}/plugins/session/start-agent +0 -0
  40. {sessionview-0.3.0 → sessionview-0.3.1}/plugins/taskmaster/plugin.toml +0 -0
  41. {sessionview-0.3.0 → sessionview-0.3.1}/plugins/taskmaster/tasks-tab +0 -0
  42. {sessionview-0.3.0 → sessionview-0.3.1}/plugins/voicemode/plugin.toml +0 -0
  43. {sessionview-0.3.0 → sessionview-0.3.1}/plugins/voicemode/speak +0 -0
  44. {sessionview-0.3.0 → sessionview-0.3.1}/skills/tmux/SKILL.md +0 -0
  45. {sessionview-0.3.0 → sessionview-0.3.1}/skills/tmux/scripts/tmux-peek +0 -0
  46. {sessionview-0.3.0 → sessionview-0.3.1}/skills/tmux/scripts/tmux-show +0 -0
  47. {sessionview-0.3.0 → sessionview-0.3.1}/skills/tmux/scripts/tmux-type +0 -0
  48. {sessionview-0.3.0 → sessionview-0.3.1}/skills/tmux/scripts/tmux-where +0 -0
  49. {sessionview-0.3.0 → sessionview-0.3.1}/tmux/agent-menu.conf +0 -0
  50. {sessionview-0.3.0 → sessionview-0.3.1}/tmux/tabs-top.conf +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sessionview
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: A sidebar for tmux: your projects (sessions) and your agents, here and on remote hosts.
5
5
  Project-URL: Homepage, https://github.com/sessionkit/sessionview
6
6
  Project-URL: Repository, https://github.com/sessionkit/sessionview
@@ -24,9 +24,13 @@ controller and view for the `session` tools, drawn beside tmux.
24
24
 
25
25
  Install from PyPI: `uv tool install sessionview` (see [Install](#install)).
26
26
 
27
- sessionview [SESSION] # in this terminal: sidebar left, SESSION attached
28
- # right (a private outer tmux holds the two panes)
29
- prefix H # the same sidebar as a popup in any tmux client
27
+ sessionview
28
+
29
+ In this terminal, that puts the sidebar on the left and the session
30
+ `main` on the right; a private outer tmux holds the two panes.
31
+ `sessionview NAME` attaches the session NAME instead, which must exist.
32
+ In any tmux client, `prefix H` opens the same sidebar as a popup.
33
+ Every verb, its form and an example: [the sessionview command](docs/sessionview.md).
30
34
 
31
35
  Read [SPEC.md](SPEC.md) first: what sessionview is, the rules of the view, the
32
36
  contract with `session`, the plugin manifest, config, known limits.
@@ -35,56 +39,13 @@ the spec; this stays comparable and runnable.
35
39
 
36
40
  ## Requirements
37
41
 
38
- Each line is measured against the code, not remembered;
39
- `bin/sessionview-install --check` checks tmux, Python, `session`,
40
- neomutt and notmuch's index on your machine.
41
-
42
- - **Claude Code, and the plugin is the install.** The `sessionview`
43
- wheel is an empty package (one `__init__.py`, no `[project.scripts]`);
44
- everything arrives through the Claude Code plugin (its `bin/` and
45
- `skills/`).
46
- From a clone: `claude plugin marketplace add <path-to-clone>`, then
47
- `claude plugin install sessionview@sessionview`.
48
- - **macOS** for the dock app (`macos/SessionView.applescript`, built by
49
- `osacompile`) and the sidebar's copy action (`pbcopy`). The sidebar and
50
- the frame are plain tmux + Python and should run on Linux, untested.
51
- - **tmux >= 3.7** (measured on 3.7c: `join-pane -l`, `focus-events`,
52
- status ranges). An older tmux satisfies `brew install tmux` silently.
53
- - **Python 3.11 to 3.14**, standard library only (`requires-python` in
54
- `pyproject.toml` is `>=3.11,<3.15`; the sidebar and the config tools).
55
- - **bash**: macOS's 3.2 is enough; sessionview's own bash tools use no
56
- bash-4 construct.
57
- - **sessionmail** (`message` on PATH) for every mail action: the
58
- sidebar's mail, the agent pane menu, and the session, taskmaster and
59
- voicemode plugins (each lists `message` in its `requires`). Mail is
60
- sent as you: `$USER`, unless `sessionview-config set mail_from NAME`
61
- (or `$SESSIONVIEW_FROM`) names your mail name; `sessionview from`
62
- prints the name in effect.
63
- - **neomutt** for the `messages` tab (`bin/sessionview-messages` runs
64
- `neomutt -R`; the tab exits 2 without it): `brew install neomutt`, built
65
- with notmuch (Homebrew's is). Measured on NeoMutt 20260616. The tab's
66
- sidebar (the box, Asks, Asks · threads) also needs **notmuch** with the
67
- `Type` and `Project` headers indexed:
68
- `notmuch config set index.header.Type Type`,
69
- `notmuch config set index.header.Project Project`, then
70
- `notmuch reindex '*'`. Without the index the Asks rows are every mail to
71
- `NAME+ask`; without notmuch the sidebar is hidden and the tab still
72
- opens the one folder.
73
- - **postfix: not needed by sessionview itself.** sessionview never talks
74
- to an MTA; sessionmail's `message send` hands each mail to
75
- `/usr/sbin/sendmail` (or `$SESSIONMAIL_SENDMAIL`) and refuses with
76
- "no MTA" when there is none, so mail needs an MTA that delivers into
77
- sessionmail's maildirs (postfix, for one; see sessionmail's README).
78
- Without one, everything but mail still works.
79
- - optional: **`session`** on PATH for agents (`session list`,
80
- `session start`), from sessiontools: `uv tool install sessiontools`.
81
- Without it the sidebar still lists projects (tmux sessions), but shows
82
- no agent rows and no Start an agent, and so none of the agent menu's
83
- mail items (Message, Continue, Settle, ...: the session plugin
84
- `requires` `session`). `message` itself still works from a shell.
85
- - optional: `tm` (taskmaster menu items) and the voicemode plugin, whose
86
- menu items appear only when installed; ssh with ControlMaster for
87
- remote hosts.
42
+ - [x] macOS (tested on macOS 27, Apple silicon)
43
+ - [ ] Linux
44
+ - [ ] WSL
45
+ - [ ] Windows
46
+
47
+ The direct dependencies and the tools a user meets, what needs each one,
48
+ and how to upgrade it: [dependencies](docs/dependencies.md).
88
49
 
89
50
  ## Features
90
51
 
@@ -174,41 +135,55 @@ hand. Blink Shell on iPad is wanted and not yet connecting.
174
135
  claude-code: short, safe driving skills with tools
175
136
 
176
137
  Paths resolve from the checkout (`SESSIONVIEW_ROOT`); state lives in
177
- `~/.local/state/sessionview` (`SESSIONVIEW_STATE`). Requirements are listed above.
138
+ `~/.local/state/sessionview` (`SESSIONVIEW_STATE`). Its direct dependencies:
139
+ [dependencies](docs/dependencies.md).
178
140
 
179
141
  ## Install
180
142
 
181
143
  From PyPI:
182
144
 
183
145
  uv tool install sessionview
184
- sessionview install # checks every requirement; links nothing
146
+ sessionview install
185
147
 
186
148
  That puts `sessionview`, `sessionview-config`, `sessionview-session` and
187
- `sessionview-messages` on PATH; `sessionview install` then only checks.
149
+ `sessionview-messages` on PATH; `sessionview install` then checks every
150
+ requirement and links nothing.
188
151
 
189
152
  From a checkout:
190
153
 
191
154
  git clone https://github.com/sessionkit/sessionview ~/Code/sessionview
192
- ~/Code/sessionview/bin/sessionview-install # or: make install
155
+ ~/Code/sessionview/bin/sessionview-install
193
156
 
194
- That links the tools into `~/.local/bin` and checks every requirement,
157
+ That links the tools into `~/.local/bin` (`make install` in the checkout
158
+ does the same) and checks every requirement,
195
159
  saying PASS / WARN / MISSING with the fix for each (tmux below 3.7 is
196
160
  the one that bites: an older tmux satisfies `brew install tmux`
197
161
  silently). It installs nothing else and never edits your shell config.
198
162
  `sessionview-install --check` reports without changing anything. Then,
199
163
  in a new terminal: `sessionview`.
200
164
 
165
+ The installer never moves links that already run another checkout (a
166
+ second clone, a git worktree, or `uv tool install`'s commands): it lists
167
+ them, changes nothing and exits 3. `--check` lists the same links as
168
+ WARN lines. Run `bin/sessionview-install --relink` from the checkout you
169
+ want to run, or set `PREFIX=DIR` to install somewhere else. A bare `make`
170
+ only lists the targets; installing is always `make install`.
171
+
172
+ The Claude Code plugin brings sessionview's skills. From a clone:
173
+ `claude plugin marketplace add <path-to-clone>`, then
174
+ `claude plugin install sessionview@sessionview`.
175
+
201
176
  show-me (github.com/mbailey/show-me) is referenced, not bundled.
202
177
 
203
178
  ### Dock app (macOS, optional)
204
179
 
205
- sessionview install --app # or: make app
180
+ sessionview install --app
206
181
 
207
- Builds `SessionView.app` from `macos/SessionView.applescript` and puts
208
- it in `~/Applications`; drag it to the Dock and one click opens
209
- sessionview in your preferred terminal (see Terminals above). It is a
210
- front door, not the product -- `sessionview` in any shell does the same
211
- job.
182
+ That builds `SessionView.app` from `macos/SessionView.applescript` and
183
+ puts it in `~/Applications` (`make app` in a checkout does the same);
184
+ drag it to the Dock and one click opens sessionview in your preferred
185
+ terminal (see Terminals above). It is a front door, not the product --
186
+ `sessionview` in any shell does the same job.
212
187
 
213
188
  On a cold click the app reuses the window Terminal opens for itself at
214
189
  launch, rather than adding a second one. If your Terminal profile runs a
@@ -229,6 +204,139 @@ macOS treats as a different app -- so the Accessibility permission has to
229
204
  be granted again after every rebuild. A stable signing identity would fix
230
205
  that; the app does not have one yet.
231
206
 
207
+ ## What an install changes
208
+
209
+ `uv tool install sessionview` changes two places and fills uv's own
210
+ cache, and it touches no shell startup file and nothing in `~/.claude`.
211
+ `sessionview install` after it checks the requirements and changes
212
+ nothing. Everything else below appears only when you run the verb named
213
+ beside it. Each line says what puts it there and what takes it away.
214
+
215
+ - **PATH:** `~/.local/bin/sessionview`, `sessionview-config`,
216
+ `sessionview-session` and `sessionview-messages`, or in
217
+ `UV_TOOL_BIN_DIR` when that is set. uv says so if the folder is not on
218
+ your PATH, and edits no shell file. `uv tool uninstall` removes them.
219
+ From a checkout instead, `bin/sessionview-install` (or `make install`)
220
+ links the checkout's `bin/sessionview*` tools and `tmux-sidebar` into
221
+ `~/.local/bin`, or into `PREFIX/bin` when `PREFIX` is set, and makes
222
+ nothing else. [Uninstall](#uninstall) has the line that deletes them.
223
+ - **The program:** `~/.local/share/uv/tools/sessionview/`, its own
224
+ Python environment, or in `UV_TOOL_DIR`. sessionview has no Python
225
+ dependencies: the environment holds sessionview and the files it ships
226
+ (its tools, the tmux confs, the sidebar's plugins and the Dock app's
227
+ source). `uv tool uninstall` removes it. If uv finds no Python 3.11 or
228
+ newer, it downloads one into its own folder (`uv python dir`,
229
+ `~/.local/share/uv/python/` by default). `uv tool uninstall` leaves
230
+ that Python; `uv python uninstall` removes it.
231
+ - **uv's cache:** the install fills it with what it downloaded and
232
+ built. It is uv's, shared by everything uv installs, not sessionview's.
233
+ `uv cache dir` prints where it is (`~/.cache/uv` by default, or
234
+ `UV_CACHE_DIR`). `uv tool uninstall` leaves it; `uv cache clean
235
+ sessionview` drops this package's entries, and `uv cache prune` drops
236
+ the ones nothing uses.
237
+ - **Folders, each made by a verb you run:**
238
+ - `~/.local/state/sessionview/`: the state folder, made the first time
239
+ `sessionview` opens (or `sessionview session` or `sessionview
240
+ messages` runs). `SESSIONVIEW_STATE` moves it. An older release's
241
+ `~/.local/state/herd/` is renamed to it then, when only the old
242
+ one exists. In it:
243
+ - `frame-PID.tty`, one while each frame is open. The frame deletes
244
+ it when it closes; a frame killed outright can leave it behind.
245
+ - `sessionview.log`, the log ([Logs](#logs)).
246
+ - `recent.tsv`, a line each time `sessionview session` opens a
247
+ project, for the picker's order.
248
+ - `picker-order`, when you flip the picker's sort.
249
+ - `sidebar-mail.txt`, the last message typed at the sidebar's
250
+ message prompt.
251
+ - `plugin-PLUGIN-ACTION.txt`, the text a plugin's menu item last
252
+ sent (the session plugin's Message or Continue, say), one for
253
+ each item you have used.
254
+ - `sidebar-remote-HOST.json`, what the sidebar last saw from each
255
+ host in your `remotes` setting.
256
+ - `mutt/`, an rc file for each box `sessionview messages` opens.
257
+ - `~/Applications/SessionView.app`: `sessionview install --app` (or
258
+ `make app` in a checkout), or in `DEST` when that is set. It is
259
+ built in a temporary folder that is deleted after, and a rebuild
260
+ replaces it.
261
+ - **Services (launchd agents):** none. sessionview runs no daemon and
262
+ writes nothing in `~/Library/LaunchAgents/`. While a frame is open it
263
+ runs a tmux server of its own, `sessionview-frame`, beside yours; the
264
+ server exits when the last frame closes.
265
+ - **Plugin and skills, optional:** `claude plugin marketplace add` and
266
+ `claude plugin install` ([Install](#install)). Claude Code names the
267
+ marketplace and the plugin in `~/.claude/settings.json`
268
+ (`extraKnownMarketplaces`, `enabledPlugins`), lists them in
269
+ `~/.claude/plugins/`, and keeps a copy in
270
+ `~/.claude/plugins/cache/sessionview/`. The plugin brings five skills
271
+ (`sessionview`, `tmux`, `lazygit`, `neovim`, `claude-code`) and no
272
+ hooks. Uninstalling the plugin takes it out of the settings and leaves
273
+ the cached copy.
274
+ The sidebar's own plugins (`plugins/`: session, taskmaster, voicemode)
275
+ ship inside the program and install nothing. `SESSIONVIEW_PLUGINS`
276
+ names a folder of your own.
277
+ - **Settings:** the install writes none.
278
+ `~/.sessionkit/view/settings/view.json` is made from the shipped
279
+ template the first time anything reads your settings: `sessionview`,
280
+ or a `sessionview-config` verb such as `get` (`path` only prints it).
281
+ `sessionview-config set` writes it. `SESSIONVIEW_CONFIG` names another
282
+ file instead. `~/.sessionkit/view/settings/neomuttrc` is there only if
283
+ you write it.
284
+ - **Your tmux server, while it runs:** a frame binds keys on the tmux
285
+ server it attaches to: `prefix H` (the sidebar as a popup) and three
286
+ mouse bindings on the status line (`MouseDown1Status`,
287
+ `MouseDown1StatusRight`, `MouseDrag1Status`). It gives each session it
288
+ opens the sessionview look, with options set on that session only.
289
+ With `pane_menu` on, it also binds a right-click in a pane
290
+ (`MouseDown3Pane`), in place of yours, and sets two global
291
+ `@sessionview_agent_menu_` options. Nothing is written to
292
+ `~/.tmux.conf`: these last until that tmux server exits.
293
+ - **Outside these folders, only on a verb:** with `fullscreen` on, the
294
+ Dock app on Terminal.app needs the Accessibility permission you grant
295
+ in System Settings, and macOS keeps it there until you turn it off.
296
+ *Start an agent* runs `session start`, and a message from the menu is
297
+ sent with `message`: what those make is in sessiontools' and
298
+ sessionmail's own lists. The `editor` tab, when it runs neovim,
299
+ listens on a socket in `$TMPDIR` while it runs. With no `TMPDIR`, the
300
+ socket goes in `XDG_RUNTIME_DIR`, or in `~/.local/run`, which is made
301
+ then and stays.
302
+
303
+ ## Uninstall
304
+
305
+ Close every sessionview frame first. Then remove the plugin, if you
306
+ installed it, and the command. Skip the lines for what you never
307
+ installed:
308
+
309
+ ```console
310
+ claude plugin uninstall sessionview@sessionview
311
+ claude plugin marketplace remove sessionview
312
+ uv tool uninstall sessionview
313
+ ```
314
+
315
+ Installed from a checkout instead, delete the links it made, and the
316
+ checkout if you want it gone:
317
+
318
+ ```console
319
+ rm ~/.local/bin/sessionview ~/.local/bin/sessionview-* ~/.local/bin/tmux-sidebar
320
+ ```
321
+
322
+ That leaves what the verbs made, listed above. The Dock app, the
323
+ plugin's cached copy and the state folder are sessionview's alone. To
324
+ delete them:
325
+
326
+ ```bash
327
+ rm -rf "${HOME:?}/Applications/SessionView.app"
328
+ rm -rf "${HOME:?}/.claude/plugins/cache/sessionview"
329
+ rm -rf "${HOME:?}/.local/state/sessionview"
330
+ ```
331
+
332
+ uv's cache stays too, with the other things uv installed; `uv cache
333
+ clean sessionview` drops this package's entries. The key bindings go
334
+ when your tmux server next exits.
335
+
336
+ The rest is your data: delete it by hand only if you want it gone.
337
+ `~/.sessionkit/view/` holds your settings, and the kit's other packages
338
+ keep theirs beside it in `~/.sessionkit/`.
339
+
232
340
  ## Keys and clicks
233
341
 
234
342
  - sidebar: click a project or seat → go there; right-click, or the `⋯`
@@ -270,7 +378,8 @@ The look follows herdr's; its colours were matched from herdr's own window.
270
378
  optional, read after the shipped `config/neomuttrc`.
271
379
  - **Plugins:** `plugins/<name>/plugin.toml` in the checkout.
272
380
  - **Environment:** `SESSIONVIEW_CONFIG` (another file for yours),
273
- `SESSIONVIEW_FROM` (the name mail is sent as), `SESSIONVIEW_STATE`
381
+ `SESSIONVIEW_FROM` (the name mail is sent as, else `mail_from`, else
382
+ `$USER`; `sessionview from` prints the name in effect), `SESSIONVIEW_STATE`
274
383
  (state, default `~/.local/state/sessionview`), `SESSIONVIEW_PLUGINS`
275
384
  (another plugin directory).
276
385
  - sessionview does not read the kit's settings cascade today, only these.
@@ -7,9 +7,13 @@ controller and view for the `session` tools, drawn beside tmux.
7
7
 
8
8
  Install from PyPI: `uv tool install sessionview` (see [Install](#install)).
9
9
 
10
- sessionview [SESSION] # in this terminal: sidebar left, SESSION attached
11
- # right (a private outer tmux holds the two panes)
12
- prefix H # the same sidebar as a popup in any tmux client
10
+ sessionview
11
+
12
+ In this terminal, that puts the sidebar on the left and the session
13
+ `main` on the right; a private outer tmux holds the two panes.
14
+ `sessionview NAME` attaches the session NAME instead, which must exist.
15
+ In any tmux client, `prefix H` opens the same sidebar as a popup.
16
+ Every verb, its form and an example: [the sessionview command](docs/sessionview.md).
13
17
 
14
18
  Read [SPEC.md](SPEC.md) first: what sessionview is, the rules of the view, the
15
19
  contract with `session`, the plugin manifest, config, known limits.
@@ -18,56 +22,13 @@ the spec; this stays comparable and runnable.
18
22
 
19
23
  ## Requirements
20
24
 
21
- Each line is measured against the code, not remembered;
22
- `bin/sessionview-install --check` checks tmux, Python, `session`,
23
- neomutt and notmuch's index on your machine.
24
-
25
- - **Claude Code, and the plugin is the install.** The `sessionview`
26
- wheel is an empty package (one `__init__.py`, no `[project.scripts]`);
27
- everything arrives through the Claude Code plugin (its `bin/` and
28
- `skills/`).
29
- From a clone: `claude plugin marketplace add <path-to-clone>`, then
30
- `claude plugin install sessionview@sessionview`.
31
- - **macOS** for the dock app (`macos/SessionView.applescript`, built by
32
- `osacompile`) and the sidebar's copy action (`pbcopy`). The sidebar and
33
- the frame are plain tmux + Python and should run on Linux, untested.
34
- - **tmux >= 3.7** (measured on 3.7c: `join-pane -l`, `focus-events`,
35
- status ranges). An older tmux satisfies `brew install tmux` silently.
36
- - **Python 3.11 to 3.14**, standard library only (`requires-python` in
37
- `pyproject.toml` is `>=3.11,<3.15`; the sidebar and the config tools).
38
- - **bash**: macOS's 3.2 is enough; sessionview's own bash tools use no
39
- bash-4 construct.
40
- - **sessionmail** (`message` on PATH) for every mail action: the
41
- sidebar's mail, the agent pane menu, and the session, taskmaster and
42
- voicemode plugins (each lists `message` in its `requires`). Mail is
43
- sent as you: `$USER`, unless `sessionview-config set mail_from NAME`
44
- (or `$SESSIONVIEW_FROM`) names your mail name; `sessionview from`
45
- prints the name in effect.
46
- - **neomutt** for the `messages` tab (`bin/sessionview-messages` runs
47
- `neomutt -R`; the tab exits 2 without it): `brew install neomutt`, built
48
- with notmuch (Homebrew's is). Measured on NeoMutt 20260616. The tab's
49
- sidebar (the box, Asks, Asks · threads) also needs **notmuch** with the
50
- `Type` and `Project` headers indexed:
51
- `notmuch config set index.header.Type Type`,
52
- `notmuch config set index.header.Project Project`, then
53
- `notmuch reindex '*'`. Without the index the Asks rows are every mail to
54
- `NAME+ask`; without notmuch the sidebar is hidden and the tab still
55
- opens the one folder.
56
- - **postfix: not needed by sessionview itself.** sessionview never talks
57
- to an MTA; sessionmail's `message send` hands each mail to
58
- `/usr/sbin/sendmail` (or `$SESSIONMAIL_SENDMAIL`) and refuses with
59
- "no MTA" when there is none, so mail needs an MTA that delivers into
60
- sessionmail's maildirs (postfix, for one; see sessionmail's README).
61
- Without one, everything but mail still works.
62
- - optional: **`session`** on PATH for agents (`session list`,
63
- `session start`), from sessiontools: `uv tool install sessiontools`.
64
- Without it the sidebar still lists projects (tmux sessions), but shows
65
- no agent rows and no Start an agent, and so none of the agent menu's
66
- mail items (Message, Continue, Settle, ...: the session plugin
67
- `requires` `session`). `message` itself still works from a shell.
68
- - optional: `tm` (taskmaster menu items) and the voicemode plugin, whose
69
- menu items appear only when installed; ssh with ControlMaster for
70
- remote hosts.
25
+ - [x] macOS (tested on macOS 27, Apple silicon)
26
+ - [ ] Linux
27
+ - [ ] WSL
28
+ - [ ] Windows
29
+
30
+ The direct dependencies and the tools a user meets, what needs each one,
31
+ and how to upgrade it: [dependencies](docs/dependencies.md).
71
32
 
72
33
  ## Features
73
34
 
@@ -157,41 +118,55 @@ hand. Blink Shell on iPad is wanted and not yet connecting.
157
118
  claude-code: short, safe driving skills with tools
158
119
 
159
120
  Paths resolve from the checkout (`SESSIONVIEW_ROOT`); state lives in
160
- `~/.local/state/sessionview` (`SESSIONVIEW_STATE`). Requirements are listed above.
121
+ `~/.local/state/sessionview` (`SESSIONVIEW_STATE`). Its direct dependencies:
122
+ [dependencies](docs/dependencies.md).
161
123
 
162
124
  ## Install
163
125
 
164
126
  From PyPI:
165
127
 
166
128
  uv tool install sessionview
167
- sessionview install # checks every requirement; links nothing
129
+ sessionview install
168
130
 
169
131
  That puts `sessionview`, `sessionview-config`, `sessionview-session` and
170
- `sessionview-messages` on PATH; `sessionview install` then only checks.
132
+ `sessionview-messages` on PATH; `sessionview install` then checks every
133
+ requirement and links nothing.
171
134
 
172
135
  From a checkout:
173
136
 
174
137
  git clone https://github.com/sessionkit/sessionview ~/Code/sessionview
175
- ~/Code/sessionview/bin/sessionview-install # or: make install
138
+ ~/Code/sessionview/bin/sessionview-install
176
139
 
177
- That links the tools into `~/.local/bin` and checks every requirement,
140
+ That links the tools into `~/.local/bin` (`make install` in the checkout
141
+ does the same) and checks every requirement,
178
142
  saying PASS / WARN / MISSING with the fix for each (tmux below 3.7 is
179
143
  the one that bites: an older tmux satisfies `brew install tmux`
180
144
  silently). It installs nothing else and never edits your shell config.
181
145
  `sessionview-install --check` reports without changing anything. Then,
182
146
  in a new terminal: `sessionview`.
183
147
 
148
+ The installer never moves links that already run another checkout (a
149
+ second clone, a git worktree, or `uv tool install`'s commands): it lists
150
+ them, changes nothing and exits 3. `--check` lists the same links as
151
+ WARN lines. Run `bin/sessionview-install --relink` from the checkout you
152
+ want to run, or set `PREFIX=DIR` to install somewhere else. A bare `make`
153
+ only lists the targets; installing is always `make install`.
154
+
155
+ The Claude Code plugin brings sessionview's skills. From a clone:
156
+ `claude plugin marketplace add <path-to-clone>`, then
157
+ `claude plugin install sessionview@sessionview`.
158
+
184
159
  show-me (github.com/mbailey/show-me) is referenced, not bundled.
185
160
 
186
161
  ### Dock app (macOS, optional)
187
162
 
188
- sessionview install --app # or: make app
163
+ sessionview install --app
189
164
 
190
- Builds `SessionView.app` from `macos/SessionView.applescript` and puts
191
- it in `~/Applications`; drag it to the Dock and one click opens
192
- sessionview in your preferred terminal (see Terminals above). It is a
193
- front door, not the product -- `sessionview` in any shell does the same
194
- job.
165
+ That builds `SessionView.app` from `macos/SessionView.applescript` and
166
+ puts it in `~/Applications` (`make app` in a checkout does the same);
167
+ drag it to the Dock and one click opens sessionview in your preferred
168
+ terminal (see Terminals above). It is a front door, not the product --
169
+ `sessionview` in any shell does the same job.
195
170
 
196
171
  On a cold click the app reuses the window Terminal opens for itself at
197
172
  launch, rather than adding a second one. If your Terminal profile runs a
@@ -212,6 +187,139 @@ macOS treats as a different app -- so the Accessibility permission has to
212
187
  be granted again after every rebuild. A stable signing identity would fix
213
188
  that; the app does not have one yet.
214
189
 
190
+ ## What an install changes
191
+
192
+ `uv tool install sessionview` changes two places and fills uv's own
193
+ cache, and it touches no shell startup file and nothing in `~/.claude`.
194
+ `sessionview install` after it checks the requirements and changes
195
+ nothing. Everything else below appears only when you run the verb named
196
+ beside it. Each line says what puts it there and what takes it away.
197
+
198
+ - **PATH:** `~/.local/bin/sessionview`, `sessionview-config`,
199
+ `sessionview-session` and `sessionview-messages`, or in
200
+ `UV_TOOL_BIN_DIR` when that is set. uv says so if the folder is not on
201
+ your PATH, and edits no shell file. `uv tool uninstall` removes them.
202
+ From a checkout instead, `bin/sessionview-install` (or `make install`)
203
+ links the checkout's `bin/sessionview*` tools and `tmux-sidebar` into
204
+ `~/.local/bin`, or into `PREFIX/bin` when `PREFIX` is set, and makes
205
+ nothing else. [Uninstall](#uninstall) has the line that deletes them.
206
+ - **The program:** `~/.local/share/uv/tools/sessionview/`, its own
207
+ Python environment, or in `UV_TOOL_DIR`. sessionview has no Python
208
+ dependencies: the environment holds sessionview and the files it ships
209
+ (its tools, the tmux confs, the sidebar's plugins and the Dock app's
210
+ source). `uv tool uninstall` removes it. If uv finds no Python 3.11 or
211
+ newer, it downloads one into its own folder (`uv python dir`,
212
+ `~/.local/share/uv/python/` by default). `uv tool uninstall` leaves
213
+ that Python; `uv python uninstall` removes it.
214
+ - **uv's cache:** the install fills it with what it downloaded and
215
+ built. It is uv's, shared by everything uv installs, not sessionview's.
216
+ `uv cache dir` prints where it is (`~/.cache/uv` by default, or
217
+ `UV_CACHE_DIR`). `uv tool uninstall` leaves it; `uv cache clean
218
+ sessionview` drops this package's entries, and `uv cache prune` drops
219
+ the ones nothing uses.
220
+ - **Folders, each made by a verb you run:**
221
+ - `~/.local/state/sessionview/`: the state folder, made the first time
222
+ `sessionview` opens (or `sessionview session` or `sessionview
223
+ messages` runs). `SESSIONVIEW_STATE` moves it. An older release's
224
+ `~/.local/state/herd/` is renamed to it then, when only the old
225
+ one exists. In it:
226
+ - `frame-PID.tty`, one while each frame is open. The frame deletes
227
+ it when it closes; a frame killed outright can leave it behind.
228
+ - `sessionview.log`, the log ([Logs](#logs)).
229
+ - `recent.tsv`, a line each time `sessionview session` opens a
230
+ project, for the picker's order.
231
+ - `picker-order`, when you flip the picker's sort.
232
+ - `sidebar-mail.txt`, the last message typed at the sidebar's
233
+ message prompt.
234
+ - `plugin-PLUGIN-ACTION.txt`, the text a plugin's menu item last
235
+ sent (the session plugin's Message or Continue, say), one for
236
+ each item you have used.
237
+ - `sidebar-remote-HOST.json`, what the sidebar last saw from each
238
+ host in your `remotes` setting.
239
+ - `mutt/`, an rc file for each box `sessionview messages` opens.
240
+ - `~/Applications/SessionView.app`: `sessionview install --app` (or
241
+ `make app` in a checkout), or in `DEST` when that is set. It is
242
+ built in a temporary folder that is deleted after, and a rebuild
243
+ replaces it.
244
+ - **Services (launchd agents):** none. sessionview runs no daemon and
245
+ writes nothing in `~/Library/LaunchAgents/`. While a frame is open it
246
+ runs a tmux server of its own, `sessionview-frame`, beside yours; the
247
+ server exits when the last frame closes.
248
+ - **Plugin and skills, optional:** `claude plugin marketplace add` and
249
+ `claude plugin install` ([Install](#install)). Claude Code names the
250
+ marketplace and the plugin in `~/.claude/settings.json`
251
+ (`extraKnownMarketplaces`, `enabledPlugins`), lists them in
252
+ `~/.claude/plugins/`, and keeps a copy in
253
+ `~/.claude/plugins/cache/sessionview/`. The plugin brings five skills
254
+ (`sessionview`, `tmux`, `lazygit`, `neovim`, `claude-code`) and no
255
+ hooks. Uninstalling the plugin takes it out of the settings and leaves
256
+ the cached copy.
257
+ The sidebar's own plugins (`plugins/`: session, taskmaster, voicemode)
258
+ ship inside the program and install nothing. `SESSIONVIEW_PLUGINS`
259
+ names a folder of your own.
260
+ - **Settings:** the install writes none.
261
+ `~/.sessionkit/view/settings/view.json` is made from the shipped
262
+ template the first time anything reads your settings: `sessionview`,
263
+ or a `sessionview-config` verb such as `get` (`path` only prints it).
264
+ `sessionview-config set` writes it. `SESSIONVIEW_CONFIG` names another
265
+ file instead. `~/.sessionkit/view/settings/neomuttrc` is there only if
266
+ you write it.
267
+ - **Your tmux server, while it runs:** a frame binds keys on the tmux
268
+ server it attaches to: `prefix H` (the sidebar as a popup) and three
269
+ mouse bindings on the status line (`MouseDown1Status`,
270
+ `MouseDown1StatusRight`, `MouseDrag1Status`). It gives each session it
271
+ opens the sessionview look, with options set on that session only.
272
+ With `pane_menu` on, it also binds a right-click in a pane
273
+ (`MouseDown3Pane`), in place of yours, and sets two global
274
+ `@sessionview_agent_menu_` options. Nothing is written to
275
+ `~/.tmux.conf`: these last until that tmux server exits.
276
+ - **Outside these folders, only on a verb:** with `fullscreen` on, the
277
+ Dock app on Terminal.app needs the Accessibility permission you grant
278
+ in System Settings, and macOS keeps it there until you turn it off.
279
+ *Start an agent* runs `session start`, and a message from the menu is
280
+ sent with `message`: what those make is in sessiontools' and
281
+ sessionmail's own lists. The `editor` tab, when it runs neovim,
282
+ listens on a socket in `$TMPDIR` while it runs. With no `TMPDIR`, the
283
+ socket goes in `XDG_RUNTIME_DIR`, or in `~/.local/run`, which is made
284
+ then and stays.
285
+
286
+ ## Uninstall
287
+
288
+ Close every sessionview frame first. Then remove the plugin, if you
289
+ installed it, and the command. Skip the lines for what you never
290
+ installed:
291
+
292
+ ```console
293
+ claude plugin uninstall sessionview@sessionview
294
+ claude plugin marketplace remove sessionview
295
+ uv tool uninstall sessionview
296
+ ```
297
+
298
+ Installed from a checkout instead, delete the links it made, and the
299
+ checkout if you want it gone:
300
+
301
+ ```console
302
+ rm ~/.local/bin/sessionview ~/.local/bin/sessionview-* ~/.local/bin/tmux-sidebar
303
+ ```
304
+
305
+ That leaves what the verbs made, listed above. The Dock app, the
306
+ plugin's cached copy and the state folder are sessionview's alone. To
307
+ delete them:
308
+
309
+ ```bash
310
+ rm -rf "${HOME:?}/Applications/SessionView.app"
311
+ rm -rf "${HOME:?}/.claude/plugins/cache/sessionview"
312
+ rm -rf "${HOME:?}/.local/state/sessionview"
313
+ ```
314
+
315
+ uv's cache stays too, with the other things uv installed; `uv cache
316
+ clean sessionview` drops this package's entries. The key bindings go
317
+ when your tmux server next exits.
318
+
319
+ The rest is your data: delete it by hand only if you want it gone.
320
+ `~/.sessionkit/view/` holds your settings, and the kit's other packages
321
+ keep theirs beside it in `~/.sessionkit/`.
322
+
215
323
  ## Keys and clicks
216
324
 
217
325
  - sidebar: click a project or seat → go there; right-click, or the `⋯`
@@ -253,7 +361,8 @@ The look follows herdr's; its colours were matched from herdr's own window.
253
361
  optional, read after the shipped `config/neomuttrc`.
254
362
  - **Plugins:** `plugins/<name>/plugin.toml` in the checkout.
255
363
  - **Environment:** `SESSIONVIEW_CONFIG` (another file for yours),
256
- `SESSIONVIEW_FROM` (the name mail is sent as), `SESSIONVIEW_STATE`
364
+ `SESSIONVIEW_FROM` (the name mail is sent as, else `mail_from`, else
365
+ `$USER`; `sessionview from` prints the name in effect), `SESSIONVIEW_STATE`
257
366
  (state, default `~/.local/state/sessionview`), `SESSIONVIEW_PLUGINS`
258
367
  (another plugin directory).
259
368
  - sessionview does not read the kit's settings cascade today, only these.