myrlin-workbook 0.3.1 → 0.4.0

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 CHANGED
@@ -1,12 +1,17 @@
1
- # Myrlin Workbook
2
-
3
- [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](LICENSE)
4
- [![npm](https://img.shields.io/npm/v/myrlin-workbook.svg)](https://www.npmjs.com/package/myrlin-workbook)
5
- [![Node](https://img.shields.io/badge/Node.js-18%2B-green.svg)](https://nodejs.org)
6
- [![Platform](https://img.shields.io/badge/Platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey.svg)]()
7
- [![Tests](https://img.shields.io/badge/Tests-26%20passing-brightgreen.svg)]()
1
+ <p align="center">
2
+ <img src="docs/images/logo.png" alt="Myrlin's Workbook" width="250">
3
+ </p>
4
+ <h1 align="center">Myrlin's Workbook</h1>
5
+ <p align="center">
6
+ <a href="https://www.npmjs.com/package/myrlin-workbook"><img src="https://img.shields.io/npm/v/myrlin-workbook.svg?style=flat-square" alt="npm version"></a>
7
+ <a href="https://www.npmjs.com/package/myrlin-workbook"><img src="https://img.shields.io/npm/dm/myrlin-workbook.svg?style=flat-square" alt="npm downloads"></a>
8
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-AGPL--3.0-blue.svg?style=flat-square" alt="License: AGPL-3.0"></a>
9
+ <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node.js-18%2B-green.svg?style=flat-square" alt="Node.js 18+"></a>
10
+ </p>
8
11
 
9
- Open-source workspace manager for Claude Code - cost tracking, conflict detection, 4-pane embedded terminals, per-workspace docs & kanban, session templates, session manager overlay, costs dashboard, 8 themes, [and more](#full-feature-list). Discovers every session you've ever run, organizes them into workspaces. Runs in your browser, everything stays local.
12
+ <p align="center">
13
+ Open-source workspace manager for Claude Code - cost tracking, conflict detection, 4-pane embedded terminals, per-workspace docs & kanban, session templates, costs dashboard, 13 themes, <a href="#full-feature-list">and more</a>. Discovers every session you've ever run, organizes them into workspaces. Runs in your browser, everything stays local.
14
+ </p>
10
15
 
11
16
  <p align="center">
12
17
  <img src="docs/images/hero-demo.gif" alt="4-pane terminal grid with live sessions" width="800">
@@ -87,7 +92,7 @@ There are good tools in this space. I tried them. Here's where Myrlin fits:
87
92
  | Session discovery | Yes | Yes | No | No |
88
93
  | Session manager overlay | Yes | No | No | No |
89
94
  | Workspace docs/kanban | Yes | No | No | No |
90
- | Themes | 8 (Catppuccin + fun flavors) | No | No | No |
95
+ | Themes | 13 (Catppuccin, Nord, Dracula, etc.) | No | No | No |
91
96
  | Session templates | Yes | No | No | No |
92
97
  | Conflict detection | Yes | No | No | No |
93
98
  | Embedded terminals | 4-pane grid | Single | No | No |
@@ -174,7 +179,7 @@ Real-time warnings when two or more running sessions are editing the same files.
174
179
 
175
180
  ![Theme switching in action](docs/images/theme-switching.gif)
176
181
 
177
- 8 themes: 4 classic [Catppuccin](https://github.com/catppuccin/catppuccin) (Mocha, Macchiato, Frappe, Latte) plus 4 fun flavors - Cherry (rose), Ocean (navy), Amber (gold), and Mint (jade). Toggle from the header dropdown. Choice persists in localStorage.
182
+ 13 themes organized into Dark and Light sections. 4 official [Catppuccin](https://github.com/catppuccin/catppuccin) (Mocha, Macchiato, Frappe, Latte), 3 community favorites (Nord, Dracula, Tokyo Night), 4 custom flavors (Cherry, Ocean, Amber, Mint), and 2 light alternatives (Rose Pine Dawn, Gruvbox Light). Toggle from the header dropdown. Choice persists in localStorage.
178
183
 
179
184
  ### Port Detection & Resource Monitoring
180
185
 
@@ -260,7 +265,7 @@ A comprehensive list of everything Myrlin Workbook offers today.
260
265
 
261
266
  ### Themes
262
267
 
263
- - **8 themes** - 4 Catppuccin (Mocha, Macchiato, Frappe, Latte) + 4 fun flavors (Cherry, Ocean, Amber, Mint)
268
+ - **13 themes** - 4 Catppuccin (Mocha, Macchiato, Frappe, Latte) + Nord, Dracula, Tokyo Night + Cherry, Ocean, Amber, Mint + Rose Pine Dawn, Gruvbox Light
264
269
  - **Header dropdown toggle** - choice persists in localStorage
265
270
 
266
271
  ### Resources & Monitoring
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myrlin-workbook",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Browser-based workspace manager for Claude Code sessions - session discovery, multi-terminal, cost tracking, docs, and kanban board",
5
5
  "main": "src/index.js",
6
6
  "bin": {
package/src/gui.js CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
  /**
3
3
  * Claude Workspace Manager - GUI Entry Point
4
4
  *
@@ -2299,7 +2299,7 @@ class CWMApp {
2299
2299
  // Legacy alias for any remaining callers
2300
2300
  toggleTheme() {
2301
2301
  const current = document.documentElement.dataset.theme || 'mocha';
2302
- const themes = ['mocha', 'macchiato', 'frappe', 'latte', 'cherry', 'ocean', 'amber', 'mint'];
2302
+ const themes = ['mocha', 'macchiato', 'frappe', 'nord', 'dracula', 'tokyo-night', 'cherry', 'ocean', 'amber', 'mint', 'latte', 'rose-pine-dawn', 'gruvbox-light'];
2303
2303
  const next = themes[(themes.indexOf(current) + 1) % themes.length];
2304
2304
  this.setTheme(next);
2305
2305
  }
@@ -17,7 +17,7 @@
17
17
  <script>
18
18
  (function() {
19
19
  var t = localStorage.getItem('cwm_theme');
20
- if (['latte','frappe','macchiato'].includes(t)) document.documentElement.dataset.theme = t;
20
+ if (['latte','frappe','macchiato','cherry','ocean','amber','mint','nord','dracula','tokyo-night','rose-pine-dawn','gruvbox-light'].includes(t)) document.documentElement.dataset.theme = t;
21
21
  var s = parseFloat(localStorage.getItem('cwm_ui_scale'));
22
22
  if (s && s >= 0.85 && s <= 1.2) {
23
23
  document.documentElement.style.setProperty('--ui-scale', s);
@@ -92,8 +92,8 @@
92
92
  </svg>
93
93
  </button>
94
94
  <div class="header-brand">
95
- <img src="logo.png" alt="myrlin" class="header-logo-img">
96
- <span class="header-title">myrlin's workbook</span>
95
+ <img src="logo.png" alt="Myrlin" class="header-logo-img">
96
+ <span class="header-title">Myrlin's Workbook</span>
97
97
  </div>
98
98
  </div>
99
99
 
@@ -156,14 +156,21 @@
156
156
  </svg>
157
157
  </button>
158
158
  <div class="theme-dropdown" id="theme-dropdown" hidden>
159
- <button class="theme-option" data-theme="mocha"><span class="theme-swatch" style="background:#1e1e2e"></span>Mocha</button>
160
- <button class="theme-option" data-theme="macchiato"><span class="theme-swatch" style="background:#24273a"></span>Macchiato</button>
161
- <button class="theme-option" data-theme="frappe"><span class="theme-swatch" style="background:#303446"></span>Frapp&eacute;</button>
162
- <button class="theme-option" data-theme="latte"><span class="theme-swatch" style="background:#eff1f5;border:1px solid #ccd0da"></span>Latte</button>
159
+ <div class="theme-dropdown-section">Dark</div>
160
+ <button class="theme-option" data-theme="mocha"><span class="theme-swatch" style="background:#1e1e2e"></span>Mocha<span class="theme-catppuccin-badge" title="Official Catppuccin">&#9733;</span></button>
161
+ <button class="theme-option" data-theme="macchiato"><span class="theme-swatch" style="background:#24273a"></span>Macchiato<span class="theme-catppuccin-badge" title="Official Catppuccin">&#9733;</span></button>
162
+ <button class="theme-option" data-theme="frappe"><span class="theme-swatch" style="background:#303446"></span>Frapp&eacute;<span class="theme-catppuccin-badge" title="Official Catppuccin">&#9733;</span></button>
163
+ <button class="theme-option" data-theme="nord"><span class="theme-swatch" style="background:#2e3440"></span>Nord</button>
164
+ <button class="theme-option" data-theme="dracula"><span class="theme-swatch" style="background:#282a36"></span>Dracula</button>
165
+ <button class="theme-option" data-theme="tokyo-night"><span class="theme-swatch" style="background:#1a1b26"></span>Tokyo Night</button>
163
166
  <button class="theme-option" data-theme="cherry"><span class="theme-swatch" style="background:linear-gradient(135deg,#221a22,#f5a0d0)"></span>Cherry</button>
164
167
  <button class="theme-option" data-theme="ocean"><span class="theme-swatch" style="background:linear-gradient(135deg,#1a1e28,#70a8f0)"></span>Ocean</button>
165
168
  <button class="theme-option" data-theme="amber"><span class="theme-swatch" style="background:linear-gradient(135deg,#211e1a,#f0d070)"></span>Amber</button>
166
169
  <button class="theme-option" data-theme="mint"><span class="theme-swatch" style="background:linear-gradient(135deg,#1a2120,#78e0a0)"></span>Mint</button>
170
+ <div class="theme-dropdown-section">Light</div>
171
+ <button class="theme-option" data-theme="latte"><span class="theme-swatch" style="background:#eff1f5;border:1px solid #ccd0da"></span>Latte<span class="theme-catppuccin-badge" title="Official Catppuccin">&#9733;</span></button>
172
+ <button class="theme-option" data-theme="rose-pine-dawn"><span class="theme-swatch" style="background:#faf4ed;border:1px solid #dfdad9"></span>Rose Pine Dawn</button>
173
+ <button class="theme-option" data-theme="gruvbox-light"><span class="theme-swatch" style="background:#fbf1c7;border:1px solid #d5c4a1"></span>Gruvbox Light</button>
167
174
  </div>
168
175
  </div>
169
176
  <div class="scale-controls" id="scale-controls">
Binary file
@@ -634,7 +634,7 @@ textarea.input {
634
634
  .header-brand {
635
635
  display: flex;
636
636
  align-items: center;
637
- gap: 4px;
637
+ gap: 8px;
638
638
  overflow: visible;
639
639
  position: relative;
640
640
  z-index: 1;
@@ -646,10 +646,9 @@ textarea.input {
646
646
  }
647
647
 
648
648
  .header-logo-img {
649
- width: 52px;
650
- height: 52px;
649
+ width: 64px;
650
+ height: 64px;
651
651
  object-fit: contain;
652
- margin-right: 4px;
653
652
  filter: drop-shadow(0 0 10px rgba(203, 166, 247, 0.3));
654
653
  transition: filter 0.3s ease;
655
654
  pointer-events: auto;
@@ -660,10 +659,10 @@ textarea.input {
660
659
  }
661
660
 
662
661
  .header-title {
663
- font-size: 15px;
662
+ font-size: 17px;
664
663
  font-weight: 700;
665
664
  color: var(--text-primary);
666
- letter-spacing: -0.02em;
665
+ letter-spacing: -0.01em;
667
666
  }
668
667
 
669
668
  .header-center {
@@ -6294,3 +6293,240 @@ html {
6294
6293
  width: auto;
6295
6294
  }
6296
6295
  }
6296
+
6297
+ /* ═══════════════════════════════════════════════════════════ */
6298
+ /* Theme Dropdown Section Headers + Catppuccin Badge */
6299
+ /* ═══════════════════════════════════════════════════════════ */
6300
+
6301
+ /* Theme dropdown section headers */
6302
+ .theme-dropdown-section {
6303
+ padding: 4px 12px 2px;
6304
+ font-size: 10px;
6305
+ font-weight: 600;
6306
+ text-transform: uppercase;
6307
+ letter-spacing: 0.08em;
6308
+ color: var(--overlay1);
6309
+ pointer-events: none;
6310
+ user-select: none;
6311
+ }
6312
+ .theme-dropdown-section:not(:first-child) {
6313
+ margin-top: 4px;
6314
+ border-top: 1px solid var(--surface0);
6315
+ padding-top: 6px;
6316
+ }
6317
+ .theme-catppuccin-badge {
6318
+ margin-left: auto;
6319
+ font-size: 10px;
6320
+ color: var(--yellow);
6321
+ opacity: 0.7;
6322
+ }
6323
+
6324
+ /* ═══════════════════════════════════════════════════════════ */
6325
+ /* NORD (Dark — Polar Night & Aurora) */
6326
+ /* ═══════════════════════════════════════════════════════════ */
6327
+
6328
+ :root[data-theme="nord"] {
6329
+ --base: #2e3440;
6330
+ --mantle: #292e39;
6331
+ --crust: #242933;
6332
+ --surface0: #3b4252;
6333
+ --surface1: #434c5e;
6334
+ --surface2: #4c566a;
6335
+ --overlay0: #616e88;
6336
+ --overlay1: #6e7e99;
6337
+ --text: #eceff4;
6338
+ --subtext0: #a5b1c2;
6339
+ --subtext1: #d8dee9;
6340
+ --mauve: #b48ead;
6341
+ --blue: #81a1c1;
6342
+ --green: #a3be8c;
6343
+ --yellow: #ebcb8b;
6344
+ --red: #bf616a;
6345
+ --peach: #d08770;
6346
+ --teal: #8fbcbb;
6347
+ --sky: #88c0d0;
6348
+ --pink: #b48ead;
6349
+ --lavender: #9db2cf;
6350
+ --flamingo: #d08770;
6351
+ --rosewater: #d8b4a0;
6352
+ --sapphire: #5e81ac;
6353
+ --border-subtle: rgba(67, 76, 94, 0.5);
6354
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.2);
6355
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.25);
6356
+ --shadow-lg: 0 8px 30px rgba(0,0,0,0.3);
6357
+ --shadow-xl: 0 16px 50px rgba(0,0,0,0.35);
6358
+ }
6359
+ :root[data-theme="nord"] .theme-icon-moon { display: inline; }
6360
+ :root[data-theme="nord"] .theme-icon-sun { display: none; }
6361
+ :root[data-theme="nord"] ::selection { background: rgba(129, 161, 193, 0.25); color: var(--text); }
6362
+ :root[data-theme="nord"] .stat-dot-running { background: var(--green); box-shadow: 0 0 4px rgba(163, 190, 140, 0.5); }
6363
+ :root[data-theme="nord"] .terminal-pane-empty.drag-over .terminal-container { background: rgba(129, 161, 193, 0.05); }
6364
+ :root[data-theme="nord"] .terminal-resize-handle:hover { background: rgba(129, 161, 193, 0.4); }
6365
+
6366
+ /* ═══════════════════════════════════════════════════════════ */
6367
+ /* DRACULA (Dark — Iconic Purple & Neon) */
6368
+ /* ═══════════════════════════════════════════════════════════ */
6369
+
6370
+ :root[data-theme="dracula"] {
6371
+ --base: #282a36;
6372
+ --mantle: #21222c;
6373
+ --crust: #191a21;
6374
+ --surface0: #343746;
6375
+ --surface1: #44475a;
6376
+ --surface2: #545768;
6377
+ --overlay0: #6272a4;
6378
+ --overlay1: #7283b5;
6379
+ --text: #f8f8f2;
6380
+ --subtext0: #b8b8b0;
6381
+ --subtext1: #d8d8d0;
6382
+ --mauve: #bd93f9;
6383
+ --blue: #8be9fd;
6384
+ --green: #50fa7b;
6385
+ --yellow: #f1fa8c;
6386
+ --red: #ff5555;
6387
+ --peach: #ffb86c;
6388
+ --teal: #8be9fd;
6389
+ --sky: #8be9fd;
6390
+ --pink: #ff79c6;
6391
+ --lavender: #caa9fa;
6392
+ --flamingo: #ff79c6;
6393
+ --rosewater: #ffd0e0;
6394
+ --sapphire: #6cb6ff;
6395
+ --border-subtle: rgba(68, 71, 90, 0.5);
6396
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.2);
6397
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.25);
6398
+ --shadow-lg: 0 8px 30px rgba(0,0,0,0.3);
6399
+ --shadow-xl: 0 16px 50px rgba(0,0,0,0.35);
6400
+ }
6401
+ :root[data-theme="dracula"] .theme-icon-moon { display: inline; }
6402
+ :root[data-theme="dracula"] .theme-icon-sun { display: none; }
6403
+ :root[data-theme="dracula"] ::selection { background: rgba(189, 147, 249, 0.25); color: var(--text); }
6404
+ :root[data-theme="dracula"] .stat-dot-running { background: var(--green); box-shadow: 0 0 4px rgba(80, 250, 123, 0.5); }
6405
+ :root[data-theme="dracula"] .terminal-pane-empty.drag-over .terminal-container { background: rgba(189, 147, 249, 0.05); }
6406
+ :root[data-theme="dracula"] .terminal-resize-handle:hover { background: rgba(189, 147, 249, 0.4); }
6407
+
6408
+ /* ═══════════════════════════════════════════════════════════ */
6409
+ /* TOKYO NIGHT (Dark — Neon City Lights) */
6410
+ /* ═══════════════════════════════════════════════════════════ */
6411
+
6412
+ :root[data-theme="tokyo-night"] {
6413
+ --base: #1a1b26;
6414
+ --mantle: #16161e;
6415
+ --crust: #12121a;
6416
+ --surface0: #292e42;
6417
+ --surface1: #3b4261;
6418
+ --surface2: #545c7e;
6419
+ --overlay0: #565f89;
6420
+ --overlay1: #6b7394;
6421
+ --text: #c0caf5;
6422
+ --subtext0: #9aa5ce;
6423
+ --subtext1: #a9b1d6;
6424
+ --mauve: #bb9af7;
6425
+ --blue: #7aa2f7;
6426
+ --green: #9ece6a;
6427
+ --yellow: #e0af68;
6428
+ --red: #f7768e;
6429
+ --peach: #ff9e64;
6430
+ --teal: #73daca;
6431
+ --sky: #7dcfff;
6432
+ --pink: #ff79c6;
6433
+ --lavender: #b4befe;
6434
+ --flamingo: #f7768e;
6435
+ --rosewater: #ffc0cb;
6436
+ --sapphire: #2ac3de;
6437
+ --border-subtle: rgba(59, 66, 97, 0.5);
6438
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.2);
6439
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.25);
6440
+ --shadow-lg: 0 8px 30px rgba(0,0,0,0.3);
6441
+ --shadow-xl: 0 16px 50px rgba(0,0,0,0.35);
6442
+ }
6443
+ :root[data-theme="tokyo-night"] .theme-icon-moon { display: inline; }
6444
+ :root[data-theme="tokyo-night"] .theme-icon-sun { display: none; }
6445
+ :root[data-theme="tokyo-night"] ::selection { background: rgba(122, 162, 247, 0.25); color: var(--text); }
6446
+ :root[data-theme="tokyo-night"] .stat-dot-running { background: var(--green); box-shadow: 0 0 4px rgba(158, 206, 106, 0.5); }
6447
+ :root[data-theme="tokyo-night"] .terminal-pane-empty.drag-over .terminal-container { background: rgba(122, 162, 247, 0.05); }
6448
+ :root[data-theme="tokyo-night"] .terminal-resize-handle:hover { background: rgba(122, 162, 247, 0.4); }
6449
+
6450
+ /* ═══════════════════════════════════════════════════════════ */
6451
+ /* ROSE PINE DAWN (Light — Soft Warm Rose) */
6452
+ /* ═══════════════════════════════════════════════════════════ */
6453
+
6454
+ :root[data-theme="rose-pine-dawn"] {
6455
+ --base: #faf4ed;
6456
+ --mantle: #f2e9e1;
6457
+ --crust: #ebe0d6;
6458
+ --surface0: #f4ede8;
6459
+ --surface1: #dfdad9;
6460
+ --surface2: #cecacd;
6461
+ --overlay0: #9893a5;
6462
+ --overlay1: #797593;
6463
+ --text: #575279;
6464
+ --subtext0: #6e6a86;
6465
+ --subtext1: #635f7b;
6466
+ --mauve: #907aa9;
6467
+ --blue: #286983;
6468
+ --green: #56949f;
6469
+ --yellow: #ea9d34;
6470
+ --red: #b4637a;
6471
+ --peach: #d7827e;
6472
+ --teal: #56949f;
6473
+ --sky: #56949f;
6474
+ --pink: #d7827e;
6475
+ --lavender: #907aa9;
6476
+ --flamingo: #d7827e;
6477
+ --rosewater: #d7827e;
6478
+ --sapphire: #286983;
6479
+ --border-subtle: rgba(206, 202, 205, 0.5);
6480
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.04);
6481
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.06);
6482
+ --shadow-lg: 0 8px 30px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08);
6483
+ --shadow-xl: 0 16px 50px rgba(0, 0, 0, 0.12), 0 8px 20px rgba(0, 0, 0, 0.1);
6484
+ }
6485
+ :root[data-theme="rose-pine-dawn"] .theme-icon-moon { display: none; }
6486
+ :root[data-theme="rose-pine-dawn"] .theme-icon-sun { display: block !important; }
6487
+ :root[data-theme="rose-pine-dawn"] ::selection { background: rgba(144, 122, 169, 0.2); color: var(--text); }
6488
+ :root[data-theme="rose-pine-dawn"] .stat-dot-running { background: var(--green); box-shadow: 0 0 4px rgba(86, 148, 159, 0.5); }
6489
+ :root[data-theme="rose-pine-dawn"] .terminal-pane-empty.drag-over .terminal-container { background: rgba(144, 122, 169, 0.05); }
6490
+ :root[data-theme="rose-pine-dawn"] .terminal-resize-handle:hover { background: rgba(144, 122, 169, 0.4); }
6491
+
6492
+ /* ═══════════════════════════════════════════════════════════ */
6493
+ /* GRUVBOX LIGHT (Light — Warm Retro Earthy) */
6494
+ /* ═══════════════════════════════════════════════════════════ */
6495
+
6496
+ :root[data-theme="gruvbox-light"] {
6497
+ --base: #fbf1c7;
6498
+ --mantle: #f2e5bc;
6499
+ --crust: #ebdbb2;
6500
+ --surface0: #d5c4a1;
6501
+ --surface1: #bdae93;
6502
+ --surface2: #a89984;
6503
+ --overlay0: #928374;
6504
+ --overlay1: #7c6f64;
6505
+ --text: #3c3836;
6506
+ --subtext0: #504945;
6507
+ --subtext1: #453e3a;
6508
+ --mauve: #8f3f71;
6509
+ --blue: #076678;
6510
+ --green: #79740e;
6511
+ --yellow: #b57614;
6512
+ --red: #9d0006;
6513
+ --peach: #af3a03;
6514
+ --teal: #427b58;
6515
+ --sky: #076678;
6516
+ --pink: #8f3f71;
6517
+ --lavender: #8f3f71;
6518
+ --flamingo: #af3a03;
6519
+ --rosewater: #c8956c;
6520
+ --sapphire: #458588;
6521
+ --border-subtle: rgba(168, 153, 132, 0.5);
6522
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.04);
6523
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.06);
6524
+ --shadow-lg: 0 8px 30px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08);
6525
+ --shadow-xl: 0 16px 50px rgba(0, 0, 0, 0.12), 0 8px 20px rgba(0, 0, 0, 0.1);
6526
+ }
6527
+ :root[data-theme="gruvbox-light"] .theme-icon-moon { display: none; }
6528
+ :root[data-theme="gruvbox-light"] .theme-icon-sun { display: block !important; }
6529
+ :root[data-theme="gruvbox-light"] ::selection { background: rgba(175, 58, 3, 0.2); color: var(--text); }
6530
+ :root[data-theme="gruvbox-light"] .stat-dot-running { background: var(--green); box-shadow: 0 0 4px rgba(121, 116, 14, 0.5); }
6531
+ :root[data-theme="gruvbox-light"] .terminal-pane-empty.drag-over .terminal-container { background: rgba(175, 58, 3, 0.05); }
6532
+ :root[data-theme="gruvbox-light"] .terminal-resize-handle:hover { background: rgba(175, 58, 3, 0.4); }
package/src/web/server.js CHANGED
@@ -942,16 +942,23 @@ function decodeClaudePath(encoded) {
942
942
  let matched = false;
943
943
 
944
944
  for (let len = tokens.length - idx; len > 1; len--) {
945
- const candidate = tokens.slice(idx, idx + len).join('-');
946
- const candidatePath = path.join(resolved, candidate);
947
- try {
948
- if (fs.existsSync(candidatePath)) {
949
- resolved = candidatePath;
950
- idx += len;
951
- matched = true;
952
- break;
953
- }
954
- } catch (_) { /* skip */ }
945
+ const slice = tokens.slice(idx, idx + len);
946
+ // Try hyphen-joined (e.g. "claude-workspace-manager") and
947
+ // space-joined (e.g. "Work AI Project") since Claude encodes
948
+ // both path separators and spaces as dashes
949
+ const candidates = [slice.join('-'), slice.join(' ')];
950
+ for (const candidate of candidates) {
951
+ const candidatePath = path.join(resolved, candidate);
952
+ try {
953
+ if (fs.existsSync(candidatePath)) {
954
+ resolved = candidatePath;
955
+ idx += len;
956
+ matched = true;
957
+ break;
958
+ }
959
+ } catch (_) { /* skip */ }
960
+ }
961
+ if (matched) break;
955
962
  }
956
963
 
957
964
  if (!matched) {