runwork 0.15.1 → 0.16.0

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 (404) hide show
  1. package/bundled-types/task-delegation/task-delegation/types.d.ts +6 -0
  2. package/dist/index.js +20237 -116
  3. package/package.json +4 -4
  4. package/dist/__tests__/curl-parser.test.d.ts +0 -1
  5. package/dist/__tests__/curl-parser.test.js +0 -250
  6. package/dist/__tests__/install-scripts.test.d.ts +0 -1
  7. package/dist/__tests__/install-scripts.test.js +0 -280
  8. package/dist/__tests__/types-manager.test.d.ts +0 -1
  9. package/dist/__tests__/types-manager.test.js +0 -89
  10. package/dist/agents/__tests__/chatgpt-registry.test.d.ts +0 -1
  11. package/dist/agents/__tests__/chatgpt-registry.test.js +0 -61
  12. package/dist/agents/__tests__/claude-code-managed-block.test.d.ts +0 -1
  13. package/dist/agents/__tests__/claude-code-managed-block.test.js +0 -105
  14. package/dist/agents/__tests__/claude-code-plugin.test.d.ts +0 -1
  15. package/dist/agents/__tests__/claude-code-plugin.test.js +0 -47
  16. package/dist/agents/__tests__/claude-code-stats.test.d.ts +0 -1
  17. package/dist/agents/__tests__/claude-code-stats.test.js +0 -390
  18. package/dist/agents/__tests__/claude-desktop-memory.test.d.ts +0 -1
  19. package/dist/agents/__tests__/claude-desktop-memory.test.js +0 -154
  20. package/dist/agents/__tests__/claude-desktop-plugin-tree.test.d.ts +0 -1
  21. package/dist/agents/__tests__/claude-desktop-plugin-tree.test.js +0 -161
  22. package/dist/agents/__tests__/claude-desktop-plugin.test.d.ts +0 -1
  23. package/dist/agents/__tests__/claude-desktop-plugin.test.js +0 -117
  24. package/dist/agents/__tests__/claude-desktop-rpm.test.d.ts +0 -1
  25. package/dist/agents/__tests__/claude-desktop-rpm.test.js +0 -126
  26. package/dist/agents/__tests__/claude-desktop-stats.test.d.ts +0 -1
  27. package/dist/agents/__tests__/claude-desktop-stats.test.js +0 -280
  28. package/dist/agents/__tests__/codex-instructions.test.d.ts +0 -1
  29. package/dist/agents/__tests__/codex-instructions.test.js +0 -57
  30. package/dist/agents/__tests__/codex-minimum-permissions.test.d.ts +0 -1
  31. package/dist/agents/__tests__/codex-minimum-permissions.test.js +0 -82
  32. package/dist/agents/__tests__/codex-stats.test.d.ts +0 -1
  33. package/dist/agents/__tests__/codex-stats.test.js +0 -370
  34. package/dist/agents/__tests__/cursor-merge.test.d.ts +0 -1
  35. package/dist/agents/__tests__/cursor-merge.test.js +0 -66
  36. package/dist/agents/__tests__/cursor-stats.test.d.ts +0 -1
  37. package/dist/agents/__tests__/cursor-stats.test.js +0 -183
  38. package/dist/agents/__tests__/defaults-merge.test.d.ts +0 -1
  39. package/dist/agents/__tests__/defaults-merge.test.js +0 -268
  40. package/dist/agents/__tests__/detection.test.d.ts +0 -1
  41. package/dist/agents/__tests__/detection.test.js +0 -89
  42. package/dist/agents/__tests__/graceful-degradation.test.d.ts +0 -1
  43. package/dist/agents/__tests__/graceful-degradation.test.js +0 -129
  44. package/dist/agents/__tests__/instruction-hint.test.d.ts +0 -1
  45. package/dist/agents/__tests__/instruction-hint.test.js +0 -69
  46. package/dist/agents/__tests__/intro-skill.test.d.ts +0 -1
  47. package/dist/agents/__tests__/intro-skill.test.js +0 -193
  48. package/dist/agents/__tests__/schema-validation.test.d.ts +0 -1
  49. package/dist/agents/__tests__/schema-validation.test.js +0 -212
  50. package/dist/agents/__tests__/skill-slug.test.d.ts +0 -1
  51. package/dist/agents/__tests__/skill-slug.test.js +0 -77
  52. package/dist/agents/claude-code.d.ts +0 -59
  53. package/dist/agents/claude-code.js +0 -753
  54. package/dist/agents/claude-desktop-plugin-tree.d.ts +0 -59
  55. package/dist/agents/claude-desktop-plugin-tree.js +0 -143
  56. package/dist/agents/claude-desktop.d.ts +0 -47
  57. package/dist/agents/claude-desktop.js +0 -684
  58. package/dist/agents/cline.d.ts +0 -15
  59. package/dist/agents/cline.js +0 -130
  60. package/dist/agents/codex.d.ts +0 -44
  61. package/dist/agents/codex.js +0 -453
  62. package/dist/agents/conversation-skills.d.ts +0 -18
  63. package/dist/agents/conversation-skills.js +0 -229
  64. package/dist/agents/cursor.d.ts +0 -35
  65. package/dist/agents/cursor.js +0 -294
  66. package/dist/agents/default-config.d.ts +0 -30
  67. package/dist/agents/default-config.js +0 -67
  68. package/dist/agents/defaults-merge.d.ts +0 -87
  69. package/dist/agents/defaults-merge.js +0 -150
  70. package/dist/agents/detect.d.ts +0 -4
  71. package/dist/agents/detect.js +0 -67
  72. package/dist/agents/detection.d.ts +0 -18
  73. package/dist/agents/detection.js +0 -94
  74. package/dist/agents/gemini.d.ts +0 -15
  75. package/dist/agents/gemini.js +0 -122
  76. package/dist/agents/generic-adapter.d.ts +0 -25
  77. package/dist/agents/generic-adapter.js +0 -151
  78. package/dist/agents/intro-skill.d.ts +0 -45
  79. package/dist/agents/intro-skill.js +0 -447
  80. package/dist/agents/registry-data.d.ts +0 -192
  81. package/dist/agents/registry-data.js +0 -669
  82. package/dist/agents/registry.d.ts +0 -13
  83. package/dist/agents/registry.js +0 -36
  84. package/dist/agents/runtime-detection.d.ts +0 -82
  85. package/dist/agents/runtime-detection.js +0 -271
  86. package/dist/agents/session-start-hook.d.ts +0 -37
  87. package/dist/agents/session-start-hook.js +0 -159
  88. package/dist/agents/types.d.ts +0 -171
  89. package/dist/agents/types.js +0 -75
  90. package/dist/agents/utils/instruction-hint.d.ts +0 -21
  91. package/dist/agents/utils/instruction-hint.js +0 -108
  92. package/dist/agents/utils/json-config.d.ts +0 -19
  93. package/dist/agents/utils/json-config.js +0 -69
  94. package/dist/agents/utils/toml-config.d.ts +0 -8
  95. package/dist/agents/utils/toml-config.js +0 -27
  96. package/dist/agents/windsurf.d.ts +0 -14
  97. package/dist/agents/windsurf.js +0 -102
  98. package/dist/api/__tests__/client.test.d.ts +0 -1
  99. package/dist/api/__tests__/client.test.js +0 -272
  100. package/dist/api/client.d.ts +0 -326
  101. package/dist/api/client.js +0 -427
  102. package/dist/auth/__tests__/login-flow.test.d.ts +0 -1
  103. package/dist/auth/__tests__/login-flow.test.js +0 -101
  104. package/dist/auth/__tests__/store.test.d.ts +0 -1
  105. package/dist/auth/__tests__/store.test.js +0 -132
  106. package/dist/auth/login-flow.d.ts +0 -26
  107. package/dist/auth/login-flow.js +0 -137
  108. package/dist/auth/store.d.ts +0 -5
  109. package/dist/auth/store.js +0 -62
  110. package/dist/commands/__tests__/clone-args.test.d.ts +0 -1
  111. package/dist/commands/__tests__/clone-args.test.js +0 -51
  112. package/dist/commands/__tests__/clone-source-result.test.d.ts +0 -1
  113. package/dist/commands/__tests__/clone-source-result.test.js +0 -45
  114. package/dist/commands/__tests__/info-merge.test.d.ts +0 -1
  115. package/dist/commands/__tests__/info-merge.test.js +0 -55
  116. package/dist/commands/__tests__/mcp-entries.test.d.ts +0 -1
  117. package/dist/commands/__tests__/mcp-entries.test.js +0 -48
  118. package/dist/commands/__tests__/setup-persona.test.d.ts +0 -1
  119. package/dist/commands/__tests__/setup-persona.test.js +0 -31
  120. package/dist/commands/__tests__/setup.test.d.ts +0 -1
  121. package/dist/commands/__tests__/setup.test.js +0 -81
  122. package/dist/commands/__tests__/sync-redetect.test.d.ts +0 -1
  123. package/dist/commands/__tests__/sync-redetect.test.js +0 -96
  124. package/dist/commands/__tests__/sync-telemetry.test.d.ts +0 -1
  125. package/dist/commands/__tests__/sync-telemetry.test.js +0 -281
  126. package/dist/commands/__tests__/upgrade.test.d.ts +0 -1
  127. package/dist/commands/__tests__/upgrade.test.js +0 -157
  128. package/dist/commands/agents.d.ts +0 -2
  129. package/dist/commands/agents.js +0 -160
  130. package/dist/commands/api-keys.d.ts +0 -2
  131. package/dist/commands/api-keys.js +0 -95
  132. package/dist/commands/apps.d.ts +0 -2
  133. package/dist/commands/apps.js +0 -82
  134. package/dist/commands/build-plugin.d.ts +0 -2
  135. package/dist/commands/build-plugin.js +0 -135
  136. package/dist/commands/clone.d.ts +0 -60
  137. package/dist/commands/clone.js +0 -271
  138. package/dist/commands/components.d.ts +0 -2
  139. package/dist/commands/components.js +0 -43
  140. package/dist/commands/deploy.d.ts +0 -2
  141. package/dist/commands/deploy.js +0 -279
  142. package/dist/commands/dev.d.ts +0 -11
  143. package/dist/commands/dev.js +0 -1011
  144. package/dist/commands/doctor.d.ts +0 -2
  145. package/dist/commands/doctor.js +0 -230
  146. package/dist/commands/endpoints.d.ts +0 -2
  147. package/dist/commands/endpoints.js +0 -189
  148. package/dist/commands/entities.d.ts +0 -2
  149. package/dist/commands/entities.js +0 -198
  150. package/dist/commands/files.d.ts +0 -2
  151. package/dist/commands/files.js +0 -193
  152. package/dist/commands/inbox.d.ts +0 -11
  153. package/dist/commands/inbox.js +0 -60
  154. package/dist/commands/info.d.ts +0 -178
  155. package/dist/commands/info.js +0 -455
  156. package/dist/commands/init.d.ts +0 -21
  157. package/dist/commands/init.js +0 -185
  158. package/dist/commands/integrations.d.ts +0 -2
  159. package/dist/commands/integrations.js +0 -233
  160. package/dist/commands/login.d.ts +0 -2
  161. package/dist/commands/login.js +0 -44
  162. package/dist/commands/logout.d.ts +0 -2
  163. package/dist/commands/logout.js +0 -13
  164. package/dist/commands/logs.d.ts +0 -2
  165. package/dist/commands/logs.js +0 -232
  166. package/dist/commands/mcp-entries.d.ts +0 -13
  167. package/dist/commands/mcp-entries.js +0 -26
  168. package/dist/commands/mcp.d.ts +0 -2
  169. package/dist/commands/mcp.js +0 -245
  170. package/dist/commands/open.d.ts +0 -2
  171. package/dist/commands/open.js +0 -53
  172. package/dist/commands/resume.d.ts +0 -2
  173. package/dist/commands/resume.js +0 -289
  174. package/dist/commands/save-convo.d.ts +0 -8
  175. package/dist/commands/save-convo.js +0 -20
  176. package/dist/commands/schedules.d.ts +0 -2
  177. package/dist/commands/schedules.js +0 -221
  178. package/dist/commands/setup.d.ts +0 -27
  179. package/dist/commands/setup.js +0 -177
  180. package/dist/commands/share-convo.d.ts +0 -24
  181. package/dist/commands/share-convo.js +0 -167
  182. package/dist/commands/skills.d.ts +0 -2
  183. package/dist/commands/skills.js +0 -352
  184. package/dist/commands/sync-telemetry.d.ts +0 -33
  185. package/dist/commands/sync-telemetry.js +0 -186
  186. package/dist/commands/sync.d.ts +0 -37
  187. package/dist/commands/sync.js +0 -702
  188. package/dist/commands/uninstall.d.ts +0 -2
  189. package/dist/commands/uninstall.js +0 -145
  190. package/dist/commands/upgrade.d.ts +0 -14
  191. package/dist/commands/upgrade.js +0 -217
  192. package/dist/commands/validate.d.ts +0 -2
  193. package/dist/commands/validate.js +0 -89
  194. package/dist/commands/welcome.d.ts +0 -1
  195. package/dist/commands/welcome.js +0 -86
  196. package/dist/commands/workflows.d.ts +0 -2
  197. package/dist/commands/workflows.js +0 -187
  198. package/dist/deploy/__tests__/deploy-state.test.d.ts +0 -1
  199. package/dist/deploy/__tests__/deploy-state.test.js +0 -80
  200. package/dist/deploy/__tests__/deploy-status.test.d.ts +0 -1
  201. package/dist/deploy/__tests__/deploy-status.test.js +0 -41
  202. package/dist/deploy/__tests__/detach-args.test.d.ts +0 -1
  203. package/dist/deploy/__tests__/detach-args.test.js +0 -30
  204. package/dist/deploy/deploy-state.d.ts +0 -36
  205. package/dist/deploy/deploy-state.js +0 -63
  206. package/dist/deploy/deploy-status.d.ts +0 -21
  207. package/dist/deploy/deploy-status.js +0 -36
  208. package/dist/deploy/detach.d.ts +0 -32
  209. package/dist/deploy/detach.js +0 -71
  210. package/dist/dev/__tests__/attach.test.d.ts +0 -1
  211. package/dist/dev/__tests__/attach.test.js +0 -296
  212. package/dist/dev/__tests__/detach.test.d.ts +0 -1
  213. package/dist/dev/__tests__/detach.test.js +0 -404
  214. package/dist/dev/__tests__/preview-url-poller.test.d.ts +0 -1
  215. package/dist/dev/__tests__/preview-url-poller.test.js +0 -149
  216. package/dist/dev/__tests__/session.test.d.ts +0 -1
  217. package/dist/dev/__tests__/session.test.js +0 -446
  218. package/dist/dev/__tests__/startup-sync.test.d.ts +0 -1
  219. package/dist/dev/__tests__/startup-sync.test.js +0 -32
  220. package/dist/dev/__tests__/stop.test.d.ts +0 -1
  221. package/dist/dev/__tests__/stop.test.js +0 -172
  222. package/dist/dev/attach.d.ts +0 -120
  223. package/dist/dev/attach.js +0 -269
  224. package/dist/dev/detach.d.ts +0 -187
  225. package/dist/dev/detach.js +0 -292
  226. package/dist/dev/preview-url-poller.d.ts +0 -35
  227. package/dist/dev/preview-url-poller.js +0 -50
  228. package/dist/dev/session.d.ts +0 -175
  229. package/dist/dev/session.js +0 -258
  230. package/dist/dev/startup-sync.d.ts +0 -23
  231. package/dist/dev/startup-sync.js +0 -14
  232. package/dist/dev/stop.d.ts +0 -52
  233. package/dist/dev/stop.js +0 -101
  234. package/dist/devtools/registry-data.d.ts +0 -46
  235. package/dist/devtools/registry-data.js +0 -40
  236. package/dist/generated/bundled-types.d.ts +0 -1
  237. package/dist/generated/bundled-types.js +0 -46
  238. package/dist/generated/version.d.ts +0 -1
  239. package/dist/generated/version.js +0 -2
  240. package/dist/git/__tests__/auto-commit.test.d.ts +0 -1
  241. package/dist/git/__tests__/auto-commit.test.js +0 -431
  242. package/dist/git/__tests__/classify-sync-error.test.d.ts +0 -1
  243. package/dist/git/__tests__/classify-sync-error.test.js +0 -57
  244. package/dist/git/__tests__/credential-helper-e2e.test.d.ts +0 -21
  245. package/dist/git/__tests__/credential-helper-e2e.test.js +0 -195
  246. package/dist/git/__tests__/credentials.test.d.ts +0 -1
  247. package/dist/git/__tests__/credentials.test.js +0 -141
  248. package/dist/git/__tests__/deploy-guard.test.d.ts +0 -1
  249. package/dist/git/__tests__/deploy-guard.test.js +0 -61
  250. package/dist/git/__tests__/ensure-git-credential-helper.test.d.ts +0 -1
  251. package/dist/git/__tests__/ensure-git-credential-helper.test.js +0 -133
  252. package/dist/git/__tests__/ensure-runwork-remote.test.d.ts +0 -1
  253. package/dist/git/__tests__/ensure-runwork-remote.test.js +0 -109
  254. package/dist/git/__tests__/identity.test.d.ts +0 -1
  255. package/dist/git/__tests__/identity.test.js +0 -146
  256. package/dist/git/__tests__/manifest.test.d.ts +0 -1
  257. package/dist/git/__tests__/manifest.test.js +0 -446
  258. package/dist/git/__tests__/preflight-resolution.test.d.ts +0 -1
  259. package/dist/git/__tests__/preflight-resolution.test.js +0 -366
  260. package/dist/git/__tests__/preflight.test.d.ts +0 -1
  261. package/dist/git/__tests__/preflight.test.js +0 -36
  262. package/dist/git/__tests__/repo-config.test.d.ts +0 -1
  263. package/dist/git/__tests__/repo-config.test.js +0 -26
  264. package/dist/git/__tests__/sync.test.d.ts +0 -1
  265. package/dist/git/__tests__/sync.test.js +0 -405
  266. package/dist/git/auto-commit.d.ts +0 -35
  267. package/dist/git/auto-commit.js +0 -293
  268. package/dist/git/classify-sync-error.d.ts +0 -21
  269. package/dist/git/classify-sync-error.js +0 -111
  270. package/dist/git/credentials.d.ts +0 -75
  271. package/dist/git/credentials.js +0 -164
  272. package/dist/git/critical-files.d.ts +0 -20
  273. package/dist/git/critical-files.js +0 -68
  274. package/dist/git/deploy-guard.d.ts +0 -53
  275. package/dist/git/deploy-guard.js +0 -78
  276. package/dist/git/identity.d.ts +0 -44
  277. package/dist/git/identity.js +0 -133
  278. package/dist/git/preflight.d.ts +0 -57
  279. package/dist/git/preflight.js +0 -276
  280. package/dist/git/remote.d.ts +0 -37
  281. package/dist/git/remote.js +0 -75
  282. package/dist/git/repo-config.d.ts +0 -8
  283. package/dist/git/repo-config.js +0 -29
  284. package/dist/git/sync.d.ts +0 -15
  285. package/dist/git/sync.js +0 -159
  286. package/dist/health/__tests__/checks.test.d.ts +0 -1
  287. package/dist/health/__tests__/checks.test.js +0 -357
  288. package/dist/health/__tests__/cli-distribution-checks.test.d.ts +0 -1
  289. package/dist/health/__tests__/cli-distribution-checks.test.js +0 -196
  290. package/dist/health/__tests__/fix.test.d.ts +0 -1
  291. package/dist/health/__tests__/fix.test.js +0 -72
  292. package/dist/health/__tests__/runner-filter.test.d.ts +0 -1
  293. package/dist/health/__tests__/runner-filter.test.js +0 -61
  294. package/dist/health/checks.d.ts +0 -42
  295. package/dist/health/checks.js +0 -636
  296. package/dist/health/fix.d.ts +0 -22
  297. package/dist/health/fix.js +0 -62
  298. package/dist/health/runner.d.ts +0 -8
  299. package/dist/health/runner.js +0 -47
  300. package/dist/health/types.d.ts +0 -12
  301. package/dist/health/types.js +0 -1
  302. package/dist/index.d.ts +0 -1
  303. package/dist/logs/__tests__/tailer-format.test.d.ts +0 -1
  304. package/dist/logs/__tests__/tailer-format.test.js +0 -43
  305. package/dist/logs/tailer.d.ts +0 -17
  306. package/dist/logs/tailer.js +0 -217
  307. package/dist/sync/__tests__/change-detect.test.d.ts +0 -1
  308. package/dist/sync/__tests__/change-detect.test.js +0 -123
  309. package/dist/sync/__tests__/hash.test.d.ts +0 -1
  310. package/dist/sync/__tests__/hash.test.js +0 -18
  311. package/dist/sync/change-detect.d.ts +0 -19
  312. package/dist/sync/change-detect.js +0 -136
  313. package/dist/sync/conflict-ui.d.ts +0 -5
  314. package/dist/sync/conflict-ui.js +0 -78
  315. package/dist/sync/executor.d.ts +0 -23
  316. package/dist/sync/executor.js +0 -102
  317. package/dist/sync/hash.d.ts +0 -1
  318. package/dist/sync/hash.js +0 -4
  319. package/dist/sync/types.d.ts +0 -24
  320. package/dist/sync/types.js +0 -1
  321. package/dist/template/manifest.d.ts +0 -17
  322. package/dist/template/manifest.js +0 -145
  323. package/dist/tools/types.d.ts +0 -52
  324. package/dist/tools/types.js +0 -8
  325. package/dist/types-manager.d.ts +0 -1
  326. package/dist/types-manager.js +0 -35
  327. package/dist/types.d.ts +0 -349
  328. package/dist/types.js +0 -1
  329. package/dist/ui/__tests__/banner.test.d.ts +0 -1
  330. package/dist/ui/__tests__/banner.test.js +0 -98
  331. package/dist/ui/__tests__/colors.test.d.ts +0 -1
  332. package/dist/ui/__tests__/colors.test.js +0 -22
  333. package/dist/ui/__tests__/keyboard.test.d.ts +0 -1
  334. package/dist/ui/__tests__/keyboard.test.js +0 -34
  335. package/dist/ui/__tests__/status-line.test.d.ts +0 -1
  336. package/dist/ui/__tests__/status-line.test.js +0 -54
  337. package/dist/ui/banner.d.ts +0 -29
  338. package/dist/ui/banner.js +0 -153
  339. package/dist/ui/colors.d.ts +0 -4
  340. package/dist/ui/colors.js +0 -7
  341. package/dist/ui/keyboard.d.ts +0 -12
  342. package/dist/ui/keyboard.js +0 -61
  343. package/dist/ui/status-line.d.ts +0 -6
  344. package/dist/ui/status-line.js +0 -53
  345. package/dist/utils/__tests__/format-error.test.d.ts +0 -1
  346. package/dist/utils/__tests__/format-error.test.js +0 -43
  347. package/dist/utils/__tests__/help-json.test.d.ts +0 -1
  348. package/dist/utils/__tests__/help-json.test.js +0 -39
  349. package/dist/utils/__tests__/http.test.d.ts +0 -1
  350. package/dist/utils/__tests__/http.test.js +0 -381
  351. package/dist/utils/__tests__/ignore-matcher.test.d.ts +0 -1
  352. package/dist/utils/__tests__/ignore-matcher.test.js +0 -205
  353. package/dist/utils/__tests__/output.test.d.ts +0 -1
  354. package/dist/utils/__tests__/output.test.js +0 -38
  355. package/dist/utils/__tests__/prompt.test.d.ts +0 -1
  356. package/dist/utils/__tests__/prompt.test.js +0 -27
  357. package/dist/utils/__tests__/resolve.test.d.ts +0 -1
  358. package/dist/utils/__tests__/resolve.test.js +0 -95
  359. package/dist/utils/__tests__/sqlite.test.d.ts +0 -1
  360. package/dist/utils/__tests__/sqlite.test.js +0 -89
  361. package/dist/utils/agent-guidance.d.ts +0 -47
  362. package/dist/utils/agent-guidance.js +0 -128
  363. package/dist/utils/app-info.d.ts +0 -70
  364. package/dist/utils/app-info.js +0 -167
  365. package/dist/utils/curl-parser.d.ts +0 -12
  366. package/dist/utils/curl-parser.js +0 -162
  367. package/dist/utils/data-input.d.ts +0 -1
  368. package/dist/utils/data-input.js +0 -38
  369. package/dist/utils/format-error.d.ts +0 -10
  370. package/dist/utils/format-error.js +0 -38
  371. package/dist/utils/fs.d.ts +0 -5
  372. package/dist/utils/fs.js +0 -23
  373. package/dist/utils/help-json.d.ts +0 -70
  374. package/dist/utils/help-json.js +0 -88
  375. package/dist/utils/http.d.ts +0 -46
  376. package/dist/utils/http.js +0 -421
  377. package/dist/utils/ignore-matcher.d.ts +0 -47
  378. package/dist/utils/ignore-matcher.js +0 -132
  379. package/dist/utils/output.d.ts +0 -17
  380. package/dist/utils/output.js +0 -27
  381. package/dist/utils/prompt.d.ts +0 -5
  382. package/dist/utils/prompt.js +0 -42
  383. package/dist/utils/resolve.d.ts +0 -12
  384. package/dist/utils/resolve.js +0 -52
  385. package/dist/utils/setup-state.d.ts +0 -3
  386. package/dist/utils/setup-state.js +0 -19
  387. package/dist/utils/sqlite-adapter.d.ts +0 -48
  388. package/dist/utils/sqlite-adapter.js +0 -147
  389. package/dist/utils/sqlite.d.ts +0 -14
  390. package/dist/utils/sqlite.js +0 -14
  391. package/dist/utils/subprocess.d.ts +0 -19
  392. package/dist/utils/subprocess.js +0 -27
  393. package/dist/utils/which.d.ts +0 -14
  394. package/dist/utils/which.js +0 -47
  395. package/dist/utils/zip.d.ts +0 -7
  396. package/dist/utils/zip.js +0 -42
  397. package/dist/validate/__tests__/validate.test.d.ts +0 -1
  398. package/dist/validate/__tests__/validate.test.js +0 -42
  399. package/dist/validate/freshness.d.ts +0 -28
  400. package/dist/validate/freshness.js +0 -48
  401. package/dist/validate/preview.d.ts +0 -21
  402. package/dist/validate/preview.js +0 -39
  403. package/dist/workspace/resolve.d.ts +0 -19
  404. package/dist/workspace/resolve.js +0 -100
@@ -1,42 +0,0 @@
1
- import { select, text, confirm, isCancel } from '@clack/prompts';
2
- export async function promptSelect(message, choices) {
3
- if (choices.length === 0) {
4
- throw new Error('No choices available');
5
- }
6
- if (choices.length === 1) {
7
- console.log(`${message}: ${choices[0].label}`);
8
- return choices[0];
9
- }
10
- const result = await select({
11
- message,
12
- options: choices.map((c, i) => ({
13
- value: i,
14
- label: c.label,
15
- })),
16
- });
17
- if (isCancel(result)) {
18
- console.log('Cancelled.');
19
- process.exit(0);
20
- }
21
- return choices[result];
22
- }
23
- export async function promptInput(message, defaultValue) {
24
- const result = await text({
25
- message,
26
- defaultValue,
27
- placeholder: defaultValue,
28
- });
29
- if (isCancel(result)) {
30
- console.log('Cancelled.');
31
- process.exit(0);
32
- }
33
- return result.trim() || defaultValue || '';
34
- }
35
- export async function promptConfirm(message) {
36
- const result = await confirm({ message });
37
- if (isCancel(result)) {
38
- console.log('Cancelled.');
39
- process.exit(0);
40
- }
41
- return result;
42
- }
@@ -1,12 +0,0 @@
1
- import type { ApiClient } from '../api/client.js';
2
- import type { AppInfo, WorkspaceInfo } from '../types.js';
3
- /**
4
- * Resolve a workspace by name or ID from the user's accessible workspaces.
5
- * Tries exact ID match first, then case-insensitive name match.
6
- */
7
- export declare function resolveWorkspace(client: ApiClient, nameOrId: string): Promise<WorkspaceInfo>;
8
- /**
9
- * Resolve an app by name or ID from the user's accessible apps.
10
- * Tries exact ID match first, then case-insensitive name match.
11
- */
12
- export declare function resolveApp(client: ApiClient, nameOrId: string): Promise<AppInfo>;
@@ -1,52 +0,0 @@
1
- /**
2
- * Resolve a workspace by name or ID from the user's accessible workspaces.
3
- * Tries exact ID match first, then case-insensitive name match.
4
- */
5
- export async function resolveWorkspace(client, nameOrId) {
6
- const workspaces = await client.listWorkspaces();
7
- if (workspaces.length === 0) {
8
- console.error('No workspaces found. Create one at runwork.ai first.');
9
- process.exit(1);
10
- }
11
- // Exact ID match
12
- const byId = workspaces.find(w => w.id === nameOrId);
13
- if (byId)
14
- return byId;
15
- // Case-insensitive name match
16
- const lower = nameOrId.toLowerCase();
17
- const byName = workspaces.filter(w => w.name.toLowerCase() === lower);
18
- if (byName.length === 1)
19
- return byName[0];
20
- if (byName.length > 1) {
21
- console.error(`Ambiguous workspace name "${nameOrId}". Matches: ${byName.map(w => `${w.name} (${w.id})`).join(', ')}`);
22
- process.exit(1);
23
- }
24
- console.error(`Workspace "${nameOrId}" not found. Available: ${workspaces.map(w => w.name).join(', ')}`);
25
- process.exit(1);
26
- }
27
- /**
28
- * Resolve an app by name or ID from the user's accessible apps.
29
- * Tries exact ID match first, then case-insensitive name match.
30
- */
31
- export async function resolveApp(client, nameOrId) {
32
- const apps = await client.listApps();
33
- if (apps.length === 0) {
34
- console.error('No apps found.');
35
- process.exit(1);
36
- }
37
- // Exact ID match
38
- const byId = apps.find(a => a.id === nameOrId);
39
- if (byId)
40
- return byId;
41
- // Case-insensitive name match
42
- const lower = nameOrId.toLowerCase();
43
- const byName = apps.filter(a => a.name.toLowerCase() === lower);
44
- if (byName.length === 1)
45
- return byName[0];
46
- if (byName.length > 1) {
47
- console.error(`Ambiguous app name "${nameOrId}". Matches: ${byName.map(a => `${a.name} (${a.id})`).join(', ')}`);
48
- process.exit(1);
49
- }
50
- console.error(`App "${nameOrId}" not found. Available: ${apps.map(a => a.name).join(', ')}`);
51
- process.exit(1);
52
- }
@@ -1,3 +0,0 @@
1
- import type { SetupState } from '../types.js';
2
- /** Load setup state, checking project-level then user-level. */
3
- export declare function loadSetupState(): SetupState | null;
@@ -1,19 +0,0 @@
1
- import { existsSync, readFileSync } from 'fs';
2
- import { join } from 'path';
3
- import { homedir } from 'os';
4
- /** Load setup state, checking project-level then user-level. */
5
- export function loadSetupState() {
6
- const projectPath = join(process.cwd(), '.runwork', 'setup.json');
7
- const userPath = join(homedir(), '.runwork', 'setup.json');
8
- for (const p of [projectPath, userPath]) {
9
- if (existsSync(p)) {
10
- try {
11
- return JSON.parse(readFileSync(p, 'utf-8'));
12
- }
13
- catch {
14
- continue;
15
- }
16
- }
17
- }
18
- return null;
19
- }
@@ -1,48 +0,0 @@
1
- /**
2
- * Runtime SQLite adapter.
3
- *
4
- * Selects a SQLite backend at module load time:
5
- * 1. `bun:sqlite` when running under Bun (the compiled standalone CLI binary)
6
- * 2. `node:sqlite` when running on Node >= 22.5 (the `npx runwork@latest` path)
7
- * 3. null, in which case SQLite-backed telemetry features degrade gracefully
8
- * instead of breaking install
9
- *
10
- * This replaces the previous hard dependency on `better-sqlite3`, which
11
- * required a native npm build and failed in restricted sandboxes, locked-down
12
- * corporate environments, and low-privilege containers.
13
- */
14
- type SqliteFlavor = 'bun' | 'node';
15
- interface StatementHandle {
16
- get(...params: unknown[]): unknown;
17
- all(...params: unknown[]): unknown[];
18
- run(...params: unknown[]): unknown;
19
- }
20
- /**
21
- * Returns true when a SQLite runtime is available.
22
- * Use this to gate telemetry / agent-stats features that can degrade gracefully.
23
- */
24
- export declare function sqliteAvailable(): boolean;
25
- /**
26
- * Returns the name of the SQLite backend in use, or null if none is available.
27
- * Intended for doctor / diagnostic output.
28
- */
29
- export declare function sqliteFlavor(): SqliteFlavor | null;
30
- export declare function queryReadonlySqlite(dbPath: string, sql: string): string;
31
- /**
32
- * Handle returned by `openWritableSqlite` for write operations.
33
- * Callers are responsible for calling `close()` when done.
34
- */
35
- export interface WritableSqlite {
36
- prepare(sql: string): StatementHandle;
37
- close(): void;
38
- readonly flavor: SqliteFlavor;
39
- }
40
- /**
41
- * Open a writable SQLite database. Returns null when no SQLite runtime is
42
- * available, letting the caller degrade gracefully instead of crashing.
43
- *
44
- * On failure to open the database (missing file, permission denied, locked),
45
- * this also returns null.
46
- */
47
- export declare function openWritableSqlite(dbPath: string): WritableSqlite | null;
48
- export {};
@@ -1,147 +0,0 @@
1
- /**
2
- * Runtime SQLite adapter.
3
- *
4
- * Selects a SQLite backend at module load time:
5
- * 1. `bun:sqlite` when running under Bun (the compiled standalone CLI binary)
6
- * 2. `node:sqlite` when running on Node >= 22.5 (the `npx runwork@latest` path)
7
- * 3. null, in which case SQLite-backed telemetry features degrade gracefully
8
- * instead of breaking install
9
- *
10
- * This replaces the previous hard dependency on `better-sqlite3`, which
11
- * required a native npm build and failed in restricted sandboxes, locked-down
12
- * corporate environments, and low-privilege containers.
13
- */
14
- let adapter = null;
15
- async function loadAdapter() {
16
- // Try bun:sqlite first. Bun defines a global `Bun` object we can sniff for.
17
- const bunGlobal = globalThis.Bun;
18
- if (typeof bunGlobal !== 'undefined') {
19
- try {
20
- const specifier = 'bun:sqlite';
21
- const mod = (await import(/* @vite-ignore */ specifier));
22
- if (mod?.Database) {
23
- return {
24
- flavor: 'bun',
25
- Database: mod.Database,
26
- readOnlyOptionKey: 'readonly',
27
- readOnlyOptionValue: true,
28
- };
29
- }
30
- }
31
- catch {
32
- // bun:sqlite unavailable despite Bun global; fall through to Node path
33
- }
34
- }
35
- // Try node:sqlite. Available in Node >= 22.5 stable.
36
- try {
37
- const specifier = 'node:sqlite';
38
- const mod = (await import(/* @vite-ignore */ specifier));
39
- if (mod?.DatabaseSync) {
40
- return {
41
- flavor: 'node',
42
- Database: mod.DatabaseSync,
43
- readOnlyOptionKey: 'readOnly',
44
- readOnlyOptionValue: true,
45
- };
46
- }
47
- }
48
- catch {
49
- // node:sqlite unavailable (older Node, or flag off)
50
- }
51
- return null;
52
- }
53
- // Top-level await: module load blocks until an adapter is chosen.
54
- // The CLI is an ESM package running on Bun or modern Node, both of which
55
- // support top-level await.
56
- adapter = await loadAdapter();
57
- /**
58
- * Returns true when a SQLite runtime is available.
59
- * Use this to gate telemetry / agent-stats features that can degrade gracefully.
60
- */
61
- export function sqliteAvailable() {
62
- return adapter !== null;
63
- }
64
- /**
65
- * Returns the name of the SQLite backend in use, or null if none is available.
66
- * Intended for doctor / diagnostic output.
67
- */
68
- export function sqliteFlavor() {
69
- return adapter?.flavor ?? null;
70
- }
71
- /**
72
- * Execute a read-only SQL query against a SQLite database and return the rows
73
- * serialised as `value1|value2|value3` per row, newline separated. Matches the
74
- * legacy `querySqlite` contract so existing parsers do not have to change.
75
- *
76
- * Returns an empty string on any failure (missing database, locked, corrupt,
77
- * unavailable runtime). Callers must tolerate the empty-string path.
78
- */
79
- const BUSY_TIMEOUT_MS = 5000;
80
- function setBusyTimeout(db) {
81
- // bun:sqlite has no `timeout` constructor option and node:sqlite had a
82
- // moving target across versions, so set busy_timeout via a PRAGMA that
83
- // works on every SQLite build. PRAGMA busy_timeout is a per-connection
84
- // runtime setting and does not require write permissions.
85
- try {
86
- db.prepare(`PRAGMA busy_timeout = ${BUSY_TIMEOUT_MS}`).run();
87
- }
88
- catch {
89
- /* some flavors refuse PRAGMA on readonly; best-effort */
90
- }
91
- }
92
- export function queryReadonlySqlite(dbPath, sql) {
93
- if (!adapter)
94
- return '';
95
- let db = null;
96
- try {
97
- const options = {
98
- [adapter.readOnlyOptionKey]: adapter.readOnlyOptionValue,
99
- };
100
- db = new adapter.Database(dbPath, options);
101
- setBusyTimeout(db);
102
- const rows = db.prepare(sql).all();
103
- return rows.map((row) => Object.values(row).join('|')).join('\n');
104
- }
105
- catch {
106
- return '';
107
- }
108
- finally {
109
- try {
110
- db?.close();
111
- }
112
- catch {
113
- /* ignore close errors */
114
- }
115
- }
116
- }
117
- /**
118
- * Open a writable SQLite database. Returns null when no SQLite runtime is
119
- * available, letting the caller degrade gracefully instead of crashing.
120
- *
121
- * On failure to open the database (missing file, permission denied, locked),
122
- * this also returns null.
123
- */
124
- export function openWritableSqlite(dbPath) {
125
- if (!adapter)
126
- return null;
127
- try {
128
- const db = new adapter.Database(dbPath);
129
- setBusyTimeout(db);
130
- const flavor = adapter.flavor;
131
- return {
132
- prepare: (sql) => db.prepare(sql),
133
- close: () => {
134
- try {
135
- db.close();
136
- }
137
- catch {
138
- /* ignore close errors */
139
- }
140
- },
141
- flavor,
142
- };
143
- }
144
- catch {
145
- return null;
146
- }
147
- }
@@ -1,14 +0,0 @@
1
- /**
2
- * Read-only SQLite query helper used by agent stats readers.
3
- *
4
- * This file used to hard-depend on `better-sqlite3`, which required a native
5
- * npm build and failed in low-privilege containers and corporate sandboxes.
6
- * It now re-exports the runtime-aware adapter which picks `bun:sqlite` in the
7
- * compiled standalone binary, `node:sqlite` when running under `npx`, and a
8
- * structured "unavailable" path otherwise (returns empty string).
9
- *
10
- * The `querySqlite` name is preserved so existing call sites and mocks in
11
- * tests keep working.
12
- */
13
- export { queryReadonlySqlite as querySqlite } from './sqlite-adapter.js';
14
- export { openWritableSqlite, sqliteAvailable, sqliteFlavor, type WritableSqlite } from './sqlite-adapter.js';
@@ -1,14 +0,0 @@
1
- /**
2
- * Read-only SQLite query helper used by agent stats readers.
3
- *
4
- * This file used to hard-depend on `better-sqlite3`, which required a native
5
- * npm build and failed in low-privilege containers and corporate sandboxes.
6
- * It now re-exports the runtime-aware adapter which picks `bun:sqlite` in the
7
- * compiled standalone binary, `node:sqlite` when running under `npx`, and a
8
- * structured "unavailable" path otherwise (returns empty string).
9
- *
10
- * The `querySqlite` name is preserved so existing call sites and mocks in
11
- * tests keep working.
12
- */
13
- export { queryReadonlySqlite as querySqlite } from './sqlite-adapter.js';
14
- export { openWritableSqlite, sqliteAvailable, sqliteFlavor } from './sqlite-adapter.js';
@@ -1,19 +0,0 @@
1
- /**
2
- * Thin wrappers around `child_process.execFileSync` and `spawn` that
3
- * default `windowsHide: true`. On Windows, every console-subsystem
4
- * subprocess we spawn (git, where.exe, registry queries) creates its
5
- * own console window unless this flag is set. With our hot paths --
6
- * auto-commit's git invocations, manifest's `git ls-files`, the sync
7
- * loop's git rebase / fetch / push -- a missing flag visibly flashes a
8
- * console window every few seconds, which Codex Desktop users see as
9
- * "empty terminals keep popping up."
10
- *
11
- * Use these as drop-in replacements for the `child_process` exports.
12
- * Existing options the caller passes still win (so you can opt back to
13
- * `windowsHide: false` if you genuinely need the window, e.g. for
14
- * interactive prompts -- though we don't have any of those in our
15
- * subprocess paths today).
16
- */
17
- import { execFileSync as cpExecFileSync, spawn as cpSpawn } from 'child_process';
18
- export declare const execFileSync: typeof cpExecFileSync;
19
- export declare const spawn: typeof cpSpawn;
@@ -1,27 +0,0 @@
1
- /**
2
- * Thin wrappers around `child_process.execFileSync` and `spawn` that
3
- * default `windowsHide: true`. On Windows, every console-subsystem
4
- * subprocess we spawn (git, where.exe, registry queries) creates its
5
- * own console window unless this flag is set. With our hot paths --
6
- * auto-commit's git invocations, manifest's `git ls-files`, the sync
7
- * loop's git rebase / fetch / push -- a missing flag visibly flashes a
8
- * console window every few seconds, which Codex Desktop users see as
9
- * "empty terminals keep popping up."
10
- *
11
- * Use these as drop-in replacements for the `child_process` exports.
12
- * Existing options the caller passes still win (so you can opt back to
13
- * `windowsHide: false` if you genuinely need the window, e.g. for
14
- * interactive prompts -- though we don't have any of those in our
15
- * subprocess paths today).
16
- */
17
- import { execFileSync as cpExecFileSync, spawn as cpSpawn, } from 'child_process';
18
- // We re-export with the *exact* `typeof` signature of the originals so
19
- // caller-side overload narrowing (encoding -> string vs Buffer return
20
- // type) keeps working. The implementation forwards through the original
21
- // after merging in `windowsHide: true` as a default.
22
- export const execFileSync = ((file, args, options) => {
23
- return cpExecFileSync(file, args, { windowsHide: true, ...(options ?? {}) });
24
- });
25
- export const spawn = ((command, args, options) => {
26
- return cpSpawn(command, args ?? [], { windowsHide: true, ...(options ?? {}) });
27
- });
@@ -1,14 +0,0 @@
1
- /**
2
- * Cross-platform binary detection.
3
- * Uses `which` on macOS/Linux, `where.exe` on Windows.
4
- * Returns the resolved path on success, null if not found.
5
- */
6
- export declare function whichBinary(name: string): string | null;
7
- /**
8
- * Check if a desktop app is currently running by process name.
9
- * On macOS: checks for the .app bundle process via pgrep.
10
- * On Windows: uses tasklist to find the .exe.
11
- * On Linux: uses pgrep for the binary name.
12
- * Returns true if the process is found, false otherwise.
13
- */
14
- export declare function isAppRunning(appName: string): boolean;
@@ -1,47 +0,0 @@
1
- import { execFileSync } from './subprocess.js';
2
- import { platform } from 'os';
3
- /**
4
- * Cross-platform binary detection.
5
- * Uses `which` on macOS/Linux, `where.exe` on Windows.
6
- * Returns the resolved path on success, null if not found.
7
- */
8
- export function whichBinary(name) {
9
- try {
10
- const cmd = platform() === 'win32' ? 'where.exe' : 'which';
11
- const result = execFileSync(cmd, [name], { stdio: 'pipe' }).toString().trim();
12
- // `where.exe` may return multiple lines; take the first
13
- return result.split(/[\r\n]+/)[0].trim() || null;
14
- }
15
- catch {
16
- return null;
17
- }
18
- }
19
- /**
20
- * Check if a desktop app is currently running by process name.
21
- * On macOS: checks for the .app bundle process via pgrep.
22
- * On Windows: uses tasklist to find the .exe.
23
- * On Linux: uses pgrep for the binary name.
24
- * Returns true if the process is found, false otherwise.
25
- */
26
- export function isAppRunning(appName) {
27
- try {
28
- const os = platform();
29
- if (os === 'darwin') {
30
- // pgrep -f matches against the full command line, catching Electron apps
31
- execFileSync('pgrep', ['-f', `${appName}.app`], { stdio: 'pipe' });
32
- return true;
33
- }
34
- else if (os === 'win32') {
35
- const result = execFileSync('tasklist', ['/FI', `IMAGENAME eq ${appName}.exe`, '/NH'], { stdio: 'pipe' }).toString();
36
- return result.includes(`${appName}.exe`);
37
- }
38
- else {
39
- execFileSync('pgrep', ['-x', appName.toLowerCase()], { stdio: 'pipe' });
40
- return true;
41
- }
42
- }
43
- catch {
44
- // pgrep exits non-zero when no processes match
45
- return false;
46
- }
47
- }
@@ -1,7 +0,0 @@
1
- export declare function extractZip(zipData: ArrayBuffer, targetDir: string): void;
2
- /**
3
- * Walk `sourceDir` recursively and write a zip file at `outputPath`.
4
- * Entry paths inside the zip are forward-slash relative paths from
5
- * `sourceDir`, matching the cross-platform convention that zip tools use.
6
- */
7
- export declare function createZipFromDir(sourceDir: string, outputPath: string): void;
package/dist/utils/zip.js DELETED
@@ -1,42 +0,0 @@
1
- import { mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'fs';
2
- import { join, dirname, relative, sep } from 'path';
3
- import { unzipSync, zipSync } from 'fflate';
4
- export function extractZip(zipData, targetDir) {
5
- const files = unzipSync(new Uint8Array(zipData));
6
- for (const [path, data] of Object.entries(files)) {
7
- const fullPath = join(targetDir, path);
8
- // Directory entries end with /
9
- if (path.endsWith('/')) {
10
- mkdirSync(fullPath, { recursive: true });
11
- continue;
12
- }
13
- // Ensure parent directory exists
14
- mkdirSync(dirname(fullPath), { recursive: true });
15
- writeFileSync(fullPath, data);
16
- }
17
- }
18
- /**
19
- * Walk `sourceDir` recursively and write a zip file at `outputPath`.
20
- * Entry paths inside the zip are forward-slash relative paths from
21
- * `sourceDir`, matching the cross-platform convention that zip tools use.
22
- */
23
- export function createZipFromDir(sourceDir, outputPath) {
24
- const files = {};
25
- const walk = (dir) => {
26
- for (const entry of readdirSync(dir)) {
27
- const absPath = join(dir, entry);
28
- const stats = statSync(absPath);
29
- if (stats.isDirectory()) {
30
- walk(absPath);
31
- }
32
- else if (stats.isFile()) {
33
- const relPath = relative(sourceDir, absPath).split(sep).join('/');
34
- files[relPath] = readFileSync(absPath);
35
- }
36
- }
37
- };
38
- walk(sourceDir);
39
- const zipped = zipSync(files);
40
- mkdirSync(dirname(outputPath), { recursive: true });
41
- writeFileSync(outputPath, zipped);
42
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,42 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { summarizeFreshness } from '../freshness.js';
3
- import { detectViteError } from '../preview.js';
4
- describe('validate/freshness summarizeFreshness()', () => {
5
- const base = { localSha: 'a', remoteSha: 'a', ahead: 0, behind: 0, uncommitted: false };
6
- it('is in-sync when local==remote, no ahead/behind, clean tree', () => {
7
- expect(summarizeFreshness(base).inSync).toBe(true);
8
- });
9
- it('is not in-sync with uncommitted changes', () => {
10
- expect(summarizeFreshness({ ...base, uncommitted: true }).inSync).toBe(false);
11
- });
12
- it('is not in-sync when ahead of the remote', () => {
13
- expect(summarizeFreshness({ ...base, ahead: 2 }).inSync).toBe(false);
14
- });
15
- it('is not in-sync when behind the remote', () => {
16
- expect(summarizeFreshness({ ...base, behind: 1 }).inSync).toBe(false);
17
- });
18
- it('is not in-sync when there is no remote ref', () => {
19
- expect(summarizeFreshness({ ...base, remoteSha: null }).inSync).toBe(false);
20
- });
21
- it('is not in-sync when there is no local HEAD', () => {
22
- expect(summarizeFreshness({ ...base, localSha: null }).inSync).toBe(false);
23
- });
24
- it('passes through the raw counts', () => {
25
- const f = summarizeFreshness({ localSha: 'x', remoteSha: 'y', ahead: 3, behind: 1, uncommitted: true });
26
- expect(f).toMatchObject({ ahead: 3, behind: 1, uncommitted: true, inSync: false });
27
- });
28
- });
29
- describe('validate/preview detectViteError()', () => {
30
- it('detects the Vite error overlay element', () => {
31
- expect(detectViteError('<vite-error-overlay></vite-error-overlay>')).toBe(true);
32
- });
33
- it('detects a plugin transform error', () => {
34
- expect(detectViteError('[plugin:vite:react-babel] Unexpected token')).toBe(true);
35
- });
36
- it('detects a failed import resolution', () => {
37
- expect(detectViteError('Failed to resolve import "./missing" from "src/App.tsx"')).toBe(true);
38
- });
39
- it('returns false for a healthy HTML document', () => {
40
- expect(detectViteError('<!DOCTYPE html><html><body><div id="root"></div></body></html>')).toBe(false);
41
- });
42
- });
@@ -1,28 +0,0 @@
1
- /**
2
- * Git sync-freshness: how the local working tree relates to the deploy remote
3
- * (`runwork/main`). Answers "do I have changes that aren't synced/deployed?"
4
- * without scraping the sandbox (friction log #10).
5
- */
6
- export interface Freshness {
7
- localSha: string | null;
8
- remoteSha: string | null;
9
- ahead: number;
10
- behind: number;
11
- uncommitted: boolean;
12
- /** true when local == remote and the tree is clean. */
13
- inSync: boolean;
14
- }
15
- export interface FreshnessInput {
16
- localSha: string | null;
17
- remoteSha: string | null;
18
- ahead: number;
19
- behind: number;
20
- uncommitted: boolean;
21
- }
22
- /** Pure: derive the in-sync verdict from the raw git counts/flags. */
23
- export declare function summarizeFreshness(input: FreshnessInput): Freshness;
24
- /**
25
- * Collect git freshness for `cwd`. Best-effort fetches `runwork/main` first so
26
- * the comparison reflects the real remote tip; tolerates offline/no-remote.
27
- */
28
- export declare function getGitFreshness(cwd: string): Freshness;
@@ -1,48 +0,0 @@
1
- import { execFileSync } from '../utils/subprocess.js';
2
- /** Pure: derive the in-sync verdict from the raw git counts/flags. */
3
- export function summarizeFreshness(input) {
4
- const inSync = input.localSha !== null &&
5
- input.remoteSha !== null &&
6
- input.ahead === 0 &&
7
- input.behind === 0 &&
8
- !input.uncommitted;
9
- return { ...input, inSync };
10
- }
11
- function gitOut(cwd, args) {
12
- try {
13
- return execFileSync('git', args, { cwd, stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
14
- }
15
- catch {
16
- return null;
17
- }
18
- }
19
- /**
20
- * Collect git freshness for `cwd`. Best-effort fetches `runwork/main` first so
21
- * the comparison reflects the real remote tip; tolerates offline/no-remote.
22
- */
23
- export function getGitFreshness(cwd) {
24
- // Best-effort: refresh the remote-tracking ref. Failure (offline, no remote)
25
- // just means we compare against whatever ref we already have.
26
- try {
27
- execFileSync('git', ['fetch', 'runwork', 'main'], { cwd, stdio: 'pipe' });
28
- }
29
- catch {
30
- /* offline or no runwork remote -- non-fatal */
31
- }
32
- const localSha = gitOut(cwd, ['rev-parse', 'HEAD']);
33
- const remoteSha = gitOut(cwd, ['rev-parse', 'runwork/main']);
34
- let ahead = 0;
35
- let behind = 0;
36
- if (localSha && remoteSha) {
37
- // `<behind>\t<ahead>` relative to runwork/main...HEAD
38
- const counts = gitOut(cwd, ['rev-list', '--left-right', '--count', 'runwork/main...HEAD']);
39
- if (counts) {
40
- const [b, a] = counts.split(/\s+/).map(n => parseInt(n, 10));
41
- behind = Number.isFinite(b) ? b : 0;
42
- ahead = Number.isFinite(a) ? a : 0;
43
- }
44
- }
45
- const porcelain = gitOut(cwd, ['status', '--porcelain']);
46
- const uncommitted = porcelain !== null && porcelain.length > 0;
47
- return summarizeFreshness({ localSha, remoteSha, ahead, behind, uncommitted });
48
- }
@@ -1,21 +0,0 @@
1
- /**
2
- * Liveness of the preview deployment: does it respond, and is it serving a
3
- * working build (vs a Vite error overlay)? This is the cheap "is my change
4
- * live and compiling" signal the friction log (#10) reached for by hand.
5
- */
6
- export interface PreviewLiveness {
7
- url: string | null;
8
- responds: boolean;
9
- status: number | null;
10
- /** A Vite/build error overlay was detected in the served HTML. */
11
- errorDetected: boolean;
12
- error?: string;
13
- }
14
- /**
15
- * Heuristically detect a Vite dev-server error overlay / transform error in
16
- * served HTML. These are the markers Vite injects when a module fails to
17
- * compile, so their presence means the preview is serving a broken build.
18
- */
19
- export declare function detectViteError(html: string): boolean;
20
- /** Fetch the preview URL and report whether it's live and error-free. */
21
- export declare function checkPreview(url: string | null): Promise<PreviewLiveness>;