@springbrand/cli 0.1.0 → 0.1.1-alpha.1

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 (46) hide show
  1. package/README.md +35 -1
  2. package/dist/commands/auth.d.ts +13 -0
  3. package/dist/commands/auth.d.ts.map +1 -1
  4. package/dist/commands/auth.js +8 -3
  5. package/dist/commands/auth.js.map +1 -1
  6. package/dist/commands/check-version.d.ts.map +1 -1
  7. package/dist/commands/check-version.js +36 -6
  8. package/dist/commands/check-version.js.map +1 -1
  9. package/dist/commands/connect.d.ts.map +1 -1
  10. package/dist/commands/connect.js +18 -10
  11. package/dist/commands/connect.js.map +1 -1
  12. package/dist/commands/doctor.d.ts +1 -1
  13. package/dist/commands/doctor.d.ts.map +1 -1
  14. package/dist/commands/doctor.js +42 -8
  15. package/dist/commands/doctor.js.map +1 -1
  16. package/dist/lib/auth.d.ts.map +1 -1
  17. package/dist/lib/auth.js +13 -7
  18. package/dist/lib/auth.js.map +1 -1
  19. package/dist/lib/connect-all-summary.d.ts.map +1 -1
  20. package/dist/lib/connect-all-summary.js +5 -1
  21. package/dist/lib/connect-all-summary.js.map +1 -1
  22. package/dist/lib/connect-all.d.ts +4 -1
  23. package/dist/lib/connect-all.d.ts.map +1 -1
  24. package/dist/lib/connect-all.js +8 -2
  25. package/dist/lib/connect-all.js.map +1 -1
  26. package/dist/lib/doctor-checks.d.ts +6 -0
  27. package/dist/lib/doctor-checks.d.ts.map +1 -1
  28. package/dist/lib/doctor-checks.js +27 -0
  29. package/dist/lib/doctor-checks.js.map +1 -1
  30. package/dist/lib/doctor-machine.d.ts +13 -0
  31. package/dist/lib/doctor-machine.d.ts.map +1 -0
  32. package/dist/lib/doctor-machine.js +208 -0
  33. package/dist/lib/doctor-machine.js.map +1 -0
  34. package/dist/lib/doctor-report.d.ts +307 -0
  35. package/dist/lib/doctor-report.d.ts.map +1 -1
  36. package/dist/lib/doctor-report.js +80 -0
  37. package/dist/lib/doctor-report.js.map +1 -1
  38. package/dist/lib/mcp-endpoint.d.ts +6 -0
  39. package/dist/lib/mcp-endpoint.d.ts.map +1 -1
  40. package/dist/lib/mcp-endpoint.js +8 -0
  41. package/dist/lib/mcp-endpoint.js.map +1 -1
  42. package/dist/lib/registration-detect.d.ts +13 -0
  43. package/dist/lib/registration-detect.d.ts.map +1 -1
  44. package/dist/lib/registration-detect.js +45 -0
  45. package/dist/lib/registration-detect.js.map +1 -1
  46. package/package.json +2 -1
@@ -0,0 +1,208 @@
1
+ /**
2
+ * The phase order is part of the machine contract. A consumer can use
3
+ * `failed_phase` without interpreting human-facing check text.
4
+ */
5
+ export const DOCTOR_PHASE_ORDER = [
6
+ 'detection',
7
+ 'mcp_configured',
8
+ 'auth',
9
+ 'skills',
10
+ 'tools',
11
+ 'restart',
12
+ ];
13
+ const STATUS_ORDER = ['pass', 'warn', 'fail', 'skip', 'unknown'];
14
+ function phase(status, code) {
15
+ return { status, code };
16
+ }
17
+ function checkFor(report, harness, id) {
18
+ return report.checks.find(check => check.harness === harness && check.id === id);
19
+ }
20
+ function statusFromCheck(check, fallback = 'unknown') {
21
+ return check?.status ?? fallback;
22
+ }
23
+ function registrationPhase(report, harness) {
24
+ if (!harness.detected)
25
+ return phase('skip', 'not_detected');
26
+ const registration = checkFor(report, harness.harness, 'harness-registration');
27
+ if (registration?.status === 'fail' && registration.detail.includes('points at')) {
28
+ return phase('fail', 'mcp_misconfigured');
29
+ }
30
+ switch (harness.registered) {
31
+ case 'yes': return phase('pass', 'configured');
32
+ case 'no': return phase('warn', 'not_configured');
33
+ default: return phase('unknown', 'registration_unknown');
34
+ }
35
+ }
36
+ function authPhase(report, harness) {
37
+ if (!harness.detected || harness.registered === 'no')
38
+ return phase('skip', 'not_applicable');
39
+ const registration = checkFor(report, harness.harness, 'harness-registration');
40
+ if (registration?.detail.includes('points at'))
41
+ return phase('skip', 'not_applicable');
42
+ if (registration?.status === 'fail')
43
+ return phase('fail', 'auth_failed');
44
+ if (harness.auth_mode === 'unknown')
45
+ return phase('unknown', 'auth_unknown');
46
+ if (registration?.status === 'warn')
47
+ return phase('warn', 'auth_unverified');
48
+ return phase('pass', 'auth_configured');
49
+ }
50
+ function skillsPhase(report, harness) {
51
+ if (!harness.detected)
52
+ return phase('skip', 'not_detected');
53
+ const check = checkFor(report, harness.harness, 'hermes-plugin') ?? checkFor(report, harness.harness, 'pi-adapter');
54
+ if (!check)
55
+ return phase('skip', 'not_applicable');
56
+ const codes = {
57
+ pass: 'skills_ready',
58
+ warn: 'skills_warn',
59
+ fail: 'skills_fail',
60
+ skip: 'skills_skip',
61
+ unknown: 'skills_unknown',
62
+ };
63
+ return phase(statusFromCheck(check), codes[check.status]);
64
+ }
65
+ function toolsPhase(report, harness) {
66
+ if (!harness.detected || harness.registered === 'no')
67
+ return phase('skip', 'not_applicable');
68
+ if (harness.proves_harness_reach)
69
+ return phase('pass', 'harness_reach_verified');
70
+ if (report.checks.some(check => check.id === 'mcp-connectivity' && check.status === 'fail')) {
71
+ return phase('fail', 'tools_unreachable');
72
+ }
73
+ const registration = checkFor(report, harness.harness, 'harness-registration');
74
+ if (registration?.status === 'fail')
75
+ return phase('fail', 'tools_unreachable');
76
+ if (registration?.status === 'warn')
77
+ return phase('warn', 'tools_unverified');
78
+ return phase('unknown', 'tools_unknown');
79
+ }
80
+ function restartPhase(report, harness, skills) {
81
+ if (!harness.detected)
82
+ return { ...phase('skip', 'not_detected'), required: false };
83
+ const restartCheck = checkFor(report, harness.harness, 'restart-required');
84
+ if (restartCheck?.status === 'fail' || restartCheck?.status === 'warn') {
85
+ return { ...phase('warn', 'restart_required'), required: true };
86
+ }
87
+ if (restartCheck?.status === 'skip')
88
+ return { ...phase('skip', 'not_applicable'), required: false };
89
+ // The current checks do not observe a live process reload. Keep this explicit
90
+ // instead of guessing from a registration result; a future check can add a
91
+ // stable reason code without changing the field shape.
92
+ if (skills.status === 'fail')
93
+ return { ...phase('warn', 'skills_need_attention'), required: false };
94
+ return { ...phase('pass', 'not_required'), required: false };
95
+ }
96
+ function failedPhase(host) {
97
+ return DOCTOR_PHASE_ORDER.find(name => {
98
+ if (name === 'detection')
99
+ return false;
100
+ const statuses = {
101
+ mcp_configured: host.mcp_configured.status,
102
+ auth: host.auth.status,
103
+ skills: host.skills.status,
104
+ tools: host.tools.status,
105
+ restart: host.restart_required.status,
106
+ };
107
+ return statuses[name] === 'fail';
108
+ }) ?? null;
109
+ }
110
+ function overallVerdict(report, hosts) {
111
+ if (!report.ok_harnesses || hosts.some(host => host.failed_phase !== null))
112
+ return 'fail';
113
+ const phaseStatuses = hosts.flatMap(host => [
114
+ host.mcp_configured.status,
115
+ host.auth.status,
116
+ host.skills.status,
117
+ host.tools.status,
118
+ host.restart_required.status,
119
+ ]);
120
+ if (phaseStatuses.some(status => status === 'warn' || status === 'unknown'))
121
+ return 'warn';
122
+ if (!report.ok_cli || report.checks.some(check => check.status === 'warn'))
123
+ return 'warn';
124
+ return 'pass';
125
+ }
126
+ function safeChecks(checks) {
127
+ return checks.map(check => ({
128
+ id: check.id,
129
+ status: check.status,
130
+ harness: check.harness,
131
+ scope: check.scope,
132
+ }));
133
+ }
134
+ function repairCode(outcome) {
135
+ if (outcome.status === 'repaired')
136
+ return 'repaired';
137
+ if (outcome.status === 'skipped') {
138
+ if (outcome.reason?.includes('no terminal'))
139
+ return 'no_terminal';
140
+ if (outcome.reason?.includes('browser'))
141
+ return 'interactive_auth_required';
142
+ return 'skipped';
143
+ }
144
+ return 'repair_failed';
145
+ }
146
+ function safeRepairs(report, outcomes) {
147
+ if (outcomes.length > 0) {
148
+ return outcomes.map(outcome => ({
149
+ action: outcome.repair.action,
150
+ harness: outcome.repair.harness,
151
+ status: outcome.status,
152
+ code: repairCode(outcome),
153
+ }));
154
+ }
155
+ return report.repairs.map(repair => ({
156
+ action: repair.action,
157
+ harness: repair.harness,
158
+ status: 'offered',
159
+ code: 'repair_available',
160
+ }));
161
+ }
162
+ /** Project the legacy report into the explicit, allowlisted machine contract. */
163
+ export function machineReport(report, outcomes = []) {
164
+ const hosts = report.harnesses.map(harness => {
165
+ const mcpConfigured = registrationPhase(report, harness);
166
+ const auth = authPhase(report, harness);
167
+ const skills = skillsPhase(report, harness);
168
+ const tools = toolsPhase(report, harness);
169
+ const host = {
170
+ harness: harness.harness,
171
+ detected: harness.detected,
172
+ mcp_configured: mcpConfigured,
173
+ auth,
174
+ skills,
175
+ tools,
176
+ restart_required: restartPhase(report, harness, skills),
177
+ failed_phase: null,
178
+ };
179
+ host.failed_phase = failedPhase(host);
180
+ return host;
181
+ });
182
+ const result = {
183
+ schema_version: 1,
184
+ outcome: 'completed',
185
+ cli_version: report.cli_version,
186
+ verdict: overallVerdict(report, hosts),
187
+ ok_harnesses: report.ok_harnesses,
188
+ ok_cli: report.ok_cli,
189
+ checks: safeChecks(report.checks),
190
+ hosts,
191
+ repairs: safeRepairs(report, outcomes),
192
+ };
193
+ return result;
194
+ }
195
+ /** Fixed error envelope used when the diagnostic itself cannot complete. */
196
+ export function machineError(phaseName = 'run') {
197
+ return {
198
+ schema_version: 1,
199
+ outcome: 'could_not_run',
200
+ phase: phaseName,
201
+ error_code: phaseName === 'input' ? 'invalid_input' : 'doctor_failed',
202
+ retryable: phaseName !== 'input',
203
+ };
204
+ }
205
+ // Keep the status list referenced here so additions require updating the
206
+ // machine contract deliberately rather than becoming accidental wire values.
207
+ export const MACHINE_PHASE_STATUSES = STATUS_ORDER;
208
+ //# sourceMappingURL=doctor-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-machine.js","sourceRoot":"","sources":["../../src/lib/doctor-machine.ts"],"names":[],"mappings":"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"}
@@ -167,6 +167,309 @@ export declare const doctorReportSchema: z.ZodObject<{
167
167
  hermes_plugin_version: z.ZodOptional<z.ZodString>;
168
168
  hermes_plugin_expected_version: z.ZodOptional<z.ZodString>;
169
169
  }, z.core.$strip>;
170
+ /**
171
+ * Explicit machine mode is versioned independently from the legacy default JSON.
172
+ * Version policy: bump for breaking reads; additive optional fields remain
173
+ * forward-compatible under the same version.
174
+ */
175
+ export declare const DOCTOR_MACHINE_SCHEMA_VERSION = 1;
176
+ declare const machinePhaseStatusSchema: z.ZodEnum<{
177
+ unknown: "unknown";
178
+ pass: "pass";
179
+ fail: "fail";
180
+ warn: "warn";
181
+ skip: "skip";
182
+ }>;
183
+ declare const machinePhaseNameSchema: z.ZodEnum<{
184
+ auth: "auth";
185
+ skills: "skills";
186
+ detection: "detection";
187
+ mcp_configured: "mcp_configured";
188
+ tools: "tools";
189
+ restart: "restart";
190
+ }>;
191
+ export declare const doctorMachineReportSchema: z.ZodObject<{
192
+ schema_version: z.ZodLiteral<1>;
193
+ outcome: z.ZodLiteral<"completed">;
194
+ cli_version: z.ZodString;
195
+ verdict: z.ZodEnum<{
196
+ pass: "pass";
197
+ fail: "fail";
198
+ warn: "warn";
199
+ }>;
200
+ ok_harnesses: z.ZodBoolean;
201
+ ok_cli: z.ZodBoolean;
202
+ checks: z.ZodArray<z.ZodObject<{
203
+ id: z.ZodString;
204
+ status: z.ZodEnum<{
205
+ pass: "pass";
206
+ fail: "fail";
207
+ warn: "warn";
208
+ skip: "skip";
209
+ }>;
210
+ harness: z.ZodNullable<z.ZodEnum<{
211
+ openclaw: "openclaw";
212
+ omp: "omp";
213
+ grok: "grok";
214
+ cursor: "cursor";
215
+ codex: "codex";
216
+ hermes: "hermes";
217
+ "command-code": "command-code";
218
+ opencode: "opencode";
219
+ pi: "pi";
220
+ "claude-code": "claude-code";
221
+ }>>;
222
+ scope: z.ZodEnum<{
223
+ cli: "cli";
224
+ harness: "harness";
225
+ info: "info";
226
+ }>;
227
+ }, z.core.$strip>>;
228
+ hosts: z.ZodArray<z.ZodObject<{
229
+ harness: z.ZodEnum<{
230
+ openclaw: "openclaw";
231
+ omp: "omp";
232
+ grok: "grok";
233
+ cursor: "cursor";
234
+ codex: "codex";
235
+ hermes: "hermes";
236
+ "command-code": "command-code";
237
+ opencode: "opencode";
238
+ pi: "pi";
239
+ "claude-code": "claude-code";
240
+ }>;
241
+ detected: z.ZodBoolean;
242
+ mcp_configured: z.ZodObject<{
243
+ status: z.ZodEnum<{
244
+ unknown: "unknown";
245
+ pass: "pass";
246
+ fail: "fail";
247
+ warn: "warn";
248
+ skip: "skip";
249
+ }>;
250
+ code: z.ZodEnum<{
251
+ not_detected: "not_detected";
252
+ configured: "configured";
253
+ not_configured: "not_configured";
254
+ mcp_misconfigured: "mcp_misconfigured";
255
+ registration_unknown: "registration_unknown";
256
+ not_applicable: "not_applicable";
257
+ auth_failed: "auth_failed";
258
+ auth_unknown: "auth_unknown";
259
+ auth_unverified: "auth_unverified";
260
+ auth_configured: "auth_configured";
261
+ skills_ready: "skills_ready";
262
+ skills_pass: "skills_pass";
263
+ skills_warn: "skills_warn";
264
+ skills_fail: "skills_fail";
265
+ skills_skip: "skills_skip";
266
+ skills_unknown: "skills_unknown";
267
+ tools_unreachable: "tools_unreachable";
268
+ tools_unverified: "tools_unverified";
269
+ tools_unknown: "tools_unknown";
270
+ harness_reach_verified: "harness_reach_verified";
271
+ skills_need_attention: "skills_need_attention";
272
+ not_required: "not_required";
273
+ restart_required: "restart_required";
274
+ restart_unknown: "restart_unknown";
275
+ }>;
276
+ }, z.core.$strip>;
277
+ auth: z.ZodObject<{
278
+ status: z.ZodEnum<{
279
+ unknown: "unknown";
280
+ pass: "pass";
281
+ fail: "fail";
282
+ warn: "warn";
283
+ skip: "skip";
284
+ }>;
285
+ code: z.ZodEnum<{
286
+ not_detected: "not_detected";
287
+ configured: "configured";
288
+ not_configured: "not_configured";
289
+ mcp_misconfigured: "mcp_misconfigured";
290
+ registration_unknown: "registration_unknown";
291
+ not_applicable: "not_applicable";
292
+ auth_failed: "auth_failed";
293
+ auth_unknown: "auth_unknown";
294
+ auth_unverified: "auth_unverified";
295
+ auth_configured: "auth_configured";
296
+ skills_ready: "skills_ready";
297
+ skills_pass: "skills_pass";
298
+ skills_warn: "skills_warn";
299
+ skills_fail: "skills_fail";
300
+ skills_skip: "skills_skip";
301
+ skills_unknown: "skills_unknown";
302
+ tools_unreachable: "tools_unreachable";
303
+ tools_unverified: "tools_unverified";
304
+ tools_unknown: "tools_unknown";
305
+ harness_reach_verified: "harness_reach_verified";
306
+ skills_need_attention: "skills_need_attention";
307
+ not_required: "not_required";
308
+ restart_required: "restart_required";
309
+ restart_unknown: "restart_unknown";
310
+ }>;
311
+ }, z.core.$strip>;
312
+ skills: z.ZodObject<{
313
+ status: z.ZodEnum<{
314
+ unknown: "unknown";
315
+ pass: "pass";
316
+ fail: "fail";
317
+ warn: "warn";
318
+ skip: "skip";
319
+ }>;
320
+ code: z.ZodEnum<{
321
+ not_detected: "not_detected";
322
+ configured: "configured";
323
+ not_configured: "not_configured";
324
+ mcp_misconfigured: "mcp_misconfigured";
325
+ registration_unknown: "registration_unknown";
326
+ not_applicable: "not_applicable";
327
+ auth_failed: "auth_failed";
328
+ auth_unknown: "auth_unknown";
329
+ auth_unverified: "auth_unverified";
330
+ auth_configured: "auth_configured";
331
+ skills_ready: "skills_ready";
332
+ skills_pass: "skills_pass";
333
+ skills_warn: "skills_warn";
334
+ skills_fail: "skills_fail";
335
+ skills_skip: "skills_skip";
336
+ skills_unknown: "skills_unknown";
337
+ tools_unreachable: "tools_unreachable";
338
+ tools_unverified: "tools_unverified";
339
+ tools_unknown: "tools_unknown";
340
+ harness_reach_verified: "harness_reach_verified";
341
+ skills_need_attention: "skills_need_attention";
342
+ not_required: "not_required";
343
+ restart_required: "restart_required";
344
+ restart_unknown: "restart_unknown";
345
+ }>;
346
+ }, z.core.$strip>;
347
+ tools: z.ZodObject<{
348
+ status: z.ZodEnum<{
349
+ unknown: "unknown";
350
+ pass: "pass";
351
+ fail: "fail";
352
+ warn: "warn";
353
+ skip: "skip";
354
+ }>;
355
+ code: z.ZodEnum<{
356
+ not_detected: "not_detected";
357
+ configured: "configured";
358
+ not_configured: "not_configured";
359
+ mcp_misconfigured: "mcp_misconfigured";
360
+ registration_unknown: "registration_unknown";
361
+ not_applicable: "not_applicable";
362
+ auth_failed: "auth_failed";
363
+ auth_unknown: "auth_unknown";
364
+ auth_unverified: "auth_unverified";
365
+ auth_configured: "auth_configured";
366
+ skills_ready: "skills_ready";
367
+ skills_pass: "skills_pass";
368
+ skills_warn: "skills_warn";
369
+ skills_fail: "skills_fail";
370
+ skills_skip: "skills_skip";
371
+ skills_unknown: "skills_unknown";
372
+ tools_unreachable: "tools_unreachable";
373
+ tools_unverified: "tools_unverified";
374
+ tools_unknown: "tools_unknown";
375
+ harness_reach_verified: "harness_reach_verified";
376
+ skills_need_attention: "skills_need_attention";
377
+ not_required: "not_required";
378
+ restart_required: "restart_required";
379
+ restart_unknown: "restart_unknown";
380
+ }>;
381
+ }, z.core.$strip>;
382
+ restart_required: z.ZodObject<{
383
+ status: z.ZodEnum<{
384
+ unknown: "unknown";
385
+ pass: "pass";
386
+ fail: "fail";
387
+ warn: "warn";
388
+ skip: "skip";
389
+ }>;
390
+ code: z.ZodEnum<{
391
+ not_detected: "not_detected";
392
+ configured: "configured";
393
+ not_configured: "not_configured";
394
+ mcp_misconfigured: "mcp_misconfigured";
395
+ registration_unknown: "registration_unknown";
396
+ not_applicable: "not_applicable";
397
+ auth_failed: "auth_failed";
398
+ auth_unknown: "auth_unknown";
399
+ auth_unverified: "auth_unverified";
400
+ auth_configured: "auth_configured";
401
+ skills_ready: "skills_ready";
402
+ skills_pass: "skills_pass";
403
+ skills_warn: "skills_warn";
404
+ skills_fail: "skills_fail";
405
+ skills_skip: "skills_skip";
406
+ skills_unknown: "skills_unknown";
407
+ tools_unreachable: "tools_unreachable";
408
+ tools_unverified: "tools_unverified";
409
+ tools_unknown: "tools_unknown";
410
+ harness_reach_verified: "harness_reach_verified";
411
+ skills_need_attention: "skills_need_attention";
412
+ not_required: "not_required";
413
+ restart_required: "restart_required";
414
+ restart_unknown: "restart_unknown";
415
+ }>;
416
+ required: z.ZodBoolean;
417
+ }, z.core.$strip>;
418
+ failed_phase: z.ZodNullable<z.ZodEnum<{
419
+ auth: "auth";
420
+ skills: "skills";
421
+ detection: "detection";
422
+ mcp_configured: "mcp_configured";
423
+ tools: "tools";
424
+ restart: "restart";
425
+ }>>;
426
+ }, z.core.$strip>>;
427
+ repairs: z.ZodArray<z.ZodObject<{
428
+ action: z.ZodEnum<{
429
+ connect: "connect";
430
+ "auth-login": "auth-login";
431
+ }>;
432
+ harness: z.ZodNullable<z.ZodEnum<{
433
+ openclaw: "openclaw";
434
+ omp: "omp";
435
+ grok: "grok";
436
+ cursor: "cursor";
437
+ codex: "codex";
438
+ hermes: "hermes";
439
+ "command-code": "command-code";
440
+ opencode: "opencode";
441
+ pi: "pi";
442
+ "claude-code": "claude-code";
443
+ }>>;
444
+ status: z.ZodEnum<{
445
+ failed: "failed";
446
+ offered: "offered";
447
+ repaired: "repaired";
448
+ skipped: "skipped";
449
+ }>;
450
+ code: z.ZodEnum<{
451
+ repaired: "repaired";
452
+ skipped: "skipped";
453
+ repair_available: "repair_available";
454
+ no_terminal: "no_terminal";
455
+ interactive_auth_required: "interactive_auth_required";
456
+ repair_failed: "repair_failed";
457
+ }>;
458
+ }, z.core.$strip>>;
459
+ }, z.core.$strip>;
460
+ export declare const doctorMachineErrorSchema: z.ZodObject<{
461
+ schema_version: z.ZodLiteral<1>;
462
+ outcome: z.ZodLiteral<"could_not_run">;
463
+ phase: z.ZodEnum<{
464
+ input: "input";
465
+ run: "run";
466
+ }>;
467
+ error_code: z.ZodEnum<{
468
+ invalid_input: "invalid_input";
469
+ doctor_failed: "doctor_failed";
470
+ }>;
471
+ retryable: z.ZodBoolean;
472
+ }, z.core.$strip>;
170
473
  /** Doctor itself broke, which is a different claim from "your setup is broken". */
171
474
  export declare const DOCTOR_COULD_NOT_RUN = 2;
172
475
  /** The invocation was wrong, not the machine; exit 2 stays "doctor broke". */
@@ -185,6 +488,10 @@ export type DoctorCheck = z.infer<typeof doctorCheckSchema>;
185
488
  export type DoctorHarness = z.infer<typeof doctorHarnessSchema>;
186
489
  export type DoctorRepair = z.infer<typeof doctorRepairSchema>;
187
490
  export type DoctorReport = z.infer<typeof doctorReportSchema>;
491
+ export type MachinePhaseStatus = z.infer<typeof machinePhaseStatusSchema>;
492
+ export type MachinePhase = z.infer<typeof machinePhaseNameSchema>;
493
+ export type DoctorMachineReport = z.infer<typeof doctorMachineReportSchema>;
494
+ export type DoctorMachineError = z.infer<typeof doctorMachineErrorSchema>;
188
495
  export interface DoctorOptions {
189
496
  mcpUrl: string;
190
497
  harness?: Harness;
@@ -1 +1 @@
1
- {"version":3,"file":"doctor-report.d.ts","sourceRoot":"","sources":["../../src/lib/doctor-report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor-report.d.ts","sourceRoot":"","sources":["../../src/lib/doctor-report.ts"],"names":[],"mappings":"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"}
@@ -60,6 +60,86 @@ export const doctorReportSchema = z
60
60
  message: 'ok_cli cannot be true while a CLI check has failed',
61
61
  path: ['ok_cli'],
62
62
  });
63
+ /**
64
+ * Explicit machine mode is versioned independently from the legacy default JSON.
65
+ * Version policy: bump for breaking reads; additive optional fields remain
66
+ * forward-compatible under the same version.
67
+ */
68
+ export const DOCTOR_MACHINE_SCHEMA_VERSION = 1;
69
+ const machinePhaseStatusSchema = z.enum(['pass', 'fail', 'warn', 'skip', 'unknown']);
70
+ const machinePhaseSchema = z.object({
71
+ status: machinePhaseStatusSchema,
72
+ // Codes are authored by the CLI; free text is deliberately not part of this contract.
73
+ code: z.enum([
74
+ 'not_detected',
75
+ 'configured',
76
+ 'not_configured',
77
+ 'mcp_misconfigured',
78
+ 'registration_unknown',
79
+ 'not_applicable',
80
+ 'auth_failed',
81
+ 'auth_unknown',
82
+ 'auth_unverified',
83
+ 'auth_configured',
84
+ 'skills_ready',
85
+ 'skills_pass',
86
+ 'skills_warn',
87
+ 'skills_fail',
88
+ 'skills_skip',
89
+ 'skills_unknown',
90
+ 'tools_unreachable',
91
+ 'tools_unverified',
92
+ 'tools_unknown',
93
+ 'harness_reach_verified',
94
+ 'skills_need_attention',
95
+ 'not_required',
96
+ 'restart_required',
97
+ 'restart_unknown',
98
+ ]),
99
+ });
100
+ const machinePhaseNameSchema = z.enum(['detection', 'mcp_configured', 'auth', 'skills', 'tools', 'restart']);
101
+ const machineCheckSchema = z.object({
102
+ id: z.string().regex(/^[a-z0-9][a-z0-9-]{0,63}$/),
103
+ status: checkStatusSchema,
104
+ harness: harnessSchema.nullable(),
105
+ scope: checkScopeSchema,
106
+ });
107
+ const machineHostSchema = z.object({
108
+ harness: harnessSchema,
109
+ detected: z.boolean(),
110
+ mcp_configured: machinePhaseSchema,
111
+ auth: machinePhaseSchema,
112
+ skills: machinePhaseSchema,
113
+ tools: machinePhaseSchema,
114
+ restart_required: machinePhaseSchema.extend({ required: z.boolean() }),
115
+ failed_phase: machinePhaseNameSchema.nullable(),
116
+ });
117
+ const machineRepairSchema = z.object({
118
+ action: z.enum(['connect', 'auth-login']),
119
+ harness: harnessSchema.nullable(),
120
+ status: z.enum(['offered', 'repaired', 'skipped', 'failed']),
121
+ code: z.enum(['repair_available', 'repaired', 'no_terminal', 'interactive_auth_required', 'skipped', 'repair_failed']),
122
+ });
123
+ export const doctorMachineReportSchema = z.object({
124
+ schema_version: z.literal(DOCTOR_MACHINE_SCHEMA_VERSION),
125
+ outcome: z.literal('completed'),
126
+ cli_version: z.string().max(32),
127
+ verdict: z.enum(['pass', 'warn', 'fail']),
128
+ ok_harnesses: z.boolean(),
129
+ ok_cli: z.boolean(),
130
+ checks: z.array(machineCheckSchema),
131
+ hosts: z.array(machineHostSchema),
132
+ repairs: z.array(machineRepairSchema),
133
+ });
134
+ const machineErrorPhaseSchema = z.enum(['input', 'run']);
135
+ const machineErrorCodeSchema = z.enum(['invalid_input', 'doctor_failed']);
136
+ export const doctorMachineErrorSchema = z.object({
137
+ schema_version: z.literal(DOCTOR_MACHINE_SCHEMA_VERSION),
138
+ outcome: z.literal('could_not_run'),
139
+ phase: machineErrorPhaseSchema,
140
+ error_code: machineErrorCodeSchema,
141
+ retryable: z.boolean(),
142
+ });
63
143
  const GLYPHS = { pass: '✓', fail: '✗', warn: '⚠', skip: '…' };
64
144
  /** Doctor itself broke, which is a different claim from "your setup is broken". */
65
145
  export const DOCTOR_COULD_NOT_RUN = 2;