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,15 +0,0 @@
1
- import type { AgentAdapter, AgentConfigOverride, CleanupManifest, McpServerEntry, SkillFile } from './types.js';
2
- export declare class ClineAdapter implements AgentAdapter {
3
- name: string;
4
- slug: string;
5
- mcpProvidesSkills: boolean;
6
- detect(): Promise<boolean>;
7
- supportsMcpScope(scope: 'project' | 'user'): boolean;
8
- supportsSkills(): boolean;
9
- writeMcpServers(servers: McpServerEntry[], _scope: 'project' | 'user'): Promise<void>;
10
- writeSkills(skills: SkillFile[], scope: 'project' | 'user'): Promise<void>;
11
- writeInstructionHint(hint: string, scope: 'project' | 'user'): Promise<void>;
12
- writeTeamInstructions(instructions: string, scope: 'project' | 'user'): Promise<void>;
13
- writeAgentConfig(config: AgentConfigOverride, scope: 'project' | 'user'): Promise<void>;
14
- cleanup(scope: 'project' | 'user', manifest?: CleanupManifest): Promise<void>;
15
- }
@@ -1,130 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, unlinkSync, writeFileSync } from 'fs';
2
- import { join } from 'path';
3
- import { homedir } from 'os';
4
- import { whichBinary } from '../utils/which.js';
5
- import { buildSkillMd } from './types.js';
6
- import { mergeJsonMcpServers, removeRunworkMcpServers } from './utils/json-config.js';
7
- export class ClineAdapter {
8
- name = 'Cline';
9
- slug = 'cline';
10
- mcpProvidesSkills = true;
11
- async detect() {
12
- return !!whichBinary('cline');
13
- }
14
- supportsMcpScope(scope) {
15
- return scope === 'user';
16
- }
17
- supportsSkills() {
18
- return true;
19
- }
20
- async writeMcpServers(servers, _scope) {
21
- const configPath = join(homedir(), '.cline', 'data', 'settings', 'cline_mcp_settings.json');
22
- const entries = {};
23
- for (const s of servers) {
24
- entries[s.name] = {
25
- url: s.url,
26
- ...(s.headers ? { headers: s.headers } : {}),
27
- };
28
- }
29
- mergeJsonMcpServers(configPath, entries, 'mcpServers');
30
- }
31
- async writeSkills(skills, scope) {
32
- if (scope === 'user')
33
- return;
34
- const rulesDir = join(process.cwd(), '.clinerules');
35
- mkdirSync(rulesDir, { recursive: true });
36
- for (const skill of skills) {
37
- writeFileSync(join(rulesDir, `${skill.filename}.md`), buildSkillMd(skill));
38
- }
39
- }
40
- async writeInstructionHint(hint, scope) {
41
- if (scope === 'user')
42
- return;
43
- const filePath = join(process.cwd(), '.clinerules', 'runwork.md');
44
- mkdirSync(join(filePath, '..'), { recursive: true });
45
- writeFileSync(filePath, hint);
46
- }
47
- async writeTeamInstructions(instructions, scope) {
48
- if (scope === 'user')
49
- return;
50
- const filePath = join(process.cwd(), '.clinerules', 'runwork-team.md');
51
- mkdirSync(join(filePath, '..'), { recursive: true });
52
- writeFileSync(filePath, instructions);
53
- }
54
- // ── Agent config (globalState.json) ────────────────────────────────
55
- async writeAgentConfig(config, scope) {
56
- if (scope !== 'user')
57
- return;
58
- const globalStatePath = join(homedir(), '.cline', 'data', 'globalState.json');
59
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
- let state = {};
61
- if (existsSync(globalStatePath)) {
62
- try {
63
- state = JSON.parse(readFileSync(globalStatePath, 'utf-8'));
64
- }
65
- catch { /* start fresh */ }
66
- }
67
- if (config.modelPreference) {
68
- state.apiModelId = config.modelPreference;
69
- }
70
- if (config.permissionRules) {
71
- if (!state.autoApprovalSettings)
72
- state.autoApprovalSettings = {};
73
- if (!state.autoApprovalSettings.actions)
74
- state.autoApprovalSettings.actions = {};
75
- if (config.permissionRules.defaultMode === 'auto') {
76
- state.autoApprovalSettings.enabled = true;
77
- state.autoApprovalSettings.actions.readFiles = true;
78
- state.autoApprovalSettings.actions.editFiles = true;
79
- state.autoApprovalSettings.actions.executeSafeCommands = true;
80
- state.autoApprovalSettings.actions.useMcp = true;
81
- }
82
- else if (config.permissionRules.defaultMode === 'default') {
83
- state.autoApprovalSettings.enabled = false;
84
- }
85
- }
86
- mkdirSync(join(globalStatePath, '..'), { recursive: true });
87
- writeFileSync(globalStatePath, JSON.stringify(state, null, 2));
88
- }
89
- // ── Cleanup (uninstall) ────────────────────────────────────────────
90
- async cleanup(scope, manifest) {
91
- // 1. Remove MCP entries (user scope only)
92
- if (scope === 'user') {
93
- const configPath = join(homedir(), '.cline', 'data', 'settings', 'cline_mcp_settings.json');
94
- removeRunworkMcpServers(configPath, 'mcpServers');
95
- }
96
- // 2. Remove rule files (project scope only)
97
- if (scope === 'project') {
98
- const rulesDir = join(process.cwd(), '.clinerules');
99
- if (existsSync(rulesDir)) {
100
- for (const file of ['runwork.md', 'runwork-team.md']) {
101
- const filePath = join(rulesDir, file);
102
- if (existsSync(filePath)) {
103
- try {
104
- unlinkSync(filePath);
105
- }
106
- catch { /* best-effort */ }
107
- }
108
- }
109
- // Remove only skill .md files that we synced
110
- if (manifest?.skillFilenames.length) {
111
- const allowed = new Set(manifest.skillFilenames.map(f => `${f}.md`));
112
- for (const entry of readdirSync(rulesDir)) {
113
- if (allowed.has(entry)) {
114
- try {
115
- unlinkSync(join(rulesDir, entry));
116
- }
117
- catch { /* best-effort */ }
118
- }
119
- }
120
- }
121
- // Remove dir if empty
122
- try {
123
- if (readdirSync(rulesDir).length === 0)
124
- rmSync(rulesDir, { recursive: true });
125
- }
126
- catch { /* best-effort */ }
127
- }
128
- }
129
- }
130
- }
@@ -1,44 +0,0 @@
1
- import type { AgentAdapter, AgentConfigOverride, AgentUsageStats, CleanupManifest, McpServerEntry, SkillFile, SkillUsageEntry } from './types.js';
2
- export declare class CodexAdapter implements AgentAdapter {
3
- name: string;
4
- slug: string;
5
- mcpProvidesSkills: boolean;
6
- detect(): Promise<boolean>;
7
- supportsMcpScope(_scope: 'project' | 'user'): boolean;
8
- supportsSkills(): boolean;
9
- writeMcpServers(servers: McpServerEntry[], _scope: 'project' | 'user'): Promise<void>;
10
- writeSkills(skills: SkillFile[], scope: 'project' | 'user'): Promise<void>;
11
- writeInstructionHint(hint: string, scope: 'project' | 'user'): Promise<void>;
12
- writeTeamInstructions(instructions: string, scope: 'project' | 'user'): Promise<void>;
13
- writeAgentConfig(config: AgentConfigOverride, scope: 'project' | 'user'): Promise<void>;
14
- cleanup(scope: 'project' | 'user', manifest?: CleanupManifest): Promise<void>;
15
- readUsageStats(lastSyncAt: string | null): Promise<AgentUsageStats | null>;
16
- readVersion(): Promise<string | null>;
17
- readSkillUsage(lastSyncAt: string | null): Promise<SkillUsageEntry[] | null>;
18
- /** Parse a rollout JSONL file for skill data */
19
- private parseRolloutForSkills;
20
- /**
21
- * Register a workspace directory in the Codex desktop app's project list.
22
- * Adds the path to electron-saved-workspace-roots, project-order, and
23
- * electron-workspace-root-labels. Skips active-workspace-roots to avoid
24
- * force-switching the user's active project.
25
- *
26
- * Returns 'written' if changes were made, 'already_registered' if the
27
- * path was already present, or 'app_running' if Codex is open and would
28
- * overwrite our changes.
29
- */
30
- registerDesktopWorkspace(workspacePath: string, label: string): 'written' | 'already_registered' | 'app_running';
31
- }
32
- /**
33
- * Codex Desktop (OpenAI's GUI app) reads its config from the same `~/.codex`
34
- * directory as the Codex CLI, so every sync/cleanup behavior inherits from
35
- * CodexAdapter unchanged. Only the identity (slug/name) and the installation
36
- * detection differ -- the desktop app is detected by application bundle
37
- * presence, not by a `codex` binary on PATH.
38
- */
39
- export declare class CodexDesktopAdapter extends CodexAdapter {
40
- name: string;
41
- slug: string;
42
- detect(): Promise<boolean>;
43
- readUsageStats(): Promise<null>;
44
- }
@@ -1,453 +0,0 @@
1
- import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'fs';
2
- import { join } from 'path';
3
- import { homedir } from 'os';
4
- import { parse, stringify } from 'smol-toml';
5
- import { buildSkillMd, appendTokenToUrl, RUNWORK_WORKSPACE_MCP_NAME } from './types.js';
6
- function isRunworkManagedCodexKey(key) {
7
- return (key === RUNWORK_WORKSPACE_MCP_NAME ||
8
- key.startsWith('runwork-') ||
9
- key.startsWith('Runwork-'));
10
- }
11
- import { writeHintToFile, writeTeamInstructionsToFile, removeHintFromFile, removeTeamInstructionsFromFile } from './utils/instruction-hint.js';
12
- import { querySqlite } from '../utils/sqlite.js';
13
- import { whichBinary, isAppRunning } from '../utils/which.js';
14
- import { runAgentDetection } from './detection.js';
15
- import { getRegistryAgent } from './registry.js';
16
- export class CodexAdapter {
17
- name = 'Codex';
18
- slug = 'codex';
19
- mcpProvidesSkills = true;
20
- async detect() {
21
- return !!whichBinary('codex');
22
- }
23
- supportsMcpScope(_scope) {
24
- return true;
25
- }
26
- supportsSkills() {
27
- return true;
28
- }
29
- async writeMcpServers(servers, _scope) {
30
- // Codex uses config.toml with [mcp_servers.*] sections
31
- const configPath = join(homedir(), '.codex', 'config.toml');
32
- let parsed = {};
33
- if (existsSync(configPath)) {
34
- parsed = parse(readFileSync(configPath, 'utf-8'));
35
- }
36
- if (!parsed.mcp_servers || typeof parsed.mcp_servers !== 'object') {
37
- parsed.mcp_servers = {};
38
- }
39
- const mcpServers = parsed.mcp_servers;
40
- // Remove existing runwork-managed entries. Handles legacy lowercase
41
- // ("runwork-foo"), sanitized PascalCase ("Runwork-foo"), and the bare
42
- // workspace-tools name ("Runwork").
43
- for (const key of Object.keys(mcpServers)) {
44
- if (isRunworkManagedCodexKey(key)) {
45
- delete mcpServers[key];
46
- }
47
- }
48
- // Add new entries (sanitize names to match Codex's ^[a-zA-Z0-9_-]+$ requirement).
49
- for (const s of servers) {
50
- const safeName = s.name.replace(/[^a-zA-Z0-9_-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
51
- const entry = { url: s.url };
52
- if (s.name === RUNWORK_WORKSPACE_MCP_NAME) {
53
- // Preserve the known-working behavior: embed the workspace key in the URL.
54
- // Codex's header-based auth was historically unreliable here, so do NOT change it.
55
- const token = s.headers?.Authorization?.replace(/^Bearer\s+/i, '');
56
- if (token)
57
- entry.url = appendTokenToUrl(s.url, token);
58
- }
59
- else if (s.headers && Object.keys(s.headers).length > 0) {
60
- // External servers: forward headers via Codex's documented http_headers field
61
- // (static literal values). These had no prior working path, so this is additive.
62
- entry.http_headers = s.headers;
63
- }
64
- mcpServers[safeName] = entry;
65
- }
66
- mkdirSync(join(configPath, '..'), { recursive: true });
67
- writeFileSync(configPath, stringify(parsed));
68
- }
69
- async writeSkills(skills, scope) {
70
- const baseDir = scope === 'project'
71
- ? join(process.cwd(), '.codex', 'skills')
72
- : join(homedir(), '.codex', 'skills');
73
- for (const skill of skills) {
74
- if (skill.name !== skill.filename) {
75
- const oldDir = join(baseDir, skill.name);
76
- if (existsSync(oldDir)) {
77
- try {
78
- rmSync(oldDir, { recursive: true, force: true });
79
- }
80
- catch { /* best-effort */ }
81
- }
82
- }
83
- const skillDir = join(baseDir, skill.filename);
84
- mkdirSync(skillDir, { recursive: true });
85
- writeFileSync(join(skillDir, 'SKILL.md'), buildSkillMd(skill));
86
- }
87
- }
88
- async writeInstructionHint(hint, scope) {
89
- const filePath = scope === 'project'
90
- ? join(process.cwd(), 'AGENTS.md')
91
- : join(homedir(), '.codex', 'AGENTS.md');
92
- writeHintToFile(filePath, hint);
93
- }
94
- async writeTeamInstructions(instructions, scope) {
95
- const filePath = scope === 'project'
96
- ? join(process.cwd(), 'AGENTS.md')
97
- : join(homedir(), '.codex', 'AGENTS.md');
98
- writeTeamInstructionsToFile(filePath, instructions);
99
- }
100
- // ── Agent config (TOML) ───────────────────────────────────────────
101
- async writeAgentConfig(config, scope) {
102
- const configPath = scope === 'project'
103
- ? join(process.cwd(), '.codex', 'config.toml')
104
- : join(homedir(), '.codex', 'config.toml');
105
- let parsed = {};
106
- if (existsSync(configPath)) {
107
- parsed = parse(readFileSync(configPath, 'utf-8'));
108
- }
109
- if (config.modelPreference) {
110
- parsed.model = config.modelPreference;
111
- }
112
- if (config.permissionRules?.defaultMode) {
113
- const modeMap = {
114
- auto: 'never',
115
- default: 'on-request',
116
- plan: 'untrusted',
117
- };
118
- parsed.approval_policy = modeMap[config.permissionRules.defaultMode] ?? config.permissionRules.defaultMode;
119
- }
120
- // Apply minimum permission floors: only upgrade, never downgrade
121
- if (config.minimumPermissions) {
122
- for (const { field, order, minimum } of config.minimumPermissions) {
123
- const current = typeof parsed[field] === 'string' ? parsed[field] : '';
124
- const currentIdx = order.indexOf(current);
125
- const minimumIdx = order.indexOf(minimum);
126
- // Upgrade if current is unknown (not in order) or more restrictive than minimum
127
- if (currentIdx < minimumIdx) {
128
- parsed[field] = minimum;
129
- }
130
- }
131
- }
132
- mkdirSync(join(configPath, '..'), { recursive: true });
133
- writeFileSync(configPath, stringify(parsed));
134
- }
135
- // ── Cleanup (uninstall) ────────────────────────────────────────────
136
- async cleanup(scope, manifest) {
137
- // 1. Remove MCP server entries from config.toml
138
- const configPath = join(homedir(), '.codex', 'config.toml');
139
- if (existsSync(configPath)) {
140
- try {
141
- const parsed = parse(readFileSync(configPath, 'utf-8'));
142
- if (parsed.mcp_servers && typeof parsed.mcp_servers === 'object') {
143
- const mcpServers = parsed.mcp_servers;
144
- for (const key of Object.keys(mcpServers)) {
145
- // Codex TOML sanitizes names via writeMcpServers, so the JSON-style
146
- // "Runwork: " prefix is never actually written here. Match the real
147
- // on-disk forms: "runwork-*" (legacy), "Runwork-*" (previous), and
148
- // the bare "Runwork" name used for workspace tools.
149
- if (isRunworkManagedCodexKey(key)) {
150
- delete mcpServers[key];
151
- }
152
- }
153
- }
154
- writeFileSync(configPath, stringify(parsed));
155
- }
156
- catch { /* best-effort */ }
157
- }
158
- // 2. Remove only skill directories that we synced (listed in manifest)
159
- const skillsDir = scope === 'project'
160
- ? join(process.cwd(), '.codex', 'skills')
161
- : join(homedir(), '.codex', 'skills');
162
- if (existsSync(skillsDir) && manifest?.skillFilenames.length) {
163
- const allowed = new Set(manifest.skillFilenames);
164
- for (const entry of readdirSync(skillsDir)) {
165
- if (!allowed.has(entry))
166
- continue;
167
- try {
168
- rmSync(join(skillsDir, entry), { recursive: true, force: true });
169
- }
170
- catch { /* best-effort */ }
171
- }
172
- }
173
- // 3. Remove instruction hints and team instructions
174
- const instructionFile = scope === 'project'
175
- ? join(process.cwd(), 'AGENTS.md')
176
- : join(homedir(), '.codex', 'AGENTS.md');
177
- removeHintFromFile(instructionFile);
178
- removeTeamInstructionsFromFile(instructionFile);
179
- }
180
- // ── Usage stats (passive, best-effort) ─────────────────────────────
181
- async readUsageStats(lastSyncAt) {
182
- try {
183
- const codexDir = join(homedir(), '.codex');
184
- if (!existsSync(codexDir))
185
- return null;
186
- const sinceMs = lastSyncAt ? new Date(lastSyncAt).getTime() : 0;
187
- const sinceSec = Math.floor(sinceMs / 1000);
188
- const dbPath = join(codexDir, 'state_5.sqlite');
189
- if (!existsSync(dbPath))
190
- return null;
191
- // Filter on updated_at, not created_at: long-lived threads can accumulate
192
- // activity post-sync without ever being "newly created". tokens_used is a
193
- // lifetime per-thread total — summing active threads here overcounts when
194
- // a thread was already partially used before lastSyncAt, but it's a far
195
- // better signal than "0 because no new threads were spawned".
196
- const countResult = querySqlite(dbPath, `SELECT count(*) FROM threads WHERE updated_at > ${sinceSec}`);
197
- const sessionCount = parseInt(countResult) || 0;
198
- const tokensResult = querySqlite(dbPath, `SELECT coalesce(sum(tokens_used), 0) FROM threads WHERE updated_at > ${sinceSec}`);
199
- const tokensUsed = parseInt(tokensResult) || 0;
200
- const latestResult = querySqlite(dbPath, `SELECT max(updated_at) FROM threads`);
201
- const latestSec = parseInt(latestResult) || 0;
202
- const versionsResult = querySqlite(dbPath, `SELECT DISTINCT cli_version FROM threads WHERE cli_version IS NOT NULL ORDER BY created_at DESC LIMIT 3`);
203
- const versions = versionsResult ? versionsResult.split(/[\r\n]+/).filter(Boolean) : [];
204
- let messageCount = 0;
205
- const historyPath = join(codexDir, 'history.jsonl');
206
- if (existsSync(historyPath)) {
207
- const content = readFileSync(historyPath, 'utf-8').trim();
208
- if (content) {
209
- for (const line of content.split(/[\r\n]+/)) {
210
- try {
211
- const entry = JSON.parse(line);
212
- if (entry.ts && entry.ts > sinceSec)
213
- messageCount++;
214
- }
215
- catch {
216
- continue;
217
- }
218
- }
219
- }
220
- }
221
- if (sessionCount === 0 && (latestSec * 1000) <= sinceMs)
222
- return null;
223
- return {
224
- hasNewActivity: sessionCount > 0,
225
- sessionCount,
226
- messageCount,
227
- toolCallCount: 0,
228
- tokensUsed,
229
- aiLinesAdded: 0,
230
- aiLinesRemoved: 0,
231
- lastActiveAt: latestSec > 0 ? new Date(latestSec * 1000).toISOString() : null,
232
- extra: versions.length > 0 ? { cliVersions: versions } : undefined,
233
- };
234
- }
235
- catch {
236
- return null;
237
- }
238
- }
239
- async readVersion() {
240
- try {
241
- const versionPath = join(homedir(), '.codex', 'version.json');
242
- if (existsSync(versionPath)) {
243
- const data = JSON.parse(readFileSync(versionPath, 'utf-8'));
244
- return data.latest_version ?? null;
245
- }
246
- }
247
- catch { /* best-effort */ }
248
- return null;
249
- }
250
- async readSkillUsage(lastSyncAt) {
251
- // Codex rollout JSONL files contain a session_meta entry whose
252
- // `instructions` field lists all skills available in the session.
253
- // Skills appear as "- name: description (file: path/SKILL.md)".
254
- // This gives us reach data (which skills were loaded), not invocation.
255
- //
256
- // Rollout files live at ~/.codex/sessions/<year>/<month>/<day>/rollout-*.jsonl
257
- // and are linked from the threads table via rollout_path.
258
- try {
259
- const sessionsDir = join(homedir(), '.codex', 'sessions');
260
- if (!existsSync(sessionsDir))
261
- return null;
262
- const sinceMs = lastSyncAt ? new Date(lastSyncAt).getTime() : 0;
263
- const skillCounts = new Map();
264
- // Walk session directories by year/month/day
265
- const walkDir = (dir) => {
266
- let entries;
267
- try {
268
- entries = readdirSync(dir);
269
- }
270
- catch {
271
- return;
272
- }
273
- for (const entry of entries) {
274
- const fullPath = join(dir, entry);
275
- if (entry.endsWith('.jsonl')) {
276
- let fileStat;
277
- try {
278
- fileStat = statSync(fullPath);
279
- }
280
- catch {
281
- continue;
282
- }
283
- if (fileStat.mtimeMs <= sinceMs)
284
- continue;
285
- this.parseRolloutForSkills(fullPath, sinceMs, skillCounts);
286
- }
287
- else {
288
- // Recurse into year/month/day subdirectories
289
- try {
290
- if (statSync(fullPath).isDirectory())
291
- walkDir(fullPath);
292
- }
293
- catch {
294
- continue;
295
- }
296
- }
297
- }
298
- };
299
- walkDir(sessionsDir);
300
- if (skillCounts.size === 0)
301
- return null;
302
- const results = [];
303
- for (const [skillName, { count, lastTs }] of skillCounts) {
304
- results.push({
305
- skillName,
306
- count,
307
- lastUsedAt: new Date(lastTs).toISOString(),
308
- });
309
- }
310
- return results;
311
- }
312
- catch {
313
- return null;
314
- }
315
- }
316
- /** Parse a rollout JSONL file for skill data */
317
- parseRolloutForSkills(filePath, sinceMs, skillCounts) {
318
- let content;
319
- try {
320
- content = readFileSync(filePath, 'utf-8');
321
- }
322
- catch {
323
- return;
324
- }
325
- for (const line of content.split('\n')) {
326
- if (!line)
327
- continue;
328
- let entry;
329
- try {
330
- entry = JSON.parse(line);
331
- }
332
- catch {
333
- continue;
334
- }
335
- if (entry.type !== 'session_meta')
336
- continue;
337
- const payload = entry.payload;
338
- if (!payload)
339
- continue;
340
- const tsRaw = entry.timestamp;
341
- const ts = typeof tsRaw === 'string' ? Date.parse(tsRaw) : 0;
342
- if (ts <= sinceMs)
343
- continue;
344
- const instructions = payload.instructions;
345
- if (typeof instructions !== 'string')
346
- continue;
347
- // Parse "- name: description (file: path/SKILL.md)" entries from the
348
- // "### Available skills" section. Skip Codex's built-in system skills
349
- // (those installed under `.system/`, e.g. skill-creator,
350
- // skill-installer) since they are bundled with the agent and would
351
- // skew adoption metrics meant to track *user-installed* skills.
352
- const skillRegex = /^- ([^:]+):\s+.+\(file:\s+(.+\/SKILL\.md)\)/gm;
353
- let match;
354
- while ((match = skillRegex.exec(instructions)) !== null) {
355
- const skillName = match[1].trim();
356
- const skillPath = match[2];
357
- if (skillPath.includes('/.system/'))
358
- continue;
359
- const existing = skillCounts.get(skillName);
360
- if (existing) {
361
- existing.count++;
362
- if (ts > existing.lastTs)
363
- existing.lastTs = ts;
364
- }
365
- else {
366
- skillCounts.set(skillName, { count: 1, lastTs: ts });
367
- }
368
- }
369
- // Only process the first session_meta per file
370
- break;
371
- }
372
- }
373
- // ── Codex Desktop app workspace registration ──────────────────────
374
- /**
375
- * Register a workspace directory in the Codex desktop app's project list.
376
- * Adds the path to electron-saved-workspace-roots, project-order, and
377
- * electron-workspace-root-labels. Skips active-workspace-roots to avoid
378
- * force-switching the user's active project.
379
- *
380
- * Returns 'written' if changes were made, 'already_registered' if the
381
- * path was already present, or 'app_running' if Codex is open and would
382
- * overwrite our changes.
383
- */
384
- registerDesktopWorkspace(workspacePath, label) {
385
- const statePath = join(homedir(), '.codex', '.codex-global-state.json');
386
- // Read current state (or start fresh if file doesn't exist)
387
- let state = {};
388
- if (existsSync(statePath)) {
389
- try {
390
- state = JSON.parse(readFileSync(statePath, 'utf-8'));
391
- }
392
- catch {
393
- return 'app_running'; // corrupt file, don't touch
394
- }
395
- }
396
- // Check if already registered in all required keys
397
- const savedRoots = (Array.isArray(state['electron-saved-workspace-roots'])
398
- ? state['electron-saved-workspace-roots'] : []);
399
- const projectOrder = (Array.isArray(state['project-order'])
400
- ? state['project-order'] : []);
401
- const labels = (state['electron-workspace-root-labels'] && typeof state['electron-workspace-root-labels'] === 'object'
402
- ? state['electron-workspace-root-labels'] : {});
403
- const inSaved = savedRoots.includes(workspacePath);
404
- const inOrder = projectOrder.includes(workspacePath);
405
- const inLabels = labels[workspacePath] === label;
406
- if (inSaved && inOrder && inLabels) {
407
- return 'already_registered';
408
- }
409
- // Codex desktop app holds this file in memory and overwrites on any state
410
- // change. Writing while it's open is futile. Check if it's running.
411
- if (isAppRunning('Codex')) {
412
- return 'app_running';
413
- }
414
- // Merge our workspace into the state
415
- if (!inSaved) {
416
- savedRoots.push(workspacePath);
417
- state['electron-saved-workspace-roots'] = savedRoots;
418
- }
419
- if (!inOrder) {
420
- projectOrder.push(workspacePath);
421
- state['project-order'] = projectOrder;
422
- }
423
- labels[workspacePath] = label;
424
- state['electron-workspace-root-labels'] = labels;
425
- mkdirSync(join(statePath, '..'), { recursive: true });
426
- writeFileSync(statePath, JSON.stringify(state));
427
- return 'written';
428
- }
429
- }
430
- /**
431
- * Codex Desktop (OpenAI's GUI app) reads its config from the same `~/.codex`
432
- * directory as the Codex CLI, so every sync/cleanup behavior inherits from
433
- * CodexAdapter unchanged. Only the identity (slug/name) and the installation
434
- * detection differ -- the desktop app is detected by application bundle
435
- * presence, not by a `codex` binary on PATH.
436
- */
437
- export class CodexDesktopAdapter extends CodexAdapter {
438
- name = 'Codex';
439
- slug = 'codex-app';
440
- async detect() {
441
- const def = getRegistryAgent('codex-app');
442
- if (!def)
443
- return false;
444
- return runAgentDetection(def.detection);
445
- }
446
- // Usage stats come from ~/.codex/state_5.sqlite, which is shared between
447
- // Codex CLI and Codex Desktop. Leaving the read here would double-count
448
- // sessions/tokens whenever both adapters are detected on the same machine.
449
- // Defer to CodexAdapter (slug 'codex') as the sole source of Codex stats.
450
- async readUsageStats() {
451
- return null;
452
- }
453
- }
@@ -1,18 +0,0 @@
1
- import type { SkillFile } from './types.js';
2
- /**
3
- * Names of every skill the CLI ships as a built-in (written to user machines
4
- * on each sync from code, never pulled from or pushed to the workspace).
5
- *
6
- * Sync uses this list to:
7
- * 1. Skip these names when computing the local-vs-remote diff so they
8
- * never appear in pull/push/conflict plans.
9
- * 2. Warn the user (and offer cleanup) if a workspace skill with the same
10
- * name exists -- it would be shadowed by the built-in locally and is
11
- * probably a stale duplicate.
12
- *
13
- * Keep this list in sync with: intro-skill.ts (`runwork`) and the two
14
- * `buildXConversationSkill` functions below.
15
- */
16
- export declare const BUILT_IN_SKILL_NAMES: ReadonlyArray<string>;
17
- export declare function buildShareConversationSkill(): SkillFile;
18
- export declare function buildSaveConversationSkill(): SkillFile;