@pat-lewczuk/cezar 0.1.0 → 0.1.1

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.
Files changed (53) hide show
  1. package/dist/config.d.ts +55 -0
  2. package/dist/config.js +44 -0
  3. package/dist/config.js.map +1 -0
  4. package/dist/core/agent-runner.d.ts +13 -0
  5. package/dist/core/claude-cli-runner.js +23 -2
  6. package/dist/core/claude-cli-runner.js.map +1 -1
  7. package/dist/git-worktree.d.ts +49 -0
  8. package/dist/git-worktree.js +129 -0
  9. package/dist/git-worktree.js.map +1 -0
  10. package/dist/handoff.d.ts +42 -0
  11. package/dist/handoff.js +120 -0
  12. package/dist/handoff.js.map +1 -0
  13. package/dist/index.js +27 -6
  14. package/dist/index.js.map +1 -1
  15. package/dist/planner.d.ts +17 -0
  16. package/dist/planner.js +244 -0
  17. package/dist/planner.js.map +1 -0
  18. package/dist/runs/store.d.ts +40 -13
  19. package/dist/runs/store.js +33 -3
  20. package/dist/runs/store.js.map +1 -1
  21. package/dist/server/github.d.ts +28 -0
  22. package/dist/server/github.js +133 -0
  23. package/dist/server/github.js.map +1 -0
  24. package/dist/server/launch-key.d.ts +7 -0
  25. package/dist/server/launch-key.js +33 -0
  26. package/dist/server/launch-key.js.map +1 -0
  27. package/dist/server/pr.d.ts +22 -0
  28. package/dist/server/pr.js +92 -0
  29. package/dist/server/pr.js.map +1 -0
  30. package/dist/server/server.js +370 -15
  31. package/dist/server/server.js.map +1 -1
  32. package/dist/skills-remote.d.ts +35 -0
  33. package/dist/skills-remote.js +266 -0
  34. package/dist/skills-remote.js.map +1 -0
  35. package/dist/skills.d.ts +18 -6
  36. package/dist/skills.js +8 -4
  37. package/dist/skills.js.map +1 -1
  38. package/dist/todos.d.ts +60 -0
  39. package/dist/todos.js +166 -0
  40. package/dist/todos.js.map +1 -0
  41. package/dist/workflows/load.js +5 -9
  42. package/dist/workflows/load.js.map +1 -1
  43. package/dist/workflows/run.d.ts +62 -3
  44. package/dist/workflows/run.js +332 -43
  45. package/dist/workflows/run.js.map +1 -1
  46. package/dist/workflows/types.d.ts +27 -20
  47. package/dist/workflows/types.js +21 -0
  48. package/dist/workflows/types.js.map +1 -1
  49. package/package.json +1 -1
  50. package/scripts/mock-claude.mjs +118 -0
  51. package/web/app.js +1851 -149
  52. package/web/index.html +73 -22
  53. package/web/style.css +1271 -223
package/web/style.css CHANGED
@@ -1,317 +1,1365 @@
1
+ /* cez cockpit v2 — design tokens + layout. Dark is the default theme; light
2
+ overrides live under [data-theme="light"]. No build step, no libraries. */
3
+
1
4
  :root {
2
- --bg: #0d1117;
3
- --bg-panel: #161b22;
4
- --bg-raised: #1c2330;
5
- --border: #2a3240;
6
- --text: #dce3ec;
7
- --text-dim: #8b96a5;
8
- --accent: #4f8ef7;
9
- --green: #3fb950;
10
- --red: #f85149;
11
- --yellow: #d29922;
12
- --purple: #bc8cff;
13
- --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
14
- }
15
-
16
- * { box-sizing: border-box; }
5
+ --bg: #111116;
6
+ --panel: #16161c;
7
+ --panel2: #20202a;
8
+ --card: #17171e;
9
+ --line: rgba(235, 232, 255, 0.075);
10
+ --line2: rgba(235, 232, 255, 0.15);
11
+ --text: #e9e7f2;
12
+ --text2: #a3a1b2;
13
+ --text3: #66646f;
14
+ --btn: #e9e7f2;
15
+ --btn-text: #16161c;
16
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.35);
17
+ --accent: oklch(0.72 0.14 295);
18
+ --green: oklch(0.72 0.12 155);
19
+ --amber: oklch(0.78 0.12 78);
20
+ --red: oklch(0.68 0.17 25);
21
+ --accent-soft: color-mix(in oklab, var(--accent) 9%, var(--bg));
22
+ --accent-line: color-mix(in oklab, var(--accent) 32%, transparent);
23
+ --serif: "Source Serif 4", Georgia, serif;
24
+ --sans: "Instrument Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
25
+ --mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
26
+ }
27
+
28
+ :root[data-theme="light"] {
29
+ --bg: #faf9f6;
30
+ --panel: #f2f0eb;
31
+ --panel2: #e9e6df;
32
+ --card: #ffffff;
33
+ --line: rgba(40, 35, 20, 0.09);
34
+ --line2: rgba(40, 35, 20, 0.17);
35
+ --text: #22211c;
36
+ --text2: #6d685c;
37
+ --text3: #a39e90;
38
+ --btn: #22211c;
39
+ --btn-text: #faf9f6;
40
+ --shadow-sm: 0 1px 2px rgba(30, 25, 10, 0.05);
41
+ --accent: oklch(0.54 0.18 295);
42
+ --green: oklch(0.55 0.12 152);
43
+ --amber: oklch(0.62 0.12 75);
44
+ --red: oklch(0.55 0.19 27);
45
+ }
46
+
47
+ /* ---- base ---- */
48
+
49
+ * { box-sizing: border-box; scrollbar-width: thin; scrollbar-color: rgba(128, 127, 140, 0.3) transparent; }
50
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
51
+ ::-webkit-scrollbar-track, ::-webkit-scrollbar-corner { background: transparent; }
52
+ ::-webkit-scrollbar-thumb {
53
+ background: rgba(128, 127, 140, 0.28);
54
+ border-radius: 99px;
55
+ border: 2px solid transparent;
56
+ background-clip: padding-box;
57
+ }
58
+ ::-webkit-scrollbar-thumb:hover { background: rgba(128, 127, 140, 0.5); background-clip: padding-box; }
17
59
 
18
60
  body {
19
61
  margin: 0;
20
62
  height: 100vh;
21
63
  display: flex;
22
- flex-direction: column;
23
64
  background: var(--bg);
24
65
  color: var(--text);
25
- font: 14px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
66
+ font-family: var(--sans);
67
+ font-size: 14px;
68
+ line-height: 1.5;
26
69
  }
70
+ textarea, input, select, button { font-family: inherit; font-size: inherit; color: inherit; }
71
+ textarea::placeholder, input::placeholder { color: var(--text3); }
72
+ a { color: var(--accent); text-decoration: none; }
73
+ a:hover { text-decoration: underline; }
74
+ summary { list-style: none; }
75
+ summary::-webkit-details-marker { display: none; }
76
+ .mono { font-family: var(--mono); }
77
+ .dim { color: var(--text3); }
78
+ @keyframes cz-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } }
27
79
 
28
- /* ---- header ---- */
29
- header {
30
- display: flex;
80
+ /* ---- shared buttons ---- */
81
+
82
+ .btn-dark {
83
+ display: inline-flex;
31
84
  align-items: center;
32
- gap: 12px;
33
- padding: 10px 16px;
34
- border-bottom: 1px solid var(--border);
35
- background: var(--bg-panel);
85
+ gap: 6px;
86
+ height: 29px;
87
+ padding: 0 15px;
88
+ border: none;
89
+ border-radius: 99px;
90
+ background: var(--btn);
91
+ color: var(--btn-text);
92
+ font-size: 12.5px;
93
+ font-weight: 600;
94
+ cursor: pointer;
95
+ white-space: nowrap;
36
96
  }
37
- .brand { font-weight: 700; font-size: 15px; }
38
- .chip {
39
- font-size: 12px;
40
- padding: 2px 10px;
41
- border: 1px solid var(--border);
42
- border-radius: 999px;
43
- color: var(--text-dim);
44
- font-family: var(--mono);
97
+ .btn-dark:hover { opacity: 0.88; }
98
+ .btn-dark:disabled { opacity: 0.45; cursor: default; }
99
+ .btn-dark .kbd { font-family: var(--mono); font-size: 10px; opacity: 0.6; }
100
+
101
+ .btn-ghost {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ gap: 6px;
105
+ height: 29px;
106
+ padding: 0 14px;
107
+ border: 1px solid var(--line2);
108
+ border-radius: 99px;
109
+ background: transparent;
110
+ color: var(--text);
111
+ font-size: 12.5px;
112
+ font-weight: 500;
113
+ cursor: pointer;
114
+ white-space: nowrap;
45
115
  }
46
- .chip.ok { color: var(--green); border-color: color-mix(in srgb, var(--green) 40%, transparent); }
47
- .chip.bad { color: var(--red); border-color: color-mix(in srgb, var(--red) 40%, transparent); }
48
- #env-chips { display: flex; gap: 6px; }
49
- nav#tabs { margin-left: auto; display: flex; gap: 4px; }
50
- nav#tabs button {
51
- background: none;
52
- border: 1px solid transparent;
53
- color: var(--text-dim);
54
- padding: 5px 14px;
116
+ .btn-ghost:hover { border-color: var(--text3); }
117
+ .btn-ghost:disabled { opacity: 0.45; cursor: default; }
118
+
119
+ .btn-text {
120
+ border: none;
121
+ background: transparent;
122
+ color: var(--text2);
123
+ font-size: 12.5px;
124
+ font-weight: 500;
125
+ cursor: pointer;
126
+ padding: 5px 9px;
55
127
  border-radius: 8px;
128
+ white-space: nowrap;
129
+ }
130
+ .btn-text:hover { background: var(--panel2); color: var(--text); }
131
+ .btn-text.danger { color: var(--red); }
132
+ .btn-text:disabled { opacity: 0.45; cursor: default; }
133
+
134
+ .chip-toggle {
135
+ display: inline-flex;
136
+ align-items: center;
137
+ height: 27px;
138
+ padding: 0 12px;
139
+ border-radius: 99px;
140
+ font-size: 12px;
141
+ font-weight: 500;
56
142
  cursor: pointer;
57
- font-size: 13px;
143
+ border: 1px solid var(--line2);
144
+ color: var(--text2);
145
+ background: transparent;
146
+ }
147
+ .chip-toggle:hover { border-color: var(--text3); }
148
+ .chip-toggle.on {
149
+ border-color: var(--accent-line);
150
+ color: var(--accent);
151
+ background: color-mix(in oklab, var(--accent) 10%, transparent);
58
152
  }
59
- nav#tabs button:hover { color: var(--text); }
60
- nav#tabs button.active { color: var(--text); background: var(--bg-raised); border-color: var(--border); }
61
153
 
62
- /* ---- layout ---- */
63
- main { flex: 1; min-height: 0; display: flex; }
64
- .view { flex: 1; min-height: 0; display: flex; }
65
- .view[hidden] { display: none; }
66
- #view-repo, #view-skills { flex-direction: column; overflow-y: auto; padding: 20px; gap: 16px; }
154
+ .error-text { color: var(--red); font-size: 12px; }
155
+
156
+ /* hover tooltips [data-tip] on any element; .tip-right anchors to the right
157
+ edge (for controls near the sidebar's edge) */
158
+ [data-tip] { position: relative; }
159
+ [data-tip]::after {
160
+ content: attr(data-tip);
161
+ position: absolute;
162
+ top: calc(100% + 8px);
163
+ left: 0;
164
+ z-index: 50;
165
+ width: max-content;
166
+ max-width: 215px;
167
+ padding: 7px 11px;
168
+ border: 1px solid var(--line2);
169
+ border-radius: 9px;
170
+ background: var(--panel2);
171
+ color: var(--text);
172
+ font-size: 11px;
173
+ font-weight: 400;
174
+ font-family: var(--sans);
175
+ line-height: 1.5;
176
+ text-align: left;
177
+ white-space: normal;
178
+ box-shadow: 0 10px 28px rgba(0, 0, 0, 0.3);
179
+ opacity: 0;
180
+ visibility: hidden;
181
+ transition: opacity 0.12s ease 0.25s, visibility 0s linear 0.37s;
182
+ pointer-events: none;
183
+ }
184
+ [data-tip]:hover::after { opacity: 1; visibility: visible; transition-delay: 0.25s, 0.25s; }
185
+ [data-tip].tip-right::after { left: auto; right: 0; }
186
+
187
+ /* status pill — detail header + step cards */
188
+ .pill {
189
+ display: inline-flex;
190
+ align-items: center;
191
+ gap: 6px;
192
+ font-size: 11px;
193
+ font-weight: 600;
194
+ padding: 3px 11px;
195
+ border-radius: 99px;
196
+ color: var(--text2);
197
+ background: var(--panel2);
198
+ white-space: nowrap;
199
+ }
200
+ .pill .pulse-dot {
201
+ width: 6px; height: 6px; border-radius: 50%;
202
+ background: currentColor;
203
+ animation: cz-pulse 1.5s ease-in-out infinite;
204
+ }
205
+ .pill.waiting, .pill.review { color: var(--amber); background: color-mix(in oklab, var(--amber) 13%, transparent); }
206
+ .pill.running { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
207
+ .pill.done { color: var(--green); background: color-mix(in oklab, var(--green) 12%, transparent); }
208
+ .pill.failed { color: var(--red); background: color-mix(in oklab, var(--red) 12%, transparent); }
209
+
210
+ /* run-list / variant dots */
211
+ .dot { width: 7px; height: 7px; border-radius: 50%; flex: none; background: var(--text3); }
212
+ .dot.waiting, .dot.review { background: var(--amber); animation: cz-pulse 1.5s ease-in-out infinite; }
213
+ .dot.running { background: var(--accent); animation: cz-pulse 1.5s ease-in-out infinite; }
214
+ .dot.done { background: var(--green); }
215
+ .dot.failed { background: var(--red); }
216
+
217
+ /* ---- sidebar ---- */
67
218
 
68
219
  #sidebar {
69
- width: 340px;
70
- min-width: 340px;
71
- border-right: 1px solid var(--border);
220
+ width: 288px;
221
+ min-width: 288px;
72
222
  display: flex;
73
223
  flex-direction: column;
74
224
  min-height: 0;
225
+ background: var(--panel);
226
+ border-right: 1px solid var(--line);
227
+ }
228
+
229
+ #brand { display: flex; align-items: center; gap: 9px; padding: 18px 18px 14px; }
230
+ #brand .brand-name {
231
+ font-family: var(--serif);
232
+ font-weight: 600;
233
+ font-size: 16.5px;
234
+ letter-spacing: -0.01em;
235
+ }
236
+ #repo-chip {
237
+ margin-left: auto;
238
+ font-size: 10.5px;
239
+ color: var(--text3);
240
+ overflow: hidden;
241
+ text-overflow: ellipsis;
242
+ white-space: nowrap;
243
+ max-width: 130px;
75
244
  }
76
245
 
77
- /* ---- new task form ---- */
78
- #new-task { padding: 12px; border-bottom: 1px solid var(--border); display: flex; flex-direction: column; gap: 8px; }
79
- #new-task textarea, #new-task input, #new-task select {
246
+ /* new task composer */
247
+ #new-task-wrap { padding: 0 14px 14px; }
248
+ #new-task {
249
+ border: 1px solid var(--line2);
250
+ border-radius: 12px;
251
+ background: var(--bg);
252
+ padding: 11px 12px 9px;
253
+ box-shadow: var(--shadow-sm);
254
+ display: flex;
255
+ flex-direction: column;
256
+ gap: 7px;
257
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
258
+ }
259
+ #new-task:focus-within {
260
+ border-color: var(--accent-line);
261
+ box-shadow: 0 4px 18px color-mix(in oklab, var(--accent) 10%, transparent), var(--shadow-sm);
262
+ }
263
+ #new-task textarea {
80
264
  width: 100%;
265
+ border: none;
266
+ background: transparent;
267
+ font-size: 13px;
268
+ line-height: 1.55;
269
+ resize: none;
270
+ height: 40px;
271
+ outline: none;
272
+ padding: 0;
273
+ overflow-y: auto;
274
+ transition: height 0.2s cubic-bezier(0.3, 0.7, 0.4, 1);
275
+ }
276
+ #task-thumbs { display: flex; gap: 7px; flex-wrap: wrap; }
277
+ #task-thumbs[hidden] { display: none; }
278
+ #task-thumbs .thumb { cursor: pointer; }
279
+ #task-thumbs img { height: 38px; border-radius: 7px; border: 1px solid var(--line2); display: block; }
280
+ #task-thumbs .thumb:hover img { border-color: var(--red); opacity: 0.7; }
281
+ #new-task .row { display: flex; gap: 7px; align-items: center; }
282
+
283
+ /* pill dropdowns — "≡ fix-and-verify ⌄" / "⊞ auto ⌄" */
284
+ .pill-select { position: relative; min-width: 0; }
285
+ #src-pill { flex: 0 1 auto; min-width: 0; }
286
+ #model-pill { flex: 0 1 auto; min-width: 0; }
287
+ .pill-btn {
288
+ display: inline-flex;
289
+ align-items: center;
290
+ gap: 6px;
291
+ max-width: 100%;
292
+ height: 26px;
293
+ padding: 0 9px 0 10px;
294
+ border: 1px solid var(--line);
295
+ border-radius: 99px;
296
+ background: var(--panel);
297
+ color: var(--text2);
298
+ font-family: var(--mono);
299
+ font-size: 11px;
300
+ cursor: pointer;
301
+ }
302
+ .pill-btn:hover { border-color: var(--line2); color: var(--text); }
303
+ .pill-btn .pl { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
304
+ .pill-btn svg.pic {
305
+ width: 11px; height: 11px; flex: none;
306
+ fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round;
307
+ opacity: 0.8;
308
+ }
309
+ .pill-btn svg.chev { width: 8px; height: 8px; flex: none; fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; opacity: 0.6; }
310
+ .pill-select.open .pill-btn { border-color: var(--accent-line); color: var(--text); }
311
+
312
+ .pill-menu {
313
+ position: absolute;
314
+ top: calc(100% + 6px);
315
+ left: 0;
316
+ z-index: 30;
317
+ min-width: 230px;
318
+ max-width: 256px;
319
+ max-height: 320px;
320
+ overflow-y: auto;
321
+ background: var(--panel2);
322
+ border: 1px solid var(--line2);
323
+ border-radius: 13px;
324
+ box-shadow: 0 12px 34px rgba(0, 0, 0, 0.35);
325
+ padding: 5px;
326
+ }
327
+ .pill-menu[hidden] { display: none; }
328
+ .pill-menu .menu-search {
329
+ display: flex;
330
+ align-items: center;
331
+ gap: 7px;
332
+ margin: 3px 3px 7px;
333
+ padding: 6px 10px;
334
+ border: 1px solid var(--line);
335
+ border-radius: 9px;
81
336
  background: var(--bg);
82
- border: 1px solid var(--border);
83
- border-radius: 8px;
337
+ }
338
+ .pill-menu .menu-search svg {
339
+ width: 12px; height: 12px; flex: none;
340
+ fill: none; stroke: var(--text3); stroke-width: 2; stroke-linecap: round;
341
+ }
342
+ .pill-menu .menu-search input {
343
+ flex: 1;
344
+ min-width: 0;
345
+ border: none;
346
+ background: transparent;
347
+ font-size: 12.5px;
84
348
  color: var(--text);
85
- padding: 8px 10px;
86
- font: inherit;
87
- resize: vertical;
349
+ outline: none;
350
+ padding: 0;
88
351
  }
89
- #new-task .row { display: flex; gap: 8px; }
90
- #new-task .row select { flex: 1.4; min-width: 0; }
91
- #new-task .row input { flex: 1; min-width: 0; }
92
- button.primary {
93
- background: var(--accent);
352
+ .pill-menu .menu-tabs {
353
+ display: flex;
354
+ margin: 0 3px 7px;
355
+ padding: 3px;
356
+ border-radius: 99px;
357
+ background: var(--bg);
358
+ }
359
+ .pill-menu .menu-tabs button {
360
+ flex: 1;
94
361
  border: none;
95
- color: #fff;
362
+ border-radius: 99px;
363
+ background: transparent;
364
+ color: var(--text3);
365
+ font-size: 11.5px;
96
366
  font-weight: 600;
97
- padding: 8px;
98
- border-radius: 8px;
367
+ padding: 4px 0;
99
368
  cursor: pointer;
100
369
  }
101
- button.primary:hover { filter: brightness(1.1); }
102
- button.primary:disabled { opacity: .5; cursor: default; }
103
- .error-text { color: var(--red); font-size: 12px; }
370
+ .pill-menu .menu-tabs button:hover { color: var(--text2); }
371
+ .pill-menu .menu-tabs button.active { background: var(--panel2); color: var(--text); box-shadow: var(--shadow-sm); }
372
+ .pill-menu .menu-empty { padding: 10px 12px; font-size: 12px; color: var(--text3); line-height: 1.5; }
373
+ .pill-menu .menu-group {
374
+ padding: 8px 10px 3px;
375
+ font-size: 9.5px;
376
+ font-weight: 600;
377
+ letter-spacing: 0.09em;
378
+ text-transform: uppercase;
379
+ color: var(--text3);
380
+ }
381
+ .pill-menu .menu-item { padding: 7px 10px; border-radius: 9px; cursor: pointer; }
382
+ .pill-menu .menu-item:hover { background: color-mix(in oklab, var(--text) 7%, transparent); }
383
+ .pill-menu .mi-title { display: flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 600; color: var(--text); }
384
+ .pill-menu .mi-title .chk { width: 12px; flex: none; color: var(--accent); font-size: 11px; }
385
+ .pill-menu .mi-desc {
386
+ margin: 2px 0 0 19px;
387
+ font-size: 11px;
388
+ line-height: 1.45;
389
+ color: var(--text3);
390
+ display: -webkit-box;
391
+ -webkit-line-clamp: 2;
392
+ -webkit-box-orient: vertical;
393
+ overflow: hidden;
394
+ }
395
+ .pill-menu .menu-item.on { background: color-mix(in oklab, var(--accent) 9%, transparent); }
104
396
 
105
- /* ---- run list ---- */
106
- #run-list { flex: 1; overflow-y: auto; }
107
- .run-item {
108
- padding: 10px 12px;
109
- border-bottom: 1px solid var(--border);
397
+ #new-task .actions { margin-top: 2px; gap: 6px; }
398
+ .icon-btn {
399
+ width: 27px;
400
+ height: 27px;
401
+ flex: none;
402
+ display: flex;
403
+ align-items: center;
404
+ justify-content: center;
405
+ border: 1px solid var(--line);
406
+ border-radius: 99px;
407
+ background: transparent;
408
+ color: var(--text3);
409
+ cursor: pointer;
410
+ }
411
+ .icon-btn:hover { border-color: var(--line2); color: var(--text); }
412
+ #plan-btn {
413
+ display: inline-flex;
414
+ align-items: center;
415
+ gap: 6px;
416
+ height: 27px;
417
+ padding: 0 11px;
418
+ border: 1px solid var(--line);
419
+ border-radius: 99px;
420
+ background: transparent;
421
+ color: var(--text2);
422
+ font-size: 11.5px;
423
+ font-weight: 500;
424
+ cursor: pointer;
425
+ }
426
+ #plan-btn svg { fill: none; stroke: currentColor; }
427
+ #plan-btn:hover { border-color: var(--line2); color: var(--text); }
428
+ #plan-btn:disabled { opacity: 0.45; cursor: default; }
429
+ #run-btn {
430
+ margin-left: auto;
431
+ width: 32px;
432
+ height: 32px;
433
+ flex: none;
434
+ display: flex;
435
+ align-items: center;
436
+ justify-content: center;
437
+ border: none;
438
+ border-radius: 99px;
439
+ background: var(--btn);
440
+ color: var(--btn-text);
110
441
  cursor: pointer;
442
+ }
443
+ #run-btn:hover { opacity: 0.88; }
444
+ #run-btn:disabled { opacity: 0.45; cursor: default; }
445
+
446
+ /* plan panel (spec 008) */
447
+ #plan-panel {
448
+ margin-top: 10px;
449
+ border: 1px solid var(--line);
450
+ border-radius: 12px;
451
+ background: var(--card);
452
+ box-shadow: var(--shadow-sm);
453
+ padding: 10px 11px;
111
454
  display: flex;
112
455
  flex-direction: column;
113
- gap: 3px;
456
+ gap: 8px;
457
+ }
458
+ #plan-panel[hidden] { display: none; }
459
+ .plan-note { font-size: 11.5px; color: var(--amber); }
460
+ .plan-rationale { font-size: 11.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
461
+ .plan-steps { display: flex; flex-direction: column; gap: 5px; }
462
+ .plan-step {
463
+ display: flex;
464
+ align-items: center;
465
+ gap: 6px;
466
+ border: 1px solid var(--line);
467
+ border-radius: 9px;
468
+ padding: 5px 8px;
469
+ background: var(--bg);
470
+ font-size: 12px;
471
+ }
472
+ .plan-step.drag-over { border-color: var(--accent); }
473
+ .plan-step .grip { cursor: grab; color: var(--text3); user-select: none; }
474
+ .plan-step .num { color: var(--text3); font-family: var(--mono); font-size: 10.5px; }
475
+ .plan-step .name { font-weight: 600; white-space: nowrap; }
476
+ .plan-step .hint {
477
+ flex: 1;
478
+ min-width: 0;
479
+ overflow: hidden;
480
+ text-overflow: ellipsis;
481
+ white-space: nowrap;
482
+ font-family: var(--mono);
483
+ font-size: 10.5px;
484
+ }
485
+ .plan-badge {
486
+ font-size: 9px;
487
+ font-weight: 600;
488
+ text-transform: uppercase;
489
+ letter-spacing: 0.06em;
490
+ padding: 1px 7px;
491
+ border-radius: 99px;
492
+ border: 1px solid var(--line2);
493
+ color: var(--text3);
494
+ white-space: nowrap;
495
+ }
496
+ .plan-badge.skill { color: var(--accent); border-color: var(--accent-line); }
497
+ .plan-step .plan-remove {
498
+ background: none;
499
+ border: none;
500
+ color: var(--text3);
501
+ cursor: pointer;
502
+ padding: 0 2px;
503
+ font-size: 12px;
114
504
  }
115
- .run-item:hover { background: var(--bg-panel); }
116
- .run-item.selected { background: var(--bg-raised); box-shadow: inset 3px 0 0 var(--accent); }
117
- .run-item .title { font-weight: 550; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
118
- .run-item .meta { display: flex; gap: 8px; align-items: center; font-size: 12px; color: var(--text-dim); }
505
+ .plan-step .plan-remove:hover { color: var(--red); }
506
+ .plan-actions { display: flex; gap: 6px; }
507
+ .plan-actions .btn-dark, .plan-actions .btn-ghost { flex: 1; justify-content: center; height: 28px; font-size: 12px; }
119
508
 
120
- /* ---- badges ---- */
121
- .badge {
122
- font-size: 11px;
509
+ /* nav */
510
+ #tabs { display: flex; flex-direction: column; gap: 1px; padding: 0 8px 10px; }
511
+ #tabs button {
512
+ display: flex;
513
+ align-items: center;
514
+ text-align: left;
515
+ width: 100%;
516
+ padding: 7px 11px;
517
+ border: none;
518
+ border-radius: 9px;
519
+ font-size: 13.5px;
520
+ font-weight: 500;
521
+ cursor: pointer;
522
+ background: transparent;
523
+ color: var(--text2);
524
+ }
525
+ #tabs button:hover { color: var(--text); }
526
+ #tabs button.active { background: var(--panel2); color: var(--text); }
527
+ #tabs svg {
528
+ width: 14px; height: 14px;
529
+ margin-right: 9px;
530
+ flex: none;
531
+ opacity: 0.85;
532
+ fill: none;
533
+ stroke: currentColor;
534
+ stroke-width: 1.8;
535
+ stroke-linecap: round;
536
+ stroke-linejoin: round;
537
+ }
538
+ #tabs .count-badge {
539
+ margin-left: auto;
540
+ font-family: var(--mono);
541
+ font-size: 10.5px;
542
+ color: var(--amber);
543
+ font-weight: 600;
544
+ }
545
+ #tabs .count-badge[hidden] { display: none; }
546
+
547
+ /* run list */
548
+ #run-list-wrap { flex: 1; min-height: 0; display: flex; flex-direction: column; }
549
+ #list-tabs { display: flex; gap: 4px; align-items: center; padding: 4px 14px 0; }
550
+ #list-tabs button {
551
+ background: none;
552
+ border: none;
553
+ color: var(--text3);
554
+ padding: 3px 8px;
555
+ border-radius: 99px;
556
+ cursor: pointer;
557
+ font-size: 10.5px;
123
558
  font-weight: 600;
124
- padding: 1px 8px;
125
- border-radius: 999px;
559
+ letter-spacing: 0.05em;
126
560
  text-transform: uppercase;
127
- letter-spacing: .3px;
128
561
  }
129
- .badge.queued { background: color-mix(in srgb, var(--yellow) 18%, transparent); color: var(--yellow); }
130
- .badge.running { background: color-mix(in srgb, var(--accent) 18%, transparent); color: var(--accent); animation: pulse 1.6s ease-in-out infinite; }
131
- .badge.done { background: color-mix(in srgb, var(--green) 15%, transparent); color: var(--green); }
132
- .badge.failed { background: color-mix(in srgb, var(--red) 15%, transparent); color: var(--red); }
133
- .badge.cancelled, .badge.skipped, .badge.pending { background: var(--bg-raised); color: var(--text-dim); }
134
- @keyframes pulse { 50% { opacity: .55; } }
562
+ #list-tabs button:hover { color: var(--text2); }
563
+ #list-tabs button.active { color: var(--text); background: var(--panel2); }
564
+ #list-tabs .dot { display: inline-block; width: 6px; height: 6px; margin-left: 3px; background: var(--amber); animation: cz-pulse 1.5s ease-in-out infinite; }
565
+
566
+ #run-list { flex: 1; overflow-y: auto; padding: 2px 8px 12px; }
567
+ .group-label {
568
+ padding: 14px 10px 5px;
569
+ font-size: 10.5px;
570
+ font-weight: 600;
571
+ letter-spacing: 0.09em;
572
+ text-transform: uppercase;
573
+ color: var(--text3);
574
+ }
575
+ .run-item {
576
+ display: flex;
577
+ align-items: center;
578
+ gap: 10px;
579
+ padding: 7px 11px;
580
+ border-radius: 9px;
581
+ cursor: pointer;
582
+ margin: 1px 0;
583
+ }
584
+ .run-item:hover { background: var(--panel2); }
585
+ .run-item.selected { background: var(--panel2); }
586
+ .run-item .title {
587
+ flex: 1;
588
+ min-width: 0;
589
+ font-size: 13px;
590
+ overflow: hidden;
591
+ text-overflow: ellipsis;
592
+ white-space: nowrap;
593
+ }
594
+ .run-item .time { font-family: var(--mono); font-size: 9.5px; color: var(--text3); flex: none; }
595
+ .run-item.variant-row { padding-left: 26px; }
596
+ .run-item.group-item .dots { display: flex; gap: 4px; flex: none; }
597
+ .compare-btn {
598
+ border: 1px solid var(--line2);
599
+ background: transparent;
600
+ color: var(--text2);
601
+ border-radius: 99px;
602
+ padding: 1px 9px;
603
+ cursor: pointer;
604
+ font-size: 10.5px;
605
+ flex: none;
606
+ }
607
+ .compare-btn:hover { border-color: var(--accent-line); color: var(--accent); }
608
+
609
+ /* footer */
610
+ #side-foot {
611
+ border-top: 1px solid var(--line);
612
+ padding: 11px 16px;
613
+ display: flex;
614
+ align-items: center;
615
+ gap: 12px;
616
+ }
617
+ #env-chips { display: flex; gap: 12px; min-width: 0; }
618
+ .env-chip {
619
+ display: flex;
620
+ align-items: center;
621
+ gap: 5px;
622
+ font-family: var(--mono);
623
+ font-size: 10px;
624
+ color: var(--text3);
625
+ white-space: nowrap;
626
+ }
627
+ .env-chip .led { width: 5px; height: 5px; border-radius: 50%; background: var(--green); flex: none; }
628
+ .env-chip.bad .led { background: var(--red); }
629
+ #theme-toggle {
630
+ margin-left: auto;
631
+ border: none;
632
+ background: transparent;
633
+ color: var(--text3);
634
+ font-family: var(--mono);
635
+ font-size: 10px;
636
+ letter-spacing: 0.08em;
637
+ cursor: pointer;
638
+ padding: 3px 0;
639
+ }
640
+ #theme-toggle:hover { color: var(--text2); }
641
+
642
+ /* ---- main ---- */
643
+
644
+ main { flex: 1; min-width: 0; display: flex; min-height: 0; background: var(--bg); }
645
+ .view { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
646
+ .view[hidden] { display: none; }
647
+ .scroll-view { overflow-y: auto; }
648
+ .page { max-width: 760px; margin: 0 auto; padding: 34px 40px; width: 100%; }
649
+ .page h1, .page-title {
650
+ margin: 0 0 4px;
651
+ font-family: var(--serif);
652
+ font-size: 27px;
653
+ font-weight: 500;
654
+ letter-spacing: -0.015em;
655
+ }
656
+ .page .lead { margin: 0 0 22px; font-size: 13.5px; color: var(--text2); }
657
+ .section-label {
658
+ font-size: 10.5px;
659
+ font-weight: 600;
660
+ letter-spacing: 0.09em;
661
+ text-transform: uppercase;
662
+ color: var(--text3);
663
+ margin: 26px 0 9px;
664
+ }
135
665
 
136
666
  /* ---- run detail ---- */
667
+
137
668
  #detail { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 0; }
138
- #detail .empty { margin: auto; color: var(--text-dim); }
139
- .detail-header {
140
- padding: 12px 16px;
141
- border-bottom: 1px solid var(--border);
669
+ #detail .empty { margin: auto; color: var(--text3); font-size: 13.5px; }
670
+
671
+ .detail-head { flex: none; padding: 26px 40px 0; max-width: 860px; width: 100%; margin: 0 auto; }
672
+ .detail-head .meta-line {
142
673
  display: flex;
143
674
  align-items: center;
144
675
  gap: 10px;
676
+ font-family: var(--mono);
677
+ font-size: 10.5px;
678
+ color: var(--text3);
145
679
  flex-wrap: wrap;
146
680
  }
147
- .detail-header h2 { margin: 0; font-size: 15px; flex: 1; min-width: 200px; }
148
- .detail-header .sub { width: 100%; font-size: 12px; color: var(--text-dim); font-family: var(--mono); }
149
- .detail-header button {
150
- background: var(--bg-raised);
151
- border: 1px solid var(--border);
152
- color: var(--text);
153
- border-radius: 8px;
154
- padding: 4px 12px;
155
- cursor: pointer;
156
- font-size: 12px;
681
+ .detail-head .meta-line a { color: var(--accent); }
682
+ .detail-head .title-row { display: flex; align-items: baseline; gap: 14px; margin-top: 8px; flex-wrap: wrap; }
683
+ .detail-head h1 {
684
+ margin: 0;
685
+ font-family: var(--serif);
686
+ font-size: 27px;
687
+ font-weight: 500;
688
+ letter-spacing: -0.015em;
689
+ flex: 1;
690
+ min-width: 240px;
691
+ line-height: 1.25;
157
692
  }
158
- .detail-header button:hover { border-color: var(--text-dim); }
159
- .detail-header button.danger:hover { border-color: var(--red); color: var(--red); }
160
-
161
- .steps-rail {
693
+ .detail-head .head-bar {
162
694
  display: flex;
163
- gap: 8px;
164
- padding: 10px 16px;
165
- border-bottom: 1px solid var(--border);
166
- overflow-x: auto;
695
+ align-items: center;
696
+ gap: 4px;
697
+ margin-top: 12px;
698
+ padding-bottom: 14px;
699
+ border-bottom: 1px solid var(--line);
167
700
  flex-wrap: wrap;
168
701
  }
169
- .step-card {
170
- border: 1px solid var(--border);
702
+ .detail-head .steps-line { font-family: var(--mono); font-size: 11px; color: var(--text2); }
703
+ .detail-head .head-bar .spacer { flex: 1; }
704
+ .detail-head .run-error { font-size: 12px; color: var(--red); margin-top: 6px; }
705
+ .detail-head .resume-hint { font-family: var(--mono); font-size: 10.5px; color: var(--text3); margin-top: 6px; }
706
+ .detail-head .btn-dark { height: 27px; padding: 0 13px; font-size: 12px; }
707
+
708
+ /* slide-down panels: review gate / diff / notes */
709
+ .detail-panel {
710
+ flex: none;
711
+ max-height: 50%;
712
+ overflow: auto;
713
+ border-bottom: 1px solid var(--line);
714
+ background: var(--panel);
715
+ padding: 14px 40px;
716
+ }
717
+ .detail-panel[hidden] { display: none; }
718
+ .detail-panel > .inner { max-width: 780px; margin: 0 auto; }
719
+ .detail-panel pre {
720
+ margin: 0;
721
+ font-family: var(--mono);
722
+ font-size: 11.5px;
723
+ line-height: 1.6;
724
+ white-space: pre-wrap;
725
+ word-break: break-word;
726
+ }
727
+ .panel-label {
728
+ font-size: 10.5px;
729
+ font-weight: 600;
730
+ letter-spacing: 0.09em;
731
+ text-transform: uppercase;
732
+ color: var(--text3);
733
+ margin-bottom: 9px;
734
+ }
735
+
736
+ #review-panel { background: var(--accent-soft); border-bottom: 1px solid var(--accent-line); }
737
+ #review-panel .panel-label { color: var(--accent); }
738
+ #review-notes {
739
+ width: 100%;
740
+ background: var(--card);
741
+ border: 1px solid var(--line2);
171
742
  border-radius: 10px;
172
- padding: 6px 12px;
173
- background: var(--bg-panel);
174
- display: flex;
743
+ padding: 8px 12px;
744
+ font-size: 13px;
745
+ resize: vertical;
746
+ outline: none;
747
+ margin-top: 10px;
748
+ }
749
+ .review-buttons { display: flex; gap: 8px; margin-top: 10px; }
750
+
751
+ /* transcript */
752
+ .log-wrap { position: relative; flex: 1; min-height: 0; display: flex; flex-direction: column; }
753
+ #log { flex: 1; overflow-y: auto; overflow-x: hidden; }
754
+ #log .log-inner { max-width: 860px; margin: 0 auto; padding: 18px 40px 28px; }
755
+
756
+ .ev { min-width: 0; }
757
+ .ev.step { display: flex; align-items: center; gap: 12px; margin: 22px 0 10px; }
758
+ .ev.step .step-label {
759
+ font-size: 10.5px;
760
+ font-weight: 600;
761
+ letter-spacing: 0.1em;
762
+ text-transform: uppercase;
763
+ color: var(--text3);
764
+ white-space: nowrap;
765
+ }
766
+ .ev.step .rule { flex: 1; height: 1px; background: var(--line); }
767
+
768
+ .ev.text {
769
+ color: var(--text);
770
+ font-size: 14px;
771
+ line-height: 1.7;
772
+ margin: 9px 0;
773
+ max-width: 66ch;
774
+ white-space: pre-wrap;
775
+ word-break: break-word;
776
+ }
777
+
778
+ .ev.tool, .ev.result > summary {
779
+ display: inline-flex;
175
780
  align-items: center;
176
781
  gap: 8px;
782
+ margin: 3px 8px 3px 0;
783
+ padding: 5px 11px 5px 9px;
784
+ border: 1px solid var(--line);
785
+ border-radius: 9px;
786
+ background: var(--card);
177
787
  font-size: 12px;
788
+ color: var(--text2);
789
+ max-width: 100%;
790
+ }
791
+ .ev.tool .ok { color: var(--green); font-size: 11px; }
792
+ .ev.tool .arg, .ev.tool code {
793
+ font-family: var(--mono);
794
+ font-size: 11px;
795
+ color: var(--text);
796
+ background: var(--panel2);
797
+ border-radius: 5px;
798
+ padding: 1px 7px;
799
+ overflow: hidden;
800
+ text-overflow: ellipsis;
178
801
  white-space: nowrap;
802
+ max-width: 46ch;
179
803
  }
180
- .step-card .name { font-weight: 600; }
181
- .step-card .tok { color: var(--text-dim); font-family: var(--mono); }
182
-
183
- /* ---- event log ---- */
184
- #log { flex: 1; overflow-y: auto; padding: 12px 16px 40px; font-family: var(--mono); font-size: 12.5px; }
185
- .ev { margin: 2px 0; white-space: pre-wrap; word-break: break-word; }
186
- .ev.text { color: var(--text); margin: 6px 0; }
187
- .ev.tool-call { color: var(--purple); }
188
- .ev.tool-result { color: var(--text-dim); }
189
- .ev.tool-result.error { color: var(--red); }
190
- .ev.note, .ev.lifecycle { color: var(--text-dim); font-style: italic; }
191
- .ev.error { color: var(--red); }
192
- .ev.step-start {
193
- margin: 14px 0 6px;
194
- color: var(--accent);
195
- font-weight: 700;
196
- border-top: 1px solid var(--border);
197
- padding-top: 10px;
804
+ .ev.result { margin: 4px 0; }
805
+ .ev.result > summary { cursor: pointer; }
806
+ .ev.result > summary:hover { border-color: var(--line2); }
807
+ .ev.result > summary .lead-in { color: var(--text3); font-size: 11px; }
808
+ .ev.result > summary .head {
809
+ overflow: hidden;
810
+ text-overflow: ellipsis;
811
+ white-space: nowrap;
812
+ max-width: 60ch;
198
813
  }
199
- .ev.check-output { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; color: var(--text-dim); }
200
- .ev details { display: inline-block; max-width: 100%; }
201
- .ev summary { cursor: pointer; }
202
- .ev details pre { margin: 4px 0 0; padding: 8px 10px; background: var(--bg-panel); border-radius: 8px; overflow-x: auto; }
814
+ .ev.result > summary .show { font-family: var(--mono); font-size: 10px; color: var(--text3); }
815
+ .ev.result pre, .ev.tool-detail pre {
816
+ margin: 7px 0 4px;
817
+ padding: 12px 15px;
818
+ background: var(--card);
819
+ border: 1px solid var(--line);
820
+ border-radius: 11px;
821
+ color: var(--text2);
822
+ overflow-x: auto;
823
+ line-height: 1.55;
824
+ font-family: var(--mono);
825
+ font-size: 11.5px;
826
+ }
827
+ .ev.result.error > summary { color: var(--red); }
828
+
829
+ .ev.check {
830
+ margin: 10px 0;
831
+ border: 1px solid var(--line);
832
+ border-radius: 12px;
833
+ background: var(--card);
834
+ overflow: hidden;
835
+ box-shadow: var(--shadow-sm);
836
+ }
837
+ .ev.check .check-head {
838
+ display: flex;
839
+ align-items: center;
840
+ gap: 10px;
841
+ padding: 8px 14px;
842
+ border-bottom: 1px solid var(--line);
843
+ }
844
+ .ev.check .check-head .lbl {
845
+ font-size: 10.5px;
846
+ font-weight: 600;
847
+ letter-spacing: 0.08em;
848
+ text-transform: uppercase;
849
+ color: var(--text3);
850
+ }
851
+ .ev.check .check-head code { font-family: var(--mono); font-size: 11.5px; color: var(--text); }
852
+ .ev.check .check-pill {
853
+ margin-left: auto;
854
+ font-size: 10.5px;
855
+ font-weight: 600;
856
+ padding: 2px 10px;
857
+ border-radius: 99px;
858
+ }
859
+ .ev.check .check-pill.pass { color: var(--green); background: color-mix(in oklab, var(--green) 12%, transparent); }
860
+ .ev.check .check-pill.fail { color: var(--red); background: color-mix(in oklab, var(--red) 12%, transparent); }
861
+ .ev.check pre {
862
+ margin: 0;
863
+ padding: 10px 15px;
864
+ font-family: var(--mono);
865
+ font-size: 11.5px;
866
+ color: var(--text2);
867
+ overflow-x: auto;
868
+ line-height: 1.6;
869
+ max-height: 260px;
870
+ }
871
+
872
+ .ev.user { display: flex; justify-content: flex-end; margin: 12px 0; }
873
+ .ev.user .bubble {
874
+ max-width: 75%;
875
+ padding: 10px 15px;
876
+ border-radius: 15px;
877
+ background: var(--panel2);
878
+ font-size: 13.5px;
879
+ line-height: 1.6;
880
+ white-space: pre-wrap;
881
+ word-break: break-word;
882
+ }
883
+
884
+ .ev.image-ev { margin: 11px 0; }
885
+ .img-card {
886
+ display: inline-block;
887
+ border: 1px solid var(--line2);
888
+ border-radius: 13px;
889
+ overflow: hidden;
890
+ cursor: zoom-in;
891
+ background: var(--card);
892
+ box-shadow: var(--shadow-sm);
893
+ max-width: 420px;
894
+ }
895
+ .img-card:hover { border-color: var(--text3); }
896
+ .img-card img { display: block; width: 100%; height: auto; }
897
+ .img-card .img-foot { display: flex; align-items: center; gap: 8px; padding: 7px 12px; border-top: 1px solid var(--line); }
898
+ .img-card .nm {
899
+ font-family: var(--mono);
900
+ font-size: 10.5px;
901
+ color: var(--text2);
902
+ overflow: hidden;
903
+ text-overflow: ellipsis;
904
+ white-space: nowrap;
905
+ }
906
+ .img-card .zm { font-family: var(--mono); font-size: 10px; color: var(--text3); margin-left: auto; white-space: nowrap; }
907
+
908
+ #lightbox {
909
+ position: fixed;
910
+ inset: 0;
911
+ background: rgba(10, 10, 14, 0.78);
912
+ backdrop-filter: blur(6px);
913
+ display: flex;
914
+ align-items: center;
915
+ justify-content: center;
916
+ z-index: 99;
917
+ cursor: zoom-out;
918
+ }
919
+ #lightbox .lb-inner { display: flex; flex-direction: column; gap: 11px; align-items: center; }
920
+ #lightbox img { max-width: 84vw; max-height: 80vh; border-radius: 12px; box-shadow: 0 24px 80px rgba(0, 0, 0, 0.5); }
921
+ #lightbox .lb-name { font-family: var(--mono); font-size: 11px; color: rgba(255, 255, 255, 0.72); }
922
+
923
+ .ev.note { font-family: var(--mono); font-size: 11px; color: var(--text3); margin: 5px 0; }
924
+ .ev.err { font-size: 13px; color: var(--red); margin: 8px 0; white-space: pre-wrap; }
203
925
 
204
926
  #jump-bottom {
205
927
  position: absolute;
206
- right: 24px;
207
- bottom: 20px;
208
- background: var(--bg-raised);
209
- border: 1px solid var(--border);
210
- color: var(--text);
211
- border-radius: 999px;
212
- padding: 6px 14px;
928
+ right: 28px;
929
+ bottom: 16px;
930
+ border: 1px solid var(--line2);
931
+ background: var(--panel);
932
+ color: var(--text2);
933
+ border-radius: 99px;
934
+ padding: 5px 14px;
213
935
  cursor: pointer;
214
- font-size: 12px;
215
- box-shadow: 0 4px 14px rgb(0 0 0 / .4);
936
+ font-size: 11.5px;
937
+ box-shadow: var(--shadow-sm);
216
938
  }
217
- .log-wrap { position: relative; flex: 1; min-height: 0; display: flex; flex-direction: column; }
939
+ #jump-bottom:hover { color: var(--text); }
218
940
 
219
- /* ---- repo & skills views ---- */
220
- .panel { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 12px; padding: 14px 16px; }
221
- .panel h3 { margin: 0 0 10px; font-size: 13px; text-transform: uppercase; letter-spacing: .5px; color: var(--text-dim); }
222
- .panel pre { margin: 0; overflow-x: auto; font-family: var(--mono); font-size: 12.5px; }
223
- .panel table { width: 100%; border-collapse: collapse; font-size: 13px; }
224
- .panel td { padding: 4px 8px 4px 0; border-bottom: 1px solid var(--border); vertical-align: top; }
225
- .panel td.mono, .mono { font-family: var(--mono); }
226
- .dim { color: var(--text-dim); }
227
- .skill-card { margin-bottom: 12px; }
228
- .skill-card .path { font-size: 11px; }
229
- .skill-card pre { max-height: 320px; overflow: auto; margin-top: 8px; }
230
-
231
- /* ---- live session (spec 002) ---- */
232
- .badge.waiting { background: color-mix(in srgb, var(--yellow) 22%, transparent); color: var(--yellow); animation: pulse 1.6s ease-in-out infinite; }
233
-
234
- #msg-form { border-top: 1px solid var(--border); padding: 10px 16px; background: var(--bg-panel); }
235
- #msg-form.disabled { opacity: .55; }
236
- .msg-row { display: flex; gap: 8px; align-items: flex-end; }
941
+ /* composer */
942
+ .composer-wrap { flex: none; padding: 0 40px 22px; max-width: 860px; width: 100%; margin: 0 auto; }
943
+ #waiting-note {
944
+ display: flex;
945
+ align-items: center;
946
+ gap: 7px;
947
+ font-size: 11.5px;
948
+ color: var(--amber);
949
+ margin: 0 4px 8px;
950
+ }
951
+ #waiting-note[hidden] { display: none; }
952
+ #waiting-note .pulse-dot {
953
+ width: 6px; height: 6px; border-radius: 50%;
954
+ background: var(--amber);
955
+ animation: cz-pulse 1.5s ease-in-out infinite;
956
+ }
957
+ #msg-form {
958
+ display: flex;
959
+ flex-direction: column;
960
+ gap: 6px;
961
+ padding: 10px 10px 10px 16px;
962
+ border: 1px solid var(--line2);
963
+ border-radius: 16px;
964
+ background: var(--card);
965
+ box-shadow: var(--shadow-sm);
966
+ }
967
+ #msg-form.disabled { opacity: 0.5; }
968
+ #msg-form.disabled #msg-text, #msg-form.disabled button { pointer-events: none; }
969
+ .msg-row { display: flex; gap: 6px; align-items: flex-end; }
237
970
  #msg-text {
238
971
  flex: 1;
239
- background: var(--bg);
240
- border: 1px solid var(--border);
241
- border-radius: 10px;
242
- color: var(--text);
243
- padding: 8px 12px;
244
- font: inherit;
972
+ border: none;
973
+ background: transparent;
974
+ font-size: 13.5px;
975
+ line-height: 1.55;
245
976
  resize: none;
977
+ outline: none;
978
+ padding: 4px 2px;
246
979
  max-height: 140px;
247
980
  }
248
- #msg-send { width: 44px; }
249
- #msg-attach {
250
- background: var(--bg-raised);
251
- border: 1px solid var(--border);
252
- color: var(--text);
253
- border-radius: 10px;
254
- padding: 8px 10px;
981
+ #msg-attach, #msg-send {
982
+ width: 32px;
983
+ height: 32px;
984
+ flex: none;
985
+ display: flex;
986
+ align-items: center;
987
+ justify-content: center;
988
+ border: none;
989
+ border-radius: 99px;
255
990
  cursor: pointer;
256
991
  }
257
- #msg-attach:hover { border-color: var(--text-dim); }
258
- #msg-thumbs { display: flex; gap: 8px; padding-bottom: 8px; }
259
- #msg-thumbs .thumb { position: relative; cursor: pointer; }
260
- #msg-thumbs img { height: 48px; border-radius: 8px; border: 1px solid var(--border); display: block; }
261
- #msg-thumbs .thumb:hover img { border-color: var(--red); opacity: .7; }
262
-
263
- .ev.user-message { color: var(--green); font-weight: 600; margin: 8px 0; }
992
+ #msg-attach { background: transparent; color: var(--text3); }
993
+ #msg-attach:hover { color: var(--text2); }
994
+ #msg-send { background: var(--btn); color: var(--btn-text); }
995
+ #msg-send:hover { opacity: 0.88; }
996
+ #msg-thumbs { display: flex; gap: 8px; }
997
+ #msg-thumbs[hidden] { display: none; }
998
+ #msg-thumbs .thumb { cursor: pointer; }
999
+ #msg-thumbs img { height: 44px; border-radius: 8px; border: 1px solid var(--line2); display: block; }
1000
+ #msg-thumbs .thumb:hover img { border-color: var(--red); opacity: 0.7; }
264
1001
 
265
1002
  #toast {
266
1003
  position: fixed;
267
1004
  bottom: 18px;
268
1005
  left: 50%;
269
1006
  transform: translateX(-50%);
270
- background: var(--bg-raised);
271
- border: 1px solid var(--border);
1007
+ background: var(--panel2);
1008
+ border: 1px solid var(--line2);
272
1009
  color: var(--text);
273
1010
  padding: 8px 18px;
274
- border-radius: 999px;
1011
+ border-radius: 99px;
275
1012
  font-size: 13px;
276
- box-shadow: 0 6px 20px rgb(0 0 0 / .5);
1013
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35);
277
1014
  z-index: 10;
1015
+ max-width: 80vw;
278
1016
  }
279
1017
 
280
- /* ---- task list upgrades (spec 004) ---- */
281
- #list-tabs {
1018
+ /* ---- inbox ---- */
1019
+
1020
+ .todo-card {
282
1021
  display: flex;
283
- gap: 4px;
284
1022
  align-items: center;
285
- padding: 8px 12px;
286
- border-bottom: 1px solid var(--border);
1023
+ gap: 16px;
1024
+ padding: 16px 0;
1025
+ border-bottom: 1px solid var(--line);
287
1026
  }
288
- #list-tabs button {
289
- background: none;
290
- border: 1px solid transparent;
291
- color: var(--text-dim);
292
- padding: 3px 10px;
293
- border-radius: 8px;
1027
+ .todo-card .todo-main { flex: 1; min-width: 0; }
1028
+ .todo-card .summary { font-size: 14px; font-weight: 500; }
1029
+ .todo-card .meta {
1030
+ display: flex;
1031
+ gap: 12px;
1032
+ margin-top: 5px;
1033
+ font-family: var(--mono);
1034
+ font-size: 10.5px;
1035
+ color: var(--text3);
1036
+ flex-wrap: wrap;
1037
+ }
1038
+ .todo-card .meta .gone { text-decoration: line-through; }
1039
+
1040
+ /* ---- split views (GitHub / Skills) ---- */
1041
+
1042
+ .split { flex: 1; min-height: 0; display: grid; grid-template-columns: 352px minmax(0, 1fr); }
1043
+ .split-list { border-right: 1px solid var(--line); display: flex; flex-direction: column; min-height: 0; }
1044
+ .split-list .split-head { padding: 24px 18px 0; }
1045
+ .split-list .head-row { display: flex; align-items: baseline; gap: 10px; }
1046
+ .split-list h1 {
1047
+ margin: 0;
1048
+ font-family: var(--serif);
1049
+ font-size: 21px;
1050
+ font-weight: 500;
1051
+ letter-spacing: -0.015em;
1052
+ }
1053
+ .split-list .head-note {
1054
+ margin-left: auto;
1055
+ display: flex;
1056
+ align-items: center;
1057
+ gap: 5px;
1058
+ font-family: var(--mono);
1059
+ font-size: 10px;
1060
+ color: var(--text3);
1061
+ white-space: nowrap;
1062
+ }
1063
+ .split-list .sub-tabs { display: flex; gap: 4px; margin: 13px 0 10px; }
1064
+ .split-list .sub-tabs button {
1065
+ display: inline-flex;
1066
+ align-items: center;
1067
+ height: 28px;
1068
+ padding: 0 13px;
1069
+ border: none;
1070
+ border-radius: 99px;
1071
+ font-size: 12.5px;
1072
+ font-weight: 500;
294
1073
  cursor: pointer;
1074
+ background: transparent;
1075
+ color: var(--text3);
1076
+ }
1077
+ .split-list .sub-tabs button.active { background: var(--panel2); color: var(--text); }
1078
+ .split-rows { flex: 1; overflow-y: auto; padding: 0 10px 14px; }
1079
+ .split-detail { overflow-y: auto; min-width: 0; }
1080
+ .split-detail .inner { max-width: 700px; padding: 30px 38px 44px; }
1081
+ .split-detail h1 {
1082
+ margin: 0;
1083
+ font-family: var(--serif);
1084
+ font-size: 25px;
1085
+ font-weight: 500;
1086
+ letter-spacing: -0.015em;
1087
+ line-height: 1.25;
1088
+ }
1089
+ .split-detail .empty { padding: 40px; color: var(--text3); font-size: 13px; }
1090
+
1091
+ .filter-input {
1092
+ width: calc(100% - 36px);
1093
+ margin: 14px 18px 8px;
1094
+ padding: 7px 13px;
1095
+ border: 1px solid var(--line);
1096
+ border-radius: 99px;
1097
+ background: var(--panel2);
1098
+ font-size: 12.5px;
1099
+ outline: none;
1100
+ }
1101
+
1102
+ /* GitHub rows + detail */
1103
+ .gh-row { padding: 9px 11px; border-radius: 10px; cursor: pointer; margin: 1px 0; }
1104
+ .gh-row:hover, .gh-row.selected { background: var(--panel2); }
1105
+ .gh-row .row1 { display: flex; align-items: center; gap: 9px; }
1106
+ .gh-row .row1 svg { width: 13px; height: 13px; flex: none; fill: none; stroke-width: 1.8; }
1107
+ .gh-row .row1 .t {
1108
+ flex: 1;
1109
+ min-width: 0;
1110
+ font-size: 13px;
1111
+ font-weight: 500;
1112
+ overflow: hidden;
1113
+ text-overflow: ellipsis;
1114
+ white-space: nowrap;
1115
+ }
1116
+ .gh-row .row2 {
1117
+ display: flex;
1118
+ gap: 10px;
1119
+ margin: 4px 0 0 22px;
1120
+ font-family: var(--mono);
1121
+ font-size: 10px;
1122
+ color: var(--text3);
1123
+ }
1124
+ .gh-row .row2 .queued-flag { color: var(--accent); }
1125
+
1126
+ .gh-label {
1127
+ font-size: 10px;
1128
+ font-weight: 600;
1129
+ letter-spacing: 0.06em;
1130
+ text-transform: uppercase;
1131
+ padding: 2px 9px;
1132
+ border-radius: 99px;
1133
+ background: var(--panel2);
1134
+ color: var(--text2);
1135
+ }
1136
+ .gh-checks { font-family: var(--mono); font-size: 11px; margin-left: 4px; }
1137
+ .gh-checks.passing { color: var(--green); }
1138
+ .gh-checks.failing { color: var(--red); }
1139
+ .gh-checks.pending { color: var(--amber); }
1140
+ .gh-body {
1141
+ margin-top: 16px;
1142
+ padding-bottom: 22px;
1143
+ border-bottom: 1px solid var(--line);
1144
+ font-size: 14px;
1145
+ line-height: 1.7;
1146
+ max-width: 64ch;
1147
+ white-space: pre-wrap;
1148
+ word-break: break-word;
1149
+ }
1150
+ .gh-hand { margin-top: 24px; }
1151
+ .gh-hand .hand-label {
1152
+ display: flex;
1153
+ align-items: center;
1154
+ gap: 7px;
1155
+ font-size: 10.5px;
1156
+ font-weight: 600;
1157
+ letter-spacing: 0.09em;
1158
+ text-transform: uppercase;
1159
+ color: var(--text3);
1160
+ }
1161
+ .gh-hand .hand-label svg { width: 12px; height: 12px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linejoin: round; }
1162
+ .gh-hand .hand-row { display: flex; align-items: flex-start; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
1163
+ .gh-hand .hand-row .k { font-size: 12px; color: var(--text3); width: 72px; flex: none; padding-top: 6px; }
1164
+ .gh-hand .hand-row .chips { display: flex; gap: 7px; flex-wrap: wrap; flex: 1; }
1165
+ .gh-hand .go-row { display: flex; align-items: center; gap: 12px; margin-top: 18px; }
1166
+ .gh-hand .queued-ok { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--green); }
1167
+ .gh-unavailable { padding: 40px; color: var(--text3); font-size: 13px; max-width: 46ch; line-height: 1.7; }
1168
+
1169
+ /* Skills rows + detail */
1170
+ .skill-row { padding: 10px 12px; border-radius: 10px; cursor: pointer; margin: 1px 0; }
1171
+ .skill-row:hover, .skill-row.selected { background: var(--panel2); }
1172
+ .skill-row .row1 { display: flex; align-items: center; gap: 9px; }
1173
+ .skill-row .row1 svg { width: 13px; height: 13px; flex: none; fill: none; stroke: var(--text3); stroke-width: 1.8; stroke-linejoin: round; }
1174
+ .skill-row .name { font-family: var(--mono); font-size: 12.5px; font-weight: 600; }
1175
+ .skill-row .desc {
295
1176
  font-size: 12px;
1177
+ color: var(--text3);
1178
+ margin: 4px 0 0 22px;
1179
+ line-height: 1.5;
1180
+ overflow: hidden;
1181
+ text-overflow: ellipsis;
1182
+ white-space: nowrap;
296
1183
  }
297
- #list-tabs button:hover { color: var(--text); }
298
- #list-tabs button.active { color: var(--text); background: var(--bg-raised); border-color: var(--border); }
299
- #list-tabs .dot {
300
- display: inline-block;
301
- width: 7px;
302
- height: 7px;
303
- border-radius: 50%;
304
- background: var(--yellow);
305
- margin-left: 2px;
306
- animation: pulse 1.6s ease-in-out infinite;
307
- }
308
- .pr-badge {
309
- font-size: 11px;
1184
+ .skill-tag {
1185
+ font-size: 9.5px;
310
1186
  font-weight: 600;
311
- padding: 1px 8px;
312
- border-radius: 999px;
313
- background: color-mix(in srgb, var(--purple) 18%, transparent);
314
- color: var(--purple);
1187
+ text-transform: uppercase;
1188
+ letter-spacing: 0.08em;
1189
+ padding: 2px 8px;
1190
+ border-radius: 99px;
1191
+ color: var(--text3);
1192
+ background: var(--panel2);
1193
+ }
1194
+ .skill-tag.team { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
1195
+ .skill-detail .title-row { display: flex; align-items: center; gap: 11px; flex-wrap: wrap; }
1196
+ .skill-detail .path-line { font-family: var(--mono); font-size: 11px; color: var(--text3); margin-top: 9px; word-break: break-all; }
1197
+ .skill-detail .desc { color: var(--text2); font-size: 14px; line-height: 1.65; margin-top: 12px; max-width: 60ch; }
1198
+ .skill-detail .used-row {
1199
+ display: flex;
1200
+ align-items: center;
1201
+ gap: 9px;
1202
+ padding: 8px 0;
1203
+ border-bottom: 1px solid var(--line);
1204
+ font-family: var(--mono);
1205
+ font-size: 12px;
1206
+ color: var(--text2);
1207
+ }
1208
+ .skill-detail .used-row svg { width: 12px; height: 12px; fill: none; stroke: var(--text3); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
1209
+ .skill-detail .content-head { display: flex; align-items: center; gap: 8px; margin: 26px 0 9px; }
1210
+ .skill-detail .content-head .section-label { margin: 0; }
1211
+ .skill-detail .content-head .spacer { flex: 1; }
1212
+ .skill-detail pre.content {
1213
+ margin: 0;
1214
+ padding: 16px 18px;
1215
+ background: var(--card);
1216
+ border: 1px solid var(--line);
1217
+ border-radius: 12px;
1218
+ font-family: var(--mono);
1219
+ font-size: 11.5px;
1220
+ line-height: 1.7;
1221
+ color: var(--text2);
1222
+ overflow-x: auto;
1223
+ white-space: pre-wrap;
1224
+ word-break: break-word;
1225
+ }
1226
+ .split-list .list-foot { flex: none; border-top: 1px solid var(--line); padding: 8px 10px; background: var(--bg); }
1227
+ .skill-row.pinned { margin: 0; }
1228
+
1229
+ /* ---- repo ---- */
1230
+
1231
+ .repo-file { display: flex; gap: 13px; font-family: var(--mono); font-size: 12px; padding: 3px 0; }
1232
+ .repo-file .st { width: 16px; flex: none; color: var(--green); }
1233
+ .repo-file .st.added { color: var(--accent); }
1234
+ .repo-file .st.deleted { color: var(--red); }
1235
+ .repo-file .p { color: var(--text2); word-break: break-all; }
1236
+ .commit-row { display: flex; gap: 13px; align-items: baseline; font-size: 13px; padding: 5px 0; }
1237
+ .commit-row .hash { font-family: var(--mono); font-size: 11px; color: var(--text3); flex: none; }
1238
+ .commit-row .subj { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1239
+ .commit-row .when { font-family: var(--mono); font-size: 10.5px; color: var(--text3); flex: none; }
1240
+ .repo-diff {
1241
+ border: 1px solid var(--line);
1242
+ border-radius: 12px;
1243
+ background: var(--card);
1244
+ margin-top: 10px;
1245
+ }
1246
+ .repo-diff > summary { cursor: pointer; padding: 10px 14px; font-size: 12.5px; font-weight: 500; color: var(--text2); }
1247
+ .repo-diff .diff-wrap { padding: 0 14px 12px; }
1248
+
1249
+ /* ---- compare view (spec 010) ---- */
1250
+
1251
+ .compare-view { flex: 1; min-height: 0; overflow-y: auto; padding: 26px 40px; }
1252
+ .compare-view .inner { max-width: 980px; margin: 0 auto; display: flex; flex-direction: column; gap: 16px; }
1253
+ .compare-head h1 {
1254
+ margin: 0 0 2px;
1255
+ font-family: var(--serif);
1256
+ font-size: 24px;
1257
+ font-weight: 500;
1258
+ letter-spacing: -0.015em;
1259
+ }
1260
+ .compare-head .dim { font-size: 12.5px; }
1261
+ .compare-cols { display: flex; gap: 12px; align-items: stretch; }
1262
+ .compare-col {
1263
+ flex: 1;
1264
+ min-width: 0;
1265
+ border: 1px solid var(--line);
1266
+ border-radius: 13px;
1267
+ background: var(--card);
1268
+ box-shadow: var(--shadow-sm);
1269
+ padding: 14px;
1270
+ display: flex;
1271
+ flex-direction: column;
1272
+ gap: 8px;
1273
+ }
1274
+ .compare-col .col-head { display: flex; align-items: center; gap: 8px; }
1275
+ .compare-col .variant-letter { font-family: var(--mono); font-weight: 600; font-size: 16px; color: var(--accent); }
1276
+ .compare-col .col-meta { font-size: 11px; font-family: var(--mono); color: var(--text3); }
1277
+ .compare-col pre {
1278
+ margin: 0;
1279
+ font-family: var(--mono);
1280
+ font-size: 11px;
1281
+ line-height: 1.55;
1282
+ white-space: pre-wrap;
1283
+ word-break: break-word;
1284
+ overflow: auto;
1285
+ color: var(--text2);
1286
+ }
1287
+ .compare-col .col-stat { max-height: 140px; }
1288
+ .compare-col .col-handoff { max-height: 80px; color: var(--text3); }
1289
+ .compare-col .btn-dark { margin-top: auto; justify-content: center; }
1290
+ .compare-diffs { display: flex; flex-direction: column; gap: 6px; }
1291
+ .compare-diff { border: 1px solid var(--line); border-radius: 11px; background: var(--card); }
1292
+ .compare-diff > summary { cursor: pointer; padding: 8px 12px; font-size: 12.5px; font-weight: 500; color: var(--text2); }
1293
+ .compare-diff .diff-body { padding: 4px 10px 10px; }
1294
+
1295
+ /* ---- unified diff renderer (spec 009) ---- */
1296
+
1297
+ .diff-file { border: 1px solid var(--line); border-radius: 9px; margin: 3px 0; background: var(--bg); }
1298
+ .diff-file summary { cursor: pointer; padding: 5px 10px; font-family: var(--mono); font-size: 11.5px; font-weight: 600; }
1299
+ .diff-file pre {
1300
+ margin: 0;
1301
+ padding: 6px 10px;
1302
+ border-top: 1px solid var(--line);
1303
+ font-family: var(--mono);
1304
+ font-size: 11.5px;
1305
+ line-height: 1.55;
1306
+ overflow-x: auto;
1307
+ white-space: pre;
1308
+ }
1309
+ .diff-add { color: var(--green); }
1310
+ .diff-del { color: var(--red); }
1311
+ .diff-hunk { color: var(--accent); opacity: 0.8; }
1312
+ .diff-meta { color: var(--text3); opacity: 0.8; }
1313
+
1314
+ /* ---- bookmarklets (spec 011) ---- */
1315
+
1316
+ #bm-panel .bm-help { font-size: 13px; color: var(--text2); line-height: 1.65; margin: 10px 0; max-width: 56ch; }
1317
+ .bm-auto { display: flex; align-items: center; gap: 8px; font-size: 13px; margin-bottom: 10px; cursor: pointer; }
1318
+ .bm-auto input { accent-color: var(--accent); }
1319
+ .bm-filter {
1320
+ width: 100%;
1321
+ max-width: 340px;
1322
+ background: var(--panel2);
1323
+ border: 1px solid var(--line);
1324
+ border-radius: 99px;
1325
+ padding: 6px 13px;
1326
+ font-size: 12.5px;
1327
+ outline: none;
1328
+ margin: 10px 0 6px;
1329
+ display: block;
1330
+ }
1331
+ .bm-row { display: flex; align-items: center; gap: 8px; padding: 3px 0; min-width: 0; }
1332
+ a.bm {
1333
+ display: inline-block;
1334
+ padding: 4px 12px;
1335
+ border: 1px dashed var(--line2);
1336
+ border-radius: 99px;
1337
+ background: var(--panel2);
1338
+ color: var(--text);
1339
+ font-family: var(--mono);
1340
+ font-size: 12px;
315
1341
  text-decoration: none;
1342
+ cursor: grab;
1343
+ white-space: nowrap;
1344
+ overflow: hidden;
1345
+ text-overflow: ellipsis;
1346
+ }
1347
+ a.bm:hover { border-color: var(--accent-line); color: var(--accent); text-decoration: none; }
1348
+ .bm-copy {
1349
+ background: none;
1350
+ border: 1px solid var(--line);
1351
+ color: var(--text3);
1352
+ padding: 3px 10px;
1353
+ border-radius: 99px;
1354
+ cursor: pointer;
1355
+ font-size: 11.5px;
1356
+ }
1357
+ .bm-copy:hover { border-color: var(--text3); color: var(--text); }
1358
+ .bm-hint { font-size: 11.5px; color: var(--text3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1359
+
1360
+ /* narrow screens: sidebar shrinks, splits stack */
1361
+ @media (max-width: 900px) {
1362
+ #sidebar { width: 240px; min-width: 240px; }
1363
+ .split { grid-template-columns: 1fr; grid-template-rows: minmax(0, 45%) minmax(0, 1fr); }
1364
+ .split-list { border-right: none; border-bottom: 1px solid var(--line); }
316
1365
  }
317
- .pr-badge:hover { filter: brightness(1.2); }