@dylanpiercey/work 0.0.39 → 0.0.40
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.
- package/README.md +11 -1
- package/bin/work.mjs +76 -1
- package/dist/index.mjs +1101 -400
- package/dist/public/assets/{_D2YiTEdV2.js → _-KsWGHKz2.js} +2 -2
- package/dist/public/assets/{_D2YiTEdV2.js.map → _-KsWGHKz2.js.map} +1 -1
- package/dist/public/assets/{_D2ch0L3l2.js → _3VenI2OT2.js} +2 -2
- package/dist/public/assets/{_D2ch0L3l2.js.map → _3VenI2OT2.js.map} +1 -1
- package/dist/public/assets/{_CM1Bz2e2.js → _8DPiXP2D.js} +2 -2
- package/dist/public/assets/{_CM1Bz2e2.js.map → _8DPiXP2D.js.map} +1 -1
- package/dist/public/assets/{_CXeLdopD2.js → _8UwDOo_Z2.js} +2 -2
- package/dist/public/assets/{_CXeLdopD2.js.map → _8UwDOo_Z2.js.map} +1 -1
- package/dist/public/assets/{_aF_XxRRK.js → _B0ILW1ln.js} +2 -2
- package/dist/public/assets/{_aF_XxRRK.js.map → _B0ILW1ln.js.map} +1 -1
- package/dist/public/assets/{_bcyfHqN_2.js → _B7cE3DDh2.js} +2 -2
- package/dist/public/assets/{_bcyfHqN_2.js.map → _B7cE3DDh2.js.map} +1 -1
- package/dist/public/assets/{_CR7soDA62.js → _B8CG1lYk2.js} +2 -2
- package/dist/public/assets/{_CR7soDA62.js.map → _B8CG1lYk2.js.map} +1 -1
- package/dist/public/assets/{_frxegHGP.js → _BFoRA3M-.js} +2 -2
- package/dist/public/assets/{_frxegHGP.js.map → _BFoRA3M-.js.map} +1 -1
- package/dist/public/assets/{_BlBppazN.js → _BHNTdpyr.js} +2 -2
- package/dist/public/assets/{_BlBppazN.js.map → _BHNTdpyr.js.map} +1 -1
- package/dist/public/assets/{_DIhu80mU.js → _BJLP6wPD.js} +2 -2
- package/dist/public/assets/{_DIhu80mU.js.map → _BJLP6wPD.js.map} +1 -1
- package/dist/public/assets/{_Cry0Vu092.js → _BKoDBxkc2.js} +2 -2
- package/dist/public/assets/{_Cry0Vu092.js.map → _BKoDBxkc2.js.map} +1 -1
- package/dist/public/assets/{_DzkSj4zS2.js → _BPQMLvu02.js} +2 -2
- package/dist/public/assets/{_DzkSj4zS2.js.map → _BPQMLvu02.js.map} +1 -1
- package/dist/public/assets/{_Dlge38I0.js → _BTgtIJbs.js} +2 -2
- package/dist/public/assets/{_Dlge38I0.js.map → _BTgtIJbs.js.map} +1 -1
- package/dist/public/assets/{_B0tTvCKz.js → _BVhbSv_7.js} +2 -2
- package/dist/public/assets/{_B0tTvCKz.js.map → _BVhbSv_7.js.map} +1 -1
- package/dist/public/assets/{_BpjzFBgX.js → _BXFyaVzV.js} +2 -2
- package/dist/public/assets/{_BpjzFBgX.js.map → _BXFyaVzV.js.map} +1 -1
- package/dist/public/assets/{_DrAyvf042.js → _Ba56VGPa2.js} +2 -2
- package/dist/public/assets/{_DrAyvf042.js.map → _Ba56VGPa2.js.map} +1 -1
- package/dist/public/assets/{_Bq_UbhoI2.js → _BbczFSm62.js} +2 -2
- package/dist/public/assets/{_Bq_UbhoI2.js.map → _BbczFSm62.js.map} +1 -1
- package/dist/public/assets/{_B222bJOA.js → _BdxRwSdd.js} +2 -2
- package/dist/public/assets/{_B222bJOA.js.map → _BdxRwSdd.js.map} +1 -1
- package/dist/public/assets/{_DpZRF37u.js → _BgyAIeMk.js} +2 -2
- package/dist/public/assets/{_DpZRF37u.js.map → _BgyAIeMk.js.map} +1 -1
- package/dist/public/assets/{_Biu1sMqL2.js → _BjYoD_6z2.js} +2 -2
- package/dist/public/assets/{_Biu1sMqL2.js.map → _BjYoD_6z2.js.map} +1 -1
- package/dist/public/assets/{_yNCqh4w6.js → _BlnfI-cd.js} +2 -2
- package/dist/public/assets/{_yNCqh4w6.js.map → _BlnfI-cd.js.map} +1 -1
- package/dist/public/assets/{_BTD-E3MH.js → _Bm15UJ5r.js} +2 -2
- package/dist/public/assets/{_BTD-E3MH.js.map → _Bm15UJ5r.js.map} +1 -1
- package/dist/public/assets/{_Dq_5FFld.js → _BmY-aR2i.js} +2 -2
- package/dist/public/assets/{_Dq_5FFld.js.map → _BmY-aR2i.js.map} +1 -1
- package/dist/public/assets/{_CfjmjCpz2.js → _Bq9rbiCa2.js} +2 -2
- package/dist/public/assets/{_CfjmjCpz2.js.map → _Bq9rbiCa2.js.map} +1 -1
- package/dist/public/assets/{_KoAN5c4U.js → _Br2uo0OK.js} +2 -2
- package/dist/public/assets/{_KoAN5c4U.js.map → _Br2uo0OK.js.map} +1 -1
- package/dist/public/assets/{_DN7QgLB-.js → _Brtx9zLF.js} +2 -2
- package/dist/public/assets/{_DN7QgLB-.js.map → _Brtx9zLF.js.map} +1 -1
- package/dist/public/assets/{_DZOjtuBx.js → _BtnmnAxJ.js} +2 -2
- package/dist/public/assets/{_DZOjtuBx.js.map → _BtnmnAxJ.js.map} +1 -1
- package/dist/public/assets/{_RKCdcM6s.js → _Bv_RWYiQ.js} +2 -2
- package/dist/public/assets/{_RKCdcM6s.js.map → _Bv_RWYiQ.js.map} +1 -1
- package/dist/public/assets/{_C9FF4Nwt2.js → _BvtYDSuT2.js} +2 -2
- package/dist/public/assets/{_C9FF4Nwt2.js.map → _BvtYDSuT2.js.map} +1 -1
- package/dist/public/assets/{_CGlduZ09.js → _C83jn7M7.js} +2 -2
- package/dist/public/assets/{_CGlduZ09.js.map → _C83jn7M7.js.map} +1 -1
- package/dist/public/assets/{_Bn3jsc1x2.js → _CA4_OXC62.js} +2 -2
- package/dist/public/assets/{_Bn3jsc1x2.js.map → _CA4_OXC62.js.map} +1 -1
- package/dist/public/assets/{_CudIJ9N1.js → _CEr-0D0d.js} +2 -2
- package/dist/public/assets/{_CudIJ9N1.js.map → _CEr-0D0d.js.map} +1 -1
- package/dist/public/assets/{_3_h0JIqF2.js → _CGlOgonA2.js} +2 -2
- package/dist/public/assets/{_3_h0JIqF2.js.map → _CGlOgonA2.js.map} +1 -1
- package/dist/public/assets/{_BWmXhThI.js → _CLJ7h8rZ.js} +2 -2
- package/dist/public/assets/{_BWmXhThI.js.map → _CLJ7h8rZ.js.map} +1 -1
- package/dist/public/assets/{_WOCAvL642.js → _CV6LlXY32.js} +2 -2
- package/dist/public/assets/{_WOCAvL642.js.map → _CV6LlXY32.js.map} +1 -1
- package/dist/public/assets/{_B9ZTM6vy.js → _CVFOAkWc.js} +2 -2
- package/dist/public/assets/{_B9ZTM6vy.js.map → _CVFOAkWc.js.map} +1 -1
- package/dist/public/assets/{_BwHPDQ2K2.js → _CVgZFxTy2.js} +2 -2
- package/dist/public/assets/{_BwHPDQ2K2.js.map → _CVgZFxTy2.js.map} +1 -1
- package/dist/public/assets/{__dMnQCKa.js → _CWG8S2bO.js} +2 -2
- package/dist/public/assets/{__dMnQCKa.js.map → _CWG8S2bO.js.map} +1 -1
- package/dist/public/assets/{_8FQvJvvC.js → _CX2FR9en.js} +2 -2
- package/dist/public/assets/{_8FQvJvvC.js.map → _CX2FR9en.js.map} +1 -1
- package/dist/public/assets/{_CN_uVutc.js → _CcyXwmyV.js} +2 -2
- package/dist/public/assets/{_CN_uVutc.js.map → _CcyXwmyV.js.map} +1 -1
- package/dist/public/assets/{_CWq_CViy.js → _CfNBAgk5.js} +2 -2
- package/dist/public/assets/{_CWq_CViy.js.map → _CfNBAgk5.js.map} +1 -1
- package/dist/public/assets/{_0YVFvNq7.js → _CmH32z5I.js} +2 -2
- package/dist/public/assets/{_0YVFvNq7.js.map → _CmH32z5I.js.map} +1 -1
- package/dist/public/assets/{_D51cBuRP.js → _Cn-JhCBl.js} +2 -2
- package/dist/public/assets/{_D51cBuRP.js.map → _Cn-JhCBl.js.map} +1 -1
- package/dist/public/assets/{_CGMrqKQx.js → _Cn880iWo.js} +2 -2
- package/dist/public/assets/{_CGMrqKQx.js.map → _Cn880iWo.js.map} +1 -1
- package/dist/public/assets/{_CFFd0jR-2.js → _CpelmBB72.js} +2 -2
- package/dist/public/assets/{_CFFd0jR-2.js.map → _CpelmBB72.js.map} +1 -1
- package/dist/public/assets/{_zW4ABdBd.js → _CqS9_RIm.js} +2 -2
- package/dist/public/assets/{_zW4ABdBd.js.map → _CqS9_RIm.js.map} +1 -1
- package/dist/public/assets/{_B-8ckAju2.js → _Ct5nAVXE2.js} +2 -2
- package/dist/public/assets/{_B-8ckAju2.js.map → _Ct5nAVXE2.js.map} +1 -1
- package/dist/public/assets/{_D7dsIO-O2.js → _Cu-YDqqS2.js} +2 -2
- package/dist/public/assets/{_D7dsIO-O2.js.map → _Cu-YDqqS2.js.map} +1 -1
- package/dist/public/assets/{_Bl7Ludpl.js → _Cw00Etn-.js} +2 -2
- package/dist/public/assets/{_Bl7Ludpl.js.map → _Cw00Etn-.js.map} +1 -1
- package/dist/public/assets/{_D79L--fl.js → _Cy0mebiK.js} +2 -2
- package/dist/public/assets/{_D79L--fl.js.map → _Cy0mebiK.js.map} +1 -1
- package/dist/public/assets/{_CUhN1PMI.js → _D1KsrNGN.js} +2 -2
- package/dist/public/assets/{_CUhN1PMI.js.map → _D1KsrNGN.js.map} +1 -1
- package/dist/public/assets/{_CsBnKH_a2.js → _D63K5MAL2.js} +2 -2
- package/dist/public/assets/{_CsBnKH_a2.js.map → _D63K5MAL2.js.map} +1 -1
- package/dist/public/assets/{_CYFv9QGU.js → _DDn1qNlx.js} +2 -2
- package/dist/public/assets/{_CYFv9QGU.js.map → _DDn1qNlx.js.map} +1 -1
- package/dist/public/assets/{_B0Zx9TVd.js → _DGWkqOrB.js} +2 -2
- package/dist/public/assets/{_B0Zx9TVd.js.map → _DGWkqOrB.js.map} +1 -1
- package/dist/public/assets/{_BQHdIsH-.js → _DIsTDKVR.js} +2 -2
- package/dist/public/assets/{_BQHdIsH-.js.map → _DIsTDKVR.js.map} +1 -1
- package/dist/public/assets/{_9mIlYM38.js → _DQ-kE1KO.js} +2 -2
- package/dist/public/assets/{_9mIlYM38.js.map → _DQ-kE1KO.js.map} +1 -1
- package/dist/public/assets/{_haaSjWYo.js → _DXPT_5Ww.js} +2 -2
- package/dist/public/assets/{_haaSjWYo.js.map → _DXPT_5Ww.js.map} +1 -1
- package/dist/public/assets/{_Dh3Zdz4W.js → _Dgbb7WCq.js} +2 -2
- package/dist/public/assets/{_Dh3Zdz4W.js.map → _Dgbb7WCq.js.map} +1 -1
- package/dist/public/assets/{_B1sHSj4w2.js → _DiGEIi7y2.js} +2 -2
- package/dist/public/assets/{_B1sHSj4w2.js.map → _DiGEIi7y2.js.map} +1 -1
- package/dist/public/assets/{_D4GRfjHF.js → _DlycnL0G.js} +2 -2
- package/dist/public/assets/{_D4GRfjHF.js.map → _DlycnL0G.js.map} +1 -1
- package/dist/public/assets/{_CVepAYMH.js → _DsnM-qIE.js} +2 -2
- package/dist/public/assets/{_CVepAYMH.js.map → _DsnM-qIE.js.map} +1 -1
- package/dist/public/assets/{_gCS79yat.js → _DvhrN_AC.js} +2 -2
- package/dist/public/assets/{_gCS79yat.js.map → _DvhrN_AC.js.map} +1 -1
- package/dist/public/assets/{_Cj248HDV.js → _Dzmzf0jy.js} +2 -2
- package/dist/public/assets/{_Cj248HDV.js.map → _Dzmzf0jy.js.map} +1 -1
- package/dist/public/assets/{_wqbV3ClO2.js → _FK3N8vMM2.js} +2 -2
- package/dist/public/assets/{_wqbV3ClO2.js.map → _FK3N8vMM2.js.map} +1 -1
- package/dist/public/assets/{_HibLhaHH.js → _Ivuhnz8D.js} +2 -2
- package/dist/public/assets/{_HibLhaHH.js.map → _Ivuhnz8D.js.map} +1 -1
- package/dist/public/assets/{_IEZe9nw42.js → _TKY_rFIy2.js} +2 -2
- package/dist/public/assets/{_IEZe9nw42.js.map → _TKY_rFIy2.js.map} +1 -1
- package/dist/public/assets/{_BWm0ZgI6.js → _UeUsduDg.js} +2 -2
- package/dist/public/assets/{_BWm0ZgI6.js.map → _UeUsduDg.js.map} +1 -1
- package/dist/public/assets/{_BCGHghp3.js → _ZG408fQc.js} +2 -2
- package/dist/public/assets/{_BCGHghp3.js.map → _ZG408fQc.js.map} +1 -1
- package/dist/public/assets/{_CF4aOEw0.js → _dpF9TA5S.js} +2 -2
- package/dist/public/assets/{_CF4aOEw0.js.map → _dpF9TA5S.js.map} +1 -1
- package/dist/public/assets/{_Cd1ynaVf.js → _fIQDai7d.js} +2 -2
- package/dist/public/assets/{_Cd1ynaVf.js.map → _fIQDai7d.js.map} +1 -1
- package/dist/public/assets/{_DpJaOsUS2.js → _irjxI44N2.js} +2 -2
- package/dist/public/assets/{_DpJaOsUS2.js.map → _irjxI44N2.js.map} +1 -1
- package/dist/public/assets/{_CuUIu7A0.js → _jifvQF0M.js} +2 -2
- package/dist/public/assets/{_CuUIu7A0.js.map → _jifvQF0M.js.map} +1 -1
- package/dist/public/assets/{_BaVw_5rb.js → _mH9R9oGB.js} +2 -2
- package/dist/public/assets/{_BaVw_5rb.js.map → _mH9R9oGB.js.map} +1 -1
- package/dist/public/assets/{_CxK19rXP.js → _pUoTA7Pg.js} +2 -2
- package/dist/public/assets/{_CxK19rXP.js.map → _pUoTA7Pg.js.map} +1 -1
- package/dist/public/assets/index--QwhN0hy.css +1 -0
- package/dist/public/assets/index-CdVBL6Kf.js +1615 -0
- package/dist/public/assets/index-CdVBL6Kf.js.map +1 -0
- package/package.json +1 -1
- package/dist/public/assets/index-BJLi-qve.css +0 -1
- package/dist/public/assets/index-YZZGnWtK.js +0 -1615
- package/dist/public/assets/index-YZZGnWtK.js.map +0 -1
package/README.md
CHANGED
|
@@ -50,6 +50,14 @@ For a production build plus a background service (systemd on Linux, launchd on m
|
|
|
50
50
|
|
|
51
51
|
```sh
|
|
52
52
|
./scripts/setup-prod.sh # build + install + start the service
|
|
53
|
+
|
|
54
|
+
# While hacking on work itself, point the background service at a checkout
|
|
55
|
+
# (and back at the npm install when done):
|
|
56
|
+
cp scripts/work-source.sh ~/.local/bin/work-source && chmod +x ~/.local/bin/work-source
|
|
57
|
+
work-source local # this tree (or: work-source local /path/to/work)
|
|
58
|
+
work-source rebuild # rebuild + restart without rewriting the unit
|
|
59
|
+
work-source prod # global @dylanpiercey/work again
|
|
60
|
+
work-source # status
|
|
53
61
|
./scripts/run-prod.sh # or: build with --no-service and run manually
|
|
54
62
|
./scripts/update.sh # later: pull latest, rebuild, restart
|
|
55
63
|
```
|
|
@@ -86,7 +94,9 @@ surrounding environment still takes precedence:
|
|
|
86
94
|
WORK_BRANCH_PREFIX=rturnq
|
|
87
95
|
```
|
|
88
96
|
|
|
89
|
-
|
|
97
|
+
The usage panel (and `work usage`) reads plan/quota windows straight from each
|
|
98
|
+
agent CLI's own credentials on disk — Claude, Codex, Cursor, Grok, and Copilot
|
|
99
|
+
(via `gh`'s token). Providers you are not signed into simply say so.
|
|
90
100
|
|
|
91
101
|
PR chips refresh by polling GitHub (faster for a few minutes after a
|
|
92
102
|
local push via `repo-pushed`). No inbound GitHub webhooks are required.
|
package/bin/work.mjs
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// work setup install/refresh the background service (+ optional tunnel)
|
|
5
5
|
// work start run the server in the foreground
|
|
6
6
|
// work update upgrade the npm package and refresh the service
|
|
7
|
+
// work usage print agent plan/quota usage
|
|
7
8
|
// work version print the installed version
|
|
8
9
|
import { execFileSync, spawnSync } from "node:child_process";
|
|
9
10
|
import fs from "node:fs";
|
|
@@ -43,6 +44,9 @@ switch (command) {
|
|
|
43
44
|
case "update":
|
|
44
45
|
await update();
|
|
45
46
|
break;
|
|
47
|
+
case "usage":
|
|
48
|
+
await usage();
|
|
49
|
+
break;
|
|
46
50
|
case "version":
|
|
47
51
|
case "--version":
|
|
48
52
|
case "-v":
|
|
@@ -50,7 +54,7 @@ switch (command) {
|
|
|
50
54
|
break;
|
|
51
55
|
default:
|
|
52
56
|
console.log(
|
|
53
|
-
`work ${pkg.version}\n\nusage: work <setup|start|update|version>`,
|
|
57
|
+
`work ${pkg.version}\n\nusage: work <setup|start|update|usage|version>`,
|
|
54
58
|
);
|
|
55
59
|
}
|
|
56
60
|
|
|
@@ -60,6 +64,77 @@ async function start() {
|
|
|
60
64
|
await import(distEntry);
|
|
61
65
|
}
|
|
62
66
|
|
|
67
|
+
/** Plan/quota usage, read from the running server.
|
|
68
|
+
*
|
|
69
|
+
* The collector lives in the server bundle (src/server/usage/) so the page and
|
|
70
|
+
* this table can never disagree, which is also why this asks over HTTP instead
|
|
71
|
+
* of re-reading every provider's credentials itself. */
|
|
72
|
+
async function usage() {
|
|
73
|
+
const port = serviceEnv().PORT;
|
|
74
|
+
const url = `http://127.0.0.1:${port}/api/usage${args.includes("--refresh") ? "?refresh" : ""}`;
|
|
75
|
+
let data;
|
|
76
|
+
try {
|
|
77
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(30_000) });
|
|
78
|
+
if (!res.ok) die(`server answered ${res.status} for /api/usage`);
|
|
79
|
+
data = await res.json();
|
|
80
|
+
} catch {
|
|
81
|
+
die(`no work server on port ${port} — start one with: work start`);
|
|
82
|
+
}
|
|
83
|
+
if (args.includes("--json")) {
|
|
84
|
+
console.log(JSON.stringify(data, null, 2));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (data.error) die(data.error);
|
|
88
|
+
const agents = data.agents || [];
|
|
89
|
+
if (!agents.length) return console.log("no agent accounts found");
|
|
90
|
+
for (const agent of agents) {
|
|
91
|
+
const head = [agent.agent, agent.plan?.replace(/^default_/, "").replaceAll("_", " "), agent.account]
|
|
92
|
+
.filter(Boolean)
|
|
93
|
+
.join(" · ");
|
|
94
|
+
console.log(`\n${head}`);
|
|
95
|
+
for (const win of agent.windows || []) {
|
|
96
|
+
const pct = Math.max(0, Math.min(100, win.used_percent));
|
|
97
|
+
const filled = Math.round(pct / 10);
|
|
98
|
+
const bar = "█".repeat(filled) + "░".repeat(10 - filled);
|
|
99
|
+
const resets = until(win.resets_at);
|
|
100
|
+
console.log(
|
|
101
|
+
` ${win.window.padEnd(5)} ${bar} ${pctText(win.used_percent).padStart(5)}${resets ? ` ↻ ${resets}` : ""}`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
// Only reason a row can be empty or wrong, so it goes last and unindented
|
|
105
|
+
// enough to read as a warning rather than another window.
|
|
106
|
+
if (agent.note) console.log(` ⚠ ${agent.note}`);
|
|
107
|
+
if (agent.stale_seconds != null) {
|
|
108
|
+
console.log(` ⚠ ${short(agent.stale_seconds * 1000)} old`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** "4h" / "6d" — how long until an ISO timestamp. A reset already in the past
|
|
114
|
+
* means the window turned over and this row hasn't refreshed since, so there
|
|
115
|
+
* is no honest countdown to print. */
|
|
116
|
+
function until(iso) {
|
|
117
|
+
if (!iso) return null;
|
|
118
|
+
const ms = new Date(iso).getTime() - Date.now();
|
|
119
|
+
return ms > 0 ? short(ms) : null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Percent, with a decimal only where rounding would lie: 99.6% must not
|
|
123
|
+
* read as a spent 100%, and 0.4% must not read as an untouched 0%. */
|
|
124
|
+
function pctText(pct) {
|
|
125
|
+
const rounded = Math.round(pct);
|
|
126
|
+
return rounded !== pct && (rounded === 100 || rounded === 0)
|
|
127
|
+
? `${pct.toFixed(1)}%`
|
|
128
|
+
: `${rounded}%`;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function short(ms) {
|
|
132
|
+
const m = Math.round(ms / 60_000);
|
|
133
|
+
if (m < 60) return `${m}m`;
|
|
134
|
+
const h = Math.round(m / 60);
|
|
135
|
+
return h < 48 ? `${h}h` : `${Math.round(h / 24)}d`;
|
|
136
|
+
}
|
|
137
|
+
|
|
63
138
|
async function setup() {
|
|
64
139
|
// Runtime tools. The curl installer normally provides these; a plain
|
|
65
140
|
// `npm i -g` user may be missing them.
|