Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions .github/workflows/promote-to-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Promote to Release

on:
schedule:
# Runs every Friday at 16:00 UTC
- cron: '0 16 * * 5'
workflow_dispatch: # Allow manual trigger

jobs:
promote:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout release branch
uses: actions/checkout@v6
with:
ref: release
fetch-depth: 0

- name: Fast-forward merge main into release
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git fetch origin main
git merge origin/main --no-edit
git push origin release
10 changes: 10 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,13 @@ jobs:
git tag -f stable "$VERSION"
git push -f origin stable
fi

- name: Back-sync release to main
if: steps.release.outputs.released == 'true' && github.ref_name == 'release'
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git fetch origin main
git checkout main
git merge origin/release --no-edit
git push origin main
52 changes: 0 additions & 52 deletions .github/workflows/weekly-release-pr.yml

This file was deleted.

7 changes: 4 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# AGENTS.md - Project Context & Guidelines ✨

`jup` is a lightweight Python-based command-line tool designed to manage and synchronize "agent skills" across various AI assistant directories (e.g., Gemini, Copilot, Claude). It allows users to install skills from GitHub repositories or local directories, keeping them organized via a lockfile and syncing them to target locations using symlinks or file copies.
`jup` is a lightweight Python-based command-line tool designed to manage and synchronize "agent skills" across various AI assistant directories (e.g., Gemini, Copilot, Claude, Codex).
It allows users to install skills from GitHub repositories or local directories, keeping them organized via a lockfile and syncing them to target locations using symlinks or file copies.

ALWAYS use subagents for independent steps.
ALWAYS follow the development workflow outlined below to ensure consistency, maintainability, and quality across the codebase. This workflow is designed to encourage thoughtful implementation, thorough testing, and clear documentation.
Expand Down Expand Up @@ -35,7 +36,7 @@ jup backlog
* `src/jup/main.py`: Main entry point and configuration sub-commands (`jup config ...`).
* `src/jup/commands/`: Package containing core CLI commands implementation (`add`, `remove`, `sync`, `list`, `show`, `find`).
* `src/jup/config.py`: Handles `~/.jup` persistence, config files, and the skills lockfile.
* `src/jup/models.py`: Defines Pydantic models for configuration, skill sources, and the `DEFAULT_AGENTS` registry.
* `src/jup/models.py`: Defines Pydantic models for configuration, skill sources, and the `DEFAULT_HARNESSES` registry.
* **Internal Storage:** Skills are cached/stored in `~/.jup/skills/` before being synced.

## Mandates & Core Workflows
Expand All @@ -62,7 +63,7 @@ jup backlog
- **Skill Structure:** `jup` expects a directory containing a `SKILL.md` file. It supports single-skill directories or collections.
- **Sync Behavior:** `sync` only manages entries in the lockfile. It does not preserve arbitrary manual edits inside managed target directories.
- **Sync Mode:** The `sync-mode` alias in the CLI maps to `sync_mode` in the config model.
- **Agent Registry:** Supported agents and their default paths are defined in `src/jup/models.py`. The `get_scope_dir` function returns the exact path to an agent's skills directory (e.g., `~/.gemini/skills`). Tests frequently patch this registry.
- **Harness Registry:** Supported harnesses and their default paths are defined in `src/jup/models.py`. The `get_scope_dir` function returns the exact path to a harness's skills directory (e.g., `~/.gemini/skills`). Tests frequently patch this registry.
- **Path Consistency:** Ensure that `list`, `sync`, and `remove` commands use `get_scope_dir` directly for the default target, avoiding redundant `/skills` nesting.

### Documentation
Expand Down
24 changes: 24 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,30 @@
# CHANGELOG


## v0.13.0-beta.2 (2026-04-20)

### Features

- Explicitly mention codex support in harness registry
([`b0f4d9b`](https://github.com/andrader/jup/commit/b0f4d9b8a659d13902f7542df1a1c24a593c2576))


## v0.13.0-beta.1 (2026-04-20)

### Chores

- Bump version to 0.13.0-beta.1 and sync with stable
([`6c9b842`](https://github.com/andrader/jup/commit/6c9b8425ed9f8676ed31e2409715cf12662e2f2e))


## v0.12.0-beta.4 (2026-04-20)

### Features

- Rename "agent" to "harness" and ".agents" terminology cleanup
([`9d60b06`](https://github.com/andrader/jup/commit/9d60b06d0d1928175b4f340b8cb47a1adff1e364))


## v0.12.0-beta.3 (2026-04-20)

### Bug Fixes
Expand Down
43 changes: 22 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ 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 agents like Gemini, Copilot, and Claude
- copy or link skills into the directories used by harnesses like Gemini, Copilot, and Claude

## Features ✨

- **Multi-Agent Support**: Sync skills for Gemini, Copilot, and Claude.
- **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.

Expand Down Expand Up @@ -51,16 +51,16 @@ jup config show

![jup config show](docs/images/config_show.svg)

### 3. Choose which agent directories should receive synced skills 🤖
### 3. Choose which harness directories should receive synced skills 🤖

```bash
jup config set agents gemini,copilot,claude
jup config set harnesses gemini,copilot,claude
```

Use `none` to clear the list:

```bash
jup config set agents none
jup config set harnesses none
```

### 4. Add skills ➕
Expand Down Expand Up @@ -118,7 +118,7 @@ jup list

![jup list](docs/images/list.svg)

- Shows all installed skills, their source repo (with clickable links in supported terminals), install/update date, and which agent directories they are synced to.
- 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

Expand All @@ -130,15 +130,15 @@ jup sync --update
- You can also use `jup sync --check` to 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 agent directories 🔄
### 6. Push the managed skills into the configured harness directories 🔄

```bash
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 agents. `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.
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](docs/jup-vs-npx-skills.md).

Expand Down Expand Up @@ -178,7 +178,7 @@ After that, `jup sync` installs the managed skills into the configured target lo
jup config set sync-mode copy
```

Skills are placed directly into the agent's skill folder (e.g., `~/.gemini/skills/my-skill/`), ensuring they are correctly discovered by the agent.
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

Expand All @@ -189,41 +189,42 @@ Skills are placed directly into the agent's skill folder (e.g., `~/.gemini/skill
The main configuration values are:

- `scope`: `global` or `local`
- `agents`: a comma-separated list of agent names
- `harnesses`: a comma-separated list of harness names
- `sync-mode`: `link` or `copy`

### 7. Manage custom agent providers 🤖
### 7. Manage custom harness providers 🤖

You can add your own agent providers if they use a standard `skills/` directory structure:
You can add your own harness providers if they use a standard `skills/` directory structure:

```bash
# List all providers
jup agent list
jup harness list

# Add a new custom provider
jup agent add myagent --global-location ~/.myagent/skills --local-location ./.myagent/skills
jup harness add myharness --global-location ~/.myharness/skills --local-location ./.myharness/skills

# Edit an existing custom provider
jup agent edit myagent --local-location ./new-path/skills
jup harness edit myharness --local-location ./new-path/skills

# Remove a custom provider
jup agent remove myagent
jup harness remove myharness
```

Once a custom agent is added, you can activate it in your configuration:
Once a custom harness is added, you can activate it in your configuration:

```bash
jup config set agents gemini,myagent
jup config set harnesses gemini,myharness
```

## Supported Agents 🧩
## Supported Harnesses 🧩

`jup` includes built-in locations for these agent names:
`jup` includes built-in locations for these harness names:

- `gemini`
- `copilot`
- `claude`
- `default`
- `codex`
- `.agents`

## Contributing 🤝

Expand Down
5 changes: 3 additions & 2 deletions docs/jup-vs-npx-skills.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ Both `jup` and `npx skills` are CLI tools designed to manage and install Open Ag
| :--- | :--- | :--- |
| **Language / Runtime** | Python (via `uv` or `pip`) | Node.js (via `npx`) |
| **State Management** | Central lockfile (`~/.jup/skills-lock.json`) | Global or per-project installation |
| **Multi-Agent Sync** | **Yes.** Symlinks/copies from a central cache to all configured agents via `jup sync` | **Yes.** Via `-a` flags during install (e.g., `-a gemini-cli -a cursor`) |
| **Multi-Harness Sync** |
**Yes.** Symlinks/copies from a central cache to all configured agents via `jup sync` | **Yes.** Via `-a` flags during install (e.g., `-a gemini-cli -a cursor`) |
| **Search / Registry** | **Yes.** Built-in search (`jup find`) backed by `skills.sh` | **Yes.** Built-in search (`npx skills find`) backed by `skills.sh` |
| **Local Development** | Excellent. Symlinks local directories directly into agent folders | Good. Includes an `init` command for scaffolding |
| **Updates** | `jup sync --update` | `npx skills update` / `npx skills check` |
Expand All @@ -21,7 +22,7 @@ Both `jup` and `npx skills` are CLI tools designed to manage and install Open Ag
* `jup sync`: Syncs managed skills from the central storage into the configured agent directories (e.g., `.gemini/skills`, `.claude/skills`).
* `jup list`: Shows all installed skills, locations, and last update times.
* `jup remove <target>`: Uninstalls a skill or repository.
* `jup config set agents gemini,claude`: Configures which agents receive the synced skills.
* `jup config set harnesses gemini,claude`: Configures which harnesses receive the synced skills.

### `npx skills`
* `npx skills find [query]`: Interactively searches for available skills in the community registry.
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "jup"
version = "0.12.0-beta.3"
version = "0.13.0-beta.2"
description = "jup - Agent Skills Manager"
readme = "README.md"
requires-python = ">=3.12"
Expand Down
10 changes: 5 additions & 5 deletions src/jup/commands/add.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
GITHUB_SOURCE_TYPE,
rel_home,
run_git_clone,
is_path_in_agent_dir,
is_path_in_harness_dir,
)


Expand Down Expand Up @@ -70,12 +70,12 @@ def add_skill(
raise typer.Exit(code=1)

resolved_local = local_path.resolve()

agent_name = is_path_in_agent_dir(resolved_local, config)
if agent_name:
harness_name = is_path_in_harness_dir(resolved_local, config)
if harness_name:
print(
f"[yellow]Source is inside an agent directory ({agent_name}).[/yellow]"
f"[yellow]Source is inside a harness directory ({harness_name}).[/yellow]"
)

if typer.confirm(
"Move to central storage? (Recommended for management)", default=True
):
Expand Down
Loading
Loading