@skillsmith/cli 0.5.5 → 0.5.7

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.
@@ -0,0 +1,52 @@
1
+ /**
2
+ * SMI-4314: Typed CLI error classes.
3
+ *
4
+ * Library-style command implementations (e.g. `initSkill`) must not call
5
+ * `process.exit` directly. Instead, they throw a typed error carrying the
6
+ * user-facing message and intended exit code. The command-action wrapper
7
+ * catches the typed error, prints the message exactly once, and exits with
8
+ * the requested code. Any other thrown `Error` is treated as an unexpected
9
+ * bug and routed through `sanitizeError` with exit code 1.
10
+ *
11
+ * Keeping the process.exit layer inside the wrapper — rather than inside the
12
+ * library function — prevents the "double-error-print" hazard that
13
+ * `init.helpers.ts` previously had to work around, and lets tests assert on
14
+ * `rejects.toBeInstanceOf(InitSkillError)` instead of monkey-patching
15
+ * `process.exit`.
16
+ */
17
+ /**
18
+ * Error thrown by `initSkill` (and related author-init helpers) when an
19
+ * expected user-facing failure occurs — e.g. invalid skill name, invalid
20
+ * category, or filesystem setup failure.
21
+ *
22
+ * The `message` is intended to be user-facing: it is printed to stderr by
23
+ * the command-action wrapper and already carries any ANSI styling from the
24
+ * call site (e.g. `chalk.red(...)`). Callers should therefore not re-wrap
25
+ * the message with another `chalk.red`/"Error:" prefix.
26
+ *
27
+ * @example
28
+ * throw new InitSkillError(chalk.red(`Invalid skill name: ${name}`))
29
+ *
30
+ * @example
31
+ * try {
32
+ * await initSkill(name, targetPath, opts)
33
+ * } catch (err) {
34
+ * if (err instanceof InitSkillError) {
35
+ * console.error(err.message)
36
+ * process.exit(err.exitCode)
37
+ * }
38
+ * // fall through to generic handling
39
+ * }
40
+ */
41
+ export declare class InitSkillError extends Error {
42
+ /**
43
+ * Process exit code to use when this error reaches the command wrapper.
44
+ * Defaults to 1 (generic failure). Use other codes only when the caller
45
+ * needs to distinguish failure modes in scripted contexts.
46
+ */
47
+ readonly exitCode: number;
48
+ constructor(message: string, exitCode?: number, options?: {
49
+ cause?: unknown;
50
+ });
51
+ }
52
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC;;;;OAIG;IACH,SAAgB,QAAQ,EAAE,MAAM,CAAA;gBAEpB,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAUjF"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * SMI-4314: Typed CLI error classes.
3
+ *
4
+ * Library-style command implementations (e.g. `initSkill`) must not call
5
+ * `process.exit` directly. Instead, they throw a typed error carrying the
6
+ * user-facing message and intended exit code. The command-action wrapper
7
+ * catches the typed error, prints the message exactly once, and exits with
8
+ * the requested code. Any other thrown `Error` is treated as an unexpected
9
+ * bug and routed through `sanitizeError` with exit code 1.
10
+ *
11
+ * Keeping the process.exit layer inside the wrapper — rather than inside the
12
+ * library function — prevents the "double-error-print" hazard that
13
+ * `init.helpers.ts` previously had to work around, and lets tests assert on
14
+ * `rejects.toBeInstanceOf(InitSkillError)` instead of monkey-patching
15
+ * `process.exit`.
16
+ */
17
+ /**
18
+ * Error thrown by `initSkill` (and related author-init helpers) when an
19
+ * expected user-facing failure occurs — e.g. invalid skill name, invalid
20
+ * category, or filesystem setup failure.
21
+ *
22
+ * The `message` is intended to be user-facing: it is printed to stderr by
23
+ * the command-action wrapper and already carries any ANSI styling from the
24
+ * call site (e.g. `chalk.red(...)`). Callers should therefore not re-wrap
25
+ * the message with another `chalk.red`/"Error:" prefix.
26
+ *
27
+ * @example
28
+ * throw new InitSkillError(chalk.red(`Invalid skill name: ${name}`))
29
+ *
30
+ * @example
31
+ * try {
32
+ * await initSkill(name, targetPath, opts)
33
+ * } catch (err) {
34
+ * if (err instanceof InitSkillError) {
35
+ * console.error(err.message)
36
+ * process.exit(err.exitCode)
37
+ * }
38
+ * // fall through to generic handling
39
+ * }
40
+ */
41
+ export class InitSkillError extends Error {
42
+ /**
43
+ * Process exit code to use when this error reaches the command wrapper.
44
+ * Defaults to 1 (generic failure). Use other codes only when the caller
45
+ * needs to distinguish failure modes in scripted contexts.
46
+ */
47
+ exitCode;
48
+ constructor(message, exitCode = 1, options) {
49
+ super(message, options);
50
+ this.name = 'InitSkillError';
51
+ this.exitCode = exitCode;
52
+ // Preserve `instanceof` across the transpiled class boundary. Without
53
+ // this, `err instanceof InitSkillError` can be false in some CJS/ESM
54
+ // interop scenarios.
55
+ Object.setPrototypeOf(this, InitSkillError.prototype);
56
+ }
57
+ }
58
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC;;;;OAIG;IACa,QAAQ,CAAQ;IAEhC,YAAY,OAAe,EAAE,WAAmB,CAAC,EAAE,OAA6B;QAC9E,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAExB,sEAAsE;QACtE,qEAAqE;QACrE,qBAAqB;QACrB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;IACvD,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * SMI-4289: author init error handling tests (closes #602)
3
+ * SMI-4314: initSkill throws InitSkillError instead of process.exit
4
+ *
5
+ * Covers:
6
+ *
7
+ * scaffoldSkillDirectory (library-to-library { ok, error } contract):
8
+ * 1. Happy path (fresh dir, all writes succeed) → { ok: true } + files on disk
9
+ * 2. writeFile fails mid-scaffold with createdFresh=true → rollback deletes skillDir
10
+ * 3. writeFile fails mid-scaffold with createdFresh=false (overwrite) → NO rollback
11
+ *
12
+ * rollbackPartialScaffold:
13
+ * 4. No-op when createdFresh=false (preserves user data)
14
+ * 5. Removes skillDir when createdFresh=true
15
+ * 6. Swallows rollback errors silently
16
+ *
17
+ * initSkill (throws InitSkillError on user-facing failures — SMI-4314):
18
+ * 7. Happy path completes without throwing + all expected files written
19
+ * 8. Invalid skill name → throws InitSkillError with exitCode=1 and message
20
+ * 9. Invalid category → throws InitSkillError with exitCode=1 and message
21
+ * 10. mkdir failure → throws InitSkillError with exitCode=1 and preserves cause
22
+ * 11. Scaffold failure → throws InitSkillError with exitCode=1
23
+ * 12. No double-print: initSkill itself never calls console.error
24
+ *
25
+ * createInitCommand action wrapper (SMI-4314 — maps InitSkillError → exit code):
26
+ * 13. InitSkillError → prints err.message exactly once + exits with err.exitCode
27
+ * 14. Generic Error → routes through sanitizeError + exits with code 1
28
+ */
29
+ export {};
30
+ //# sourceMappingURL=init.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.d.ts","sourceRoot":"","sources":["../../tests/init.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * SMI-4289: author init error handling tests (closes #602)
3
+ * SMI-4314: initSkill throws InitSkillError instead of process.exit
4
+ *
5
+ * Covers:
6
+ *
7
+ * scaffoldSkillDirectory (library-to-library { ok, error } contract):
8
+ * 1. Happy path (fresh dir, all writes succeed) → { ok: true } + files on disk
9
+ * 2. writeFile fails mid-scaffold with createdFresh=true → rollback deletes skillDir
10
+ * 3. writeFile fails mid-scaffold with createdFresh=false (overwrite) → NO rollback
11
+ *
12
+ * rollbackPartialScaffold:
13
+ * 4. No-op when createdFresh=false (preserves user data)
14
+ * 5. Removes skillDir when createdFresh=true
15
+ * 6. Swallows rollback errors silently
16
+ *
17
+ * initSkill (throws InitSkillError on user-facing failures — SMI-4314):
18
+ * 7. Happy path completes without throwing + all expected files written
19
+ * 8. Invalid skill name → throws InitSkillError with exitCode=1 and message
20
+ * 9. Invalid category → throws InitSkillError with exitCode=1 and message
21
+ * 10. mkdir failure → throws InitSkillError with exitCode=1 and preserves cause
22
+ * 11. Scaffold failure → throws InitSkillError with exitCode=1
23
+ * 12. No double-print: initSkill itself never calls console.error
24
+ *
25
+ * createInitCommand action wrapper (SMI-4314 — maps InitSkillError → exit code):
26
+ * 13. InitSkillError → prints err.message exactly once + exits with err.exitCode
27
+ * 14. Generic Error → routes through sanitizeError + exits with code 1
28
+ */
29
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
30
+ import { mkdir, rm, stat, readFile, writeFile } from 'fs/promises';
31
+ import { join } from 'path';
32
+ import { tmpdir } from 'os';
33
+ import { scaffoldSkillDirectory, rollbackPartialScaffold, } from '../src/commands/author/init.helpers.js';
34
+ import { InitSkillError } from '../src/utils/errors.js';
35
+ /**
36
+ * Create a unique tmp directory for each test (race-safe with Date.now + random).
37
+ */
38
+ async function makeTmpDir(prefix) {
39
+ const dir = join(tmpdir(), `smi-4289-${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
40
+ await mkdir(dir, { recursive: true });
41
+ return dir;
42
+ }
43
+ async function exists(path) {
44
+ try {
45
+ await stat(path);
46
+ return true;
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ describe('SMI-4289: scaffoldSkillDirectory', () => {
53
+ let tmpRoot;
54
+ beforeEach(async () => {
55
+ tmpRoot = await makeTmpDir('scaffold');
56
+ });
57
+ afterEach(async () => {
58
+ await rm(tmpRoot, { recursive: true, force: true });
59
+ });
60
+ it('case 1: happy path — fresh dir, all writes succeed → { ok: true } + files on disk', async () => {
61
+ const skillDir = join(tmpRoot, 'happy-skill');
62
+ await mkdir(skillDir, { recursive: true });
63
+ const result = await scaffoldSkillDirectory({
64
+ skillDir,
65
+ skillName: 'happy-skill',
66
+ description: 'A test skill',
67
+ author: 'tester',
68
+ category: 'development',
69
+ createdFresh: true,
70
+ });
71
+ expect(result.ok).toBe(true);
72
+ expect(await exists(join(skillDir, 'SKILL.md'))).toBe(true);
73
+ expect(await exists(join(skillDir, 'README.md'))).toBe(true);
74
+ expect(await exists(join(skillDir, 'scripts', 'example.js'))).toBe(true);
75
+ expect(await exists(join(skillDir, '.gitignore'))).toBe(true);
76
+ expect(await exists(join(skillDir, 'resources'))).toBe(true);
77
+ const skillMd = await readFile(join(skillDir, 'SKILL.md'), 'utf-8');
78
+ expect(skillMd).toContain('happy-skill');
79
+ expect(skillMd).toContain('A test skill');
80
+ });
81
+ it('case 3: writeFile fails mid-scaffold with createdFresh=true → rollback deletes skillDir', async () => {
82
+ const skillDir = join(tmpRoot, 'fresh-fail');
83
+ await mkdir(skillDir, { recursive: true });
84
+ // Create a `SKILL.md` as a directory so writeFile throws EISDIR mid-scaffold.
85
+ await mkdir(join(skillDir, 'SKILL.md'), { recursive: true });
86
+ const result = await scaffoldSkillDirectory({
87
+ skillDir,
88
+ skillName: 'fresh-fail',
89
+ description: 'x',
90
+ author: 'x',
91
+ category: 'development',
92
+ createdFresh: true,
93
+ });
94
+ expect(result.ok).toBe(false);
95
+ if (!result.ok) {
96
+ expect(typeof result.error).toBe('string');
97
+ expect(result.error.length).toBeGreaterThan(0);
98
+ }
99
+ // rollback removed the whole skillDir
100
+ expect(await exists(skillDir)).toBe(false);
101
+ });
102
+ it('case 4: writeFile fails mid-scaffold with createdFresh=false → NO rollback; directory preserved', async () => {
103
+ const skillDir = join(tmpRoot, 'overwrite-fail');
104
+ await mkdir(skillDir, { recursive: true });
105
+ // Pre-existing user file that must be preserved on failure
106
+ const userFile = join(skillDir, 'user-data.txt');
107
+ await writeFile(userFile, 'IMPORTANT USER DATA', 'utf-8');
108
+ // Trip writeFile(SKILL.md) by making it a non-empty directory
109
+ await mkdir(join(skillDir, 'SKILL.md'), { recursive: true });
110
+ const result = await scaffoldSkillDirectory({
111
+ skillDir,
112
+ skillName: 'overwrite-fail',
113
+ description: 'x',
114
+ author: 'x',
115
+ category: 'development',
116
+ createdFresh: false,
117
+ });
118
+ expect(result.ok).toBe(false);
119
+ // CRITICAL: user data + skillDir still present
120
+ expect(await exists(skillDir)).toBe(true);
121
+ expect(await exists(userFile)).toBe(true);
122
+ const content = await readFile(userFile, 'utf-8');
123
+ expect(content).toBe('IMPORTANT USER DATA');
124
+ });
125
+ });
126
+ describe('SMI-4289: rollbackPartialScaffold', () => {
127
+ let tmpRoot;
128
+ beforeEach(async () => {
129
+ tmpRoot = await makeTmpDir('rollback');
130
+ });
131
+ afterEach(async () => {
132
+ await rm(tmpRoot, { recursive: true, force: true });
133
+ });
134
+ it('no-ops when createdFresh=false (overwrite path preserves user data)', async () => {
135
+ const skillDir = join(tmpRoot, 'preserved');
136
+ await mkdir(skillDir, { recursive: true });
137
+ await writeFile(join(skillDir, 'keep.txt'), 'user wrote this', 'utf-8');
138
+ await rollbackPartialScaffold(skillDir, false);
139
+ expect(await exists(skillDir)).toBe(true);
140
+ expect(await exists(join(skillDir, 'keep.txt'))).toBe(true);
141
+ });
142
+ it('removes skillDir when createdFresh=true', async () => {
143
+ const skillDir = join(tmpRoot, 'to-remove');
144
+ await mkdir(skillDir, { recursive: true });
145
+ await writeFile(join(skillDir, 'partial.txt'), 'scaffold output', 'utf-8');
146
+ await rollbackPartialScaffold(skillDir, true);
147
+ expect(await exists(skillDir)).toBe(false);
148
+ });
149
+ it('swallows rollback errors silently (best-effort cleanup)', async () => {
150
+ // Passing a nonexistent path with force:true does not throw (node rm semantics).
151
+ // Even so, confirm the function itself never rejects on unusual inputs.
152
+ const ghost = join(tmpRoot, 'does-not-exist');
153
+ await expect(rollbackPartialScaffold(ghost, true)).resolves.toBeUndefined();
154
+ });
155
+ });
156
+ describe('SMI-4314: initSkill throws InitSkillError on expected failures', () => {
157
+ const logSpy = vi.fn();
158
+ const errorSpy = vi.fn();
159
+ let originalLog;
160
+ let originalError;
161
+ let tmpRoot;
162
+ beforeEach(async () => {
163
+ logSpy.mockReset();
164
+ errorSpy.mockReset();
165
+ originalLog = console.log;
166
+ originalError = console.error;
167
+ console.log = logSpy;
168
+ console.error = errorSpy;
169
+ tmpRoot = await makeTmpDir('init');
170
+ });
171
+ afterEach(async () => {
172
+ console.log = originalLog;
173
+ console.error = originalError;
174
+ await rm(tmpRoot, { recursive: true, force: true });
175
+ });
176
+ it('happy path: initSkill completes without throwing when inputs are valid', async () => {
177
+ const { initSkill } = await import('../src/commands/author/init.js');
178
+ await expect(initSkill('happy-init-skill', tmpRoot, {
179
+ description: 'happy',
180
+ author: 'tester',
181
+ category: 'development',
182
+ yes: true,
183
+ })).resolves.toBeUndefined();
184
+ const skillDir = join(tmpRoot, 'happy-init-skill');
185
+ expect(await exists(join(skillDir, 'SKILL.md'))).toBe(true);
186
+ expect(await exists(join(skillDir, 'README.md'))).toBe(true);
187
+ });
188
+ it('invalid skill name → throws InitSkillError with exitCode=1 and informative message', async () => {
189
+ const { initSkill } = await import('../src/commands/author/init.js');
190
+ const promise = initSkill('Invalid Name With Spaces!', tmpRoot, {
191
+ description: 'x',
192
+ author: 'x',
193
+ category: 'development',
194
+ yes: true,
195
+ });
196
+ await expect(promise).rejects.toBeInstanceOf(InitSkillError);
197
+ await expect(promise).rejects.toMatchObject({
198
+ exitCode: 1,
199
+ name: 'InitSkillError',
200
+ });
201
+ await expect(promise).rejects.toThrow(/Invalid skill name/);
202
+ // initSkill itself must not print anything on the error path —
203
+ // the wrapper is the single source of user-facing output.
204
+ expect(errorSpy).not.toHaveBeenCalled();
205
+ });
206
+ it('invalid category → throws InitSkillError with exitCode=1 and informative message', async () => {
207
+ const { initSkill } = await import('../src/commands/author/init.js');
208
+ const promise = initSkill('good-name', tmpRoot, {
209
+ description: 'x',
210
+ author: 'x',
211
+ category: 'not-a-real-category',
212
+ yes: true,
213
+ });
214
+ await expect(promise).rejects.toBeInstanceOf(InitSkillError);
215
+ await expect(promise).rejects.toMatchObject({ exitCode: 1 });
216
+ await expect(promise).rejects.toThrow(/Invalid category/);
217
+ expect(errorSpy).not.toHaveBeenCalled();
218
+ });
219
+ it('mkdir failure → throws InitSkillError with exitCode=1 and preserves cause', async () => {
220
+ const { initSkill } = await import('../src/commands/author/init.js');
221
+ // Making the *parent* a regular file forces mkdir({ recursive: true })
222
+ // to reject with ENOTDIR on all POSIX platforms, including root-run CI.
223
+ // This is more portable than chmod 000 which root ignores.
224
+ const parentFile = join(tmpRoot, 'not-a-directory');
225
+ await writeFile(parentFile, 'x', 'utf-8');
226
+ const promise = initSkill('blocked-skill', parentFile, {
227
+ description: 'x',
228
+ author: 'x',
229
+ category: 'development',
230
+ yes: true,
231
+ });
232
+ await expect(promise).rejects.toBeInstanceOf(InitSkillError);
233
+ await expect(promise).rejects.toMatchObject({ exitCode: 1 });
234
+ await expect(promise).rejects.toThrow(/Failed to create skill/);
235
+ // The underlying fs error must be preserved as `cause` so operators can
236
+ // inspect the real reason (ENOTDIR / EACCES / ENOSPC).
237
+ let caught;
238
+ try {
239
+ await promise;
240
+ }
241
+ catch (e) {
242
+ caught = e;
243
+ }
244
+ expect(caught).toBeInstanceOf(InitSkillError);
245
+ expect(caught.cause).toBeDefined();
246
+ // No partial directory left behind.
247
+ expect(await exists(join(parentFile, 'blocked-skill'))).toBe(false);
248
+ // Double-print guard: initSkill itself does not print to stderr.
249
+ expect(errorSpy).not.toHaveBeenCalled();
250
+ });
251
+ it('scaffold failure → throws InitSkillError with exitCode=1 (no double-print)', async () => {
252
+ const { initSkill } = await import('../src/commands/author/init.js');
253
+ // Create the target directory, then create SKILL.md as a directory so
254
+ // the mkdir at init.ts succeeds (skillDir exists), and writeFile fails
255
+ // mid-scaffold inside the helper. With createdFresh=false (pre-existing
256
+ // directory that we confirmed via --yes), rollback is a no-op and the
257
+ // helper returns { ok: false, error }.
258
+ const skillDirName = 'collision-skill';
259
+ const skillDir = join(tmpRoot, skillDirName);
260
+ await mkdir(skillDir, { recursive: true });
261
+ await mkdir(join(skillDir, 'SKILL.md'), { recursive: true });
262
+ const promise = initSkill(skillDirName, tmpRoot, {
263
+ description: 'x',
264
+ author: 'x',
265
+ category: 'development',
266
+ yes: true,
267
+ });
268
+ await expect(promise).rejects.toBeInstanceOf(InitSkillError);
269
+ await expect(promise).rejects.toMatchObject({ exitCode: 1 });
270
+ await expect(promise).rejects.toThrow(/Failed to create skill/);
271
+ // Double-print guard: initSkill must not call console.error — the
272
+ // wrapper is the single source of user-facing output.
273
+ expect(errorSpy).not.toHaveBeenCalled();
274
+ });
275
+ });
276
+ describe('SMI-4314: createInitCommand wrapper maps errors to exit codes', () => {
277
+ const logSpy = vi.fn();
278
+ const errorSpy = vi.fn();
279
+ const exitSpy = vi.fn();
280
+ let originalLog;
281
+ let originalError;
282
+ let originalExit;
283
+ let tmpRoot;
284
+ beforeEach(async () => {
285
+ logSpy.mockReset();
286
+ errorSpy.mockReset();
287
+ exitSpy.mockReset?.();
288
+ originalLog = console.log;
289
+ originalError = console.error;
290
+ originalExit = process.exit;
291
+ console.log = logSpy;
292
+ console.error = errorSpy;
293
+ // Replace process.exit so we can observe the code without killing the
294
+ // test worker. Throw a marker so the CLI code path halts like a real exit.
295
+ process.exit = ((code) => {
296
+ ;
297
+ exitSpy(code);
298
+ throw new Error(`__EXIT__:${code ?? 0}`);
299
+ });
300
+ tmpRoot = await makeTmpDir('wrapper');
301
+ });
302
+ afterEach(async () => {
303
+ console.log = originalLog;
304
+ console.error = originalError;
305
+ process.exit = originalExit;
306
+ await rm(tmpRoot, { recursive: true, force: true });
307
+ });
308
+ it('InitSkillError → prints err.message exactly once and exits with err.exitCode', async () => {
309
+ const { createInitCommand } = await import('../src/commands/author/init.js');
310
+ const cmd = createInitCommand();
311
+ // commander treats process.exit inside .action as a real exit; our stub
312
+ // throws a marker so parseAsync rejects.
313
+ await expect(cmd.parseAsync([
314
+ 'node',
315
+ 'skillsmith',
316
+ 'Invalid Name With Spaces!',
317
+ '--path',
318
+ tmpRoot,
319
+ '--description',
320
+ 'x',
321
+ '--author',
322
+ 'x',
323
+ '--category',
324
+ 'development',
325
+ '--yes',
326
+ ], { from: 'node' })).rejects.toThrow('__EXIT__:1');
327
+ // Wrapper routed through the InitSkillError branch: exactly one
328
+ // console.error call, and the message carries the invalid-name text.
329
+ expect(exitSpy).toHaveBeenCalledWith(1);
330
+ expect(errorSpy).toHaveBeenCalledTimes(1);
331
+ const printed = errorSpy.mock.calls[0]?.join(' ') ?? '';
332
+ expect(printed).toContain('Invalid skill name');
333
+ // Wrapper's generic-branch prefix "Error initializing skill:" must NOT
334
+ // appear — the InitSkillError message is printed verbatim.
335
+ expect(printed).not.toContain('Error initializing skill:');
336
+ });
337
+ it('InitSkillError with custom exitCode → exits with that code', () => {
338
+ // Direct unit test of the wrapper contract via a synthetic error.
339
+ const err = new InitSkillError('synthetic failure', 42);
340
+ expect(err).toBeInstanceOf(InitSkillError);
341
+ expect(err).toBeInstanceOf(Error);
342
+ expect(err.exitCode).toBe(42);
343
+ expect(err.name).toBe('InitSkillError');
344
+ expect(err.message).toBe('synthetic failure');
345
+ });
346
+ it('InitSkillError preserves optional cause for downstream inspection', () => {
347
+ const rootCause = new Error('ENOTDIR: not a directory');
348
+ const err = new InitSkillError('Failed to create skill', 1, { cause: rootCause });
349
+ expect(err.cause).toBe(rootCause);
350
+ });
351
+ it('defaults to exitCode=1 when caller omits it', () => {
352
+ const err = new InitSkillError('oops');
353
+ expect(err.exitCode).toBe(1);
354
+ });
355
+ });
356
+ //# sourceMappingURL=init.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../tests/init.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skillsmith/cli",
3
- "version": "0.5.5",
3
+ "version": "0.5.7",
4
4
  "description": "CLI tools for Skillsmith skill discovery and authentication",
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "@inquirer/prompts": "7.10.1",
20
- "@skillsmith/core": "^0.5.2",
20
+ "@skillsmith/core": "^0.5.4",
21
21
  "chalk": "5.6.2",
22
22
  "cli-table3": "0.6.5",
23
23
  "commander": "14.0.3",