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.
- {sessionview-0.3.0 → sessionview-0.3.1}/PKG-INFO +175 -66
- {sessionview-0.3.0 → sessionview-0.3.1}/README.md +174 -65
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview +45 -6
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-app-install +9 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-autostart +25 -1
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-config +68 -14
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-frame +41 -13
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-from +5 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-install +85 -4
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-messages +25 -2
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-newtab +21 -4
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-send +10 -2
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-session +15 -4
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-sidebar-toggle +11 -5
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-terminal +8 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/sessionview-usermail +9 -6
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/tmux-send-agent +14 -4
- {sessionview-0.3.0 → sessionview-0.3.1}/bin/tmux-sidebar +65 -14
- sessionview-0.3.1/docs/configuration.md +183 -0
- sessionview-0.3.1/docs/dependencies.md +161 -0
- sessionview-0.3.1/docs/sessionview.md +92 -0
- sessionview-0.3.1/docs/settings.md +133 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/pyproject.toml +8 -2
- {sessionview-0.3.0 → sessionview-0.3.1}/src/sessionview/__init__.py +1 -1
- {sessionview-0.3.0 → sessionview-0.3.1}/tmux/frame.conf +4 -1
- {sessionview-0.3.0 → sessionview-0.3.1}/.gitignore +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/LICENSE +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/config/README.md +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/config/config.json +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/config/keys.md +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/config/neomuttrc +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/lib/client.sh +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/lib/python.sh +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/lib/sessionview-config-screen +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/lib/state.sh +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/macos/SessionView.applescript +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/macos/dreamcatcher.icns +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/plugins/session/plugin.toml +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/plugins/session/start-agent +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/plugins/taskmaster/plugin.toml +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/plugins/taskmaster/tasks-tab +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/plugins/voicemode/plugin.toml +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/plugins/voicemode/speak +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/skills/tmux/SKILL.md +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/skills/tmux/scripts/tmux-peek +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/skills/tmux/scripts/tmux-show +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/skills/tmux/scripts/tmux-type +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/skills/tmux/scripts/tmux-where +0 -0
- {sessionview-0.3.0 → sessionview-0.3.1}/tmux/agent-menu.conf +0 -0
- {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.
|
|
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
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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`).
|
|
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
|
|
146
|
+
sessionview install
|
|
185
147
|
|
|
186
148
|
That puts `sessionview`, `sessionview-config`, `sessionview-session` and
|
|
187
|
-
`sessionview-messages` on PATH; `sessionview install` then
|
|
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
|
|
155
|
+
~/Code/sessionview/bin/sessionview-install
|
|
193
156
|
|
|
194
|
-
That links the tools into `~/.local/bin`
|
|
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
|
|
180
|
+
sessionview install --app
|
|
206
181
|
|
|
207
|
-
|
|
208
|
-
it in `~/Applications
|
|
209
|
-
|
|
210
|
-
front door, not the product --
|
|
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
|
|
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
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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`).
|
|
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
|
|
129
|
+
sessionview install
|
|
168
130
|
|
|
169
131
|
That puts `sessionview`, `sessionview-config`, `sessionview-session` and
|
|
170
|
-
`sessionview-messages` on PATH; `sessionview install` then
|
|
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
|
|
138
|
+
~/Code/sessionview/bin/sessionview-install
|
|
176
139
|
|
|
177
|
-
That links the tools into `~/.local/bin`
|
|
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
|
|
163
|
+
sessionview install --app
|
|
189
164
|
|
|
190
|
-
|
|
191
|
-
it in `~/Applications
|
|
192
|
-
|
|
193
|
-
front door, not the product --
|
|
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
|
|
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.
|