@springbrand/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/README.md +167 -0
  2. package/dist/commands/auth.d.ts +4 -0
  3. package/dist/commands/auth.d.ts.map +1 -0
  4. package/dist/commands/auth.js +241 -0
  5. package/dist/commands/auth.js.map +1 -0
  6. package/dist/commands/check-version.d.ts +3 -0
  7. package/dist/commands/check-version.d.ts.map +1 -0
  8. package/dist/commands/check-version.js +112 -0
  9. package/dist/commands/check-version.js.map +1 -0
  10. package/dist/commands/config-claude.d.ts +4 -0
  11. package/dist/commands/config-claude.d.ts.map +1 -0
  12. package/dist/commands/config-claude.js +78 -0
  13. package/dist/commands/config-claude.js.map +1 -0
  14. package/dist/commands/connect.d.ts +41 -0
  15. package/dist/commands/connect.d.ts.map +1 -0
  16. package/dist/commands/connect.js +901 -0
  17. package/dist/commands/connect.js.map +1 -0
  18. package/dist/commands/doctor.d.ts +6 -0
  19. package/dist/commands/doctor.d.ts.map +1 -0
  20. package/dist/commands/doctor.js +124 -0
  21. package/dist/commands/doctor.js.map +1 -0
  22. package/dist/commands/upgrade.d.ts +9 -0
  23. package/dist/commands/upgrade.d.ts.map +1 -0
  24. package/dist/commands/upgrade.js +133 -0
  25. package/dist/commands/upgrade.js.map +1 -0
  26. package/dist/index.d.ts +4 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +15 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lib/agent-detect.d.ts +33 -0
  31. package/dist/lib/agent-detect.d.ts.map +1 -0
  32. package/dist/lib/agent-detect.js +81 -0
  33. package/dist/lib/agent-detect.js.map +1 -0
  34. package/dist/lib/agent-launcher.d.ts +22 -0
  35. package/dist/lib/agent-launcher.d.ts.map +1 -0
  36. package/dist/lib/agent-launcher.js +67 -0
  37. package/dist/lib/agent-launcher.js.map +1 -0
  38. package/dist/lib/auth.d.ts +90 -0
  39. package/dist/lib/auth.d.ts.map +1 -0
  40. package/dist/lib/auth.js +327 -0
  41. package/dist/lib/auth.js.map +1 -0
  42. package/dist/lib/bundled-skill.d.ts +5 -0
  43. package/dist/lib/bundled-skill.d.ts.map +1 -0
  44. package/dist/lib/bundled-skill.js +13 -0
  45. package/dist/lib/bundled-skill.js.map +1 -0
  46. package/dist/lib/claude-config.d.ts +19 -0
  47. package/dist/lib/claude-config.d.ts.map +1 -0
  48. package/dist/lib/claude-config.js +202 -0
  49. package/dist/lib/claude-config.js.map +1 -0
  50. package/dist/lib/cli-install.d.ts +40 -0
  51. package/dist/lib/cli-install.d.ts.map +1 -0
  52. package/dist/lib/cli-install.js +42 -0
  53. package/dist/lib/cli-install.js.map +1 -0
  54. package/dist/lib/command-code-config.d.ts +5 -0
  55. package/dist/lib/command-code-config.d.ts.map +1 -0
  56. package/dist/lib/command-code-config.js +16 -0
  57. package/dist/lib/command-code-config.js.map +1 -0
  58. package/dist/lib/connect-all-auth.d.ts +21 -0
  59. package/dist/lib/connect-all-auth.d.ts.map +1 -0
  60. package/dist/lib/connect-all-auth.js +113 -0
  61. package/dist/lib/connect-all-auth.js.map +1 -0
  62. package/dist/lib/connect-all-summary.d.ts +10 -0
  63. package/dist/lib/connect-all-summary.d.ts.map +1 -0
  64. package/dist/lib/connect-all-summary.js +153 -0
  65. package/dist/lib/connect-all-summary.js.map +1 -0
  66. package/dist/lib/connect-all-uninstall.d.ts +7 -0
  67. package/dist/lib/connect-all-uninstall.d.ts.map +1 -0
  68. package/dist/lib/connect-all-uninstall.js +249 -0
  69. package/dist/lib/connect-all-uninstall.js.map +1 -0
  70. package/dist/lib/connect-all.d.ts +42 -0
  71. package/dist/lib/connect-all.d.ts.map +1 -0
  72. package/dist/lib/connect-all.js +438 -0
  73. package/dist/lib/connect-all.js.map +1 -0
  74. package/dist/lib/connect-auth.d.ts +7 -0
  75. package/dist/lib/connect-auth.d.ts.map +1 -0
  76. package/dist/lib/connect-auth.js +50 -0
  77. package/dist/lib/connect-auth.js.map +1 -0
  78. package/dist/lib/connect-clients.d.ts +108 -0
  79. package/dist/lib/connect-clients.d.ts.map +1 -0
  80. package/dist/lib/connect-clients.js +358 -0
  81. package/dist/lib/connect-clients.js.map +1 -0
  82. package/dist/lib/connect-fallback.d.ts +27 -0
  83. package/dist/lib/connect-fallback.d.ts.map +1 -0
  84. package/dist/lib/connect-fallback.js +166 -0
  85. package/dist/lib/connect-fallback.js.map +1 -0
  86. package/dist/lib/connect-picker.d.ts +19 -0
  87. package/dist/lib/connect-picker.d.ts.map +1 -0
  88. package/dist/lib/connect-picker.js +155 -0
  89. package/dist/lib/connect-picker.js.map +1 -0
  90. package/dist/lib/connect-preflight.d.ts +17 -0
  91. package/dist/lib/connect-preflight.d.ts.map +1 -0
  92. package/dist/lib/connect-preflight.js +81 -0
  93. package/dist/lib/connect-preflight.js.map +1 -0
  94. package/dist/lib/connect-runtime.d.ts +109 -0
  95. package/dist/lib/connect-runtime.d.ts.map +1 -0
  96. package/dist/lib/connect-runtime.js +360 -0
  97. package/dist/lib/connect-runtime.js.map +1 -0
  98. package/dist/lib/constants.d.ts +23 -0
  99. package/dist/lib/constants.d.ts.map +1 -0
  100. package/dist/lib/constants.js +87 -0
  101. package/dist/lib/constants.js.map +1 -0
  102. package/dist/lib/cursor-config.d.ts +16 -0
  103. package/dist/lib/cursor-config.d.ts.map +1 -0
  104. package/dist/lib/cursor-config.js +34 -0
  105. package/dist/lib/cursor-config.js.map +1 -0
  106. package/dist/lib/doctor-checks.d.ts +21 -0
  107. package/dist/lib/doctor-checks.d.ts.map +1 -0
  108. package/dist/lib/doctor-checks.js +312 -0
  109. package/dist/lib/doctor-checks.js.map +1 -0
  110. package/dist/lib/doctor-repairs.d.ts +11 -0
  111. package/dist/lib/doctor-repairs.d.ts.map +1 -0
  112. package/dist/lib/doctor-repairs.js +130 -0
  113. package/dist/lib/doctor-repairs.js.map +1 -0
  114. package/dist/lib/doctor-report.d.ts +195 -0
  115. package/dist/lib/doctor-report.d.ts.map +1 -0
  116. package/dist/lib/doctor-report.js +102 -0
  117. package/dist/lib/doctor-report.js.map +1 -0
  118. package/dist/lib/doctor-telemetry.d.ts +9 -0
  119. package/dist/lib/doctor-telemetry.d.ts.map +1 -0
  120. package/dist/lib/doctor-telemetry.js +63 -0
  121. package/dist/lib/doctor-telemetry.js.map +1 -0
  122. package/dist/lib/harness-detect.d.ts +33 -0
  123. package/dist/lib/harness-detect.d.ts.map +1 -0
  124. package/dist/lib/harness-detect.js +70 -0
  125. package/dist/lib/harness-detect.js.map +1 -0
  126. package/dist/lib/harness-spec.d.ts +285 -0
  127. package/dist/lib/harness-spec.d.ts.map +1 -0
  128. package/dist/lib/harness-spec.js +268 -0
  129. package/dist/lib/harness-spec.js.map +1 -0
  130. package/dist/lib/harness.d.ts +27 -0
  131. package/dist/lib/harness.d.ts.map +1 -0
  132. package/dist/lib/harness.js +125 -0
  133. package/dist/lib/harness.js.map +1 -0
  134. package/dist/lib/hermes-config.d.ts +22 -0
  135. package/dist/lib/hermes-config.d.ts.map +1 -0
  136. package/dist/lib/hermes-config.js +76 -0
  137. package/dist/lib/hermes-config.js.map +1 -0
  138. package/dist/lib/hermes-env.d.ts +19 -0
  139. package/dist/lib/hermes-env.d.ts.map +1 -0
  140. package/dist/lib/hermes-env.js +169 -0
  141. package/dist/lib/hermes-env.js.map +1 -0
  142. package/dist/lib/hermes-plugin.d.ts +40 -0
  143. package/dist/lib/hermes-plugin.d.ts.map +1 -0
  144. package/dist/lib/hermes-plugin.js +168 -0
  145. package/dist/lib/hermes-plugin.js.map +1 -0
  146. package/dist/lib/install-root.d.ts +18 -0
  147. package/dist/lib/install-root.d.ts.map +1 -0
  148. package/dist/lib/install-root.js +55 -0
  149. package/dist/lib/install-root.js.map +1 -0
  150. package/dist/lib/mcp-config.d.ts +36 -0
  151. package/dist/lib/mcp-config.d.ts.map +1 -0
  152. package/dist/lib/mcp-config.js +90 -0
  153. package/dist/lib/mcp-config.js.map +1 -0
  154. package/dist/lib/mcp-endpoint.d.ts +16 -0
  155. package/dist/lib/mcp-endpoint.d.ts.map +1 -0
  156. package/dist/lib/mcp-endpoint.js +41 -0
  157. package/dist/lib/mcp-endpoint.js.map +1 -0
  158. package/dist/lib/mcp-json-config.d.ts +43 -0
  159. package/dist/lib/mcp-json-config.d.ts.map +1 -0
  160. package/dist/lib/mcp-json-config.js +164 -0
  161. package/dist/lib/mcp-json-config.js.map +1 -0
  162. package/dist/lib/notice.d.ts +13 -0
  163. package/dist/lib/notice.d.ts.map +1 -0
  164. package/dist/lib/notice.js +73 -0
  165. package/dist/lib/notice.js.map +1 -0
  166. package/dist/lib/omp-config.d.ts +18 -0
  167. package/dist/lib/omp-config.d.ts.map +1 -0
  168. package/dist/lib/omp-config.js +73 -0
  169. package/dist/lib/omp-config.js.map +1 -0
  170. package/dist/lib/output.d.ts +22 -0
  171. package/dist/lib/output.d.ts.map +1 -0
  172. package/dist/lib/output.js +92 -0
  173. package/dist/lib/output.js.map +1 -0
  174. package/dist/lib/pi-config.d.ts +27 -0
  175. package/dist/lib/pi-config.d.ts.map +1 -0
  176. package/dist/lib/pi-config.js +113 -0
  177. package/dist/lib/pi-config.js.map +1 -0
  178. package/dist/lib/registration-detect.d.ts +28 -0
  179. package/dist/lib/registration-detect.d.ts.map +1 -0
  180. package/dist/lib/registration-detect.js +563 -0
  181. package/dist/lib/registration-detect.js.map +1 -0
  182. package/dist/lib/setup-telemetry.d.ts +273 -0
  183. package/dist/lib/setup-telemetry.d.ts.map +1 -0
  184. package/dist/lib/setup-telemetry.js +309 -0
  185. package/dist/lib/setup-telemetry.js.map +1 -0
  186. package/dist/lib/signals.d.ts +14 -0
  187. package/dist/lib/signals.d.ts.map +1 -0
  188. package/dist/lib/signals.js +29 -0
  189. package/dist/lib/signals.js.map +1 -0
  190. package/dist/lib/skill-install.d.ts +10 -0
  191. package/dist/lib/skill-install.d.ts.map +1 -0
  192. package/dist/lib/skill-install.js +94 -0
  193. package/dist/lib/skill-install.js.map +1 -0
  194. package/dist/lib/skill-paths.d.ts +7 -0
  195. package/dist/lib/skill-paths.d.ts.map +1 -0
  196. package/dist/lib/skill-paths.js +37 -0
  197. package/dist/lib/skill-paths.js.map +1 -0
  198. package/dist/lib/skill-vendor.d.ts +20 -0
  199. package/dist/lib/skill-vendor.d.ts.map +1 -0
  200. package/dist/lib/skill-vendor.js +215 -0
  201. package/dist/lib/skill-vendor.js.map +1 -0
  202. package/dist/lib/skill.d.ts +14 -0
  203. package/dist/lib/skill.d.ts.map +1 -0
  204. package/dist/lib/skill.js +87 -0
  205. package/dist/lib/skill.js.map +1 -0
  206. package/dist/lib/verify.d.ts +35 -0
  207. package/dist/lib/verify.d.ts.map +1 -0
  208. package/dist/lib/verify.js +169 -0
  209. package/dist/lib/verify.js.map +1 -0
  210. package/dist/program.d.ts +8 -0
  211. package/dist/program.d.ts.map +1 -0
  212. package/dist/program.js +54 -0
  213. package/dist/program.js.map +1 -0
  214. package/package.json +55 -0
  215. package/skill/springbrand-action-api/SKILL.md +49 -0
  216. package/skill/springbrand-action-api/references/action-aliases.md +156 -0
  217. package/skill/springbrand-action-api/references/action-discovery.md +95 -0
  218. package/skill/springbrand-connector/SKILL.md +49 -0
  219. package/skill/springbrand-gtm/SKILL.md +34 -0
  220. package/skill/springbrand-platform/SKILL.md +55 -0
  221. package/skill/springbrand-platform/references/plugin-discovery.md +94 -0
  222. package/skill/use-springbrand/SKILL.md +70 -0
@@ -0,0 +1,438 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:connect-all.d.ts + connect-all.impl.js */
2
+ import * as readline from 'node:readline/promises';
3
+ import { harnessSpec } from './harness-spec.js';
4
+ import spawn from 'cross-spawn';
5
+ import { connectHarness } from '../commands/connect.js';
6
+ import { loadConfig, validatedApiKey } from './auth.js';
7
+ import { installSpringBrandCli, } from './cli-install.js';
8
+ import { authGate, mapConnectError, OAUTH_SIGN_IN_TIMEOUT_MS } from './connect-all-auth.js';
9
+ import { actionable, computeExitCode, reloadHint, renderSummary } from './connect-all-summary.js';
10
+ import { planText, uninstallHarness, uninstallPlanText } from './connect-all-uninstall.js';
11
+ import { createStdinPrompt, runCliFallback } from './connect-fallback.js';
12
+ import { gateApiKey } from './connect-preflight.js';
13
+ import { ConnectInterruptedError } from './connect-runtime.js';
14
+ import { pickHarnesses } from './connect-picker.js';
15
+ import { commandOnPath, detectInstalledHarnesses, HARNESS_COMMANDS, HARNESS_DISPLAY_NAMES as DISPLAY_NAMES, ALL_HARNESSES, } from './harness-detect.js';
16
+ import { detectHumanInitiated } from './harness.js';
17
+ import { emitNotice } from './notice.js';
18
+ import { errLine, outLine, setErrIndent } from './output.js';
19
+ import { sendSetupCompleted, sendSetupStarted, } from './setup-telemetry.js';
20
+ import { verifyMcpAuth, verifyMcpHealth } from './verify.js';
21
+ const STEP_INDENT = ' ';
22
+ /** Undefined means Ctrl+C: the caller stops the whole run. */
23
+ function runHoistedCliInstall(verbose) {
24
+ const startedAt = Date.now();
25
+ try {
26
+ installSpringBrandCli({ verbose, announce: true });
27
+ // Clamped: a backward clock step would send a route-rejected negative.
28
+ return { ok: true, durationMs: Math.max(0, Date.now() - startedAt) };
29
+ }
30
+ catch (error) {
31
+ if (error instanceof ConnectInterruptedError)
32
+ return undefined;
33
+ return {
34
+ ok: false,
35
+ durationMs: Math.max(0, Date.now() - startedAt),
36
+ error: error instanceof Error ? error : new Error(String(error)),
37
+ };
38
+ }
39
+ }
40
+ async function verifyHarness(harness, mcpUrl, keyed, apiKey) {
41
+ const health = await verifyMcpHealth(mcpUrl);
42
+ // The own-OAuth harnesses are auth-checkable only in key mode (key-authed config).
43
+ const capable = harnessSpec(harness).canVerifyAuth || keyed;
44
+ if (!capable || !health.ok)
45
+ return health;
46
+ if (!apiKey)
47
+ return { depth: 'health+auth', ok: false, reason: 'no stored API key' };
48
+ return verifyMcpAuth(apiKey);
49
+ }
50
+ /** The non-connect settlements: undetected, stale, dry-run, uninstall. */
51
+ function settleWithoutConnect(detection, opts, base) {
52
+ const { harness, configPath } = detection;
53
+ const noWork = noWorkOutcome(detection, opts.uninstall);
54
+ if (noWork === 'not_detected')
55
+ return { ...base, outcome: noWork };
56
+ if (noWork)
57
+ return { ...base, outcome: noWork, fixCommand: `sp connect ${harness}` };
58
+ // dryRun first: --dry-run --uninstall must plan, never reach removeCursorMcpServer().
59
+ if (opts.dryRun) {
60
+ const plan = opts.uninstall
61
+ ? uninstallPlanText(harness)
62
+ : planText(harness, opts.mcpUrl, validatedApiKey(opts.apiKey));
63
+ return { ...base, outcome: 'dry_run', fixCommand: plan };
64
+ }
65
+ if (opts.uninstall) {
66
+ return uninstallHarness(harness, configPath, opts.verbose ?? false, detection.binaryOnPath);
67
+ }
68
+ return undefined;
69
+ }
70
+ async function processHarness(detection, opts, prompt, oauthBudget, hoistedCliInstall, deferOutro) {
71
+ const { harness, configPath, detected } = detection;
72
+ const base = { harness, detected, configPath, installed: false };
73
+ const settled = settleWithoutConnect(detection, opts, base);
74
+ if (settled)
75
+ return settled;
76
+ const isTTY = detectHumanInitiated();
77
+ const apiKey = validatedApiKey(opts.apiKey);
78
+ // All harnesses carry a key; one that cannot fails harness_too_old.
79
+ const keyed = !!apiKey;
80
+ const fixCommand = `sp connect ${harness}`;
81
+ const gate = await authGate(base, oauthBudget, fixCommand, { prompt, isTTY, keyed });
82
+ if (gate.result)
83
+ return gate.result;
84
+ const { headlessAuth, spentBrowserSlot } = gate;
85
+ // runGuarded swallows Ctrl+C and sets exitCode 130 instead of throwing.
86
+ const interruptedBefore = process.exitCode === 130;
87
+ let authMode;
88
+ let postInstallFailed = false;
89
+ try {
90
+ // A keyed install too old for key auth fails, no browser.
91
+ authMode = await connectHarness(harness, {
92
+ apiKey: opts.apiKey,
93
+ mcpUrl: opts.mcpUrl,
94
+ launch: false,
95
+ verbose: opts.verbose,
96
+ keyAuthOnly: keyed && !isTTY,
97
+ authTimeoutMs: headlessAuth ? OAUTH_SIGN_IN_TIMEOUT_MS : undefined,
98
+ hoistedCliInstall,
99
+ onPostInstallFailed: () => {
100
+ postInstallFailed = true;
101
+ },
102
+ deferOutro,
103
+ });
104
+ }
105
+ catch (e) {
106
+ return mapConnectError(base, e, oauthBudget, spentBrowserSlot, fixCommand);
107
+ }
108
+ if (!interruptedBefore && process.exitCode === 130) {
109
+ return { ...base, outcome: 'interrupted', fixCommand };
110
+ }
111
+ // The probe, not the flag, decides: a harness that degraded to OAuth is not key-authed.
112
+ const keyAuthed = authMode ? authMode === 'api-key' : keyed;
113
+ const verify = await verifyHarness(harness, opts.mcpUrl, keyAuthed, apiKey);
114
+ return {
115
+ ...base,
116
+ installed: true,
117
+ outcome: 'installed',
118
+ verifyDepth: verify.depth,
119
+ verifyOk: verify.ok,
120
+ verifyReason: verify.reason,
121
+ keyAuthed,
122
+ postInstallFailed,
123
+ };
124
+ }
125
+ /** The states processHarness settles without work; stepTotal must agree with it. */
126
+ function noWorkOutcome(d, uninstall) {
127
+ if (!d.detected)
128
+ return 'not_detected';
129
+ if (!uninstall && isStaleConfig(d))
130
+ return 'stale_config';
131
+ if (!uninstall && needsFirstRun(d))
132
+ return 'needs_first_run';
133
+ return undefined;
134
+ }
135
+ /** The harness has never created its dir, so connecting would build one it does not own. */
136
+ export function needsFirstRun(detection) {
137
+ return detection.detected && !detection.configDirExists;
138
+ }
139
+ /** A config-writing connect needs no binary; every other harness spawns one. */
140
+ function isStaleConfig(detection) {
141
+ const spec = harnessSpec(detection.harness);
142
+ // Cursor's IDE reads mcp.json binary-less; omp and pi have no second reader.
143
+ const binaryless = spec.cliWritesConfig && spec.readableWithoutBinary;
144
+ return detection.detected && !detection.binaryOnPath && !binaryless;
145
+ }
146
+ async function resolvePick(detections, opts, prompt) {
147
+ let deselected = new Set();
148
+ let mode = 'all';
149
+ // Before willAttempt/cliNeeded: a cursor-only pick must not hoist the CLI.
150
+ // A stale config dir has no binary to connect, so never offer it as a choice.
151
+ const offerable = detections.filter((d) => d.detected && !isStaleConfig(d) && !needsFirstRun(d));
152
+ if (opts.pick && offerable.length > 0) {
153
+ const connected = new Set(Object.keys(loadConfig().connect ?? {}));
154
+ const pick = await pickHarnesses(offerable, connected, { prompt });
155
+ mode = pick.mode;
156
+ if (pick.selection === 'cancel') {
157
+ return { deselected, mode, cancelled: true };
158
+ }
159
+ const chosen = new Set(pick.selection);
160
+ deselected = new Set(offerable.filter((d) => !chosen.has(d.harness)).map((d) => d.harness));
161
+ }
162
+ return { deselected, mode, cancelled: false };
163
+ }
164
+ /** 'interrupted' stops the whole run; undefined means no hoist was needed. */
165
+ function hoistCliIfNeeded(detections, opts, willAttempt) {
166
+ // Machine-global, so once per invocation; config-writing connects never install it.
167
+ const cliNeeded = !opts.dryRun &&
168
+ !opts.uninstall &&
169
+ detections.some((d) => d.detected &&
170
+ d.binaryOnPath &&
171
+ !harnessSpec(d.harness).cliWritesConfig &&
172
+ willAttempt(d.harness));
173
+ if (!cliNeeded)
174
+ return undefined;
175
+ errLine('First: the SpringBrand CLI, shared by every harness.');
176
+ const outcome = runHoistedCliInstall(opts.verbose ?? false);
177
+ if (!outcome)
178
+ return 'interrupted';
179
+ let taken = false;
180
+ // Every harness gets the outcome; only the first take reports it.
181
+ const take = () => {
182
+ const firstTake = !taken;
183
+ taken = true;
184
+ return { outcome, firstTake };
185
+ };
186
+ return take;
187
+ }
188
+ async function connectLoop(detections, opts, deselected, io) {
189
+ const results = [];
190
+ const oauthBudget = { spent: false };
191
+ // Shares processHarness's no-work states so stepTotal cannot desync.
192
+ const stepped = (d) => !deselected.has(d.harness) && !noWorkOutcome(d, opts.uninstall);
193
+ const stepTotal = detections.filter(stepped).length;
194
+ let step = 0;
195
+ for (const detection of detections) {
196
+ const { harness } = detection;
197
+ if (deselected.has(harness)) {
198
+ results.push({
199
+ ...detection,
200
+ installed: false,
201
+ outcome: 'deselected',
202
+ fixCommand: `sp connect ${harness}`,
203
+ });
204
+ continue;
205
+ }
206
+ // The pad loop below records these; announcing them is the noise this command had.
207
+ if (!stepped(detection))
208
+ continue;
209
+ step += 1;
210
+ errLine(`step ${step} of ${stepTotal} — ${DISPLAY_NAMES[harness]}`);
211
+ let result;
212
+ try {
213
+ setErrIndent(STEP_INDENT);
214
+ result = await processHarness(detection, opts, io.prompt, oauthBudget, io.takeHoistedCli, (line) => io.outro.add(line));
215
+ // A failed harness prints nothing of its own, so its step reads as skipped.
216
+ if (result.outcome === 'failed' && result.errorMessage)
217
+ errLine(result.errorMessage);
218
+ }
219
+ catch (e) {
220
+ const errorMessage = e instanceof Error ? e.message : String(e);
221
+ errLine(errorMessage);
222
+ // Isolation: one harness throwing never stops the others.
223
+ result = {
224
+ harness,
225
+ detected: detection.detected,
226
+ configPath: detection.configPath,
227
+ installed: false,
228
+ outcome: 'failed',
229
+ errorMessage,
230
+ fixCommand: `sp connect ${harness}`,
231
+ };
232
+ }
233
+ finally {
234
+ // The summary and the outro sit outside any step.
235
+ setErrIndent('');
236
+ }
237
+ results.push(result);
238
+ // Ctrl+C means stop, not continue to the next harness.
239
+ if (result.outcome === 'interrupted')
240
+ break;
241
+ }
242
+ // The interrupt break truncates `results`; pad so the one-row-per-harness schema still parses.
243
+ for (const detection of detections) {
244
+ if (results.some((r) => r.harness === detection.harness))
245
+ continue;
246
+ const { harness, detected, configPath } = detection;
247
+ // One source of truth with `stepped`, or a skipped harness lands on the wrong row.
248
+ const noWork = noWorkOutcome(detection, opts.uninstall);
249
+ results.push({
250
+ harness,
251
+ detected,
252
+ configPath,
253
+ installed: false,
254
+ outcome: noWork ?? 'not_reached',
255
+ fixCommand: `sp connect ${detection.harness}`,
256
+ });
257
+ }
258
+ return results;
259
+ }
260
+ async function noActionableExit(results, opts, prompt) {
261
+ if (!opts.dryRun && !opts.uninstall) {
262
+ try {
263
+ const outcome = await runCliFallback({
264
+ apiKey: opts.apiKey,
265
+ verbose: opts.verbose ?? false,
266
+ prompt,
267
+ retryCommand: 'npx @springbrand/cli connect --all',
268
+ });
269
+ return outcome === 'cli_verified' ? 0 : 1;
270
+ }
271
+ catch (error) {
272
+ if (!(error instanceof ConnectInterruptedError))
273
+ throw error;
274
+ errLine('Setup interrupted — run the command again to finish.');
275
+ process.exitCode = 130;
276
+ return 130;
277
+ }
278
+ }
279
+ const stale = results.filter((r) => r.outcome === 'stale_config');
280
+ outLine('');
281
+ outLine(stale.length > 0
282
+ ? `No runnable harness found. Reinstall ${stale.map((r) => DISPLAY_NAMES[r.harness]).join(', ')}, or install one of: ${ALL_HARNESSES.join(', ')}`
283
+ : 'No supported harness found. Install one of: ' + ALL_HARNESSES.join(', '));
284
+ if (!opts.uninstall)
285
+ outLine('Then run: npx @springbrand/cli connect --all');
286
+ return 1;
287
+ }
288
+ async function finishRun(results, opts, isTTY) {
289
+ const exitCode = computeExitCode(results);
290
+ const interrupted = results.some((r) => r.outcome === 'interrupted');
291
+ if (exitCode === 0 &&
292
+ !interrupted &&
293
+ !opts.dryRun &&
294
+ !opts.uninstall &&
295
+ results.some((r) => r.installed)) {
296
+ outLine('');
297
+ if (isTTY && !opts.noLaunch && (await launchFirstTask(results))) {
298
+ return exitCode;
299
+ }
300
+ outLine('Now ask your agent: "use SpringBrand to find today\'s top Hacker News story"');
301
+ }
302
+ return exitCode;
303
+ }
304
+ /** Neither path needs a live key, and neither writes a registration. */
305
+ function keyGateApplies(opts) {
306
+ return !opts.uninstall && !opts.dryRun;
307
+ }
308
+ async function blockedByKeyGate(opts) {
309
+ if (!keyGateApplies(opts))
310
+ return false;
311
+ const pick = opts.pick === true;
312
+ const gate = await gateApiKey({
313
+ apiKey: opts.apiKey,
314
+ mcpUrl: opts.mcpUrl,
315
+ // The picker path is reached by a bare `sp connect`.
316
+ retryCommand: pick ? 'sp connect' : 'sp connect --all',
317
+ mode: pick ? 'pick' : 'all',
318
+ attemptId: opts.attemptId,
319
+ });
320
+ return gate === 'blocked';
321
+ }
322
+ export async function runConnectAll(opts) {
323
+ const isTTY = detectHumanInitiated();
324
+ // Above the setup event and every write: a blocked run is not a setup attempt.
325
+ if (await blockedByKeyGate(opts))
326
+ return 1;
327
+ // Ahead of detection and the hoisted install; either can end the process silently.
328
+ // Not on the picker path: an explicit cancel is not a setup.
329
+ if (keyGateApplies(opts) && !opts.pick) {
330
+ // validatedApiKey falls back to env/config; opts.apiKey alone splits the run's two ends.
331
+ await sendSetupStarted(opts.mcpUrl, opts.attemptId);
332
+ }
333
+ // Open interface holds stdin raw; hermes' input() then wedges.
334
+ const prompt = isTTY ? createStdinPrompt() : undefined;
335
+ const detections = detectInstalledHarnesses();
336
+ const gateKey = validatedApiKey(opts.apiKey);
337
+ const pick = await resolvePick(detections, opts, prompt);
338
+ if (pick.cancelled) {
339
+ // Before summary and telemetry: an explicit nothing is not a setup.
340
+ outLine('Nothing installed. Run: sp connect --all or sp connect <client>');
341
+ return 0;
342
+ }
343
+ const { deselected, mode } = pick;
344
+ // Mirrors processHarness's gate: headless, only keyless CLI-login harnesses skip.
345
+ const willAttempt = (harness) => !deselected.has(harness) && (isTTY || !harnessSpec(harness).signInViaCliLogin || !!gateKey);
346
+ const hoisted = hoistCliIfNeeded(detections, opts, willAttempt);
347
+ if (hoisted === 'interrupted') {
348
+ errLine('Setup interrupted — run the command again to finish.');
349
+ return 130;
350
+ }
351
+ // A Set dedupes: Codex and Grok defer the same export line.
352
+ const outro = new Set();
353
+ const results = await connectLoop(detections, opts, deselected, {
354
+ prompt,
355
+ takeHoistedCli: hoisted,
356
+ outro,
357
+ });
358
+ outLine('');
359
+ outLine('SpringBrand setup summary:');
360
+ for (const line of renderSummary(results, opts.uninstall))
361
+ outLine(line);
362
+ const reload = opts.uninstall ? undefined : reloadHint(results);
363
+ if (reload) {
364
+ outLine('');
365
+ outLine(reload);
366
+ }
367
+ // Before the launch handover: anything printed after it is never seen.
368
+ for (const line of outro)
369
+ errLine(line);
370
+ if (!results.some(actionable)) {
371
+ return noActionableExit(results, opts, prompt);
372
+ }
373
+ if (!opts.dryRun && !opts.uninstall) {
374
+ const harnessTelemetry = results.map((r) => ({
375
+ harness: r.harness,
376
+ // TODO(PF-3668): send outcome per harness instead; the frontend strips
377
+ // unknown harness keys, so the CLI can ship it before the reader does.
378
+ detected: actionable(r),
379
+ installed: r.installed,
380
+ verify_depth: r.verifyDepth ?? null,
381
+ verify_ok: r.verifyOk ?? null,
382
+ }));
383
+ await sendSetupCompleted(opts.mcpUrl, harnessTelemetry, mode, opts.attemptId);
384
+ // After the summary and before the launch, which is where the user is reading.
385
+ emitNotice();
386
+ }
387
+ return finishRun(results, opts, isTTY);
388
+ }
389
+ export const FIRST_TASK_PROMPT = 'My SpringBrand setup just finished — verify it with a real run. Use the MCP server named ' +
390
+ '`springbrand` for every SpringBrand tool call; if another SpringBrand server is also registered, still ' +
391
+ 'use `springbrand` and do not ask me which. Call `search_tools` with an English query — finding ' +
392
+ "today's top Hacker News story is a good low-risk start — show me the results, and let me pick " +
393
+ 'one before calling `get_tool_schemas` for its contract. If the operation needs an account I have ' +
394
+ 'not linked yet, use `manage_connections` first and show me the authorization link unchanged. ' +
395
+ 'Tell me the arguments you will pass and wait for my confirmation before `execute_tools`; if the ' +
396
+ 'result returns an execution ID, check its status with `get_execution`. Show which tools you call. ' +
397
+ 'If a tool call comes back unconnected, blocked, or not approved, tell me which tool needs ' +
398
+ 'approval or connection and how to grant it, then wait for me instead of abandoning, retrying, ' +
399
+ 'or guessing tool names.';
400
+ // Launchable seeded agents, best-first — cursor-agent shares ~/.cursor/mcp.json with the IDE.
401
+ const LAUNCHERS = [
402
+ { harness: 'cursor', args: [FIRST_TASK_PROMPT] },
403
+ { harness: 'claude-code', args: [FIRST_TASK_PROMPT] },
404
+ { harness: 'omp', args: [FIRST_TASK_PROMPT] },
405
+ { harness: 'pi', args: [FIRST_TASK_PROMPT] },
406
+ ];
407
+ async function launchFirstTask(results) {
408
+ const candidates = LAUNCHERS.filter((l) => results.some((r) => r.harness === l.harness && r.installed) &&
409
+ commandOnPath(HARNESS_COMMANDS[l.harness]));
410
+ if (candidates.length === 0)
411
+ return false;
412
+ // Several installs: ask rather than pick a favorite; plain enter skips.
413
+ let chosen = candidates[0];
414
+ if (candidates.length > 1) {
415
+ const menu = candidates.map((l, i) => `[${i + 1}] ${DISPLAY_NAMES[l.harness]}`).join(' ');
416
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
417
+ let answer;
418
+ try {
419
+ answer = await rl.question(`Try your first SpringBrand task now? ${menu} [enter] skip: `);
420
+ }
421
+ catch {
422
+ return false;
423
+ }
424
+ finally {
425
+ rl.close();
426
+ }
427
+ const pick = Number.parseInt(answer.trim(), 10);
428
+ if (!pick || pick < 1 || pick > candidates.length)
429
+ return false;
430
+ chosen = candidates[pick - 1];
431
+ }
432
+ if (!chosen)
433
+ return false;
434
+ outLine(`Starting ${DISPLAY_NAMES[chosen.harness]} with your first SpringBrand task...`);
435
+ const result = spawn.sync(HARNESS_COMMANDS[chosen.harness], chosen.args, { stdio: 'inherit' });
436
+ return !result.error;
437
+ }
438
+ //# sourceMappingURL=connect-all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-all.js","sourceRoot":"","sources":["../../src/lib/connect-all.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:connect-auth.d.ts + connect-auth.impl.js */
2
+ import type { AgentClient } from './connect-runtime.js';
3
+ export declare const SPRINGBRAND_CLI_NOT_FOUND_MESSAGE = "SpringBrand CLI installed but is not available on PATH. Open a new terminal and retry.";
4
+ export declare function ensureCliAuthenticated(source: AgentClient | 'cli', apiKey?: string, opts?: {
5
+ interactiveLogin?: boolean;
6
+ }): void;
7
+ //# sourceMappingURL=connect-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-auth.d.ts","sourceRoot":"","sources":["../../src/lib/connect-auth.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMxD,eAAO,MAAM,iCAAiC,2FAA2F,CAAC;AAC1I,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IACxF,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,IAAI,CAyCP"}
@@ -0,0 +1,50 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:connect-auth.d.ts + connect-auth.impl.js */
2
+ import spawn from 'cross-spawn';
3
+ import { SPRINGBRAND_API_KEY_VAR } from './constants.js';
4
+ import { persistApiKeyToEnvironment, validateKeyFormat, writeConfig } from './auth.js';
5
+ import { commandNotFound, ConnectStepError, spawnStepError, throwIfInterrupted, NON_INTERACTIVE_TIMEOUT_MS, } from './connect-runtime.js';
6
+ import { errLine } from './output.js';
7
+ export const SPRINGBRAND_CLI_NOT_FOUND_MESSAGE = 'SpringBrand CLI installed but is not available on PATH. Open a new terminal and retry.';
8
+ export function ensureCliAuthenticated(source, apiKey, opts) {
9
+ const envKey = apiKey ?? process.env[SPRINGBRAND_API_KEY_VAR];
10
+ if (envKey) {
11
+ if (!validateKeyFormat(envKey)) {
12
+ throw new ConnectStepError('SPRINGBRAND_API_KEY has invalid format', 'invalid_config', {
13
+ failureDetail: 'env_key_invalid_format',
14
+ });
15
+ }
16
+ // Throwing variant: a write failure must reach connect's catch/flush, not exit(1) past it.
17
+ writeConfig(envKey);
18
+ persistApiKeyToEnvironment(envKey);
19
+ return;
20
+ }
21
+ const authStatus = spawn.sync('sp', ['auth', 'status'], {
22
+ stdio: 'ignore',
23
+ timeout: NON_INTERACTIVE_TIMEOUT_MS,
24
+ });
25
+ if (commandNotFound(authStatus.error)) {
26
+ throw spawnStepError(SPRINGBRAND_CLI_NOT_FOUND_MESSAGE, authStatus);
27
+ }
28
+ if (authStatus.status === 0)
29
+ return;
30
+ // A crashed or timed-out probe says nothing about the stored key, so it must not read as
31
+ // "not signed in" and drop the user into an interactive login they never asked for.
32
+ throwIfInterrupted(authStatus);
33
+ if (authStatus.error) {
34
+ throw spawnStepError('Could not read SpringBrand CLI auth status', authStatus);
35
+ }
36
+ if (opts?.interactiveLogin === false) {
37
+ throw new Error('The SpringBrand CLI is not signed in. Run: sp auth login');
38
+ }
39
+ errLine('Signing in to the SpringBrand CLI...');
40
+ const loginResult = spawn.sync('sp', ['auth', 'login', '--source', source], {
41
+ stdio: 'inherit',
42
+ });
43
+ if (commandNotFound(loginResult.error)) {
44
+ throw spawnStepError(SPRINGBRAND_CLI_NOT_FOUND_MESSAGE, loginResult);
45
+ }
46
+ if (loginResult.error || loginResult.status !== 0) {
47
+ throw spawnStepError('Could not authenticate the SpringBrand CLI', loginResult);
48
+ }
49
+ }
50
+ //# sourceMappingURL=connect-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-auth.js","sourceRoot":"","sources":["../../src/lib/connect-auth.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAGtE,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,0BAA0B,GAAG,MAAM,sBAAsB,CAAC;AAC1I,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,MAAM,CAAC,MAAM,iCAAiC,GAAG,wFAAwF,CAAC;AAC1I,MAAM,UAAU,sBAAsB,CAAC,MAA2B,EAAE,MAAe,EAAE,IAEpF;IACG,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC9D,IAAI,MAAM,EAAE,CAAC;QACT,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,gBAAgB,CAAC,wCAAwC,EAAE,gBAAgB,EAAE;gBACnF,aAAa,EAAE,wBAAwB;aAC1C,CAAC,CAAC;QACP,CAAC;QACD,2FAA2F;QAC3F,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO;IACX,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;QACpD,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,0BAA0B;KACtC,CAAC,CAAC;IACH,IAAI,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,cAAc,CAAC,iCAAiC,EAAE,UAAU,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QACvB,OAAO;IACX,yFAAyF;IACzF,oFAAoF;IACpF,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC/B,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,cAAc,CAAC,4CAA4C,EAAE,UAAU,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,IAAI,EAAE,gBAAgB,KAAK,KAAK,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,CAAC,sCAAsC,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE;QACxE,KAAK,EAAE,SAAS;KACnB,CAAC,CAAC;IACH,IAAI,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,cAAc,CAAC,iCAAiC,EAAE,WAAW,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,cAAc,CAAC,4CAA4C,EAAE,WAAW,CAAC,CAAC;IACpF,CAAC;AACL,CAAC"}
@@ -0,0 +1,108 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:connect-clients.d.ts + connect-clients.impl.js */
2
+ import type { AgentClient, SupportedCommand } from './connect-runtime.js';
3
+ import type { HarnessSpec, SkillAgent } from './harness-spec.js';
4
+ import spawn from 'cross-spawn';
5
+ export declare function openclawSkillInstallArgs(ackFlag: string | undefined): string[];
6
+ /** `openclaw skills` has no uninstall; ClawHub removes from the global dir. */
7
+ export declare function openclawSkillUninstall(): {
8
+ command: string;
9
+ args: string[];
10
+ /** npx fetches the package first; the 10s removal bound starves a cold cache. */
11
+ timeoutMs: number;
12
+ };
13
+ export declare const DEFAULT_ONBOARDING_PROMPT: string;
14
+ export declare const OPENCLAW_ONBOARDING_PROMPT: string;
15
+ /** Cursor writes its own MCP config, so it has no descriptor to carry this. */
16
+ export declare const CURSOR_SKILL_TARGET: {
17
+ readonly skillAgent: "cursor";
18
+ readonly displayName: string;
19
+ };
20
+ /**
21
+ * `cmd` re-parses its command line after `/c`, so an unquoted `&` in the query string ends the
22
+ * command and truncates the URL. Quoting needs windowsVerbatimArguments, or Node escapes the
23
+ * quotes back out. Untested on Windows.
24
+ */
25
+ export declare function openExternalUrl(url: string): ReturnType<typeof spawn.sync>;
26
+ /** Writes exit 0 having saved nothing, a disabled entry, or a keyless one. */
27
+ export declare function hermesRegistrationEnabled(home: string): {
28
+ ok: boolean;
29
+ detail?: string;
30
+ tag?: string;
31
+ };
32
+ export declare const NATIVE_MCP_CLIENTS: readonly NativeMcpClient[];
33
+ /** Native descriptor by harness id; Cursor and OpenClaw have none. */
34
+ export declare const NATIVE_BY_HARNESS: Map<"openclaw" | "omp" | "grok" | "cursor" | "codex" | "hermes" | "command-code" | "opencode" | "pi" | "claude-code", NativeMcpClient>;
35
+ export declare const OPENCLAW: SupportedCommand;
36
+ export declare function launchNativeMcpClient(client: NativeMcpClient, onDecided?: OnWalkthroughDecided): Promise<WalkthroughOutcome>;
37
+ export declare function launchOmpWalkthrough(onDecided?: OnWalkthroughDecided): Promise<WalkthroughOutcome>;
38
+ export declare function launchPiWalkthrough(onDecided?: OnWalkthroughDecided): Promise<WalkthroughOutcome>;
39
+ export declare function launchOpenClawWalkthrough(onDecided?: OnWalkthroughDecided): Promise<WalkthroughOutcome>;
40
+ interface SeededInstall {
41
+ /** Reused by the plugin step, so a second probe cannot disagree. */
42
+ home: string;
43
+ /** Pins the add child at the home the key landed in. */
44
+ env: typeof process.env;
45
+ /** Answers prompts `mcp add` still asks once the key is seeded. */
46
+ stdinInput: string;
47
+ /** Names the file it wrote, never the value. */
48
+ note: string;
49
+ /** Undoes the seed, carrying the value it replaced. */
50
+ rollback: () => void;
51
+ /** Writes the entry ourselves; false falls back to the harness command. */
52
+ register: (mcpUrl: string) => boolean;
53
+ /** `mcp add` exits 0 even having saved nothing; the code lies. */
54
+ confirmRegistered: () => {
55
+ ok: boolean;
56
+ detail?: string;
57
+ tag?: string;
58
+ };
59
+ }
60
+ interface BaseMcpClient extends SupportedCommand, Pick<HarnessSpec, 'skillAgent' | 'nonInteractiveAdd' | 'signInHint' | 'degradedAuthNotes' | 'postConnectNote'> {
61
+ connectClient: Exclude<AgentClient, 'openclaw'>;
62
+ /** Replaces `addArgs` when a stored key is available: key auth removes the OAuth hop. */
63
+ keyAuth?: {
64
+ /** Which variable the client reads the key from. */
65
+ envVar?: string;
66
+ addArgs: (mcpUrl: string, apiKey: string) => string[];
67
+ /** Writes into the harness's store, so connect verifies the key first. */
68
+ seedKey?: (apiKey: string) => SeededInstall;
69
+ };
70
+ loginArgs?: string[];
71
+ removals: {
72
+ args: string[];
73
+ label: string;
74
+ }[];
75
+ /** Blocking terminal walkthrough; runs only behind the TTY gate. */
76
+ launchWalkthrough?: () => void;
77
+ /** Own window, never inherits stdio; reports its own outcome. */
78
+ detachedLaunch?: () => WalkthroughOutcome;
79
+ /** Post-install like the skill step: failures warn, never fail the attempt. */
80
+ extraPostInstall?: (options: {
81
+ apiKey?: string;
82
+ verbose: boolean;
83
+ seededHome?: string;
84
+ }) => void;
85
+ /** Pin `extraPostInstall` installs, reported on the plugin_installed checkpoint. */
86
+ pluginVersion?: string;
87
+ /** Extra --uninstall row beyond `removals`; never runs pre-add. */
88
+ uninstallExtra?: {
89
+ args: string[];
90
+ label: string;
91
+ };
92
+ }
93
+ interface OauthCapableMcpClient extends BaseMcpClient {
94
+ keyRequired?: false;
95
+ addArgs: (mcpUrl: string) => string[];
96
+ }
97
+ interface KeyRequiredMcpClient extends BaseMcpClient {
98
+ keyRequired: true;
99
+ keyAuth: NonNullable<BaseMcpClient['keyAuth']>;
100
+ /** Restoring any of these three would restore the OAuth fallback. */
101
+ addArgs?: never;
102
+ loginArgs?: never;
103
+ }
104
+ export type NativeMcpClient = OauthCapableMcpClient | KeyRequiredMcpClient;
105
+ export type WalkthroughOutcome = 'launched' | 'printed';
106
+ type OnWalkthroughDecided = (outcome: WalkthroughOutcome) => void | Promise<void>;
107
+ export { SkillAgent };
108
+ //# sourceMappingURL=connect-clients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-clients.d.ts","sourceRoot":"","sources":["../../src/lib/connect-clients.ts"],"names":[],"mappings":"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"}