@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,195 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:doctor-report.d.ts + doctor-report.impl.js */
2
+ import type { Harness } from './harness-detect.js';
3
+ import { z } from 'zod';
4
+ import { AuthMode, Registered } from './harness-detect.js';
5
+ /** Bumped whenever a consumer could misread the payload; the cookbook skill releases separately. */
6
+ export declare const DOCTOR_SCHEMA_VERSION = 3;
7
+ declare const checkStatusSchema: z.ZodEnum<{
8
+ pass: "pass";
9
+ fail: "fail";
10
+ warn: "warn";
11
+ skip: "skip";
12
+ }>;
13
+ declare const checkScopeSchema: z.ZodEnum<{
14
+ cli: "cli";
15
+ harness: "harness";
16
+ info: "info";
17
+ }>;
18
+ declare const doctorCheckSchema: z.ZodObject<{
19
+ id: z.ZodString;
20
+ title: z.ZodString;
21
+ status: z.ZodEnum<{
22
+ pass: "pass";
23
+ fail: "fail";
24
+ warn: "warn";
25
+ skip: "skip";
26
+ }>;
27
+ detail: z.ZodString;
28
+ harness: z.ZodNullable<z.ZodEnum<{
29
+ openclaw: "openclaw";
30
+ omp: "omp";
31
+ grok: "grok";
32
+ cursor: "cursor";
33
+ codex: "codex";
34
+ hermes: "hermes";
35
+ "command-code": "command-code";
36
+ opencode: "opencode";
37
+ pi: "pi";
38
+ "claude-code": "claude-code";
39
+ }>>;
40
+ scope: z.ZodEnum<{
41
+ cli: "cli";
42
+ harness: "harness";
43
+ info: "info";
44
+ }>;
45
+ }, z.core.$strip>;
46
+ declare const doctorHarnessSchema: z.ZodObject<{
47
+ harness: z.ZodEnum<{
48
+ openclaw: "openclaw";
49
+ omp: "omp";
50
+ grok: "grok";
51
+ cursor: "cursor";
52
+ codex: "codex";
53
+ hermes: "hermes";
54
+ "command-code": "command-code";
55
+ opencode: "opencode";
56
+ pi: "pi";
57
+ "claude-code": "claude-code";
58
+ }>;
59
+ detected: z.ZodBoolean;
60
+ registered: z.ZodEnum<typeof Registered>;
61
+ auth_mode: z.ZodEnum<typeof AuthMode>;
62
+ recorded_auth_mode: z.ZodOptional<z.ZodEnum<{
63
+ "api-key": "api-key";
64
+ oauth: "oauth";
65
+ deferred: "deferred";
66
+ }>>;
67
+ proves_harness_reach: z.ZodBoolean;
68
+ }, z.core.$strip>;
69
+ declare const doctorRepairSchema: z.ZodObject<{
70
+ for: z.ZodString;
71
+ action: z.ZodEnum<{
72
+ connect: "connect";
73
+ "auth-login": "auth-login";
74
+ }>;
75
+ harness: z.ZodNullable<z.ZodEnum<{
76
+ openclaw: "openclaw";
77
+ omp: "omp";
78
+ grok: "grok";
79
+ cursor: "cursor";
80
+ codex: "codex";
81
+ hermes: "hermes";
82
+ "command-code": "command-code";
83
+ opencode: "opencode";
84
+ pi: "pi";
85
+ "claude-code": "claude-code";
86
+ }>>;
87
+ command: z.ZodString;
88
+ unattended_safe: z.ZodBoolean;
89
+ }, z.core.$strip>;
90
+ export declare const doctorReportSchema: z.ZodObject<{
91
+ schema_version: z.ZodInt;
92
+ cli_version: z.ZodString;
93
+ ok_harnesses: z.ZodBoolean;
94
+ ok_cli: z.ZodBoolean;
95
+ checks: z.ZodArray<z.ZodObject<{
96
+ id: z.ZodString;
97
+ title: z.ZodString;
98
+ status: z.ZodEnum<{
99
+ pass: "pass";
100
+ fail: "fail";
101
+ warn: "warn";
102
+ skip: "skip";
103
+ }>;
104
+ detail: z.ZodString;
105
+ harness: z.ZodNullable<z.ZodEnum<{
106
+ openclaw: "openclaw";
107
+ omp: "omp";
108
+ grok: "grok";
109
+ cursor: "cursor";
110
+ codex: "codex";
111
+ hermes: "hermes";
112
+ "command-code": "command-code";
113
+ opencode: "opencode";
114
+ pi: "pi";
115
+ "claude-code": "claude-code";
116
+ }>>;
117
+ scope: z.ZodEnum<{
118
+ cli: "cli";
119
+ harness: "harness";
120
+ info: "info";
121
+ }>;
122
+ }, z.core.$strip>>;
123
+ harnesses: z.ZodArray<z.ZodObject<{
124
+ harness: z.ZodEnum<{
125
+ openclaw: "openclaw";
126
+ omp: "omp";
127
+ grok: "grok";
128
+ cursor: "cursor";
129
+ codex: "codex";
130
+ hermes: "hermes";
131
+ "command-code": "command-code";
132
+ opencode: "opencode";
133
+ pi: "pi";
134
+ "claude-code": "claude-code";
135
+ }>;
136
+ detected: z.ZodBoolean;
137
+ registered: z.ZodEnum<typeof Registered>;
138
+ auth_mode: z.ZodEnum<typeof AuthMode>;
139
+ recorded_auth_mode: z.ZodOptional<z.ZodEnum<{
140
+ "api-key": "api-key";
141
+ oauth: "oauth";
142
+ deferred: "deferred";
143
+ }>>;
144
+ proves_harness_reach: z.ZodBoolean;
145
+ }, z.core.$strip>>;
146
+ repairs: z.ZodArray<z.ZodObject<{
147
+ for: z.ZodString;
148
+ action: z.ZodEnum<{
149
+ connect: "connect";
150
+ "auth-login": "auth-login";
151
+ }>;
152
+ harness: z.ZodNullable<z.ZodEnum<{
153
+ openclaw: "openclaw";
154
+ omp: "omp";
155
+ grok: "grok";
156
+ cursor: "cursor";
157
+ codex: "codex";
158
+ hermes: "hermes";
159
+ "command-code": "command-code";
160
+ opencode: "opencode";
161
+ pi: "pi";
162
+ "claude-code": "claude-code";
163
+ }>>;
164
+ command: z.ZodString;
165
+ unattended_safe: z.ZodBoolean;
166
+ }, z.core.$strip>>;
167
+ hermes_plugin_version: z.ZodOptional<z.ZodString>;
168
+ hermes_plugin_expected_version: z.ZodOptional<z.ZodString>;
169
+ }, z.core.$strip>;
170
+ /** Doctor itself broke, which is a different claim from "your setup is broken". */
171
+ export declare const DOCTOR_COULD_NOT_RUN = 2;
172
+ /** The invocation was wrong, not the machine; exit 2 stays "doctor broke". */
173
+ export declare const DOCTOR_INVALID_INPUT = 3;
174
+ /** Skips never fail the run; a skip means not applicable, not broken. */
175
+ export declare function verdictFor(checks: DoctorCheck[]): {
176
+ ok_harnesses: boolean;
177
+ ok_cli: boolean;
178
+ };
179
+ /** Harness scope only: the caller asked about its agent, not us. */
180
+ export declare function exitCodeFor(checks: DoctorCheck[]): 0 | 1;
181
+ export declare function renderPretty(report: DoctorReport): string;
182
+ export type CheckStatus = z.infer<typeof checkStatusSchema>;
183
+ export type CheckScope = z.infer<typeof checkScopeSchema>;
184
+ export type DoctorCheck = z.infer<typeof doctorCheckSchema>;
185
+ export type DoctorHarness = z.infer<typeof doctorHarnessSchema>;
186
+ export type DoctorRepair = z.infer<typeof doctorRepairSchema>;
187
+ export type DoctorReport = z.infer<typeof doctorReportSchema>;
188
+ export interface DoctorOptions {
189
+ mcpUrl: string;
190
+ harness?: Harness;
191
+ fix?: boolean;
192
+ yes?: boolean;
193
+ }
194
+ export {};
195
+ //# sourceMappingURL=doctor-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-report.d.ts","sourceRoot":"","sources":["../../src/lib/doctor-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:doctor-report.d.ts + doctor-report.impl.js */
2
+ import { z } from 'zod';
3
+ import { ALL_HARNESSES, AuthMode, Registered } from './harness-detect.js';
4
+ /** Bumped whenever a consumer could misread the payload; the cookbook skill releases separately. */
5
+ export const DOCTOR_SCHEMA_VERSION = 3;
6
+ const checkStatusSchema = z.enum(['pass', 'fail', 'warn', 'skip']);
7
+ const harnessSchema = z.enum(ALL_HARNESSES);
8
+ // Not derived from `harness`: connectivity is harness-null yet harness-scoped.
9
+ const checkScopeSchema = z.enum(['harness', 'cli', 'info']);
10
+ const doctorCheckSchema = z.object({
11
+ id: z.string(),
12
+ title: z.string(),
13
+ status: checkStatusSchema,
14
+ detail: z.string(),
15
+ harness: harnessSchema.nullable(),
16
+ scope: checkScopeSchema,
17
+ });
18
+ const doctorHarnessSchema = z.object({
19
+ harness: harnessSchema,
20
+ detected: z.boolean(),
21
+ registered: z.enum(Registered),
22
+ auth_mode: z.enum(AuthMode),
23
+ // Additive under schema 3: what connect wrote when the harness cannot echo it back.
24
+ recorded_auth_mode: z.enum(['api-key', 'oauth', 'deferred']).optional(),
25
+ proves_harness_reach: z.boolean(),
26
+ });
27
+ // `action` is what `--fix` dispatches on, not the harness field: keying off a null harness
28
+ // conflated "run auth login" with a non-executable repair and the credential fix never ran.
29
+ const doctorRepairSchema = z.object({
30
+ for: z.string(),
31
+ action: z.enum(['connect', 'auth-login']),
32
+ harness: harnessSchema.nullable(),
33
+ command: z.string(),
34
+ unattended_safe: z.boolean(),
35
+ });
36
+ function hasFailure(checks, scope) {
37
+ return checks.some((check) => check.scope === scope && check.status === 'fail');
38
+ }
39
+ // One `ok` could not answer both questions, and answered neither.
40
+ export const doctorReportSchema = z
41
+ .object({
42
+ // Not `z.literal`: a consumer must be able to read a future version and say so.
43
+ schema_version: z.int().positive(),
44
+ cli_version: z.string(),
45
+ ok_harnesses: z.boolean(),
46
+ ok_cli: z.boolean(),
47
+ checks: z.array(doctorCheckSchema),
48
+ harnesses: z.array(doctorHarnessSchema),
49
+ repairs: z.array(doctorRepairSchema),
50
+ // Unbounded like cli_version: a throw here exits 2 unnecessarily.
51
+ hermes_plugin_version: z.string().optional(),
52
+ hermes_plugin_expected_version: z.string().optional(),
53
+ })
54
+ // Claiming ok while that scope failed is worse than no report.
55
+ .refine((report) => !report.ok_harnesses || !hasFailure(report.checks, 'harness'), {
56
+ message: 'ok_harnesses cannot be true while a harness check has failed',
57
+ path: ['ok_harnesses'],
58
+ })
59
+ .refine((report) => !report.ok_cli || !hasFailure(report.checks, 'cli'), {
60
+ message: 'ok_cli cannot be true while a CLI check has failed',
61
+ path: ['ok_cli'],
62
+ });
63
+ const GLYPHS = { pass: '✓', fail: '✗', warn: '⚠', skip: '…' };
64
+ /** Doctor itself broke, which is a different claim from "your setup is broken". */
65
+ export const DOCTOR_COULD_NOT_RUN = 2;
66
+ /** The invocation was wrong, not the machine; exit 2 stays "doctor broke". */
67
+ export const DOCTOR_INVALID_INPUT = 3;
68
+ /** Skips never fail the run; a skip means not applicable, not broken. */
69
+ export function verdictFor(checks) {
70
+ return { ok_harnesses: !hasFailure(checks, 'harness'), ok_cli: !hasFailure(checks, 'cli') };
71
+ }
72
+ /** Harness scope only: the caller asked about its agent, not us. */
73
+ export function exitCodeFor(checks) {
74
+ return verdictFor(checks).ok_harnesses ? 0 : 1;
75
+ }
76
+ // A red line above exit 0 reads as a contradiction.
77
+ function footnotes(report) {
78
+ const notes = [];
79
+ // Alongside exit 1 this is noise; something did fail.
80
+ if (hasFailure(report.checks, 'cli') && report.ok_harnesses) {
81
+ notes.push("The CLI's own credential is broken; that does not affect the exit code.");
82
+ }
83
+ // Per-harness rows, not the scope: connectivity is harness-scoped and never skips.
84
+ const harnessChecks = report.checks.filter((c) => c.harness !== null);
85
+ if (harnessChecks.length > 0 && harnessChecks.every((c) => c.status === 'skip')) {
86
+ notes.push('No harness was checked here, so a green harness verdict proves nothing.');
87
+ }
88
+ return notes;
89
+ }
90
+ export function renderPretty(report) {
91
+ const lines = report.checks.map((c) => `${GLYPHS[c.status]} ${c.title}${c.detail ? ` — ${c.detail}` : ''}`);
92
+ if (report.repairs.length > 0) {
93
+ lines.push('', 'Repairs:');
94
+ for (const repair of report.repairs)
95
+ lines.push(` ${repair.command}`);
96
+ }
97
+ const notes = footnotes(report);
98
+ if (notes.length > 0)
99
+ lines.push('', ...notes);
100
+ return lines.join('\n');
101
+ }
102
+ //# sourceMappingURL=doctor-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-report.js","sourceRoot":"","sources":["../../src/lib/doctor-report.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAGxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC1E,oGAAoG;AACpG,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACnE,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC5C,+EAA+E;AAC/E,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5D,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,gBAAgB;CAC1B,CAAC,CAAC;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;IAC9B,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC3B,oFAAoF;IACpF,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvE,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE;CACpC,CAAC,CAAC;AACH,2FAA2F;AAC3F,4FAA4F;AAC5F,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzC,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE;IACjC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE;CAC/B,CAAC,CAAC;AACH,SAAS,UAAU,CAAC,MAAqB,EAAE,KAAiB;IACxD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAkB,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;AACjG,CAAC;AACD,kEAAkE;AAClE,MAAM,CAAC,MAAM,kBAAkB,GA+EX,CAAC;KAChB,MAAM,CAAC;IACR,gFAAgF;IAChF,cAAc,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE;IACzB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAClC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IACpC,kEAAkE;IAClE,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,8BAA8B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACxD,CAAC;IACE,+DAA+D;KAC9D,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE;IACnF,OAAO,EAAE,8DAA8D;IACvE,IAAI,EAAE,CAAC,cAAc,CAAC;CACzB,CAAC;KACG,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;IACzE,OAAO,EAAE,oDAAoD;IAC7D,IAAI,EAAE,CAAC,QAAQ,CAAC;CACnB,CAAC,CAAC;AACH,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAC9D,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,yEAAyE;AACzE,MAAM,UAAU,UAAU,CAAC,MAAqB;IAI5C,OAAO,EAAE,YAAY,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;AAChG,CAAC;AACD,oEAAoE;AACpE,MAAM,UAAU,WAAW,CAAC,MAAqB;IAC7C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AACD,oDAAoD;AACpD,SAAS,SAAS,CAAC,MAAoB;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,sDAAsD;IACtD,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;IAC1F,CAAC;IACD,mFAAmF;IACnF,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;IACtE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5G,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC3B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO;YAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,9 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:doctor-telemetry.d.ts + doctor-telemetry.impl.js */
2
+ import type { DoctorOptions, DoctorRepair, DoctorReport } from './doctor-report.js';
3
+ import type { RepairOutcome } from './doctor-repairs.js';
4
+ import type { DoctorCompletedPayload, DoctorCouldNotRunPayload } from './setup-telemetry.js';
5
+ /** Enumerated fields only; check `detail` text never leaves the machine. */
6
+ export declare function telemetryPayload(report: DoctorReport, offered: DoctorRepair[], outcomes: RepairOutcome[], options: DoctorOptions, durationMs: number): DoctorCompletedPayload;
7
+ /** Enumerated outcome and timing only; the raw error stays behind --debug. */
8
+ export declare function couldNotRunPayload(error: unknown, options: DoctorOptions, durationMs: number): DoctorCouldNotRunPayload;
9
+ //# sourceMappingURL=doctor-telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-telemetry.d.ts","sourceRoot":"","sources":["../../src/lib/doctor-telemetry.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAE9E,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAU7F,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,sBAAsB,CAoC7K;AACD,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,wBAAwB,CAYvH"}
@@ -0,0 +1,63 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:doctor-telemetry.d.ts + doctor-telemetry.impl.js */
2
+ import { CLI_VERSION } from './constants.js';
3
+ import { DOCTOR_SCHEMA_VERSION, } from './doctor-report.js';
4
+ import { detectHumanInitiated } from './harness.js';
5
+ import { doctorErrorClass, } from './setup-telemetry.js';
6
+ /** Mirrors the route's cap; over it the payload would 400 and never be retried. */
7
+ const MAX_DURATION_MS = 3_600_000;
8
+ function fixModeOf(options) {
9
+ return !options.fix ? 'none' : options.yes ? 'fix_yes' : 'fix';
10
+ }
11
+ /** Enumerated fields only; check `detail` text never leaves the machine. */
12
+ export function telemetryPayload(report, offered, outcomes, options, durationMs) {
13
+ const count = (status) => report.checks.filter((check) => check.status === status).length;
14
+ const failed = report.checks.filter((check) => check.status === 'fail');
15
+ return {
16
+ outcome: 'completed',
17
+ schema_version: report.schema_version,
18
+ cli_version: report.cli_version,
19
+ ok_harnesses: report.ok_harnesses,
20
+ ok_cli: report.ok_cli,
21
+ checks_pass: count('pass'),
22
+ checks_fail: count('fail'),
23
+ checks_warn: count('warn'),
24
+ checks_skip: count('skip'),
25
+ // From the pre-repair report; the verdicts above describe the machine after it.
26
+ repairs_offered: offered.length,
27
+ repair_actions: [...new Set(offered.map((repair) => repair.action))],
28
+ repairs_attempted: outcomes.filter((outcome) => outcome.status !== 'skipped').length,
29
+ repairs_succeeded: outcomes.filter((outcome) => outcome.status === 'repaired').length,
30
+ fix_mode: fixModeOf(options),
31
+ // --harness scopes detection, so the counts above cover that harness alone.
32
+ harness_scope: options.harness ?? 'all',
33
+ // Same signal cli_connect_stage carries, so agent and human doctor runs split.
34
+ is_human_initiated: detectHumanInitiated(),
35
+ // Two flat arrays rather than one of pairs: PostHog groups by element, not by field.
36
+ failed_check_ids: [...new Set(failed.map((check) => check.id))],
37
+ failed_harnesses: [...new Set(failed.map((check) => check.harness).filter((h) => h !== null))],
38
+ harnesses: report.harnesses,
39
+ // Clamped, not validated: a --fix parked at a prompt must not fail the parse and drop the run.
40
+ duration_ms: Math.min(durationMs, MAX_DURATION_MS),
41
+ ...(report.hermes_plugin_version
42
+ ? { hermes_plugin_version: report.hermes_plugin_version }
43
+ : {}),
44
+ ...(report.hermes_plugin_expected_version
45
+ ? { hermes_plugin_expected_version: report.hermes_plugin_expected_version }
46
+ : {}),
47
+ };
48
+ }
49
+ /** Enumerated outcome and timing only; the raw error stays behind --debug. */
50
+ export function couldNotRunPayload(error, options, durationMs) {
51
+ return {
52
+ outcome: 'could_not_run',
53
+ error_class: doctorErrorClass(error),
54
+ schema_version: DOCTOR_SCHEMA_VERSION,
55
+ cli_version: CLI_VERSION,
56
+ fix_mode: fixModeOf(options),
57
+ harness_scope: options.harness ?? 'all',
58
+ is_human_initiated: detectHumanInitiated(),
59
+ // Clamped like the completed row: over the cap the payload would 400 un-retried.
60
+ duration_ms: Math.min(durationMs, MAX_DURATION_MS),
61
+ };
62
+ }
63
+ //# sourceMappingURL=doctor-telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-telemetry.js","sourceRoot":"","sources":["../../src/lib/doctor-telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:harness-detect.d.ts + harness-detect.impl.js */
2
+ import type { Harness } from './harness-spec.js';
3
+ import { ALL_HARNESSES } from './harness-spec.js';
4
+ export { ALL_HARNESSES };
5
+ export declare const HARNESS_DISPLAY_NAMES: Record<Harness, string>;
6
+ export declare const RELOAD_ACTION: Record<Harness, string>;
7
+ export declare enum Registered {
8
+ Yes = "yes",
9
+ No = "no",
10
+ Unknown = "unknown"
11
+ }
12
+ export declare enum AuthMode {
13
+ ApiKey = "api-key",
14
+ OAuth = "oauth",
15
+ Unknown = "unknown"
16
+ }
17
+ export declare const HARNESS_COMMANDS: Record<Harness, string>;
18
+ export declare function commandOnPath(command: string): boolean;
19
+ export declare function harnessConfigPath(harness: Harness): string;
20
+ /** For reason strings that name a location; keeps them in sync with the spec. */
21
+ export declare function harnessDisplayPath(harness: Harness): string;
22
+ export declare function detectInstalledHarnesses(): HarnessDetection[];
23
+ export interface HarnessDetection {
24
+ harness: Harness;
25
+ detected: boolean;
26
+ configPath: string;
27
+ /** False with `detected` true means a stale config dir: nothing to run. */
28
+ binaryOnPath: boolean;
29
+ /** True with no config dir means installed but never launched. */
30
+ configDirExists: boolean;
31
+ }
32
+ export { type Harness };
33
+ //# sourceMappingURL=harness-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-detect.d.ts","sourceRoot":"","sources":["../../src/lib/harness-detect.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjD,OAAO,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,eAAO,MAAM,qBAAqB,EAAsG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAChK,eAAO,MAAM,aAAa,EAAuG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAEzJ,oBAAY,UAAU;IAClB,GAAG,QAAQ;IACX,EAAE,OAAO;IACT,OAAO,YAAY;CACtB;AACD,oBAAY,QAAQ;IAChB,MAAM,YAAY;IAClB,KAAK,UAAU;IACf,OAAO,YAAY;CACtB;AAGD,eAAO,MAAM,gBAAgB,EAAkG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAEvJ,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOtD;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAG1D;AACD,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAE3D;AAGD,wBAAgB,wBAAwB,IAAI,gBAAgB,EAAE,CAqB7D;AAGD,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,YAAY,EAAE,OAAO,CAAC;IACtB,kEAAkE;IAClE,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED,OAAO,EAAE,KAAK,OAAO,EAAE,CAAC"}
@@ -0,0 +1,70 @@
1
+ /** 复刻自 tiny-fish CLI 编译产物:harness-detect.d.ts + harness-detect.impl.js */
2
+ import * as fs from 'fs';
3
+ import * as os from 'os';
4
+ import * as path from 'path';
5
+ import which from 'which';
6
+ import { ALL_HARNESSES, harnessSpec } from './harness-spec.js';
7
+ import { piAgentDir, piBinaryIsPi } from './pi-config.js';
8
+ export { ALL_HARNESSES };
9
+ export const HARNESS_DISPLAY_NAMES = Object.fromEntries(ALL_HARNESSES.map((harness) => [harness, harnessSpec(harness).displayName]));
10
+ export const RELOAD_ACTION = Object.fromEntries(ALL_HARNESSES.map((harness) => [harness, harnessSpec(harness).reloadAction]));
11
+ // Values are the wire contract; the report schema derives from these.
12
+ export var Registered;
13
+ (function (Registered) {
14
+ Registered["Yes"] = "yes";
15
+ Registered["No"] = "no";
16
+ Registered["Unknown"] = "unknown";
17
+ })(Registered || (Registered = {}));
18
+ export var AuthMode;
19
+ (function (AuthMode) {
20
+ AuthMode["ApiKey"] = "api-key";
21
+ AuthMode["OAuth"] = "oauth";
22
+ AuthMode["Unknown"] = "unknown";
23
+ })(AuthMode || (AuthMode = {}));
24
+ // Harness id is not the binary name (cursor-agent).
25
+ // TODO(PF-3668): a same-named non-harness binary still reads as installed.
26
+ export const HARNESS_COMMANDS = Object.fromEntries(ALL_HARNESSES.map((harness) => [harness, harnessSpec(harness).command]));
27
+ // cross-spawn resolves the same way, so detection cannot disagree with the spawn.
28
+ export function commandOnPath(command) {
29
+ try {
30
+ return which.sync(command, { nothrow: true }) !== null;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ // PI_CODING_AGENT_DIR moves pi's dir; a guessed path would be written unread.
37
+ const CONFIG_PATH_RESOLVERS = { pi: piAgentDir };
38
+ export function harnessConfigPath(harness) {
39
+ const resolved = CONFIG_PATH_RESOLVERS[harness]?.();
40
+ return resolved ?? path.join(os.homedir(), harnessSpec(harness).configDir); // nosemgrep: path-join-resolve-traversal -- fixed dir names under os.homedir()
41
+ }
42
+ /** For reason strings that name a location; keeps them in sync with the spec. */
43
+ export function harnessDisplayPath(harness) {
44
+ return `~/${harnessSpec(harness).configDir}`;
45
+ }
46
+ // `pi` is a two-letter name an unrelated npm package also claims; confirm before trusting it.
47
+ const BINARY_VERIFIERS = { pi: piBinaryIsPi };
48
+ export function detectInstalledHarnesses() {
49
+ return ALL_HARNESSES.map((harness) => {
50
+ const configPath = harnessConfigPath(harness);
51
+ let configDirExists;
52
+ try {
53
+ configDirExists = fs.statSync(configPath).isDirectory();
54
+ }
55
+ catch {
56
+ configDirExists = false;
57
+ }
58
+ // Config dir means ran once; a verified binary means runnable now.
59
+ const onPath = commandOnPath(HARNESS_COMMANDS[harness]);
60
+ const binaryOnPath = onPath && (BINARY_VERIFIERS[harness]?.() ?? true);
61
+ return {
62
+ harness,
63
+ detected: configDirExists || binaryOnPath,
64
+ configPath,
65
+ binaryOnPath,
66
+ configDirExists,
67
+ };
68
+ });
69
+ }
70
+ //# sourceMappingURL=harness-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-detect.js","sourceRoot":"","sources":["../../src/lib/harness-detect.ts"],"names":[],"mappings":"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"}