taskproof 0.3.0__py3-none-any.whl

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 (51) hide show
  1. taskproof/__init__.py +23 -0
  2. taskproof/__main__.py +8 -0
  3. taskproof/adapters/__init__.py +101 -0
  4. taskproof/adapters/base.py +228 -0
  5. taskproof/adapters/claude.py +46 -0
  6. taskproof/adapters/codex.py +140 -0
  7. taskproof/adapters/custom.py +61 -0
  8. taskproof/adapters/gemini.py +45 -0
  9. taskproof/adapters/opencode.py +46 -0
  10. taskproof/api/__init__.py +1 -0
  11. taskproof/api/server.py +822 -0
  12. taskproof/cli.py +1400 -0
  13. taskproof/concurrency.py +329 -0
  14. taskproof/dispatch.py +2289 -0
  15. taskproof/errors.py +55 -0
  16. taskproof/ledger.py +185 -0
  17. taskproof/models.py +155 -0
  18. taskproof/registry.py +1585 -0
  19. taskproof/schemas/result.json +58 -0
  20. taskproof/sql/schema.sql +70 -0
  21. taskproof/storage.py +372 -0
  22. taskproof/verify.py +615 -0
  23. taskproof/web/assets/MatrixView-BM8nu9s2.css +446 -0
  24. taskproof/web/assets/MatrixView-BM8nu9s2.css.gz +0 -0
  25. taskproof/web/assets/MatrixView-BMsawnxh.js +475 -0
  26. taskproof/web/assets/MatrixView-BMsawnxh.js.gz +0 -0
  27. taskproof/web/assets/ProjectsView-BcXcx5Gw.js +302 -0
  28. taskproof/web/assets/ProjectsView-BcXcx5Gw.js.gz +0 -0
  29. taskproof/web/assets/ProjectsView-CqNFL-fi.css +23 -0
  30. taskproof/web/assets/SettingsView-D_-waf0s.js +585 -0
  31. taskproof/web/assets/SettingsView-D_-waf0s.js.gz +0 -0
  32. taskproof/web/assets/SettingsView-aqTS3ubB.css +19 -0
  33. taskproof/web/assets/TaskDrawer-6JoGTH0s.js +597 -0
  34. taskproof/web/assets/TaskDrawer-6JoGTH0s.js.gz +0 -0
  35. taskproof/web/assets/TaskDrawer-N299VKzd.css +465 -0
  36. taskproof/web/assets/TaskDrawer-N299VKzd.css.gz +0 -0
  37. taskproof/web/assets/TasksView-BWhSHCHi.js +114 -0
  38. taskproof/web/assets/TasksView-BWhSHCHi.js.gz +0 -0
  39. taskproof/web/assets/TasksView-Bn08731V.css +30 -0
  40. taskproof/web/assets/icon-Dw-ohsdc.png +0 -0
  41. taskproof/web/assets/index-B-PLdDbR.js +75421 -0
  42. taskproof/web/assets/index-B-PLdDbR.js.gz +0 -0
  43. taskproof/web/assets/index-NKj7kbYl.css +1234 -0
  44. taskproof/web/assets/index-NKj7kbYl.css.gz +0 -0
  45. taskproof/web/index.html +23 -0
  46. taskproof-0.3.0.dist-info/METADATA +470 -0
  47. taskproof-0.3.0.dist-info/RECORD +51 -0
  48. taskproof-0.3.0.dist-info/WHEEL +5 -0
  49. taskproof-0.3.0.dist-info/entry_points.txt +2 -0
  50. taskproof-0.3.0.dist-info/licenses/LICENSE +201 -0
  51. taskproof-0.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,446 @@
1
+
2
+ .tp-card[data-v-695467c5] {
3
+ display: block;
4
+ width: 100%;
5
+ position: relative;
6
+ overflow: hidden;
7
+ text-align: left;
8
+ background-color: var(--panel);
9
+ background-image: linear-gradient(var(--w), var(--w));
10
+ border: 1px solid var(--rule);
11
+ border-left: 3px solid var(--c);
12
+ border-radius: var(--r-card);
13
+ padding: 8px 10px 9px 11px;
14
+ color: var(--ink);
15
+ cursor: pointer;
16
+ font: inherit;
17
+ }
18
+ .tp-card + .tp-card[data-v-695467c5] {
19
+ margin-top: 6px;
20
+ }
21
+ .tp-card[data-v-695467c5]:hover {
22
+ background-image: linear-gradient(var(--w), var(--w)), linear-gradient(var(--rule-2), var(--rule-2));
23
+ }
24
+ .tp-card[aria-expanded='true'][data-v-695467c5] {
25
+ box-shadow: 0 0 0 2px var(--accent);
26
+ }
27
+ .tp-card[data-v-695467c5]:focus-visible {
28
+ outline: 2px solid var(--accent);
29
+ outline-offset: 1px;
30
+ }
31
+ .line-1[data-v-695467c5] {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: 7px;
35
+ }
36
+ .cid[data-v-695467c5] {
37
+ font: 10px/1 var(--mono);
38
+ color: var(--ink-3);
39
+ overflow: hidden;
40
+ text-overflow: ellipsis;
41
+ white-space: nowrap;
42
+ }
43
+ .tail[data-v-695467c5] {
44
+ margin-left: auto;
45
+ display: flex;
46
+ align-items: center;
47
+ gap: 5px;
48
+ flex: none;
49
+ }
50
+ .stamp[data-v-695467c5] {
51
+ font: 600 9.5px/1 var(--mono);
52
+ color: var(--ink-3);
53
+ border: 1px solid var(--rule);
54
+ border-radius: 5px;
55
+ padding: 2px 5px;
56
+ }
57
+ .stamp.good[data-v-695467c5] {
58
+ color: var(--ok);
59
+ border-color: transparent;
60
+ background: var(--w-done);
61
+ }
62
+ .stamp.bad[data-v-695467c5] {
63
+ color: var(--c-failed);
64
+ border-color: transparent;
65
+ background: var(--w-failed);
66
+ }
67
+ /* The chevron is the disclosure affordance: it turns to point down while the
68
+ drawer is open. */
69
+ .chev[data-v-695467c5] {
70
+ font: 8px/1 var(--sans);
71
+ color: var(--ink-4);
72
+ transition: transform 0.15s;
73
+ }
74
+ .tp-card[aria-expanded='true'] .chev[data-v-695467c5] {
75
+ transform: rotate(90deg);
76
+ color: var(--ink-2);
77
+ }
78
+ .line-2[data-v-695467c5] {
79
+ display: -webkit-box;
80
+ margin-top: 5px;
81
+ font-size: 12px;
82
+ line-height: 1.45;
83
+ -webkit-line-clamp: 2;
84
+ -webkit-box-orient: vertical;
85
+ overflow: hidden;
86
+ color: var(--ink);
87
+ }
88
+ .tp-card[data-status='done'] .line-2[data-v-695467c5] {
89
+ color: var(--ink-2);
90
+ }
91
+ .meta[data-v-695467c5] {
92
+ display: flex;
93
+ flex-wrap: wrap;
94
+ gap: 10px;
95
+ margin-top: 7px;
96
+ font: 9.5px/1 var(--mono);
97
+ color: var(--ink-4);
98
+ }
99
+ @media (prefers-reduced-motion: reduce) {
100
+ .chev[data-v-695467c5] {
101
+ transition: none;
102
+ }
103
+ }
104
+
105
+ .matrix-view[data-v-6af3c04d] {
106
+ display: flex;
107
+ flex-direction: column;
108
+ min-height: 0;
109
+ flex: 1;
110
+ }
111
+ /* The matrix row: the project multi-select and the time range. Both scope the
112
+ whole board, six status columns (泳道) at once; there is no third control in
113
+ the normal state. */
114
+ .boardbar[data-v-6af3c04d] {
115
+ flex: none;
116
+ display: flex;
117
+ align-items: center;
118
+ gap: 14px;
119
+ padding: 7px 16px;
120
+ border-bottom: 1px solid var(--rule-2);
121
+ font: 12px/1 var(--sans);
122
+ color: var(--ink-3);
123
+ }
124
+ .boardbar .fld[data-v-6af3c04d] {
125
+ display: inline-flex;
126
+ align-items: center;
127
+ gap: 7px;
128
+ }
129
+ .boardbar .sel[data-v-6af3c04d] {
130
+ width: 128px;
131
+ }
132
+ .boardbar .sel-projects[data-v-6af3c04d] {
133
+ width: 240px;
134
+ }
135
+ /* The right-hand cluster: the hidden-column undo, then the capped warning.
136
+ Both are notes, not filters, so they ride at the far end of the row rather
137
+ than sitting inline with the two scoping controls. */
138
+ .boardbar .rest[data-v-6af3c04d] {
139
+ display: inline-flex;
140
+ align-items: center;
141
+ gap: 14px;
142
+ margin-left: auto;
143
+ }
144
+ /* The undo for hidden columns: not a filter, an escape hatch. It reads as a
145
+ button because clicking it brings every hidden column back. */
146
+ .boardbar .hidden-lanes[data-v-6af3c04d] {
147
+ display: inline-flex;
148
+ align-items: center;
149
+ padding: 4px 10px;
150
+ border: 1px solid var(--rule);
151
+ border-radius: var(--r-ctl);
152
+ background: var(--panel);
153
+ color: var(--ink-2);
154
+ font: 11.5px/1 var(--sans);
155
+ cursor: pointer;
156
+ }
157
+ .boardbar .hidden-lanes[data-v-6af3c04d]:hover {
158
+ background: var(--raise);
159
+ }
160
+ /* The capped warning is a note, not an alarm: the amber of "incomplete", not
161
+ the red of "failed". While the budget can still rise it carries its own
162
+ "继续取回" so the reader can pull the older window; once the cap is reached
163
+ that button would be a dead click, so the note states the limit instead. */
164
+ .boardbar .cap[data-v-6af3c04d] {
165
+ display: inline-flex;
166
+ align-items: center;
167
+ gap: 10px;
168
+ font: 11.5px/1.2 var(--sans);
169
+ color: var(--c-timeout);
170
+ }
171
+ .boardbar .cap .grow[data-v-6af3c04d] {
172
+ flex: none;
173
+ padding: 4px 10px;
174
+ border: 1px solid var(--rule);
175
+ border-radius: var(--r-ctl);
176
+ background: var(--panel);
177
+ color: inherit;
178
+ font: 11.5px/1 var(--sans);
179
+ cursor: pointer;
180
+ }
181
+ .boardbar .cap .grow[data-v-6af3c04d]:hover {
182
+ background: var(--raise);
183
+ }
184
+ .matrix[data-v-6af3c04d] {
185
+ flex: 1;
186
+ overflow: auto;
187
+ min-width: 0;
188
+ /* No top padding: a scroll container's padding-top is not covered by a
189
+ `top: 0` sticky header, so cards used to scroll through that strip. The
190
+ 10px breathing room now lives in `.hd`'s own top padding, under its
191
+ opaque background. */
192
+ padding: 0 0 24px;
193
+ }
194
+ /* The column count is the *visible* column count -- `grid-template-columns`
195
+ is written from `lanes` (see `gridTracks`), so it rises and falls with the
196
+ show/hide switches. This must never be re-pinned to a literal: a track count
197
+ that disagrees with the header/cell loop pushes each project's lane into the
198
+ next column and the rows interleave, silently. 列数 = 可见列数. */
199
+ .grid[data-v-6af3c04d] {
200
+ display: grid;
201
+ align-content: start;
202
+ min-height: 100%;
203
+ padding: 0 10px;
204
+ }
205
+ .hd[data-v-6af3c04d] {
206
+ position: sticky;
207
+ top: 0;
208
+ z-index: 3;
209
+ display: flex;
210
+ flex-wrap: wrap;
211
+ align-content: flex-start;
212
+ justify-content: space-between;
213
+ align-items: center;
214
+ gap: 8px;
215
+ padding: 18px 10px 9px;
216
+ font: 500 12px/1 var(--sans);
217
+ color: var(--ink-2);
218
+ background: var(--bg);
219
+ }
220
+ /* The pinned band has to be opaque all the way down to the first card, not
221
+ just to the header's own box: a sliver of card scrolling up between the
222
+ header's lower edge and the first card reads as the header being
223
+ see-through (the TP-card40 穿透). `::after` extends the band across that
224
+ seam and -- because a pseudo-element is hit-tested as the box that owns it
225
+ -- every pixel of the seam answers `.hd` (or the `.fold` it carries) rather
226
+ than a card. `background: inherit` keeps the zebra columns' tint, and the
227
+ band's bottom rule moves here so the seam reads as part of the header. */
228
+ .hd[data-v-6af3c04d]::after {
229
+ content: '';
230
+ position: absolute;
231
+ left: 0;
232
+ right: 0;
233
+ top: 100%;
234
+ height: 10px;
235
+ background: inherit;
236
+ border-bottom: 1px solid var(--rule-2);
237
+ }
238
+ .hd .lb[data-v-6af3c04d] {
239
+ display: inline-flex;
240
+ align-items: center;
241
+ gap: 7px;
242
+ }
243
+ .hd .rt[data-v-6af3c04d] {
244
+ display: inline-flex;
245
+ align-items: center;
246
+ gap: 6px;
247
+ }
248
+ /* The band must answer as the header itself: the label and tally are
249
+ decoration, so they do not intercept a hit -- only the hide switch does. The
250
+ chip is a real control in `.hdctl`, not part of this decoration layer. */
251
+ .hd .lb[data-v-6af3c04d],
252
+ .hd .rt[data-v-6af3c04d] {
253
+ pointer-events: none;
254
+ }
255
+ .hd .rt .lane-hide[data-v-6af3c04d] {
256
+ pointer-events: auto;
257
+ }
258
+ .hd .rt .lane-hide[data-v-6af3c04d] * {
259
+ pointer-events: none;
260
+ }
261
+ /* The per-column hide switch. Same shape in every header, so the row reads as
262
+ one control repeated, not a menu. It is the header's own column it hides. */
263
+ .hd .lane-hide[data-v-6af3c04d] {
264
+ flex: none;
265
+ display: inline-flex;
266
+ align-items: center;
267
+ justify-content: center;
268
+ width: 20px;
269
+ height: 20px;
270
+ padding: 0;
271
+ border: 1px solid transparent;
272
+ border-radius: 5px;
273
+ background: transparent;
274
+ color: var(--ink-4);
275
+ cursor: pointer;
276
+ }
277
+ .hd .lane-hide[data-v-6af3c04d]:hover {
278
+ border-color: var(--rule);
279
+ background: var(--panel);
280
+ color: var(--ink-2);
281
+ }
282
+ /* The corner is the lane column's own header, so it is sticky on BOTH axes:
283
+ it rides with the header row vertically and with the lane column
284
+ horizontally. It therefore has to outrank both -- z 4 sits above the
285
+ header's 3 and the lane's 2 -- and carry its own opaque background, so
286
+ neither the first lane cell nor the first status column can show through
287
+ the intersection. The background is the prototype's corner colour (--bg). */
288
+ .hd.corner[data-v-6af3c04d] {
289
+ position: sticky;
290
+ top: 0;
291
+ left: 0;
292
+ z-index: 4;
293
+ justify-content: flex-start;
294
+ padding-left: 4px;
295
+ color: var(--ink-3);
296
+ font-size: 11.5px;
297
+ background: var(--bg);
298
+ }
299
+ /* Column zebra: every other status column carries a faint tint, on both the
300
+ header and the cells, so the band runs the full height and neighbouring
301
+ columns cannot be read into each other. */
302
+ .zcol[data-v-6af3c04d] {
303
+ background-color: var(--zebra);
304
+ }
305
+ .lane[data-v-6af3c04d] {
306
+ position: sticky;
307
+ left: 0;
308
+ z-index: 2;
309
+ padding: 12px 12px 12px 4px;
310
+ background-color: var(--bg);
311
+ border-right: 1px solid var(--rule-2);
312
+ border-bottom: 1px solid var(--rule);
313
+ }
314
+ .lane .name[data-v-6af3c04d] {
315
+ font: 600 12.5px/1 var(--mono);
316
+ color: var(--ink);
317
+ }
318
+ .lane .pth[data-v-6af3c04d] {
319
+ margin-top: 5px;
320
+ font: 10.5px/1.35 var(--mono);
321
+ color: var(--ink-4);
322
+ overflow-wrap: anywhere;
323
+ }
324
+ .lane .tally[data-v-6af3c04d] {
325
+ display: flex;
326
+ flex-wrap: wrap;
327
+ gap: 8px;
328
+ margin-top: 7px;
329
+ font: 10.5px/1 var(--mono);
330
+ color: var(--ink-3);
331
+ }
332
+ .lane .tally .bad[data-v-6af3c04d] {
333
+ color: var(--c-failed);
334
+ font-weight: 600;
335
+ }
336
+ /* Row separator: the lane and the cells each draw their own bottom border, and
337
+ because they share a grid row the two lines meet into one. */
338
+ .mcell[data-v-6af3c04d] {
339
+ min-height: 26px;
340
+ padding: 10px 6px;
341
+ border-bottom: 1px solid var(--rule);
342
+ }
343
+ .mcell .dash[data-v-6af3c04d] {
344
+ padding-top: 2px;
345
+ font: 11px/1 var(--mono);
346
+ color: var(--ink-4);
347
+ opacity: 0.4;
348
+ }
349
+ /* The per-column control band: the chip is the only thing on this full-width
350
+ line under the label row, so the header keeps one self-describing number. */
351
+ .hdctl[data-v-6af3c04d] {
352
+ flex: 1 0 100%;
353
+ display: flex;
354
+ align-items: center;
355
+ min-width: 0;
356
+ }
357
+ /* Do not style Element Plus's internal `.el-tooltip__trigger` to lay out this
358
+ control: that class also lands on .cap-chip, and its extra class selector
359
+ outranks .cap-chip's own display rule. Own the full-width layout here. */
360
+ .cap-dd[data-v-6af3c04d] {
361
+ display: block;
362
+ width: 100%;
363
+ min-width: 0;
364
+ }
365
+ /* Every column's chip. Its own click stops, but the Element Plus trigger still
366
+ sees the same click and opens the menu. */
367
+ .cap-chip[data-v-6af3c04d] {
368
+ display: inline-flex;
369
+ align-items: center;
370
+ justify-content: space-between;
371
+ gap: 8px;
372
+ width: 100%;
373
+ min-width: 0;
374
+ padding: 8px 9px;
375
+ border: 1px solid var(--rule);
376
+ border-radius: var(--r-ctl);
377
+ background: var(--panel);
378
+ color: var(--ink-2);
379
+ font: 11.5px/1 var(--sans);
380
+ text-align: left;
381
+ cursor: pointer;
382
+ }
383
+ .cap-chip[data-v-6af3c04d]:hover,
384
+ .cap-chip[data-v-6af3c04d]:focus-visible {
385
+ border-color: var(--rule-2);
386
+ background: var(--raise);
387
+ color: var(--ink);
388
+ }
389
+ .cap-chip-label[data-v-6af3c04d] {
390
+ flex: 1 1 auto;
391
+ min-width: 0;
392
+ overflow: hidden;
393
+ text-overflow: ellipsis;
394
+ white-space: nowrap;
395
+ }
396
+ .cap-caret[data-v-6af3c04d] {
397
+ flex: none;
398
+ color: var(--ink-4);
399
+ display: inline-flex;
400
+ align-items: center;
401
+ }
402
+
403
+ .cap-menu-popper {
404
+ min-width: 176px;
405
+ }
406
+ .cap-menu-popper .el-dropdown-menu__item {
407
+ justify-content: space-between;
408
+ gap: 16px;
409
+ min-height: 30px;
410
+ padding: 7px 10px;
411
+ font: 12px/1.2 var(--sans);
412
+ }
413
+ .cap-menu-popper .el-dropdown-menu__item.cap-menu-title {
414
+ color: var(--ink-4);
415
+ font-size: 10.5px;
416
+ cursor: default;
417
+ }
418
+ .cap-menu-popper .cap-check {
419
+ flex: none;
420
+ color: var(--accent);
421
+ font-weight: 700;
422
+ }
423
+ .sel-projects-popper .sel-head {
424
+ display: flex;
425
+ gap: 6px;
426
+ padding: 6px 8px;
427
+ border-bottom: 1px solid var(--rule-2);
428
+ }
429
+ .sel-projects-popper .sel-head button {
430
+ flex: 1;
431
+ font: 11.5px/1 var(--sans);
432
+ color: var(--accent);
433
+ background: var(--panel);
434
+ border: 1px solid var(--rule);
435
+ border-radius: var(--r-ctl);
436
+ padding: 5px 8px;
437
+ cursor: pointer;
438
+ }
439
+ .sel-projects-popper .sel-head button:hover:not(:disabled) {
440
+ background: var(--raise);
441
+ }
442
+ .sel-projects-popper .sel-head button:disabled {
443
+ color: var(--ink-4);
444
+ opacity: 0.6;
445
+ cursor: default;
446
+ }