declare-cc 1.0.8 → 2.0.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.
Files changed (75) hide show
  1. package/README.md +153 -187
  2. package/dist/client/assets/index-BVuhr02G.css +1 -0
  3. package/dist/client/assets/index-DujGXAYw.js +9 -0
  4. package/dist/client/index.html +23 -0
  5. package/dist/index.js +17459 -0
  6. package/package.json +38 -45
  7. package/src/agents/prompts/00-research.md +90 -0
  8. package/src/agents/prompts/01-vision.md +38 -0
  9. package/src/agents/prompts/02-declarations.md +47 -0
  10. package/src/agents/prompts/03-milestones.md +43 -0
  11. package/src/agents/prompts/04-actions.md +90 -0
  12. package/src/agents/prompts/05-execution.md +63 -0
  13. package/src/agents/prompts/06-verification.md +104 -0
  14. package/LICENSE +0 -21
  15. package/agents/declare-codebase-mapper.md +0 -761
  16. package/agents/declare-debugger.md +0 -1198
  17. package/agents/declare-executor.md +0 -353
  18. package/agents/declare-integration-checker.md +0 -440
  19. package/agents/declare-plan-checker.md +0 -608
  20. package/agents/declare-planner.md +0 -1015
  21. package/agents/declare-research-synthesizer.md +0 -309
  22. package/agents/declare-researcher.md +0 -484
  23. package/agents/declare-roadmapper.md +0 -639
  24. package/agents/declare-verifier.md +0 -555
  25. package/bin/declare.js +0 -16
  26. package/bin/install.js +0 -1907
  27. package/commands/declare/actions.md +0 -113
  28. package/commands/declare/add-todo.md +0 -41
  29. package/commands/declare/audit.md +0 -76
  30. package/commands/declare/check-todos.md +0 -125
  31. package/commands/declare/complete-milestone.md +0 -215
  32. package/commands/declare/dashboard.md +0 -65
  33. package/commands/declare/debug.md +0 -162
  34. package/commands/declare/discuss.md +0 -65
  35. package/commands/declare/execute.md +0 -521
  36. package/commands/declare/future.md +0 -72
  37. package/commands/declare/health.md +0 -92
  38. package/commands/declare/help.md +0 -31
  39. package/commands/declare/init.md +0 -39
  40. package/commands/declare/map-codebase.md +0 -149
  41. package/commands/declare/milestones.md +0 -98
  42. package/commands/declare/new-cycle.md +0 -172
  43. package/commands/declare/new-project.md +0 -565
  44. package/commands/declare/pause.md +0 -138
  45. package/commands/declare/plan.md +0 -320
  46. package/commands/declare/prioritize.md +0 -65
  47. package/commands/declare/progress.md +0 -116
  48. package/commands/declare/quick.md +0 -119
  49. package/commands/declare/reapply-patches.md +0 -178
  50. package/commands/declare/research.md +0 -267
  51. package/commands/declare/resume.md +0 -146
  52. package/commands/declare/set-profile.md +0 -66
  53. package/commands/declare/settings.md +0 -119
  54. package/commands/declare/status.md +0 -65
  55. package/commands/declare/trace.md +0 -81
  56. package/commands/declare/update.md +0 -251
  57. package/commands/declare/verify.md +0 -65
  58. package/commands/declare/visualize.md +0 -74
  59. package/dist/declare-tools.cjs +0 -9439
  60. package/dist/public/app.js +0 -8331
  61. package/dist/public/index.html +0 -3939
  62. package/hooks/declare-activity.js +0 -106
  63. package/hooks/declare-check-update.js +0 -62
  64. package/hooks/declare-server.js +0 -116
  65. package/hooks/declare-statusline.js +0 -91
  66. package/scripts/build-hooks.js +0 -42
  67. package/scripts/release.js +0 -50
  68. package/templates/future.md +0 -4
  69. package/templates/milestones.md +0 -11
  70. package/workflows/actions.md +0 -89
  71. package/workflows/discuss.md +0 -476
  72. package/workflows/future.md +0 -185
  73. package/workflows/milestones.md +0 -87
  74. package/workflows/scope.md +0 -94
  75. package/workflows/verify.md +0 -504
@@ -1,3939 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>Declare — Dashboard</title>
7
- <style>
8
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
9
-
10
- :root {
11
- /* ── Mesh/Deco-inspired dark palette ── */
12
- --bg: #111111;
13
- --surface: #1a1a1a;
14
- --surface2: #222222;
15
- --surface3: #2a2a2a;
16
- --border: rgba(255,255,255,0.08);
17
- --border-strong: rgba(255,255,255,0.14);
18
- --text: #d4d4d4;
19
- --text-dim: #999999;
20
- --text-bright: #f5f5f5;
21
- --text-muted: #6b6b6b;
22
-
23
- /* Brand accent — deco lime green */
24
- --accent: #d0ec1a;
25
- --accent-dim: rgba(208, 236, 26, 0.12);
26
- --accent-border: rgba(208, 236, 26, 0.25);
27
-
28
- --decl-color: #93c5fd;
29
- --decl-bg: rgba(147, 197, 253, 0.06);
30
- --decl-border: rgba(147, 197, 253, 0.15);
31
-
32
- --mile-color: #a595ff;
33
- --mile-bg: rgba(165, 149, 255, 0.06);
34
- --mile-border: rgba(165, 149, 255, 0.15);
35
-
36
- --act-color: #86efac;
37
- --act-bg: rgba(134, 239, 172, 0.06);
38
- --act-border: rgba(134, 239, 172, 0.15);
39
-
40
- /* done tones */
41
- --decl-done-color: #6b96c8;
42
- --decl-done-bg: rgba(107, 150, 200, 0.05);
43
- --decl-done-border: rgba(107, 150, 200, 0.10);
44
-
45
- --mile-done-color: #8878c0;
46
- --mile-done-bg: rgba(136, 120, 192, 0.05);
47
- --mile-done-border: rgba(136, 120, 192, 0.10);
48
-
49
- --act-done-color: #5cb88a;
50
- --act-done-bg: rgba(92, 184, 138, 0.05);
51
- --act-done-border: rgba(92, 184, 138, 0.10);
52
-
53
- /* workflow progress tones */
54
- --planned-color: #93c5fd;
55
- --planned-bg: rgba(147, 197, 253, 0.06);
56
- --planned-border: rgba(147, 197, 253, 0.15);
57
-
58
- --executing-color: #fbbf24;
59
- --executing-bg: rgba(251, 191, 36, 0.06);
60
- --executing-border: rgba(251, 191, 36, 0.18);
61
-
62
- --broken-color: #f87171;
63
- --broken-bg: rgba(248, 113, 113, 0.06);
64
- --broken-border: rgba(248, 113, 113, 0.18);
65
-
66
- /* integrity wholeness indicators */
67
- --integrity-whole: #86efac;
68
- --integrity-whole-glow: rgba(134, 239, 172, 0.2);
69
- --integrity-partial: #fbbf24;
70
- --integrity-partial-glow: rgba(251, 191, 36, 0.2);
71
- --integrity-broken: #f87171;
72
- --integrity-broken-glow: rgba(248, 113, 113, 0.2);
73
-
74
- --wholeness-whole: #86efac;
75
- --wholeness-partial: #fbbf24;
76
- --wholeness-broken: #f87171;
77
-
78
- --renegotiated-color: #fbbf24;
79
- --renegotiated-bg: rgba(251, 191, 36, 0.06);
80
- --renegotiated-border: rgba(251, 191, 36, 0.18);
81
-
82
- --panel-width: 360px;
83
- --status-bar-height: 48px;
84
- --topbar-height: 0px;
85
- --radius: 6px;
86
- --radius-lg: 10px;
87
- }
88
-
89
- body {
90
- background: var(--bg);
91
- color: var(--text);
92
- font-family: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
93
- font-size: 16px;
94
- line-height: 1.5;
95
- height: 100vh;
96
- display: flex;
97
- flex-direction: column;
98
- overflow: hidden;
99
- -webkit-font-smoothing: antialiased;
100
- -moz-osx-font-smoothing: grayscale;
101
- }
102
-
103
- /* ── Status bar ── */
104
- #status-bar {
105
- height: var(--status-bar-height);
106
- background: var(--surface);
107
- border-bottom: 1px solid var(--border);
108
- display: flex;
109
- align-items: center;
110
- gap: 0;
111
- padding: 0 20px;
112
- flex-shrink: 0;
113
- position: relative;
114
- z-index: 10;
115
- }
116
-
117
- #status-bar .project-name {
118
- font-weight: 600;
119
- font-size: 14px;
120
- color: var(--text-bright);
121
- letter-spacing: -0.01em;
122
- cursor: pointer;
123
- transition: color 0.15s;
124
- }
125
- #status-bar .project-name:hover { color: var(--accent); }
126
-
127
- /* Breadcrumb inline in status bar */
128
- #status-breadcrumb {
129
- display: flex;
130
- align-items: center;
131
- gap: 8px;
132
- margin-left: 0;
133
- font-size: 13px;
134
- }
135
- #status-breadcrumb .bc-sep {
136
- color: var(--text-muted);
137
- font-size: 11px;
138
- }
139
- #status-breadcrumb .bc-link {
140
- color: var(--text-dim);
141
- cursor: pointer;
142
- font-weight: 500;
143
- transition: color 0.15s;
144
- }
145
- #status-breadcrumb .bc-link:hover { color: var(--text-bright); }
146
- #status-breadcrumb .bc-current {
147
- color: var(--text-bright);
148
- font-weight: 600;
149
- }
150
- #status-breadcrumb .bc-title {
151
- color: var(--text-dim);
152
- font-size: 12px;
153
- font-weight: 400;
154
- }
155
-
156
- .stat-group {
157
- display: flex;
158
- align-items: center;
159
- gap: 6px;
160
- color: var(--text-dim);
161
- font-size: 12px;
162
- }
163
-
164
- .stat-group .value {
165
- font-weight: 600;
166
- color: var(--text);
167
- }
168
-
169
- .health-badge {
170
- padding: 2px 10px;
171
- border-radius: 12px;
172
- font-size: 11px;
173
- font-weight: 600;
174
- text-transform: uppercase;
175
- letter-spacing: 0.06em;
176
- }
177
- .health-healthy { background: #0a2018; color: #34d399; border: 1px solid #1a4d34; }
178
- .health-warnings { background: #251400; color: #ffa040; border: 1px solid #5a3000; }
179
- .health-errors { background: #2a0a10; color: #ff4d6d; border: 1px solid #5a1520; }
180
- .health-unknown { background: var(--surface2); color: var(--text-dim); border: 1px solid var(--border); }
181
-
182
- .status-pill {
183
- font-size: 11px;
184
- font-weight: 500;
185
- padding: 2px 10px;
186
- border-radius: 99px;
187
- border: 1px solid var(--border);
188
- color: var(--text-dim);
189
- white-space: nowrap;
190
- }
191
- .status-pill .pill-value {
192
- font-weight: 600;
193
- }
194
- .status-pill.integrity-ok .pill-value { color: var(--integrity-whole); }
195
- .status-pill.integrity-warn .pill-value { color: var(--integrity-partial); }
196
- .status-pill.integrity-bad .pill-value { color: var(--integrity-broken); }
197
-
198
- .spacer { flex: 1; }
199
- /* Status bar uses margin-left:auto on .status-right instead of spacer */
200
-
201
- #last-updated {
202
- color: var(--text-dim);
203
- font-size: 11px;
204
- white-space: nowrap;
205
- }
206
-
207
- /* Right side: integrity + next/execute */
208
- .status-right {
209
- display: flex;
210
- align-items: center;
211
- gap: 12px;
212
- margin-left: auto;
213
- flex-shrink: 0;
214
- }
215
-
216
- #execute-main-btn {
217
- background: var(--accent-dim);
218
- border: 1px solid var(--accent-border);
219
- color: var(--accent);
220
- padding: 6px 18px;
221
- border-radius: var(--radius);
222
- cursor: pointer;
223
- font-size: 13px;
224
- font-weight: 600;
225
- transition: all 0.15s ease;
226
- white-space: nowrap;
227
- }
228
- #execute-main-btn:hover { background: rgba(208, 236, 26, 0.18); border-color: rgba(208, 236, 26, 0.4); }
229
- #execute-main-btn:active { transform: scale(0.97); }
230
- #execute-main-btn:disabled { opacity: 0.4; cursor: not-allowed; }
231
- #execute-main-btn kbd {
232
- background: rgba(255,255,255,0.08);
233
- border: 1px solid rgba(255,255,255,0.12);
234
- border-radius: 3px;
235
- padding: 1px 5px;
236
- font-size: 10px;
237
- margin-right: 3px;
238
- vertical-align: baseline;
239
- }
240
- #execute-main-btn.btn-next {
241
- background: var(--surface2);
242
- border-color: var(--border-strong);
243
- color: var(--text);
244
- }
245
- #execute-main-btn.btn-next:hover { background: var(--surface3); }
246
- #execute-main-btn.btn-plan {
247
- background: var(--accent-dim);
248
- border-color: var(--accent-border);
249
- color: var(--accent);
250
- }
251
- #execute-main-btn.btn-plan:hover { background: rgba(208, 236, 26, 0.18); border-color: rgba(208, 236, 26, 0.4); }
252
- #execute-main-btn.btn-done {
253
- background: rgba(134, 239, 172, 0.08);
254
- border-color: rgba(134, 239, 172, 0.2);
255
- color: #86efac;
256
- }
257
-
258
- /* ── Main layout ── */
259
- #main {
260
- flex: 1;
261
- overflow: hidden;
262
- display: flex;
263
- flex-direction: column;
264
- }
265
-
266
- /* Integrity wholeness dot */
267
- .integrity-dot {
268
- display: inline-block;
269
- width: 7px;
270
- height: 7px;
271
- border-radius: 50%;
272
- margin-left: 6px;
273
- vertical-align: middle;
274
- position: relative;
275
- top: -0.5px;
276
- }
277
- .integrity-dot.integrity-whole {
278
- background: var(--integrity-whole);
279
- box-shadow: 0 0 6px var(--integrity-whole-glow);
280
- }
281
- .integrity-dot.integrity-partial {
282
- background: var(--integrity-partial);
283
- box-shadow: 0 0 6px var(--integrity-partial-glow);
284
- }
285
- .integrity-dot.integrity-broken {
286
- background: var(--integrity-broken);
287
- box-shadow: 0 0 6px var(--integrity-broken-glow);
288
- }
289
-
290
- /* ── Side panel — always visible, fixed right column ── */
291
- #side-panel {
292
- position: fixed;
293
- top: calc(var(--topbar-height) + var(--status-bar-height));
294
- right: 0;
295
- width: var(--panel-width);
296
- height: calc(100vh - var(--topbar-height) - var(--status-bar-height));
297
- background: var(--surface);
298
- border-left: 1px solid var(--border);
299
- display: flex;
300
- flex-direction: column;
301
- overflow: hidden;
302
- z-index: 20;
303
- }
304
-
305
- #panel-header {
306
- padding: 16px 20px 12px;
307
- border-bottom: 1px solid var(--border);
308
- display: flex;
309
- align-items: center;
310
- justify-content: space-between;
311
- flex-shrink: 0;
312
- }
313
-
314
- #panel-title {
315
- font-size: 12px;
316
- font-weight: 700;
317
- letter-spacing: 0.08em;
318
- text-transform: uppercase;
319
- color: var(--text-dim);
320
- }
321
-
322
- #panel-close {
323
- background: none;
324
- border: none;
325
- color: var(--text-dim);
326
- cursor: pointer;
327
- font-size: 18px;
328
- line-height: 1;
329
- padding: 0 4px;
330
- transition: color 0.12s;
331
- }
332
- #panel-close:hover { color: var(--text-bright); }
333
-
334
- #panel-body {
335
- flex: 1;
336
- overflow-y: auto;
337
- padding: 20px;
338
- }
339
-
340
- #panel-body::-webkit-scrollbar { width: 4px; }
341
- #panel-body::-webkit-scrollbar-track { background: transparent; }
342
- #panel-body::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
343
-
344
- .detail-id {
345
- font-size: 11px;
346
- font-weight: 700;
347
- letter-spacing: 0.08em;
348
- opacity: 0.6;
349
- margin-bottom: 6px;
350
- }
351
-
352
- .detail-title {
353
- font-size: 16px;
354
- font-weight: 600;
355
- color: var(--text-bright);
356
- line-height: 1.4;
357
- margin-bottom: 16px;
358
- }
359
-
360
- .detail-badge {
361
- display: inline-block;
362
- padding: 3px 12px;
363
- border-radius: 10px;
364
- font-size: 11px;
365
- font-weight: 700;
366
- letter-spacing: 0.06em;
367
- text-transform: uppercase;
368
- margin-bottom: 20px;
369
- }
370
-
371
- /* Wholeness badge in detail panel */
372
- .wholeness-badge {
373
- display: inline-block;
374
- padding: 2px 10px;
375
- border-radius: 10px;
376
- font-size: 11px;
377
- font-weight: 600;
378
- letter-spacing: 0.04em;
379
- text-transform: uppercase;
380
- }
381
- .wholeness-badge.wb-whole { background: #0a2018; color: var(--wholeness-whole); border: 1px solid #1a4d34; }
382
- .wholeness-badge.wb-partial { background: #1a1200; color: var(--wholeness-partial); border: 1px solid #3d2c00; }
383
- .wholeness-badge.wb-broken { background: #2a0a10; color: var(--wholeness-broken); border: 1px solid #5a1520; }
384
-
385
- .detail-section {
386
- margin-bottom: 20px;
387
- }
388
-
389
- .detail-label {
390
- font-size: 10px;
391
- font-weight: 700;
392
- letter-spacing: 0.1em;
393
- text-transform: uppercase;
394
- color: var(--text-dim);
395
- margin-bottom: 6px;
396
- }
397
-
398
- .detail-value {
399
- color: var(--text);
400
- font-size: 13px;
401
- line-height: 1.55;
402
- }
403
-
404
- .detail-tag-list {
405
- display: flex;
406
- flex-wrap: wrap;
407
- gap: 6px;
408
- }
409
-
410
- .detail-tag {
411
- padding: 3px 10px;
412
- border-radius: 6px;
413
- font-size: 11px;
414
- font-weight: 500;
415
- background: var(--surface2);
416
- border: 1px solid var(--border);
417
- color: var(--text-dim);
418
- cursor: pointer;
419
- transition: border-color 0.12s, color 0.12s;
420
- }
421
- .detail-tag:hover { border-color: var(--text-dim); color: var(--text); }
422
-
423
- /* ── Loading & error overlays ── */
424
- #overlay {
425
- position: fixed;
426
- inset: 0;
427
- background: rgba(14, 14, 18, 0.92);
428
- display: flex;
429
- flex-direction: column;
430
- align-items: center;
431
- justify-content: center;
432
- gap: 16px;
433
- z-index: 100;
434
- }
435
- #overlay.hidden { display: none; }
436
-
437
- .spinner {
438
- width: 36px;
439
- height: 36px;
440
- border: 3px solid var(--border);
441
- border-top-color: var(--decl-color);
442
- border-radius: 50%;
443
- animation: spin 0.7s linear infinite;
444
- }
445
-
446
- @keyframes spin { to { transform: rotate(360deg); } }
447
-
448
- #overlay-message {
449
- color: var(--text-dim);
450
- font-size: 14px;
451
- }
452
-
453
- #overlay-error {
454
- color: var(--broken-color);
455
- font-size: 13px;
456
- text-align: center;
457
- max-width: 400px;
458
- }
459
-
460
- #overlay-retry {
461
- display: none;
462
- background: var(--surface2);
463
- border: 1px solid var(--border);
464
- color: var(--text);
465
- padding: 8px 20px;
466
- border-radius: 8px;
467
- cursor: pointer;
468
- font-size: 13px;
469
- margin-top: 4px;
470
- }
471
- #overlay-retry:hover { border-color: var(--text-dim); }
472
-
473
- /* ── Activity feed ── */
474
- /* ── Activity sidebar (right panel in drill-body) ── */
475
- #activity-feed {
476
- width: 280px;
477
- flex-shrink: 0;
478
- background: var(--surface);
479
- border-left: 1px solid var(--border);
480
- display: flex;
481
- flex-direction: column;
482
- overflow: hidden;
483
- }
484
-
485
- #activity-toggle {
486
- flex-shrink: 0;
487
- padding: 12px 16px 8px;
488
- font-size: 10px;
489
- font-weight: 700;
490
- letter-spacing: 0.06em;
491
- text-transform: uppercase;
492
- color: var(--text-dim);
493
- display: flex;
494
- align-items: center;
495
- gap: 6px;
496
- }
497
- #activity-pulse {
498
- width: 6px; height: 6px;
499
- border-radius: 50%;
500
- background: var(--act-color);
501
- opacity: 0;
502
- transition: opacity 0.3s;
503
- }
504
- #activity-pulse.live { opacity: 1; animation: pulse 1.5s ease-in-out infinite; }
505
- @keyframes pulse {
506
- 0%, 100% { opacity: 1; }
507
- 50% { opacity: 0.3; }
508
- }
509
-
510
- #activity-tabs {
511
- display: flex;
512
- gap: 4px;
513
- align-items: center;
514
- flex: 1;
515
- }
516
- .activity-tab {
517
- font-size: 10px;
518
- font-weight: 700;
519
- letter-spacing: 0.06em;
520
- text-transform: uppercase;
521
- color: var(--text-muted);
522
- cursor: pointer;
523
- padding: 2px 6px;
524
- border-radius: 3px;
525
- transition: color 0.15s, background 0.15s;
526
- }
527
- .activity-tab:hover { color: var(--text-dim); }
528
- .activity-tab.active { color: var(--text-bright); background: var(--surface3); }
529
-
530
- .activity-tab-content { display: none; }
531
- .activity-tab-content.active { display: flex; flex-direction: column; flex: 1; overflow: hidden; }
532
-
533
- #activity-cards.active { overflow-y: auto; padding: 8px; gap: 8px; }
534
- #activity-cards-active { display: flex; flex-direction: column; gap: 6px; }
535
- #activity-cards-recent { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border); }
536
- #activity-cards-recent:empty { display: none; }
537
- #activity-cards::-webkit-scrollbar { width: 4px; }
538
- #activity-cards::-webkit-scrollbar-track { background: transparent; }
539
- #activity-cards::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
540
-
541
- #activity-list {
542
- flex: 1;
543
- overflow-y: auto;
544
- overflow-x: hidden;
545
- padding: 8px 0;
546
- font-size: 12px;
547
- display: flex;
548
- flex-direction: column;
549
- gap: 0;
550
- }
551
- #activity-list::-webkit-scrollbar { width: 4px; }
552
- #activity-list::-webkit-scrollbar-track { background: transparent; }
553
- #activity-list::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
554
-
555
- .activity-event {
556
- padding: 8px 16px;
557
- color: var(--text-dim);
558
- display: flex;
559
- flex-direction: column;
560
- gap: 3px;
561
- flex-shrink: 0;
562
- border-bottom: 1px solid rgba(255,255,255,0.03);
563
- transition: background 0.15s;
564
- }
565
- .activity-event:hover { background: var(--surface2); cursor: default; }
566
- .activity-event.clickable { cursor: pointer; }
567
- .activity-event.clickable:hover { background: var(--surface3); }
568
- .activity-event:last-child { border-bottom: none; }
569
- .activity-event.is-new {
570
- animation: activity-flash 1.5s ease-out;
571
- }
572
- @keyframes activity-flash {
573
- 0% { background: rgba(134, 239, 172, 0.08); }
574
- 100% { background: transparent; }
575
- }
576
-
577
- .ae-top {
578
- display: flex;
579
- align-items: center;
580
- gap: 6px;
581
- }
582
- .ae-time { opacity: 0.5; font-size: 11px; flex-shrink: 0; font-family: 'SF Mono', 'Fira Code', monospace; }
583
- .ae-icon { flex-shrink: 0; font-size: 12px; }
584
- .ae-label {
585
- font-size: 12px;
586
- font-weight: 600;
587
- overflow: hidden;
588
- text-overflow: ellipsis;
589
- white-space: nowrap;
590
- }
591
- .ae-label.agent-start { color: var(--act-color); }
592
- .ae-label.agent-done { color: var(--mile-color); }
593
- .ae-label.bash { color: var(--text); }
594
- .ae-label.write { color: var(--decl-color); }
595
- .ae-label.review { color: var(--accent); }
596
- .ae-desc {
597
- font-size: 12px;
598
- color: var(--text-dim);
599
- line-height: 1.4;
600
- overflow: hidden;
601
- text-overflow: ellipsis;
602
- white-space: nowrap;
603
- padding-left: 18px;
604
- }
605
-
606
- /* ── Execute/Stop button ── */
607
- .exec-btn {
608
- background: var(--act-bg);
609
- border: 1px solid var(--act-border);
610
- color: var(--act-color);
611
- padding: 6px 16px;
612
- border-radius: 6px;
613
- font-size: 12px;
614
- font-weight: 600;
615
- cursor: pointer;
616
- display: inline-flex;
617
- align-items: center;
618
- gap: 6px;
619
- transition: background 0.15s, border-color 0.15s;
620
- }
621
- .exec-btn:hover { background: #0d2818; border-color: #2a6a48; }
622
- .exec-btn:disabled { opacity: 0.5; cursor: not-allowed; }
623
-
624
- .exec-btn.stop {
625
- background: var(--broken-bg);
626
- border-color: var(--broken-border);
627
- color: var(--broken-color);
628
- }
629
- .exec-btn.stop:hover { background: #3a0e18; border-color: #7a2035; }
630
-
631
- /* ── Output log panel ── */
632
- .output-log {
633
- background: #0a0a0e;
634
- border: 1px solid var(--border);
635
- border-radius: 6px;
636
- padding: 10px 12px;
637
- margin-top: 12px;
638
- max-height: 300px;
639
- overflow-y: auto;
640
- font-family: monospace;
641
- font-size: 11px;
642
- line-height: 1.5;
643
- color: var(--text-dim);
644
- white-space: pre-wrap;
645
- word-break: break-all;
646
- }
647
- .output-log::-webkit-scrollbar { width: 4px; }
648
- .output-log::-webkit-scrollbar-track { background: transparent; }
649
- .output-log::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
650
-
651
- .output-log .exit-code {
652
- display: block;
653
- margin-top: 8px;
654
- padding-top: 8px;
655
- border-top: 1px solid var(--border);
656
- font-weight: 700;
657
- }
658
- .output-log .exit-code.success { color: var(--act-color); }
659
- .output-log .exit-code.failure { color: var(--broken-color); }
660
-
661
- /* ── Drill browser — 3-panel layout ── */
662
- #drill-browser {
663
- display: none;
664
- width: 100%;
665
- flex: 1;
666
- min-height: 0;
667
- flex-direction: column;
668
- }
669
- #drill-browser.active {
670
- display: flex;
671
- }
672
-
673
- #drill-breadcrumb {
674
- display: none; /* breadcrumb now lives in status bar */
675
- }
676
-
677
- /* 3-panel body: left detail + center list + right activity */
678
- #drill-body {
679
- flex: 1;
680
- display: flex;
681
- overflow: hidden;
682
- }
683
-
684
- /* Left detail panel — shown at level 2+ */
685
- #drill-detail {
686
- width: 280px;
687
- flex-shrink: 0;
688
- overflow-y: auto;
689
- background: var(--surface);
690
- border-right: 1px solid var(--border);
691
- padding: 20px;
692
- display: none;
693
- flex-direction: column;
694
- gap: 16px;
695
- }
696
- #drill-detail.visible { display: flex; }
697
- #drill-detail[data-node-type="declaration"] {
698
- background: linear-gradient(180deg, rgba(134, 239, 172, 0.04) 0%, var(--surface) 40%);
699
- border-right-color: rgba(134, 239, 172, 0.12);
700
- }
701
- #drill-detail[data-node-type="declaration"] .detail-id { color: var(--act-color); }
702
- #drill-detail[data-node-type="milestone"] {
703
- background: linear-gradient(180deg, rgba(165, 149, 255, 0.04) 0%, var(--surface) 40%);
704
- border-right-color: rgba(165, 149, 255, 0.12);
705
- }
706
- #drill-detail[data-node-type="milestone"] .detail-id { color: var(--mile-color); }
707
- #drill-detail[data-node-type="action"] {
708
- background: linear-gradient(180deg, rgba(147, 197, 253, 0.04) 0%, var(--surface) 40%);
709
- border-right-color: rgba(147, 197, 253, 0.12);
710
- }
711
- #drill-detail[data-node-type="action"] .detail-id { color: var(--decl-color); }
712
- #drill-detail::-webkit-scrollbar { width: 4px; }
713
- #drill-detail::-webkit-scrollbar-track { background: transparent; }
714
- #drill-detail::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
715
-
716
- .detail-id {
717
- font-size: 11px;
718
- font-weight: 700;
719
- letter-spacing: 0.04em;
720
- text-transform: uppercase;
721
- color: var(--text-dim);
722
- }
723
- .detail-title {
724
- font-size: 18px;
725
- font-weight: 700;
726
- color: var(--text-bright);
727
- line-height: 1.35;
728
- letter-spacing: -0.01em;
729
- }
730
- .detail-desc {
731
- font-size: 13px;
732
- color: var(--text);
733
- line-height: 1.6;
734
- }
735
- .detail-desc:empty { display: none; }
736
- .detail-badges {
737
- display: flex;
738
- align-items: center;
739
- gap: 6px;
740
- flex-wrap: wrap;
741
- }
742
- .detail-section-label {
743
- font-size: 11px;
744
- font-weight: 600;
745
- letter-spacing: 0.04em;
746
- text-transform: uppercase;
747
- color: var(--text-dim);
748
- margin-top: 4px;
749
- }
750
- .detail-meta {
751
- font-size: 12px;
752
- color: var(--text);
753
- line-height: 1.5;
754
- }
755
- .detail-actions {
756
- display: flex;
757
- gap: 8px;
758
- margin-top: auto;
759
- padding-top: 12px;
760
- border-top: 1px solid var(--border);
761
- }
762
-
763
- /* Center list panel */
764
- #drill-center {
765
- flex: 1;
766
- display: flex;
767
- flex-direction: column;
768
- overflow: hidden;
769
- min-width: 0;
770
- }
771
-
772
- #drill-context {
773
- padding: 12px 24px;
774
- font-size: 13px;
775
- color: var(--text-dim);
776
- line-height: 1.6;
777
- flex-shrink: 0;
778
- background: var(--bg);
779
- }
780
- #drill-context:empty { display: none; padding: 0; }
781
-
782
- #drill-list {
783
- flex: 1;
784
- overflow-y: auto;
785
- padding: 16px 24px 32px;
786
- background: var(--bg);
787
- }
788
- #drill-list::-webkit-scrollbar { width: 5px; }
789
- #drill-list::-webkit-scrollbar-track { background: transparent; }
790
- #drill-list::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 3px; }
791
-
792
- /* ── Lifecycle stage sections ── */
793
- .lifecycle-stages {
794
- display: flex;
795
- flex-direction: column;
796
- gap: 24px;
797
- }
798
- .lifecycle-section {
799
- display: flex;
800
- flex-direction: column;
801
- gap: 10px;
802
- }
803
- .lifecycle-section.collapsed .lifecycle-cards { display: none; }
804
- .lifecycle-header {
805
- display: flex;
806
- align-items: center;
807
- gap: 8px;
808
- padding: 6px 0;
809
- user-select: none;
810
- }
811
- .lifecycle-icon {
812
- font-size: 14px;
813
- width: 20px;
814
- text-align: center;
815
- }
816
- .lifecycle-label {
817
- font-size: 13px;
818
- font-weight: 600;
819
- color: var(--text-dim);
820
- text-transform: uppercase;
821
- letter-spacing: 0.05em;
822
- }
823
- .lifecycle-count {
824
- font-size: 11px;
825
- font-weight: 700;
826
- padding: 1px 7px;
827
- border-radius: 10px;
828
- }
829
- .lifecycle-toggle {
830
- font-size: 10px;
831
- color: var(--text-muted);
832
- margin-left: 4px;
833
- }
834
- .lifecycle-header-spacer { flex: 1; }
835
- .lifecycle-stage-btn {
836
- font-size: 12px;
837
- font-weight: 600;
838
- padding: 4px 14px;
839
- border-radius: 14px;
840
- border: 1px solid var(--border-strong);
841
- background: var(--surface2);
842
- color: var(--text);
843
- cursor: pointer;
844
- font-family: inherit;
845
- transition: all 0.15s ease;
846
- }
847
- .lifecycle-stage-btn:hover {
848
- background: var(--surface3);
849
- border-color: var(--accent-border);
850
- color: var(--text-bright);
851
- }
852
- .lifecycle-stage-btn + .lifecycle-stage-btn {
853
- margin-left: 4px;
854
- }
855
-
856
- /* ── Card derivation progress ── */
857
- .drill-card-deriving {
858
- border-color: var(--executing-border) !important;
859
- background: var(--executing-bg) !important;
860
- }
861
- .derive-card-indicator {
862
- display: flex;
863
- align-items: center;
864
- gap: 8px;
865
- padding: 8px 12px;
866
- font-size: 12px;
867
- color: var(--executing-color);
868
- font-weight: 600;
869
- }
870
- .derive-spinner {
871
- display: inline-block;
872
- width: 14px;
873
- height: 14px;
874
- border: 2px solid var(--executing-border);
875
- border-top-color: var(--executing-color);
876
- border-radius: 50%;
877
- animation: derive-spin 0.8s linear infinite;
878
- }
879
- @keyframes derive-spin {
880
- to { transform: rotate(360deg); }
881
- }
882
- #version-label {
883
- position: fixed;
884
- bottom: 6px;
885
- left: 8px;
886
- font-size: 10px;
887
- color: #555;
888
- pointer-events: none;
889
- z-index: 1;
890
- }
891
- .derive-card-status {
892
- display: inline-flex;
893
- align-items: center;
894
- gap: 4px;
895
- font-size: 11px;
896
- color: var(--executing-color);
897
- font-weight: 600;
898
- margin-left: 4px;
899
- }
900
- .derive-card-status .derive-spinner {
901
- width: 10px;
902
- height: 10px;
903
- border-width: 1.5px;
904
- }
905
-
906
- /* ── Filter chips ── */
907
- .lifecycle-filter-chips {
908
- display: flex;
909
- gap: 6px;
910
- flex-wrap: wrap;
911
- }
912
- .lifecycle-chip {
913
- font-size: 12px;
914
- padding: 4px 12px;
915
- border-radius: 14px;
916
- border: 1px solid var(--border);
917
- background: transparent;
918
- color: var(--text-dim);
919
- cursor: pointer;
920
- transition: all 0.15s ease;
921
- font-family: inherit;
922
- }
923
- .lifecycle-chip:hover {
924
- border-color: var(--border-strong);
925
- color: var(--text);
926
- }
927
- .lifecycle-chip.active {
928
- background: var(--chip-color, var(--accent));
929
- border-color: var(--chip-color, var(--accent));
930
- color: var(--bg);
931
- font-weight: 600;
932
- }
933
- .chip-count {
934
- font-weight: 700;
935
- margin-left: 2px;
936
- }
937
-
938
- /* ── Type badge ── */
939
- .lifecycle-type-badge {
940
- font-size: 10px;
941
- font-weight: 700;
942
- padding: 1px 6px;
943
- border-radius: 4px;
944
- text-transform: uppercase;
945
- letter-spacing: 0.04em;
946
- }
947
- .lifecycle-type-badge.type-declaration {
948
- background: rgba(134, 239, 172, 0.12);
949
- color: #86efac;
950
- }
951
- .lifecycle-type-badge.type-milestone {
952
- background: rgba(165, 149, 255, 0.12);
953
- color: #a595ff;
954
- }
955
- .lifecycle-type-badge.type-action {
956
- background: rgba(147, 197, 253, 0.12);
957
- color: #93c5fd;
958
- }
959
-
960
- .lifecycle-cards {
961
- max-width: none;
962
- margin: 0;
963
- }
964
-
965
- /* ── Empty state / Onboarding ── */
966
- .onboarding-empty {
967
- max-width: 560px;
968
- margin: 60px auto 0;
969
- text-align: center;
970
- display: flex;
971
- flex-direction: column;
972
- align-items: center;
973
- gap: 16px;
974
- }
975
- .onboarding-project {
976
- font-size: 28px;
977
- font-weight: 700;
978
- color: var(--text-bright);
979
- letter-spacing: -0.02em;
980
- }
981
- .onboarding-heading {
982
- font-size: 18px;
983
- font-weight: 600;
984
- color: var(--accent);
985
- }
986
- .onboarding-desc {
987
- font-size: 14px;
988
- color: var(--text-dim);
989
- line-height: 1.6;
990
- max-width: 380px;
991
- }
992
- .onboarding-form {
993
- width: 100%;
994
- display: flex;
995
- flex-direction: column;
996
- gap: 10px;
997
- margin-top: 8px;
998
- }
999
- .onboarding-input, .onboarding-textarea {
1000
- width: 100%;
1001
- padding: 10px 14px;
1002
- font-size: 14px;
1003
- font-family: inherit;
1004
- background: var(--surface);
1005
- border: 1px solid var(--border);
1006
- border-radius: var(--radius);
1007
- color: var(--text);
1008
- outline: none;
1009
- transition: border-color 0.15s ease;
1010
- }
1011
- .onboarding-input:focus, .onboarding-textarea:focus {
1012
- border-color: var(--accent-border);
1013
- }
1014
- .onboarding-textarea { resize: vertical; min-height: 240px; }
1015
- .onboarding-btn {
1016
- padding: 10px 24px;
1017
- font-size: 14px;
1018
- font-weight: 600;
1019
- font-family: inherit;
1020
- background: var(--accent);
1021
- color: var(--bg);
1022
- border: none;
1023
- border-radius: var(--radius);
1024
- cursor: pointer;
1025
- transition: opacity 0.15s ease;
1026
- }
1027
- .onboarding-btn:hover { opacity: 0.9; }
1028
- .onboarding-btn:disabled { opacity: 0.5; cursor: default; }
1029
- .onboarding-error {
1030
- font-size: 13px;
1031
- color: var(--broken-color);
1032
- min-height: 18px;
1033
- }
1034
-
1035
- /* ── Onboarding flow (vision → questions → proposals) ── */
1036
- .onboard-container {
1037
- width: 100%;
1038
- padding: 16px 0;
1039
- }
1040
- .onboard-stream {
1041
- font-family: 'SF Mono', 'Fira Code', monospace;
1042
- font-size: 11px;
1043
- line-height: 1.5;
1044
- color: var(--text-muted);
1045
- max-height: 160px;
1046
- overflow-y: auto;
1047
- white-space: pre-wrap;
1048
- word-break: break-word;
1049
- margin: 0 0 12px 0;
1050
- padding: 10px 12px;
1051
- background: var(--surface);
1052
- border-radius: var(--radius);
1053
- border: 1px solid var(--border);
1054
- }
1055
- .onboard-stream.streaming {
1056
- border-color: var(--accent-border);
1057
- }
1058
- .onboard-phase-label {
1059
- font-size: 13px;
1060
- font-weight: 600;
1061
- color: var(--accent);
1062
- text-transform: uppercase;
1063
- letter-spacing: 0.05em;
1064
- margin-bottom: 12px;
1065
- }
1066
- .onboard-questions {
1067
- display: flex;
1068
- flex-direction: column;
1069
- gap: 10px;
1070
- }
1071
- .onboard-question {
1072
- background: var(--surface);
1073
- border: 1px solid transparent;
1074
- border-radius: var(--radius-lg);
1075
- padding: 18px 20px;
1076
- display: flex;
1077
- flex-direction: column;
1078
- gap: 10px;
1079
- transition: border-color 0.15s ease;
1080
- }
1081
- .onboard-question:focus-within {
1082
- border-color: var(--accent-border);
1083
- }
1084
- .onboard-question .oq-number {
1085
- font-size: 11px;
1086
- font-weight: 700;
1087
- color: var(--accent);
1088
- letter-spacing: 0.04em;
1089
- }
1090
- .onboard-question label {
1091
- font-size: 15px;
1092
- font-weight: 600;
1093
- color: var(--text-bright);
1094
- line-height: 1.4;
1095
- }
1096
- .onboard-question .oq-context {
1097
- font-size: 13px;
1098
- color: var(--text-dim);
1099
- line-height: 1.5;
1100
- }
1101
- .onboard-question .oq-options {
1102
- display: flex;
1103
- flex-wrap: wrap;
1104
- gap: 8px;
1105
- }
1106
- .onboard-question .oq-option {
1107
- padding: 6px 14px;
1108
- font-size: 13px;
1109
- background: var(--surface2);
1110
- border: 1px solid var(--border);
1111
- border-radius: 14px;
1112
- color: var(--text);
1113
- cursor: pointer;
1114
- transition: all 0.15s;
1115
- }
1116
- .onboard-question .oq-option:hover { border-color: var(--accent); color: var(--accent); }
1117
- .onboard-question .oq-option.selected { background: var(--accent); color: var(--bg); border-color: var(--accent); }
1118
- .onboard-question textarea {
1119
- width: 100%;
1120
- padding: 10px 14px;
1121
- font-size: 14px;
1122
- font-family: inherit;
1123
- background: var(--surface2);
1124
- border: 1px solid var(--border);
1125
- border-radius: var(--radius);
1126
- color: var(--text);
1127
- outline: none;
1128
- resize: vertical;
1129
- min-height: 48px;
1130
- line-height: 1.5;
1131
- }
1132
- .onboard-question textarea::placeholder { color: var(--text-dim); }
1133
- .onboard-question textarea:focus { border-color: var(--accent-border); background: var(--surface); }
1134
- .onboard-actions {
1135
- display: flex;
1136
- gap: 10px;
1137
- margin-top: 16px;
1138
- padding-top: 8px;
1139
- }
1140
- .onboard-actions button {
1141
- padding: 10px 24px;
1142
- font-size: 14px;
1143
- font-weight: 600;
1144
- font-family: inherit;
1145
- border-radius: var(--radius-lg);
1146
- cursor: pointer;
1147
- transition: all 0.15s;
1148
- }
1149
- .onboard-btn-primary {
1150
- background: var(--accent);
1151
- color: var(--bg);
1152
- border: none;
1153
- }
1154
- .onboard-btn-primary:hover { opacity: 0.9; }
1155
- .onboard-btn-secondary {
1156
- background: transparent;
1157
- color: var(--text-dim);
1158
- border: 1px solid var(--border);
1159
- }
1160
- .onboard-btn-secondary:hover { border-color: var(--text-dim); color: var(--text); }
1161
- .onboard-proposal {
1162
- background: var(--surface);
1163
- border: 1px solid transparent;
1164
- border-radius: var(--radius-lg);
1165
- padding: 18px 20px;
1166
- margin-bottom: 10px;
1167
- transition: all 0.2s;
1168
- }
1169
- .onboard-proposal:hover {
1170
- background: var(--surface2);
1171
- }
1172
- .onboard-proposal.current {
1173
- border-color: var(--accent);
1174
- background: linear-gradient(135deg, rgba(134, 239, 172, 0.03) 0%, var(--surface) 60%);
1175
- }
1176
- .onboard-proposal.approved {
1177
- border-left: 3px solid var(--done-color);
1178
- opacity: 0.65;
1179
- }
1180
- .onboard-proposal .op-header {
1181
- display: flex;
1182
- align-items: center;
1183
- gap: 8px;
1184
- margin-bottom: 8px;
1185
- }
1186
- .onboard-proposal .op-check {
1187
- font-size: 18px;
1188
- color: var(--done-color);
1189
- }
1190
- .onboard-proposal .op-index {
1191
- font-size: 12px;
1192
- font-weight: 700;
1193
- color: var(--text-dim);
1194
- min-width: 20px;
1195
- }
1196
- .onboard-proposal .op-id {
1197
- font-size: 12px;
1198
- font-weight: 600;
1199
- color: var(--accent);
1200
- }
1201
- .onboard-title {
1202
- width: 100%;
1203
- padding: 8px 14px;
1204
- font-size: 15px;
1205
- font-weight: 600;
1206
- font-family: inherit;
1207
- background: var(--surface2);
1208
- border: 1px solid var(--border);
1209
- border-radius: var(--radius);
1210
- color: var(--text-bright);
1211
- outline: none;
1212
- }
1213
- .onboard-title:focus { border-color: var(--accent-border); background: var(--surface); }
1214
- .onboard-statement {
1215
- width: 100%;
1216
- padding: 8px 14px;
1217
- font-size: 14px;
1218
- font-family: inherit;
1219
- background: var(--surface2);
1220
- border: 1px solid var(--border);
1221
- border-radius: var(--radius);
1222
- color: var(--text);
1223
- outline: none;
1224
- resize: vertical;
1225
- min-height: 44px;
1226
- margin-top: 8px;
1227
- line-height: 1.5;
1228
- }
1229
- .onboard-statement:focus { border-color: var(--accent-border); background: var(--surface); }
1230
- .onboard-reason {
1231
- font-size: 13px;
1232
- color: var(--text-dim);
1233
- margin-top: 8px;
1234
- font-style: italic;
1235
- line-height: 1.4;
1236
- }
1237
- .onboard-progress {
1238
- font-size: 14px;
1239
- color: var(--text-dim);
1240
- margin-bottom: 12px;
1241
- font-weight: 600;
1242
- }
1243
-
1244
- /* ── Reconnecting banner ── */
1245
- #reconnect-banner {
1246
- position: fixed;
1247
- top: 0;
1248
- left: 50%;
1249
- transform: translateX(-50%) translateY(-100%);
1250
- background: var(--executing-color);
1251
- color: var(--bg);
1252
- padding: 6px 20px;
1253
- font-size: 13px;
1254
- font-weight: 600;
1255
- border-radius: 0 0 var(--radius) var(--radius);
1256
- z-index: 9999;
1257
- transition: transform 0.3s ease;
1258
- }
1259
- #reconnect-banner.visible {
1260
- transform: translateX(-50%) translateY(0);
1261
- }
1262
-
1263
- /* ── Lifecycle card transitions (disabled — instant render) ── */
1264
-
1265
- /* ── Loading skeleton ── */
1266
- .skeleton-card {
1267
- background: var(--surface);
1268
- border-radius: var(--radius-lg);
1269
- padding: 18px 20px;
1270
- animation: skeletonPulse 1.5s ease-in-out infinite;
1271
- }
1272
- .skeleton-line {
1273
- height: 12px;
1274
- background: var(--surface3);
1275
- border-radius: 4px;
1276
- margin-bottom: 8px;
1277
- }
1278
- .skeleton-line.short { width: 40%; }
1279
- .skeleton-line.medium { width: 70%; }
1280
- .skeleton-line.long { width: 90%; }
1281
- @keyframes skeletonPulse {
1282
- 0%, 100% { opacity: 0.6; }
1283
- 50% { opacity: 1; }
1284
- }
1285
-
1286
- /* ── Lifecycle progress bar ── */
1287
- .lifecycle-progress {
1288
- display: flex;
1289
- gap: 2px;
1290
- height: 4px;
1291
- border-radius: 2px;
1292
- overflow: hidden;
1293
- margin-top: 4px;
1294
- }
1295
- .lifecycle-progress-segment {
1296
- height: 100%;
1297
- transition: width 0.3s ease;
1298
- }
1299
-
1300
- .drill-cards {
1301
- max-width: 640px;
1302
- margin: 0 auto;
1303
- display: flex;
1304
- flex-direction: column;
1305
- gap: 10px;
1306
- }
1307
-
1308
- /* ── Card item ── */
1309
- .drill-card {
1310
- background: var(--surface);
1311
- border: 1px solid transparent;
1312
- border-radius: var(--radius-lg);
1313
- padding: 18px 20px;
1314
- cursor: pointer;
1315
- transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.2s ease;
1316
- display: flex;
1317
- flex-direction: column;
1318
- gap: 10px;
1319
- }
1320
- .drill-card:hover {
1321
- background: var(--surface2);
1322
- border-color: var(--border-strong);
1323
- box-shadow: 0 2px 12px rgba(0,0,0,0.15);
1324
- }
1325
- .drill-card.needs-review {
1326
- /* No border — blends into background until focused */
1327
- }
1328
- .drill-card.focused {
1329
- background: var(--surface2);
1330
- border-color: var(--card-tint-border, var(--border-strong));
1331
- box-shadow: inset 2px 0 0 var(--card-tint, var(--accent));
1332
- }
1333
-
1334
- /* ── Node-type tint colors on cards ── */
1335
- .drill-cards[data-node-type="declaration"] .drill-card {
1336
- --card-tint: #86efac;
1337
- --card-tint-border: rgba(134, 239, 172, 0.25);
1338
- --card-tint-glow: rgba(134, 239, 172, 0.08);
1339
- background: linear-gradient(135deg, rgba(134, 239, 172, 0.03) 0%, var(--surface) 60%);
1340
- }
1341
- .drill-cards[data-node-type="declaration"] .drill-card .drill-card-id {
1342
- color: var(--act-color);
1343
- }
1344
- .drill-cards[data-node-type="milestone"] .drill-card {
1345
- --card-tint: #a595ff;
1346
- --card-tint-border: rgba(165, 149, 255, 0.25);
1347
- --card-tint-glow: rgba(165, 149, 255, 0.08);
1348
- background: linear-gradient(135deg, rgba(165, 149, 255, 0.03) 0%, var(--surface) 60%);
1349
- }
1350
- .drill-cards[data-node-type="milestone"] .drill-card .drill-card-id {
1351
- color: var(--mile-color);
1352
- }
1353
- .drill-cards[data-node-type="action"] .drill-card {
1354
- --card-tint: #93c5fd;
1355
- --card-tint-border: rgba(147, 197, 253, 0.25);
1356
- --card-tint-glow: rgba(147, 197, 253, 0.08);
1357
- background: linear-gradient(135deg, rgba(147, 197, 253, 0.03) 0%, var(--surface) 60%);
1358
- }
1359
- .drill-cards[data-node-type="action"] .drill-card .drill-card-id {
1360
- color: var(--decl-color);
1361
- }
1362
-
1363
- /* Hover state preserves tint gradient */
1364
- .drill-cards[data-node-type="declaration"] .drill-card:hover {
1365
- background: linear-gradient(135deg, rgba(134, 239, 172, 0.06) 0%, var(--surface2) 60%);
1366
- }
1367
- .drill-cards[data-node-type="milestone"] .drill-card:hover {
1368
- background: linear-gradient(135deg, rgba(165, 149, 255, 0.06) 0%, var(--surface2) 60%);
1369
- }
1370
- .drill-cards[data-node-type="action"] .drill-card:hover {
1371
- background: linear-gradient(135deg, rgba(147, 197, 253, 0.06) 0%, var(--surface2) 60%);
1372
- }
1373
-
1374
- /* Focused card gets stronger tint background */
1375
- .drill-cards[data-node-type="declaration"] .drill-card.focused {
1376
- background: linear-gradient(135deg, rgba(134, 239, 172, 0.06) 0%, var(--surface2) 60%);
1377
- }
1378
- .drill-cards[data-node-type="milestone"] .drill-card.focused {
1379
- background: linear-gradient(135deg, rgba(165, 149, 255, 0.06) 0%, var(--surface2) 60%);
1380
- }
1381
- .drill-cards[data-node-type="action"] .drill-card.focused {
1382
- background: linear-gradient(135deg, rgba(147, 197, 253, 0.06) 0%, var(--surface2) 60%);
1383
- }
1384
- .drill-card .drill-review-btn.approve-btn {
1385
- background: rgba(134, 239, 172, 0.10);
1386
- border-color: rgba(134, 239, 172, 0.35);
1387
- color: #86efac;
1388
- }
1389
- .drill-card .drill-review-btn.revision-btn {
1390
- background: rgba(248, 113, 113, 0.06);
1391
- border-color: rgba(248, 113, 113, 0.2);
1392
- color: #f87171;
1393
- }
1394
-
1395
- .drill-card-top {
1396
- display: flex;
1397
- align-items: flex-start;
1398
- gap: 12px;
1399
- }
1400
- .drill-card-id {
1401
- font-size: 12px;
1402
- font-weight: 700;
1403
- letter-spacing: 0.03em;
1404
- flex-shrink: 0;
1405
- padding-top: 2px;
1406
- color: var(--text-dim);
1407
- }
1408
- .drill-card-body {
1409
- flex: 1;
1410
- min-width: 0;
1411
- }
1412
- .drill-card-title {
1413
- font-size: 16px;
1414
- font-weight: 600;
1415
- color: var(--text-bright);
1416
- line-height: 1.4;
1417
- letter-spacing: -0.01em;
1418
- margin-bottom: 4px;
1419
- }
1420
- .drill-card-desc {
1421
- font-size: 13px;
1422
- color: var(--text);
1423
- line-height: 1.5;
1424
- margin-bottom: 8px;
1425
- }
1426
- .drill-card-desc:empty { display: none; margin: 0; }
1427
-
1428
- .drill-card-badges {
1429
- display: flex;
1430
- align-items: center;
1431
- gap: 6px;
1432
- flex-wrap: wrap;
1433
- }
1434
- .drill-card-stat {
1435
- font-size: 12px;
1436
- color: var(--text);
1437
- font-weight: 400;
1438
- }
1439
- .drill-card-stat strong {
1440
- color: var(--accent);
1441
- font-weight: 600;
1442
- }
1443
- /* Inline action list on milestone cards */
1444
- .drill-card-action-list {
1445
- list-style: none;
1446
- padding: 0;
1447
- margin: 6px 0 0 0;
1448
- display: flex;
1449
- flex-direction: column;
1450
- gap: 2px;
1451
- }
1452
- .drill-card-action-list li {
1453
- font-size: 11px;
1454
- color: var(--text-dim);
1455
- display: flex;
1456
- align-items: baseline;
1457
- gap: 6px;
1458
- }
1459
- .drill-card-action-list li .al-icon {
1460
- width: 10px;
1461
- text-align: center;
1462
- flex-shrink: 0;
1463
- font-size: 10px;
1464
- }
1465
- .drill-card-action-list li.done { color: var(--text-muted); text-decoration: line-through; }
1466
- .drill-card-action-list li.done .al-icon { color: var(--done-color, #86efac); }
1467
- .drill-card-action-list li.planned .al-icon { color: var(--accent); }
1468
- .drill-card-action-list li.unplanned .al-icon { color: var(--text-muted); }
1469
- .drill-card-no-actions {
1470
- font-size: 11px;
1471
- color: var(--text-muted);
1472
- font-style: italic;
1473
- margin-top: 6px;
1474
- }
1475
-
1476
- /* Card-level status pill */
1477
- .drill-status-pill {
1478
- display: inline-block;
1479
- padding: 3px 10px;
1480
- border-radius: 99px;
1481
- font-size: 11px;
1482
- font-weight: 600;
1483
- letter-spacing: 0.03em;
1484
- text-transform: uppercase;
1485
- background: rgba(255,255,255,0.04);
1486
- border: 1px solid var(--border);
1487
- color: var(--text-dim);
1488
- }
1489
- .drill-status-pill.s-done { background: var(--act-bg); border-color: var(--act-border); color: var(--act-color); }
1490
- .drill-status-pill.s-executing { background: var(--executing-bg); border-color: var(--executing-border); color: var(--executing-color); }
1491
- .drill-status-pill.s-planned { background: var(--planned-bg); border-color: var(--planned-border); color: var(--planned-color); }
1492
- .drill-status-pill.s-pending { background: rgba(255,255,255,0.03); color: var(--text-dim); }
1493
-
1494
- /* ── Card review actions (centered below content) ── */
1495
- .drill-card-actions {
1496
- display: flex;
1497
- gap: 8px;
1498
- padding-top: 8px;
1499
- border-top: 1px solid var(--border);
1500
- }
1501
- .drill-review-btn {
1502
- flex: 1;
1503
- padding: 8px 14px;
1504
- border-radius: var(--radius);
1505
- font-size: 13px;
1506
- font-weight: 600;
1507
- cursor: pointer;
1508
- border: 1px solid var(--border-strong);
1509
- background: transparent;
1510
- color: var(--text);
1511
- transition: all 0.15s ease;
1512
- text-align: center;
1513
- }
1514
- .drill-review-btn kbd, .drill-action-btn kbd {
1515
- display: inline-block;
1516
- padding: 0 5px;
1517
- border: 1px solid var(--border-strong);
1518
- border-radius: 3px;
1519
- font-size: 10px;
1520
- font-family: inherit;
1521
- font-weight: 700;
1522
- color: var(--text-dim);
1523
- background: var(--surface2);
1524
- margin-right: 2px;
1525
- vertical-align: baseline;
1526
- }
1527
- .drill-review-btn:hover, .drill-action-btn:hover {
1528
- background: var(--surface2);
1529
- border-color: var(--border-strong);
1530
- color: var(--text);
1531
- }
1532
- .drill-review-btn.approve-btn:hover {
1533
- background: rgba(134, 239, 172, 0.08);
1534
- border-color: rgba(134, 239, 172, 0.3);
1535
- color: #86efac;
1536
- }
1537
-
1538
- /* ── Flat action bar buttons ── */
1539
- .drill-action-btn {
1540
- padding: 6px 12px;
1541
- border-radius: var(--radius);
1542
- font-size: 12px;
1543
- font-weight: 500;
1544
- cursor: pointer;
1545
- border: 1px solid var(--border);
1546
- background: transparent;
1547
- color: var(--text-dim);
1548
- transition: all 0.15s ease;
1549
- }
1550
- .drill-action-btn:hover {
1551
- background: var(--surface2);
1552
- border-color: var(--border-strong);
1553
- color: var(--text);
1554
- }
1555
- .drill-action-btn.drill-action-primary {
1556
- background: var(--accent-dim);
1557
- border-color: var(--accent-border);
1558
- color: var(--accent);
1559
- font-weight: 600;
1560
- }
1561
- .drill-action-btn.drill-action-primary:hover {
1562
- background: var(--accent-border);
1563
- }
1564
- .drill-action-btn.drill-action-danger {
1565
- color: var(--text-dim);
1566
- }
1567
- .drill-action-btn.drill-action-danger:hover {
1568
- background: rgba(248,113,113,0.08);
1569
- border-color: rgba(248,113,113,0.3);
1570
- color: #f87171;
1571
- }
1572
-
1573
- /* ── Refine suggestion inline area ── */
1574
- .refine-area {
1575
- margin-top: 8px;
1576
- padding: 10px;
1577
- border: 1px solid var(--accent-border);
1578
- border-radius: var(--radius);
1579
- background: rgba(208,236,26,0.03);
1580
- font-size: 13px;
1581
- line-height: 1.5;
1582
- color: var(--text);
1583
- }
1584
- .refine-area .refine-streaming {
1585
- white-space: pre-wrap;
1586
- min-height: 24px;
1587
- }
1588
- .refine-area .refine-actions {
1589
- display: flex;
1590
- gap: 8px;
1591
- margin-top: 8px;
1592
- }
1593
- .refine-area .refine-accept {
1594
- padding: 5px 12px;
1595
- border-radius: var(--radius);
1596
- font-size: 12px;
1597
- font-weight: 600;
1598
- cursor: pointer;
1599
- border: 1px solid rgba(134,239,172,0.3);
1600
- background: rgba(134,239,172,0.08);
1601
- color: #86efac;
1602
- }
1603
- .refine-area .refine-discard {
1604
- padding: 5px 12px;
1605
- border-radius: var(--radius);
1606
- font-size: 12px;
1607
- font-weight: 600;
1608
- cursor: pointer;
1609
- border: 1px solid var(--border-strong);
1610
- background: transparent;
1611
- color: var(--text-dim);
1612
- }
1613
- .refine-write-input {
1614
- width: 100%;
1615
- padding: 8px;
1616
- border: 1px solid var(--border-strong);
1617
- border-radius: var(--radius);
1618
- background: var(--surface2);
1619
- color: var(--text);
1620
- font-size: 13px;
1621
- font-family: inherit;
1622
- resize: vertical;
1623
- min-height: 40px;
1624
- margin-bottom: 6px;
1625
- }
1626
- .refine-write-input:focus {
1627
- outline: none;
1628
- border-color: var(--accent-border);
1629
- }
1630
-
1631
- /* Expandable plan preview */
1632
- .drill-plan-toggle {
1633
- font-size: 11px;
1634
- color: var(--text-muted);
1635
- cursor: pointer;
1636
- padding: 2px 0;
1637
- user-select: none;
1638
- font-weight: 500;
1639
- transition: color 0.12s;
1640
- }
1641
- .drill-plan-toggle:hover { color: var(--text); }
1642
- .drill-plan-content {
1643
- display: none;
1644
- margin-top: 6px;
1645
- padding: 12px 14px;
1646
- background: var(--bg);
1647
- border: 1px solid var(--border);
1648
- border-radius: var(--radius);
1649
- font-size: 11px;
1650
- line-height: 1.6;
1651
- color: var(--text-dim);
1652
- max-height: 200px;
1653
- overflow-y: auto;
1654
- }
1655
- .drill-plan-content.open { display: block; }
1656
-
1657
- /* ── Bottom prompt bar ── */
1658
- #drill-prompt {
1659
- padding: 14px 24px;
1660
- background: var(--surface);
1661
- border-top: 1px solid var(--border);
1662
- display: flex;
1663
- align-items: center;
1664
- justify-content: center;
1665
- gap: 12px;
1666
- flex-shrink: 0;
1667
- font-size: 13px;
1668
- }
1669
- .drill-prompt-text {
1670
- color: var(--text);
1671
- }
1672
- .drill-prompt-text .drill-prompt-target {
1673
- color: var(--accent);
1674
- font-weight: 600;
1675
- cursor: pointer;
1676
- }
1677
- .drill-prompt-text .drill-prompt-target:hover { text-decoration: underline; }
1678
- .drill-prompt-complete {
1679
- color: var(--accent);
1680
- font-weight: 600;
1681
- }
1682
- /* Command card in agents panel */
1683
- #command-card {
1684
- background: var(--surface2);
1685
- border: 1px solid var(--border);
1686
- border-radius: 18px;
1687
- padding: 8px 14px;
1688
- cursor: default;
1689
- transition: all 0.15s ease;
1690
- margin-bottom: 4px;
1691
- }
1692
- #command-card:hover, #command-card:focus-within { border-color: var(--accent-border); }
1693
- #command-card .cmd-label {
1694
- display: none;
1695
- }
1696
- #command-card .cmd-key {
1697
- display: none;
1698
- }
1699
- #command-card .cmd-row {
1700
- display: flex;
1701
- align-items: center;
1702
- gap: 8px;
1703
- }
1704
- #command-card .cmd-shortcut {
1705
- background: var(--surface3);
1706
- border: 1px solid var(--border);
1707
- border-radius: 4px;
1708
- padding: 1px 6px;
1709
- font-size: 10px;
1710
- font-weight: 700;
1711
- color: var(--text-dim);
1712
- font-family: 'SF Mono', 'Fira Code', monospace;
1713
- flex-shrink: 0;
1714
- line-height: 1.6;
1715
- }
1716
- #command-card:focus-within .cmd-shortcut { display: none; }
1717
- #command-card.editing {
1718
- border-color: var(--accent);
1719
- border-style: solid;
1720
- cursor: default;
1721
- }
1722
- #command-card-input {
1723
- display: block;
1724
- width: 100%;
1725
- background: transparent;
1726
- border: none;
1727
- color: var(--text);
1728
- font-size: 13px;
1729
- padding: 2px 0;
1730
- outline: none;
1731
- font-family: inherit;
1732
- resize: none;
1733
- line-height: 1.4;
1734
- min-width: 0;
1735
- flex: 1;
1736
- }
1737
- #command-card-hint {
1738
- display: none;
1739
- font-size: 10px;
1740
- color: var(--text-dim);
1741
- margin-top: 4px;
1742
- }
1743
- #command-card.editing #command-card-hint { display: block; }
1744
- #command-card.running { border-color: var(--executing-color); border-style: solid; }
1745
- #command-card.running .cmd-label { display: none; }
1746
- #command-card.running #command-card-input { display: none; }
1747
- #command-card.running #command-card-hint { display: none; }
1748
- .command-output-stream {
1749
- font-family: 'SF Mono', 'Fira Code', monospace;
1750
- font-size: 11px;
1751
- line-height: 1.5;
1752
- color: var(--text-muted);
1753
- max-height: 200px;
1754
- overflow-y: auto;
1755
- white-space: pre-wrap;
1756
- word-break: break-word;
1757
- margin: 0;
1758
- padding: 0;
1759
- }
1760
- .command-output-stream.streaming { color: var(--executing-color); }
1761
- .drill-next-btn {
1762
- background: var(--accent-dim);
1763
- border: 1px solid var(--accent-border);
1764
- color: var(--accent);
1765
- padding: 6px 16px;
1766
- border-radius: var(--radius);
1767
- cursor: pointer;
1768
- font-size: 13px;
1769
- font-weight: 600;
1770
- margin-left: 12px;
1771
- transition: all 0.15s ease;
1772
- }
1773
- .drill-next-btn:hover { background: rgba(208, 236, 26, 0.18); }
1774
- .drill-next-btn kbd {
1775
- display: inline-block;
1776
- padding: 0 5px;
1777
- border: 1px solid var(--accent-border);
1778
- border-radius: 3px;
1779
- font-size: 10px;
1780
- font-family: inherit;
1781
- font-weight: 700;
1782
- color: var(--accent);
1783
- background: rgba(208, 236, 26, 0.08);
1784
- margin-right: 2px;
1785
- }
1786
- .drill-approve-all-btn {
1787
- background: rgba(134, 239, 172, 0.08);
1788
- border: 1px solid rgba(134, 239, 172, 0.3);
1789
- color: #86efac;
1790
- padding: 6px 16px;
1791
- border-radius: var(--radius);
1792
- cursor: pointer;
1793
- font-size: 13px;
1794
- font-weight: 600;
1795
- margin-left: 12px;
1796
- transition: all 0.15s ease;
1797
- }
1798
- .drill-approve-all-btn:hover { background: rgba(134, 239, 172, 0.15); }
1799
- .drill-approve-all-btn kbd {
1800
- display: inline-block;
1801
- padding: 0 5px;
1802
- border: 1px solid rgba(134, 239, 172, 0.3);
1803
- border-radius: 3px;
1804
- font-size: 10px;
1805
- font-family: inherit;
1806
- font-weight: 700;
1807
- color: #86efac;
1808
- background: rgba(134, 239, 172, 0.08);
1809
- margin-right: 2px;
1810
- }
1811
-
1812
- .col-empty {
1813
- padding: 40px 20px;
1814
- color: var(--text-muted);
1815
- font-size: 13px;
1816
- text-align: center;
1817
- }
1818
-
1819
- .col-empty-invite {
1820
- padding: 60px 32px;
1821
- text-align: center;
1822
- display: flex;
1823
- flex-direction: column;
1824
- align-items: center;
1825
- gap: 12px;
1826
- }
1827
- .empty-invite-title {
1828
- color: var(--text);
1829
- font-size: 15px;
1830
- font-weight: 600;
1831
- }
1832
- .empty-invite-desc {
1833
- color: var(--text-muted);
1834
- font-size: 13px;
1835
- max-width: 320px;
1836
- line-height: 1.5;
1837
- }
1838
- .empty-invite-input {
1839
- width: 100%;
1840
- max-width: 320px;
1841
- background: var(--surface2);
1842
- border: 1px solid var(--border);
1843
- border-radius: 6px;
1844
- color: var(--text);
1845
- font-size: 12px;
1846
- padding: 8px 10px;
1847
- resize: vertical;
1848
- font-family: inherit;
1849
- }
1850
- .empty-invite-input:focus {
1851
- outline: none;
1852
- border-color: var(--accent-border);
1853
- }
1854
- .empty-invite-input::placeholder {
1855
- color: var(--text-muted);
1856
- opacity: 0.6;
1857
- }
1858
- .empty-invite-btn {
1859
- background: var(--accent-dim);
1860
- border: 1px solid var(--accent-border);
1861
- color: var(--accent);
1862
- padding: 8px 20px;
1863
- border-radius: 6px;
1864
- font-size: 13px;
1865
- font-weight: 600;
1866
- cursor: pointer;
1867
- transition: all 0.15s ease;
1868
- }
1869
- .empty-invite-btn:hover {
1870
- background: rgba(208, 236, 26, 0.18);
1871
- border-color: rgba(208, 236, 26, 0.4);
1872
- }
1873
- .empty-invite-btn kbd {
1874
- background: rgba(255,255,255,0.08);
1875
- border: 1px solid rgba(255,255,255,0.12);
1876
- border-radius: 3px;
1877
- padding: 1px 5px;
1878
- font-size: 11px;
1879
- margin-right: 4px;
1880
- }
1881
- .col-empty-invite .output-log {
1882
- width: 100%;
1883
- max-width: 560px;
1884
- text-align: left;
1885
- max-height: 200px;
1886
- overflow-y: auto;
1887
- font-size: 12px;
1888
- line-height: 1.6;
1889
- color: var(--text-dim);
1890
- padding: 12px 16px;
1891
- border-radius: var(--radius);
1892
- background: var(--surface);
1893
- border: 1px solid var(--border);
1894
- }
1895
- .col-empty-invite .output-log .derive-log-line {
1896
- opacity: 0.5;
1897
- transition: opacity 0.3s;
1898
- }
1899
- .col-empty-invite .output-log .derive-log-line:last-child {
1900
- opacity: 1;
1901
- color: var(--text);
1902
- }
1903
- .col-empty-invite .derivation-checklist {
1904
- text-align: left;
1905
- width: 100%;
1906
- max-width: 560px;
1907
- }
1908
- .col-empty-invite #derivation-proposals {
1909
- width: 100%;
1910
- max-width: 560px;
1911
- text-align: left;
1912
- }
1913
- .derivation-progress {
1914
- width: 100%;
1915
- max-width: 560px;
1916
- margin-top: 16px;
1917
- padding: 14px 18px;
1918
- background: var(--surface);
1919
- border: 1px solid var(--border);
1920
- border-radius: var(--radius-lg);
1921
- }
1922
- .derive-phase {
1923
- display: flex;
1924
- align-items: center;
1925
- gap: 10px;
1926
- animation: derive-phase-in 0.4s ease;
1927
- }
1928
- .derive-phase-icon {
1929
- font-size: 18px;
1930
- flex-shrink: 0;
1931
- }
1932
- .derive-phase-text {
1933
- font-size: 13px;
1934
- color: var(--text);
1935
- font-weight: 500;
1936
- }
1937
- @keyframes derive-phase-in {
1938
- from { opacity: 0; transform: translateY(4px); }
1939
- to { opacity: 1; transform: translateY(0); }
1940
- }
1941
- .derive-stream-output {
1942
- margin-top: 10px;
1943
- padding: 10px 12px;
1944
- background: var(--bg);
1945
- border: 1px solid var(--border);
1946
- border-radius: var(--radius);
1947
- font-size: 12px;
1948
- line-height: 1.5;
1949
- color: var(--text-dim);
1950
- max-height: 160px;
1951
- overflow-y: auto;
1952
- white-space: pre-wrap;
1953
- word-break: break-word;
1954
- font-family: 'SF Mono', 'Fira Code', monospace;
1955
- }
1956
-
1957
- .derive-spinner {
1958
- display: inline-block;
1959
- width: 12px;
1960
- height: 12px;
1961
- border: 2px solid rgba(208,236,26,0.3);
1962
- border-top-color: var(--accent);
1963
- border-radius: 50%;
1964
- animation: derive-spin 0.8s linear infinite;
1965
- vertical-align: middle;
1966
- margin-right: 4px;
1967
- }
1968
- @keyframes derive-spin {
1969
- to { transform: rotate(360deg); }
1970
- }
1971
- .derive-elapsed {
1972
- opacity: 0.5;
1973
- font-size: 11px;
1974
- font-weight: 400;
1975
- }
1976
-
1977
- /* ── Declaration form ── */
1978
- .decl-form-trigger {
1979
- background: none;
1980
- border: 1px solid var(--decl-border);
1981
- color: var(--decl-color);
1982
- width: 22px;
1983
- height: 22px;
1984
- border-radius: 4px;
1985
- cursor: pointer;
1986
- font-size: 14px;
1987
- line-height: 1;
1988
- display: inline-flex;
1989
- align-items: center;
1990
- justify-content: center;
1991
- transition: background 0.15s, border-color 0.15s;
1992
- flex-shrink: 0;
1993
- margin-left: auto;
1994
- }
1995
- .decl-form-trigger:hover {
1996
- background: var(--decl-bg);
1997
- border-color: var(--decl-color);
1998
- }
1999
-
2000
- .decl-form-overlay {
2001
- padding: 12px 16px;
2002
- border-bottom: 1px solid var(--border);
2003
- background: var(--surface2);
2004
- }
2005
-
2006
- .decl-form {
2007
- display: flex;
2008
- flex-direction: column;
2009
- gap: 8px;
2010
- }
2011
-
2012
- .decl-form input,
2013
- .decl-form textarea {
2014
- background: var(--surface);
2015
- border: 1px solid var(--border);
2016
- color: var(--text);
2017
- border-radius: 4px;
2018
- padding: 8px 12px;
2019
- width: 100%;
2020
- font-size: 13px;
2021
- font-family: inherit;
2022
- outline: none;
2023
- transition: border-color 0.15s;
2024
- }
2025
- .decl-form input:focus,
2026
- .decl-form textarea:focus {
2027
- border-color: var(--decl-color);
2028
- }
2029
-
2030
- .decl-form textarea {
2031
- resize: vertical;
2032
- min-height: 54px;
2033
- }
2034
-
2035
- .decl-form-actions {
2036
- display: flex;
2037
- gap: 8px;
2038
- align-items: center;
2039
- }
2040
-
2041
- .decl-form-actions .decl-submit-btn {
2042
- background: var(--decl-color);
2043
- color: #fff;
2044
- border: none;
2045
- border-radius: 4px;
2046
- padding: 6px 16px;
2047
- cursor: pointer;
2048
- font-size: 12px;
2049
- font-weight: 600;
2050
- transition: opacity 0.15s;
2051
- }
2052
- .decl-form-actions .decl-submit-btn:hover { opacity: 0.9; }
2053
- .decl-form-actions .decl-submit-btn:disabled {
2054
- opacity: 0.5;
2055
- cursor: not-allowed;
2056
- }
2057
-
2058
- .decl-form-actions .decl-cancel-btn {
2059
- background: transparent;
2060
- border: 1px solid var(--border);
2061
- color: var(--text-dim);
2062
- border-radius: 4px;
2063
- padding: 6px 16px;
2064
- cursor: pointer;
2065
- font-size: 12px;
2066
- transition: border-color 0.15s, color 0.15s;
2067
- }
2068
- .decl-form-actions .decl-cancel-btn:hover {
2069
- border-color: var(--text-dim);
2070
- color: var(--text);
2071
- }
2072
-
2073
- .decl-form .form-error {
2074
- color: var(--broken-color);
2075
- font-size: 12px;
2076
- margin-top: 4px;
2077
- min-height: 0;
2078
- }
2079
-
2080
- /* Status bar new-decl button */
2081
- .new-decl-btn {
2082
- background: var(--decl-bg);
2083
- border: 1px solid var(--decl-border);
2084
- color: var(--decl-color);
2085
- padding: 5px 14px;
2086
- border-radius: 6px;
2087
- cursor: pointer;
2088
- font-size: 12px;
2089
- font-weight: 600;
2090
- transition: background 0.15s, border-color 0.15s;
2091
- }
2092
- .new-decl-btn:hover { background: #0f2d50; border-color: var(--decl-color); }
2093
-
2094
- /* Play All button */
2095
- .play-btn {
2096
- background: #0a2018;
2097
- border: 1px solid var(--act-border);
2098
- color: var(--act-color);
2099
- padding: 5px 14px;
2100
- border-radius: 6px;
2101
- cursor: pointer;
2102
- font-size: 12px;
2103
- font-weight: 600;
2104
- transition: background 0.15s, border-color 0.15s;
2105
- }
2106
- .play-btn:hover { background: #0f3020; border-color: var(--act-color); }
2107
- .play-btn:disabled { opacity: 0.4; cursor: not-allowed; }
2108
- .play-btn.playing {
2109
- background: var(--executing-bg);
2110
- border-color: var(--executing-border);
2111
- color: var(--executing-color);
2112
- animation: pulse-play 1.5s ease-in-out infinite;
2113
- }
2114
- @keyframes pulse-play {
2115
- 0%, 100% { opacity: 1; }
2116
- 50% { opacity: 0.7; }
2117
- }
2118
-
2119
- /* Play progress banner */
2120
- #play-banner {
2121
- display: none;
2122
- background: var(--surface);
2123
- border-bottom: 1px solid var(--executing-border);
2124
- padding: 8px 20px;
2125
- font-size: 12px;
2126
- color: var(--text);
2127
- align-items: center;
2128
- gap: 12px;
2129
- flex-shrink: 0;
2130
- }
2131
- #play-banner.visible { display: flex; }
2132
- #play-banner .play-wave-label {
2133
- color: var(--executing-color);
2134
- font-weight: 600;
2135
- }
2136
- #play-banner .play-actions-list {
2137
- display: flex;
2138
- gap: 6px;
2139
- flex-wrap: wrap;
2140
- }
2141
- #play-banner .play-action-tag {
2142
- background: var(--surface2);
2143
- border: 1px solid var(--border);
2144
- border-radius: 4px;
2145
- padding: 2px 8px;
2146
- font-size: 11px;
2147
- }
2148
- #play-banner .play-action-tag.active {
2149
- border-color: var(--executing-border);
2150
- color: var(--executing-color);
2151
- }
2152
- #play-banner .play-action-tag.done {
2153
- border-color: var(--act-border);
2154
- color: var(--act-color);
2155
- }
2156
- #play-banner .play-action-tag.failed {
2157
- border-color: var(--broken-border);
2158
- color: var(--broken-color);
2159
- }
2160
- .play-stop-btn {
2161
- background: var(--broken-bg);
2162
- border: 1px solid var(--broken-border);
2163
- color: var(--broken-color);
2164
- padding: 3px 10px;
2165
- border-radius: 4px;
2166
- cursor: pointer;
2167
- font-size: 11px;
2168
- margin-left: auto;
2169
- }
2170
- .play-stop-btn:hover { background: #3a0a10; }
2171
-
2172
- /* Scrollbar for column panels */
2173
- .col-panel::-webkit-scrollbar { width: 4px; }
2174
- .col-panel::-webkit-scrollbar-track { background: transparent; }
2175
- .col-panel::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
2176
-
2177
- /* ── File Viewer Modal ── */
2178
- #file-viewer-modal {
2179
- display: none;
2180
- position: fixed;
2181
- inset: 0;
2182
- z-index: 2000;
2183
- background: rgba(0, 0, 0, 0.75);
2184
- backdrop-filter: blur(4px);
2185
- justify-content: center;
2186
- align-items: center;
2187
- padding: 40px;
2188
- }
2189
- #file-viewer-modal.open {
2190
- display: flex;
2191
- }
2192
- .file-viewer-container {
2193
- background: var(--surface);
2194
- border: 1px solid var(--border);
2195
- border-radius: 12px;
2196
- width: 100%;
2197
- max-width: 820px;
2198
- max-height: 85vh;
2199
- display: flex;
2200
- flex-direction: column;
2201
- overflow: hidden;
2202
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
2203
- }
2204
- .file-viewer-header {
2205
- display: flex;
2206
- align-items: center;
2207
- justify-content: space-between;
2208
- padding: 12px 16px;
2209
- border-bottom: 1px solid var(--border);
2210
- background: var(--surface2);
2211
- flex-shrink: 0;
2212
- }
2213
- .file-viewer-path {
2214
- font-family: 'SF Mono', 'Fira Code', monospace;
2215
- font-size: 12px;
2216
- color: var(--text-bright);
2217
- font-weight: 600;
2218
- overflow: hidden;
2219
- text-overflow: ellipsis;
2220
- white-space: nowrap;
2221
- }
2222
- .file-viewer-close {
2223
- background: none;
2224
- border: 1px solid var(--border);
2225
- color: var(--text-dim);
2226
- cursor: pointer;
2227
- border-radius: 6px;
2228
- width: 28px;
2229
- height: 28px;
2230
- display: flex;
2231
- align-items: center;
2232
- justify-content: center;
2233
- font-size: 14px;
2234
- flex-shrink: 0;
2235
- margin-left: 12px;
2236
- }
2237
- .file-viewer-close:hover {
2238
- color: var(--text-bright);
2239
- border-color: var(--text-dim);
2240
- }
2241
- .file-viewer-body {
2242
- overflow-y: auto;
2243
- padding: 20px 24px;
2244
- flex: 1;
2245
- font-size: 13px;
2246
- line-height: 1.65;
2247
- color: var(--text);
2248
- }
2249
- /* Markdown rendered content */
2250
- .file-viewer-body.markdown h1 { font-size: 1.6em; font-weight: 700; color: var(--text-bright); margin: 0 0 0.6em; padding-bottom: 0.3em; border-bottom: 1px solid var(--border); }
2251
- .file-viewer-body.markdown h2 { font-size: 1.3em; font-weight: 700; color: var(--text-bright); margin: 1.2em 0 0.4em; padding-bottom: 0.25em; border-bottom: 1px solid var(--border); }
2252
- .file-viewer-body.markdown h3 { font-size: 1.1em; font-weight: 700; color: var(--text-bright); margin: 1em 0 0.3em; }
2253
- .file-viewer-body.markdown h4, .file-viewer-body.markdown h5, .file-viewer-body.markdown h6 { font-size: 1em; font-weight: 700; color: var(--text-bright); margin: 0.8em 0 0.2em; }
2254
- .file-viewer-body.markdown p { margin: 0 0 0.8em; }
2255
- .file-viewer-body.markdown ul, .file-viewer-body.markdown ol { margin: 0 0 0.8em; padding-left: 1.5em; }
2256
- .file-viewer-body.markdown li { margin-bottom: 0.3em; }
2257
- .file-viewer-body.markdown li > ul, .file-viewer-body.markdown li > ol { margin-top: 0.3em; margin-bottom: 0; }
2258
- .file-viewer-body.markdown code { font-family: 'SF Mono', 'Fira Code', monospace; background: var(--surface2); border: 1px solid var(--border); border-radius: 3px; padding: 1px 5px; font-size: 0.9em; color: var(--act-color); }
2259
- .file-viewer-body.markdown pre { background: var(--bg); border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px; overflow-x: auto; margin: 0 0 1em; }
2260
- .file-viewer-body.markdown pre code { background: none; border: none; padding: 0; color: var(--text); font-size: 12px; line-height: 1.5; }
2261
- .file-viewer-body.markdown blockquote { border-left: 3px solid var(--border); padding: 0.2em 0 0.2em 1em; margin: 0 0 0.8em; color: var(--text-dim); }
2262
- .file-viewer-body.markdown a { color: var(--decl-color); text-decoration: none; }
2263
- .file-viewer-body.markdown a:hover { text-decoration: underline; }
2264
- .file-viewer-body.markdown hr { border: none; border-top: 1px solid var(--border); margin: 1.2em 0; }
2265
- .file-viewer-body.markdown table { border-collapse: collapse; margin: 0 0 1em; width: 100%; }
2266
- .file-viewer-body.markdown th, .file-viewer-body.markdown td { border: 1px solid var(--border); padding: 6px 10px; text-align: left; font-size: 12px; }
2267
- .file-viewer-body.markdown th { background: var(--surface2); font-weight: 700; color: var(--text-bright); }
2268
- .file-viewer-body.markdown img { max-width: 100%; }
2269
- .file-viewer-body.markdown strong { color: var(--text-bright); font-weight: 700; }
2270
- /* Preformatted (non-markdown) */
2271
- .file-viewer-body.preformatted {
2272
- font-family: 'SF Mono', 'Fira Code', monospace;
2273
- font-size: 12px;
2274
- line-height: 1.5;
2275
- white-space: pre-wrap;
2276
- word-break: break-all;
2277
- color: var(--text);
2278
- }
2279
- /* Clickable file links in plan detail */
2280
- .file-link {
2281
- cursor: pointer;
2282
- transition: border-color 0.15s;
2283
- }
2284
- .file-link:hover {
2285
- border-color: var(--act-color) !important;
2286
- text-decoration: underline;
2287
- }
2288
-
2289
- /* ── Declaration edit mode ── */
2290
- .decl-edit-mode input,
2291
- .decl-edit-mode textarea {
2292
- background: var(--surface);
2293
- border: 1px solid var(--border);
2294
- color: var(--text);
2295
- border-radius: 4px;
2296
- padding: 8px 12px;
2297
- width: 100%;
2298
- font-size: 13px;
2299
- font-family: inherit;
2300
- outline: none;
2301
- transition: border-color 0.15s;
2302
- }
2303
- .decl-edit-mode input:focus,
2304
- .decl-edit-mode textarea:focus {
2305
- border-color: var(--decl-color);
2306
- }
2307
- .decl-edit-mode textarea {
2308
- resize: vertical;
2309
- min-height: 54px;
2310
- }
2311
- .decl-edit-mode label {
2312
- font-size: 10px;
2313
- font-weight: 700;
2314
- letter-spacing: 0.1em;
2315
- text-transform: uppercase;
2316
- color: var(--text-dim);
2317
- margin-bottom: 4px;
2318
- margin-top: 12px;
2319
- display: block;
2320
- }
2321
- .decl-edit-mode label:first-child {
2322
- margin-top: 0;
2323
- }
2324
-
2325
- .decl-edit-actions {
2326
- display: flex;
2327
- gap: 8px;
2328
- align-items: center;
2329
- margin-top: 14px;
2330
- }
2331
- .decl-edit-actions .btn-save {
2332
- background: var(--decl-color);
2333
- color: #fff;
2334
- border: none;
2335
- border-radius: 4px;
2336
- padding: 6px 16px;
2337
- cursor: pointer;
2338
- font-size: 12px;
2339
- font-weight: 600;
2340
- transition: opacity 0.15s;
2341
- }
2342
- .decl-edit-actions .btn-save:hover { opacity: 0.9; }
2343
- .decl-edit-actions .btn-save:disabled { opacity: 0.5; cursor: not-allowed; }
2344
- .decl-edit-actions .btn-cancel {
2345
- background: transparent;
2346
- border: 1px solid var(--border);
2347
- color: var(--text-dim);
2348
- border-radius: 4px;
2349
- padding: 6px 16px;
2350
- cursor: pointer;
2351
- font-size: 12px;
2352
- transition: border-color 0.15s, color 0.15s;
2353
- }
2354
- .decl-edit-actions .btn-cancel:hover { border-color: var(--text-dim); color: var(--text); }
2355
-
2356
- .delete-confirm {
2357
- margin-top: 12px;
2358
- padding: 10px 12px;
2359
- background: var(--broken-bg);
2360
- border: 1px solid var(--broken-border);
2361
- border-radius: 6px;
2362
- font-size: 12px;
2363
- color: var(--broken-color);
2364
- }
2365
- .delete-confirm p {
2366
- margin-bottom: 8px;
2367
- }
2368
- .delete-confirm .delete-confirm-actions {
2369
- display: flex;
2370
- gap: 8px;
2371
- }
2372
- .delete-confirm .btn-confirm-delete {
2373
- background: var(--broken-color);
2374
- color: #fff;
2375
- border: none;
2376
- border-radius: 4px;
2377
- padding: 5px 14px;
2378
- cursor: pointer;
2379
- font-size: 12px;
2380
- font-weight: 600;
2381
- }
2382
- .delete-confirm .btn-confirm-cancel {
2383
- background: transparent;
2384
- border: 1px solid var(--broken-border);
2385
- color: var(--broken-color);
2386
- border-radius: 4px;
2387
- padding: 5px 14px;
2388
- cursor: pointer;
2389
- font-size: 12px;
2390
- }
2391
-
2392
- .decl-status-select {
2393
- background: var(--surface2);
2394
- color: var(--text);
2395
- border: 1px solid var(--border);
2396
- border-radius: 4px;
2397
- padding: 8px 12px;
2398
- width: 100%;
2399
- font-size: 13px;
2400
- font-family: inherit;
2401
- outline: none;
2402
- cursor: pointer;
2403
- transition: border-color 0.15s;
2404
- }
2405
- .decl-status-select:focus {
2406
- border-color: var(--decl-color);
2407
- }
2408
-
2409
- .decl-panel-actions {
2410
- display: flex;
2411
- gap: 8px;
2412
- margin-top: 16px;
2413
- }
2414
- .decl-panel-actions .btn-edit {
2415
- background: var(--decl-bg);
2416
- border: 1px solid var(--decl-border);
2417
- color: var(--decl-color);
2418
- border-radius: 4px;
2419
- padding: 5px 14px;
2420
- cursor: pointer;
2421
- font-size: 12px;
2422
- font-weight: 600;
2423
- transition: background 0.15s, border-color 0.15s;
2424
- }
2425
- .decl-panel-actions .btn-edit:hover { background: #0f2d50; border-color: var(--decl-color); }
2426
- .decl-panel-actions .btn-panel-delete {
2427
- background: transparent;
2428
- color: var(--broken-color);
2429
- border: 1px solid var(--broken-border);
2430
- border-radius: 4px;
2431
- padding: 5px 14px;
2432
- cursor: pointer;
2433
- font-size: 12px;
2434
- font-weight: 600;
2435
- transition: background 0.15s;
2436
- }
2437
- .decl-panel-actions .btn-panel-delete:hover { background: var(--broken-bg); }
2438
-
2439
- /* Workability path section */
2440
- .workability-path { margin-top: 4px; }
2441
- .workability-path .wp-header {
2442
- font-size: 10px; font-weight: 700; letter-spacing: 0.1em;
2443
- text-transform: uppercase; color: var(--text-dim); margin-bottom: 8px;
2444
- }
2445
- .wp-step {
2446
- display: flex; align-items: flex-start; gap: 10px;
2447
- padding: 8px 10px; border-radius: 6px;
2448
- background: var(--surface2); border: 1px solid var(--border);
2449
- margin-bottom: 6px; font-size: 12px;
2450
- }
2451
- .wp-step-action {
2452
- font-size: 10px; font-weight: 700; letter-spacing: 0.04em;
2453
- color: var(--act-color); cursor: pointer; white-space: nowrap;
2454
- flex-shrink: 0;
2455
- }
2456
- .wp-step-action:hover { text-decoration: underline; }
2457
- .wp-step-body { flex: 1; min-width: 0; }
2458
- .wp-step-title {
2459
- color: var(--text-bright); font-size: 12px; font-weight: 500;
2460
- line-height: 1.35; margin-bottom: 3px;
2461
- }
2462
- .wp-step-milestone {
2463
- font-size: 10px; color: var(--text-dim); opacity: 0.7;
2464
- }
2465
- .wp-impact {
2466
- display: inline-block; padding: 1px 7px; border-radius: 8px;
2467
- font-size: 9px; font-weight: 700; letter-spacing: 0.04em;
2468
- text-transform: uppercase; flex-shrink: 0; margin-top: 1px;
2469
- }
2470
- .wp-impact.impact-high { background: #2a0a10; color: var(--broken-color); border: 1px solid #5a1520; }
2471
- .wp-impact.impact-medium { background: #1a1200; color: var(--integrity-partial); border: 1px solid #3d2c00; }
2472
- .wp-impact.impact-low { background: #0a2018; color: var(--integrity-whole); border: 1px solid #1a4d34; }
2473
-
2474
- /* ── Derivation panel ── */
2475
- .derivation-panel {
2476
- margin-top: 12px;
2477
- border: 1px solid var(--border);
2478
- border-radius: 6px;
2479
- padding: 12px;
2480
- background: var(--bg);
2481
- }
2482
- .derivation-panel .output-log {
2483
- max-height: 200px;
2484
- overflow-y: auto;
2485
- font-family: 'SF Mono', Monaco, monospace;
2486
- font-size: 11px;
2487
- padding: 8px;
2488
- background: #1a1a2e;
2489
- color: #ccc;
2490
- border-radius: 4px;
2491
- white-space: pre-wrap;
2492
- margin-bottom: 12px;
2493
- }
2494
- .derivation-checklist { list-style: none; padding: 0; margin: 8px 0; }
2495
- .derivation-checklist li {
2496
- display: flex;
2497
- align-items: center;
2498
- gap: 8px;
2499
- padding: 6px 0;
2500
- border-bottom: 1px solid var(--border);
2501
- }
2502
- .derivation-checklist li:last-child { border-bottom: none; }
2503
- .derivation-checklist input[type="checkbox"] { flex-shrink: 0; }
2504
- .derivation-checklist input[type="text"] {
2505
- flex: 1;
2506
- background: var(--bg);
2507
- color: var(--fg, var(--text));
2508
- border: 1px solid var(--border);
2509
- border-radius: 3px;
2510
- padding: 4px 6px;
2511
- font-size: 13px;
2512
- }
2513
- .derivation-checklist .reason {
2514
- font-size: 11px;
2515
- color: #888;
2516
- margin-left: 28px;
2517
- display: block;
2518
- }
2519
- .derive-btn {
2520
- background: var(--accent, #4a6cf7);
2521
- color: #fff;
2522
- border: none;
2523
- padding: 6px 14px;
2524
- border-radius: 4px;
2525
- cursor: pointer;
2526
- font-size: 13px;
2527
- }
2528
- .derive-btn:hover { opacity: 0.85; }
2529
- .derive-btn:disabled { opacity: 0.4; cursor: not-allowed; }
2530
- .derive-accept-btn {
2531
- background: #2ea043;
2532
- color: #fff;
2533
- border: none;
2534
- padding: 6px 14px;
2535
- border-radius: 4px;
2536
- cursor: pointer;
2537
- font-size: 13px;
2538
- margin-right: 8px;
2539
- }
2540
- .derive-cancel-btn {
2541
- background: transparent;
2542
- color: var(--text);
2543
- border: 1px solid var(--border);
2544
- padding: 6px 14px;
2545
- border-radius: 4px;
2546
- cursor: pointer;
2547
- font-size: 13px;
2548
- }
2549
-
2550
- /* ── Workflow next-step banner ── */
2551
- #workflow-banner {
2552
- display: none;
2553
- align-items: center;
2554
- gap: 16px;
2555
- padding: 12px 20px;
2556
- background: var(--surface);
2557
- border-bottom: 1px solid var(--border);
2558
- flex-shrink: 0;
2559
- }
2560
- #workflow-banner.visible { display: flex; }
2561
-
2562
- .wf-progress-bar {
2563
- width: 120px;
2564
- height: 6px;
2565
- background: rgba(255,255,255,0.06);
2566
- border-radius: 3px;
2567
- overflow: hidden;
2568
- flex-shrink: 0;
2569
- }
2570
- .wf-progress-fill {
2571
- height: 100%;
2572
- border-radius: 3px;
2573
- background: var(--act-color);
2574
- transition: width 0.4s ease;
2575
- }
2576
- .wf-progress-fill.state-empty { background: var(--text-dim); }
2577
- .wf-progress-fill.state-declarations_only { background: var(--decl-color); }
2578
- .wf-progress-fill.state-milestones_pending { background: var(--mile-color); }
2579
- .wf-progress-fill.state-actions_pending { background: var(--act-color); }
2580
- .wf-progress-fill.state-executing { background: var(--executing-color); }
2581
- .wf-progress-fill.state-complete { background: var(--integrity-whole); }
2582
-
2583
- .wf-state-label {
2584
- font-size: 10px;
2585
- font-weight: 700;
2586
- letter-spacing: 0.08em;
2587
- text-transform: uppercase;
2588
- color: var(--text-dim);
2589
- flex-shrink: 0;
2590
- }
2591
-
2592
- .wf-next-label {
2593
- font-size: 13px;
2594
- color: var(--text);
2595
- flex: 1;
2596
- }
2597
-
2598
- .wf-action-btn {
2599
- background: var(--act-bg);
2600
- border: 1px solid var(--act-border);
2601
- color: var(--act-color);
2602
- padding: 6px 16px;
2603
- border-radius: 6px;
2604
- font-size: 12px;
2605
- font-weight: 600;
2606
- cursor: pointer;
2607
- flex-shrink: 0;
2608
- transition: background 0.15s, border-color 0.15s;
2609
- white-space: nowrap;
2610
- }
2611
- .wf-action-btn:hover { background: #0d2818; border-color: #2a6a48; }
2612
-
2613
- .wf-action-btn.state-empty,
2614
- .wf-action-btn.state-declarations_only {
2615
- background: var(--decl-bg);
2616
- border-color: var(--decl-border);
2617
- color: var(--decl-color);
2618
- }
2619
- .wf-action-btn.state-empty:hover,
2620
- .wf-action-btn.state-declarations_only:hover {
2621
- background: #0f2d50;
2622
- border-color: var(--decl-color);
2623
- }
2624
- .wf-action-btn.state-milestones_pending {
2625
- background: var(--mile-bg);
2626
- border-color: var(--mile-border);
2627
- color: var(--mile-color);
2628
- }
2629
- .wf-action-btn.state-milestones_pending:hover {
2630
- background: #220e44;
2631
- border-color: var(--mile-color);
2632
- }
2633
- .wf-action-btn.state-executing {
2634
- background: var(--executing-bg);
2635
- border-color: var(--executing-border);
2636
- color: var(--executing-color);
2637
- }
2638
- .wf-action-btn.state-complete {
2639
- background: #0a2018;
2640
- border-color: #1a4d34;
2641
- color: var(--integrity-whole);
2642
- }
2643
-
2644
- .wf-pct {
2645
- font-size: 12px;
2646
- font-weight: 600;
2647
- color: var(--text-dim);
2648
- flex-shrink: 0;
2649
- }
2650
-
2651
- /* ── Reference badges ── */
2652
- .ref-link-badge {
2653
- display: inline-block;
2654
- padding: 3px 10px;
2655
- border-radius: 6px;
2656
- font-size: 11px;
2657
- font-weight: 500;
2658
- text-decoration: none;
2659
- transition: border-color 0.12s, color 0.12s;
2660
- max-width: 100%;
2661
- overflow: hidden;
2662
- text-overflow: ellipsis;
2663
- white-space: nowrap;
2664
- }
2665
- .ref-url-badge {
2666
- background: var(--decl-bg);
2667
- border: 1px solid var(--decl-border);
2668
- color: var(--decl-color);
2669
- cursor: pointer;
2670
- }
2671
- .ref-url-badge:hover { border-color: var(--decl-color); text-decoration: underline; }
2672
- .ref-path-badge {
2673
- background: var(--surface2);
2674
- border: 1px solid var(--border);
2675
- color: var(--text-dim);
2676
- font-family: 'SF Mono', 'Fira Code', monospace;
2677
- font-size: 10px;
2678
- }
2679
- .ref-input {
2680
- background: var(--surface);
2681
- border: 1px solid var(--border);
2682
- color: var(--text);
2683
- border-radius: 4px;
2684
- padding: 6px 10px;
2685
- width: 100%;
2686
- font-size: 12px;
2687
- font-family: inherit;
2688
- outline: none;
2689
- transition: border-color 0.15s;
2690
- }
2691
- .ref-input:focus { border-color: var(--decl-color); }
2692
- .ref-save-btn {
2693
- background: var(--decl-color);
2694
- color: #fff;
2695
- border: none;
2696
- border-radius: 4px;
2697
- padding: 5px 14px;
2698
- cursor: pointer;
2699
- font-size: 12px;
2700
- font-weight: 600;
2701
- transition: opacity 0.15s;
2702
- }
2703
- .ref-save-btn:hover { opacity: 0.9; }
2704
- .ref-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
2705
-
2706
- /* ── Activity pinned operation (at top of activity feed) ── */
2707
- .activity-pinned {
2708
- padding: 10px 16px;
2709
- background: var(--executing-bg);
2710
- border-bottom: 1px solid var(--executing-border);
2711
- display: flex;
2712
- align-items: center;
2713
- gap: 8px;
2714
- font-size: 12px;
2715
- color: var(--executing-color);
2716
- font-weight: 600;
2717
- letter-spacing: 0.02em;
2718
- flex-shrink: 0;
2719
- }
2720
- .activity-pinned .pinned-spinner {
2721
- width: 10px;
2722
- height: 10px;
2723
- border: 2px solid var(--border);
2724
- border-top-color: var(--executing-color);
2725
- border-radius: 50%;
2726
- animation: spin 0.7s linear infinite;
2727
- flex-shrink: 0;
2728
- }
2729
-
2730
- /* ── Agent activity cards ── */
2731
- .agent-card {
2732
- background: var(--surface2);
2733
- border: 1px solid var(--border);
2734
- border-radius: var(--radius);
2735
- padding: 10px 12px;
2736
- display: flex;
2737
- flex-direction: column;
2738
- gap: 6px;
2739
- transition: background 0.15s;
2740
- }
2741
- .agent-card:hover { background: var(--surface3); }
2742
- .agent-card.status-running { border-left: 3px solid var(--executing-color); }
2743
- .agent-card.status-complete,
2744
- .agent-card.status-done { border-left: 3px solid var(--act-color); opacity: 0.8; }
2745
- .agent-card.status-failed { border-left: 3px solid var(--broken-color); opacity: 0.8; }
2746
- .agent-card-header {
2747
- display: flex;
2748
- align-items: center;
2749
- gap: 8px;
2750
- }
2751
- .agent-card-icon {
2752
- font-size: 14px;
2753
- flex-shrink: 0;
2754
- width: 20px;
2755
- text-align: center;
2756
- }
2757
- .agent-card-target {
2758
- font-size: 12px;
2759
- font-weight: 600;
2760
- color: var(--text-bright);
2761
- overflow: hidden;
2762
- text-overflow: ellipsis;
2763
- white-space: nowrap;
2764
- flex: 1;
2765
- }
2766
- .agent-card-badge {
2767
- font-size: 10px;
2768
- font-weight: 700;
2769
- letter-spacing: 0.04em;
2770
- text-transform: uppercase;
2771
- padding: 2px 6px;
2772
- border-radius: 3px;
2773
- flex-shrink: 0;
2774
- }
2775
- .agent-card-badge.badge-running { color: var(--executing-color); background: var(--executing-bg); }
2776
- .agent-card-badge.badge-complete,
2777
- .agent-card-badge.badge-done { color: var(--act-color); background: var(--act-bg); }
2778
- .agent-card-badge.badge-failed { color: var(--broken-color); background: var(--broken-bg); }
2779
- .agent-card-meta {
2780
- display: flex;
2781
- align-items: center;
2782
- gap: 8px;
2783
- font-size: 11px;
2784
- color: var(--text-dim);
2785
- }
2786
- .agent-card-type { text-transform: capitalize; }
2787
- .agent-card-timer {
2788
- font-family: 'SF Mono', 'Fira Code', monospace;
2789
- font-size: 11px;
2790
- color: var(--text-dim);
2791
- }
2792
- .status-running .agent-card-timer { color: var(--executing-color); }
2793
- .agent-card-error {
2794
- font-size: 11px;
2795
- color: var(--broken-color);
2796
- margin-top: 2px;
2797
- overflow: hidden;
2798
- text-overflow: ellipsis;
2799
- white-space: nowrap;
2800
- }
2801
- .agent-card-summary {
2802
- font-size: 12px;
2803
- color: var(--text-dim);
2804
- margin-top: 4px;
2805
- white-space: nowrap;
2806
- overflow: hidden;
2807
- text-overflow: ellipsis;
2808
- }
2809
- .agent-card-view-result {
2810
- display: inline-block;
2811
- margin-top: 6px;
2812
- padding: 3px 10px;
2813
- font-size: 11px;
2814
- font-weight: 500;
2815
- color: var(--act-color);
2816
- background: transparent;
2817
- border: 1px solid var(--act-color);
2818
- border-radius: 4px;
2819
- cursor: pointer;
2820
- transition: background 0.15s, color 0.15s;
2821
- align-self: flex-start;
2822
- }
2823
- .agent-card-view-result:hover {
2824
- background: var(--act-color);
2825
- color: var(--surface1);
2826
- }
2827
-
2828
- /* ── Discuss (interview) flow ── */
2829
- .discuss-container {
2830
- margin-top: 8px;
2831
- border: 1px solid var(--border);
2832
- border-radius: var(--radius);
2833
- padding: 10px;
2834
- background: var(--surface2);
2835
- }
2836
- .discuss-loading { display: flex; flex-direction: column; gap: 8px; }
2837
- .discuss-streaming {
2838
- font-family: 'SF Mono', 'Fira Code', monospace;
2839
- font-size: 11px;
2840
- color: var(--executing-color);
2841
- max-height: 120px;
2842
- overflow-y: auto;
2843
- white-space: pre-wrap;
2844
- word-break: break-word;
2845
- margin: 0;
2846
- }
2847
- .discuss-header {
2848
- font-size: 12px;
2849
- font-weight: 600;
2850
- color: var(--text-bright);
2851
- margin-bottom: 8px;
2852
- }
2853
- .discuss-q {
2854
- margin-bottom: 10px;
2855
- padding-bottom: 8px;
2856
- border-bottom: 1px solid var(--border);
2857
- }
2858
- .discuss-q:last-of-type { border-bottom: none; }
2859
- .discuss-q-label {
2860
- font-size: 12px;
2861
- font-weight: 600;
2862
- color: var(--text-bright);
2863
- display: block;
2864
- margin-bottom: 4px;
2865
- }
2866
- .discuss-q-context {
2867
- font-size: 11px;
2868
- color: var(--text-dim);
2869
- margin-bottom: 6px;
2870
- font-style: italic;
2871
- }
2872
- .discuss-q-options {
2873
- display: flex;
2874
- flex-wrap: wrap;
2875
- gap: 4px;
2876
- margin-bottom: 6px;
2877
- }
2878
- .discuss-option-btn {
2879
- padding: 3px 10px;
2880
- font-size: 11px;
2881
- border: 1px solid var(--border);
2882
- border-radius: 4px;
2883
- background: var(--surface3);
2884
- color: var(--text-muted);
2885
- cursor: pointer;
2886
- }
2887
- .discuss-option-btn:hover {
2888
- border-color: var(--accent);
2889
- color: var(--accent);
2890
- }
2891
- .discuss-q-input {
2892
- width: 100%;
2893
- background: var(--surface1);
2894
- border: 1px solid var(--border);
2895
- border-radius: 4px;
2896
- color: var(--text-bright);
2897
- font-size: 12px;
2898
- padding: 6px 8px;
2899
- resize: vertical;
2900
- font-family: inherit;
2901
- }
2902
- .discuss-q-input:focus {
2903
- outline: none;
2904
- border-color: var(--accent);
2905
- }
2906
- .discuss-actions {
2907
- display: flex;
2908
- gap: 8px;
2909
- margin-top: 10px;
2910
- }
2911
- .discuss-error {
2912
- font-size: 12px;
2913
- color: var(--text-muted);
2914
- margin-bottom: 8px;
2915
- }
2916
- .agent-timer-final {
2917
- color: var(--text-muted);
2918
- }
2919
-
2920
- /* ── Classification toggle buttons ── */
2921
- .classify-btn {
2922
- background: var(--surface2);
2923
- border: 1px solid var(--border);
2924
- color: var(--text-dim);
2925
- padding: 4px 12px;
2926
- border-radius: 6px;
2927
- font-size: 11px;
2928
- font-weight: 600;
2929
- cursor: pointer;
2930
- transition: background 0.15s, border-color 0.15s, color 0.15s;
2931
- }
2932
- .classify-btn:hover { background: #252535; border-color: #3a3a50; color: var(--text); }
2933
- .classify-btn.active {
2934
- background: var(--mile-bg);
2935
- border-color: var(--mile-border);
2936
- color: var(--mile-color);
2937
- }
2938
-
2939
- /* ── Classification icon on nodes ── */
2940
- .class-icon {
2941
- font-size: 10px;
2942
- margin-right: 4px;
2943
- vertical-align: middle;
2944
- }
2945
-
2946
- /* ── Readiness badges on milestone nodes ── */
2947
- .readiness-badge {
2948
- display: inline-block;
2949
- font-size: 9px;
2950
- font-weight: 600;
2951
- letter-spacing: 0.5px;
2952
- padding: 1px 6px;
2953
- border-radius: 8px;
2954
- margin-left: 4px;
2955
- vertical-align: middle;
2956
- }
2957
- .readiness-ready {
2958
- background: rgba(52, 211, 153, 0.15);
2959
- color: #34d399;
2960
- border: 1px solid rgba(52, 211, 153, 0.3);
2961
- }
2962
- .readiness-blocked {
2963
- background: rgba(255, 77, 109, 0.15);
2964
- color: #ff4d6d;
2965
- border: 1px solid rgba(255, 77, 109, 0.3);
2966
- }
2967
- .readiness-no-actions {
2968
- background: rgba(110, 110, 136, 0.15);
2969
- color: #6e6e88;
2970
- border: 1px solid rgba(110, 110, 136, 0.3);
2971
- }
2972
-
2973
- /* ── Dependency indicator on nodes ── */
2974
- .dep-indicator {
2975
- font-size: 9px;
2976
- margin-left: 5px;
2977
- padding: 1px 5px;
2978
- border-radius: 8px;
2979
- background: rgba(255,255,255,0.06);
2980
- color: var(--text-dim);
2981
- vertical-align: middle;
2982
- }
2983
-
2984
- /* ── Dependency tags in detail panel ── */
2985
- .dep-tag {
2986
- display: inline-flex;
2987
- align-items: center;
2988
- gap: 4px;
2989
- padding: 3px 8px;
2990
- border-radius: 6px;
2991
- font-size: 11px;
2992
- font-weight: 500;
2993
- background: var(--mile-bg);
2994
- border: 1px solid var(--mile-border);
2995
- color: var(--mile-color);
2996
- cursor: pointer;
2997
- transition: border-color 0.12s;
2998
- }
2999
- .dep-tag:hover { border-color: var(--mile-color); }
3000
- .dep-remove {
3001
- font-size: 13px;
3002
- line-height: 1;
3003
- opacity: 0.5;
3004
- cursor: pointer;
3005
- transition: opacity 0.12s;
3006
- }
3007
- .dep-remove:hover { opacity: 1; color: var(--broken-color); }
3008
-
3009
- /* ── Review state badges ── */
3010
- .review-badge {
3011
- display: inline-block;
3012
- padding: 2px 7px;
3013
- border-radius: 99px;
3014
- font-size: 10px;
3015
- font-weight: 600;
3016
- letter-spacing: 0.02em;
3017
- text-transform: uppercase;
3018
- cursor: pointer;
3019
- user-select: none;
3020
- transition: opacity 0.15s;
3021
- }
3022
- .review-badge:hover { opacity: 0.8; }
3023
- .review-draft { background: rgba(255,255,255,0.05); color: var(--text-dim); border: 1px solid var(--border); }
3024
- .review-in_review { background: rgba(147,197,253,0.1); color: #93c5fd; border: 1px solid rgba(147,197,253,0.25); }
3025
- .review-revision_needed { background: rgba(251,191,36,0.1); color: #fbbf24; border: 1px solid rgba(251,191,36,0.25); }
3026
- .review-approved { background: rgba(134,239,172,0.1); color: #86efac; border: 1px solid rgba(134,239,172,0.25); }
3027
-
3028
- /* ── Annotation panel ── */
3029
- .annotation-panel {
3030
- margin-top: 20px;
3031
- border-top: 1px solid var(--border);
3032
- padding-top: 16px;
3033
- }
3034
- .annotation-count {
3035
- font-size: 10px;
3036
- color: var(--text-dim);
3037
- font-weight: 400;
3038
- }
3039
- .annotation-lines {
3040
- font-family: 'SF Mono', 'Fira Code', monospace;
3041
- font-size: 11px;
3042
- line-height: 1.6;
3043
- background: var(--bg);
3044
- border: 1px solid var(--border);
3045
- border-radius: 6px;
3046
- padding: 8px 0;
3047
- max-height: 400px;
3048
- overflow-y: auto;
3049
- }
3050
- .ann-line {
3051
- display: flex;
3052
- padding: 0 10px;
3053
- }
3054
- .ann-line:hover {
3055
- background: var(--surface2);
3056
- }
3057
- .ann-line-num {
3058
- color: var(--text-dim);
3059
- opacity: 0.5;
3060
- min-width: 32px;
3061
- text-align: right;
3062
- padding-right: 10px;
3063
- cursor: pointer;
3064
- user-select: none;
3065
- }
3066
- .ann-line-num:hover {
3067
- opacity: 1;
3068
- color: #60a5fa;
3069
- }
3070
- .ann-line-text {
3071
- white-space: pre;
3072
- overflow-x: auto;
3073
- flex: 1;
3074
- }
3075
- .ann-line.has-annotation {
3076
- background: rgba(234, 179, 8, 0.08);
3077
- border-left: 2px solid #eab308;
3078
- }
3079
- .ann-comment {
3080
- display: flex;
3081
- align-items: center;
3082
- gap: 8px;
3083
- padding: 4px 10px 4px 42px;
3084
- background: rgba(234, 179, 8, 0.06);
3085
- border-left: 2px solid #eab308;
3086
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
3087
- font-size: 11px;
3088
- }
3089
- .ann-comment-text {
3090
- flex: 1;
3091
- color: #eab308;
3092
- }
3093
- .ann-comment-meta {
3094
- font-size: 9px;
3095
- color: var(--text-dim);
3096
- opacity: 0.6;
3097
- }
3098
- .ann-resolve-btn {
3099
- background: none;
3100
- border: none;
3101
- color: var(--text-dim);
3102
- cursor: pointer;
3103
- font-size: 14px;
3104
- padding: 0 4px;
3105
- opacity: 0.5;
3106
- }
3107
- .ann-resolve-btn:hover {
3108
- opacity: 1;
3109
- color: var(--broken-color);
3110
- }
3111
- .ann-input-row {
3112
- display: flex;
3113
- gap: 6px;
3114
- padding: 4px 10px 4px 42px;
3115
- background: rgba(96, 165, 250, 0.06);
3116
- }
3117
- .ann-input {
3118
- flex: 1;
3119
- background: var(--surface);
3120
- border: 1px solid var(--border);
3121
- color: var(--text);
3122
- border-radius: 4px;
3123
- padding: 4px 8px;
3124
- font-size: 11px;
3125
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
3126
- }
3127
- .ann-input:focus {
3128
- outline: none;
3129
- border-color: #60a5fa;
3130
- }
3131
- .ann-submit-btn {
3132
- background: #60a5fa;
3133
- color: #000;
3134
- border: none;
3135
- border-radius: 4px;
3136
- padding: 4px 10px;
3137
- font-size: 10px;
3138
- font-weight: 700;
3139
- cursor: pointer;
3140
- }
3141
- .ann-submit-btn:hover {
3142
- background: #93bbfd;
3143
- }
3144
- .ann-show-more-btn {
3145
- display: block;
3146
- width: 100%;
3147
- background: none;
3148
- border: none;
3149
- border-top: 1px solid var(--border);
3150
- color: var(--text-dim);
3151
- padding: 6px;
3152
- font-size: 10px;
3153
- cursor: pointer;
3154
- text-align: center;
3155
- }
3156
- .ann-show-more-btn:hover {
3157
- color: var(--text);
3158
- background: var(--surface2);
3159
- }
3160
- .ann-no-artifact {
3161
- color: var(--text-dim);
3162
- font-size: 11px;
3163
- opacity: 0.5;
3164
- font-style: italic;
3165
- padding: 8px 0;
3166
- }
3167
- .ann-approve-section {
3168
- display: flex;
3169
- align-items: center;
3170
- gap: 12px;
3171
- margin-top: 12px;
3172
- padding: 10px 12px;
3173
- background: rgba(34, 197, 94, 0.08);
3174
- border: 1px solid rgba(34, 197, 94, 0.3);
3175
- border-radius: 6px;
3176
- }
3177
- .ann-approve-msg {
3178
- flex: 1;
3179
- font-size: 11px;
3180
- color: #22c55e;
3181
- font-weight: 500;
3182
- }
3183
- .ann-approve-btn {
3184
- background: #22c55e;
3185
- color: #000;
3186
- border: none;
3187
- border-radius: 4px;
3188
- padding: 6px 16px;
3189
- font-size: 11px;
3190
- font-weight: 700;
3191
- cursor: pointer;
3192
- text-transform: uppercase;
3193
- letter-spacing: 0.05em;
3194
- }
3195
- .ann-approve-btn:hover {
3196
- background: #4ade80;
3197
- }
3198
-
3199
- /* ── Revision round badge ── */
3200
- .revision-round-badge {
3201
- background: #e8e0ff;
3202
- color: #5b21b6;
3203
- font-size: 11px;
3204
- padding: 2px 8px;
3205
- border-radius: 10px;
3206
- font-weight: 600;
3207
- margin-left: 8px;
3208
- }
3209
-
3210
- /* ── Revision request button and output panel ── */
3211
- .ann-revise-section {
3212
- padding: 12px 8px;
3213
- border-top: 1px solid #e5e7eb;
3214
- margin-top: 8px;
3215
- }
3216
- .ann-revise-btn {
3217
- background: #7c3aed;
3218
- color: white;
3219
- border: none;
3220
- padding: 8px 16px;
3221
- border-radius: 6px;
3222
- cursor: pointer;
3223
- font-weight: 600;
3224
- width: 100%;
3225
- font-size: 12px;
3226
- }
3227
- .ann-revise-btn:hover {
3228
- background: #6d28d9;
3229
- }
3230
- .ann-revise-btn:disabled {
3231
- opacity: 0.6;
3232
- cursor: not-allowed;
3233
- }
3234
- .ann-revise-hint {
3235
- font-size: 11px;
3236
- color: #6b7280;
3237
- margin-top: 4px;
3238
- text-align: center;
3239
- }
3240
- #revision-panel {
3241
- background: #1e1b2e;
3242
- border-radius: 8px;
3243
- padding: 12px;
3244
- margin-top: 12px;
3245
- }
3246
- .revision-panel-header {
3247
- color: #c4b5fd;
3248
- font-weight: 600;
3249
- margin-bottom: 8px;
3250
- font-size: 13px;
3251
- }
3252
- #revision-output {
3253
- background: #0f0d1a;
3254
- color: #e2e8f0;
3255
- font-size: 11px;
3256
- font-family: monospace;
3257
- padding: 8px;
3258
- border-radius: 4px;
3259
- max-height: 300px;
3260
- overflow-y: auto;
3261
- white-space: pre-wrap;
3262
- word-break: break-word;
3263
- }
3264
- .revision-stop-btn {
3265
- background: #ef4444;
3266
- color: white;
3267
- border: none;
3268
- padding: 4px 12px;
3269
- border-radius: 4px;
3270
- cursor: pointer;
3271
- margin-top: 8px;
3272
- font-size: 12px;
3273
- }
3274
- .revision-stop-btn:hover {
3275
- background: #dc2626;
3276
- }
3277
-
3278
- /* ── Diff view ── */
3279
- .ann-diff-toggle {
3280
- background: transparent;
3281
- border: 1px solid #7c3aed;
3282
- color: #7c3aed;
3283
- font-size: 11px;
3284
- padding: 2px 8px;
3285
- border-radius: 4px;
3286
- cursor: pointer;
3287
- margin-left: 8px;
3288
- }
3289
- .ann-diff-toggle:hover {
3290
- background: #7c3aed;
3291
- color: white;
3292
- }
3293
- .diff-view {
3294
- font-family: 'SF Mono', 'Fira Code', monospace;
3295
- font-size: 11px;
3296
- overflow-x: auto;
3297
- max-height: 500px;
3298
- overflow-y: auto;
3299
- border-radius: 4px;
3300
- border: 1px solid var(--border);
3301
- }
3302
- .diff-header {
3303
- padding: 8px 12px;
3304
- background: var(--surface2);
3305
- border-bottom: 1px solid var(--border);
3306
- display: flex;
3307
- justify-content: space-between;
3308
- align-items: center;
3309
- font-weight: 600;
3310
- font-size: 12px;
3311
- color: var(--text-bright);
3312
- }
3313
- .diff-line {
3314
- display: flex;
3315
- padding: 0 8px;
3316
- min-height: 20px;
3317
- line-height: 20px;
3318
- }
3319
- .diff-line.diff-add {
3320
- background: rgba(34, 197, 94, 0.12);
3321
- }
3322
- .diff-line.diff-remove {
3323
- background: rgba(239, 68, 68, 0.12);
3324
- }
3325
- .diff-line.diff-same {
3326
- background: transparent;
3327
- }
3328
- .diff-gutter {
3329
- width: 35px;
3330
- text-align: right;
3331
- padding-right: 8px;
3332
- color: var(--text-dim);
3333
- user-select: none;
3334
- flex-shrink: 0;
3335
- font-size: 10px;
3336
- opacity: 0.5;
3337
- }
3338
- .diff-gutter-old {}
3339
- .diff-gutter-new {}
3340
- .diff-text {
3341
- flex: 1;
3342
- white-space: pre-wrap;
3343
- word-break: break-all;
3344
- }
3345
- .diff-prefix {
3346
- width: 16px;
3347
- text-align: center;
3348
- flex-shrink: 0;
3349
- font-weight: bold;
3350
- }
3351
- .diff-prefix.diff-add {
3352
- color: #22c55e;
3353
- }
3354
- .diff-prefix.diff-remove {
3355
- color: #ef4444;
3356
- }
3357
- .diff-close-btn {
3358
- background: transparent;
3359
- border: 1px solid var(--text-dim);
3360
- color: var(--text-dim);
3361
- font-size: 11px;
3362
- padding: 2px 8px;
3363
- border-radius: 4px;
3364
- cursor: pointer;
3365
- }
3366
- .diff-close-btn:hover {
3367
- border-color: var(--text-bright);
3368
- color: var(--text-bright);
3369
- }
3370
-
3371
- /* ── Readiness banner ── */
3372
- #readiness-banner {
3373
- display: none;
3374
- padding: 8px 16px;
3375
- background: var(--surface);
3376
- border-bottom: 1px solid var(--border);
3377
- font-size: 13px;
3378
- gap: 8px;
3379
- align-items: center;
3380
- flex-wrap: wrap;
3381
- flex-shrink: 0;
3382
- }
3383
- #readiness-banner.active { display: flex; }
3384
- .rb-progress { font-weight: 600; color: var(--text); }
3385
- .rb-remaining { color: var(--text-dim); }
3386
- .rb-complete { color: var(--act-color); font-weight: 600; }
3387
- .rb-link {
3388
- color: var(--act-color);
3389
- cursor: pointer;
3390
- text-decoration: underline;
3391
- margin: 0 2px;
3392
- font-size: 12px;
3393
- }
3394
- .rb-link:hover { opacity: 0.8; }
3395
- .rb-more { color: var(--text-dim); font-size: 12px; }
3396
- .enter-exec-btn {
3397
- margin-left: 8px;
3398
- padding: 7px 20px;
3399
- border: none;
3400
- border-radius: var(--radius);
3401
- font-weight: 600;
3402
- font-size: 13px;
3403
- cursor: pointer;
3404
- background: var(--accent);
3405
- color: #111;
3406
- transition: opacity 0.15s, transform 0.1s;
3407
- }
3408
- .enter-exec-btn:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
3409
- .enter-exec-btn:active:not(:disabled) { transform: scale(0.98); }
3410
- .enter-exec-btn:disabled {
3411
- opacity: 0.3;
3412
- cursor: not-allowed;
3413
- }
3414
-
3415
- /* ── Review action buttons ── */
3416
- .review-actions {
3417
- display: flex; gap: 8px; align-items: center;
3418
- margin: 12px 0; padding: 10px;
3419
- background: var(--surface1, var(--surface));
3420
- border-radius: 6px;
3421
- border: 1px solid var(--border);
3422
- }
3423
- .ra-btn {
3424
- padding: 6px 14px; border-radius: 4px; border: 1px solid var(--border);
3425
- cursor: pointer; font-size: 13px; font-weight: 500;
3426
- background: var(--surface2, var(--surface)); color: var(--text);
3427
- transition: background 0.15s, border-color 0.15s;
3428
- }
3429
- .ra-btn:hover { opacity: 0.85; }
3430
- .ra-approve.ra-active { background: var(--done-bg); color: var(--done-color); border-color: var(--done-border); }
3431
- .ra-revision.ra-active { background: var(--broken-bg); color: var(--broken-color); border-color: var(--broken-border); }
3432
- .ra-state { font-size: 12px; color: var(--text-dim); margin-left: auto; }
3433
-
3434
- /* ── Execution pipeline view ── */
3435
- #execution-view {
3436
- display: none;
3437
- width: 100%;
3438
- height: 100%;
3439
- background: var(--bg);
3440
- padding-right: var(--panel-width);
3441
- }
3442
- #execution-view.active { display: flex; flex-direction: column; }
3443
- .exec-content { display: flex; flex-direction: row; flex: 1; overflow: hidden; }
3444
-
3445
- .exec-left-panel {
3446
- width: 340px;
3447
- flex-shrink: 0;
3448
- overflow-y: auto;
3449
- border-right: 1px solid var(--border);
3450
- padding: 16px;
3451
- }
3452
-
3453
- .exec-pipeline { }
3454
-
3455
- .exec-output-panel {
3456
- flex: 1;
3457
- display: flex;
3458
- flex-direction: column;
3459
- overflow: hidden;
3460
- }
3461
- .exec-output-header {
3462
- height: 36px;
3463
- flex-shrink: 0;
3464
- display: flex;
3465
- align-items: center;
3466
- padding: 0 16px;
3467
- background: var(--surface);
3468
- border-bottom: 1px solid var(--border);
3469
- font-size: 12px;
3470
- color: var(--text-dim);
3471
- }
3472
- .exec-output-log {
3473
- flex: 1;
3474
- overflow-y: auto;
3475
- padding: 12px 16px;
3476
- font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
3477
- font-size: 12px;
3478
- line-height: 1.6;
3479
- color: var(--text);
3480
- white-space: pre-wrap;
3481
- word-break: break-all;
3482
- background: var(--bg);
3483
- margin: 0;
3484
- }
3485
- .exec-output-empty {
3486
- color: var(--text-dim);
3487
- font-size: 13px;
3488
- padding: 40px;
3489
- text-align: center;
3490
- }
3491
-
3492
- .exec-wave-label {
3493
- font-size: 11px;
3494
- color: var(--text-dim);
3495
- margin-bottom: 4px;
3496
- padding-left: 4px;
3497
- margin-top: 16px;
3498
- }
3499
- .exec-wave-label:first-child { margin-top: 0; }
3500
-
3501
- .exec-milestone-group {
3502
- margin-bottom: 16px;
3503
- }
3504
-
3505
- .exec-milestone-header {
3506
- font-weight: 600;
3507
- color: var(--mile-color);
3508
- padding: 8px 12px;
3509
- background: var(--mile-bg);
3510
- border: 1px solid var(--mile-border);
3511
- border-radius: 6px;
3512
- font-size: 14px;
3513
- display: flex;
3514
- align-items: center;
3515
- gap: 8px;
3516
- }
3517
- .exec-milestone-header .exec-milestone-status {
3518
- font-size: 10px;
3519
- font-weight: 700;
3520
- letter-spacing: 0.05em;
3521
- text-transform: uppercase;
3522
- padding: 2px 8px;
3523
- border-radius: 8px;
3524
- background: rgba(255,255,255,0.06);
3525
- margin-left: auto;
3526
- flex-shrink: 0;
3527
- }
3528
-
3529
- .exec-action-list {
3530
- margin-left: 20px;
3531
- border-left: 2px solid var(--border);
3532
- padding-left: 16px;
3533
- }
3534
-
3535
- .exec-action-item {
3536
- display: flex;
3537
- align-items: center;
3538
- gap: 10px;
3539
- padding: 8px 12px;
3540
- margin: 4px 0;
3541
- background: var(--surface);
3542
- border: 1px solid var(--border);
3543
- border-radius: 4px;
3544
- cursor: pointer;
3545
- font-size: 13px;
3546
- transition: background 0.15s, border-color 0.15s;
3547
- }
3548
- .exec-action-item:hover { background: var(--surface2); }
3549
- .exec-action-item.active {
3550
- border-color: var(--executing-border);
3551
- background: var(--executing-bg);
3552
- }
3553
-
3554
- .exec-status-dot {
3555
- width: 10px;
3556
- height: 10px;
3557
- border-radius: 50%;
3558
- flex-shrink: 0;
3559
- transition: background 0.3s ease, box-shadow 0.3s ease;
3560
- }
3561
- .exec-status-dot.queued { background: #555; }
3562
- .exec-status-dot.running { background: var(--planned-color); animation: exec-pulse 1.5s ease-in-out infinite; }
3563
- .exec-status-dot.done { background: var(--act-color); animation: dotComplete 0.3s ease; }
3564
- .exec-status-dot.failed { background: var(--broken-color); animation: dotComplete 0.3s ease; }
3565
-
3566
- @keyframes exec-pulse {
3567
- 0%, 100% { opacity: 1; }
3568
- 50% { opacity: 0.3; }
3569
- }
3570
-
3571
- @keyframes dotComplete {
3572
- 0% { transform: scale(1); }
3573
- 50% { transform: scale(1.3); }
3574
- 100% { transform: scale(1); }
3575
- }
3576
-
3577
- .exec-action-title {
3578
- flex: 1;
3579
- color: var(--text);
3580
- overflow: hidden;
3581
- text-overflow: ellipsis;
3582
- white-space: nowrap;
3583
- }
3584
-
3585
- .exec-action-status-label {
3586
- font-size: 11px;
3587
- color: var(--text-dim);
3588
- text-transform: uppercase;
3589
- flex-shrink: 0;
3590
- }
3591
-
3592
- /* ── Execution mode: hide all edit controls ── */
3593
- body.exec-mode #new-decl-btn { display: none; }
3594
- body.exec-mode #play-btn { display: none; }
3595
- body.exec-mode #workflow-banner { display: none; }
3596
- body.exec-mode #readiness-banner { display: none; }
3597
- body.exec-mode #side-panel { display: none; }
3598
- body.exec-mode #activity-feed { display: none; }
3599
- body.exec-mode #execution-view { padding-right: 0; }
3600
-
3601
- /* ── Execution topbar ── */
3602
- .exec-topbar {
3603
- display: none;
3604
- align-items: center;
3605
- gap: 12px;
3606
- padding: 0 16px;
3607
- height: 36px;
3608
- background: var(--surface);
3609
- border-bottom: 1px solid var(--border);
3610
- flex-shrink: 0;
3611
- }
3612
- body.exec-mode .exec-topbar { display: flex; }
3613
- body:not(.exec-mode) .exec-topbar { display: none; }
3614
- .exec-topbar-title {
3615
- font-size: 13px;
3616
- font-weight: 600;
3617
- color: var(--text-bright);
3618
- flex-shrink: 0;
3619
- }
3620
- .exec-exit-btn {
3621
- padding: 4px 12px;
3622
- border-radius: 4px;
3623
- border: 1px solid var(--border);
3624
- background: var(--surface2);
3625
- color: var(--text);
3626
- cursor: pointer;
3627
- font-size: 12px;
3628
- }
3629
- .exec-exit-btn:hover { background: var(--border); }
3630
- .exec-stop-btn {
3631
- padding: 4px 12px;
3632
- border-radius: 4px;
3633
- border: 1px solid var(--broken-border);
3634
- background: var(--broken-bg);
3635
- color: var(--broken-color);
3636
- cursor: pointer;
3637
- font-size: 12px;
3638
- font-weight: 600;
3639
- }
3640
- .exec-stop-btn:hover { opacity: 0.85; }
3641
-
3642
- /* ── Execution progress bar ── */
3643
- .exec-progress-container {
3644
- height: 6px;
3645
- background: var(--bg);
3646
- border-radius: 3px;
3647
- flex: 1;
3648
- margin: 0 16px;
3649
- min-width: 120px;
3650
- }
3651
- .exec-progress-fill {
3652
- height: 100%;
3653
- background: var(--decl-color);
3654
- border-radius: 3px;
3655
- transition: width 0.3s ease;
3656
- width: 0;
3657
- }
3658
- .exec-progress-pct {
3659
- font-size: 13px;
3660
- color: var(--text-dim);
3661
- min-width: 40px;
3662
- text-align: right;
3663
- }
3664
-
3665
- /* ── Pre-execution wave order view ── */
3666
- .exec-preorder-list {
3667
- list-style: none;
3668
- padding: 0;
3669
- margin: 0;
3670
- counter-reset: wave-counter;
3671
- }
3672
- .exec-preorder-wave {
3673
- border-left: 3px solid var(--planned-color);
3674
- padding: 12px 16px;
3675
- margin-bottom: 16px;
3676
- }
3677
- .exec-preorder-wave-header {
3678
- font-size: 13px;
3679
- font-weight: 700;
3680
- color: var(--text);
3681
- margin-bottom: 8px;
3682
- }
3683
- .exec-preorder-milestone {
3684
- padding: 6px 12px;
3685
- font-size: 13px;
3686
- color: var(--mile-color);
3687
- }
3688
- .exec-preorder-action {
3689
- padding: 4px 12px 4px 24px;
3690
- font-size: 12px;
3691
- color: var(--text-dim);
3692
- display: flex;
3693
- align-items: center;
3694
- gap: 8px;
3695
- }
3696
- .exec-confirm-btn {
3697
- background: var(--act-color);
3698
- color: white;
3699
- border: none;
3700
- padding: 10px 24px;
3701
- border-radius: 6px;
3702
- font-size: 14px;
3703
- font-weight: 600;
3704
- cursor: pointer;
3705
- margin-top: 20px;
3706
- width: 100%;
3707
- }
3708
- .exec-confirm-btn:hover { opacity: 0.9; }
3709
-
3710
- /* ── Drag-to-reorder feedback ── */
3711
- .exec-dragging { opacity: 0.4; outline: 2px dashed var(--planned-color); }
3712
- .exec-drop-valid { outline: 2px solid var(--act-color); background: rgba(52, 211, 153, 0.08); }
3713
- .exec-drop-invalid { outline: 2px solid var(--broken-color); opacity: 0.5; cursor: no-drop; }
3714
- .exec-preorder-milestone[draggable="true"],
3715
- .exec-preorder-action[draggable="true"] { cursor: grab; }
3716
- .exec-preorder-milestone[draggable="true"]:active,
3717
- .exec-preorder-action[draggable="true"]:active { cursor: grabbing; }
3718
- .exec-preorder-milestone[draggable="true"]::before,
3719
- .exec-preorder-action[draggable="true"]::before {
3720
- content: "\22EE\22EE";
3721
- color: var(--text-dim);
3722
- margin-right: 6px;
3723
- font-size: 11px;
3724
- letter-spacing: -3px;
3725
- }
3726
-
3727
- /* ── Failure modal ── */
3728
- .exec-failure-overlay {
3729
- position: fixed;
3730
- inset: 0;
3731
- background: rgba(0,0,0,0.6);
3732
- z-index: 1000;
3733
- display: flex;
3734
- align-items: center;
3735
- justify-content: center;
3736
- }
3737
- .exec-failure-modal {
3738
- background: var(--bg-card, #1e1e1e);
3739
- border: 1px solid var(--border, #333);
3740
- border-radius: 8px;
3741
- padding: 24px;
3742
- max-width: 420px;
3743
- width: 90%;
3744
- box-shadow: 0 8px 32px rgba(0,0,0,0.4);
3745
- }
3746
- .exec-failure-title {
3747
- font-size: 16px;
3748
- font-weight: 600;
3749
- color: #ff6b6b;
3750
- margin-bottom: 12px;
3751
- }
3752
- .exec-failure-details {
3753
- font-size: 13px;
3754
- color: var(--text-dim);
3755
- margin-bottom: 20px;
3756
- font-family: monospace;
3757
- white-space: pre-line;
3758
- }
3759
- .exec-failure-actions {
3760
- display: flex;
3761
- gap: 10px;
3762
- flex-wrap: wrap;
3763
- }
3764
- .exec-failure-btn {
3765
- padding: 8px 16px;
3766
- border-radius: 4px;
3767
- border: none;
3768
- cursor: pointer;
3769
- font-size: 13px;
3770
- font-weight: 500;
3771
- }
3772
- .exec-failure-btn.view-output {
3773
- background: transparent;
3774
- color: var(--accent, #4a9eff);
3775
- border: 1px solid var(--accent, #4a9eff);
3776
- }
3777
- .exec-failure-btn.skip {
3778
- background: #e8a838;
3779
- color: #000;
3780
- }
3781
- .exec-failure-btn.stop {
3782
- background: #ff4444;
3783
- color: #fff;
3784
- }
3785
- .exec-failure-btn:hover { opacity: 0.85; }
3786
-
3787
- </style>
3788
- </head>
3789
- <body>
3790
-
3791
- <!-- Status bar — project name + breadcrumb + nav | integrity + next/execute -->
3792
- <div id="status-bar">
3793
- <span class="project-name" id="project-name">Declare</span>
3794
- <div id="status-breadcrumb"></div>
3795
- <div class="status-right">
3796
- <span class="status-pill" id="integrity-pill"><span class="pill-value">–</span></span>
3797
- <button id="execute-main-btn">Next</button>
3798
- </div>
3799
- <button id="new-decl-btn" class="new-decl-btn" style="display:none">+ Declaration</button>
3800
- <button id="play-btn" class="play-btn" title="Execute all ready agent milestones in dependency order" style="display:none">Play All</button>
3801
- </div>
3802
- <!-- Hidden stat/compat elements -->
3803
- <span id="stat-decls" style="display:none">0</span>
3804
- <span id="stat-miles" style="display:none">0</span>
3805
- <span id="stat-acts" style="display:none">0</span>
3806
- <span id="health-badge" style="display:none"></span>
3807
- <span id="last-updated" style="display:none"></span>
3808
- <!-- Legacy workflow banner (hidden, rendered inside status bar now) -->
3809
- <div id="workflow-banner" style="display:none">
3810
- <span class="wf-state-label" id="wf-state-label"></span>
3811
- <div class="wf-progress-bar"><div class="wf-progress-fill" id="wf-progress-fill"></div></div>
3812
- <span class="wf-pct" id="wf-pct"></span>
3813
- <span class="wf-next-label" id="wf-next-label"></span>
3814
- <button class="wf-action-btn" id="wf-action-btn"></button>
3815
- </div>
3816
-
3817
- <!-- Play progress banner -->
3818
- <div id="play-banner">
3819
- <span class="play-wave-label" id="play-wave-label">Wave 0/0</span>
3820
- <div class="play-actions-list" id="play-actions-list"></div>
3821
- <button class="play-stop-btn" id="play-stop-btn">Stop</button>
3822
- </div>
3823
-
3824
- <!-- Main -->
3825
- <div id="main">
3826
- <!-- Readiness banner — hidden, replaced by drill prompts -->
3827
- <div id="readiness-banner"></div>
3828
-
3829
- <!-- Drill browser — 3-panel drill-down: detail | list | activity -->
3830
- <div id="drill-browser" class="active">
3831
- <div id="drill-breadcrumb"></div>
3832
- <div id="drill-body">
3833
- <div id="drill-detail"></div>
3834
- <div id="drill-center">
3835
- <div id="drill-context"></div>
3836
- <div id="drill-list"></div>
3837
- <div id="drill-prompt"></div>
3838
- </div>
3839
- </div>
3840
- </div>
3841
-
3842
- <div id="decl-form-container" style="display:none"></div>
3843
- <button id="col-decl-add-btn" style="display:none"></button>
3844
-
3845
- <!-- Execution view — CI pipeline layout with live output panel -->
3846
- <div id="execution-view">
3847
- <div class="exec-topbar">
3848
- <span class="exec-topbar-title" id="exec-topbar-title">Execution Mode</span>
3849
- <span id="exec-wave-status" style="font-size:12px;color:var(--text-dim)"></span>
3850
- <div class="exec-progress-container"><div class="exec-progress-fill" id="exec-progress-fill"></div></div>
3851
- <span class="exec-progress-pct" id="exec-progress-pct"></span>
3852
- <button class="exec-stop-btn" id="exec-stop-btn">Stop</button>
3853
- <button class="exec-exit-btn" id="exec-exit-btn">Exit</button>
3854
- </div>
3855
- <div class="exec-content">
3856
- <div class="exec-left-panel">
3857
- <div class="exec-pipeline" id="exec-pipeline"></div>
3858
- </div>
3859
- <div class="exec-output-panel">
3860
- <div class="exec-output-header" id="exec-output-header">No action selected</div>
3861
- <pre class="exec-output-log" id="exec-output-log"></pre>
3862
- </div>
3863
- </div>
3864
- <div class="exec-failure-overlay" id="exec-failure-overlay" style="display:none;">
3865
- <div class="exec-failure-modal">
3866
- <div class="exec-failure-title">Action Failed</div>
3867
- <div class="exec-failure-details" id="exec-failure-details"></div>
3868
- <div class="exec-failure-actions">
3869
- <button class="exec-failure-btn view-output" id="exec-failure-view">View Output</button>
3870
- <button class="exec-failure-btn skip" id="exec-failure-skip">Skip &amp; Continue</button>
3871
- <button class="exec-failure-btn stop" id="exec-failure-stop">Stop Pipeline</button>
3872
- </div>
3873
- </div>
3874
- </div>
3875
- </div>
3876
- </div>
3877
-
3878
- <!-- Side panel — always visible fixed right column -->
3879
- <div id="side-panel">
3880
- <div id="panel-header">
3881
- <span id="panel-title">Details</span>
3882
- </div>
3883
- <div id="panel-body">
3884
- <div id="panel-empty" style="color:var(--text-dim);font-size:12px;padding:8px 0;line-height:1.7">
3885
- Click any node to see details.<br>
3886
- Click a declaration or milestone<br>to focus its subtree.
3887
- </div>
3888
- </div>
3889
- </div>
3890
-
3891
- <!-- Activity feed placeholder (moved into drill-body via JS) -->
3892
- <div id="activity-feed">
3893
- <div id="activity-toggle">
3894
- <div id="activity-pulse"></div>
3895
- <div id="activity-tabs">
3896
- <span class="activity-tab active" data-tab="cards">Agents</span>
3897
- <span class="activity-tab" data-tab="log">Log</span>
3898
- </div>
3899
- </div>
3900
- <div id="activity-cards" class="activity-tab-content active">
3901
- <div id="command-card" class="editing" tabindex="0">
3902
- <div class="cmd-label"><span class="cmd-key">C</span> Chat</div>
3903
- <div class="cmd-row">
3904
- <textarea id="command-card-input" rows="1" placeholder="Ask anything..."></textarea>
3905
- <kbd class="cmd-shortcut">C</kbd>
3906
- </div>
3907
- <div id="command-card-hint">Enter to send &middot; Esc to cancel</div>
3908
- </div>
3909
- <div id="activity-cards-active"></div>
3910
- <div id="activity-cards-recent"></div>
3911
- </div>
3912
- <div id="activity-list" class="activity-tab-content">
3913
- <div style="padding:16px;color:var(--text-muted);font-size:11px;text-align:center;">No activity yet</div>
3914
- </div>
3915
- </div>
3916
-
3917
- <!-- Loading/error overlay -->
3918
- <div id="overlay">
3919
- <div class="spinner"></div>
3920
- <div id="overlay-message">Loading graph…</div>
3921
- <div id="overlay-error"></div>
3922
- <button id="overlay-retry">Retry</button>
3923
- </div>
3924
-
3925
- <!-- File Viewer Modal -->
3926
- <div id="file-viewer-modal">
3927
- <div class="file-viewer-container">
3928
- <div class="file-viewer-header">
3929
- <span class="file-viewer-path" id="file-viewer-path"></span>
3930
- <button class="file-viewer-close" id="file-viewer-close">&times;</button>
3931
- </div>
3932
- <div class="file-viewer-body" id="file-viewer-body"></div>
3933
- </div>
3934
- </div>
3935
-
3936
- <div id="version-label"></div>
3937
- <script src="/public/app.js?v=28"></script>
3938
- </body>
3939
- </html>