sessionview 0.1.0__tar.gz → 0.3.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.
- sessionview-0.1.0/README.md → sessionview-0.3.0/PKG-INFO +114 -39
- sessionview-0.1.0/PKG-INFO → sessionview-0.3.0/README.md +97 -51
- sessionview-0.3.0/bin/sessionview +75 -0
- sessionview-0.3.0/bin/sessionview-app-install +75 -0
- sessionview-0.3.0/bin/sessionview-autostart +281 -0
- sessionview-0.3.0/bin/sessionview-config +422 -0
- sessionview-0.3.0/bin/sessionview-frame +187 -0
- sessionview-0.3.0/bin/sessionview-from +37 -0
- sessionview-0.3.0/bin/sessionview-install +114 -0
- sessionview-0.3.0/bin/sessionview-messages +106 -0
- sessionview-0.3.0/bin/sessionview-newtab +67 -0
- sessionview-0.3.0/bin/sessionview-send +29 -0
- sessionview-0.3.0/bin/sessionview-session +451 -0
- sessionview-0.3.0/bin/sessionview-sidebar-toggle +84 -0
- sessionview-0.3.0/bin/sessionview-terminal +45 -0
- sessionview-0.3.0/bin/sessionview-usermail +85 -0
- sessionview-0.3.0/bin/tmux-send-agent +74 -0
- sessionview-0.3.0/bin/tmux-sidebar +3436 -0
- {sessionview-0.1.0 → sessionview-0.3.0}/config/README.md +86 -65
- sessionview-0.3.0/config/config.json +180 -0
- sessionview-0.3.0/config/keys.md +91 -0
- sessionview-0.3.0/config/neomuttrc +52 -0
- sessionview-0.3.0/lib/client.sh +57 -0
- sessionview-0.3.0/lib/python.sh +41 -0
- sessionview-0.3.0/lib/sessionview-config-screen +201 -0
- sessionview-0.3.0/lib/state.sh +13 -0
- sessionview-0.3.0/macos/SessionView.applescript +218 -0
- sessionview-0.3.0/macos/dreamcatcher.icns +0 -0
- sessionview-0.3.0/plugins/session/plugin.toml +71 -0
- sessionview-0.3.0/plugins/session/start-agent +67 -0
- sessionview-0.3.0/plugins/taskmaster/plugin.toml +61 -0
- sessionview-0.3.0/plugins/taskmaster/tasks-tab +9 -0
- sessionview-0.3.0/plugins/voicemode/plugin.toml +18 -0
- sessionview-0.3.0/plugins/voicemode/speak +11 -0
- sessionview-0.3.0/pyproject.toml +50 -0
- sessionview-0.3.0/skills/tmux/SKILL.md +50 -0
- sessionview-0.3.0/skills/tmux/scripts/tmux-peek +8 -0
- sessionview-0.3.0/skills/tmux/scripts/tmux-show +19 -0
- sessionview-0.3.0/skills/tmux/scripts/tmux-type +28 -0
- sessionview-0.3.0/skills/tmux/scripts/tmux-where +16 -0
- sessionview-0.3.0/src/sessionview/__init__.py +26 -0
- sessionview-0.3.0/tmux/agent-menu.conf +33 -0
- sessionview-0.3.0/tmux/frame.conf +74 -0
- sessionview-0.3.0/tmux/tabs-top.conf +35 -0
- sessionview-0.1.0/pyproject.toml +0 -27
- sessionview-0.1.0/src/sessionview/__init__.py +0 -3
- {sessionview-0.1.0 → sessionview-0.3.0}/.gitignore +0 -0
- {sessionview-0.1.0 → sessionview-0.3.0}/LICENSE +0 -0
|
@@ -1,29 +1,43 @@
|
|
|
1
|
-
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: sessionview
|
|
3
|
+
Version: 0.3.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
|
-
|
|
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
|
|
16
|
-
contract with `session`, the plugin manifest, config,
|
|
17
|
-
This repo is the **reference implementation
|
|
18
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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/
|
|
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
|
|
149
|
-
config/config.json every default, explicit; ~/.
|
|
150
|
-
plugins/*/
|
|
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 (`
|
|
156
|
-
`~/.local/state/
|
|
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
|
-
|
|
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
|
-
|
|
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,61 @@ 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 @
|
|
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
|
|
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
|
-
|
|
225
|
-
|
|
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
|
+
- **Levels:** `log_level` in your settings (or `$SESSIONVIEW_LOG_LEVEL`
|
|
291
|
+
for one run). `error`, the default, logs only what went wrong.
|
|
292
|
+
`timing` adds a line per click or key with its milliseconds, and each
|
|
293
|
+
command that took 50 ms or more, so a slow click names its slow part.
|
|
294
|
+
`debug` adds every command and every mouse event (what the old
|
|
295
|
+
`sidebar-mouse.log` held).
|
|
296
|
+
- It sits under `$SESSIONVIEW_STATE` when that is set. It is not rotated:
|
|
297
|
+
turn `timing` or `debug` on while you look, then back to `error`.
|
|
298
|
+
- **Health:** `sessionview install --check`: exit 0 and `ready` when
|
|
299
|
+
every requirement is present, exit 1 with each MISSING one named
|
|
300
|
+
otherwise. It checks the machine, not a running sidebar.
|
|
@@ -1,41 +1,26 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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
|
|
28
|
-
contract with `session`, the plugin manifest, config,
|
|
29
|
-
This repo is the **reference implementation
|
|
30
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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/
|
|
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
|
|
161
|
-
config/config.json every default, explicit; ~/.
|
|
162
|
-
plugins/*/
|
|
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 (`
|
|
168
|
-
`~/.local/state/
|
|
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
|
-
|
|
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
|
-
|
|
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,61 @@ 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 @
|
|
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
|
|
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
|
-
|
|
237
|
-
|
|
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
|
+
- **Levels:** `log_level` in your settings (or `$SESSIONVIEW_LOG_LEVEL`
|
|
274
|
+
for one run). `error`, the default, logs only what went wrong.
|
|
275
|
+
`timing` adds a line per click or key with its milliseconds, and each
|
|
276
|
+
command that took 50 ms or more, so a slow click names its slow part.
|
|
277
|
+
`debug` adds every command and every mouse event (what the old
|
|
278
|
+
`sidebar-mouse.log` held).
|
|
279
|
+
- It sits under `$SESSIONVIEW_STATE` when that is set. It is not rotated:
|
|
280
|
+
turn `timing` or `debug` on while you look, then back to `error`.
|
|
281
|
+
- **Health:** `sessionview install --check`: exit 0 and `ready` when
|
|
282
|
+
every requirement is present, exit 1 with each MISSING one named
|
|
283
|
+
otherwise. It checks the machine, not a running sidebar.
|
|
@@ -0,0 +1,75 @@
|
|
|
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; a named SESSION must exist).
|
|
9
|
+
# --sock names its tmux server; --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 from the name your mail is sent as (mail_from, else $USER)
|
|
16
|
+
# sessionview sidebar-toggle hide the sidebar, or show it again
|
|
17
|
+
# sessionview sidebar the sidebar under its supervisor (the frame's left
|
|
18
|
+
# pane runs this). In it: q reloads, Q quits.
|
|
19
|
+
#
|
|
20
|
+
# Also: prefix H in any tmux client opens the sidebar as a popup.
|
|
21
|
+
# Config: ~/.sessionkit/view/settings/view.json over the shipped config/config.json.
|
|
22
|
+
# State: ~/.local/state/sessionview (SESSIONVIEW_STATE=).
|
|
23
|
+
#
|
|
24
|
+
# Ghostty was stripped out so this works in any terminal with only tmux. It
|
|
25
|
+
# started as ghostty-herd; the Ghostty launcher, the split hook and cmd+d
|
|
26
|
+
# went with the frame (1fd29ce) and this rename. -h prints the usage above
|
|
27
|
+
# without the comment marks, so the help reads cleanly.
|
|
28
|
+
SESSIONVIEW_ROOT="${SESSIONVIEW_ROOT:-$(cd "$(dirname "$(readlink -f "$0" 2>/dev/null || echo "$0")")/.." && pwd)}"
|
|
29
|
+
SESSIONVIEW_STATE="${SESSIONVIEW_STATE:-$HOME/.local/state/sessionview}"; . "$SESSIONVIEW_ROOT/lib/state.sh"; . "$SESSIONVIEW_ROOT/lib/python.sh"; export SESSIONVIEW_ROOT SESSIONVIEW_STATE
|
|
30
|
+
# The header above is the usage: -h prints it, and so does an unknown word.
|
|
31
|
+
usage() { sed -n '2,22p' "$0" | sed 's/^# \{0,1\}//'; }
|
|
32
|
+
case "${1:-}" in
|
|
33
|
+
-h|--help|help) usage; exit 0;;
|
|
34
|
+
config|session|messages|install|autostart|terminal|usermail|from|sidebar-toggle)
|
|
35
|
+
sub="$1"; shift; exec "$SESSIONVIEW_ROOT/bin/sessionview-$sub" "$@";;
|
|
36
|
+
sidebar)
|
|
37
|
+
# The supervisor: q = exit 0 = reload (picks up an edited tmux-sidebar or
|
|
38
|
+
# sidebar.toml), Q = exit 3 = quit. A CRASH IS NOT A QUIT: any other exit
|
|
39
|
+
# holds the error on screen and waits (one undefined name once took the
|
|
40
|
+
# whole sidebar away).
|
|
41
|
+
while :; do
|
|
42
|
+
"$SESSIONVIEW_ROOT/bin/tmux-sidebar"; rc=$?
|
|
43
|
+
[ "$rc" = 3 ] && break
|
|
44
|
+
[ "$rc" = 0 ] && continue
|
|
45
|
+
printf '\n\033[31m sidebar crashed (exit %s)\033[0m -- Enter restarts, Q then Enter quits. ' "$rc"
|
|
46
|
+
read -r k || break
|
|
47
|
+
case "$k" in [Qq]) break;; esac
|
|
48
|
+
done
|
|
49
|
+
exit 0;;
|
|
50
|
+
esac
|
|
51
|
+
# Anything else is the frame. A word that names no subcommand opens a frame
|
|
52
|
+
# ONLY on a session that already exists on the server the frame will use
|
|
53
|
+
# (--sock, else this tmux's own server when run inside one, else default):
|
|
54
|
+
# a typo or a probe word must not mean "open a frame on a new session named
|
|
55
|
+
# after it". Read-only check; on a miss, usage and exit 2, nothing touched.
|
|
56
|
+
# A new named session is `sessionview session NAME`. No word = main, as before.
|
|
57
|
+
word=""; sock=""; prev=""
|
|
58
|
+
for a in "$@"; do
|
|
59
|
+
case "$prev" in --sock) sock="$a"; prev=""; continue;; --width) prev=""; continue;; esac
|
|
60
|
+
case "$a" in --sock|--width) prev="$a";; -*) ;; *) word="$a";; esac
|
|
61
|
+
done
|
|
62
|
+
if [ -n "$word" ]; then
|
|
63
|
+
extra=""
|
|
64
|
+
if [ -z "$sock" ]; then
|
|
65
|
+
if [ -n "${TMUX:-}" ]; then sock="$(printf %s "${TMUX%%,*}")"; sock="${sock##*/}"; extra=1; else sock=default; fi
|
|
66
|
+
fi
|
|
67
|
+
if ! tmux -L "$sock" has-session -t "=$word" 2>/dev/null; then
|
|
68
|
+
echo "sessionview: no command or session named '$word' (on tmux server $sock); a new session is: sessionview session $word" >&2
|
|
69
|
+
usage >&2
|
|
70
|
+
exit 2
|
|
71
|
+
fi
|
|
72
|
+
# the frame looks where this checked: inside tmux, the caller's own server
|
|
73
|
+
[ -n "$extra" ] && set -- "$@" --sock "$sock"
|
|
74
|
+
fi
|
|
75
|
+
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
|