@pat-lewczuk/cezar 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 (45) hide show
  1. package/README.md +90 -0
  2. package/dist/core/agent-runner.d.ts +95 -0
  3. package/dist/core/agent-runner.js +8 -0
  4. package/dist/core/agent-runner.js.map +1 -0
  5. package/dist/core/backend-detect.d.ts +14 -0
  6. package/dist/core/backend-detect.js +78 -0
  7. package/dist/core/backend-detect.js.map +1 -0
  8. package/dist/core/claude-cli-runner.d.ts +68 -0
  9. package/dist/core/claude-cli-runner.js +424 -0
  10. package/dist/core/claude-cli-runner.js.map +1 -0
  11. package/dist/core/usage.d.ts +11 -0
  12. package/dist/core/usage.js +15 -0
  13. package/dist/core/usage.js.map +1 -0
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.js +294 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/runs/store.d.ts +218 -0
  18. package/dist/runs/store.js +286 -0
  19. package/dist/runs/store.js.map +1 -0
  20. package/dist/server/git.d.ts +21 -0
  21. package/dist/server/git.js +54 -0
  22. package/dist/server/git.js.map +1 -0
  23. package/dist/server/open-in-terminal.d.ts +11 -0
  24. package/dist/server/open-in-terminal.js +84 -0
  25. package/dist/server/open-in-terminal.js.map +1 -0
  26. package/dist/server/server.d.ts +12 -0
  27. package/dist/server/server.js +243 -0
  28. package/dist/server/server.js.map +1 -0
  29. package/dist/skills.d.ts +31 -0
  30. package/dist/skills.js +117 -0
  31. package/dist/skills.js.map +1 -0
  32. package/dist/workflows/load.d.ts +15 -0
  33. package/dist/workflows/load.js +58 -0
  34. package/dist/workflows/load.js.map +1 -0
  35. package/dist/workflows/run.d.ts +52 -0
  36. package/dist/workflows/run.js +452 -0
  37. package/dist/workflows/run.js.map +1 -0
  38. package/dist/workflows/types.d.ts +202 -0
  39. package/dist/workflows/types.js +56 -0
  40. package/dist/workflows/types.js.map +1 -0
  41. package/package.json +44 -0
  42. package/scripts/mock-claude.mjs +106 -0
  43. package/web/app.js +634 -0
  44. package/web/index.html +48 -0
  45. package/web/style.css +317 -0
package/web/style.css ADDED
@@ -0,0 +1,317 @@
1
+ :root {
2
+ --bg: #0d1117;
3
+ --bg-panel: #161b22;
4
+ --bg-raised: #1c2330;
5
+ --border: #2a3240;
6
+ --text: #dce3ec;
7
+ --text-dim: #8b96a5;
8
+ --accent: #4f8ef7;
9
+ --green: #3fb950;
10
+ --red: #f85149;
11
+ --yellow: #d29922;
12
+ --purple: #bc8cff;
13
+ --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
14
+ }
15
+
16
+ * { box-sizing: border-box; }
17
+
18
+ body {
19
+ margin: 0;
20
+ height: 100vh;
21
+ display: flex;
22
+ flex-direction: column;
23
+ background: var(--bg);
24
+ color: var(--text);
25
+ font: 14px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
26
+ }
27
+
28
+ /* ---- header ---- */
29
+ header {
30
+ display: flex;
31
+ align-items: center;
32
+ gap: 12px;
33
+ padding: 10px 16px;
34
+ border-bottom: 1px solid var(--border);
35
+ background: var(--bg-panel);
36
+ }
37
+ .brand { font-weight: 700; font-size: 15px; }
38
+ .chip {
39
+ font-size: 12px;
40
+ padding: 2px 10px;
41
+ border: 1px solid var(--border);
42
+ border-radius: 999px;
43
+ color: var(--text-dim);
44
+ font-family: var(--mono);
45
+ }
46
+ .chip.ok { color: var(--green); border-color: color-mix(in srgb, var(--green) 40%, transparent); }
47
+ .chip.bad { color: var(--red); border-color: color-mix(in srgb, var(--red) 40%, transparent); }
48
+ #env-chips { display: flex; gap: 6px; }
49
+ nav#tabs { margin-left: auto; display: flex; gap: 4px; }
50
+ nav#tabs button {
51
+ background: none;
52
+ border: 1px solid transparent;
53
+ color: var(--text-dim);
54
+ padding: 5px 14px;
55
+ border-radius: 8px;
56
+ cursor: pointer;
57
+ font-size: 13px;
58
+ }
59
+ nav#tabs button:hover { color: var(--text); }
60
+ nav#tabs button.active { color: var(--text); background: var(--bg-raised); border-color: var(--border); }
61
+
62
+ /* ---- layout ---- */
63
+ main { flex: 1; min-height: 0; display: flex; }
64
+ .view { flex: 1; min-height: 0; display: flex; }
65
+ .view[hidden] { display: none; }
66
+ #view-repo, #view-skills { flex-direction: column; overflow-y: auto; padding: 20px; gap: 16px; }
67
+
68
+ #sidebar {
69
+ width: 340px;
70
+ min-width: 340px;
71
+ border-right: 1px solid var(--border);
72
+ display: flex;
73
+ flex-direction: column;
74
+ min-height: 0;
75
+ }
76
+
77
+ /* ---- new task form ---- */
78
+ #new-task { padding: 12px; border-bottom: 1px solid var(--border); display: flex; flex-direction: column; gap: 8px; }
79
+ #new-task textarea, #new-task input, #new-task select {
80
+ width: 100%;
81
+ background: var(--bg);
82
+ border: 1px solid var(--border);
83
+ border-radius: 8px;
84
+ color: var(--text);
85
+ padding: 8px 10px;
86
+ font: inherit;
87
+ resize: vertical;
88
+ }
89
+ #new-task .row { display: flex; gap: 8px; }
90
+ #new-task .row select { flex: 1.4; min-width: 0; }
91
+ #new-task .row input { flex: 1; min-width: 0; }
92
+ button.primary {
93
+ background: var(--accent);
94
+ border: none;
95
+ color: #fff;
96
+ font-weight: 600;
97
+ padding: 8px;
98
+ border-radius: 8px;
99
+ cursor: pointer;
100
+ }
101
+ button.primary:hover { filter: brightness(1.1); }
102
+ button.primary:disabled { opacity: .5; cursor: default; }
103
+ .error-text { color: var(--red); font-size: 12px; }
104
+
105
+ /* ---- run list ---- */
106
+ #run-list { flex: 1; overflow-y: auto; }
107
+ .run-item {
108
+ padding: 10px 12px;
109
+ border-bottom: 1px solid var(--border);
110
+ cursor: pointer;
111
+ display: flex;
112
+ flex-direction: column;
113
+ gap: 3px;
114
+ }
115
+ .run-item:hover { background: var(--bg-panel); }
116
+ .run-item.selected { background: var(--bg-raised); box-shadow: inset 3px 0 0 var(--accent); }
117
+ .run-item .title { font-weight: 550; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
118
+ .run-item .meta { display: flex; gap: 8px; align-items: center; font-size: 12px; color: var(--text-dim); }
119
+
120
+ /* ---- badges ---- */
121
+ .badge {
122
+ font-size: 11px;
123
+ font-weight: 600;
124
+ padding: 1px 8px;
125
+ border-radius: 999px;
126
+ text-transform: uppercase;
127
+ letter-spacing: .3px;
128
+ }
129
+ .badge.queued { background: color-mix(in srgb, var(--yellow) 18%, transparent); color: var(--yellow); }
130
+ .badge.running { background: color-mix(in srgb, var(--accent) 18%, transparent); color: var(--accent); animation: pulse 1.6s ease-in-out infinite; }
131
+ .badge.done { background: color-mix(in srgb, var(--green) 15%, transparent); color: var(--green); }
132
+ .badge.failed { background: color-mix(in srgb, var(--red) 15%, transparent); color: var(--red); }
133
+ .badge.cancelled, .badge.skipped, .badge.pending { background: var(--bg-raised); color: var(--text-dim); }
134
+ @keyframes pulse { 50% { opacity: .55; } }
135
+
136
+ /* ---- run detail ---- */
137
+ #detail { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 0; }
138
+ #detail .empty { margin: auto; color: var(--text-dim); }
139
+ .detail-header {
140
+ padding: 12px 16px;
141
+ border-bottom: 1px solid var(--border);
142
+ display: flex;
143
+ align-items: center;
144
+ gap: 10px;
145
+ flex-wrap: wrap;
146
+ }
147
+ .detail-header h2 { margin: 0; font-size: 15px; flex: 1; min-width: 200px; }
148
+ .detail-header .sub { width: 100%; font-size: 12px; color: var(--text-dim); font-family: var(--mono); }
149
+ .detail-header button {
150
+ background: var(--bg-raised);
151
+ border: 1px solid var(--border);
152
+ color: var(--text);
153
+ border-radius: 8px;
154
+ padding: 4px 12px;
155
+ cursor: pointer;
156
+ font-size: 12px;
157
+ }
158
+ .detail-header button:hover { border-color: var(--text-dim); }
159
+ .detail-header button.danger:hover { border-color: var(--red); color: var(--red); }
160
+
161
+ .steps-rail {
162
+ display: flex;
163
+ gap: 8px;
164
+ padding: 10px 16px;
165
+ border-bottom: 1px solid var(--border);
166
+ overflow-x: auto;
167
+ flex-wrap: wrap;
168
+ }
169
+ .step-card {
170
+ border: 1px solid var(--border);
171
+ border-radius: 10px;
172
+ padding: 6px 12px;
173
+ background: var(--bg-panel);
174
+ display: flex;
175
+ align-items: center;
176
+ gap: 8px;
177
+ font-size: 12px;
178
+ white-space: nowrap;
179
+ }
180
+ .step-card .name { font-weight: 600; }
181
+ .step-card .tok { color: var(--text-dim); font-family: var(--mono); }
182
+
183
+ /* ---- event log ---- */
184
+ #log { flex: 1; overflow-y: auto; padding: 12px 16px 40px; font-family: var(--mono); font-size: 12.5px; }
185
+ .ev { margin: 2px 0; white-space: pre-wrap; word-break: break-word; }
186
+ .ev.text { color: var(--text); margin: 6px 0; }
187
+ .ev.tool-call { color: var(--purple); }
188
+ .ev.tool-result { color: var(--text-dim); }
189
+ .ev.tool-result.error { color: var(--red); }
190
+ .ev.note, .ev.lifecycle { color: var(--text-dim); font-style: italic; }
191
+ .ev.error { color: var(--red); }
192
+ .ev.step-start {
193
+ margin: 14px 0 6px;
194
+ color: var(--accent);
195
+ font-weight: 700;
196
+ border-top: 1px solid var(--border);
197
+ padding-top: 10px;
198
+ }
199
+ .ev.check-output { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; color: var(--text-dim); }
200
+ .ev details { display: inline-block; max-width: 100%; }
201
+ .ev summary { cursor: pointer; }
202
+ .ev details pre { margin: 4px 0 0; padding: 8px 10px; background: var(--bg-panel); border-radius: 8px; overflow-x: auto; }
203
+
204
+ #jump-bottom {
205
+ position: absolute;
206
+ right: 24px;
207
+ bottom: 20px;
208
+ background: var(--bg-raised);
209
+ border: 1px solid var(--border);
210
+ color: var(--text);
211
+ border-radius: 999px;
212
+ padding: 6px 14px;
213
+ cursor: pointer;
214
+ font-size: 12px;
215
+ box-shadow: 0 4px 14px rgb(0 0 0 / .4);
216
+ }
217
+ .log-wrap { position: relative; flex: 1; min-height: 0; display: flex; flex-direction: column; }
218
+
219
+ /* ---- repo & skills views ---- */
220
+ .panel { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 12px; padding: 14px 16px; }
221
+ .panel h3 { margin: 0 0 10px; font-size: 13px; text-transform: uppercase; letter-spacing: .5px; color: var(--text-dim); }
222
+ .panel pre { margin: 0; overflow-x: auto; font-family: var(--mono); font-size: 12.5px; }
223
+ .panel table { width: 100%; border-collapse: collapse; font-size: 13px; }
224
+ .panel td { padding: 4px 8px 4px 0; border-bottom: 1px solid var(--border); vertical-align: top; }
225
+ .panel td.mono, .mono { font-family: var(--mono); }
226
+ .dim { color: var(--text-dim); }
227
+ .skill-card { margin-bottom: 12px; }
228
+ .skill-card .path { font-size: 11px; }
229
+ .skill-card pre { max-height: 320px; overflow: auto; margin-top: 8px; }
230
+
231
+ /* ---- live session (spec 002) ---- */
232
+ .badge.waiting { background: color-mix(in srgb, var(--yellow) 22%, transparent); color: var(--yellow); animation: pulse 1.6s ease-in-out infinite; }
233
+
234
+ #msg-form { border-top: 1px solid var(--border); padding: 10px 16px; background: var(--bg-panel); }
235
+ #msg-form.disabled { opacity: .55; }
236
+ .msg-row { display: flex; gap: 8px; align-items: flex-end; }
237
+ #msg-text {
238
+ flex: 1;
239
+ background: var(--bg);
240
+ border: 1px solid var(--border);
241
+ border-radius: 10px;
242
+ color: var(--text);
243
+ padding: 8px 12px;
244
+ font: inherit;
245
+ resize: none;
246
+ max-height: 140px;
247
+ }
248
+ #msg-send { width: 44px; }
249
+ #msg-attach {
250
+ background: var(--bg-raised);
251
+ border: 1px solid var(--border);
252
+ color: var(--text);
253
+ border-radius: 10px;
254
+ padding: 8px 10px;
255
+ cursor: pointer;
256
+ }
257
+ #msg-attach:hover { border-color: var(--text-dim); }
258
+ #msg-thumbs { display: flex; gap: 8px; padding-bottom: 8px; }
259
+ #msg-thumbs .thumb { position: relative; cursor: pointer; }
260
+ #msg-thumbs img { height: 48px; border-radius: 8px; border: 1px solid var(--border); display: block; }
261
+ #msg-thumbs .thumb:hover img { border-color: var(--red); opacity: .7; }
262
+
263
+ .ev.user-message { color: var(--green); font-weight: 600; margin: 8px 0; }
264
+
265
+ #toast {
266
+ position: fixed;
267
+ bottom: 18px;
268
+ left: 50%;
269
+ transform: translateX(-50%);
270
+ background: var(--bg-raised);
271
+ border: 1px solid var(--border);
272
+ color: var(--text);
273
+ padding: 8px 18px;
274
+ border-radius: 999px;
275
+ font-size: 13px;
276
+ box-shadow: 0 6px 20px rgb(0 0 0 / .5);
277
+ z-index: 10;
278
+ }
279
+
280
+ /* ---- task list upgrades (spec 004) ---- */
281
+ #list-tabs {
282
+ display: flex;
283
+ gap: 4px;
284
+ align-items: center;
285
+ padding: 8px 12px;
286
+ border-bottom: 1px solid var(--border);
287
+ }
288
+ #list-tabs button {
289
+ background: none;
290
+ border: 1px solid transparent;
291
+ color: var(--text-dim);
292
+ padding: 3px 10px;
293
+ border-radius: 8px;
294
+ cursor: pointer;
295
+ font-size: 12px;
296
+ }
297
+ #list-tabs button:hover { color: var(--text); }
298
+ #list-tabs button.active { color: var(--text); background: var(--bg-raised); border-color: var(--border); }
299
+ #list-tabs .dot {
300
+ display: inline-block;
301
+ width: 7px;
302
+ height: 7px;
303
+ border-radius: 50%;
304
+ background: var(--yellow);
305
+ margin-left: 2px;
306
+ animation: pulse 1.6s ease-in-out infinite;
307
+ }
308
+ .pr-badge {
309
+ font-size: 11px;
310
+ font-weight: 600;
311
+ padding: 1px 8px;
312
+ border-radius: 999px;
313
+ background: color-mix(in srgb, var(--purple) 18%, transparent);
314
+ color: var(--purple);
315
+ text-decoration: none;
316
+ }
317
+ .pr-badge:hover { filter: brightness(1.2); }