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,86 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { existsSync, mkdirSync, writeFileSync } from 'fs';
5
+ import { join, dirname } from 'path';
6
+ import { api } from '../lib/api.js';
7
+ import { saveWorkspaceConfig, saveWorkspaceIndex, getApiUrl } from '../lib/config.js';
8
+ export const cloneCommand = new Command('clone')
9
+ .description('Clone a skill collection to local workspace')
10
+ .argument('<path>', 'Collection path (account/collection)')
11
+ .argument('[directory]', 'Target directory (default: collection name)')
12
+ .action(async (path, directory) => {
13
+ const [accountSlug, collectionSlug] = path.split('/');
14
+ if (!accountSlug || !collectionSlug) {
15
+ console.error(chalk.red('Invalid path. Use format: account/collection'));
16
+ process.exit(1);
17
+ }
18
+ const targetDir = directory || collectionSlug;
19
+ // Check if directory exists
20
+ if (existsSync(targetDir)) {
21
+ console.error(chalk.red(`Directory '${targetDir}' already exists`));
22
+ process.exit(1);
23
+ }
24
+ const spinner = ora(`Cloning ${chalk.cyan(path)}...`).start();
25
+ // Get collection by slug
26
+ const collectionResponse = await api.getCollectionBySlug(accountSlug, collectionSlug);
27
+ if (collectionResponse.error || !collectionResponse.data) {
28
+ spinner.fail('Collection not found');
29
+ console.error(chalk.red(collectionResponse.error?.message || 'Collection not found'));
30
+ process.exit(1);
31
+ }
32
+ const collection = collectionResponse.data;
33
+ // Get collection files
34
+ spinner.text = 'Fetching files...';
35
+ const filesResponse = await api.getCollectionFiles(collection.id);
36
+ if (filesResponse.error || !filesResponse.data) {
37
+ spinner.fail('Failed to fetch files');
38
+ console.error(chalk.red(filesResponse.error?.message || 'Failed to fetch files'));
39
+ process.exit(1);
40
+ }
41
+ const { files, commitSha, branch } = filesResponse.data;
42
+ // Create directory structure
43
+ spinner.text = 'Writing files...';
44
+ mkdirSync(targetDir, { recursive: true });
45
+ // Write each file
46
+ const fileIndex = {};
47
+ const now = new Date().toISOString();
48
+ for (const file of files) {
49
+ const filePath = join(targetDir, file.path);
50
+ const fileDir = dirname(filePath);
51
+ // Create directory if needed
52
+ if (!existsSync(fileDir)) {
53
+ mkdirSync(fileDir, { recursive: true });
54
+ }
55
+ // Write file
56
+ writeFileSync(filePath, file.content, 'utf-8');
57
+ // Track in index
58
+ fileIndex[file.path] = {
59
+ sha: file.sha,
60
+ mtime: now,
61
+ };
62
+ }
63
+ // Save workspace config
64
+ saveWorkspaceConfig(targetDir, {
65
+ remote: {
66
+ url: getApiUrl(),
67
+ account: accountSlug,
68
+ collection: collectionSlug,
69
+ collectionId: collection.id,
70
+ },
71
+ branch,
72
+ lastSync: now,
73
+ });
74
+ // Save file index
75
+ saveWorkspaceIndex(targetDir, {
76
+ commitSha,
77
+ files: fileIndex,
78
+ });
79
+ spinner.succeed(`Cloned ${chalk.green(path)} into ${chalk.cyan(targetDir)}`);
80
+ console.log(chalk.gray(`\n ${files.length} files`));
81
+ console.log(chalk.gray(` Branch: ${branch}`));
82
+ console.log(chalk.gray(` Commit: ${commitSha.substring(0, 7)}`));
83
+ console.log();
84
+ console.log(`cd ${targetDir}`);
85
+ });
86
+ //# sourceMappingURL=clone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone.js","sourceRoot":"","sources":["../../src/commands/clone.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const collectionCommand: Command;
3
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/commands/collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,iBAAiB,SACY,CAAC"}
@@ -0,0 +1,206 @@
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
+ export const collectionCommand = new Command('collection')
9
+ .description('Manage skill collections');
10
+ // sdojo collection list
11
+ collectionCommand
12
+ .command('list')
13
+ .description('List your collections')
14
+ .option('-p, --page <number>', 'Page number', '1')
15
+ .option('-l, --limit <number>', 'Results per page', '20')
16
+ .option('-v, --visibility <type>', 'Filter by visibility (public, private, unlisted)')
17
+ .option('--json', 'Output as JSON')
18
+ .action(async (options) => {
19
+ requireAuth();
20
+ const spinner = ora('Fetching collections...').start();
21
+ const response = await api.listCollections({
22
+ page: parseInt(options.page),
23
+ limit: parseInt(options.limit),
24
+ visibility: options.visibility,
25
+ });
26
+ if (response.error || !response.data) {
27
+ spinner.fail('Failed to fetch collections');
28
+ console.error(chalk.red(response.error?.message || 'Unknown error'));
29
+ process.exit(1);
30
+ }
31
+ spinner.stop();
32
+ const { items, total, page, totalPages } = response.data;
33
+ if (options.json) {
34
+ console.log(JSON.stringify(response.data, null, 2));
35
+ return;
36
+ }
37
+ if (items.length === 0) {
38
+ console.log(chalk.yellow('No collections found'));
39
+ console.log(chalk.gray('Run `sdojo collection create <name>` to create one'));
40
+ return;
41
+ }
42
+ const table = new Table({
43
+ head: [
44
+ chalk.cyan('NAME'),
45
+ chalk.cyan('VISIBILITY'),
46
+ chalk.cyan('SKILLS'),
47
+ chalk.cyan('STARS'),
48
+ chalk.cyan('FORKS'),
49
+ ],
50
+ style: { head: [], border: [] },
51
+ });
52
+ for (const collection of items) {
53
+ const accountSlug = collection.account?.slug || 'unknown';
54
+ table.push([
55
+ `${accountSlug}/${collection.slug}`,
56
+ collection.visibility,
57
+ collection.skillCount.toString(),
58
+ collection.starCount.toString(),
59
+ collection.forkCount.toString(),
60
+ ]);
61
+ }
62
+ console.log(table.toString());
63
+ console.log(chalk.gray(`\nPage ${page} of ${totalPages} (${total} total)`));
64
+ });
65
+ // sdojo collection create <name>
66
+ collectionCommand
67
+ .command('create <name>')
68
+ .description('Create a new collection')
69
+ .option('-d, --description <text>', 'Collection description')
70
+ .option('-v, --visibility <type>', 'Visibility (public, private, unlisted)', 'private')
71
+ .option('-s, --slug <slug>', 'Custom slug (default: derived from name)')
72
+ .action(async (name, options) => {
73
+ requireAuth();
74
+ const spinner = ora('Creating collection...').start();
75
+ const response = await api.createCollection({
76
+ name,
77
+ slug: options.slug,
78
+ description: options.description,
79
+ visibility: options.visibility,
80
+ });
81
+ if (response.error || !response.data) {
82
+ spinner.fail('Failed to create collection');
83
+ console.error(chalk.red(response.error?.message || 'Unknown error'));
84
+ process.exit(1);
85
+ }
86
+ const collection = response.data;
87
+ spinner.succeed(`Created collection ${chalk.green(collection.slug)}`);
88
+ console.log(chalk.gray(`\nClone with: sdojo clone ${collection.account?.slug || 'you'}/${collection.slug}`));
89
+ });
90
+ // sdojo collection fork <account/collection>
91
+ collectionCommand
92
+ .command('fork <path>')
93
+ .description('Fork a public collection to your account')
94
+ .action(async (path) => {
95
+ requireAuth();
96
+ const [accountSlug, collectionSlug] = path.split('/');
97
+ if (!accountSlug || !collectionSlug) {
98
+ console.error(chalk.red('Invalid path. Use format: account/collection'));
99
+ process.exit(1);
100
+ }
101
+ const spinner = ora('Forking collection...').start();
102
+ // First get the collection by slug
103
+ const getResponse = await api.getCollectionBySlug(accountSlug, collectionSlug);
104
+ if (getResponse.error || !getResponse.data) {
105
+ spinner.fail('Collection not found');
106
+ console.error(chalk.red(getResponse.error?.message || 'Collection not found'));
107
+ process.exit(1);
108
+ }
109
+ // Then fork it
110
+ const forkResponse = await api.forkCollection(getResponse.data.id);
111
+ if (forkResponse.error || !forkResponse.data) {
112
+ spinner.fail('Failed to fork collection');
113
+ console.error(chalk.red(forkResponse.error?.message || 'Unknown error'));
114
+ process.exit(1);
115
+ }
116
+ const forked = forkResponse.data;
117
+ spinner.succeed(`Forked to ${chalk.green(forked.account?.slug + '/' + forked.slug)}`);
118
+ console.log(chalk.gray(`\nClone with: sdojo clone ${forked.account?.slug}/${forked.slug}`));
119
+ });
120
+ // sdojo collection delete <name>
121
+ collectionCommand
122
+ .command('delete <path>')
123
+ .description('Delete/archive a collection')
124
+ .option('-f, --force', 'Skip confirmation')
125
+ .action(async (path, options) => {
126
+ requireAuth();
127
+ const [accountSlug, collectionSlug] = path.split('/');
128
+ if (!accountSlug || !collectionSlug) {
129
+ console.error(chalk.red('Invalid path. Use format: account/collection'));
130
+ process.exit(1);
131
+ }
132
+ // Get collection first
133
+ const spinner = ora('Finding collection...').start();
134
+ const getResponse = await api.getCollectionBySlug(accountSlug, collectionSlug);
135
+ if (getResponse.error || !getResponse.data) {
136
+ spinner.fail('Collection not found');
137
+ console.error(chalk.red(getResponse.error?.message || 'Collection not found'));
138
+ process.exit(1);
139
+ }
140
+ spinner.stop();
141
+ // Confirm deletion
142
+ if (!options.force) {
143
+ const { confirm } = await inquirer.prompt([
144
+ {
145
+ type: 'confirm',
146
+ name: 'confirm',
147
+ message: `Are you sure you want to delete ${chalk.red(path)}? This action cannot be undone.`,
148
+ default: false,
149
+ },
150
+ ]);
151
+ if (!confirm) {
152
+ console.log('Cancelled');
153
+ return;
154
+ }
155
+ }
156
+ const deleteSpinner = ora('Deleting collection...').start();
157
+ const deleteResponse = await api.deleteCollection(getResponse.data.id);
158
+ if (deleteResponse.error) {
159
+ deleteSpinner.fail('Failed to delete collection');
160
+ console.error(chalk.red(deleteResponse.error.message));
161
+ process.exit(1);
162
+ }
163
+ deleteSpinner.succeed(`Deleted ${chalk.red(path)}`);
164
+ });
165
+ // sdojo collection show <path>
166
+ collectionCommand
167
+ .command('show <path>')
168
+ .description('Show collection details')
169
+ .option('--json', 'Output as JSON')
170
+ .action(async (path, options) => {
171
+ const [accountSlug, collectionSlug] = path.split('/');
172
+ if (!accountSlug || !collectionSlug) {
173
+ console.error(chalk.red('Invalid path. Use format: account/collection'));
174
+ process.exit(1);
175
+ }
176
+ const spinner = ora('Fetching collection...').start();
177
+ const response = await api.getCollectionBySlug(accountSlug, collectionSlug);
178
+ if (response.error || !response.data) {
179
+ spinner.fail('Collection not found');
180
+ console.error(chalk.red(response.error?.message || 'Collection not found'));
181
+ process.exit(1);
182
+ }
183
+ spinner.stop();
184
+ if (options.json) {
185
+ console.log(JSON.stringify(response.data, null, 2));
186
+ return;
187
+ }
188
+ const collection = response.data;
189
+ console.log(chalk.bold(`${accountSlug}/${collection.slug}`));
190
+ console.log();
191
+ if (collection.description) {
192
+ console.log(collection.description);
193
+ console.log();
194
+ }
195
+ console.log(`${chalk.gray('Visibility:')} ${collection.visibility}`);
196
+ console.log(`${chalk.gray('Skills:')} ${collection.skillCount}`);
197
+ console.log(`${chalk.gray('Stars:')} ${collection.starCount}`);
198
+ console.log(`${chalk.gray('Forks:')} ${collection.forkCount}`);
199
+ if (collection.forkedFromId) {
200
+ console.log(`${chalk.gray('Forked from:')} ${collection.forkedFromId}`);
201
+ }
202
+ console.log();
203
+ console.log(chalk.gray(`Created: ${new Date(collection.createdAt).toLocaleDateString()}`));
204
+ console.log(chalk.gray(`Updated: ${new Date(collection.modifiedAt).toLocaleDateString()}`));
205
+ });
206
+ //# sourceMappingURL=collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/commands/collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const diffCommand: Command;
3
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BpC,eAAO,MAAM,WAAW,SA4EpB,CAAC"}
@@ -0,0 +1,93 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { readFileSync, existsSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { diffLines } from 'diff';
6
+ import { findWorkspaceRoot, getWorkspaceConfig, getWorkspaceIndex } from '../lib/config.js';
7
+ import { getWorkspaceChanges } from './status.js';
8
+ function formatDiff(changes) {
9
+ for (const change of changes) {
10
+ const lines = change.value.split('\n');
11
+ for (let i = 0; i < lines.length; i++) {
12
+ const line = lines[i];
13
+ // Skip empty last line from split
14
+ if (i === lines.length - 1 && line === '') {
15
+ continue;
16
+ }
17
+ if (change.added) {
18
+ console.log(chalk.green(`+ ${line}`));
19
+ }
20
+ else if (change.removed) {
21
+ console.log(chalk.red(`- ${line}`));
22
+ }
23
+ else {
24
+ console.log(chalk.gray(` ${line}`));
25
+ }
26
+ }
27
+ }
28
+ }
29
+ export const diffCommand = new Command('diff')
30
+ .description('Show diff of local changes')
31
+ .argument('[path]', 'Specific file or skill path to diff')
32
+ .option('--no-color', 'Disable colors')
33
+ .action((path, options) => {
34
+ const workspaceRoot = findWorkspaceRoot();
35
+ if (!workspaceRoot) {
36
+ console.error(chalk.red('Not in a SkillsDojo workspace'));
37
+ console.error(chalk.gray('Run `sdojo clone <account/collection>` to clone a collection'));
38
+ process.exit(1);
39
+ }
40
+ const config = getWorkspaceConfig(workspaceRoot);
41
+ const index = getWorkspaceIndex(workspaceRoot);
42
+ if (!config || !index) {
43
+ console.error(chalk.red('Invalid workspace configuration'));
44
+ process.exit(1);
45
+ }
46
+ const changes = getWorkspaceChanges(workspaceRoot);
47
+ // Filter to specific path if provided
48
+ const filteredChanges = path
49
+ ? changes.filter((c) => c.path.startsWith(path))
50
+ : changes;
51
+ if (filteredChanges.length === 0) {
52
+ console.log(chalk.green('No changes'));
53
+ return;
54
+ }
55
+ for (const change of filteredChanges) {
56
+ const fullPath = join(workspaceRoot, change.path);
57
+ console.log(chalk.bold(`diff ${change.path}`));
58
+ console.log(chalk.gray('─'.repeat(60)));
59
+ switch (change.status) {
60
+ case 'new': {
61
+ if (existsSync(fullPath)) {
62
+ const newContent = readFileSync(fullPath, 'utf-8');
63
+ const diffResult = diffLines('', newContent);
64
+ formatDiff(diffResult);
65
+ }
66
+ break;
67
+ }
68
+ case 'deleted': {
69
+ // For deleted files, we need the original content from the index
70
+ // This is a limitation - we'd need to fetch from API
71
+ console.log(chalk.red('(file deleted - original content not available locally)'));
72
+ break;
73
+ }
74
+ case 'modified': {
75
+ // For modified files, we need the original content
76
+ // This is also a limitation - we'd need to store original or fetch
77
+ // For now, show current content with note
78
+ if (existsSync(fullPath)) {
79
+ const currentContent = readFileSync(fullPath, 'utf-8');
80
+ console.log(chalk.yellow('(showing current content - original not cached)'));
81
+ console.log();
82
+ const lines = currentContent.split('\n');
83
+ for (const line of lines) {
84
+ console.log(` ${line}`);
85
+ }
86
+ }
87
+ break;
88
+ }
89
+ }
90
+ console.log();
91
+ }
92
+ });
93
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const prCommand: Command;
3
+ //# sourceMappingURL=pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,SAAS,SACgB,CAAC"}