projmux 0.6.4 → 0.6.6

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.
@@ -6,31 +6,78 @@ truth in code is `internal/theme/palette.go`.
6
6
 
7
7
  ## Scope
8
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:
9
+ The fallback palette is a semantic token layer. Theme settings resolve project
10
+ and global config into the resolver-facing token inventory below, then fall
11
+ back to the built-in values from `internal/theme/palette.go`.
12
12
 
13
13
  - Native picker truecolor SGR tokens.
14
14
  - Native sidebar and chip-strip 256-color SGR tokens.
15
15
  - Tmux statusbar and generated-config color tokens.
16
16
  - Settings/action/state/trust/attention helper tokens.
17
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.
18
+ Renderer adapters apply resolver-backed background/foreground colors to native
19
+ picker frame chrome and to tmux status/window background tokens when an
20
+ `EffectiveTheme` is supplied by the caller. Fallback-sourced fields still
21
+ render through the historical constants so built-in default output remains
22
+ byte-identical. Settings and native project picker surfaces load `[theme]`
23
+ values from global and project config through the shared effective-theme source.
24
+ Theme marketplace/import/export and Visual palette reselection remain out of
25
+ scope.
26
+
27
+ ## Resolver Token Inventory
28
+
29
+ The public resolver inventory is intentionally smaller than the current
30
+ renderer literal inventory. Surface-specific renderers map their detailed roles
31
+ onto these stable names:
32
+
33
+ | Token | Meaning | Shared surfaces |
34
+ | --- | --- | --- |
35
+ | `background` | base popup/sidebar/status surface background | native picker, frame titlebar, notify sidebar, settings popup, statusbar |
36
+ | `surface` | raised or inactive chrome surface | frame titlebar, chips, switch cards, settings popup |
37
+ | `surface_active` | selected/current row or active chip surface | native picker current row, frame chips, statusbar active window |
38
+ | `foreground` | primary readable text | native picker, titlebar, statusbar, notify sidebar, settings popup |
39
+ | `muted` | secondary text, divider, disabled or stale details | picker metadata, titlebar rule, notify age/stale, settings descriptions |
40
+ | `accent` | pointer, primary action, highlight, active affordance | native picker pointer/highlight, settings actions, chips |
41
+ | `critical` | destructive/error/critical state | settings remove/quit, notify critical badge, statusbar critical usage |
42
+ | `warning` | progress, pending, warning, busy state | AI busy/thinking indicators, notify pending title, usage warning |
43
+
44
+ AI semantic status badges use renderer-only state roles layered on top of that
45
+ inventory: `progress`, `success`, and `action_required`. The fallback contract
46
+ is progress yellow, success green, action-required amber-orange. These roles are
47
+ separate from notify queue severity and desktop notification urgency; an AI
48
+ approval row can be `critical` in the notify queue while the live status badge
49
+ uses `action_required`, not red. `critical` remains reserved for error, failure,
50
+ destructive, over-limit, or risk states.
51
+
52
+ Renderer-only role names such as `accent.ai`, `state.progress`, `git.branch`,
53
+ and trust colors remain in `internal/theme/palette.go` until Phase 2+ maps each
54
+ surface to the resolver tokens. The key product contract for this phase is that
55
+ native picker, frame titlebar, chips, statusbar, notify sidebar, and settings
56
+ popup all consume a shared effective token set instead of independently
57
+ choosing colors.
58
+
59
+ Font is not part of this universal token inventory. `font_family` and
60
+ `font_size` are resolved as terminal capability/profile hints: projmux can
61
+ store and display the desired value, but tmux/ANSI rendering cannot force a
62
+ font family or size across terminal emulators. In environments without a
63
+ supported terminal font adapter, projmux reports the desired font as
64
+ `not applied` instead of treating storage as a successful font change.
22
65
 
23
66
  ## Mapping Policy
24
67
 
25
68
  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.
69
+ must use tmux color specs. The resolver therefore carries both forms for each
70
+ color token.
28
71
 
29
72
  Rules:
30
73
 
31
- - Truecolor tokens keep exact SGR strings for native picker chrome and
32
- Settings rows.
74
+ - Truecolor tokens keep exact `#RRGGBB` values and can be converted to
75
+ foreground/background SGR fragments such as `38;2;R;G;B` or `48;2;R;G;B`.
33
76
  - Tmux tokens keep `colourN` strings where tmux owns rendering.
77
+ - The built-in `projmux-dark` fallback uses the established ANSI and tmux
78
+ tokens from `internal/theme/palette.go` to preserve current output.
79
+ - Explicit `#RRGGBB` overrides keep exact truecolor and derive the closest
80
+ xterm 256-color `colourN` token for tmux surfaces.
34
81
  - Native chip/sidebar badge tokens use 256-color SGR when they intentionally
35
82
  mirror tmux colors.
36
83
  - Output compatibility wins inside this baseline. For example, the kube
@@ -39,6 +86,35 @@ Rules:
39
86
  - Renderers should reference semantic names instead of spelling color literals
40
87
  directly. Test fixtures may still pin rendered escape strings.
41
88
 
89
+ ## Resolver Contract
90
+
91
+ Theme resolution is field-by-field after validating each layer:
92
+
93
+ 1. Project `.projmux/config.toml`
94
+ 2. Global `~/.config/projmux/config.toml`
95
+ 3. Built-in fallback preset `projmux-dark`
96
+
97
+ Rules:
98
+
99
+ - Project values override global values for the same field.
100
+ - Missing or `inherit` project values fall back to global values.
101
+ - Missing global values fall back to built-in values.
102
+ - A preset fills missing color tokens in its own layer.
103
+ - Explicit color tokens in the same layer override preset colors.
104
+ - An unknown preset invalidates only that layer and emits a warning.
105
+ - An invalid color, `font_family`, or `font_size` invalidates only that layer
106
+ and emits a warning.
107
+ - Every effective field reports `project`, `global`, or `fallback` as its
108
+ source label.
109
+
110
+ Built-in preset config values are:
111
+
112
+ - `projmux-dark`
113
+ - `midnight`
114
+ - `forest`
115
+ - `rose`
116
+ - `high-contrast`
117
+
42
118
  ## Fallback Inventory
43
119
 
44
120
  Chrome and text:
@@ -59,10 +135,11 @@ Accents and state:
59
135
  | `accent.action` | `141;205;142`, strong `122;199;173` | `colour29` bg / `colour230` fg |
60
136
  | `accent.attention` | notify HUD background/project family | `colour53`, project `colour90` |
61
137
  | `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` |
138
+ | `state.progress` | `255;204;102`; switch attention/busy dot, pane-border in-progress badge, and pending notify title/bell/badge `colour220` | `colour220` |
139
+ | `state.action_required` | AI approval/input-required status badge amber-orange; currently aliases the established warning token | `colour214` |
140
+ | `state.warning` | usage/status popup warning ANSI 256 wrapper; non-AI warning chrome | `colour214` |
64
141
  | `state.danger` | `255;107;107` | `colour160` |
65
- | `state.success` | settings/trust green families | `colour72`, `colour151` |
142
+ | `state.success` | settings/trust green families; pane-border response-complete badge | `colour72`, `colour151` |
66
143
  | `state.ahead` | switch/git metadata and notify age ANSI 256 wrapper | `colour153` |
67
144
  | `git.branch` | switch/sidebar branch badge uses the statusbar git branch block colors | `colour30` bg / `colour231` fg |
68
145
 
@@ -72,6 +149,7 @@ Surface-specific tokens:
72
149
  | --- | --- |
73
150
  | Native picker | current row, titlebar, rule, pointer, highlight, muted text, chip active/inactive/disabled |
74
151
  | Statusbar row 1 | session identity, cwd secondary text, divider, git branch block, git dirty/staged/ahead/behind, settings action chip, clock |
152
+ | App pane borders | semantic AI badge marker style (`dot`, `emoji`, or spacing-preserving `off`) plus action-required/success/progress state color |
75
153
  | Notify HUD/sidebar | line bg/fg, project badge, info/warn/crit/stale/gone badges, AI agent badge, count/age text |
76
154
  | Usage HUD/popup | OK/warning/critical/over-limit bars and numbers, empty cells, muted sync age |
77
155
  | Settings | add/type/open action, destructive remove/quit, back/cancel, info/read-only, dim description, root action/dim rows, trust trusted/stale/untrusted |
@@ -90,6 +168,7 @@ After the Phase 3 token pass, raw color values intentionally remain in:
90
168
  The converted implementation paths include:
91
169
 
92
170
  - `internal/ui/projmuxpicker/ansi.go`
171
+ - `internal/ui/projmuxpicker/frame.go`
93
172
  - `internal/app/tmux.go`
94
173
  - `internal/app/status.go`
95
174
  - `internal/app/statusbar.go`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projmux",
3
- "version": "0.6.4",
3
+ "version": "0.6.6",
4
4
  "description": "tmux project session manager",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/crevissepartners/projmux#readme",
@@ -23,14 +23,14 @@
23
23
  "README-ko.md",
24
24
  "LICENSE"
25
25
  ],
26
- "optionalDependencies": {
27
- "@projmux/darwin-arm64": "0.6.4",
28
- "@projmux/darwin-x64": "0.6.4",
29
- "@projmux/linux-arm64": "0.6.4",
30
- "@projmux/linux-x64": "0.6.4"
31
- },
32
26
  "scripts": {
33
27
  "package:npm": "scripts/package-npm.sh",
34
28
  "package:npm:pack": "scripts/package-npm.sh --pack"
29
+ },
30
+ "optionalDependencies": {
31
+ "@projmux/linux-x64": "0.6.6",
32
+ "@projmux/linux-arm64": "0.6.6",
33
+ "@projmux/darwin-x64": "0.6.6",
34
+ "@projmux/darwin-arm64": "0.6.6"
35
35
  }
36
36
  }