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,229 +0,0 @@
1
- /**
2
- * Names of every skill the CLI ships as a built-in (written to user machines
3
- * on each sync from code, never pulled from or pushed to the workspace).
4
- *
5
- * Sync uses this list to:
6
- * 1. Skip these names when computing the local-vs-remote diff so they
7
- * never appear in pull/push/conflict plans.
8
- * 2. Warn the user (and offer cleanup) if a workspace skill with the same
9
- * name exists -- it would be shadowed by the built-in locally and is
10
- * probably a stale duplicate.
11
- *
12
- * Keep this list in sync with: intro-skill.ts (`runwork`) and the two
13
- * `buildXConversationSkill` functions below.
14
- */
15
- export const BUILT_IN_SKILL_NAMES = [
16
- 'runwork',
17
- 'share-conversation',
18
- 'save-conversation',
19
- ];
20
- /**
21
- * Built-in skills shipped by the runwork CLI on every sync. These are
22
- * fundamental capabilities every user should have regardless of which
23
- * workspace they belong to, so they live in the CLI codebase (like
24
- * the dynamic `runwork` intro skill in ./intro-skill.ts) rather than
25
- * as workspace-managed skills uploaded via the `save_skill` MCP tool.
26
- *
27
- * share-conversation: hand off the current AI conversation to a teammate
28
- * save-conversation: personal checkpoint of the current AI conversation
29
- *
30
- * Both are paired with the CLI commands `runwork share-convo` and
31
- * `runwork save-convo`. The skill body teaches the host LLM how to compose
32
- * the verbatim transcript + metadata and invoke the CLI.
33
- */
34
- const SHARE_CONVERSATION_CONTENT = `# Share Conversation Skill
35
-
36
- This skill hands off the user's CURRENT AI conversation (the live chat you and the user are in) to a teammate so they can resume it natively in their own AI agent.
37
-
38
- ## When to trigger
39
-
40
- The user said something like:
41
- - "share this convo with X"
42
- - "share this conversation with X@example.com"
43
- - "send this to Mehmet"
44
- - "hand off this thread to Alice"
45
- - "forward this conversation to user@motaword.com"
46
-
47
- X may be a workspace member name, an email, or a list. ASK if ambiguous.
48
-
49
- ## What you must do
50
-
51
- **Step 1: Confirm the recipients.** Read the user's message, extract the email(s) or name(s). Confirm them back to the user before sending. Multiple recipients are allowed (comma-separated or multiple --to flags).
52
-
53
- **Step 2: Compose a VERBATIM transcript of this conversation.** Write a complete markdown transcription of everything that has happened in this chat session so far. CRITICAL RULES:
54
-
55
- - Transcribe EVERY message: user, assistant, tool calls, tool results.
56
- - DO NOT summarize. DO NOT abbreviate. DO NOT skip anything you think is unimportant.
57
- - Preserve the actual content of every assistant message, every Bash command, every Read result, every Edit, every Web search, every reasoning block you can recall, in chronological order.
58
- - Use this structure:
59
-
60
- \`\`\`markdown
61
- # Conversation: <one-line title>
62
-
63
- ## Conversation
64
-
65
- ### Turn 1 - User
66
- <user's exact message>
67
-
68
- ### Turn 2 - Assistant
69
- <your exact response text>
70
-
71
- #### Tool call: Read
72
- **Input**: { "file_path": "..." }
73
- **Result**: <full result, truncated only if absolutely necessary>
74
-
75
- ### Turn 3 - User
76
- ...
77
- \`\`\`
78
-
79
- - If you literally cannot remember every single tool result word-for-word (e.g., very long files), include as much as you have in context. Note explicitly when content is partial: \`[truncated for brevity; original was N lines]\`.
80
- - The goal is full fidelity. If the context is too long, FAIL LOUDLY by telling the user "the conversation is too long to transcribe completely; please confirm you want me to proceed with a best-effort transcription" rather than silently dropping content.
81
-
82
- Write the transcript to a temp file: \`/tmp/runwork-share-transcript-<random>.md\`.
83
-
84
- **Step 3: Generate metadata.** Compose a JSON object with these fields based on this conversation's actual content:
85
-
86
- \`\`\`json
87
- {
88
- "workMode": "coding | research | writing | planning | ops | communication | general",
89
- "topicKeywords": ["3-5 short tags"],
90
- "lastUserIntent": "one sentence describing what the user was trying to do at handoff time",
91
- "primaryArtifacts": ["files / URLs / docs touched during the conversation"],
92
- "openQuestions": ["unresolved questions or decisions at handoff time"],
93
- "suggestedNextStep": "one sentence about what the recipient should do next",
94
- "language": "programming or natural language used"
95
- }
96
- \`\`\`
97
-
98
- Write this to \`/tmp/runwork-share-metadata-<random>.json\`.
99
-
100
- **Step 4: Invoke the CLI.** Run:
101
-
102
- \`\`\`bash
103
- runwork share-convo \\
104
- --to <email1> \\
105
- --to <email2> \\
106
- --transcript-file /tmp/runwork-share-transcript-<random>.md \\
107
- --metadata-file /tmp/runwork-share-metadata-<random>.json \\
108
- --title "<short title derived from the conversation>"
109
- \`\`\`
110
-
111
- The CLI auto-detects your host agent (Claude Code, Codex, etc.) and locates the native session file via \`$CLAUDE_CODE_SESSION_ID\` / \`$CODEX_THREAD_ID\` env vars. You typically don't need to pass \`--source-agent\` or \`--native-file\`.
112
-
113
- If the user provided a personal note for the recipient, also pass \`--note "<message>"\`.
114
-
115
- **Step 5: Tell the user.** Report the share ID and inbox URL returned by the CLI. Mention any non-workspace recipients that were invited.
116
-
117
- ## Fallback: when the CLI is not available
118
-
119
- If \`runwork\` is not on PATH (rare; the CLI ships with workspace onboarding), use the Runwork MCP \`share_conversation\` tool instead. Pass the transcript content inline (lossier - no native bundle - but always works).
120
-
121
- ## Safety
122
-
123
- - Never include credentials, API keys, or secrets in the transcript if you can identify them. Replace with \`[REDACTED]\`.
124
- - If the conversation contained sensitive customer data, confirm with the user before sharing.
125
- - Workspace permissions: non-member recipients trigger an invite, which requires the sender to have the \`members.invite\` permission (owner or admin). The CLI will error out clearly if not allowed.
126
-
127
- ## What this skill is NOT for
128
-
129
- - Sharing files, apps, links, or screenshots. Use \`share-app\` or copy-paste.
130
- - Continuing a paused conversation yourself. Use \`runwork resume <id>\` after the recipient runs it.
131
- - Sharing a different conversation that's not the one you're currently in. The transcript is built from your live context.
132
- `;
133
- const SAVE_CONVERSATION_CONTENT = `# Save Conversation Skill
134
-
135
- This skill creates a personal checkpoint of the user's CURRENT AI conversation. The user is the sole recipient; no notifications are sent to anyone else. They can resume it later in any of their AI agents on any of their machines.
136
-
137
- ## When to trigger
138
-
139
- The user said something like:
140
- - "save this convo"
141
- - "checkpoint this"
142
- - "bookmark this conversation"
143
- - "save this for later"
144
- - "save this for tomorrow"
145
- - "stash this so I can pick it up at home"
146
-
147
- If the user mentions ANOTHER PERSON or an email, use the \`share-conversation\` skill instead, not this one.
148
-
149
- ## What you must do
150
-
151
- **Step 1: Confirm the intent.** A simple confirmation is enough: "Saving this conversation as a personal checkpoint."
152
-
153
- **Step 2: Compose a VERBATIM transcript of this conversation.** Same rules as the share-conversation skill - faithful, complete, no summarization. Write to \`/tmp/runwork-save-transcript-<random>.md\`.
154
-
155
- \`\`\`markdown
156
- # Conversation: <one-line title>
157
-
158
- ## Conversation
159
-
160
- ### Turn 1 - User
161
- <exact user message>
162
-
163
- ### Turn 2 - Assistant
164
- <exact assistant response>
165
-
166
- #### Tool call: <name>
167
- **Input**: ...
168
- **Result**: ...
169
- \`\`\`
170
-
171
- **Step 3: Generate metadata.** Same shape as share-conversation:
172
-
173
- \`\`\`json
174
- {
175
- "workMode": "coding | research | writing | planning | ops | communication | general",
176
- "topicKeywords": ["3-5 tags"],
177
- "lastUserIntent": "what the user was trying to do at checkpoint time",
178
- "primaryArtifacts": ["files / URLs touched"],
179
- "openQuestions": ["unresolved items"],
180
- "suggestedNextStep": "what to do when picking back up",
181
- "language": "programming or natural language"
182
- }
183
- \`\`\`
184
-
185
- Write to \`/tmp/runwork-save-metadata-<random>.json\`.
186
-
187
- **Step 4: Invoke the CLI.**
188
-
189
- \`\`\`bash
190
- runwork save-convo \\
191
- --transcript-file /tmp/runwork-save-transcript-<random>.md \\
192
- --metadata-file /tmp/runwork-save-metadata-<random>.json \\
193
- --title "<short title>"
194
- \`\`\`
195
-
196
- If the user provided a personal note ("save this with note: pick up after lunch"), pass \`--note "<message>"\`.
197
-
198
- **Step 5: Tell the user.** Report the share ID. Mention they can resume from any machine with:
199
-
200
- \`\`\`
201
- runwork resume <share-id>
202
- \`\`\`
203
-
204
- ## Fallback: when the CLI is not available
205
-
206
- Use the Runwork MCP \`save_conversation\` tool with the transcript inline.
207
-
208
- ## What this skill is NOT for
209
-
210
- - Sharing with another person. Use \`share-conversation\`.
211
- - Saving files or code. Use the file system or git.
212
- - Note-taking. Use a notes app or write to disk directly.
213
- `;
214
- export function buildShareConversationSkill() {
215
- return {
216
- name: 'share-conversation',
217
- filename: 'share-conversation',
218
- content: SHARE_CONVERSATION_CONTENT,
219
- description: 'TRIGGERS when the user asks to share, send, hand off, or forward the CURRENT AI conversation (the live chat you are in right now) to a teammate by name or email. Examples: "share this convo with oytun@motaword.com", "send this conversation to Mehmet", "hand off this thread to Alice". Use ONLY when the user wants the OTHER PERSON to be able to continue this exact conversation in their own AI agent. Do NOT trigger for sharing files, apps, links, or unrelated content. For personal checkpoint (sharing to yourself), use the `save-conversation` skill instead.',
220
- };
221
- }
222
- export function buildSaveConversationSkill() {
223
- return {
224
- name: 'save-conversation',
225
- filename: 'save-conversation',
226
- content: SAVE_CONVERSATION_CONTENT,
227
- description: 'TRIGGERS when the user wants to save, checkpoint, bookmark, or stash the CURRENT AI conversation for themselves (not for a teammate). Examples: "save this convo", "checkpoint this", "bookmark this conversation", "save this for later", "save this so I can pick it up tomorrow", "save this for my other machine". Use ONLY when the user is the sole intended recipient. For sharing with a teammate (different person), use the `share-conversation` skill instead.',
228
- };
229
- }
@@ -1,48 +0,0 @@
1
- import type { AgentAdapter, AgentConfigOverride, AgentUsageStats, CleanupManifest, McpServerEntry, SkillFile } from './types.js';
2
- /**
3
- * Merge a new managed list into a markerless on-disk array while preserving
4
- * user-added entries.
5
- *
6
- * existing = what's currently on disk
7
- * baseline = what we wrote on the previous sync (state.lastInjected). Items
8
- * present here are assumed to be ours; subtracting them from
9
- * existing leaves entries the user added themselves.
10
- * incoming = the new managed set to inject (defaults already filtered for
11
- * opt-outs, merged with team rules)
12
- *
13
- * If baseline is empty (bootstrap or first run with this CLI version), we
14
- * assume nothing currently on disk is ours and preserve all existing entries.
15
- */
16
- export declare function mergeMarkerless(existing: string[], baseline: string[], incoming: string[]): string[];
17
- export declare class CursorAdapter implements AgentAdapter {
18
- name: string;
19
- slug: string;
20
- mcpProvidesSkills: boolean;
21
- detect(): Promise<boolean>;
22
- supportsMcpScope(_scope: 'project' | 'user'): boolean;
23
- supportsSkills(): boolean;
24
- writeMcpServers(servers: McpServerEntry[], scope: 'project' | 'user'): Promise<void>;
25
- writeSkills(skills: SkillFile[], scope: 'project' | 'user'): Promise<void>;
26
- writeInstructionHint(hint: string, scope: 'project' | 'user'): Promise<void>;
27
- writeTeamInstructions(instructions: string, scope: 'project' | 'user'): Promise<void>;
28
- writeAgentConfig(config: AgentConfigOverride, scope: 'project' | 'user', baseline?: {
29
- allow?: string[];
30
- deny?: string[];
31
- }): Promise<void>;
32
- readManagedBlock(_scope: 'project' | 'user'): Promise<{
33
- allow?: string[];
34
- deny?: string[];
35
- } | undefined>;
36
- /**
37
- * Merge domains into Cursor's sandbox network policy (~/.cursor/sandbox.json).
38
- * Schema per https://cursor.com/docs/reference/sandbox:
39
- * { "networkPolicy": { "default": "allow" | "deny", "allow": [...], "deny": [...] } }
40
- * Only appends to the allow list; never flips `default` (respects user's existing policy).
41
- * If the user has `default: allow`, all traffic is already permitted and entries are harmless.
42
- * If the user has `default: deny`, our entries take effect and unblock Runwork.
43
- */
44
- private mergeSandboxAllowlist;
45
- cleanup(scope: 'project' | 'user', manifest?: CleanupManifest): Promise<void>;
46
- readUsageStats(lastSyncAt: string | null): Promise<AgentUsageStats | null>;
47
- readVersion(): Promise<string | null>;
48
- }
@@ -1,324 +0,0 @@
1
- import { existsSync, mkdirSync, readdirSync, unlinkSync, writeFileSync } from 'fs';
2
- import { join } from 'path';
3
- import { homedir, platform } from 'os';
4
- import { execFileSync } from '../utils/subprocess.js';
5
- import { querySqlite, openWritableSqlite } from '../utils/sqlite.js';
6
- import { whichBinary } from '../utils/which.js';
7
- import { mergeJsonMcpServers, removeRunworkMcpServers, readJsonConfig, writeJsonConfig } from './utils/json-config.js';
8
- /**
9
- * Merge a new managed list into a markerless on-disk array while preserving
10
- * user-added entries.
11
- *
12
- * existing = what's currently on disk
13
- * baseline = what we wrote on the previous sync (state.lastInjected). Items
14
- * present here are assumed to be ours; subtracting them from
15
- * existing leaves entries the user added themselves.
16
- * incoming = the new managed set to inject (defaults already filtered for
17
- * opt-outs, merged with team rules)
18
- *
19
- * If baseline is empty (bootstrap or first run with this CLI version), we
20
- * assume nothing currently on disk is ours and preserve all existing entries.
21
- */
22
- export function mergeMarkerless(existing, baseline, incoming) {
23
- const baselineSet = new Set(baseline);
24
- const userEntries = existing.filter((item) => !baselineSet.has(item));
25
- const seen = new Set();
26
- const result = [];
27
- for (const item of userEntries) {
28
- if (!seen.has(item)) {
29
- seen.add(item);
30
- result.push(item);
31
- }
32
- }
33
- for (const item of incoming) {
34
- if (!seen.has(item)) {
35
- seen.add(item);
36
- result.push(item);
37
- }
38
- }
39
- return result;
40
- }
41
- export class CursorAdapter {
42
- name = 'Cursor';
43
- slug = 'cursor';
44
- mcpProvidesSkills = true;
45
- async detect() {
46
- const os = platform();
47
- if (os === 'darwin' && existsSync('/Applications/Cursor.app'))
48
- return true;
49
- return !!whichBinary('cursor');
50
- }
51
- supportsMcpScope(_scope) {
52
- return true;
53
- }
54
- supportsSkills() {
55
- return true;
56
- }
57
- async writeMcpServers(servers, scope) {
58
- const filePath = scope === 'project'
59
- ? join(process.cwd(), '.cursor', 'mcp.json')
60
- : join(homedir(), '.cursor', 'mcp.json');
61
- const entries = {};
62
- for (const s of servers) {
63
- entries[s.name] = {
64
- url: s.url,
65
- ...(s.headers ? { headers: s.headers } : {}),
66
- };
67
- }
68
- mergeJsonMcpServers(filePath, entries, 'mcpServers');
69
- }
70
- async writeSkills(skills, scope) {
71
- if (scope === 'user')
72
- return;
73
- const rulesDir = join(process.cwd(), '.cursor', 'rules');
74
- mkdirSync(rulesDir, { recursive: true });
75
- for (const skill of skills) {
76
- const mdcContent = `---
77
- description: "${skill.description}"
78
- alwaysApply: false
79
- ---
80
-
81
- ${skill.content}`;
82
- writeFileSync(join(rulesDir, `${skill.filename}.mdc`), mdcContent);
83
- }
84
- }
85
- async writeInstructionHint(hint, scope) {
86
- // Cursor uses rules files, not a central instruction file
87
- // Write as a rule file that's always loaded
88
- const filePath = scope === 'project'
89
- ? join(process.cwd(), '.cursor', 'rules', 'runwork.mdc')
90
- : join(homedir(), '.cursor', 'rules', 'runwork.mdc');
91
- const mdcContent = `---\ndescription: "Runwork workspace connection"\nalwaysApply: true\n---\n\n${hint}`;
92
- mkdirSync(join(filePath, '..'), { recursive: true });
93
- writeFileSync(filePath, mdcContent);
94
- }
95
- async writeTeamInstructions(instructions, scope) {
96
- const filePath = scope === 'project'
97
- ? join(process.cwd(), '.cursor', 'rules', 'runwork-team.mdc')
98
- : join(homedir(), '.cursor', 'rules', 'runwork-team.mdc');
99
- const mdcContent = `---\ndescription: "Team instructions from Runwork workspace"\nalwaysApply: true\n---\n\n${instructions}`;
100
- mkdirSync(join(filePath, '..'), { recursive: true });
101
- writeFileSync(filePath, mdcContent);
102
- }
103
- // ── Agent config (model, permissions via SQLite) ────────────────────
104
- async writeAgentConfig(config, scope, baseline) {
105
- if (scope !== 'user')
106
- return;
107
- // Sandbox network allowlist: merge into ~/.cursor/cli-config.json
108
- if (config.networkAllowlist?.length) {
109
- this.mergeSandboxAllowlist(config.networkAllowlist);
110
- }
111
- const os = platform();
112
- let globalDbPath;
113
- if (os === 'darwin') {
114
- globalDbPath = join(homedir(), 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'state.vscdb');
115
- }
116
- else if (os === 'win32') {
117
- globalDbPath = join(process.env.APPDATA || join(homedir(), 'AppData', 'Roaming'), 'Cursor', 'User', 'globalStorage', 'state.vscdb');
118
- }
119
- else {
120
- globalDbPath = join(homedir(), '.config', 'Cursor', 'User', 'globalStorage', 'state.vscdb');
121
- }
122
- if (!existsSync(globalDbPath))
123
- return;
124
- const db = openWritableSqlite(globalDbPath);
125
- if (!db) {
126
- // SQLite runtime unavailable (older Node without node:sqlite, or not running
127
- // under Bun) or the database is locked/inaccessible. Cursor config write is
128
- // best-effort, so we silently skip.
129
- return;
130
- }
131
- try {
132
- const storageKey = 'src.vs.platform.reactivestorage.browser.reactiveStorageServiceImpl.persistentStorage.applicationUser';
133
- const row = db.prepare(`SELECT value FROM ItemTable WHERE key = ?`).get(storageKey);
134
- if (!row?.value)
135
- return;
136
- const data = JSON.parse(row.value);
137
- if (config.modelPreference) {
138
- if (!data.aiSettings)
139
- data.aiSettings = {};
140
- data.aiSettings.composerModel = config.modelPreference;
141
- }
142
- if (config.permissionRules && data.composerState) {
143
- if (config.permissionRules.allow) {
144
- data.composerState.yoloCommandAllowlist = mergeMarkerless(data.composerState.yoloCommandAllowlist ?? [], baseline?.allow ?? [], config.permissionRules.allow);
145
- }
146
- if (config.permissionRules.deny) {
147
- data.composerState.yoloCommandDenylist = mergeMarkerless(data.composerState.yoloCommandDenylist ?? [], baseline?.deny ?? [], config.permissionRules.deny);
148
- }
149
- }
150
- try {
151
- db.prepare(`UPDATE ItemTable SET value = ? WHERE key = ?`).run(JSON.stringify(data), storageKey);
152
- }
153
- catch {
154
- // Write failed (db locked while Cursor is running). Best-effort skip.
155
- }
156
- }
157
- finally {
158
- db.close();
159
- }
160
- }
161
- async readManagedBlock(_scope) {
162
- // Cursor's yoloCommandAllowlist has no marker — there's no way to read a
163
- // managed-subset from disk. The sync loop relies on the `baseline` arg
164
- // (state.lastInjected) passed into writeAgentConfig instead.
165
- return undefined;
166
- }
167
- /**
168
- * Merge domains into Cursor's sandbox network policy (~/.cursor/sandbox.json).
169
- * Schema per https://cursor.com/docs/reference/sandbox:
170
- * { "networkPolicy": { "default": "allow" | "deny", "allow": [...], "deny": [...] } }
171
- * Only appends to the allow list; never flips `default` (respects user's existing policy).
172
- * If the user has `default: allow`, all traffic is already permitted and entries are harmless.
173
- * If the user has `default: deny`, our entries take effect and unblock Runwork.
174
- */
175
- mergeSandboxAllowlist(domains) {
176
- const configPath = join(homedir(), '.cursor', 'sandbox.json');
177
- try {
178
- const config = readJsonConfig(configPath);
179
- if (!config.networkPolicy)
180
- config.networkPolicy = {};
181
- const policy = config.networkPolicy;
182
- const existing = (policy.allow ?? []);
183
- const merged = new Set(existing);
184
- for (const domain of domains) {
185
- merged.add(domain);
186
- }
187
- policy.allow = [...merged];
188
- writeJsonConfig(configPath, config);
189
- }
190
- catch {
191
- // Best-effort: sandbox config write is non-fatal
192
- }
193
- }
194
- // ── Cleanup (uninstall) ────────────────────────────────────────────
195
- async cleanup(scope, manifest) {
196
- // 1. Remove MCP entries
197
- const mcpPath = scope === 'project'
198
- ? join(process.cwd(), '.cursor', 'mcp.json')
199
- : join(homedir(), '.cursor', 'mcp.json');
200
- removeRunworkMcpServers(mcpPath, 'mcpServers');
201
- // 2. Remove rule files (skills, hint, team instructions)
202
- const rulesDir = scope === 'project'
203
- ? join(process.cwd(), '.cursor', 'rules')
204
- : join(homedir(), '.cursor', 'rules');
205
- if (existsSync(rulesDir)) {
206
- // Remove runwork.mdc and runwork-team.mdc
207
- for (const file of ['runwork.mdc', 'runwork-team.mdc']) {
208
- const filePath = join(rulesDir, file);
209
- if (existsSync(filePath)) {
210
- try {
211
- unlinkSync(filePath);
212
- }
213
- catch { /* best-effort */ }
214
- }
215
- }
216
- // Remove only skill .mdc files that we synced
217
- if (manifest?.skillFilenames.length) {
218
- const allowed = new Set(manifest.skillFilenames.map(f => `${f}.mdc`));
219
- for (const entry of readdirSync(rulesDir)) {
220
- if (allowed.has(entry)) {
221
- try {
222
- unlinkSync(join(rulesDir, entry));
223
- }
224
- catch { /* best-effort */ }
225
- }
226
- }
227
- }
228
- }
229
- }
230
- // ── Usage stats (passive, best-effort) ─────────────────────────────
231
- async readUsageStats(lastSyncAt) {
232
- try {
233
- const sinceMs = lastSyncAt ? new Date(lastSyncAt).getTime() : 0;
234
- // Query composerData from state.vscdb (cursorDiskKV table)
235
- const os = platform();
236
- let globalDbPath;
237
- if (os === 'darwin') {
238
- globalDbPath = join(homedir(), 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'state.vscdb');
239
- }
240
- else if (os === 'win32') {
241
- globalDbPath = join(process.env.APPDATA || join(homedir(), 'AppData', 'Roaming'), 'Cursor', 'User', 'globalStorage', 'state.vscdb');
242
- }
243
- else {
244
- globalDbPath = join(homedir(), '.config', 'Cursor', 'User', 'globalStorage', 'state.vscdb');
245
- }
246
- let sessionCount = 0;
247
- let totalLinesAdded = 0;
248
- let totalLinesRemoved = 0;
249
- let latestActivity = 0;
250
- let agenticSessions = 0;
251
- let chatSessions = 0;
252
- if (existsSync(globalDbPath)) {
253
- const composerResult = querySqlite(globalDbPath, `SELECT value FROM cursorDiskKV WHERE key LIKE 'composerData-%'`);
254
- if (composerResult) {
255
- for (const line of composerResult.split('\n')) {
256
- if (!line.trim())
257
- continue;
258
- try {
259
- const data = JSON.parse(line);
260
- const createdAt = data.createdAt ?? 0;
261
- if (createdAt > sinceMs) {
262
- sessionCount++;
263
- totalLinesAdded += data.totalLinesAdded ?? 0;
264
- totalLinesRemoved += data.totalLinesRemoved ?? 0;
265
- if (data.unifiedMode === 'agent' || data.isAgentic)
266
- agenticSessions++;
267
- else
268
- chatSessions++;
269
- }
270
- if (createdAt > latestActivity)
271
- latestActivity = createdAt;
272
- }
273
- catch {
274
- continue;
275
- }
276
- }
277
- }
278
- }
279
- // Check scored_commits for AI contribution data
280
- // ~/.cursor/ is consistent across platforms (unlike Application Support paths)
281
- const trackingDbPath = join(homedir(), '.cursor', 'ai-tracking', 'ai-code-tracking.db');
282
- let aiCommitCount = 0;
283
- let avgAiPercent = 0;
284
- if (existsSync(trackingDbPath)) {
285
- const sinceSec = Math.floor(sinceMs / 1000);
286
- const commitResult = querySqlite(trackingDbPath, `SELECT count(*), avg(CAST(v2AiPercentage AS REAL)) FROM scored_commits WHERE scoredAt > ${sinceSec}`);
287
- if (commitResult) {
288
- const parts = commitResult.split('|');
289
- aiCommitCount = parseInt(parts[0]) || 0;
290
- avgAiPercent = parseFloat(parts[1]) || 0;
291
- }
292
- }
293
- if (sessionCount === 0 && latestActivity <= sinceMs)
294
- return null;
295
- return {
296
- hasNewActivity: sessionCount > 0,
297
- sessionCount,
298
- messageCount: 0,
299
- toolCallCount: 0,
300
- tokensUsed: 0,
301
- aiLinesAdded: totalLinesAdded,
302
- aiLinesRemoved: totalLinesRemoved,
303
- lastActiveAt: latestActivity > 0 ? new Date(latestActivity).toISOString() : null,
304
- extra: {
305
- agenticSessions,
306
- chatSessions,
307
- ...(aiCommitCount > 0 ? { aiCommitCount, avgAiContributionPercent: Math.round(avgAiPercent) } : {}),
308
- },
309
- };
310
- }
311
- catch {
312
- return null;
313
- }
314
- }
315
- async readVersion() {
316
- try {
317
- const output = execFileSync('cursor', ['--version'], { stdio: 'pipe' }).toString().trim();
318
- return output;
319
- }
320
- catch {
321
- return null;
322
- }
323
- }
324
- }
@@ -1,30 +0,0 @@
1
- /**
2
- * Baked-in default permission rules that `runwork sync` injects into each
3
- * supported agent's configuration.
4
- *
5
- * Defaults are user-scope only. They merge with team-managed rules from the
6
- * workspace admin and are tracked in `~/.runwork/setup.json` under
7
- * `agentDefaults[slug]` so that:
8
- * 1. Removals stick: if a user deletes an injected entry, it never returns.
9
- * 2. Newly added defaults flow in: CLI upgrades that ship more defaults
10
- * auto-apply on the next sync.
11
- * 3. Removed defaults disappear: shrinking the set here also removes the
12
- * entries from users' on-disk config on next sync.
13
- * 4. Tool removal resets state: `runwork agents remove <slug>` clears the
14
- * per-agent state, so re-adding the tool starts from a clean bootstrap.
15
- *
16
- * Only agents whose permission model maps cleanly to command-pattern allow/deny
17
- * lists appear here. Codex, Gemini, Cline, and Claude Desktop are intentionally
18
- * absent (their config formats are toggle-based or tool-name-based and do not
19
- * fit). Network domain allowlisting for those agents is handled separately via
20
- * AgentConfigOverride.networkAllowlist in sync.ts.
21
- */
22
- export interface BakedDefaults {
23
- allow: string[];
24
- deny: string[];
25
- }
26
- export declare const RUNWORK_AGENT_DEFAULTS: Record<string, BakedDefaults>;
27
- /** Schema version recorded in setup.json. Bump when default-injection semantics change. */
28
- export declare const AGENT_DEFAULTS_SCHEMA_VERSION = 1;
29
- /** Slugs that have baked-in defaults. */
30
- export declare function hasBakedDefaults(slug: string): boolean;