@dylanpiercey/work 0.0.49 → 0.0.51
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 +149 -2
- package/dist/{_DPQxTPYF.js → _ChsFL4HL.js} +67 -67
- package/dist/{_DdgmjMNU.js → _hWr23FrN.js} +21 -21
- package/dist/index.mjs +264 -269
- package/dist/public/assets/{_DkMIDB1P2.js → _-OkpjNFC2.js} +1 -1
- package/dist/public/assets/_-OkpjNFC2.js.br +0 -0
- package/dist/public/assets/{_BpxZLi8K.js → _7zKhgk70.js} +1 -1
- package/dist/public/assets/_7zKhgk70.js.br +0 -0
- package/dist/public/assets/{_DRRQXGKH.js → _ANZIBcq8.js} +1 -1
- package/dist/public/assets/_ANZIBcq8.js.br +0 -0
- package/dist/public/assets/{_Dmw0DArq.js → _B1kAPDJf.js} +1 -1
- package/dist/public/assets/_B1kAPDJf.js.br +0 -0
- package/dist/public/assets/{_Bb4a7oF1.js → _B1q1XEz1.js} +1 -1
- package/dist/public/assets/_B1q1XEz1.js.br +0 -0
- package/dist/public/assets/{_B6JLzfQk.js → _BAe2Rkst.js} +1 -1
- package/dist/public/assets/_BAe2Rkst.js.br +0 -0
- package/dist/public/assets/{_CVQKEVHV.js → _BMRMEvO7.js} +1 -1
- package/dist/public/assets/_BMRMEvO7.js.br +0 -0
- package/dist/public/assets/{_DlC4k_XP.js → _BQWd9iua.js} +1 -1
- package/dist/public/assets/_BQWd9iua.js.br +0 -0
- package/dist/public/assets/{_Cci4ZExC.js → _BXzA1hkF.js} +1 -1
- package/dist/public/assets/_BXzA1hkF.js.br +0 -0
- package/dist/public/assets/{_BYn0odAU2.js → _BY6UBzWo2.js} +1 -1
- package/dist/public/assets/{_4zqifGZf2.js → _BZMQNYA92.js} +1 -1
- package/dist/public/assets/_BZMQNYA92.js.br +0 -0
- package/dist/public/assets/{_BZDb9Hzx2.js → _BZZMGQsS2.js} +1 -1
- package/dist/public/assets/{_CgnZDJPL.js → _BdKJVs01.js} +1 -1
- package/dist/public/assets/_BdKJVs01.js.br +0 -0
- package/dist/public/assets/{_u3et6kdz.js → _Bdd-EVvo.js} +1 -1
- package/dist/public/assets/_Bdd-EVvo.js.br +0 -0
- package/dist/public/assets/{_UWZzN8Rg.js → _BepwNj2c.js} +1 -1
- package/dist/public/assets/_BepwNj2c.js.br +0 -0
- package/dist/public/assets/{_DBzS4J_k.js → _BgR6JlxP.js} +1 -1
- package/dist/public/assets/_BgR6JlxP.js.br +0 -0
- package/dist/public/assets/{_D9jhO9rQ.js → _BglwyDVi.js} +1 -1
- package/dist/public/assets/_BglwyDVi.js.br +0 -0
- package/dist/public/assets/{_DIiEy_VP.js → _BiDu7TT-.js} +1 -1
- package/dist/public/assets/_BiDu7TT-.js.br +0 -0
- package/dist/public/assets/{_B_Wegq962.js → _BosbXyNb2.js} +1 -1
- package/dist/public/assets/_BosbXyNb2.js.br +0 -0
- package/dist/public/assets/{_B9STxcPh.js → _BsogDiXx.js} +1 -1
- package/dist/public/assets/{_DImQNomk.js → _Bt7Eey0L.js} +1 -1
- package/dist/public/assets/_Bt7Eey0L.js.br +0 -0
- package/dist/public/assets/{_DlsPVtFC.js → _BvXRPJdv.js} +1 -1
- package/dist/public/assets/_BvXRPJdv.js.br +0 -0
- package/dist/public/assets/{_CNxYMMPa.js → _BxtJHtVP.js} +1 -1
- package/dist/public/assets/_BxtJHtVP.js.br +0 -0
- package/dist/public/assets/{_BP2BHaYT2.js → _By0A-jZS2.js} +1 -1
- package/dist/public/assets/_By0A-jZS2.js.br +0 -0
- package/dist/public/assets/{_BUhKc7uT.js → _C0oWdnE5.js} +1 -1
- package/dist/public/assets/_C0oWdnE5.js.br +0 -0
- package/dist/public/assets/{_sBNm9tCS.js → _C2I7cHEj.js} +1 -1
- package/dist/public/assets/_C2I7cHEj.js.br +0 -0
- package/dist/public/assets/{_DbkjWa7i2.js → _CHrLzFRU2.js} +1 -1
- package/dist/public/assets/_CHrLzFRU2.js.br +0 -0
- package/dist/public/assets/{_8D88iC2Y.js → _COh_iyNM.js} +1 -1
- package/dist/public/assets/_COh_iyNM.js.br +0 -0
- package/dist/public/assets/{_YLPBpmu6.js → _CTZYzJI9.js} +1 -1
- package/dist/public/assets/_CTZYzJI9.js.br +0 -0
- package/dist/public/assets/{_F3u8qQ9y.js → _CWmZT485.js} +1 -1
- package/dist/public/assets/_CWmZT485.js.br +0 -0
- package/dist/public/assets/{_JYBrvu87.js → _CZzND5iW.js} +1 -1
- package/dist/public/assets/_CZzND5iW.js.br +0 -0
- package/dist/public/assets/{_B-XihPlt.js → _Cd9v1nzp.js} +1 -1
- package/dist/public/assets/_Cd9v1nzp.js.br +0 -0
- package/dist/public/assets/{_D6xeqZLn.js → _Cf3MmuUY.js} +1 -1
- package/dist/public/assets/_Cf3MmuUY.js.br +0 -0
- package/dist/public/assets/{_DZ0pRMJN2.js → _Cjp1_INh2.js} +1 -1
- package/dist/public/assets/_Cjp1_INh2.js.br +0 -0
- package/dist/public/assets/{_llnipctq2.js → _ClePGw1Q2.js} +1 -1
- package/dist/public/assets/_ClePGw1Q2.js.br +0 -0
- package/dist/public/assets/{_BH7cFvM5.js → _CnOIrHd4.js} +1 -1
- package/dist/public/assets/_CnOIrHd4.js.br +0 -0
- package/dist/public/assets/{_Dji7sUrK2.js → _Co5f57QZ2.js} +1 -1
- package/dist/public/assets/_Co5f57QZ2.js.br +0 -0
- package/dist/public/assets/{_C2-Kd826.js → _CozR6WAm.js} +1 -1
- package/dist/public/assets/_CozR6WAm.js.br +0 -0
- package/dist/public/assets/{_BziqIADV2.js → _CpF0eDyO2.js} +1 -1
- package/dist/public/assets/_CpF0eDyO2.js.br +0 -0
- package/dist/public/assets/{_DyNwE1Gc.js → _Ct4X_xxt.js} +1 -1
- package/dist/public/assets/_Ct4X_xxt.js.br +0 -0
- package/dist/public/assets/{_B-7M0VuK2.js → _CtUpTTh_2.js} +1 -1
- package/dist/public/assets/_CtUpTTh_2.js.br +0 -0
- package/dist/public/assets/{_BmEd20O42.js → _Cuf3C8O12.js} +1 -1
- package/dist/public/assets/_Cuf3C8O12.js.br +0 -0
- package/dist/public/assets/{_CRmHsbsL.js → _CzWr4WDS.js} +1 -1
- package/dist/public/assets/_CzWr4WDS.js.br +0 -0
- package/dist/public/assets/{_BlPl6sCu2.js → _D6rlRNb42.js} +1 -1
- package/dist/public/assets/_D6rlRNb42.js.br +0 -0
- package/dist/public/assets/{_D0L-Bq8g.js → _DDHqFyT6.js} +1 -1
- package/dist/public/assets/_DDHqFyT6.js.br +0 -0
- package/dist/public/assets/{_D4J5RQqK.js → _DDIsmVeS.js} +1 -1
- package/dist/public/assets/_DDIsmVeS.js.br +0 -0
- package/dist/public/assets/{_DjKQr6mH.js → _DEMYRqVb.js} +1 -1
- package/dist/public/assets/_DEMYRqVb.js.br +0 -0
- package/dist/public/assets/{_BX76n7oq2.js → _DHn-Con42.js} +1 -1
- package/dist/public/assets/_DHn-Con42.js.br +0 -0
- package/dist/public/assets/{_Kzpu52En.js → _DJbEi800.js} +1 -1
- package/dist/public/assets/_DJbEi800.js.br +0 -0
- package/dist/public/assets/{_BPmHfnJD.js → _DPZvn_Ns.js} +1 -1
- package/dist/public/assets/_DPZvn_Ns.js.br +0 -0
- package/dist/public/assets/{_BrNzM4EC2.js → _DS46Nokf2.js} +1 -1
- package/dist/public/assets/_DS46Nokf2.js.br +0 -0
- package/dist/public/assets/{_ByaG8bWs.js → _DSSFuJur.js} +1 -1
- package/dist/public/assets/_DSSFuJur.js.br +0 -0
- package/dist/public/assets/{_lBeubFtN2.js → _DTl3WJKW2.js} +1 -1
- package/dist/public/assets/_DTl3WJKW2.js.br +0 -0
- package/dist/public/assets/{_C6jAYlE8.js → _Daxa4EBi.js} +1 -1
- package/dist/public/assets/_Daxa4EBi.js.br +0 -0
- package/dist/public/assets/{_C2rSDO7f.js → _Dd2aGpDJ.js} +1 -1
- package/dist/public/assets/_Dd2aGpDJ.js.br +0 -0
- package/dist/public/assets/{_v4TxGuxE.js → _De6QD9bA.js} +1 -1
- package/dist/public/assets/_De6QD9bA.js.br +0 -0
- package/dist/public/assets/{_B01yJM_n.js → _DhkDcW9a.js} +1 -1
- package/dist/public/assets/_DhkDcW9a.js.br +0 -0
- package/dist/public/assets/{_D99Y49OA.js → _DieSr1Ar.js} +1 -1
- package/dist/public/assets/_DieSr1Ar.js.br +0 -0
- package/dist/public/assets/{_CkeutYnJ2.js → _Dkkv3pWr2.js} +1 -1
- package/dist/public/assets/_Dkkv3pWr2.js.br +0 -0
- package/dist/public/assets/{_BRURAzLu2.js → _DmR5fI7m2.js} +1 -1
- package/dist/public/assets/_DmR5fI7m2.js.br +0 -0
- package/dist/public/assets/{_wvTh271a.js → _DmhFYJm3.js} +1 -1
- package/dist/public/assets/_DmhFYJm3.js.br +0 -0
- package/dist/public/assets/{_B3dWhBsL2.js → _DqeMgS1a2.js} +1 -1
- package/dist/public/assets/_DqeMgS1a2.js.br +0 -0
- package/dist/public/assets/{_D48HGWNS.js → _DsZJYF5S.js} +5 -5
- package/dist/public/assets/_DsZJYF5S.js.br +0 -0
- package/dist/public/assets/{_BhAegdMF2.js → _Dxgr5ZEE2.js} +1 -1
- package/dist/public/assets/_Dxgr5ZEE2.js.br +0 -0
- package/dist/public/assets/{_f4yPg-i-.js → _DypMRhyB.js} +1 -1
- package/dist/public/assets/_DypMRhyB.js.br +0 -0
- package/dist/public/assets/{_B92xkQnk.js → _LpvSvw1m.js} +1 -1
- package/dist/public/assets/_LpvSvw1m.js.br +0 -0
- package/dist/public/assets/{_C9E3fz2-.js → _OrWHmnP_.js} +1 -1
- package/dist/public/assets/_OrWHmnP_.js.br +0 -0
- package/dist/public/assets/{_ByKU0Hfi.js → _WWEgOS99.js} +1 -1
- package/dist/public/assets/_WWEgOS99.js.br +0 -0
- package/dist/public/assets/{_DljpB8742.js → __yh22OJv2.js} +1 -1
- package/dist/public/assets/__yh22OJv2.js.br +0 -0
- package/dist/public/assets/{_C9hmrTBV.js → _c0RV9ZTi.js} +1 -1
- package/dist/public/assets/_c0RV9ZTi.js.br +0 -0
- package/dist/public/assets/{_HH6t8aRM2.js → _h4RVOlAc2.js} +1 -1
- package/dist/public/assets/_h4RVOlAc2.js.br +0 -0
- package/dist/public/assets/{_Bvgyberk.js → _k8EORKKh.js} +1 -1
- package/dist/public/assets/_k8EORKKh.js.br +0 -0
- package/dist/public/assets/{_CMGqtmQt.js → _ror9VoLz.js} +1 -1
- package/dist/public/assets/_ror9VoLz.js.br +0 -0
- package/dist/public/assets/{_DDsFYxIq.js → _um1Uylai.js} +1 -1
- package/dist/public/assets/_um1Uylai.js.br +0 -0
- package/dist/public/assets/{_D7TvcnuF2.js → _z-TE6bLm2.js} +1 -1
- package/dist/public/assets/_z-TE6bLm2.js.br +0 -0
- package/dist/public/assets/diff-view-Cb9k_CUr.css +1 -0
- package/dist/public/assets/diff-view-Cb9k_CUr.css.br +0 -0
- package/dist/public/assets/{index-D41huIuZ.css → index-BTS1WPEB.css} +1 -1
- package/dist/public/assets/index-BTS1WPEB.css.br +0 -0
- package/dist/public/assets/{index-Bfh8nSee.js → index-g4T1J5qh.js} +20 -20
- package/dist/public/assets/index-g4T1J5qh.js.br +0 -0
- package/lib/setup/install.mjs +10 -7
- package/package.json +1 -1
- package/scripts/migrate.mjs +21 -0
- package/dist/public/assets/_4zqifGZf2.js.br +0 -0
- package/dist/public/assets/_8D88iC2Y.js.br +0 -0
- package/dist/public/assets/_B-7M0VuK2.js.br +0 -0
- package/dist/public/assets/_B-XihPlt.js.br +0 -0
- package/dist/public/assets/_B01yJM_n.js.br +0 -0
- package/dist/public/assets/_B3dWhBsL2.js.br +0 -0
- package/dist/public/assets/_B6JLzfQk.js.br +0 -0
- package/dist/public/assets/_B92xkQnk.js.br +0 -0
- package/dist/public/assets/_BH7cFvM5.js.br +0 -0
- package/dist/public/assets/_BP2BHaYT2.js.br +0 -0
- package/dist/public/assets/_BPmHfnJD.js.br +0 -0
- package/dist/public/assets/_BRURAzLu2.js.br +0 -0
- package/dist/public/assets/_BUhKc7uT.js.br +0 -0
- package/dist/public/assets/_BX76n7oq2.js.br +0 -0
- package/dist/public/assets/_B_Wegq962.js.br +0 -0
- package/dist/public/assets/_Bb4a7oF1.js.br +0 -0
- package/dist/public/assets/_BhAegdMF2.js.br +0 -0
- package/dist/public/assets/_BlPl6sCu2.js.br +0 -0
- package/dist/public/assets/_BmEd20O42.js.br +0 -0
- package/dist/public/assets/_BpxZLi8K.js.br +0 -0
- package/dist/public/assets/_BrNzM4EC2.js.br +0 -0
- package/dist/public/assets/_Bvgyberk.js.br +0 -0
- package/dist/public/assets/_ByKU0Hfi.js.br +0 -0
- package/dist/public/assets/_ByaG8bWs.js.br +0 -0
- package/dist/public/assets/_BziqIADV2.js.br +0 -0
- package/dist/public/assets/_C2-Kd826.js.br +0 -0
- package/dist/public/assets/_C2rSDO7f.js.br +0 -0
- package/dist/public/assets/_C6jAYlE8.js.br +0 -0
- package/dist/public/assets/_C9E3fz2-.js.br +0 -0
- package/dist/public/assets/_C9hmrTBV.js.br +0 -0
- package/dist/public/assets/_CMGqtmQt.js.br +0 -0
- package/dist/public/assets/_CNxYMMPa.js.br +0 -0
- package/dist/public/assets/_CRmHsbsL.js.br +0 -0
- package/dist/public/assets/_CVQKEVHV.js.br +0 -0
- package/dist/public/assets/_Cci4ZExC.js.br +0 -0
- package/dist/public/assets/_CgnZDJPL.js.br +0 -0
- package/dist/public/assets/_CkeutYnJ2.js.br +0 -0
- package/dist/public/assets/_D0L-Bq8g.js.br +0 -0
- package/dist/public/assets/_D48HGWNS.js.br +0 -0
- package/dist/public/assets/_D4J5RQqK.js.br +0 -0
- package/dist/public/assets/_D6xeqZLn.js.br +0 -0
- package/dist/public/assets/_D7TvcnuF2.js.br +0 -0
- package/dist/public/assets/_D99Y49OA.js.br +0 -0
- package/dist/public/assets/_D9jhO9rQ.js.br +0 -0
- package/dist/public/assets/_DBzS4J_k.js.br +0 -0
- package/dist/public/assets/_DDsFYxIq.js.br +0 -0
- package/dist/public/assets/_DIiEy_VP.js.br +0 -0
- package/dist/public/assets/_DImQNomk.js.br +0 -0
- package/dist/public/assets/_DRRQXGKH.js.br +0 -0
- package/dist/public/assets/_DZ0pRMJN2.js.br +0 -0
- package/dist/public/assets/_DbkjWa7i2.js.br +0 -0
- package/dist/public/assets/_DjKQr6mH.js.br +0 -0
- package/dist/public/assets/_Dji7sUrK2.js.br +0 -0
- package/dist/public/assets/_DkMIDB1P2.js.br +0 -0
- package/dist/public/assets/_DlC4k_XP.js.br +0 -0
- package/dist/public/assets/_DljpB8742.js.br +0 -0
- package/dist/public/assets/_DlsPVtFC.js.br +0 -0
- package/dist/public/assets/_Dmw0DArq.js.br +0 -0
- package/dist/public/assets/_DyNwE1Gc.js.br +0 -0
- package/dist/public/assets/_F3u8qQ9y.js.br +0 -0
- package/dist/public/assets/_HH6t8aRM2.js.br +0 -0
- package/dist/public/assets/_JYBrvu87.js.br +0 -0
- package/dist/public/assets/_Kzpu52En.js.br +0 -0
- package/dist/public/assets/_UWZzN8Rg.js.br +0 -0
- package/dist/public/assets/_YLPBpmu6.js.br +0 -0
- package/dist/public/assets/_f4yPg-i-.js.br +0 -0
- package/dist/public/assets/_lBeubFtN2.js.br +0 -0
- package/dist/public/assets/_llnipctq2.js.br +0 -0
- package/dist/public/assets/_sBNm9tCS.js.br +0 -0
- package/dist/public/assets/_u3et6kdz.js.br +0 -0
- package/dist/public/assets/_v4TxGuxE.js.br +0 -0
- package/dist/public/assets/_wvTh271a.js.br +0 -0
- package/dist/public/assets/diff-view-CKEylX6w.css +0 -1
- package/dist/public/assets/diff-view-CKEylX6w.css.br +0 -0
- package/dist/public/assets/index-Bfh8nSee.js.br +0 -0
- package/dist/public/assets/index-D41huIuZ.css.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. */
|
|
@@ -208,7 +355,7 @@ async function fix(d, { agents = "prompt" } = {}) {
|
|
|
208
355
|
} else if (yes) {
|
|
209
356
|
warn("gh is not authenticated — run `gh auth login` later");
|
|
210
357
|
} else {
|
|
211
|
-
log("signing in to GitHub (PRs/clones)");
|
|
358
|
+
log("signing in to GitHub (PRs/clones) — open https://github.com/login/device in any browser and enter the code below; no browser is launched here");
|
|
212
359
|
await authGithub("github.com", { interactive: true }).catch((err) => warn(err.message));
|
|
213
360
|
}
|
|
214
361
|
}
|