@ken-jo/agent-connector 0.4.79 → 0.4.92

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 (200) hide show
  1. package/README.md +302 -561
  2. package/dist/{action-OHGFVKMC.js → action-CVIEPX4U.js} +14 -14
  3. package/dist/{amazon-q-B52EY2SV.js → amazon-q-TIT7FIW3.js} +5 -5
  4. package/dist/{amp-UXABVUKC.js → amp-NF3OAAUG.js} +5 -5
  5. package/dist/{antigravity-RZHN53VB.js → antigravity-7LPK7QOY.js} +6 -6
  6. package/dist/antigravity-cli-MDEMPPAH.js +467 -0
  7. package/dist/antigravity-cli-MDEMPPAH.js.map +1 -0
  8. package/dist/{chunk-QKLJU4JX.js → chunk-2Y2MZRLP.js} +56 -2
  9. package/dist/chunk-2Y2MZRLP.js.map +1 -0
  10. package/dist/{chunk-UBB7T54N.js → chunk-3C5AASHM.js} +3 -3
  11. package/dist/{chunk-LKAVD4HP.js → chunk-447JWFZO.js} +12 -12
  12. package/dist/{chunk-HORHRHNG.js → chunk-4NHXLXSD.js} +2 -2
  13. package/dist/chunk-5Z36KVU2.js +590 -0
  14. package/dist/chunk-5Z36KVU2.js.map +1 -0
  15. package/dist/{chunk-AY3RGRTT.js → chunk-6TF7MHG5.js} +2 -2
  16. package/dist/{chunk-AMK2K6XZ.js → chunk-7UT6OB52.js} +2 -2
  17. package/dist/{chunk-PZHB5TVA.js → chunk-AY3VFNOH.js} +5 -5
  18. package/dist/{chunk-4HVQ7IUM.js → chunk-DI5S6TXJ.js} +17 -4
  19. package/dist/chunk-DI5S6TXJ.js.map +1 -0
  20. package/dist/{chunk-ZXX5DVSE.js → chunk-FBCBHEGB.js} +8 -8
  21. package/dist/{chunk-4NSU3KWX.js → chunk-FJCUKXGX.js} +2 -2
  22. package/dist/{chunk-S4E6QQEM.js → chunk-FO5CEXXN.js} +7 -2
  23. package/dist/chunk-FO5CEXXN.js.map +1 -0
  24. package/dist/{chunk-IXOQDZWC.js → chunk-GZGLCCEE.js} +5 -1
  25. package/dist/chunk-GZGLCCEE.js.map +1 -0
  26. package/dist/{chunk-UYZ53KWS.js → chunk-IBLYVAWH.js} +31 -9
  27. package/dist/chunk-IBLYVAWH.js.map +1 -0
  28. package/dist/{chunk-4FWETID5.js → chunk-IVAWP6HH.js} +2 -2
  29. package/dist/{chunk-NBUEL74R.js → chunk-JFXL4HYA.js} +3 -3
  30. package/dist/{chunk-VD4EG6SG.js → chunk-JO2IM2JL.js} +538 -226
  31. package/dist/chunk-JO2IM2JL.js.map +1 -0
  32. package/dist/{chunk-7NXEHZAK.js → chunk-JVO6NBTT.js} +3 -3
  33. package/dist/{chunk-X457NOFE.js → chunk-KA55FISM.js} +116 -36
  34. package/dist/chunk-KA55FISM.js.map +1 -0
  35. package/dist/{chunk-YJP3KGLM.js → chunk-L26PSQTY.js} +4 -4
  36. package/dist/{chunk-YYNXIUR2.js → chunk-M2H7JURF.js} +2 -2
  37. package/dist/{chunk-56R2ER7K.js → chunk-NBYKLUF6.js} +2 -2
  38. package/dist/{chunk-IRUYJD23.js → chunk-NLE2J5P4.js} +1 -1
  39. package/dist/{chunk-VVFDU4IX.js → chunk-WFEHWTLM.js} +12 -5
  40. package/dist/{chunk-VVFDU4IX.js.map → chunk-WFEHWTLM.js.map} +1 -1
  41. package/dist/{chunk-LN76OGNR.js → chunk-Z2MRSS2I.js} +2 -2
  42. package/dist/{claude-code-T6ZRCMA7.js → claude-code-7RS4YVGZ.js} +9 -9
  43. package/dist/cli/sdk.js +7 -7
  44. package/dist/cli.js +1 -1
  45. package/dist/{cline-NNMVCECA.js → cline-BZQAUYPC.js} +5 -5
  46. package/dist/codebuddy-G42IKGKB.js +643 -0
  47. package/dist/codebuddy-G42IKGKB.js.map +1 -0
  48. package/dist/{codebuff-RJIDSEU3.js → codebuff-5RLTLZAU.js} +5 -5
  49. package/dist/{codex-RHKQKNNG.js → codex-XHAMJILX.js} +14 -8
  50. package/dist/{codex-RHKQKNNG.js.map → codex-XHAMJILX.js.map} +1 -1
  51. package/dist/{continue-MNM7YVJY.js → continue-JLIB7R7X.js} +6 -6
  52. package/dist/{copilot-cli-SMTX5F65.js → copilot-cli-XZSUYNQZ.js} +5 -5
  53. package/dist/{crush-NYDBHIJE.js → crush-ESERLVLT.js} +5 -5
  54. package/dist/{cursor-AOELDNZU.js → cursor-FUDOV5VK.js} +6 -6
  55. package/dist/{detect-ALAKE54S.js → detect-Z5BDTY6B.js} +4 -4
  56. package/dist/devin-Y7PWKVHY.js +510 -0
  57. package/dist/devin-Y7PWKVHY.js.map +1 -0
  58. package/dist/{doctor-UNF7FCF4.js → doctor-GAP27PP2.js} +27 -23
  59. package/dist/doctor-GAP27PP2.js.map +1 -0
  60. package/dist/{droid-PTCH2K7Y.js → droid-DTO5POTK.js} +5 -5
  61. package/dist/{gemini-cli-QGLN2UMS.js → gemini-cli-RBIG6U2F.js} +5 -5
  62. package/dist/{goose-DQ6GSZ5O.js → goose-VGNOP5J2.js} +6 -6
  63. package/dist/grok-cli-2RFBK6J3.js +482 -0
  64. package/dist/grok-cli-2RFBK6J3.js.map +1 -0
  65. package/dist/{hermes-E47IG63A.js → hermes-NUKFWZI5.js} +6 -6
  66. package/dist/{hook-GM2IDA3C.js → hook-XPR3AHDI.js} +14 -14
  67. package/dist/index.d.ts +2 -2
  68. package/dist/index.js +5 -5
  69. package/dist/install-O32TDIZP.js +382 -0
  70. package/dist/install-O32TDIZP.js.map +1 -0
  71. package/dist/{introspect-5o5ick0_.d.ts → introspect-BkId4LGP.d.ts} +1 -1
  72. package/dist/{jetbrains-copilot-4IOT3I2Y.js → jetbrains-copilot-FXZ5AOTS.js} +31 -9
  73. package/dist/jetbrains-copilot-FXZ5AOTS.js.map +1 -0
  74. package/dist/junie-TSXIZSCE.js +227 -0
  75. package/dist/junie-TSXIZSCE.js.map +1 -0
  76. package/dist/{kilo-TAHOPT2Q.js → kilo-JLH3KVZJ.js} +8 -8
  77. package/dist/{kilo-cli-X4NPJWGX.js → kilo-cli-5W36VJQZ.js} +8 -8
  78. package/dist/{kimi-Z7L2LEEI.js → kimi-R62W7HKZ.js} +5 -5
  79. package/dist/{kiro-YZ4TTZGD.js → kiro-AUJMGIBL.js} +81 -6
  80. package/dist/kiro-AUJMGIBL.js.map +1 -0
  81. package/dist/{leaderboard-DVW4WYJ6.js → leaderboard-YWMOSJBC.js} +7 -7
  82. package/dist/{mimo-code-G2CBZ4M6.js → mimo-code-PGLFFVER.js} +5 -5
  83. package/dist/mistral-vibe-36CZVQNQ.js +300 -0
  84. package/dist/mistral-vibe-36CZVQNQ.js.map +1 -0
  85. package/dist/{mux-JNM3F2NW.js → mux-HWL4N5KH.js} +5 -5
  86. package/dist/{nemoclaw-SHA4IUML.js → nemoclaw-QPHETUXM.js} +6 -6
  87. package/dist/{omp-OOVUNXME.js → omp-3TFMTJ5U.js} +5 -5
  88. package/dist/open-interpreter-UTBKE2EH.js +264 -0
  89. package/dist/open-interpreter-UTBKE2EH.js.map +1 -0
  90. package/dist/openclaw-RYFO5TLY.js +17 -0
  91. package/dist/{opencode-W2RK4M7G.js → opencode-JX7GBE5Q.js} +5 -5
  92. package/dist/openhands-AZW4PXJ3.js +384 -0
  93. package/dist/openhands-AZW4PXJ3.js.map +1 -0
  94. package/dist/{package-H5V3AZHR.js → package-2KKUGZFS.js} +13 -13
  95. package/dist/{pi-I7BLL4EI.js → pi-MRI3EBWU.js} +143 -6
  96. package/dist/pi-MRI3EBWU.js.map +1 -0
  97. package/dist/{qwen-code-JG7AF442.js → qwen-code-ISR6BEET.js} +9 -9
  98. package/dist/{roo-code-L5F7S6QH.js → roo-code-6TSCME4R.js} +5 -5
  99. package/dist/runtime/index.d.ts +1 -1
  100. package/dist/runtime/index.js +12 -12
  101. package/dist/sdk/index.d.ts +3 -3
  102. package/dist/sdk/index.js +6 -6
  103. package/dist/sdk/test.d.ts +2 -2
  104. package/dist/sdk/test.js +10 -10
  105. package/dist/{serve-WMO2TUW3.js → serve-EPRN7F2X.js} +14 -14
  106. package/dist/{status-WRLBTBRE.js → status-B2PG6YKR.js} +11 -11
  107. package/dist/{statusline-EUD4DMIP.js → statusline-5ERFMYSM.js} +13 -13
  108. package/dist/{telemetry-U3LGMR3D.js → telemetry-ZMCAWBWB.js} +10 -10
  109. package/dist/{trae-Z7CQ2A2Q.js → trae-7KDCYIMN.js} +5 -5
  110. package/dist/{types-D6RWGXm1.d.ts → types-D0RqWxT8.d.ts} +53 -9
  111. package/dist/{uninstall-TWPUEJEC.js → uninstall-M76BHLTH.js} +37 -27
  112. package/dist/uninstall-M76BHLTH.js.map +1 -0
  113. package/dist/{upgrade-EM6Y7QLH.js → upgrade-JLSCNAQA.js} +25 -19
  114. package/dist/upgrade-JLSCNAQA.js.map +1 -0
  115. package/dist/{usage-3HQDTXGY.js → usage-5I72HWCR.js} +3 -3
  116. package/dist/{usage-event-DWIGKO7V.js → usage-event-HIX4ZI45.js} +13 -13
  117. package/dist/{vscode-copilot-LU5NC4ZS.js → vscode-copilot-LILHAPJI.js} +20 -5
  118. package/dist/vscode-copilot-LILHAPJI.js.map +1 -0
  119. package/dist/{warp-4PPG5LOM.js → warp-KJUCWEA3.js} +5 -5
  120. package/dist/{windsurf-3T3RVXKM.js → windsurf-5TGGQR5I.js} +5 -5
  121. package/dist/{zed-LLOAUXSA.js → zed-EL3JCZ25.js} +123 -7
  122. package/dist/zed-EL3JCZ25.js.map +1 -0
  123. package/package.json +1 -1
  124. package/dist/antigravity-cli-KODEKUTM.js +0 -87
  125. package/dist/antigravity-cli-KODEKUTM.js.map +0 -1
  126. package/dist/chunk-4HVQ7IUM.js.map +0 -1
  127. package/dist/chunk-IXOQDZWC.js.map +0 -1
  128. package/dist/chunk-QKLJU4JX.js.map +0 -1
  129. package/dist/chunk-S4E6QQEM.js.map +0 -1
  130. package/dist/chunk-UYZ53KWS.js.map +0 -1
  131. package/dist/chunk-VD4EG6SG.js.map +0 -1
  132. package/dist/chunk-VKRGQLY4.js +0 -201
  133. package/dist/chunk-VKRGQLY4.js.map +0 -1
  134. package/dist/chunk-X457NOFE.js.map +0 -1
  135. package/dist/doctor-UNF7FCF4.js.map +0 -1
  136. package/dist/install-7O4XWH7T.js +0 -96
  137. package/dist/install-7O4XWH7T.js.map +0 -1
  138. package/dist/jetbrains-copilot-4IOT3I2Y.js.map +0 -1
  139. package/dist/kiro-YZ4TTZGD.js.map +0 -1
  140. package/dist/openclaw-BD56E5MV.js +0 -17
  141. package/dist/pi-I7BLL4EI.js.map +0 -1
  142. package/dist/uninstall-TWPUEJEC.js.map +0 -1
  143. package/dist/upgrade-EM6Y7QLH.js.map +0 -1
  144. package/dist/vscode-copilot-LU5NC4ZS.js.map +0 -1
  145. package/dist/zed-LLOAUXSA.js.map +0 -1
  146. /package/dist/{action-OHGFVKMC.js.map → action-CVIEPX4U.js.map} +0 -0
  147. /package/dist/{amazon-q-B52EY2SV.js.map → amazon-q-TIT7FIW3.js.map} +0 -0
  148. /package/dist/{amp-UXABVUKC.js.map → amp-NF3OAAUG.js.map} +0 -0
  149. /package/dist/{antigravity-RZHN53VB.js.map → antigravity-7LPK7QOY.js.map} +0 -0
  150. /package/dist/{chunk-UBB7T54N.js.map → chunk-3C5AASHM.js.map} +0 -0
  151. /package/dist/{chunk-LKAVD4HP.js.map → chunk-447JWFZO.js.map} +0 -0
  152. /package/dist/{chunk-HORHRHNG.js.map → chunk-4NHXLXSD.js.map} +0 -0
  153. /package/dist/{chunk-AY3RGRTT.js.map → chunk-6TF7MHG5.js.map} +0 -0
  154. /package/dist/{chunk-AMK2K6XZ.js.map → chunk-7UT6OB52.js.map} +0 -0
  155. /package/dist/{chunk-PZHB5TVA.js.map → chunk-AY3VFNOH.js.map} +0 -0
  156. /package/dist/{chunk-ZXX5DVSE.js.map → chunk-FBCBHEGB.js.map} +0 -0
  157. /package/dist/{chunk-4NSU3KWX.js.map → chunk-FJCUKXGX.js.map} +0 -0
  158. /package/dist/{chunk-4FWETID5.js.map → chunk-IVAWP6HH.js.map} +0 -0
  159. /package/dist/{chunk-NBUEL74R.js.map → chunk-JFXL4HYA.js.map} +0 -0
  160. /package/dist/{chunk-7NXEHZAK.js.map → chunk-JVO6NBTT.js.map} +0 -0
  161. /package/dist/{chunk-YJP3KGLM.js.map → chunk-L26PSQTY.js.map} +0 -0
  162. /package/dist/{chunk-YYNXIUR2.js.map → chunk-M2H7JURF.js.map} +0 -0
  163. /package/dist/{chunk-56R2ER7K.js.map → chunk-NBYKLUF6.js.map} +0 -0
  164. /package/dist/{chunk-IRUYJD23.js.map → chunk-NLE2J5P4.js.map} +0 -0
  165. /package/dist/{chunk-LN76OGNR.js.map → chunk-Z2MRSS2I.js.map} +0 -0
  166. /package/dist/{claude-code-T6ZRCMA7.js.map → claude-code-7RS4YVGZ.js.map} +0 -0
  167. /package/dist/{cline-NNMVCECA.js.map → cline-BZQAUYPC.js.map} +0 -0
  168. /package/dist/{codebuff-RJIDSEU3.js.map → codebuff-5RLTLZAU.js.map} +0 -0
  169. /package/dist/{continue-MNM7YVJY.js.map → continue-JLIB7R7X.js.map} +0 -0
  170. /package/dist/{copilot-cli-SMTX5F65.js.map → copilot-cli-XZSUYNQZ.js.map} +0 -0
  171. /package/dist/{crush-NYDBHIJE.js.map → crush-ESERLVLT.js.map} +0 -0
  172. /package/dist/{cursor-AOELDNZU.js.map → cursor-FUDOV5VK.js.map} +0 -0
  173. /package/dist/{detect-ALAKE54S.js.map → detect-Z5BDTY6B.js.map} +0 -0
  174. /package/dist/{droid-PTCH2K7Y.js.map → droid-DTO5POTK.js.map} +0 -0
  175. /package/dist/{gemini-cli-QGLN2UMS.js.map → gemini-cli-RBIG6U2F.js.map} +0 -0
  176. /package/dist/{goose-DQ6GSZ5O.js.map → goose-VGNOP5J2.js.map} +0 -0
  177. /package/dist/{hermes-E47IG63A.js.map → hermes-NUKFWZI5.js.map} +0 -0
  178. /package/dist/{hook-GM2IDA3C.js.map → hook-XPR3AHDI.js.map} +0 -0
  179. /package/dist/{kilo-TAHOPT2Q.js.map → kilo-JLH3KVZJ.js.map} +0 -0
  180. /package/dist/{kilo-cli-X4NPJWGX.js.map → kilo-cli-5W36VJQZ.js.map} +0 -0
  181. /package/dist/{kimi-Z7L2LEEI.js.map → kimi-R62W7HKZ.js.map} +0 -0
  182. /package/dist/{leaderboard-DVW4WYJ6.js.map → leaderboard-YWMOSJBC.js.map} +0 -0
  183. /package/dist/{mimo-code-G2CBZ4M6.js.map → mimo-code-PGLFFVER.js.map} +0 -0
  184. /package/dist/{mux-JNM3F2NW.js.map → mux-HWL4N5KH.js.map} +0 -0
  185. /package/dist/{nemoclaw-SHA4IUML.js.map → nemoclaw-QPHETUXM.js.map} +0 -0
  186. /package/dist/{omp-OOVUNXME.js.map → omp-3TFMTJ5U.js.map} +0 -0
  187. /package/dist/{openclaw-BD56E5MV.js.map → openclaw-RYFO5TLY.js.map} +0 -0
  188. /package/dist/{opencode-W2RK4M7G.js.map → opencode-JX7GBE5Q.js.map} +0 -0
  189. /package/dist/{package-H5V3AZHR.js.map → package-2KKUGZFS.js.map} +0 -0
  190. /package/dist/{qwen-code-JG7AF442.js.map → qwen-code-ISR6BEET.js.map} +0 -0
  191. /package/dist/{roo-code-L5F7S6QH.js.map → roo-code-6TSCME4R.js.map} +0 -0
  192. /package/dist/{serve-WMO2TUW3.js.map → serve-EPRN7F2X.js.map} +0 -0
  193. /package/dist/{status-WRLBTBRE.js.map → status-B2PG6YKR.js.map} +0 -0
  194. /package/dist/{statusline-EUD4DMIP.js.map → statusline-5ERFMYSM.js.map} +0 -0
  195. /package/dist/{telemetry-U3LGMR3D.js.map → telemetry-ZMCAWBWB.js.map} +0 -0
  196. /package/dist/{trae-Z7CQ2A2Q.js.map → trae-7KDCYIMN.js.map} +0 -0
  197. /package/dist/{usage-3HQDTXGY.js.map → usage-5I72HWCR.js.map} +0 -0
  198. /package/dist/{usage-event-DWIGKO7V.js.map → usage-event-HIX4ZI45.js.map} +0 -0
  199. /package/dist/{warp-4PPG5LOM.js.map → warp-KJUCWEA3.js.map} +0 -0
  200. /package/dist/{windsurf-3T3RVXKM.js.map → windsurf-5TGGQR5I.js.map} +0 -0
@@ -23,23 +23,24 @@
23
23
  * exposes no writable MCP config to install into. The registry-completeness test
24
24
  * (tests/adapters/registry-completeness.test.ts) allowlists it for this reason.
25
25
  */
26
- type PlatformId = "claude-code" | "codex" | "cursor" | "vscode-copilot" | "jetbrains-copilot" | "copilot-cli" | "gemini-cli" | "opencode" | "mimo-code" | "kilo" | "kilo-cli" | "warp" | "hermes" | "nemoclaw" | "openclaw" | "zed" | "antigravity" | "antigravity-cli" | "kiro" | "qwen-code" | "kimi" | "pi" | "omp" | "droid" | "roo-code" | "cline" | "trae" | "amp" | "codebuff" | "mux" | "crush" | "goose" | "amazon-q" | "continue" | "windsurf" | "synthetic" | "unknown";
26
+ type PlatformId = "claude-code" | "codebuddy" | "codex" | "cursor" | "vscode-copilot" | "jetbrains-copilot" | "copilot-cli" | "gemini-cli" | "opencode" | "mimo-code" | "kilo" | "kilo-cli" | "warp" | "hermes" | "nemoclaw" | "openclaw" | "zed" | "antigravity" | "antigravity-cli" | "kiro" | "qwen-code" | "kimi" | "pi" | "omp" | "droid" | "openhands" | "roo-code" | "cline" | "trae" | "amp" | "codebuff" | "mux" | "crush" | "goose" | "amazon-q" | "continue" | "windsurf" | "grok-cli" | "devin" | "open-interpreter" | "junie" | "mistral-vibe" | "synthetic" | "unknown";
27
27
  /**
28
28
  * Hook I/O paradigm — the deepest cross-platform divergence (report §4).
29
29
  * Canonical shipped sets (keep in sync with src/adapters/registry.ts — this
30
30
  * comment once drifted and seeded a docs-wide misclassification):
31
- * - "json-stdio" (18): host pipes JSON to a command on stdin, reads
32
- * JSON/exit-code back — Claude Code, Codex, Cursor, VS Code/JetBrains
33
- * Copilot, Copilot CLI, Gemini CLI, Qwen, Kiro, Kimi, Crush, Goose, Hermes,
34
- * Droid (Factory), Antigravity (+ the agy CLI), Continue, Amazon Q. One
35
- * universal entrypoint binary handles all of them.
31
+ * - "json-stdio" (19): host pipes JSON to a command on stdin, reads
32
+ * JSON/exit-code back — Claude Code, CodeBuddy (Tencent, a Claude Code
33
+ * fork), Codex, Cursor, VS Code/JetBrains Copilot, Copilot CLI, Gemini CLI,
34
+ * Qwen, Kiro, Kimi, Crush, Goose, Hermes, Droid (Factory), Antigravity (+
35
+ * the agy CLI), Continue, Amazon Q. One universal entrypoint binary handles
36
+ * all of them.
36
37
  * - "ts-plugin" (8): host loads a JS/TS module exporting lifecycle functions
37
38
  * — OpenCode, MiMoCode (an OpenCode fork), Kilo CLI, Kilo, OMP, OpenClaw,
38
39
  * NemoClaw (an OpenClaw wrapper/fork), Amp (.amp/plugins/*.ts). Framework
39
40
  * generates the module.
40
- * - "mcp-only" (9): no hook layer at all — Warp, Roo Code, Cline, Trae, Zed,
41
- * Codebuff, Mux, Pi, Windsurf. Only the MCP server (or skills surface) is
42
- * installed; hooks are reported unavailable.
41
+ * - "mcp-only" (10): no hook layer at all — Warp, Roo Code, Cline, Trae, Zed,
42
+ * Codebuff, Mux, Pi, Windsurf, Mistral Vibe. Only the MCP server (or skills
43
+ * surface) is installed; hooks are reported unavailable.
43
44
  */
44
45
  type HookParadigm = "json-stdio" | "ts-plugin" | "mcp-only";
45
46
  /**
@@ -572,6 +573,7 @@ interface SkillDef {
572
573
  disableModelInvocation?: boolean;
573
574
  /** Extra files bundled beside SKILL.md, relative path → contents. */
574
575
  resources?: Record<string, string>;
576
+ /** Verbatim per-platform frontmatter additions (escape hatch). */
575
577
  extra?: Record<string, unknown>;
576
578
  }
577
579
  /** A named subagent (system-prompt + tool/model scoping). */
@@ -587,6 +589,13 @@ interface SubagentDef {
587
589
  model?: string;
588
590
  /** Coarse permission knob → Cursor readonly, opencode/kilo permission map. */
589
591
  readonly?: boolean;
592
+ /**
593
+ * Verbatim per-platform subagent manifest additions (escape hatch).
594
+ *
595
+ * Markdown/frontmatter hosts merge these as frontmatter. Hosts whose subagent
596
+ * files are native config/manifests merge them only when that native format is
597
+ * itself an extensible subagent surface.
598
+ */
590
599
  extra?: Record<string, unknown>;
591
600
  }
592
601
  /**
@@ -1060,6 +1069,41 @@ interface InstallResult {
1060
1069
  dryRun: boolean;
1061
1070
  changes: ChangeRecord[];
1062
1071
  warnings: string[];
1072
+ /**
1073
+ * Render-only digest of the resolved connector (id/version/server/hooks/
1074
+ * telemetry/surface counts), threaded in by the CLI command so the friendly
1075
+ * renderer can print a connector header. OPTIONAL: the core install/uninstall
1076
+ * functions never populate it (they don't shape presentation) — the CLI
1077
+ * attaches it from the {@link ResolvedConnector} it already loaded. The
1078
+ * `--json` machine contract does NOT include it; see cli/app
1079
+ * buildConnectorSummary / renderInstallResult.
1080
+ */
1081
+ connector?: ConnectorSummary;
1082
+ }
1083
+ /**
1084
+ * A minimal, presentation-only digest of a {@link ResolvedConnector} used by the
1085
+ * CLI's friendly install/uninstall/upgrade output. Lives here (not in cli/) so
1086
+ * {@link InstallResult} can reference it without a CLI→core import cycle; it is
1087
+ * BUILT by cli/app buildConnectorSummary. Render-only: never part of any machine
1088
+ * (JSON) contract.
1089
+ */
1090
+ interface ConnectorSummary {
1091
+ id: string;
1092
+ version: string;
1093
+ displayName?: string;
1094
+ /** stdio command line / remote URL; absent ⇒ hooks-only connector. */
1095
+ server?: {
1096
+ transport: string;
1097
+ command: string;
1098
+ };
1099
+ hookEvents: string[];
1100
+ telemetryEnabled: boolean;
1101
+ commands: number;
1102
+ skills: number;
1103
+ subagents: number;
1104
+ memory: number;
1105
+ hasStatusline: boolean;
1106
+ actions: number;
1063
1107
  }
1064
1108
  interface DiagnosticResult {
1065
1109
  check: string;
@@ -5,49 +5,51 @@ import {
5
5
  resolveUninstallTargets,
6
6
  uninstallConnector,
7
7
  uninstallViaMarketplace
8
- } from "./chunk-VD4EG6SG.js";
9
- import "./chunk-UYZ53KWS.js";
8
+ } from "./chunk-JO2IM2JL.js";
9
+ import "./chunk-IBLYVAWH.js";
10
10
  import {
11
11
  marketplaceEvidence,
12
12
  readMarketplaceInstalls
13
- } from "./chunk-QKLJU4JX.js";
14
- import "./chunk-NBUEL74R.js";
13
+ } from "./chunk-2Y2MZRLP.js";
14
+ import "./chunk-UM5S7DKK.js";
15
+ import "./chunk-JFXL4HYA.js";
16
+ import "./chunk-OPXAP3AC.js";
15
17
  import {
18
+ buildConnectorSummary,
16
19
  fail,
20
+ maybePrintBanner,
17
21
  parseScope,
18
22
  parseTargets,
19
23
  print,
20
24
  renderInstallResult
21
- } from "./chunk-VKRGQLY4.js";
22
- import "./chunk-LN76OGNR.js";
23
- import "./chunk-S4E6QQEM.js";
25
+ } from "./chunk-5Z36KVU2.js";
26
+ import "./chunk-Z2MRSS2I.js";
27
+ import "./chunk-FO5CEXXN.js";
24
28
  import "./chunk-KHO5WNTP.js";
25
29
  import {
26
30
  findConnectorConfig,
27
31
  loadConnectorFromPath
28
- } from "./chunk-7NXEHZAK.js";
29
- import "./chunk-PZHB5TVA.js";
30
- import "./chunk-X457NOFE.js";
31
- import "./chunk-56R2ER7K.js";
32
- import "./chunk-OPXAP3AC.js";
33
- import "./chunk-UM5S7DKK.js";
32
+ } from "./chunk-JVO6NBTT.js";
33
+ import "./chunk-AY3VFNOH.js";
34
+ import "./chunk-KA55FISM.js";
35
+ import "./chunk-NBYKLUF6.js";
34
36
  import "./chunk-H53QZQJI.js";
35
37
  import "./chunk-BEFVJ2OE.js";
36
- import "./chunk-VVFDU4IX.js";
37
- import "./chunk-HORHRHNG.js";
38
- import "./chunk-YYNXIUR2.js";
38
+ import "./chunk-WFEHWTLM.js";
39
+ import "./chunk-4NHXLXSD.js";
40
+ import "./chunk-M2H7JURF.js";
39
41
  import {
40
42
  assertConnectorId
41
- } from "./chunk-IXOQDZWC.js";
43
+ } from "./chunk-GZGLCCEE.js";
42
44
 
43
45
  // src/cli/commands/uninstall.ts
44
46
  import { parseArgs } from "util";
45
47
  async function resolveConnectorId(explicitId, connectorPath, projectDir) {
46
- if (explicitId && explicitId.trim() !== "") return explicitId;
48
+ if (explicitId && explicitId.trim() !== "") return { id: explicitId };
47
49
  const configPath = connectorPath ?? findConnectorConfig(projectDir);
48
50
  if (!configPath) return null;
49
51
  const { connector } = await loadConnectorFromPath(configPath);
50
- return connector.id;
52
+ return { id: connector.id, connector };
51
53
  }
52
54
  async function run(argv) {
53
55
  const { values } = parseArgs({
@@ -60,10 +62,13 @@ async function run(argv) {
60
62
  "connector-id": { type: "string" },
61
63
  project: { type: "string" },
62
64
  "dry-run": { type: "boolean", default: false },
63
- purge: { type: "boolean", default: false }
65
+ purge: { type: "boolean", default: false },
66
+ // Decorative-banner suppressor (no effect on command output bytes).
67
+ quiet: { type: "boolean", default: false }
64
68
  },
65
69
  allowPositionals: false
66
70
  });
71
+ maybePrintBanner({ quiet: values.quiet });
67
72
  const method = parseUninstallMethod(values.method);
68
73
  if (method == null) {
69
74
  return fail(`invalid --method "${values.method}" (use auto|direct|marketplace)`);
@@ -71,16 +76,18 @@ async function run(argv) {
71
76
  const projectDir = values.project ?? process.cwd();
72
77
  const scope = parseScope(values.scope);
73
78
  if (scope == null) return fail(`invalid --scope "${values.scope}" (use user|project)`);
74
- const connectorId = await resolveConnectorId(
79
+ const resolved = await resolveConnectorId(
75
80
  values["connector-id"],
76
81
  values.connector,
77
82
  projectDir
78
83
  );
79
- if (!connectorId) {
84
+ if (!resolved) {
80
85
  return fail(
81
86
  "could not determine connector id. Pass --connector-id <id>, --connector <path>, or run inside a project with an agent-connector config."
82
87
  );
83
88
  }
89
+ const connectorId = resolved.id;
90
+ const summary = resolved.connector ? buildConnectorSummary(resolved.connector) : void 0;
84
91
  try {
85
92
  assertConnectorId(connectorId);
86
93
  } catch (err) {
@@ -97,19 +104,20 @@ async function run(argv) {
97
104
  ...targets ? { targets } : {}
98
105
  });
99
106
  if (values.purge) purgeFrameworkState(connectorId, dryRun, result);
107
+ result.connector = summary;
100
108
  print(renderInstallResult(result, "uninstall"));
101
109
  return result.changes.some((c) => c.action === "warn") ? 1 : 0;
102
110
  }
103
111
  let marketplaceTargets = [];
104
112
  let directTargets = [];
105
113
  if (method === "auto") {
106
- const resolved = await resolveUninstallTargets(connectorId, targets, projectDir);
114
+ const resolvedTargets = await resolveUninstallTargets(connectorId, targets, projectDir);
107
115
  const recorded = targets ? [] : Object.keys(readMarketplaceInstalls(connectorId));
108
- const candidates = [.../* @__PURE__ */ new Set([...resolved, ...recorded])];
116
+ const candidates = [.../* @__PURE__ */ new Set([...resolvedTargets, ...recorded])];
109
117
  marketplaceTargets = candidates.filter(
110
118
  (id) => marketplaceEvidence(connectorId, id) != null
111
119
  );
112
- directTargets = resolved.filter((id) => !marketplaceTargets.includes(id));
120
+ directTargets = resolvedTargets.filter((id) => !marketplaceTargets.includes(id));
113
121
  }
114
122
  if (marketplaceTargets.length === 0) {
115
123
  const result = await uninstallConnector({
@@ -120,6 +128,7 @@ async function run(argv) {
120
128
  purge: values.purge,
121
129
  ...targets ? { targets } : {}
122
130
  });
131
+ result.connector = summary;
123
132
  print(renderInstallResult(result, "uninstall"));
124
133
  return result.changes.some((c) => c.action === "warn") ? 1 : 0;
125
134
  }
@@ -165,7 +174,8 @@ async function run(argv) {
165
174
  connectorId,
166
175
  dryRun,
167
176
  changes: results.flatMap((r) => r.changes),
168
- warnings: results.flatMap((r) => r.warnings)
177
+ warnings: results.flatMap((r) => r.warnings),
178
+ connector: summary
169
179
  };
170
180
  print(renderInstallResult(merged, "uninstall"));
171
181
  return merged.changes.some((c) => c.action === "warn") ? 1 : 0;
@@ -173,4 +183,4 @@ async function run(argv) {
173
183
  export {
174
184
  run
175
185
  };
176
- //# sourceMappingURL=uninstall-TWPUEJEC.js.map
186
+ //# sourceMappingURL=uninstall-M76BHLTH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/uninstall.ts"],"sourcesContent":["/**\n * cli/commands/uninstall — strip a connector's registrations, method-aware.\n *\n * The connector id is taken from --connector-id, or inferred from the local\n * connector config (--connector <path> / findConnectorConfig).\n *\n * --method auto (default) reverses WHATEVER is actually there, per target:\n * targets with marketplace evidence (the state record, or the host's own plugin\n * state) get the HOST plugin uninstall; everything else gets the existing\n * direct adapter strip. Install chooses a method (a user decision); uninstall\n * reverses what exists (a state decision) — and since the double-install guard\n * enforces exactly one method per (connector, host, scope), auto is\n * unambiguous. Explicit --method direct|marketplace forces one path for every\n * target. Config removal vs plugin uninstall is therefore method-resolved:\n * never both, never neither.\n *\n * --purge additionally removes the framework-state this connector left behind:\n * its DATA-dir connector record (connectorDir(id)), the empty marketplace\n * staging root, and, when no connectors remain, the shared home-bin launcher.\n * Without --purge those linger so the connector can be re-synced without\n * re-registering.\n */\n\nimport { parseArgs } from \"node:util\";\n\nimport {\n purgeFrameworkState,\n resolveUninstallTargets,\n uninstallConnector,\n} from \"../../core/installer.js\";\nimport {\n marketplaceEvidence,\n parseUninstallMethod,\n uninstallViaMarketplace,\n} from \"../../core/marketplace.js\";\nimport { readMarketplaceInstalls } from \"../../core/marketplace-state.js\";\nimport { assertConnectorId } from \"../../core/ids.js\";\nimport { findConnectorConfig, loadConnectorFromPath } from \"../../core/load-connector.js\";\nimport type {\n ConnectorSummary,\n InstallResult,\n PlatformId,\n ResolvedConnector,\n} from \"../../core/types.js\";\nimport {\n buildConnectorSummary,\n fail,\n maybePrintBanner,\n parseScope,\n parseTargets,\n print,\n renderInstallResult,\n} from \"../app.js\";\n\n/**\n * Resolve the connector id from flags, then from a local config file. When the\n * id was inferred by LOADING a config, the resolved connector is returned too so\n * the caller can build a header summary; an explicit `--connector-id` yields no\n * connector (id-only uninstall), and the renderer degrades to an id-only header.\n */\nasync function resolveConnectorId(\n explicitId: string | undefined,\n connectorPath: string | undefined,\n projectDir: string,\n): Promise<{ id: string; connector?: ResolvedConnector } | null> {\n if (explicitId && explicitId.trim() !== \"\") return { id: explicitId };\n const configPath = connectorPath ?? findConnectorConfig(projectDir);\n if (!configPath) return null;\n const { connector } = await loadConnectorFromPath(configPath);\n return { id: connector.id, connector };\n}\n\nexport async function run(argv: string[]): Promise<number> {\n const { values } = parseArgs({\n args: argv,\n options: {\n method: { type: \"string\", default: \"auto\" },\n scope: { type: \"string\", default: \"user\" },\n targets: { type: \"string\" },\n connector: { type: \"string\" },\n \"connector-id\": { type: \"string\" },\n project: { type: \"string\" },\n \"dry-run\": { type: \"boolean\", default: false },\n purge: { type: \"boolean\", default: false },\n // Decorative-banner suppressor (no effect on command output bytes).\n quiet: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n maybePrintBanner({ quiet: values.quiet });\n\n const method = parseUninstallMethod(values.method);\n if (method == null) {\n return fail(`invalid --method \"${values.method}\" (use auto|direct|marketplace)`);\n }\n\n const projectDir = values.project ?? process.cwd();\n\n const scope = parseScope(values.scope);\n if (scope == null) return fail(`invalid --scope \"${values.scope}\" (use user|project)`);\n\n const resolved = await resolveConnectorId(\n values[\"connector-id\"],\n values.connector,\n projectDir,\n );\n if (!resolved) {\n return fail(\n \"could not determine connector id. Pass --connector-id <id>, \" +\n \"--connector <path>, or run inside a project with an agent-connector config.\",\n );\n }\n const connectorId = resolved.id;\n // Header summary when a connector config was actually loaded; id-only\n // (--connector-id) uninstalls have no connector → the renderer degrades to an\n // id-only header.\n const summary: ConnectorSummary | undefined = resolved.connector\n ? buildConnectorSummary(resolved.connector)\n : undefined;\n\n // Single choke-point: validate the id BEFORE any path is built or any delete\n // runs. Every branch below (explicit --method marketplace, --method auto, and\n // the direct strip) constructs record / staging-root paths from this id —\n // including the explicit --targets marketplace path, which reaches\n // driver.finishUninstall(id) → rmSync(join(stagingRoot, id)) without otherwise\n // routing the raw id through connectorDir's validation. Failing loud here closes\n // the `--connector-id ../../x` traversal window for ALL of them at once.\n try {\n assertConnectorId(connectorId);\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n\n const targets = parseTargets(values.targets);\n const dryRun = values[\"dry-run\"];\n\n // ── Explicit --method marketplace: every target goes to the marketplace path\n // (targets default to the recorded installs); framework purge runs here since\n // no direct pass follows.\n if (method === \"marketplace\") {\n const result = await uninstallViaMarketplace({\n connectorId,\n projectDir,\n dryRun,\n purge: values.purge,\n ...(targets ? { targets } : {}),\n });\n if (values.purge) purgeFrameworkState(connectorId, dryRun, result);\n result.connector = summary;\n print(renderInstallResult(result, \"uninstall\"));\n return result.changes.some((c) => c.action === \"warn\") ? 1 : 0;\n }\n\n // ── --method auto: partition the resolved targets by marketplace evidence.\n // (--method direct keeps every target on the adapter strip — today's path.)\n let marketplaceTargets: PlatformId[] = [];\n let directTargets: PlatformId[] = [];\n if (method === \"auto\") {\n const resolvedTargets = await resolveUninstallTargets(connectorId, targets, projectDir);\n // With no explicit --targets, recorded marketplace platforms are unioned\n // in: the state record IS the authority for what we installed, and host\n // detection can miss a host whose probe-able config dir was relocated.\n // An explicit --targets list is always respected as-is.\n const recorded = targets\n ? []\n : (Object.keys(readMarketplaceInstalls(connectorId)) as PlatformId[]);\n const candidates = [...new Set([...resolvedTargets, ...recorded])];\n marketplaceTargets = candidates.filter(\n (id) => marketplaceEvidence(connectorId, id) != null,\n );\n directTargets = resolvedTargets.filter((id) => !marketplaceTargets.includes(id));\n }\n\n // No marketplace evidence anywhere (or --method direct): exactly today's\n // single-orchestration path, byte-for-byte — zero behavior change for users\n // who never touched the marketplace method.\n if (marketplaceTargets.length === 0) {\n const result = await uninstallConnector({\n connectorId,\n scope,\n projectDir,\n dryRun,\n purge: values.purge,\n ...(targets ? { targets } : {}),\n });\n result.connector = summary;\n print(renderInstallResult(result, \"uninstall\"));\n return result.changes.some((c) => c.action === \"warn\") ? 1 : 0;\n }\n\n const results: InstallResult[] = [\n await uninstallViaMarketplace({\n connectorId,\n projectDir,\n targets: marketplaceTargets,\n dryRun,\n purge: values.purge,\n }),\n ];\n\n // The direct strip runs only for its partition (never both methods on one\n // target). When every target was marketplace-routed, --purge still runs the\n // framework purge (the marketplace records were just cleared, so it can\n // proceed to the connector record + home-bin).\n if (directTargets.length > 0) {\n results.push(\n await uninstallConnector({\n connectorId,\n scope,\n projectDir,\n dryRun,\n purge: values.purge,\n targets: directTargets,\n }),\n );\n } else if (values.purge) {\n const purgeResult: InstallResult = {\n connectorId,\n dryRun,\n changes: [],\n warnings: [],\n };\n if (dryRun) {\n // On a real run the marketplace records are removed BEFORE this purge;\n // calling purgeFrameworkState now would false-refuse on records that the\n // marketplace pass only PLANNED to remove. Report the plan instead.\n purgeResult.changes.push({\n platform: connectorId as PlatformId,\n action: \"remove\",\n detail:\n \"would purge framework state (connector record; home-bin when no connectors remain)\",\n });\n } else {\n purgeFrameworkState(connectorId, dryRun, purgeResult);\n }\n results.push(purgeResult);\n }\n\n const merged: InstallResult = {\n connectorId,\n dryRun,\n changes: results.flatMap((r) => r.changes),\n warnings: results.flatMap((r) => r.warnings),\n connector: summary,\n };\n print(renderInstallResult(merged, \"uninstall\"));\n return merged.changes.some((c) => c.action === \"warn\") ? 1 : 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAS,iBAAiB;AAqC1B,eAAe,mBACb,YACA,eACA,YAC+D;AAC/D,MAAI,cAAc,WAAW,KAAK,MAAM,GAAI,QAAO,EAAE,IAAI,WAAW;AACpE,QAAM,aAAa,iBAAiB,oBAAoB,UAAU;AAClE,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,EAAE,UAAU,IAAI,MAAM,sBAAsB,UAAU;AAC5D,SAAO,EAAE,IAAI,UAAU,IAAI,UAAU;AACvC;AAEA,eAAsB,IAAI,MAAiC;AACzD,QAAM,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,QAAQ,EAAE,MAAM,UAAU,SAAS,OAAO;AAAA,MAC1C,OAAO,EAAE,MAAM,UAAU,SAAS,OAAO;AAAA,MACzC,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,WAAW,EAAE,MAAM,SAAS;AAAA,MAC5B,gBAAgB,EAAE,MAAM,SAAS;AAAA,MACjC,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,WAAW,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C,OAAO,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA;AAAA,MAEzC,OAAO,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,IAC3C;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AAED,mBAAiB,EAAE,OAAO,OAAO,MAAM,CAAC;AAExC,QAAM,SAAS,qBAAqB,OAAO,MAAM;AACjD,MAAI,UAAU,MAAM;AAClB,WAAO,KAAK,qBAAqB,OAAO,MAAM,iCAAiC;AAAA,EACjF;AAEA,QAAM,aAAa,OAAO,WAAW,QAAQ,IAAI;AAEjD,QAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,MAAI,SAAS,KAAM,QAAO,KAAK,oBAAoB,OAAO,KAAK,sBAAsB;AAErF,QAAM,WAAW,MAAM;AAAA,IACrB,OAAO,cAAc;AAAA,IACrB,OAAO;AAAA,IACP;AAAA,EACF;AACA,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL;AAAA,IAEF;AAAA,EACF;AACA,QAAM,cAAc,SAAS;AAI7B,QAAM,UAAwC,SAAS,YACnD,sBAAsB,SAAS,SAAS,IACxC;AASJ,MAAI;AACF,sBAAkB,WAAW;AAAA,EAC/B,SAAS,KAAK;AACZ,WAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EAC9D;AAEA,QAAM,UAAU,aAAa,OAAO,OAAO;AAC3C,QAAM,SAAS,OAAO,SAAS;AAK/B,MAAI,WAAW,eAAe;AAC5B,UAAM,SAAS,MAAM,wBAAwB;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC/B,CAAC;AACD,QAAI,OAAO,MAAO,qBAAoB,aAAa,QAAQ,MAAM;AACjE,WAAO,YAAY;AACnB,UAAM,oBAAoB,QAAQ,WAAW,CAAC;AAC9C,WAAO,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,IAAI,IAAI;AAAA,EAC/D;AAIA,MAAI,qBAAmC,CAAC;AACxC,MAAI,gBAA8B,CAAC;AACnC,MAAI,WAAW,QAAQ;AACrB,UAAM,kBAAkB,MAAM,wBAAwB,aAAa,SAAS,UAAU;AAKtF,UAAM,WAAW,UACb,CAAC,IACA,OAAO,KAAK,wBAAwB,WAAW,CAAC;AACrD,UAAM,aAAa,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,iBAAiB,GAAG,QAAQ,CAAC,CAAC;AACjE,yBAAqB,WAAW;AAAA,MAC9B,CAAC,OAAO,oBAAoB,aAAa,EAAE,KAAK;AAAA,IAClD;AACA,oBAAgB,gBAAgB,OAAO,CAAC,OAAO,CAAC,mBAAmB,SAAS,EAAE,CAAC;AAAA,EACjF;AAKA,MAAI,mBAAmB,WAAW,GAAG;AACnC,UAAM,SAAS,MAAM,mBAAmB;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC/B,CAAC;AACD,WAAO,YAAY;AACnB,UAAM,oBAAoB,QAAQ,WAAW,CAAC;AAC9C,WAAO,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,IAAI,IAAI;AAAA,EAC/D;AAEA,QAAM,UAA2B;AAAA,IAC/B,MAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,OAAO,OAAO;AAAA,IAChB,CAAC;AAAA,EACH;AAMA,MAAI,cAAc,SAAS,GAAG;AAC5B,YAAQ;AAAA,MACN,MAAM,mBAAmB;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,OAAO;AAAA,QACd,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,WAAW,OAAO,OAAO;AACvB,UAAM,cAA6B;AAAA,MACjC;AAAA,MACA;AAAA,MACA,SAAS,CAAC;AAAA,MACV,UAAU,CAAC;AAAA,IACb;AACA,QAAI,QAAQ;AAIV,kBAAY,QAAQ,KAAK;AAAA,QACvB,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QACE;AAAA,MACJ,CAAC;AAAA,IACH,OAAO;AACL,0BAAoB,aAAa,QAAQ,WAAW;AAAA,IACtD;AACA,YAAQ,KAAK,WAAW;AAAA,EAC1B;AAEA,QAAM,SAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,SAAS,QAAQ,QAAQ,CAAC,MAAM,EAAE,OAAO;AAAA,IACzC,UAAU,QAAQ,QAAQ,CAAC,MAAM,EAAE,QAAQ;AAAA,IAC3C,WAAW;AAAA,EACb;AACA,QAAM,oBAAoB,QAAQ,WAAW,CAAC;AAC9C,SAAO,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,IAAI,IAAI;AAC/D;","names":[]}
@@ -4,38 +4,40 @@ import {
4
4
  resolveCliEntry,
5
5
  syncConnector,
6
6
  upgradeViaMarketplace
7
- } from "./chunk-VD4EG6SG.js";
8
- import "./chunk-UYZ53KWS.js";
9
- import "./chunk-QKLJU4JX.js";
10
- import "./chunk-NBUEL74R.js";
7
+ } from "./chunk-JO2IM2JL.js";
8
+ import "./chunk-IBLYVAWH.js";
9
+ import "./chunk-2Y2MZRLP.js";
10
+ import "./chunk-UM5S7DKK.js";
11
+ import "./chunk-JFXL4HYA.js";
12
+ import "./chunk-OPXAP3AC.js";
11
13
  import {
14
+ buildConnectorSummary,
12
15
  fail,
16
+ maybePrintBanner,
13
17
  parseScope,
14
18
  parseTargets,
15
19
  print,
16
20
  renderInstallResult
17
- } from "./chunk-VKRGQLY4.js";
18
- import "./chunk-LN76OGNR.js";
19
- import "./chunk-S4E6QQEM.js";
21
+ } from "./chunk-5Z36KVU2.js";
22
+ import "./chunk-Z2MRSS2I.js";
23
+ import "./chunk-FO5CEXXN.js";
20
24
  import "./chunk-KHO5WNTP.js";
21
25
  import {
22
26
  findConnectorConfig,
23
27
  loadConnectorFromPath
24
- } from "./chunk-7NXEHZAK.js";
25
- import "./chunk-PZHB5TVA.js";
26
- import "./chunk-X457NOFE.js";
27
- import "./chunk-56R2ER7K.js";
28
- import "./chunk-OPXAP3AC.js";
29
- import "./chunk-UM5S7DKK.js";
28
+ } from "./chunk-JVO6NBTT.js";
29
+ import "./chunk-AY3VFNOH.js";
30
+ import "./chunk-KA55FISM.js";
31
+ import "./chunk-NBYKLUF6.js";
30
32
  import "./chunk-H53QZQJI.js";
31
33
  import "./chunk-BEFVJ2OE.js";
32
- import "./chunk-VVFDU4IX.js";
33
- import "./chunk-HORHRHNG.js";
34
- import "./chunk-YYNXIUR2.js";
34
+ import "./chunk-WFEHWTLM.js";
35
+ import "./chunk-4NHXLXSD.js";
36
+ import "./chunk-M2H7JURF.js";
35
37
  import {
36
38
  ensureHomeBin,
37
39
  homeBinPath
38
- } from "./chunk-IXOQDZWC.js";
40
+ } from "./chunk-GZGLCCEE.js";
39
41
 
40
42
  // src/cli/commands/upgrade.ts
41
43
  import { parseArgs } from "util";
@@ -53,10 +55,13 @@ async function run(argv) {
53
55
  targets: { type: "string" },
54
56
  connector: { type: "string" },
55
57
  project: { type: "string" },
56
- "dry-run": { type: "boolean", default: false }
58
+ "dry-run": { type: "boolean", default: false },
59
+ // Decorative-banner suppressor (no effect on command output bytes).
60
+ quiet: { type: "boolean", default: false }
57
61
  },
58
62
  allowPositionals: false
59
63
  });
64
+ maybePrintBanner({ quiet: values.quiet });
60
65
  const channel = values.channel;
61
66
  if (channel !== "stable" && channel !== "latest") {
62
67
  return fail(`invalid --channel "${channel}" (use stable|latest)`);
@@ -88,6 +93,7 @@ async function run(argv) {
88
93
  ...targets ? { targets } : {}
89
94
  };
90
95
  const result = method === "marketplace" ? await upgradeViaMarketplace(opts) : await syncConnector(opts);
96
+ result.connector = buildConnectorSummary(connector);
91
97
  print(renderInstallResult(result, "upgrade"));
92
98
  if (result.changes.some((c) => c.action === "warn")) hadWarn = true;
93
99
  print("");
@@ -127,4 +133,4 @@ Refreshed home binary pointer: ${binPath}`);
127
133
  export {
128
134
  run
129
135
  };
130
- //# sourceMappingURL=upgrade-EM6Y7QLH.js.map
136
+ //# sourceMappingURL=upgrade-JLSCNAQA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/upgrade.ts"],"sourcesContent":["/**\n * cli/commands/upgrade — bring an agent-connector install current.\n *\n * `upgrade` (aliases: `update`, `sync`) consolidates the two former verbs into\n * ONE the way npm/brew pair `install` + `upgrade`, so there is a single verb to\n * learn for \"make everything current\". It:\n *\n * 1. re-renders the connector's config into every target host idempotently\n * (identical entries report \"skip\"), exactly like the old `sync` — this is\n * also the self-heal path: run `upgrade` to repair a drifted install; then\n * 2. refreshes the stable home-bin pointer and prints managed (never-silent)\n * update guidance for the chosen channel, exactly like the old `update`.\n *\n * When no connector config is resolvable it still does step 2, so `upgrade`\n * works as a pure tool-refresh from anywhere. By design agent-connector NEVER\n * silently auto-updates (docs/ARCHITECTURE.md §3 R1).\n */\n\nimport { parseArgs } from \"node:util\";\n\nimport { resolveCliEntry, syncConnector } from \"../../core/installer.js\";\nimport { parseInstallMethod, upgradeViaMarketplace } from \"../../core/marketplace.js\";\nimport { findConnectorConfig, loadConnectorFromPath } from \"../../core/load-connector.js\";\nimport { ensureHomeBin, homeBinPath } from \"../../core/paths.js\";\nimport {\n buildConnectorSummary,\n fail,\n maybePrintBanner,\n parseScope,\n parseTargets,\n print,\n renderInstallResult,\n} from \"../app.js\";\n\ntype Channel = \"stable\" | \"latest\";\n\n/** Heuristic: does the running CLI live under an npm-style node_modules tree? */\nfunction looksNpmManaged(): boolean {\n const entry = resolveCliEntry().replace(/\\\\/g, \"/\");\n return entry.includes(\"/node_modules/\");\n}\n\nexport async function run(argv: string[]): Promise<number> {\n const { values } = parseArgs({\n args: argv,\n options: {\n channel: { type: \"string\", default: \"stable\" },\n method: { type: \"string\", default: \"direct\" },\n scope: { type: \"string\", default: \"user\" },\n targets: { type: \"string\" },\n connector: { type: \"string\" },\n project: { type: \"string\" },\n \"dry-run\": { type: \"boolean\", default: false },\n // Decorative-banner suppressor (no effect on command output bytes).\n quiet: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n maybePrintBanner({ quiet: values.quiet });\n\n const channel = values.channel;\n if (channel !== \"stable\" && channel !== \"latest\") {\n return fail(`invalid --channel \"${channel}\" (use stable|latest)`);\n }\n const ch: Channel = channel;\n\n const method = parseInstallMethod(values.method);\n if (method == null) {\n return fail(`invalid --method \"${values.method}\" (use direct|marketplace)`);\n }\n\n const scope = parseScope(values.scope);\n if (scope == null) return fail(`invalid --scope \"${values.scope}\" (use user|project)`);\n if (method === \"marketplace\" && scope !== \"user\") {\n return fail(\n \"--method marketplace supports --scope user only (project-scope plugin installs are deferred)\",\n );\n }\n\n let hadWarn = false;\n\n // ── Step 1: bring the connector's deploys current (former `sync`):\n // direct — idempotent re-render into every target host.\n // marketplace — re-stage the bundle + catalog in place, then drive the\n // host's update verb (claude `plugin update`, with a recorded\n // uninstall+install fallback); warns when connector.version is\n // unchanged since the recorded install (Claude caches a\n // versioned copy, so a same-version update silently no-ops).\n const projectDir = values.project ?? process.cwd();\n const configPath = values.connector ?? findConnectorConfig(projectDir);\n if (configPath) {\n const { connector, modulePath } = await loadConnectorFromPath(configPath);\n const targets = parseTargets(values.targets);\n const opts = {\n connector,\n modulePath,\n scope,\n projectDir,\n dryRun: values[\"dry-run\"],\n ...(targets ? { targets } : {}),\n };\n const result =\n method === \"marketplace\"\n ? await upgradeViaMarketplace(opts)\n : await syncConnector(opts);\n result.connector = buildConnectorSummary(connector);\n print(renderInstallResult(result, \"upgrade\"));\n if (result.changes.some((c) => c.action === \"warn\")) hadWarn = true;\n print(\"\");\n } else {\n print(\"upgrade: no connector config found — refreshing the tool only.\");\n print(\n \"(pass --connector <path> or run inside a project to also re-render host config.)\\n\",\n );\n }\n\n // ── Step 2: managed update guidance + home-bin pointer refresh (former `update`). ──\n print(\"agent-connector uses managed (explicit) updates — never silent\");\n print(\"auto-update — so one bad release can't break every project at once.\\n\");\n\n const dist = ch === \"stable\" ? \"latest\" : \"next\";\n if (looksNpmManaged()) {\n print(`To update the ${ch} channel, run:`);\n print(` npm i -g @ken-jo/agent-connector@${dist}`);\n } else {\n print(\n `This install does not look npm-managed. Update it the way you installed it,`,\n );\n print(`then re-run \\`agent-connector upgrade\\` to refresh the home pointer.`);\n print(`(npm installs would use: npm i -g @ken-jo/agent-connector@${dist})`);\n }\n\n // Refresh the stable home-bin pointer so hosts keep execing a working CLI.\n if (!values[\"dry-run\"]) {\n try {\n const binPath = ensureHomeBin(resolveCliEntry());\n print(`\\nRefreshed home binary pointer: ${binPath}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n print(`\\n[warn] could not refresh home binary at ${homeBinPath()}: ${message}`);\n return 1;\n }\n }\n\n return hadWarn ? 1 : 0;\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  formatHostLeaderboard,
4
4
  hostLeaderboard,
5
5
  scanUsage
6
- } from "./chunk-IRUYJD23.js";
6
+ } from "./chunk-NLE2J5P4.js";
7
7
  import {
8
8
  aggregateBy,
9
9
  sumTokens
@@ -11,7 +11,7 @@ import {
11
11
  import {
12
12
  fail,
13
13
  print
14
- } from "./chunk-VKRGQLY4.js";
14
+ } from "./chunk-5Z36KVU2.js";
15
15
 
16
16
  // src/cli/commands/usage.ts
17
17
  import { writeFileSync } from "fs";
@@ -321,4 +321,4 @@ export {
321
321
  parseSince,
322
322
  run
323
323
  };
324
- //# sourceMappingURL=usage-3HQDTXGY.js.map
324
+ //# sourceMappingURL=usage-5I72HWCR.js.map
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runUsageEvent
4
- } from "./chunk-LKAVD4HP.js";
4
+ } from "./chunk-447JWFZO.js";
5
5
  import "./chunk-OP4KBXUO.js";
6
- import "./chunk-LN76OGNR.js";
7
- import "./chunk-S4E6QQEM.js";
8
- import "./chunk-ZXX5DVSE.js";
9
- import "./chunk-4FWETID5.js";
6
+ import "./chunk-Z2MRSS2I.js";
7
+ import "./chunk-FO5CEXXN.js";
8
+ import "./chunk-FBCBHEGB.js";
10
9
  import "./chunk-KHO5WNTP.js";
11
- import "./chunk-7NXEHZAK.js";
12
- import "./chunk-PZHB5TVA.js";
13
- import "./chunk-X457NOFE.js";
14
- import "./chunk-56R2ER7K.js";
15
- import "./chunk-HORHRHNG.js";
16
- import "./chunk-YYNXIUR2.js";
17
- import "./chunk-IXOQDZWC.js";
10
+ import "./chunk-IVAWP6HH.js";
11
+ import "./chunk-JVO6NBTT.js";
12
+ import "./chunk-AY3VFNOH.js";
13
+ import "./chunk-KA55FISM.js";
14
+ import "./chunk-NBYKLUF6.js";
15
+ import "./chunk-4NHXLXSD.js";
16
+ import "./chunk-M2H7JURF.js";
17
+ import "./chunk-GZGLCCEE.js";
18
18
 
19
19
  // src/cli/commands/usage-event.ts
20
20
  import { parseArgs } from "util";
@@ -50,4 +50,4 @@ async function run(argv) {
50
50
  export {
51
51
  run
52
52
  };
53
- //# sourceMappingURL=usage-event-DWIGKO7V.js.map
53
+ //# sourceMappingURL=usage-event-HIX4ZI45.js.map
@@ -9,14 +9,14 @@ import {
9
9
  BaseAdapter,
10
10
  renderSkillMd,
11
11
  renderSubagentMd
12
- } from "./chunk-VVFDU4IX.js";
12
+ } from "./chunk-WFEHWTLM.js";
13
13
  import {
14
14
  buildHomeBinHookCommand,
15
15
  buildWrappedStdio,
16
16
  isHomeBinHookCommand
17
- } from "./chunk-HORHRHNG.js";
18
- import "./chunk-YYNXIUR2.js";
19
- import "./chunk-IXOQDZWC.js";
17
+ } from "./chunk-4NHXLXSD.js";
18
+ import "./chunk-M2H7JURF.js";
19
+ import "./chunk-GZGLCCEE.js";
20
20
 
21
21
  // src/adapters/vscode-copilot/index.ts
22
22
  import { existsSync } from "fs";
@@ -202,6 +202,15 @@ var VSCodeCopilotAdapter = class extends BaseAdapter {
202
202
  if (connector.hookEvents.length === 0) {
203
203
  return [{ platform: this.id, action: "skip", detail: "connector declares no hooks" }];
204
204
  }
205
+ if (ctx.scope === "user") {
206
+ return [
207
+ {
208
+ platform: this.id,
209
+ action: "warn",
210
+ detail: "VS Code Copilot hooks are workspace-scoped (.github/hooks); rerun with --scope project to install hooks."
211
+ }
212
+ ];
213
+ }
205
214
  const hooksPath = this.getHookConfigPath(ctx);
206
215
  const symlink = this.symlinkPathWarning(hooksPath);
207
216
  if (symlink) return [symlink];
@@ -507,6 +516,12 @@ var VSCodeCopilotAdapter = class extends BaseAdapter {
507
516
  if (hookEvents.length === 0) {
508
517
  return { status: "OK", detail: "no hooks declared" };
509
518
  }
519
+ if (ctx.scope === "user") {
520
+ return {
521
+ status: "OK",
522
+ detail: "hooks are workspace-scoped; install them with --scope project"
523
+ };
524
+ }
510
525
  const file = this.readJson(hooksPath);
511
526
  if (!file) return { status: "FAIL", detail: `not found: ${hooksPath}` };
512
527
  if (file.version !== VSCODE_HOOKS_VERSION) {
@@ -748,4 +763,4 @@ export {
748
763
  adapter,
749
764
  vscode_copilot_default as default
750
765
  };
751
- //# sourceMappingURL=vscode-copilot-LU5NC4ZS.js.map
766
+ //# sourceMappingURL=vscode-copilot-LILHAPJI.js.map