@claudexor/cli 3.25.1 → 4.0.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 (228) hide show
  1. package/dist/account-reset-services.d.ts +2 -2
  2. package/dist/account-reset-services.d.ts.map +1 -1
  3. package/dist/account-reset-services.js.map +1 -1
  4. package/dist/account-resource-query.d.ts +2 -2
  5. package/dist/account-resource-query.d.ts.map +1 -1
  6. package/dist/account-resource-query.js +3 -3
  7. package/dist/account-resource-query.js.map +1 -1
  8. package/dist/claude-statusline.d.ts +2 -4
  9. package/dist/claude-statusline.d.ts.map +1 -1
  10. package/dist/claude-statusline.js +6 -5
  11. package/dist/claude-statusline.js.map +1 -1
  12. package/dist/claudexord-entry.d.ts +7 -2
  13. package/dist/claudexord-entry.d.ts.map +1 -1
  14. package/dist/claudexord-entry.js +10 -3
  15. package/dist/claudexord-entry.js.map +1 -1
  16. package/dist/claudexord.d.ts +0 -1
  17. package/dist/claudexord.d.ts.map +1 -1
  18. package/dist/claudexord.js +308 -240
  19. package/dist/claudexord.js.map +1 -1
  20. package/dist/cli-error.js +3 -3
  21. package/dist/cli-error.js.map +1 -1
  22. package/dist/cli.js +4 -49
  23. package/dist/cli.js.map +1 -1
  24. package/dist/codex-quota-source.js +2 -2
  25. package/dist/codex-quota-source.js.map +1 -1
  26. package/dist/command-flags.d.ts.map +1 -1
  27. package/dist/command-flags.js +1 -0
  28. package/dist/command-flags.js.map +1 -1
  29. package/dist/command-registry.js +1 -1
  30. package/dist/command-registry.js.map +1 -1
  31. package/dist/continue-from-run.d.ts +7 -8
  32. package/dist/continue-from-run.d.ts.map +1 -1
  33. package/dist/continue-from-run.js +3 -4
  34. package/dist/continue-from-run.js.map +1 -1
  35. package/dist/control-api-address.d.ts +6 -0
  36. package/dist/control-api-address.d.ts.map +1 -0
  37. package/dist/control-api-address.js +53 -0
  38. package/dist/control-api-address.js.map +1 -0
  39. package/dist/control-services.d.ts +139 -115
  40. package/dist/control-services.d.ts.map +1 -1
  41. package/dist/control-services.js +11 -32
  42. package/dist/control-services.js.map +1 -1
  43. package/dist/daemon-admission-runtime.d.ts +0 -60
  44. package/dist/daemon-admission-runtime.d.ts.map +1 -1
  45. package/dist/daemon-admission-runtime.js +3 -168
  46. package/dist/daemon-admission-runtime.js.map +1 -1
  47. package/dist/daemon-agent-runner.d.ts +6 -3
  48. package/dist/daemon-agent-runner.d.ts.map +1 -1
  49. package/dist/daemon-agent-runner.js +2 -1
  50. package/dist/daemon-agent-runner.js.map +1 -1
  51. package/dist/daemon-lifecycle.d.ts +10 -3
  52. package/dist/daemon-lifecycle.d.ts.map +1 -1
  53. package/dist/daemon-lifecycle.js +16 -7
  54. package/dist/daemon-lifecycle.js.map +1 -1
  55. package/dist/daemon-owner.d.ts +7 -0
  56. package/dist/daemon-owner.d.ts.map +1 -0
  57. package/dist/daemon-owner.js +39 -0
  58. package/dist/daemon-owner.js.map +1 -0
  59. package/dist/daemon-run.d.ts +8 -1
  60. package/dist/daemon-run.d.ts.map +1 -1
  61. package/dist/daemon-run.js +31 -3
  62. package/dist/daemon-run.js.map +1 -1
  63. package/dist/daemon-runtime-shutdown.d.ts +1 -1
  64. package/dist/daemon-runtime-shutdown.d.ts.map +1 -1
  65. package/dist/daemon-runtime-shutdown.js +2 -2
  66. package/dist/daemon-runtime-shutdown.js.map +1 -1
  67. package/dist/daemon-startup.d.ts +5 -42
  68. package/dist/daemon-startup.d.ts.map +1 -1
  69. package/dist/daemon-startup.js +7 -85
  70. package/dist/daemon-startup.js.map +1 -1
  71. package/dist/daemon-status-report.d.ts +4 -0
  72. package/dist/daemon-status-report.d.ts.map +1 -0
  73. package/dist/daemon-status-report.js +39 -0
  74. package/dist/daemon-status-report.js.map +1 -0
  75. package/dist/engine-skew.d.ts +1 -0
  76. package/dist/engine-skew.d.ts.map +1 -1
  77. package/dist/engine-skew.js +6 -2
  78. package/dist/engine-skew.js.map +1 -1
  79. package/dist/harness-maintenance-service.d.ts +9 -222
  80. package/dist/harness-maintenance-service.d.ts.map +1 -1
  81. package/dist/harness-maintenance-service.js +7 -37
  82. package/dist/harness-maintenance-service.js.map +1 -1
  83. package/dist/live.d.ts +2 -5
  84. package/dist/live.d.ts.map +1 -1
  85. package/dist/live.js +2 -44
  86. package/dist/live.js.map +1 -1
  87. package/dist/mcp-catalog-query.d.ts +2 -1
  88. package/dist/mcp-catalog-query.d.ts.map +1 -1
  89. package/dist/mcp-catalog-query.js +6 -5
  90. package/dist/mcp-catalog-query.js.map +1 -1
  91. package/dist/mcp-daemon-unavailable.d.ts.map +1 -1
  92. package/dist/mcp-daemon-unavailable.js +4 -3
  93. package/dist/mcp-daemon-unavailable.js.map +1 -1
  94. package/dist/mcp-journal-recovery.d.ts.map +1 -1
  95. package/dist/mcp-journal-recovery.js +4 -4
  96. package/dist/mcp-journal-recovery.js.map +1 -1
  97. package/dist/mcp-runner.d.ts +1 -1
  98. package/dist/mcp-runner.d.ts.map +1 -1
  99. package/dist/mcp-runner.js +8 -6
  100. package/dist/mcp-runner.js.map +1 -1
  101. package/dist/mcp-thread-query.d.ts +1 -1
  102. package/dist/mcp-thread-query.d.ts.map +1 -1
  103. package/dist/mcp-thread-query.js +2 -2
  104. package/dist/mcp-thread-query.js.map +1 -1
  105. package/dist/model-operation-control.d.ts +375 -0
  106. package/dist/model-operation-control.d.ts.map +1 -0
  107. package/dist/model-operation-control.js +16 -0
  108. package/dist/model-operation-control.js.map +1 -0
  109. package/dist/model-services.d.ts +302 -91
  110. package/dist/model-services.d.ts.map +1 -1
  111. package/dist/model-services.js +5 -7
  112. package/dist/model-services.js.map +1 -1
  113. package/dist/ops-commands.d.ts +1 -8
  114. package/dist/ops-commands.d.ts.map +1 -1
  115. package/dist/ops-commands.js +13 -16
  116. package/dist/ops-commands.js.map +1 -1
  117. package/dist/orphan-reaper.d.ts +18 -0
  118. package/dist/orphan-reaper.d.ts.map +1 -1
  119. package/dist/orphan-reaper.js +50 -0
  120. package/dist/orphan-reaper.js.map +1 -1
  121. package/dist/plugin-cli.d.ts +3 -0
  122. package/dist/plugin-cli.d.ts.map +1 -0
  123. package/dist/plugin-cli.js +57 -0
  124. package/dist/plugin-cli.js.map +1 -0
  125. package/dist/plugin-mcp.d.ts +3 -0
  126. package/dist/plugin-mcp.d.ts.map +1 -0
  127. package/dist/plugin-mcp.js +116 -0
  128. package/dist/plugin-mcp.js.map +1 -0
  129. package/dist/plugin-runtime.d.ts +24 -0
  130. package/dist/plugin-runtime.d.ts.map +1 -0
  131. package/dist/plugin-runtime.js +113 -0
  132. package/dist/plugin-runtime.js.map +1 -0
  133. package/dist/plugins.d.ts +2 -0
  134. package/dist/plugins.d.ts.map +1 -1
  135. package/dist/plugins.js +92 -184
  136. package/dist/plugins.js.map +1 -1
  137. package/dist/project-command.d.ts +4 -1
  138. package/dist/project-command.d.ts.map +1 -1
  139. package/dist/project-command.js +14 -5
  140. package/dist/project-command.js.map +1 -1
  141. package/dist/quota-services.d.ts +6 -4
  142. package/dist/quota-services.d.ts.map +1 -1
  143. package/dist/quota-services.js +58 -23
  144. package/dist/quota-services.js.map +1 -1
  145. package/dist/recovery-control-services.d.ts +99 -0
  146. package/dist/recovery-control-services.d.ts.map +1 -0
  147. package/dist/recovery-control-services.js +32 -0
  148. package/dist/recovery-control-services.js.map +1 -0
  149. package/dist/remote-filesystem.d.ts +3 -3
  150. package/dist/remote-filesystem.d.ts.map +1 -1
  151. package/dist/remote-filesystem.js.map +1 -1
  152. package/dist/request-preflight.d.ts +2 -2
  153. package/dist/request-preflight.d.ts.map +1 -1
  154. package/dist/request-preflight.js.map +1 -1
  155. package/dist/retention-service.d.ts +3 -3
  156. package/dist/retention-service.d.ts.map +1 -1
  157. package/dist/settings-command.d.ts.map +1 -1
  158. package/dist/settings-command.js +7 -2
  159. package/dist/settings-command.js.map +1 -1
  160. package/dist/settings-service.d.ts +66 -6
  161. package/dist/settings-service.d.ts.map +1 -1
  162. package/dist/settings-service.js +1 -1
  163. package/dist/settings-service.js.map +1 -1
  164. package/dist/setup-client-pty.js +1 -1
  165. package/dist/setup-client-pty.js.map +1 -1
  166. package/dist/setup-credential-window.d.ts +4 -4
  167. package/dist/setup-credential-window.d.ts.map +1 -1
  168. package/dist/setup-credential-window.js +1 -1
  169. package/dist/setup-credential-window.js.map +1 -1
  170. package/dist/setup-device-code-disclosure.js +1 -1
  171. package/dist/setup-device-code-disclosure.js.map +1 -1
  172. package/dist/setup-job-persistence.d.ts +30 -0
  173. package/dist/setup-job-persistence.d.ts.map +1 -0
  174. package/dist/setup-job-persistence.js +3 -0
  175. package/dist/setup-job-persistence.js.map +1 -0
  176. package/dist/{setup-job-store.d.ts → setup-job-projection.d.ts} +9 -17
  177. package/dist/setup-job-projection.d.ts.map +1 -0
  178. package/dist/{setup-job-store.js → setup-job-projection.js} +29 -68
  179. package/dist/setup-job-projection.js.map +1 -0
  180. package/dist/setup-job-support.js +1 -1
  181. package/dist/setup-job-support.js.map +1 -1
  182. package/dist/setup-jobs.d.ts +3 -4
  183. package/dist/setup-jobs.d.ts.map +1 -1
  184. package/dist/setup-jobs.js +3 -3
  185. package/dist/setup-jobs.js.map +1 -1
  186. package/dist/setup-lifecycle-binding.js +1 -1
  187. package/dist/setup-lifecycle-binding.js.map +1 -1
  188. package/dist/setup-login-completion.js +1 -1
  189. package/dist/setup-login-completion.js.map +1 -1
  190. package/dist/sql-daemon-queries.d.ts +24 -0
  191. package/dist/sql-daemon-queries.d.ts.map +1 -0
  192. package/dist/sql-daemon-queries.js +41 -0
  193. package/dist/sql-daemon-queries.js.map +1 -0
  194. package/dist/sql-daemon-runtime.d.ts +1415 -0
  195. package/dist/sql-daemon-runtime.d.ts.map +1 -0
  196. package/dist/sql-daemon-runtime.js +94 -0
  197. package/dist/sql-daemon-runtime.js.map +1 -0
  198. package/dist/sql-daemon-storage.d.ts +40 -0
  199. package/dist/sql-daemon-storage.d.ts.map +1 -0
  200. package/dist/sql-daemon-storage.js +203 -0
  201. package/dist/sql-daemon-storage.js.map +1 -0
  202. package/dist/sql-import-publication.d.ts +19 -0
  203. package/dist/sql-import-publication.d.ts.map +1 -0
  204. package/dist/sql-import-publication.js +54 -0
  205. package/dist/sql-import-publication.js.map +1 -0
  206. package/dist/sql-setup-lifecycle.d.ts +15 -0
  207. package/dist/sql-setup-lifecycle.d.ts.map +1 -0
  208. package/dist/sql-setup-lifecycle.js +28 -0
  209. package/dist/sql-setup-lifecycle.js.map +1 -0
  210. package/dist/sql-setup-store.d.ts +7 -0
  211. package/dist/sql-setup-store.d.ts.map +1 -0
  212. package/dist/sql-setup-store.js +102 -0
  213. package/dist/sql-setup-store.js.map +1 -0
  214. package/dist/sql-startup-storage.d.ts +15 -0
  215. package/dist/sql-startup-storage.d.ts.map +1 -0
  216. package/dist/sql-startup-storage.js +75 -0
  217. package/dist/sql-startup-storage.js.map +1 -0
  218. package/dist/thread-delivery.d.ts +2 -2
  219. package/dist/thread-purge.d.ts +8 -2
  220. package/dist/thread-purge.d.ts.map +1 -1
  221. package/dist/thread-purge.js +37 -8
  222. package/dist/thread-purge.js.map +1 -1
  223. package/dist/thread-turn-services.d.ts +2 -2
  224. package/dist/thread-turn-services.d.ts.map +1 -1
  225. package/dist/thread-turn-services.js.map +1 -1
  226. package/package.json +25 -26
  227. package/dist/setup-job-store.d.ts.map +0 -1
  228. package/dist/setup-job-store.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-runtime.js","sourceRoot":"","sources":["../src/plugin-runtime.ts"],"names":[],"mappings":"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"}
package/dist/plugins.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { ExternalHostBinding } from "@claudexor/schema";
1
2
  export type PluginHost = "cursor" | "claude" | "codex" | "opencode";
2
3
  export type PluginTarget = PluginHost | "all";
3
4
  export type PluginVerb = "install" | "status" | "doctor" | "repair" | "uninstall";
@@ -34,6 +35,7 @@ export interface PluginCommandErrorResult {
34
35
  error: string;
35
36
  }
36
37
  export interface PluginCommandOptions {
38
+ hostBinding?: ExternalHostBinding;
37
39
  dryRun?: boolean;
38
40
  force?: boolean;
39
41
  json?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AACpE,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,KAAK,CAAC;AAC9C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAClF,MAAM,MAAM,kBAAkB,GAC5B,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7E,eAAO,MAAM,YAAY,EAAE,UAAU,EAA8C,CAAC;AACpF,eAAO,MAAM,cAAc,EAAE,YAAY,EAA6B,CAAC;AACvE,eAAO,MAAM,YAAY,EAAE,UAAU,EAA2D,CAAC;AAkEjG,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,EAAE,CAAC;IACZ,EAAE,EAAE,KAAK,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAysDD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAsB9B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAWtE;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,wBAAwB,CAU1B"}
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAa7D,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AACpE,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,KAAK,CAAC;AAC9C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAClF,MAAM,MAAM,kBAAkB,GAC5B,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7E,eAAO,MAAM,YAAY,EAAE,UAAU,EAA8C,CAAC;AACpF,eAAO,MAAM,cAAc,EAAE,YAAY,EAA6B,CAAC;AACvE,eAAO,MAAM,YAAY,EAAE,UAAU,EAA2D,CAAC;AA2DjG,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,EAAE,CAAC;IACZ,EAAE,EAAE,KAAK,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA2hDD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CA2F9B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAWtE;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,wBAAwB,CAU1B"}
package/dist/plugins.js CHANGED
@@ -1,15 +1,16 @@
1
- import { spawn } from "node:child_process";
2
- import { copyFileSync, existsSync, lstatSync, readFileSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync, } from "node:fs";
3
- import { dirname, isAbsolute, join, relative, resolve } from "node:path";
4
- import { fileURLToPath } from "node:url";
1
+ import { mcpSelfTest } from "./plugin-mcp.js";
2
+ import { copyFileSync, existsSync, lstatSync, readFileSync, readdirSync, realpathSync, rmSync, writeFileSync, } from "node:fs";
3
+ import { dirname, isAbsolute, join, relative } from "node:path";
5
4
  import { hostFallbackExamples, recoveryVerbs } from "./command-registry.js";
6
5
  import { manageClaudeStatusline } from "./claude-statusline.js";
7
- import { CLAUDEXOR_VERSION, defaultUserConfigDir, ensureDir, sha256, userConfigDir, userHomeDir, writeJson, } from "@claudexor/util";
6
+ import { CLAUDEXOR_VERSION, ensureDir, sha256, userConfigDir, userHomeDir, writeJson, } from "@claudexor/util";
7
+ import { HOST_PLUGIN_MARKER, bindingFromMcpEntry, generatedMcpEnv, launchCommand, launchShellCommand, parseHostBinding, runtimePaths, } from "./plugin-runtime.js";
8
+ import { CliError } from "./cli-error.js";
8
9
  export const PLUGIN_HOSTS = ["cursor", "claude", "codex", "opencode"];
9
10
  export const PLUGIN_TARGETS = [...PLUGIN_HOSTS, "all"];
10
11
  export const PLUGIN_VERBS = ["install", "status", "doctor", "repair", "uninstall"];
11
12
  const STATE_VERSION = 1;
12
- const MARKER = "claudexor:managed host-plugin-lifecycle";
13
+ const MARKER = HOST_PLUGIN_MARKER;
13
14
  const MCP_NAME = "claudexor";
14
15
  function managedComment(kind = "md") {
15
16
  return kind === "js"
@@ -19,30 +20,13 @@ function managedComment(kind = "md") {
19
20
  function jsonText(value) {
20
21
  return JSON.stringify(value, null, 2) + "\n";
21
22
  }
22
- function generatedMcpEnv(runtime) {
23
- const env = {
24
- CLAUDEXOR_MANAGED: MARKER,
25
- CLAUDEXOR_PLUGIN_VERSION: CLAUDEXOR_VERSION,
26
- };
27
- // A DEFAULT-root install serializes NO config root: every generation of the
28
- // CLI self-selects its own versioned default at serve time, so a stale
29
- // artifact can never freeze a newer runtime onto an older data root
30
- // (2026-07-21 incident: a 1.0.0 artifact drove 3.0.2 code against the v1
31
- // root). An EXPLICIT operator override stays serialized WITH a provenance
32
- // marker so the serve-time skew check can tell an intentional override from
33
- // a legacy frozen root.
34
- if (resolve(runtime.configDir) !== resolve(defaultUserConfigDir())) {
35
- env.CLAUDEXOR_CONFIG_DIR = runtime.configDir;
36
- env.CLAUDEXOR_ROOT_MODE = "explicit";
37
- }
38
- return env;
39
- }
40
23
  function mcpServers(runtime) {
24
+ const [command, ...args] = launchCommand(runtime);
41
25
  return {
42
26
  mcpServers: {
43
27
  [MCP_NAME]: {
44
- command: runtime.nodePath,
45
- args: [runtime.cliPath, "mcp", "serve"],
28
+ command,
29
+ args: [...args, "mcp", "serve"],
46
30
  env: generatedMcpEnv(runtime),
47
31
  },
48
32
  },
@@ -51,7 +35,7 @@ function mcpServers(runtime) {
51
35
  function opencodeMcpEntry(runtime) {
52
36
  return {
53
37
  type: "local",
54
- command: [runtime.nodePath, runtime.cliPath, "mcp", "serve"],
38
+ command: [...launchCommand(runtime), "mcp", "serve"],
55
39
  environment: generatedMcpEnv(runtime),
56
40
  enabled: true,
57
41
  timeout: 5000,
@@ -65,18 +49,9 @@ function recoveryVerbLine() {
65
49
  ? `${parts.slice(0, -1).join(", ")}, or ${parts[parts.length - 1]}`
66
50
  : (parts[0] ?? "");
67
51
  }
68
- /** POSIX single-quote shell quoting for safely copied runtime paths. */
69
- function shellQuote(value) {
70
- return `'${value.replaceAll("'", "'\\''")}'`;
71
- }
72
- /** QA-029B: validated bundled Node + CLI prefix, never a PATH-dependent bare command. */
73
- function absoluteCliPrefix(runtime) {
74
- return `${shellQuote(runtime.nodePath)} ${shellQuote(runtime.cliPath)}`;
75
- }
76
- /** Make registry fallback templates executable with the validated absolute CLI prefix. */
52
+ /** CLI fallbacks share the MCP launch binding, including root and lifecycle. */
77
53
  function hostFallbackCommands(runtime) {
78
- const prefix = absoluteCliPrefix(runtime);
79
- return hostFallbackExamples().map((example) => example.replace(/^claudexor\b/, () => prefix));
54
+ return hostFallbackExamples().map((example) => launchShellCommand(runtime, example.replace(/^claudexor\s+/, "")));
80
55
  }
81
56
  /** Exact Claude plugin skill invocation; plain `/claudexor` is not an alias (QA-029A). */
82
57
  const CLAUDE_SLASH_COMMAND = "/claudexor:claudexor";
@@ -110,6 +85,7 @@ function skillText(host, runtime) {
110
85
  "",
111
86
  "When the host cannot call MCP tools, ask the user to run the local CLI explicitly (these are the exact executable commands for this install — not a bare `claudexor`, which may not be on the terminal PATH):",
112
87
  "",
88
+ ...(process.platform === "win32" ? ["Run these commands in PowerShell:"] : []),
113
89
  ...hostFallbackCommands(runtime).map((command) => `\`${command}\``),
114
90
  "",
115
91
  MCP_RUN_HANDLE_GUIDANCE,
@@ -154,6 +130,7 @@ function commandText(host, runtime) {
154
130
  "",
155
131
  "First prefer the available MCP tools named `claudexor_*`. If MCP tools are unavailable, tell the user the exact executable local CLI command to run (absolute paths for this install — never a bare `claudexor`, which may not be on the terminal PATH), such as:",
156
132
  "",
133
+ ...(process.platform === "win32" ? ["Run these commands in PowerShell:"] : []),
157
134
  ...hostFallbackCommands(runtime).map((command) => `- \`${command.replace('"..."', '"$ARGUMENTS"')}\``),
158
135
  "",
159
136
  MCP_RUN_HANDLE_GUIDANCE,
@@ -255,7 +232,7 @@ function manifest(kind) {
255
232
  }
256
233
  function opencodePluginText(runtime) {
257
234
  const hint = "Use Claudexor MCP tools or run `claudexor plan/agent/best-of` when cross-harness orchestration, review, or evidence-backed execution is useful.";
258
- return `${managedComment("js")}export const ClaudexorPlugin = async () => {\n const hint = ${JSON.stringify(hint)};\n return {\n \"experimental.chat.system.transform\": async (_input, output) => {\n if (!output || typeof output !== \"object\") return;\n const current = typeof output.system === \"string\" ? output.system : typeof output.prompt === \"string\" ? output.prompt : \"\";\n if (current.includes(\"Claudexor\")) return;\n if (typeof output.system === \"string\") output.system = output.system + \"\\n\\n\" + hint;\n else if (typeof output.prompt === \"string\") output.prompt = output.prompt + \"\\n\\n\" + hint;\n },\n };\n};\n\nexport default ClaudexorPlugin;\n\n// OpenCode hook note: uses experimental.chat.system.transform because OpenCode does not expose tui.prompt.append as a plugin hook.\n// MCP command: ${runtime.nodePath} ${runtime.cliPath} mcp serve\n`;
235
+ return `${managedComment("js")}export const ClaudexorPlugin = async () => {\n const hint = ${JSON.stringify(hint)};\n return {\n \"experimental.chat.system.transform\": async (_input, output) => {\n if (!output || typeof output !== \"object\") return;\n const current = typeof output.system === \"string\" ? output.system : typeof output.prompt === \"string\" ? output.prompt : \"\";\n if (current.includes(\"Claudexor\")) return;\n if (typeof output.system === \"string\") output.system = output.system + \"\\n\\n\" + hint;\n else if (typeof output.prompt === \"string\") output.prompt = output.prompt + \"\\n\\n\" + hint;\n },\n };\n};\n\nexport default ClaudexorPlugin;\n\n// OpenCode hook note: uses experimental.chat.system.transform because OpenCode does not expose tui.prompt.append as a plugin hook.\n// MCP command: ${launchShellCommand(runtime, "mcp serve")}\n`;
259
236
  }
260
237
  const HOST_DEFINITIONS = {
261
238
  claude: {
@@ -283,6 +260,7 @@ const HOST_DEFINITIONS = {
283
260
  },
284
261
  {
285
262
  path: join(root, ".mcp.json"),
263
+ mcp: true,
286
264
  content: jsonText(mcpServers(runtime)),
287
265
  description: "Claude MCP config",
288
266
  },
@@ -323,6 +301,7 @@ const HOST_DEFINITIONS = {
323
301
  },
324
302
  {
325
303
  path: join(root, ".mcp.json"),
304
+ mcp: true,
326
305
  content: jsonText(mcpServers(runtime)),
327
306
  description: "Codex MCP config",
328
307
  },
@@ -369,6 +348,7 @@ const HOST_DEFINITIONS = {
369
348
  },
370
349
  {
371
350
  path: join(root, "mcp.json"),
351
+ mcp: true,
372
352
  content: jsonText(mcpServers(runtime)),
373
353
  description: "Cursor MCP config",
374
354
  },
@@ -426,32 +406,6 @@ const HOST_DEFINITIONS = {
426
406
  reloadNote: "Restart OpenCode; global plugins, commands, skills, and MCP config load from ~/.config/opencode. The JS plugin uses OpenCode's experimental.chat.system.transform hook.",
427
407
  },
428
408
  };
429
- function runtimePaths() {
430
- const home = userHomeDir();
431
- const configDir = userConfigDir();
432
- const warnings = [];
433
- const allowTestOverrides = process.env.VITEST === "true" || process.env.NODE_ENV === "test";
434
- const envNode = allowTestOverrides ? process.env.CLAUDEXOR_NODE_PATH?.trim() : undefined;
435
- const bundledNode = join(home, ".claudexor", "node", "bin", "node");
436
- const nodePath = envNode || (existsSync(bundledNode) ? bundledNode : process.execPath);
437
- if (!isAbsolute(nodePath) || !existsSync(nodePath) || !statSync(nodePath).isFile()) {
438
- throw new Error(`unable to resolve a safe Node executable for plugin MCP config: ${nodePath}`);
439
- }
440
- if (!envNode && nodePath !== bundledNode)
441
- warnings.push(`using current node instead of ${bundledNode}`);
442
- if (!allowTestOverrides && process.env.CLAUDEXOR_NODE_PATH?.trim())
443
- warnings.push("ignored CLAUDEXOR_NODE_PATH outside tests");
444
- const envCli = allowTestOverrides ? process.env.CLAUDEXOR_CLI_PATH?.trim() : undefined;
445
- const distCli = join(dirname(fileURLToPath(import.meta.url)), "cli.js");
446
- const argvCli = process.argv[1] && existsSync(resolve(process.argv[1])) ? resolve(process.argv[1]) : "";
447
- const cliPath = envCli || (existsSync(distCli) ? distCli : argvCli);
448
- if (!cliPath || !isAbsolute(cliPath) || !existsSync(cliPath) || !statSync(cliPath).isFile()) {
449
- throw new Error("unable to resolve a safe absolute claudexor CLI entrypoint");
450
- }
451
- if (!allowTestOverrides && process.env.CLAUDEXOR_CLI_PATH?.trim())
452
- warnings.push("ignored CLAUDEXOR_CLI_PATH outside tests");
453
- return { home, configDir, nodePath, cliPath, backupStamp: safeTimestamp(), warnings };
454
- }
455
409
  function stateFilePath(configDir = userConfigDir()) {
456
410
  return join(configDir, "plugins", "state.json");
457
411
  }
@@ -477,6 +431,10 @@ function loadState(configDir = userConfigDir()) {
477
431
  }
478
432
  const state = parsed;
479
433
  state.hosts ??= {};
434
+ for (const entry of Object.values(state.hosts)) {
435
+ if (entry?.binding !== undefined)
436
+ entry.binding = parseHostBinding(entry.binding);
437
+ }
480
438
  return state;
481
439
  }
482
440
  function saveState(state, configDir = userConfigDir()) {
@@ -780,9 +738,6 @@ function isLegacyOwned(target) {
780
738
  function backupRoot(def, runtime) {
781
739
  return join(def.root(runtime.home), ".claudexor-backups", runtime.backupStamp);
782
740
  }
783
- function safeTimestamp() {
784
- return new Date().toISOString().replace(/[:.]/g, "-");
785
- }
786
741
  function backupFile(def, runtime, path) {
787
742
  assertSafeLeaf(path);
788
743
  const dest = join(backupRoot(def, runtime), relative(runtime.home, path));
@@ -1276,117 +1231,6 @@ function removeVerifiedLegacy(def, dryRun, res) {
1276
1231
  }
1277
1232
  return true;
1278
1233
  }
1279
- async function mcpSelfTest(runtime) {
1280
- return await new Promise((resolve) => {
1281
- const child = spawn(runtime.nodePath, [runtime.cliPath, "mcp", "serve"], {
1282
- cwd: process.cwd(),
1283
- env: mcpSelfTestEnv(runtime),
1284
- stdio: ["pipe", "pipe", "pipe"],
1285
- });
1286
- let stdout = "";
1287
- let pending = "";
1288
- const lines = [];
1289
- let stderr = "";
1290
- let sentToolsList = false;
1291
- let settled = false;
1292
- const timer = setTimeout(() => {
1293
- settled = true;
1294
- child.kill("SIGKILL");
1295
- resolve("MCP self-test timed out");
1296
- }, 5000);
1297
- child.stdout.on("data", (d) => {
1298
- if (settled)
1299
- return;
1300
- const chunk = String(d);
1301
- stdout += chunk;
1302
- pending += chunk;
1303
- const frames = pending.split("\n");
1304
- pending = frames.pop() ?? "";
1305
- try {
1306
- for (const frame of frames.filter(Boolean))
1307
- lines.push(JSON.parse(frame));
1308
- const init = lines.find((line) => line && typeof line === "object" && line.id === 1);
1309
- if (init?.result?.serverInfo?.name && !sentToolsList) {
1310
- sentToolsList = true;
1311
- child.stdin.write(JSON.stringify({ jsonrpc: "2.0", method: "notifications/initialized", params: {} }) +
1312
- "\n");
1313
- child.stdin.write(JSON.stringify({ jsonrpc: "2.0", id: 2, method: "tools/list", params: {} }) + "\n");
1314
- }
1315
- const tools = lines.find((line) => line && typeof line === "object" && line.id === 2);
1316
- if (tools && !settled) {
1317
- settled = true;
1318
- const listed = tools.result?.tools;
1319
- clearTimeout(timer);
1320
- child.kill("SIGTERM");
1321
- if (Array.isArray(listed) &&
1322
- listed.some((t) => t.name === "claudexor_status")) {
1323
- resolve(null);
1324
- }
1325
- else {
1326
- resolve("MCP self-test returned an unexpected tools-list response");
1327
- }
1328
- }
1329
- }
1330
- catch (err) {
1331
- if (!settled && stdout.includes("\n")) {
1332
- settled = true;
1333
- clearTimeout(timer);
1334
- child.kill("SIGTERM");
1335
- resolve(`MCP self-test response parse failed: ${err instanceof Error ? err.message : String(err)}`);
1336
- }
1337
- }
1338
- });
1339
- child.stderr.on("data", (d) => {
1340
- stderr += String(d);
1341
- });
1342
- child.on("error", (err) => {
1343
- if (settled)
1344
- return;
1345
- settled = true;
1346
- clearTimeout(timer);
1347
- resolve(`MCP self-test failed to start: ${err.message}`);
1348
- });
1349
- child.on("exit", (code) => {
1350
- if (settled)
1351
- return;
1352
- settled = true;
1353
- clearTimeout(timer);
1354
- if (!stdout)
1355
- resolve(`MCP self-test exited before response (${code ?? "signal"}): ${stderr.trim()}`);
1356
- else
1357
- resolve(`MCP self-test exited before tools-list completed (${code ?? "signal"}): ${stderr.trim()}`);
1358
- });
1359
- child.stdin.write(JSON.stringify({
1360
- jsonrpc: "2.0",
1361
- id: 1,
1362
- method: "initialize",
1363
- params: {
1364
- protocolVersion: "2025-06-18",
1365
- capabilities: {},
1366
- clientInfo: { name: "claudexor-plugin-doctor", version: CLAUDEXOR_VERSION },
1367
- },
1368
- }) + "\n");
1369
- });
1370
- }
1371
- function mcpSelfTestEnv(runtime) {
1372
- const env = {};
1373
- for (const key of [
1374
- "HOME",
1375
- "PATH",
1376
- "CLAUDEXOR_CONFIG_DIR",
1377
- "TMPDIR",
1378
- "TMP",
1379
- "TEMP",
1380
- "LANG",
1381
- "LC_ALL",
1382
- ]) {
1383
- const value = process.env[key];
1384
- if (value)
1385
- env[key] = value;
1386
- }
1387
- Object.assign(env, generatedMcpEnv(runtime));
1388
- return env;
1389
- }
1390
1234
  function verbNote(def, verb) {
1391
1235
  if (verb === "uninstall")
1392
1236
  return `${def.displayName} integration removed from managed Claudexor files/config; restart the host to unload cached plugin state.`;
@@ -1526,14 +1370,78 @@ export async function runPluginCommand(verb, target, options = {}) {
1526
1370
  throw new Error(`unknown plugin command '${verb}'`);
1527
1371
  if (!PLUGIN_TARGETS.includes(target))
1528
1372
  throw new Error(`unknown plugin target '${target}' (expected ${PLUGIN_TARGETS.join("|")})`);
1529
- const runtime = runtimePaths();
1530
- const state = loadState(runtime.configDir);
1373
+ if (options.hostBinding && verb !== "install" && verb !== "repair")
1374
+ throw new CliError("usage", "--host-binding-json is supported by plugin install and repair", {
1375
+ code: "invalid_argument",
1376
+ });
1377
+ const explicit = options.hostBinding === undefined ? undefined : parseHostBinding(options.hostBinding);
1378
+ const runtime = runtimePaths(explicit);
1379
+ const states = new Map();
1380
+ const stateAt = (root) => {
1381
+ let state = states.get(root);
1382
+ if (!state) {
1383
+ state = loadState(root);
1384
+ states.set(root, state);
1385
+ }
1386
+ return state;
1387
+ };
1531
1388
  const results = [];
1532
1389
  for (const host of targets(target)) {
1533
- results.push(await runHost(HOST_DEFINITIONS[host], verb, options, state, runtime));
1390
+ const def = HOST_DEFINITIONS[host];
1391
+ try {
1392
+ const artifacts = def.artifacts(runtime.home, runtime);
1393
+ const path = def.config === "opencode-mcp"
1394
+ ? chooseOpenCodeConfigPath()
1395
+ : artifacts.find((artifact) => artifact.mcp)?.path;
1396
+ let source;
1397
+ try {
1398
+ source = path ? readJsonFile(path) : undefined;
1399
+ }
1400
+ catch (error) {
1401
+ // Existing artifact ownership can repair damaged JSON, but an unrelated
1402
+ // invocation cannot infer a lost external root from malformed bytes.
1403
+ if (!explicit && !stateAt(runtime.configDir).hosts[host])
1404
+ throw error;
1405
+ }
1406
+ let installed;
1407
+ try {
1408
+ installed = bindingFromMcpEntry(def.config === "opencode-mcp" ? source?.mcp?.[MCP_NAME] : source?.mcpServers?.[MCP_NAME]);
1409
+ }
1410
+ catch (error) {
1411
+ if (!explicit)
1412
+ throw error;
1413
+ }
1414
+ const priorState = stateAt(installed?.configDir ?? runtime.configDir);
1415
+ const recorded = priorState.hosts[host]?.binding;
1416
+ const binding = explicit ?? recorded ?? installed;
1417
+ if (!binding &&
1418
+ artifacts.some((artifact) => {
1419
+ const text = readText(artifact.path);
1420
+ return text?.includes(MARKER) && text.includes("CLAUDEXOR_DAEMON_OWNER='external'");
1421
+ }))
1422
+ throw new CliError("usage", "external host binding is missing; register it with --host-binding-json", { code: "host_binding_missing" });
1423
+ const selected = binding ? runtimePaths(binding) : runtime;
1424
+ if (installed && installed.configDir !== selected.configDir)
1425
+ selected.previousConfigDir = installed.configDir;
1426
+ const state = stateAt(selected.configDir);
1427
+ if (state !== priorState && !state.hosts[host] && priorState.hosts[host])
1428
+ state.hosts[host] = structuredClone(priorState.hosts[host]);
1429
+ const res = await runHost(def, verb, options, state, selected);
1430
+ if (installed && !recorded && !explicit)
1431
+ res.notes.push("recovered external host binding from the installed MCP configuration");
1432
+ if (!options.dryRun && (verb === "install" || verb === "repair") && res.ok && binding)
1433
+ hostState(state, host).binding = binding;
1434
+ results.push(res);
1435
+ if (!options.dryRun && (verb === "install" || verb === "repair" || verb === "uninstall"))
1436
+ saveState(state, selected.configDir);
1437
+ }
1438
+ catch (error) {
1439
+ const res = initialResult(def, verb, runtime);
1440
+ res.state = "blocked";
1441
+ res.errors.push(error instanceof Error ? error.message : String(error));
1442
+ results.push(res);
1443
+ }
1534
1444
  }
1535
- if (!options.dryRun && (verb === "install" || verb === "repair" || verb === "uninstall"))
1536
- saveState(state, runtime.configDir);
1537
1445
  const result = {
1538
1446
  verb,
1539
1447
  target,