agent-skills-cli 1.0.8 → 1.0.9
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 +18 -17
- package/dist/cli/agents.d.ts +10 -0
- package/dist/cli/agents.d.ts.map +1 -0
- package/dist/cli/agents.js +270 -0
- package/dist/cli/agents.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +11 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +168 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/blueprint.d.ts +11 -0
- package/dist/cli/commands/blueprint.d.ts.map +1 -0
- package/dist/cli/commands/blueprint.js +210 -0
- package/dist/cli/commands/blueprint.js.map +1 -0
- package/dist/cli/commands/bootstrap.d.ts +11 -0
- package/dist/cli/commands/bootstrap.d.ts.map +1 -0
- package/dist/cli/commands/bootstrap.js +267 -0
- package/dist/cli/commands/bootstrap.js.map +1 -0
- package/dist/cli/commands/capture.d.ts +11 -0
- package/dist/cli/commands/capture.d.ts.map +1 -0
- package/dist/cli/commands/capture.js +109 -0
- package/dist/cli/commands/capture.js.map +1 -0
- package/dist/cli/commands/ci.d.ts +11 -0
- package/dist/cli/commands/ci.d.ts.map +1 -0
- package/dist/cli/commands/ci.js +144 -0
- package/dist/cli/commands/ci.js.map +1 -0
- package/dist/cli/commands/collab.d.ts +11 -0
- package/dist/cli/commands/collab.d.ts.map +1 -0
- package/dist/cli/commands/collab.js +196 -0
- package/dist/cli/commands/collab.js.map +1 -0
- package/dist/cli/commands/convert.d.ts +11 -0
- package/dist/cli/commands/convert.d.ts.map +1 -0
- package/dist/cli/commands/convert.js +219 -0
- package/dist/cli/commands/convert.js.map +1 -0
- package/dist/cli/commands/craft.d.ts +18 -0
- package/dist/cli/commands/craft.d.ts.map +1 -0
- package/dist/cli/commands/craft.js +205 -0
- package/dist/cli/commands/craft.js.map +1 -0
- package/dist/cli/commands/export.d.ts +9 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +103 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/forge.d.ts +11 -0
- package/dist/cli/commands/forge.d.ts.map +1 -0
- package/dist/cli/commands/forge.js +152 -0
- package/dist/cli/commands/forge.js.map +1 -0
- package/dist/cli/commands/grid.d.ts +11 -0
- package/dist/cli/commands/grid.d.ts.map +1 -0
- package/dist/cli/commands/grid.js +217 -0
- package/dist/cli/commands/grid.js.map +1 -0
- package/dist/cli/commands/insight.d.ts +7 -0
- package/dist/cli/commands/insight.d.ts.map +1 -0
- package/dist/cli/commands/insight.js +71 -0
- package/dist/cli/commands/insight.js.map +1 -0
- package/dist/cli/commands/install.d.ts +6 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +359 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/interactive.d.ts +7 -0
- package/dist/cli/commands/interactive.d.ts.map +1 -0
- package/dist/cli/commands/interactive.js +535 -0
- package/dist/cli/commands/interactive.js.map +1 -0
- package/dist/cli/commands/list.d.ts +6 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +77 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/lockspec.d.ts +11 -0
- package/dist/cli/commands/lockspec.d.ts.map +1 -0
- package/dist/cli/commands/lockspec.js +179 -0
- package/dist/cli/commands/lockspec.js.map +1 -0
- package/dist/cli/commands/marketplace.d.ts +7 -0
- package/dist/cli/commands/marketplace.d.ts.map +1 -0
- package/dist/cli/commands/marketplace.js +417 -0
- package/dist/cli/commands/marketplace.js.map +1 -0
- package/dist/cli/commands/method.d.ts +7 -0
- package/dist/cli/commands/method.d.ts.map +1 -0
- package/dist/cli/commands/method.js +140 -0
- package/dist/cli/commands/method.js.map +1 -0
- package/dist/cli/commands/mine.d.ts +11 -0
- package/dist/cli/commands/mine.d.ts.map +1 -0
- package/dist/cli/commands/mine.js +254 -0
- package/dist/cli/commands/mine.js.map +1 -0
- package/dist/cli/commands/recall.d.ts +11 -0
- package/dist/cli/commands/recall.d.ts.map +1 -0
- package/dist/cli/commands/recall.js +201 -0
- package/dist/cli/commands/recall.js.map +1 -0
- package/dist/cli/commands/rule.d.ts +11 -0
- package/dist/cli/commands/rule.d.ts.map +1 -0
- package/dist/cli/commands/rule.js +230 -0
- package/dist/cli/commands/rule.js.map +1 -0
- package/dist/cli/commands/search.d.ts +6 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +173 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/show.d.ts +6 -0
- package/dist/cli/commands/show.d.ts.map +1 -0
- package/dist/cli/commands/show.js +150 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/submit.d.ts +15 -0
- package/dist/cli/commands/submit.d.ts.map +1 -0
- package/dist/cli/commands/submit.js +151 -0
- package/dist/cli/commands/submit.js.map +1 -0
- package/dist/cli/commands/suggest.d.ts +11 -0
- package/dist/cli/commands/suggest.d.ts.map +1 -0
- package/dist/cli/commands/suggest.js +164 -0
- package/dist/cli/commands/suggest.js.map +1 -0
- package/dist/cli/commands/track.d.ts +11 -0
- package/dist/cli/commands/track.d.ts.map +1 -0
- package/dist/cli/commands/track.js +199 -0
- package/dist/cli/commands/track.js.map +1 -0
- package/dist/cli/commands/trigger.d.ts +11 -0
- package/dist/cli/commands/trigger.d.ts.map +1 -0
- package/dist/cli/commands/trigger.js +157 -0
- package/dist/cli/commands/trigger.js.map +1 -0
- package/dist/cli/commands/utils-commands.d.ts +9 -0
- package/dist/cli/commands/utils-commands.d.ts.map +1 -0
- package/dist/cli/commands/utils-commands.js +389 -0
- package/dist/cli/commands/utils-commands.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +6 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +40 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +84 -2743
- package/dist/cli/index.js.map +1 -1
- package/dist/core/audit.d.ts +24 -0
- package/dist/core/audit.d.ts.map +1 -0
- package/dist/core/audit.js +195 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/scanner-rules.d.ts +58 -0
- package/dist/core/scanner-rules.d.ts.map +1 -0
- package/dist/core/scanner-rules.js +335 -0
- package/dist/core/scanner-rules.js.map +1 -0
- package/dist/core/suggest.d.ts +51 -0
- package/dist/core/suggest.d.ts.map +1 -0
- package/dist/core/suggest.js +241 -0
- package/dist/core/suggest.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Craft Command
|
|
3
|
+
* Enhanced skill scaffolding with optional directories
|
|
4
|
+
* (SkillKit calls this "create" — we call it "craft")
|
|
5
|
+
*/
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import * as p from '@clack/prompts';
|
|
8
|
+
import { mkdir, writeFile } from 'fs/promises';
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
import { join, resolve } from 'path';
|
|
11
|
+
/**
|
|
12
|
+
* Register the craft command with commander
|
|
13
|
+
*/
|
|
14
|
+
export function registerCraftCommand(program) {
|
|
15
|
+
program
|
|
16
|
+
.command('craft <name>')
|
|
17
|
+
.description('Craft a new skill with full structure')
|
|
18
|
+
.option('-f, --full', 'Include all optional directories (scripts, references, assets)')
|
|
19
|
+
.option('-s, --scripts', 'Include scripts/ directory with templates')
|
|
20
|
+
.option('-r, --references', 'Include references/ directory')
|
|
21
|
+
.option('-a, --assets', 'Include assets/ directory')
|
|
22
|
+
.option('-d, --dir <path>', 'Parent directory to create skill in', '.')
|
|
23
|
+
.action(async (name, options) => {
|
|
24
|
+
try {
|
|
25
|
+
await craftCommand(name, options);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.error(chalk.red('Error:'), err.message);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Run the craft command
|
|
35
|
+
*/
|
|
36
|
+
async function craftCommand(name, options) {
|
|
37
|
+
const baseDir = resolve(options.dir || '.');
|
|
38
|
+
const skillDir = join(baseDir, name);
|
|
39
|
+
// Check if directory already exists
|
|
40
|
+
if (existsSync(skillDir)) {
|
|
41
|
+
console.error(chalk.red(`Error: Directory "${name}" already exists`));
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const spinner = p.spinner();
|
|
45
|
+
spinner.start(`Crafting skill "${name}"...`);
|
|
46
|
+
// Create main skill directory
|
|
47
|
+
await mkdir(skillDir, { recursive: true });
|
|
48
|
+
// Create SKILL.md with comprehensive template
|
|
49
|
+
const skillMd = generateSkillTemplate(name);
|
|
50
|
+
await writeFile(join(skillDir, 'SKILL.md'), skillMd);
|
|
51
|
+
// Create optional directories
|
|
52
|
+
const includeScripts = options.full || options.scripts;
|
|
53
|
+
const includeReferences = options.full || options.references;
|
|
54
|
+
const includeAssets = options.full || options.assets;
|
|
55
|
+
if (includeScripts) {
|
|
56
|
+
const scriptsDir = join(skillDir, 'scripts');
|
|
57
|
+
await mkdir(scriptsDir, { recursive: true });
|
|
58
|
+
// Create setup script template
|
|
59
|
+
await writeFile(join(scriptsDir, 'setup.sh'), generateSetupScript(name));
|
|
60
|
+
// Create test script template
|
|
61
|
+
await writeFile(join(scriptsDir, 'test.sh'), generateTestScript(name));
|
|
62
|
+
// Create run script template
|
|
63
|
+
await writeFile(join(scriptsDir, 'run.sh'), generateRunScript(name));
|
|
64
|
+
}
|
|
65
|
+
if (includeReferences) {
|
|
66
|
+
const refsDir = join(skillDir, 'references');
|
|
67
|
+
await mkdir(refsDir, { recursive: true });
|
|
68
|
+
await writeFile(join(refsDir, 'README.md'), `# References for ${name}\n\nAdd reference documents, examples, and documentation here.\n`);
|
|
69
|
+
}
|
|
70
|
+
if (includeAssets) {
|
|
71
|
+
const assetsDir = join(skillDir, 'assets');
|
|
72
|
+
await mkdir(assetsDir, { recursive: true });
|
|
73
|
+
await writeFile(join(assetsDir, '.gitkeep'), '');
|
|
74
|
+
}
|
|
75
|
+
// Create .gitignore
|
|
76
|
+
await writeFile(join(skillDir, '.gitignore'), `node_modules/\n.env\n*.log\n`);
|
|
77
|
+
spinner.stop(`Skill "${name}" crafted successfully!`);
|
|
78
|
+
console.log('');
|
|
79
|
+
// Show created structure
|
|
80
|
+
console.log(chalk.bold('📁 Created structure:'));
|
|
81
|
+
console.log(` ${chalk.cyan(name)}/`);
|
|
82
|
+
console.log(` ├── ${chalk.green('SKILL.md')} ${chalk.dim('← Main skill file')}`);
|
|
83
|
+
console.log(` ├── ${chalk.dim('.gitignore')}`);
|
|
84
|
+
if (includeScripts) {
|
|
85
|
+
console.log(` ├── ${chalk.yellow('scripts/')}`);
|
|
86
|
+
console.log(` │ ├── setup.sh ${chalk.dim('← Environment setup')}`);
|
|
87
|
+
console.log(` │ ├── test.sh ${chalk.dim('← Test runner')}`);
|
|
88
|
+
console.log(` │ └── run.sh ${chalk.dim('← Main execution')}`);
|
|
89
|
+
}
|
|
90
|
+
if (includeReferences) {
|
|
91
|
+
console.log(` ├── ${chalk.blue('references/')}`);
|
|
92
|
+
console.log(` │ └── README.md`);
|
|
93
|
+
}
|
|
94
|
+
if (includeAssets) {
|
|
95
|
+
console.log(` └── ${chalk.magenta('assets/')}`);
|
|
96
|
+
console.log(` └── .gitkeep`);
|
|
97
|
+
}
|
|
98
|
+
console.log('');
|
|
99
|
+
console.log(chalk.dim('Next steps:'));
|
|
100
|
+
console.log(chalk.dim(` 1. Edit ${name}/SKILL.md to add your skill content`));
|
|
101
|
+
console.log(chalk.dim(` 2. Run ${chalk.white(`skills validate ${name}`)} to check format`));
|
|
102
|
+
console.log(chalk.dim(` 3. Run ${chalk.white(`skills audit ${name}`)} for security scan`));
|
|
103
|
+
console.log(chalk.dim(` 4. Run ${chalk.white(`skills submit ${name}`)} to publish`));
|
|
104
|
+
console.log('');
|
|
105
|
+
}
|
|
106
|
+
function generateSkillTemplate(name) {
|
|
107
|
+
const displayName = name
|
|
108
|
+
.split('-')
|
|
109
|
+
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
|
|
110
|
+
.join(' ');
|
|
111
|
+
return `---
|
|
112
|
+
name: ${displayName}
|
|
113
|
+
description: A brief description of what this skill does
|
|
114
|
+
version: 1.0.0
|
|
115
|
+
tags:
|
|
116
|
+
- coding
|
|
117
|
+
- best-practices
|
|
118
|
+
globs:
|
|
119
|
+
- "**/*.ts"
|
|
120
|
+
- "**/*.js"
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
# ${displayName}
|
|
124
|
+
|
|
125
|
+
## Overview
|
|
126
|
+
|
|
127
|
+
Describe what this skill teaches the AI agent. Be specific and actionable.
|
|
128
|
+
|
|
129
|
+
## Guidelines
|
|
130
|
+
|
|
131
|
+
### Rule 1: [Name]
|
|
132
|
+
|
|
133
|
+
Explain the first guideline clearly.
|
|
134
|
+
|
|
135
|
+
**Do:**
|
|
136
|
+
\`\`\`typescript
|
|
137
|
+
// Good example
|
|
138
|
+
const result = await fetchData();
|
|
139
|
+
\`\`\`
|
|
140
|
+
|
|
141
|
+
**Don't:**
|
|
142
|
+
\`\`\`typescript
|
|
143
|
+
// Bad example
|
|
144
|
+
const result = fetchData(); // Missing await
|
|
145
|
+
\`\`\`
|
|
146
|
+
|
|
147
|
+
### Rule 2: [Name]
|
|
148
|
+
|
|
149
|
+
Explain the second guideline.
|
|
150
|
+
|
|
151
|
+
## Examples
|
|
152
|
+
|
|
153
|
+
Provide concrete examples of the skill in action.
|
|
154
|
+
|
|
155
|
+
## References
|
|
156
|
+
|
|
157
|
+
- [Link to docs](https://example.com)
|
|
158
|
+
- [Related resource](https://example.com)
|
|
159
|
+
`;
|
|
160
|
+
}
|
|
161
|
+
function generateSetupScript(name) {
|
|
162
|
+
return `#!/bin/bash
|
|
163
|
+
# Setup script for ${name}
|
|
164
|
+
# This runs when the skill is first installed
|
|
165
|
+
|
|
166
|
+
echo "Setting up ${name}..."
|
|
167
|
+
|
|
168
|
+
# Add your setup logic here
|
|
169
|
+
# Examples:
|
|
170
|
+
# - Install dependencies
|
|
171
|
+
# - Check prerequisites
|
|
172
|
+
# - Configure environment
|
|
173
|
+
|
|
174
|
+
echo "Setup complete!"
|
|
175
|
+
`;
|
|
176
|
+
}
|
|
177
|
+
function generateTestScript(name) {
|
|
178
|
+
return `#!/bin/bash
|
|
179
|
+
# Test script for ${name}
|
|
180
|
+
# Validates the skill works correctly
|
|
181
|
+
|
|
182
|
+
echo "Testing ${name}..."
|
|
183
|
+
|
|
184
|
+
# Add your test logic here
|
|
185
|
+
# Examples:
|
|
186
|
+
# - Validate SKILL.md format
|
|
187
|
+
# - Check file structure
|
|
188
|
+
# - Run integration tests
|
|
189
|
+
|
|
190
|
+
echo "All tests passed!"
|
|
191
|
+
`;
|
|
192
|
+
}
|
|
193
|
+
function generateRunScript(name) {
|
|
194
|
+
return `#!/bin/bash
|
|
195
|
+
# Run script for ${name}
|
|
196
|
+
# Main execution logic
|
|
197
|
+
|
|
198
|
+
echo "Running ${name}..."
|
|
199
|
+
|
|
200
|
+
# Add your execution logic here
|
|
201
|
+
|
|
202
|
+
echo "Done!"
|
|
203
|
+
`;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=craft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"craft.js","sourceRoot":"","sources":["../../../src/cli/commands/craft.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `skills export` command — Export skills to different AI agent formats
|
|
3
|
+
*
|
|
4
|
+
* Follows the Agent Skills spec: .agentname/skills/skillname/SKILL.md
|
|
5
|
+
* Supports all 42+ agents defined in agents.ts
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
export declare function registerExportCommand(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAiHrD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { discoverSkills, loadSkill } from '../../core/index.js';
|
|
4
|
+
import { AGENTS } from '../agents.js';
|
|
5
|
+
export function registerExportCommand(program) {
|
|
6
|
+
// Build the list of valid agent names from AGENTS config
|
|
7
|
+
const agentNames = Object.keys(AGENTS);
|
|
8
|
+
program
|
|
9
|
+
.command('export')
|
|
10
|
+
.description('Export skills to different AI agent formats')
|
|
11
|
+
.option('-t, --target <agent>', `Target agent: ${agentNames.slice(0, 5).join(', ')}, ... or 'all' (default: all)`, 'all')
|
|
12
|
+
.option('-d, --directory <dir>', 'Project directory', '.')
|
|
13
|
+
.option('-n, --name <name>', 'Export specific skill only')
|
|
14
|
+
.option('--list-agents', 'List all available agent targets')
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
try {
|
|
17
|
+
const { mkdir, writeFile, cp } = await import('fs/promises');
|
|
18
|
+
const { join } = await import('path');
|
|
19
|
+
const { existsSync } = await import('fs');
|
|
20
|
+
// --list-agents: show all available targets
|
|
21
|
+
if (options.listAgents) {
|
|
22
|
+
console.log(chalk.bold('\n🤖 Available agent targets:\n'));
|
|
23
|
+
for (const [key, config] of Object.entries(AGENTS)) {
|
|
24
|
+
console.log(` ${chalk.cyan(key.padEnd(20))} ${chalk.gray(config.displayName)} → ${chalk.dim(config.projectDir)}`);
|
|
25
|
+
}
|
|
26
|
+
console.log(chalk.dim(`\n Total: ${agentNames.length} agents`));
|
|
27
|
+
console.log(chalk.dim(` Use: skills export -t <agent-name>\n`));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Discover skills
|
|
31
|
+
let skills = await discoverSkills();
|
|
32
|
+
if (skills.length === 0) {
|
|
33
|
+
console.log(chalk.yellow('No skills found to export.'));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Filter if specific skill requested
|
|
37
|
+
if (options.name) {
|
|
38
|
+
skills = skills.filter(s => s.name === options.name);
|
|
39
|
+
if (skills.length === 0) {
|
|
40
|
+
console.error(chalk.red(`Skill not found: ${options.name}`));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Determine targets
|
|
45
|
+
let targets;
|
|
46
|
+
if (options.target === 'all') {
|
|
47
|
+
targets = agentNames;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Support comma-separated: -t cursor,claude,copilot
|
|
51
|
+
targets = options.target.split(',').map((t) => t.trim());
|
|
52
|
+
for (const t of targets) {
|
|
53
|
+
if (!AGENTS[t]) {
|
|
54
|
+
console.error(chalk.red(`Unknown agent: ${t}`));
|
|
55
|
+
console.log(chalk.dim(`Run 'skills export --list-agents' to see all available agents`));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
console.log(chalk.bold(`\nExporting ${skills.length} skill(s) to ${targets.length} agent(s)...\n`));
|
|
61
|
+
let successCount = 0;
|
|
62
|
+
for (const target of targets) {
|
|
63
|
+
const spinner = ora(`Exporting for ${target}...`).start();
|
|
64
|
+
try {
|
|
65
|
+
const config = AGENTS[target];
|
|
66
|
+
const skillsDir = join(options.directory, config.projectDir);
|
|
67
|
+
// Export each skill to: .agentname/skills/skillname/SKILL.md
|
|
68
|
+
for (const skillRef of skills) {
|
|
69
|
+
const skill = await loadSkill(skillRef.path);
|
|
70
|
+
if (!skill)
|
|
71
|
+
continue;
|
|
72
|
+
const skillDir = join(skillsDir, skillRef.name);
|
|
73
|
+
await mkdir(skillDir, { recursive: true });
|
|
74
|
+
// Write SKILL.md with frontmatter
|
|
75
|
+
const content = `---\nname: ${skill.metadata.name}\ndescription: ${skill.metadata.description}\n---\n\n${skill.body}\n`;
|
|
76
|
+
await writeFile(join(skillDir, 'SKILL.md'), content);
|
|
77
|
+
// Copy optional directories (scripts/, references/, assets/) if they exist
|
|
78
|
+
const optionalDirs = ['scripts', 'references', 'assets'];
|
|
79
|
+
for (const dir of optionalDirs) {
|
|
80
|
+
const sourcePath = join(skillRef.path, dir);
|
|
81
|
+
if (existsSync(sourcePath)) {
|
|
82
|
+
const destPath = join(skillDir, dir);
|
|
83
|
+
await mkdir(destPath, { recursive: true });
|
|
84
|
+
await cp(sourcePath, destPath, { recursive: true });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
spinner.succeed(`${config.displayName}: ${config.projectDir}/<skill>/SKILL.md`);
|
|
89
|
+
successCount++;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
spinner.fail(`${target}: ${err.message}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
console.log(chalk.bold.green(`\n✨ Export complete! (${successCount}/${targets.length} agents)\n`));
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error(chalk.red('Error exporting skills:'), error);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge Command
|
|
3
|
+
* AI-powered skill generation from natural language descriptions
|
|
4
|
+
* (SkillKit calls this "ai generate" — we call it "forge")
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Register the forge command
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerForgeCommand(program: Command): void;
|
|
11
|
+
//# sourceMappingURL=forge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/forge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiB3D"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge Command
|
|
3
|
+
* AI-powered skill generation from natural language descriptions
|
|
4
|
+
* (SkillKit calls this "ai generate" — we call it "forge")
|
|
5
|
+
*/
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import ora from 'ora';
|
|
8
|
+
import { writeFile, mkdir } from 'fs/promises';
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
import { resolve, join } from 'path';
|
|
11
|
+
/**
|
|
12
|
+
* Register the forge command
|
|
13
|
+
*/
|
|
14
|
+
export function registerForgeCommand(program) {
|
|
15
|
+
program
|
|
16
|
+
.command('forge <description>')
|
|
17
|
+
.alias('fg')
|
|
18
|
+
.description('AI-generate a skill from a natural language description')
|
|
19
|
+
.option('-o, --output <dir>', 'Output directory', '.')
|
|
20
|
+
.option('-a, --agent <agent>', 'Target agent format')
|
|
21
|
+
.option('-m, --model <model>', 'AI model to use (default: built-in)')
|
|
22
|
+
.option('-n, --dry-run', 'Preview generated content without saving')
|
|
23
|
+
.action(async (description, options) => {
|
|
24
|
+
try {
|
|
25
|
+
await forgeCommand(description, options);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.error(chalk.red('Error:'), err.message);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async function forgeCommand(description, options) {
|
|
34
|
+
const spinner = ora('Forging skill from description...').start();
|
|
35
|
+
// Extract key concepts from description
|
|
36
|
+
const concepts = extractConcepts(description);
|
|
37
|
+
const skillName = generateSkillName(description);
|
|
38
|
+
spinner.text = 'Generating skill content...';
|
|
39
|
+
// Generate skill content using template-based approach
|
|
40
|
+
const content = generateSkillContent(skillName, description, concepts);
|
|
41
|
+
spinner.succeed('Skill forged!');
|
|
42
|
+
console.log('');
|
|
43
|
+
if (options.dryRun) {
|
|
44
|
+
console.log(chalk.bold('📄 Preview:'));
|
|
45
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
46
|
+
console.log(content);
|
|
47
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
48
|
+
console.log('');
|
|
49
|
+
console.log(chalk.yellow('🏃 Dry run — skill was NOT saved'));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// Save the skill
|
|
53
|
+
const outputDir = resolve(options.output || '.');
|
|
54
|
+
const skillDir = join(outputDir, skillName);
|
|
55
|
+
if (existsSync(skillDir)) {
|
|
56
|
+
console.error(chalk.red(`Directory already exists: ${skillDir}`));
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
await mkdir(skillDir, { recursive: true });
|
|
60
|
+
await writeFile(join(skillDir, 'SKILL.md'), content);
|
|
61
|
+
console.log(chalk.green(`✨ Skill created: ${chalk.cyan(skillDir)}`));
|
|
62
|
+
console.log('');
|
|
63
|
+
console.log(chalk.dim('Next steps:'));
|
|
64
|
+
console.log(chalk.dim(` 1. Review and edit ${skillDir}/SKILL.md`));
|
|
65
|
+
console.log(chalk.dim(` 2. Run ${chalk.white(`skills validate ${skillDir}`)}`));
|
|
66
|
+
console.log(chalk.dim(` 3. Run ${chalk.white(`skills audit ${skillDir}`)}`));
|
|
67
|
+
console.log('');
|
|
68
|
+
}
|
|
69
|
+
function extractConcepts(description) {
|
|
70
|
+
const words = description.toLowerCase().split(/\s+/);
|
|
71
|
+
const stopWords = new Set(['a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
72
|
+
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could', 'should',
|
|
73
|
+
'for', 'and', 'nor', 'but', 'or', 'yet', 'so', 'in', 'on', 'at', 'to', 'of',
|
|
74
|
+
'with', 'by', 'from', 'up', 'about', 'into', 'through', 'that', 'this', 'it',
|
|
75
|
+
'how', 'what', 'when', 'where', 'who', 'which', 'why', 'skill', 'create', 'make',
|
|
76
|
+
'build', 'write', 'generate', 'agent', 'ai']);
|
|
77
|
+
return words
|
|
78
|
+
.filter(w => w.length > 2 && !stopWords.has(w))
|
|
79
|
+
.filter((w, i, arr) => arr.indexOf(w) === i)
|
|
80
|
+
.slice(0, 10);
|
|
81
|
+
}
|
|
82
|
+
function generateSkillName(description) {
|
|
83
|
+
const concepts = extractConcepts(description);
|
|
84
|
+
const name = concepts.slice(0, 3).join('-');
|
|
85
|
+
return name || 'forged-skill';
|
|
86
|
+
}
|
|
87
|
+
function generateSkillContent(name, description, concepts) {
|
|
88
|
+
const displayName = name.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
|
|
89
|
+
const tags = concepts.slice(0, 5).map(c => ` - ${c}`).join('\n');
|
|
90
|
+
return `---
|
|
91
|
+
name: ${name}
|
|
92
|
+
description: ${description}
|
|
93
|
+
version: 1.0.0
|
|
94
|
+
tags:
|
|
95
|
+
${tags}
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
# ${displayName}
|
|
99
|
+
|
|
100
|
+
## Overview
|
|
101
|
+
|
|
102
|
+
${description}
|
|
103
|
+
|
|
104
|
+
## Guidelines
|
|
105
|
+
|
|
106
|
+
### Best Practices
|
|
107
|
+
|
|
108
|
+
When working with ${concepts.slice(0, 3).join(', ')}:
|
|
109
|
+
|
|
110
|
+
1. **Follow established patterns** — Use conventions already present in the codebase
|
|
111
|
+
2. **Write clear code** — Prefer readability over cleverness
|
|
112
|
+
3. **Handle errors** — Always handle error cases and edge conditions
|
|
113
|
+
4. **Add documentation** — Document non-obvious decisions and complex logic
|
|
114
|
+
5. **Test thoroughly** — Write tests for both happy path and error scenarios
|
|
115
|
+
|
|
116
|
+
### Do's
|
|
117
|
+
|
|
118
|
+
\`\`\`
|
|
119
|
+
✓ Follow single responsibility principle
|
|
120
|
+
✓ Use descriptive naming
|
|
121
|
+
✓ Handle edge cases
|
|
122
|
+
✓ Write meaningful commit messages
|
|
123
|
+
✓ Keep functions focused and small
|
|
124
|
+
\`\`\`
|
|
125
|
+
|
|
126
|
+
### Don'ts
|
|
127
|
+
|
|
128
|
+
\`\`\`
|
|
129
|
+
✗ Leave TODO comments without tracking issues
|
|
130
|
+
✗ Use magic numbers without constants
|
|
131
|
+
✗ Skip error handling
|
|
132
|
+
✗ Write overly complex one-liners
|
|
133
|
+
✗ Ignore accessibility requirements
|
|
134
|
+
\`\`\`
|
|
135
|
+
|
|
136
|
+
## Examples
|
|
137
|
+
|
|
138
|
+
### Example 1: Standard Implementation
|
|
139
|
+
|
|
140
|
+
Follow the project's existing patterns and conventions when implementing new features related to ${concepts[0] || 'this domain'}.
|
|
141
|
+
|
|
142
|
+
### Example 2: Error Handling
|
|
143
|
+
|
|
144
|
+
Always wrap operations in proper error handling and provide meaningful error messages.
|
|
145
|
+
|
|
146
|
+
## References
|
|
147
|
+
|
|
148
|
+
- Review existing codebase patterns for consistency
|
|
149
|
+
- Follow the project's contributing guidelines
|
|
150
|
+
`;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=forge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge.js","sourceRoot":"","sources":["../../../src/cli/commands/forge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grid Command
|
|
3
|
+
* P2P skill mesh — discover and share skills on the local network
|
|
4
|
+
* (SkillKit calls this "mesh" — we call it "grid")
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Register the grid command
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerGridCommand(program: Command): void;
|
|
11
|
+
//# sourceMappingURL=grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/grid.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C1D"}
|