runwork 0.15.0 → 0.15.2

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 (403) hide show
  1. package/dist/index.js +19272 -116
  2. package/package.json +4 -4
  3. package/dist/__tests__/curl-parser.test.d.ts +0 -1
  4. package/dist/__tests__/curl-parser.test.js +0 -250
  5. package/dist/__tests__/install-scripts.test.d.ts +0 -1
  6. package/dist/__tests__/install-scripts.test.js +0 -280
  7. package/dist/__tests__/types-manager.test.d.ts +0 -1
  8. package/dist/__tests__/types-manager.test.js +0 -89
  9. package/dist/agents/__tests__/chatgpt-registry.test.d.ts +0 -1
  10. package/dist/agents/__tests__/chatgpt-registry.test.js +0 -61
  11. package/dist/agents/__tests__/claude-code-managed-block.test.d.ts +0 -1
  12. package/dist/agents/__tests__/claude-code-managed-block.test.js +0 -97
  13. package/dist/agents/__tests__/claude-code-plugin.test.d.ts +0 -1
  14. package/dist/agents/__tests__/claude-code-plugin.test.js +0 -47
  15. package/dist/agents/__tests__/claude-code-stats.test.d.ts +0 -1
  16. package/dist/agents/__tests__/claude-code-stats.test.js +0 -390
  17. package/dist/agents/__tests__/claude-desktop-memory.test.d.ts +0 -1
  18. package/dist/agents/__tests__/claude-desktop-memory.test.js +0 -154
  19. package/dist/agents/__tests__/claude-desktop-plugin-tree.test.d.ts +0 -1
  20. package/dist/agents/__tests__/claude-desktop-plugin-tree.test.js +0 -161
  21. package/dist/agents/__tests__/claude-desktop-plugin.test.d.ts +0 -1
  22. package/dist/agents/__tests__/claude-desktop-plugin.test.js +0 -117
  23. package/dist/agents/__tests__/claude-desktop-rpm.test.d.ts +0 -1
  24. package/dist/agents/__tests__/claude-desktop-rpm.test.js +0 -126
  25. package/dist/agents/__tests__/claude-desktop-stats.test.d.ts +0 -1
  26. package/dist/agents/__tests__/claude-desktop-stats.test.js +0 -280
  27. package/dist/agents/__tests__/codex-instructions.test.d.ts +0 -1
  28. package/dist/agents/__tests__/codex-instructions.test.js +0 -57
  29. package/dist/agents/__tests__/codex-minimum-permissions.test.d.ts +0 -1
  30. package/dist/agents/__tests__/codex-minimum-permissions.test.js +0 -82
  31. package/dist/agents/__tests__/codex-stats.test.d.ts +0 -1
  32. package/dist/agents/__tests__/codex-stats.test.js +0 -370
  33. package/dist/agents/__tests__/cursor-merge.test.d.ts +0 -1
  34. package/dist/agents/__tests__/cursor-merge.test.js +0 -66
  35. package/dist/agents/__tests__/cursor-stats.test.d.ts +0 -1
  36. package/dist/agents/__tests__/cursor-stats.test.js +0 -183
  37. package/dist/agents/__tests__/defaults-merge.test.d.ts +0 -1
  38. package/dist/agents/__tests__/defaults-merge.test.js +0 -268
  39. package/dist/agents/__tests__/detection.test.d.ts +0 -1
  40. package/dist/agents/__tests__/detection.test.js +0 -89
  41. package/dist/agents/__tests__/graceful-degradation.test.d.ts +0 -1
  42. package/dist/agents/__tests__/graceful-degradation.test.js +0 -129
  43. package/dist/agents/__tests__/instruction-hint.test.d.ts +0 -1
  44. package/dist/agents/__tests__/instruction-hint.test.js +0 -69
  45. package/dist/agents/__tests__/intro-skill.test.d.ts +0 -1
  46. package/dist/agents/__tests__/intro-skill.test.js +0 -193
  47. package/dist/agents/__tests__/schema-validation.test.d.ts +0 -1
  48. package/dist/agents/__tests__/schema-validation.test.js +0 -212
  49. package/dist/agents/__tests__/skill-slug.test.d.ts +0 -1
  50. package/dist/agents/__tests__/skill-slug.test.js +0 -77
  51. package/dist/agents/claude-code.d.ts +0 -53
  52. package/dist/agents/claude-code.js +0 -754
  53. package/dist/agents/claude-desktop-plugin-tree.d.ts +0 -59
  54. package/dist/agents/claude-desktop-plugin-tree.js +0 -143
  55. package/dist/agents/claude-desktop.d.ts +0 -47
  56. package/dist/agents/claude-desktop.js +0 -684
  57. package/dist/agents/cline.d.ts +0 -15
  58. package/dist/agents/cline.js +0 -130
  59. package/dist/agents/codex.d.ts +0 -44
  60. package/dist/agents/codex.js +0 -453
  61. package/dist/agents/conversation-skills.d.ts +0 -18
  62. package/dist/agents/conversation-skills.js +0 -229
  63. package/dist/agents/cursor.d.ts +0 -48
  64. package/dist/agents/cursor.js +0 -324
  65. package/dist/agents/default-config.d.ts +0 -30
  66. package/dist/agents/default-config.js +0 -67
  67. package/dist/agents/defaults-merge.d.ts +0 -72
  68. package/dist/agents/defaults-merge.js +0 -131
  69. package/dist/agents/detect.d.ts +0 -4
  70. package/dist/agents/detect.js +0 -67
  71. package/dist/agents/detection.d.ts +0 -18
  72. package/dist/agents/detection.js +0 -94
  73. package/dist/agents/gemini.d.ts +0 -15
  74. package/dist/agents/gemini.js +0 -122
  75. package/dist/agents/generic-adapter.d.ts +0 -25
  76. package/dist/agents/generic-adapter.js +0 -151
  77. package/dist/agents/intro-skill.d.ts +0 -45
  78. package/dist/agents/intro-skill.js +0 -447
  79. package/dist/agents/registry-data.d.ts +0 -192
  80. package/dist/agents/registry-data.js +0 -669
  81. package/dist/agents/registry.d.ts +0 -13
  82. package/dist/agents/registry.js +0 -36
  83. package/dist/agents/runtime-detection.d.ts +0 -82
  84. package/dist/agents/runtime-detection.js +0 -271
  85. package/dist/agents/session-start-hook.d.ts +0 -37
  86. package/dist/agents/session-start-hook.js +0 -159
  87. package/dist/agents/types.d.ts +0 -171
  88. package/dist/agents/types.js +0 -75
  89. package/dist/agents/utils/instruction-hint.d.ts +0 -21
  90. package/dist/agents/utils/instruction-hint.js +0 -108
  91. package/dist/agents/utils/json-config.d.ts +0 -19
  92. package/dist/agents/utils/json-config.js +0 -69
  93. package/dist/agents/utils/toml-config.d.ts +0 -8
  94. package/dist/agents/utils/toml-config.js +0 -27
  95. package/dist/agents/windsurf.d.ts +0 -14
  96. package/dist/agents/windsurf.js +0 -102
  97. package/dist/api/__tests__/client.test.d.ts +0 -1
  98. package/dist/api/__tests__/client.test.js +0 -272
  99. package/dist/api/client.d.ts +0 -326
  100. package/dist/api/client.js +0 -427
  101. package/dist/auth/__tests__/login-flow.test.d.ts +0 -1
  102. package/dist/auth/__tests__/login-flow.test.js +0 -101
  103. package/dist/auth/__tests__/store.test.d.ts +0 -1
  104. package/dist/auth/__tests__/store.test.js +0 -132
  105. package/dist/auth/login-flow.d.ts +0 -26
  106. package/dist/auth/login-flow.js +0 -137
  107. package/dist/auth/store.d.ts +0 -5
  108. package/dist/auth/store.js +0 -62
  109. package/dist/commands/__tests__/clone-args.test.d.ts +0 -1
  110. package/dist/commands/__tests__/clone-args.test.js +0 -51
  111. package/dist/commands/__tests__/clone-source-result.test.d.ts +0 -1
  112. package/dist/commands/__tests__/clone-source-result.test.js +0 -45
  113. package/dist/commands/__tests__/info-merge.test.d.ts +0 -1
  114. package/dist/commands/__tests__/info-merge.test.js +0 -55
  115. package/dist/commands/__tests__/mcp-entries.test.d.ts +0 -1
  116. package/dist/commands/__tests__/mcp-entries.test.js +0 -48
  117. package/dist/commands/__tests__/setup-persona.test.d.ts +0 -1
  118. package/dist/commands/__tests__/setup-persona.test.js +0 -31
  119. package/dist/commands/__tests__/setup.test.d.ts +0 -1
  120. package/dist/commands/__tests__/setup.test.js +0 -81
  121. package/dist/commands/__tests__/sync-redetect.test.d.ts +0 -1
  122. package/dist/commands/__tests__/sync-redetect.test.js +0 -96
  123. package/dist/commands/__tests__/sync-telemetry.test.d.ts +0 -1
  124. package/dist/commands/__tests__/sync-telemetry.test.js +0 -281
  125. package/dist/commands/__tests__/upgrade.test.d.ts +0 -1
  126. package/dist/commands/__tests__/upgrade.test.js +0 -157
  127. package/dist/commands/agents.d.ts +0 -2
  128. package/dist/commands/agents.js +0 -160
  129. package/dist/commands/api-keys.d.ts +0 -2
  130. package/dist/commands/api-keys.js +0 -95
  131. package/dist/commands/apps.d.ts +0 -2
  132. package/dist/commands/apps.js +0 -82
  133. package/dist/commands/build-plugin.d.ts +0 -2
  134. package/dist/commands/build-plugin.js +0 -135
  135. package/dist/commands/clone.d.ts +0 -60
  136. package/dist/commands/clone.js +0 -271
  137. package/dist/commands/components.d.ts +0 -2
  138. package/dist/commands/components.js +0 -43
  139. package/dist/commands/deploy.d.ts +0 -2
  140. package/dist/commands/deploy.js +0 -279
  141. package/dist/commands/dev.d.ts +0 -11
  142. package/dist/commands/dev.js +0 -1011
  143. package/dist/commands/doctor.d.ts +0 -2
  144. package/dist/commands/doctor.js +0 -230
  145. package/dist/commands/endpoints.d.ts +0 -2
  146. package/dist/commands/endpoints.js +0 -189
  147. package/dist/commands/entities.d.ts +0 -2
  148. package/dist/commands/entities.js +0 -198
  149. package/dist/commands/files.d.ts +0 -2
  150. package/dist/commands/files.js +0 -193
  151. package/dist/commands/inbox.d.ts +0 -11
  152. package/dist/commands/inbox.js +0 -60
  153. package/dist/commands/info.d.ts +0 -178
  154. package/dist/commands/info.js +0 -455
  155. package/dist/commands/init.d.ts +0 -21
  156. package/dist/commands/init.js +0 -185
  157. package/dist/commands/integrations.d.ts +0 -2
  158. package/dist/commands/integrations.js +0 -233
  159. package/dist/commands/login.d.ts +0 -2
  160. package/dist/commands/login.js +0 -44
  161. package/dist/commands/logout.d.ts +0 -2
  162. package/dist/commands/logout.js +0 -13
  163. package/dist/commands/logs.d.ts +0 -2
  164. package/dist/commands/logs.js +0 -232
  165. package/dist/commands/mcp-entries.d.ts +0 -13
  166. package/dist/commands/mcp-entries.js +0 -26
  167. package/dist/commands/mcp.d.ts +0 -2
  168. package/dist/commands/mcp.js +0 -245
  169. package/dist/commands/open.d.ts +0 -2
  170. package/dist/commands/open.js +0 -53
  171. package/dist/commands/resume.d.ts +0 -2
  172. package/dist/commands/resume.js +0 -289
  173. package/dist/commands/save-convo.d.ts +0 -8
  174. package/dist/commands/save-convo.js +0 -20
  175. package/dist/commands/schedules.d.ts +0 -2
  176. package/dist/commands/schedules.js +0 -221
  177. package/dist/commands/setup.d.ts +0 -27
  178. package/dist/commands/setup.js +0 -177
  179. package/dist/commands/share-convo.d.ts +0 -24
  180. package/dist/commands/share-convo.js +0 -167
  181. package/dist/commands/skills.d.ts +0 -2
  182. package/dist/commands/skills.js +0 -352
  183. package/dist/commands/sync-telemetry.d.ts +0 -33
  184. package/dist/commands/sync-telemetry.js +0 -186
  185. package/dist/commands/sync.d.ts +0 -37
  186. package/dist/commands/sync.js +0 -702
  187. package/dist/commands/uninstall.d.ts +0 -2
  188. package/dist/commands/uninstall.js +0 -145
  189. package/dist/commands/upgrade.d.ts +0 -14
  190. package/dist/commands/upgrade.js +0 -217
  191. package/dist/commands/validate.d.ts +0 -2
  192. package/dist/commands/validate.js +0 -89
  193. package/dist/commands/welcome.d.ts +0 -1
  194. package/dist/commands/welcome.js +0 -86
  195. package/dist/commands/workflows.d.ts +0 -2
  196. package/dist/commands/workflows.js +0 -187
  197. package/dist/deploy/__tests__/deploy-state.test.d.ts +0 -1
  198. package/dist/deploy/__tests__/deploy-state.test.js +0 -80
  199. package/dist/deploy/__tests__/deploy-status.test.d.ts +0 -1
  200. package/dist/deploy/__tests__/deploy-status.test.js +0 -41
  201. package/dist/deploy/__tests__/detach-args.test.d.ts +0 -1
  202. package/dist/deploy/__tests__/detach-args.test.js +0 -30
  203. package/dist/deploy/deploy-state.d.ts +0 -36
  204. package/dist/deploy/deploy-state.js +0 -63
  205. package/dist/deploy/deploy-status.d.ts +0 -21
  206. package/dist/deploy/deploy-status.js +0 -36
  207. package/dist/deploy/detach.d.ts +0 -32
  208. package/dist/deploy/detach.js +0 -71
  209. package/dist/dev/__tests__/attach.test.d.ts +0 -1
  210. package/dist/dev/__tests__/attach.test.js +0 -296
  211. package/dist/dev/__tests__/detach.test.d.ts +0 -1
  212. package/dist/dev/__tests__/detach.test.js +0 -404
  213. package/dist/dev/__tests__/preview-url-poller.test.d.ts +0 -1
  214. package/dist/dev/__tests__/preview-url-poller.test.js +0 -149
  215. package/dist/dev/__tests__/session.test.d.ts +0 -1
  216. package/dist/dev/__tests__/session.test.js +0 -446
  217. package/dist/dev/__tests__/startup-sync.test.d.ts +0 -1
  218. package/dist/dev/__tests__/startup-sync.test.js +0 -32
  219. package/dist/dev/__tests__/stop.test.d.ts +0 -1
  220. package/dist/dev/__tests__/stop.test.js +0 -172
  221. package/dist/dev/attach.d.ts +0 -120
  222. package/dist/dev/attach.js +0 -269
  223. package/dist/dev/detach.d.ts +0 -187
  224. package/dist/dev/detach.js +0 -292
  225. package/dist/dev/preview-url-poller.d.ts +0 -35
  226. package/dist/dev/preview-url-poller.js +0 -50
  227. package/dist/dev/session.d.ts +0 -175
  228. package/dist/dev/session.js +0 -258
  229. package/dist/dev/startup-sync.d.ts +0 -23
  230. package/dist/dev/startup-sync.js +0 -14
  231. package/dist/dev/stop.d.ts +0 -52
  232. package/dist/dev/stop.js +0 -101
  233. package/dist/devtools/registry-data.d.ts +0 -46
  234. package/dist/devtools/registry-data.js +0 -40
  235. package/dist/generated/bundled-types.d.ts +0 -1
  236. package/dist/generated/bundled-types.js +0 -46
  237. package/dist/generated/version.d.ts +0 -1
  238. package/dist/generated/version.js +0 -2
  239. package/dist/git/__tests__/auto-commit.test.d.ts +0 -1
  240. package/dist/git/__tests__/auto-commit.test.js +0 -431
  241. package/dist/git/__tests__/classify-sync-error.test.d.ts +0 -1
  242. package/dist/git/__tests__/classify-sync-error.test.js +0 -57
  243. package/dist/git/__tests__/credential-helper-e2e.test.d.ts +0 -21
  244. package/dist/git/__tests__/credential-helper-e2e.test.js +0 -195
  245. package/dist/git/__tests__/credentials.test.d.ts +0 -1
  246. package/dist/git/__tests__/credentials.test.js +0 -141
  247. package/dist/git/__tests__/deploy-guard.test.d.ts +0 -1
  248. package/dist/git/__tests__/deploy-guard.test.js +0 -61
  249. package/dist/git/__tests__/ensure-git-credential-helper.test.d.ts +0 -1
  250. package/dist/git/__tests__/ensure-git-credential-helper.test.js +0 -133
  251. package/dist/git/__tests__/ensure-runwork-remote.test.d.ts +0 -1
  252. package/dist/git/__tests__/ensure-runwork-remote.test.js +0 -109
  253. package/dist/git/__tests__/identity.test.d.ts +0 -1
  254. package/dist/git/__tests__/identity.test.js +0 -146
  255. package/dist/git/__tests__/manifest.test.d.ts +0 -1
  256. package/dist/git/__tests__/manifest.test.js +0 -446
  257. package/dist/git/__tests__/preflight-resolution.test.d.ts +0 -1
  258. package/dist/git/__tests__/preflight-resolution.test.js +0 -366
  259. package/dist/git/__tests__/preflight.test.d.ts +0 -1
  260. package/dist/git/__tests__/preflight.test.js +0 -36
  261. package/dist/git/__tests__/repo-config.test.d.ts +0 -1
  262. package/dist/git/__tests__/repo-config.test.js +0 -26
  263. package/dist/git/__tests__/sync.test.d.ts +0 -1
  264. package/dist/git/__tests__/sync.test.js +0 -405
  265. package/dist/git/auto-commit.d.ts +0 -35
  266. package/dist/git/auto-commit.js +0 -293
  267. package/dist/git/classify-sync-error.d.ts +0 -21
  268. package/dist/git/classify-sync-error.js +0 -111
  269. package/dist/git/credentials.d.ts +0 -75
  270. package/dist/git/credentials.js +0 -164
  271. package/dist/git/critical-files.d.ts +0 -20
  272. package/dist/git/critical-files.js +0 -68
  273. package/dist/git/deploy-guard.d.ts +0 -53
  274. package/dist/git/deploy-guard.js +0 -78
  275. package/dist/git/identity.d.ts +0 -44
  276. package/dist/git/identity.js +0 -133
  277. package/dist/git/preflight.d.ts +0 -57
  278. package/dist/git/preflight.js +0 -276
  279. package/dist/git/remote.d.ts +0 -37
  280. package/dist/git/remote.js +0 -75
  281. package/dist/git/repo-config.d.ts +0 -8
  282. package/dist/git/repo-config.js +0 -29
  283. package/dist/git/sync.d.ts +0 -15
  284. package/dist/git/sync.js +0 -159
  285. package/dist/health/__tests__/checks.test.d.ts +0 -1
  286. package/dist/health/__tests__/checks.test.js +0 -357
  287. package/dist/health/__tests__/cli-distribution-checks.test.d.ts +0 -1
  288. package/dist/health/__tests__/cli-distribution-checks.test.js +0 -196
  289. package/dist/health/__tests__/fix.test.d.ts +0 -1
  290. package/dist/health/__tests__/fix.test.js +0 -72
  291. package/dist/health/__tests__/runner-filter.test.d.ts +0 -1
  292. package/dist/health/__tests__/runner-filter.test.js +0 -61
  293. package/dist/health/checks.d.ts +0 -42
  294. package/dist/health/checks.js +0 -636
  295. package/dist/health/fix.d.ts +0 -22
  296. package/dist/health/fix.js +0 -62
  297. package/dist/health/runner.d.ts +0 -8
  298. package/dist/health/runner.js +0 -47
  299. package/dist/health/types.d.ts +0 -12
  300. package/dist/health/types.js +0 -1
  301. package/dist/index.d.ts +0 -1
  302. package/dist/logs/__tests__/tailer-format.test.d.ts +0 -1
  303. package/dist/logs/__tests__/tailer-format.test.js +0 -43
  304. package/dist/logs/tailer.d.ts +0 -17
  305. package/dist/logs/tailer.js +0 -217
  306. package/dist/sync/__tests__/change-detect.test.d.ts +0 -1
  307. package/dist/sync/__tests__/change-detect.test.js +0 -123
  308. package/dist/sync/__tests__/hash.test.d.ts +0 -1
  309. package/dist/sync/__tests__/hash.test.js +0 -18
  310. package/dist/sync/change-detect.d.ts +0 -19
  311. package/dist/sync/change-detect.js +0 -136
  312. package/dist/sync/conflict-ui.d.ts +0 -5
  313. package/dist/sync/conflict-ui.js +0 -78
  314. package/dist/sync/executor.d.ts +0 -23
  315. package/dist/sync/executor.js +0 -102
  316. package/dist/sync/hash.d.ts +0 -1
  317. package/dist/sync/hash.js +0 -4
  318. package/dist/sync/types.d.ts +0 -24
  319. package/dist/sync/types.js +0 -1
  320. package/dist/template/manifest.d.ts +0 -17
  321. package/dist/template/manifest.js +0 -145
  322. package/dist/tools/types.d.ts +0 -52
  323. package/dist/tools/types.js +0 -8
  324. package/dist/types-manager.d.ts +0 -1
  325. package/dist/types-manager.js +0 -35
  326. package/dist/types.d.ts +0 -349
  327. package/dist/types.js +0 -1
  328. package/dist/ui/__tests__/banner.test.d.ts +0 -1
  329. package/dist/ui/__tests__/banner.test.js +0 -98
  330. package/dist/ui/__tests__/colors.test.d.ts +0 -1
  331. package/dist/ui/__tests__/colors.test.js +0 -22
  332. package/dist/ui/__tests__/keyboard.test.d.ts +0 -1
  333. package/dist/ui/__tests__/keyboard.test.js +0 -34
  334. package/dist/ui/__tests__/status-line.test.d.ts +0 -1
  335. package/dist/ui/__tests__/status-line.test.js +0 -54
  336. package/dist/ui/banner.d.ts +0 -29
  337. package/dist/ui/banner.js +0 -153
  338. package/dist/ui/colors.d.ts +0 -4
  339. package/dist/ui/colors.js +0 -7
  340. package/dist/ui/keyboard.d.ts +0 -12
  341. package/dist/ui/keyboard.js +0 -61
  342. package/dist/ui/status-line.d.ts +0 -6
  343. package/dist/ui/status-line.js +0 -53
  344. package/dist/utils/__tests__/format-error.test.d.ts +0 -1
  345. package/dist/utils/__tests__/format-error.test.js +0 -43
  346. package/dist/utils/__tests__/help-json.test.d.ts +0 -1
  347. package/dist/utils/__tests__/help-json.test.js +0 -39
  348. package/dist/utils/__tests__/http.test.d.ts +0 -1
  349. package/dist/utils/__tests__/http.test.js +0 -381
  350. package/dist/utils/__tests__/ignore-matcher.test.d.ts +0 -1
  351. package/dist/utils/__tests__/ignore-matcher.test.js +0 -205
  352. package/dist/utils/__tests__/output.test.d.ts +0 -1
  353. package/dist/utils/__tests__/output.test.js +0 -38
  354. package/dist/utils/__tests__/prompt.test.d.ts +0 -1
  355. package/dist/utils/__tests__/prompt.test.js +0 -27
  356. package/dist/utils/__tests__/resolve.test.d.ts +0 -1
  357. package/dist/utils/__tests__/resolve.test.js +0 -95
  358. package/dist/utils/__tests__/sqlite.test.d.ts +0 -1
  359. package/dist/utils/__tests__/sqlite.test.js +0 -89
  360. package/dist/utils/agent-guidance.d.ts +0 -47
  361. package/dist/utils/agent-guidance.js +0 -128
  362. package/dist/utils/app-info.d.ts +0 -70
  363. package/dist/utils/app-info.js +0 -167
  364. package/dist/utils/curl-parser.d.ts +0 -12
  365. package/dist/utils/curl-parser.js +0 -162
  366. package/dist/utils/data-input.d.ts +0 -1
  367. package/dist/utils/data-input.js +0 -38
  368. package/dist/utils/format-error.d.ts +0 -10
  369. package/dist/utils/format-error.js +0 -38
  370. package/dist/utils/fs.d.ts +0 -5
  371. package/dist/utils/fs.js +0 -23
  372. package/dist/utils/help-json.d.ts +0 -70
  373. package/dist/utils/help-json.js +0 -88
  374. package/dist/utils/http.d.ts +0 -46
  375. package/dist/utils/http.js +0 -421
  376. package/dist/utils/ignore-matcher.d.ts +0 -47
  377. package/dist/utils/ignore-matcher.js +0 -132
  378. package/dist/utils/output.d.ts +0 -17
  379. package/dist/utils/output.js +0 -27
  380. package/dist/utils/prompt.d.ts +0 -5
  381. package/dist/utils/prompt.js +0 -42
  382. package/dist/utils/resolve.d.ts +0 -12
  383. package/dist/utils/resolve.js +0 -52
  384. package/dist/utils/setup-state.d.ts +0 -3
  385. package/dist/utils/setup-state.js +0 -19
  386. package/dist/utils/sqlite-adapter.d.ts +0 -48
  387. package/dist/utils/sqlite-adapter.js +0 -147
  388. package/dist/utils/sqlite.d.ts +0 -14
  389. package/dist/utils/sqlite.js +0 -14
  390. package/dist/utils/subprocess.d.ts +0 -19
  391. package/dist/utils/subprocess.js +0 -27
  392. package/dist/utils/which.d.ts +0 -14
  393. package/dist/utils/which.js +0 -47
  394. package/dist/utils/zip.d.ts +0 -7
  395. package/dist/utils/zip.js +0 -42
  396. package/dist/validate/__tests__/validate.test.d.ts +0 -1
  397. package/dist/validate/__tests__/validate.test.js +0 -42
  398. package/dist/validate/freshness.d.ts +0 -28
  399. package/dist/validate/freshness.js +0 -48
  400. package/dist/validate/preview.d.ts +0 -21
  401. package/dist/validate/preview.js +0 -39
  402. package/dist/workspace/resolve.d.ts +0 -19
  403. 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>;