uv-installable wrapper for the vercel-labs/skills CLI with an embedded Node runtime
Project description
npx-skills
npx-skills is a uv-installable Python wrapper around the upstream
skills CLI.
This allows you to use skills.sh from within Python projects without a global dependency on Node/npm and impose versioning constraints on npx skills on a project-by-project basis.
It does this by shipping a vendored Node runtime and the published JavaScript CLI payload, then forwards execution to the embedded runtime so users do not need a separate Node install.
Install
uv add npx-skills
skills -h
OR use with uvx
uvx npx-skills
Versioning
The npx-skills package version tracks the upstream skills npm module
version one-to-one. Installing npx-skills==1.4.8 gives you exactly
skills@1.4.8 — the CLI payload is baked into the wheel at build time, so
pinning npx-skills in your pyproject.toml or lockfile pins the underlying
JavaScript CLI too. A new upstream skills release on npm has no effect on an
already-installed npx-skills; you only move when you explicitly bump
npx-skills. Packaging-only republishes of an existing upstream version use
PEP 440 post-releases (e.g. 1.4.8.post1).
How it works
Refresh Vendored Artifacts
The repository includes a vendoring script that copies:
- the published
skillspackage payload (package.json,bin/,dist/,README.md,ThirdPartyNoticeText.txt) - the package's runtime
node_modulesdependencies - the current platform's
nodebinary
By default it will use a built package root if you pass --source, or fall
back to the newest cached ~/.npm/_npx/*/node_modules/skills install.
uv run python scripts/vendor_upstream.py
Or point it at a specific built package root:
uv run python scripts/vendor_upstream.py --source /path/to/node_modules/skills
If you point --source at the upstream git repo, it must already contain
dist/cli.mjs.
To rebuild only the embedded Node runtime from the payload already committed in
this repo, point --source at the vendored package root:
uv run python scripts/vendor_upstream.py --source src/npx_skills/vendor/skills
Build
The wheel is intentionally platform-specific because it includes a native node
binary.
uv build
Release Automation
GitHub Actions builds one wheel per native runner target:
- Linux
x64viamanylinux_2_28 - Linux
arm64viamanylinux_2_28 - macOS
x64 - macOS
arm64 - Windows
x64 - Windows
arm64
The workflow lives at .github/workflows/wheels.yml.
It reuses the committed skills payload, re-vendors the Node runtime for the
current runner architecture, runs the test suite, builds wheels with uv
(cibuildwheel via uvx on Linux), smoke-tests the built wheel, and uploads
wheel artifacts for manual release use.
This project intentionally publishes wheels only. An sdist would not be portable without re-vendoring the embedded Node runtime for the target platform.
Publishing runs through a separate manual workflow at
.github/workflows/publish.yml. It invokes the
wheel builder in the same workflow run, then publishes from GitHub after all
target wheels succeed. The intended entrypoint is the npx-skills-dev helper:
uv run --package npx-skills-dev npx-skills-dev publish-to-pypi
Or via make:
make publish
Use --ref <branch> to dispatch the workflow from a specific branch and
--dry-run to build and validate without publishing.
The GitHub publish job authenticates to PyPI using a project API token stored
as the PYPI_API_TOKEN repository secret and consumed via UV_PUBLISH_TOKEN.
The job runs in the pypi GitHub Actions environment, which can optionally be
gated with required reviewers.
Upstream Sync Automation
A scheduled workflow at
.github/workflows/auto-sync-upstream.yml
runs daily (06:17 UTC) and keeps the vendored payload in lock-step with the
upstream skills npm release. It is the mechanism that preserves the
one-to-one version mapping described in the Versioning section
above.
The job is implemented by the npx-skills-dev auto-sync-upstream command
(packages/npx-skills-dev/src/npx_skills_dev/commands/auto_sync_upstream.py)
and performs the following steps:
- Reads the currently vendored version from
src/npx_skills/vendor/manifest.json(upstream.version). - Fetches
skills@latestfrom the npm registry. - If the versions match (and
--forcewas not passed) the job exits as a no-op. - Otherwise it
npm installsskills@<latest>into a temporary directory and runsscripts/vendor_upstream.py --source ...against it to refresh the vendored payload. - Rewrites the version in
pyproject.tomlandsrc/npx_skills/__init__.pyto match the new upstream version. - Runs the unit test suite.
- Commits
src/npx_skills/vendor,src/npx_skills/__init__.py, andpyproject.tomlwith the messageAuto-sync upstream skills@<version>and pushes tomaster. - Dispatches
publish.ymlagainstmaster, which builds wheels for every target platform and publishes them to PyPI.
The workflow can also be triggered manually via workflow_dispatch, with an
optional force input that re-runs the full flow even when the upstream
version is unchanged.
Layout
The vendored runtime is kept under src/npx_skills/vendor/:
vendor/
manifest.json
node/<platform>/node
skills/
package.json
bin/cli.mjs
dist/
node_modules/
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file npx_skills-1.5.6-py3-none-win_arm64.whl.
File metadata
- Download URL: npx_skills-1.5.6-py3-none-win_arm64.whl
- Upload date:
- Size: 30.1 MB
- Tags: Python 3, Windows ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc47f997d1382e0dc9f5b9b9633eb375e96415d5aefd0418938ebec3d705373f
|
|
| MD5 |
1700a714452f39fcb76ec0ba2007bbe0
|
|
| BLAKE2b-256 |
0ca15e08d05ac9f8fcd4a578e9db4c6584350aa9101f720352f985565a998da7
|
File details
Details for the file npx_skills-1.5.6-py3-none-win_amd64.whl.
File metadata
- Download URL: npx_skills-1.5.6-py3-none-win_amd64.whl
- Upload date:
- Size: 33.7 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
320b24b748de0677725f5bc8fffd0ec5d5063e9fcb7771033cddf2e22a142977
|
|
| MD5 |
9fcaf206646cd5ab09a1cdf31ac69fe3
|
|
| BLAKE2b-256 |
395224bc93829b53943efd2ca3d30a2a71564ad413d7a94b0c96ffbc9516f325
|
File details
Details for the file npx_skills-1.5.6-py3-none-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: npx_skills-1.5.6-py3-none-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 45.5 MB
- Tags: Python 3, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7600ddce6bcfa20f4efdd5429efda97702cfc79503e409f7d5313a3ecd3a5879
|
|
| MD5 |
a9f7249fd1646dc11eaf0462bd4a46fe
|
|
| BLAKE2b-256 |
ba8a16d7c220e16fe54f68b3c406a3dc9a284dc756467c3a99684f8c39edd615
|
File details
Details for the file npx_skills-1.5.6-py3-none-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: npx_skills-1.5.6-py3-none-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 44.7 MB
- Tags: Python 3, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fad247f9cd516c2c762aafc60addba044780f700b4fce6cdac3278f98da5a476
|
|
| MD5 |
9503997242dddaf2c81e75bfb40772a4
|
|
| BLAKE2b-256 |
2d9748516b85bcff453ed2f1bd10b563bf08738932f539b5c7636d703db10e11
|
File details
Details for the file npx_skills-1.5.6-py3-none-macosx_15_0_arm64.whl.
File metadata
- Download URL: npx_skills-1.5.6-py3-none-macosx_15_0_arm64.whl
- Upload date:
- Size: 37.3 MB
- Tags: Python 3, macOS 15.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
37313d94434e0daa406f43a17939d6d7f54ccfa0683c0e874166796d17e18691
|
|
| MD5 |
988898a2222b82fe43c9c31a796a0809
|
|
| BLAKE2b-256 |
16f76466be6fcc4863390bc64cdedbe486af831367b3f34c354d8e743b85355c
|
File details
Details for the file npx_skills-1.5.6-py3-none-macosx_10_13_universal2.whl.
File metadata
- Download URL: npx_skills-1.5.6-py3-none-macosx_10_13_universal2.whl
- Upload date:
- Size: 39.0 MB
- Tags: Python 3, macOS 10.13+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa0a8b48a92f2c5cdc719e123d381ef37739d9797f536bea216bf5dd3dbc64c5
|
|
| MD5 |
42786a636109c1519e6112d3eb31fa16
|
|
| BLAKE2b-256 |
6d173fdbc5f0be5540f2306ce1b5cee35919197b0dc896ad32bf8a20f92c23b8
|