skillsd 0.1.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 (59) hide show
  1. package/README.md +484 -0
  2. package/bin/sd.js +3 -0
  3. package/dist/commands/auth.d.ts +3 -0
  4. package/dist/commands/auth.d.ts.map +1 -0
  5. package/dist/commands/auth.js +148 -0
  6. package/dist/commands/auth.js.map +1 -0
  7. package/dist/commands/clone.d.ts +3 -0
  8. package/dist/commands/clone.d.ts.map +1 -0
  9. package/dist/commands/clone.js +86 -0
  10. package/dist/commands/clone.js.map +1 -0
  11. package/dist/commands/collection.d.ts +3 -0
  12. package/dist/commands/collection.d.ts.map +1 -0
  13. package/dist/commands/collection.js +206 -0
  14. package/dist/commands/collection.js.map +1 -0
  15. package/dist/commands/diff.d.ts +3 -0
  16. package/dist/commands/diff.d.ts.map +1 -0
  17. package/dist/commands/diff.js +93 -0
  18. package/dist/commands/diff.js.map +1 -0
  19. package/dist/commands/pr.d.ts +3 -0
  20. package/dist/commands/pr.d.ts.map +1 -0
  21. package/dist/commands/pr.js +230 -0
  22. package/dist/commands/pr.js.map +1 -0
  23. package/dist/commands/pull.d.ts +3 -0
  24. package/dist/commands/pull.d.ts.map +1 -0
  25. package/dist/commands/pull.js +136 -0
  26. package/dist/commands/pull.js.map +1 -0
  27. package/dist/commands/push.d.ts +3 -0
  28. package/dist/commands/push.d.ts.map +1 -0
  29. package/dist/commands/push.js +129 -0
  30. package/dist/commands/push.js.map +1 -0
  31. package/dist/commands/search.d.ts +3 -0
  32. package/dist/commands/search.d.ts.map +1 -0
  33. package/dist/commands/search.js +55 -0
  34. package/dist/commands/search.js.map +1 -0
  35. package/dist/commands/skill.d.ts +3 -0
  36. package/dist/commands/skill.d.ts.map +1 -0
  37. package/dist/commands/skill.js +270 -0
  38. package/dist/commands/skill.js.map +1 -0
  39. package/dist/commands/status.d.ts +8 -0
  40. package/dist/commands/status.d.ts.map +1 -0
  41. package/dist/commands/status.js +115 -0
  42. package/dist/commands/status.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +214 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/lib/api.d.ts +208 -0
  48. package/dist/lib/api.d.ts.map +1 -0
  49. package/dist/lib/api.js +216 -0
  50. package/dist/lib/api.js.map +1 -0
  51. package/dist/lib/auth.d.ts +13 -0
  52. package/dist/lib/auth.d.ts.map +1 -0
  53. package/dist/lib/auth.js +181 -0
  54. package/dist/lib/auth.js.map +1 -0
  55. package/dist/lib/config.d.ts +58 -0
  56. package/dist/lib/config.d.ts.map +1 -0
  57. package/dist/lib/config.js +144 -0
  58. package/dist/lib/config.js.map +1 -0
  59. package/package.json +48 -0
@@ -0,0 +1,230 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import Table from 'cli-table3';
4
+ import ora from 'ora';
5
+ import inquirer from 'inquirer';
6
+ import { api } from '../lib/api.js';
7
+ import { requireAuth } from '../lib/auth.js';
8
+ import { findWorkspaceRoot, getWorkspaceConfig } from '../lib/config.js';
9
+ export const prCommand = new Command('pr')
10
+ .description('Manage pull requests');
11
+ // Helper to get collection ID from args or workspace
12
+ async function getCollectionId(collection) {
13
+ if (collection) {
14
+ const [accountSlug, collectionSlug] = collection.split('/');
15
+ if (!accountSlug || !collectionSlug) {
16
+ console.error(chalk.red('Invalid path. Use format: account/collection'));
17
+ process.exit(1);
18
+ }
19
+ const response = await api.getCollectionBySlug(accountSlug, collectionSlug);
20
+ if (response.error || !response.data) {
21
+ console.error(chalk.red(response.error?.message || 'Collection not found'));
22
+ process.exit(1);
23
+ }
24
+ return { id: response.data.id, path: collection };
25
+ }
26
+ // Use current workspace
27
+ const workspaceRoot = findWorkspaceRoot();
28
+ if (!workspaceRoot) {
29
+ console.error(chalk.red('No collection specified and not in a workspace'));
30
+ process.exit(1);
31
+ }
32
+ const config = getWorkspaceConfig(workspaceRoot);
33
+ if (!config) {
34
+ console.error(chalk.red('Invalid workspace configuration'));
35
+ process.exit(1);
36
+ }
37
+ return {
38
+ id: config.remote.collectionId,
39
+ path: `${config.remote.account}/${config.remote.collection}`,
40
+ };
41
+ }
42
+ // sdojo pr list [collection]
43
+ prCommand
44
+ .command('list [collection]')
45
+ .description('List pull requests')
46
+ .option('-s, --state <state>', 'Filter by state (open, merged, closed)', 'open')
47
+ .option('-p, --page <number>', 'Page number', '1')
48
+ .option('-l, --limit <number>', 'Results per page', '20')
49
+ .option('--json', 'Output as JSON')
50
+ .action(async (collection, options) => {
51
+ requireAuth();
52
+ const { id: collectionId, path: collectionPath } = await getCollectionId(collection);
53
+ const spinner = ora('Fetching pull requests...').start();
54
+ const response = await api.listPullRequests(collectionId, {
55
+ page: parseInt(options.page),
56
+ limit: parseInt(options.limit),
57
+ status: options.state,
58
+ });
59
+ if (response.error || !response.data) {
60
+ spinner.fail('Failed to fetch pull requests');
61
+ console.error(chalk.red(response.error?.message || 'Unknown error'));
62
+ process.exit(1);
63
+ }
64
+ spinner.stop();
65
+ const { items, total, page, totalPages } = response.data;
66
+ if (options.json) {
67
+ console.log(JSON.stringify(response.data, null, 2));
68
+ return;
69
+ }
70
+ console.log(chalk.bold(`${collectionPath} - Pull Requests`));
71
+ console.log();
72
+ if (items.length === 0) {
73
+ console.log(chalk.yellow(`No ${options.state} pull requests`));
74
+ return;
75
+ }
76
+ const table = new Table({
77
+ head: [chalk.cyan('#'), chalk.cyan('TITLE'), chalk.cyan('STATUS'), chalk.cyan('CREATED')],
78
+ style: { head: [], border: [] },
79
+ colWidths: [8, 45, 12, 15],
80
+ wordWrap: true,
81
+ });
82
+ for (const pr of items) {
83
+ const statusColor = pr.status === 'open' ? chalk.green : pr.status === 'merged' ? chalk.magenta : chalk.red;
84
+ table.push([
85
+ `#${pr.number}`,
86
+ pr.title,
87
+ statusColor(pr.status),
88
+ new Date(pr.createdAt).toLocaleDateString(),
89
+ ]);
90
+ }
91
+ console.log(table.toString());
92
+ console.log(chalk.gray(`\nPage ${page} of ${totalPages} (${total} total)`));
93
+ });
94
+ // sdojo pr view <number> [collection]
95
+ prCommand
96
+ .command('view <number> [collection]')
97
+ .description('View pull request details')
98
+ .option('--json', 'Output as JSON')
99
+ .action(async (number, collection, options) => {
100
+ requireAuth();
101
+ const { id: collectionId, path: collectionPath } = await getCollectionId(collection);
102
+ const prNumber = parseInt(number);
103
+ const spinner = ora('Fetching pull request...').start();
104
+ const response = await api.getPullRequest(collectionId, prNumber);
105
+ if (response.error || !response.data) {
106
+ spinner.fail('Pull request not found');
107
+ console.error(chalk.red(response.error?.message || 'Pull request not found'));
108
+ process.exit(1);
109
+ }
110
+ spinner.stop();
111
+ const pr = response.data;
112
+ if (options.json) {
113
+ console.log(JSON.stringify(pr, null, 2));
114
+ return;
115
+ }
116
+ const statusColor = pr.status === 'open' ? chalk.green : pr.status === 'merged' ? chalk.magenta : chalk.red;
117
+ console.log(chalk.bold(`#${pr.number}: ${pr.title}`));
118
+ console.log();
119
+ console.log(`Status: ${statusColor(pr.status)}`);
120
+ console.log(`Branch: ${pr.sourceBranch} → ${pr.targetBranch}`);
121
+ console.log(`Created: ${new Date(pr.createdAt).toLocaleString()}`);
122
+ if (pr.description) {
123
+ console.log();
124
+ console.log(pr.description);
125
+ }
126
+ if (pr.files && pr.files.length > 0) {
127
+ console.log();
128
+ console.log(chalk.bold('Files changed:'));
129
+ for (const file of pr.files) {
130
+ const actionIcon = file.action === 'create' ? chalk.green('+') : file.action === 'delete' ? chalk.red('-') : chalk.yellow('~');
131
+ console.log(` ${actionIcon} ${file.path}`);
132
+ }
133
+ }
134
+ console.log();
135
+ console.log(chalk.gray(`${collectionPath}/pull/${pr.number}`));
136
+ });
137
+ // sdojo pr merge <number> [collection]
138
+ prCommand
139
+ .command('merge <number> [collection]')
140
+ .description('Merge a pull request')
141
+ .option('-f, --force', 'Skip confirmation')
142
+ .option('--allow-deletions', 'Allow skill deletions')
143
+ .action(async (number, collection, options) => {
144
+ requireAuth();
145
+ const { id: collectionId, path: collectionPath } = await getCollectionId(collection);
146
+ const prNumber = parseInt(number);
147
+ // Get PR details first
148
+ const prResponse = await api.getPullRequest(collectionId, prNumber);
149
+ if (prResponse.error || !prResponse.data) {
150
+ console.error(chalk.red(prResponse.error?.message || 'Pull request not found'));
151
+ process.exit(1);
152
+ }
153
+ const pr = prResponse.data;
154
+ if (pr.status !== 'open') {
155
+ console.error(chalk.red(`Cannot merge: PR is ${pr.status}`));
156
+ process.exit(1);
157
+ }
158
+ // Confirm merge
159
+ if (!options.force) {
160
+ console.log(chalk.bold(`#${pr.number}: ${pr.title}`));
161
+ console.log();
162
+ const { confirm } = await inquirer.prompt([
163
+ {
164
+ type: 'confirm',
165
+ name: 'confirm',
166
+ message: 'Merge this pull request?',
167
+ default: true,
168
+ },
169
+ ]);
170
+ if (!confirm) {
171
+ console.log('Cancelled');
172
+ return;
173
+ }
174
+ }
175
+ const spinner = ora('Merging pull request...').start();
176
+ const response = await api.mergePullRequest(collectionId, prNumber, {
177
+ allowDeletions: options.allowDeletions,
178
+ });
179
+ if (response.error) {
180
+ spinner.fail('Failed to merge');
181
+ console.error(chalk.red(response.error.message));
182
+ // Show deleted skills if that's the issue
183
+ const errorData = response.error;
184
+ if (errorData.deletedSkills && errorData.deletedSkills.length > 0) {
185
+ console.log();
186
+ console.log(chalk.yellow('Skills that would be deleted:'));
187
+ for (const skill of errorData.deletedSkills) {
188
+ console.log(` - ${skill}`);
189
+ }
190
+ console.log();
191
+ console.log(chalk.gray('Use --allow-deletions to confirm'));
192
+ }
193
+ process.exit(1);
194
+ }
195
+ spinner.succeed(`Merged PR #${prNumber}`);
196
+ });
197
+ // sdojo pr close <number> [collection]
198
+ prCommand
199
+ .command('close <number> [collection]')
200
+ .description('Close a pull request without merging')
201
+ .option('-f, --force', 'Skip confirmation')
202
+ .action(async (number, collection, options) => {
203
+ requireAuth();
204
+ const { id: collectionId } = await getCollectionId(collection);
205
+ const prNumber = parseInt(number);
206
+ // Confirm close
207
+ if (!options.force) {
208
+ const { confirm } = await inquirer.prompt([
209
+ {
210
+ type: 'confirm',
211
+ name: 'confirm',
212
+ message: `Close PR #${prNumber} without merging?`,
213
+ default: false,
214
+ },
215
+ ]);
216
+ if (!confirm) {
217
+ console.log('Cancelled');
218
+ return;
219
+ }
220
+ }
221
+ const spinner = ora('Closing pull request...').start();
222
+ const response = await api.closePullRequest(collectionId, prNumber);
223
+ if (response.error) {
224
+ spinner.fail('Failed to close');
225
+ console.error(chalk.red(response.error.message));
226
+ process.exit(1);
227
+ }
228
+ spinner.succeed(`Closed PR #${prNumber}`);
229
+ });
230
+ //# sourceMappingURL=pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const pullCommand: Command;
3
+ //# sourceMappingURL=pull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,eAAO,MAAM,WAAW,SAsJpB,CAAC"}
@@ -0,0 +1,136 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import inquirer from 'inquirer';
5
+ import { existsSync, mkdirSync, writeFileSync, unlinkSync, rmSync } from 'fs';
6
+ import { join, dirname } from 'path';
7
+ import { findWorkspaceRoot, getWorkspaceConfig, getWorkspaceIndex, saveWorkspaceIndex, saveWorkspaceConfig, } from '../lib/config.js';
8
+ import { api } from '../lib/api.js';
9
+ import { getWorkspaceChanges } from './status.js';
10
+ export const pullCommand = new Command('pull')
11
+ .description('Pull latest changes from remote')
12
+ .option('-f, --force', 'Overwrite local changes')
13
+ .action(async (options) => {
14
+ const workspaceRoot = findWorkspaceRoot();
15
+ if (!workspaceRoot) {
16
+ console.error(chalk.red('Not in a SkillsDojo workspace'));
17
+ console.error(chalk.gray('Run `sdojo clone <account/collection>` to clone a collection'));
18
+ process.exit(1);
19
+ }
20
+ const config = getWorkspaceConfig(workspaceRoot);
21
+ const index = getWorkspaceIndex(workspaceRoot);
22
+ if (!config || !index) {
23
+ console.error(chalk.red('Invalid workspace configuration'));
24
+ process.exit(1);
25
+ }
26
+ // Check for local changes
27
+ const localChanges = getWorkspaceChanges(workspaceRoot);
28
+ if (localChanges.length > 0 && !options.force) {
29
+ console.log(chalk.yellow('You have local changes:'));
30
+ for (const change of localChanges) {
31
+ console.log(` ${change.status}: ${change.path}`);
32
+ }
33
+ console.log();
34
+ const { confirm } = await inquirer.prompt([
35
+ {
36
+ type: 'confirm',
37
+ name: 'confirm',
38
+ message: 'Do you want to overwrite local changes?',
39
+ default: false,
40
+ },
41
+ ]);
42
+ if (!confirm) {
43
+ console.log('Pull cancelled');
44
+ return;
45
+ }
46
+ }
47
+ const spinner = ora('Fetching latest changes...').start();
48
+ // Get collection files from API
49
+ const response = await api.getCollectionFiles(config.remote.collectionId);
50
+ if (response.error || !response.data) {
51
+ spinner.fail('Failed to fetch files');
52
+ console.error(chalk.red(response.error?.message || 'Unknown error'));
53
+ process.exit(1);
54
+ }
55
+ const { files, commitSha, branch } = response.data;
56
+ // Check if already up to date
57
+ if (commitSha === index.commitSha) {
58
+ spinner.succeed('Already up to date');
59
+ return;
60
+ }
61
+ spinner.text = 'Updating files...';
62
+ // Track current files in workspace
63
+ const remoteFilePaths = new Set(files.map((f) => f.path));
64
+ const localFilePaths = new Set(Object.keys(index.files));
65
+ // Write/update files from remote
66
+ const fileIndex = {};
67
+ const now = new Date().toISOString();
68
+ let added = 0;
69
+ let updated = 0;
70
+ let deleted = 0;
71
+ for (const file of files) {
72
+ const filePath = join(workspaceRoot, file.path);
73
+ const fileDir = dirname(filePath);
74
+ // Create directory if needed
75
+ if (!existsSync(fileDir)) {
76
+ mkdirSync(fileDir, { recursive: true });
77
+ }
78
+ // Check if file is new or updated
79
+ if (!localFilePaths.has(file.path)) {
80
+ added++;
81
+ }
82
+ else if (index.files[file.path]?.sha !== file.sha) {
83
+ updated++;
84
+ }
85
+ // Write file
86
+ writeFileSync(filePath, file.content, 'utf-8');
87
+ // Track in index
88
+ fileIndex[file.path] = {
89
+ sha: file.sha,
90
+ mtime: now,
91
+ };
92
+ }
93
+ // Delete files that no longer exist on remote
94
+ for (const localPath of localFilePaths) {
95
+ if (!remoteFilePaths.has(localPath)) {
96
+ const filePath = join(workspaceRoot, localPath);
97
+ if (existsSync(filePath)) {
98
+ unlinkSync(filePath);
99
+ deleted++;
100
+ // Try to remove empty parent directories
101
+ try {
102
+ const parentDir = dirname(filePath);
103
+ rmSync(parentDir, { recursive: true });
104
+ }
105
+ catch {
106
+ // Directory not empty or other error, ignore
107
+ }
108
+ }
109
+ }
110
+ }
111
+ // Update workspace index
112
+ saveWorkspaceIndex(workspaceRoot, {
113
+ commitSha,
114
+ files: fileIndex,
115
+ });
116
+ // Update workspace config
117
+ saveWorkspaceConfig(workspaceRoot, {
118
+ ...config,
119
+ branch,
120
+ lastSync: now,
121
+ });
122
+ spinner.succeed('Updated to latest');
123
+ // Show summary
124
+ const changes = [];
125
+ if (added > 0)
126
+ changes.push(chalk.green(`${added} added`));
127
+ if (updated > 0)
128
+ changes.push(chalk.yellow(`${updated} updated`));
129
+ if (deleted > 0)
130
+ changes.push(chalk.red(`${deleted} deleted`));
131
+ if (changes.length > 0) {
132
+ console.log(chalk.gray(` ${changes.join(', ')}`));
133
+ }
134
+ console.log(chalk.gray(` Commit: ${index.commitSha.substring(0, 7)} → ${commitSha.substring(0, 7)}`));
135
+ });
136
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const pushCommand: Command;
3
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,WAAW,SAsHpB,CAAC"}
@@ -0,0 +1,129 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import inquirer from 'inquirer';
5
+ import { readFileSync, existsSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { findWorkspaceRoot, getWorkspaceConfig, getWorkspaceIndex, } from '../lib/config.js';
8
+ import { api } from '../lib/api.js';
9
+ import { requireAuth } from '../lib/auth.js';
10
+ import { getWorkspaceChanges } from './status.js';
11
+ export const pushCommand = new Command('push')
12
+ .description('Push local changes and create a pull request')
13
+ .option('-t, --title <title>', 'Pull request title')
14
+ .option('-d, --description <text>', 'Pull request description')
15
+ .option('--draft', 'Create as draft PR')
16
+ .action(async (options) => {
17
+ requireAuth();
18
+ const workspaceRoot = findWorkspaceRoot();
19
+ if (!workspaceRoot) {
20
+ console.error(chalk.red('Not in a SkillsDojo workspace'));
21
+ console.error(chalk.gray('Run `sdojo clone <account/collection>` to clone a collection'));
22
+ process.exit(1);
23
+ }
24
+ const config = getWorkspaceConfig(workspaceRoot);
25
+ const index = getWorkspaceIndex(workspaceRoot);
26
+ if (!config || !index) {
27
+ console.error(chalk.red('Invalid workspace configuration'));
28
+ process.exit(1);
29
+ }
30
+ // Get local changes
31
+ const changes = getWorkspaceChanges(workspaceRoot);
32
+ if (changes.length === 0) {
33
+ console.log(chalk.green('Nothing to push'));
34
+ return;
35
+ }
36
+ // Show changes
37
+ console.log(`Creating pull request for ${chalk.cyan(`${config.remote.account}/${config.remote.collection}`)}...`);
38
+ console.log();
39
+ console.log('Changes to include:');
40
+ for (const change of changes) {
41
+ switch (change.status) {
42
+ case 'modified':
43
+ console.log(` ${chalk.yellow('modified:')} ${change.path}`);
44
+ break;
45
+ case 'new':
46
+ console.log(` ${chalk.green('new file:')} ${change.path}`);
47
+ break;
48
+ case 'deleted':
49
+ console.log(` ${chalk.red('deleted:')} ${change.path}`);
50
+ break;
51
+ }
52
+ }
53
+ console.log();
54
+ // Get PR title and description
55
+ let title = options.title;
56
+ let description = options.description;
57
+ if (!title) {
58
+ const answers = await inquirer.prompt([
59
+ {
60
+ type: 'input',
61
+ name: 'title',
62
+ message: 'PR Title:',
63
+ validate: (input) => input.trim().length > 0 || 'Title is required',
64
+ default: generateDefaultTitle(changes),
65
+ },
66
+ {
67
+ type: 'input',
68
+ name: 'description',
69
+ message: 'Description (optional):',
70
+ },
71
+ ]);
72
+ title = answers.title;
73
+ description = answers.description;
74
+ }
75
+ const spinner = ora('Creating pull request...').start();
76
+ // Build changes array for API
77
+ const apiChanges = changes.map((change) => {
78
+ const result = {
79
+ path: change.path,
80
+ action: change.status === 'new' ? 'create' : change.status === 'modified' ? 'modify' : 'delete',
81
+ };
82
+ // Include content for new and modified files
83
+ if (change.status !== 'deleted') {
84
+ const fullPath = join(workspaceRoot, change.path);
85
+ if (existsSync(fullPath)) {
86
+ result.content = readFileSync(fullPath, 'utf-8');
87
+ }
88
+ }
89
+ return result;
90
+ });
91
+ // Submit changes
92
+ const response = await api.submitChanges(config.remote.collectionId, {
93
+ baseSha: index.commitSha,
94
+ title,
95
+ description: description || undefined,
96
+ changes: apiChanges,
97
+ });
98
+ if (response.error || !response.data) {
99
+ spinner.fail('Failed to create pull request');
100
+ console.error(chalk.red(response.error?.message || 'Unknown error'));
101
+ process.exit(1);
102
+ }
103
+ const pr = response.data.pullRequest;
104
+ spinner.succeed(`Created PR #${pr.number}: ${title}`);
105
+ console.log();
106
+ console.log(chalk.cyan(`${config.remote.url}/${config.remote.account}/${config.remote.collection}/pull/${pr.number}`));
107
+ });
108
+ function generateDefaultTitle(changes) {
109
+ if (changes.length === 1) {
110
+ const change = changes[0];
111
+ const action = change.status === 'new' ? 'Add' : change.status === 'modified' ? 'Update' : 'Remove';
112
+ // Extract skill name from path
113
+ const pathParts = change.path.split('/');
114
+ const skillName = pathParts[0]; // Assumes structure: skill-name/SKILL.md
115
+ return `${action} ${skillName}`;
116
+ }
117
+ const newCount = changes.filter((c) => c.status === 'new').length;
118
+ const modifiedCount = changes.filter((c) => c.status === 'modified').length;
119
+ const deletedCount = changes.filter((c) => c.status === 'deleted').length;
120
+ const parts = [];
121
+ if (newCount > 0)
122
+ parts.push(`add ${newCount} skill${newCount > 1 ? 's' : ''}`);
123
+ if (modifiedCount > 0)
124
+ parts.push(`update ${modifiedCount} skill${modifiedCount > 1 ? 's' : ''}`);
125
+ if (deletedCount > 0)
126
+ parts.push(`remove ${deletedCount} skill${deletedCount > 1 ? 's' : ''}`);
127
+ return parts.join(', ').replace(/^./, (c) => c.toUpperCase());
128
+ }
129
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const searchCommand: Command;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SA2DtB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import Table from 'cli-table3';
4
+ import ora from 'ora';
5
+ import { api } from '../lib/api.js';
6
+ export const searchCommand = new Command('search')
7
+ .description('Search public skills')
8
+ .argument('<query>', 'Search query')
9
+ .option('-p, --page <number>', 'Page number', '1')
10
+ .option('-l, --limit <number>', 'Results per page', '20')
11
+ .option('--json', 'Output as JSON')
12
+ .action(async (query, options) => {
13
+ const spinner = ora(`Searching for "${query}"...`).start();
14
+ const response = await api.searchPublicSkills(query, {
15
+ page: parseInt(options.page),
16
+ limit: parseInt(options.limit),
17
+ });
18
+ if (response.error || !response.data) {
19
+ spinner.fail('Search failed');
20
+ console.error(chalk.red(response.error?.message || 'Unknown error'));
21
+ process.exit(1);
22
+ }
23
+ spinner.stop();
24
+ const { skills, pagination } = response.data;
25
+ const { total, page, totalPages } = pagination;
26
+ if (options.json) {
27
+ console.log(JSON.stringify(response.data, null, 2));
28
+ return;
29
+ }
30
+ console.log(chalk.bold(`Search results for "${query}"`));
31
+ console.log();
32
+ if (skills.length === 0) {
33
+ console.log(chalk.yellow('No skills found'));
34
+ return;
35
+ }
36
+ const table = new Table({
37
+ head: [chalk.cyan('SKILL'), chalk.cyan('DESCRIPTION')],
38
+ style: { head: [], border: [] },
39
+ colWidths: [45, 50],
40
+ wordWrap: true,
41
+ });
42
+ for (const skill of skills) {
43
+ table.push([
44
+ skill.fullPath,
45
+ (skill.description || '').substring(0, 100),
46
+ ]);
47
+ }
48
+ console.log(table.toString());
49
+ console.log(chalk.gray(`\nPage ${page} of ${totalPages} (${total} total)`));
50
+ if (skills.length > 0) {
51
+ console.log();
52
+ console.log(chalk.gray('Clone a skill collection with: sdojo clone <account>/<collection>'));
53
+ }
54
+ });
55
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const skillCommand: Command;
3
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,eAAO,MAAM,YAAY,SACM,CAAC"}