@projmux/darwin-x64 0.0.0-reserved
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.
- package/LICENSE +21 -0
- package/README.md +327 -0
- package/bin/projmux +0 -0
- package/package.json +21 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Crevisse Partners
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# projmux
|
|
2
|
+
|
|
3
|
+
Project-aware tmux workspace management for people who live in terminals.
|
|
4
|
+
|
|
5
|
+
`projmux` turns project directories into durable tmux workspaces with previews,
|
|
6
|
+
sidebar navigation, generated keybindings, status metadata, and AI-pane
|
|
7
|
+
attention signals. It can run as its own tmux app (`projmux shell`) or install
|
|
8
|
+
the same behavior into your existing tmux server.
|
|
9
|
+
|
|
10
|
+
[한국어 README](README-ko.md)
|
|
11
|
+
|
|
12
|
+
## Why projmux
|
|
13
|
+
|
|
14
|
+
Most tmux project switchers stop at "pick a directory and attach a session".
|
|
15
|
+
`projmux` treats that as the foundation, then adds the app-level pieces needed
|
|
16
|
+
for a daily terminal workspace:
|
|
17
|
+
|
|
18
|
+
- **Project identity stays stable.** Directories, pins, live sessions, preview
|
|
19
|
+
selection, and lifecycle commands all use the same normalized session model.
|
|
20
|
+
- **The UI shows context before you switch.** Popup and sidebar pickers preview
|
|
21
|
+
sessions, windows, panes, git branch, Kubernetes context, and pane metadata.
|
|
22
|
+
- **The tmux layer is generated, not hand-spliced.** `projmux` writes the tmux
|
|
23
|
+
config it needs for popup launchers, window/pane rename flows, status
|
|
24
|
+
segments, pane borders, attention badges, and app mode.
|
|
25
|
+
- **AI panes are first-class.** Codex and Claude panes can be launched,
|
|
26
|
+
labeled, tracked as thinking or waiting, surfaced in pane/window/session
|
|
27
|
+
badges, and announced through desktop notifications.
|
|
28
|
+
- **You can choose isolation or integration.** Use `projmux shell` as a
|
|
29
|
+
self-contained tmux app, or install the generated snippet into your normal
|
|
30
|
+
tmux server.
|
|
31
|
+
|
|
32
|
+
## What's new in 0.4
|
|
33
|
+
|
|
34
|
+
- **`projmux setup` / `projmux init`** — diagnose terminal key delivery,
|
|
35
|
+
then auto-merge the right CSI-u bindings into Ghostty or Windows
|
|
36
|
+
Terminal configs.
|
|
37
|
+
- **`projmux doctor`** — runtime dependency report with minimum-version
|
|
38
|
+
enforcement (tmux 3.4, fzf 0.55).
|
|
39
|
+
- **`projmux focus`** — unified switch-client dispatch shared by the
|
|
40
|
+
AI reply-ready flow and the status-bar notify click.
|
|
41
|
+
- **Persistent notify queue** — `projmux notify push|list|ack|reconcile`
|
|
42
|
+
with TTL, severity, source, and target metadata. See
|
|
43
|
+
[notify-queue.md](docs/notify-queue.md).
|
|
44
|
+
- **Authoritative usage tracking** — `projmux usage` reads Claude's
|
|
45
|
+
OAuth usage endpoint and Codex's local rollout `rate_limits`. See
|
|
46
|
+
[usage-tracking.md](docs/usage-tracking.md).
|
|
47
|
+
- **Two-line clickable status bar** — row 0 keeps the native window
|
|
48
|
+
list (click a tab to switch), row 1 splits a notify HUD pill (left)
|
|
49
|
+
and a usage HUD bar (right). Both segments degrade gracefully on
|
|
50
|
+
narrow status budgets. See [statusbar.md](docs/statusbar.md).
|
|
51
|
+
|
|
52
|
+
## What It Does
|
|
53
|
+
|
|
54
|
+
- Creates or switches to tmux sessions from project directories.
|
|
55
|
+
- Shows existing sessions with window and pane previews.
|
|
56
|
+
- Provides popup and sidebar navigation surfaces backed by `fzf`.
|
|
57
|
+
- Pins important projects and scans common source roots for new ones.
|
|
58
|
+
- Persists preview selection for fast window and pane cycling.
|
|
59
|
+
- Generates tmux bindings for launchers, rename prompts, pane borders, status
|
|
60
|
+
segments, and attention hooks.
|
|
61
|
+
- Displays git branch and Kubernetes context/namespace in the status area.
|
|
62
|
+
- Renders a two-line clickable status bar with click-to-switch tabs on
|
|
63
|
+
row 0 and HUD-style notify (left) and AI usage (right) segments on
|
|
64
|
+
row 1.
|
|
65
|
+
- Launches AI splits and keeps their agent name, topic, status, and
|
|
66
|
+
notification state visible in tmux.
|
|
67
|
+
|
|
68
|
+
## Typical Workflow
|
|
69
|
+
|
|
70
|
+
```sh
|
|
71
|
+
projmux shell
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Open the app once, then use its generated tmux bindings to:
|
|
75
|
+
|
|
76
|
+
- jump between projects from a sidebar or popup,
|
|
77
|
+
- inspect sessions before attaching,
|
|
78
|
+
- split Codex, Claude, or a plain shell into the current workspace,
|
|
79
|
+
- rename windows and AI pane topics without losing metadata,
|
|
80
|
+
- see which panes need review from badges and desktop notifications.
|
|
81
|
+
|
|
82
|
+
## Requirements
|
|
83
|
+
|
|
84
|
+
- [Go 1.24+](https://go.dev/dl/) — required to install or build the binary.
|
|
85
|
+
- [tmux](https://github.com/tmux/tmux/wiki/Installing) **≥ 3.4** — the workspace runtime. Earlier versions miss `display-popup -T` and other features projmux depends on.
|
|
86
|
+
- [fzf](https://github.com/junegunn/fzf#installation) **≥ 0.55** — interactive popup/sidebar pickers. The multiline picker uses `--marker-multi-line`, `--gap-line`, and `--highlight-line`, which landed by 0.55.
|
|
87
|
+
- [zsh](https://zsh.sourceforge.io/) — default shell of the generated app config (`projmux shell`).
|
|
88
|
+
- [git](https://git-scm.com/downloads) — branch/status metadata.
|
|
89
|
+
- `stty` — POSIX terminal control, used by `projmux setup`. Already shipped by every macOS / Linux base system; not applicable on Windows hosts.
|
|
90
|
+
- [kubectl](https://kubernetes.io/docs/tasks/tools/) — optional, only for the Kubernetes status segment.
|
|
91
|
+
|
|
92
|
+
Desktop notifications: Linux uses `notify-send`; WSL routes Windows toasts via
|
|
93
|
+
`powershell.exe`. Override either with `PROJMUX_NOTIFY_HOOK`.
|
|
94
|
+
|
|
95
|
+
Run `projmux doctor` any time to verify everything is on `PATH` and that
|
|
96
|
+
tmux/fzf meet the minimum supported versions.
|
|
97
|
+
|
|
98
|
+
## Install
|
|
99
|
+
|
|
100
|
+
```sh
|
|
101
|
+
go install github.com/crevissepartners/projmux/cmd/projmux@latest
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
This drops the binary in `$(go env GOBIN)` (when set) or `$(go env GOPATH)/bin`
|
|
105
|
+
(default `~/go/bin`). Make sure that directory is on your `PATH`:
|
|
106
|
+
|
|
107
|
+
```sh
|
|
108
|
+
export PATH="$(go env GOPATH)/bin:$PATH"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Verify:
|
|
112
|
+
|
|
113
|
+
```sh
|
|
114
|
+
projmux version
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Optional: `PROJMUX_PROJDIR`
|
|
118
|
+
|
|
119
|
+
`PROJMUX_PROJDIR` is the default project root projmux uses for picker and
|
|
120
|
+
discovery. It is optional — when unset, projmux falls back to its built-in
|
|
121
|
+
source-root discovery (`~/source`, `~/work`, `~/projects`, `~/src`, `~/code`,
|
|
122
|
+
`~/source/repos`).
|
|
123
|
+
|
|
124
|
+
```sh
|
|
125
|
+
export PROJMUX_PROJDIR="$HOME/source/repos"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Add the line to `~/.zshrc` (or your shell's rc file). The resolved value is
|
|
129
|
+
memoized to `~/.config/projmux/projdir` after first use, so later shells keep
|
|
130
|
+
the same root even without the env var.
|
|
131
|
+
|
|
132
|
+
`PROJMUX_PROJDIR` accepts an OS-native PATH-style multi-value (`:` on
|
|
133
|
+
Linux/macOS, `;` on Windows). The first non-empty entry is the primary
|
|
134
|
+
project root; any additional entries are prepended to the managed-roots
|
|
135
|
+
search list, so they participate in discovery just like
|
|
136
|
+
`PROJMUX_MANAGED_ROOTS`. Only the primary path is memoized to
|
|
137
|
+
`~/.config/projmux/projdir`.
|
|
138
|
+
|
|
139
|
+
```sh
|
|
140
|
+
# Linux/macOS — primary repo + secondary search root
|
|
141
|
+
export PROJMUX_PROJDIR="$HOME/source/repos:/srv/work/repos"
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
#### Set the project root at install time
|
|
145
|
+
|
|
146
|
+
```sh
|
|
147
|
+
PROJMUX_PROJDIR=/your/path go install github.com/crevissepartners/projmux/cmd/projmux@latest
|
|
148
|
+
PROJMUX_PROJDIR=/your/path projmux tmux apply
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
The first invocation that sees the env var writes
|
|
152
|
+
`~/.config/projmux/projdir`, so later shells without the env var still
|
|
153
|
+
resolve the same root.
|
|
154
|
+
|
|
155
|
+
### From source
|
|
156
|
+
|
|
157
|
+
```sh
|
|
158
|
+
git clone https://github.com/crevissepartners/projmux.git
|
|
159
|
+
cd projmux
|
|
160
|
+
make install
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`make install` builds, atomically replaces `$(go env GOPATH)/bin/projmux`, and
|
|
164
|
+
runs `projmux tmux apply` so the live `-L projmux` server picks up new bindings
|
|
165
|
+
without a restart. Override the destination with `INSTALL_DIR=/usr/local/bin`.
|
|
166
|
+
|
|
167
|
+
## Quick Start
|
|
168
|
+
|
|
169
|
+
Launch the isolated projmux tmux app:
|
|
170
|
+
|
|
171
|
+
```sh
|
|
172
|
+
projmux shell
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
projmux owns this tmux server, its generated config, status bar, and popup
|
|
176
|
+
bindings. The left status badge shows the current project name; the right side
|
|
177
|
+
shows path, kube segment, git segment, and clock.
|
|
178
|
+
|
|
179
|
+
If a key does not fire, run `projmux setup` to see which sequences your
|
|
180
|
+
terminal swallows, then `projmux init [terminal] --apply` (auto-detects when
|
|
181
|
+
no terminal is given) to merge the right CSI-u bindings into your terminal
|
|
182
|
+
config. Dotfiles users on multi-machine setups should pass
|
|
183
|
+
`--allow-symlink` or `--config <path>` to make their intent explicit. Full
|
|
184
|
+
flow and the manual CSI-u fallback are in
|
|
185
|
+
[Terminal Keybindings](docs/keybindings.md).
|
|
186
|
+
|
|
187
|
+
If anything looks off, `projmux doctor` reports which dependency is
|
|
188
|
+
missing or stale and how to install it. See [Requirements](#requirements)
|
|
189
|
+
for the supported versions.
|
|
190
|
+
|
|
191
|
+
## Upgrading
|
|
192
|
+
|
|
193
|
+
`projmux upgrade` reinstalls the binary via `go install`, atomically replaces
|
|
194
|
+
the active file, and reapplies the live tmux config so a running `-L projmux`
|
|
195
|
+
server picks up new bindings without a restart.
|
|
196
|
+
|
|
197
|
+
```sh
|
|
198
|
+
projmux upgrade # @latest, replace + apply
|
|
199
|
+
projmux upgrade --ref @v0.2.0 # pin a specific tag
|
|
200
|
+
projmux upgrade --ref @main # track a branch
|
|
201
|
+
projmux upgrade --target /usr/local/bin/projmux # replace another path
|
|
202
|
+
projmux upgrade --no-apply # skip 'projmux tmux apply'
|
|
203
|
+
projmux upgrade --dry-run # print the steps only
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
The upgrade reads `PROJMUX_PROJDIR` from the calling shell and memoizes the
|
|
207
|
+
primary (first) path to `~/.config/projmux/projdir`, so the new binary keeps
|
|
208
|
+
the same project root context as the one it replaces.
|
|
209
|
+
|
|
210
|
+
Pass a new project root inline to atomically switch the binary and the saved
|
|
211
|
+
projdir in one step:
|
|
212
|
+
|
|
213
|
+
```sh
|
|
214
|
+
PROJMUX_PROJDIR=/new/path projmux upgrade
|
|
215
|
+
|
|
216
|
+
# Multi-path also works; only the primary entry is persisted to the saved file.
|
|
217
|
+
PROJMUX_PROJDIR="/main/repos:/secondary/repos" projmux upgrade # Linux/macOS
|
|
218
|
+
# Windows: PROJMUX_PROJDIR="C:\main\repos;C:\secondary\repos"
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Usage
|
|
222
|
+
|
|
223
|
+
Day-to-day, projmux is driven by tmux keybindings inside `projmux shell` — see
|
|
224
|
+
[Terminal Keybindings](docs/keybindings.md). For the full CLI surface (pins,
|
|
225
|
+
preview state, status helpers, `upgrade`, etc.), run `projmux help` or
|
|
226
|
+
`<command> --help`.
|
|
227
|
+
|
|
228
|
+
## How It Finds Projects
|
|
229
|
+
|
|
230
|
+
`projmux switch` combines pinned directories, live tmux sessions, and discovered
|
|
231
|
+
project roots. The default discovery logic favors common source locations such
|
|
232
|
+
as `~/source`, `~/work`, `~/projects`, `~/src`, `~/code`, and `~/source/repos`
|
|
233
|
+
when they exist. `projmux settings` also has `Project Picker > Add Project...`,
|
|
234
|
+
which scans those filesystem roots up to depth 3 so projects outside `~` and
|
|
235
|
+
`~rp` can be added to the picker. Session names are derived from normalized
|
|
236
|
+
directory paths, so a project keeps the same tmux session name across launches.
|
|
237
|
+
|
|
238
|
+
For permanent search-root customization, the Project Picker section also
|
|
239
|
+
includes:
|
|
240
|
+
|
|
241
|
+
- `+ Add Workdir...` - append a single directory to the saved workdirs list.
|
|
242
|
+
- `Workdirs` - review and remove saved workdirs. The same picker also surfaces
|
|
243
|
+
any active `PROJMUX_MANAGED_ROOTS` / `TMUX_SESSIONIZER_ROOTS` env values as
|
|
244
|
+
read-only rows so you can see why an env list might be overriding the saved
|
|
245
|
+
file.
|
|
246
|
+
|
|
247
|
+
`Add Workdir > Type path manually...` gives you a typed entry that skips the
|
|
248
|
+
filesystem scan. Use it for paths you do not want crawled, e.g. WSL mounts
|
|
249
|
+
(`/mnt/c/Users/...`), large NFS mounts, or per-project temp roots.
|
|
250
|
+
|
|
251
|
+
The saved file lives at `~/.config/projmux/workdirs` (one absolute path per
|
|
252
|
+
line, `#` comments allowed). It is consulted only when the env vars are unset.
|
|
253
|
+
|
|
254
|
+
## Hooks
|
|
255
|
+
|
|
256
|
+
projmux runs an optional user script at `~/.config/projmux/hooks/post-create`
|
|
257
|
+
whenever it creates a new tmux session. Use it to inject per-session env via
|
|
258
|
+
`tmux set-environment` (e.g. picking a `GH_TOKEN` based on the project path).
|
|
259
|
+
Missing or non-executable hooks are skipped silently; failures never block
|
|
260
|
+
session creation. See [Hooks](docs/hooks.md) for the env contract, examples,
|
|
261
|
+
and troubleshooting.
|
|
262
|
+
|
|
263
|
+
## Environment Variables
|
|
264
|
+
|
|
265
|
+
| Variable | Purpose |
|
|
266
|
+
| --- | --- |
|
|
267
|
+
| `PROJMUX_PROJDIR` | Default project root for the current shell. Accepts an OS-native PATH-style multi-value: the first entry is the primary repo root (memoized to `~/.config/projmux/projdir`), and any additional entries are prepended to the managed-roots search list. |
|
|
268
|
+
| `PROJMUX_MANAGED_ROOTS` | Colon-separated list of search roots. Overrides the saved/default list. |
|
|
269
|
+
| `PROJMUX_NOTIFY_HOOK` | External executable that receives AI desktop notifications instead of the built-in sender. |
|
|
270
|
+
| `PROJMUX_USAGE_STATE_DIR` | Override directory for the AI-usage snapshot cache. Defaults to `<state>/projmux/usage`. Point this at a synced location (Dropbox, iCloud Drive, etc) to share authoritative usage between machines. |
|
|
271
|
+
| `PROJMUX_USAGE_DEBUG` | When non-empty, surfaces adapter errors from `projmux status usage` to stderr instead of swallowing them. |
|
|
272
|
+
| `PROJMUX_USAGE_LIMITS_PATH` | Deprecated. Limits now come from the upstream APIs (Anthropic OAuth usage endpoint, Codex `rate_limits`); this variable is read but ignored. |
|
|
273
|
+
|
|
274
|
+
## AI usage tracking
|
|
275
|
+
|
|
276
|
+
`projmux usage` reports authoritative 5-hour and weekly utilisation for both
|
|
277
|
+
Claude Code and the Codex CLI. Both adapters read from the upstream's own
|
|
278
|
+
view of your account so the percentages match what `claude /usage` and
|
|
279
|
+
`codex` show natively:
|
|
280
|
+
|
|
281
|
+
- **Claude** — calls `GET https://api.anthropic.com/api/oauth/usage` with the
|
|
282
|
+
bearer token in `~/.claude/.credentials.json`. The adapter performs a
|
|
283
|
+
single refresh round-trip on 401 and rewrites the credentials file with
|
|
284
|
+
the rotated tokens. Tokens are never logged.
|
|
285
|
+
- **Codex** — reads the most recent `rate_limits` payload from the newest
|
|
286
|
+
`~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl`. `primary` maps to the 5h
|
|
287
|
+
window, `secondary` to the weekly window.
|
|
288
|
+
|
|
289
|
+
Snapshots are persisted under `<state>/projmux/usage/snapshots.json` (or
|
|
290
|
+
`PROJMUX_USAGE_STATE_DIR`) and refreshed at most every 30 seconds when
|
|
291
|
+
`projmux status usage` runs in the tmux status bar.
|
|
292
|
+
|
|
293
|
+
## Scope
|
|
294
|
+
|
|
295
|
+
`projmux` owns the portable session-management core: naming, discovery, pins,
|
|
296
|
+
preview state, tmux orchestration, status segments, and generated tmux bindings.
|
|
297
|
+
|
|
298
|
+
## Development
|
|
299
|
+
|
|
300
|
+
Useful commands:
|
|
301
|
+
|
|
302
|
+
```sh
|
|
303
|
+
make build
|
|
304
|
+
make fmt
|
|
305
|
+
make fix
|
|
306
|
+
make test
|
|
307
|
+
make test-integration
|
|
308
|
+
make test-e2e
|
|
309
|
+
make verify
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
More documentation:
|
|
313
|
+
|
|
314
|
+
- [Architecture](docs/architecture.md)
|
|
315
|
+
- [CLI Reference](docs/cli.md)
|
|
316
|
+
- [Statusbar](docs/statusbar.md)
|
|
317
|
+
- [Notify queue](docs/notify-queue.md)
|
|
318
|
+
- [Usage tracking](docs/usage-tracking.md)
|
|
319
|
+
- [Hooks](docs/hooks.md)
|
|
320
|
+
- [Migration Plan](docs/migration-plan.md)
|
|
321
|
+
- [Repo Layout](docs/repo-layout.md)
|
|
322
|
+
- [Terminal Keybindings](docs/keybindings.md)
|
|
323
|
+
- [Agent Workflow](docs/agent-workflow.md)
|
|
324
|
+
|
|
325
|
+
## License
|
|
326
|
+
|
|
327
|
+
MIT. See [LICENSE](LICENSE).
|
package/bin/projmux
ADDED
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@projmux/darwin-x64",
|
|
3
|
+
"version": "0.0.0-reserved",
|
|
4
|
+
"description": "macOS x64 binary for projmux",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/crevissepartners/projmux.git"
|
|
9
|
+
},
|
|
10
|
+
"os": [
|
|
11
|
+
"darwin"
|
|
12
|
+
],
|
|
13
|
+
"cpu": [
|
|
14
|
+
"x64"
|
|
15
|
+
],
|
|
16
|
+
"files": [
|
|
17
|
+
"bin/projmux",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
]
|
|
21
|
+
}
|