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,270 @@
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 { existsSync, mkdirSync, writeFileSync, rmSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { api } from '../lib/api.js';
9
+ import { findWorkspaceRoot, getWorkspaceConfig } from '../lib/config.js';
10
+ const SKILL_TEMPLATE = `---
11
+ name: {{name}}
12
+ description: {{description}}
13
+ user-invocable: true
14
+ allowed-tools: []
15
+ ---
16
+
17
+ # {{displayName}}
18
+
19
+ Instructions for this skill...
20
+ `;
21
+ export const skillCommand = new Command('skill')
22
+ .description('Manage skills');
23
+ // sdojo skill list [collection]
24
+ skillCommand
25
+ .command('list [collection]')
26
+ .description('List skills in a collection')
27
+ .option('-p, --page <number>', 'Page number', '1')
28
+ .option('-l, --limit <number>', 'Results per page', '20')
29
+ .option('-s, --search <query>', 'Search query')
30
+ .option('--json', 'Output as JSON')
31
+ .action(async (collection, options) => {
32
+ let collectionId;
33
+ let collectionPath;
34
+ if (collection) {
35
+ // Collection specified as argument
36
+ const [accountSlug, collectionSlug] = collection.split('/');
37
+ if (!accountSlug || !collectionSlug) {
38
+ console.error(chalk.red('Invalid path. Use format: account/collection'));
39
+ process.exit(1);
40
+ }
41
+ const response = await api.getCollectionBySlug(accountSlug, collectionSlug);
42
+ if (response.error || !response.data) {
43
+ console.error(chalk.red(response.error?.message || 'Collection not found'));
44
+ process.exit(1);
45
+ }
46
+ collectionId = response.data.id;
47
+ collectionPath = collection;
48
+ }
49
+ else {
50
+ // Use current workspace
51
+ const workspaceRoot = findWorkspaceRoot();
52
+ if (!workspaceRoot) {
53
+ console.error(chalk.red('No collection specified and not in a workspace'));
54
+ console.error(chalk.gray('Either specify a collection or run from within a cloned workspace'));
55
+ process.exit(1);
56
+ }
57
+ const config = getWorkspaceConfig(workspaceRoot);
58
+ if (!config) {
59
+ console.error(chalk.red('Invalid workspace configuration'));
60
+ process.exit(1);
61
+ }
62
+ collectionId = config.remote.collectionId;
63
+ collectionPath = `${config.remote.account}/${config.remote.collection}`;
64
+ }
65
+ const spinner = ora('Fetching skills...').start();
66
+ const response = await api.listSkills(collectionId, {
67
+ page: parseInt(options.page),
68
+ limit: parseInt(options.limit),
69
+ search: options.search,
70
+ });
71
+ if (response.error || !response.data) {
72
+ spinner.fail('Failed to fetch skills');
73
+ console.error(chalk.red(response.error?.message || 'Unknown error'));
74
+ process.exit(1);
75
+ }
76
+ spinner.stop();
77
+ const { items, total, page, totalPages } = response.data;
78
+ if (options.json) {
79
+ console.log(JSON.stringify(response.data, null, 2));
80
+ return;
81
+ }
82
+ console.log(chalk.bold(collectionPath));
83
+ console.log();
84
+ if (items.length === 0) {
85
+ console.log(chalk.yellow('No skills found'));
86
+ return;
87
+ }
88
+ const table = new Table({
89
+ head: [chalk.cyan('PATH'), chalk.cyan('NAME'), chalk.cyan('DESCRIPTION')],
90
+ style: { head: [], border: [] },
91
+ colWidths: [30, 25, 40],
92
+ wordWrap: true,
93
+ });
94
+ for (const skill of items) {
95
+ table.push([
96
+ skill.path,
97
+ skill.name,
98
+ (skill.description || '').substring(0, 80),
99
+ ]);
100
+ }
101
+ console.log(table.toString());
102
+ console.log(chalk.gray(`\nPage ${page} of ${totalPages} (${total} total)`));
103
+ });
104
+ // sdojo skill create <path>
105
+ skillCommand
106
+ .command('create <path>')
107
+ .description('Create a new skill from template')
108
+ .option('-n, --name <name>', 'Skill name')
109
+ .option('-d, --description <text>', 'Skill description')
110
+ .action(async (path, options) => {
111
+ const workspaceRoot = findWorkspaceRoot();
112
+ if (!workspaceRoot) {
113
+ console.error(chalk.red('Not in a SkillsDojo workspace'));
114
+ console.error(chalk.gray('Run `sdojo clone <account/collection>` to clone a collection first'));
115
+ process.exit(1);
116
+ }
117
+ // Normalize path
118
+ const normalizedPath = path.replace(/\/$/, '');
119
+ const skillDir = join(workspaceRoot, normalizedPath);
120
+ const skillFile = join(skillDir, 'SKILL.md');
121
+ // Check if skill already exists
122
+ if (existsSync(skillFile)) {
123
+ console.error(chalk.red(`Skill already exists at ${normalizedPath}`));
124
+ process.exit(1);
125
+ }
126
+ // Get skill details
127
+ let name = options.name;
128
+ let description = options.description;
129
+ if (!name) {
130
+ const answers = await inquirer.prompt([
131
+ {
132
+ type: 'input',
133
+ name: 'name',
134
+ message: 'Skill name:',
135
+ default: normalizedPath.split('/').pop(),
136
+ validate: (input) => input.trim().length > 0 || 'Name is required',
137
+ },
138
+ {
139
+ type: 'input',
140
+ name: 'description',
141
+ message: 'Description:',
142
+ },
143
+ ]);
144
+ name = answers.name;
145
+ description = answers.description;
146
+ }
147
+ // Create directory
148
+ mkdirSync(skillDir, { recursive: true });
149
+ // Generate SKILL.md content
150
+ const displayName = name
151
+ .split('-')
152
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
153
+ .join(' ');
154
+ const content = SKILL_TEMPLATE
155
+ .replace(/\{\{name\}\}/g, name)
156
+ .replace(/\{\{displayName\}\}/g, displayName)
157
+ .replace(/\{\{description\}\}/g, description || 'TODO: Add description');
158
+ // Write SKILL.md
159
+ writeFileSync(skillFile, content, 'utf-8');
160
+ console.log(chalk.green(`Created skill at ${normalizedPath}/SKILL.md`));
161
+ console.log();
162
+ console.log(chalk.gray('Edit the skill file, then run `sdojo push` to submit changes'));
163
+ });
164
+ // sdojo skill show <path>
165
+ skillCommand
166
+ .command('show <path>')
167
+ .description('Show skill details')
168
+ .option('--json', 'Output as JSON')
169
+ .action(async (path, options) => {
170
+ // Check if we're in a workspace
171
+ const workspaceRoot = findWorkspaceRoot();
172
+ if (workspaceRoot) {
173
+ // Show local skill
174
+ const skillFile = join(workspaceRoot, path, 'SKILL.md');
175
+ if (existsSync(skillFile)) {
176
+ const { readFileSync } = await import('fs');
177
+ const content = readFileSync(skillFile, 'utf-8');
178
+ if (options.json) {
179
+ // Parse YAML frontmatter
180
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
181
+ let metadata = {};
182
+ if (frontmatterMatch) {
183
+ const yaml = frontmatterMatch[1];
184
+ // Simple YAML parsing (key: value)
185
+ for (const line of yaml.split('\n')) {
186
+ const match = line.match(/^(\w[\w-]*): (.*)$/);
187
+ if (match) {
188
+ metadata[match[1]] = match[2];
189
+ }
190
+ }
191
+ }
192
+ console.log(JSON.stringify({ path, content, metadata }, null, 2));
193
+ }
194
+ else {
195
+ console.log(chalk.bold(path));
196
+ console.log(chalk.gray('─'.repeat(60)));
197
+ console.log(content);
198
+ }
199
+ return;
200
+ }
201
+ }
202
+ console.error(chalk.red(`Skill not found at ${path}`));
203
+ process.exit(1);
204
+ });
205
+ // sdojo skill delete <path>
206
+ skillCommand
207
+ .command('delete <path>')
208
+ .description('Delete a skill')
209
+ .option('-f, --force', 'Skip confirmation')
210
+ .action(async (path, options) => {
211
+ const workspaceRoot = findWorkspaceRoot();
212
+ if (!workspaceRoot) {
213
+ console.error(chalk.red('Not in a SkillsDojo workspace'));
214
+ process.exit(1);
215
+ }
216
+ const skillDir = join(workspaceRoot, path);
217
+ if (!existsSync(skillDir)) {
218
+ console.error(chalk.red(`Skill not found at ${path}`));
219
+ process.exit(1);
220
+ }
221
+ // Confirm deletion
222
+ if (!options.force) {
223
+ const { confirm } = await inquirer.prompt([
224
+ {
225
+ type: 'confirm',
226
+ name: 'confirm',
227
+ message: `Are you sure you want to delete ${chalk.red(path)}?`,
228
+ default: false,
229
+ },
230
+ ]);
231
+ if (!confirm) {
232
+ console.log('Cancelled');
233
+ return;
234
+ }
235
+ }
236
+ // Delete directory
237
+ rmSync(skillDir, { recursive: true });
238
+ console.log(chalk.green(`Deleted ${path}`));
239
+ console.log(chalk.gray('Run `sdojo push` to submit the deletion'));
240
+ });
241
+ // sdojo skill move <old-path> <new-path>
242
+ skillCommand
243
+ .command('move <old-path> <new-path>')
244
+ .description('Move/rename a skill')
245
+ .action(async (oldPath, newPath) => {
246
+ const workspaceRoot = findWorkspaceRoot();
247
+ if (!workspaceRoot) {
248
+ console.error(chalk.red('Not in a SkillsDojo workspace'));
249
+ process.exit(1);
250
+ }
251
+ const oldDir = join(workspaceRoot, oldPath);
252
+ const newDir = join(workspaceRoot, newPath);
253
+ if (!existsSync(oldDir)) {
254
+ console.error(chalk.red(`Skill not found at ${oldPath}`));
255
+ process.exit(1);
256
+ }
257
+ if (existsSync(newDir)) {
258
+ console.error(chalk.red(`Skill already exists at ${newPath}`));
259
+ process.exit(1);
260
+ }
261
+ // Rename directory
262
+ const { renameSync } = await import('fs');
263
+ const { dirname } = await import('path');
264
+ // Ensure parent directory exists
265
+ mkdirSync(dirname(newDir), { recursive: true });
266
+ renameSync(oldDir, newDir);
267
+ console.log(chalk.green(`Moved ${oldPath} → ${newPath}`));
268
+ console.log(chalk.gray('Run `sdojo push` to submit the change'));
269
+ });
270
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ export interface FileChange {
3
+ path: string;
4
+ status: 'modified' | 'new' | 'deleted';
5
+ }
6
+ export declare function getWorkspaceChanges(workspaceRoot: string): FileChange[];
7
+ export declare const statusCommand: Command;
8
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;CACxC;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE,CAkEvE;AAED,eAAO,MAAM,aAAa,SA6DtB,CAAC"}
@@ -0,0 +1,115 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { readdirSync, readFileSync } from 'fs';
4
+ import { join, relative } from 'path';
5
+ import { createHash } from 'crypto';
6
+ import { findWorkspaceRoot, getWorkspaceConfig, getWorkspaceIndex } from '../lib/config.js';
7
+ export function getWorkspaceChanges(workspaceRoot) {
8
+ const index = getWorkspaceIndex(workspaceRoot);
9
+ const changes = [];
10
+ if (!index) {
11
+ return changes;
12
+ }
13
+ const trackedFiles = new Set(Object.keys(index.files));
14
+ const currentFiles = new Set();
15
+ // Walk directory and find all SKILL.md files and other relevant files
16
+ function walkDir(dir) {
17
+ const entries = readdirSync(dir, { withFileTypes: true });
18
+ for (const entry of entries) {
19
+ const fullPath = join(dir, entry.name);
20
+ const relativePath = relative(workspaceRoot, fullPath);
21
+ // Skip .skillsdojo directory
22
+ if (entry.name === '.skillsdojo') {
23
+ continue;
24
+ }
25
+ if (entry.isDirectory()) {
26
+ walkDir(fullPath);
27
+ }
28
+ else if (entry.isFile()) {
29
+ // Track all files (not just SKILL.md)
30
+ currentFiles.add(relativePath);
31
+ }
32
+ }
33
+ }
34
+ walkDir(workspaceRoot);
35
+ // Check for new and modified files
36
+ for (const filePath of currentFiles) {
37
+ const fullPath = join(workspaceRoot, filePath);
38
+ if (!trackedFiles.has(filePath)) {
39
+ // New file
40
+ changes.push({ path: filePath, status: 'new' });
41
+ }
42
+ else {
43
+ // Check if modified by comparing SHA (git-format: "blob <size>\0<content>")
44
+ const content = readFileSync(fullPath);
45
+ const header = `blob ${content.length}\0`;
46
+ const store = Buffer.concat([Buffer.from(header), content]);
47
+ const sha = createHash('sha1').update(store).digest('hex');
48
+ if (sha !== index.files[filePath].sha) {
49
+ changes.push({ path: filePath, status: 'modified' });
50
+ }
51
+ }
52
+ }
53
+ // Check for deleted files
54
+ for (const trackedPath of trackedFiles) {
55
+ if (!currentFiles.has(trackedPath)) {
56
+ changes.push({ path: trackedPath, status: 'deleted' });
57
+ }
58
+ }
59
+ // Sort changes by path
60
+ changes.sort((a, b) => a.path.localeCompare(b.path));
61
+ return changes;
62
+ }
63
+ export const statusCommand = new Command('status')
64
+ .description('Show workspace status')
65
+ .option('--json', 'Output as JSON')
66
+ .action((options) => {
67
+ const workspaceRoot = findWorkspaceRoot();
68
+ if (!workspaceRoot) {
69
+ console.error(chalk.red('Not in a SkillsDojo workspace'));
70
+ console.error(chalk.gray('Run `sdojo clone <account/collection>` to clone a collection'));
71
+ process.exit(1);
72
+ }
73
+ const config = getWorkspaceConfig(workspaceRoot);
74
+ const index = getWorkspaceIndex(workspaceRoot);
75
+ if (!config || !index) {
76
+ console.error(chalk.red('Invalid workspace configuration'));
77
+ process.exit(1);
78
+ }
79
+ const changes = getWorkspaceChanges(workspaceRoot);
80
+ if (options.json) {
81
+ console.log(JSON.stringify({
82
+ workspace: workspaceRoot,
83
+ collection: `${config.remote.account}/${config.remote.collection}`,
84
+ branch: config.branch,
85
+ commitSha: index.commitSha,
86
+ changes,
87
+ }, null, 2));
88
+ return;
89
+ }
90
+ console.log(`Collection: ${chalk.cyan(`${config.remote.account}/${config.remote.collection}`)}`);
91
+ console.log(`Branch: ${chalk.gray(config.branch)}`);
92
+ console.log();
93
+ if (changes.length === 0) {
94
+ console.log(chalk.green('Working directory clean'));
95
+ return;
96
+ }
97
+ console.log('Changes not yet pushed:');
98
+ console.log();
99
+ for (const change of changes) {
100
+ switch (change.status) {
101
+ case 'modified':
102
+ console.log(` ${chalk.yellow('modified:')} ${change.path}`);
103
+ break;
104
+ case 'new':
105
+ console.log(` ${chalk.green('new file:')} ${change.path}`);
106
+ break;
107
+ case 'deleted':
108
+ console.log(` ${chalk.red('deleted:')} ${change.path}`);
109
+ break;
110
+ }
111
+ }
112
+ console.log();
113
+ console.log(chalk.gray("Run 'sdojo push' to create a pull request with these changes."));
114
+ });
115
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAc,WAAW,EAAY,YAAY,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAO5F,MAAM,UAAU,mBAAmB,CAAC,aAAqB;IACvD,MAAM,KAAK,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,sEAAsE;IACtE,SAAS,OAAO,CAAC,GAAW;QAC1B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YAEvD,6BAA6B;YAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,sCAAsC;gBACtC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,aAAa,CAAC,CAAC;IAEvB,mCAAmC;IACnC,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,WAAW;YACX,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,4EAA4E;YAC5E,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,OAAO,CAAC,MAAM,IAAI,CAAC;YAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE3D,IAAI,GAAG,KAAK,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAErD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;IAClB,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;IAE1C,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAE/C,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAEnD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,SAAS,EAAE,aAAa;YACxB,UAAU,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE;YAClE,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO;SACR,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,UAAU;gBACb,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC/D,MAAM;YACR,KAAK,KAAK;gBACR,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9D,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5D,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;AAC3F,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { spawn } from 'child_process';
5
+ import { authCommand } from './commands/auth.js';
6
+ import { collectionCommand } from './commands/collection.js';
7
+ import { pushCommand } from './commands/push.js';
8
+ import { prCommand } from './commands/pr.js';
9
+ const program = new Command();
10
+ program
11
+ .name('skillsd')
12
+ .description('SkillsDojo CLI - Manage AI agent skills')
13
+ .version('0.1.0');
14
+ // =============================================================================
15
+ // Skills CLI pass-through commands (uses npx skills under the hood)
16
+ // =============================================================================
17
+ /**
18
+ * Pass command through to npx skills
19
+ */
20
+ function passToSkills(args) {
21
+ const child = spawn('npx', ['skills', ...args], {
22
+ stdio: 'inherit',
23
+ shell: true,
24
+ });
25
+ child.on('close', (code) => {
26
+ process.exit(code || 0);
27
+ });
28
+ child.on('error', (err) => {
29
+ console.error(chalk.red('Failed to run skills CLI:'), err.message);
30
+ console.error(chalk.gray('Make sure you have npx available'));
31
+ process.exit(1);
32
+ });
33
+ }
34
+ // Add command - pass through to skills CLI
35
+ program
36
+ .command('add <source>')
37
+ .description('Add skills from a package or URL')
38
+ .option('-g, --global', 'Install globally (user-level)')
39
+ .option('-a, --agent <agents...>', 'Install to specific agents')
40
+ .option('-s, --skill <skills...>', 'Install specific skills')
41
+ .option('-l, --list', 'List available skills without installing')
42
+ .option('-y, --yes', 'Skip confirmation prompts')
43
+ .option('--all', 'Install all skills to all agents')
44
+ .allowUnknownOption()
45
+ .action((source, options, command) => {
46
+ const args = ['add', source, ...command.args.slice(1)];
47
+ if (options.global)
48
+ args.push('-g');
49
+ if (options.agent)
50
+ args.push('-a', ...options.agent);
51
+ if (options.skill)
52
+ args.push('-s', ...options.skill);
53
+ if (options.list)
54
+ args.push('-l');
55
+ if (options.yes)
56
+ args.push('-y');
57
+ if (options.all)
58
+ args.push('--all');
59
+ passToSkills(args);
60
+ });
61
+ // Remove command - pass through to skills CLI
62
+ program
63
+ .command('remove [skills...]')
64
+ .alias('rm')
65
+ .description('Remove installed skills')
66
+ .option('-g, --global', 'Remove from global scope')
67
+ .option('-a, --agent <agents...>', 'Remove from specific agents')
68
+ .option('-y, --yes', 'Skip confirmation prompts')
69
+ .option('--all', 'Remove all installed skills')
70
+ .allowUnknownOption()
71
+ .action((skills, options) => {
72
+ const args = ['remove', ...(skills || [])];
73
+ if (options.global)
74
+ args.push('-g');
75
+ if (options.agent)
76
+ args.push('-a', ...options.agent);
77
+ if (options.yes)
78
+ args.push('-y');
79
+ if (options.all)
80
+ args.push('--all');
81
+ passToSkills(args);
82
+ });
83
+ // List command - pass through to skills CLI
84
+ program
85
+ .command('list')
86
+ .alias('ls')
87
+ .description('List installed skills')
88
+ .option('-g, --global', 'List global skills')
89
+ .option('-a, --agent <agents...>', 'Filter by specific agents')
90
+ .allowUnknownOption()
91
+ .action((options) => {
92
+ const args = ['list'];
93
+ if (options.global)
94
+ args.push('-g');
95
+ if (options.agent)
96
+ args.push('-a', ...options.agent);
97
+ passToSkills(args);
98
+ });
99
+ // Find command - pass through to skills CLI
100
+ program
101
+ .command('find [query]')
102
+ .description('Search for skills interactively')
103
+ .allowUnknownOption()
104
+ .action((query) => {
105
+ const args = ['find'];
106
+ if (query)
107
+ args.push(query);
108
+ passToSkills(args);
109
+ });
110
+ // Init command - pass through to skills CLI
111
+ program
112
+ .command('init [name]')
113
+ .description('Initialize a new skill (creates SKILL.md)')
114
+ .allowUnknownOption()
115
+ .action((name) => {
116
+ const args = ['init'];
117
+ if (name)
118
+ args.push(name);
119
+ passToSkills(args);
120
+ });
121
+ // Check command - pass through to skills CLI
122
+ program
123
+ .command('check')
124
+ .description('Check for available skill updates')
125
+ .allowUnknownOption()
126
+ .action(() => {
127
+ passToSkills(['check']);
128
+ });
129
+ // Update command - pass through to skills CLI
130
+ program
131
+ .command('update')
132
+ .description('Update all skills to latest versions')
133
+ .allowUnknownOption()
134
+ .action(() => {
135
+ passToSkills(['update']);
136
+ });
137
+ // Generate-lock command - pass through to skills CLI
138
+ program
139
+ .command('generate-lock')
140
+ .description('Generate lock file from installed skills')
141
+ .option('--dry-run', 'Preview changes without writing')
142
+ .allowUnknownOption()
143
+ .action((options) => {
144
+ const args = ['generate-lock'];
145
+ if (options.dryRun)
146
+ args.push('--dry-run');
147
+ passToSkills(args);
148
+ });
149
+ // =============================================================================
150
+ // SkillsDojo-specific commands
151
+ // =============================================================================
152
+ // Add collection - shorthand for adding from SkillsDojo
153
+ program
154
+ .command('add-collection <path>')
155
+ .alias('ac')
156
+ .description('Add all skills from a SkillsDojo collection (e.g., account/collection)')
157
+ .option('-g, --global', 'Install globally (user-level)')
158
+ .option('-a, --agent <agents...>', 'Install to specific agents')
159
+ .option('-s, --skill <skills...>', 'Install specific skills')
160
+ .option('-l, --list', 'List available skills without installing')
161
+ .option('-y, --yes', 'Skip confirmation prompts')
162
+ .option('--all', 'Install all skills to all agents')
163
+ .option('--host <host>', 'SkillsDojo host (default: skillsdojo.ai)')
164
+ .action((path, options) => {
165
+ const host = options.host || 'skillsdojo.ai';
166
+ const protocol = host.includes('localhost') ? 'http' : 'https';
167
+ const source = `${protocol}://${host}/${path}.git`;
168
+ const args = ['add', source];
169
+ if (options.global)
170
+ args.push('-g');
171
+ if (options.agent)
172
+ args.push('-a', ...options.agent);
173
+ if (options.skill)
174
+ args.push('-s', ...options.skill);
175
+ if (options.list)
176
+ args.push('-l');
177
+ if (options.yes)
178
+ args.push('-y');
179
+ if (options.all)
180
+ args.push('--all');
181
+ passToSkills(args);
182
+ });
183
+ // Auth commands
184
+ program.addCommand(authCommand);
185
+ // Collection commands
186
+ program.addCommand(collectionCommand);
187
+ // Push command (for contributing to SkillsDojo)
188
+ program.addCommand(pushCommand);
189
+ // PR commands (for managing contributions)
190
+ program.addCommand(prCommand);
191
+ // =============================================================================
192
+ // Error handling
193
+ // =============================================================================
194
+ program.configureOutput({
195
+ outputError: (str, write) => {
196
+ write(chalk.red(str));
197
+ },
198
+ });
199
+ // Show help if no command provided
200
+ if (process.argv.length <= 2) {
201
+ console.log(chalk.cyan(`
202
+ ███████╗██╗ ██╗██╗██╗ ██╗ ███████╗██████╗
203
+ ██╔════╝██║ ██╔╝██║██║ ██║ ██╔════╝██╔══██╗
204
+ ███████╗█████╔╝ ██║██║ ██║ ███████╗██║ ██║
205
+ ╚════██║██╔═██╗ ██║██║ ██║ ╚════██║██║ ██║
206
+ ███████║██║ ██╗██║███████╗███████╗███████║██████╔╝
207
+ ╚══════╝╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚══════╝╚═════╝
208
+ `));
209
+ program.outputHelp();
210
+ process.exit(0);
211
+ }
212
+ // Parse arguments
213
+ program.parse();
214
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}