@xelandernt/skilly 0.0.28 → 0.0.29
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 +90 -133
- package/dist/src/lib/launcher.js +2 -2
- package/dist/src/lib/targets.js +7 -6
- package/package.json +33 -32
- package/vendor/aarch64-apple-darwin/skilly +0 -0
- package/vendor/x86_64-apple-darwin/skilly +0 -0
- package/vendor/x86_64-pc-windows-msvc/skilly.exe +0 -0
- package/vendor/x86_64-unknown-linux-gnu/skilly +0 -0
package/README.md
CHANGED
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
[](https://www.npmjs.com/package/@xelandernt/skilly)
|
|
2
|
+
[](https://pypi.org/project/skilly/)
|
|
3
3
|
[](https://github.com/facebook/pyrefly)
|
|
4
4
|
[](https://github.com/xelandernt/skilly/stargazers)
|
|
5
|
+
[](https://www.npmjs.com/package/@xelandernt/skilly)
|
|
5
6
|
[](https://pepy.tech/projects/skilly)
|
|
6
|
-
[](https://github.com/xelandernt/skilly/blob/main/LICENSE)
|
|
8
|
+
|
|
8
9
|
# skilly
|
|
9
10
|
|
|
10
|
-
Manage [Agent Skills](https://agentskills.io/specification) from the command line
|
|
11
|
-
|
|
11
|
+
Manage [Agent Skills](https://agentskills.io/specification) from the command line or Python.
|
|
12
|
+
|
|
13
|
+
`skilly` creates specification-compliant skills, installs skills from GitHub or Python dependencies, and keeps managed skills up to date.
|
|
14
|
+
|
|
15
|
+
## Table of Contents
|
|
12
16
|
|
|
13
|
-
|
|
14
|
-
Python
|
|
17
|
+
- [Installation](#installation)
|
|
18
|
+
- [Python](#python)
|
|
19
|
+
- [Node](#node)
|
|
20
|
+
- [Homebrew](#homebrew)
|
|
21
|
+
- [Info](#info)
|
|
22
|
+
- [Quick Start](#quick-start)
|
|
23
|
+
- [CLI Commands](#cli-commands)
|
|
24
|
+
- [Create Skills](#create-skills)
|
|
25
|
+
- [Install Dependency Skills](#install-dependency-skills)
|
|
26
|
+
- [Install GitHub Skills](#install-github-skills)
|
|
27
|
+
- [Destinations](#destinations)
|
|
28
|
+
- [GitHub Authentication](#github-authentication)
|
|
29
|
+
- [Python API](#python-api)
|
|
30
|
+
- [Development](#development)
|
|
31
|
+
- [License](#license)
|
|
15
32
|
|
|
16
33
|
## Installation
|
|
17
34
|
|
|
18
|
-
Run with `uvx`:
|
|
19
|
-
```shell
|
|
20
|
-
uvx skilly --help
|
|
21
35
|
|
|
36
|
+
### Python
|
|
37
|
+
```shell
|
|
38
|
+
uvx skilly --help # run on-the-fly
|
|
39
|
+
pip install skilly # or install persistently
|
|
22
40
|
```
|
|
23
41
|
|
|
24
|
-
|
|
42
|
+
### Node
|
|
25
43
|
```shell
|
|
26
44
|
npx @xelandernt/skilly --help
|
|
27
45
|
```
|
|
28
46
|
|
|
29
|
-
Install the native CLI with Homebrew from this repository's tap:
|
|
30
47
|
|
|
48
|
+
### Homebrew
|
|
31
49
|
```shell
|
|
32
50
|
brew tap xelandernt/skilly https://github.com/xelandernt/skilly
|
|
33
51
|
brew install xelandernt/skilly/skilly
|
|
34
52
|
```
|
|
35
53
|
|
|
36
|
-
|
|
37
|
-
import surface as well:
|
|
54
|
+
### Info
|
|
38
55
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
`skilly`. The current npm support matrix is macOS arm64/x64, Linux x64
|
|
45
|
-
(glibc), and Windows x64.
|
|
56
|
+
| Method | Ships |
|
|
57
|
+
|---------------|------------------------------------------------------------------------------------------------------|
|
|
58
|
+
| `uvx` / `pip` | Python package with import surface + CLI (pre-built wheels: Linux x64, macOS arm64/x64, Windows x64) |
|
|
59
|
+
| `npx` | Native Rust CLI (macOS arm64/x64, Linux x64 glibc, Windows x64) |
|
|
60
|
+
| `brew` | Native Rust CLI (macOS arm64/x64, Linux x64) |
|
|
46
61
|
|
|
47
62
|
## Quick Start
|
|
48
63
|
|
|
49
|
-
Scan the current Python project for skills shipped by its dependencies:
|
|
50
|
-
|
|
51
|
-
```shell
|
|
52
|
-
uvx skilly scan
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Download a skill from GitHub:
|
|
56
|
-
|
|
57
|
-
```shell
|
|
58
|
-
uvx skilly download https://github.com/example/project/tree/main/skills/code-review
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Inspect installed skills:
|
|
62
|
-
|
|
63
64
|
```shell
|
|
64
|
-
uvx skilly
|
|
65
|
+
uvx skilly scan # Find skills from Python dependencies
|
|
66
|
+
uvx skilly download <github-url> # Install skills from GitHub
|
|
67
|
+
uvx skilly list # Browse installed skills
|
|
68
|
+
uvx skilly update # Preview available updates
|
|
65
69
|
```
|
|
66
70
|
|
|
67
71
|
## CLI Commands
|
|
68
72
|
|
|
69
73
|
| Command | Purpose |
|
|
70
|
-
|
|
71
|
-
| `
|
|
72
|
-
| `
|
|
73
|
-
| `
|
|
74
|
-
| `
|
|
75
|
-
| `
|
|
76
|
-
| `
|
|
77
|
-
| `
|
|
74
|
+
|---------|---------|
|
|
75
|
+
| `scan` | Find skills provided by the project's Python dependencies |
|
|
76
|
+
| `download <github-url>` | Install one or more skills from GitHub |
|
|
77
|
+
| `list` | Browse, update, or remove installed skills |
|
|
78
|
+
| `update` | Preview available updates; `--yes` applies all |
|
|
79
|
+
| `remove <name>` | Remove an installed skill by directory name |
|
|
80
|
+
| `skillsmp search <query>` | Search SkillsMP and install a selected result |
|
|
81
|
+
| `create` | Create a valid skill through a terminal wizard or explicit options |
|
|
78
82
|
|
|
79
|
-
|
|
83
|
+
Run `skilly <command> --help` for all options.
|
|
80
84
|
|
|
81
85
|
### Create Skills
|
|
82
86
|
|
|
83
|
-
Interactive terminals open a full-screen editor
|
|
84
|
-
Agent Skills fields. `Ctrl+S` creates the skill, `Ctrl+X` cancels, and `Enter`
|
|
85
|
-
in the multi-line editors inserts real line breaks.
|
|
86
|
-
|
|
87
|
-
For scripts and automation, provide the required name and description:
|
|
87
|
+
Interactive terminals open a full-screen editor. `Ctrl+S` creates the skill, `Ctrl+X` cancels.
|
|
88
88
|
|
|
89
89
|
```shell
|
|
90
90
|
uvx skilly create deployment-checks \
|
|
@@ -97,22 +97,20 @@ Run the deployment checklist and report blockers." \
|
|
|
97
97
|
--yes
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
-
Existing skills are rejected
|
|
101
|
-
atomically. See `uvx skilly create --help` for the complete contract.
|
|
100
|
+
Existing skills are rejected unless `--overwrite` is passed.
|
|
102
101
|
|
|
103
102
|
### Install Dependency Skills
|
|
104
103
|
|
|
105
|
-
`
|
|
106
|
-
skills shipped by direct, development, and optional dependencies:
|
|
104
|
+
`skilly scan` reads `pyproject.toml` and the project's `.venv`, then surfaces skills shipped by dependencies:
|
|
107
105
|
|
|
108
106
|
```shell
|
|
109
107
|
uvx skilly scan
|
|
110
108
|
```
|
|
111
109
|
|
|
112
|
-
|
|
110
|
+
Include or exclude specific extras and dependency groups (flags are repeatable):
|
|
113
111
|
|
|
114
112
|
```shell
|
|
115
|
-
uvx skilly scan --group dev --exclude-extra docs
|
|
113
|
+
uvx skilly scan --group dev --group test --exclude-extra docs
|
|
116
114
|
```
|
|
117
115
|
|
|
118
116
|
### Install GitHub Skills
|
|
@@ -121,86 +119,63 @@ uvx skilly scan --group dev --exclude-extra docs
|
|
|
121
119
|
uvx skilly download https://github.com/example/project
|
|
122
120
|
```
|
|
123
121
|
|
|
124
|
-
When a repository contains multiple skills
|
|
122
|
+
When a repository contains multiple skills:
|
|
125
123
|
|
|
126
124
|
```shell
|
|
127
|
-
uvx skilly download https://github.com/example/project --skill-name code-review
|
|
128
125
|
uvx skilly download https://github.com/example/project --all
|
|
126
|
+
uvx skilly download https://github.com/example/project --skill-name code-review
|
|
129
127
|
```
|
|
130
128
|
|
|
131
129
|
### Destinations
|
|
132
130
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
| Option | Destination |
|
|
136
|
-
| --- | --- |
|
|
137
|
-
| `--local` | Project-local skills directory. |
|
|
138
|
-
| `--global` | User-global skills directory. |
|
|
139
|
-
| `--claude` | Claude skills directory. |
|
|
140
|
-
| `--codex` | Codex skills directory. |
|
|
141
|
-
| `--copilot` | GitHub Copilot skills directory. |
|
|
142
|
-
| `--directory <path>` | Explicit directory; overrides all other destination options. |
|
|
143
|
-
|
|
144
|
-
Without destination options, `skilly` uses `.agents/skills`.
|
|
145
|
-
|
|
146
|
-
Set `SKILLY_DIRECTORY` to change that default without passing `--directory`
|
|
147
|
-
every time:
|
|
131
|
+
All management commands accept the same destination options:
|
|
148
132
|
|
|
149
133
|
```shell
|
|
150
|
-
|
|
151
|
-
skilly list
|
|
134
|
+
uvx skilly list --local # .agents/skills
|
|
135
|
+
uvx skilly list --global # ~/.agents/skills
|
|
136
|
+
uvx skilly list --claude # .claude/skills
|
|
137
|
+
uvx skilly list --codex # .codex/skills
|
|
138
|
+
uvx skilly list --copilot # .github/skills (local), ~/.copilot/skills (global)
|
|
139
|
+
uvx skilly list --directory ~/custom # Explicit directory
|
|
152
140
|
```
|
|
153
141
|
|
|
154
|
-
|
|
155
|
-
|
|
142
|
+
| Flags | Resolved destination |
|
|
143
|
+
|----------------------|-------------------------------------------------------|
|
|
144
|
+
| _none_ | `SKILLY_DIRECTORY` if set, otherwise `.agents/skills` |
|
|
145
|
+
| `--local` | `.agents/skills` |
|
|
146
|
+
| `--global` | `~/.agents/skills` |
|
|
147
|
+
| `--claude` | `.claude/skills` |
|
|
148
|
+
| `--claude --global` | `~/.claude/skills` |
|
|
149
|
+
| `--codex` | `.codex/skills` |
|
|
150
|
+
| `--codex --global` | `~/.codex/skills` |
|
|
151
|
+
| `--copilot` | `.github/skills` |
|
|
152
|
+
| `--copilot --global` | `~/.copilot/skills` |
|
|
153
|
+
| `--directory <path>` | That directory (after `~` expansion) |
|
|
154
|
+
|
|
155
|
+
Set a default destination:
|
|
156
156
|
|
|
157
157
|
```shell
|
|
158
|
-
|
|
159
|
-
uvx skilly list --local --claude
|
|
158
|
+
export SKILLY_DIRECTORY="$HOME/.config/skilly/skills"
|
|
160
159
|
```
|
|
161
160
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
`skilly` resolves destination paths before use. Relative paths become absolute
|
|
165
|
-
from the current working directory, and `--directory "~/.copilot"` expands `~`
|
|
166
|
-
to your home directory.
|
|
167
|
-
|
|
168
|
-
| Flags | Resolved destination |
|
|
169
|
-
|----------------------|---------------------------------------------------------------------------|
|
|
170
|
-
| _none_ | `SKILLY_DIRECTORY` when set, otherwise `.agents/skills` |
|
|
171
|
-
| `--local` | `.agents/skills` |
|
|
172
|
-
| `--global` | `~/.agents/skills` |
|
|
173
|
-
| `--claude` | `.claude/skills` |
|
|
174
|
-
| `--claude --global` | `~/.claude/skills` |
|
|
175
|
-
| `--codex` | `.codex/skills` |
|
|
176
|
-
| `--codex --global` | `~/.codex/skills` |
|
|
177
|
-
| `--copilot` | `.github/skills` |
|
|
178
|
-
| `--copilot --global` | `~/.copilot/skills` |
|
|
179
|
-
| `--directory <path>` | Exactly that directory, after `~` expansion and absolute-path resolution. |
|
|
180
|
-
|
|
181
|
-
`--directory` overrides `--local`, `--global`, `--claude`, `--codex`, and
|
|
182
|
-
`--copilot`.
|
|
161
|
+
`--directory` overrides all other destination options and `SKILLY_DIRECTORY`.
|
|
183
162
|
|
|
184
163
|
### GitHub Authentication
|
|
185
164
|
|
|
186
|
-
|
|
187
|
-
available token:
|
|
165
|
+
Set a token for higher API rate limits (first available wins: `SKILLY_GITHUB_TOKEN`, `GITHUB_TOKEN`, `GH_TOKEN`):
|
|
188
166
|
|
|
189
167
|
```shell
|
|
190
168
|
export SKILLY_GITHUB_TOKEN=ghp_your_token
|
|
191
|
-
# or GITHUB_TOKEN / GH_TOKEN
|
|
192
169
|
```
|
|
193
170
|
|
|
194
|
-
GitHub-fetching commands also accept `--github-token`.
|
|
171
|
+
All GitHub-fetching commands also accept `--github-token`.
|
|
195
172
|
|
|
196
173
|
## Python API
|
|
197
174
|
|
|
198
|
-
`SkillRepository`
|
|
199
|
-
project settings, or custom filesystem once and reuse it:
|
|
175
|
+
`SkillRepository` bundles a directory and project settings for stateful workflows:
|
|
200
176
|
|
|
201
177
|
```python
|
|
202
178
|
from pathlib import Path
|
|
203
|
-
|
|
204
179
|
from skilly import ProjectSettings, Skill, SkillRepository
|
|
205
180
|
|
|
206
181
|
repository = SkillRepository(
|
|
@@ -211,7 +186,7 @@ repository = SkillRepository(
|
|
|
211
186
|
),
|
|
212
187
|
)
|
|
213
188
|
|
|
214
|
-
|
|
189
|
+
repository.install(
|
|
215
190
|
Skill(
|
|
216
191
|
name="code-review",
|
|
217
192
|
description="Review code for correctness and maintainability.",
|
|
@@ -223,7 +198,7 @@ for match in repository.scan_project():
|
|
|
223
198
|
print(match.available.name, match.status)
|
|
224
199
|
```
|
|
225
200
|
|
|
226
|
-
|
|
201
|
+
Stateless discovery functions for one-shot reads:
|
|
227
202
|
|
|
228
203
|
```python
|
|
229
204
|
from skilly import discover_installed_skills, discover_venv_skills
|
|
@@ -232,8 +207,7 @@ installed = discover_installed_skills()
|
|
|
232
207
|
dependency_skills = discover_venv_skills()
|
|
233
208
|
```
|
|
234
209
|
|
|
235
|
-
|
|
236
|
-
same result types without blocking the event loop:
|
|
210
|
+
SkillsMP client with typed results:
|
|
237
211
|
|
|
238
212
|
```python
|
|
239
213
|
from skilly.skillsmp import ClientSettings, SkillsMp, SkillsMpSearchQuery
|
|
@@ -245,28 +219,11 @@ print(result.data.skills[0].github_url)
|
|
|
245
219
|
|
|
246
220
|
## Development
|
|
247
221
|
|
|
248
|
-
Install development dependencies and the editable extension:
|
|
249
|
-
|
|
250
|
-
```shell
|
|
251
|
-
just install
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
Run the required quality gates:
|
|
255
|
-
|
|
256
|
-
```shell
|
|
257
|
-
just lint
|
|
258
|
-
just test
|
|
259
|
-
just typecheck
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
The TypeScript launcher package also has dedicated helpers:
|
|
263
|
-
|
|
264
222
|
```shell
|
|
265
|
-
just
|
|
266
|
-
just
|
|
267
|
-
just
|
|
268
|
-
just
|
|
269
|
-
just ts::publish-dry-run
|
|
223
|
+
just install # Install dev dependencies + editable extension
|
|
224
|
+
just lint # Run linters
|
|
225
|
+
just test # Run tests
|
|
226
|
+
just typecheck # Run type checkers
|
|
270
227
|
```
|
|
271
228
|
|
|
272
229
|
## License
|
package/dist/src/lib/launcher.js
CHANGED
|
@@ -7,9 +7,9 @@ exports.resolveBinaryPath = resolveBinaryPath;
|
|
|
7
7
|
exports.ensureBinaryExists = ensureBinaryExists;
|
|
8
8
|
exports.launch = launch;
|
|
9
9
|
exports.run = run;
|
|
10
|
+
const node_child_process_1 = require("node:child_process");
|
|
10
11
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
11
12
|
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
-
const node_child_process_1 = require("node:child_process");
|
|
13
13
|
const targets_1 = require("./targets");
|
|
14
14
|
function resolveBinaryPath(options = {}) {
|
|
15
15
|
const rootDir = options.rootDir ?? node_path_1.default.resolve(__dirname, "..", "..", "..");
|
|
@@ -33,7 +33,7 @@ function launch(argv, options = {}) {
|
|
|
33
33
|
const child = spawnImpl(binaryPath, argv, {
|
|
34
34
|
env: processLike.env,
|
|
35
35
|
stdio: "inherit",
|
|
36
|
-
windowsHide: false
|
|
36
|
+
windowsHide: false,
|
|
37
37
|
});
|
|
38
38
|
return { child, binaryPath };
|
|
39
39
|
}
|
package/dist/src/lib/targets.js
CHANGED
|
@@ -17,27 +17,27 @@ exports.TARGETS = [
|
|
|
17
17
|
platform: "darwin",
|
|
18
18
|
arch: "arm64",
|
|
19
19
|
triple: "aarch64-apple-darwin",
|
|
20
|
-
label: "macOS arm64"
|
|
20
|
+
label: "macOS arm64",
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
platform: "darwin",
|
|
24
24
|
arch: "x64",
|
|
25
25
|
triple: "x86_64-apple-darwin",
|
|
26
|
-
label: "macOS x64"
|
|
26
|
+
label: "macOS x64",
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
platform: "linux",
|
|
30
30
|
arch: "x64",
|
|
31
31
|
libc: "glibc",
|
|
32
32
|
triple: "x86_64-unknown-linux-gnu",
|
|
33
|
-
label: "Linux x64 (glibc)"
|
|
33
|
+
label: "Linux x64 (glibc)",
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
platform: "win32",
|
|
37
37
|
arch: "x64",
|
|
38
38
|
triple: "x86_64-pc-windows-msvc",
|
|
39
|
-
label: "Windows x64"
|
|
40
|
-
}
|
|
39
|
+
label: "Windows x64",
|
|
40
|
+
},
|
|
41
41
|
];
|
|
42
42
|
function supportedTargetLabels() {
|
|
43
43
|
return exports.TARGETS.map((target) => target.label);
|
|
@@ -75,7 +75,8 @@ function unsupportedPlatformError(processLike = process) {
|
|
|
75
75
|
function resolveTarget(processLike = process) {
|
|
76
76
|
const libc = detectLinuxLibc(processLike);
|
|
77
77
|
const target = exports.TARGETS.find((candidate) => {
|
|
78
|
-
if (candidate.platform !== processLike.platform ||
|
|
78
|
+
if (candidate.platform !== processLike.platform ||
|
|
79
|
+
candidate.arch !== processLike.arch) {
|
|
79
80
|
return false;
|
|
80
81
|
}
|
|
81
82
|
if (candidate.platform !== "linux") {
|
package/package.json
CHANGED
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
2
|
+
"name": "@xelandernt/skilly",
|
|
3
|
+
"version": "0.0.29",
|
|
4
|
+
"description": "Native npm launcher for the skilly CLI.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"bin": {
|
|
7
|
+
"skilly": "dist/src/bin/skilly.js"
|
|
8
|
+
},
|
|
9
|
+
"type": "commonjs",
|
|
10
|
+
"files": [
|
|
11
|
+
"README.md",
|
|
12
|
+
"dist/src/bin",
|
|
13
|
+
"dist/src/lib",
|
|
14
|
+
"vendor"
|
|
15
|
+
],
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=18"
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -p tsconfig.json",
|
|
24
|
+
"stage-local-binary": "npm run build && node ./dist/scripts/stage-local-binary.js",
|
|
25
|
+
"sync-readme": "node ./dist/scripts/sync-readme.js",
|
|
26
|
+
"test": "npm run build && node --test ./dist/test/targets.test.js ./dist/test/launcher.test.js",
|
|
27
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
28
|
+
"prepack": "npm run build && npm run sync-readme"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@biomejs/biome": "2.4.16",
|
|
32
|
+
"@types/node": "^22.16.5",
|
|
33
|
+
"typescript": "^5.8.3"
|
|
34
|
+
}
|
|
34
35
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|