@matt82198/aesop 0.1.0-beta.5 → 0.1.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 (198) hide show
  1. package/CHANGELOG.md +158 -5
  2. package/LICENSE +66 -21
  3. package/README.md +97 -33
  4. package/aesop.config.example.json +6 -0
  5. package/bin/CLAUDE.md +12 -3
  6. package/bin/cli.js +211 -40
  7. package/daemons/CLAUDE.md +1 -1
  8. package/daemons/backup-fleet.sh +209 -51
  9. package/daemons/run-watchdog.sh +208 -62
  10. package/dash/dash-extra.mjs +73 -4
  11. package/dash/watchdog-gui.sh +41 -35
  12. package/docs/ARCHITECTURE.md +296 -0
  13. package/docs/CONCEPTS.md +254 -0
  14. package/docs/CONFIGURE.md +256 -0
  15. package/docs/FIRST-WAVE.md +276 -0
  16. package/docs/INSTALL.md +224 -0
  17. package/docs/README.md +176 -27
  18. package/docs/autonomous-swe.md +149 -0
  19. package/docs/reproduce.md +121 -0
  20. package/hooks/CLAUDE.md +28 -0
  21. package/hooks/install-waveguard.sh +68 -0
  22. package/hooks/pre-commit-waveguard.sh +26 -0
  23. package/hooks/pre-push-policy.sh +253 -15
  24. package/monitor/CLAUDE.md +3 -3
  25. package/monitor/collect-signals.mjs +133 -20
  26. package/package.json +15 -7
  27. package/scan/CLAUDE.md +30 -0
  28. package/skills/CLAUDE.md +1 -0
  29. package/state_store/ingest.py +18 -1
  30. package/state_store/projections.py +78 -4
  31. package/state_store/store.py +102 -7
  32. package/tools/CLAUDE.md +25 -18
  33. package/tools/alert_bridge.py +14 -10
  34. package/tools/bench_runner.py +438 -0
  35. package/tools/buildlog.py +4 -7
  36. package/tools/ci_merge_wait.py +215 -34
  37. package/tools/common.py +62 -0
  38. package/tools/cost_ceiling.py +191 -0
  39. package/tools/dash.js +102 -0
  40. package/tools/doctor.js +220 -0
  41. package/tools/fleet_ledger.py +189 -17
  42. package/tools/halt.py +172 -0
  43. package/tools/healthcheck.py +24 -21
  44. package/tools/heartbeat.py +4 -7
  45. package/tools/metrics_gate.py +8 -2
  46. package/tools/orchestrator_status.py +4 -9
  47. package/tools/reconcile.py +277 -0
  48. package/tools/rotate_logs.py +152 -62
  49. package/tools/scanner_selftest.py +28 -3
  50. package/tools/secret_scan.py +359 -90
  51. package/tools/self_stats.py +292 -4
  52. package/tools/status.js +187 -0
  53. package/tools/verify_agent_inspector.py +289 -0
  54. package/tools/verify_prboard.py +344 -0
  55. package/tools/watch.js +49 -0
  56. package/ui/CLAUDE.md +2 -0
  57. package/ui/agents.py +332 -33
  58. package/ui/api/tracker.py +15 -7
  59. package/ui/collectors.py +125 -32
  60. package/ui/config.py +22 -2
  61. package/ui/cost.py +98 -3
  62. package/ui/csrf.py +2 -1
  63. package/ui/handler.py +209 -21
  64. package/ui/sse.py +102 -16
  65. package/ui/wave_prs.py +230 -0
  66. package/ui/web/dist/assets/index-0qQYnvMC.js +9 -0
  67. package/ui/web/dist/assets/index-BdIlFieV.css +1 -0
  68. package/ui/web/dist/index.html +2 -2
  69. package/monitor/.signal-state.json +0 -3
  70. package/monitor/ACTIONS.log +0 -1
  71. package/monitor/BRIEF.md +0 -24
  72. package/monitor/SIGNALS.json +0 -54
  73. package/state_store/__pycache__/__init__.cpython-314.pyc +0 -0
  74. package/state_store/__pycache__/api.cpython-314.pyc +0 -0
  75. package/state_store/__pycache__/export.cpython-314.pyc +0 -0
  76. package/state_store/__pycache__/ingest.cpython-314.pyc +0 -0
  77. package/state_store/__pycache__/projections.cpython-314.pyc +0 -0
  78. package/state_store/__pycache__/store.cpython-314.pyc +0 -0
  79. package/tools/__pycache__/alert_bridge.cpython-314.pyc +0 -0
  80. package/tools/__pycache__/buildlog.cpython-314.pyc +0 -0
  81. package/tools/__pycache__/ci_merge_wait.cpython-314.pyc +0 -0
  82. package/tools/__pycache__/ensure_state.cpython-314.pyc +0 -0
  83. package/tools/__pycache__/eod_sweep.cpython-314.pyc +0 -0
  84. package/tools/__pycache__/fleet_ledger.cpython-314.pyc +0 -0
  85. package/tools/__pycache__/fleet_prompt_extractor.cpython-314.pyc +0 -0
  86. package/tools/__pycache__/healthcheck.cpython-314.pyc +0 -0
  87. package/tools/__pycache__/heartbeat.cpython-314.pyc +0 -0
  88. package/tools/__pycache__/inbox_drain.cpython-314.pyc +0 -0
  89. package/tools/__pycache__/launch_tui.cpython-314.pyc +0 -0
  90. package/tools/__pycache__/metrics_gate.cpython-314.pyc +0 -0
  91. package/tools/__pycache__/orchestrator_status.cpython-314.pyc +0 -0
  92. package/tools/__pycache__/power_selftest.cpython-314.pyc +0 -0
  93. package/tools/__pycache__/prepublish_scan.cpython-314.pyc +0 -0
  94. package/tools/__pycache__/rotate_logs.cpython-314.pyc +0 -0
  95. package/tools/__pycache__/scanner_selftest.cpython-314.pyc +0 -0
  96. package/tools/__pycache__/secret_scan.cpython-314.pyc +0 -0
  97. package/tools/__pycache__/self_stats.cpython-314.pyc +0 -0
  98. package/tools/__pycache__/session_usage_summary.cpython-314.pyc +0 -0
  99. package/tools/__pycache__/stall_check.cpython-314.pyc +0 -0
  100. package/tools/__pycache__/transcript_replay.cpython-314.pyc +0 -0
  101. package/tools/__pycache__/transcript_timeline.cpython-314.pyc +0 -0
  102. package/tools/__pycache__/verify_dash.cpython-314.pyc +0 -0
  103. package/tools/__pycache__/verify_submit_encoding.cpython-314.pyc +0 -0
  104. package/ui/__pycache__/agents.cpython-314.pyc +0 -0
  105. package/ui/__pycache__/collectors.cpython-314.pyc +0 -0
  106. package/ui/__pycache__/config.cpython-314.pyc +0 -0
  107. package/ui/__pycache__/cost.cpython-314.pyc +0 -0
  108. package/ui/__pycache__/csrf.cpython-314.pyc +0 -0
  109. package/ui/__pycache__/handler.cpython-314.pyc +0 -0
  110. package/ui/__pycache__/render.cpython-314.pyc +0 -0
  111. package/ui/__pycache__/serve.cpython-314.pyc +0 -0
  112. package/ui/__pycache__/sse.cpython-314.pyc +0 -0
  113. package/ui/api/__pycache__/__init__.cpython-314.pyc +0 -0
  114. package/ui/api/__pycache__/submit.cpython-314.pyc +0 -0
  115. package/ui/api/__pycache__/tracker.cpython-314.pyc +0 -0
  116. package/ui/web/.gitattributes +0 -13
  117. package/ui/web/dist/assets/index-2LZDQirC.js +0 -9
  118. package/ui/web/dist/assets/index-D4M1qyOv.css +0 -1
  119. package/ui/web/index.html +0 -13
  120. package/ui/web/package-lock.json +0 -2225
  121. package/ui/web/package.json +0 -26
  122. package/ui/web/src/App.test.tsx +0 -74
  123. package/ui/web/src/App.tsx +0 -142
  124. package/ui/web/src/CONTRIBUTING-UI.md +0 -49
  125. package/ui/web/src/components/AgentRow.css +0 -187
  126. package/ui/web/src/components/AgentRow.test.tsx +0 -209
  127. package/ui/web/src/components/AgentRow.tsx +0 -207
  128. package/ui/web/src/components/AgentsPanel.css +0 -108
  129. package/ui/web/src/components/AgentsPanel.test.tsx +0 -41
  130. package/ui/web/src/components/AgentsPanel.tsx +0 -58
  131. package/ui/web/src/components/AlertsPanel.css +0 -88
  132. package/ui/web/src/components/AlertsPanel.test.tsx +0 -51
  133. package/ui/web/src/components/AlertsPanel.tsx +0 -67
  134. package/ui/web/src/components/BacklogPanel.test.tsx +0 -126
  135. package/ui/web/src/components/BacklogPanel.tsx +0 -122
  136. package/ui/web/src/components/CostChart.css +0 -110
  137. package/ui/web/src/components/CostChart.test.tsx +0 -144
  138. package/ui/web/src/components/CostChart.tsx +0 -152
  139. package/ui/web/src/components/CostTable.css +0 -93
  140. package/ui/web/src/components/CostTable.test.tsx +0 -165
  141. package/ui/web/src/components/CostTable.tsx +0 -94
  142. package/ui/web/src/components/EventsFeed.css +0 -68
  143. package/ui/web/src/components/EventsFeed.test.tsx +0 -36
  144. package/ui/web/src/components/EventsFeed.tsx +0 -31
  145. package/ui/web/src/components/HealthHeader.css +0 -137
  146. package/ui/web/src/components/HealthHeader.test.tsx +0 -278
  147. package/ui/web/src/components/HealthHeader.tsx +0 -281
  148. package/ui/web/src/components/InboxForm.css +0 -135
  149. package/ui/web/src/components/InboxForm.test.tsx +0 -208
  150. package/ui/web/src/components/InboxForm.tsx +0 -116
  151. package/ui/web/src/components/MessagesTail.module.css +0 -144
  152. package/ui/web/src/components/MessagesTail.test.tsx +0 -176
  153. package/ui/web/src/components/MessagesTail.tsx +0 -94
  154. package/ui/web/src/components/ReposPanel.css +0 -90
  155. package/ui/web/src/components/ReposPanel.test.tsx +0 -45
  156. package/ui/web/src/components/ReposPanel.tsx +0 -67
  157. package/ui/web/src/components/Scorecard.css +0 -106
  158. package/ui/web/src/components/Scorecard.test.tsx +0 -117
  159. package/ui/web/src/components/Scorecard.tsx +0 -85
  160. package/ui/web/src/components/Timeline.module.css +0 -151
  161. package/ui/web/src/components/Timeline.test.tsx +0 -215
  162. package/ui/web/src/components/Timeline.tsx +0 -99
  163. package/ui/web/src/components/TrackerBoard.test.tsx +0 -121
  164. package/ui/web/src/components/TrackerBoard.tsx +0 -107
  165. package/ui/web/src/components/TrackerCard.test.tsx +0 -180
  166. package/ui/web/src/components/TrackerCard.tsx +0 -160
  167. package/ui/web/src/components/TrackerForm.test.tsx +0 -189
  168. package/ui/web/src/components/TrackerForm.tsx +0 -144
  169. package/ui/web/src/lib/api.ts +0 -218
  170. package/ui/web/src/lib/format.test.ts +0 -89
  171. package/ui/web/src/lib/format.ts +0 -103
  172. package/ui/web/src/lib/sanitizeUrl.test.ts +0 -84
  173. package/ui/web/src/lib/sanitizeUrl.ts +0 -38
  174. package/ui/web/src/lib/types.ts +0 -230
  175. package/ui/web/src/lib/useHashRoute.test.ts +0 -60
  176. package/ui/web/src/lib/useHashRoute.ts +0 -23
  177. package/ui/web/src/lib/useSSE.ts +0 -175
  178. package/ui/web/src/main.tsx +0 -10
  179. package/ui/web/src/styles/global.css +0 -179
  180. package/ui/web/src/styles/theme.css +0 -184
  181. package/ui/web/src/styles/work.css +0 -572
  182. package/ui/web/src/test/fixtures.ts +0 -385
  183. package/ui/web/src/test/setup.ts +0 -49
  184. package/ui/web/src/views/Activity.module.css +0 -43
  185. package/ui/web/src/views/Activity.test.tsx +0 -89
  186. package/ui/web/src/views/Activity.tsx +0 -31
  187. package/ui/web/src/views/Cost.css +0 -87
  188. package/ui/web/src/views/Cost.test.tsx +0 -142
  189. package/ui/web/src/views/Cost.tsx +0 -54
  190. package/ui/web/src/views/Overview.css +0 -51
  191. package/ui/web/src/views/Overview.test.tsx +0 -76
  192. package/ui/web/src/views/Overview.tsx +0 -46
  193. package/ui/web/src/views/Work.test.tsx +0 -82
  194. package/ui/web/src/views/Work.tsx +0 -79
  195. package/ui/web/src/vite-env.d.ts +0 -10
  196. package/ui/web/tsconfig.json +0 -22
  197. package/ui/web/vite.config.ts +0 -25
  198. package/ui/web/vitest.config.ts +0 -12
@@ -1,572 +0,0 @@
1
- /**
2
- * Work view styling — tracker board, cards, form, backlog panel.
3
- * Uses design tokens from theme.css; supports light/dark themes.
4
- */
5
-
6
- /* ---- Work view layout ---- */
7
- .work-view {
8
- padding: var(--space-4);
9
- }
10
-
11
- .work-container {
12
- display: grid;
13
- grid-template-columns: 1fr 300px;
14
- gap: var(--space-6);
15
- max-width: var(--content-max-width);
16
- margin: 0 auto;
17
- }
18
-
19
- @media (max-width: 1200px) {
20
- .work-container {
21
- grid-template-columns: 1fr;
22
- }
23
-
24
- .work-sidebar {
25
- order: 2;
26
- }
27
- }
28
-
29
- /* ---- Board header ---- */
30
- .board-header {
31
- display: flex;
32
- justify-content: space-between;
33
- align-items: center;
34
- margin-bottom: var(--space-4);
35
- }
36
-
37
- .board-header h2 {
38
- font-size: var(--font-size-lg);
39
- font-weight: var(--font-weight-bold);
40
- }
41
-
42
- .add-item-button {
43
- padding: var(--space-2) var(--space-3);
44
- background: var(--color-accent);
45
- color: var(--color-text-inverse);
46
- border: none;
47
- border-radius: var(--radius-sm);
48
- font-weight: var(--font-weight-medium);
49
- cursor: pointer;
50
- transition: background-color var(--transition-normal);
51
- }
52
-
53
- .add-item-button:hover {
54
- background: var(--color-accent-emphasis);
55
- }
56
-
57
- .add-item-button:disabled {
58
- opacity: 0.5;
59
- cursor: not-allowed;
60
- }
61
-
62
- /* ---- Form container ---- */
63
- .form-container {
64
- background: var(--color-bg-subtle);
65
- border: 1px solid var(--color-border);
66
- border-radius: var(--radius-md);
67
- padding: var(--space-4);
68
- margin-bottom: var(--space-4);
69
- }
70
-
71
- /* ---- Tracker form ---- */
72
- .tracker-form {
73
- display: flex;
74
- flex-direction: column;
75
- gap: var(--space-3);
76
- }
77
-
78
- .form-group {
79
- display: flex;
80
- flex-direction: column;
81
- gap: var(--space-1);
82
- }
83
-
84
- .form-group label {
85
- font-weight: var(--font-weight-medium);
86
- font-size: var(--font-size-sm);
87
- color: var(--color-text);
88
- }
89
-
90
- .form-group input,
91
- .form-group select,
92
- .form-group textarea {
93
- padding: var(--space-2);
94
- border: 1px solid var(--color-border);
95
- border-radius: var(--radius-sm);
96
- background: var(--color-surface);
97
- color: var(--color-text);
98
- font-size: var(--font-size-sm);
99
- }
100
-
101
- .form-group input:focus,
102
- .form-group select:focus,
103
- .form-group textarea:focus {
104
- border-color: var(--color-accent);
105
- }
106
-
107
- .form-group input:disabled,
108
- .form-group select:disabled,
109
- .form-group textarea:disabled {
110
- opacity: 0.6;
111
- cursor: not-allowed;
112
- }
113
-
114
- .tracker-form button {
115
- padding: var(--space-2) var(--space-3);
116
- background: var(--color-accent);
117
- color: var(--color-text-inverse);
118
- border: none;
119
- border-radius: var(--radius-sm);
120
- font-weight: var(--font-weight-medium);
121
- cursor: pointer;
122
- transition: background-color var(--transition-normal);
123
- }
124
-
125
- .tracker-form button:hover:not(:disabled) {
126
- background: var(--color-accent-emphasis);
127
- }
128
-
129
- .tracker-form button:disabled {
130
- opacity: 0.5;
131
- cursor: not-allowed;
132
- }
133
-
134
- .form-error {
135
- padding: var(--space-2) var(--space-3);
136
- background: var(--color-status-error-bg);
137
- color: var(--color-status-error);
138
- border-radius: var(--radius-sm);
139
- border-left: 3px solid var(--color-status-error);
140
- }
141
-
142
- .form-success {
143
- padding: var(--space-2) var(--space-3);
144
- background: var(--color-status-ok-bg);
145
- color: var(--color-status-ok);
146
- border-radius: var(--radius-sm);
147
- border-left: 3px solid var(--color-status-ok);
148
- }
149
-
150
- /* ---- Tracker board ---- */
151
- .tracker-board {
152
- display: flex;
153
- flex-direction: column;
154
- gap: var(--space-4);
155
- }
156
-
157
- .lanes-container {
158
- display: grid;
159
- grid-template-columns: repeat(4, 1fr);
160
- gap: var(--space-3);
161
- }
162
-
163
- @media (max-width: 1600px) {
164
- .lanes-container {
165
- grid-template-columns: repeat(2, 1fr);
166
- }
167
- }
168
-
169
- @media (max-width: 768px) {
170
- .lanes-container {
171
- grid-template-columns: 1fr;
172
- }
173
- }
174
-
175
- /* ---- Tracker lane ---- */
176
- .tracker-lane {
177
- background: var(--color-bg-subtle);
178
- border: 1px solid var(--color-border);
179
- border-radius: var(--radius-md);
180
- padding: var(--space-3);
181
- min-height: 300px;
182
- }
183
-
184
- .lane-header {
185
- display: flex;
186
- justify-content: space-between;
187
- align-items: center;
188
- margin-bottom: var(--space-3);
189
- font-size: var(--font-size-md);
190
- font-weight: var(--font-weight-bold);
191
- }
192
-
193
- .lane-count {
194
- display: inline-block;
195
- padding: var(--space-1) var(--space-2);
196
- background: var(--color-accent);
197
- color: var(--color-text-inverse);
198
- border-radius: var(--radius-sm);
199
- font-size: var(--font-size-xs);
200
- font-weight: var(--font-weight-bold);
201
- }
202
-
203
- .lane-badge {
204
- display: inline-block;
205
- padding: var(--space-1) var(--space-2);
206
- border-radius: var(--radius-sm);
207
- font-size: var(--font-size-xs);
208
- font-weight: var(--font-weight-bold);
209
- white-space: nowrap;
210
- }
211
-
212
- .lane-badge--active {
213
- background: var(--color-accent);
214
- color: var(--color-text-inverse);
215
- }
216
-
217
- .lane-badge--empty {
218
- background: var(--color-bg-inset);
219
- color: var(--color-text-muted);
220
- }
221
-
222
- .lane-content {
223
- display: flex;
224
- flex-direction: column;
225
- gap: var(--space-2);
226
- max-height: 600px;
227
- overflow-y: auto;
228
- }
229
-
230
- .lane-empty {
231
- text-align: center;
232
- color: var(--color-text-muted);
233
- padding: var(--space-4);
234
- font-style: italic;
235
- }
236
-
237
- /* ---- Tracker card ---- */
238
- .tracker-card {
239
- background: var(--color-surface);
240
- border: 1px solid var(--color-border-subtle);
241
- border-radius: var(--radius-md);
242
- padding: var(--space-3);
243
- box-shadow: var(--shadow-sm);
244
- transition: box-shadow var(--transition-normal);
245
- }
246
-
247
- .tracker-card:hover {
248
- box-shadow: var(--shadow-md);
249
- }
250
-
251
- .tracker-card-header {
252
- display: flex;
253
- justify-content: space-between;
254
- align-items: flex-start;
255
- gap: var(--space-2);
256
- margin-bottom: var(--space-2);
257
- }
258
-
259
- .tracker-card-title-row {
260
- display: flex;
261
- align-items: flex-start;
262
- gap: var(--space-2);
263
- flex: 1;
264
- }
265
-
266
- .priority-chip {
267
- display: inline-block;
268
- padding: var(--space-1) var(--space-2);
269
- color: var(--color-text-inverse);
270
- font-size: var(--font-size-xs);
271
- font-weight: var(--font-weight-bold);
272
- border-radius: var(--radius-sm);
273
- white-space: nowrap;
274
- flex-shrink: 0;
275
- }
276
-
277
- .tracker-card-title {
278
- font-size: var(--font-size-md);
279
- font-weight: var(--font-weight-medium);
280
- line-height: var(--line-height-tight);
281
- margin: 0;
282
- }
283
-
284
- .expand-button {
285
- background: transparent;
286
- border: none;
287
- padding: var(--space-1);
288
- cursor: pointer;
289
- color: var(--color-text-muted);
290
- font-size: var(--font-size-sm);
291
- }
292
-
293
- .expand-button:hover {
294
- color: var(--color-text);
295
- }
296
-
297
- /* ---- Tracker card tags ---- */
298
- .tracker-card-tags {
299
- display: flex;
300
- flex-wrap: wrap;
301
- gap: var(--space-1);
302
- margin-bottom: var(--space-2);
303
- }
304
-
305
- .tag {
306
- display: inline-block;
307
- padding: var(--space-1) var(--space-2);
308
- background: var(--color-bg-inset);
309
- border: 1px solid var(--color-border);
310
- border-radius: var(--radius-sm);
311
- font-size: var(--font-size-xs);
312
- color: var(--color-text-muted);
313
- }
314
-
315
- /* ---- Tracker card details ---- */
316
- .tracker-card-details {
317
- background: var(--color-bg-inset);
318
- border-top: 1px solid var(--color-border);
319
- margin: var(--space-2) 0;
320
- padding: var(--space-2) 0;
321
- }
322
-
323
- .detail-section {
324
- padding: var(--space-2) 0;
325
- border-bottom: 1px solid var(--color-border-subtle);
326
- }
327
-
328
- .detail-section:last-child {
329
- border-bottom: none;
330
- }
331
-
332
- .detail-label {
333
- display: block;
334
- font-size: var(--font-size-xs);
335
- font-weight: var(--font-weight-bold);
336
- color: var(--color-text-muted);
337
- text-transform: uppercase;
338
- margin-bottom: var(--space-1);
339
- }
340
-
341
- .detail-section p,
342
- .detail-section time,
343
- .detail-section a,
344
- .detail-section code {
345
- font-size: var(--font-size-sm);
346
- color: var(--color-text);
347
- }
348
-
349
- .detail-section a {
350
- word-break: break-all;
351
- }
352
-
353
- .pr-link-inert {
354
- display: block;
355
- padding: var(--space-1) var(--space-2);
356
- background: var(--color-bg);
357
- border: 1px solid var(--color-border);
358
- border-radius: var(--radius-sm);
359
- font-family: var(--font-mono);
360
- font-size: var(--font-size-xs);
361
- color: var(--color-status-error);
362
- word-break: break-all;
363
- white-space: pre-wrap;
364
- }
365
-
366
- /* ---- Tracker card actions ---- */
367
- .tracker-card-actions {
368
- display: flex;
369
- gap: var(--space-1);
370
- margin-top: var(--space-2);
371
- }
372
-
373
- .tracker-card-actions button {
374
- flex: 1;
375
- padding: var(--space-1) var(--space-2);
376
- background: var(--color-accent);
377
- color: var(--color-text-inverse);
378
- border: none;
379
- border-radius: var(--radius-sm);
380
- font-size: var(--font-size-xs);
381
- font-weight: var(--font-weight-medium);
382
- cursor: pointer;
383
- transition: background-color var(--transition-normal);
384
- }
385
-
386
- .tracker-card-actions button:hover:not(:disabled) {
387
- background: var(--color-accent-emphasis);
388
- }
389
-
390
- .tracker-card-actions button:disabled {
391
- opacity: 0.5;
392
- cursor: not-allowed;
393
- }
394
-
395
- /* ---- Card error message ---- */
396
- .card-error {
397
- padding: var(--space-2);
398
- background: var(--color-status-error-bg);
399
- color: var(--color-status-error);
400
- border-radius: var(--radius-sm);
401
- border-left: 3px solid var(--color-status-error);
402
- margin-top: var(--space-2);
403
- font-size: var(--font-size-sm);
404
- }
405
-
406
- /* ---- Archived summary ---- */
407
- .archived-summary {
408
- background: var(--color-bg-subtle);
409
- border: 1px solid var(--color-border);
410
- border-radius: var(--radius-md);
411
- padding: var(--space-3);
412
- margin-top: var(--space-4);
413
- }
414
-
415
- .archived-summary h3 {
416
- font-size: var(--font-size-md);
417
- font-weight: var(--font-weight-bold);
418
- margin-bottom: var(--space-2);
419
- }
420
-
421
- .archived-list {
422
- list-style: none;
423
- display: flex;
424
- flex-direction: column;
425
- gap: var(--space-1);
426
- max-height: 200px;
427
- overflow-y: auto;
428
- }
429
-
430
- .archived-item {
431
- display: flex;
432
- gap: var(--space-2);
433
- align-items: center;
434
- padding: var(--space-2);
435
- background: var(--color-surface);
436
- border-radius: var(--radius-sm);
437
- font-size: var(--font-size-sm);
438
- }
439
-
440
- .archived-title {
441
- flex: 1;
442
- color: var(--color-text-muted);
443
- text-decoration: line-through;
444
- }
445
-
446
- .archived-priority {
447
- padding: var(--space-1) var(--space-2);
448
- background: var(--color-bg-inset);
449
- border-radius: var(--radius-sm);
450
- font-size: var(--font-size-xs);
451
- font-weight: var(--font-weight-bold);
452
- color: var(--color-text-muted);
453
- }
454
-
455
- /* ---- Backlog panel ---- */
456
- .backlog-panel {
457
- background: var(--color-bg-subtle);
458
- border: 1px solid var(--color-border);
459
- border-radius: var(--radius-md);
460
- padding: var(--space-3);
461
- position: sticky;
462
- top: calc(var(--header-height) + var(--space-3));
463
- }
464
-
465
- .backlog-panel h3 {
466
- font-size: var(--font-size-md);
467
- font-weight: var(--font-weight-bold);
468
- margin-bottom: var(--space-3);
469
- }
470
-
471
- .empty-state {
472
- color: var(--color-text-muted);
473
- text-align: center;
474
- padding: var(--space-3);
475
- font-style: italic;
476
- }
477
-
478
- .backlog-tier {
479
- margin-bottom: var(--space-3);
480
- }
481
-
482
- .tier-header {
483
- display: flex;
484
- justify-content: space-between;
485
- align-items: center;
486
- margin-bottom: var(--space-2);
487
- }
488
-
489
- .tier-header h4 {
490
- font-size: var(--font-size-sm);
491
- font-weight: var(--font-weight-bold);
492
- margin: 0;
493
- }
494
-
495
- .tier-counts {
496
- font-size: var(--font-size-xs);
497
- color: var(--color-text-muted);
498
- }
499
-
500
- .tier-progress-bar {
501
- display: flex;
502
- height: 6px;
503
- background: var(--color-bg-inset);
504
- border-radius: var(--radius-sm);
505
- overflow: hidden;
506
- margin-bottom: var(--space-2);
507
- }
508
-
509
- .progress-segment {
510
- flex: 0 0 auto;
511
- height: 100%;
512
- transition: width var(--transition-normal);
513
- }
514
-
515
- .progress-segment.done {
516
- background: var(--color-status-ok);
517
- }
518
-
519
- .progress-segment.inflight {
520
- background: var(--color-status-warn);
521
- }
522
-
523
- .progress-segment.todo {
524
- background: var(--color-status-neutral);
525
- }
526
-
527
- .tier-items-list {
528
- display: flex;
529
- flex-direction: column;
530
- gap: var(--space-1);
531
- max-height: 250px;
532
- overflow-y: auto;
533
- position: relative;
534
- }
535
-
536
- .tier-items-list::after {
537
- position: absolute;
538
- bottom: 0;
539
- left: 0;
540
- right: 0;
541
- height: 20px;
542
- background: linear-gradient(to bottom, transparent, var(--color-bg-subtle));
543
- pointer-events: none;
544
- }
545
-
546
- .backlog-item {
547
- display: flex;
548
- gap: var(--space-2);
549
- align-items: flex-start;
550
- padding: var(--space-1) var(--space-2);
551
- font-size: var(--font-size-xs);
552
- background: var(--color-surface);
553
- border-radius: var(--radius-sm);
554
- word-break: break-word;
555
- }
556
-
557
- .item-status {
558
- font-size: var(--font-size-sm);
559
- flex-shrink: 0;
560
- }
561
-
562
- .item-tag {
563
- font-weight: var(--font-weight-bold);
564
- color: var(--color-accent);
565
- flex-shrink: 0;
566
- min-width: fit-content;
567
- }
568
-
569
- .item-title {
570
- flex: 1;
571
- color: var(--color-text);
572
- }