@dylanpiercey/work 0.0.48 → 0.0.50
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/bin/work.mjs +148 -1
- package/dist/_B1U5NJd1.js +2 -0
- package/dist/{_m3ryV1w6.js → _BMPRQiid.js} +15 -15
- package/dist/{_CO83dVER.js → _Bi2N56tu.js} +60 -57
- package/dist/{_Hz_qlZE1.js → _CkFSxwl9.js} +58 -58
- package/dist/index.mjs +3974 -3672
- package/dist/public/assets/{_CH4P29Yf2.js → _14Rf7auw2.js} +1 -1
- package/dist/public/assets/_14Rf7auw2.js.br +0 -0
- package/dist/public/assets/{_B49r6O_E.js → _3L9qJ2FI.js} +1 -1
- package/dist/public/assets/_3L9qJ2FI.js.br +0 -0
- package/dist/public/assets/{_I6H6F0ME.js → _46jbMvnT.js} +1 -1
- package/dist/public/assets/_46jbMvnT.js.br +0 -0
- package/dist/public/assets/{_CtErcdf92.js → _5B_C1ELg2.js} +1 -1
- package/dist/public/assets/_5B_C1ELg2.js.br +0 -0
- package/dist/public/assets/{_1oYv4fmY2.js → _6FgRPbD12.js} +1 -1
- package/dist/public/assets/_6FgRPbD12.js.br +0 -0
- package/dist/public/assets/{_BPLnh5S4.js → _8OBdOEN_.js} +1 -1
- package/dist/public/assets/_8OBdOEN_.js.br +0 -0
- package/dist/public/assets/{_C4NK2Cq5.js → _B0BWvFlM.js} +1 -1
- package/dist/public/assets/_B0BWvFlM.js.br +0 -0
- package/dist/public/assets/{_kv39JOeM.js → _B3OlqMGd.js} +1 -1
- package/dist/public/assets/_B3OlqMGd.js.br +0 -0
- package/dist/public/assets/{_CsNJf4g52.js → _B3vaoKEN2.js} +1 -1
- package/dist/public/assets/_B3vaoKEN2.js.br +0 -0
- package/dist/public/assets/{_Cf0wSsqE.js → _B7_X6QKl.js} +1 -1
- package/dist/public/assets/_B7_X6QKl.js.br +0 -0
- package/dist/public/assets/{_1cz-l3Ka.js → _B7zx6ruH.js} +1 -1
- package/dist/public/assets/_B7zx6ruH.js.br +0 -0
- package/dist/public/assets/{_Bvwr3uff.js → _BAmdta6F.js} +1 -1
- package/dist/public/assets/_BAmdta6F.js.br +0 -0
- package/dist/public/assets/{_DBN8F3s1.js → _BDs5gBRu.js} +1 -1
- package/dist/public/assets/_BDs5gBRu.js.br +0 -0
- package/dist/public/assets/{_BdbnwCKs2.js → _BHyVr2SL2.js} +1 -1
- package/dist/public/assets/_BHyVr2SL2.js.br +0 -0
- package/dist/public/assets/{_ClEKr0Tm2.js → _BKFltGNM2.js} +1 -1
- package/dist/public/assets/_BKFltGNM2.js.br +0 -0
- package/dist/public/assets/{_B2fn4I8S2.js → _BKrb_vR32.js} +1 -1
- package/dist/public/assets/_BKrb_vR32.js.br +0 -0
- package/dist/public/assets/{_BiEWaww7.js → _BM1T1EOI.js} +1 -1
- package/dist/public/assets/_BM1T1EOI.js.br +0 -0
- package/dist/public/assets/{_BhUM9ZCP.js → _BO7NVUTp.js} +1 -1
- package/dist/public/assets/_BO7NVUTp.js.br +0 -0
- package/dist/public/assets/{_Ez06j6Qv.js → _BPVwmM2e.js} +1 -1
- package/dist/public/assets/_BPVwmM2e.js.br +0 -0
- package/dist/public/assets/{_BFt-jSq-.js → _BTA9H0Q3.js} +1 -1
- package/dist/public/assets/_BTA9H0Q3.js.br +0 -0
- package/dist/public/assets/{_BRzL7uNP.js → _BVn7ySs5.js} +1 -1
- package/dist/public/assets/_BVn7ySs5.js.br +0 -0
- package/dist/public/assets/{_Ced5468N2.js → _BXOM5Rv62.js} +1 -1
- package/dist/public/assets/{_8nx9Raqx2.js → _Bfrb3Fvn2.js} +1 -1
- package/dist/public/assets/_Bfrb3Fvn2.js.br +0 -0
- package/dist/public/assets/{_CHqTBuzz2.js → _BipcKLQ82.js} +1 -1
- package/dist/public/assets/_BipcKLQ82.js.br +0 -0
- package/dist/public/assets/{_DKnLFVdw.js → _BqTMyizJ.js} +1 -1
- package/dist/public/assets/_BqTMyizJ.js.br +0 -0
- package/dist/public/assets/{_BbW3-3ve.js → _Bqk-7ZnJ.js} +1 -1
- package/dist/public/assets/_Bqk-7ZnJ.js.br +0 -0
- package/dist/public/assets/{_DLK0WouR.js → _BrIeskzm.js} +1 -1
- package/dist/public/assets/_BrIeskzm.js.br +0 -0
- package/dist/public/assets/{_CIeZtXbg2.js → _BteZRGy02.js} +1 -1
- package/dist/public/assets/_BteZRGy02.js.br +0 -0
- package/dist/public/assets/{_B-MMW3nb2.js → _Bw4RcZCP2.js} +1 -1
- package/dist/public/assets/_Bw4RcZCP2.js.br +0 -0
- package/dist/public/assets/{_DFOnuGNp.js → _C0yzBH1I.js} +1 -1
- package/dist/public/assets/_C0yzBH1I.js.br +0 -0
- package/dist/public/assets/{_K6PNL3j4.js → _CAq8JoYd.js} +1 -1
- package/dist/public/assets/_CAq8JoYd.js.br +0 -0
- package/dist/public/assets/{_DOpT45mO.js → _CG33pVWf.js} +1 -1
- package/dist/public/assets/_CG33pVWf.js.br +0 -0
- package/dist/public/assets/{_qoSWRJiT.js → _CJRnhPJ5.js} +1 -1
- package/dist/public/assets/_CJRnhPJ5.js.br +0 -0
- package/dist/public/assets/{_DHvVwuPu2.js → _CLFzw6tJ2.js} +1 -1
- package/dist/public/assets/_CLFzw6tJ2.js.br +0 -0
- package/dist/public/assets/{_CUwAZxRw.js → _CTCAIoky.js} +1 -1
- package/dist/public/assets/_CTCAIoky.js.br +0 -0
- package/dist/public/assets/{_BC2FBUbj.js → _CUk8oM8X.js} +1 -1
- package/dist/public/assets/_CUk8oM8X.js.br +0 -0
- package/dist/public/assets/{_De7fhQUT.js → _CYutj5Nn.js} +1 -1
- package/dist/public/assets/_CYutj5Nn.js.br +0 -0
- package/dist/public/assets/{_DLLEkkcM.js → _ChMN3jzE.js} +5 -5
- package/dist/public/assets/_ChMN3jzE.js.br +0 -0
- package/dist/public/assets/{_h8qSl3Me.js → _Cl5zwC6C.js} +1 -1
- package/dist/public/assets/{_Bpdzs0h4.js → _CmPpWb_a.js} +1 -1
- package/dist/public/assets/_CmPpWb_a.js.br +0 -0
- package/dist/public/assets/{_KjztUkjx.js → _CnAW-XtK.js} +1 -1
- package/dist/public/assets/_CnAW-XtK.js.br +0 -0
- package/dist/public/assets/{_BqeAAcor.js → _CoZJRwLV.js} +1 -1
- package/dist/public/assets/_CoZJRwLV.js.br +0 -0
- package/dist/public/assets/{_3i592Qvz2.js → _CpuGya-f2.js} +1 -1
- package/dist/public/assets/_CpuGya-f2.js.br +0 -0
- package/dist/public/assets/{_CbMNS899.js → _CvF3Yy4B.js} +1 -1
- package/dist/public/assets/_CvF3Yy4B.js.br +0 -0
- package/dist/public/assets/{_DBn74psf2.js → _CwesB1Zy2.js} +1 -1
- package/dist/public/assets/{_DT9Qs1il.js → _CxVYrK29.js} +1 -1
- package/dist/public/assets/_CxVYrK29.js.br +0 -0
- package/dist/public/assets/{_Bg9mkw0u.js → _D4Agz1BW.js} +1 -1
- package/dist/public/assets/_D4Agz1BW.js.br +0 -0
- package/dist/public/assets/{_CQDBqJkT.js → _D7t5subj.js} +1 -1
- package/dist/public/assets/_D7t5subj.js.br +0 -0
- package/dist/public/assets/{_Bhnzfac_.js → _D8LNkUUk.js} +1 -1
- package/dist/public/assets/_D8LNkUUk.js.br +0 -0
- package/dist/public/assets/{_ByiODT9w.js → _DKExcf_t.js} +1 -1
- package/dist/public/assets/_DKExcf_t.js.br +0 -0
- package/dist/public/assets/{_Dn4wMX5v.js → _DaBnEzqR.js} +1 -1
- package/dist/public/assets/_DaBnEzqR.js.br +0 -0
- package/dist/public/assets/{_CASsRCtt.js → _DaFCn9AP.js} +1 -1
- package/dist/public/assets/_DaFCn9AP.js.br +0 -0
- package/dist/public/assets/{_o1of2_lP.js → _DmD3gC-H.js} +1 -1
- package/dist/public/assets/_DmD3gC-H.js.br +0 -0
- package/dist/public/assets/{_DVPPxo4e2.js → _Dp1uWzpq2.js} +1 -1
- package/dist/public/assets/_Dp1uWzpq2.js.br +0 -0
- package/dist/public/assets/{_DjLQQUoq.js → _DrzuvLS6.js} +1 -1
- package/dist/public/assets/_DrzuvLS6.js.br +0 -0
- package/dist/public/assets/{_KVpYyL9A.js → _Dwi7467c.js} +1 -1
- package/dist/public/assets/_Dwi7467c.js.br +0 -0
- package/dist/public/assets/{_DgmBuYFG2.js → _END-bJOF2.js} +1 -1
- package/dist/public/assets/_END-bJOF2.js.br +0 -0
- package/dist/public/assets/{_yQJK428k.js → _Ip505vk_.js} +1 -1
- package/dist/public/assets/_Ip505vk_.js.br +0 -0
- package/dist/public/assets/{_BLjOZLxk.js → _LbQesljk.js} +1 -1
- package/dist/public/assets/_LbQesljk.js.br +0 -0
- package/dist/public/assets/{_DsJkMBKU2.js → _MWudDHh02.js} +1 -1
- package/dist/public/assets/_MWudDHh02.js.br +0 -0
- package/dist/public/assets/{_Bm-lmvlM.js → _R2u4F0-3.js} +1 -1
- package/dist/public/assets/_R2u4F0-3.js.br +0 -0
- package/dist/public/assets/{_DAfu0wMa.js → _YpsD0CNd.js} +1 -1
- package/dist/public/assets/_YpsD0CNd.js.br +0 -0
- package/dist/public/assets/{_BV-nVD9L2.js → _ZMT8kCL52.js} +1 -1
- package/dist/public/assets/_ZMT8kCL52.js.br +0 -0
- package/dist/public/assets/{_BPFJiBiE.js → _aTh5ZUn4.js} +1 -1
- package/dist/public/assets/_aTh5ZUn4.js.br +0 -0
- package/dist/public/assets/{_cRLLpjIg.js → _ds7D8iP9.js} +1 -1
- package/dist/public/assets/_ds7D8iP9.js.br +0 -0
- package/dist/public/assets/{_BBW7mJhZ.js → _eLSetQBz.js} +1 -1
- package/dist/public/assets/_eLSetQBz.js.br +0 -0
- package/dist/public/assets/{_BGyMoPGj2.js → _eXTAehNM2.js} +1 -1
- package/dist/public/assets/_eXTAehNM2.js.br +0 -0
- package/dist/public/assets/{_FCV34uHN.js → _g5scf0ei.js} +1 -1
- package/dist/public/assets/_g5scf0ei.js.br +0 -0
- package/dist/public/assets/{_CObQoJCq.js → _gVQOuQ8i.js} +1 -1
- package/dist/public/assets/_gVQOuQ8i.js.br +0 -0
- package/dist/public/assets/{_BbMkV19p2.js → _mooiyN7w2.js} +1 -1
- package/dist/public/assets/_mooiyN7w2.js.br +0 -0
- package/dist/public/assets/{_BeSgyXoy2.js → _oOOdPbmX2.js} +1 -1
- package/dist/public/assets/_oOOdPbmX2.js.br +0 -0
- package/dist/public/assets/{_CUqlR7rP.js → _qDJ6gb3q.js} +1 -1
- package/dist/public/assets/_qDJ6gb3q.js.br +0 -0
- package/dist/public/assets/{_9yP8iK4t2.js → _vdLXTjUv2.js} +1 -1
- package/dist/public/assets/_vdLXTjUv2.js.br +0 -0
- package/dist/public/assets/{_DLFnXIrG2.js → _yXYQK3xI2.js} +1 -1
- package/dist/public/assets/_yXYQK3xI2.js.br +0 -0
- package/dist/public/assets/{_Q6y5EfU1.js → _ylRundRE.js} +1 -1
- package/dist/public/assets/_ylRundRE.js.br +0 -0
- package/dist/public/assets/diff-view-CFyPUyMl.css +1 -0
- package/dist/public/assets/diff-view-CFyPUyMl.css.br +0 -0
- package/dist/public/assets/index-CLK3dq8r.js +85 -0
- package/dist/public/assets/index-CLK3dq8r.js.br +0 -0
- package/dist/public/assets/index-DL_Vi7rw.css +1 -0
- package/dist/public/assets/index-DL_Vi7rw.css.br +0 -0
- package/package.json +1 -1
- package/scripts/migrate.mjs +21 -0
- package/dist/_DjrRGy4k.js +0 -2
- package/dist/public/assets/_1cz-l3Ka.js.br +0 -0
- package/dist/public/assets/_1oYv4fmY2.js.br +0 -0
- package/dist/public/assets/_3i592Qvz2.js.br +0 -0
- package/dist/public/assets/_8nx9Raqx2.js.br +0 -0
- package/dist/public/assets/_9yP8iK4t2.js.br +0 -0
- package/dist/public/assets/_B-MMW3nb2.js.br +0 -0
- package/dist/public/assets/_B2fn4I8S2.js.br +0 -0
- package/dist/public/assets/_B49r6O_E.js.br +0 -0
- package/dist/public/assets/_BBW7mJhZ.js.br +0 -0
- package/dist/public/assets/_BC2FBUbj.js.br +0 -0
- package/dist/public/assets/_BFt-jSq-.js.br +0 -0
- package/dist/public/assets/_BGyMoPGj2.js.br +0 -0
- package/dist/public/assets/_BLjOZLxk.js.br +0 -0
- package/dist/public/assets/_BPFJiBiE.js.br +0 -0
- package/dist/public/assets/_BPLnh5S4.js.br +0 -0
- package/dist/public/assets/_BRzL7uNP.js.br +0 -0
- package/dist/public/assets/_BV-nVD9L2.js.br +0 -0
- package/dist/public/assets/_BbMkV19p2.js.br +0 -0
- package/dist/public/assets/_BbW3-3ve.js.br +0 -0
- package/dist/public/assets/_BdbnwCKs2.js.br +0 -0
- package/dist/public/assets/_BeSgyXoy2.js.br +0 -0
- package/dist/public/assets/_Bg9mkw0u.js.br +0 -0
- package/dist/public/assets/_BhUM9ZCP.js.br +0 -0
- package/dist/public/assets/_Bhnzfac_.js.br +0 -0
- package/dist/public/assets/_BiEWaww7.js.br +0 -0
- package/dist/public/assets/_Bm-lmvlM.js.br +0 -0
- package/dist/public/assets/_Bpdzs0h4.js.br +0 -0
- package/dist/public/assets/_BqeAAcor.js.br +0 -0
- package/dist/public/assets/_Bvwr3uff.js.br +0 -0
- package/dist/public/assets/_ByiODT9w.js.br +0 -0
- package/dist/public/assets/_C4NK2Cq5.js.br +0 -0
- package/dist/public/assets/_CASsRCtt.js.br +0 -0
- package/dist/public/assets/_CH4P29Yf2.js.br +0 -0
- package/dist/public/assets/_CHqTBuzz2.js.br +0 -0
- package/dist/public/assets/_CIeZtXbg2.js.br +0 -0
- package/dist/public/assets/_CObQoJCq.js.br +0 -0
- package/dist/public/assets/_CQDBqJkT.js.br +0 -0
- package/dist/public/assets/_CUqlR7rP.js.br +0 -0
- package/dist/public/assets/_CUwAZxRw.js.br +0 -0
- package/dist/public/assets/_CbMNS899.js.br +0 -0
- package/dist/public/assets/_Cf0wSsqE.js.br +0 -0
- package/dist/public/assets/_ClEKr0Tm2.js.br +0 -0
- package/dist/public/assets/_CsNJf4g52.js.br +0 -0
- package/dist/public/assets/_CtErcdf92.js.br +0 -0
- package/dist/public/assets/_DAfu0wMa.js.br +0 -0
- package/dist/public/assets/_DBN8F3s1.js.br +0 -0
- package/dist/public/assets/_DFOnuGNp.js.br +0 -0
- package/dist/public/assets/_DHvVwuPu2.js.br +0 -0
- package/dist/public/assets/_DKnLFVdw.js.br +0 -0
- package/dist/public/assets/_DLFnXIrG2.js.br +0 -0
- package/dist/public/assets/_DLK0WouR.js.br +0 -0
- package/dist/public/assets/_DLLEkkcM.js.br +0 -0
- package/dist/public/assets/_DOpT45mO.js.br +0 -0
- package/dist/public/assets/_DT9Qs1il.js.br +0 -0
- package/dist/public/assets/_DVPPxo4e2.js.br +0 -0
- package/dist/public/assets/_De7fhQUT.js.br +0 -0
- package/dist/public/assets/_DgmBuYFG2.js.br +0 -0
- package/dist/public/assets/_DjLQQUoq.js.br +0 -0
- package/dist/public/assets/_Dn4wMX5v.js.br +0 -0
- package/dist/public/assets/_DsJkMBKU2.js.br +0 -0
- package/dist/public/assets/_Ez06j6Qv.js.br +0 -0
- package/dist/public/assets/_FCV34uHN.js.br +0 -0
- package/dist/public/assets/_I6H6F0ME.js.br +0 -0
- package/dist/public/assets/_K6PNL3j4.js.br +0 -0
- package/dist/public/assets/_KVpYyL9A.js.br +0 -0
- package/dist/public/assets/_KjztUkjx.js.br +0 -0
- package/dist/public/assets/_Q6y5EfU1.js.br +0 -0
- package/dist/public/assets/_cRLLpjIg.js.br +0 -0
- package/dist/public/assets/_kv39JOeM.js.br +0 -0
- package/dist/public/assets/_o1of2_lP.js.br +0 -0
- package/dist/public/assets/_qoSWRJiT.js.br +0 -0
- package/dist/public/assets/_yQJK428k.js.br +0 -0
- package/dist/public/assets/diff-view-CQX-Ovnt.css +0 -1
- package/dist/public/assets/diff-view-CQX-Ovnt.css.br +0 -0
- package/dist/public/assets/index-DR0Bvd6u.css +0 -1
- package/dist/public/assets/index-DR0Bvd6u.css.br +0 -0
- package/dist/public/assets/index-fCEONff1.js +0 -85
- package/dist/public/assets/index-fCEONff1.js.br +0 -0
package/bin/work.mjs
CHANGED
|
@@ -6,7 +6,15 @@
|
|
|
6
6
|
// work start run the server in the foreground
|
|
7
7
|
// work update upgrade the npm package and refresh the service
|
|
8
8
|
// work usage print agent plan/quota usage
|
|
9
|
+
// work workspaces list workspaces (name, branch, sessions, ports)
|
|
10
|
+
// work workspace [id|name] one workspace: repos, PRs, sessions, procs (default: the current one)
|
|
11
|
+
// work repos [id|name] a workspace's repos with base branch and open PRs
|
|
12
|
+
// work procs [id|name] a workspace's running processes and ports
|
|
9
13
|
// work version print the installed version
|
|
14
|
+
//
|
|
15
|
+
// The read commands ask the running server (same data as the UI) and take
|
|
16
|
+
// --json for machine-readable output — agents inside a workspace should
|
|
17
|
+
// use them instead of poking at the filesystem or GitHub.
|
|
10
18
|
import { execFileSync, spawnSync } from "node:child_process";
|
|
11
19
|
import fs from "node:fs";
|
|
12
20
|
import os from "node:os";
|
|
@@ -37,6 +45,8 @@ const sh = (cmd, args, opts = {}) =>
|
|
|
37
45
|
|
|
38
46
|
const [, , command = "help", ...args] = process.argv;
|
|
39
47
|
const yes = args.includes("--yes") || args.includes("-y");
|
|
48
|
+
const jsonOut = args.includes("--json");
|
|
49
|
+
const positional = args.filter((a) => !a.startsWith("-"));
|
|
40
50
|
|
|
41
51
|
switch (command) {
|
|
42
52
|
case "start":
|
|
@@ -54,6 +64,19 @@ switch (command) {
|
|
|
54
64
|
case "usage":
|
|
55
65
|
await usage();
|
|
56
66
|
break;
|
|
67
|
+
case "workspaces":
|
|
68
|
+
await workspacesCmd();
|
|
69
|
+
break;
|
|
70
|
+
case "workspace":
|
|
71
|
+
case "ws":
|
|
72
|
+
await workspaceCmd();
|
|
73
|
+
break;
|
|
74
|
+
case "repos":
|
|
75
|
+
await reposCmd();
|
|
76
|
+
break;
|
|
77
|
+
case "procs":
|
|
78
|
+
await procsCmd();
|
|
79
|
+
break;
|
|
57
80
|
case "version":
|
|
58
81
|
case "--version":
|
|
59
82
|
case "-v":
|
|
@@ -61,7 +84,7 @@ switch (command) {
|
|
|
61
84
|
break;
|
|
62
85
|
default:
|
|
63
86
|
console.log(
|
|
64
|
-
`work ${pkg.version}\n\nusage: work <setup|doctor|start|update|usage|version
|
|
87
|
+
`work ${pkg.version}\n\nusage: work <setup|doctor|start|update|usage|workspaces|workspace|repos|procs|version> [--json]`,
|
|
65
88
|
);
|
|
66
89
|
}
|
|
67
90
|
|
|
@@ -117,6 +140,130 @@ async function usage() {
|
|
|
117
140
|
}
|
|
118
141
|
}
|
|
119
142
|
|
|
143
|
+
// -- workspace read commands (HTTP to the running server) --------------------
|
|
144
|
+
|
|
145
|
+
async function apiGet(path) {
|
|
146
|
+
const port = serviceEnv().PORT;
|
|
147
|
+
try {
|
|
148
|
+
const res = await fetch(`http://127.0.0.1:${port}${path}`, { signal: AbortSignal.timeout(30_000) });
|
|
149
|
+
if (!res.ok) die(`server answered ${res.status} for ${path}`);
|
|
150
|
+
return await res.json();
|
|
151
|
+
} catch (err) {
|
|
152
|
+
if (err?.message?.startsWith("server answered")) throw err;
|
|
153
|
+
die(`no work server on port ${port} — start one with: work start`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* The workspace a command means: an explicit id/name, else the one whose
|
|
159
|
+
* session this shell runs in (`WORK_SESSION_ID`, set on every pane), else
|
|
160
|
+
* the one whose directory contains the cwd. Agents call these from inside
|
|
161
|
+
* a workspace, so no argument is the common case.
|
|
162
|
+
*/
|
|
163
|
+
async function resolveWorkspace(arg) {
|
|
164
|
+
const [list, status] = await Promise.all([apiGet("/api/workspaces"), apiGet("/api/status")]);
|
|
165
|
+
let ws;
|
|
166
|
+
if (arg) {
|
|
167
|
+
ws = list.find((w) => w.id === arg || w.name === arg);
|
|
168
|
+
if (!ws) die(`no workspace named ${arg}`);
|
|
169
|
+
} else if (process.env.WORK_SESSION_ID) {
|
|
170
|
+
const sid = process.env.WORK_SESSION_ID;
|
|
171
|
+
ws = list.find((w) => (status[w.id]?.sessions || []).some((s) => s.id === sid));
|
|
172
|
+
}
|
|
173
|
+
if (!ws) {
|
|
174
|
+
// Compare real paths on both sides — /home may be a symlink to /var/home.
|
|
175
|
+
const cwd = fs.realpathSync(process.cwd());
|
|
176
|
+
const real = (p) => {
|
|
177
|
+
try {
|
|
178
|
+
return fs.realpathSync(p);
|
|
179
|
+
} catch {
|
|
180
|
+
return p;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
ws = list.find((w) => {
|
|
184
|
+
const root = real(w.path);
|
|
185
|
+
return cwd === root || cwd.startsWith(root + path.sep);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
if (!ws) die("not inside a workspace — pass its name or id (see: work workspaces)");
|
|
189
|
+
return { ws, status: status[ws.id] || { ports: [], repos: [], sessions: [] } };
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function pad(s, n) {
|
|
193
|
+
return String(s ?? "").padEnd(n);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
async function workspacesCmd() {
|
|
197
|
+
const [list, status] = await Promise.all([apiGet("/api/workspaces"), apiGet("/api/status")]);
|
|
198
|
+
const rows = list.map((w) => ({ ...w, ...(status[w.id] || {}) }));
|
|
199
|
+
if (jsonOut) return console.log(JSON.stringify(rows, null, 2));
|
|
200
|
+
if (!rows.length) return console.log("no workspaces — create one in the app");
|
|
201
|
+
const wName = Math.max(4, ...rows.map((w) => w.name.length));
|
|
202
|
+
console.log(`${pad("name", wName)} ${pad("status", 8)} ${pad("branch", 28)} repos agents ports`);
|
|
203
|
+
for (const w of rows) {
|
|
204
|
+
const ports = (w.ports || []).map((p) => `:${p.port}`).join(" ");
|
|
205
|
+
console.log(
|
|
206
|
+
`${pad(w.name, wName)} ${pad(w.status, 8)} ${pad(w.branch, 28)} ${pad(w.repos.length, 5)} ${pad(w.agents ?? 0, 6)} ${ports}`,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function prLine(pr) {
|
|
212
|
+
const state = pr.state === "MERGED" ? "merged" : pr.state === "CLOSED" ? "closed" : pr.isDraft ? "draft" : "open";
|
|
213
|
+
return `#${pr.number} ${state} ${pr.title} ${pr.url}`;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async function workspaceCmd() {
|
|
217
|
+
const { ws, status } = await resolveWorkspace(positional[0]);
|
|
218
|
+
const procs = await apiGet(`/api/workspaces/${ws.id}/procs`).catch(() => []);
|
|
219
|
+
const [sessions] = await Promise.all([apiGet(`/api/workspaces/${ws.id}/sessions`).catch(() => [])]);
|
|
220
|
+
const out = { ...ws, ports: status.ports, repos: mergeRepos(ws, status), sessions, procs };
|
|
221
|
+
if (jsonOut) return console.log(JSON.stringify(out, null, 2));
|
|
222
|
+
console.log(`${ws.name} (${ws.status})`);
|
|
223
|
+
console.log(` path: ${ws.display_path || ws.path}`);
|
|
224
|
+
console.log(` branch: ${ws.branch}`);
|
|
225
|
+
console.log(` repos:`);
|
|
226
|
+
for (const r of out.repos) {
|
|
227
|
+
console.log(` ${r.worktree}/ ${r.full_name} base:${r.base_branch}`);
|
|
228
|
+
for (const pr of r.prs || []) console.log(` ${prLine(pr)}`);
|
|
229
|
+
}
|
|
230
|
+
if (sessions.length) {
|
|
231
|
+
console.log(` sessions:`);
|
|
232
|
+
for (const s of sessions) {
|
|
233
|
+
const phase = s.state?.phase || (s.state?.alive ? "idle" : "off");
|
|
234
|
+
console.log(` ${pad(s.agent, 10)} ${pad(phase, 8)} ${s.title || ""}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (procs.length) {
|
|
238
|
+
console.log(` running:`);
|
|
239
|
+
for (const p of procs) console.log(` ${pad(p.pid, 7)} ${p.cmd}${p.ports?.length ? " " + p.ports.map((x) => `:${x}`).join(" ") : ""}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** Workspace repos joined with the status snapshot's PRs per repo. */
|
|
244
|
+
function mergeRepos(ws, status) {
|
|
245
|
+
const byName = new Map((status.repos || []).map((r) => [r.full_name, r]));
|
|
246
|
+
return ws.repos.map((r) => ({ ...r, prs: byName.get(r.full_name)?.prs || [] }));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
async function reposCmd() {
|
|
250
|
+
const { ws, status } = await resolveWorkspace(positional[0]);
|
|
251
|
+
const repos = mergeRepos(ws, status);
|
|
252
|
+
if (jsonOut) return console.log(JSON.stringify(repos, null, 2));
|
|
253
|
+
for (const r of repos) {
|
|
254
|
+
console.log(`${r.worktree}/ ${r.full_name} base:${r.base_branch}${r.default_branch !== r.base_branch ? ` default:${r.default_branch}` : ""}`);
|
|
255
|
+
for (const pr of r.prs) console.log(` ${prLine(pr)}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
async function procsCmd() {
|
|
260
|
+
const { ws } = await resolveWorkspace(positional[0]);
|
|
261
|
+
const procs = await apiGet(`/api/workspaces/${ws.id}/procs`);
|
|
262
|
+
if (jsonOut) return console.log(JSON.stringify(procs, null, 2));
|
|
263
|
+
if (!procs.length) return console.log("nothing running");
|
|
264
|
+
for (const p of procs) console.log(`${pad(p.pid, 7)} ${p.cmd}${p.ports?.length ? " " + p.ports.map((x) => `:${x}`).join(" ") : ""}`);
|
|
265
|
+
}
|
|
266
|
+
|
|
120
267
|
/** "4h" / "6d" — how long until an ISO timestamp. A reset already in the past
|
|
121
268
|
* means the window turned over and this row hasn't refreshed since, so there
|
|
122
269
|
* is no honest countdown to print. */
|
|
@@ -1988,16 +1988,16 @@ var phase = {
|
|
|
1988
1988
|
};
|
|
1989
1989
|
var btnSm = "_z _h";
|
|
1990
1990
|
var toastKind = {
|
|
1991
|
-
error: "
|
|
1992
|
-
warn: "
|
|
1993
|
-
info: "
|
|
1991
|
+
error: "_H",
|
|
1992
|
+
warn: "_I",
|
|
1993
|
+
info: "_J"
|
|
1994
1994
|
};
|
|
1995
1995
|
var toastTitle = {
|
|
1996
|
-
error: "
|
|
1997
|
-
warn: "
|
|
1998
|
-
info: "
|
|
1996
|
+
error: "_K",
|
|
1997
|
+
warn: "_L",
|
|
1998
|
+
info: "_M"
|
|
1999
1999
|
};
|
|
2000
|
-
var toastDismiss = "
|
|
2000
|
+
var toastDismiss = "_Q _D";
|
|
2001
2001
|
//#endregion
|
|
2002
2002
|
//#region src/tags/toast.marko
|
|
2003
2003
|
var toast_default = _template("w", (input) => {
|
|
@@ -2008,18 +2008,18 @@ var toast_default = _template("w", (input) => {
|
|
|
2008
2008
|
const kind = inputKind || "error";
|
|
2009
2009
|
const placement = inputPlacement || "float";
|
|
2010
2010
|
const placementClass = {
|
|
2011
|
-
float: "
|
|
2012
|
-
inline: "
|
|
2011
|
+
float: "_F",
|
|
2012
|
+
inline: "_G"
|
|
2013
2013
|
}[placement];
|
|
2014
2014
|
_html(`<div${_attr_class([
|
|
2015
|
-
"
|
|
2015
|
+
"_E",
|
|
2016
2016
|
toastKind[kind],
|
|
2017
2017
|
placementClass,
|
|
2018
2018
|
inputClass
|
|
2019
2019
|
])} role=${kind === "error" ? "alert" : "status"}${_attrs_partial(htmlInput, {
|
|
2020
2020
|
class: 1,
|
|
2021
2021
|
role: 1
|
|
2022
|
-
}, "a", $scope0_id, "div")}><div${_attr_class("
|
|
2022
|
+
}, "a", $scope0_id, "div")}><div${_attr_class("_N")}>`);
|
|
2023
2023
|
_if(() => {
|
|
2024
2024
|
if (title) {
|
|
2025
2025
|
const $scope1_id = _scope_id();
|
|
@@ -2031,7 +2031,7 @@ var toast_default = _template("w", (input) => {
|
|
|
2031
2031
|
_if(() => {
|
|
2032
2032
|
if (content) {
|
|
2033
2033
|
const $scope2_id = _scope_id();
|
|
2034
|
-
_html(`<div${_attr_class("
|
|
2034
|
+
_html(`<div${_attr_class("_O")}>`);
|
|
2035
2035
|
_dynamic_tag($scope2_id, "b", content, {}, 0, 0, $sg__input_content);
|
|
2036
2036
|
_html("</div>");
|
|
2037
2037
|
$si__input_content && writeScope($scope2_id, { _: _scope_with_id($scope0_id) });
|
|
@@ -2042,7 +2042,7 @@ var toast_default = _template("w", (input) => {
|
|
|
2042
2042
|
_if(() => {
|
|
2043
2043
|
if (action || onDismiss) {
|
|
2044
2044
|
const $scope3_id = _scope_id();
|
|
2045
|
-
_html(`<div${_attr_class("
|
|
2045
|
+
_html(`<div${_attr_class("_P")}>`);
|
|
2046
2046
|
_if(() => {
|
|
2047
2047
|
if (action) {
|
|
2048
2048
|
const $scope4_id = _scope_id();
|
|
@@ -2210,8 +2210,8 @@ var icon_sidebar_default = _template("R", (input) => {
|
|
|
2210
2210
|
});
|
|
2211
2211
|
_serialize_if($scope0_reason, 0) && writeScope($scope0_id, { a: _existing_scope($childScope) });
|
|
2212
2212
|
});
|
|
2213
|
-
var findInput = "
|
|
2214
|
-
var findIconBtn = "
|
|
2213
|
+
var findInput = "_fw _e";
|
|
2214
|
+
var findIconBtn = "_fz _D";
|
|
2215
2215
|
//#endregion
|
|
2216
2216
|
//#region src/tags/icons/icon-search.marko
|
|
2217
2217
|
var icon_search_default = _template("O", (input) => {
|
|
@@ -4,9 +4,9 @@ import { t as require_safe_buffer } from "./_BmSjjJ2E.js";
|
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import os from "node:os";
|
|
7
|
-
import { DatabaseSync } from "node:sqlite";
|
|
8
7
|
import { execFile } from "node:child_process";
|
|
9
8
|
import { promisify } from "node:util";
|
|
9
|
+
import { DatabaseSync } from "node:sqlite";
|
|
10
10
|
//#region src/server/config.ts
|
|
11
11
|
var home$1 = os.homedir();
|
|
12
12
|
var config = {
|
|
@@ -18,7 +18,6 @@ var config = {
|
|
|
18
18
|
},
|
|
19
19
|
/** Data directory for the sqlite db and other server state. */
|
|
20
20
|
dataDir: process.env.WORK_DATA_DIR || path.join(process.env.XDG_DATA_HOME || path.join(home$1, ".local", "share"), "work"),
|
|
21
|
-
gitHost: "github.com",
|
|
22
21
|
user: process.env.WORK_USER || os.userInfo().username,
|
|
23
22
|
host: process.env.WORK_HOST || os.hostname().split(".")[0],
|
|
24
23
|
/** Prefix every workspace branch starts with. Tooling finds a workspace's PRs
|
|
@@ -33,6 +32,31 @@ var config = {
|
|
|
33
32
|
};
|
|
34
33
|
fs.mkdirSync(config.dataDir, { recursive: true });
|
|
35
34
|
//#endregion
|
|
35
|
+
//#region src/server/exec.ts
|
|
36
|
+
/** Dedicated tmux server so we never touch another multiplexer's or the
|
|
37
|
+
* user's default tmux. */
|
|
38
|
+
var TMUX_SOCKET = "work";
|
|
39
|
+
var execFileAsync = promisify(execFile);
|
|
40
|
+
async function run$1(cmd, args, cwd, env) {
|
|
41
|
+
const { stdout } = await execFileAsync(cmd, args, {
|
|
42
|
+
cwd,
|
|
43
|
+
env,
|
|
44
|
+
maxBuffer: 67108864
|
|
45
|
+
});
|
|
46
|
+
return stdout.trim();
|
|
47
|
+
}
|
|
48
|
+
var git = (args, cwd) => run$1("git", args, cwd);
|
|
49
|
+
/** `gh` against one GitHub host — `GH_HOST` picks the stored credential. */
|
|
50
|
+
var gh = (args, host) => run$1("gh", args, void 0, host ? {
|
|
51
|
+
...process.env,
|
|
52
|
+
GH_HOST: host
|
|
53
|
+
} : void 0);
|
|
54
|
+
var tmux = (args, env) => run$1("tmux", [
|
|
55
|
+
"-L",
|
|
56
|
+
TMUX_SOCKET,
|
|
57
|
+
...args
|
|
58
|
+
], void 0, env);
|
|
59
|
+
//#endregion
|
|
36
60
|
//#region src/server/db.ts
|
|
37
61
|
var db = new DatabaseSync(path.join(config.dataDir, "work.db"));
|
|
38
62
|
db.exec("PRAGMA busy_timeout = 5000");
|
|
@@ -111,59 +135,6 @@ db.exec(`
|
|
|
111
135
|
);
|
|
112
136
|
`);
|
|
113
137
|
//#endregion
|
|
114
|
-
//#region src/server/events.ts
|
|
115
|
-
var listeners = /* @__PURE__ */ new Set();
|
|
116
|
-
function publish(type, data) {
|
|
117
|
-
const event = {
|
|
118
|
-
type,
|
|
119
|
-
data
|
|
120
|
-
};
|
|
121
|
-
for (const listener of [...listeners]) try {
|
|
122
|
-
listener(event);
|
|
123
|
-
} catch (err) {
|
|
124
|
-
console.error("[work] event listener error", err);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
var joins = 0;
|
|
128
|
-
function subscribe(listener) {
|
|
129
|
-
listeners.add(listener);
|
|
130
|
-
joins++;
|
|
131
|
-
return () => listeners.delete(listener);
|
|
132
|
-
}
|
|
133
|
-
/** Count of subscriptions ever made. A watcher that publishes only what
|
|
134
|
-
* changed has to send everything to a listener that was not there for the
|
|
135
|
-
* earlier ones — including a reconnect, which arrives here as a new
|
|
136
|
-
* subscription and would otherwise sit on whatever it missed. */
|
|
137
|
-
function subscriberJoins() {
|
|
138
|
-
return joins;
|
|
139
|
-
}
|
|
140
|
-
/** Connected SSE clients — lets background watchers idle when no one
|
|
141
|
-
* is listening. */
|
|
142
|
-
function subscriberCount() {
|
|
143
|
-
return listeners.size;
|
|
144
|
-
}
|
|
145
|
-
//#endregion
|
|
146
|
-
//#region src/server/exec.ts
|
|
147
|
-
/** Dedicated tmux server so we never touch another multiplexer's or the
|
|
148
|
-
* user's default tmux. */
|
|
149
|
-
var TMUX_SOCKET = "work";
|
|
150
|
-
var execFileAsync = promisify(execFile);
|
|
151
|
-
async function run$1(cmd, args, cwd, env) {
|
|
152
|
-
const { stdout } = await execFileAsync(cmd, args, {
|
|
153
|
-
cwd,
|
|
154
|
-
env,
|
|
155
|
-
maxBuffer: 67108864
|
|
156
|
-
});
|
|
157
|
-
return stdout.trim();
|
|
158
|
-
}
|
|
159
|
-
var git = (args, cwd) => run$1("git", args, cwd);
|
|
160
|
-
var gh = (args) => run$1("gh", args);
|
|
161
|
-
var tmux = (args, env) => run$1("tmux", [
|
|
162
|
-
"-L",
|
|
163
|
-
TMUX_SOCKET,
|
|
164
|
-
...args
|
|
165
|
-
], void 0, env);
|
|
166
|
-
//#endregion
|
|
167
138
|
//#region lib/setup/catalog.mjs
|
|
168
139
|
/** Machine tools. `required` ones gate readiness; the rest are the utilities
|
|
169
140
|
* agents reach for constantly (mirrors DylanPiercey/start). Static binaries via
|
|
@@ -606,6 +577,38 @@ function preferredAgent() {
|
|
|
606
577
|
return enabled.find((id) => id !== "shell") || stored || "claude";
|
|
607
578
|
}
|
|
608
579
|
//#endregion
|
|
580
|
+
//#region src/server/events.ts
|
|
581
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
582
|
+
function publish(type, data) {
|
|
583
|
+
const event = {
|
|
584
|
+
type,
|
|
585
|
+
data
|
|
586
|
+
};
|
|
587
|
+
for (const listener of [...listeners]) try {
|
|
588
|
+
listener(event);
|
|
589
|
+
} catch (err) {
|
|
590
|
+
console.error("[work] event listener error", err);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
var joins = 0;
|
|
594
|
+
function subscribe(listener) {
|
|
595
|
+
listeners.add(listener);
|
|
596
|
+
joins++;
|
|
597
|
+
return () => listeners.delete(listener);
|
|
598
|
+
}
|
|
599
|
+
/** Count of subscriptions ever made. A watcher that publishes only what
|
|
600
|
+
* changed has to send everything to a listener that was not there for the
|
|
601
|
+
* earlier ones — including a reconnect, which arrives here as a new
|
|
602
|
+
* subscription and would otherwise sit on whatever it missed. */
|
|
603
|
+
function subscriberJoins() {
|
|
604
|
+
return joins;
|
|
605
|
+
}
|
|
606
|
+
/** Connected SSE clients — lets background watchers idle when no one
|
|
607
|
+
* is listening. */
|
|
608
|
+
function subscriberCount() {
|
|
609
|
+
return listeners.size;
|
|
610
|
+
}
|
|
611
|
+
//#endregion
|
|
609
612
|
//#region node_modules/.pnpm/bn.js@4.12.5/node_modules/bn.js/lib/bn.js
|
|
610
613
|
var require_bn = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
611
614
|
(function(module$1, exports$2) {
|
|
@@ -6425,7 +6428,7 @@ function publishChange(sessionId) {
|
|
|
6425
6428
|
const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
|
|
6426
6429
|
if (row?.workspace_id) {
|
|
6427
6430
|
const workspaceId = row.workspace_id;
|
|
6428
|
-
import("./
|
|
6431
|
+
import("./_B1U5NJd1.js").then((m) => m.notifySessionsChanged(workspaceId));
|
|
6429
6432
|
return;
|
|
6430
6433
|
}
|
|
6431
6434
|
publish("sessions.changed");
|
|
@@ -6826,4 +6829,4 @@ function sleep(ms) {
|
|
|
6826
6829
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
6827
6830
|
}
|
|
6828
6831
|
//#endregion
|
|
6829
|
-
export {
|
|
6832
|
+
export { get as $, subscribe as A, setPref as B, setScrapedPhase as C, pushPublicKey as D, deleteSubscription as E, disabledAgents as F, setupPath as G, doctor as H, enabledAgents as I, TOOLS as J, which as K, getSetting as L, subscriberJoins as M, agentChoices as N, saveSubscription as O, allPrefs as P, db as Q, preferredAgent as R, setAgentPhase as S, summaryFromHookPayload as T, ghKnownHosts as U, setSetting as V, miseVersions as W, toolById as X, agentById as Y, all as Z, tmuxName as _, ensureTmuxServer as a, tmux as at, clearAgentPhase as b, killWorkspaceSessions as c, newSessionArgs as d, workspacePath as et, notifySessionsChanged as f, sessionStates as g, sendToSession as h, disposeSessions as i, run$1 as it, subscriberCount as j, publish as k, listSessions as l, renameSession as m, clearTmuxStarted as n, gh as nt, getSession as o, config as ot, panePids as p, DEFAULT_GITHUB_HOST as q, createSession as r, git as rt, killSession as s, cleanEnv as t, TMUX_SOCKET as tt, markTmuxStarted as u, tmuxWasStarted as v, setSessionViewers as w, reasonFromHookPayload as x, reportsWorking as y, setDisabledAgents as z };
|