claude-skills-cli 0.0.3 → 0.0.5
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 +59 -226
- package/dist/commands/init.js +29 -20
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +69 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/package.js +5 -9
- package/dist/commands/package.js.map +1 -1
- package/dist/commands/stats.js +154 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/validate.js +1 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/core/templates.js +63 -12
- package/dist/core/templates.js.map +1 -1
- package/dist/core/validator.js +31 -10
- package/dist/core/validator.js.map +1 -1
- package/dist/index.js +28 -4
- package/dist/index.js.map +1 -1
- package/dist/skills/skill-creator/SKILL.md +143 -0
- package/dist/skills/skill-creator/references/anthropic-resources.md +504 -0
- package/dist/skills/skill-creator/references/cli-reference.md +507 -0
- package/dist/skills/skill-creator/references/skill-examples.md +413 -0
- package/{skills → dist/skills}/skill-creator/references/writing-guide.md +156 -131
- package/dist/skills/skill-creator/skill-creator/SKILL.md +143 -0
- package/dist/skills/skill-creator/skill-creator/references/anthropic-resources.md +504 -0
- package/dist/skills/skill-creator/skill-creator/references/cli-reference.md +507 -0
- package/dist/skills/skill-creator/skill-creator/references/skill-examples.md +413 -0
- package/dist/skills/skill-creator/skill-creator/references/writing-guide.md +619 -0
- package/dist/utils/fs.js +2 -2
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/output.js +2 -1
- package/dist/utils/output.js.map +1 -1
- package/docs/SKILL-DEVELOPMENT.md +38 -35
- package/docs/SKILL-EXAMPLES.md +73 -63
- package/docs/SKILLS-ARCHITECTURE.md +42 -41
- package/package.json +2 -2
- package/skills/skill-creator/SKILL.md +0 -345
- package/skills/skill-creator/references/skill-examples.md +0 -403
package/README.md
CHANGED
|
@@ -1,270 +1,103 @@
|
|
|
1
1
|
# claude-skills-cli
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
CLI for creating Claude Agent Skills with progressive disclosure
|
|
4
|
+
validation. Built for Claude Code to use when humans ask it to create
|
|
5
|
+
skills.
|
|
4
6
|
|
|
5
|
-
##
|
|
7
|
+
## For Humans Using Claude Code
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
Tell Claude Code to create skills with specific package manager
|
|
10
|
+
commands.
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
npx claude-skills init my-skill
|
|
11
|
-
npx claude-skills validate .claude/skills/my-skill
|
|
12
|
-
npx claude-skills validate .claude/skills/my-skill --strict
|
|
13
|
-
npx claude-skills package .claude/skills/my-skill
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Commands
|
|
17
|
-
|
|
18
|
-
### `init` - Create a new skill
|
|
12
|
+
Using npm:
|
|
19
13
|
|
|
20
|
-
```bash
|
|
21
|
-
claude-skills init my-skill
|
|
22
|
-
claude-skills init my-skill --description "Brief description with trigger keywords"
|
|
23
14
|
```
|
|
24
|
-
|
|
25
|
-
Creates a skill directory with:
|
|
26
|
-
|
|
27
|
-
- **SKILL.md** - Streamlined ~50 line template with progressive disclosure guidelines
|
|
28
|
-
- **README.md** - Skill documentation
|
|
29
|
-
- **references/** - Directory for Level 3 detailed documentation
|
|
30
|
-
- **scripts/** - Directory for executable Python scripts
|
|
31
|
-
- **assets/** - Directory for templates and resources
|
|
32
|
-
|
|
33
|
-
The generated SKILL.md template follows best practices:
|
|
34
|
-
|
|
35
|
-
- 1-2 code blocks maximum
|
|
36
|
-
- Clear "Quick Start" section
|
|
37
|
-
- Links to references/ for detailed content
|
|
38
|
-
- Progressive disclosure comments inline
|
|
39
|
-
|
|
40
|
-
### `validate` - Validate skill structure
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
claude-skills validate .claude/skills/my-skill
|
|
44
|
-
claude-skills validate .claude/skills/my-skill --strict
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**Progressive Disclosure Validation** (3-Level System):
|
|
48
|
-
|
|
49
|
-
| Level | Content | Checks |
|
|
50
|
-
| -------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
51
|
-
| **Level 1: Metadata** | YAML frontmatter | Description <200 chars (warn), <300 chars (error)<br>Trigger keywords present ("Use when/for/to")<br>No list bloat (>3 commas) |
|
|
52
|
-
| **Level 2: SKILL.md Body** | Main instructions | Line count ~50 (warn >80, error >150)<br>Word count <1000 (warn), <5000 (error)<br>Code blocks ≤3 (recommend 1-2)<br>Sections ≤8 (recommend 3-5)<br>"Quick Start" section present<br>Links to references/ when long |
|
|
53
|
-
| **Level 3: References** | Bundled files | Referenced files exist (error on broken links)<br>No empty directories |
|
|
54
|
-
|
|
55
|
-
**Validation Output:**
|
|
56
|
-
|
|
57
|
-
The validator displays a detailed progressive disclosure stats breakdown:
|
|
58
|
-
|
|
15
|
+
"Use npx -y claude-skills-cli to create a skill for my API client code"
|
|
59
16
|
```
|
|
60
|
-
📊 Progressive Disclosure Stats:
|
|
61
|
-
|
|
62
|
-
Level 1 (Metadata - Always Loaded):
|
|
63
|
-
Description: 156 chars, ~18 tokens ✅ Optimal
|
|
64
|
-
(Target: <200 chars, <30 tokens for Level 1 efficiency)
|
|
65
17
|
|
|
66
|
-
|
|
67
|
-
Lines: 48 (target: ~50, max: ~150) ✅ Excellent
|
|
68
|
-
Words: 342 (recommended: <1000, max: <5000) ✅ Excellent
|
|
69
|
-
Est. tokens: ~445 (budget: <6500) within budget
|
|
70
|
-
Code blocks: 1 ✅
|
|
71
|
-
Sections: 5 ✅
|
|
18
|
+
Using pnpm:
|
|
72
19
|
|
|
73
|
-
Level 3+ (References - Loaded as needed):
|
|
74
|
-
Use references/ directory for detailed docs (unlimited size)
|
|
75
|
-
|
|
76
|
-
Overall Assessment:
|
|
77
|
-
✅ Excellent progressive disclosure!
|
|
78
20
|
```
|
|
79
|
-
|
|
80
|
-
**Exit codes:**
|
|
81
|
-
|
|
82
|
-
- 0 = Valid (or valid with warnings)
|
|
83
|
-
- 1 = Validation errors
|
|
84
|
-
- 1 with `--strict` = Warnings treated as errors
|
|
85
|
-
|
|
86
|
-
### `package` - Create uploadable zip
|
|
87
|
-
|
|
88
|
-
```bash
|
|
89
|
-
claude-skills package .claude/skills/my-skill
|
|
90
|
-
claude-skills package .claude/skills/my-skill --output dist/
|
|
91
|
-
claude-skills package .claude/skills/my-skill --skip-validation
|
|
21
|
+
"Use pnpx claude-skills-cli to create a skill for my API client code"
|
|
92
22
|
```
|
|
93
23
|
|
|
94
|
-
|
|
24
|
+
This CLI enforces progressive disclosure so Claude doesn't write
|
|
25
|
+
500-line documentation files.
|
|
95
26
|
|
|
96
|
-
|
|
97
|
-
- Python bytecode (.pyc, **pycache**)
|
|
98
|
-
- Swap files (~, .swp)
|
|
27
|
+
## Progressive Disclosure
|
|
99
28
|
|
|
100
|
-
|
|
29
|
+
Skills load in 3 levels to optimize token usage:
|
|
101
30
|
|
|
102
|
-
|
|
31
|
+
| Level | Content | When Loaded | Size Limit |
|
|
32
|
+
| ----- | ------------------------------ | ------------------- | ---------- |
|
|
33
|
+
| **1** | SKILL.md metadata (YAML) | Always in context | <200 chars |
|
|
34
|
+
| **2** | SKILL.md body (Markdown) | When skill triggers | ~50 lines |
|
|
35
|
+
| **3** | references/, scripts/, assets/ | As needed by Claude | Unlimited |
|
|
103
36
|
|
|
104
|
-
|
|
37
|
+
This CLI enforces these constraints through validation, keeping skills
|
|
38
|
+
lean and scannable.
|
|
105
39
|
|
|
106
|
-
|
|
107
|
-
| ------ | ------------------------------ | -------------------------- | ------------ |
|
|
108
|
-
| **1** | SKILL.md Metadata (YAML) | Always loaded | ~100 tokens |
|
|
109
|
-
| **2** | SKILL.md Body (Markdown) | Loaded when skill triggers | <5k tokens |
|
|
110
|
-
| **3+** | references/, scripts/, assets/ | Loaded as-needed by Claude | Unlimited |
|
|
111
|
-
|
|
112
|
-
### Why This Matters
|
|
113
|
-
|
|
114
|
-
- **Level 1** is always in Claude's context, so keep descriptions <200 chars
|
|
115
|
-
- **Level 2** loads when Claude thinks the skill is relevant, so keep it scannable (~50 lines)
|
|
116
|
-
- **Level 3** loads on-demand, so move detailed docs, examples, and schemas there
|
|
117
|
-
|
|
118
|
-
The validator enforces these constraints to ensure skills are token-efficient.
|
|
40
|
+
## Commands
|
|
119
41
|
|
|
120
|
-
|
|
42
|
+
For Claude Code to read, this id detailed in the CLI
|
|
121
43
|
|
|
122
|
-
###
|
|
44
|
+
### init
|
|
123
45
|
|
|
124
46
|
```bash
|
|
125
|
-
|
|
47
|
+
pnpx claude-skills-cli init --name my-skill --description "Brief description with trigger keywords"
|
|
48
|
+
pnpx claude-skills-cli init --name my-skill --description "..." --with-examples
|
|
126
49
|
```
|
|
127
50
|
|
|
128
|
-
|
|
51
|
+
Creates minimal skill scaffolding by default (SKILL.md, README.md,
|
|
52
|
+
references/). Use `--with-examples` for example files.
|
|
129
53
|
|
|
130
|
-
|
|
131
|
-
npm install -g claude-skills-cli
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### Using npx (no install):
|
|
54
|
+
### validate
|
|
135
55
|
|
|
136
56
|
```bash
|
|
137
|
-
|
|
57
|
+
pnpx claude-skills-cli validate .claude/skills/my-skill
|
|
58
|
+
pnpx claude-skills-cli validate .claude/skills/my-skill --strict
|
|
138
59
|
```
|
|
139
60
|
|
|
140
|
-
|
|
61
|
+
Validates progressive disclosure compliance:
|
|
141
62
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
63
|
+
- Level 1: Description length, trigger keywords, no list bloat
|
|
64
|
+
- Level 2: Line count (~50), word count (<1000), code blocks (1-2),
|
|
65
|
+
sections (3-5)
|
|
66
|
+
- Level 3: Referenced files exist, no broken links
|
|
146
67
|
|
|
147
|
-
|
|
148
|
-
# - Keep it under 50 lines
|
|
149
|
-
# - Use 1 minimal code example in Quick Start
|
|
150
|
-
# - Link to references/ for detailed docs
|
|
68
|
+
### stats
|
|
151
69
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
# 4. Fix any warnings (or use --strict to enforce)
|
|
156
|
-
npx claude-skills validate .claude/skills/database-queries --strict
|
|
157
|
-
|
|
158
|
-
# 5. Package for sharing
|
|
159
|
-
npx claude-skills package .claude/skills/database-queries
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
## Validation Best Practices
|
|
163
|
-
|
|
164
|
-
### ✅ Good Skill (Passes Validation)
|
|
165
|
-
|
|
166
|
-
````markdown
|
|
167
|
-
---
|
|
168
|
-
name: api-client
|
|
169
|
-
description: REST API client for our service. Use when making HTTP requests to api.example.com.
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
# API Client
|
|
173
|
-
|
|
174
|
-
## Quick Start
|
|
175
|
-
|
|
176
|
-
```typescript
|
|
177
|
-
import { apiClient } from '$lib/api';
|
|
178
|
-
|
|
179
|
-
const response = await apiClient.get('/users');
|
|
70
|
+
```bash
|
|
71
|
+
pnpx claude-skills-cli stats .claude/skills
|
|
180
72
|
```
|
|
181
|
-
````
|
|
182
|
-
|
|
183
|
-
## Core Principles
|
|
184
|
-
|
|
185
|
-
- Use typed requests and responses
|
|
186
|
-
- Handle errors with try/catch
|
|
187
|
-
- Include authentication headers
|
|
188
|
-
|
|
189
|
-
## Reference Files
|
|
190
|
-
|
|
191
|
-
- [references/endpoints.md](references/endpoints.md) - Complete API reference
|
|
192
|
-
- [references/examples.md](references/examples.md) - Request/response examples
|
|
193
|
-
|
|
194
|
-
````
|
|
195
|
-
|
|
196
|
-
**Why it's good:**
|
|
197
|
-
- Description: 81 chars with trigger keywords ✅
|
|
198
|
-
- Lines: ~25 lines ✅
|
|
199
|
-
- Code blocks: 1 ✅
|
|
200
|
-
- Has Quick Start section ✅
|
|
201
|
-
- Links to references/ for details ✅
|
|
202
73
|
|
|
203
|
-
|
|
74
|
+
Shows overview of all skills with validation status, sizes, and
|
|
75
|
+
quality ratings.
|
|
204
76
|
|
|
205
|
-
|
|
206
|
-
---
|
|
207
|
-
name: api-client
|
|
208
|
-
description: Comprehensive REST API client for making HTTP requests to our service endpoints including GET, POST, PUT, DELETE, PATCH operations with authentication, error handling, retries, rate limiting, and response caching for users, posts, comments, tags, categories, and settings endpoints.
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
# API Client
|
|
212
|
-
|
|
213
|
-
[186 lines of detailed documentation with 7 code blocks...]
|
|
214
|
-
````
|
|
215
|
-
|
|
216
|
-
**Problems:**
|
|
217
|
-
|
|
218
|
-
- Description: 287 chars, no trigger keywords ❌
|
|
219
|
-
- Lines: 186 (max 150) ❌
|
|
220
|
-
- Code blocks: 7 (recommend 1-2) ❌
|
|
221
|
-
- No Quick Start section ❌
|
|
222
|
-
- Should split into references/ ❌
|
|
223
|
-
|
|
224
|
-
## Development
|
|
77
|
+
### package
|
|
225
78
|
|
|
226
79
|
```bash
|
|
227
|
-
|
|
228
|
-
npm install
|
|
229
|
-
|
|
230
|
-
# Build TypeScript
|
|
231
|
-
npm run build
|
|
232
|
-
|
|
233
|
-
# Run locally
|
|
234
|
-
node dist/index.js validate path/to/skill
|
|
235
|
-
|
|
236
|
-
# Format code
|
|
237
|
-
npm run format
|
|
238
|
-
|
|
239
|
-
# Type check
|
|
240
|
-
npx tsc --noEmit
|
|
80
|
+
pnpx claude-skills-cli package .claude/skills/my-skill
|
|
241
81
|
```
|
|
242
82
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
### Official Documentation
|
|
246
|
-
|
|
247
|
-
- [Agent Skills Overview](https://www.anthropic.com/news/skills)
|
|
248
|
-
- [Engineering Blog: Agent Skills](https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills)
|
|
249
|
-
- [Claude Docs: Skills](https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview)
|
|
250
|
-
- [Anthropic Skills Repository](https://github.com/anthropics/skills)
|
|
83
|
+
Creates uploadable zip for Claude.ai. Validates first unless
|
|
84
|
+
`--skip-validation` specified.
|
|
251
85
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
- [docs/SKILLS-ARCHITECTURE.md](docs/SKILLS-ARCHITECTURE.md) - Progressive disclosure system
|
|
255
|
-
- [docs/SKILL-DEVELOPMENT.md](docs/SKILL-DEVELOPMENT.md) - Skill creation workflow
|
|
256
|
-
- [docs/SKILL-EXAMPLES.md](docs/SKILL-EXAMPLES.md) - Real-world examples
|
|
257
|
-
|
|
258
|
-
## License
|
|
259
|
-
|
|
260
|
-
MIT © Scott Spence
|
|
86
|
+
## Resources
|
|
261
87
|
|
|
262
|
-
|
|
88
|
+
**Included docs:**
|
|
263
89
|
|
|
264
|
-
|
|
90
|
+
- [docs/SKILLS-ARCHITECTURE.md](docs/SKILLS-ARCHITECTURE.md) -
|
|
91
|
+
Progressive disclosure system
|
|
92
|
+
- [docs/SKILL-DEVELOPMENT.md](docs/SKILL-DEVELOPMENT.md) - Skill
|
|
93
|
+
creation workflow
|
|
94
|
+
- [docs/SKILL-EXAMPLES.md](docs/SKILL-EXAMPLES.md) - Real-world
|
|
95
|
+
examples
|
|
96
|
+
- [skills/skill-creator/](skills/skill-creator/) - Skill for creating
|
|
97
|
+
skills
|
|
265
98
|
|
|
266
|
-
|
|
267
|
-
2. **Ergonomics for Claude** - Is it easy for Claude to understand and use?
|
|
268
|
-
3. **Progressive disclosure** - Does it enforce the 3-level system?
|
|
99
|
+
**Official Anthropic docs:**
|
|
269
100
|
|
|
270
|
-
|
|
101
|
+
- [Agent Skills Overview](https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview)
|
|
102
|
+
- [Engineering Blog](https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills)
|
|
103
|
+
- [Skills Repository](https://github.com/anthropics/skills)
|
package/dist/commands/init.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { join } from 'path';
|
|
2
|
-
import {
|
|
3
|
-
import { ensure_dir,
|
|
4
|
-
import {
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { README_TEMPLATE, REFERENCE_TEMPLATE, SCRIPT_TEMPLATE, SKILL_MD_TEMPLATE, } from '../core/templates.js';
|
|
3
|
+
import { ensure_dir, is_lowercase, make_executable, to_title_case, write_file, } from '../utils/fs.js';
|
|
4
|
+
import { error, success } from '../utils/output.js';
|
|
5
5
|
export function init_command(options) {
|
|
6
6
|
let skill_path;
|
|
7
7
|
let name;
|
|
@@ -36,35 +36,44 @@ export function init_command(options) {
|
|
|
36
36
|
process.exit(1);
|
|
37
37
|
}
|
|
38
38
|
// Create skill
|
|
39
|
-
create_skill(skill_path, name, description);
|
|
39
|
+
create_skill(skill_path, name, description, options.with_examples || false);
|
|
40
40
|
}
|
|
41
|
-
function create_skill(path, name, description) {
|
|
42
|
-
// Create directories
|
|
41
|
+
function create_skill(path, name, description, with_examples = false) {
|
|
42
|
+
// Create base directories
|
|
43
43
|
ensure_dir(path);
|
|
44
44
|
ensure_dir(join(path, 'references'));
|
|
45
|
-
ensure_dir(join(path, 'scripts'));
|
|
46
|
-
ensure_dir(join(path, 'assets'));
|
|
47
45
|
// Create SKILL.md
|
|
48
46
|
const title = to_title_case(name);
|
|
49
|
-
const skill_md = SKILL_MD_TEMPLATE(name, description, title);
|
|
47
|
+
const skill_md = SKILL_MD_TEMPLATE(name, description, title, with_examples);
|
|
50
48
|
write_file(join(path, 'SKILL.md'), skill_md);
|
|
51
|
-
// Create example reference
|
|
52
|
-
const reference_md = REFERENCE_TEMPLATE(title);
|
|
53
|
-
write_file(join(path, 'references', 'detailed-guide.md'), reference_md);
|
|
54
|
-
// Create example script
|
|
55
|
-
const script_py = SCRIPT_TEMPLATE('example.py');
|
|
56
|
-
const script_path = join(path, 'scripts', 'example.py');
|
|
57
|
-
write_file(script_path, script_py);
|
|
58
|
-
make_executable(script_path);
|
|
59
49
|
// Create README
|
|
60
50
|
const readme_md = README_TEMPLATE(title, description);
|
|
61
51
|
write_file(join(path, 'README.md'), readme_md);
|
|
52
|
+
// Only create example files if requested
|
|
53
|
+
if (with_examples) {
|
|
54
|
+
// Create example directories
|
|
55
|
+
ensure_dir(join(path, 'scripts'));
|
|
56
|
+
ensure_dir(join(path, 'assets'));
|
|
57
|
+
// Create example reference
|
|
58
|
+
const reference_md = REFERENCE_TEMPLATE(title);
|
|
59
|
+
write_file(join(path, 'references', 'detailed-guide.md'), reference_md);
|
|
60
|
+
// Create example script
|
|
61
|
+
const script_js = SCRIPT_TEMPLATE('example.js');
|
|
62
|
+
const script_path = join(path, 'scripts', 'example.js');
|
|
63
|
+
write_file(script_path, script_js);
|
|
64
|
+
make_executable(script_path);
|
|
65
|
+
}
|
|
62
66
|
success(`Skill created at: ${path}`);
|
|
63
67
|
console.log('\nNext steps:');
|
|
64
68
|
console.log(`1. Edit ${path}/SKILL.md with your skill instructions`);
|
|
65
69
|
console.log(`2. Add detailed documentation to references/`);
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
if (with_examples) {
|
|
71
|
+
console.log(`3. Add executable scripts to scripts/`);
|
|
72
|
+
console.log(`4. Remove example files you don't need`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.log(`3. Use --with-examples flag if you need scripts/ and example files`);
|
|
76
|
+
}
|
|
68
77
|
console.log(`\nValidate with: claude-skills validate ${path}`);
|
|
69
78
|
}
|
|
70
79
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { cpSync, existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { ensure_dir } from '../utils/fs.js';
|
|
5
|
+
import { error, info, success } from '../utils/output.js';
|
|
6
|
+
// Get the directory where this module is located (dist/commands/)
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = dirname(__filename);
|
|
9
|
+
// Bundled skills are in dist/skills/ directory
|
|
10
|
+
const BUNDLED_SKILLS_DIR = join(__dirname, '..', 'skills');
|
|
11
|
+
const AVAILABLE_SKILLS = ['skill-creator'];
|
|
12
|
+
export function install_command(options) {
|
|
13
|
+
const skill_name = options.skill_name;
|
|
14
|
+
// Validate skill name
|
|
15
|
+
if (!skill_name) {
|
|
16
|
+
error('Skill name required');
|
|
17
|
+
console.log('\nUsage:');
|
|
18
|
+
console.log(' claude-skills install <skill-name>');
|
|
19
|
+
console.log('\nAvailable bundled skills:');
|
|
20
|
+
AVAILABLE_SKILLS.forEach((name) => console.log(` - ${name}`));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
if (!AVAILABLE_SKILLS.includes(skill_name)) {
|
|
24
|
+
error(`Unknown skill: ${skill_name}`);
|
|
25
|
+
console.log('\nAvailable bundled skills:');
|
|
26
|
+
AVAILABLE_SKILLS.forEach((name) => console.log(` - ${name}`));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
// Source and destination paths
|
|
30
|
+
const source_path = join(BUNDLED_SKILLS_DIR, skill_name);
|
|
31
|
+
const dest_path = join('.claude', 'skills', skill_name);
|
|
32
|
+
// Check if source exists in bundle
|
|
33
|
+
if (!existsSync(source_path)) {
|
|
34
|
+
error(`Bundled skill not found: ${skill_name}`);
|
|
35
|
+
console.log(`Expected at: ${source_path}\n\nThis may be a package installation issue.`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// Check if already installed
|
|
39
|
+
if (existsSync(dest_path)) {
|
|
40
|
+
if (options.force) {
|
|
41
|
+
info(`Skill already exists at ${dest_path}, overwriting (--force)...`);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
info(`Skill already installed at: ${dest_path}`);
|
|
45
|
+
console.log('\nUse --force to overwrite the existing skill.');
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Create destination directory
|
|
50
|
+
ensure_dir(join('.claude', 'skills'));
|
|
51
|
+
// Copy skill directory
|
|
52
|
+
try {
|
|
53
|
+
cpSync(source_path, dest_path, {
|
|
54
|
+
recursive: true,
|
|
55
|
+
force: options.force || false,
|
|
56
|
+
});
|
|
57
|
+
success(`Installed ${skill_name} to: ${dest_path}`);
|
|
58
|
+
// Skill-specific tips
|
|
59
|
+
if (skill_name === 'skill-creator') {
|
|
60
|
+
console.log('\nThis meta skill teaches principles for designing effective skills.');
|
|
61
|
+
console.log('Use it when creating new skills or planning skill architecture.');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
error(`Failed to install skill: ${err.message}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/package.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { basename, join } from 'path';
|
|
2
|
-
import { existsSync, statSync, readdirSync } from 'fs';
|
|
3
1
|
import archiver from 'archiver';
|
|
4
|
-
import { createWriteStream } from 'fs';
|
|
2
|
+
import { createWriteStream, existsSync, readdirSync, statSync, } from 'node:fs';
|
|
3
|
+
import { basename, join } from 'node:path';
|
|
5
4
|
import { SkillValidator } from '../core/validator.js';
|
|
6
5
|
import { ensure_dir } from '../utils/fs.js';
|
|
7
|
-
import { error,
|
|
6
|
+
import { error, package_, search, step, success, upload, } from '../utils/output.js';
|
|
8
7
|
function validate_skill(skill_path) {
|
|
9
8
|
search('Validating skill...');
|
|
10
9
|
const validator = new SkillValidator(skill_path);
|
|
@@ -64,13 +63,10 @@ function package_skill(skill_path, output_dir) {
|
|
|
64
63
|
continue;
|
|
65
64
|
}
|
|
66
65
|
// Skip common temporary files
|
|
67
|
-
if (item.endsWith('.
|
|
68
|
-
item.endsWith('.pyo') ||
|
|
69
|
-
item.endsWith('.swp') ||
|
|
70
|
-
item.endsWith('~')) {
|
|
66
|
+
if (item.endsWith('.swp') || item.endsWith('~')) {
|
|
71
67
|
continue;
|
|
72
68
|
}
|
|
73
|
-
if (item === '
|
|
69
|
+
if (item === '.DS_Store') {
|
|
74
70
|
continue;
|
|
75
71
|
}
|
|
76
72
|
if (stats.isDirectory()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/commands/package.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/commands/package.ts"],"names":[],"mappings":"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"}
|