Write your agent skills once, ship them everywhere: Cursor, Claude Code, Codex, GitHub Copilot and any SKILL.md-compatible agent.
Project description
agentpack
Write your agent skills once. Ship them everywhere.
Every AI coding agent invented its own plugin layout: Cursor reads .cursor/skills/, Claude Code reads .claude-plugin/ + skills/, Codex reads .codex/skills/, GitHub Copilot reads .github/skills/, and the vendor-neutral standard uses .agents/skills/. If you maintain a skill pack or plugin, you end up hand-maintaining five slightly different copies of the same content.
agentpack is a Babel for agent plugins: you keep one source of truth — a folder of SKILL.md files plus a single agentpack.yaml — and one command generates correct, ready-to-publish bundles for every platform, including the Claude Code plugin.json manifest and marketplace.json.
- Zero dependencies. Pure Python standard library.
pip installand go. - Validates before it builds. Catches missing descriptions, name/folder mismatches, non-kebab-case names, broken JSON — the things that silently make a skill invisible to an agent.
- Knows each platform's dialect. Frontmatter fields a host doesn't support are dropped (and reported),
globsis mapped topathsfor Cursor, slash commands are converted to manual-invocation skills on platforms without a commands directory. - Windows-first. Developed and tested on Windows, Linux and macOS.
Install
pip install shipskills # installs the `agentpack` command
# or from source:
git clone https://github.com/superman2003/agentpack && cd agentpack && pip install .
Quick start
# scaffold a project
agentpack init my-toolkit --name my-toolkit
cd my-toolkit
# edit agentpack.yaml and skills/example-skill/SKILL.md, then:
agentpack validate
agentpack build
agentpack build produces:
dist/
├── claude/ # Claude Code plugin + marketplace
│ ├── .claude-plugin/marketplace.json
│ └── my-toolkit/
│ ├── .claude-plugin/plugin.json
│ ├── skills/<name>/SKILL.md
│ └── commands/<name>.md
├── cursor/.cursor/skills/<name>/SKILL.md
├── codex/.codex/skills/<name>/SKILL.md
├── copilot/.github/skills/<name>/SKILL.md
└── agents/.agents/skills/<name>/SKILL.md # vendor-neutral standard
Copy the tree for your platform into your repo (or point Claude Code at the plugin with --plugin-dir), and you're published.
Source layout
You write this once:
my-toolkit/
├── agentpack.yaml # name, version, description, author, targets
├── skills/
│ └── review-pr/
│ ├── SKILL.md # YAML frontmatter + Markdown instructions
│ └── references/… # optional extra files, copied verbatim
├── commands/ # optional flat slash-commands (.md)
├── agents/ # optional Claude Code subagents (.md)
├── hooks/hooks.json # optional Claude Code hooks (passed through)
└── .mcp.json # optional MCP server config (passed through)
agentpack.yaml
name: my-toolkit # kebab-case, required
version: 1.0.0 # semver
description: What this plugin does and when agents should use it.
author:
name: Your Name
url: https://github.com/your-name
license: MIT
keywords: [code-review, git]
targets: [claude, cursor, codex, copilot, agents]
SKILL.md
---
name: review-pr # must match the folder name
description: Use when asked to review a pull request or diff.
paths: "**/*.py" # optional; Cursor-style file scoping
---
# Instructions for the agent…
Commands
| Command | What it does |
|---|---|
agentpack init [dir] |
Scaffold a new project |
agentpack validate [dir] |
Lint config and skills; exit 1 on errors |
agentpack build [dir] |
Generate dist/<target>/ bundles |
agentpack build -t cursor,claude |
Build only selected targets |
agentpack targets |
List supported platforms |
How platform differences are handled
| Concept | claude | cursor | codex | copilot | agents |
|---|---|---|---|---|---|
| Skills | skills/ in plugin |
.cursor/skills/ |
.codex/skills/ |
.github/skills/ |
.agents/skills/ |
| Slash commands | commands/*.md |
converted to manual skill | converted | converted | converted |
paths / globs scoping |
dropped (unsupported) | kept (globs→paths) |
dropped | dropped | kept |
Subagents (agents/) |
shipped | skipped | skipped | skipped | skipped |
| Hooks / MCP config | shipped | skipped | skipped | skipped | skipped |
| Manifest | plugin.json + marketplace.json |
— | — | — | — |
Everything dropped or converted is printed as a note: during the build, so there are no silent surprises.
Example
A complete working example lives in examples/code-review-toolkit/. Build it with:
agentpack build examples/code-review-toolkit
Development
python -m unittest discover tests -v
No dependencies needed, for tests either.
License
MIT
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 shipskills-0.1.0.tar.gz.
File metadata
- Download URL: shipskills-0.1.0.tar.gz
- Upload date:
- Size: 19.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d853cc2344c12003b4de67a2a873971238c2a432fe8ddb52f676180e713f83ba
|
|
| MD5 |
1c6b67afb4da057382bbcb4cf393e1f4
|
|
| BLAKE2b-256 |
94c13273faeee6c87349c918eb930e632b87ec86b2c7427599f505eb6c5bf8ac
|
Provenance
The following attestation bundles were made for shipskills-0.1.0.tar.gz:
Publisher:
publish.yml on superman2003/agentpack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shipskills-0.1.0.tar.gz -
Subject digest:
d853cc2344c12003b4de67a2a873971238c2a432fe8ddb52f676180e713f83ba - Sigstore transparency entry: 2116875708
- Sigstore integration time:
-
Permalink:
superman2003/agentpack@7051324627ca850a852dbd15c2afdd92ee3ee26c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/superman2003
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7051324627ca850a852dbd15c2afdd92ee3ee26c -
Trigger Event:
push
-
Statement type:
File details
Details for the file shipskills-0.1.0-py3-none-any.whl.
File metadata
- Download URL: shipskills-0.1.0-py3-none-any.whl
- Upload date:
- Size: 17.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1592303dd6203d7b4868c5d1164768f8f9042645ae03bbfb584a6f167d892239
|
|
| MD5 |
dd21e42dc0d447878e4ea5750a0f3615
|
|
| BLAKE2b-256 |
a2b9abe68ad2e15e121c256e71ab0225692c7f286ff3b4491d1da511885dc01b
|
Provenance
The following attestation bundles were made for shipskills-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on superman2003/agentpack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shipskills-0.1.0-py3-none-any.whl -
Subject digest:
1592303dd6203d7b4868c5d1164768f8f9042645ae03bbfb584a6f167d892239 - Sigstore transparency entry: 2116875740
- Sigstore integration time:
-
Permalink:
superman2003/agentpack@7051324627ca850a852dbd15c2afdd92ee3ee26c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/superman2003
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7051324627ca850a852dbd15c2afdd92ee3ee26c -
Trigger Event:
push
-
Statement type: