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
Metadata
Release files for shipskills 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| shipskills-0.1.0.tar.gz | 19.4 kB | With provenance | Details for shipskills-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| shipskills-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for shipskills-0.1.0-py3-none-any.whl |
Total release size: 37.3 kB
Release files / shipskills-0.1.0.tar.gz
| Download URL | shipskills-0.1.0.tar.gz |
|---|---|
| Size | 19.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d853cc2344c12003b4de67a2a873971238c2a432fe8ddb52f676180e713f83ba
|
|
BLAKE2b-256 checksum How to use checksums |
94c13273faeee6c87349c918eb930e632b87ec86b2c7427599f505eb6c5bf8ac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 8, 2026.
Transparency logRelease files / shipskills-0.1.0-py3-none-any.whl
| Download URL | shipskills-0.1.0-py3-none-any.whl |
|---|---|
| Size | 17.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1592303dd6203d7b4868c5d1164768f8f9042645ae03bbfb584a6f167d892239
|
|
BLAKE2b-256 checksum How to use checksums |
a2b9abe68ad2e15e121c256e71ab0225692c7f286ff3b4491d1da511885dc01b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 8, 2026.
Transparency logSecurity for shipskills 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for shipskills-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 8, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.