@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 CHANGED
@@ -1,90 +1,90 @@
1
- [![npm](https://img.shields.io/npm/v/%40xelandernt%2Fskilly
2
- )](https://www.npmjs.com/package/@xelandernt/skilly)
1
+ [![npm](https://img.shields.io/npm/v/%40xelandernt%2Fskilly)](https://www.npmjs.com/package/@xelandernt/skilly)
2
+ [![pypi](https://img.shields.io/pypi/v/skilly)](https://pypi.org/project/skilly/)
3
3
  [![pyrefly](https://img.shields.io/endpoint?url=https://pyrefly.org/badge.json)](https://github.com/facebook/pyrefly)
4
4
  [![GitHub stars](https://img.shields.io/github/stars/xelandernt/skilly)](https://github.com/xelandernt/skilly/stargazers)
5
+ [![npm Downloads](https://img.shields.io/npm/dm/%40xelandernt%2Fskilly)](https://www.npmjs.com/package/@xelandernt/skilly)
5
6
  [![PyPI Downloads](https://static.pepy.tech/badge/skilly/month)](https://pepy.tech/projects/skilly)
6
- [![License](https://img.shields.io/github/license/xelandernt/skilly
7
- )](https://github.com/xelandernt/skilly/blob/main/LICENSE)
7
+ [![License](https://img.shields.io/github/license/xelandernt/skilly)](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
- or Python.
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
- `skilly` creates specification-compliant skills, installs skills from GitHub or
14
- Python dependencies, and keeps managed skills up to date.
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
- Run with `npx`:
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
- Homebrew installs the CLI only. Install the Python package when you need the
37
- import surface as well:
54
+ ### Info
38
55
 
39
- ```shell
40
- pip install skilly
41
- ```
42
-
43
- The npm package ships the same native Rust CLI behind the executable name
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 list
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
- | `uvx skilly scan` | Find skills provided by the project's Python dependencies. |
72
- | `uvx skilly download <github-url>` | Install one or more skills from GitHub. |
73
- | `uvx skilly list` | Browse, update, or remove installed skills. |
74
- | `uvx skilly update` | Preview available updates; add `--yes` to apply all updates. |
75
- | `uvx skilly remove <name>` | Remove an installed skill by directory name. |
76
- | `uvx skilly skillsmp search <query>` | Search SkillsMP and install a selected result. |
77
- | `uvx skilly create` | Create a valid skill through a terminal wizard or explicit options. |
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
- Use `uvx skilly <command> --help` for all options.
83
+ Run `skilly <command> --help` for all options.
80
84
 
81
85
  ### Create Skills
82
86
 
83
- Interactive terminals open a full-screen editor for the required and optional
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 by default. Use `--overwrite` to replace one
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
- `uvx skilly scan` reads `pyproject.toml` and the project's `.venv`, then offers
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
- Filter named groups and extras when needed:
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, select one or install all:
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
- Management commands accept the same destination options:
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
- export SKILLY_DIRECTORY="$HOME/.config/skilly/skills"
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
- `--directory`, `--local`, `--global`, `--claude`, `--codex`, and `--copilot`
155
- override `SKILLY_DIRECTORY` when provided explicitly.
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
- uvx skilly download https://github.com/example/project --global --codex
159
- uvx skilly list --local --claude
158
+ export SKILLY_DIRECTORY="$HOME/.config/skilly/skills"
160
159
  ```
161
160
 
162
- #### Destination Mapping
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
- Authenticated requests have higher GitHub API rate limits. Use the first
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` is the stateful management interface. Bind a destination,
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
- created = repository.install(
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
- Use focused discovery functions when no repository state is needed:
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
- The SkillsMP client returns typed results directly. Async methods expose the
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 ts::build
266
- just ts::test
267
- just ts::typecheck
268
- just ts::smoke
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
@@ -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
  }
@@ -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 || candidate.arch !== processLike.arch) {
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
- "name": "@xelandernt/skilly",
3
- "version": "0.0.28",
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
- "@types/node": "^22.16.5",
32
- "typescript": "^5.8.3"
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