jup - Agent Skills Manager
Project description
jup ✨
jup is a small command-line tool for installing and syncing agent skills across the local skill directories used by supported AI assistants.
Why jup? 💊
The name is short for "jump", a nod to the Jump Program from The Matrix. Just as the program was a foundational training ground for jumping between buildings (and realizing your potential), jup helps your agents "jump" between different environments and workflows with the right skills in hand.
It helps you:
- install skills from GitHub repositories that expose a top-level
skills/folder (or.claude/skills/as a fallback) - keep installed skills organized in a lockfile so they can be synced again later
- copy or link skills into the directories used by harnesses like Gemini, Copilot, and Claude
Features ✨
- Multi-Harness Support: Sync skills for Gemini, Copilot, Claude, and Codex.
- Local-First: Works with local skill directories and global configurations.
- Git Integration: Install and update skills directly from GitHub.
Quick Start 🚀
1. Install jup 📦
The preferred way to install jup is from PyPI with uv:
uv tool install jup
jup --help
If you do not want to install it, you can run it on demand:
uvx jup --help
pip also works if you prefer a traditional install:
pip install jup
jup --help
2. Check the current configuration ⚙️
jup config show
3. Choose which harness directories should receive synced skills 🤖
jup config set harnesses gemini,copilot,claude
Use none to clear the list:
jup config set harnesses none
4. Add skills ➕
jup add owner/repo --category productivity
Search for skills 🔍
Search for skills in the skills.sh registry:
jup find instagram
By default, this lists matching skills. You can filter and limit the results:
jup find instagram --limit 5 --min-installs 100
To install a skill interactively from the search results, use the --interactive (or -it) flag:
jup find instagram --interactive
Advanced GitHub Usage
You can use --path to specify a subdirectory (default: skills/), and --skills to select specific skill names (comma-separated) to add from the skills directory:
jup add owner/repo --path custom/skills/dir --skills skill-a,skill-b --category productivity
--pathand--skillsonly work with GitHub sources (not local directories).- If
--skillsis omitted, all skills in the specified path are added. - If
--pathis omitted, the default isskills/. - If the specified skills directory does not exist,
jupwill also look for.claude/skills/as a fallback.
You can also add local skills using relative or absolute paths (these ignore --path and --skills):
jup add ./local-skills --category productivity
jup add ../team-skills
jup add /absolute/path/to/local-skills
5. Review and update skills 📋
jup list
- Shows all installed skills, their source repo (with clickable links in supported terminals), install/update date, and which harness directories they are synced to.
Check for updates and apply them
jup sync --update
- Checks all installed GitHub skills for updates and applies them if available. Tracks the last update date for each source.
- You can also use
jup sync --checkto only check for updates without applying them. - The update status and last checked date are shown in
jup list.
6. Push the managed skills into the configured harness directories 🔄
jup sync
Comparison with npx skills ⚖️
While Vercel's npx skills is a fantastic package manager for AI skills with a built-in search registry, jup focuses heavily on centralized lockfile management and local symlink synchronization across multiple harnesses. jup is ideal if you want to maintain a single source of truth for your skills and automatically symlink them to Gemini, Claude, and Copilot simultaneously, especially when authoring skills locally.
For a full breakdown of commands, pros, and cons, see the jup vs. npx skills comparison.
What It Does 🧭
jup works with repositories that follow a simple structure:
repo/
skills/
skill-name/
SKILL.md
When you run jup add owner/repo, it clones the repository, finds every nested skill directory under skills/ (or .claude/skills/ if present) that contains a SKILL.md file, stores those skills in ~/.jup, and records them in a lockfile.
For local sources, jup add supports either of these layouts:
local-skills/
skill-a/
SKILL.md
skill-b/
SKILL.md
or a single skill directory:
single-skill/
SKILL.md
After that, jup sync installs the managed skills into the configured target locations. By default, jup uses symlinks, but you can switch to copying with:
jup config set sync-mode copy
Skills are placed directly into the harness's skill folder (e.g., ~/.gemini/skills/my-skill/), ensuring they are correctly discovered by the harness.
Update and Check Features
jup sync --updatechecks for updates to all installed GitHub skills and updates them if new versions are available. The last update date is tracked per source.jup sync --checkchecks for updates but does not apply them.jup listshows the last update/check date and provides clickable links to the source repositories (in supported terminals).
The main configuration values are:
scope:globalorlocalharnesses: a comma-separated list of harness namessync-mode:linkorcopy
7. Manage custom harness providers 🤖
You can add your own harness providers if they use a standard skills/ directory structure:
# List all providers
jup harness list
# Add a new custom provider
jup harness add myharness --global-location ~/.myharness/skills --local-location ./.myharness/skills
# Edit an existing custom provider
jup harness edit myharness --local-location ./new-path/skills
# Remove a custom provider
jup harness remove myharness
Once a custom harness is added, you can activate it in your configuration:
jup config set harnesses gemini,myharness
Supported Harnesses 🧩
jup includes built-in locations for these harness names:
geminicopilotclaudecodex.agents
Contributing 🤝
Contributions are welcome. We use standard tools like uv, ruff, ty, just, and pre-commit.
See CONTRIBUTING.md for detailed development setup, workflow, and publishing details.
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 Distribution
Built Distribution
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 jup-0.19.1.tar.gz.
File metadata
- Download URL: jup-0.19.1.tar.gz
- Upload date:
- Size: 139.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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 |
1c9bd7dad9b6e06bf471422ab43c9e3f47952c2b31f08a470f5e3881976c792a
|
|
| MD5 |
08292d637556703b1cab5102e55317b7
|
|
| BLAKE2b-256 |
a5d1a5b6a4bdab1722ca5c07d3743584f756ca3d78e22f04d4164e4b81a9e6a9
|
File details
Details for the file jup-0.19.1-py3-none-any.whl.
File metadata
- Download URL: jup-0.19.1-py3-none-any.whl
- Upload date:
- Size: 35.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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 |
c876f05e3f7d4dba212efadf86a0b9317583dae1b7760ad104459f67cf3959a2
|
|
| MD5 |
d53c503cc3c5af0d87348bdfa25b3faf
|
|
| BLAKE2b-256 |
06a49ddc09f1c12042aa3ef90b6455401e53af2afc8c21de9f68cdc53a4d1193
|