@ken-jo/agent-connector 0.4.6 → 0.4.8

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 (187) hide show
  1. package/dist/{action-EV63GAPY.js → action-RWPRIZIC.js} +10 -10
  2. package/dist/{amazon-q-COAL3764.js → amazon-q-5LJOB5L3.js} +6 -18
  3. package/dist/amazon-q-5LJOB5L3.js.map +1 -0
  4. package/dist/{amp-XJQ4TDAU.js → amp-PU4LFSY6.js} +16 -48
  5. package/dist/amp-PU4LFSY6.js.map +1 -0
  6. package/dist/{antigravity-AMKKKHS4.js → antigravity-DWW35HZO.js} +6 -5
  7. package/dist/{antigravity-cli-XERXEH5W.js → antigravity-cli-VTQ6DNWL.js} +6 -5
  8. package/dist/{antigravity-cli-XERXEH5W.js.map → antigravity-cli-VTQ6DNWL.js.map} +1 -1
  9. package/dist/{chunk-F5RX62T7.js → chunk-7QRUZAUG.js} +2 -2
  10. package/dist/{chunk-G5CQHVQG.js → chunk-7TVBFRVI.js} +12 -15
  11. package/dist/chunk-7TVBFRVI.js.map +1 -0
  12. package/dist/{chunk-QC5A3TFQ.js → chunk-A2T4Q7RM.js} +18 -18
  13. package/dist/{chunk-2X4EH2D7.js → chunk-CDVOBKSG.js} +4 -4
  14. package/dist/{chunk-RQPKL62M.js → chunk-CENEXP7K.js} +9 -38
  15. package/dist/chunk-CENEXP7K.js.map +1 -0
  16. package/dist/chunk-FBJQGRET.js +38 -0
  17. package/dist/chunk-FBJQGRET.js.map +1 -0
  18. package/dist/{chunk-WZA4CSGJ.js → chunk-H53QZQJI.js} +15 -2
  19. package/dist/chunk-H53QZQJI.js.map +1 -0
  20. package/dist/{chunk-DCK5FADX.js → chunk-HOE2MN36.js} +2 -2
  21. package/dist/{chunk-7L6ITC4T.js → chunk-IEGR4TP3.js} +22 -6
  22. package/dist/chunk-IEGR4TP3.js.map +1 -0
  23. package/dist/{chunk-CPLK7GTE.js → chunk-KG6T3YNJ.js} +353 -36
  24. package/dist/chunk-KG6T3YNJ.js.map +1 -0
  25. package/dist/{chunk-MZF2YCXX.js → chunk-MOW2RKHX.js} +2 -2
  26. package/dist/{chunk-EXLS7BSI.js → chunk-NLFPH4S2.js} +10 -2
  27. package/dist/chunk-NLFPH4S2.js.map +1 -0
  28. package/dist/{chunk-EROJDXMW.js → chunk-NYR55UT7.js} +2 -2
  29. package/dist/{chunk-SRVAA2VN.js → chunk-OZ5EXXQV.js} +2 -2
  30. package/dist/{chunk-I5MLE6S7.js → chunk-TO57WYBB.js} +15 -1
  31. package/dist/chunk-TO57WYBB.js.map +1 -0
  32. package/dist/chunk-UM5S7DKK.js +33 -0
  33. package/dist/chunk-UM5S7DKK.js.map +1 -0
  34. package/dist/{chunk-5G4EPJ4Y.js → chunk-VRKTVCYJ.js} +7 -7
  35. package/dist/{chunk-QOGMDOUX.js → chunk-WI6YSXOC.js} +3 -3
  36. package/dist/{chunk-BMD7ANKF.js → chunk-XQUUNAGC.js} +36 -36
  37. package/dist/{chunk-LQRAPXS4.js → chunk-YS2NYJ6R.js} +15 -49
  38. package/dist/chunk-YS2NYJ6R.js.map +1 -0
  39. package/dist/{chunk-H67V7DEL.js → chunk-YYISBXOM.js} +7 -7
  40. package/dist/{claude-code-T2LPFNC3.js → claude-code-64X6RR2S.js} +46 -133
  41. package/dist/claude-code-64X6RR2S.js.map +1 -0
  42. package/dist/cli/sdk.js +4 -4
  43. package/dist/cli.js +1 -1
  44. package/dist/{cline-WRYMNS7Z.js → cline-T7ZDJYZQ.js} +15 -47
  45. package/dist/cline-T7ZDJYZQ.js.map +1 -0
  46. package/dist/{codebuff-PODYPOOP.js → codebuff-PPPY3SJV.js} +9 -40
  47. package/dist/codebuff-PPPY3SJV.js.map +1 -0
  48. package/dist/{codex-O4G7D7KK.js → codex-EEVN43C2.js} +115 -172
  49. package/dist/codex-EEVN43C2.js.map +1 -0
  50. package/dist/{continue-K43SUHLQ.js → continue-VLLZO4PM.js} +12 -33
  51. package/dist/continue-VLLZO4PM.js.map +1 -0
  52. package/dist/{copilot-cli-Q3SSPT4V.js → copilot-cli-A7G5WB4N.js} +17 -64
  53. package/dist/copilot-cli-A7G5WB4N.js.map +1 -0
  54. package/dist/{crush-MBEH2R3I.js → crush-AH24GDDB.js} +17 -42
  55. package/dist/crush-AH24GDDB.js.map +1 -0
  56. package/dist/{cursor-TMBXDYR4.js → cursor-GJBSMXI6.js} +61 -183
  57. package/dist/cursor-GJBSMXI6.js.map +1 -0
  58. package/dist/{detect-AHJIUMBO.js → detect-YDCZNV4W.js} +4 -4
  59. package/dist/{doctor-G5MLCPAB.js → doctor-DGC7P3P7.js} +13 -12
  60. package/dist/{doctor-G5MLCPAB.js.map → doctor-DGC7P3P7.js.map} +1 -1
  61. package/dist/{droid-JC2NT6S4.js → droid-RBWCFKL3.js} +63 -144
  62. package/dist/droid-RBWCFKL3.js.map +1 -0
  63. package/dist/{gemini-cli-ILR7M5X3.js → gemini-cli-CFPFEJEA.js} +20 -63
  64. package/dist/gemini-cli-CFPFEJEA.js.map +1 -0
  65. package/dist/{goose-SFO5BBGW.js → goose-UBJVQFUE.js} +107 -183
  66. package/dist/goose-UBJVQFUE.js.map +1 -0
  67. package/dist/{hermes-3N7WN4WS.js → hermes-6FXGXLNL.js} +41 -83
  68. package/dist/hermes-6FXGXLNL.js.map +1 -0
  69. package/dist/{hook-76JBKTUX.js → hook-CDGSCASQ.js} +10 -10
  70. package/dist/index.js +2 -2
  71. package/dist/{install-R7252QFH.js → install-2D3UKEME.js} +13 -12
  72. package/dist/{install-R7252QFH.js.map → install-2D3UKEME.js.map} +1 -1
  73. package/dist/{jetbrains-copilot-NRZHI5PC.js → jetbrains-copilot-K26KMA3U.js} +12 -37
  74. package/dist/jetbrains-copilot-K26KMA3U.js.map +1 -0
  75. package/dist/{kilo-IX4T3OHJ.js → kilo-BKZJ26RM.js} +26 -90
  76. package/dist/kilo-BKZJ26RM.js.map +1 -0
  77. package/dist/{kilo-cli-2AYCXBQD.js → kilo-cli-6UVWCXQD.js} +17 -48
  78. package/dist/kilo-cli-6UVWCXQD.js.map +1 -0
  79. package/dist/{kimi-2YFK2GBA.js → kimi-QALYPSRR.js} +20 -31
  80. package/dist/kimi-QALYPSRR.js.map +1 -0
  81. package/dist/{kiro-YL6AWUYG.js → kiro-J5J42I5Z.js} +12 -31
  82. package/dist/kiro-J5J42I5Z.js.map +1 -0
  83. package/dist/{leaderboard-V6VWA5ZV.js → leaderboard-VZQXNWTX.js} +2 -2
  84. package/dist/{mimo-code-FTMGSKMQ.js → mimo-code-BEE622P2.js} +22 -87
  85. package/dist/mimo-code-BEE622P2.js.map +1 -0
  86. package/dist/{mux-5XZFB44C.js → mux-5HTNKK4K.js} +10 -54
  87. package/dist/mux-5HTNKK4K.js.map +1 -0
  88. package/dist/{nemoclaw-CQYXZVQN.js → nemoclaw-DNFIZFDF.js} +5 -5
  89. package/dist/{omp-2QMEY6HD.js → omp-I3UTRBNP.js} +16 -48
  90. package/dist/omp-I3UTRBNP.js.map +1 -0
  91. package/dist/{openclaw-UZC437RW.js → openclaw-QE2LMWIF.js} +5 -5
  92. package/dist/{opencode-L4BGFP25.js → opencode-ZFSUYJXI.js} +22 -88
  93. package/dist/opencode-ZFSUYJXI.js.map +1 -0
  94. package/dist/{package-DNLQTPNN.js → package-BSCCMW4E.js} +8 -8
  95. package/dist/{pi-PVVPVWKG.js → pi-H2KBBDDJ.js} +4 -4
  96. package/dist/{qwen-code-G4CXKUHR.js → qwen-code-5LE34FNE.js} +63 -152
  97. package/dist/qwen-code-5LE34FNE.js.map +1 -0
  98. package/dist/{roo-code-67TYJIQR.js → roo-code-XH4GCYIS.js} +15 -52
  99. package/dist/roo-code-XH4GCYIS.js.map +1 -0
  100. package/dist/runtime/index.js +8 -8
  101. package/dist/sdk/index.js +3 -3
  102. package/dist/sdk/test.js +5 -5
  103. package/dist/{serve-EOVWYBGZ.js → serve-MQNGPY2H.js} +10 -10
  104. package/dist/{status-VTD6XXLW.js → status-MRHVRDFY.js} +8 -7
  105. package/dist/{status-VTD6XXLW.js.map → status-MRHVRDFY.js.map} +1 -1
  106. package/dist/{statusline-3ET5YPQ5.js → statusline-IYWA75TR.js} +9 -9
  107. package/dist/{telemetry-QCTMKDBQ.js → telemetry-IONIOMLC.js} +5 -5
  108. package/dist/{trae-7CZZGOGI.js → trae-RVNRSV7X.js} +10 -39
  109. package/dist/trae-RVNRSV7X.js.map +1 -0
  110. package/dist/{uninstall-FL3SH2DT.js → uninstall-ESLSVCLE.js} +13 -12
  111. package/dist/{uninstall-FL3SH2DT.js.map → uninstall-ESLSVCLE.js.map} +1 -1
  112. package/dist/{upgrade-SLFG2FCT.js → upgrade-VICY5T64.js} +13 -12
  113. package/dist/{upgrade-SLFG2FCT.js.map → upgrade-VICY5T64.js.map} +1 -1
  114. package/dist/{usage-IRBLVUZM.js → usage-TCUWV2YZ.js} +2 -2
  115. package/dist/{usage-event-VFF77WYY.js → usage-event-CBZZP37Q.js} +9 -9
  116. package/dist/{vscode-copilot-MF2CDNMT.js → vscode-copilot-B2QBBHJW.js} +17 -65
  117. package/dist/vscode-copilot-B2QBBHJW.js.map +1 -0
  118. package/dist/{warp-VKG55TAT.js → warp-5R54ST3N.js} +7 -19
  119. package/dist/warp-5R54ST3N.js.map +1 -0
  120. package/dist/{windsurf-FU5G4SHF.js → windsurf-L32UEOLY.js} +6 -18
  121. package/dist/windsurf-L32UEOLY.js.map +1 -0
  122. package/dist/{zed-SFUHL3GS.js → zed-FDJHJZKD.js} +11 -21
  123. package/dist/zed-FDJHJZKD.js.map +1 -0
  124. package/package.json +1 -1
  125. package/dist/amazon-q-COAL3764.js.map +0 -1
  126. package/dist/amp-XJQ4TDAU.js.map +0 -1
  127. package/dist/chunk-7L6ITC4T.js.map +0 -1
  128. package/dist/chunk-CPLK7GTE.js.map +0 -1
  129. package/dist/chunk-EXLS7BSI.js.map +0 -1
  130. package/dist/chunk-G5CQHVQG.js.map +0 -1
  131. package/dist/chunk-I5MLE6S7.js.map +0 -1
  132. package/dist/chunk-LQRAPXS4.js.map +0 -1
  133. package/dist/chunk-RQPKL62M.js.map +0 -1
  134. package/dist/chunk-WZA4CSGJ.js.map +0 -1
  135. package/dist/claude-code-T2LPFNC3.js.map +0 -1
  136. package/dist/cline-WRYMNS7Z.js.map +0 -1
  137. package/dist/codebuff-PODYPOOP.js.map +0 -1
  138. package/dist/codex-O4G7D7KK.js.map +0 -1
  139. package/dist/continue-K43SUHLQ.js.map +0 -1
  140. package/dist/copilot-cli-Q3SSPT4V.js.map +0 -1
  141. package/dist/crush-MBEH2R3I.js.map +0 -1
  142. package/dist/cursor-TMBXDYR4.js.map +0 -1
  143. package/dist/droid-JC2NT6S4.js.map +0 -1
  144. package/dist/gemini-cli-ILR7M5X3.js.map +0 -1
  145. package/dist/goose-SFO5BBGW.js.map +0 -1
  146. package/dist/hermes-3N7WN4WS.js.map +0 -1
  147. package/dist/jetbrains-copilot-NRZHI5PC.js.map +0 -1
  148. package/dist/kilo-IX4T3OHJ.js.map +0 -1
  149. package/dist/kilo-cli-2AYCXBQD.js.map +0 -1
  150. package/dist/kimi-2YFK2GBA.js.map +0 -1
  151. package/dist/kiro-YL6AWUYG.js.map +0 -1
  152. package/dist/mimo-code-FTMGSKMQ.js.map +0 -1
  153. package/dist/mux-5XZFB44C.js.map +0 -1
  154. package/dist/omp-2QMEY6HD.js.map +0 -1
  155. package/dist/opencode-L4BGFP25.js.map +0 -1
  156. package/dist/qwen-code-G4CXKUHR.js.map +0 -1
  157. package/dist/roo-code-67TYJIQR.js.map +0 -1
  158. package/dist/trae-7CZZGOGI.js.map +0 -1
  159. package/dist/vscode-copilot-MF2CDNMT.js.map +0 -1
  160. package/dist/warp-VKG55TAT.js.map +0 -1
  161. package/dist/windsurf-FU5G4SHF.js.map +0 -1
  162. package/dist/zed-SFUHL3GS.js.map +0 -1
  163. /package/dist/{action-EV63GAPY.js.map → action-RWPRIZIC.js.map} +0 -0
  164. /package/dist/{antigravity-AMKKKHS4.js.map → antigravity-DWW35HZO.js.map} +0 -0
  165. /package/dist/{chunk-F5RX62T7.js.map → chunk-7QRUZAUG.js.map} +0 -0
  166. /package/dist/{chunk-QC5A3TFQ.js.map → chunk-A2T4Q7RM.js.map} +0 -0
  167. /package/dist/{chunk-2X4EH2D7.js.map → chunk-CDVOBKSG.js.map} +0 -0
  168. /package/dist/{chunk-DCK5FADX.js.map → chunk-HOE2MN36.js.map} +0 -0
  169. /package/dist/{chunk-MZF2YCXX.js.map → chunk-MOW2RKHX.js.map} +0 -0
  170. /package/dist/{chunk-EROJDXMW.js.map → chunk-NYR55UT7.js.map} +0 -0
  171. /package/dist/{chunk-SRVAA2VN.js.map → chunk-OZ5EXXQV.js.map} +0 -0
  172. /package/dist/{chunk-5G4EPJ4Y.js.map → chunk-VRKTVCYJ.js.map} +0 -0
  173. /package/dist/{chunk-QOGMDOUX.js.map → chunk-WI6YSXOC.js.map} +0 -0
  174. /package/dist/{chunk-BMD7ANKF.js.map → chunk-XQUUNAGC.js.map} +0 -0
  175. /package/dist/{chunk-H67V7DEL.js.map → chunk-YYISBXOM.js.map} +0 -0
  176. /package/dist/{detect-AHJIUMBO.js.map → detect-YDCZNV4W.js.map} +0 -0
  177. /package/dist/{hook-76JBKTUX.js.map → hook-CDGSCASQ.js.map} +0 -0
  178. /package/dist/{leaderboard-V6VWA5ZV.js.map → leaderboard-VZQXNWTX.js.map} +0 -0
  179. /package/dist/{nemoclaw-CQYXZVQN.js.map → nemoclaw-DNFIZFDF.js.map} +0 -0
  180. /package/dist/{openclaw-UZC437RW.js.map → openclaw-QE2LMWIF.js.map} +0 -0
  181. /package/dist/{package-DNLQTPNN.js.map → package-BSCCMW4E.js.map} +0 -0
  182. /package/dist/{pi-PVVPVWKG.js.map → pi-H2KBBDDJ.js.map} +0 -0
  183. /package/dist/{serve-EOVWYBGZ.js.map → serve-MQNGPY2H.js.map} +0 -0
  184. /package/dist/{statusline-3ET5YPQ5.js.map → statusline-IYWA75TR.js.map} +0 -0
  185. /package/dist/{telemetry-QCTMKDBQ.js.map → telemetry-IONIOMLC.js.map} +0 -0
  186. /package/dist/{usage-IRBLVUZM.js.map → usage-TCUWV2YZ.js.map} +0 -0
  187. /package/dist/{usage-event-VFF77WYY.js.map → usage-event-CBZZP37Q.js.map} +0 -0
@@ -1,22 +1,29 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  readYaml,
4
- writeYaml
5
- } from "./chunk-EXLS7BSI.js";
4
+ writeYaml,
5
+ yamlObjectMapCodec
6
+ } from "./chunk-NLFPH4S2.js";
7
+ import {
8
+ normalizeSessionSource
9
+ } from "./chunk-H53QZQJI.js";
6
10
  import {
7
11
  resolveEnvRefsDeep
8
12
  } from "./chunk-DBQMX75U.js";
9
13
  import {
10
- BaseAdapter
11
- } from "./chunk-CPLK7GTE.js";
12
- import "./chunk-7L6ITC4T.js";
14
+ BaseAdapter,
15
+ removeFromObjectMap,
16
+ upsertInObjectMap
17
+ } from "./chunk-KG6T3YNJ.js";
18
+ import {
19
+ renderSkillMd
20
+ } from "./chunk-IEGR4TP3.js";
13
21
  import {
14
22
  buildHomeBinHookCommand,
15
- buildServeWrapperCommand,
23
+ buildWrappedStdio,
16
24
  isHomeBinActionCommand,
17
- isHomeBinHookCommand,
18
- shouldWrapForTelemetry
19
- } from "./chunk-I5MLE6S7.js";
25
+ isHomeBinHookCommand
26
+ } from "./chunk-TO57WYBB.js";
20
27
  import "./chunk-N6HH7K6P.js";
21
28
  import "./chunk-TRQKHP7D.js";
22
29
 
@@ -189,39 +196,32 @@ var HermesAdapter = class extends BaseAdapter {
189
196
  ];
190
197
  }
191
198
  const entry = this.renderServerEntry(ctx, server);
192
- const cfg = readYaml(path) ?? {};
193
- const bucket = this.objectBucket(cfg, MCP_ROOT_KEY);
194
- const before = JSON.stringify(bucket[connector.id]);
195
- const after = JSON.stringify(entry);
196
- let action;
197
- if (before === void 0) action = "create";
198
- else if (before === after) action = "skip";
199
- else action = "update";
200
- if (action !== "skip") {
201
- bucket[connector.id] = entry;
202
- writeYaml(path, cfg, dryRun);
203
- }
204
- return [{ platform: this.id, action, path, detail: `${MCP_ROOT_KEY}.${connector.id}` }];
199
+ return [
200
+ upsertInObjectMap({
201
+ codec: yamlObjectMapCodec(),
202
+ rootKey: MCP_ROOT_KEY,
203
+ policy: "coerce",
204
+ platform: this.id,
205
+ configPath: path,
206
+ entryId: connector.id,
207
+ entry,
208
+ dryRun
209
+ })
210
+ ];
205
211
  }
206
212
  uninstallServer(ctx) {
207
213
  const { connector, dryRun } = ctx;
208
214
  const path = this.getServerConfigPath(ctx);
209
- const cfg = readYaml(path);
210
- const bucketRaw = cfg?.[MCP_ROOT_KEY];
211
- if (!cfg || !bucketRaw || typeof bucketRaw !== "object" || Array.isArray(bucketRaw) || !(connector.id in bucketRaw)) {
212
- return [
213
- {
214
- platform: this.id,
215
- action: "skip",
216
- path,
217
- detail: `${MCP_ROOT_KEY}.${connector.id} absent`
218
- }
219
- ];
220
- }
221
- delete bucketRaw[connector.id];
222
- writeYaml(path, cfg, dryRun);
223
215
  return [
224
- { platform: this.id, action: "remove", path, detail: `${MCP_ROOT_KEY}.${connector.id}` }
216
+ removeFromObjectMap({
217
+ codec: yamlObjectMapCodec(),
218
+ rootKey: MCP_ROOT_KEY,
219
+ policy: "coerce",
220
+ platform: this.id,
221
+ configPath: path,
222
+ entryId: connector.id,
223
+ dryRun
224
+ })
225
225
  ];
226
226
  }
227
227
  /**
@@ -243,18 +243,7 @@ var HermesAdapter = class extends BaseAdapter {
243
243
  }
244
244
  let command = server.command;
245
245
  let args = [...server.args ?? []];
246
- if (shouldWrapForTelemetry(server, ctx.connector.telemetry)) {
247
- const wrapped = buildServeWrapperCommand(
248
- ctx.homeBinPath,
249
- ctx.connector.id,
250
- command,
251
- args,
252
- ctx.scope,
253
- this.id
254
- );
255
- command = wrapped.command;
256
- args = wrapped.args;
257
- }
246
+ ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));
258
247
  command = resolveEnvRefsDeep(command);
259
248
  args = resolveEnvRefsDeep(args);
260
249
  const entry = { command };
@@ -535,7 +524,7 @@ var HermesAdapter = class extends BaseAdapter {
535
524
  continue;
536
525
  }
537
526
  changes.push(
538
- this.writeContentFile(join(dir, "SKILL.md"), this.renderSkill(skill), ctx.dryRun)
527
+ this.writeContentFile(join(dir, "SKILL.md"), renderSkillMd(skill), ctx.dryRun)
539
528
  );
540
529
  for (const [rel, contents] of Object.entries(skill.resources ?? {})) {
541
530
  const target = this.resolveWithin(dir, rel);
@@ -605,25 +594,6 @@ var HermesAdapter = class extends BaseAdapter {
605
594
  }
606
595
  return changes;
607
596
  }
608
- /**
609
- * Render a skill's SKILL.md: frontmatter (name, description + optional model,
610
- * allowed-tools, disable-model-invocation) + body. UNIFORM with every other
611
- * skill-supporting platform — only the parent dir differs.
612
- */
613
- renderSkill(skill) {
614
- const frontmatter = {
615
- name: skill.name,
616
- description: skill.description
617
- };
618
- if (skill.model !== void 0) frontmatter.model = skill.model;
619
- const allow = skill.tools?.allow;
620
- if (allow && allow.length > 0) frontmatter["allowed-tools"] = allow.join(", ");
621
- if (skill.disableModelInvocation !== void 0) {
622
- frontmatter["disable-model-invocation"] = skill.disableModelInvocation;
623
- }
624
- if (skill.extra) Object.assign(frontmatter, skill.extra);
625
- return this.renderFrontmatterMd(frontmatter, skill.body);
626
- }
627
597
  // ── Diagnostics ──────────────────────────────────────────────────────────
628
598
  getHealthChecks(ctx) {
629
599
  const path = this.getServerConfigPath(ctx);
@@ -695,7 +665,7 @@ var HermesAdapter = class extends BaseAdapter {
695
665
  return ev;
696
666
  }
697
667
  case "SessionStart": {
698
- const ev = { ...base, source: normalizeSource(input.source) };
668
+ const ev = { ...base, source: normalizeSessionSource(input.source) };
699
669
  return ev;
700
670
  }
701
671
  case "SessionEnd": {
@@ -835,18 +805,6 @@ function toStringOrUndefined(value) {
835
805
  return String(value);
836
806
  }
837
807
  }
838
- function normalizeSource(raw) {
839
- switch (raw) {
840
- case "compact":
841
- return "compact";
842
- case "resume":
843
- return "resume";
844
- case "clear":
845
- return "clear";
846
- default:
847
- return "startup";
848
- }
849
- }
850
808
  var adapter = new HermesAdapter();
851
809
  var hermes_default = adapter;
852
810
  export {
@@ -854,4 +812,4 @@ export {
854
812
  adapter,
855
813
  hermes_default as default
856
814
  };
857
- //# sourceMappingURL=hermes-3N7WN4WS.js.map
815
+ //# sourceMappingURL=hermes-6FXGXLNL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/hermes/index.ts"],"sourcesContent":["/**\n * adapters/hermes — Hermes Agent platform adapter for agent-connector.\n *\n * Hermes is a json-stdio host whose ENTIRE configuration — both the MCP servers\n * and the lifecycle hooks — lives in a single user-scope YAML file:\n *\n * ~/.hermes/config.yaml\n *\n * Because the file is YAML, the BaseAdapter JSON helpers do not apply; this\n * adapter merges via core/yaml's readYaml/writeYaml, preserving any unrelated\n * config the user has authored.\n *\n * - MCP servers: top-level snake_case root key `mcp_servers`. The stdio entry\n * uses the portable field names { command, args, env } (unlike Goose's\n * cmd/envs). Hermes has no native env interpolation, so `${env:VAR}` refs are\n * resolved to literals at install time.\n *\n * - Hooks: a top-level `hooks` map keyed by Hermes' NATIVE snake_case event\n * names (pre_tool_call / post_tool_call / on_session_start / on_session_end /\n * subagent_stop — NOT the canonical PascalCase names; see EVENT_TO_HERMES).\n * Each value is a\n * list of shell-hook entries { matcher, command:\"<homeBin> hook …\", timeout }.\n * The command keeps the canonical event token so the runtime dispatcher\n * (parseEvent/formatReply) stays consistent. Hermes shell hooks pipe the\n * event JSON to the command on stdin and read the reply JSON from stdout —\n * the same wire protocol as Claude Code, so the runtime parse/format mirror\n * the Claude adapter (a Claude-like JSON shape; the exact Hermes field map is\n * documented inline where it could vary).\n *\n * Since hooks are external shell commands (not an in-process plugin), Hermes\n * cannot let a hook rewrite tool arguments — canModifyArgs is false. Hermes has\n * no SSE transport, so only stdio + http are advertised.\n */\n\nimport { existsSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport { BaseAdapter } from \"../base.js\";\nimport type { Adapter, HookReply, InstallContext, MemoryTarget, NormalizedEvent } from \"../spi.js\";\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookEventName,\n HookParadigm,\n HookResponse,\n NotificationEvent,\n PlatformCapabilities,\n PlatformId,\n PostToolUseEvent,\n PostCompactEvent,\n PreCompactEvent,\n PreToolUseEvent,\n SessionEndEvent,\n SessionStartEvent,\n ServerDef,\n StopEvent,\n SubagentStopEvent,\n UserPromptSubmitEvent,\n} from \"../../core/types.js\";\nimport { removeFromObjectMap, upsertInObjectMap } from \"../../core/object-map.js\";\nimport { readYaml, writeYaml, yamlObjectMapCodec } from \"../../core/yaml.js\";\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\nimport {\n buildHomeBinHookCommand,\n buildWrappedStdio,\n isHomeBinActionCommand,\n isHomeBinHookCommand,\n} from \"../../core/spawn.js\";\nimport { renderSkillMd } from \"../claude-code/render.js\";\nimport { normalizeSessionSource } from \"../claude-code/wire.js\";\n\nconst HOST: PlatformId = \"hermes\";\n/** Root key under which Hermes stores MCP servers in config.yaml (snake_case). */\nconst MCP_ROOT_KEY = \"mcp_servers\";\n/** Top-level key under which Hermes stores shell hooks in config.yaml. */\nconst HOOKS_KEY = \"hooks\";\n/**\n * Top-level map under which Hermes stores `/<id>` slash commands. A\n * `{ type: \"exec\", command }` entry runs the shell command directly, bypassing\n * the LLM — the action emitter's target.\n */\nconst QUICK_COMMANDS_KEY = \"quick_commands\";\n/** Default per-hook timeout (seconds) when the connector declares none. */\nconst DEFAULT_HOOK_TIMEOUT = 60;\n\n/** One Hermes quick-command entry (a `/<id>` slash command). */\ninterface HermesQuickCommand {\n type: \"exec\";\n command: string;\n}\n\n/**\n * Canonical → Hermes native hook event name. Hermes keys its `hooks:` block by\n * its OWN snake_case lifecycle names (pre_tool_call / post_tool_call /\n * on_session_start / on_session_end — see docs/research/platform-research.json),\n * NOT the canonical PascalCase names. A connector event is only wired when it\n * appears here AND is declared by the connector; everything else is reported as\n * a warn/skip at install time.\n */\nconst EVENT_TO_HERMES: Partial<Record<HookEventName, string>> = {\n PreToolUse: \"pre_tool_call\",\n PostToolUse: \"post_tool_call\",\n SessionStart: \"on_session_start\",\n SessionEnd: \"on_session_end\",\n // Hermes is a STOP-ONLY subagent host: subagent_stop fires when a\n // delegate_task child exits (child_status ∈ completed/failed/interrupted/\n // error); there is NO subagent_start analog. PermissionRequest is also\n // deliberately ABSENT: Hermes' pre_approval_request/post_approval_response\n // hooks OBSERVE the approval prompt but carry no decision control, so a\n // PermissionRequest handler could never be honored — install skip-warns it.\n SubagentStop: \"subagent_stop\",\n};\n\n/** Hermes stdio MCP entry — portable field names (command/args/env). */\ninterface HermesStdioServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/**\n * Hermes remote HTTP MCP entry — `{ url, headers? }` under the SAME mcp_servers\n * key (no transport/type discriminator). Per the Hermes Agent docs\n * (website/docs/user-guide/features/mcp.md \"HTTP servers\"); OAuth servers add\n * `auth: oauth`, which AC's static-header model does not express.\n */\ninterface HermesHttpServer {\n url: string;\n headers?: Record<string, string>;\n}\n\n/** One Hermes shell-hook entry. */\ninterface HermesHookEntry {\n /** Tool-name matcher (empty = all). Tool events only; \"\" elsewhere. */\n matcher: string;\n /** The home-bin hook command Hermes invokes (event JSON on stdin). */\n command: string;\n /** Hook timeout in seconds. */\n timeout: number;\n}\n\n/** Raw Hermes hook stdin payload. Hermes uses snake_case pre_tool_call /\n * post_tool_call event tokens; field names below cover both its tool-call and\n * session payloads. Shape kept Claude-like where Hermes does not document it. */\ninterface HermesWireInput {\n session_id?: string;\n cwd?: string;\n event?: string;\n hook_event_name?: string;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_response?: unknown;\n tool_output?: unknown;\n source?: string;\n reason?: string;\n prompt?: string;\n trigger?: string;\n stop_hook_active?: boolean;\n message?: string;\n is_error?: boolean;\n // subagent_stop — fires when a delegate_task child exits. agent_* are the\n // Claude-compatible names, child_* the Hermes-native ones (child_status ∈\n // completed/failed/interrupted/error stays accessible via `raw`).\n agent_id?: string;\n agent_type?: string;\n child_id?: string;\n child_status?: string;\n last_assistant_message?: string;\n /** Injected by the entrypoint so the runtime knows which connector to dispatch. */\n connector?: string;\n}\n\nexport class HermesAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Hermes Agent\";\n readonly paradigm: HookParadigm = \"json-stdio\";\n\n readonly capabilities: PlatformCapabilities = {\n // Memory surface: AGENTS.md-first managed block. memoryTargets below probes\n // for .hermes.md / HERMES.md (first context category wins on hermes —\n // AGENTS.md is ignored when they exist); ~/.hermes holds identity/volatile\n // files (SOUL.md, MEMORY.md), not a rules surface → user-scope skip-warn.\n supportsMemory: true,\n preToolUse: true,\n postToolUse: true,\n preCompact: false,\n // Hermes exposes on_session_start / on_session_end lifecycle hooks.\n sessionStart: true,\n sessionEnd: true,\n userPromptSubmit: false,\n stop: false,\n notification: false,\n // Newer events: Hermes ships subagent_stop (stop-only — no subagent_start\n // analog). permissionRequest stays unset because pre_approval_request is\n // observe-only (no decision control); postToolUseFailure stays unset (a\n // tool failure arrives merged into post_tool_call's result, not as a\n // dedicated event). Install reports the standard skip-warn for those.\n subagentStop: true,\n // Shell hooks cannot rewrite tool args/output in-process.\n canModifyArgs: false,\n canModifyOutput: false,\n canInjectSessionContext: true,\n // Hermes has no SSE transport.\n transports: [\"stdio\", \"http\"],\n // Content surface: Hermes auto-discovers dir-per-skill SKILL.md from its\n // LOCAL skills root ~/.hermes/skills — the \"single source of truth,\n // read-write\" dir (hermes-agent.nousresearch.com/docs/user-guide/features/\n // skills, fetched 2026-06-16). The directory name becomes the skill's\n // install slug; frontmatter is { name, description } + optional\n // metadata.hermes.*. USER scope only — there is no documented hermes-owned\n // project skills dir (~/.agents/skills is the cross-tool external dir, not\n // ours), so a project-scope install skip-warns via the base default.\n supportsSkills: true,\n // Native passthrough hooks: Hermes documents many host-specific lifecycle\n // events with NO canonical analog — pre_llm_call / post_llm_call /\n // on_session_finalize / on_session_reset / pre_gateway_dispatch /\n // pre_approval_request / post_approval_response / transform_tool_result\n // (docs/research/platform-research.json). They are host-specific (below the\n // >=3-host core bar; docs/research/host-specific-hook-events-design.md). A\n // connector reaches them by declaring platforms[\"hermes\"].nativeHooks;\n // installHooks files those event-name keys verbatim into the YAML hooks map,\n // and the generic uninstall reverses them.\n supportsNativeHooks: true,\n // Actions surface: Hermes ships `quick_commands.<id>: { type: \"exec\",\n // command }` — a `/<id>` slash command that runs the shell command directly,\n // bypassing the LLM (hermes-agent.nousresearch.com/docs/user-guide/cli:\n // \"custom commands that run shell commands instantly without invoking the\n // LLM\"). We emit one per declared action bound to the home-bin action verb.\n supportsActions: true,\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(_projectDir: string): DetectedPlatform {\n const configPath = this.userConfigPath();\n const configDir = dirname(configPath);\n const installed = existsSync(configDir) || existsSync(configPath);\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath,\n scope: \"user\",\n reason: installed\n ? `found Hermes config at ${configPath}`\n : `no Hermes config at ${configPath}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Memory surface: .hermes.md / HERMES.md shadow probe (project) ────────\n // Hermes assembles project context by FIRST CATEGORY WINS: .hermes.md or\n // HERMES.md (cwd walking up to the git root) → AGENTS.md (cwd only) →\n // CLAUDE.md (cwd only). When a hermes-native file exists our block must live\n // there or it is never loaded. Reason strings note the cwd-only AGENTS.md\n // read and hermes' ~20k-chars-per-file truncation.\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\n if (this.memoryOverride(ctx)?.path || ctx.scope !== \"project\") {\n return super.memoryTargets(ctx); // user scope: no rules surface → skip-warn\n }\n for (const name of [\".hermes.md\", \"HERMES.md\"]) {\n const candidate = join(ctx.projectDir, name);\n if (existsSync(candidate)) {\n return [\n {\n path: candidate,\n reason: `${name} shadows AGENTS.md on hermes (first context category wins)`,\n budgetBytes: 18 * 1024, // hermes truncates each context file at ~20k chars\n },\n ];\n }\n }\n return [\n {\n path: join(ctx.projectDir, \"AGENTS.md\"),\n reason:\n \"AGENTS.md (hermes reads it from the cwd only — run from the project root; ~20k chars/file truncation)\",\n budgetBytes: 18 * 1024,\n },\n ];\n }\n\n // ── Native paths (server + hooks share the SAME file) ─────────────────────\n\n override getConfigDir(_ctx: InstallContext): string {\n return dirname(this.userConfigPath());\n }\n\n override getServerConfigPath(_ctx: InstallContext): string {\n return this.userConfigPath();\n }\n\n /** Same file as the server config — Hermes hooks live in config.yaml. */\n override getHookConfigPath(_ctx: InstallContext): string {\n return this.userConfigPath();\n }\n\n private userConfigPath(): string {\n return join(homedir(), \".hermes\", \"config.yaml\");\n }\n\n // ── MCP server install / uninstall (YAML mcp_servers) ─────────────────────\n\n override installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getServerConfigPath(ctx);\n const server = this.effectiveServer(ctx);\n\n if (!server) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: connector.server\n ? \"server registration disabled for hermes\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n // Hermes registers stdio sidecars ({command,args,env}) AND remote HTTP\n // servers ({url,headers}) under the same mcp_servers key. It has no SSE\n // transport (docs: website/docs/user-guide/features/mcp.md), so anything\n // else is reported, never silently dropped.\n const isStdio = server.transport === \"stdio\" && !!server.command;\n const isHttp = server.transport === \"http\" && !!server.url;\n if (!isStdio && !isHttp) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: `transport \"${server.transport}\" not registrable in ${MCP_ROOT_KEY} (stdio + http only)`,\n },\n ];\n }\n\n const entry = this.renderServerEntry(ctx, server);\n\n return [\n upsertInObjectMap({\n codec: yamlObjectMapCodec(),\n rootKey: MCP_ROOT_KEY,\n policy: \"coerce\",\n platform: this.id,\n configPath: path,\n entryId: connector.id,\n entry,\n dryRun,\n }),\n ];\n }\n\n override uninstallServer(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getServerConfigPath(ctx);\n return [\n removeFromObjectMap({\n codec: yamlObjectMapCodec(),\n rootKey: MCP_ROOT_KEY,\n policy: \"coerce\",\n platform: this.id,\n configPath: path,\n entryId: connector.id,\n dryRun,\n }),\n ];\n }\n\n /**\n * Render the MCP entry — a remote HTTP `{ url, headers? }` or a stdio sidecar\n * `{ command, args, env }`. Hermes has no native interpolation, so env-refs\n * resolve to literals here. The stdio path honors the telemetry serve-wrapper.\n */\n private renderServerEntry(\n ctx: InstallContext,\n server: ServerDef,\n ): HermesStdioServer | HermesHttpServer {\n // Remote HTTP — { url, headers? }. Never telemetry-wrapped (a URL has no\n // local command to route through the serve proxy). Hermes has no native env\n // token, so ${env:VAR} refs in url/headers resolve to literals.\n if (server.transport === \"http\") {\n const entry: HermesHttpServer = { url: resolveEnvRefsDeep(server.url ?? \"\") };\n if (server.headers && Object.keys(server.headers).length > 0) {\n const headers: Record<string, string> = {};\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.headers))) {\n headers[k] = String(v);\n }\n entry.headers = headers;\n }\n return entry;\n }\n\n let command = server.command as string;\n let args = [...(server.args ?? [])];\n\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\n\n command = resolveEnvRefsDeep(command);\n args = resolveEnvRefsDeep(args);\n\n const entry: HermesStdioServer = { command };\n if (args.length > 0) entry.args = args;\n if (server.env && Object.keys(server.env).length > 0) {\n const env: Record<string, string> = {};\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.env))) {\n env[k] = String(v);\n }\n entry.env = env;\n }\n return entry;\n }\n\n // ── Hook install / uninstall (YAML hooks map in the SAME config.yaml) ─────\n\n override installHooks(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getHookConfigPath(ctx);\n const override = connector.platforms[HOST];\n\n // `hooks: false` disables only the NORMALIZED events. nativeHooks is a\n // sibling, hermes-scoped declaration on the same override and installs\n // regardless.\n const events = override?.hooks === false ? [] : connector.hookEvents;\n const nativeHooks = override?.nativeHooks ?? {};\n const nativeEvents = Object.keys(nativeHooks);\n\n if (events.length === 0 && nativeEvents.length === 0) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: override?.hooks === false ? \"hooks disabled for hermes\" : \"connector declares no hooks\",\n },\n ];\n }\n\n const cfg = readYaml<Record<string, unknown>>(path) ?? {};\n const hooks = this.hooksBucket(cfg);\n const changes: ChangeRecord[] = [];\n let mutated = false;\n\n for (const event of events) {\n const hermesEvent = EVENT_TO_HERMES[event];\n if (!hermesEvent) {\n // No Hermes equivalent for this canonical event — report and skip.\n changes.push({\n platform: this.id,\n action: \"warn\",\n path,\n detail: `${event} has no Hermes hook equivalent — skipped`,\n });\n continue;\n }\n\n // The hook command keeps the CANONICAL event token so the runtime\n // dispatcher (parseEvent/formatReply) stays consistent; only the YAML KEY\n // the entry is filed under is the native Hermes name.\n const command = buildHomeBinHookCommand(ctx.homeBinPath, HOST, event, connector.id);\n const matcher = connector.hooks[event]?.matcher ?? \"\";\n const timeout = this.hookTimeout(connector.server);\n const desired: HermesHookEntry = { matcher, command, timeout };\n\n const bucket = Array.isArray(hooks[hermesEvent])\n ? (hooks[hermesEvent] as HermesHookEntry[])\n : (hooks[hermesEvent] = [] as HermesHookEntry[]);\n const idx = bucket.findIndex((e) => this.isOurCommand(e?.command, ctx));\n\n if (idx >= 0) {\n if (JSON.stringify(bucket[idx]) === JSON.stringify(desired)) {\n changes.push({ platform: this.id, action: \"skip\", path, detail: `${HOOKS_KEY}.${hermesEvent}` });\n continue;\n }\n bucket[idx] = desired;\n changes.push({ platform: this.id, action: \"update\", path, detail: `${HOOKS_KEY}.${hermesEvent}` });\n } else {\n bucket.push(desired);\n changes.push({ platform: this.id, action: \"create\", path, detail: `${HOOKS_KEY}.${hermesEvent}` });\n }\n mutated = true;\n }\n\n // NATIVE passthrough events: Hermes-native event-name keys (e.g. pre_llm_call,\n // transform_tool_result) filed VERBATIM into the YAML hooks map — no\n // EVENT_TO_HERMES mapping, since they ARE Hermes events. Same entry shape +\n // idempotency, matched by EXACT command so a native key coinciding with a\n // mapped canonical key never clobbers it.\n for (const event of nativeEvents) {\n const command = buildHomeBinHookCommand(ctx.homeBinPath, HOST, event, connector.id);\n const matcher = nativeHooks[event]?.matcher ?? \"\";\n const timeout = this.hookTimeout(connector.server);\n const desired: HermesHookEntry = { matcher, command, timeout };\n const bucket = Array.isArray(hooks[event])\n ? (hooks[event] as HermesHookEntry[])\n : (hooks[event] = [] as HermesHookEntry[]);\n const idx = bucket.findIndex((e) => e?.command === command);\n if (idx >= 0) {\n if (JSON.stringify(bucket[idx]) === JSON.stringify(desired)) {\n changes.push({ platform: this.id, action: \"skip\", path, detail: `${HOOKS_KEY}.${event} (native)` });\n } else {\n bucket[idx] = desired;\n changes.push({ platform: this.id, action: \"update\", path, detail: `${HOOKS_KEY}.${event} (native)` });\n mutated = true;\n }\n } else {\n bucket.push(desired);\n changes.push({ platform: this.id, action: \"create\", path, detail: `${HOOKS_KEY}.${event} (native)` });\n mutated = true;\n }\n }\n\n if (mutated) writeYaml(path, cfg, dryRun);\n return changes;\n }\n\n override uninstallHooks(ctx: InstallContext): ChangeRecord[] {\n const path = this.getHookConfigPath(ctx);\n const cfg = readYaml<Record<string, unknown>>(path);\n const hooksRaw = cfg?.[HOOKS_KEY];\n if (\n !cfg ||\n !hooksRaw ||\n typeof hooksRaw !== \"object\" ||\n Array.isArray(hooksRaw)\n ) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no hooks section present\" }];\n }\n const hooks = hooksRaw as Record<string, unknown>;\n\n const changes: ChangeRecord[] = [];\n let mutated = false;\n for (const event of Object.keys(hooks)) {\n const bucket = hooks[event];\n if (!Array.isArray(bucket)) continue;\n const kept = (bucket as HermesHookEntry[]).filter(\n (e) => !this.isOurCommand(e?.command, ctx),\n );\n if (kept.length === bucket.length) continue;\n mutated = true;\n if (kept.length > 0) hooks[event] = kept;\n else delete hooks[event];\n changes.push({\n platform: this.id,\n action: \"remove\",\n path,\n detail: `${HOOKS_KEY}.${event} (${bucket.length - kept.length})`,\n });\n }\n\n if (mutated) writeYaml(path, cfg, ctx.dryRun);\n if (changes.length === 0) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no matching hook entries\" }];\n }\n return changes;\n }\n\n // ── Action surface (quick_commands map in the SAME config.yaml) ───────────\n // Each declared action emits `quick_commands.<id>: { type: \"exec\", command }`\n // where command is the home-bin action verb — a `/<id>` slash command that\n // runs it directly, bypassing the LLM. MERGE-preserve: never clobber another\n // entry. Set-if-absent per id; if `quick_commands.<id>` exists and is NOT\n // ours, skip-warn (the configPatch ownership semantics).\n\n override installActions(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getHookConfigPath(ctx);\n\n if (connector.platforms[HOST]?.actions === false) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"actions disabled for hermes\" }];\n }\n const triggers = this.actionTriggers(ctx);\n if (triggers.length === 0) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"connector declares no actions\" }];\n }\n\n const cfg = readYaml<Record<string, unknown>>(path) ?? {};\n const bucket = this.objectBucket(cfg, QUICK_COMMANDS_KEY);\n const changes: ChangeRecord[] = [];\n let mutated = false;\n\n for (const trigger of triggers) {\n const desired: HermesQuickCommand = { type: \"exec\", command: trigger.command };\n const existing = bucket[trigger.id];\n if (existing !== undefined) {\n // Set-if-absent: only re-write an entry that is already OURS (an\n // exec entry whose command is our action verb for this connector).\n if (!this.isOurQuickCommand(existing, ctx)) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n path,\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id} exists and is not ours — skipped`,\n });\n continue;\n }\n if (JSON.stringify(existing) === JSON.stringify(desired)) {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path,\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id}`,\n });\n continue;\n }\n bucket[trigger.id] = desired;\n changes.push({\n platform: this.id,\n action: \"update\",\n path,\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id}`,\n });\n } else {\n bucket[trigger.id] = desired;\n changes.push({\n platform: this.id,\n action: \"create\",\n path,\n detail: `${QUICK_COMMANDS_KEY}.${trigger.id}`,\n });\n }\n mutated = true;\n }\n\n if (mutated) writeYaml(path, cfg, dryRun);\n return changes;\n }\n\n override uninstallActions(ctx: InstallContext): ChangeRecord[] {\n const path = this.getHookConfigPath(ctx);\n const cfg = readYaml<Record<string, unknown>>(path);\n const bucketRaw = cfg?.[QUICK_COMMANDS_KEY];\n if (\n !cfg ||\n !bucketRaw ||\n typeof bucketRaw !== \"object\" ||\n Array.isArray(bucketRaw)\n ) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no quick_commands section present\" }];\n }\n const bucket = bucketRaw as Record<string, unknown>;\n\n const changes: ChangeRecord[] = [];\n let mutated = false;\n // Remove ONLY our exec entries; leave foreign entries (and the map itself\n // when any remain) untouched.\n for (const id of Object.keys(bucket)) {\n if (!this.isOurQuickCommand(bucket[id], ctx)) continue;\n delete bucket[id];\n mutated = true;\n changes.push({\n platform: this.id,\n action: \"remove\",\n path,\n detail: `${QUICK_COMMANDS_KEY}.${id}`,\n });\n }\n\n if (mutated) {\n // Drop an emptied map so we leave no orphan key behind.\n if (Object.keys(bucket).length === 0) delete cfg[QUICK_COMMANDS_KEY];\n writeYaml(path, cfg, ctx.dryRun);\n }\n if (changes.length === 0) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"no matching quick_commands entries\" }];\n }\n return changes;\n }\n\n /** True when a quick-command entry is OUR exec action verb for this connector. */\n private isOurQuickCommand(entry: unknown, ctx: InstallContext): boolean {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return false;\n const e = entry as Partial<HermesQuickCommand>;\n if (e.type !== \"exec\" || typeof e.command !== \"string\") return false;\n return isHomeBinActionCommand(e.command, ctx.homeBinPath, ctx.connector.id);\n }\n\n /** True when a hook command is ours (anchored home-bin + connector id). */\n private isOurCommand(command: string | undefined, ctx: InstallContext): boolean {\n return isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id);\n }\n\n private hookTimeout(server: ServerDef | undefined): number {\n const ms = server?.timeoutMs;\n if (typeof ms === \"number\" && ms > 0) return Math.round(ms / 1000);\n return DEFAULT_HOOK_TIMEOUT;\n }\n\n // ── Content surface: skills (dir-per-skill SKILL.md) ─────────────────────\n // CONTENT-ONLY: pure native-file writers, mirroring goose/openclaw. No\n // runtime dispatch, no home-bin pointer, no telemetry wrap. Idempotent\n // (byte-identical → skip) via writeContentFile and reversible via\n // removeContentFile + removeDirIfEmpty. Honors platforms[\"hermes\"].skills\n // === false. No config.yaml entry — Hermes auto-discovers ~/.hermes/skills.\n //\n // USER scope only: ~/.hermes/skills/<name>/SKILL.md (the documented local,\n // read-write \"single source of truth\"). Project scope skip-warns — there is\n // no hermes-owned project skills dir documented.\n\n /** The user-scope skills ROOT dir (~/.hermes/skills). */\n private skillsDir(): string {\n return join(dirname(this.userConfigPath()), \"skills\");\n }\n\n /** Per-skill directory: ~/.hermes/skills/<name>. */\n private skillDir(name: string): string {\n return join(this.skillsDir(), name);\n }\n\n override installSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.skills === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for hermes\" }];\n }\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n if (ctx.scope !== \"user\") {\n // Hermes documents only the user-scope ~/.hermes/skills root; there is no\n // hermes-owned project skills dir. Report rather than guess a path.\n return [\n {\n platform: this.id,\n action: \"warn\",\n detail:\n `no project-scope skills dir on hermes (~/.hermes/skills is user-scope only); ` +\n `${connector.skills.length} skipped`,\n },\n ];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(skill.name);\n // Guard a skills path occupied by a regular FILE (would throw ENOTDIR on\n // mkdir): skip-warn rather than crash (the cline `.clinerules`-is-a-file\n // precedent). The skills root or the per-skill dir is the likely culprit.\n const blockingFile = this.firstFileOnSkillPath(dir);\n if (blockingFile !== null) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: blockingFile,\n detail: `${blockingFile} is a file, not a directory; skill \"${skill.name}\" skipped`,\n });\n continue;\n }\n changes.push(\n this.writeContentFile(join(dir, \"SKILL.md\"), renderSkillMd(skill), ctx.dryRun),\n );\n // Bundle any resource files beside SKILL.md (relative path → contents).\n // Defense-in-depth: skip+warn on any key that escapes the skill dir\n // (config-time validation already rejects these, but never trust input).\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\n });\n continue;\n }\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\n }\n }\n return changes;\n }\n\n /**\n * Walk from the skills root (~/.hermes/skills) down to `leaf` and return the\n * FIRST segment that exists as a regular file (a mkdir there throws ENOTDIR),\n * else null — so installSkills can skip-warn instead of crashing.\n */\n private firstFileOnSkillPath(leaf: string): string | null {\n const root = this.skillsDir();\n const segments: string[] = [];\n let cur = leaf;\n while (cur.length >= root.length) {\n segments.unshift(cur);\n if (cur === root) break;\n const parent = dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n for (const p of segments) {\n if (!existsSync(p)) return null;\n try {\n if (statSync(p).isFile()) return p;\n } catch {\n return null;\n }\n }\n return null;\n }\n\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n if (ctx.scope !== \"user\") {\n // Nothing is written at project scope (install skip-warned), so nothing\n // to clean — report the same scope reason as install for symmetry.\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"no project-scope skills dir on hermes (user-scope only); nothing to remove\",\n },\n ];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(skill.name);\n // Remove only the files we wrote (SKILL.md + declared resources), then the\n // skill dir itself when we own its full contents.\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\n for (const rel of Object.keys(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) continue; // never delete outside the skill dir\n changes.push(this.removeContentFile(target, ctx.dryRun));\n }\n // Only remove the skill dir when WE own its full contents — never rm -rf a\n // dir that still holds user-added / sibling-tool / shared files.\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\n }\n return changes;\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const path = this.getServerConfigPath(ctx);\n const id = ctx.connector.id;\n const homeBin = ctx.homeBinPath;\n const hookEvents = ctx.connector.hookEvents;\n return [\n {\n name: `${this.name}: config.yaml present`,\n check: () =>\n existsSync(path)\n ? { status: \"OK\", detail: path }\n : { status: \"FAIL\", detail: `not found: ${path}` },\n },\n {\n name: `${this.name}: ${MCP_ROOT_KEY}.${id} registered`,\n check: () => {\n // Only assert what the connector declares: a server-less connector\n // never writes an mcp entry, so its absence is healthy.\n if (!ctx.connector.server) return { status: \"OK\", detail: \"no MCP server declared\" };\n const cfg = readYaml<Record<string, unknown>>(path);\n const bucket = cfg?.[MCP_ROOT_KEY];\n const present =\n typeof bucket === \"object\" &&\n bucket !== null &&\n !Array.isArray(bucket) &&\n id in (bucket as Record<string, unknown>);\n return present\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${id}` }\n : { status: \"FAIL\", detail: `${MCP_ROOT_KEY}.${id} not found in ${path}` };\n },\n },\n {\n name: `${this.name}: hook command registered`,\n check: () => {\n if (hookEvents.length === 0) return { status: \"OK\", detail: \"no hooks declared\" };\n const cfg = readYaml<Record<string, unknown>>(path);\n const hooks = cfg?.[HOOKS_KEY];\n if (!hooks || typeof hooks !== \"object\" || Array.isArray(hooks)) {\n return { status: \"FAIL\", detail: `no ${HOOKS_KEY} section in ${path}` };\n }\n const registered = Object.values(hooks as Record<string, unknown>).some(\n (bucket) =>\n Array.isArray(bucket) &&\n (bucket as HermesHookEntry[]).some((e) =>\n isHomeBinHookCommand(e?.command, homeBin, id),\n ),\n );\n return registered\n ? { status: \"OK\", detail: \"hook command present\" }\n : { status: \"FAIL\", detail: `no hook for ${id} in ${path}` };\n },\n },\n ];\n }\n\n // ── Runtime: parse Hermes stdin JSON → normalized event ──────────────────\n\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\n const input = (raw ?? {}) as HermesWireInput;\n const base = {\n hostPlatform: HOST,\n connectorId: typeof input.connector === \"string\" ? input.connector : \"\",\n sessionId: typeof input.session_id === \"string\" ? input.session_id : \"\",\n ...(typeof input.cwd === \"string\" ? { projectDir: input.cwd } : {}),\n raw,\n } as const;\n\n switch (event) {\n case \"PreToolUse\": {\n const ev: PreToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n };\n return ev;\n }\n case \"PostToolUse\": {\n // Hermes may carry the result under tool_output or tool_response.\n const out = toStringOrUndefined(input.tool_output ?? input.tool_response);\n const ev: PostToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n ...(out !== undefined ? { toolOutput: out } : {}),\n ...(typeof input.is_error === \"boolean\" ? { isError: input.is_error } : {}),\n };\n return ev;\n }\n case \"SessionStart\": {\n const ev: SessionStartEvent = { ...base, source: normalizeSessionSource(input.source) };\n return ev;\n }\n case \"SessionEnd\": {\n const ev: SessionEndEvent = {\n ...base,\n ...(typeof input.reason === \"string\" ? { reason: input.reason } : {}),\n };\n return ev;\n }\n case \"UserPromptSubmit\": {\n const ev: UserPromptSubmitEvent = {\n ...base,\n prompt: typeof input.prompt === \"string\" ? input.prompt : \"\",\n };\n return ev;\n }\n case \"PreCompact\": {\n const ev: PreCompactEvent = {\n ...base,\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\n ? { trigger: input.trigger }\n : {}),\n };\n return ev;\n }\n case \"PostCompact\": {\n // Hermes does not fire PostCompact natively (postCompact unset →\n // warn-skip at install). Parsed defensively, mirroring PreCompact, so a\n // manual/mis-routed dispatch normalizes instead of hitting the guard.\n const ev: PostCompactEvent = {\n ...base,\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\n ? { trigger: input.trigger }\n : {}),\n };\n return ev;\n }\n case \"Stop\": {\n const ev: StopEvent = {\n ...base,\n ...(typeof input.stop_hook_active === \"boolean\"\n ? { stopHookActive: input.stop_hook_active }\n : {}),\n };\n return ev;\n }\n case \"Notification\": {\n const ev: NotificationEvent = {\n ...base,\n message: typeof input.message === \"string\" ? input.message : \"\",\n };\n return ev;\n }\n case \"SubagentStop\": {\n // agent_id/agent_type stay optional (some hosts never populate them);\n // Hermes' native child_id is accepted as the id fallback. child_status\n // is host-specific and stays accessible via `raw`.\n const agentId = input.agent_id ?? input.child_id;\n const ev: SubagentStopEvent = {\n ...base,\n ...(typeof agentId === \"string\" ? { agentId } : {}),\n ...(typeof input.agent_type === \"string\"\n ? { agentType: input.agent_type }\n : {}),\n ...(typeof input.last_assistant_message === \"string\"\n ? { lastAssistantMessage: input.last_assistant_message }\n : {}),\n ...(typeof input.stop_hook_active === \"boolean\"\n ? { stopHookActive: input.stop_hook_active }\n : {}),\n };\n return ev;\n }\n case \"PermissionRequest\":\n case \"PostToolUseFailure\":\n case \"SubagentStart\": {\n // No Hermes analog: pre_approval_request is observe-only (no decision\n // control), tool failures arrive merged into post_tool_call, and there\n // is no subagent_start. Install already skip-warns these; a runtime\n // dispatch is a mis-route — fail loudly.\n throw new Error(`unsupported hermes hook event: ${String(event)}`);\n }\n default: {\n const _never: never = event;\n throw new Error(`unsupported hermes hook event: ${String(_never)}`);\n }\n }\n }\n\n // ── Runtime: normalized response → Hermes native hook reply ──────────────\n // Hermes shell hooks read a JSON reply from stdout (exit 0 = allow). We emit a\n // Claude-like `hookSpecificOutput` wrapper; if Hermes' exact reply schema\n // differs, this is the single place to adjust the mapping.\n\n formatReply(event: HookEventName, response: HookResponse): HookReply {\n const decision = response.decision ?? \"allow\";\n\n if (decision === \"deny\") {\n // SubagentStop deny carries Stop semantics — it keeps the subagent\n // running with `reason` as its next instruction — and (like Claude's\n // Stop class) is honored only as the TOP-LEVEL {\"decision\":\"block\",\n // \"reason\"}, not as a permissionDecision envelope.\n if (event === \"SubagentStop\") {\n return this.stdout({\n decision: \"block\",\n reason: response.reason ?? \"Blocked by hook\",\n });\n }\n return this.stdout({\n hookSpecificOutput: {\n hookEventName: event,\n permissionDecision: \"deny\",\n permissionDecisionReason: response.reason ?? \"Blocked by hook\",\n },\n });\n }\n\n if (decision === \"ask\") {\n return this.stdout({\n hookSpecificOutput: {\n hookEventName: event,\n permissionDecision: \"ask\",\n permissionDecisionReason: response.reason ?? \"Confirmation required by hook\",\n },\n });\n }\n\n if (decision === \"context\" && response.additionalContext) {\n return this.stdout({\n hookSpecificOutput: { hookEventName: event, additionalContext: response.additionalContext },\n });\n }\n\n // allow / modify (unsupported — shell hooks can't rewrite args) / void.\n return { exitCode: 0 };\n }\n\n private stdout(payload: unknown): HookReply {\n return { exitCode: 0, stdout: JSON.stringify(payload) };\n }\n\n // ── Internal helpers ──────────────────────────────────────────────────────\n\n /** Resolve the per-platform server override into an effective ServerDef. */\n private effectiveServer(ctx: InstallContext): ServerDef | undefined {\n const override = ctx.connector.platforms[this.id]?.server;\n if (override === false) return undefined;\n const base = ctx.connector.server;\n if (!base) return undefined;\n return override && typeof override === \"object\" ? { ...base, ...override } : base;\n }\n\n /** Get-or-create an object bucket (map) at `cfg[key]`. */\n private objectBucket(cfg: Record<string, unknown>, key: string): Record<string, unknown> {\n const existing = cfg[key];\n if (existing && typeof existing === \"object\" && !Array.isArray(existing)) {\n return existing as Record<string, unknown>;\n }\n const fresh: Record<string, unknown> = {};\n cfg[key] = fresh;\n return fresh;\n }\n\n /** Get-or-create the hooks map at `cfg.hooks`. */\n private hooksBucket(cfg: Record<string, unknown>): Record<string, unknown> {\n return this.objectBucket(cfg, HOOKS_KEY);\n }\n}\n\n/** Coerce an unknown value into a string for the normalized event. */\nfunction toStringOrUndefined(value: unknown): string | undefined {\n if (value == null) return undefined;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport const adapter = new HermesAdapter();\nexport default adapter;\n"],"mappings":"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","names":["entry"]}
@@ -1,23 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  fail
4
- } from "./chunk-QC5A3TFQ.js";
5
- import "./chunk-H67V7DEL.js";
4
+ } from "./chunk-A2T4Q7RM.js";
5
+ import "./chunk-YYISBXOM.js";
6
6
  import "./chunk-OP4KBXUO.js";
7
- import "./chunk-F5RX62T7.js";
8
- import "./chunk-EROJDXMW.js";
7
+ import "./chunk-7QRUZAUG.js";
8
+ import "./chunk-NYR55UT7.js";
9
9
  import {
10
10
  isNativeHookDeclared,
11
11
  runHook,
12
12
  runNativeHook
13
- } from "./chunk-QOGMDOUX.js";
13
+ } from "./chunk-WI6YSXOC.js";
14
14
  import "./chunk-BCHWFTV4.js";
15
15
  import "./chunk-KHO5WNTP.js";
16
- import "./chunk-MZF2YCXX.js";
17
- import "./chunk-DCK5FADX.js";
18
- import "./chunk-BMD7ANKF.js";
16
+ import "./chunk-MOW2RKHX.js";
17
+ import "./chunk-HOE2MN36.js";
18
+ import "./chunk-XQUUNAGC.js";
19
19
  import "./chunk-FAHIMJRU.js";
20
- import "./chunk-I5MLE6S7.js";
20
+ import "./chunk-TO57WYBB.js";
21
21
  import "./chunk-N6HH7K6P.js";
22
22
  import "./chunk-TRQKHP7D.js";
23
23
 
@@ -93,4 +93,4 @@ export {
93
93
  HOOK_EVENTS,
94
94
  run
95
95
  };
96
- //# sourceMappingURL=hook-76JBKTUX.js.map
96
+ //# sourceMappingURL=hook-CDGSCASQ.js.map
package/dist/index.js CHANGED
@@ -11,8 +11,8 @@ import {
11
11
  defineSkill,
12
12
  defineStatusline,
13
13
  defineSubagent
14
- } from "./chunk-DCK5FADX.js";
15
- import "./chunk-BMD7ANKF.js";
14
+ } from "./chunk-HOE2MN36.js";
15
+ import "./chunk-XQUUNAGC.js";
16
16
  import "./chunk-FAHIMJRU.js";
17
17
  import "./chunk-N6HH7K6P.js";
18
18
  import "./chunk-TRQKHP7D.js";
@@ -3,29 +3,30 @@ import {
3
3
  installConnector,
4
4
  installViaMarketplace,
5
5
  parseInstallMethod
6
- } from "./chunk-5G4EPJ4Y.js";
7
- import "./chunk-2X4EH2D7.js";
8
- import "./chunk-G5CQHVQG.js";
6
+ } from "./chunk-VRKTVCYJ.js";
7
+ import "./chunk-CDVOBKSG.js";
8
+ import "./chunk-7TVBFRVI.js";
9
9
  import {
10
10
  fail,
11
11
  parseScope,
12
12
  parseTargets,
13
13
  print,
14
14
  renderInstallResult
15
- } from "./chunk-QC5A3TFQ.js";
16
- import "./chunk-F5RX62T7.js";
17
- import "./chunk-EROJDXMW.js";
15
+ } from "./chunk-A2T4Q7RM.js";
16
+ import "./chunk-7QRUZAUG.js";
17
+ import "./chunk-NYR55UT7.js";
18
18
  import "./chunk-KHO5WNTP.js";
19
19
  import {
20
20
  findConnectorConfig,
21
21
  loadConnectorFromPath
22
- } from "./chunk-MZF2YCXX.js";
23
- import "./chunk-DCK5FADX.js";
24
- import "./chunk-BMD7ANKF.js";
22
+ } from "./chunk-MOW2RKHX.js";
23
+ import "./chunk-HOE2MN36.js";
24
+ import "./chunk-XQUUNAGC.js";
25
25
  import "./chunk-FAHIMJRU.js";
26
+ import "./chunk-UM5S7DKK.js";
26
27
  import "./chunk-OPXAP3AC.js";
27
- import "./chunk-7L6ITC4T.js";
28
- import "./chunk-I5MLE6S7.js";
28
+ import "./chunk-IEGR4TP3.js";
29
+ import "./chunk-TO57WYBB.js";
29
30
  import "./chunk-N6HH7K6P.js";
30
31
  import "./chunk-TRQKHP7D.js";
31
32
 
@@ -89,4 +90,4 @@ async function run(argv) {
89
90
  export {
90
91
  run
91
92
  };
92
- //# sourceMappingURL=install-R7252QFH.js.map
93
+ //# sourceMappingURL=install-2D3UKEME.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/install.ts"],"sourcesContent":["/**\n * cli/commands/install — deploy a connector across its target platforms.\n *\n * Resolves the connector config (--connector <path>, else findConnectorConfig\n * walking up from the project dir), loads it into a live ResolvedConnector, and\n * hands it to the chosen DELIVERY METHOD's orchestration:\n *\n * --method direct (default) — the installer renders each host's native\n * MCP + hook + content config in place (zero behavior\n * change for existing scripts).\n * --method marketplace — stage the connector's plugin bundle under the\n * data-root and DRIVE the host's own plugin/marketplace\n * install flow (v1 driver: claude-code; other hosts get\n * never-silent skip/warn records with manual commands).\n *\n * Both methods emit the same ChangeRecords, rendered as a readable diff;\n * --dry-run renders the plan without writing or spawning. A double-install\n * guard (both directions) enforces exactly one method per (connector, host,\n * scope) — a refusal is a `warn` record, so the exit-1-on-warn convention\n * carries over.\n */\n\nimport { parseArgs } from \"node:util\";\n\nimport { installConnector } from \"../../core/installer.js\";\nimport { installViaMarketplace, parseInstallMethod } from \"../../core/marketplace.js\";\nimport { findConnectorConfig, loadConnectorFromPath } from \"../../core/load-connector.js\";\nimport { fail, parseScope, parseTargets, print, renderInstallResult } from \"../app.js\";\n\nexport async function run(argv: string[]): Promise<number> {\n const { values } = parseArgs({\n args: argv,\n options: {\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 // Memory surface: overwrite USER-EDITED managed blocks (hash drift).\n // Default behavior is warn-and-leave; --force backs the file up first.\n force: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\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 projectDir = values.project ?? process.cwd();\n const configPath = values.connector ?? findConnectorConfig(projectDir);\n if (!configPath) {\n return fail(\n \"no connector config found. Pass --connector <path> or add an \" +\n \"agent-connector.config.{mjs,js,json} to your project.\",\n );\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 const { connector, modulePath } = await loadConnectorFromPath(configPath);\n const targets = parseTargets(values.targets);\n\n const result =\n method === \"marketplace\"\n ? await installViaMarketplace({\n connector,\n modulePath,\n scope,\n projectDir,\n dryRun: values[\"dry-run\"],\n ...(targets ? { targets } : {}),\n })\n : await installConnector({\n connector,\n modulePath,\n scope,\n projectDir,\n dryRun: values[\"dry-run\"],\n force: values.force,\n ...(targets ? { targets } : {}),\n });\n\n print(renderInstallResult(result, \"install\"));\n return result.changes.some((c) => c.action === \"warn\") ? 1 : 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAS,iBAAiB;AAO1B,eAAsB,IAAI,MAAiC;AACzD,QAAM,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,QAAQ,EAAE,MAAM,UAAU,SAAS,SAAS;AAAA,MAC5C,OAAO,EAAE,MAAM,UAAU,SAAS,OAAO;AAAA,MACzC,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,WAAW,EAAE,MAAM,SAAS;AAAA,MAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,WAAW,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA;AAAA;AAAA,MAG7C,OAAO,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,IAC3C;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AAED,QAAM,SAAS,mBAAmB,OAAO,MAAM;AAC/C,MAAI,UAAU,MAAM;AAClB,WAAO,KAAK,qBAAqB,OAAO,MAAM,4BAA4B;AAAA,EAC5E;AAEA,QAAM,aAAa,OAAO,WAAW,QAAQ,IAAI;AACjD,QAAM,aAAa,OAAO,aAAa,oBAAoB,UAAU;AACrE,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,MAAI,SAAS,KAAM,QAAO,KAAK,oBAAoB,OAAO,KAAK,sBAAsB;AACrF,MAAI,WAAW,iBAAiB,UAAU,QAAQ;AAChD,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,WAAW,WAAW,IAAI,MAAM,sBAAsB,UAAU;AACxE,QAAM,UAAU,aAAa,OAAO,OAAO;AAE3C,QAAM,SACJ,WAAW,gBACP,MAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,SAAS;AAAA,IACxB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC/B,CAAC,IACD,MAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,SAAS;AAAA,IACxB,OAAO,OAAO;AAAA,IACd,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC/B,CAAC;AAEP,QAAM,oBAAoB,QAAQ,SAAS,CAAC;AAC5C,SAAO,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,IAAI,IAAI;AAC/D;","names":[]}
1
+ {"version":3,"sources":["../src/cli/commands/install.ts"],"sourcesContent":["/**\n * cli/commands/install — deploy a connector across its target platforms.\n *\n * Resolves the connector config (--connector <path>, else findConnectorConfig\n * walking up from the project dir), loads it into a live ResolvedConnector, and\n * hands it to the chosen DELIVERY METHOD's orchestration:\n *\n * --method direct (default) — the installer renders each host's native\n * MCP + hook + content config in place (zero behavior\n * change for existing scripts).\n * --method marketplace — stage the connector's plugin bundle under the\n * data-root and DRIVE the host's own plugin/marketplace\n * install flow (v1 driver: claude-code; other hosts get\n * never-silent skip/warn records with manual commands).\n *\n * Both methods emit the same ChangeRecords, rendered as a readable diff;\n * --dry-run renders the plan without writing or spawning. A double-install\n * guard (both directions) enforces exactly one method per (connector, host,\n * scope) — a refusal is a `warn` record, so the exit-1-on-warn convention\n * carries over.\n */\n\nimport { parseArgs } from \"node:util\";\n\nimport { installConnector } from \"../../core/installer.js\";\nimport { installViaMarketplace, parseInstallMethod } from \"../../core/marketplace.js\";\nimport { findConnectorConfig, loadConnectorFromPath } from \"../../core/load-connector.js\";\nimport { fail, parseScope, parseTargets, print, renderInstallResult } from \"../app.js\";\n\nexport async function run(argv: string[]): Promise<number> {\n const { values } = parseArgs({\n args: argv,\n options: {\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 // Memory surface: overwrite USER-EDITED managed blocks (hash drift).\n // Default behavior is warn-and-leave; --force backs the file up first.\n force: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\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 projectDir = values.project ?? process.cwd();\n const configPath = values.connector ?? findConnectorConfig(projectDir);\n if (!configPath) {\n return fail(\n \"no connector config found. Pass --connector <path> or add an \" +\n \"agent-connector.config.{mjs,js,json} to your project.\",\n );\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 const { connector, modulePath } = await loadConnectorFromPath(configPath);\n const targets = parseTargets(values.targets);\n\n const result =\n method === \"marketplace\"\n ? await installViaMarketplace({\n connector,\n modulePath,\n scope,\n projectDir,\n dryRun: values[\"dry-run\"],\n ...(targets ? { targets } : {}),\n })\n : await installConnector({\n connector,\n modulePath,\n scope,\n projectDir,\n dryRun: values[\"dry-run\"],\n force: values.force,\n ...(targets ? { targets } : {}),\n });\n\n print(renderInstallResult(result, \"install\"));\n return result.changes.some((c) => c.action === \"warn\") ? 1 : 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAS,iBAAiB;AAO1B,eAAsB,IAAI,MAAiC;AACzD,QAAM,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,QAAQ,EAAE,MAAM,UAAU,SAAS,SAAS;AAAA,MAC5C,OAAO,EAAE,MAAM,UAAU,SAAS,OAAO;AAAA,MACzC,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,WAAW,EAAE,MAAM,SAAS;AAAA,MAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,WAAW,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA;AAAA;AAAA,MAG7C,OAAO,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,IAC3C;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AAED,QAAM,SAAS,mBAAmB,OAAO,MAAM;AAC/C,MAAI,UAAU,MAAM;AAClB,WAAO,KAAK,qBAAqB,OAAO,MAAM,4BAA4B;AAAA,EAC5E;AAEA,QAAM,aAAa,OAAO,WAAW,QAAQ,IAAI;AACjD,QAAM,aAAa,OAAO,aAAa,oBAAoB,UAAU;AACrE,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,MAAI,SAAS,KAAM,QAAO,KAAK,oBAAoB,OAAO,KAAK,sBAAsB;AACrF,MAAI,WAAW,iBAAiB,UAAU,QAAQ;AAChD,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,WAAW,WAAW,IAAI,MAAM,sBAAsB,UAAU;AACxE,QAAM,UAAU,aAAa,OAAO,OAAO;AAE3C,QAAM,SACJ,WAAW,gBACP,MAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,SAAS;AAAA,IACxB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC/B,CAAC,IACD,MAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,SAAS;AAAA,IACxB,OAAO,OAAO;AAAA,IACd,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC/B,CAAC;AAEP,QAAM,oBAAoB,QAAQ,SAAS,CAAC;AAC5C,SAAO,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,IAAI,IAAI;AAC/D;","names":[]}
@@ -1,12 +1,17 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ normalizeSessionSource
4
+ } from "./chunk-H53QZQJI.js";
2
5
  import {
3
6
  BaseAdapter
4
- } from "./chunk-CPLK7GTE.js";
5
- import "./chunk-7L6ITC4T.js";
7
+ } from "./chunk-KG6T3YNJ.js";
8
+ import {
9
+ renderSkillMd
10
+ } from "./chunk-IEGR4TP3.js";
6
11
  import {
7
12
  buildHomeBinHookCommand,
8
13
  isHomeBinHookCommand
9
- } from "./chunk-I5MLE6S7.js";
14
+ } from "./chunk-TO57WYBB.js";
10
15
  import "./chunk-N6HH7K6P.js";
11
16
  import "./chunk-TRQKHP7D.js";
12
17
 
@@ -187,6 +192,8 @@ var JetBrainsCopilotAdapter = class extends BaseAdapter {
187
192
  }
188
193
  const hooksPath = this.getHookConfigPath(ctx);
189
194
  const file = this.readJson(hooksPath) ?? {};
195
+ const __skip = this.malformedHookRootSkip(hooksPath, file.hooks);
196
+ if (__skip) return [__skip];
190
197
  const hooks = file.hooks ??= {};
191
198
  const changes = [];
192
199
  let mutated = false;
@@ -423,7 +430,7 @@ var JetBrainsCopilotAdapter = class extends BaseAdapter {
423
430
  for (const skill of connector.skills) {
424
431
  const dir = this.skillDir(ctx, skill.name);
425
432
  changes.push(
426
- this.writeContentFile(join(dir, "SKILL.md"), this.renderSkill(skill), ctx.dryRun)
433
+ this.writeContentFile(join(dir, "SKILL.md"), renderSkillMd(skill), ctx.dryRun)
427
434
  );
428
435
  for (const [rel, contents] of Object.entries(skill.resources ?? {})) {
429
436
  const target = this.resolveWithin(dir, rel);
@@ -458,26 +465,6 @@ var JetBrainsCopilotAdapter = class extends BaseAdapter {
458
465
  }
459
466
  return changes;
460
467
  }
461
- /**
462
- * Render a skill's SKILL.md — the uniform Agent Skills format: frontmatter
463
- * (name, description + optional model, allowed-tools, disable-model-invocation)
464
- * + body. Byte-identical to the other .github-sharing connectors so a shared
465
- * skill folder never thrashes.
466
- */
467
- renderSkill(skill) {
468
- const frontmatter = {
469
- name: skill.name,
470
- description: skill.description
471
- };
472
- if (skill.model !== void 0) frontmatter.model = skill.model;
473
- const allow = skill.tools?.allow;
474
- if (allow && allow.length > 0) frontmatter["allowed-tools"] = allow.join(", ");
475
- if (skill.disableModelInvocation !== void 0) {
476
- frontmatter["disable-model-invocation"] = skill.disableModelInvocation;
477
- }
478
- if (skill.extra) Object.assign(frontmatter, skill.extra);
479
- return this.renderFrontmatterMd(frontmatter, skill.body);
480
- }
481
468
  // ── Diagnostics ──────────────────────────────────────────────────────────
482
469
  getHealthChecks(ctx) {
483
470
  const hooksPath = this.getHookConfigPath(ctx);
@@ -692,18 +679,6 @@ function toolResponseToString(value) {
692
679
  return String(value);
693
680
  }
694
681
  }
695
- function normalizeSessionSource(source) {
696
- switch (source) {
697
- case "compact":
698
- return "compact";
699
- case "resume":
700
- return "resume";
701
- case "clear":
702
- return "clear";
703
- default:
704
- return "startup";
705
- }
706
- }
707
682
  var adapter = new JetBrainsCopilotAdapter();
708
683
  var jetbrains_copilot_default = adapter;
709
684
  export {
@@ -711,4 +686,4 @@ export {
711
686
  adapter,
712
687
  jetbrains_copilot_default as default
713
688
  };
714
- //# sourceMappingURL=jetbrains-copilot-NRZHI5PC.js.map
689
+ //# sourceMappingURL=jetbrains-copilot-K26KMA3U.js.map