@xelandernt/skilly 0.0.26 → 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 +94 -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,89 +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
|
+
|
|
7
9
|
# skilly
|
|
8
10
|
|
|
9
|
-
Manage [Agent Skills](https://agentskills.io/specification) from the command line
|
|
10
|
-
|
|
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
|
|
11
16
|
|
|
12
|
-
|
|
13
|
-
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)
|
|
14
32
|
|
|
15
33
|
## Installation
|
|
16
34
|
|
|
17
|
-
Run with `uvx`:
|
|
18
|
-
```shell
|
|
19
|
-
uvx skilly --help
|
|
20
35
|
|
|
36
|
+
### Python
|
|
37
|
+
```shell
|
|
38
|
+
uvx skilly --help # run on-the-fly
|
|
39
|
+
pip install skilly # or install persistently
|
|
21
40
|
```
|
|
22
41
|
|
|
23
|
-
|
|
42
|
+
### Node
|
|
24
43
|
```shell
|
|
25
44
|
npx @xelandernt/skilly --help
|
|
26
45
|
```
|
|
27
46
|
|
|
28
|
-
Install the native CLI with Homebrew from this repository's tap:
|
|
29
47
|
|
|
48
|
+
### Homebrew
|
|
30
49
|
```shell
|
|
31
50
|
brew tap xelandernt/skilly https://github.com/xelandernt/skilly
|
|
32
51
|
brew install xelandernt/skilly/skilly
|
|
33
52
|
```
|
|
34
53
|
|
|
35
|
-
|
|
36
|
-
import surface as well:
|
|
54
|
+
### Info
|
|
37
55
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
`skilly`. The current npm support matrix is macOS arm64/x64, Linux x64
|
|
44
|
-
(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) |
|
|
45
61
|
|
|
46
62
|
## Quick Start
|
|
47
63
|
|
|
48
|
-
Scan the current Python project for skills shipped by its dependencies:
|
|
49
|
-
|
|
50
|
-
```shell
|
|
51
|
-
uvx skilly scan
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
Download a skill from GitHub:
|
|
55
|
-
|
|
56
|
-
```shell
|
|
57
|
-
uvx skilly download https://github.com/example/project/tree/main/skills/code-review
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
Inspect installed skills:
|
|
61
|
-
|
|
62
64
|
```shell
|
|
63
|
-
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
|
|
64
69
|
```
|
|
65
70
|
|
|
66
71
|
## CLI Commands
|
|
67
72
|
|
|
68
73
|
| Command | Purpose |
|
|
69
|
-
|
|
70
|
-
| `
|
|
71
|
-
| `
|
|
72
|
-
| `
|
|
73
|
-
| `
|
|
74
|
-
| `
|
|
75
|
-
| `
|
|
76
|
-
| `
|
|
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 |
|
|
77
82
|
|
|
78
|
-
|
|
83
|
+
Run `skilly <command> --help` for all options.
|
|
79
84
|
|
|
80
85
|
### Create Skills
|
|
81
86
|
|
|
82
|
-
Interactive terminals open a full-screen editor
|
|
83
|
-
Agent Skills fields. `Ctrl+S` creates the skill, `Ctrl+X` cancels, and `Enter`
|
|
84
|
-
in the multi-line editors inserts real line breaks.
|
|
85
|
-
|
|
86
|
-
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.
|
|
87
88
|
|
|
88
89
|
```shell
|
|
89
90
|
uvx skilly create deployment-checks \
|
|
@@ -96,22 +97,20 @@ Run the deployment checklist and report blockers." \
|
|
|
96
97
|
--yes
|
|
97
98
|
```
|
|
98
99
|
|
|
99
|
-
Existing skills are rejected
|
|
100
|
-
atomically. See `uvx skilly create --help` for the complete contract.
|
|
100
|
+
Existing skills are rejected unless `--overwrite` is passed.
|
|
101
101
|
|
|
102
102
|
### Install Dependency Skills
|
|
103
103
|
|
|
104
|
-
`
|
|
105
|
-
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:
|
|
106
105
|
|
|
107
106
|
```shell
|
|
108
107
|
uvx skilly scan
|
|
109
108
|
```
|
|
110
109
|
|
|
111
|
-
|
|
110
|
+
Include or exclude specific extras and dependency groups (flags are repeatable):
|
|
112
111
|
|
|
113
112
|
```shell
|
|
114
|
-
uvx skilly scan --
|
|
113
|
+
uvx skilly scan --group dev --group test --exclude-extra docs
|
|
115
114
|
```
|
|
116
115
|
|
|
117
116
|
### Install GitHub Skills
|
|
@@ -120,94 +119,74 @@ uvx skilly scan --no-dependency-groups --no-optional-dependencies
|
|
|
120
119
|
uvx skilly download https://github.com/example/project
|
|
121
120
|
```
|
|
122
121
|
|
|
123
|
-
When a repository contains multiple skills
|
|
122
|
+
When a repository contains multiple skills:
|
|
124
123
|
|
|
125
124
|
```shell
|
|
126
|
-
uvx skilly download https://github.com/example/project --skill-name code-review
|
|
127
125
|
uvx skilly download https://github.com/example/project --all
|
|
126
|
+
uvx skilly download https://github.com/example/project --skill-name code-review
|
|
128
127
|
```
|
|
129
128
|
|
|
130
129
|
### Destinations
|
|
131
130
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
| Option | Destination |
|
|
135
|
-
| --- | --- |
|
|
136
|
-
| `--local` | Project-local skills directory. |
|
|
137
|
-
| `--global` | User-global skills directory. |
|
|
138
|
-
| `--claude` | Claude skills directory. |
|
|
139
|
-
| `--codex` | Codex skills directory. |
|
|
140
|
-
| `--copilot` | GitHub Copilot skills directory. |
|
|
141
|
-
| `--directory <path>` | Explicit directory; overrides all other destination options. |
|
|
142
|
-
|
|
143
|
-
Without destination options, `skilly` uses `.agents/skills`.
|
|
144
|
-
|
|
145
|
-
Set `SKILLY_DIRECTORY` to change that default without passing `--directory`
|
|
146
|
-
every time:
|
|
131
|
+
All management commands accept the same destination options:
|
|
147
132
|
|
|
148
133
|
```shell
|
|
149
|
-
|
|
150
|
-
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
|
|
151
140
|
```
|
|
152
141
|
|
|
153
|
-
|
|
154
|
-
|
|
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:
|
|
155
156
|
|
|
156
157
|
```shell
|
|
157
|
-
|
|
158
|
-
uvx skilly list --local --claude
|
|
158
|
+
export SKILLY_DIRECTORY="$HOME/.config/skilly/skills"
|
|
159
159
|
```
|
|
160
160
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
`skilly` resolves destination paths before use. Relative paths become absolute
|
|
164
|
-
from the current working directory, and `--directory "~/.copilot"` expands `~`
|
|
165
|
-
to your home directory.
|
|
166
|
-
|
|
167
|
-
| Flags | Resolved destination |
|
|
168
|
-
|----------------------|---------------------------------------------------------------------------|
|
|
169
|
-
| _none_ | `SKILLY_DIRECTORY` when set, otherwise `.agents/skills` |
|
|
170
|
-
| `--local` | `.agents/skills` |
|
|
171
|
-
| `--global` | `~/.agents/skills` |
|
|
172
|
-
| `--claude` | `.claude/skills` |
|
|
173
|
-
| `--claude --global` | `~/.claude/skills` |
|
|
174
|
-
| `--codex` | `.codex/skills` |
|
|
175
|
-
| `--codex --global` | `~/.codex/skills` |
|
|
176
|
-
| `--copilot` | `.github/skills` |
|
|
177
|
-
| `--copilot --global` | `~/.copilot/skills` |
|
|
178
|
-
| `--directory <path>` | Exactly that directory, after `~` expansion and absolute-path resolution. |
|
|
179
|
-
|
|
180
|
-
`--directory` overrides `--local`, `--global`, `--claude`, `--codex`, and
|
|
181
|
-
`--copilot`.
|
|
161
|
+
`--directory` overrides all other destination options and `SKILLY_DIRECTORY`.
|
|
182
162
|
|
|
183
163
|
### GitHub Authentication
|
|
184
164
|
|
|
185
|
-
|
|
186
|
-
available token:
|
|
165
|
+
Set a token for higher API rate limits (first available wins: `SKILLY_GITHUB_TOKEN`, `GITHUB_TOKEN`, `GH_TOKEN`):
|
|
187
166
|
|
|
188
167
|
```shell
|
|
189
168
|
export SKILLY_GITHUB_TOKEN=ghp_your_token
|
|
190
|
-
# or GITHUB_TOKEN / GH_TOKEN
|
|
191
169
|
```
|
|
192
170
|
|
|
193
|
-
GitHub-fetching commands also accept `--github-token`.
|
|
171
|
+
All GitHub-fetching commands also accept `--github-token`.
|
|
194
172
|
|
|
195
173
|
## Python API
|
|
196
174
|
|
|
197
|
-
`SkillRepository`
|
|
198
|
-
project settings, or custom filesystem once and reuse it:
|
|
175
|
+
`SkillRepository` bundles a directory and project settings for stateful workflows:
|
|
199
176
|
|
|
200
177
|
```python
|
|
201
178
|
from pathlib import Path
|
|
202
|
-
|
|
203
179
|
from skilly import ProjectSettings, Skill, SkillRepository
|
|
204
180
|
|
|
205
181
|
repository = SkillRepository(
|
|
206
182
|
directory=Path(".agents/skills"),
|
|
207
|
-
project=ProjectSettings(
|
|
183
|
+
project=ProjectSettings(
|
|
184
|
+
dependency_groups=("dev",),
|
|
185
|
+
optional_dependencies=("docs",),
|
|
186
|
+
),
|
|
208
187
|
)
|
|
209
188
|
|
|
210
|
-
|
|
189
|
+
repository.install(
|
|
211
190
|
Skill(
|
|
212
191
|
name="code-review",
|
|
213
192
|
description="Review code for correctness and maintainability.",
|
|
@@ -219,7 +198,7 @@ for match in repository.scan_project():
|
|
|
219
198
|
print(match.available.name, match.status)
|
|
220
199
|
```
|
|
221
200
|
|
|
222
|
-
|
|
201
|
+
Stateless discovery functions for one-shot reads:
|
|
223
202
|
|
|
224
203
|
```python
|
|
225
204
|
from skilly import discover_installed_skills, discover_venv_skills
|
|
@@ -228,8 +207,7 @@ installed = discover_installed_skills()
|
|
|
228
207
|
dependency_skills = discover_venv_skills()
|
|
229
208
|
```
|
|
230
209
|
|
|
231
|
-
|
|
232
|
-
same result types without blocking the event loop:
|
|
210
|
+
SkillsMP client with typed results:
|
|
233
211
|
|
|
234
212
|
```python
|
|
235
213
|
from skilly.skillsmp import ClientSettings, SkillsMp, SkillsMpSearchQuery
|
|
@@ -241,28 +219,11 @@ print(result.data.skills[0].github_url)
|
|
|
241
219
|
|
|
242
220
|
## Development
|
|
243
221
|
|
|
244
|
-
Install development dependencies and the editable extension:
|
|
245
|
-
|
|
246
|
-
```shell
|
|
247
|
-
just install
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
Run the required quality gates:
|
|
251
|
-
|
|
252
|
-
```shell
|
|
253
|
-
just lint
|
|
254
|
-
just test
|
|
255
|
-
just typecheck
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
The TypeScript launcher package also has dedicated helpers:
|
|
259
|
-
|
|
260
222
|
```shell
|
|
261
|
-
just
|
|
262
|
-
just
|
|
263
|
-
just
|
|
264
|
-
just
|
|
265
|
-
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
|
|
266
227
|
```
|
|
267
228
|
|
|
268
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
|