@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 CHANGED
@@ -1,89 +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
- [![Supported versions](https://img.shields.io/pypi/pyversions/skilly.svg)](https://pypi.python.org/pypi/skilly)
7
+ [![License](https://img.shields.io/github/license/xelandernt/skilly)](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
- 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
11
16
 
12
- `skilly` creates specification-compliant skills, installs skills from GitHub or
13
- 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)
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
- Run with `npx`:
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
- Homebrew installs the CLI only. Install the Python package when you need the
36
- import surface as well:
54
+ ### Info
37
55
 
38
- ```shell
39
- pip install skilly
40
- ```
41
-
42
- The npm package ships the same native Rust CLI behind the executable name
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 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
64
69
  ```
65
70
 
66
71
  ## CLI Commands
67
72
 
68
73
  | Command | Purpose |
69
- | --- | --- |
70
- | `uvx skilly scan` | Find skills provided by the project's Python dependencies. |
71
- | `uvx skilly download <github-url>` | Install one or more skills from GitHub. |
72
- | `uvx skilly list` | Browse, update, or remove installed skills. |
73
- | `uvx skilly update` | Preview available updates; add `--yes` to apply all updates. |
74
- | `uvx skilly remove <name>` | Remove an installed skill by directory name. |
75
- | `uvx skilly skillsmp search <query>` | Search SkillsMP and install a selected result. |
76
- | `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 |
77
82
 
78
- Use `uvx skilly <command> --help` for all options.
83
+ Run `skilly <command> --help` for all options.
79
84
 
80
85
  ### Create Skills
81
86
 
82
- Interactive terminals open a full-screen editor for the required and optional
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 by default. Use `--overwrite` to replace one
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
- `uvx skilly scan` reads `pyproject.toml` and the project's `.venv`, then offers
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
- Exclude dependency categories when needed:
110
+ Include or exclude specific extras and dependency groups (flags are repeatable):
112
111
 
113
112
  ```shell
114
- uvx skilly scan --no-dependency-groups --no-optional-dependencies
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, select one or install all:
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
- Management commands accept the same destination options:
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
- export SKILLY_DIRECTORY="$HOME/.config/skilly/skills"
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
- `--directory`, `--local`, `--global`, `--claude`, `--codex`, and `--copilot`
154
- 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:
155
156
 
156
157
  ```shell
157
- uvx skilly download https://github.com/example/project --global --codex
158
- uvx skilly list --local --claude
158
+ export SKILLY_DIRECTORY="$HOME/.config/skilly/skills"
159
159
  ```
160
160
 
161
- #### Destination Mapping
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
- Authenticated requests have higher GitHub API rate limits. Use the first
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` is the stateful management interface. Bind a destination,
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(include_dependency_groups=True),
183
+ project=ProjectSettings(
184
+ dependency_groups=("dev",),
185
+ optional_dependencies=("docs",),
186
+ ),
208
187
  )
209
188
 
210
- created = repository.install(
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
- Use focused discovery functions when no repository state is needed:
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
- The SkillsMP client returns typed results directly. Async methods expose the
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 ts::build
262
- just ts::test
263
- just ts::typecheck
264
- just ts::smoke
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
@@ -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.26",
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