@dylanpiercey/work 0.0.5 → 0.0.6
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 +63 -16
- package/dist/index.mjs +312 -218
- package/dist/public/assets/{_G2euCJ5s2.js → _17ixsFjl2.js} +2 -2
- package/dist/public/assets/{_G2euCJ5s2.js.map → _17ixsFjl2.js.map} +1 -1
- package/dist/public/assets/{_BmLItN7n.js → _38qjx0VE.js} +2 -2
- package/dist/public/assets/{_BmLItN7n.js.map → _38qjx0VE.js.map} +1 -1
- package/dist/public/assets/{_UUjPxQzk.js → _B01vNcBH.js} +2 -2
- package/dist/public/assets/{_UUjPxQzk.js.map → _B01vNcBH.js.map} +1 -1
- package/dist/public/assets/{_Ck_58QRD.js → _B5_K4U35.js} +2 -2
- package/dist/public/assets/{_Ck_58QRD.js.map → _B5_K4U35.js.map} +1 -1
- package/dist/public/assets/{_CGEJqu1l.js → _B7WJMKdz.js} +2 -2
- package/dist/public/assets/{_CGEJqu1l.js.map → _B7WJMKdz.js.map} +1 -1
- package/dist/public/assets/{_MSZeR7tc.js → _BCmJwCZ4.js} +2 -2
- package/dist/public/assets/{_MSZeR7tc.js.map → _BCmJwCZ4.js.map} +1 -1
- package/dist/public/assets/{_XySmXsU3.js → _BGfZ-AIc.js} +2 -2
- package/dist/public/assets/{_XySmXsU3.js.map → _BGfZ-AIc.js.map} +1 -1
- package/dist/public/assets/{_C_AWyxBB.js → _BGjK3KLI.js} +2 -2
- package/dist/public/assets/{_C_AWyxBB.js.map → _BGjK3KLI.js.map} +1 -1
- package/dist/public/assets/{_Bjvy806u2.js → _BO1auSkL2.js} +2 -2
- package/dist/public/assets/{_Bjvy806u2.js.map → _BO1auSkL2.js.map} +1 -1
- package/dist/public/assets/{_Dp2I7SvR2.js → _BSe5zjTJ2.js} +2 -2
- package/dist/public/assets/{_Dp2I7SvR2.js.map → _BSe5zjTJ2.js.map} +1 -1
- package/dist/public/assets/{_DwB4tost2.js → _BV7Qzzwy2.js} +2 -2
- package/dist/public/assets/{_DwB4tost2.js.map → _BV7Qzzwy2.js.map} +1 -1
- package/dist/public/assets/{_C6fTVhaS.js → _BZgEX-SR.js} +2 -2
- package/dist/public/assets/{_C6fTVhaS.js.map → _BZgEX-SR.js.map} +1 -1
- package/dist/public/assets/{_B-CqRNtV.js → _Bj_P-is9.js} +2 -2
- package/dist/public/assets/{_B-CqRNtV.js.map → _Bj_P-is9.js.map} +1 -1
- package/dist/public/assets/{_LMf8ZNAk.js → _BjlFBd9j.js} +2 -2
- package/dist/public/assets/{_LMf8ZNAk.js.map → _BjlFBd9j.js.map} +1 -1
- package/dist/public/assets/{_DsH6sF8_.js → _BqB9YKHu.js} +2 -2
- package/dist/public/assets/{_DsH6sF8_.js.map → _BqB9YKHu.js.map} +1 -1
- package/dist/public/assets/{_CSxCkWdX2.js → _Bs-d5a142.js} +2 -2
- package/dist/public/assets/{_CSxCkWdX2.js.map → _Bs-d5a142.js.map} +1 -1
- package/dist/public/assets/{_f31sxhc9.js → _Bt1hNExm.js} +2 -2
- package/dist/public/assets/{_f31sxhc9.js.map → _Bt1hNExm.js.map} +1 -1
- package/dist/public/assets/{_lZmV1DmL.js → _BvkUWaoR.js} +2 -2
- package/dist/public/assets/{_lZmV1DmL.js.map → _BvkUWaoR.js.map} +1 -1
- package/dist/public/assets/{_DR7HMLdt.js → _C0fM-yEd.js} +2 -2
- package/dist/public/assets/{_DR7HMLdt.js.map → _C0fM-yEd.js.map} +1 -1
- package/dist/public/assets/{_BO52x4nD2.js → _C52df4172.js} +2 -2
- package/dist/public/assets/{_BO52x4nD2.js.map → _C52df4172.js.map} +1 -1
- package/dist/public/assets/{_DVqaReFM2.js → _CATT-8QU2.js} +2 -2
- package/dist/public/assets/{_DVqaReFM2.js.map → _CATT-8QU2.js.map} +1 -1
- package/dist/public/assets/{_Fpix3N3i.js → _CDUUTPIa.js} +2 -2
- package/dist/public/assets/{_Fpix3N3i.js.map → _CDUUTPIa.js.map} +1 -1
- package/dist/public/assets/{_CMH9CsQN.js → _CIE37fGr.js} +2 -2
- package/dist/public/assets/{_CMH9CsQN.js.map → _CIE37fGr.js.map} +1 -1
- package/dist/public/assets/{_A4VtPfAb.js → _CLjg6iH5.js} +2 -2
- package/dist/public/assets/{_A4VtPfAb.js.map → _CLjg6iH5.js.map} +1 -1
- package/dist/public/assets/{_DjF3hk4N.js → _CPMq9qKD.js} +2 -2
- package/dist/public/assets/{_DjF3hk4N.js.map → _CPMq9qKD.js.map} +1 -1
- package/dist/public/assets/{_BQnjw6qe.js → _CUCwB86v.js} +2 -2
- package/dist/public/assets/{_BQnjw6qe.js.map → _CUCwB86v.js.map} +1 -1
- package/dist/public/assets/{_CZJ6f1W42.js → _CUdHfuKf2.js} +2 -2
- package/dist/public/assets/{_CZJ6f1W42.js.map → _CUdHfuKf2.js.map} +1 -1
- package/dist/public/assets/{_D4G4BzdU2.js → _CVvMxylB2.js} +2 -2
- package/dist/public/assets/{_D4G4BzdU2.js.map → _CVvMxylB2.js.map} +1 -1
- package/dist/public/assets/{_Cxre_eVs2.js → _CeDXSlq_2.js} +2 -2
- package/dist/public/assets/{_Cxre_eVs2.js.map → _CeDXSlq_2.js.map} +1 -1
- package/dist/public/assets/{_BMIj0szP.js → _CgK4NAc5.js} +2 -2
- package/dist/public/assets/{_BMIj0szP.js.map → _CgK4NAc5.js.map} +1 -1
- package/dist/public/assets/{_DFdBRroy.js → _ChbGErmQ.js} +2 -2
- package/dist/public/assets/{_DFdBRroy.js.map → _ChbGErmQ.js.map} +1 -1
- package/dist/public/assets/{_Dj5K_vdY.js → _CjoA9dbQ.js} +2 -2
- package/dist/public/assets/{_Dj5K_vdY.js.map → _CjoA9dbQ.js.map} +1 -1
- package/dist/public/assets/{_C7WwEVpI.js → _Cm0oW23H.js} +2 -2
- package/dist/public/assets/{_C7WwEVpI.js.map → _Cm0oW23H.js.map} +1 -1
- package/dist/public/assets/{_Cp2dVuf7.js → _CscsJi7i.js} +2 -2
- package/dist/public/assets/{_Cp2dVuf7.js.map → _CscsJi7i.js.map} +1 -1
- package/dist/public/assets/{_C_RO1bIU.js → _Czy_Rmr8.js} +2 -2
- package/dist/public/assets/{_C_RO1bIU.js.map → _Czy_Rmr8.js.map} +1 -1
- package/dist/public/assets/{_Dg0ufwJw.js → _D-u1ssE0.js} +2 -2
- package/dist/public/assets/{_Dg0ufwJw.js.map → _D-u1ssE0.js.map} +1 -1
- package/dist/public/assets/{_DThwiCYf.js → _D1AvypB0.js} +2 -2
- package/dist/public/assets/{_DThwiCYf.js.map → _D1AvypB0.js.map} +1 -1
- package/dist/public/assets/{_De1qIUYL2.js → _D4Z_UM_B2.js} +2 -2
- package/dist/public/assets/{_De1qIUYL2.js.map → _D4Z_UM_B2.js.map} +1 -1
- package/dist/public/assets/{_DWh6hcFb.js → _D7AQAhlo.js} +2 -2
- package/dist/public/assets/{_DWh6hcFb.js.map → _D7AQAhlo.js.map} +1 -1
- package/dist/public/assets/{_BxHj_AmV.js → _D8RDRYsV.js} +2 -2
- package/dist/public/assets/{_BxHj_AmV.js.map → _D8RDRYsV.js.map} +1 -1
- package/dist/public/assets/{_BtEwCzLt.js → _D9oMqxHc.js} +2 -2
- package/dist/public/assets/{_BtEwCzLt.js.map → _D9oMqxHc.js.map} +1 -1
- package/dist/public/assets/{_BKWC43v9.js → _DDDACu2e.js} +2 -2
- package/dist/public/assets/{_BKWC43v9.js.map → _DDDACu2e.js.map} +1 -1
- package/dist/public/assets/{_BPAMsQ-Y2.js → _DFLlSEDh2.js} +2 -2
- package/dist/public/assets/{_BPAMsQ-Y2.js.map → _DFLlSEDh2.js.map} +1 -1
- package/dist/public/assets/{_C55X2_br.js → _DOeCLKRd.js} +2 -2
- package/dist/public/assets/{_C55X2_br.js.map → _DOeCLKRd.js.map} +1 -1
- package/dist/public/assets/{_BksA_4pq.js → _DWSSCCOX.js} +2 -2
- package/dist/public/assets/{_BksA_4pq.js.map → _DWSSCCOX.js.map} +1 -1
- package/dist/public/assets/{_CPt59YK-2.js → _DcCF4p4b2.js} +2 -2
- package/dist/public/assets/{_CPt59YK-2.js.map → _DcCF4p4b2.js.map} +1 -1
- package/dist/public/assets/{_D25eFvus.js → _Dfi8Atag.js} +2 -2
- package/dist/public/assets/{_D25eFvus.js.map → _Dfi8Atag.js.map} +1 -1
- package/dist/public/assets/{_CZjGo4EJ2.js → _Dg2FAYj_2.js} +2 -2
- package/dist/public/assets/{_CZjGo4EJ2.js.map → _Dg2FAYj_2.js.map} +1 -1
- package/dist/public/assets/{_DwvTHP0H.js → _Dlbc7SgI.js} +2 -2
- package/dist/public/assets/{_DwvTHP0H.js.map → _Dlbc7SgI.js.map} +1 -1
- package/dist/public/assets/{_DdXxywnu.js → _DoTuVtdo.js} +2 -2
- package/dist/public/assets/{_DdXxywnu.js.map → _DoTuVtdo.js.map} +1 -1
- package/dist/public/assets/{_DWBu1oTd.js → _DpRvij_q.js} +2 -2
- package/dist/public/assets/{_DWBu1oTd.js.map → _DpRvij_q.js.map} +1 -1
- package/dist/public/assets/{_m6OqtXq5.js → _DpdFHjlT.js} +2 -2
- package/dist/public/assets/{_m6OqtXq5.js.map → _DpdFHjlT.js.map} +1 -1
- package/dist/public/assets/{_DkAxFIdj2.js → _DsK9qp5z2.js} +2 -2
- package/dist/public/assets/{_DkAxFIdj2.js.map → _DsK9qp5z2.js.map} +1 -1
- package/dist/public/assets/{_BF4oeZAs2.js → _DtkPfG0P2.js} +2 -2
- package/dist/public/assets/{_BF4oeZAs2.js.map → _DtkPfG0P2.js.map} +1 -1
- package/dist/public/assets/{_DgS0ehtc.js → _DtpDQy9c.js} +2 -2
- package/dist/public/assets/{_DgS0ehtc.js.map → _DtpDQy9c.js.map} +1 -1
- package/dist/public/assets/{_2JdtdC0N.js → _DvigaXuY.js} +2 -2
- package/dist/public/assets/{_2JdtdC0N.js.map → _DvigaXuY.js.map} +1 -1
- package/dist/public/assets/{_BacHRrKm2.js → _PBOdFezG2.js} +2 -2
- package/dist/public/assets/{_BacHRrKm2.js.map → _PBOdFezG2.js.map} +1 -1
- package/dist/public/assets/{_sQkp9ieF.js → _Q7i-xAMZ.js} +2 -2
- package/dist/public/assets/{_sQkp9ieF.js.map → _Q7i-xAMZ.js.map} +1 -1
- package/dist/public/assets/{_g24DOTM6.js → _T-HpFRXH.js} +2 -2
- package/dist/public/assets/{_g24DOTM6.js.map → _T-HpFRXH.js.map} +1 -1
- package/dist/public/assets/{_DaxEJQAG2.js → _U-btoBCb2.js} +2 -2
- package/dist/public/assets/{_DaxEJQAG2.js.map → _U-btoBCb2.js.map} +1 -1
- package/dist/public/assets/{_B7BQvLFA2.js → _VVnpWsa-2.js} +2 -2
- package/dist/public/assets/{_B7BQvLFA2.js.map → _VVnpWsa-2.js.map} +1 -1
- package/dist/public/assets/{_3LSnPXE-2.js → _kN8jmSEy2.js} +2 -2
- package/dist/public/assets/{_3LSnPXE-2.js.map → _kN8jmSEy2.js.map} +1 -1
- package/dist/public/assets/{_BbQjjMLb2.js → _kf1lUDoU2.js} +2 -2
- package/dist/public/assets/{_BbQjjMLb2.js.map → _kf1lUDoU2.js.map} +1 -1
- package/dist/public/assets/{_MSjbYDCb.js → _kzd-9LxV.js} +2 -2
- package/dist/public/assets/{_MSjbYDCb.js.map → _kzd-9LxV.js.map} +1 -1
- package/dist/public/assets/{_L0QEXXRu.js → _lENTdKos.js} +2 -2
- package/dist/public/assets/{_L0QEXXRu.js.map → _lENTdKos.js.map} +1 -1
- package/dist/public/assets/{_DwWKKIbx.js → _lO429-VP.js} +2 -2
- package/dist/public/assets/{_DwWKKIbx.js.map → _lO429-VP.js.map} +1 -1
- package/dist/public/assets/{_BWobArGx2.js → _nfuFU9Un2.js} +2 -2
- package/dist/public/assets/{_BWobArGx2.js.map → _nfuFU9Un2.js.map} +1 -1
- package/dist/public/assets/{_dbpNK3ti.js → _nv0goT4Z.js} +2 -2
- package/dist/public/assets/{_dbpNK3ti.js.map → _nv0goT4Z.js.map} +1 -1
- package/dist/public/assets/{_5XJqee1K2.js → _o_JLlSoU2.js} +2 -2
- package/dist/public/assets/{_5XJqee1K2.js.map → _o_JLlSoU2.js.map} +1 -1
- package/dist/public/assets/{_B7ycuWnF.js → _rDdCnzAf.js} +2 -2
- package/dist/public/assets/{_B7ycuWnF.js.map → _rDdCnzAf.js.map} +1 -1
- package/dist/public/assets/{_qGiUFV1r.js → _tf4220G9.js} +2 -2
- package/dist/public/assets/{_qGiUFV1r.js.map → _tf4220G9.js.map} +1 -1
- package/dist/public/assets/{_Dc3WoyCf.js → _uhGymT-L.js} +2 -2
- package/dist/public/assets/{_Dc3WoyCf.js.map → _uhGymT-L.js.map} +1 -1
- package/dist/public/assets/{_CFYld88W.js → _vd_LQrD6.js} +2 -2
- package/dist/public/assets/{_CFYld88W.js.map → _vd_LQrD6.js.map} +1 -1
- package/dist/public/assets/{_AAkZyuUo2.js → _xikqPUw52.js} +2 -2
- package/dist/public/assets/{_AAkZyuUo2.js.map → _xikqPUw52.js.map} +1 -1
- package/dist/public/assets/{index-BAGH9WA4.js → index-BwlA-lgI.js} +59 -59
- package/dist/public/assets/index-BwlA-lgI.js.map +1 -0
- package/install.sh +4 -1
- package/package.json +1 -1
- package/dist/public/assets/index-BAGH9WA4.js.map +0 -1
package/bin/work.mjs
CHANGED
|
@@ -107,15 +107,21 @@ async function setup() {
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
// One-shot cleanups between versions.
|
|
110
|
+
// One-shot cleanups between versions. Run them against the settings the
|
|
111
|
+
// service actually uses: migrate.mjs exits quietly when it finds no db, so
|
|
112
|
+
// an ambient environment missing WORK_DATA_DIR skips every sweep.
|
|
111
113
|
const migrate = path.join(pkgRoot, "scripts", "migrate.mjs");
|
|
112
114
|
if (fs.existsSync(migrate)) {
|
|
113
|
-
spawnSync(process.execPath, [migrate], {
|
|
115
|
+
spawnSync(process.execPath, [migrate], {
|
|
116
|
+
stdio: "inherit",
|
|
117
|
+
env: { ...process.env, ...serviceEnv() },
|
|
118
|
+
});
|
|
114
119
|
}
|
|
115
120
|
|
|
116
121
|
installService();
|
|
117
|
-
|
|
118
|
-
|
|
122
|
+
const port = serviceEnv().PORT;
|
|
123
|
+
maybeTunnel(port);
|
|
124
|
+
log(`done — http://localhost:${port}`);
|
|
119
125
|
}
|
|
120
126
|
|
|
121
127
|
async function update() {
|
|
@@ -139,18 +145,54 @@ function servicePath() {
|
|
|
139
145
|
].join(":");
|
|
140
146
|
}
|
|
141
147
|
|
|
148
|
+
/** Where installService() writes the service definition — also the store we
|
|
149
|
+
* read settings back out of, so there is no second config file to keep. */
|
|
150
|
+
function serviceFile() {
|
|
151
|
+
return process.platform === "darwin"
|
|
152
|
+
? path.join(os.homedir(), "Library/LaunchAgents/dev.work.app.plist")
|
|
153
|
+
: path.join(
|
|
154
|
+
process.env.XDG_CONFIG_HOME || path.join(os.homedir(), ".config"),
|
|
155
|
+
"systemd/user/work.service",
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** WORK_* already baked into the installed service. `work update` re-runs
|
|
160
|
+
* setup from whatever shell the user happens to be in, so without this the
|
|
161
|
+
* first update silently resets the port, root and data dir to defaults —
|
|
162
|
+
* and a lost WORK_DATA_DIR points the server at an empty database, making
|
|
163
|
+
* every workspace look like it vanished. */
|
|
164
|
+
function installedServiceEnv() {
|
|
165
|
+
const installed = {};
|
|
166
|
+
try {
|
|
167
|
+
const text = fs.readFileSync(serviceFile(), "utf8");
|
|
168
|
+
const re =
|
|
169
|
+
process.platform === "darwin"
|
|
170
|
+
? /<key>(WORK_[A-Z_]+)<\/key>\s*<string>([^<]*)<\/string>/g
|
|
171
|
+
: /^Environment=(WORK_[A-Z_]+)=(.*)$/gm;
|
|
172
|
+
for (const [, key, value] of text.matchAll(re)) installed[key] = value;
|
|
173
|
+
} catch {}
|
|
174
|
+
return installed;
|
|
175
|
+
}
|
|
176
|
+
|
|
142
177
|
function serviceEnv() {
|
|
143
|
-
const env = { PATH: servicePath()
|
|
144
|
-
|
|
145
|
-
|
|
178
|
+
const env = { PATH: servicePath() };
|
|
179
|
+
const installed = installedServiceEnv();
|
|
180
|
+
for (const key of ["WORK_APP_PORT", "WORK_ROOT", "WORK_DATA_DIR", "WORK_ALLOWED_HOSTS"]) {
|
|
181
|
+
// `in` rather than a truthy check, so `WORK_ALLOWED_HOSTS= work setup`
|
|
182
|
+
// can deliberately clear a setting the installed service still carries.
|
|
183
|
+
const value = key in process.env ? process.env[key] : installed[key];
|
|
184
|
+
if (value) env[key] = value;
|
|
146
185
|
}
|
|
186
|
+
// entry.ts prefers PORT, so carrying WORK_APP_PORT forward without this
|
|
187
|
+
// would leave the service on the default port anyway.
|
|
188
|
+
env.PORT = env.WORK_APP_PORT || appPort;
|
|
147
189
|
return env;
|
|
148
190
|
}
|
|
149
191
|
|
|
150
192
|
function installService() {
|
|
151
193
|
const cliPath = fileURLToPath(import.meta.url);
|
|
152
194
|
if (process.platform === "darwin") {
|
|
153
|
-
const plist =
|
|
195
|
+
const plist = serviceFile();
|
|
154
196
|
fs.mkdirSync(path.dirname(plist), { recursive: true });
|
|
155
197
|
fs.mkdirSync(path.join(os.homedir(), "Library/Logs"), { recursive: true });
|
|
156
198
|
const envXml = Object.entries(serviceEnv())
|
|
@@ -192,22 +234,27 @@ ${envXml}
|
|
|
192
234
|
}
|
|
193
235
|
|
|
194
236
|
if (process.platform === "linux" && have("systemctl")) {
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
"systemd/user",
|
|
198
|
-
);
|
|
237
|
+
const unitFile = serviceFile();
|
|
238
|
+
const unitDir = path.dirname(unitFile);
|
|
199
239
|
fs.mkdirSync(unitDir, { recursive: true });
|
|
200
240
|
const envLines = Object.entries(serviceEnv())
|
|
201
241
|
.map(([k, v]) => `Environment=${k}=${v}`)
|
|
202
242
|
.join("\n");
|
|
203
243
|
fs.writeFileSync(
|
|
204
|
-
|
|
244
|
+
unitFile,
|
|
205
245
|
`[Unit]
|
|
206
246
|
Description=work — agentic dev workspace GUI
|
|
247
|
+
# Keep retrying forever: hitting the default start limit parks the unit in
|
|
248
|
+
# failed state, which is the manual-restart hole we are closing.
|
|
249
|
+
StartLimitIntervalSec=0
|
|
207
250
|
|
|
208
251
|
[Service]
|
|
209
252
|
ExecStart=${process.execPath} ${cliPath} start
|
|
210
|
-
|
|
253
|
+
# always, not on-failure: a stray SIGTERM (an agent running \`pkill node\`) or a
|
|
254
|
+
# clean exit looks like success to systemd and leaves the service down until
|
|
255
|
+
# someone notices. Matches launchd's KeepAlive on the macOS side.
|
|
256
|
+
Restart=always
|
|
257
|
+
RestartSec=2
|
|
211
258
|
${envLines}
|
|
212
259
|
|
|
213
260
|
[Install]
|
|
@@ -227,12 +274,12 @@ WantedBy=default.target
|
|
|
227
274
|
warn("no service manager found — start manually with: work start");
|
|
228
275
|
}
|
|
229
276
|
|
|
230
|
-
function maybeTunnel() {
|
|
277
|
+
function maybeTunnel(port = appPort) {
|
|
231
278
|
if (yes || have("cloudflared")) return;
|
|
232
279
|
console.log(`
|
|
233
280
|
To reach work from your phone or other devices, put it behind something
|
|
234
281
|
that terminates TLS and authenticates — e.g. a Cloudflare Tunnel with
|
|
235
282
|
Access (https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)
|
|
236
|
-
pointing at http://localhost:${
|
|
283
|
+
pointing at http://localhost:${port}, or Tailscale. The server itself has
|
|
237
284
|
no auth of its own.`);
|
|
238
285
|
}
|