Brooklyn Nicholson
a8444fbcae
feat(themes): cross-surface theme SDK — one skin themes CLI, TUI, and desktop
...
Make the Python skin engine the single source of truth for a canonical theme
shape consumed by every surface, so a skin authored in $HERMES_HOME/skins/*.yaml
(by a user or by Hermes from a prompt) themes the CLI, TUI, and desktop GUI at
once — the theme analogue of the plugin SDK.
- @hermes/shared: canonical `HermesSkin` token shape + `SKIN_COLOR_TOKENS` enum,
consumed by both TS surfaces (TUI `GatewaySkin` and desktop dedup onto it).
- Desktop: `skinToDesktopTheme` resolver (skin → CSS-var palette, VS Code-style
derive-from-seed) + `backend-sync` that registers backend skins into the theme
registry (Appearance/Cmd-K/`/skin`) and applies on a real change. Seeds on
gateway.ready (never stomps a persisted pick), applies on skin.changed and the
post-turn `config.get skin` poll (catch-all for agent-edited config.yaml).
- TUI: `fromSkin` now maps the status bar + `background` keys it was dropping.
- Gateway: `config.get skin` also returns the full resolved palette (additive).
- Skill: `hermes-themes` teaches the agent to author + activate a skin.
Each surface keeps its own normalizing resolver (ansi for the TUI, CSS vars for
the desktop, prompt_toolkit/Rich for the CLI).
2026-07-21 21:00:42 -05:00
..
2026-07-17 04:50:47 -07:00
2026-07-05 14:48:28 -07:00
2026-07-20 22:46:39 +02:00
2026-07-20 11:35:21 -07:00
2026-07-12 05:08:13 -04:00
2026-07-21 20:18:43 -05:00
2026-06-24 00:54:18 +05:30
2026-07-17 11:37:25 +05:30
2026-07-21 12:20:25 +05:30
2026-07-11 12:28:55 +05:30
2026-07-18 14:01:33 -07:00
2026-07-07 21:13:19 -07:00
2026-06-11 10:49:47 -07:00
2026-07-18 02:49:28 -07:00
2026-05-28 15:14:05 +10:00
2026-05-28 22:26:25 -07:00
2026-07-21 05:41:41 -07:00
2026-05-28 22:26:25 -07:00
2026-06-27 15:59:00 -07:00
2026-07-17 04:53:38 -07:00
2026-07-21 12:20:25 +05:30
2026-07-20 03:27:22 -07:00
2026-05-25 01:20:33 -07:00
2026-06-27 15:59:00 -07:00
2026-07-21 05:27:13 -07:00
2026-07-01 23:51:54 +05:30
2026-07-21 13:54:11 -05:00
2026-06-01 19:51:03 -07:00
2026-07-21 13:54:11 -05:00
2026-07-17 04:33:34 -07:00
2026-07-16 14:30:05 +10:00
2026-06-21 16:31:56 +05:30
2026-06-30 03:27:41 -07:00
2026-07-19 03:02:21 -07:00
2026-07-17 04:58:35 -07:00
2026-07-06 12:26:21 -07:00
2026-06-01 16:58:58 -07:00
2026-06-27 21:30:37 -07:00
2026-07-05 13:42:46 -07:00
2026-06-24 18:56:26 -07:00
2026-06-27 20:45:31 -07:00
2026-06-30 17:29:23 -07:00
2026-07-07 04:09:35 -07:00
2026-07-20 03:06:02 -07:00
2026-07-18 02:31:20 -07:00
2026-07-21 06:41:04 -07:00
2026-05-23 05:24:57 -07:00
2026-07-16 07:19:36 -07:00
2026-07-08 16:55:32 +10:00
2026-06-27 15:59:00 -07:00
2026-07-21 12:39:59 -07:00
2026-07-20 05:38:25 -07:00
2026-06-06 18:22:38 -07:00
2026-06-30 00:59:29 -05:00
2026-07-15 07:39:42 -07:00
2026-07-20 03:06:02 -07:00
2026-07-01 16:25:48 -05:00
2026-07-21 12:41:14 -07:00
2026-07-15 07:39:17 -07:00
2026-07-09 16:13:59 -05:00
2026-07-15 07:39:17 -07:00
2026-06-21 17:06:48 -07:00
2026-07-21 12:41:14 -07:00
2026-07-05 13:42:46 -07:00
2026-07-21 12:42:07 -07:00
2026-06-19 07:46:33 -07:00
2026-06-27 15:59:00 -07:00
2026-07-15 04:56:25 -07:00
2026-07-17 04:50:47 -07:00
2026-05-26 12:48:14 -07:00
2026-06-21 19:05:27 -07:00
2026-07-21 12:43:27 -07:00
2026-06-22 19:16:47 -05:00
2026-07-07 04:09:35 -07:00
2026-06-06 23:07:25 +05:30
2026-07-14 21:08:22 -07:00
2026-07-17 13:49:12 -07:00
2026-07-15 00:10:31 -07:00
2026-06-10 00:24:06 -07:00
2026-06-13 13:47:08 -07:00
2026-07-16 04:24:14 -07:00
2026-07-20 10:17:57 -07:00
2026-07-20 08:47:55 -07:00
2026-06-12 08:51:10 +00:00
2026-06-21 22:43:48 -07:00
2026-07-21 12:20:25 +05:30
2026-06-24 00:14:49 -07:00
2026-07-21 06:41:04 -07:00
2026-07-20 12:59:28 +05:30
2026-07-02 05:10:31 -07:00
2026-06-24 13:48:38 -05:00
2026-05-23 01:07:01 -04:00
2026-07-16 19:49:39 -04:00
2026-07-13 02:00:09 -07:00
2026-07-05 13:42:46 -07:00
2026-07-15 07:39:17 -07:00
2026-06-27 15:59:00 -07:00
2026-07-05 13:42:46 -07:00
2026-06-25 16:40:26 -05:00
2026-07-21 10:09:31 -04:00
2026-07-05 19:13:20 -07:00
2026-06-25 13:52:06 -07:00
2026-07-20 10:17:57 -07:00
2026-05-28 02:36:09 -07:00
2026-05-29 00:31:44 -07:00
2026-06-08 07:03:12 -07:00
2026-07-07 15:15:37 -07:00
2026-06-27 15:59:00 -07:00
2026-07-20 03:06:02 -07:00
2026-06-17 01:04:26 +08:00
2026-07-21 06:41:04 -07:00
2026-05-29 13:24:12 -07:00
2026-06-21 19:05:27 -07:00
2026-05-28 22:26:25 -07:00
2026-06-19 07:46:33 -07:00
2026-06-29 21:33:00 +10:00
2026-07-09 19:54:02 -07:00
2026-07-07 12:36:41 -07:00
2026-07-07 13:29:58 -07:00
2026-07-05 22:04:52 -07:00
2026-07-03 13:44:00 -07:00
2026-07-17 04:53:38 -07:00
2026-06-11 07:51:01 -07:00
2026-07-20 08:47:55 -07:00
2026-07-09 19:57:54 -07:00
2026-07-17 04:52:02 -07:00
2026-07-21 21:00:42 -05:00
2026-07-14 13:58:36 -07:00
2026-06-25 16:40:26 -05:00
2026-07-18 02:31:20 -07:00
2026-05-28 22:26:25 -07:00
2026-07-05 13:42:46 -07:00
2026-06-05 03:20:10 -07:00
2026-07-16 23:41:26 -07:00
2026-07-19 05:45:01 -07:00
2026-06-26 14:07:43 +05:30
2026-07-07 05:12:24 -07:00
2026-07-11 12:28:55 +05:30
2026-07-13 14:53:34 -04:00
2026-07-21 13:12:41 -07:00
2026-07-16 12:36:51 +05:30
2026-06-08 11:32:43 -07:00
2026-07-17 18:23:22 +02:00
2026-06-09 23:21:14 -07:00
2026-07-05 23:00:34 +05:30