projmux 0.6.2 → 0.6.4
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/README.md +3 -3
- package/docs/agent-workflow.md +22 -9
- package/docs/architecture.md +24 -0
- package/docs/cli.md +23 -19
- package/docs/configuration.md +71 -53
- package/docs/globalization.md +244 -0
- package/docs/hooks.md +7 -5
- package/docs/install.md +14 -11
- package/docs/keybindings.md +159 -309
- package/docs/native-picker-no-fzf-poc.md +8 -4
- package/docs/native-picker-parity.md +4 -4
- package/docs/notify-queue.md +8 -6
- package/docs/session-restore.md +20 -1
- package/docs/settings-ia.md +22 -5
- package/docs/statusbar.md +25 -12
- package/docs/testing.md +3 -2
- package/docs/theme-palette.md +105 -0
- package/docs/tmux-surface-inventory.md +794 -0
- package/docs/usage-tracking.md +4 -4
- package/package.json +5 -5
package/docs/session-restore.md
CHANGED
|
@@ -11,6 +11,16 @@ projmux session-state restore --dry-run [--session <name>]
|
|
|
11
11
|
projmux session-state delete [--session <name>]
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
+
Snapshots preserve source metadata, not a final display label. Window records
|
|
15
|
+
keep `window_name`; pane records keep `pane_title`, recipe fields, AI topic
|
|
16
|
+
metadata (`@projmux_ai_topic`), and resume metadata when available. There is no
|
|
17
|
+
`display_label` field in the snapshot schema. After restore, pane borders and
|
|
18
|
+
app window tabs are display-time tmux policy: the app config derives both from
|
|
19
|
+
the active pane's visible label expression, while raw shell or terminal titles
|
|
20
|
+
remain metadata that may change independently. Branch names continue to appear
|
|
21
|
+
in the statusbar git segment; branch-based shell title overwrites are not the
|
|
22
|
+
canonical Projmux window naming source.
|
|
23
|
+
|
|
14
24
|
The primary inspection surface is `Projects > Sessions > State`. It shows a
|
|
15
25
|
read-only overview first: latest snapshot status, named snapshots, window ->
|
|
16
26
|
pane structure, cwd, recipe, and agent resume health. Mutation belongs one
|
|
@@ -74,7 +84,16 @@ metadata when available. `Back` returns to the project list without creating,
|
|
|
74
84
|
replaying, or opening a session. After the startup mode is selected, project
|
|
75
85
|
hook/config trust is evaluated if needed; approval continues the selected path
|
|
76
86
|
and deny/cancel aborts before session create, snapshot replay, or startup
|
|
77
|
-
command.
|
|
87
|
+
command. The Alt-1 sidebar does not render trust approve/deny rows inline:
|
|
88
|
+
before trust is requested, projmux snapshots the sidebar query/selection
|
|
89
|
+
context and hands the selected open continuation to a detached tmux job. That
|
|
90
|
+
job closes the sidebar popup state for the client and opens the shared `Trust
|
|
91
|
+
project hooks` popup as a client-scoped decision surface, so no code relies on
|
|
92
|
+
the self-closing sidebar popup process continuing after `display-popup -C`.
|
|
93
|
+
Deny/cancel or trust-popup errors return to the sidebar near the same
|
|
94
|
+
query/selection with a visible status message; only a missing/invalid context
|
|
95
|
+
may fall back to a closed popup plus tmux message. Existing sessions switch
|
|
96
|
+
directly without a startup picker or trust gate.
|
|
78
97
|
|
|
79
98
|
Default `projmux shell` no longer opens a compatibility startup picker and no
|
|
80
99
|
longer accepts startup selector flags for session-state restore. It always
|
package/docs/settings-ia.md
CHANGED
|
@@ -17,6 +17,23 @@ view-first layout:
|
|
|
17
17
|
first, then the edit actions, then the explanatory hints.
|
|
18
18
|
- `Settings > Keybindings` is the single entry point for keybinding work. The
|
|
19
19
|
page is split into four chips: `Bindings`, `Diagnostic`, `Probe`, and `Init`.
|
|
20
|
+
- `Settings > Keybindings > Bindings` is a keybinding discovery surface, not
|
|
21
|
+
only a launch-toggle editor. It must show `Toggle Project Sidebar` with the
|
|
22
|
+
guaranteed `Alt-1` / `M-1` default, plus sidebar-local commands, picker-local
|
|
23
|
+
commands, `Pane navigation`, `Window navigation`, and `Rename` groups or
|
|
24
|
+
equivalent searchable rows.
|
|
25
|
+
- Rows that cannot safely be edited still stay visible. Mark diagnostic-only
|
|
26
|
+
rows with the delivery path and reason instead of hiding them or turning them
|
|
27
|
+
into unsupported editable aliases. Transport-dependent rows stay visible with
|
|
28
|
+
a separate default transport key and additive plain-alias entry; replacing or
|
|
29
|
+
disabling the transport default is not exposed.
|
|
30
|
+
- `Alt-1..5` are the only guaranteed zero-config launch defaults. `UserN` and
|
|
31
|
+
`CSI-u` are legacy/removal/unsupported targets, not supported fallback
|
|
32
|
+
guidance for Settings, setup, init, or docs.
|
|
33
|
+
- The launcher checkout policy applies in Settings: the project sidebar is a
|
|
34
|
+
first-class row, action rows use human-readable labels, internal IDs appear
|
|
35
|
+
only in detail/source/keymap contexts, and runtime footers are status hints,
|
|
36
|
+
not key discovery.
|
|
20
37
|
- `Settings > Notifications` owns notification delivery IA. Desktop notification
|
|
21
38
|
mode, AI desktop notification dedupe duration, delivery source diagnostics,
|
|
22
39
|
AI hook quiet policy, in-app queue status, and
|
|
@@ -68,8 +85,8 @@ Hooks remain the reference pattern for this IA:
|
|
|
68
85
|
|
|
69
86
|
Shell bootstrap UX is phase-split:
|
|
70
87
|
|
|
71
|
-
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
88
|
+
- `projmux welcome` remains the stdout revisit command.
|
|
89
|
+
- `Settings > About > Welcome` opens a visible native viewer independent of
|
|
90
|
+
shell skip state.
|
|
91
|
+
- Shell `skip_version` state applies only to the automatic `projmux shell`
|
|
92
|
+
prompt; it does not hide manual revisit surfaces.
|
package/docs/statusbar.md
CHANGED
|
@@ -5,6 +5,10 @@ clickable status bar. The same dispatcher (`projmux statusbar click`)
|
|
|
5
5
|
handles both mouse clicks and the keyboard chord, so adding a new
|
|
6
6
|
segment only requires one wiring point.
|
|
7
7
|
|
|
8
|
+
The built-in fallback colors used by the statusbar are semantic tokens in
|
|
9
|
+
`internal/theme/palette.go`; see [theme-palette.md](theme-palette.md) for the
|
|
10
|
+
truecolor to tmux 256-color mapping policy and palette inventory.
|
|
11
|
+
|
|
8
12
|
## Layout
|
|
9
13
|
|
|
10
14
|
```
|
|
@@ -37,10 +41,17 @@ row 1 [#S] #{pane_current_path} ⎈ <ctx>/<ns> <git> %H:%M
|
|
|
37
41
|
branch or detached commit,
|
|
38
42
|
then compact state indicators when available: `*` for local changes,
|
|
39
43
|
`+N` for staged entries, and `↑N`/`↓N` for ahead/behind counts. Each
|
|
40
|
-
state token gets its own compact foreground color
|
|
41
|
-
|
|
44
|
+
state token gets its own compact foreground color on the same muted branch
|
|
45
|
+
block; the indicators drop bold styling so git state remains readable
|
|
46
|
+
without dominating the status row. Window tab indexes stay left of each tab,
|
|
42
47
|
and tab titles are centered in a fixed-width trim so long active pane names
|
|
43
48
|
do not resize the status row.
|
|
49
|
+
- The settings chip keeps its label padding inside the `settings` range
|
|
50
|
+
and inside the chip background. The compact app chip renders `` with
|
|
51
|
+
the extra right-side icon padding painted by the same background, while
|
|
52
|
+
the standalone ` projmux` label keeps symmetric one-cell label padding.
|
|
53
|
+
The chip does not append an extra default-styled trailing space after
|
|
54
|
+
`#[default]`, so the painted button reaches the status row's right edge.
|
|
44
55
|
- Both HUD segments degrade gracefully when the cell budget is tight; see
|
|
45
56
|
[notify-queue.md](notify-queue.md) and [usage-tracking.md](usage-tracking.md)
|
|
46
57
|
for the per-segment tier ladder.
|
|
@@ -85,8 +96,8 @@ not inherit notification styling.
|
|
|
85
96
|
`usage` opens a native-framed detail HUD for the compact usage bar. It reads
|
|
86
97
|
the cached usage state in-process, keeps the existing `projmux usage` CLI
|
|
87
98
|
output shape unchanged for external consumers, aligns model/window rows with
|
|
88
|
-
right-aligned numeric values, dims unavailable values,
|
|
89
|
-
|
|
99
|
+
right-aligned numeric values, dims unavailable values, keeps stale sync/age
|
|
100
|
+
metadata muted, and colors only threshold values: amber at 80% and red at 95%.
|
|
90
101
|
Session State inspection lives under `Projects > Sessions > State`; global
|
|
91
102
|
Settings > Session State is settings-only and the statusbar no longer exposes a
|
|
92
103
|
duplicate State button.
|
|
@@ -99,14 +110,16 @@ popup command prints one quoted payload and waits for a plain Enter read so it
|
|
|
99
110
|
does not leave terminal key state behind. The usage popup uses the same
|
|
100
111
|
single-payload print and plain Enter-close pattern. It shows the authoritative
|
|
101
112
|
last collect timestamp when present, falls back to the cache file mtime when
|
|
102
|
-
needed, and
|
|
103
|
-
|
|
104
|
-
notification
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
113
|
+
needed, and keeps stale sync metadata muted instead of escalating it to a
|
|
114
|
+
warning color.
|
|
115
|
+
The notification HUD detail surface opens the right-side notification popup
|
|
116
|
+
through the notify sidebar action, with newest-first rows and an
|
|
117
|
+
attention-tinted title. When notification icon decoration is `symbol` or
|
|
118
|
+
`emoji`, the bell appears before the title text.
|
|
119
|
+
Selecting a row still focuses and acknowledges that notification. Internal
|
|
120
|
+
notify commands use `NotifySidebar:*` IDs in `keymap.toml`; runtime footers
|
|
121
|
+
render key guides from the merged keymap and prefer the default alias when it
|
|
122
|
+
is still configured.
|
|
110
123
|
|
|
111
124
|
Empty `#{mouse_status_range}` (a click on whitespace) falls through to
|
|
112
125
|
`select-window -t @<mouse_window>` when `--mouse-window` is non-empty,
|
package/docs/testing.md
CHANGED
|
@@ -44,8 +44,9 @@ execution should not need network access after the image is built.
|
|
|
44
44
|
The Docker suites do not replace checks that depend on a real host terminal,
|
|
45
45
|
desktop shell, or OS integration:
|
|
46
46
|
|
|
47
|
-
- terminal emulator key delivery and swallowing for `Alt-1..5
|
|
48
|
-
|
|
47
|
+
- terminal emulator key delivery and swallowing for guaranteed `Alt-1..5`
|
|
48
|
+
launch keys, optional user-configured direct aliases, and transport-dependent
|
|
49
|
+
chords
|
|
49
50
|
- Windows Terminal and WSL interop
|
|
50
51
|
- macOS host path, shell, and GUI behavior
|
|
51
52
|
- desktop notification click callbacks
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Theme Palette
|
|
2
|
+
|
|
3
|
+
This document records the built-in fallback palette that native projmux UI
|
|
4
|
+
surfaces use before project or global theme settings exist. The source of
|
|
5
|
+
truth in code is `internal/theme/palette.go`.
|
|
6
|
+
|
|
7
|
+
## Scope
|
|
8
|
+
|
|
9
|
+
The fallback palette is a semantic token layer, not a user configuration
|
|
10
|
+
schema. It gives current renderers shared names for the colors stabilized by
|
|
11
|
+
the Visual palette baseline work:
|
|
12
|
+
|
|
13
|
+
- Native picker truecolor SGR tokens.
|
|
14
|
+
- Native sidebar and chip-strip 256-color SGR tokens.
|
|
15
|
+
- Tmux statusbar and generated-config color tokens.
|
|
16
|
+
- Settings/action/state/trust/attention helper tokens.
|
|
17
|
+
|
|
18
|
+
Future Theme settings should resolve project/global values into this token
|
|
19
|
+
shape, then keep the built-in values as the final fallback. This phase does not
|
|
20
|
+
add `config.toml` fields, a resolver, a Settings editor, presets, import, or
|
|
21
|
+
export.
|
|
22
|
+
|
|
23
|
+
## Mapping Policy
|
|
24
|
+
|
|
25
|
+
Native picker rows can emit truecolor SGR, while tmux statusbar/config strings
|
|
26
|
+
must use tmux color specs. The fallback therefore stores both forms when a
|
|
27
|
+
role crosses surfaces.
|
|
28
|
+
|
|
29
|
+
Rules:
|
|
30
|
+
|
|
31
|
+
- Truecolor tokens keep exact SGR strings for native picker chrome and
|
|
32
|
+
Settings rows.
|
|
33
|
+
- Tmux tokens keep `colourN` strings where tmux owns rendering.
|
|
34
|
+
- Native chip/sidebar badge tokens use 256-color SGR when they intentionally
|
|
35
|
+
mirror tmux colors.
|
|
36
|
+
- Output compatibility wins inside this baseline. For example, the kube
|
|
37
|
+
segment keeps tmux's named `red` and `blue` behind semantic tokens until that
|
|
38
|
+
segment gets a separate redesign.
|
|
39
|
+
- Renderers should reference semantic names instead of spelling color literals
|
|
40
|
+
directly. Test fixtures may still pin rendered escape strings.
|
|
41
|
+
|
|
42
|
+
## Fallback Inventory
|
|
43
|
+
|
|
44
|
+
Chrome and text:
|
|
45
|
+
|
|
46
|
+
| Role | Native SGR | Tmux |
|
|
47
|
+
| --- | --- | --- |
|
|
48
|
+
| `surface.active` | `48;2;44;56;61` with selected white text | window active `colour240` / `colour231` |
|
|
49
|
+
| `surface.raised` | `48;2;24;34;38` with `216;224;228` text | window inactive `colour235` / `colour245` |
|
|
50
|
+
| `text.primary` | `216;224;228` | `colour231` or `colour254` for identity text |
|
|
51
|
+
| `text.secondary` | `164;176;182` | `colour245` |
|
|
52
|
+
| `text.muted` | `117;132;140` or ANSI dim | `colour244`, `colour238`, `colour240` for low-signal blocks |
|
|
53
|
+
|
|
54
|
+
Accents and state:
|
|
55
|
+
|
|
56
|
+
| Role | Native SGR | Tmux |
|
|
57
|
+
| --- | --- | --- |
|
|
58
|
+
| `accent.identity` | not emitted directly today | `colour60` bg / `colour254` fg |
|
|
59
|
+
| `accent.action` | `141;205;142`, strong `122;199;173` | `colour29` bg / `colour230` fg |
|
|
60
|
+
| `accent.attention` | notify HUD background/project family | `colour53`, project `colour90` |
|
|
61
|
+
| `accent.ai` | notify agent `colour37` family | `colour37` bg / `colour121` fg |
|
|
62
|
+
| `state.progress` | `255;204;102`; switch attention/busy dot and pending notify title/bell/badge `colour220` | `colour220` |
|
|
63
|
+
| `state.warning` | usage/status popup ANSI 256 wrapper | `colour214` |
|
|
64
|
+
| `state.danger` | `255;107;107` | `colour160` |
|
|
65
|
+
| `state.success` | settings/trust green families | `colour72`, `colour151` |
|
|
66
|
+
| `state.ahead` | switch/git metadata and notify age ANSI 256 wrapper | `colour153` |
|
|
67
|
+
| `git.branch` | switch/sidebar branch badge uses the statusbar git branch block colors | `colour30` bg / `colour231` fg |
|
|
68
|
+
|
|
69
|
+
Surface-specific tokens:
|
|
70
|
+
|
|
71
|
+
| Surface | Tokens |
|
|
72
|
+
| --- | --- |
|
|
73
|
+
| Native picker | current row, titlebar, rule, pointer, highlight, muted text, chip active/inactive/disabled |
|
|
74
|
+
| Statusbar row 1 | session identity, cwd secondary text, divider, git branch block, git dirty/staged/ahead/behind, settings action chip, clock |
|
|
75
|
+
| Notify HUD/sidebar | line bg/fg, project badge, info/warn/crit/stale/gone badges, AI agent badge, count/age text |
|
|
76
|
+
| Usage HUD/popup | OK/warning/critical/over-limit bars and numbers, empty cells, muted sync age |
|
|
77
|
+
| Settings | add/type/open action, destructive remove/quit, back/cancel, info/read-only, dim description, root action/dim rows, trust trusted/stale/untrusted |
|
|
78
|
+
| Switch picker cards | path metadata, active/inactive git branch badges aligned with statusbar git branch block colors, statusbar-like window tabs, inline attention/progress dots |
|
|
79
|
+
|
|
80
|
+
## Current Literal Inventory
|
|
81
|
+
|
|
82
|
+
After the Phase 3 token pass, raw color values intentionally remain in:
|
|
83
|
+
|
|
84
|
+
- `internal/theme/palette.go`, the fallback palette source of truth.
|
|
85
|
+
- Unit and golden fixtures that assert exact rendered output.
|
|
86
|
+
- `internal/app/welcome.go`, which is outside the Visual palette baseline
|
|
87
|
+
Phase 3 scope and should move only in welcome/update policy work.
|
|
88
|
+
- Older switch picker test fixtures that pin legacy compatibility output.
|
|
89
|
+
|
|
90
|
+
The converted implementation paths include:
|
|
91
|
+
|
|
92
|
+
- `internal/ui/projmuxpicker/ansi.go`
|
|
93
|
+
- `internal/app/tmux.go`
|
|
94
|
+
- `internal/app/status.go`
|
|
95
|
+
- `internal/app/statusbar.go`
|
|
96
|
+
- `internal/app/statusbar_decoration.go`
|
|
97
|
+
- `internal/app/notify.go`
|
|
98
|
+
- `internal/app/settings.go`
|
|
99
|
+
- `internal/app/settings_render.go`
|
|
100
|
+
- `internal/app/trust.go`
|
|
101
|
+
- `internal/app/usage.go`
|
|
102
|
+
- `internal/core/usage/hud.go`
|
|
103
|
+
- `internal/ui/render/switch.go`
|
|
104
|
+
- `internal/ui/render/popup.go`
|
|
105
|
+
- `internal/ui/render/switch_preview.go`
|