sessionview 0.1.0__tar.gz → 0.2.0__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 (47) hide show
  1. sessionview-0.1.0/README.md → sessionview-0.2.0/PKG-INFO +109 -39
  2. sessionview-0.1.0/PKG-INFO → sessionview-0.2.0/README.md +92 -51
  3. sessionview-0.2.0/bin/sessionview +47 -0
  4. sessionview-0.2.0/bin/sessionview-app-install +75 -0
  5. sessionview-0.2.0/bin/sessionview-autostart +281 -0
  6. sessionview-0.2.0/bin/sessionview-config +422 -0
  7. sessionview-0.2.0/bin/sessionview-frame +174 -0
  8. sessionview-0.2.0/bin/sessionview-from +37 -0
  9. sessionview-0.2.0/bin/sessionview-install +114 -0
  10. sessionview-0.2.0/bin/sessionview-messages +106 -0
  11. sessionview-0.2.0/bin/sessionview-newtab +67 -0
  12. sessionview-0.2.0/bin/sessionview-send +29 -0
  13. sessionview-0.2.0/bin/sessionview-session +445 -0
  14. sessionview-0.2.0/bin/sessionview-sidebar-toggle +71 -0
  15. sessionview-0.2.0/bin/sessionview-terminal +45 -0
  16. sessionview-0.2.0/bin/sessionview-usermail +85 -0
  17. sessionview-0.2.0/bin/tmux-send-agent +74 -0
  18. sessionview-0.2.0/bin/tmux-sidebar +3354 -0
  19. {sessionview-0.1.0 → sessionview-0.2.0}/config/README.md +82 -65
  20. sessionview-0.2.0/config/config.json +178 -0
  21. sessionview-0.2.0/config/keys.md +91 -0
  22. sessionview-0.2.0/config/neomuttrc +52 -0
  23. sessionview-0.2.0/lib/python.sh +41 -0
  24. sessionview-0.2.0/lib/sessionview-config-screen +201 -0
  25. sessionview-0.2.0/lib/state.sh +13 -0
  26. sessionview-0.2.0/macos/SessionView.applescript +218 -0
  27. sessionview-0.2.0/macos/dreamcatcher.icns +0 -0
  28. sessionview-0.2.0/plugins/session/plugin.toml +71 -0
  29. sessionview-0.2.0/plugins/session/start-agent +67 -0
  30. sessionview-0.2.0/plugins/taskmaster/plugin.toml +61 -0
  31. sessionview-0.2.0/plugins/taskmaster/tasks-tab +9 -0
  32. sessionview-0.2.0/plugins/voicemode/plugin.toml +18 -0
  33. sessionview-0.2.0/plugins/voicemode/speak +11 -0
  34. sessionview-0.2.0/pyproject.toml +50 -0
  35. sessionview-0.2.0/skills/tmux/SKILL.md +50 -0
  36. sessionview-0.2.0/skills/tmux/scripts/tmux-peek +8 -0
  37. sessionview-0.2.0/skills/tmux/scripts/tmux-show +19 -0
  38. sessionview-0.2.0/skills/tmux/scripts/tmux-type +28 -0
  39. sessionview-0.2.0/skills/tmux/scripts/tmux-where +16 -0
  40. sessionview-0.2.0/src/sessionview/__init__.py +26 -0
  41. sessionview-0.2.0/tmux/agent-menu.conf +33 -0
  42. sessionview-0.2.0/tmux/frame.conf +74 -0
  43. sessionview-0.2.0/tmux/tabs-top.conf +35 -0
  44. sessionview-0.1.0/pyproject.toml +0 -27
  45. sessionview-0.1.0/src/sessionview/__init__.py +0 -3
  46. {sessionview-0.1.0 → sessionview-0.2.0}/.gitignore +0 -0
  47. {sessionview-0.1.0 → sessionview-0.2.0}/LICENSE +0 -0
@@ -1,29 +1,43 @@
1
- # Herd
1
+ Metadata-Version: 2.5
2
+ Name: sessionview
3
+ Version: 0.2.0
4
+ Summary: A sidebar for tmux: your projects (sessions) and your agents, here and on remote hosts.
5
+ Project-URL: Homepage, https://github.com/sessionkit/sessionview
6
+ Project-URL: Repository, https://github.com/sessionkit/sessionview
7
+ Author-email: Mike Bailey <mike@sessionkit.ai>
8
+ License-Expression: AGPL-3.0-or-later
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Environment :: Console
12
+ Classifier: Operating System :: MacOS
13
+ Classifier: Operating System :: POSIX :: Linux
14
+ Classifier: Topic :: Terminals :: Terminal Emulators/X Terminals
15
+ Requires-Python: <3.15,>=3.11
16
+ Description-Content-Type: text/markdown
17
+
18
+ # sessionview
2
19
 
3
20
  A sidebar for tmux, in the spirit of herdr: your projects (tmux sessions)
4
21
  and your agents (seats), here and on remote hosts, one click away, with a
5
22
  right-click menu built from what is installed. Session's TUI — a
6
23
  controller and view for the `session` tools, drawn beside tmux.
7
24
 
8
- `sessionview` 0.0.1 on PyPI reserves the name; the tool follows (Mike, approved by mail 00:25 Thu 2026-09-10).
9
-
25
+ Install from PyPI: `uv tool install sessionview` (see [Install](#install)).
10
26
 
11
27
  sessionview [SESSION] # in this terminal: sidebar left, SESSION attached
12
28
  # right (a private outer tmux holds the two panes)
13
29
  prefix H # the same sidebar as a popup in any tmux client
14
30
 
15
- Read [SPEC.md](SPEC.md) first: what Herd is, the rules of the view, the
16
- contract with `session`, the plugin manifest, config, measured limits.
17
- This repo is the **reference implementation** (Mike, 18:23 Sun
18
- 2026-09-06: "a working reference implementation ... it can be a life
19
- raft") — session integrates from the spec; this stays comparable and
20
- runnable.
31
+ Read [SPEC.md](SPEC.md) first: what sessionview is, the rules of the view, the
32
+ contract with `session`, the plugin manifest, config, known limits.
33
+ This repo is the **reference implementation**: session integrates from
34
+ the spec; this stays comparable and runnable.
21
35
 
22
36
  ## Requirements
23
37
 
24
38
  Each line is measured against the code, not remembered;
25
- `bin/sessionview-install --check` checks tmux, Python and `session`
26
- on your machine.
39
+ `bin/sessionview-install --check` checks tmux, Python, `session`,
40
+ neomutt and notmuch's index on your machine.
27
41
 
28
42
  - **Claude Code, and the plugin is the install.** The `sessionview`
29
43
  wheel is an empty package (one `__init__.py`, no `[project.scripts]`);
@@ -36,13 +50,26 @@ on your machine.
36
50
  the frame are plain tmux + Python and should run on Linux, untested.
37
51
  - **tmux >= 3.7** (measured on 3.7c: `join-pane -l`, `focus-events`,
38
52
  status ranges). An older tmux satisfies `brew install tmux` silently.
39
- - **Python >= 3.11**, standard library only (`requires-python` in
40
- `pyproject.toml`; the sidebar and the config tools).
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).
41
55
  - **bash**: macOS's 3.2 is enough; sessionview's own bash tools use no
42
56
  bash-4 construct.
43
57
  - **sessionmail** (`message` on PATH) for every mail action: the
44
58
  sidebar's mail, the agent pane menu, and the session, taskmaster and
45
- voicemode plugins (each lists `message` in its `requires`).
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.
46
73
  - **postfix: not needed by sessionview itself.** sessionview never talks
47
74
  to an MTA; sessionmail's `message send` hands each mail to
48
75
  `/usr/sbin/sendmail` (or `$SESSIONMAIL_SENDMAIL`) and refuses with
@@ -61,12 +88,7 @@ on your machine.
61
88
 
62
89
  ## Features
63
90
 
64
- Grouped by component, named in the terms a comparison matrix would use,
65
- so we can still describe them once we are used to them (Mike, voice
66
- 13:40 + 13:46 Sat 2026-09-12: "we'll just get used to them, and then
67
- we'll have trouble describing them ... group the sidebar and have them
68
- as properties of the sidebar"). Agents maintain this list; it is not
69
- finger memory.
91
+ Grouped by component, named in the terms a comparison matrix would use.
70
92
 
71
93
  **Sidebar** — projects (tmux sessions) above, agents (seats) below.
72
94
 
@@ -83,7 +105,7 @@ finger memory.
83
105
  control master you already hold. The sidebar never opens a connection
84
106
  of its own, so a hardware key is never asked for a touch by a redraw.
85
107
 
86
- **Menus**
108
+ ### Menus
87
109
 
88
110
  - *Overflow menu* — three dots `⋯` at the right of the selected session
89
111
  open its menu (rename, new tab, config, settings, start an agent,
@@ -101,7 +123,7 @@ listed, typing narrows, enter opens the highlighted one or a plain tab
101
123
  of the name you typed. The same picker starts an agent (the `+` under
102
124
  agents, or the menu): the names `session start` knows, pinned ones first.
103
125
 
104
- **Agents**
126
+ ### Agents
105
127
 
106
128
  - *Start an agent* — `+` under the agents list, or *Start an agent* on a
107
129
  project's menu. The list you pick from is the launcher's own
@@ -129,7 +151,7 @@ tmux fork or plugin manager.
129
151
  Tested: Terminal.app, iTerm2, Ghostty (macOS). The sidebar needs mouse
130
152
  reporting and focus reporting from the terminal; anything that gives
131
153
  tmux those should work, but only the three above have been driven by
132
- hand. Blink Shell on iPad is wanted and not yet connecting (Aug 31).
154
+ hand. Blink Shell on iPad is wanted and not yet connecting.
133
155
 
134
156
  ## Layout
135
157
 
@@ -138,26 +160,35 @@ hand. Blink Shell on iPad is wanted and not yet connecting (Aug 31).
138
160
  bin/sessionview-frame the frame: outer tmux, sidebar pane + client pane
139
161
  bin/sessionview-session a project session with its configured tabs (repo / git / project / tasks)
140
162
  bin/sessionview-newtab the tab bar's "+": the new-tab picker, in a popup
141
- bin/sessionview-config the config cascade: get / dump / path / set / unset
142
- bin/sessionview-configure the settings screen (project menu → Settings)
163
+ bin/sessionview-config settings: no verb opens the screen; list / get / set / unset / dump / path
143
164
  bin/sessionview-autostart the consent-on-open question; --start NAME is the + under agents
144
165
  bin/sessionview-sidebar-toggle hide / show the sidebar (the ◧ glyph)
145
166
  bin/sessionview-terminal which terminal the dock app opens
146
- tmux/herd.conf the herd look, session-scoped (sourced with S= and HERD_ROOT=)
167
+ tmux/frame.conf the sessionview look, session-scoped (sourced with S= and SESSIONVIEW_ROOT=)
147
168
  tmux/tabs-top.conf the same look, global and OPTIONAL (source-file it from ~/.tmux.conf
148
- to have it outside sessionview too; the frame applies herd.conf itself)
149
- config/config.json every default, explicit; ~/.sessionview/config.json is made from it
150
- plugins/*/ herd-plugin.toml (+ scripts): session, voicemode, taskmaster
169
+ to have it outside sessionview too; the frame applies frame.conf itself)
170
+ config/config.json every default, explicit; ~/.sessionkit/view/settings/view.json is made from it
171
+ plugins/*/ plugin.toml (+ scripts): session, voicemode, taskmaster
151
172
  .claude-plugin/ sessionview is a Claude Code plugin; its skills load as
152
173
  skills/*/SKILL.md sessionview:NAME - sessionview, tmux, lazygit, neovim,
153
174
  claude-code: short, safe driving skills with tools
154
175
 
155
- Paths resolve from the checkout (`HERD_ROOT`); state lives in
156
- `~/.local/state/herd` (`HERD_STATE`). Requirements are listed above.
176
+ Paths resolve from the checkout (`SESSIONVIEW_ROOT`); state lives in
177
+ `~/.local/state/sessionview` (`SESSIONVIEW_STATE`). Requirements are listed above.
157
178
 
158
179
  ## Install
159
180
 
160
- git clone https://github.com/mbailey/sessionview ~/Code/sessionview
181
+ From PyPI:
182
+
183
+ uv tool install sessionview
184
+ sessionview install # checks every requirement; links nothing
185
+
186
+ That puts `sessionview`, `sessionview-config`, `sessionview-session` and
187
+ `sessionview-messages` on PATH; `sessionview install` then only checks.
188
+
189
+ From a checkout:
190
+
191
+ git clone https://github.com/sessionkit/sessionview ~/Code/sessionview
161
192
  ~/Code/sessionview/bin/sessionview-install # or: make install
162
193
 
163
194
  That links the tools into `~/.local/bin` and checks every requirement,
@@ -171,7 +202,7 @@ show-me (github.com/mbailey/show-me) is referenced, not bundled.
171
202
 
172
203
  ### Dock app (macOS, optional)
173
204
 
174
- make app # or: bin/sessionview-app-install
205
+ sessionview install --app # or: make app
175
206
 
176
207
  Builds `SessionView.app` from `macos/SessionView.applescript` and puts
177
208
  it in `~/Applications`; drag it to the Dock and one click opens
@@ -209,17 +240,56 @@ that; the app does not have one yet.
209
240
  quits, esc backs out of any view
210
241
  - tab bar: `◧` at the far left hides/shows the sidebar; click selects,
211
242
  drag reorders, `+` new tab (the picker); a close `×`, on by default;
212
- `tmux set -g @herd_tab_close 0` turns it off
243
+ `tmux set -g @sessionview_tab_close 0` turns it off
213
244
  - menu: ↑↓ / j k move, the letter or enter picks, esc or a click
214
245
  anywhere else closes
215
246
  - agent panes (opt-in): right-click an agent's pane for Speak, Continue,
216
247
  Read Clipboard, Park or Succeed; each mails that agent. Turn it on
217
- with `sessionview-config set pane_menu true` (and
218
- `sessionview-config set pane_menu_from NAME` if your login name is not
219
- your mail name). It replaces your own tmux right-click menu, which is
248
+ with `sessionview-config set pane_menu true`. It replaces your own tmux right-click menu, which is
220
249
  why it is off by default. Using tmux without session view? Add
221
250
  `source-file -q /path/to/sessionview/tmux/agent-menu.conf` to
222
251
  `~/.tmux.conf` and reload.
223
252
 
224
- Built by Pip, Fri 2026-09-04 – Sun 2026-09-06, from Mike's asks by voice,
225
- with Cora reading herdr's own window for the colours.
253
+ The look follows herdr's; its colours were matched from herdr's own window.
254
+
255
+ ## Configuration
256
+
257
+ - **Settings:** JSON, in layers, a later one winning. The template
258
+ `config/config.json` holds every key and its default.
259
+ `~/.sessionkit/view/settings/view.json` is yours, made from it on first
260
+ use; a store's and a project's `.sessionview` come after it.
261
+ `sessionview-config set KEY VALUE` writes yours, and
262
+ `sessionview-config dump --where` names the file behind each key.
263
+ An older install's settings are never read. Moving them is one step,
264
+ in [Upgrading from 0.1.0](docs/configuration.md#upgrading-from-010).
265
+ Until then sessionview makes nothing and refuses: `sessionview-config`
266
+ exits 3 and prints the move to run, and the sidebar shows the same
267
+ message. If the old file is left beside the new one, it uses the new one
268
+ and warns you to remove the old one.
269
+ - **Your neomutt view:** `~/.sessionkit/view/settings/neomuttrc`,
270
+ optional, read after the shipped `config/neomuttrc`.
271
+ - **Plugins:** `plugins/<name>/plugin.toml` in the checkout.
272
+ - **Environment:** `SESSIONVIEW_CONFIG` (another file for yours),
273
+ `SESSIONVIEW_FROM` (the name mail is sent as), `SESSIONVIEW_STATE`
274
+ (state, default `~/.local/state/sessionview`), `SESSIONVIEW_PLUGINS`
275
+ (another plugin directory).
276
+ - sessionview does not read the kit's settings cascade today, only these.
277
+
278
+ Every file, variable and tmux option is in
279
+ [Configuration](docs/configuration.md),
280
+ and every key in
281
+ [Settings](docs/settings.md).
282
+
283
+ ## Logs
284
+
285
+ - `~/.local/state/sessionview/sessionview.log`: what went wrong, one
286
+ entry each, starting with the time (a failed tmux call, an uncaught
287
+ error with its traceback). Follow it with
288
+ `tail -f ~/.local/state/sessionview/sessionview.log` when a click
289
+ seems to do nothing.
290
+ - `~/.local/state/sessionview/sidebar-mouse.log`: one line per mouse
291
+ click the sidebar receives.
292
+ - Both sit under `$SESSIONVIEW_STATE` when it is set. Neither is rotated.
293
+ - **Health:** `sessionview install --check`: exit 0 and `ready` when
294
+ every requirement is present, exit 1 with each MISSING one named
295
+ otherwise. It checks the machine, not a running sidebar.
@@ -1,41 +1,26 @@
1
- Metadata-Version: 2.5
2
- Name: sessionview
3
- Version: 0.1.0
4
- Summary: sessionview - a sidebar for tmux: your projects (sessions) and your agents (seats), here and on remote hosts. Name reserved; the tool follows.
5
- Project-URL: Homepage, https://github.com/mbailey/sessionview
6
- Author: Mike Bailey
7
- License-Expression: AGPL-3.0-or-later
8
- License-File: LICENSE
9
- Classifier: Development Status :: 1 - Planning
10
- Requires-Python: >=3.11
11
- Description-Content-Type: text/markdown
12
-
13
- # Herd
1
+ # sessionview
14
2
 
15
3
  A sidebar for tmux, in the spirit of herdr: your projects (tmux sessions)
16
4
  and your agents (seats), here and on remote hosts, one click away, with a
17
5
  right-click menu built from what is installed. Session's TUI — a
18
6
  controller and view for the `session` tools, drawn beside tmux.
19
7
 
20
- `sessionview` 0.0.1 on PyPI reserves the name; the tool follows (Mike, approved by mail 00:25 Thu 2026-09-10).
21
-
8
+ Install from PyPI: `uv tool install sessionview` (see [Install](#install)).
22
9
 
23
10
  sessionview [SESSION] # in this terminal: sidebar left, SESSION attached
24
11
  # right (a private outer tmux holds the two panes)
25
12
  prefix H # the same sidebar as a popup in any tmux client
26
13
 
27
- Read [SPEC.md](SPEC.md) first: what Herd is, the rules of the view, the
28
- contract with `session`, the plugin manifest, config, measured limits.
29
- This repo is the **reference implementation** (Mike, 18:23 Sun
30
- 2026-09-06: "a working reference implementation ... it can be a life
31
- raft") — session integrates from the spec; this stays comparable and
32
- runnable.
14
+ Read [SPEC.md](SPEC.md) first: what sessionview is, the rules of the view, the
15
+ contract with `session`, the plugin manifest, config, known limits.
16
+ This repo is the **reference implementation**: session integrates from
17
+ the spec; this stays comparable and runnable.
33
18
 
34
19
  ## Requirements
35
20
 
36
21
  Each line is measured against the code, not remembered;
37
- `bin/sessionview-install --check` checks tmux, Python and `session`
38
- on your machine.
22
+ `bin/sessionview-install --check` checks tmux, Python, `session`,
23
+ neomutt and notmuch's index on your machine.
39
24
 
40
25
  - **Claude Code, and the plugin is the install.** The `sessionview`
41
26
  wheel is an empty package (one `__init__.py`, no `[project.scripts]`);
@@ -48,13 +33,26 @@ on your machine.
48
33
  the frame are plain tmux + Python and should run on Linux, untested.
49
34
  - **tmux >= 3.7** (measured on 3.7c: `join-pane -l`, `focus-events`,
50
35
  status ranges). An older tmux satisfies `brew install tmux` silently.
51
- - **Python >= 3.11**, standard library only (`requires-python` in
52
- `pyproject.toml`; the sidebar and the config tools).
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).
53
38
  - **bash**: macOS's 3.2 is enough; sessionview's own bash tools use no
54
39
  bash-4 construct.
55
40
  - **sessionmail** (`message` on PATH) for every mail action: the
56
41
  sidebar's mail, the agent pane menu, and the session, taskmaster and
57
- voicemode plugins (each lists `message` in its `requires`).
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.
58
56
  - **postfix: not needed by sessionview itself.** sessionview never talks
59
57
  to an MTA; sessionmail's `message send` hands each mail to
60
58
  `/usr/sbin/sendmail` (or `$SESSIONMAIL_SENDMAIL`) and refuses with
@@ -73,12 +71,7 @@ on your machine.
73
71
 
74
72
  ## Features
75
73
 
76
- Grouped by component, named in the terms a comparison matrix would use,
77
- so we can still describe them once we are used to them (Mike, voice
78
- 13:40 + 13:46 Sat 2026-09-12: "we'll just get used to them, and then
79
- we'll have trouble describing them ... group the sidebar and have them
80
- as properties of the sidebar"). Agents maintain this list; it is not
81
- finger memory.
74
+ Grouped by component, named in the terms a comparison matrix would use.
82
75
 
83
76
  **Sidebar** — projects (tmux sessions) above, agents (seats) below.
84
77
 
@@ -95,7 +88,7 @@ finger memory.
95
88
  control master you already hold. The sidebar never opens a connection
96
89
  of its own, so a hardware key is never asked for a touch by a redraw.
97
90
 
98
- **Menus**
91
+ ### Menus
99
92
 
100
93
  - *Overflow menu* — three dots `⋯` at the right of the selected session
101
94
  open its menu (rename, new tab, config, settings, start an agent,
@@ -113,7 +106,7 @@ listed, typing narrows, enter opens the highlighted one or a plain tab
113
106
  of the name you typed. The same picker starts an agent (the `+` under
114
107
  agents, or the menu): the names `session start` knows, pinned ones first.
115
108
 
116
- **Agents**
109
+ ### Agents
117
110
 
118
111
  - *Start an agent* — `+` under the agents list, or *Start an agent* on a
119
112
  project's menu. The list you pick from is the launcher's own
@@ -141,7 +134,7 @@ tmux fork or plugin manager.
141
134
  Tested: Terminal.app, iTerm2, Ghostty (macOS). The sidebar needs mouse
142
135
  reporting and focus reporting from the terminal; anything that gives
143
136
  tmux those should work, but only the three above have been driven by
144
- hand. Blink Shell on iPad is wanted and not yet connecting (Aug 31).
137
+ hand. Blink Shell on iPad is wanted and not yet connecting.
145
138
 
146
139
  ## Layout
147
140
 
@@ -150,26 +143,35 @@ hand. Blink Shell on iPad is wanted and not yet connecting (Aug 31).
150
143
  bin/sessionview-frame the frame: outer tmux, sidebar pane + client pane
151
144
  bin/sessionview-session a project session with its configured tabs (repo / git / project / tasks)
152
145
  bin/sessionview-newtab the tab bar's "+": the new-tab picker, in a popup
153
- bin/sessionview-config the config cascade: get / dump / path / set / unset
154
- bin/sessionview-configure the settings screen (project menu → Settings)
146
+ bin/sessionview-config settings: no verb opens the screen; list / get / set / unset / dump / path
155
147
  bin/sessionview-autostart the consent-on-open question; --start NAME is the + under agents
156
148
  bin/sessionview-sidebar-toggle hide / show the sidebar (the ◧ glyph)
157
149
  bin/sessionview-terminal which terminal the dock app opens
158
- tmux/herd.conf the herd look, session-scoped (sourced with S= and HERD_ROOT=)
150
+ tmux/frame.conf the sessionview look, session-scoped (sourced with S= and SESSIONVIEW_ROOT=)
159
151
  tmux/tabs-top.conf the same look, global and OPTIONAL (source-file it from ~/.tmux.conf
160
- to have it outside sessionview too; the frame applies herd.conf itself)
161
- config/config.json every default, explicit; ~/.sessionview/config.json is made from it
162
- plugins/*/ herd-plugin.toml (+ scripts): session, voicemode, taskmaster
152
+ to have it outside sessionview too; the frame applies frame.conf itself)
153
+ config/config.json every default, explicit; ~/.sessionkit/view/settings/view.json is made from it
154
+ plugins/*/ plugin.toml (+ scripts): session, voicemode, taskmaster
163
155
  .claude-plugin/ sessionview is a Claude Code plugin; its skills load as
164
156
  skills/*/SKILL.md sessionview:NAME - sessionview, tmux, lazygit, neovim,
165
157
  claude-code: short, safe driving skills with tools
166
158
 
167
- Paths resolve from the checkout (`HERD_ROOT`); state lives in
168
- `~/.local/state/herd` (`HERD_STATE`). Requirements are listed above.
159
+ Paths resolve from the checkout (`SESSIONVIEW_ROOT`); state lives in
160
+ `~/.local/state/sessionview` (`SESSIONVIEW_STATE`). Requirements are listed above.
169
161
 
170
162
  ## Install
171
163
 
172
- git clone https://github.com/mbailey/sessionview ~/Code/sessionview
164
+ From PyPI:
165
+
166
+ uv tool install sessionview
167
+ sessionview install # checks every requirement; links nothing
168
+
169
+ That puts `sessionview`, `sessionview-config`, `sessionview-session` and
170
+ `sessionview-messages` on PATH; `sessionview install` then only checks.
171
+
172
+ From a checkout:
173
+
174
+ git clone https://github.com/sessionkit/sessionview ~/Code/sessionview
173
175
  ~/Code/sessionview/bin/sessionview-install # or: make install
174
176
 
175
177
  That links the tools into `~/.local/bin` and checks every requirement,
@@ -183,7 +185,7 @@ show-me (github.com/mbailey/show-me) is referenced, not bundled.
183
185
 
184
186
  ### Dock app (macOS, optional)
185
187
 
186
- make app # or: bin/sessionview-app-install
188
+ sessionview install --app # or: make app
187
189
 
188
190
  Builds `SessionView.app` from `macos/SessionView.applescript` and puts
189
191
  it in `~/Applications`; drag it to the Dock and one click opens
@@ -221,17 +223,56 @@ that; the app does not have one yet.
221
223
  quits, esc backs out of any view
222
224
  - tab bar: `◧` at the far left hides/shows the sidebar; click selects,
223
225
  drag reorders, `+` new tab (the picker); a close `×`, on by default;
224
- `tmux set -g @herd_tab_close 0` turns it off
226
+ `tmux set -g @sessionview_tab_close 0` turns it off
225
227
  - menu: ↑↓ / j k move, the letter or enter picks, esc or a click
226
228
  anywhere else closes
227
229
  - agent panes (opt-in): right-click an agent's pane for Speak, Continue,
228
230
  Read Clipboard, Park or Succeed; each mails that agent. Turn it on
229
- with `sessionview-config set pane_menu true` (and
230
- `sessionview-config set pane_menu_from NAME` if your login name is not
231
- your mail name). It replaces your own tmux right-click menu, which is
231
+ with `sessionview-config set pane_menu true`. It replaces your own tmux right-click menu, which is
232
232
  why it is off by default. Using tmux without session view? Add
233
233
  `source-file -q /path/to/sessionview/tmux/agent-menu.conf` to
234
234
  `~/.tmux.conf` and reload.
235
235
 
236
- Built by Pip, Fri 2026-09-04 – Sun 2026-09-06, from Mike's asks by voice,
237
- with Cora reading herdr's own window for the colours.
236
+ The look follows herdr's; its colours were matched from herdr's own window.
237
+
238
+ ## Configuration
239
+
240
+ - **Settings:** JSON, in layers, a later one winning. The template
241
+ `config/config.json` holds every key and its default.
242
+ `~/.sessionkit/view/settings/view.json` is yours, made from it on first
243
+ use; a store's and a project's `.sessionview` come after it.
244
+ `sessionview-config set KEY VALUE` writes yours, and
245
+ `sessionview-config dump --where` names the file behind each key.
246
+ An older install's settings are never read. Moving them is one step,
247
+ in [Upgrading from 0.1.0](docs/configuration.md#upgrading-from-010).
248
+ Until then sessionview makes nothing and refuses: `sessionview-config`
249
+ exits 3 and prints the move to run, and the sidebar shows the same
250
+ message. If the old file is left beside the new one, it uses the new one
251
+ and warns you to remove the old one.
252
+ - **Your neomutt view:** `~/.sessionkit/view/settings/neomuttrc`,
253
+ optional, read after the shipped `config/neomuttrc`.
254
+ - **Plugins:** `plugins/<name>/plugin.toml` in the checkout.
255
+ - **Environment:** `SESSIONVIEW_CONFIG` (another file for yours),
256
+ `SESSIONVIEW_FROM` (the name mail is sent as), `SESSIONVIEW_STATE`
257
+ (state, default `~/.local/state/sessionview`), `SESSIONVIEW_PLUGINS`
258
+ (another plugin directory).
259
+ - sessionview does not read the kit's settings cascade today, only these.
260
+
261
+ Every file, variable and tmux option is in
262
+ [Configuration](docs/configuration.md),
263
+ and every key in
264
+ [Settings](docs/settings.md).
265
+
266
+ ## Logs
267
+
268
+ - `~/.local/state/sessionview/sessionview.log`: what went wrong, one
269
+ entry each, starting with the time (a failed tmux call, an uncaught
270
+ error with its traceback). Follow it with
271
+ `tail -f ~/.local/state/sessionview/sessionview.log` when a click
272
+ seems to do nothing.
273
+ - `~/.local/state/sessionview/sidebar-mouse.log`: one line per mouse
274
+ click the sidebar receives.
275
+ - Both sit under `$SESSIONVIEW_STATE` when it is set. Neither is rotated.
276
+ - **Health:** `sessionview install --check`: exit 0 and `ready` when
277
+ every requirement is present, exit 1 with each MISSING one named
278
+ otherwise. It checks the machine, not a running sidebar.
@@ -0,0 +1,47 @@
1
+ #!/bin/sh
2
+ # sessionview - a sidebar for tmux, in this terminal. Needs tmux, nothing else.
3
+ #
4
+ # usage: sessionview [SESSION] [--sock SERVER] [--width N]
5
+ # sessionview COMMAND [ARGS]
6
+ #
7
+ # sessionview [SESSION] the frame: sidebar on the left, SESSION attached on
8
+ # the right (default main). --sock names its tmux server;
9
+ # --width, columns.
10
+ # sessionview config settings: no verb opens the screen (get/set/list ...)
11
+ # sessionview session NAME open a project session with its standard tabs
12
+ # sessionview messages PROJECT a project's mail, read-only, in NeoMutt
13
+ # sessionview install check requirements (--app: the macOS Dock app)
14
+ # sessionview autostart --status which agent starts when sessionview opens
15
+ # sessionview sidebar the sidebar under its supervisor (the frame's left
16
+ # pane runs this). In it: q reloads, Q quits.
17
+ #
18
+ # Also: prefix H in any tmux client opens the sidebar as a popup.
19
+ # Config: ~/.sessionkit/view/settings/view.json over the shipped config/config.json.
20
+ # State: ~/.local/state/sessionview (SESSIONVIEW_STATE=).
21
+ #
22
+ # Ghostty was stripped out so this works in any terminal with only tmux. It
23
+ # started as ghostty-herd; the Ghostty launcher, the split hook and cmd+d
24
+ # went with the frame (1fd29ce) and this rename. -h prints the usage above
25
+ # without the comment marks, so the help reads cleanly.
26
+ SESSIONVIEW_ROOT="${SESSIONVIEW_ROOT:-$(cd "$(dirname "$(readlink -f "$0" 2>/dev/null || echo "$0")")/.." && pwd)}"
27
+ SESSIONVIEW_STATE="${SESSIONVIEW_STATE:-$HOME/.local/state/sessionview}"; . "$SESSIONVIEW_ROOT/lib/state.sh"; . "$SESSIONVIEW_ROOT/lib/python.sh"; export SESSIONVIEW_ROOT SESSIONVIEW_STATE
28
+ case "${1:-}" in
29
+ -h|--help|help) sed -n '2,20p' "$0" | sed 's/^# \{0,1\}//'; exit 0;;
30
+ config|session|messages|install|autostart|terminal|usermail)
31
+ sub="$1"; shift; exec "$SESSIONVIEW_ROOT/bin/sessionview-$sub" "$@";;
32
+ sidebar)
33
+ # The supervisor: q = exit 0 = reload (picks up an edited tmux-sidebar or
34
+ # sidebar.toml), Q = exit 3 = quit. A CRASH IS NOT A QUIT: any other exit
35
+ # holds the error on screen and waits (one undefined name once took the
36
+ # whole sidebar away).
37
+ while :; do
38
+ "$SESSIONVIEW_ROOT/bin/tmux-sidebar"; rc=$?
39
+ [ "$rc" = 3 ] && break
40
+ [ "$rc" = 0 ] && continue
41
+ printf '\n\033[31m sidebar crashed (exit %s)\033[0m -- Enter restarts, Q then Enter quits. ' "$rc"
42
+ read -r k || break
43
+ case "$k" in [Qq]) break;; esac
44
+ done
45
+ exit 0;;
46
+ esac
47
+ exec "$SESSIONVIEW_ROOT/bin/sessionview-frame" "$@"
@@ -0,0 +1,75 @@
1
+ #!/bin/sh
2
+ # sessionview-app-install - build the macOS Dock app from macos/ and install it.
3
+ #
4
+ # sessionview-app-install build + install to ~/Applications
5
+ # sessionview-app-install --check say what it would do, change nothing
6
+ # DEST=/Applications sessionview-app-install
7
+ #
8
+ # Why this exists: the Dock app once existed ONLY as a compiled bundle in
9
+ # one person's ~/Applications. Nobody could read it, diff it or install it,
10
+ # and a path bug in it went unseen for a day.
11
+ # The source is now macos/SessionView.applescript and this rebuilds it.
12
+ #
13
+ # The app is a FRONT DOOR, not the product: it opens a terminal and runs
14
+ # `sessionview` in it. `sessionview` in any shell does the same job.
15
+ set -u
16
+ ROOT="$(cd "$(dirname "$(readlink -f "$0" 2>/dev/null || echo "$0")")/.." && pwd)"
17
+ SRC="$ROOT/macos/SessionView.applescript"
18
+ ICON="$ROOT/macos/dreamcatcher.icns"
19
+ DEST="${DEST:-$HOME/Applications}"
20
+ APP="$DEST/SessionView.app"
21
+ CHECK=""; [ "${1:-}" = "--check" ] && CHECK=1
22
+
23
+ [ "$(uname -s)" = "Darwin" ] || { echo "sessionview-app-install: macOS only (this is $(uname -s))" >&2; exit 1; }
24
+ [ -f "$SRC" ] || { echo "sessionview-app-install: missing $SRC" >&2; exit 1; }
25
+ command -v osacompile >/dev/null 2>&1 || { echo "sessionview-app-install: osacompile not found (install Xcode command line tools)" >&2; exit 1; }
26
+
27
+ if [ -n "$CHECK" ]; then
28
+ echo "source: $SRC"
29
+ echo "icon: $ICON"
30
+ echo "would install: $APP"
31
+ [ -e "$APP" ] && echo "note: $APP exists and would be REPLACED"
32
+ exit 0
33
+ fi
34
+
35
+ TMP="$(mktemp -d)" || exit 1
36
+ trap 'rm -rf "$TMP"' EXIT
37
+ osacompile -o "$TMP/SessionView.app" "$SRC" || exit 1
38
+
39
+ # custom icon: the compiled applet ships AppleScript's own
40
+ if [ -f "$ICON" ]; then
41
+ cp "$ICON" "$TMP/SessionView.app/Contents/Resources/dreamcatcher.icns" || exit 1
42
+ /usr/libexec/PlistBuddy -c "Set :CFBundleIconFile dreamcatcher" \
43
+ "$TMP/SessionView.app/Contents/Info.plist" >/dev/null 2>&1 \
44
+ || /usr/libexec/PlistBuddy -c "Add :CFBundleIconFile string dreamcatcher" \
45
+ "$TMP/SessionView.app/Contents/Info.plist" >/dev/null
46
+ # the compiled applet also names an icon inside Assets.car; that key wins
47
+ # over CFBundleIconFile on recent macOS, so it goes.
48
+ /usr/libexec/PlistBuddy -c "Delete :CFBundleIconName" \
49
+ "$TMP/SessionView.app/Contents/Info.plist" >/dev/null 2>&1 || :
50
+ fi
51
+ for kv in "CFBundleName Dreamcatcher" "CFBundleDisplayName Dreamcatcher" "CFBundleIdentifier Dreamcatcher"; do
52
+ k=${kv%% *}; v=${kv#* }
53
+ /usr/libexec/PlistBuddy -c "Set :$k $v" "$TMP/SessionView.app/Contents/Info.plist" >/dev/null 2>&1 \
54
+ || /usr/libexec/PlistBuddy -c "Add :$k string $v" "$TMP/SessionView.app/Contents/Info.plist" >/dev/null
55
+ done
56
+ # ad-hoc signature: unsigned bundles that CHANGE in place get killed by
57
+ # Gatekeeper's cached hashes ("damaged"). Re-signing after every edit is the fix.
58
+ codesign -f -s - "$TMP/SessionView.app" >/dev/null 2>&1 || \
59
+ echo "sessionview-app-install: warning - could not sign the bundle" >&2
60
+
61
+ mkdir -p "$DEST" || exit 1
62
+ rm -rf "$APP" || exit 1
63
+ mv "$TMP/SessionView.app" "$APP" || exit 1
64
+ touch "$APP" # nudge Finder to re-read the icon
65
+ echo "sessionview: installed $APP"
66
+ echo "drag it to your Dock; one click opens sessionview in your preferred terminal"
67
+ # The ad-hoc signature is a fresh identity every build, and macOS keys TCC
68
+ # permissions to it -- so a rebuild silently revokes the Accessibility tick
69
+ # that `fullscreen` needs on Terminal.app. Say so, every time, rather than
70
+ # letting it look like the feature broke.
71
+ if [ "$(command -v sessionview-config >/dev/null 2>&1 && sessionview-config get fullscreen 2>/dev/null)" = "true" ]; then
72
+ echo
73
+ echo "note: fullscreen is on, and this REBUILD resets its Accessibility permission."
74
+ echo " System Settings > Privacy & Security > Accessibility > turn SessionView back on."
75
+ fi