@akiojin/gwt 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 (132) hide show
  1. package/README.ja.md +323 -0
  2. package/README.md +347 -0
  3. package/bin/gwt.js +5 -0
  4. package/package.json +125 -0
  5. package/src/claude-history.ts +717 -0
  6. package/src/claude.ts +292 -0
  7. package/src/cli/ui/__tests__/SKIPPED_TESTS.md +119 -0
  8. package/src/cli/ui/__tests__/acceptance/branchList.acceptance.test.tsx.skip +239 -0
  9. package/src/cli/ui/__tests__/acceptance/navigation.acceptance.test.tsx +214 -0
  10. package/src/cli/ui/__tests__/acceptance/realtimeUpdate.acceptance.test.tsx.skip +219 -0
  11. package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +183 -0
  12. package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +313 -0
  13. package/src/cli/ui/__tests__/components/App.test.tsx +270 -0
  14. package/src/cli/ui/__tests__/components/common/Confirm.test.tsx +66 -0
  15. package/src/cli/ui/__tests__/components/common/ErrorBoundary.test.tsx +103 -0
  16. package/src/cli/ui/__tests__/components/common/Input.test.tsx +92 -0
  17. package/src/cli/ui/__tests__/components/common/LoadingIndicator.test.tsx +127 -0
  18. package/src/cli/ui/__tests__/components/common/Select.memo.test.tsx +264 -0
  19. package/src/cli/ui/__tests__/components/common/Select.test.tsx +246 -0
  20. package/src/cli/ui/__tests__/components/parts/Footer.test.tsx +62 -0
  21. package/src/cli/ui/__tests__/components/parts/Header.test.tsx +54 -0
  22. package/src/cli/ui/__tests__/components/parts/ScrollableList.test.tsx +68 -0
  23. package/src/cli/ui/__tests__/components/parts/Stats.test.tsx +135 -0
  24. package/src/cli/ui/__tests__/components/screens/AIToolSelectorScreen.test.tsx +153 -0
  25. package/src/cli/ui/__tests__/components/screens/BranchCreatorScreen.test.tsx +215 -0
  26. package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +293 -0
  27. package/src/cli/ui/__tests__/components/screens/ExecutionModeSelectorScreen.test.tsx +161 -0
  28. package/src/cli/ui/__tests__/components/screens/PRCleanupScreen.test.tsx +215 -0
  29. package/src/cli/ui/__tests__/components/screens/SessionSelectorScreen.test.tsx +99 -0
  30. package/src/cli/ui/__tests__/components/screens/WorktreeManagerScreen.test.tsx +127 -0
  31. package/src/cli/ui/__tests__/hooks/useGitData.test.ts.skip +228 -0
  32. package/src/cli/ui/__tests__/hooks/useScreenState.test.ts +146 -0
  33. package/src/cli/ui/__tests__/hooks/useTerminalSize.test.ts +98 -0
  34. package/src/cli/ui/__tests__/integration/branchList.test.tsx.skip +253 -0
  35. package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +306 -0
  36. package/src/cli/ui/__tests__/integration/navigation.test.tsx +405 -0
  37. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx +505 -0
  38. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx.skip +216 -0
  39. package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +180 -0
  40. package/src/cli/ui/__tests__/performance/useMemoOptimization.test.tsx +237 -0
  41. package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +775 -0
  42. package/src/cli/ui/__tests__/utils/statisticsCalculator.test.ts +243 -0
  43. package/src/cli/ui/components/App.tsx +793 -0
  44. package/src/cli/ui/components/common/Confirm.tsx +40 -0
  45. package/src/cli/ui/components/common/ErrorBoundary.tsx +57 -0
  46. package/src/cli/ui/components/common/Input.tsx +36 -0
  47. package/src/cli/ui/components/common/LoadingIndicator.tsx +95 -0
  48. package/src/cli/ui/components/common/Select.tsx +216 -0
  49. package/src/cli/ui/components/parts/Footer.tsx +41 -0
  50. package/src/cli/ui/components/parts/Header.test.tsx +85 -0
  51. package/src/cli/ui/components/parts/Header.tsx +63 -0
  52. package/src/cli/ui/components/parts/MergeStatusList.tsx +75 -0
  53. package/src/cli/ui/components/parts/ProgressBar.tsx +73 -0
  54. package/src/cli/ui/components/parts/ScrollableList.tsx +24 -0
  55. package/src/cli/ui/components/parts/Stats.tsx +67 -0
  56. package/src/cli/ui/components/screens/AIToolSelectorScreen.tsx +116 -0
  57. package/src/cli/ui/components/screens/BatchMergeProgressScreen.tsx +70 -0
  58. package/src/cli/ui/components/screens/BatchMergeResultScreen.tsx +104 -0
  59. package/src/cli/ui/components/screens/BranchCreatorScreen.tsx +213 -0
  60. package/src/cli/ui/components/screens/BranchListScreen.tsx +299 -0
  61. package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +149 -0
  62. package/src/cli/ui/components/screens/PRCleanupScreen.tsx +167 -0
  63. package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +100 -0
  64. package/src/cli/ui/components/screens/WorktreeManagerScreen.tsx +117 -0
  65. package/src/cli/ui/hooks/useBatchMerge.ts +96 -0
  66. package/src/cli/ui/hooks/useGitData.ts +157 -0
  67. package/src/cli/ui/hooks/useScreenState.ts +44 -0
  68. package/src/cli/ui/hooks/useTerminalSize.ts +33 -0
  69. package/src/cli/ui/screens/BranchActionSelectorScreen.tsx +102 -0
  70. package/src/cli/ui/screens/__tests__/BranchActionSelectorScreen.test.tsx +151 -0
  71. package/src/cli/ui/types.ts +295 -0
  72. package/src/cli/ui/utils/baseBranch.ts +34 -0
  73. package/src/cli/ui/utils/branchFormatter.ts +222 -0
  74. package/src/cli/ui/utils/statisticsCalculator.ts +44 -0
  75. package/src/codex.ts +139 -0
  76. package/src/config/builtin-tools.ts +44 -0
  77. package/src/config/constants.ts +100 -0
  78. package/src/config/env-history.ts +45 -0
  79. package/src/config/index.ts +204 -0
  80. package/src/config/tools.ts +293 -0
  81. package/src/git.ts +1102 -0
  82. package/src/github.ts +158 -0
  83. package/src/index.test.ts +87 -0
  84. package/src/index.ts +684 -0
  85. package/src/index.ts.backup +1543 -0
  86. package/src/launcher.ts +142 -0
  87. package/src/repositories/git.repository.ts +129 -0
  88. package/src/repositories/github.repository.ts +83 -0
  89. package/src/repositories/worktree.repository.ts +69 -0
  90. package/src/services/BatchMergeService.ts +251 -0
  91. package/src/services/WorktreeOrchestrator.ts +115 -0
  92. package/src/services/__tests__/BatchMergeService.test.ts +518 -0
  93. package/src/services/__tests__/WorktreeOrchestrator.test.ts +258 -0
  94. package/src/services/dependency-installer.ts +199 -0
  95. package/src/services/git.service.ts +113 -0
  96. package/src/services/github.service.ts +61 -0
  97. package/src/services/worktree.service.ts +66 -0
  98. package/src/types/api.ts +241 -0
  99. package/src/types/tools.ts +235 -0
  100. package/src/utils/spinner.ts +54 -0
  101. package/src/utils/terminal.ts +272 -0
  102. package/src/utils.test.ts +43 -0
  103. package/src/utils.ts +60 -0
  104. package/src/web/client/index.html +12 -0
  105. package/src/web/client/src/components/BranchGraph.tsx +231 -0
  106. package/src/web/client/src/components/EnvEditor.tsx +145 -0
  107. package/src/web/client/src/components/Terminal.tsx +137 -0
  108. package/src/web/client/src/hooks/useBranches.ts +41 -0
  109. package/src/web/client/src/hooks/useConfig.ts +31 -0
  110. package/src/web/client/src/hooks/useSessions.ts +59 -0
  111. package/src/web/client/src/hooks/useWorktrees.ts +47 -0
  112. package/src/web/client/src/index.css +834 -0
  113. package/src/web/client/src/lib/api.ts +184 -0
  114. package/src/web/client/src/lib/websocket.ts +174 -0
  115. package/src/web/client/src/main.tsx +29 -0
  116. package/src/web/client/src/pages/BranchDetailPage.tsx +847 -0
  117. package/src/web/client/src/pages/BranchListPage.tsx +264 -0
  118. package/src/web/client/src/pages/ConfigManagementPage.tsx +203 -0
  119. package/src/web/client/src/router.tsx +27 -0
  120. package/src/web/client/vite.config.ts +21 -0
  121. package/src/web/server/env/importer.ts +54 -0
  122. package/src/web/server/index.ts +74 -0
  123. package/src/web/server/pty/manager.ts +189 -0
  124. package/src/web/server/routes/branches.ts +126 -0
  125. package/src/web/server/routes/config.ts +220 -0
  126. package/src/web/server/routes/index.ts +37 -0
  127. package/src/web/server/routes/sessions.ts +130 -0
  128. package/src/web/server/routes/worktrees.ts +108 -0
  129. package/src/web/server/services/branches.ts +368 -0
  130. package/src/web/server/services/worktrees.ts +85 -0
  131. package/src/web/server/websocket/handler.ts +180 -0
  132. package/src/worktree.ts +703 -0
@@ -0,0 +1,834 @@
1
+ :root {
2
+ --color-background: #050912;
3
+ --color-surface: #0f172a;
4
+ --color-surface-muted: #111c30;
5
+ --color-card: rgba(15, 23, 42, 0.92);
6
+ --color-border: rgba(148, 163, 184, 0.2);
7
+ --color-border-strong: rgba(148, 163, 184, 0.45);
8
+ --color-text: #e2e8f0;
9
+ --color-muted: #94a3b8;
10
+ --color-accent: #5eead4;
11
+ --color-accent-strong: #2dd4bf;
12
+ --color-warning: #fbbf24;
13
+ --color-error: #fb7185;
14
+ --color-success: #34d399;
15
+ --color-remote: #60a5fa;
16
+ --color-local: #c084fc;
17
+ --shadow-card: 0 20px 45px rgba(2, 6, 23, 0.55);
18
+ --shadow-soft: 0 10px 25px rgba(15, 23, 42, 0.45);
19
+ --radius-lg: 24px;
20
+ --radius-md: 16px;
21
+ --radius-pill: 999px;
22
+ font-family: "Inter", "Noto Sans JP", -apple-system, BlinkMacSystemFont, "Segoe UI",
23
+ "Helvetica Neue", Arial, sans-serif;
24
+ }
25
+
26
+ * {
27
+ box-sizing: border-box;
28
+ margin: 0;
29
+ padding: 0;
30
+ }
31
+
32
+ body {
33
+ font-family: "Inter", "Noto Sans JP", -apple-system, BlinkMacSystemFont, "Segoe UI",
34
+ "Helvetica Neue", Arial, sans-serif;
35
+ background: radial-gradient(circle at top, #0b1221, #050912 55%);
36
+ color: var(--color-text);
37
+ min-height: 100vh;
38
+ -webkit-font-smoothing: antialiased;
39
+ -moz-osx-font-smoothing: grayscale;
40
+ }
41
+
42
+ #root {
43
+ min-height: 100vh;
44
+ }
45
+
46
+ a {
47
+ color: var(--color-accent);
48
+ text-decoration: none;
49
+ }
50
+
51
+ a:hover {
52
+ color: var(--color-accent-strong);
53
+ }
54
+
55
+ button {
56
+ font: inherit;
57
+ }
58
+
59
+ .app-shell {
60
+ min-height: 100vh;
61
+ padding: 2.5rem 1.75rem 3rem;
62
+ background: linear-gradient(135deg, rgba(23, 37, 84, 0.45), rgba(8, 145, 178, 0.08));
63
+ }
64
+
65
+ @media (max-width: 768px) {
66
+ .app-shell {
67
+ padding: 1.5rem 1rem 2rem;
68
+ }
69
+ }
70
+
71
+ .page-hero {
72
+ background: radial-gradient(circle at 15% 20%, rgba(94, 234, 212, 0.25), transparent 55%),
73
+ radial-gradient(circle at 80% 0%, rgba(14, 165, 233, 0.2), transparent 45%),
74
+ var(--color-card);
75
+ border: 1px solid var(--color-border);
76
+ border-radius: var(--radius-lg);
77
+ padding: 2rem;
78
+ margin-bottom: 2rem;
79
+ box-shadow: var(--shadow-card);
80
+ }
81
+
82
+ .page-hero--compact {
83
+ padding: 1.75rem 2rem;
84
+ }
85
+
86
+ .page-hero__eyebrow {
87
+ letter-spacing: 0.3em;
88
+ text-transform: uppercase;
89
+ color: var(--color-muted);
90
+ font-size: 0.8rem;
91
+ margin-bottom: 0.75rem;
92
+ }
93
+
94
+ .page-hero h1 {
95
+ font-size: clamp(1.8rem, 3vw, 2.8rem);
96
+ margin-bottom: 0.5rem;
97
+ }
98
+
99
+ .page-hero__subtitle,
100
+ .page-hero__meta {
101
+ color: var(--color-muted);
102
+ margin-top: 0.5rem;
103
+ font-size: 0.95rem;
104
+ }
105
+
106
+ .page-hero__actions {
107
+ display: flex;
108
+ flex-wrap: wrap;
109
+ gap: 0.8rem;
110
+ margin-top: 1.5rem;
111
+ }
112
+
113
+ .page-content {
114
+ width: min(1400px, 100%);
115
+ margin: 0 auto;
116
+ display: flex;
117
+ flex-direction: column;
118
+ gap: 1.5rem;
119
+ }
120
+
121
+ .page-content--wide {
122
+ width: min(1600px, 100%);
123
+ }
124
+
125
+ .page-content--narrow {
126
+ max-width: 960px;
127
+ }
128
+
129
+ .metrics-grid {
130
+ display: grid;
131
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
132
+ gap: 1rem;
133
+ }
134
+
135
+ .metric-card {
136
+ background: var(--color-card);
137
+ border: 1px solid var(--color-border);
138
+ border-radius: var(--radius-md);
139
+ padding: 1.25rem;
140
+ box-shadow: var(--shadow-soft);
141
+ }
142
+
143
+ .metric-card__label {
144
+ font-size: 0.85rem;
145
+ text-transform: uppercase;
146
+ letter-spacing: 0.1em;
147
+ color: var(--color-muted);
148
+ }
149
+
150
+ .metric-card__value {
151
+ font-size: 2rem;
152
+ font-weight: 600;
153
+ margin-top: 0.25rem;
154
+ }
155
+
156
+ .metric-card__hint {
157
+ margin-top: 0.35rem;
158
+ color: var(--color-muted);
159
+ font-size: 0.85rem;
160
+ }
161
+
162
+ .page-layout {
163
+ display: flex;
164
+ flex-direction: column;
165
+ gap: 1rem;
166
+ }
167
+
168
+ .page-layout--split {
169
+ display: grid;
170
+ grid-template-columns: minmax(320px, 420px) minmax(0, 1fr);
171
+ gap: 1.5rem;
172
+ align-items: start;
173
+ }
174
+
175
+ @media (max-width: 1024px) {
176
+ .page-layout--split {
177
+ grid-template-columns: 1fr;
178
+ }
179
+ }
180
+
181
+ .info-stack {
182
+ display: flex;
183
+ flex-direction: column;
184
+ gap: 1rem;
185
+ }
186
+
187
+ .terminal-column {
188
+ position: relative;
189
+ min-height: 100%;
190
+ }
191
+
192
+ .toolbar {
193
+ display: flex;
194
+ gap: 1rem;
195
+ align-items: center;
196
+ flex-wrap: wrap;
197
+ }
198
+
199
+ .toolbar__field {
200
+ flex: 1;
201
+ display: flex;
202
+ align-items: center;
203
+ gap: 0.5rem;
204
+ background: var(--color-surface);
205
+ border-radius: var(--radius-md);
206
+ border: 1px solid var(--color-border);
207
+ padding: 0.75rem 1rem;
208
+ color: var(--color-muted);
209
+ }
210
+
211
+ .toolbar__icon {
212
+ font-size: 1rem;
213
+ }
214
+
215
+ .search-input {
216
+ flex: 1;
217
+ border: none;
218
+ background: transparent;
219
+ color: var(--color-text);
220
+ font-size: 1rem;
221
+ }
222
+
223
+ .search-input:focus {
224
+ outline: none;
225
+ }
226
+
227
+ .toolbar__count {
228
+ color: var(--color-muted);
229
+ font-size: 0.9rem;
230
+ }
231
+
232
+ .page-state {
233
+ background: var(--color-card);
234
+ border: 1px solid var(--color-border);
235
+ border-radius: var(--radius-lg);
236
+ padding: 2rem;
237
+ box-shadow: var(--shadow-soft);
238
+ }
239
+
240
+ .page-state h1,
241
+ .page-state h2,
242
+ .page-state h3 {
243
+ margin-bottom: 0.5rem;
244
+ }
245
+
246
+ .page-state--card {
247
+ text-align: left;
248
+ }
249
+
250
+ .page-state--centered {
251
+ text-align: center;
252
+ }
253
+
254
+ .empty-state {
255
+ text-align: center;
256
+ padding: 2.5rem 2rem;
257
+ border-radius: var(--radius-lg);
258
+ border: 1px dashed var(--color-border-strong);
259
+ background: rgba(15, 23, 42, 0.7);
260
+ }
261
+
262
+ .branch-grid {
263
+ display: grid;
264
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
265
+ gap: 1.25rem;
266
+ }
267
+
268
+ .branch-card {
269
+ background: var(--color-card);
270
+ border: 1px solid var(--color-border);
271
+ border-radius: var(--radius-lg);
272
+ padding: 1.5rem;
273
+ display: flex;
274
+ flex-direction: column;
275
+ gap: 1rem;
276
+ box-shadow: var(--shadow-soft);
277
+ }
278
+
279
+ .branch-card__header {
280
+ display: flex;
281
+ justify-content: space-between;
282
+ gap: 1rem;
283
+ flex-wrap: wrap;
284
+ }
285
+
286
+ .branch-card__header h2 {
287
+ font-size: 1.2rem;
288
+ word-break: break-all;
289
+ }
290
+
291
+ .branch-card__eyebrow {
292
+ color: var(--color-muted);
293
+ text-transform: uppercase;
294
+ letter-spacing: 0.1em;
295
+ font-size: 0.75rem;
296
+ margin-bottom: 0.35rem;
297
+ }
298
+
299
+ .branch-card__commit {
300
+ color: var(--color-muted);
301
+ line-height: 1.5;
302
+ }
303
+
304
+ .branch-card__actions {
305
+ display: flex;
306
+ justify-content: space-between;
307
+ gap: 0.75rem;
308
+ flex-wrap: wrap;
309
+ align-items: center;
310
+ }
311
+
312
+ .badge-group {
313
+ display: flex;
314
+ gap: 0.4rem;
315
+ flex-wrap: wrap;
316
+ }
317
+
318
+ .status-badge {
319
+ padding: 0.25rem 0.75rem;
320
+ border-radius: var(--radius-pill);
321
+ font-size: 0.8rem;
322
+ font-weight: 600;
323
+ border: 1px solid transparent;
324
+ }
325
+
326
+ .status-badge--local {
327
+ color: #fdf4ff;
328
+ background: rgba(192, 132, 252, 0.15);
329
+ border-color: rgba(192, 132, 252, 0.35);
330
+ }
331
+
332
+ .status-badge--remote {
333
+ color: #dbeafe;
334
+ background: rgba(96, 165, 250, 0.12);
335
+ border-color: rgba(96, 165, 250, 0.35);
336
+ }
337
+
338
+ .status-badge--success {
339
+ color: #042f2e;
340
+ background: rgba(52, 211, 153, 0.85);
341
+ border: none;
342
+ }
343
+
344
+ .status-badge--warning {
345
+ color: #451a03;
346
+ background: rgba(251, 191, 36, 0.9);
347
+ border: none;
348
+ }
349
+
350
+ .status-badge--muted {
351
+ color: var(--color-muted);
352
+ background: rgba(148, 163, 184, 0.15);
353
+ border-color: rgba(148, 163, 184, 0.4);
354
+ }
355
+
356
+ .pill-group {
357
+ display: flex;
358
+ gap: 0.5rem;
359
+ flex-wrap: wrap;
360
+ }
361
+
362
+ .pill {
363
+ padding: 0.25rem 0.85rem;
364
+ border-radius: var(--radius-pill);
365
+ background: rgba(148, 163, 184, 0.12);
366
+ color: var(--color-muted);
367
+ font-size: 0.85rem;
368
+ }
369
+
370
+ .pill--success {
371
+ background: rgba(52, 211, 153, 0.15);
372
+ color: var(--color-success);
373
+ }
374
+
375
+ .pill--warning {
376
+ background: rgba(251, 191, 36, 0.18);
377
+ color: var(--color-warning);
378
+ }
379
+
380
+ .info-pill {
381
+ font-size: 0.85rem;
382
+ padding: 0.3rem 0.85rem;
383
+ border-radius: var(--radius-pill);
384
+ border: 1px solid var(--color-border);
385
+ background: rgba(15, 23, 42, 0.65);
386
+ color: var(--color-muted);
387
+ }
388
+
389
+ .info-pill--success {
390
+ border-color: rgba(52, 211, 153, 0.45);
391
+ color: var(--color-success);
392
+ }
393
+
394
+ .info-pill--warning {
395
+ border-color: rgba(251, 191, 36, 0.45);
396
+ color: var(--color-warning);
397
+ }
398
+
399
+ .section-card {
400
+ background: var(--color-card);
401
+ border: 1px solid var(--color-border);
402
+ border-radius: var(--radius-lg);
403
+ padding: 1.75rem;
404
+ box-shadow: var(--shadow-soft);
405
+ display: flex;
406
+ flex-direction: column;
407
+ gap: 0.85rem;
408
+ }
409
+
410
+ .section-card__body {
411
+ color: var(--color-muted);
412
+ line-height: 1.6;
413
+ }
414
+
415
+ .metadata-grid {
416
+ display: grid;
417
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
418
+ gap: 1rem;
419
+ }
420
+
421
+ .metadata-grid--compact {
422
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
423
+ }
424
+
425
+ .metadata-grid dt {
426
+ font-size: 0.8rem;
427
+ text-transform: uppercase;
428
+ letter-spacing: 0.08em;
429
+ color: var(--color-muted);
430
+ }
431
+
432
+ .metadata-grid dd {
433
+ font-weight: 600;
434
+ margin-top: 0.25rem;
435
+ }
436
+
437
+ .list-muted {
438
+ list-style: none;
439
+ color: var(--color-muted);
440
+ line-height: 1.7;
441
+ }
442
+
443
+ .inline-banner {
444
+ margin-top: 1rem;
445
+ padding: 0.85rem 1.25rem;
446
+ border-radius: var(--radius-md);
447
+ font-weight: 500;
448
+ }
449
+
450
+ .inline-banner--success {
451
+ background: rgba(52, 211, 153, 0.15);
452
+ color: var(--color-success);
453
+ }
454
+
455
+ .inline-banner--error {
456
+ background: rgba(251, 113, 133, 0.18);
457
+ color: var(--color-error);
458
+ }
459
+
460
+ .inline-banner--info {
461
+ background: rgba(94, 234, 212, 0.12);
462
+ color: var(--color-accent);
463
+ }
464
+
465
+ .terminal-section {
466
+ gap: 1rem;
467
+ }
468
+
469
+ .terminal-surface {
470
+ border-radius: var(--radius-md);
471
+ border: 1px solid var(--color-border);
472
+ background: #050912;
473
+ min-height: clamp(380px, 70vh, 85vh);
474
+ height: clamp(380px, 70vh, 85vh);
475
+ overflow: hidden;
476
+ }
477
+
478
+ .button {
479
+ border-radius: var(--radius-pill);
480
+ padding: 0.65rem 1.5rem;
481
+ border: 1px solid transparent;
482
+ font-weight: 600;
483
+ cursor: pointer;
484
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
485
+ }
486
+
487
+ .button--primary {
488
+ background: linear-gradient(135deg, var(--color-accent), var(--color-accent-strong));
489
+ color: #04121a;
490
+ box-shadow: 0 10px 25px rgba(45, 212, 191, 0.4);
491
+ }
492
+
493
+ .button--secondary {
494
+ border-color: rgba(94, 234, 212, 0.5);
495
+ color: var(--color-accent);
496
+ background: transparent;
497
+ }
498
+
499
+ .button--ghost {
500
+ border-color: var(--color-border);
501
+ background: transparent;
502
+ color: var(--color-text);
503
+ }
504
+
505
+ .button:disabled {
506
+ opacity: 0.55;
507
+ cursor: not-allowed;
508
+ transform: none;
509
+ box-shadow: none;
510
+ }
511
+
512
+ .button:not(:disabled):hover {
513
+ transform: translateY(-1px);
514
+ }
515
+
516
+ .link-back {
517
+ display: inline-flex;
518
+ align-items: center;
519
+ font-size: 0.9rem;
520
+ color: var(--color-muted);
521
+ margin-bottom: 0.75rem;
522
+ }
523
+
524
+ .session-hint {
525
+ border-style: dashed;
526
+ border-color: rgba(94, 234, 212, 0.35);
527
+ }
528
+ .terminal-section__header {
529
+ display: flex;
530
+ justify-content: space-between;
531
+ gap: 1rem;
532
+ flex-wrap: wrap;
533
+ align-items: flex-start;
534
+ }
535
+
536
+ .terminal-section__controls {
537
+ display: flex;
538
+ gap: 0.5rem;
539
+ }
540
+
541
+ .terminal-overlay-backdrop {
542
+ position: fixed;
543
+ inset: 0;
544
+ background: rgba(2, 6, 23, 0.75);
545
+ backdrop-filter: blur(4px);
546
+ z-index: 900;
547
+ }
548
+
549
+ .terminal-section--fullscreen {
550
+ position: fixed;
551
+ inset: 2rem;
552
+ z-index: 1000;
553
+ width: calc(100vw - 4rem);
554
+ max-width: calc(100vw - 4rem);
555
+ height: calc(100vh - 4rem);
556
+ box-shadow: 0 30px 60px rgba(2, 6, 23, 0.7);
557
+ display: flex;
558
+ flex-direction: column;
559
+ }
560
+
561
+ @media (max-width: 768px) {
562
+ .terminal-section--fullscreen {
563
+ inset: 1rem;
564
+ width: calc(100vw - 2rem);
565
+ max-width: calc(100vw - 2rem);
566
+ height: calc(100vh - 2rem);
567
+ }
568
+ }
569
+
570
+ .terminal-section--fullscreen .terminal-surface {
571
+ flex: 1;
572
+ height: auto;
573
+ min-height: unset;
574
+ }
575
+
576
+ .terminal-section__close {
577
+ position: absolute;
578
+ top: 1rem;
579
+ right: 1rem;
580
+ width: 2.5rem;
581
+ height: 2.5rem;
582
+ border-radius: 50%;
583
+ border: 1px solid rgba(255, 255, 255, 0.2);
584
+ background: rgba(15, 23, 42, 0.8);
585
+ color: var(--color-text);
586
+ font-size: 1.25rem;
587
+ cursor: pointer;
588
+ }
589
+
590
+ .terminal-section__close:hover {
591
+ background: rgba(15, 23, 42, 0.95);
592
+ }
593
+
594
+ /* =======================
595
+ Branch Graph
596
+ ======================= */
597
+
598
+ .branch-graph-panel {
599
+ background: var(--color-card);
600
+ border: 1px solid var(--color-border);
601
+ border-radius: var(--radius-lg);
602
+ padding: 1.75rem 2rem;
603
+ box-shadow: var(--shadow-card);
604
+ }
605
+
606
+ .branch-graph-panel + .metrics-grid {
607
+ margin-top: 1.5rem;
608
+ }
609
+
610
+ .branch-graph-panel__header {
611
+ display: flex;
612
+ justify-content: space-between;
613
+ gap: 1.5rem;
614
+ flex-wrap: wrap;
615
+ margin-bottom: 1.5rem;
616
+ }
617
+
618
+ .branch-graph-panel__eyebrow {
619
+ letter-spacing: 0.3em;
620
+ text-transform: uppercase;
621
+ color: var(--color-muted);
622
+ font-size: 0.8rem;
623
+ margin-bottom: 0.25rem;
624
+ }
625
+
626
+ .branch-graph-panel__legend {
627
+ display: flex;
628
+ flex-wrap: wrap;
629
+ gap: 0.5rem;
630
+ align-items: center;
631
+ }
632
+
633
+ .branch-graph-panel__empty {
634
+ text-align: center;
635
+ color: var(--color-muted);
636
+ }
637
+
638
+ .graph-chip {
639
+ font-size: 0.75rem;
640
+ letter-spacing: 0.1em;
641
+ text-transform: uppercase;
642
+ padding: 0.35rem 0.75rem;
643
+ border-radius: var(--radius-pill);
644
+ border: 1px solid var(--color-border);
645
+ background: rgba(15, 23, 42, 0.7);
646
+ }
647
+
648
+ .graph-chip--base {
649
+ border-color: var(--color-accent);
650
+ color: var(--color-accent);
651
+ }
652
+
653
+ .graph-chip--local {
654
+ border-color: var(--color-local);
655
+ color: var(--color-local);
656
+ }
657
+
658
+ .graph-chip--remote {
659
+ border-color: var(--color-remote);
660
+ color: var(--color-remote);
661
+ }
662
+
663
+ .graph-chip--worktree {
664
+ border-color: var(--color-success);
665
+ color: var(--color-success);
666
+ }
667
+
668
+ .branch-graph {
669
+ display: flex;
670
+ flex-direction: column;
671
+ gap: 1.25rem;
672
+ }
673
+
674
+ .branch-graph__lane {
675
+ display: flex;
676
+ flex-direction: column;
677
+ gap: 0.75rem;
678
+ padding-bottom: 0.75rem;
679
+ border-bottom: 1px solid rgba(148, 163, 184, 0.2);
680
+ }
681
+
682
+ .branch-graph__lane:last-child {
683
+ border-bottom: none;
684
+ padding-bottom: 0;
685
+ }
686
+
687
+ .branch-graph__lane-heading {
688
+ display: flex;
689
+ justify-content: space-between;
690
+ align-items: baseline;
691
+ gap: 1rem;
692
+ flex-wrap: wrap;
693
+ }
694
+
695
+ .branch-graph__lane-label {
696
+ font-weight: 600;
697
+ }
698
+
699
+ .branch-graph__lane-meta {
700
+ margin-left: 0.5rem;
701
+ font-size: 0.75rem;
702
+ letter-spacing: 0.1em;
703
+ color: var(--color-muted);
704
+ }
705
+
706
+ .lane-meta--muted {
707
+ color: rgba(148, 163, 184, 0.6);
708
+ }
709
+
710
+ .branch-graph__lane-count {
711
+ color: var(--color-muted);
712
+ font-size: 0.85rem;
713
+ }
714
+
715
+ .branch-graph__track {
716
+ display: flex;
717
+ align-items: center;
718
+ gap: 1rem;
719
+ overflow-x: auto;
720
+ padding-bottom: 0.5rem;
721
+ }
722
+
723
+ .branch-graph__node-link {
724
+ position: relative;
725
+ text-decoration: none;
726
+ min-width: 180px;
727
+ flex-shrink: 0;
728
+ }
729
+
730
+ .branch-graph__node {
731
+ position: relative;
732
+ border: 1px solid var(--color-border);
733
+ border-radius: var(--radius-md);
734
+ padding: 0.85rem 1rem;
735
+ background: var(--color-surface-muted);
736
+ box-shadow: var(--shadow-soft);
737
+ }
738
+
739
+ .branch-graph__node::before {
740
+ content: "";
741
+ position: absolute;
742
+ width: 28px;
743
+ height: 2px;
744
+ background: var(--color-border-strong);
745
+ left: -22px;
746
+ top: 50%;
747
+ transform: translateY(-50%);
748
+ opacity: 0.6;
749
+ }
750
+
751
+ .branch-graph__node--base::before {
752
+ display: none;
753
+ }
754
+
755
+ .branch-graph__node--local {
756
+ border-color: rgba(192, 132, 252, 0.8);
757
+ box-shadow: 0 15px 35px rgba(148, 73, 255, 0.25);
758
+ }
759
+
760
+ .branch-graph__node--remote {
761
+ border-color: rgba(96, 165, 250, 0.8);
762
+ box-shadow: 0 15px 35px rgba(14, 165, 233, 0.25);
763
+ }
764
+
765
+ .branch-graph__node--merged {
766
+ background: rgba(37, 99, 235, 0.25);
767
+ }
768
+
769
+ .branch-graph__node--active {
770
+ background: rgba(8, 145, 178, 0.25);
771
+ }
772
+
773
+ .branch-graph__node-label {
774
+ font-weight: 600;
775
+ display: block;
776
+ }
777
+
778
+ .branch-graph__node-meta {
779
+ font-size: 0.75rem;
780
+ color: var(--color-muted);
781
+ }
782
+
783
+ .branch-graph__tooltip {
784
+ position: absolute;
785
+ bottom: calc(100% + 0.5rem);
786
+ left: 0;
787
+ background: var(--color-surface);
788
+ border: 1px solid var(--color-border-strong);
789
+ border-radius: var(--radius-md);
790
+ padding: 0.75rem;
791
+ width: min(260px, 60vw);
792
+ box-shadow: var(--shadow-card);
793
+ opacity: 0;
794
+ pointer-events: none;
795
+ transform: translateY(0.4rem);
796
+ transition:
797
+ opacity 0.15s ease,
798
+ transform 0.15s ease;
799
+ z-index: 5;
800
+ }
801
+
802
+ .branch-graph__tooltip p {
803
+ font-size: 0.8rem;
804
+ color: var(--color-text);
805
+ }
806
+
807
+ .branch-graph__tooltip p + p {
808
+ margin-top: 0.25rem;
809
+ color: var(--color-muted);
810
+ }
811
+
812
+ .branch-graph__node:hover .branch-graph__tooltip,
813
+ .branch-graph__node:focus-within .branch-graph__tooltip {
814
+ opacity: 1;
815
+ transform: translateY(0);
816
+ }
817
+
818
+ @media (max-width: 768px) {
819
+ .branch-graph__track {
820
+ flex-direction: column;
821
+ align-items: flex-start;
822
+ }
823
+
824
+ .branch-graph__node::before {
825
+ width: 2px;
826
+ height: 24px;
827
+ left: 50%;
828
+ top: -18px;
829
+ }
830
+
831
+ .branch-graph__node-link {
832
+ width: 100%;
833
+ }
834
+ }