@skillsmith/cli 0.2.7 → 0.3.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 (35) hide show
  1. package/README.md +3 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/commands/author.d.ts +16 -2
  4. package/dist/src/commands/author.d.ts.map +1 -1
  5. package/dist/src/commands/author.js +96 -51
  6. package/dist/src/commands/author.js.map +1 -1
  7. package/dist/src/commands/index.d.ts +1 -0
  8. package/dist/src/commands/index.d.ts.map +1 -1
  9. package/dist/src/commands/index.js +4 -0
  10. package/dist/src/commands/index.js.map +1 -1
  11. package/dist/src/commands/sync.d.ts +21 -0
  12. package/dist/src/commands/sync.d.ts.map +1 -0
  13. package/dist/src/commands/sync.js +413 -0
  14. package/dist/src/commands/sync.js.map +1 -0
  15. package/dist/src/index.d.ts +3 -0
  16. package/dist/src/index.d.ts.map +1 -1
  17. package/dist/src/index.js +9 -2
  18. package/dist/src/index.js.map +1 -1
  19. package/dist/tests/author.test.js +85 -0
  20. package/dist/tests/author.test.js.map +1 -1
  21. package/dist/tests/e2e/author.e2e.test.js +341 -21
  22. package/dist/tests/e2e/author.e2e.test.js.map +1 -1
  23. package/dist/tests/e2e/utils/index.d.ts +4 -0
  24. package/dist/tests/e2e/utils/index.d.ts.map +1 -1
  25. package/dist/tests/e2e/utils/index.js +4 -0
  26. package/dist/tests/e2e/utils/index.js.map +1 -1
  27. package/dist/tests/e2e/utils/mock-github.d.ts +23 -0
  28. package/dist/tests/e2e/utils/mock-github.d.ts.map +1 -0
  29. package/dist/tests/e2e/utils/mock-github.js +60 -0
  30. package/dist/tests/e2e/utils/mock-github.js.map +1 -0
  31. package/dist/tests/e2e/utils/mock-prompts.d.ts +19 -0
  32. package/dist/tests/e2e/utils/mock-prompts.d.ts.map +1 -0
  33. package/dist/tests/e2e/utils/mock-prompts.js +48 -0
  34. package/dist/tests/e2e/utils/mock-prompts.js.map +1 -0
  35. package/package.json +1 -1
@@ -0,0 +1,413 @@
1
+ /**
2
+ * Sync Command - Registry synchronization CLI
3
+ *
4
+ * Provides commands for syncing the local skill database with the
5
+ * live Skillsmith registry.
6
+ *
7
+ * Usage:
8
+ * skillsmith sync # Run sync (differential)
9
+ * skillsmith sync --force # Run full sync
10
+ * skillsmith sync --dry-run # Preview what would sync
11
+ * skillsmith sync status # Show sync status
12
+ * skillsmith sync history # Show sync history
13
+ * skillsmith sync config # Configure auto-sync
14
+ */
15
+ import { Command } from 'commander';
16
+ import chalk from 'chalk';
17
+ import ora from 'ora';
18
+ import Table from 'cli-table3';
19
+ import { openDatabase, SkillRepository, createApiClient, SyncConfigRepository, SyncHistoryRepository, SyncEngine, } from '@skillsmith/core';
20
+ import { DEFAULT_DB_PATH } from '../config.js';
21
+ import { sanitizeError } from '../utils/sanitize.js';
22
+ /**
23
+ * Format duration in human-readable form
24
+ */
25
+ function formatDuration(ms) {
26
+ if (ms < 1000)
27
+ return `${ms}ms`;
28
+ if (ms < 60000)
29
+ return `${(ms / 1000).toFixed(1)}s`;
30
+ return `${(ms / 60000).toFixed(1)}m`;
31
+ }
32
+ /**
33
+ * Format date for display
34
+ */
35
+ function formatDate(isoString) {
36
+ if (!isoString)
37
+ return chalk.dim('Never');
38
+ const date = new Date(isoString);
39
+ return date.toLocaleString();
40
+ }
41
+ /**
42
+ * Format time until next sync
43
+ */
44
+ function formatTimeUntil(isoString) {
45
+ if (!isoString)
46
+ return chalk.dim('N/A');
47
+ const target = new Date(isoString);
48
+ const now = new Date();
49
+ const diffMs = target.getTime() - now.getTime();
50
+ if (diffMs <= 0)
51
+ return chalk.yellow('Due now');
52
+ const hours = Math.floor(diffMs / 3600000);
53
+ const minutes = Math.floor((diffMs % 3600000) / 60000);
54
+ if (hours > 24) {
55
+ const days = Math.floor(hours / 24);
56
+ return `${days}d ${hours % 24}h`;
57
+ }
58
+ if (hours > 0) {
59
+ return `${hours}h ${minutes}m`;
60
+ }
61
+ return `${minutes}m`;
62
+ }
63
+ /**
64
+ * Run sync operation
65
+ */
66
+ async function runSync(options) {
67
+ const spinner = ora();
68
+ try {
69
+ spinner.start('Opening database...');
70
+ const db = openDatabase(options.dbPath);
71
+ try {
72
+ const skillRepo = new SkillRepository(db);
73
+ const syncConfigRepo = new SyncConfigRepository(db);
74
+ const syncHistoryRepo = new SyncHistoryRepository(db);
75
+ const apiClient = createApiClient();
76
+ const syncEngine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
77
+ spinner.text = options.force ? 'Starting full sync...' : 'Starting differential sync...';
78
+ const result = await syncEngine.sync({
79
+ force: options.force,
80
+ dryRun: options.dryRun,
81
+ onProgress: (progress) => {
82
+ switch (progress.phase) {
83
+ case 'connecting':
84
+ spinner.text = 'Checking API health...';
85
+ break;
86
+ case 'fetching':
87
+ spinner.text = `Fetching skills... (${progress.current} fetched)`;
88
+ break;
89
+ case 'comparing':
90
+ spinner.text = `Comparing ${progress.total} skills with local database...`;
91
+ break;
92
+ case 'upserting':
93
+ spinner.text = `Syncing skill ${progress.current}/${progress.total}...`;
94
+ break;
95
+ case 'complete':
96
+ break;
97
+ }
98
+ },
99
+ });
100
+ if (options.json) {
101
+ spinner.stop();
102
+ console.log(JSON.stringify(result, null, 2));
103
+ return;
104
+ }
105
+ if (result.success) {
106
+ spinner.succeed(options.dryRun
107
+ ? chalk.yellow('Dry run complete (no changes made)')
108
+ : chalk.green('Sync completed successfully'));
109
+ }
110
+ else {
111
+ spinner.warn(chalk.yellow('Sync completed with errors'));
112
+ }
113
+ // Display results
114
+ console.log();
115
+ console.log(chalk.bold('Results:'));
116
+ console.log(` ${chalk.green('+')} Added: ${result.skillsAdded}`);
117
+ console.log(` ${chalk.blue('~')} Updated: ${result.skillsUpdated}`);
118
+ console.log(` ${chalk.dim('=')} Unchanged: ${result.skillsUnchanged}`);
119
+ console.log(` ${chalk.cyan('Σ')} Total: ${result.totalProcessed}`);
120
+ console.log(` ${chalk.dim('⏱')} Duration: ${formatDuration(result.durationMs)}`);
121
+ if (result.errors.length > 0) {
122
+ console.log();
123
+ console.log(chalk.red('Errors:'));
124
+ for (const error of result.errors) {
125
+ console.log(` ${chalk.red('•')} ${error}`);
126
+ }
127
+ }
128
+ if (options.dryRun) {
129
+ console.log();
130
+ console.log(chalk.dim('Run without --dry-run to apply these changes.'));
131
+ }
132
+ }
133
+ finally {
134
+ db.close();
135
+ }
136
+ }
137
+ catch (error) {
138
+ spinner.fail('Sync failed');
139
+ console.error(chalk.red('Error:'), sanitizeError(error));
140
+ process.exit(1);
141
+ }
142
+ }
143
+ /**
144
+ * Show sync status
145
+ */
146
+ async function showStatus(options) {
147
+ try {
148
+ const db = openDatabase(options.dbPath);
149
+ try {
150
+ const syncConfigRepo = new SyncConfigRepository(db);
151
+ const syncHistoryRepo = new SyncHistoryRepository(db);
152
+ const config = syncConfigRepo.getConfig();
153
+ const lastRun = syncHistoryRepo.getLastSuccessful();
154
+ const isRunning = syncHistoryRepo.isRunning();
155
+ const isDue = syncConfigRepo.isSyncDue();
156
+ const stats = syncHistoryRepo.getStats();
157
+ if (options.json) {
158
+ console.log(JSON.stringify({
159
+ config,
160
+ lastRun,
161
+ isRunning,
162
+ isDue,
163
+ stats,
164
+ }, null, 2));
165
+ return;
166
+ }
167
+ console.log(chalk.bold.blue('\n=== Sync Status ===\n'));
168
+ // Configuration
169
+ console.log(chalk.bold('Configuration:'));
170
+ console.log(` Auto-sync: ${config.enabled ? chalk.green('Enabled') : chalk.red('Disabled')}`);
171
+ console.log(` Frequency: ${chalk.cyan(config.frequency)}`);
172
+ console.log();
173
+ // Current state
174
+ console.log(chalk.bold('Current State:'));
175
+ console.log(` Last sync: ${formatDate(config.lastSyncAt)}`);
176
+ console.log(` Next sync: ${formatDate(config.nextSyncAt)}`);
177
+ console.log(` Time until: ${formatTimeUntil(config.nextSyncAt)}`);
178
+ console.log(` Status: ${isRunning ? chalk.yellow('Running') : isDue ? chalk.green('Due') : chalk.dim('Waiting')}`);
179
+ console.log();
180
+ // Last run details
181
+ if (lastRun) {
182
+ console.log(chalk.bold('Last Successful Run:'));
183
+ console.log(` Started: ${formatDate(lastRun.startedAt)}`);
184
+ console.log(` Duration: ${lastRun.durationMs ? formatDuration(lastRun.durationMs) : 'N/A'}`);
185
+ console.log(` Added: ${lastRun.skillsAdded}`);
186
+ console.log(` Updated: ${lastRun.skillsUpdated}`);
187
+ console.log(` Unchanged: ${lastRun.skillsUnchanged}`);
188
+ console.log();
189
+ }
190
+ // Error info
191
+ if (config.lastSyncError) {
192
+ console.log(chalk.bold.red('Last Error:'));
193
+ console.log(` ${config.lastSyncError}`);
194
+ console.log();
195
+ }
196
+ // Statistics
197
+ console.log(chalk.bold('Statistics:'));
198
+ console.log(` Total runs: ${stats.totalRuns}`);
199
+ console.log(` Successful: ${stats.successfulRuns}`);
200
+ console.log(` Failed: ${stats.failedRuns}`);
201
+ console.log(` Avg duration: ${stats.averageDurationMs ? formatDuration(stats.averageDurationMs) : 'N/A'}`);
202
+ }
203
+ finally {
204
+ db.close();
205
+ }
206
+ }
207
+ catch (error) {
208
+ console.error(chalk.red('Error:'), sanitizeError(error));
209
+ process.exit(1);
210
+ }
211
+ }
212
+ /**
213
+ * Show sync history
214
+ */
215
+ async function showHistory(options) {
216
+ try {
217
+ const db = openDatabase(options.dbPath);
218
+ try {
219
+ const syncHistoryRepo = new SyncHistoryRepository(db);
220
+ const history = syncHistoryRepo.getHistory(options.limit);
221
+ if (options.json) {
222
+ console.log(JSON.stringify(history, null, 2));
223
+ return;
224
+ }
225
+ if (history.length === 0) {
226
+ console.log(chalk.dim('\nNo sync history found. Run `skillsmith sync` to start syncing.\n'));
227
+ return;
228
+ }
229
+ console.log(chalk.bold.blue('\n=== Sync History ===\n'));
230
+ const table = new Table({
231
+ head: [
232
+ chalk.bold('Date'),
233
+ chalk.bold('Status'),
234
+ chalk.bold('Added'),
235
+ chalk.bold('Updated'),
236
+ chalk.bold('Duration'),
237
+ ],
238
+ colWidths: [22, 12, 10, 10, 12],
239
+ });
240
+ for (const entry of history) {
241
+ const statusColor = entry.status === 'success'
242
+ ? chalk.green
243
+ : entry.status === 'failed'
244
+ ? chalk.red
245
+ : entry.status === 'partial'
246
+ ? chalk.yellow
247
+ : chalk.blue;
248
+ table.push([
249
+ new Date(entry.startedAt).toLocaleString(),
250
+ statusColor(entry.status),
251
+ String(entry.skillsAdded),
252
+ String(entry.skillsUpdated),
253
+ entry.durationMs ? formatDuration(entry.durationMs) : '-',
254
+ ]);
255
+ }
256
+ console.log(table.toString());
257
+ if (history.some((e) => e.errorMessage)) {
258
+ console.log();
259
+ console.log(chalk.bold.red('Errors:'));
260
+ for (const entry of history.filter((e) => e.errorMessage)) {
261
+ console.log(` ${chalk.dim(new Date(entry.startedAt).toLocaleDateString())}: ${entry.errorMessage}`);
262
+ }
263
+ }
264
+ }
265
+ finally {
266
+ db.close();
267
+ }
268
+ }
269
+ catch (error) {
270
+ console.error(chalk.red('Error:'), sanitizeError(error));
271
+ process.exit(1);
272
+ }
273
+ }
274
+ /**
275
+ * Configure sync settings
276
+ */
277
+ async function configureSync(options) {
278
+ try {
279
+ const db = openDatabase(options.dbPath);
280
+ try {
281
+ const syncConfigRepo = new SyncConfigRepository(db);
282
+ // If just showing config
283
+ if (options.show || (!options.enable && !options.disable && !options.frequency)) {
284
+ const config = syncConfigRepo.getConfig();
285
+ if (options.json) {
286
+ console.log(JSON.stringify(config, null, 2));
287
+ return;
288
+ }
289
+ console.log(chalk.bold.blue('\n=== Sync Configuration ===\n'));
290
+ console.log(` Auto-sync: ${config.enabled ? chalk.green('Enabled') : chalk.red('Disabled')}`);
291
+ console.log(` Frequency: ${chalk.cyan(config.frequency)}`);
292
+ console.log(` Interval: ${formatDuration(config.intervalMs)}`);
293
+ console.log(` Last sync: ${formatDate(config.lastSyncAt)}`);
294
+ console.log(` Next sync: ${formatDate(config.nextSyncAt)}`);
295
+ console.log();
296
+ console.log(chalk.dim('Use --enable/--disable to toggle auto-sync'));
297
+ console.log(chalk.dim('Use --frequency daily|weekly to change schedule'));
298
+ return;
299
+ }
300
+ // Apply changes
301
+ if (options.enable) {
302
+ syncConfigRepo.enable();
303
+ console.log(chalk.green('✓ Auto-sync enabled'));
304
+ }
305
+ if (options.disable) {
306
+ syncConfigRepo.disable();
307
+ console.log(chalk.yellow('✓ Auto-sync disabled'));
308
+ }
309
+ if (options.frequency) {
310
+ const freq = options.frequency.toLowerCase();
311
+ if (freq !== 'daily' && freq !== 'weekly') {
312
+ console.error(chalk.red('Error: Frequency must be "daily" or "weekly"'));
313
+ process.exit(1);
314
+ }
315
+ syncConfigRepo.setFrequency(freq);
316
+ console.log(chalk.green(`✓ Frequency set to ${freq}`));
317
+ }
318
+ // Show updated config
319
+ const config = syncConfigRepo.getConfig();
320
+ console.log();
321
+ console.log(chalk.dim('Current settings:'));
322
+ console.log(` Auto-sync: ${config.enabled ? 'enabled' : 'disabled'}, Frequency: ${config.frequency}`);
323
+ }
324
+ finally {
325
+ db.close();
326
+ }
327
+ }
328
+ catch (error) {
329
+ console.error(chalk.red('Error:'), sanitizeError(error));
330
+ process.exit(1);
331
+ }
332
+ }
333
+ /**
334
+ * Create sync status subcommand
335
+ */
336
+ function createStatusCommand() {
337
+ return new Command('status')
338
+ .description('Show sync status and statistics')
339
+ .option('-d, --db <path>', 'Database file path', DEFAULT_DB_PATH)
340
+ .option('--json', 'Output as JSON')
341
+ .action(async (opts) => {
342
+ await showStatus({
343
+ dbPath: opts['db'],
344
+ json: opts['json'] ?? false,
345
+ });
346
+ });
347
+ }
348
+ /**
349
+ * Create sync history subcommand
350
+ */
351
+ function createHistoryCommand() {
352
+ return new Command('history')
353
+ .description('Show sync history')
354
+ .option('-d, --db <path>', 'Database file path', DEFAULT_DB_PATH)
355
+ .option('-l, --limit <number>', 'Number of entries to show', '10')
356
+ .option('--json', 'Output as JSON')
357
+ .action(async (opts) => {
358
+ await showHistory({
359
+ dbPath: opts['db'],
360
+ limit: parseInt(opts['limit'], 10),
361
+ json: opts['json'] ?? false,
362
+ });
363
+ });
364
+ }
365
+ /**
366
+ * Create sync config subcommand
367
+ */
368
+ function createConfigCommand() {
369
+ return new Command('config')
370
+ .description('Configure automatic sync settings')
371
+ .option('-d, --db <path>', 'Database file path', DEFAULT_DB_PATH)
372
+ .option('--enable', 'Enable automatic background sync')
373
+ .option('--disable', 'Disable automatic background sync')
374
+ .option('--frequency <freq>', 'Set sync frequency (daily|weekly)')
375
+ .option('--show', 'Show current configuration')
376
+ .option('--json', 'Output as JSON')
377
+ .action(async (opts) => {
378
+ await configureSync({
379
+ dbPath: opts['db'],
380
+ enable: opts['enable'],
381
+ disable: opts['disable'],
382
+ frequency: opts['frequency'],
383
+ show: opts['show'],
384
+ json: opts['json'] ?? false,
385
+ });
386
+ });
387
+ }
388
+ /**
389
+ * Create sync command with subcommands
390
+ */
391
+ export function createSyncCommand() {
392
+ const cmd = new Command('sync')
393
+ .description('Synchronize skills from the Skillsmith registry')
394
+ .option('-d, --db <path>', 'Database file path', DEFAULT_DB_PATH)
395
+ .option('-f, --force', 'Force full sync (ignore last sync time)')
396
+ .option('--dry-run', 'Show what would be synced without making changes')
397
+ .option('--json', 'Output results as JSON')
398
+ .action(async (opts) => {
399
+ await runSync({
400
+ dbPath: opts['db'],
401
+ force: opts['force'] ?? false,
402
+ dryRun: opts['dry-run'] ?? false,
403
+ json: opts['json'] ?? false,
404
+ });
405
+ });
406
+ // Add subcommands
407
+ cmd.addCommand(createStatusCommand());
408
+ cmd.addCommand(createHistoryCommand());
409
+ cmd.addCommand(createConfigCommand());
410
+ return cmd;
411
+ }
412
+ export default createSyncCommand;
413
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,9 @@
12
12
  * - validate: Validate local SKILL.md (SMI-746)
13
13
  * - publish: Prepare skill for sharing (SMI-746)
14
14
  * - analyze: Analyze codebase for skill recommendations (SMI-1283)
15
+ * - author subagent: Generate companion subagent for a skill (SMI-1389)
16
+ * - author transform: Upgrade existing skill with subagent (SMI-1390)
17
+ * - author mcp-init: Scaffold a new MCP server project (SMI-1433)
15
18
  */
16
19
  export {};
17
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG"}
package/dist/src/index.js CHANGED
@@ -12,10 +12,13 @@
12
12
  * - validate: Validate local SKILL.md (SMI-746)
13
13
  * - publish: Prepare skill for sharing (SMI-746)
14
14
  * - analyze: Analyze codebase for skill recommendations (SMI-1283)
15
+ * - author subagent: Generate companion subagent for a skill (SMI-1389)
16
+ * - author transform: Upgrade existing skill with subagent (SMI-1390)
17
+ * - author mcp-init: Scaffold a new MCP server project (SMI-1433)
15
18
  */
16
19
  import { Command } from 'commander';
17
20
  import { importSkills } from './import.js';
18
- import { createSearchCommand, createListCommand, createUpdateCommand, createRemoveCommand, createInitCommand, createValidateCommand, createPublishCommand, createSubagentCommand, createTransformCommand, createMcpInitCommand, createAnalyzeCommand, createRecommendCommand, } from './commands/index.js';
21
+ import { createSearchCommand, createListCommand, createUpdateCommand, createRemoveCommand, createInitCommand, createValidateCommand, createPublishCommand, createSubagentCommand, createTransformCommand, createMcpInitCommand, createAnalyzeCommand, createRecommendCommand, createSyncCommand, } from './commands/index.js';
19
22
  import { DEFAULT_DB_PATH } from './config.js';
20
23
  import { sanitizeError } from './utils/sanitize.js';
21
24
  import { displayStartupHeader } from './utils/license.js';
@@ -68,8 +71,10 @@ program.addCommand(createListCommand());
68
71
  program.addCommand(createUpdateCommand());
69
72
  program.addCommand(createRemoveCommand());
70
73
  // SMI-746: Skill authoring commands (under 'author' group)
74
+ // SMI-1389, SMI-1390: Subagent generation
75
+ // SMI-1433: MCP server scaffolding
71
76
  const authorCommand = new Command('author')
72
- .description('Skill authoring and publishing tools')
77
+ .description('Skill authoring, subagent generation, and MCP server tools')
73
78
  .addCommand(createInitCommand())
74
79
  .addCommand(createValidateCommand())
75
80
  .addCommand(createPublishCommand())
@@ -85,5 +90,7 @@ program.addCommand(createPublishCommand().name('publish'));
85
90
  program.addCommand(createAnalyzeCommand());
86
91
  // SMI-1299: Recommendations
87
92
  program.addCommand(createRecommendCommand());
93
+ // Registry Sync
94
+ program.addCommand(createSyncCommand());
88
95
  program.parse();
89
96
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ vi.mock('fs/promises', () => ({
9
9
  writeFile: vi.fn(),
10
10
  readFile: vi.fn(),
11
11
  stat: vi.fn(),
12
+ access: vi.fn(),
12
13
  }));
13
14
  // Mock inquirer
14
15
  vi.mock('@inquirer/prompts', () => ({
@@ -23,6 +24,7 @@ vi.mock('ora', () => ({
23
24
  stop: vi.fn().mockReturnThis(),
24
25
  succeed: vi.fn().mockReturnThis(),
25
26
  fail: vi.fn().mockReturnThis(),
27
+ warn: vi.fn().mockReturnThis(),
26
28
  text: '',
27
29
  })),
28
30
  }));
@@ -107,6 +109,88 @@ describe('SMI-746: Skill Authoring Commands', () => {
107
109
  const module = await import('../src/commands/author.js');
108
110
  expect(typeof module.publishSkill).toBe('function');
109
111
  });
112
+ it('exports generateSubagent function', async () => {
113
+ const module = await import('../src/commands/author.js');
114
+ expect(typeof module.generateSubagent).toBe('function');
115
+ });
116
+ it('exports transformSkill function', async () => {
117
+ const module = await import('../src/commands/author.js');
118
+ expect(typeof module.transformSkill).toBe('function');
119
+ });
120
+ });
121
+ // SMI-1389: Subagent Command Tests
122
+ describe('createSubagentCommand', () => {
123
+ it('creates a command with correct name', async () => {
124
+ const { createSubagentCommand } = await import('../src/commands/author.js');
125
+ const cmd = createSubagentCommand();
126
+ expect(cmd).toBeInstanceOf(Command);
127
+ expect(cmd.name()).toBe('subagent');
128
+ });
129
+ it('has output option with default', async () => {
130
+ const { createSubagentCommand } = await import('../src/commands/author.js');
131
+ const cmd = createSubagentCommand();
132
+ const outputOpt = cmd.options.find((o) => o.short === '-o');
133
+ expect(outputOpt).toBeDefined();
134
+ expect(outputOpt?.defaultValue).toBe('~/.claude/agents');
135
+ });
136
+ it('has tools option', async () => {
137
+ const { createSubagentCommand } = await import('../src/commands/author.js');
138
+ const cmd = createSubagentCommand();
139
+ const toolsOpt = cmd.options.find((o) => o.long === '--tools');
140
+ expect(toolsOpt).toBeDefined();
141
+ });
142
+ it('has model option with sonnet default', async () => {
143
+ const { createSubagentCommand } = await import('../src/commands/author.js');
144
+ const cmd = createSubagentCommand();
145
+ const modelOpt = cmd.options.find((o) => o.long === '--model');
146
+ expect(modelOpt).toBeDefined();
147
+ expect(modelOpt?.defaultValue).toBe('sonnet');
148
+ });
149
+ it('has skip-claude-md option', async () => {
150
+ const { createSubagentCommand } = await import('../src/commands/author.js');
151
+ const cmd = createSubagentCommand();
152
+ const skipOpt = cmd.options.find((o) => o.long === '--skip-claude-md');
153
+ expect(skipOpt).toBeDefined();
154
+ });
155
+ it('accepts optional path argument with default', async () => {
156
+ const { createSubagentCommand } = await import('../src/commands/author.js');
157
+ const cmd = createSubagentCommand();
158
+ expect(cmd.registeredArguments.length).toBe(1);
159
+ expect(cmd.registeredArguments[0]?.defaultValue).toBe('.');
160
+ });
161
+ });
162
+ // SMI-1390: Transform Command Tests
163
+ describe('createTransformCommand', () => {
164
+ it('creates a command with correct name', async () => {
165
+ const { createTransformCommand } = await import('../src/commands/author.js');
166
+ const cmd = createTransformCommand();
167
+ expect(cmd).toBeInstanceOf(Command);
168
+ expect(cmd.name()).toBe('transform');
169
+ });
170
+ it('has dry-run option', async () => {
171
+ const { createTransformCommand } = await import('../src/commands/author.js');
172
+ const cmd = createTransformCommand();
173
+ const dryRunOpt = cmd.options.find((o) => o.long === '--dry-run');
174
+ expect(dryRunOpt).toBeDefined();
175
+ });
176
+ it('has force option', async () => {
177
+ const { createTransformCommand } = await import('../src/commands/author.js');
178
+ const cmd = createTransformCommand();
179
+ const forceOpt = cmd.options.find((o) => o.long === '--force');
180
+ expect(forceOpt).toBeDefined();
181
+ });
182
+ it('has batch option', async () => {
183
+ const { createTransformCommand } = await import('../src/commands/author.js');
184
+ const cmd = createTransformCommand();
185
+ const batchOpt = cmd.options.find((o) => o.long === '--batch');
186
+ expect(batchOpt).toBeDefined();
187
+ });
188
+ it('accepts optional path argument with default', async () => {
189
+ const { createTransformCommand } = await import('../src/commands/author.js');
190
+ const cmd = createTransformCommand();
191
+ expect(cmd.registeredArguments.length).toBe(1);
192
+ expect(cmd.registeredArguments[0]?.defaultValue).toBe('.');
193
+ });
110
194
  });
111
195
  });
112
196
  describe('SMI-1389: Subagent Command', () => {
@@ -442,6 +526,7 @@ describe('SMI-1433: MCP Server Scaffolding Command', () => {
442
526
  stop: vi.fn().mockReturnThis(),
443
527
  succeed: vi.fn().mockReturnThis(),
444
528
  fail: failMock,
529
+ warn: vi.fn().mockReturnThis(),
445
530
  text: '',
446
531
  });
447
532
  // Directory doesn't exist, but mkdir fails