@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,202 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:claude-config.d.ts + claude-config.impl.js */
2
+ import * as fs from 'fs';
3
+ import * as os from 'os';
4
+ import * as path from 'path';
5
+ // ─── Path helpers ─────────────────────────────────────────────────────────────
6
+ function claudeDir() {
7
+ return path.join(os.homedir(), '.claude');
8
+ }
9
+ export function claudeSettingsPath() {
10
+ return path.join(claudeDir(), 'settings.json');
11
+ }
12
+ export function claudeMdPath() {
13
+ return path.join(claudeDir(), 'CLAUDE.md');
14
+ }
15
+ // ─── Constants ────────────────────────────────────────────────────────────────
16
+ export const SPRINGBRAND_PERMISSION = 'Bash(springbrand:*)';
17
+ const SPRINGBRAND_WEBFETCH_HOOK = {
18
+ matcher: 'WebFetch',
19
+ hooks: [
20
+ {
21
+ type: 'command',
22
+ command: 'echo \'{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","additionalContext":"Follow the instructions about which fetch provider to use, listed in your Claude.md file"}}\'',
23
+ },
24
+ ],
25
+ };
26
+ const SPRINGBRAND_WEBSEARCH_HOOK = {
27
+ matcher: 'WebSearch',
28
+ hooks: [
29
+ {
30
+ type: 'command',
31
+ command: 'echo \'{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","additionalContext":"Follow the instructions about which search provider to use, listed in your Claude.md file"}}\'',
32
+ },
33
+ ],
34
+ };
35
+ const SPRINGBRAND_SUBAGENT_HOOK = {
36
+ hooks: [
37
+ {
38
+ type: 'command',
39
+ command: 'echo \'{"hookSpecificOutput":{"hookEventName":"SubagentStart","additionalContext":"The user prefers SpringBrand for web operations. Use `springbrand search query \\\\"<query>\\\\"` instead of WebSearch and `springbrand fetch content get \\\\"<url>\\\\"` instead of WebFetch. Run them via the Bash tool. Native WebSearch and WebFetch are fallbacks only \\u2014 use them when SpringBrand is rate-limited or unavailable. A PreToolUse hook will remind you if you reach for native tools. Refer to your claude.md for details"}}\'',
40
+ },
41
+ ],
42
+ };
43
+ export const CLAUDE_MD_MARKER = '<!-- springbrand-configure-claude -->';
44
+ const CLAUDE_MD_BLOCK = `${CLAUDE_MD_MARKER}
45
+ ## WebSearch or Search
46
+ When looking to use Search or WebSearch, always use the SpringBrand Web Search tool, run \`springbrand search query "<query>"\`
47
+ Only fall back to native Search when you get rate limited by springbrand (for a minute, then you can try using springbrand again)
48
+
49
+ ## WebFetch or Fetch
50
+ When looking to use Fetch or WebFetch, always use the SpringBrand Fetch tool, run \`springbrand fetch content get "<url>"\`
51
+ Only fall back to native Fetch when you get rate limited by springbrand (for a minute, then you can try using springbrand again)
52
+ ${CLAUDE_MD_MARKER}`;
53
+ function isSpringbrandPreToolUseHook(entry) {
54
+ if (typeof entry !== 'object' || entry === null)
55
+ return false;
56
+ const obj = entry;
57
+ if (obj.matcher !== 'WebFetch' && obj.matcher !== 'WebSearch')
58
+ return false;
59
+ const hooks = obj.hooks;
60
+ if (!Array.isArray(hooks) || hooks.length === 0)
61
+ return false;
62
+ const first = hooks[0];
63
+ return typeof first.command === 'string' && first.command.includes('provider to use');
64
+ }
65
+ function isSpringbrandSubagentHook(entry) {
66
+ if (typeof entry !== 'object' || entry === null)
67
+ return false;
68
+ const hooks = entry.hooks;
69
+ if (!Array.isArray(hooks) || hooks.length === 0)
70
+ return false;
71
+ const first = hooks[0];
72
+ return typeof first.command === 'string' && first.command.includes('SpringBrand');
73
+ }
74
+ // ─── settings.json I/O ───────────────────────────────────────────────────────
75
+ export function readSettingsJson() {
76
+ try {
77
+ const raw = fs.readFileSync(claudeSettingsPath(), 'utf8');
78
+ const parsed = JSON.parse(raw);
79
+ if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
80
+ return parsed;
81
+ }
82
+ throw new Error('settings.json root is not a JSON object');
83
+ }
84
+ catch (e) {
85
+ if (typeof e === 'object' && e !== null && e.code === 'ENOENT') {
86
+ return {};
87
+ }
88
+ throw e;
89
+ }
90
+ }
91
+ export function writeSettingsJson(settings) {
92
+ fs.mkdirSync(claudeDir(), { recursive: true });
93
+ fs.writeFileSync(claudeSettingsPath(), JSON.stringify(settings, null, 2) + '\n');
94
+ }
95
+ // ─── settings.json merge / remove ─────────────────────────────────────────────
96
+ export function mergeSettings(existing) {
97
+ const result = { ...existing };
98
+ const permissions = (result.permissions ?? {});
99
+ const allow = Array.isArray(permissions.allow) ? [...permissions.allow] : [];
100
+ if (!allow.includes(SPRINGBRAND_PERMISSION)) {
101
+ allow.push(SPRINGBRAND_PERMISSION);
102
+ }
103
+ result.permissions = { ...permissions, allow };
104
+ const hooks = (result.hooks ?? {});
105
+ const preToolUse = Array.isArray(hooks.PreToolUse) ? [...hooks.PreToolUse] : [];
106
+ const filteredPre = preToolUse.filter((e) => !isSpringbrandPreToolUseHook(e));
107
+ filteredPre.push(SPRINGBRAND_WEBFETCH_HOOK, SPRINGBRAND_WEBSEARCH_HOOK);
108
+ const subagentStart = Array.isArray(hooks.SubagentStart) ? [...hooks.SubagentStart] : [];
109
+ const filteredSub = subagentStart.filter((e) => !isSpringbrandSubagentHook(e));
110
+ filteredSub.push(SPRINGBRAND_SUBAGENT_HOOK);
111
+ result.hooks = { ...hooks, PreToolUse: filteredPre, SubagentStart: filteredSub };
112
+ return result;
113
+ }
114
+ export function removeFromSettings(existing) {
115
+ const result = { ...existing };
116
+ const permissions = (result.permissions ?? {});
117
+ if (Array.isArray(permissions.allow)) {
118
+ const filtered = permissions.allow.filter((p) => p !== SPRINGBRAND_PERMISSION);
119
+ if (filtered.length > 0) {
120
+ result.permissions = { ...permissions, allow: filtered };
121
+ }
122
+ else {
123
+ const rest = Object.fromEntries(Object.entries(permissions).filter(([k]) => k !== 'allow'));
124
+ result.permissions = Object.keys(rest).length > 0 ? rest : undefined;
125
+ }
126
+ }
127
+ const hooks = (result.hooks ?? {});
128
+ const newHooks = { ...hooks };
129
+ if (Array.isArray(hooks.PreToolUse)) {
130
+ const filtered = hooks.PreToolUse.filter((e) => !isSpringbrandPreToolUseHook(e));
131
+ newHooks.PreToolUse = filtered.length > 0 ? filtered : undefined;
132
+ }
133
+ if (Array.isArray(hooks.SubagentStart)) {
134
+ const filtered = hooks.SubagentStart.filter((e) => !isSpringbrandSubagentHook(e));
135
+ newHooks.SubagentStart = filtered.length > 0 ? filtered : undefined;
136
+ }
137
+ const remaining = Object.fromEntries(Object.entries(newHooks).filter(([, v]) => v !== undefined));
138
+ result.hooks = Object.keys(remaining).length > 0 ? remaining : undefined;
139
+ return Object.fromEntries(Object.entries(result).filter(([, v]) => v !== undefined));
140
+ }
141
+ // ─── CLAUDE.md I/O ────────────────────────────────────────────────────────────
142
+ export function readClaudeMd() {
143
+ try {
144
+ return fs.readFileSync(claudeMdPath(), 'utf8');
145
+ }
146
+ catch (e) {
147
+ if (typeof e === 'object' && e !== null && e.code === 'ENOENT') {
148
+ return '';
149
+ }
150
+ throw e;
151
+ }
152
+ }
153
+ export function writeClaudeMd(content) {
154
+ fs.mkdirSync(claudeDir(), { recursive: true });
155
+ fs.writeFileSync(claudeMdPath(), content);
156
+ }
157
+ // ─── CLAUDE.md merge / remove ─────────────────────────────────────────────────
158
+ function escapeRegExp(s) {
159
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
160
+ }
161
+ const MARKER_REGEX = new RegExp(`${escapeRegExp(CLAUDE_MD_MARKER)}[\\s\\S]*?${escapeRegExp(CLAUDE_MD_MARKER)}`, 'm');
162
+ const LEGACY_REGEX = /## Web(?:Search|Seach) or Search[\s\S]*?(?:springbrand fetch[^\n]*\n(?:[^\n]*springbrand[^\n]*\n)*[^\n]*)\n*/m;
163
+ function hasMarker(content) {
164
+ return content.includes(CLAUDE_MD_MARKER);
165
+ }
166
+ function hasLegacyBlock(content) {
167
+ return !content.includes(CLAUDE_MD_MARKER) && LEGACY_REGEX.test(content);
168
+ }
169
+ export function mergeClaudeMd(existing) {
170
+ if (hasMarker(existing)) {
171
+ return { content: existing.replace(MARKER_REGEX, CLAUDE_MD_BLOCK), replaced: true };
172
+ }
173
+ if (hasLegacyBlock(existing)) {
174
+ const cleaned = existing.replace(LEGACY_REGEX, '').trim();
175
+ const content = cleaned.length > 0 ? CLAUDE_MD_BLOCK + '\n\n' + cleaned + '\n' : CLAUDE_MD_BLOCK + '\n';
176
+ return { content, replaced: true };
177
+ }
178
+ if (existing.trim().length === 0) {
179
+ return { content: CLAUDE_MD_BLOCK + '\n', replaced: false };
180
+ }
181
+ return { content: CLAUDE_MD_BLOCK + '\n\n' + existing, replaced: false };
182
+ }
183
+ export function removeFromClaudeMd(existing) {
184
+ if (!existing.includes(CLAUDE_MD_MARKER))
185
+ return existing;
186
+ const removed = existing
187
+ .replace(new RegExp(`${escapeRegExp(CLAUDE_MD_MARKER)}[\\s\\S]*?${escapeRegExp(CLAUDE_MD_MARKER)}\\n*`, 'm'), '')
188
+ .trim();
189
+ return removed.length > 0 ? removed + '\n' : '';
190
+ }
191
+ // ─── Detection ────────────────────────────────────────────────────────────────
192
+ export function isSpringbrandConfiguredInSettings(settings) {
193
+ const permissions = settings.permissions;
194
+ const hasPermission = Array.isArray(permissions?.allow) && permissions.allow.includes(SPRINGBRAND_PERMISSION);
195
+ const hooks = settings.hooks;
196
+ const hasHooks = Array.isArray(hooks?.PreToolUse) && hooks.PreToolUse.some(isSpringbrandPreToolUseHook);
197
+ return hasPermission || hasHooks;
198
+ }
199
+ export function isSpringbrandConfiguredInClaudeMd(content) {
200
+ return hasMarker(content) || hasLegacyBlock(content);
201
+ }
202
+ //# sourceMappingURL=claude-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-config.js","sourceRoot":"","sources":["../../src/lib/claude-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:cli-install.d.ts + cli-install.impl.js */
2
+ export declare const SKILL_INSTALL_TIMEOUT_MS = 120000;
3
+ export declare const STEP_MAX_BUFFER: number;
4
+ export declare function captureStdio(verbose: boolean): {
5
+ stdio: "inherit";
6
+ timeout: number;
7
+ encoding?: undefined;
8
+ maxBuffer?: undefined;
9
+ } | {
10
+ encoding: "utf8";
11
+ maxBuffer: number;
12
+ timeout: number;
13
+ stdio?: undefined;
14
+ };
15
+ /** Inherited stdio leaves these null; only piped runs yield text. */
16
+ export declare function capturedOutput(result: {
17
+ stdout?: unknown;
18
+ stderr?: unknown;
19
+ }): string;
20
+ /** A verbose run captured nothing, so this is a no-op. */
21
+ export declare function replay(output: string): void;
22
+ export declare function installSpringBrandCli({ verbose, announce }: InstallOptions): void;
23
+ export type InstallOptions = {
24
+ verbose: boolean;
25
+ /** Progress line even when quiet; defaults to `verbose`. */
26
+ announce?: boolean;
27
+ };
28
+ export type HoistedCliInstall = {
29
+ ok: true;
30
+ durationMs: number;
31
+ } | {
32
+ ok: false;
33
+ durationMs: number;
34
+ error: Error;
35
+ };
36
+ export type TakeHoistedCliInstall = () => {
37
+ outcome: HoistedCliInstall;
38
+ firstTake: boolean;
39
+ };
40
+ //# sourceMappingURL=cli-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-install.d.ts","sourceRoot":"","sources":["../../src/lib/cli-install.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAOpE,eAAO,MAAM,wBAAwB,SAAU,CAAC;AAGhD,eAAO,MAAM,eAAe,EAAE,MAAyB,CAAC;AACxD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG;IAC5C,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACzB,GAAG;IACA,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;CACrB,CAIA;AACD,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,CAET;AAID,0DAA0D;AAC1D,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG3C;AACD,wBAAgB,qBAAqB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,cAAc,QAa1E;AAGD,MAAM,MAAM,cAAc,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,EAAE,EAAE,IAAI,CAAC;IACT,UAAU,EAAE,MAAM,CAAC;CACtB,GAAG;IACA,EAAE,EAAE,KAAK,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,MAAM;IACtC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACtB,CAAC"}
@@ -0,0 +1,42 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:cli-install.d.ts + cli-install.impl.js */
2
+ import spawn from 'cross-spawn';
3
+ import { spawnStepError } from './connect-runtime.js';
4
+ import { SPRINGBRAND_CLI_PACKAGE } from './constants.js';
5
+ import { installRoot } from './install-root.js';
6
+ import { errLine } from './output.js';
7
+ export const SKILL_INSTALL_TIMEOUT_MS = 120_000;
8
+ const SPRINGBRAND_CLI_INSTALL_SPEC = `${SPRINGBRAND_CLI_PACKAGE}@latest`;
9
+ // spawnSync caps piped output at 1 MiB by default.
10
+ export const STEP_MAX_BUFFER = 10 * 1024 * 1024;
11
+ export function captureStdio(verbose) {
12
+ return verbose
13
+ ? { stdio: 'inherit', timeout: SKILL_INSTALL_TIMEOUT_MS }
14
+ : { encoding: 'utf8', maxBuffer: STEP_MAX_BUFFER, timeout: SKILL_INSTALL_TIMEOUT_MS };
15
+ }
16
+ /** Inherited stdio leaves these null; only piped runs yield text. */
17
+ export function capturedOutput(result) {
18
+ return `${asText(result.stdout)}${asText(result.stderr)}`;
19
+ }
20
+ function asText(stream) {
21
+ return typeof stream === 'string' ? stream : '';
22
+ }
23
+ /** A verbose run captured nothing, so this is a no-op. */
24
+ export function replay(output) {
25
+ if (output.trim())
26
+ errLine(output.trimEnd());
27
+ }
28
+ export function installSpringBrandCli({ verbose, announce }) {
29
+ if (announce ?? verbose)
30
+ errLine('Installing the SpringBrand CLI...');
31
+ // Without the prefix, a curl install upgrades npm's global tree and never the PATH binary.
32
+ const root = installRoot();
33
+ const prefixArgs = root ? ['--prefix', root.prefix] : [];
34
+ const result = spawn.sync('npm', ['install', '--global', ...prefixArgs, SPRINGBRAND_CLI_INSTALL_SPEC], captureStdio(verbose));
35
+ if (result.error || result.status !== 0) {
36
+ // Built first: it runs the interrupt check, and abandonment must not replay.
37
+ const error = spawnStepError('Could not install the SpringBrand CLI', result);
38
+ replay(capturedOutput(result));
39
+ throw error;
40
+ }
41
+ }
42
+ //# sourceMappingURL=cli-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-install.js","sourceRoot":"","sources":["../../src/lib/cli-install.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAChD,MAAM,4BAA4B,GAAG,GAAG,uBAAuB,SAAS,CAAC;AACzE,mDAAmD;AACnD,MAAM,CAAC,MAAM,eAAe,GAAW,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACxD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAWzC,OAAO,OAAO;QACV,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,wBAAwB,EAAE;QACzD,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;AAC9F,CAAC;AACD,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,MAG9B;IACG,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC9D,CAAC;AACD,SAAS,MAAM,CAAC,MAAe;IAC3B,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AACD,0DAA0D;AAC1D,MAAM,UAAU,MAAM,CAAC,MAAc;IACjC,IAAI,MAAM,CAAC,IAAI,EAAE;QACb,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAClC,CAAC;AACD,MAAM,UAAU,qBAAqB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAkB;IACvE,IAAI,QAAQ,IAAI,OAAO;QACnB,OAAO,CAAC,mCAAmC,CAAC,CAAC;IACjD,2FAA2F;IAC3F,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,4BAA4B,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9H,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,6EAA6E;QAC7E,MAAM,KAAK,GAAG,cAAc,CAAC,uCAAuC,EAAE,MAAM,CAAC,CAAC;QAC9E,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/B,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:command-code-config.d.ts + command-code-config.impl.js */
2
+ import type { McpJsonServerEntry } from './mcp-json-config.js';
3
+ /** Reports the header's shape, never its value. */
4
+ export declare function readCommandCodeSpringbrandEntry(): McpJsonServerEntry;
5
+ //# sourceMappingURL=command-code-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-code-config.d.ts","sourceRoot":"","sources":["../../src/lib/command-code-config.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAW/D,mDAAmD;AACnD,wBAAgB,+BAA+B,IAAI,kBAAkB,CAEpE"}
@@ -0,0 +1,16 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:command-code-config.d.ts + command-code-config.impl.js */
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+ import { readSpringbrandEntry, } from './mcp-json-config.js';
5
+ // Read-only: Command Code writes this file itself, through `cmd mcp add-json --scope user`.
6
+ const COMMAND_CODE_TARGET = {
7
+ serverKey: 'springbrand',
8
+ dir: () => path.join(os.homedir(), '.commandcode'),
9
+ file: () => path.join(os.homedir(), '.commandcode', 'mcp.json'),
10
+ keyHeader: { name: 'Authorization', valuePrefix: 'Bearer ' },
11
+ };
12
+ /** Reports the header's shape, never its value. */
13
+ export function readCommandCodeSpringbrandEntry() {
14
+ return readSpringbrandEntry(COMMAND_CODE_TARGET);
15
+ }
16
+ //# sourceMappingURL=command-code-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-code-config.js","sourceRoot":"","sources":["../../src/lib/command-code-config.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAGpF,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,oBAAoB,GAAG,MAAM,sBAAsB,CAAC;AAC7D,4FAA4F;AAC5F,MAAM,mBAAmB,GAAG;IACxB,SAAS,EAAE,aAAa;IACxB,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC;IAClD,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC;IAC/D,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE;CAC/D,CAAC;AACF,mDAAmD;AACnD,MAAM,UAAU,+BAA+B;IAC3C,OAAO,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,21 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:connect-all-auth.d.ts + connect-all-auth.impl.js */
2
+ import type { Prompt } from './connect-fallback.js';
3
+ import type { HarnessResultBase, HarnessRunResult } from './connect-all.js';
4
+ export declare const OAUTH_SIGN_IN_TIMEOUT_MS = 90000;
5
+ export declare function mapConnectError(base: HarnessResultBase, e: unknown, oauthBudget: {
6
+ spent: boolean;
7
+ }, spentBrowserSlot: boolean, fixCommand: string): HarnessRunResult;
8
+ export declare function authGate(base: HarnessResultBase, oauthBudget: {
9
+ spent: boolean;
10
+ }, fixCommand: string, ctx: {
11
+ prompt: Prompt | undefined;
12
+ isTTY: boolean;
13
+ keyed: boolean;
14
+ }): Promise<AuthGateOutcome>;
15
+ interface AuthGateOutcome {
16
+ result?: HarnessRunResult;
17
+ headlessAuth: boolean;
18
+ spentBrowserSlot: boolean;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=connect-all-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-all-auth.d.ts","sourceRoot":"","sources":["../../src/lib/connect-all-auth.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAE9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAO5E,eAAO,MAAM,wBAAwB,QAAS,CAAC;AA+D/C,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE;IAC9E,KAAK,EAAE,OAAO,CAAC;CAClB,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,CA6BlE;AACD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE;IACjE,KAAK,EAAE,OAAO,CAAC;CAClB,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE;IACxB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,CAAC,CAW3B;AAGD,UAAU,eAAe;IACrB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;CAC7B"}
@@ -0,0 +1,113 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:connect-all-auth.d.ts + connect-all-auth.impl.js */
2
+ import { NATIVE_BY_HARNESS } from './connect-clients.js';
3
+ import { harnessSpec } from './harness-spec.js';
4
+ import { ConnectInterruptedError, ConnectStepError, SignInTimeoutError, } from './connect-runtime.js';
5
+ import { ALL_HARNESSES, HARNESS_DISPLAY_NAMES as DISPLAY_NAMES, } from './harness-detect.js';
6
+ import { errLine } from './output.js';
7
+ // Must undercut agent tool-call budgets (Claude Code Bash defaults to 120s).
8
+ export const OAUTH_SIGN_IN_TIMEOUT_MS = 90_000;
9
+ // A probe that exits non-zero is an install so old the subcommand is missing entirely.
10
+ const TOO_OLD_REASONS = new Set([
11
+ 'harness_too_old',
12
+ 'harness_command_unsupported',
13
+ ]);
14
+ // These failures land before any browser could have opened.
15
+ const NO_BROWSER_REASONS = new Set([
16
+ ...TOO_OLD_REASONS,
17
+ 'harness_not_installed',
18
+ 'command_not_found',
19
+ ]);
20
+ // Derived: these block `connect` on a browser sign-in when keyless.
21
+ const BROWSER_SIGN_IN = new Set(ALL_HARNESSES.filter((harness) => {
22
+ const native = NATIVE_BY_HARNESS.get(harness);
23
+ return !!native?.loginArgs;
24
+ }));
25
+ // Derived: these refuse a keyless install, so no sign-in helps.
26
+ const KEY_REQUIRED = new Set(ALL_HARNESSES.filter((harness) => !!NATIVE_BY_HARNESS.get(harness)?.keyRequired));
27
+ function headlessGate(base, oauthBudget, fixCommand) {
28
+ const { harness } = base;
29
+ // A CLI-login sign-in is interactive-only — unboundable headless.
30
+ if (harnessSpec(harness).signInViaCliLogin) {
31
+ return {
32
+ result: { ...base, outcome: 'auth_pending', fixCommand },
33
+ headlessAuth: false,
34
+ spentBrowserSlot: false,
35
+ };
36
+ }
37
+ let spentBrowserSlot = false;
38
+ if (BROWSER_SIGN_IN.has(harness)) {
39
+ // One browser sign-in per run; the rest wait for a re-run.
40
+ if (oauthBudget.spent) {
41
+ return {
42
+ result: { ...base, outcome: 'auth_pending', fixCommand },
43
+ headlessAuth: false,
44
+ spentBrowserSlot: false,
45
+ };
46
+ }
47
+ oauthBudget.spent = true;
48
+ spentBrowserSlot = true;
49
+ errLine(`${DISPLAY_NAMES[harness]} needs a browser sign-in — finish it when your browser ` +
50
+ `opens; waiting up to ${OAUTH_SIGN_IN_TIMEOUT_MS / 1000} seconds.`);
51
+ }
52
+ return { headlessAuth: true, spentBrowserSlot };
53
+ }
54
+ /** Null: proceed. A result: settle with it. */
55
+ async function awaitSignInPrompt(base, prompt, fixCommand) {
56
+ errLine(`step: waiting for browser sign-in to SpringBrand for ${DISPLAY_NAMES[base.harness]}`);
57
+ try {
58
+ await prompt(`Press enter to open the browser and sign in to SpringBrand for ${DISPLAY_NAMES[base.harness]}... `);
59
+ return null;
60
+ }
61
+ catch (error) {
62
+ // Ctrl+C stops the run; Ctrl+D only skips this harness.
63
+ if (error instanceof ConnectInterruptedError) {
64
+ errLine('Setup interrupted — run the command again to finish.');
65
+ process.exitCode = 130;
66
+ return { ...base, outcome: 'interrupted', fixCommand };
67
+ }
68
+ return { ...base, outcome: 'no_tty_auth_skip', fixCommand };
69
+ }
70
+ }
71
+ export function mapConnectError(base, e, oauthBudget, spentBrowserSlot, fixCommand) {
72
+ if (e instanceof SignInTimeoutError) {
73
+ return {
74
+ ...base,
75
+ outcome: 'auth_pending',
76
+ errorMessage: 'sign-in did not finish in time',
77
+ fixCommand,
78
+ };
79
+ }
80
+ // A pre-browser failure must not burn the run's only browser slot.
81
+ if (spentBrowserSlot &&
82
+ e instanceof ConnectStepError &&
83
+ NO_BROWSER_REASONS.has(e.failureReason)) {
84
+ oauthBudget.spent = false;
85
+ }
86
+ // Detection saw a name on PATH; the probe proved nothing is behind it.
87
+ if (e instanceof ConnectStepError && e.failureReason === 'harness_not_installed') {
88
+ return { ...base, detected: false, outcome: 'not_installed' };
89
+ }
90
+ // Both reasons carry the same "flag not listed" message; the upgrade nudge is in it.
91
+ if (e instanceof ConnectStepError && TOO_OLD_REASONS.has(e.failureReason)) {
92
+ return { ...base, outcome: 'harness_too_old', errorMessage: e.message, fixCommand };
93
+ }
94
+ return {
95
+ ...base,
96
+ outcome: 'failed',
97
+ errorMessage: e instanceof Error ? e.message : String(e),
98
+ fixCommand,
99
+ };
100
+ }
101
+ export async function authGate(base, oauthBudget, fixCommand, ctx) {
102
+ if (!ctx.isTTY && !ctx.keyed) {
103
+ return headlessGate(base, oauthBudget, fixCommand);
104
+ }
105
+ // Key-required harnesses refuse below; offering a browser sign-in would mislead.
106
+ if (ctx.isTTY && !ctx.keyed && ctx.prompt && !KEY_REQUIRED.has(base.harness)) {
107
+ const settled = await awaitSignInPrompt(base, ctx.prompt, fixCommand);
108
+ if (settled)
109
+ return { result: settled, headlessAuth: false, spentBrowserSlot: false };
110
+ }
111
+ return { headlessAuth: false, spentBrowserSlot: false };
112
+ }
113
+ //# sourceMappingURL=connect-all-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-all-auth.js","sourceRoot":"","sources":["../../src/lib/connect-all-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:connect-all-summary.d.ts + connect-all-summary.impl.js */
2
+ import type { HarnessRunResult } from './connect-all.js';
3
+ /** A stale config dir is a detection signal with nothing behind it. */
4
+ export declare function actionable(result: HarnessRunResult): boolean;
5
+ /** One line for every harness: seven near-identical paragraphs is what this replaces. */
6
+ export declare function reloadHint(results: HarnessRunResult[]): string | undefined;
7
+ /** Absent and unpicked harnesses are noise once something real happened. */
8
+ export declare function renderSummary(results: HarnessRunResult[], uninstall: boolean): string[];
9
+ export declare function computeExitCode(results: HarnessRunResult[]): number;
10
+ //# sourceMappingURL=connect-all-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-all-summary.d.ts","sourceRoot":"","sources":["../../src/lib/connect-all-summary.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAUzD,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAE5D;AA4FD,yFAAyF;AACzF,wBAAgB,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,GAAG,SAAS,CAY1E;AACD,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,EAAE,CAYvF;AACD,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAkBnE"}