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.
- package/README.md +484 -0
- package/bin/sd.js +3 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +148 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/clone.d.ts +3 -0
- package/dist/commands/clone.d.ts.map +1 -0
- package/dist/commands/clone.js +86 -0
- package/dist/commands/clone.js.map +1 -0
- package/dist/commands/collection.d.ts +3 -0
- package/dist/commands/collection.d.ts.map +1 -0
- package/dist/commands/collection.js +206 -0
- package/dist/commands/collection.js.map +1 -0
- package/dist/commands/diff.d.ts +3 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +93 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/pr.d.ts +3 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +230 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/pull.d.ts +3 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +136 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +3 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +129 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +55 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skill.d.ts +3 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +270 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +115 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +214 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +208 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +216 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +13 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +181 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config.d.ts +58 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +144 -0
- package/dist/lib/config.js.map +1 -0
- 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":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|