@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.
Files changed (155) hide show
  1. package/bin/work.mjs +63 -16
  2. package/dist/index.mjs +312 -218
  3. package/dist/public/assets/{_G2euCJ5s2.js → _17ixsFjl2.js} +2 -2
  4. package/dist/public/assets/{_G2euCJ5s2.js.map → _17ixsFjl2.js.map} +1 -1
  5. package/dist/public/assets/{_BmLItN7n.js → _38qjx0VE.js} +2 -2
  6. package/dist/public/assets/{_BmLItN7n.js.map → _38qjx0VE.js.map} +1 -1
  7. package/dist/public/assets/{_UUjPxQzk.js → _B01vNcBH.js} +2 -2
  8. package/dist/public/assets/{_UUjPxQzk.js.map → _B01vNcBH.js.map} +1 -1
  9. package/dist/public/assets/{_Ck_58QRD.js → _B5_K4U35.js} +2 -2
  10. package/dist/public/assets/{_Ck_58QRD.js.map → _B5_K4U35.js.map} +1 -1
  11. package/dist/public/assets/{_CGEJqu1l.js → _B7WJMKdz.js} +2 -2
  12. package/dist/public/assets/{_CGEJqu1l.js.map → _B7WJMKdz.js.map} +1 -1
  13. package/dist/public/assets/{_MSZeR7tc.js → _BCmJwCZ4.js} +2 -2
  14. package/dist/public/assets/{_MSZeR7tc.js.map → _BCmJwCZ4.js.map} +1 -1
  15. package/dist/public/assets/{_XySmXsU3.js → _BGfZ-AIc.js} +2 -2
  16. package/dist/public/assets/{_XySmXsU3.js.map → _BGfZ-AIc.js.map} +1 -1
  17. package/dist/public/assets/{_C_AWyxBB.js → _BGjK3KLI.js} +2 -2
  18. package/dist/public/assets/{_C_AWyxBB.js.map → _BGjK3KLI.js.map} +1 -1
  19. package/dist/public/assets/{_Bjvy806u2.js → _BO1auSkL2.js} +2 -2
  20. package/dist/public/assets/{_Bjvy806u2.js.map → _BO1auSkL2.js.map} +1 -1
  21. package/dist/public/assets/{_Dp2I7SvR2.js → _BSe5zjTJ2.js} +2 -2
  22. package/dist/public/assets/{_Dp2I7SvR2.js.map → _BSe5zjTJ2.js.map} +1 -1
  23. package/dist/public/assets/{_DwB4tost2.js → _BV7Qzzwy2.js} +2 -2
  24. package/dist/public/assets/{_DwB4tost2.js.map → _BV7Qzzwy2.js.map} +1 -1
  25. package/dist/public/assets/{_C6fTVhaS.js → _BZgEX-SR.js} +2 -2
  26. package/dist/public/assets/{_C6fTVhaS.js.map → _BZgEX-SR.js.map} +1 -1
  27. package/dist/public/assets/{_B-CqRNtV.js → _Bj_P-is9.js} +2 -2
  28. package/dist/public/assets/{_B-CqRNtV.js.map → _Bj_P-is9.js.map} +1 -1
  29. package/dist/public/assets/{_LMf8ZNAk.js → _BjlFBd9j.js} +2 -2
  30. package/dist/public/assets/{_LMf8ZNAk.js.map → _BjlFBd9j.js.map} +1 -1
  31. package/dist/public/assets/{_DsH6sF8_.js → _BqB9YKHu.js} +2 -2
  32. package/dist/public/assets/{_DsH6sF8_.js.map → _BqB9YKHu.js.map} +1 -1
  33. package/dist/public/assets/{_CSxCkWdX2.js → _Bs-d5a142.js} +2 -2
  34. package/dist/public/assets/{_CSxCkWdX2.js.map → _Bs-d5a142.js.map} +1 -1
  35. package/dist/public/assets/{_f31sxhc9.js → _Bt1hNExm.js} +2 -2
  36. package/dist/public/assets/{_f31sxhc9.js.map → _Bt1hNExm.js.map} +1 -1
  37. package/dist/public/assets/{_lZmV1DmL.js → _BvkUWaoR.js} +2 -2
  38. package/dist/public/assets/{_lZmV1DmL.js.map → _BvkUWaoR.js.map} +1 -1
  39. package/dist/public/assets/{_DR7HMLdt.js → _C0fM-yEd.js} +2 -2
  40. package/dist/public/assets/{_DR7HMLdt.js.map → _C0fM-yEd.js.map} +1 -1
  41. package/dist/public/assets/{_BO52x4nD2.js → _C52df4172.js} +2 -2
  42. package/dist/public/assets/{_BO52x4nD2.js.map → _C52df4172.js.map} +1 -1
  43. package/dist/public/assets/{_DVqaReFM2.js → _CATT-8QU2.js} +2 -2
  44. package/dist/public/assets/{_DVqaReFM2.js.map → _CATT-8QU2.js.map} +1 -1
  45. package/dist/public/assets/{_Fpix3N3i.js → _CDUUTPIa.js} +2 -2
  46. package/dist/public/assets/{_Fpix3N3i.js.map → _CDUUTPIa.js.map} +1 -1
  47. package/dist/public/assets/{_CMH9CsQN.js → _CIE37fGr.js} +2 -2
  48. package/dist/public/assets/{_CMH9CsQN.js.map → _CIE37fGr.js.map} +1 -1
  49. package/dist/public/assets/{_A4VtPfAb.js → _CLjg6iH5.js} +2 -2
  50. package/dist/public/assets/{_A4VtPfAb.js.map → _CLjg6iH5.js.map} +1 -1
  51. package/dist/public/assets/{_DjF3hk4N.js → _CPMq9qKD.js} +2 -2
  52. package/dist/public/assets/{_DjF3hk4N.js.map → _CPMq9qKD.js.map} +1 -1
  53. package/dist/public/assets/{_BQnjw6qe.js → _CUCwB86v.js} +2 -2
  54. package/dist/public/assets/{_BQnjw6qe.js.map → _CUCwB86v.js.map} +1 -1
  55. package/dist/public/assets/{_CZJ6f1W42.js → _CUdHfuKf2.js} +2 -2
  56. package/dist/public/assets/{_CZJ6f1W42.js.map → _CUdHfuKf2.js.map} +1 -1
  57. package/dist/public/assets/{_D4G4BzdU2.js → _CVvMxylB2.js} +2 -2
  58. package/dist/public/assets/{_D4G4BzdU2.js.map → _CVvMxylB2.js.map} +1 -1
  59. package/dist/public/assets/{_Cxre_eVs2.js → _CeDXSlq_2.js} +2 -2
  60. package/dist/public/assets/{_Cxre_eVs2.js.map → _CeDXSlq_2.js.map} +1 -1
  61. package/dist/public/assets/{_BMIj0szP.js → _CgK4NAc5.js} +2 -2
  62. package/dist/public/assets/{_BMIj0szP.js.map → _CgK4NAc5.js.map} +1 -1
  63. package/dist/public/assets/{_DFdBRroy.js → _ChbGErmQ.js} +2 -2
  64. package/dist/public/assets/{_DFdBRroy.js.map → _ChbGErmQ.js.map} +1 -1
  65. package/dist/public/assets/{_Dj5K_vdY.js → _CjoA9dbQ.js} +2 -2
  66. package/dist/public/assets/{_Dj5K_vdY.js.map → _CjoA9dbQ.js.map} +1 -1
  67. package/dist/public/assets/{_C7WwEVpI.js → _Cm0oW23H.js} +2 -2
  68. package/dist/public/assets/{_C7WwEVpI.js.map → _Cm0oW23H.js.map} +1 -1
  69. package/dist/public/assets/{_Cp2dVuf7.js → _CscsJi7i.js} +2 -2
  70. package/dist/public/assets/{_Cp2dVuf7.js.map → _CscsJi7i.js.map} +1 -1
  71. package/dist/public/assets/{_C_RO1bIU.js → _Czy_Rmr8.js} +2 -2
  72. package/dist/public/assets/{_C_RO1bIU.js.map → _Czy_Rmr8.js.map} +1 -1
  73. package/dist/public/assets/{_Dg0ufwJw.js → _D-u1ssE0.js} +2 -2
  74. package/dist/public/assets/{_Dg0ufwJw.js.map → _D-u1ssE0.js.map} +1 -1
  75. package/dist/public/assets/{_DThwiCYf.js → _D1AvypB0.js} +2 -2
  76. package/dist/public/assets/{_DThwiCYf.js.map → _D1AvypB0.js.map} +1 -1
  77. package/dist/public/assets/{_De1qIUYL2.js → _D4Z_UM_B2.js} +2 -2
  78. package/dist/public/assets/{_De1qIUYL2.js.map → _D4Z_UM_B2.js.map} +1 -1
  79. package/dist/public/assets/{_DWh6hcFb.js → _D7AQAhlo.js} +2 -2
  80. package/dist/public/assets/{_DWh6hcFb.js.map → _D7AQAhlo.js.map} +1 -1
  81. package/dist/public/assets/{_BxHj_AmV.js → _D8RDRYsV.js} +2 -2
  82. package/dist/public/assets/{_BxHj_AmV.js.map → _D8RDRYsV.js.map} +1 -1
  83. package/dist/public/assets/{_BtEwCzLt.js → _D9oMqxHc.js} +2 -2
  84. package/dist/public/assets/{_BtEwCzLt.js.map → _D9oMqxHc.js.map} +1 -1
  85. package/dist/public/assets/{_BKWC43v9.js → _DDDACu2e.js} +2 -2
  86. package/dist/public/assets/{_BKWC43v9.js.map → _DDDACu2e.js.map} +1 -1
  87. package/dist/public/assets/{_BPAMsQ-Y2.js → _DFLlSEDh2.js} +2 -2
  88. package/dist/public/assets/{_BPAMsQ-Y2.js.map → _DFLlSEDh2.js.map} +1 -1
  89. package/dist/public/assets/{_C55X2_br.js → _DOeCLKRd.js} +2 -2
  90. package/dist/public/assets/{_C55X2_br.js.map → _DOeCLKRd.js.map} +1 -1
  91. package/dist/public/assets/{_BksA_4pq.js → _DWSSCCOX.js} +2 -2
  92. package/dist/public/assets/{_BksA_4pq.js.map → _DWSSCCOX.js.map} +1 -1
  93. package/dist/public/assets/{_CPt59YK-2.js → _DcCF4p4b2.js} +2 -2
  94. package/dist/public/assets/{_CPt59YK-2.js.map → _DcCF4p4b2.js.map} +1 -1
  95. package/dist/public/assets/{_D25eFvus.js → _Dfi8Atag.js} +2 -2
  96. package/dist/public/assets/{_D25eFvus.js.map → _Dfi8Atag.js.map} +1 -1
  97. package/dist/public/assets/{_CZjGo4EJ2.js → _Dg2FAYj_2.js} +2 -2
  98. package/dist/public/assets/{_CZjGo4EJ2.js.map → _Dg2FAYj_2.js.map} +1 -1
  99. package/dist/public/assets/{_DwvTHP0H.js → _Dlbc7SgI.js} +2 -2
  100. package/dist/public/assets/{_DwvTHP0H.js.map → _Dlbc7SgI.js.map} +1 -1
  101. package/dist/public/assets/{_DdXxywnu.js → _DoTuVtdo.js} +2 -2
  102. package/dist/public/assets/{_DdXxywnu.js.map → _DoTuVtdo.js.map} +1 -1
  103. package/dist/public/assets/{_DWBu1oTd.js → _DpRvij_q.js} +2 -2
  104. package/dist/public/assets/{_DWBu1oTd.js.map → _DpRvij_q.js.map} +1 -1
  105. package/dist/public/assets/{_m6OqtXq5.js → _DpdFHjlT.js} +2 -2
  106. package/dist/public/assets/{_m6OqtXq5.js.map → _DpdFHjlT.js.map} +1 -1
  107. package/dist/public/assets/{_DkAxFIdj2.js → _DsK9qp5z2.js} +2 -2
  108. package/dist/public/assets/{_DkAxFIdj2.js.map → _DsK9qp5z2.js.map} +1 -1
  109. package/dist/public/assets/{_BF4oeZAs2.js → _DtkPfG0P2.js} +2 -2
  110. package/dist/public/assets/{_BF4oeZAs2.js.map → _DtkPfG0P2.js.map} +1 -1
  111. package/dist/public/assets/{_DgS0ehtc.js → _DtpDQy9c.js} +2 -2
  112. package/dist/public/assets/{_DgS0ehtc.js.map → _DtpDQy9c.js.map} +1 -1
  113. package/dist/public/assets/{_2JdtdC0N.js → _DvigaXuY.js} +2 -2
  114. package/dist/public/assets/{_2JdtdC0N.js.map → _DvigaXuY.js.map} +1 -1
  115. package/dist/public/assets/{_BacHRrKm2.js → _PBOdFezG2.js} +2 -2
  116. package/dist/public/assets/{_BacHRrKm2.js.map → _PBOdFezG2.js.map} +1 -1
  117. package/dist/public/assets/{_sQkp9ieF.js → _Q7i-xAMZ.js} +2 -2
  118. package/dist/public/assets/{_sQkp9ieF.js.map → _Q7i-xAMZ.js.map} +1 -1
  119. package/dist/public/assets/{_g24DOTM6.js → _T-HpFRXH.js} +2 -2
  120. package/dist/public/assets/{_g24DOTM6.js.map → _T-HpFRXH.js.map} +1 -1
  121. package/dist/public/assets/{_DaxEJQAG2.js → _U-btoBCb2.js} +2 -2
  122. package/dist/public/assets/{_DaxEJQAG2.js.map → _U-btoBCb2.js.map} +1 -1
  123. package/dist/public/assets/{_B7BQvLFA2.js → _VVnpWsa-2.js} +2 -2
  124. package/dist/public/assets/{_B7BQvLFA2.js.map → _VVnpWsa-2.js.map} +1 -1
  125. package/dist/public/assets/{_3LSnPXE-2.js → _kN8jmSEy2.js} +2 -2
  126. package/dist/public/assets/{_3LSnPXE-2.js.map → _kN8jmSEy2.js.map} +1 -1
  127. package/dist/public/assets/{_BbQjjMLb2.js → _kf1lUDoU2.js} +2 -2
  128. package/dist/public/assets/{_BbQjjMLb2.js.map → _kf1lUDoU2.js.map} +1 -1
  129. package/dist/public/assets/{_MSjbYDCb.js → _kzd-9LxV.js} +2 -2
  130. package/dist/public/assets/{_MSjbYDCb.js.map → _kzd-9LxV.js.map} +1 -1
  131. package/dist/public/assets/{_L0QEXXRu.js → _lENTdKos.js} +2 -2
  132. package/dist/public/assets/{_L0QEXXRu.js.map → _lENTdKos.js.map} +1 -1
  133. package/dist/public/assets/{_DwWKKIbx.js → _lO429-VP.js} +2 -2
  134. package/dist/public/assets/{_DwWKKIbx.js.map → _lO429-VP.js.map} +1 -1
  135. package/dist/public/assets/{_BWobArGx2.js → _nfuFU9Un2.js} +2 -2
  136. package/dist/public/assets/{_BWobArGx2.js.map → _nfuFU9Un2.js.map} +1 -1
  137. package/dist/public/assets/{_dbpNK3ti.js → _nv0goT4Z.js} +2 -2
  138. package/dist/public/assets/{_dbpNK3ti.js.map → _nv0goT4Z.js.map} +1 -1
  139. package/dist/public/assets/{_5XJqee1K2.js → _o_JLlSoU2.js} +2 -2
  140. package/dist/public/assets/{_5XJqee1K2.js.map → _o_JLlSoU2.js.map} +1 -1
  141. package/dist/public/assets/{_B7ycuWnF.js → _rDdCnzAf.js} +2 -2
  142. package/dist/public/assets/{_B7ycuWnF.js.map → _rDdCnzAf.js.map} +1 -1
  143. package/dist/public/assets/{_qGiUFV1r.js → _tf4220G9.js} +2 -2
  144. package/dist/public/assets/{_qGiUFV1r.js.map → _tf4220G9.js.map} +1 -1
  145. package/dist/public/assets/{_Dc3WoyCf.js → _uhGymT-L.js} +2 -2
  146. package/dist/public/assets/{_Dc3WoyCf.js.map → _uhGymT-L.js.map} +1 -1
  147. package/dist/public/assets/{_CFYld88W.js → _vd_LQrD6.js} +2 -2
  148. package/dist/public/assets/{_CFYld88W.js.map → _vd_LQrD6.js.map} +1 -1
  149. package/dist/public/assets/{_AAkZyuUo2.js → _xikqPUw52.js} +2 -2
  150. package/dist/public/assets/{_AAkZyuUo2.js.map → _xikqPUw52.js.map} +1 -1
  151. package/dist/public/assets/{index-BAGH9WA4.js → index-BwlA-lgI.js} +59 -59
  152. package/dist/public/assets/index-BwlA-lgI.js.map +1 -0
  153. package/install.sh +4 -1
  154. package/package.json +1 -1
  155. 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], { stdio: "inherit" });
115
+ spawnSync(process.execPath, [migrate], {
116
+ stdio: "inherit",
117
+ env: { ...process.env, ...serviceEnv() },
118
+ });
114
119
  }
115
120
 
116
121
  installService();
117
- maybeTunnel();
118
- log(`done — http://localhost:${appPort}`);
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(), PORT: appPort };
144
- for (const key of ["WORK_APP_PORT", "WORK_ROOT", "WORK_DATA_DIR", "WORK_ALLOWED_HOSTS", "WORK_BIND"]) {
145
- if (process.env[key]) env[key] = process.env[key];
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 = path.join(os.homedir(), "Library/LaunchAgents/dev.work.app.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 unitDir = path.join(
196
- process.env.XDG_CONFIG_HOME || path.join(os.homedir(), ".config"),
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
- path.join(unitDir, "work.service"),
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
- Restart=on-failure
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:${appPort}, or Tailscale. The server itself has
283
+ pointing at http://localhost:${port}, or Tailscale. The server itself has
237
284
  no auth of its own.`);
238
285
  }