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,405 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import { execFileSync } from 'child_process';
3
- import { mkdtempSync, writeFileSync, readFileSync, rmSync, existsSync } from 'fs';
4
- import { join } from 'path';
5
- import { tmpdir } from 'os';
6
- import { syncWithRemote, hasCommits, hasTrackedChanges } from '../sync.js';
7
- const tempDirs = [];
8
- function makeTempDir(prefix) {
9
- const dir = mkdtempSync(join(tmpdir(), `runwork-sync-test-${prefix}-`));
10
- tempDirs.push(dir);
11
- return dir;
12
- }
13
- function createTestRepo() {
14
- const remote = makeTempDir('remote');
15
- execFileSync('git', ['init', '--bare', remote]);
16
- const local = makeTempDir('local');
17
- execFileSync('git', ['init', local]);
18
- execFileSync('git', ['remote', 'add', 'runwork', remote], { cwd: local });
19
- execFileSync('git', ['config', 'user.email', 'test@test.com'], { cwd: local });
20
- execFileSync('git', ['config', 'user.name', 'Test'], { cwd: local });
21
- return { local, remote };
22
- }
23
- /** Create a second clone of the same bare remote (for simulating remote-side commits). */
24
- function cloneAsSecondary(remote) {
25
- const secondary = makeTempDir('secondary');
26
- execFileSync('git', ['clone', remote, secondary]);
27
- execFileSync('git', ['config', 'user.email', 'other@test.com'], { cwd: secondary });
28
- execFileSync('git', ['config', 'user.name', 'Other'], { cwd: secondary });
29
- return secondary;
30
- }
31
- function commitFile(repoDir, filename, content, message) {
32
- writeFileSync(join(repoDir, filename), content);
33
- execFileSync('git', ['add', filename], { cwd: repoDir });
34
- execFileSync('git', ['commit', '-m', message], { cwd: repoDir });
35
- return execFileSync('git', ['rev-parse', 'HEAD'], { cwd: repoDir, encoding: 'utf-8' }).trim();
36
- }
37
- function getLog(repoDir) {
38
- return execFileSync('git', ['log', '--oneline', '--all'], { cwd: repoDir, encoding: 'utf-8' })
39
- .trim()
40
- .split('\n')
41
- .filter(Boolean);
42
- }
43
- function getHeadHash(repoDir) {
44
- return execFileSync('git', ['rev-parse', 'HEAD'], { cwd: repoDir, encoding: 'utf-8' }).trim();
45
- }
46
- afterEach(() => {
47
- for (const dir of tempDirs) {
48
- try {
49
- rmSync(dir, { recursive: true, force: true });
50
- }
51
- catch { /* best effort */ }
52
- }
53
- tempDirs.length = 0;
54
- });
55
- describe('hasCommits()', () => {
56
- it('returns false for repo with no commits', () => {
57
- const dir = makeTempDir('empty');
58
- execFileSync('git', ['init', dir]);
59
- expect(hasCommits(dir)).toBe(false);
60
- });
61
- it('returns true for repo with commits', () => {
62
- const { local } = createTestRepo();
63
- commitFile(local, 'a.txt', 'hello', 'init');
64
- expect(hasCommits(local)).toBe(true);
65
- });
66
- });
67
- describe('hasTrackedChanges()', () => {
68
- it('returns false for clean working tree', () => {
69
- const { local } = createTestRepo();
70
- commitFile(local, 'a.txt', 'hello', 'init');
71
- expect(hasTrackedChanges(local)).toBe(false);
72
- });
73
- it('returns true for modified tracked file', () => {
74
- const { local } = createTestRepo();
75
- commitFile(local, 'a.txt', 'hello', 'init');
76
- writeFileSync(join(local, 'a.txt'), 'changed');
77
- expect(hasTrackedChanges(local)).toBe(true);
78
- });
79
- it('returns false when only untracked files exist', () => {
80
- const { local } = createTestRepo();
81
- commitFile(local, 'a.txt', 'hello', 'init');
82
- writeFileSync(join(local, 'untracked.txt'), 'new');
83
- expect(hasTrackedChanges(local)).toBe(false);
84
- });
85
- });
86
- describe('syncWithRemote()', () => {
87
- it('returns skipped when there are no local commits', () => {
88
- const { local } = createTestRepo();
89
- const result = syncWithRemote(local);
90
- expect(result).toEqual({ status: 'skipped', pushed: false });
91
- });
92
- it('syncs when local and remote are already in sync', () => {
93
- const { local, remote } = createTestRepo();
94
- commitFile(local, 'a.txt', 'hello', 'init');
95
- execFileSync('git', ['push', 'runwork', 'main'], { cwd: local, stdio: 'pipe' });
96
- const result = syncWithRemote(local);
97
- expect(result.status).toBe('synced');
98
- expect(result.pushed).toBe(true);
99
- });
100
- it('pushes local commits when remote has no new changes', () => {
101
- const { local, remote } = createTestRepo();
102
- commitFile(local, 'a.txt', 'hello', 'init');
103
- execFileSync('git', ['push', 'runwork', 'main'], { cwd: local, stdio: 'pipe' });
104
- // Add a new local commit
105
- commitFile(local, 'b.txt', 'world', 'second');
106
- const localHead = getHeadHash(local);
107
- const result = syncWithRemote(local);
108
- expect(result.status).toBe('synced');
109
- expect(result.pushed).toBe(true);
110
- // Verify remote has the new commit
111
- const remoteHead = execFileSync('git', ['rev-parse', 'HEAD'], { cwd: remote, encoding: 'utf-8' }).trim();
112
- expect(remoteHead).toBe(localHead);
113
- });
114
- it('rebases local on remote when remote has new commits', () => {
115
- const { local, remote } = createTestRepo();
116
- commitFile(local, 'a.txt', 'hello', 'init');
117
- execFileSync('git', ['push', 'runwork', 'main'], { cwd: local, stdio: 'pipe' });
118
- // Push a commit from another clone to simulate remote changes
119
- const secondary = cloneAsSecondary(remote);
120
- commitFile(secondary, 'remote-file.txt', 'from-remote', 'remote commit');
121
- execFileSync('git', ['push', 'origin', 'main'], { cwd: secondary, stdio: 'pipe' });
122
- const result = syncWithRemote(local);
123
- expect(result.status).toBe('synced');
124
- // Local should now have the remote file
125
- expect(existsSync(join(local, 'remote-file.txt'))).toBe(true);
126
- expect(readFileSync(join(local, 'remote-file.txt'), 'utf-8')).toBe('from-remote');
127
- });
128
- it('rebases when both sides have non-conflicting commits', () => {
129
- const { local, remote } = createTestRepo();
130
- commitFile(local, 'a.txt', 'hello', 'init');
131
- execFileSync('git', ['push', 'runwork', 'main'], { cwd: local, stdio: 'pipe' });
132
- // Remote adds a file
133
- const secondary = cloneAsSecondary(remote);
134
- commitFile(secondary, 'remote-file.txt', 'remote-content', 'remote commit');
135
- execFileSync('git', ['push', 'origin', 'main'], { cwd: secondary, stdio: 'pipe' });
136
- // Local adds a different file
137
- commitFile(local, 'local-file.txt', 'local-content', 'local commit');
138
- const result = syncWithRemote(local);
139
- expect(result.status).toBe('synced');
140
- expect(result.pushed).toBe(true);
141
- // Both files should be present
142
- expect(readFileSync(join(local, 'remote-file.txt'), 'utf-8')).toBe('remote-content');
143
- expect(readFileSync(join(local, 'local-file.txt'), 'utf-8')).toBe('local-content');
144
- // Verify remote also has both
145
- const secondaryCheck = cloneAsSecondary(remote);
146
- expect(existsSync(join(secondaryCheck, 'remote-file.txt'))).toBe(true);
147
- expect(existsSync(join(secondaryCheck, 'local-file.txt'))).toBe(true);
148
- });
149
- it('handles unrelated histories with non-overlapping files via rebase', () => {
150
- const { local, remote } = createTestRepo();
151
- // Local has its own history
152
- commitFile(local, 'local-file.txt', 'local', 'local init');
153
- // Create a completely separate history and force-push it to remote
154
- const other = makeTempDir('other');
155
- execFileSync('git', ['init', other]);
156
- execFileSync('git', ['config', 'user.email', 'other@test.com'], { cwd: other });
157
- execFileSync('git', ['config', 'user.name', 'Other'], { cwd: other });
158
- commitFile(other, 'remote-only.txt', 'remote', 'remote init');
159
- execFileSync('git', ['remote', 'add', 'origin', remote], { cwd: other });
160
- execFileSync('git', ['push', 'origin', 'main'], { cwd: other, stdio: 'pipe' });
161
- const result = syncWithRemote(local);
162
- // Modern git can rebase non-conflicting unrelated histories
163
- expect(['synced', 'merged']).toContain(result.status);
164
- // Both files should be present regardless of strategy used
165
- expect(existsSync(join(local, 'local-file.txt'))).toBe(true);
166
- expect(existsSync(join(local, 'remote-only.txt'))).toBe(true);
167
- });
168
- it('auto-resolves conflicting unrelated histories by accepting remote', () => {
169
- const { local, remote } = createTestRepo();
170
- // Local modifies a file
171
- commitFile(local, 'shared.txt', 'local-line-1\nlocal-line-2\n', 'local init');
172
- // Remote has completely different history touching the same file
173
- const other = makeTempDir('other');
174
- execFileSync('git', ['init', other]);
175
- execFileSync('git', ['config', 'user.email', 'other@test.com'], { cwd: other });
176
- execFileSync('git', ['config', 'user.name', 'Other'], { cwd: other });
177
- commitFile(other, 'shared.txt', 'remote-line-1\nremote-line-2\n', 'remote init');
178
- execFileSync('git', ['remote', 'add', 'origin', remote], { cwd: other });
179
- execFileSync('git', ['push', 'origin', 'main'], { cwd: other, stdio: 'pipe' });
180
- const result = syncWithRemote(local);
181
- // Conflicts auto-resolved with -X theirs (remote wins for first sync)
182
- expect(result.status).toBe('merged');
183
- // Remote version should win
184
- expect(readFileSync(join(local, 'shared.txt'), 'utf-8')).toBe('remote-line-1\nremote-line-2\n');
185
- });
186
- it('stashes and restores dirty working tree during sync', () => {
187
- const { local, remote } = createTestRepo();
188
- commitFile(local, 'a.txt', 'hello', 'init');
189
- execFileSync('git', ['push', 'runwork', 'main'], { cwd: local, stdio: 'pipe' });
190
- // Remote adds a commit
191
- const secondary = cloneAsSecondary(remote);
192
- commitFile(secondary, 'remote-file.txt', 'remote', 'remote commit');
193
- execFileSync('git', ['push', 'origin', 'main'], { cwd: secondary, stdio: 'pipe' });
194
- // Make local dirty (modify a tracked file without committing)
195
- writeFileSync(join(local, 'a.txt'), 'dirty-change');
196
- const result = syncWithRemote(local);
197
- expect(result.status).toBe('synced');
198
- // Dirty change should be preserved
199
- expect(readFileSync(join(local, 'a.txt'), 'utf-8')).toBe('dirty-change');
200
- // Remote file should also be present
201
- expect(existsSync(join(local, 'remote-file.txt'))).toBe(true);
202
- });
203
- it('reports stash conflict when stash pop fails', () => {
204
- const { local, remote } = createTestRepo();
205
- commitFile(local, 'shared.txt', 'original', 'init');
206
- execFileSync('git', ['push', 'runwork', 'main'], { cwd: local, stdio: 'pipe' });
207
- // Remote modifies the same file
208
- const secondary = cloneAsSecondary(remote);
209
- writeFileSync(join(secondary, 'shared.txt'), 'remote-version');
210
- execFileSync('git', ['add', 'shared.txt'], { cwd: secondary });
211
- execFileSync('git', ['commit', '-m', 'remote change to shared'], { cwd: secondary });
212
- execFileSync('git', ['push', 'origin', 'main'], { cwd: secondary, stdio: 'pipe' });
213
- // Local has uncommitted changes to the same file
214
- writeFileSync(join(local, 'shared.txt'), 'local-dirty-version');
215
- const result = syncWithRemote(local);
216
- expect(result.error).toBe('stash-conflict');
217
- expect(result.pushed).toBe(false);
218
- });
219
- it('handles fetch failure gracefully (unreachable remote)', () => {
220
- const { local } = createTestRepo();
221
- commitFile(local, 'a.txt', 'hello', 'init');
222
- // Point remote to a non-existent path
223
- const badPath = join(tmpdir(), 'nonexistent-repo-' + Date.now());
224
- execFileSync('git', ['remote', 'set-url', 'runwork', badPath], { cwd: local });
225
- const result = syncWithRemote(local);
226
- expect(result.status).toBe('sync-failed');
227
- expect(result.pushed).toBe(false);
228
- // Local repo should be untouched
229
- expect(readFileSync(join(local, 'a.txt'), 'utf-8')).toBe('hello');
230
- });
231
- it('removes conflicting untracked files before rebase', () => {
232
- const { local, remote } = createTestRepo();
233
- commitFile(local, 'a.txt', 'hello', 'init');
234
- execFileSync('git', ['push', 'runwork', 'main'], { cwd: local, stdio: 'pipe' });
235
- // Remote adds a new file via secondary clone
236
- const secondary = cloneAsSecondary(remote);
237
- commitFile(secondary, 'skeleton.txt', 'from-remote', 'add skeleton');
238
- execFileSync('git', ['push', 'origin', 'main'], { cwd: secondary, stdio: 'pipe' });
239
- // Local has the same file as untracked (simulating template download)
240
- writeFileSync(join(local, 'skeleton.txt'), 'local-untracked-version');
241
- const result = syncWithRemote(local);
242
- expect(result.status).toBe('synced');
243
- // The file should now contain the remote version (committed)
244
- expect(readFileSync(join(local, 'skeleton.txt'), 'utf-8')).toBe('from-remote');
245
- });
246
- it('preserves local state when fetch fails with dirty tree', () => {
247
- const { local } = createTestRepo();
248
- commitFile(local, 'a.txt', 'hello', 'init');
249
- // Make working tree dirty
250
- writeFileSync(join(local, 'a.txt'), 'dirty');
251
- // Point remote to bad path
252
- const badPath = join(tmpdir(), 'nonexistent-repo-' + Date.now());
253
- execFileSync('git', ['remote', 'set-url', 'runwork', badPath], { cwd: local });
254
- const result = syncWithRemote(local);
255
- expect(result.status).toBe('sync-failed');
256
- // Dirty changes should be restored from stash
257
- expect(readFileSync(join(local, 'a.txt'), 'utf-8')).toBe('dirty');
258
- });
259
- });
260
- // ============================================================
261
- // EDGE CASE TESTS - probing for real bugs
262
- // ============================================================
263
- describe('hasTrackedChanges() edge cases', () => {
264
- it('returns true for staged deletions (git rm)', () => {
265
- const { local } = createTestRepo();
266
- commitFile(local, 'a.txt', 'hello', 'init');
267
- // Stage a deletion
268
- execFileSync('git', ['rm', 'a.txt'], { cwd: local, stdio: 'pipe' });
269
- // git status --porcelain shows "D a.txt" which does not start with "??"
270
- expect(hasTrackedChanges(local)).toBe(true);
271
- });
272
- it('returns true for staged new file (git add of new file)', () => {
273
- const { local } = createTestRepo();
274
- commitFile(local, 'a.txt', 'hello', 'init');
275
- // Create and stage a new file (status: "A new.txt")
276
- writeFileSync(join(local, 'new.txt'), 'new content');
277
- execFileSync('git', ['add', 'new.txt'], { cwd: local, stdio: 'pipe' });
278
- expect(hasTrackedChanges(local)).toBe(true);
279
- });
280
- });
281
- describe('syncWithRemote() edge cases', () => {
282
- it('stash/pop works correctly when only staged deletions exist', () => {
283
- // Edge case: hasTrackedChanges returns true for staged deletions,
284
- // but does git stash push actually stash a staged deletion?
285
- // If stash doesn't capture it, stash pop could fail or restore wrong state.
286
- const { local, remote } = createTestRepo();
287
- commitFile(local, 'a.txt', 'hello', 'init');
288
- commitFile(local, 'b.txt', 'world', 'second');
289
- execFileSync('git', ['push', 'runwork', 'main'], { cwd: local, stdio: 'pipe' });
290
- // Remote adds a new file
291
- const secondary = cloneAsSecondary(remote);
292
- commitFile(secondary, 'remote-file.txt', 'remote', 'remote commit');
293
- execFileSync('git', ['push', 'origin', 'main'], { cwd: secondary, stdio: 'pipe' });
294
- // Stage a deletion locally (without committing)
295
- execFileSync('git', ['rm', 'b.txt'], { cwd: local, stdio: 'pipe' });
296
- expect(hasTrackedChanges(local)).toBe(true);
297
- expect(existsSync(join(local, 'b.txt'))).toBe(false);
298
- const result = syncWithRemote(local);
299
- expect(result.status).toBe('synced');
300
- // After sync, the staged deletion should be restored
301
- // (stash pop should bring back the staged rm state)
302
- expect(existsSync(join(local, 'b.txt'))).toBe(false);
303
- // Verify the deletion is still staged
304
- const status = execFileSync('git', ['status', '--porcelain'], {
305
- cwd: local, encoding: 'utf-8',
306
- }).trim();
307
- expect(status).toContain('b.txt');
308
- });
309
- it('handles sync when remote branch main does not exist yet (empty bare repo)', () => {
310
- // User creates local repo and commits, but never pushed to remote.
311
- // Remote is empty. fetch runwork main should fail.
312
- const { local, remote } = createTestRepo();
313
- commitFile(local, 'a.txt', 'hello', 'init');
314
- // Do NOT push -- remote has no 'main' branch
315
- const result = syncWithRemote(local);
316
- // fetch should fail because remote has no main branch
317
- expect(result.status).toBe('sync-failed');
318
- // But local repo should be intact
319
- expect(readFileSync(join(local, 'a.txt'), 'utf-8')).toBe('hello');
320
- });
321
- it('leaves repo clean after auto-resolving conflicting unrelated histories', () => {
322
- const { local, remote } = createTestRepo();
323
- commitFile(local, 'shared.txt', 'local version\n', 'local init');
324
- // Create conflicting remote history
325
- const other = makeTempDir('other');
326
- execFileSync('git', ['init', other]);
327
- execFileSync('git', ['config', 'user.email', 'other@test.com'], { cwd: other });
328
- execFileSync('git', ['config', 'user.name', 'Other'], { cwd: other });
329
- commitFile(other, 'shared.txt', 'remote version\n', 'remote init');
330
- execFileSync('git', ['remote', 'add', 'origin', remote], { cwd: other });
331
- execFileSync('git', ['push', 'origin', 'main'], { cwd: other, stdio: 'pipe' });
332
- const result = syncWithRemote(local);
333
- // Auto-resolved with -X theirs
334
- expect(result.status).toBe('merged');
335
- // Repo should NOT be in a rebase or merge state
336
- expect(existsSync(join(local, '.git', 'MERGE_HEAD'))).toBe(false);
337
- expect(existsSync(join(local, '.git', 'rebase-merge'))).toBe(false);
338
- expect(existsSync(join(local, '.git', 'rebase-apply'))).toBe(false);
339
- // Remote version wins
340
- expect(readFileSync(join(local, 'shared.txt'), 'utf-8')).toBe('remote version\n');
341
- });
342
- it('handles merge conflict during rebase on related histories (same file edited both sides)', () => {
343
- const { local, remote } = createTestRepo();
344
- commitFile(local, 'shared.txt', 'original content\n', 'init');
345
- execFileSync('git', ['push', 'runwork', 'main'], { cwd: local, stdio: 'pipe' });
346
- // Remote modifies shared.txt
347
- const secondary = cloneAsSecondary(remote);
348
- writeFileSync(join(secondary, 'shared.txt'), 'remote edit line 1\nremote edit line 2\n');
349
- execFileSync('git', ['add', 'shared.txt'], { cwd: secondary });
350
- execFileSync('git', ['commit', '-m', 'remote edit'], { cwd: secondary });
351
- execFileSync('git', ['push', 'origin', 'main'], { cwd: secondary, stdio: 'pipe' });
352
- // Local also modifies shared.txt (same area -> conflict)
353
- writeFileSync(join(local, 'shared.txt'), 'local edit line 1\nlocal edit line 2\n');
354
- execFileSync('git', ['add', 'shared.txt'], { cwd: local });
355
- execFileSync('git', ['commit', '-m', 'local edit'], { cwd: local });
356
- const result = syncWithRemote(local);
357
- // Rebase should fail due to conflict, merge fallback should also have conflicts
358
- // OR merge with --allow-unrelated-histories might succeed (unlikely for related histories)
359
- // The key assertion: repo must NOT be left in broken state
360
- expect(existsSync(join(local, '.git', 'MERGE_HEAD'))).toBe(false);
361
- expect(existsSync(join(local, '.git', 'rebase-merge'))).toBe(false);
362
- // Either merged or sync-failed, but never left in limbo
363
- expect(['synced', 'merged', 'sync-failed']).toContain(result.status);
364
- });
365
- it('stash pop after sync-failed still restores dirty state', () => {
366
- // If sync fails (fetch fails), dirty state should still be restored.
367
- // But what if the stash was created and then the repo state changed
368
- // (e.g., aborted rebase left things in weird state)?
369
- const { local } = createTestRepo();
370
- commitFile(local, 'a.txt', 'committed', 'init');
371
- // Make dirty
372
- writeFileSync(join(local, 'a.txt'), 'uncommitted change');
373
- // Point to bad remote
374
- const badPath = join(tmpdir(), 'nonexistent-' + Date.now());
375
- execFileSync('git', ['remote', 'set-url', 'runwork', badPath], { cwd: local });
376
- const result = syncWithRemote(local);
377
- expect(result.status).toBe('sync-failed');
378
- // The stash should have been popped successfully
379
- expect(result.error).not.toBe('stash-conflict');
380
- expect(readFileSync(join(local, 'a.txt'), 'utf-8')).toBe('uncommitted change');
381
- // Stash list should be empty (stash was popped)
382
- const stashList = execFileSync('git', ['stash', 'list'], {
383
- cwd: local, encoding: 'utf-8',
384
- }).trim();
385
- expect(stashList).toBe('');
386
- });
387
- it('does not leave orphan stash entries on successful sync', () => {
388
- const { local, remote } = createTestRepo();
389
- commitFile(local, 'a.txt', 'hello', 'init');
390
- execFileSync('git', ['push', 'runwork', 'main'], { cwd: local, stdio: 'pipe' });
391
- // Remote adds a file
392
- const secondary = cloneAsSecondary(remote);
393
- commitFile(secondary, 'remote.txt', 'remote', 'remote commit');
394
- execFileSync('git', ['push', 'origin', 'main'], { cwd: secondary, stdio: 'pipe' });
395
- // Make local dirty
396
- writeFileSync(join(local, 'a.txt'), 'dirty');
397
- const result = syncWithRemote(local);
398
- expect(result.status).toBe('synced');
399
- // Stash should be empty - no orphan stash entries
400
- const stashList = execFileSync('git', ['stash', 'list'], {
401
- cwd: local, encoding: 'utf-8',
402
- }).trim();
403
- expect(stashList).toBe('');
404
- });
405
- });
@@ -1,35 +0,0 @@
1
- import type { ApiClient } from '../api/client.js';
2
- /**
3
- * Basename-level ignore predicate using the static defaults only.
4
- * Exposed for unit testing of the static defaults; the runtime watcher uses
5
- * a richer matcher built from `.gitignore` (see watchAndAutoCommit).
6
- */
7
- export declare function isIgnored(filePath: string): boolean;
8
- export declare function watchAndAutoCommit(directory: string, client: ApiClient, appId: string, callbacks?: {
9
- onFileChange?: (relPath: string, pendingCount: number) => void;
10
- onFastSync?: (count: number) => void;
11
- onGitPush?: (count: number) => void;
12
- }): Promise<void>;
13
- /**
14
- * Stage and commit the current working tree in a single shot, staging exactly
15
- * what the dev watcher would: tracked modifications/deletions (`git add -u`)
16
- * plus untracked files that the CLI ignore matcher does NOT exclude.
17
- *
18
- * It deliberately does NOT use `git add -A`. A blanket add honors only
19
- * `.gitignore`, which in the runwork-app template excludes `.env.*` but not a
20
- * bare `.env` (vibe-apps write both `.dev.vars` and `.env` locally) — so
21
- * `git add -A` would commit and push local secrets. The CLI ignore matcher
22
- * (the same one the dev watcher uses) excludes `.env`, `.dev.vars`,
23
- * `.bun-cache`, `.runwork`, and `*.log`, keeping deploy's staging in parity
24
- * with dev.
25
- *
26
- * Used by `runwork deploy`, which must commit pending working-tree changes
27
- * even when no dev session ever ran.
28
- *
29
- * Returns the number of files committed (0 when nothing was staged).
30
- */
31
- export declare function commitWorkingTree(cwd: string, message: string): {
32
- committed: boolean;
33
- fileCount: number;
34
- };
35
- export declare function stopAutoCommit(): Promise<void>;