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,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;