@skillsmith/cli 0.2.7 → 0.3.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 (67) hide show
  1. package/README.md +104 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/commands/author/index.d.ts +16 -0
  4. package/dist/src/commands/author/index.d.ts.map +1 -0
  5. package/dist/src/commands/author/index.js +18 -0
  6. package/dist/src/commands/author/index.js.map +1 -0
  7. package/dist/src/commands/author/init.d.ts +47 -0
  8. package/dist/src/commands/author/init.d.ts.map +1 -0
  9. package/dist/src/commands/author/init.js +346 -0
  10. package/dist/src/commands/author/init.js.map +1 -0
  11. package/dist/src/commands/author/mcp-init.d.ts +20 -0
  12. package/dist/src/commands/author/mcp-init.d.ts.map +1 -0
  13. package/dist/src/commands/author/mcp-init.js +183 -0
  14. package/dist/src/commands/author/mcp-init.js.map +1 -0
  15. package/dist/src/commands/author/subagent.d.ts +22 -0
  16. package/dist/src/commands/author/subagent.d.ts.map +1 -0
  17. package/dist/src/commands/author/subagent.js +166 -0
  18. package/dist/src/commands/author/subagent.js.map +1 -0
  19. package/dist/src/commands/author/transform.d.ts +22 -0
  20. package/dist/src/commands/author/transform.d.ts.map +1 -0
  21. package/dist/src/commands/author/transform.js +141 -0
  22. package/dist/src/commands/author/transform.js.map +1 -0
  23. package/dist/src/commands/author/utils.d.ts +27 -0
  24. package/dist/src/commands/author/utils.d.ts.map +1 -0
  25. package/dist/src/commands/author/utils.js +118 -0
  26. package/dist/src/commands/author/utils.js.map +1 -0
  27. package/dist/src/commands/index.d.ts +2 -1
  28. package/dist/src/commands/index.d.ts.map +1 -1
  29. package/dist/src/commands/index.js +6 -1
  30. package/dist/src/commands/index.js.map +1 -1
  31. package/dist/src/commands/sync.d.ts +21 -0
  32. package/dist/src/commands/sync.d.ts.map +1 -0
  33. package/dist/src/commands/sync.js +373 -0
  34. package/dist/src/commands/sync.js.map +1 -0
  35. package/dist/src/import.d.ts +1 -0
  36. package/dist/src/import.d.ts.map +1 -1
  37. package/dist/src/import.js +20 -5
  38. package/dist/src/import.js.map +1 -1
  39. package/dist/src/index.d.ts +3 -0
  40. package/dist/src/index.d.ts.map +1 -1
  41. package/dist/src/index.js +9 -2
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/utils/formatters.d.ts +39 -0
  44. package/dist/src/utils/formatters.d.ts.map +1 -0
  45. package/dist/src/utils/formatters.js +69 -0
  46. package/dist/src/utils/formatters.js.map +1 -0
  47. package/dist/tests/author.test.js +117 -32
  48. package/dist/tests/author.test.js.map +1 -1
  49. package/dist/tests/e2e/author.e2e.test.js +341 -21
  50. package/dist/tests/e2e/author.e2e.test.js.map +1 -1
  51. package/dist/tests/e2e/utils/index.d.ts +4 -0
  52. package/dist/tests/e2e/utils/index.d.ts.map +1 -1
  53. package/dist/tests/e2e/utils/index.js +4 -0
  54. package/dist/tests/e2e/utils/index.js.map +1 -1
  55. package/dist/tests/e2e/utils/mock-github.d.ts +23 -0
  56. package/dist/tests/e2e/utils/mock-github.d.ts.map +1 -0
  57. package/dist/tests/e2e/utils/mock-github.js +60 -0
  58. package/dist/tests/e2e/utils/mock-github.js.map +1 -0
  59. package/dist/tests/e2e/utils/mock-prompts.d.ts +19 -0
  60. package/dist/tests/e2e/utils/mock-prompts.d.ts.map +1 -0
  61. package/dist/tests/e2e/utils/mock-prompts.js +48 -0
  62. package/dist/tests/e2e/utils/mock-prompts.js.map +1 -0
  63. package/package.json +1 -1
  64. package/dist/src/commands/author.d.ts +0 -76
  65. package/dist/src/commands/author.d.ts.map +0 -1
  66. package/dist/src/commands/author.js +0 -857
  67. package/dist/src/commands/author.js.map +0 -1
@@ -0,0 +1,118 @@
1
+ /**
2
+ * SMI-1487: Shared utilities for author commands
3
+ *
4
+ * Common helper functions used across multiple author subcommands.
5
+ */
6
+ import chalk from 'chalk';
7
+ import { access } from 'fs/promises';
8
+ import { mkdir } from 'fs/promises';
9
+ import { join, resolve } from 'path';
10
+ import { homedir } from 'os';
11
+ /**
12
+ * Pretty print validation errors and warnings
13
+ */
14
+ export function printValidationResult(result, filePath) {
15
+ console.log(chalk.bold(`\nValidation Result for ${filePath}:\n`));
16
+ if (result.valid) {
17
+ console.log(chalk.green.bold(' VALID'));
18
+ }
19
+ else {
20
+ console.log(chalk.red.bold(' INVALID'));
21
+ }
22
+ if (result.errors.length > 0) {
23
+ console.log(chalk.red.bold('\nErrors:'));
24
+ for (const error of result.errors) {
25
+ console.log(chalk.red(` - ${error}`));
26
+ }
27
+ }
28
+ if (result.warnings.length > 0) {
29
+ console.log(chalk.yellow.bold('\nWarnings:'));
30
+ for (const warning of result.warnings) {
31
+ console.log(chalk.yellow(` - ${warning}`));
32
+ }
33
+ }
34
+ console.log();
35
+ }
36
+ /**
37
+ * Check if file exists
38
+ */
39
+ export async function fileExists(path) {
40
+ try {
41
+ await access(path);
42
+ return true;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ /**
49
+ * Ensure ~/.claude/agents directory exists
50
+ */
51
+ export async function ensureAgentsDirectory(customPath) {
52
+ const agentsDir = customPath
53
+ ? resolve(customPath.replace(/^~/, homedir()))
54
+ : join(homedir(), '.claude', 'agents');
55
+ await mkdir(agentsDir, { recursive: true });
56
+ return agentsDir;
57
+ }
58
+ /**
59
+ * SMI-1389: Extract trigger phrases from skill description
60
+ */
61
+ export function extractTriggerPhrases(description) {
62
+ const phrases = [];
63
+ // Pattern: "Use when [phrases]" or "when the user asks to [phrases]"
64
+ const patterns = [
65
+ /use when (?:the user asks to )?["']([^"']+)["']/gi,
66
+ /when (?:the user asks to )?["']([^"']+)["']/gi,
67
+ /trigger(?:ed)? (?:by|when|phrases?)[\s:]+["']([^"']+)["']/gi,
68
+ /invoke when (?:the user )?["']([^"']+)["']/gi,
69
+ ];
70
+ for (const pattern of patterns) {
71
+ const matches = description.matchAll(pattern);
72
+ for (const match of matches) {
73
+ if (match[1]) {
74
+ phrases.push(match[1]);
75
+ }
76
+ }
77
+ }
78
+ return phrases;
79
+ }
80
+ /**
81
+ * SMI-1389: Validate subagent definition structure
82
+ */
83
+ export function validateSubagentDefinition(content) {
84
+ const errors = [];
85
+ const warnings = [];
86
+ // Check for YAML frontmatter
87
+ if (!content.trim().startsWith('---')) {
88
+ errors.push('Missing YAML frontmatter');
89
+ }
90
+ // Extract and validate frontmatter
91
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
92
+ if (frontmatterMatch) {
93
+ const frontmatter = frontmatterMatch[1] || '';
94
+ const requiredFields = ['name', 'description', 'skills', 'tools', 'model'];
95
+ for (const field of requiredFields) {
96
+ if (!frontmatter.includes(`${field}:`)) {
97
+ errors.push(`Missing required field: ${field}`);
98
+ }
99
+ }
100
+ }
101
+ else {
102
+ errors.push('Could not parse YAML frontmatter');
103
+ }
104
+ // Check for operating protocol section
105
+ if (!content.includes('## Operating Protocol')) {
106
+ warnings.push('Missing Operating Protocol section');
107
+ }
108
+ // Check for output format section
109
+ if (!content.includes('## Output Format')) {
110
+ warnings.push('Missing Output Format section');
111
+ }
112
+ return {
113
+ valid: errors.length === 0,
114
+ errors,
115
+ warnings,
116
+ };
117
+ }
118
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/commands/author/utils.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,8 @@
5
5
  */
6
6
  export { createSearchCommand } from './search.js';
7
7
  export { createListCommand, createUpdateCommand, createRemoveCommand } from './manage.js';
8
- export { createInitCommand, createValidateCommand, createPublishCommand, createSubagentCommand, createTransformCommand, createMcpInitCommand, } from './author.js';
8
+ export { createInitCommand, createValidateCommand, createPublishCommand, createSubagentCommand, createTransformCommand, createMcpInitCommand, } from './author/index.js';
9
9
  export { createAnalyzeCommand } from './analyze.js';
10
10
  export { createRecommendCommand } from './recommend.js';
11
+ export { createSyncCommand } from './sync.js';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGzF,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAMzF,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAGvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA"}
@@ -8,9 +8,14 @@ export { createSearchCommand } from './search.js';
8
8
  // SMI-745: Skill Management
9
9
  export { createListCommand, createUpdateCommand, createRemoveCommand } from './manage.js';
10
10
  // SMI-746: Skill Authoring
11
- export { createInitCommand, createValidateCommand, createPublishCommand, createSubagentCommand, createTransformCommand, createMcpInitCommand, } from './author.js';
11
+ // SMI-1389, SMI-1390: Subagent Generation
12
+ // SMI-1433: MCP Server Scaffolding
13
+ // SMI-1487: Refactored into modular structure
14
+ export { createInitCommand, createValidateCommand, createPublishCommand, createSubagentCommand, createTransformCommand, createMcpInitCommand, } from './author/index.js';
12
15
  // SMI-1283: Codebase Analysis
13
16
  export { createAnalyzeCommand } from './analyze.js';
14
17
  // SMI-1299: Recommendations
15
18
  export { createRecommendCommand } from './recommend.js';
19
+ // Registry Sync
20
+ export { createSyncCommand } from './sync.js';
16
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,4BAA4B;AAC5B,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEzF,2BAA2B;AAC3B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAA;AAEpB,8BAA8B;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAEnD,4BAA4B;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,4BAA4B;AAC5B,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEzF,2BAA2B;AAC3B,0CAA0C;AAC1C,mCAAmC;AACnC,8CAA8C;AAC9C,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAE1B,8BAA8B;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAEnD,4BAA4B;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,gBAAgB;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,21 @@
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
+ /**
17
+ * Create sync command with subcommands
18
+ */
19
+ export declare function createSyncCommand(): Command;
20
+ export default createSyncCommand;
21
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAganC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAsB3C;AAED,eAAe,iBAAiB,CAAA"}
@@ -0,0 +1,373 @@
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 { createDatabase, SkillRepository, createApiClient, SyncConfigRepository, SyncHistoryRepository, SyncEngine, } from '@skillsmith/core';
20
+ import { DEFAULT_DB_PATH } from '../config.js';
21
+ import { sanitizeError } from '../utils/sanitize.js';
22
+ import { formatDuration, formatDate, formatTimeUntil } from '../utils/formatters.js';
23
+ /**
24
+ * Run sync operation
25
+ */
26
+ async function runSync(options) {
27
+ const spinner = ora();
28
+ try {
29
+ spinner.start('Opening database...');
30
+ const db = createDatabase(options.dbPath);
31
+ try {
32
+ const skillRepo = new SkillRepository(db);
33
+ const syncConfigRepo = new SyncConfigRepository(db);
34
+ const syncHistoryRepo = new SyncHistoryRepository(db);
35
+ const apiClient = createApiClient();
36
+ const syncEngine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
37
+ spinner.text = options.force ? 'Starting full sync...' : 'Starting differential sync...';
38
+ const result = await syncEngine.sync({
39
+ force: options.force,
40
+ dryRun: options.dryRun,
41
+ onProgress: (progress) => {
42
+ switch (progress.phase) {
43
+ case 'connecting':
44
+ spinner.text = 'Checking API health...';
45
+ break;
46
+ case 'fetching':
47
+ spinner.text = `Fetching skills... (${progress.current} fetched)`;
48
+ break;
49
+ case 'comparing':
50
+ spinner.text = `Comparing ${progress.total} skills with local database...`;
51
+ break;
52
+ case 'upserting':
53
+ spinner.text = `Syncing skill ${progress.current}/${progress.total}...`;
54
+ break;
55
+ case 'complete':
56
+ break;
57
+ }
58
+ },
59
+ });
60
+ if (options.json) {
61
+ spinner.stop();
62
+ console.log(JSON.stringify(result, null, 2));
63
+ return;
64
+ }
65
+ if (result.success) {
66
+ spinner.succeed(options.dryRun
67
+ ? chalk.yellow('Dry run complete (no changes made)')
68
+ : chalk.green('Sync completed successfully'));
69
+ }
70
+ else {
71
+ spinner.warn(chalk.yellow('Sync completed with errors'));
72
+ }
73
+ // Display results
74
+ console.log();
75
+ console.log(chalk.bold('Results:'));
76
+ console.log(` ${chalk.green('+')} Added: ${result.skillsAdded}`);
77
+ console.log(` ${chalk.blue('~')} Updated: ${result.skillsUpdated}`);
78
+ console.log(` ${chalk.dim('=')} Unchanged: ${result.skillsUnchanged}`);
79
+ console.log(` ${chalk.cyan('Σ')} Total: ${result.totalProcessed}`);
80
+ console.log(` ${chalk.dim('⏱')} Duration: ${formatDuration(result.durationMs)}`);
81
+ if (result.errors.length > 0) {
82
+ console.log();
83
+ console.log(chalk.red('Errors:'));
84
+ for (const error of result.errors) {
85
+ console.log(` ${chalk.red('•')} ${error}`);
86
+ }
87
+ }
88
+ if (options.dryRun) {
89
+ console.log();
90
+ console.log(chalk.dim('Run without --dry-run to apply these changes.'));
91
+ }
92
+ }
93
+ finally {
94
+ db.close();
95
+ }
96
+ }
97
+ catch (error) {
98
+ spinner.fail('Sync failed');
99
+ console.error(chalk.red('Error:'), sanitizeError(error));
100
+ process.exit(1);
101
+ }
102
+ }
103
+ /**
104
+ * Show sync status
105
+ */
106
+ async function showStatus(options) {
107
+ try {
108
+ const db = createDatabase(options.dbPath);
109
+ try {
110
+ const syncConfigRepo = new SyncConfigRepository(db);
111
+ const syncHistoryRepo = new SyncHistoryRepository(db);
112
+ const config = syncConfigRepo.getConfig();
113
+ const lastRun = syncHistoryRepo.getLastSuccessful();
114
+ const isRunning = syncHistoryRepo.isRunning();
115
+ const isDue = syncConfigRepo.isSyncDue();
116
+ const stats = syncHistoryRepo.getStats();
117
+ if (options.json) {
118
+ console.log(JSON.stringify({
119
+ config,
120
+ lastRun,
121
+ isRunning,
122
+ isDue,
123
+ stats,
124
+ }, null, 2));
125
+ return;
126
+ }
127
+ console.log(chalk.bold.blue('\n=== Sync Status ===\n'));
128
+ // Configuration
129
+ console.log(chalk.bold('Configuration:'));
130
+ console.log(` Auto-sync: ${config.enabled ? chalk.green('Enabled') : chalk.red('Disabled')}`);
131
+ console.log(` Frequency: ${chalk.cyan(config.frequency)}`);
132
+ console.log();
133
+ // Current state
134
+ console.log(chalk.bold('Current State:'));
135
+ console.log(` Last sync: ${formatDate(config.lastSyncAt)}`);
136
+ console.log(` Next sync: ${formatDate(config.nextSyncAt)}`);
137
+ console.log(` Time until: ${formatTimeUntil(config.nextSyncAt)}`);
138
+ console.log(` Status: ${isRunning ? chalk.yellow('Running') : isDue ? chalk.green('Due') : chalk.dim('Waiting')}`);
139
+ console.log();
140
+ // Last run details
141
+ if (lastRun) {
142
+ console.log(chalk.bold('Last Successful Run:'));
143
+ console.log(` Started: ${formatDate(lastRun.startedAt)}`);
144
+ console.log(` Duration: ${lastRun.durationMs ? formatDuration(lastRun.durationMs) : 'N/A'}`);
145
+ console.log(` Added: ${lastRun.skillsAdded}`);
146
+ console.log(` Updated: ${lastRun.skillsUpdated}`);
147
+ console.log(` Unchanged: ${lastRun.skillsUnchanged}`);
148
+ console.log();
149
+ }
150
+ // Error info
151
+ if (config.lastSyncError) {
152
+ console.log(chalk.bold.red('Last Error:'));
153
+ console.log(` ${config.lastSyncError}`);
154
+ console.log();
155
+ }
156
+ // Statistics
157
+ console.log(chalk.bold('Statistics:'));
158
+ console.log(` Total runs: ${stats.totalRuns}`);
159
+ console.log(` Successful: ${stats.successfulRuns}`);
160
+ console.log(` Failed: ${stats.failedRuns}`);
161
+ console.log(` Avg duration: ${stats.averageDurationMs ? formatDuration(stats.averageDurationMs) : 'N/A'}`);
162
+ }
163
+ finally {
164
+ db.close();
165
+ }
166
+ }
167
+ catch (error) {
168
+ console.error(chalk.red('Error:'), sanitizeError(error));
169
+ process.exit(1);
170
+ }
171
+ }
172
+ /**
173
+ * Show sync history
174
+ */
175
+ async function showHistory(options) {
176
+ try {
177
+ const db = createDatabase(options.dbPath);
178
+ try {
179
+ const syncHistoryRepo = new SyncHistoryRepository(db);
180
+ const history = syncHistoryRepo.getHistory(options.limit);
181
+ if (options.json) {
182
+ console.log(JSON.stringify(history, null, 2));
183
+ return;
184
+ }
185
+ if (history.length === 0) {
186
+ console.log(chalk.dim('\nNo sync history found. Run `skillsmith sync` to start syncing.\n'));
187
+ return;
188
+ }
189
+ console.log(chalk.bold.blue('\n=== Sync History ===\n'));
190
+ const table = new Table({
191
+ head: [
192
+ chalk.bold('Date'),
193
+ chalk.bold('Status'),
194
+ chalk.bold('Added'),
195
+ chalk.bold('Updated'),
196
+ chalk.bold('Duration'),
197
+ ],
198
+ colWidths: [22, 12, 10, 10, 12],
199
+ });
200
+ for (const entry of history) {
201
+ const statusColor = entry.status === 'success'
202
+ ? chalk.green
203
+ : entry.status === 'failed'
204
+ ? chalk.red
205
+ : entry.status === 'partial'
206
+ ? chalk.yellow
207
+ : chalk.blue;
208
+ table.push([
209
+ new Date(entry.startedAt).toLocaleString(),
210
+ statusColor(entry.status),
211
+ String(entry.skillsAdded),
212
+ String(entry.skillsUpdated),
213
+ entry.durationMs ? formatDuration(entry.durationMs) : '-',
214
+ ]);
215
+ }
216
+ console.log(table.toString());
217
+ if (history.some((e) => e.errorMessage)) {
218
+ console.log();
219
+ console.log(chalk.bold.red('Errors:'));
220
+ for (const entry of history.filter((e) => e.errorMessage)) {
221
+ console.log(` ${chalk.dim(new Date(entry.startedAt).toLocaleDateString())}: ${entry.errorMessage}`);
222
+ }
223
+ }
224
+ }
225
+ finally {
226
+ db.close();
227
+ }
228
+ }
229
+ catch (error) {
230
+ console.error(chalk.red('Error:'), sanitizeError(error));
231
+ process.exit(1);
232
+ }
233
+ }
234
+ /**
235
+ * Configure sync settings
236
+ */
237
+ async function configureSync(options) {
238
+ try {
239
+ const db = createDatabase(options.dbPath);
240
+ try {
241
+ const syncConfigRepo = new SyncConfigRepository(db);
242
+ // If just showing config
243
+ if (options.show || (!options.enable && !options.disable && !options.frequency)) {
244
+ const config = syncConfigRepo.getConfig();
245
+ if (options.json) {
246
+ console.log(JSON.stringify(config, null, 2));
247
+ return;
248
+ }
249
+ console.log(chalk.bold.blue('\n=== Sync Configuration ===\n'));
250
+ console.log(` Auto-sync: ${config.enabled ? chalk.green('Enabled') : chalk.red('Disabled')}`);
251
+ console.log(` Frequency: ${chalk.cyan(config.frequency)}`);
252
+ console.log(` Interval: ${formatDuration(config.intervalMs)}`);
253
+ console.log(` Last sync: ${formatDate(config.lastSyncAt)}`);
254
+ console.log(` Next sync: ${formatDate(config.nextSyncAt)}`);
255
+ console.log();
256
+ console.log(chalk.dim('Use --enable/--disable to toggle auto-sync'));
257
+ console.log(chalk.dim('Use --frequency daily|weekly to change schedule'));
258
+ return;
259
+ }
260
+ // Apply changes
261
+ if (options.enable) {
262
+ syncConfigRepo.enable();
263
+ console.log(chalk.green('✓ Auto-sync enabled'));
264
+ }
265
+ if (options.disable) {
266
+ syncConfigRepo.disable();
267
+ console.log(chalk.yellow('✓ Auto-sync disabled'));
268
+ }
269
+ if (options.frequency) {
270
+ const freq = options.frequency.toLowerCase();
271
+ if (freq !== 'daily' && freq !== 'weekly') {
272
+ console.error(chalk.red('Error: Frequency must be "daily" or "weekly"'));
273
+ process.exit(1);
274
+ }
275
+ syncConfigRepo.setFrequency(freq);
276
+ console.log(chalk.green(`✓ Frequency set to ${freq}`));
277
+ }
278
+ // Show updated config
279
+ const config = syncConfigRepo.getConfig();
280
+ console.log();
281
+ console.log(chalk.dim('Current settings:'));
282
+ console.log(` Auto-sync: ${config.enabled ? 'enabled' : 'disabled'}, Frequency: ${config.frequency}`);
283
+ }
284
+ finally {
285
+ db.close();
286
+ }
287
+ }
288
+ catch (error) {
289
+ console.error(chalk.red('Error:'), sanitizeError(error));
290
+ process.exit(1);
291
+ }
292
+ }
293
+ /**
294
+ * Create sync status subcommand
295
+ */
296
+ function createStatusCommand() {
297
+ return new Command('status')
298
+ .description('Show sync status and statistics')
299
+ .option('-d, --db <path>', 'Database file path', DEFAULT_DB_PATH)
300
+ .option('--json', 'Output as JSON')
301
+ .action(async (opts) => {
302
+ await showStatus({
303
+ dbPath: opts['db'],
304
+ json: opts['json'] ?? false,
305
+ });
306
+ });
307
+ }
308
+ /**
309
+ * Create sync history subcommand
310
+ */
311
+ function createHistoryCommand() {
312
+ return new Command('history')
313
+ .description('Show sync history')
314
+ .option('-d, --db <path>', 'Database file path', DEFAULT_DB_PATH)
315
+ .option('-l, --limit <number>', 'Number of entries to show', '10')
316
+ .option('--json', 'Output as JSON')
317
+ .action(async (opts) => {
318
+ await showHistory({
319
+ dbPath: opts['db'],
320
+ limit: parseInt(opts['limit'], 10),
321
+ json: opts['json'] ?? false,
322
+ });
323
+ });
324
+ }
325
+ /**
326
+ * Create sync config subcommand
327
+ */
328
+ function createConfigCommand() {
329
+ return new Command('config')
330
+ .description('Configure automatic sync settings')
331
+ .option('-d, --db <path>', 'Database file path', DEFAULT_DB_PATH)
332
+ .option('--enable', 'Enable automatic background sync')
333
+ .option('--disable', 'Disable automatic background sync')
334
+ .option('--frequency <freq>', 'Set sync frequency (daily|weekly)')
335
+ .option('--show', 'Show current configuration')
336
+ .option('--json', 'Output as JSON')
337
+ .action(async (opts) => {
338
+ await configureSync({
339
+ dbPath: opts['db'],
340
+ enable: opts['enable'],
341
+ disable: opts['disable'],
342
+ frequency: opts['frequency'],
343
+ show: opts['show'],
344
+ json: opts['json'] ?? false,
345
+ });
346
+ });
347
+ }
348
+ /**
349
+ * Create sync command with subcommands
350
+ */
351
+ export function createSyncCommand() {
352
+ const cmd = new Command('sync')
353
+ .description('Synchronize skills from the Skillsmith registry')
354
+ .option('-d, --db <path>', 'Database file path', DEFAULT_DB_PATH)
355
+ .option('-f, --force', 'Force full sync (ignore last sync time)')
356
+ .option('--dry-run', 'Show what would be synced without making changes')
357
+ .option('--json', 'Output results as JSON')
358
+ .action(async (opts) => {
359
+ await runSync({
360
+ dbPath: opts['db'],
361
+ force: opts['force'] ?? false,
362
+ dryRun: opts['dry-run'] ?? false,
363
+ json: opts['json'] ?? false,
364
+ });
365
+ });
366
+ // Add subcommands
367
+ cmd.addCommand(createStatusCommand());
368
+ cmd.addCommand(createHistoryCommand());
369
+ cmd.addCommand(createConfigCommand());
370
+ return cmd;
371
+ }
372
+ export default createSyncCommand;
373
+ //# 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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"}
@@ -20,6 +20,7 @@ interface ImportResult {
20
20
  skipped: number;
21
21
  errors: number;
22
22
  duration: number;
23
+ skillMdFetchFailed: number;
23
24
  }
24
25
  /**
25
26
  * Import skills from GitHub into the database
@@ -1 +1 @@
1
- {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/import.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AA0BH,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAsLD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAyFrF"}
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/import.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AA0BH,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAEhB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAoMD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiGrF"}