@xelandernt/skilly 0.0.28 → 0.0.30

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,91 @@
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)
8
- # skilly
7
+ [![License](https://img.shields.io/github/license/xelandernt/skilly)](https://github.com/xelandernt/skilly/blob/main/LICENSE)
9
8
 
10
- Manage [Agent Skills](https://agentskills.io/specification) from the command line
11
- or Python.
9
+ # skilly
12
10
 
13
- `skilly` creates specification-compliant skills, installs skills from GitHub or
14
- Python dependencies, and keeps managed skills up to date.
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
16
+
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
+ - [Configure Destinations](#configure-destinations)
29
+ - [GitHub Authentication](#github-authentication)
30
+ - [Python API](#python-api)
31
+ - [Development](#development)
32
+ - [License](#license)
15
33
 
16
34
  ## Installation
17
35
 
18
- Run with `uvx`:
36
+
37
+ ### Python
19
38
  ```shell
20
39
  uvx skilly --help
21
-
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. |
78
-
79
- Use `uvx skilly <command> --help` for all 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 |
82
+ | `configure` | Set which directories skilly manages via TUI or CLI flags |
83
+
84
+ Run `skilly <command> --help` for all options.
80
85
 
81
86
  ### Create Skills
82
87
 
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:
88
+ Interactive terminals open a full-screen editor. `Ctrl+S` creates the skill, `Ctrl+X` cancels.
88
89
 
89
90
  ```shell
90
91
  uvx skilly create deployment-checks \
@@ -97,22 +98,20 @@ Run the deployment checklist and report blockers." \
97
98
  --yes
98
99
  ```
99
100
 
100
- Existing skills are rejected by default. Use `--overwrite` to replace one
101
- atomically. See `uvx skilly create --help` for the complete contract.
101
+ Existing skills are rejected unless `--overwrite` is passed.
102
102
 
103
103
  ### Install Dependency Skills
104
104
 
105
- `uvx skilly scan` reads `pyproject.toml` and the project's `.venv`, then offers
106
- skills shipped by direct, development, and optional dependencies:
105
+ `skilly scan` reads `pyproject.toml` and the project's `.venv`, then surfaces skills shipped by dependencies:
107
106
 
108
107
  ```shell
109
108
  uvx skilly scan
110
109
  ```
111
110
 
112
- Filter named groups and extras when needed:
111
+ Include or exclude specific extras and dependency groups (flags are repeatable):
113
112
 
114
113
  ```shell
115
- uvx skilly scan --group dev --exclude-extra docs
114
+ uvx skilly scan --group dev --group test --exclude-extra docs
116
115
  ```
117
116
 
118
117
  ### Install GitHub Skills
@@ -121,86 +120,96 @@ uvx skilly scan --group dev --exclude-extra docs
121
120
  uvx skilly download https://github.com/example/project
122
121
  ```
123
122
 
124
- When a repository contains multiple skills, select one or install all:
123
+ When a repository contains multiple skills:
125
124
 
126
125
  ```shell
127
- uvx skilly download https://github.com/example/project --skill-name code-review
128
126
  uvx skilly download https://github.com/example/project --all
127
+ uvx skilly download https://github.com/example/project --skill-name code-review
129
128
  ```
130
129
 
131
130
  ### Destinations
132
131
 
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. |
132
+ All management commands accept the same destination options:
143
133
 
144
- Without destination options, `skilly` uses `.agents/skills`.
134
+ ```shell
135
+ uvx skilly list --local # .agents/skills
136
+ uvx skilly list --global # ~/.agents/skills
137
+ uvx skilly list --claude # .claude/skills
138
+ uvx skilly list --codex # .codex/skills
139
+ uvx skilly list --copilot # .github/skills (local), ~/.copilot/skills (global)
140
+ uvx skilly list --directory ~/custom # Explicit directory
141
+ ```
145
142
 
146
- Set `SKILLY_DIRECTORY` to change that default without passing `--directory`
147
- every time:
143
+ | Flags | Resolved destination |
144
+ |----------------------|-------------------------------------------------------|
145
+ | _none_ | `SKILLY_DIRECTORY` if set, otherwise `.agents/skills` |
146
+ | `--local` | `.agents/skills` |
147
+ | `--global` | `~/.agents/skills` |
148
+ | `--claude` | `.claude/skills` |
149
+ | `--claude --global` | `~/.claude/skills` |
150
+ | `--codex` | `.codex/skills` |
151
+ | `--codex --global` | `~/.codex/skills` |
152
+ | `--copilot` | `.github/skills` |
153
+ | `--copilot --global` | `~/.copilot/skills` |
154
+ | `--directory <path>` | That directory (after `~` expansion) |
155
+
156
+ Set a default destination:
148
157
 
149
158
  ```shell
150
159
  export SKILLY_DIRECTORY="$HOME/.config/skilly/skills"
151
- skilly list
152
160
  ```
153
161
 
154
- `--directory`, `--local`, `--global`, `--claude`, `--codex`, and `--copilot`
155
- override `SKILLY_DIRECTORY` when provided explicitly.
162
+ `--directory` overrides all other destination options and `SKILLY_DIRECTORY`.
163
+
164
+ ### Configure Destinations
165
+
166
+ `skilly configure` lets you choose which directories skilly should manage. Interactive terminals open a two-tab TUI (Global / Local). Non-interactive runs accept flags.
156
167
 
157
168
  ```shell
158
- uvx skilly download https://github.com/example/project --global --codex
159
- uvx skilly list --local --claude
169
+ uvx skilly configure # Open the TUI
170
+ uvx skilly configure --show # Print current config as TOML
171
+ uvx skilly configure --reset # Restore defaults
160
172
  ```
161
173
 
162
- #### Destination Mapping
174
+ Add or remove custom directories:
163
175
 
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.
176
+ ```shell
177
+ uvx skilly configure --add-global /opt/skills
178
+ uvx skilly configure --add-local .project/skills
179
+ uvx skilly configure --remove-global /opt/skills
180
+ uvx skilly configure --remove-local .project/skills
181
+ ```
167
182
 
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. |
183
+ Enable or disable built-in destinations (valid keys: `agents_global`, `agents_local`, `claude_global`, `claude_local`, `codex_global`, `codex_local`, `copilot_global`, `copilot_local`):
180
184
 
181
- `--directory` overrides `--local`, `--global`, `--claude`, `--codex`, and
182
- `--copilot`.
185
+ ```shell
186
+ uvx skilly configure --enable agents_global --disable copilot_global
187
+ ```
188
+
189
+ Configuration is stored in `~/.skilly.toml`:
190
+
191
+ ```toml
192
+ enabled_builtin = ["agents_global", "agents_local", ...]
193
+ custom_global_dirs = []
194
+ custom_local_dirs = []
195
+ ```
183
196
 
184
197
  ### GitHub Authentication
185
198
 
186
- Authenticated requests have higher GitHub API rate limits. Use the first
187
- available token:
199
+ Set a token for higher API rate limits (first available wins: `SKILLY_GITHUB_TOKEN`, `GITHUB_TOKEN`, `GH_TOKEN`):
188
200
 
189
201
  ```shell
190
202
  export SKILLY_GITHUB_TOKEN=ghp_your_token
191
- # or GITHUB_TOKEN / GH_TOKEN
192
203
  ```
193
204
 
194
- GitHub-fetching commands also accept `--github-token`.
205
+ All GitHub-fetching commands also accept `--github-token`.
195
206
 
196
207
  ## Python API
197
208
 
198
- `SkillRepository` is the stateful management interface. Bind a destination,
199
- project settings, or custom filesystem once and reuse it:
209
+ `SkillRepository` bundles a directory and project settings for stateful workflows:
200
210
 
201
211
  ```python
202
212
  from pathlib import Path
203
-
204
213
  from skilly import ProjectSettings, Skill, SkillRepository
205
214
 
206
215
  repository = SkillRepository(
@@ -211,7 +220,7 @@ repository = SkillRepository(
211
220
  ),
212
221
  )
213
222
 
214
- created = repository.install(
223
+ repository.install(
215
224
  Skill(
216
225
  name="code-review",
217
226
  description="Review code for correctness and maintainability.",
@@ -223,7 +232,7 @@ for match in repository.scan_project():
223
232
  print(match.available.name, match.status)
224
233
  ```
225
234
 
226
- Use focused discovery functions when no repository state is needed:
235
+ Stateless discovery functions for one-shot reads:
227
236
 
228
237
  ```python
229
238
  from skilly import discover_installed_skills, discover_venv_skills
@@ -232,8 +241,7 @@ installed = discover_installed_skills()
232
241
  dependency_skills = discover_venv_skills()
233
242
  ```
234
243
 
235
- The SkillsMP client returns typed results directly. Async methods expose the
236
- same result types without blocking the event loop:
244
+ SkillsMP client with typed results:
237
245
 
238
246
  ```python
239
247
  from skilly.skillsmp import ClientSettings, SkillsMp, SkillsMpSearchQuery
@@ -245,28 +253,11 @@ print(result.data.skills[0].github_url)
245
253
 
246
254
  ## Development
247
255
 
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
256
  ```shell
265
- just ts::build
266
- just ts::test
267
- just ts::typecheck
268
- just ts::smoke
269
- just ts::publish-dry-run
257
+ just install # Install dev dependencies + editable extension
258
+ just lint # Run linters
259
+ just test # Run tests
260
+ just typecheck # Run type checkers
270
261
  ```
271
262
 
272
263
  ## 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.30",
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