overskill 1.0.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/LICENSE +21 -0
- package/README.md +261 -0
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +121 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/bundle.d.ts +3 -0
- package/dist/commands/bundle.d.ts.map +1 -0
- package/dist/commands/bundle.js +58 -0
- package/dist/commands/bundle.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +109 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +64 -0
- package/dist/commands/delete.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/edit.d.ts +3 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +69 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/import.d.ts +3 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +514 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/info.d.ts +3 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +89 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +88 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +84 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +143 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/new.d.ts +3 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +262 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/publish.d.ts +3 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +215 -0
- package/dist/commands/publish.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 +151 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/registry.d.ts +3 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +169 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/remove.d.ts +3 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +48 -0
- package/dist/commands/remove.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 +48 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +160 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +130 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +94 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +60 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +340 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +78 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +241 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config.d.ts +94 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +294 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/editor.d.ts +6 -0
- package/dist/lib/editor.d.ts.map +1 -0
- package/dist/lib/editor.js +60 -0
- package/dist/lib/editor.js.map +1 -0
- package/dist/lib/fs.d.ts +74 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +235 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/index-gen.d.ts +18 -0
- package/dist/lib/index-gen.d.ts.map +1 -0
- package/dist/lib/index-gen.js +75 -0
- package/dist/lib/index-gen.js.map +1 -0
- package/dist/lib/local-registry/index.d.ts +15 -0
- package/dist/lib/local-registry/index.d.ts.map +1 -0
- package/dist/lib/local-registry/index.js +18 -0
- package/dist/lib/local-registry/index.js.map +1 -0
- package/dist/lib/local-registry/objects.d.ts +51 -0
- package/dist/lib/local-registry/objects.d.ts.map +1 -0
- package/dist/lib/local-registry/objects.js +148 -0
- package/dist/lib/local-registry/objects.js.map +1 -0
- package/dist/lib/local-registry/paths.d.ts +53 -0
- package/dist/lib/local-registry/paths.d.ts.map +1 -0
- package/dist/lib/local-registry/paths.js +85 -0
- package/dist/lib/local-registry/paths.js.map +1 -0
- package/dist/lib/local-registry/skills.d.ts +83 -0
- package/dist/lib/local-registry/skills.d.ts.map +1 -0
- package/dist/lib/local-registry/skills.js +261 -0
- package/dist/lib/local-registry/skills.js.map +1 -0
- package/dist/lib/local-registry/types.d.ts +79 -0
- package/dist/lib/local-registry/types.d.ts.map +1 -0
- package/dist/lib/local-registry/types.js +5 -0
- package/dist/lib/local-registry/types.js.map +1 -0
- package/dist/lib/local-registry/versions.d.ts +61 -0
- package/dist/lib/local-registry/versions.d.ts.map +1 -0
- package/dist/lib/local-registry/versions.js +163 -0
- package/dist/lib/local-registry/versions.js.map +1 -0
- package/dist/lib/lockfile.d.ts +38 -0
- package/dist/lib/lockfile.d.ts.map +1 -0
- package/dist/lib/lockfile.js +102 -0
- package/dist/lib/lockfile.js.map +1 -0
- package/dist/lib/meta-skill.d.ts +6 -0
- package/dist/lib/meta-skill.d.ts.map +1 -0
- package/dist/lib/meta-skill.js +72 -0
- package/dist/lib/meta-skill.js.map +1 -0
- package/dist/lib/semver.d.ts +63 -0
- package/dist/lib/semver.d.ts.map +1 -0
- package/dist/lib/semver.js +107 -0
- package/dist/lib/semver.js.map +1 -0
- package/dist/types.d.ts +147 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jacob Chase-Lubitz
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Overskill
|
|
2
|
+
|
|
3
|
+
A CLI for managing skills across repositories.
|
|
4
|
+
|
|
5
|
+
## Why Overskill over AI Agent Plugins?
|
|
6
|
+
|
|
7
|
+
Tools like Claude Code offer built-in plugin systems for distributing skills. Overskill takes a different approach — skills live in your repo as plain files — and this comes with meaningful advantages:
|
|
8
|
+
|
|
9
|
+
- **Agent-agnostic**: Overskill skills work with Claude Code, Cursor, Codex, Windsurf, and any agent that can read markdown. Plugins lock you into a single tool.
|
|
10
|
+
- **Transparent and auditable**: Skills are visible files in your project. You can read, diff, and review them like any other code. Plugin skills are buried in global cache directories.
|
|
11
|
+
- **Version-locked per repo**: `.skills.lock` pins exact versions and hashes to each commit, giving you reproducible builds. Plugins are installed globally or per-user with no per-repo lockfile.
|
|
12
|
+
- **Team-friendly**: `skill sync` works like `npm install` — clone the repo, run one command, and everyone has the same skills at the same versions. Plugins require each developer to install them separately.
|
|
13
|
+
- **Full control over activation**: You decide how and when skills are loaded via `CLAUDE.md`, `.cursor/rules`, or `AGENTS.md`. Plugin activation is controlled by the agent vendor.
|
|
14
|
+
- **Works offline**: Once synced, skills are local files with no runtime dependency on external services.
|
|
15
|
+
- **No vendor dependency**: Your skills aren't tied to a plugin API that could change or be deprecated. They're markdown files — the most durable format there is.
|
|
16
|
+
|
|
17
|
+
## Requirements
|
|
18
|
+
|
|
19
|
+
- Node.js >= 18
|
|
20
|
+
|
|
21
|
+
## Setup
|
|
22
|
+
|
|
23
|
+
### CLI
|
|
24
|
+
|
|
25
|
+
1. Install dependencies and build:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
cd cli
|
|
29
|
+
npm install
|
|
30
|
+
npm run build
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
2. Run the CLI:
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
node dist/index.js --help
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Optional: link the CLI for a global `skill` command:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm link
|
|
44
|
+
skill --help
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## CLI Quick Start
|
|
48
|
+
|
|
49
|
+
### Local-Only Workflow (No Cloud)
|
|
50
|
+
|
|
51
|
+
1. Initialize a local-only project:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
skill init
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
2. Create a new skill:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
skill new my-skill
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
3. Add skills from local cache:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
skill add my-skill
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
4. Import skills from other tools (Claude, Cursor, Codex):
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
skill import
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Cloud Workflow (Coming Soon)
|
|
76
|
+
|
|
77
|
+
1. Configure the API URL:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
skill config api_url https://your-domain.example/api
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
2. Initialize with cloud registry:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
skill init --cloud --registry your-registry
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
3. Log in:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
skill login
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
4. Add and sync skills:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
skill add my-skill
|
|
99
|
+
skill sync
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Commands
|
|
103
|
+
|
|
104
|
+
### Configuration
|
|
105
|
+
|
|
106
|
+
- `skill config <key> [value]` - Get or set config (`api_url`, `editor`, `install_path`)
|
|
107
|
+
- `skill config show` - Show all config
|
|
108
|
+
- `skill config logout` - Clear authentication tokens
|
|
109
|
+
|
|
110
|
+
### Project Setup
|
|
111
|
+
|
|
112
|
+
- `skill init [options]` - Initialize `.skills.yaml` in current directory. Also configures AI agent integration files (see [AI Agent Integration](#ai-agent-integration)).
|
|
113
|
+
- `--cloud` - Include a cloud registry source
|
|
114
|
+
- `-u, --url <url>` - API URL for cloud registry (requires `--cloud`)
|
|
115
|
+
- `-r, --registry <slug>` - Cloud registry slug (requires `--cloud`)
|
|
116
|
+
- `-p, --path <path>` - Custom install path (default: `.skills`)
|
|
117
|
+
|
|
118
|
+
### Authentication
|
|
119
|
+
|
|
120
|
+
- `skill login [--manual]` - Authenticate with cloud registry (browser flow or manual code entry)
|
|
121
|
+
|
|
122
|
+
### Skill Creation & Management
|
|
123
|
+
|
|
124
|
+
- `skill new <slug> [options]` - Create a new skill in local registry
|
|
125
|
+
- `-n, --name <name>` - Display name
|
|
126
|
+
- `-d, --description <desc>` - Description
|
|
127
|
+
- `-t, --tags <tags>` - Comma-separated tags
|
|
128
|
+
- `-c, --compat <compat>` - Compatibility list (e.g., `claude,gpt4`)
|
|
129
|
+
- `-v, --version <version>` - Initial version (default: `1.0.0`)
|
|
130
|
+
- `-m, --metadata <key=value>` - Custom frontmatter metadata (repeatable)
|
|
131
|
+
- `--content <file>` - Read content from file instead of editor
|
|
132
|
+
- `--blank` - Open editor with blank content (frontmatter only)
|
|
133
|
+
- `--no-editor` - Skip editor, create with template
|
|
134
|
+
- `--no-add` - Skip adding to current project
|
|
135
|
+
- `--no-sync` - Skip automatic sync
|
|
136
|
+
|
|
137
|
+
- `skill publish <slug> [options]` - Publish a new version of existing skill
|
|
138
|
+
- `-v, --version <version>` - Explicit version number
|
|
139
|
+
- `--patch` - Bump patch version (1.0.0 → 1.0.1)
|
|
140
|
+
- `--minor` - Bump minor version (1.0.0 → 1.1.0)
|
|
141
|
+
- `--major` - Bump major version (1.0.0 → 2.0.0)
|
|
142
|
+
- `-m, --message <message>` - Changelog message
|
|
143
|
+
- `--content <file>` - Read content from file
|
|
144
|
+
- `--no-editor` - Skip editor, use current content
|
|
145
|
+
|
|
146
|
+
- `skill import [path] [options]` - Import skills from other AI tools
|
|
147
|
+
- `[path]` - Custom path to scan (optional)
|
|
148
|
+
- `-f, --force` - Overwrite existing skills
|
|
149
|
+
- `--add` - Add imported skills to `.skills.yaml`
|
|
150
|
+
- `--sync` - Run sync after importing (requires `--add`)
|
|
151
|
+
- `--dry-run` - Preview without making changes
|
|
152
|
+
- `-y, --yes` - Import all without prompting
|
|
153
|
+
|
|
154
|
+
### Project Operations
|
|
155
|
+
|
|
156
|
+
- `skill add [slugs...] [options]` - Add skills to project
|
|
157
|
+
- Interactive mode if no slugs provided (checkbox selection)
|
|
158
|
+
- `-v, --version <constraint>` - Version constraint (e.g., `>=1.0.0`, `^2.0.0`)
|
|
159
|
+
- `--no-sync` - Skip automatic sync after adding
|
|
160
|
+
|
|
161
|
+
- `skill remove <slugs...>` - Remove skills from project
|
|
162
|
+
|
|
163
|
+
- `skill sync [options]` - Sync configured skills to install directory. Also updates AI agent integration files (see [AI Agent Integration](#ai-agent-integration)).
|
|
164
|
+
- `-f, --force` - Force re-install even if unchanged
|
|
165
|
+
|
|
166
|
+
- `skill update [slug] [--check]` - Update to latest versions
|
|
167
|
+
|
|
168
|
+
### Discovery & Information
|
|
169
|
+
|
|
170
|
+
- `skill list [options]` - List available skills
|
|
171
|
+
- `--installed` - Show only installed skills in current project
|
|
172
|
+
- `--local` - Show only local registry skills
|
|
173
|
+
|
|
174
|
+
- `skill search <query> [options]` - Search for skills
|
|
175
|
+
- `-t, --tags <tags>` - Filter by tags
|
|
176
|
+
- `-c, --compat <compat>` - Filter by compatibility
|
|
177
|
+
|
|
178
|
+
- `skill info <slug> [options]` - Show detailed skill information
|
|
179
|
+
- `-v, --version <version>` - Show info for specific version
|
|
180
|
+
|
|
181
|
+
### Editing & Validation
|
|
182
|
+
|
|
183
|
+
- `skill edit <slug>` - Edit a local skill using configured editor
|
|
184
|
+
|
|
185
|
+
- `skill diff <slug>` - Show differences between local and registry versions
|
|
186
|
+
|
|
187
|
+
- `skill validate [slug]` - Validate skill files (validates all if no slug provided)
|
|
188
|
+
|
|
189
|
+
## Project Files
|
|
190
|
+
|
|
191
|
+
- `.skills.yaml` - Project config (sources, install path, skills list)
|
|
192
|
+
- `.skills.lock` - Version lock file (like package-lock.json)
|
|
193
|
+
- `.skills/` - Installed skills directory (default, configurable)
|
|
194
|
+
- `SKILLS_INDEX.md` - Generated index of installed skills for AI discovery
|
|
195
|
+
|
|
196
|
+
## AI Agent Integration
|
|
197
|
+
|
|
198
|
+
When you run `skill init` or `skill sync`, Overskill automatically configures your project so that AI coding agents discover and use your installed skills. It updates the following files:
|
|
199
|
+
|
|
200
|
+
- **`CLAUDE.md`** — Claude Code reads this file automatically. Overskill adds a managed section that points Claude to `SKILLS_INDEX.md`.
|
|
201
|
+
- **`AGENTS.md`** — Read by Codex and other agents. Same managed section as `CLAUDE.md`.
|
|
202
|
+
- **`.cursor/rules/overskill.mdc`** — Cursor rule with `alwaysApply: true` that tells Cursor to read the skills index.
|
|
203
|
+
|
|
204
|
+
The `CLAUDE.md` and `AGENTS.md` sections are wrapped in `<!-- overskill-start -->` / `<!-- overskill-end -->` comment markers so they can be updated idempotently without affecting the rest of the file. The Cursor rule is a standalone file that gets overwritten on each sync.
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
## Local Registry
|
|
208
|
+
|
|
209
|
+
Skills are cached locally in `~/.local/share/overskill/cache/` (Linux/macOS) or equivalent on Windows. The local registry supports:
|
|
210
|
+
|
|
211
|
+
- Creating skills with `skill new`
|
|
212
|
+
- Publishing versions with `skill publish`
|
|
213
|
+
- Importing from other tools with `skill import`
|
|
214
|
+
- Version resolution with semver constraints
|
|
215
|
+
|
|
216
|
+
# Coming for Cloud
|
|
217
|
+
|
|
218
|
+
### Commands for Cloud
|
|
219
|
+
|
|
220
|
+
- `skill login [--manual]` - Authenticate with cloud registry (browser flow or manual code entry)
|
|
221
|
+
|
|
222
|
+
- `skill config api_url <url>` - Set the API URL for the cloud registry
|
|
223
|
+
|
|
224
|
+
- `skill config registry <slug>` - Set the registry slug for the cloud registry
|
|
225
|
+
|
|
226
|
+
- `skill config install_path <path>` - Set the install path for the cloud registry
|
|
227
|
+
|
|
228
|
+
### Publishing & Sharing
|
|
229
|
+
|
|
230
|
+
- `skill push [slug] [--create ...]` - Publish changes to cloud registry
|
|
231
|
+
|
|
232
|
+
- `skill bundle [slugs...] [options]` - Bundle skills into single markdown file
|
|
233
|
+
- `[slugs...]` - Specific skills to bundle (bundles all if omitted)
|
|
234
|
+
- `-o, --output <path>` - Output file path (default: `skills-bundle.md`)
|
|
235
|
+
|
|
236
|
+
- `skill delete <skill>` - Delete skill from registry
|
|
237
|
+
- Local: `skill delete <slug>`
|
|
238
|
+
- Remote: `skill delete <registry>/<slug>`
|
|
239
|
+
|
|
240
|
+
### Registry Management
|
|
241
|
+
|
|
242
|
+
- `skill registry <subcommand>` - Manage registries and invitations
|
|
243
|
+
- See `skill registry --help` for subcommands
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
## Development
|
|
248
|
+
|
|
249
|
+
- CLI dev mode:
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
cd cli
|
|
253
|
+
npm run dev
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
- Typecheck:
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
cd cli
|
|
260
|
+
npm run typecheck
|
|
261
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,UAAU,SAsInB,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { checkbox } from '@inquirer/prompts';
|
|
5
|
+
import * as config from '../lib/config.js';
|
|
6
|
+
import * as localRegistry from '../lib/local-registry/index.js';
|
|
7
|
+
export const addCommand = new Command('add')
|
|
8
|
+
.description('Add one or more skills to the project')
|
|
9
|
+
.argument('[slugs...]', 'Skill slugs to add')
|
|
10
|
+
.option('-v, --version <constraint>', 'Version constraint (e.g., ">=1.0.0", "^2.0.0")')
|
|
11
|
+
.option('--no-sync', 'Skip automatic sync after adding')
|
|
12
|
+
.action(async (slugs, options) => {
|
|
13
|
+
try {
|
|
14
|
+
// Check if initialized
|
|
15
|
+
if (!config.configExists()) {
|
|
16
|
+
console.log(chalk.red('Error: Not in a skills project.'));
|
|
17
|
+
console.log(`Run ${chalk.cyan('skills init')} first.`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const skillsConfig = config.readConfig();
|
|
21
|
+
// If no slugs provided, show interactive selection
|
|
22
|
+
if (!slugs || slugs.length === 0) {
|
|
23
|
+
const allSkills = localRegistry.listSkills();
|
|
24
|
+
if (allSkills.length === 0) {
|
|
25
|
+
console.log(chalk.yellow('No skills available in local cache.'));
|
|
26
|
+
console.log('');
|
|
27
|
+
console.log('To add skills, either:');
|
|
28
|
+
console.log(` ${chalk.cyan('skills new <slug>')} Create a new skill`);
|
|
29
|
+
console.log(` ${chalk.cyan('skills cache import <path>')} Import from a file`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Filter out already added skills
|
|
33
|
+
const availableSkills = allSkills.filter((skill) => !skillsConfig.skills.find((s) => s.slug === skill.slug));
|
|
34
|
+
if (availableSkills.length === 0) {
|
|
35
|
+
console.log(chalk.yellow('All available skills are already added to this project.'));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Show interactive checkbox prompt
|
|
39
|
+
const selected = await checkbox({
|
|
40
|
+
message: 'Select skills to add (use spacebar to select, enter to confirm):',
|
|
41
|
+
choices: availableSkills.map((skill) => ({
|
|
42
|
+
name: `${chalk.green(skill.slug)} - ${skill.meta.description || 'No description'}`,
|
|
43
|
+
value: skill.slug,
|
|
44
|
+
})),
|
|
45
|
+
});
|
|
46
|
+
if (selected.length === 0) {
|
|
47
|
+
console.log(chalk.yellow('No skills selected.'));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
slugs = selected;
|
|
51
|
+
}
|
|
52
|
+
const addedSkills = [];
|
|
53
|
+
for (const slug of slugs) {
|
|
54
|
+
const spinner = ora(`Adding ${slug}...`).start();
|
|
55
|
+
try {
|
|
56
|
+
// Check if skill exists in local registry
|
|
57
|
+
if (!localRegistry.skillExists(slug)) {
|
|
58
|
+
spinner.fail(`Skill '${slug}' not found in local cache.`);
|
|
59
|
+
console.log('');
|
|
60
|
+
console.log('To add this skill, either:');
|
|
61
|
+
console.log(` ${chalk.cyan(`skills new ${slug}`)} Create it locally`);
|
|
62
|
+
console.log(` ${chalk.cyan(`skills cache import <path>`)} Import from a file`);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
// Get skill info from local registry
|
|
66
|
+
const skillInfo = localRegistry.getSkillInfo(slug);
|
|
67
|
+
if (!skillInfo) {
|
|
68
|
+
spinner.fail(`Could not read skill '${slug}' from cache.`);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Check if already added
|
|
72
|
+
const existing = skillsConfig.skills.find((s) => s.slug === slug);
|
|
73
|
+
if (existing) {
|
|
74
|
+
spinner.warn(`${slug} already added to project`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// Resolve version if constraint provided
|
|
78
|
+
let resolvedVersion = null;
|
|
79
|
+
if (options.version) {
|
|
80
|
+
resolvedVersion = localRegistry.resolveVersion(slug, options.version);
|
|
81
|
+
if (!resolvedVersion) {
|
|
82
|
+
const availableVersions = localRegistry.getVersionStrings(slug);
|
|
83
|
+
spinner.fail(`No cached version of '${slug}' satisfies '${options.version}'.`);
|
|
84
|
+
console.log(` Available versions: ${availableVersions.join(', ')}`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
resolvedVersion = localRegistry.getLatestVersion(slug);
|
|
90
|
+
}
|
|
91
|
+
// Add to config
|
|
92
|
+
const entry = {
|
|
93
|
+
slug,
|
|
94
|
+
};
|
|
95
|
+
if (options.version) {
|
|
96
|
+
entry.version = options.version;
|
|
97
|
+
}
|
|
98
|
+
config.addSkill(entry);
|
|
99
|
+
addedSkills.push(slug);
|
|
100
|
+
const displayVersion = resolvedVersion || localRegistry.getLatestVersion(slug);
|
|
101
|
+
spinner.succeed(`Added ${chalk.cyan(slug)} (v${displayVersion})`);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
spinner.fail(error instanceof Error ? error.message : String(error));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Sync if skills were added
|
|
108
|
+
if (addedSkills.length > 0 && options.sync !== false) {
|
|
109
|
+
console.log('');
|
|
110
|
+
console.log('Running sync...');
|
|
111
|
+
// Import sync command and run it
|
|
112
|
+
const { syncCommand } = await import('./sync.js');
|
|
113
|
+
await syncCommand.parseAsync(['node', 'skills', 'sync']);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/commands/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,aAAa,SA8DtB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as nodefs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import * as config from '../lib/config.js';
|
|
6
|
+
import * as fs from '../lib/fs.js';
|
|
7
|
+
import * as lockfile from '../lib/lockfile.js';
|
|
8
|
+
export const bundleCommand = new Command('bundle')
|
|
9
|
+
.description('Bundle all or selected skills into a single markdown file')
|
|
10
|
+
.argument('[slugs...]', 'Skill slugs to bundle (optional, bundles all if not provided)')
|
|
11
|
+
.option('-o, --output <path>', 'Output file path', 'skills-bundle.md')
|
|
12
|
+
.action(async (slugs, options) => {
|
|
13
|
+
try {
|
|
14
|
+
// Check if initialized
|
|
15
|
+
if (!config.configExists()) {
|
|
16
|
+
console.log(chalk.red('Error: Not in a skills project.'));
|
|
17
|
+
console.log(`Run ${chalk.cyan('skills init')} first.`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const skillsToBundle = slugs.length > 0 ? slugs : fs.listLocalSkills();
|
|
21
|
+
if (skillsToBundle.length === 0) {
|
|
22
|
+
console.log(chalk.yellow('No skills to bundle.'));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const lock = lockfile.readLockfile();
|
|
26
|
+
const bundleLines = [];
|
|
27
|
+
for (const slug of skillsToBundle) {
|
|
28
|
+
const content = fs.readSkillContent(slug);
|
|
29
|
+
if (!content) {
|
|
30
|
+
console.log(chalk.yellow(`Skipping ${slug}: not found locally`));
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const locked = lock?.skills.find((s) => s.slug === slug);
|
|
34
|
+
const registry = locked?.registry || 'unknown';
|
|
35
|
+
const version = locked?.version || 'unknown';
|
|
36
|
+
// Add separator and skill content
|
|
37
|
+
bundleLines.push(`<!-- === SKILL: ${slug} (${registry} v${version}) === -->`);
|
|
38
|
+
bundleLines.push('');
|
|
39
|
+
bundleLines.push(content.trim());
|
|
40
|
+
bundleLines.push('');
|
|
41
|
+
bundleLines.push('');
|
|
42
|
+
}
|
|
43
|
+
// Write bundle file
|
|
44
|
+
const projectRoot = config.findProjectRoot() || process.cwd();
|
|
45
|
+
const outputPath = path.isAbsolute(options.output)
|
|
46
|
+
? options.output
|
|
47
|
+
: path.join(projectRoot, options.output);
|
|
48
|
+
const bundleContent = bundleLines.join('\n');
|
|
49
|
+
nodefs.writeFileSync(outputPath, bundleContent, 'utf-8');
|
|
50
|
+
const sizeKb = (Buffer.byteLength(bundleContent, 'utf-8') / 1024).toFixed(1);
|
|
51
|
+
console.log(chalk.green(`Bundled ${skillsToBundle.length} skills into ${chalk.cyan(options.output)} (${sizeKb} KB)`));
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/commands/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SA4EtB,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import * as auth from "../lib/auth.js";
|
|
4
|
+
export const configCommand = new Command("config")
|
|
5
|
+
.description("Get or set CLI configuration")
|
|
6
|
+
.argument("<key>", "Configuration key (api_url, web_app_url, editor, install_path)")
|
|
7
|
+
.argument("[value]", "Value to set (omit to get current value)")
|
|
8
|
+
.action(async (key, value) => {
|
|
9
|
+
try {
|
|
10
|
+
const validKeys = [
|
|
11
|
+
"api_url",
|
|
12
|
+
// "api_key",
|
|
13
|
+
"web_app_url",
|
|
14
|
+
"editor",
|
|
15
|
+
"install_path",
|
|
16
|
+
];
|
|
17
|
+
if (!validKeys.includes(key)) {
|
|
18
|
+
console.log(chalk.red(`Error: Invalid config key '${key}'`));
|
|
19
|
+
console.log(`Valid keys: ${validKeys.join(", ")}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
if (value === undefined) {
|
|
23
|
+
// Get value
|
|
24
|
+
let currentValue;
|
|
25
|
+
switch (key) {
|
|
26
|
+
case "api_url":
|
|
27
|
+
currentValue = auth.getApiUrl();
|
|
28
|
+
break;
|
|
29
|
+
// case 'api_key':
|
|
30
|
+
// currentValue = auth.getApiKey();
|
|
31
|
+
// break;
|
|
32
|
+
case "web_app_url":
|
|
33
|
+
currentValue = auth.getWebAppUrl();
|
|
34
|
+
break;
|
|
35
|
+
case "editor":
|
|
36
|
+
currentValue = auth.getEditor();
|
|
37
|
+
break;
|
|
38
|
+
case "install_path":
|
|
39
|
+
currentValue = auth.getDefaultInstallPath();
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
if (currentValue) {
|
|
43
|
+
console.log(currentValue);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log(chalk.gray("(not set)"));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Set value
|
|
51
|
+
switch (key) {
|
|
52
|
+
case "api_url":
|
|
53
|
+
auth.setApiUrl(value);
|
|
54
|
+
break;
|
|
55
|
+
case "web_app_url":
|
|
56
|
+
auth.setWebAppUrl(value);
|
|
57
|
+
break;
|
|
58
|
+
case "editor":
|
|
59
|
+
auth.setEditor(value);
|
|
60
|
+
break;
|
|
61
|
+
case "install_path":
|
|
62
|
+
auth.setDefaultInstallPath(value);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
console.log(chalk.green(`Set ${key} = ${value}`));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error(chalk.red("Error:"), error instanceof Error ? error.message : error);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
// Add subcommand to show all config
|
|
74
|
+
configCommand
|
|
75
|
+
.command("show")
|
|
76
|
+
.description("Show all configuration")
|
|
77
|
+
.action(() => {
|
|
78
|
+
const allConfig = auth.getAll();
|
|
79
|
+
console.log(chalk.bold("CLI Configuration:"));
|
|
80
|
+
console.log(` Config file: ${chalk.gray(auth.getConfigPath())}`);
|
|
81
|
+
console.log("");
|
|
82
|
+
if (allConfig.api_url) {
|
|
83
|
+
console.log(` api_url: ${allConfig.api_url}`);
|
|
84
|
+
}
|
|
85
|
+
if (allConfig.web_app_url) {
|
|
86
|
+
console.log(` web_app_url: ${allConfig.web_app_url}`);
|
|
87
|
+
}
|
|
88
|
+
if (allConfig.editor) {
|
|
89
|
+
console.log(` editor: ${allConfig.editor}`);
|
|
90
|
+
}
|
|
91
|
+
if (allConfig.install_path) {
|
|
92
|
+
console.log(` install_path: ${allConfig.install_path}`);
|
|
93
|
+
}
|
|
94
|
+
if (allConfig.access_token) {
|
|
95
|
+
console.log(` logged_in: ${chalk.green("yes")}`);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
console.log(` logged_in: ${chalk.gray("no")}`);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
// Add logout subcommand
|
|
102
|
+
configCommand
|
|
103
|
+
.command("logout")
|
|
104
|
+
.description("Clear authentication tokens")
|
|
105
|
+
.action(() => {
|
|
106
|
+
auth.clearTokens();
|
|
107
|
+
console.log(chalk.green("Logged out successfully."));
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SA2DtB,CAAC"}
|