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.
@@ -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. Existing sessions switch directly without a startup picker.
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
@@ -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
- - Phase 1 is complete in this branch: `projmux welcome`, the About-screen
72
- Welcome entry, and `pending_attach_welcome` state make the guide revisit-able.
73
- - Phase 2 is complete in this branch: the generated projmux shell tmux config
74
- runs the low-noise `projmux welcome --popup` attach hook, which claims the
75
- pending marker once and displays the welcome guide after attach.
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 while preserving the
41
- existing branch block background. Window tab indexes stay left of each tab,
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, and colors rows at the
89
- same alert thresholds as the popup: amber at 80% and red at 95%.
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 colors that sync line amber once it is more than 60 seconds old.
103
- The notification HUD detail surface (`Alt-2` / `User2`) opens the right-side
104
- notification popup with newest-first rows and an amber title. When notification
105
- icon decoration is `symbol` or `emoji`, the bell appears before the title text.
106
- Selecting a row still focuses and acknowledges that notification. Pressing `x`
107
- on a row acknowledges it without focusing, keeps the popup open, and refreshes
108
- the remaining rows from the queue while preserving the selection position where
109
- possible.
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`, `Ctrl-N`, and
48
- CSI-u chords
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`