@namzu/cli 0.0.2

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 (58) hide show
  1. package/README.md +79 -0
  2. package/dist/bin.d.ts +3 -0
  3. package/dist/bin.d.ts.map +1 -0
  4. package/dist/bin.js +38 -0
  5. package/dist/bin.js.map +1 -0
  6. package/dist/commands/doctor.d.ts +2 -0
  7. package/dist/commands/doctor.d.ts.map +1 -0
  8. package/dist/commands/doctor.js +201 -0
  9. package/dist/commands/doctor.js.map +1 -0
  10. package/dist/commands/doctor.test.d.ts +2 -0
  11. package/dist/commands/doctor.test.d.ts.map +1 -0
  12. package/dist/commands/doctor.test.js +82 -0
  13. package/dist/commands/doctor.test.js.map +1 -0
  14. package/dist/doctor/checks/index.d.ts +9 -0
  15. package/dist/doctor/checks/index.d.ts.map +1 -0
  16. package/dist/doctor/checks/index.js +15 -0
  17. package/dist/doctor/checks/index.js.map +1 -0
  18. package/dist/doctor/checks/providers.d.ts +19 -0
  19. package/dist/doctor/checks/providers.d.ts.map +1 -0
  20. package/dist/doctor/checks/providers.js +25 -0
  21. package/dist/doctor/checks/providers.js.map +1 -0
  22. package/dist/doctor/checks/runtime.d.ts +4 -0
  23. package/dist/doctor/checks/runtime.d.ts.map +1 -0
  24. package/dist/doctor/checks/runtime.js +40 -0
  25. package/dist/doctor/checks/runtime.js.map +1 -0
  26. package/dist/doctor/checks/sandbox.d.ts +3 -0
  27. package/dist/doctor/checks/sandbox.d.ts.map +1 -0
  28. package/dist/doctor/checks/sandbox.js +42 -0
  29. package/dist/doctor/checks/sandbox.js.map +1 -0
  30. package/dist/doctor/checks/telemetry.d.ts +12 -0
  31. package/dist/doctor/checks/telemetry.d.ts.map +1 -0
  32. package/dist/doctor/checks/telemetry.js +27 -0
  33. package/dist/doctor/checks/telemetry.js.map +1 -0
  34. package/dist/doctor/checks/vault.d.ts +13 -0
  35. package/dist/doctor/checks/vault.d.ts.map +1 -0
  36. package/dist/doctor/checks/vault.js +19 -0
  37. package/dist/doctor/checks/vault.js.map +1 -0
  38. package/dist/doctor/index.d.ts +4 -0
  39. package/dist/doctor/index.d.ts.map +1 -0
  40. package/dist/doctor/index.js +3 -0
  41. package/dist/doctor/index.js.map +1 -0
  42. package/dist/doctor/registry.d.ts +55 -0
  43. package/dist/doctor/registry.d.ts.map +1 -0
  44. package/dist/doctor/registry.js +197 -0
  45. package/dist/doctor/registry.js.map +1 -0
  46. package/dist/doctor/registry.test.d.ts +7 -0
  47. package/dist/doctor/registry.test.d.ts.map +1 -0
  48. package/dist/doctor/registry.test.js +376 -0
  49. package/dist/doctor/registry.test.js.map +1 -0
  50. package/dist/exit-codes.d.ts +16 -0
  51. package/dist/exit-codes.d.ts.map +1 -0
  52. package/dist/exit-codes.js +15 -0
  53. package/dist/exit-codes.js.map +1 -0
  54. package/dist/index.d.ts +10 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +9 -0
  57. package/dist/index.js.map +1 -0
  58. package/package.json +58 -0
@@ -0,0 +1,376 @@
1
+ /**
2
+ * Ratified §9 of docs.local/sessions/ses_007-probe-and-doctor/design.md.
3
+ * D4 = registerDoctorCheck + plugin auto-discovery + standalone-CLI /
4
+ * embedded-runDoctor split. D5 = sysexits exit codes (0/1/2/70).
5
+ */
6
+ import { describe, expect, it } from 'vitest';
7
+ import { createDoctorRegistry, runDoctor } from './registry.js';
8
+ function check(id, result, category = 'custom') {
9
+ return {
10
+ id,
11
+ category,
12
+ run: async () => result,
13
+ };
14
+ }
15
+ describe('DoctorRegistry — registration', () => {
16
+ it('register + list returns the registered check', () => {
17
+ const reg = createDoctorRegistry();
18
+ const c = check('a', { status: 'pass' });
19
+ reg.register(c);
20
+ expect(reg.list()).toEqual([c]);
21
+ });
22
+ it('throws when registering a duplicate id without unregister', () => {
23
+ const reg = createDoctorRegistry();
24
+ reg.register(check('dup', { status: 'pass' }));
25
+ expect(() => reg.register(check('dup', { status: 'pass' }))).toThrow(/already registered/);
26
+ });
27
+ it('unregister removes the check', () => {
28
+ const reg = createDoctorRegistry();
29
+ reg.register(check('x', { status: 'pass' }));
30
+ expect(reg.unregister('x')).toBe(true);
31
+ expect(reg.list()).toEqual([]);
32
+ });
33
+ it('clear removes everything', () => {
34
+ const reg = createDoctorRegistry();
35
+ reg.register(check('a', { status: 'pass' }));
36
+ reg.register(check('b', { status: 'fail' }));
37
+ reg.clear();
38
+ expect(reg.list()).toEqual([]);
39
+ });
40
+ });
41
+ describe('runDoctor — aggregation + summary', () => {
42
+ it('aggregates check results into a DoctorReport with the right summary', async () => {
43
+ const reg = createDoctorRegistry();
44
+ reg.register(check('a', { status: 'pass' }));
45
+ reg.register(check('b', { status: 'fail', message: 'broken' }));
46
+ reg.register(check('c', { status: 'inconclusive' }));
47
+ reg.register(check('d', { status: 'warn' }));
48
+ const report = await runDoctor({ registry: reg, version: '0.0.1' });
49
+ expect(report.summary).toEqual({
50
+ pass: 1,
51
+ fail: 1,
52
+ inconclusive: 1,
53
+ warn: 1,
54
+ total: 4,
55
+ });
56
+ expect(report.checks).toHaveLength(4);
57
+ expect(report.version).toBe('0.0.1');
58
+ });
59
+ it('exit = 0 when all pass / no fail', async () => {
60
+ const reg = createDoctorRegistry();
61
+ reg.register(check('a', { status: 'pass' }));
62
+ reg.register(check('b', { status: 'inconclusive' }));
63
+ reg.register(check('c', { status: 'warn' }));
64
+ const report = await runDoctor({ registry: reg });
65
+ expect(report.exit).toBe(0);
66
+ });
67
+ it('exit = 1 when any check fails', async () => {
68
+ const reg = createDoctorRegistry();
69
+ reg.register(check('a', { status: 'pass' }));
70
+ reg.register(check('b', { status: 'fail' }));
71
+ const report = await runDoctor({ registry: reg });
72
+ expect(report.exit).toBe(1);
73
+ });
74
+ it('exit = 2 (no config) when no checks registered', async () => {
75
+ const reg = createDoctorRegistry();
76
+ const report = await runDoctor({ registry: reg });
77
+ expect(report.exit).toBe(2);
78
+ expect(report.summary.total).toBe(0);
79
+ });
80
+ it('inconclusive + warn do not affect exit code', async () => {
81
+ const reg = createDoctorRegistry();
82
+ reg.register(check('a', { status: 'inconclusive' }));
83
+ reg.register(check('b', { status: 'warn' }));
84
+ const report = await runDoctor({ registry: reg });
85
+ expect(report.exit).toBe(0);
86
+ });
87
+ });
88
+ describe('runDoctor — failure isolation', () => {
89
+ it('a throwing check is reported as fail; other checks still run', async () => {
90
+ const reg = createDoctorRegistry();
91
+ reg.register({
92
+ id: 'thrower',
93
+ category: 'custom',
94
+ run: async () => {
95
+ throw new Error('boom');
96
+ },
97
+ });
98
+ reg.register(check('ok', { status: 'pass' }));
99
+ const report = await runDoctor({ registry: reg });
100
+ expect(report.summary.total).toBe(2);
101
+ expect(report.summary.fail).toBe(1);
102
+ expect(report.summary.pass).toBe(1);
103
+ const thrower = report.checks.find((r) => r.id === 'thrower');
104
+ expect(thrower?.status).toBe('fail');
105
+ expect(thrower?.message).toMatch(/boom/);
106
+ });
107
+ it('a slow check that exceeds perCheckTimeoutMs is recorded as inconclusive', async () => {
108
+ const reg = createDoctorRegistry();
109
+ reg.register({
110
+ id: 'slow',
111
+ category: 'custom',
112
+ run: () => new Promise((resolve) => setTimeout(() => resolve({ status: 'pass' }), 200)),
113
+ });
114
+ const report = await runDoctor({ registry: reg, perCheckTimeoutMs: 30 });
115
+ expect(report.summary.total).toBe(1);
116
+ const slow = report.checks[0];
117
+ expect(slow?.status).toBe('inconclusive');
118
+ expect(slow?.message).toMatch(/did not return within 30ms/);
119
+ });
120
+ });
121
+ describe('runDoctor — wall-clock timeout preserves completed records (ses_013 C5 fix)', () => {
122
+ it('fast pass + slow check exceeding wall budget → 1 pass + 1 inconclusive (NOT 2 inconclusive)', async () => {
123
+ const reg = createDoctorRegistry();
124
+ reg.register({
125
+ id: 'fast',
126
+ category: 'custom',
127
+ run: async () => ({ status: 'pass', message: 'instantly done' }),
128
+ });
129
+ reg.register({
130
+ id: 'slow',
131
+ category: 'custom',
132
+ run: () => new Promise((resolve) => setTimeout(() => resolve({ status: 'pass' }), 200)),
133
+ });
134
+ const report = await runDoctor({
135
+ registry: reg,
136
+ wallClockTimeoutMs: 50,
137
+ perCheckTimeoutMs: 1000,
138
+ });
139
+ expect(report.summary.total).toBe(2);
140
+ expect(report.summary.pass).toBe(1);
141
+ expect(report.summary.inconclusive).toBe(1);
142
+ const fast = report.checks.find((r) => r.id === 'fast');
143
+ const slow = report.checks.find((r) => r.id === 'slow');
144
+ expect(fast?.status).toBe('pass');
145
+ expect(fast?.message).toBe('instantly done');
146
+ expect(slow?.status).toBe('inconclusive');
147
+ expect(slow?.message).toMatch(/wall-clock timeout/);
148
+ expect(slow?.message).toMatch(/before this check completed/);
149
+ });
150
+ it('all checks finish before wall-clock budget → all preserved (no overwrite)', async () => {
151
+ const reg = createDoctorRegistry();
152
+ reg.register(check('a', { status: 'pass', message: 'first' }));
153
+ reg.register(check('b', { status: 'fail', message: 'second' }));
154
+ reg.register(check('c', { status: 'warn', message: 'third' }));
155
+ const report = await runDoctor({ registry: reg, wallClockTimeoutMs: 5_000 });
156
+ expect(report.summary.total).toBe(3);
157
+ expect(report.checks.find((r) => r.id === 'a')?.message).toBe('first');
158
+ expect(report.checks.find((r) => r.id === 'b')?.message).toBe('second');
159
+ expect(report.checks.find((r) => r.id === 'c')?.message).toBe('third');
160
+ });
161
+ it('mixed: 2 fast pass + 1 fast fail + 1 slow → preserves 3 + 1 inconclusive on wall timeout', async () => {
162
+ const reg = createDoctorRegistry();
163
+ reg.register(check('a', { status: 'pass' }));
164
+ reg.register(check('b', { status: 'pass' }));
165
+ reg.register(check('c', { status: 'fail', message: 'expected fail' }));
166
+ reg.register({
167
+ id: 'd',
168
+ category: 'custom',
169
+ run: () => new Promise((resolve) => setTimeout(() => resolve({ status: 'pass' }), 300)),
170
+ });
171
+ const report = await runDoctor({
172
+ registry: reg,
173
+ wallClockTimeoutMs: 50,
174
+ perCheckTimeoutMs: 1000,
175
+ });
176
+ expect(report.summary.pass).toBe(2);
177
+ expect(report.summary.fail).toBe(1);
178
+ expect(report.summary.inconclusive).toBe(1);
179
+ expect(report.summary.total).toBe(4);
180
+ // exit code respects: fail > 0 → 1 (not affected by inconclusive)
181
+ expect(report.exit).toBe(1);
182
+ expect(report.checks.find((r) => r.id === 'd')?.status).toBe('inconclusive');
183
+ });
184
+ });
185
+ describe('runDoctor — double-fire defense (ses_013 C4)', () => {
186
+ it('a check whose per-check timeout fires after the check resolved produces exactly one record', async () => {
187
+ // This timing is fragile by nature; the test asserts the contract
188
+ // "exactly one record per id" which holds regardless of which side
189
+ // of the race wins.
190
+ const reg = createDoctorRegistry();
191
+ reg.register({
192
+ id: 'racer',
193
+ category: 'custom',
194
+ run: () => new Promise((resolve) => setTimeout(() => resolve({ status: 'pass' }), 25)),
195
+ });
196
+ const report = await runDoctor({
197
+ registry: reg,
198
+ perCheckTimeoutMs: 25, // intentionally close to the check's 25ms
199
+ wallClockTimeoutMs: 1000,
200
+ });
201
+ expect(report.summary.total).toBe(1);
202
+ expect(report.checks).toHaveLength(1);
203
+ const racer = report.checks[0];
204
+ // Whichever side won, exactly ONE record exists (no duplicate).
205
+ expect(['pass', 'inconclusive']).toContain(racer?.status);
206
+ });
207
+ });
208
+ describe('runDoctor — category filter', () => {
209
+ it('only runs checks matching the requested category', async () => {
210
+ const reg = createDoctorRegistry();
211
+ reg.register(check('a', { status: 'pass' }, 'sandbox'));
212
+ reg.register(check('b', { status: 'pass' }, 'providers'));
213
+ reg.register(check('c', { status: 'pass' }, 'sandbox'));
214
+ const report = await runDoctor({ registry: reg, categories: ['sandbox'] });
215
+ expect(report.summary.total).toBe(2);
216
+ expect(report.checks.every((r) => r.category === 'sandbox')).toBe(true);
217
+ });
218
+ });
219
+ describe('runDoctor — context plumbing', () => {
220
+ it('passes cwd / env / projectRoot to the check', async () => {
221
+ const reg = createDoctorRegistry();
222
+ let observedCwd;
223
+ let observedRoot;
224
+ reg.register({
225
+ id: 'context-probe',
226
+ category: 'custom',
227
+ run: async (ctx) => {
228
+ observedCwd = ctx.cwd;
229
+ observedRoot = ctx.projectRoot;
230
+ return { status: 'pass' };
231
+ },
232
+ });
233
+ await runDoctor({
234
+ registry: reg,
235
+ cwd: '/tmp/fake',
236
+ projectRoot: '/projects/x',
237
+ });
238
+ expect(observedCwd).toBe('/tmp/fake');
239
+ expect(observedRoot).toBe('/projects/x');
240
+ });
241
+ });
242
+ describe('runDoctor — report shape', () => {
243
+ it('produces a frozen report with timestamp', async () => {
244
+ const reg = createDoctorRegistry();
245
+ reg.register(check('a', { status: 'pass' }));
246
+ const report = await runDoctor({ registry: reg });
247
+ expect(Object.isFrozen(report)).toBe(true);
248
+ expect(report.timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T/);
249
+ });
250
+ });
251
+ describe('runDoctor — onCheckStart / onCheckComplete callbacks (ses_013 Phase 1)', () => {
252
+ it('onCheckStart fires before onCheckComplete for the same id', async () => {
253
+ const reg = createDoctorRegistry();
254
+ reg.register(check('a', { status: 'pass' }));
255
+ reg.register(check('b', { status: 'fail', message: 'broken' }));
256
+ const events = [];
257
+ await runDoctor({
258
+ registry: reg,
259
+ onCheckStart: (c) => events.push(`start:${c.id}`),
260
+ onCheckComplete: (r) => events.push(`done:${r.id}`),
261
+ });
262
+ // Independently per id, start must precede done.
263
+ const startA = events.indexOf('start:a');
264
+ const doneA = events.indexOf('done:a');
265
+ const startB = events.indexOf('start:b');
266
+ const doneB = events.indexOf('done:b');
267
+ expect(startA).toBeGreaterThanOrEqual(0);
268
+ expect(doneA).toBeGreaterThan(startA);
269
+ expect(startB).toBeGreaterThanOrEqual(0);
270
+ expect(doneB).toBeGreaterThan(startB);
271
+ });
272
+ it('both callbacks fire exactly once per check, even when per-check timeout races', async () => {
273
+ const reg = createDoctorRegistry();
274
+ reg.register({
275
+ id: 'racer',
276
+ category: 'custom',
277
+ run: () => new Promise((resolve) => setTimeout(() => resolve({ status: 'pass' }), 25)),
278
+ });
279
+ const startCount = {};
280
+ const doneCount = {};
281
+ await runDoctor({
282
+ registry: reg,
283
+ perCheckTimeoutMs: 25,
284
+ onCheckStart: (c) => {
285
+ startCount[c.id] = (startCount[c.id] ?? 0) + 1;
286
+ },
287
+ onCheckComplete: (r) => {
288
+ doneCount[r.id] = (doneCount[r.id] ?? 0) + 1;
289
+ },
290
+ });
291
+ expect(startCount.racer).toBe(1);
292
+ expect(doneCount.racer).toBe(1);
293
+ });
294
+ it('a throwing onCheckStart does NOT affect the DoctorReport (ses_013 C3)', async () => {
295
+ const reg = createDoctorRegistry();
296
+ reg.register(check('a', { status: 'pass', message: 'still here' }));
297
+ reg.register(check('b', { status: 'fail', message: 'still failed' }));
298
+ const report = await runDoctor({
299
+ registry: reg,
300
+ onCheckStart: () => {
301
+ throw new Error('start handler exploded');
302
+ },
303
+ });
304
+ expect(report.summary.total).toBe(2);
305
+ expect(report.summary.pass).toBe(1);
306
+ expect(report.summary.fail).toBe(1);
307
+ expect(report.checks.find((r) => r.id === 'a')?.message).toBe('still here');
308
+ });
309
+ it('a throwing onCheckComplete does NOT affect the DoctorReport (ses_013 C3)', async () => {
310
+ const reg = createDoctorRegistry();
311
+ reg.register(check('a', { status: 'pass' }));
312
+ const report = await runDoctor({
313
+ registry: reg,
314
+ onCheckComplete: () => {
315
+ throw new Error('complete handler exploded');
316
+ },
317
+ });
318
+ expect(report.summary.total).toBe(1);
319
+ expect(report.summary.pass).toBe(1);
320
+ expect(report.exit).toBe(0);
321
+ });
322
+ });
323
+ describe('runDoctor — signal abort (ses_013 Phase 1)', () => {
324
+ it('signal already aborted before run → all checks marked inconclusive immediately', async () => {
325
+ const reg = createDoctorRegistry();
326
+ reg.register(check('a', { status: 'pass' }));
327
+ reg.register(check('b', { status: 'pass' }));
328
+ const controller = new AbortController();
329
+ controller.abort();
330
+ const report = await runDoctor({
331
+ registry: reg,
332
+ signal: controller.signal,
333
+ perCheckTimeoutMs: 5_000,
334
+ wallClockTimeoutMs: 5_000,
335
+ });
336
+ expect(report.summary.total).toBe(2);
337
+ // Either all inconclusive (abort wins the race), OR some completed
338
+ // if the synchronous check resolved before the race. The contract is
339
+ // "no checks should hang indefinitely" — the report should return
340
+ // promptly, not wait 5s.
341
+ expect(report.summary.fail).toBe(0);
342
+ expect(report.checks.every((r) => ['pass', 'inconclusive'].includes(r.status))).toBe(true);
343
+ // Inconclusive records carry the "aborted by signal" message.
344
+ const inconclusiveOnes = report.checks.filter((r) => r.status === 'inconclusive');
345
+ for (const r of inconclusiveOnes) {
346
+ expect(r.message).toMatch(/aborted by signal/);
347
+ }
348
+ });
349
+ it('signal aborted mid-run → completed checks preserved, in-flight marked aborted-inconclusive', async () => {
350
+ const reg = createDoctorRegistry();
351
+ reg.register(check('fast', { status: 'pass', message: 'finished' }));
352
+ reg.register({
353
+ id: 'slow',
354
+ category: 'custom',
355
+ run: () => new Promise((resolve) => setTimeout(() => resolve({ status: 'pass' }), 500)),
356
+ });
357
+ const controller = new AbortController();
358
+ // Abort after the fast check has had time to finish but before the
359
+ // slow check resolves.
360
+ setTimeout(() => controller.abort(), 50);
361
+ const report = await runDoctor({
362
+ registry: reg,
363
+ signal: controller.signal,
364
+ perCheckTimeoutMs: 5_000,
365
+ wallClockTimeoutMs: 5_000,
366
+ });
367
+ expect(report.summary.total).toBe(2);
368
+ const fast = report.checks.find((r) => r.id === 'fast');
369
+ const slow = report.checks.find((r) => r.id === 'slow');
370
+ expect(fast?.status).toBe('pass');
371
+ expect(fast?.message).toBe('finished');
372
+ expect(slow?.status).toBe('inconclusive');
373
+ expect(slow?.message).toMatch(/aborted by signal/);
374
+ });
375
+ });
376
+ //# sourceMappingURL=registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/doctor/registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Sysexits-aligned exit codes for the @namzu/cli binary.
3
+ *
4
+ * Per ses_007 §9 D5 ratification:
5
+ * 0 EXIT_OK — all checks passed (or no failure produced)
6
+ * 1 EXIT_FAIL — one or more checks reported `fail`
7
+ * 2 EXIT_NO_CONFIG — Namzu is not configured in this environment
8
+ * (no checks registered, no config file found)
9
+ * 70 EXIT_INTERNAL_ERROR — sysexits EX_SOFTWARE; internal CLI error
10
+ */
11
+ export declare const EXIT_OK = 0;
12
+ export declare const EXIT_FAIL = 1;
13
+ export declare const EXIT_NO_CONFIG = 2;
14
+ export declare const EXIT_INTERNAL_ERROR = 70;
15
+ export type CliExitCode = typeof EXIT_OK | typeof EXIT_FAIL | typeof EXIT_NO_CONFIG | typeof EXIT_INTERNAL_ERROR;
16
+ //# sourceMappingURL=exit-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../src/exit-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,OAAO,IAAI,CAAA;AACxB,eAAO,MAAM,SAAS,IAAI,CAAA;AAC1B,eAAO,MAAM,cAAc,IAAI,CAAA;AAC/B,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC,MAAM,MAAM,WAAW,GACpB,OAAO,OAAO,GACd,OAAO,SAAS,GAChB,OAAO,cAAc,GACrB,OAAO,mBAAmB,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Sysexits-aligned exit codes for the @namzu/cli binary.
3
+ *
4
+ * Per ses_007 §9 D5 ratification:
5
+ * 0 EXIT_OK — all checks passed (or no failure produced)
6
+ * 1 EXIT_FAIL — one or more checks reported `fail`
7
+ * 2 EXIT_NO_CONFIG — Namzu is not configured in this environment
8
+ * (no checks registered, no config file found)
9
+ * 70 EXIT_INTERNAL_ERROR — sysexits EX_SOFTWARE; internal CLI error
10
+ */
11
+ export const EXIT_OK = 0;
12
+ export const EXIT_FAIL = 1;
13
+ export const EXIT_NO_CONFIG = 2;
14
+ export const EXIT_INTERNAL_ERROR = 70;
15
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../src/exit-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAA;AACxB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAA;AAC1B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAA;AAC/B,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @namzu/cli library entry — for embedded usage where consumers want to
3
+ * invoke runDoctor() in their own process so app-registered checks are
4
+ * visible. The standalone CLI binary lives at ./bin.ts.
5
+ */
6
+ export { createDoctorRegistry, doctor, DoctorRegistry, registerDoctorCheck, runDoctor, } from './doctor/registry.js';
7
+ export type { RunDoctorOptions } from './doctor/registry.js';
8
+ export { builtInDoctorChecks, cwdWritableCheck, providersRegisteredCheck, sandboxPlatformCheck, telemetryInstalledCheck, tmpdirWritableCheck, vaultRegisteredCheck, } from './doctor/checks/index.js';
9
+ export { runDoctorCommand } from './commands/doctor.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACN,oBAAoB,EACpB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,SAAS,GACT,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @namzu/cli library entry — for embedded usage where consumers want to
3
+ * invoke runDoctor() in their own process so app-registered checks are
4
+ * visible. The standalone CLI binary lives at ./bin.ts.
5
+ */
6
+ export { createDoctorRegistry, doctor, DoctorRegistry, registerDoctorCheck, runDoctor, } from './doctor/registry.js';
7
+ export { builtInDoctorChecks, cwdWritableCheck, providersRegisteredCheck, sandboxPlatformCheck, telemetryInstalledCheck, tmpdirWritableCheck, vaultRegisteredCheck, } from './doctor/checks/index.js';
8
+ export { runDoctorCommand } from './commands/doctor.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACN,oBAAoB,EACpB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,SAAS,GACT,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@namzu/cli",
3
+ "version": "0.0.2",
4
+ "description": "Operator CLI for the Namzu agent platform — namzu doctor + future commands. Dual-purpose: standalone bin (`namzu doctor`) and library (`import { runDoctor } from '@namzu/cli'`).",
5
+ "keywords": [
6
+ "namzu",
7
+ "ai",
8
+ "agent",
9
+ "cli",
10
+ "doctor"
11
+ ],
12
+ "license": "MIT",
13
+ "author": "Namzu Contributors",
14
+ "homepage": "https://namzu.ai",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/cogitave/namzu.git",
18
+ "directory": "packages/cli"
19
+ },
20
+ "type": "module",
21
+ "main": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "bin": {
24
+ "namzu": "./dist/bin.js"
25
+ },
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js"
30
+ },
31
+ "./package.json": "./package.json"
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "README.md"
36
+ ],
37
+ "scripts": {
38
+ "build": "tsc --build",
39
+ "dev": "tsc --build --watch",
40
+ "typecheck": "tsc --noEmit",
41
+ "lint": "biome check src/",
42
+ "test": "vitest run"
43
+ },
44
+ "dependencies": {
45
+ "@namzu/sdk": "workspace:^"
46
+ },
47
+ "devDependencies": {
48
+ "@biomejs/biome": "^1.9.4",
49
+ "typescript": "^5.5.0",
50
+ "vitest": "^2.0.0"
51
+ },
52
+ "engines": {
53
+ "node": ">=20.0.0"
54
+ },
55
+ "publishConfig": {
56
+ "access": "public"
57
+ }
58
+ }