claude-code-workflow 6.3.11 → 6.3.13

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 (33) hide show
  1. package/.claude/CLAUDE.md +33 -33
  2. package/.claude/agents/issue-plan-agent.md +77 -5
  3. package/.claude/agents/issue-queue-agent.md +122 -18
  4. package/.claude/commands/issue/execute.md +53 -40
  5. package/.claude/commands/issue/new.md +113 -11
  6. package/.claude/commands/issue/plan.md +112 -37
  7. package/.claude/commands/issue/queue.md +28 -18
  8. package/.claude/skills/software-manual/scripts/assemble_docsify.py +584 -0
  9. package/.claude/skills/software-manual/templates/css/docsify-base.css +984 -0
  10. package/.claude/skills/software-manual/templates/docsify-shell.html +466 -0
  11. package/.claude/workflows/cli-templates/schemas/issues-jsonl-schema.json +141 -168
  12. package/.claude/workflows/cli-templates/schemas/solution-schema.json +3 -2
  13. package/.codex/prompts/issue-execute.md +3 -3
  14. package/.codex/prompts/issue-queue.md +3 -3
  15. package/ccw/dist/commands/issue.d.ts.map +1 -1
  16. package/ccw/dist/commands/issue.js +2 -1
  17. package/ccw/dist/commands/issue.js.map +1 -1
  18. package/ccw/src/commands/issue.ts +2 -1
  19. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +580 -467
  20. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +532 -461
  21. package/ccw/src/templates/dashboard-js/components/notifications.js +774 -774
  22. package/ccw/src/templates/dashboard-js/i18n.js +4 -0
  23. package/ccw/src/templates/dashboard.html +10 -0
  24. package/ccw/src/tools/claude-cli-tools.ts +388 -388
  25. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  26. package/codex-lens/src/codexlens/config.py +19 -3
  27. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  28. package/codex-lens/src/codexlens/search/ranking.py +15 -4
  29. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  30. package/codex-lens/src/codexlens/semantic/vector_store.py +57 -47
  31. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-313.pyc +0 -0
  32. package/codex-lens/src/codexlens/storage/registry.py +114 -101
  33. package/package.json +83 -83
@@ -1,467 +1,580 @@
1
- /**
2
- * CLI Stream Viewer Styles
3
- * Right-side popup panel for viewing CLI streaming output
4
- */
5
-
6
- /* ===== Overlay ===== */
7
- .cli-stream-overlay {
8
- position: fixed;
9
- inset: 0;
10
- background: rgb(0 0 0 / 0.3);
11
- z-index: 1050;
12
- opacity: 0;
13
- visibility: hidden;
14
- transition: all 0.3s ease;
15
- }
16
-
17
- .cli-stream-overlay.open {
18
- opacity: 1;
19
- visibility: visible;
20
- }
21
-
22
- /* ===== Main Panel ===== */
23
- .cli-stream-viewer {
24
- position: fixed;
25
- top: 60px;
26
- right: 16px;
27
- width: 650px;
28
- max-width: calc(100vw - 32px);
29
- max-height: calc(100vh - 80px);
30
- background: hsl(var(--card));
31
- border: 1px solid hsl(var(--border));
32
- border-radius: 8px;
33
- box-shadow: 0 8px 32px rgb(0 0 0 / 0.2);
34
- z-index: 1100;
35
- display: flex;
36
- flex-direction: column;
37
- transform: translateX(calc(100% + 20px));
38
- opacity: 0;
39
- visibility: hidden;
40
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
41
- }
42
-
43
- .cli-stream-viewer.open {
44
- transform: translateX(0);
45
- opacity: 1;
46
- visibility: visible;
47
- }
48
-
49
- /* ===== Header ===== */
50
- .cli-stream-header {
51
- display: flex;
52
- align-items: center;
53
- justify-content: space-between;
54
- padding: 12px 16px;
55
- border-bottom: 1px solid hsl(var(--border));
56
- background: hsl(var(--muted) / 0.3);
57
- }
58
-
59
- .cli-stream-title {
60
- display: flex;
61
- align-items: center;
62
- gap: 8px;
63
- font-size: 0.875rem;
64
- font-weight: 600;
65
- color: hsl(var(--foreground));
66
- }
67
-
68
- .cli-stream-title svg,
69
- .cli-stream-title i {
70
- width: 18px;
71
- height: 18px;
72
- color: hsl(var(--primary));
73
- }
74
-
75
- .cli-stream-count-badge {
76
- display: inline-flex;
77
- align-items: center;
78
- justify-content: center;
79
- min-width: 20px;
80
- height: 20px;
81
- padding: 0 6px;
82
- background: hsl(var(--muted));
83
- color: hsl(var(--muted-foreground));
84
- border-radius: 10px;
85
- font-size: 0.6875rem;
86
- font-weight: 600;
87
- }
88
-
89
- .cli-stream-count-badge.has-running {
90
- background: hsl(var(--warning));
91
- color: hsl(var(--warning-foreground, white));
92
- }
93
-
94
- .cli-stream-actions {
95
- display: flex;
96
- align-items: center;
97
- gap: 8px;
98
- }
99
-
100
- .cli-stream-action-btn {
101
- display: flex;
102
- align-items: center;
103
- gap: 4px;
104
- padding: 4px 10px;
105
- background: transparent;
106
- border: 1px solid hsl(var(--border));
107
- border-radius: 4px;
108
- font-size: 0.75rem;
109
- color: hsl(var(--muted-foreground));
110
- cursor: pointer;
111
- transition: all 0.15s;
112
- }
113
-
114
- .cli-stream-action-btn:hover {
115
- background: hsl(var(--hover));
116
- color: hsl(var(--foreground));
117
- }
118
-
119
- .cli-stream-close-btn {
120
- display: flex;
121
- align-items: center;
122
- justify-content: center;
123
- width: 28px;
124
- height: 28px;
125
- padding: 0;
126
- background: transparent;
127
- border: none;
128
- border-radius: 4px;
129
- font-size: 1.25rem;
130
- color: hsl(var(--muted-foreground));
131
- cursor: pointer;
132
- transition: all 0.15s;
133
- }
134
-
135
- .cli-stream-close-btn:hover {
136
- background: hsl(var(--destructive) / 0.1);
137
- color: hsl(var(--destructive));
138
- }
139
-
140
- /* ===== Tab Bar ===== */
141
- .cli-stream-tabs {
142
- display: flex;
143
- gap: 2px;
144
- padding: 8px 12px;
145
- border-bottom: 1px solid hsl(var(--border));
146
- background: hsl(var(--muted) / 0.2);
147
- overflow-x: auto;
148
- scrollbar-width: thin;
149
- }
150
-
151
- .cli-stream-tabs::-webkit-scrollbar {
152
- height: 4px;
153
- }
154
-
155
- .cli-stream-tabs::-webkit-scrollbar-thumb {
156
- background: hsl(var(--border));
157
- border-radius: 2px;
158
- }
159
-
160
- .cli-stream-tab {
161
- display: flex;
162
- align-items: center;
163
- gap: 6px;
164
- padding: 6px 12px;
165
- background: transparent;
166
- border: 1px solid transparent;
167
- border-radius: 6px;
168
- font-size: 0.75rem;
169
- color: hsl(var(--muted-foreground));
170
- cursor: pointer;
171
- white-space: nowrap;
172
- transition: all 0.15s;
173
- }
174
-
175
- .cli-stream-tab:hover {
176
- background: hsl(var(--hover));
177
- color: hsl(var(--foreground));
178
- }
179
-
180
- .cli-stream-tab.active {
181
- background: hsl(var(--card));
182
- border-color: hsl(var(--primary));
183
- color: hsl(var(--foreground));
184
- box-shadow: 0 1px 3px rgb(0 0 0 / 0.1);
185
- }
186
-
187
- .cli-stream-tab-status {
188
- width: 8px;
189
- height: 8px;
190
- border-radius: 50%;
191
- flex-shrink: 0;
192
- }
193
-
194
- .cli-stream-tab-status.running {
195
- background: hsl(var(--warning));
196
- animation: streamStatusPulse 1.5s ease-in-out infinite;
197
- }
198
-
199
- .cli-stream-tab-status.completed {
200
- background: hsl(var(--success));
201
- }
202
-
203
- .cli-stream-tab-status.error {
204
- background: hsl(var(--destructive));
205
- }
206
-
207
- @keyframes streamStatusPulse {
208
- 0%, 100% { opacity: 1; transform: scale(1); }
209
- 50% { opacity: 0.6; transform: scale(1.2); }
210
- }
211
-
212
- .cli-stream-tab-tool {
213
- font-weight: 500;
214
- text-transform: capitalize;
215
- }
216
-
217
- .cli-stream-tab-mode {
218
- font-size: 0.625rem;
219
- padding: 1px 4px;
220
- background: hsl(var(--muted));
221
- border-radius: 3px;
222
- color: hsl(var(--muted-foreground));
223
- }
224
-
225
- .cli-stream-tab-close {
226
- display: flex;
227
- align-items: center;
228
- justify-content: center;
229
- width: 16px;
230
- height: 16px;
231
- margin-left: 4px;
232
- background: transparent;
233
- border: none;
234
- border-radius: 50%;
235
- font-size: 0.75rem;
236
- color: hsl(var(--muted-foreground));
237
- cursor: pointer;
238
- opacity: 0;
239
- transition: all 0.15s;
240
- }
241
-
242
- .cli-stream-tab:hover .cli-stream-tab-close {
243
- opacity: 1;
244
- }
245
-
246
- .cli-stream-tab-close:hover {
247
- background: hsl(var(--destructive) / 0.2);
248
- color: hsl(var(--destructive));
249
- }
250
-
251
- .cli-stream-tab-close.disabled {
252
- cursor: not-allowed;
253
- opacity: 0.3 !important;
254
- }
255
-
256
- /* ===== Empty State ===== */
257
- .cli-stream-empty {
258
- display: flex;
259
- flex-direction: column;
260
- align-items: center;
261
- justify-content: center;
262
- padding: 48px 24px;
263
- color: hsl(var(--muted-foreground));
264
- text-align: center;
265
- }
266
-
267
- .cli-stream-empty svg,
268
- .cli-stream-empty i {
269
- width: 48px;
270
- height: 48px;
271
- margin-bottom: 16px;
272
- opacity: 0.5;
273
- }
274
-
275
- .cli-stream-empty-title {
276
- font-size: 0.875rem;
277
- font-weight: 500;
278
- margin-bottom: 4px;
279
- }
280
-
281
- .cli-stream-empty-hint {
282
- font-size: 0.75rem;
283
- opacity: 0.7;
284
- }
285
-
286
- /* ===== Terminal Content ===== */
287
- .cli-stream-content {
288
- flex: 1;
289
- min-height: 300px;
290
- max-height: 500px;
291
- overflow-y: auto;
292
- padding: 12px 16px;
293
- background: hsl(220 13% 8%);
294
- font-family: var(--font-mono, 'Consolas', 'Monaco', 'Courier New', monospace);
295
- font-size: 0.75rem;
296
- line-height: 1.6;
297
- scrollbar-width: thin;
298
- }
299
-
300
- .cli-stream-content::-webkit-scrollbar {
301
- width: 8px;
302
- }
303
-
304
- .cli-stream-content::-webkit-scrollbar-track {
305
- background: transparent;
306
- }
307
-
308
- .cli-stream-content::-webkit-scrollbar-thumb {
309
- background: hsl(0 0% 40%);
310
- border-radius: 4px;
311
- }
312
-
313
- .cli-stream-line {
314
- white-space: pre-wrap;
315
- word-break: break-all;
316
- margin: 0;
317
- padding: 0;
318
- }
319
-
320
- .cli-stream-line.stdout {
321
- color: hsl(0 0% 85%);
322
- }
323
-
324
- .cli-stream-line.stderr {
325
- color: hsl(8 75% 65%);
326
- }
327
-
328
- .cli-stream-line.system {
329
- color: hsl(210 80% 65%);
330
- font-style: italic;
331
- }
332
-
333
- .cli-stream-line.info {
334
- color: hsl(200 80% 70%);
335
- }
336
-
337
- /* Auto-scroll indicator */
338
- .cli-stream-scroll-btn {
339
- position: sticky;
340
- bottom: 8px;
341
- left: 50%;
342
- transform: translateX(-50%);
343
- display: inline-flex;
344
- align-items: center;
345
- gap: 4px;
346
- padding: 4px 12px;
347
- background: hsl(var(--primary));
348
- color: white;
349
- border: none;
350
- border-radius: 12px;
351
- font-size: 0.625rem;
352
- cursor: pointer;
353
- opacity: 0;
354
- transition: opacity 0.2s;
355
- }
356
-
357
- .cli-stream-content.has-new-content .cli-stream-scroll-btn {
358
- opacity: 1;
359
- }
360
-
361
- /* ===== Status Bar ===== */
362
- .cli-stream-status {
363
- display: flex;
364
- align-items: center;
365
- justify-content: space-between;
366
- padding: 8px 16px;
367
- border-top: 1px solid hsl(var(--border));
368
- background: hsl(var(--muted) / 0.3);
369
- font-size: 0.6875rem;
370
- color: hsl(var(--muted-foreground));
371
- }
372
-
373
- .cli-stream-status-info {
374
- display: flex;
375
- align-items: center;
376
- gap: 12px;
377
- }
378
-
379
- .cli-stream-status-item {
380
- display: flex;
381
- align-items: center;
382
- gap: 4px;
383
- }
384
-
385
- .cli-stream-status-item svg,
386
- .cli-stream-status-item i {
387
- width: 12px;
388
- height: 12px;
389
- }
390
-
391
- .cli-stream-status-actions {
392
- display: flex;
393
- align-items: center;
394
- gap: 8px;
395
- }
396
-
397
- .cli-stream-toggle-btn {
398
- display: flex;
399
- align-items: center;
400
- gap: 4px;
401
- padding: 2px 8px;
402
- background: transparent;
403
- border: 1px solid hsl(var(--border));
404
- border-radius: 3px;
405
- font-size: 0.625rem;
406
- color: hsl(var(--muted-foreground));
407
- cursor: pointer;
408
- transition: all 0.15s;
409
- }
410
-
411
- .cli-stream-toggle-btn:hover {
412
- background: hsl(var(--hover));
413
- }
414
-
415
- .cli-stream-toggle-btn.active {
416
- background: hsl(var(--primary) / 0.1);
417
- border-color: hsl(var(--primary));
418
- color: hsl(var(--primary));
419
- }
420
-
421
- /* ===== Header Button & Badge ===== */
422
- .cli-stream-btn {
423
- position: relative;
424
- }
425
-
426
- .cli-stream-badge {
427
- position: absolute;
428
- top: -2px;
429
- right: -2px;
430
- min-width: 14px;
431
- height: 14px;
432
- padding: 0 4px;
433
- background: hsl(var(--warning));
434
- color: white;
435
- border-radius: 7px;
436
- font-size: 0.5625rem;
437
- font-weight: 600;
438
- display: none;
439
- align-items: center;
440
- justify-content: center;
441
- }
442
-
443
- .cli-stream-badge.has-running {
444
- display: flex;
445
- animation: streamBadgePulse 1.5s ease-in-out infinite;
446
- }
447
-
448
- @keyframes streamBadgePulse {
449
- 0%, 100% { transform: scale(1); }
450
- 50% { transform: scale(1.15); }
451
- }
452
-
453
- /* ===== Responsive ===== */
454
- @media (max-width: 768px) {
455
- .cli-stream-viewer {
456
- top: 56px;
457
- right: 8px;
458
- left: 8px;
459
- width: auto;
460
- max-height: calc(100vh - 72px);
461
- }
462
-
463
- .cli-stream-content {
464
- min-height: 200px;
465
- max-height: 350px;
466
- }
467
- }
1
+ /**
2
+ * CLI Stream Viewer Styles
3
+ * Right-side popup panel for viewing CLI streaming output
4
+ */
5
+
6
+ /* ===== Overlay ===== */
7
+ .cli-stream-overlay {
8
+ position: fixed;
9
+ inset: 0;
10
+ background: rgb(0 0 0 / 0.3);
11
+ z-index: 1050;
12
+ opacity: 0;
13
+ visibility: hidden;
14
+ transition: all 0.3s ease;
15
+ }
16
+
17
+ .cli-stream-overlay.open {
18
+ opacity: 1;
19
+ visibility: visible;
20
+ }
21
+
22
+ /* ===== Main Panel ===== */
23
+ .cli-stream-viewer {
24
+ position: fixed;
25
+ top: 60px;
26
+ right: 16px;
27
+ width: 650px;
28
+ max-width: calc(100vw - 32px);
29
+ max-height: calc(100vh - 80px);
30
+ background: hsl(var(--card));
31
+ border: 1px solid hsl(var(--border));
32
+ border-radius: 8px;
33
+ box-shadow: 0 8px 32px rgb(0 0 0 / 0.2);
34
+ z-index: 1100;
35
+ display: flex;
36
+ flex-direction: column;
37
+ transform: translateX(calc(100% + 20px));
38
+ opacity: 0;
39
+ visibility: hidden;
40
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
41
+ }
42
+
43
+ .cli-stream-viewer.open {
44
+ transform: translateX(0);
45
+ opacity: 1;
46
+ visibility: visible;
47
+ }
48
+
49
+ /* ===== Header ===== */
50
+ .cli-stream-header {
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: space-between;
54
+ padding: 12px 16px;
55
+ border-bottom: 1px solid hsl(var(--border));
56
+ background: hsl(var(--muted) / 0.3);
57
+ }
58
+
59
+ .cli-stream-title {
60
+ display: flex;
61
+ align-items: center;
62
+ gap: 8px;
63
+ font-size: 0.875rem;
64
+ font-weight: 600;
65
+ color: hsl(var(--foreground));
66
+ }
67
+
68
+ .cli-stream-title svg,
69
+ .cli-stream-title i {
70
+ width: 18px;
71
+ height: 18px;
72
+ color: hsl(var(--primary));
73
+ }
74
+
75
+ .cli-stream-count-badge {
76
+ display: inline-flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ min-width: 20px;
80
+ height: 20px;
81
+ padding: 0 6px;
82
+ background: hsl(var(--muted));
83
+ color: hsl(var(--muted-foreground));
84
+ border-radius: 10px;
85
+ font-size: 0.6875rem;
86
+ font-weight: 600;
87
+ }
88
+
89
+ .cli-stream-count-badge.has-running {
90
+ background: hsl(var(--warning));
91
+ color: hsl(var(--warning-foreground, white));
92
+ }
93
+
94
+ /* ===== Search Box ===== */
95
+ .cli-stream-search {
96
+ display: flex;
97
+ align-items: center;
98
+ gap: 4px;
99
+ padding: 4px 8px;
100
+ background: hsl(var(--background));
101
+ border: 1px solid hsl(var(--border));
102
+ border-radius: 6px;
103
+ transition: all 0.2s;
104
+ }
105
+
106
+ .cli-stream-search:focus-within {
107
+ border-color: hsl(var(--primary));
108
+ box-shadow: 0 0 0 2px hsl(var(--primary) / 0.1);
109
+ }
110
+
111
+ .cli-stream-search-input {
112
+ width: 140px;
113
+ padding: 2px 4px;
114
+ background: transparent;
115
+ border: none;
116
+ outline: none;
117
+ font-size: 0.75rem;
118
+ color: hsl(var(--foreground));
119
+ }
120
+
121
+ .cli-stream-search-input::placeholder {
122
+ color: hsl(var(--muted-foreground));
123
+ }
124
+
125
+ .cli-stream-search-icon {
126
+ width: 14px;
127
+ height: 14px;
128
+ color: hsl(var(--muted-foreground));
129
+ flex-shrink: 0;
130
+ }
131
+
132
+ .cli-stream-search-clear {
133
+ display: flex;
134
+ align-items: center;
135
+ justify-content: center;
136
+ width: 16px;
137
+ height: 16px;
138
+ padding: 0;
139
+ background: transparent;
140
+ border: none;
141
+ border-radius: 50%;
142
+ font-size: 0.75rem;
143
+ color: hsl(var(--muted-foreground));
144
+ cursor: pointer;
145
+ opacity: 0;
146
+ transition: all 0.15s;
147
+ }
148
+
149
+ .cli-stream-search:focus-within .cli-stream-search-clear,
150
+ .cli-stream-search-input:not(:placeholder-shown) + .cli-stream-search-clear {
151
+ opacity: 1;
152
+ }
153
+
154
+ .cli-stream-search-clear:hover {
155
+ background: hsl(var(--muted));
156
+ color: hsl(var(--foreground));
157
+ }
158
+
159
+ .cli-stream-actions {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: 8px;
163
+ }
164
+
165
+ .cli-stream-action-btn {
166
+ display: flex;
167
+ align-items: center;
168
+ gap: 4px;
169
+ padding: 4px 10px;
170
+ background: transparent;
171
+ border: 1px solid hsl(var(--border));
172
+ border-radius: 4px;
173
+ font-size: 0.75rem;
174
+ color: hsl(var(--muted-foreground));
175
+ cursor: pointer;
176
+ transition: all 0.15s;
177
+ }
178
+
179
+ .cli-stream-action-btn:hover {
180
+ background: hsl(var(--hover));
181
+ color: hsl(var(--foreground));
182
+ }
183
+
184
+ .cli-stream-close-btn {
185
+ display: flex;
186
+ align-items: center;
187
+ justify-content: center;
188
+ width: 28px;
189
+ height: 28px;
190
+ padding: 0;
191
+ background: transparent;
192
+ border: none;
193
+ border-radius: 4px;
194
+ font-size: 1.25rem;
195
+ color: hsl(var(--muted-foreground));
196
+ cursor: pointer;
197
+ transition: all 0.15s;
198
+ }
199
+
200
+ .cli-stream-close-btn:hover {
201
+ background: hsl(var(--destructive) / 0.1);
202
+ color: hsl(var(--destructive));
203
+ }
204
+
205
+ /* ===== Tab Bar ===== */
206
+ .cli-stream-tabs {
207
+ display: flex;
208
+ gap: 2px;
209
+ padding: 8px 12px;
210
+ border-bottom: 1px solid hsl(var(--border));
211
+ background: hsl(var(--muted) / 0.2);
212
+ overflow-x: auto;
213
+ scrollbar-width: thin;
214
+ }
215
+
216
+ .cli-stream-tabs::-webkit-scrollbar {
217
+ height: 4px;
218
+ }
219
+
220
+ .cli-stream-tabs::-webkit-scrollbar-thumb {
221
+ background: hsl(var(--border));
222
+ border-radius: 2px;
223
+ }
224
+
225
+ .cli-stream-tab {
226
+ display: flex;
227
+ align-items: center;
228
+ gap: 6px;
229
+ padding: 6px 12px;
230
+ background: transparent;
231
+ border: 1px solid transparent;
232
+ border-radius: 6px;
233
+ font-size: 0.75rem;
234
+ color: hsl(var(--muted-foreground));
235
+ cursor: pointer;
236
+ white-space: nowrap;
237
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
238
+ }
239
+
240
+ .cli-stream-tab:hover {
241
+ background: hsl(var(--hover));
242
+ color: hsl(var(--foreground));
243
+ transform: translateY(-1px);
244
+ }
245
+
246
+ .cli-stream-tab.active {
247
+ background: hsl(var(--card));
248
+ border-color: hsl(var(--primary));
249
+ color: hsl(var(--foreground));
250
+ box-shadow: 0 2px 8px rgb(0 0 0 / 0.15);
251
+ transform: translateY(-1px);
252
+ }
253
+
254
+ .cli-stream-tab.active .cli-stream-tab-tool {
255
+ color: hsl(var(--primary));
256
+ }
257
+
258
+ .cli-stream-tab-status {
259
+ width: 8px;
260
+ height: 8px;
261
+ border-radius: 50%;
262
+ flex-shrink: 0;
263
+ }
264
+
265
+ .cli-stream-tab-status.running {
266
+ background: hsl(var(--warning));
267
+ animation: streamStatusPulse 1.5s ease-in-out infinite;
268
+ }
269
+
270
+ .cli-stream-tab-status.completed {
271
+ background: hsl(var(--success));
272
+ }
273
+
274
+ .cli-stream-tab-status.error {
275
+ background: hsl(var(--destructive));
276
+ }
277
+
278
+ @keyframes streamStatusPulse {
279
+ 0%, 100% { opacity: 1; transform: scale(1); }
280
+ 50% { opacity: 0.6; transform: scale(1.2); }
281
+ }
282
+
283
+ .cli-stream-tab-tool {
284
+ font-weight: 500;
285
+ text-transform: capitalize;
286
+ }
287
+
288
+ .cli-stream-tab-mode {
289
+ font-size: 0.625rem;
290
+ padding: 1px 4px;
291
+ background: hsl(var(--muted));
292
+ border-radius: 3px;
293
+ color: hsl(var(--muted-foreground));
294
+ }
295
+
296
+ .cli-stream-tab-close {
297
+ display: flex;
298
+ align-items: center;
299
+ justify-content: center;
300
+ width: 16px;
301
+ height: 16px;
302
+ margin-left: 4px;
303
+ background: transparent;
304
+ border: none;
305
+ border-radius: 50%;
306
+ font-size: 0.75rem;
307
+ color: hsl(var(--muted-foreground));
308
+ cursor: pointer;
309
+ opacity: 0;
310
+ transition: all 0.15s;
311
+ }
312
+
313
+ .cli-stream-tab:hover .cli-stream-tab-close {
314
+ opacity: 1;
315
+ }
316
+
317
+ .cli-stream-tab-close:hover {
318
+ background: hsl(var(--destructive) / 0.2);
319
+ color: hsl(var(--destructive));
320
+ }
321
+
322
+ .cli-stream-tab-close.disabled {
323
+ cursor: not-allowed;
324
+ opacity: 0.3 !important;
325
+ }
326
+
327
+ /* ===== Empty State ===== */
328
+ .cli-stream-empty {
329
+ display: flex;
330
+ flex-direction: column;
331
+ align-items: center;
332
+ justify-content: center;
333
+ padding: 48px 24px;
334
+ color: hsl(var(--muted-foreground));
335
+ text-align: center;
336
+ }
337
+
338
+ .cli-stream-empty svg,
339
+ .cli-stream-empty i {
340
+ width: 48px;
341
+ height: 48px;
342
+ margin-bottom: 16px;
343
+ opacity: 0.5;
344
+ }
345
+
346
+ .cli-stream-empty-title {
347
+ font-size: 0.875rem;
348
+ font-weight: 500;
349
+ margin-bottom: 4px;
350
+ }
351
+
352
+ .cli-stream-empty-hint {
353
+ font-size: 0.75rem;
354
+ opacity: 0.7;
355
+ }
356
+
357
+ /* ===== Terminal Content ===== */
358
+ .cli-stream-content {
359
+ flex: 1;
360
+ min-height: 300px;
361
+ max-height: 500px;
362
+ overflow-y: auto;
363
+ padding: 12px 16px;
364
+ background: hsl(220 13% 8%);
365
+ font-family: var(--font-mono, 'Consolas', 'Monaco', 'Courier New', monospace);
366
+ font-size: 0.75rem;
367
+ line-height: 1.6;
368
+ scrollbar-width: thin;
369
+ }
370
+
371
+ .cli-stream-content::-webkit-scrollbar {
372
+ width: 8px;
373
+ }
374
+
375
+ .cli-stream-content::-webkit-scrollbar-track {
376
+ background: transparent;
377
+ }
378
+
379
+ .cli-stream-content::-webkit-scrollbar-thumb {
380
+ background: hsl(0 0% 40%);
381
+ border-radius: 4px;
382
+ }
383
+
384
+ .cli-stream-line {
385
+ white-space: pre-wrap;
386
+ word-break: break-all;
387
+ margin: 0;
388
+ padding: 2px 0;
389
+ border-radius: 2px;
390
+ transition: background-color 0.15s;
391
+ }
392
+
393
+ .cli-stream-line:hover {
394
+ background: hsl(0 0% 100% / 0.03);
395
+ }
396
+
397
+ .cli-stream-line.stdout {
398
+ color: hsl(0 0% 85%);
399
+ }
400
+
401
+ .cli-stream-line.stderr {
402
+ color: hsl(8 75% 65%);
403
+ background: hsl(8 75% 65% / 0.05);
404
+ }
405
+
406
+ .cli-stream-line.system {
407
+ color: hsl(210 80% 65%);
408
+ font-style: italic;
409
+ padding-left: 8px;
410
+ border-left: 2px solid hsl(210 80% 65% / 0.5);
411
+ }
412
+
413
+ .cli-stream-line.info {
414
+ color: hsl(200 80% 70%);
415
+ }
416
+
417
+ /* JSON/Code syntax coloring in output */
418
+ .cli-stream-line .json-key {
419
+ color: hsl(200 80% 70%);
420
+ }
421
+
422
+ .cli-stream-line .json-string {
423
+ color: hsl(100 50% 60%);
424
+ }
425
+
426
+ .cli-stream-line .json-number {
427
+ color: hsl(40 80% 65%);
428
+ }
429
+
430
+ /* Search highlight */
431
+ .cli-stream-highlight {
432
+ background: hsl(50 100% 50% / 0.4);
433
+ color: inherit;
434
+ padding: 0 2px;
435
+ border-radius: 2px;
436
+ }
437
+
438
+ /* Filter result info */
439
+ .cli-stream-filter-info {
440
+ display: inline-block;
441
+ padding: 4px 10px;
442
+ margin-bottom: 8px;
443
+ background: hsl(var(--primary) / 0.15);
444
+ color: hsl(var(--primary));
445
+ border-radius: 4px;
446
+ font-size: 0.6875rem;
447
+ font-weight: 500;
448
+ }
449
+
450
+ /* Auto-scroll indicator */
451
+ .cli-stream-scroll-btn {
452
+ position: sticky;
453
+ bottom: 8px;
454
+ left: 50%;
455
+ transform: translateX(-50%);
456
+ display: inline-flex;
457
+ align-items: center;
458
+ gap: 4px;
459
+ padding: 4px 12px;
460
+ background: hsl(var(--primary));
461
+ color: white;
462
+ border: none;
463
+ border-radius: 12px;
464
+ font-size: 0.625rem;
465
+ cursor: pointer;
466
+ opacity: 0;
467
+ transition: opacity 0.2s;
468
+ }
469
+
470
+ .cli-stream-content.has-new-content .cli-stream-scroll-btn {
471
+ opacity: 1;
472
+ }
473
+
474
+ /* ===== Status Bar ===== */
475
+ .cli-stream-status {
476
+ display: flex;
477
+ align-items: center;
478
+ justify-content: space-between;
479
+ padding: 8px 16px;
480
+ border-top: 1px solid hsl(var(--border));
481
+ background: hsl(var(--muted) / 0.3);
482
+ font-size: 0.6875rem;
483
+ color: hsl(var(--muted-foreground));
484
+ }
485
+
486
+ .cli-stream-status-info {
487
+ display: flex;
488
+ align-items: center;
489
+ gap: 12px;
490
+ }
491
+
492
+ .cli-stream-status-item {
493
+ display: flex;
494
+ align-items: center;
495
+ gap: 4px;
496
+ }
497
+
498
+ .cli-stream-status-item svg,
499
+ .cli-stream-status-item i {
500
+ width: 12px;
501
+ height: 12px;
502
+ }
503
+
504
+ .cli-stream-status-actions {
505
+ display: flex;
506
+ align-items: center;
507
+ gap: 8px;
508
+ }
509
+
510
+ .cli-stream-toggle-btn {
511
+ display: flex;
512
+ align-items: center;
513
+ gap: 4px;
514
+ padding: 2px 8px;
515
+ background: transparent;
516
+ border: 1px solid hsl(var(--border));
517
+ border-radius: 3px;
518
+ font-size: 0.625rem;
519
+ color: hsl(var(--muted-foreground));
520
+ cursor: pointer;
521
+ transition: all 0.15s;
522
+ }
523
+
524
+ .cli-stream-toggle-btn:hover {
525
+ background: hsl(var(--hover));
526
+ }
527
+
528
+ .cli-stream-toggle-btn.active {
529
+ background: hsl(var(--primary) / 0.1);
530
+ border-color: hsl(var(--primary));
531
+ color: hsl(var(--primary));
532
+ }
533
+
534
+ /* ===== Header Button & Badge ===== */
535
+ .cli-stream-btn {
536
+ position: relative;
537
+ }
538
+
539
+ .cli-stream-badge {
540
+ position: absolute;
541
+ top: -2px;
542
+ right: -2px;
543
+ min-width: 14px;
544
+ height: 14px;
545
+ padding: 0 4px;
546
+ background: hsl(var(--warning));
547
+ color: white;
548
+ border-radius: 7px;
549
+ font-size: 0.5625rem;
550
+ font-weight: 600;
551
+ display: none;
552
+ align-items: center;
553
+ justify-content: center;
554
+ }
555
+
556
+ .cli-stream-badge.has-running {
557
+ display: flex;
558
+ animation: streamBadgePulse 1.5s ease-in-out infinite;
559
+ }
560
+
561
+ @keyframes streamBadgePulse {
562
+ 0%, 100% { transform: scale(1); }
563
+ 50% { transform: scale(1.15); }
564
+ }
565
+
566
+ /* ===== Responsive ===== */
567
+ @media (max-width: 768px) {
568
+ .cli-stream-viewer {
569
+ top: 56px;
570
+ right: 8px;
571
+ left: 8px;
572
+ width: auto;
573
+ max-height: calc(100vh - 72px);
574
+ }
575
+
576
+ .cli-stream-content {
577
+ min-height: 200px;
578
+ max-height: 350px;
579
+ }
580
+ }