English | 中文
SkillPack CLI is an open-source package manager for AI agent skills.
It lets you scan local agent skill folders, bundle multiple skills into a reproducible skill pack, publish that pack to GitHub Releases, install other people's packs, and keep editable workspaces synced across machines.
Think of it as a lightweight package manager for your AI agent skill stack:
skillpack scan
skillpack create
skillpack add
skillpack publish
skillpack install github:owner/repo
skillpack pull github:owner/repo
skillpack publish my-packAI agent skills often start as local folders copied between tools such as Claude Code, Cursor, Codex, Windsurf, OpenCode, OpenClaw, Gemini CLI, Cline, GitHub Copilot, Goose, Pi, or custom agents. That becomes hard to manage when:
- you have many skills spread across several agents;
- you want to share a curated set of skills with someone else;
- a team needs the same skills installed consistently;
- you want to publish a new version without manually editing release tags;
- you switch to a new computer and need to pull, edit, and republish a pack.
SkillPack focuses on this workflow:
scan local skills -> create a pack -> publish to GitHub -> install anywhere -> pull as workspace -> update and republish
- Interactive prompts for everyday usage.
- Scriptable commands for CI and power users.
- Scan common agent skill directories.
- Create
skillpack.yamlmanifests. - Add one or many skills into a pack.
- Package packs as
.skillpackartifacts. - Publish packs to GitHub Releases.
- Create a GitHub repo during publish when it does not exist.
- Install packs from local folders,
.skillpackfiles, GitHub repos, or GitHub release URLs. - Pull a GitHub release into an editable local workspace.
- Remember workspace and provider bindings in
~/.skillpack/state.yaml. - Publish upgrades without re-entering the GitHub repo every time.
- Check remote GitHub release tags before republishing the same version.
- Bump pack versions with
patch,minor, ormajor. - Diff local packs against installed agent directories.
- Audit packs for structure and basic safety issues.
- Uninstall only the skills previously installed by SkillPack.
SkillPack includes adapters for these skill directories:
| Target | Default directory | Notes |
|---|---|---|
claude |
~/.claude/skills |
Claude Code skills |
cursor |
~/.cursor/skills |
Cursor skills |
codex |
~/.codex/skills |
OpenAI Codex skills |
windsurf |
~/.windsurf/skills |
Windsurf Cascade (Agent Skills format) |
opencode |
~/.config/opencode/skills |
OpenCode skills |
openclaw |
~/.openclaw/skills |
OpenClaw managed skills |
gemini |
~/.gemini/skills |
Gemini CLI skills |
cline |
~/.cline/skills |
Cline skills |
copilot |
~/.copilot/skills |
GitHub Copilot agent skills |
agents |
~/.agents/skills |
Cross-tool convention (Goose, Gemini CLI, Copilot, OpenClaw, and others) |
goose |
~/.config/goose/skills |
Legacy Goose path; prefer agents for new installs |
pi |
~/.pi/agent/skills |
Pi coding agent |
local |
./skills |
Current working directory |
Use --target-dir with --target local when you want to install into a custom directory.
Many agents also read project-scoped paths such as .agents/skills/, .claude/skills/, or <workspace>/skills/. SkillPack installs to the global user paths above by default so skills are available across projects.
- Node.js 20 or newer
- npm 10 or newer
- GitHub token only when publishing to GitHub or installing from private repositories
git clone https://github.com/<owner>/<repo>.git
cd <repo>
npm install
npm run build
node dist/index.js --helpnpm install
npm run build
npm link
skillpack --helpnpm run dev -- --help
node dist/index.js --helpskillpack scanInteractive mode lets you choose common agent directories.
Scriptable mode:
skillpack scan ~/.claude/skills
skillpack scan ~/.cursor/skills
skillpack scan --agentsskillpack createScriptable mode:
skillpack create sales-pack \
--owner tiechui \
--description "Sales follow-up and customer update skills" \
--visibility publicThis creates a folder containing a skillpack.yaml manifest.
skillpack addInteractive mode lets you pick skills from scanned agent directories.
Scriptable mode:
skillpack add ./sales-pack ~/.claude/skills/customer-summary
skillpack add ./sales-pack ~/.claude/skills/quote-reviewskillpack audit ./sales-pack
skillpack pack ./sales-pack --out distThis creates a .skillpack artifact.
export GITHUB_TOKEN=github_pat_xxx
skillpack publish ./sales-pack --to github --repo tiechui/my-skillpacksOn Windows PowerShell:
$env:GITHUB_TOKEN="github_pat_xxx"
node .\dist\index.js publish .\sales-pack --to github --repo tiechui/my-skillpacksIf the repository does not exist, interactive mode can create it for you.
skillpack install github:tiechui/my-skillpacksInstall a specific release tag:
skillpack install github:tiechui/my-skillpacks@sales-pack-v0.1.0Install from a GitHub URL:
skillpack install https://github.com/tiechui/my-skillpacks
skillpack install https://github.com/tiechui/my-skillpacks/releases/tag/sales-pack-v0.1.0skillpack pull github:tiechui/my-skillpacks
skillpack status
skillpack publish sales-packpull downloads the latest .skillpack release, extracts it into an editable workspace, and remembers the GitHub binding.
By default, pulled workspaces are stored under:
~/.skillpack/workspaces/<owner>/<pack-name>
You can choose another location:
skillpack pull github:tiechui/my-skillpacks --out ./sales-packSkillPack stores persistent metadata in:
~/.skillpack/state.yaml
This file records local workspaces and provider bindings, for example:
schema: https://skillpack.dev/schemas/state.v1.json
workspaces:
- id: tiechui/sales-pack
pack: tiechui/sales-pack
owner: tiechui
name: sales-pack
localPath: /Users/tiechui/.skillpack/workspaces/tiechui/sales-pack
provider:
type: github
repo: tiechui/my-skillpacks
lastVersion: 0.1.0
lastTag: sales-pack-v0.1.0Important behavior:
~/.skillpackis not the only place where packs can live.- Existing local folders are supported and remain editable where they are.
pulluses~/.skillpack/workspaces/<owner>/<pack>by default for convenience.publish sales-packcan resolve a remembered workspace by pack name, full pack id, or provider.- GitHub release conflicts are checked against the remote repository, not only against local state.
Examples:
skillpack publish sales-pack
skillpack publish tiechui/sales-pack
skillpack publish github:tiechui/my-skillpacks
skillpack publish /absolute/path/to/sales-packEvery pack has a skillpack.yaml file.
schema: https://skillpack.dev/schemas/skillpack.v1.json
name: sales-pack
displayName: Sales Pack
owner: tiechui
version: 0.1.0
description: Skills for customer updates, quote review, and sales follow-up.
visibility: public
tags:
- sales
- crm
skills:
- name: customer-summary
path: skills/customer-summary
- name: quote-review
path: skills/quote-review
shared:
references:
- shared/company-style.md
assets: []
targets:
- claude
- cursor| Field | Required | Description |
|---|---|---|
name |
Yes | Lowercase slug for the pack. Example: sales-pack. |
version |
Yes | SemVer version. Example: 0.1.0. |
description |
Yes | Human-readable description. |
owner |
No | Person or organization namespace. Example: tiechui. |
displayName |
No | Friendly display name. |
visibility |
No | private, unlisted, public, or team. |
tags |
No | Search and organization tags. |
skills |
No | Skills included in the pack. Each skill points to a local path. |
shared.references |
No | Shared reference files used by the pack. |
shared.assets |
No | Shared assets used by the pack. |
targets |
No | Suggested install targets. |
Scan a directory for skills. A skill is any folder containing SKILL.md.
skillpack scan
skillpack scan ~/.claude/skills
skillpack scan --agentsOptions:
| Option | Description |
|---|---|
-a, --agents |
Scan common agent skill directories. |
Create a new skill pack directory and manifest.
skillpack create
skillpack create sales-pack
skillpack create sales-pack --owner tiechui --description "Sales skills"Options:
| Option | Description |
|---|---|
-d, --description <description> |
Pack description. |
-o, --owner <owner> |
Owner namespace. |
--dir <dir> |
Output directory. |
--visibility <visibility> |
private, unlisted, public, or team. |
Add a local skill folder to a pack. The skill folder must contain SKILL.md.
skillpack add
skillpack add ./sales-pack ~/.claude/skills/customer-summary
skillpack add ./sales-pack ~/.claude/skills/customer-summary --name customer-summaryOptions:
| Option | Description |
|---|---|
--name <name> |
Override the skill name when adding one skill. |
--copy |
Copy the skill into the pack. Enabled by default. |
Audit a pack for manifest validity, missing files, and basic safety issues.
skillpack audit ./sales-pack
skillpack audit sales-packPackage a skill pack into a .skillpack artifact.
skillpack pack ./sales-pack
skillpack pack ./sales-pack --out dist
skillpack pack sales-pack --out distOptions:
| Option | Description |
|---|---|
-o, --out <dir> |
Output directory for the .skillpack file. |
Publish a pack locally or to GitHub Releases.
skillpack publish
skillpack publish ./sales-pack
skillpack publish ./sales-pack --out dist
skillpack publish ./sales-pack --to github --repo tiechui/my-skillpacksOptions:
| Option | Description |
|---|---|
-o, --out <dir> |
Output directory for local artifacts. Default: dist. |
--to <provider> |
local or github. |
--repo <owner/repo> |
GitHub repository. Required for first GitHub publish unless prompted. |
--token <token> |
GitHub token. Defaults to GITHUB_TOKEN or GH_TOKEN. |
--tag <tag> |
Release tag. Default: <pack-name>-v<version>. |
--release-name <name> |
GitHub release name. |
--body <markdown> |
GitHub release notes. |
--draft |
Create the release as a draft. |
--prerelease |
Mark release as prerelease. |
--overwrite |
Replace an existing release asset with the same file name. |
--dry-run |
Show what would be published without calling GitHub. |
--create-repo |
Create the GitHub repo if it does not exist. |
--public |
Create a new GitHub repo as public. |
--private |
Create a new GitHub repo as private. |
--bump <type> |
Bump version before publishing: patch, minor, or major. |
--no-state |
Do not record workspace/provider metadata under ~/.skillpack. |
--registry <url> |
Legacy registry placeholder. |
Publishing behavior:
- On first GitHub publish, SkillPack records the repo binding in
~/.skillpack/state.yaml. - Later,
skillpack publish sales-packcan reuse that binding. - Before publishing, SkillPack checks whether the target GitHub release tag already exists remotely.
- If the tag exists, interactive mode asks whether to bump, overwrite, or cancel.
Examples:
skillpack publish sales-pack --bump patch
skillpack publish sales-pack --bump minor
skillpack publish sales-pack --overwrite
skillpack publish sales-pack --to github --repo tiechui/my-skillpacks --dry-runDownload a .skillpack file from GitHub Releases without installing it.
skillpack download github:tiechui/my-skillpacks
skillpack download github:tiechui/my-skillpacks@sales-pack-v0.1.0
skillpack download https://github.com/tiechui/my-skillpacks --out downloadsOptions:
| Option | Description |
|---|---|
-o, --out <dir> |
Output directory. Default: current directory. |
--token <token> |
GitHub token for private repos. Defaults to GITHUB_TOKEN or GH_TOKEN. |
Install a skill pack to one or more agent targets.
Accepted sources:
./pack-directory
./pack.skillpack
github:owner/repo
github:owner/repo@tag
https://github.com/owner/repo
https://github.com/owner/repo/releases/tag/<tag>
Examples:
skillpack install ./dist/sales-pack-0.1.0.skillpack
skillpack install github:tiechui/my-skillpacks
skillpack install github:tiechui/my-skillpacks@sales-pack-v0.1.0
skillpack install github:tiechui/my-skillpacks --target claude
skillpack install github:tiechui/my-skillpacks --target claude --target cursor
skillpack install ./sales-pack --target local --target-dir ./tmp/skillsOptions:
| Option | Description |
|---|---|
-t, --target <target> |
Target agent. Repeat to install to several targets. |
--target-dir <dir> |
Custom target directory. Best with --target local. |
--token <token> |
GitHub token for private repos. Defaults to GITHUB_TOKEN or GH_TOKEN. |
--overwrite |
Overwrite existing skill directories. |
Download a GitHub release and extract it into an editable workspace.
skillpack pull github:tiechui/my-skillpacks
skillpack pull github:tiechui/my-skillpacks@sales-pack-v0.1.0
skillpack pull https://github.com/tiechui/my-skillpacks --out ./sales-packOptions:
| Option | Description |
|---|---|
-o, --out <dir> |
Workspace directory. Defaults to ~/.skillpack/workspaces/<owner>/<pack>. |
--token <token> |
GitHub token for private repos. Defaults to GITHUB_TOKEN or GH_TOKEN. |
--overwrite |
Replace an existing workspace directory. |
After pulling:
skillpack status
skillpack publish sales-packShow remembered workspaces and provider bindings.
skillpack status
skillpack status sales-pack
skillpack status tiechui/sales-pack
skillpack status github:tiechui/my-skillpacks
skillpack status sales-pack --remoteOptions:
| Option | Description |
|---|---|
--remote |
Also check whether the current GitHub release tag exists remotely. |
--token <token> |
GitHub token. Defaults to GITHUB_TOKEN or GH_TOKEN. |
Bump or set a pack version in skillpack.yaml.
skillpack bump sales-pack patch
skillpack bump sales-pack minor
skillpack bump sales-pack major
skillpack bump sales-pack --set 1.0.0Options:
| Option | Description |
|---|---|
--set <version> |
Set an exact SemVer version. |
List installed skill packs recorded by SkillPack.
skillpack listCompare a pack with an installed target skill directory.
skillpack diff
skillpack diff sales-pack --target claude
skillpack diff sales-pack --target cursor
skillpack diff sales-pack --target local --target-dir ./tmp/skillsOptions:
| Option | Description |
|---|---|
-t, --target <target> |
Any supported target id (see table above), including openclaw, gemini, cline, copilot, agents, goose, and pi. |
--target-dir <dir> |
Custom target skill directory. |
Uninstall a previously installed pack from an agent target.
skillpack uninstall
skillpack uninstall tiechui/sales-pack
skillpack uninstall sales-pack --target claudeOptions:
| Option | Description |
|---|---|
-t, --target <target> |
Limit uninstall to one target. |
Uninstall uses SkillPack install records, so it avoids deleting unrelated folders.
skillpack publish ./sales-pack --to github --repo tiechui/my-skillpacksOutput includes:
Release: https://github.com/tiechui/my-skillpacks/releases/tag/sales-pack-v0.1.0
Download: https://github.com/tiechui/my-skillpacks/releases/download/sales-pack-v0.1.0/sales-pack-0.1.0.skillpack
Install command: skillpack install github:tiechui/my-skillpacks
Edit files in the workspace, then run:
skillpack publish sales-packIf sales-pack-v0.1.0 already exists on GitHub, SkillPack prompts:
Remote release tiechui/my-skillpacks@sales-pack-v0.1.0 already exists on GitHub.
What should happen?
- Bump patch -> 0.1.1
- Bump minor -> 0.2.0
- Bump major -> 1.0.0
- Keep version and overwrite the existing release asset
- Cancel
Non-interactive examples:
skillpack publish sales-pack --bump patch
skillpack publish sales-pack --bump minor
skillpack publish sales-pack --overwriteskillpack pull github:tiechui/my-skillpacks
skillpack status
skillpack publish sales-packUse --out if you want the editable copy somewhere else:
skillpack pull github:tiechui/my-skillpacks --out ./sales-packFor public repositories, installing does not require a token.
Publishing requires a token with permission to create releases and upload release assets in the target repository. For a fine-grained GitHub token, grant the target repository Contents: read and write permission.
SkillPack reads tokens in this order:
--token <token>GITHUB_TOKENGH_TOKEN- Interactive masked prompt, when available
Examples:
export GITHUB_TOKEN=github_pat_xxx
skillpack publish ./sales-pack --to github --repo tiechui/my-skillpacksPowerShell:
$env:GITHUB_TOKEN="github_pat_xxx"
node .\dist\index.js publish .\sales-pack --to github --repo tiechui/my-skillpacks.
├── src/
│ ├── commands/ # CLI commands
│ ├── core/ # pack, publish, install, state, GitHub logic
│ ├── adapters/ # target agent directory adapters
│ ├── types/ # zod schemas and shared types
│ └── utils/ # filesystem, prompts, errors
├── test/ # vitest tests
├── DESIGN.md # design document
├── README.md
├── package.json
└── tsconfig.json
npm install
npm run build
npm test
npm run lint
npm run formatRun the CLI during development:
npm run dev -- scan
npm run dev -- publish ./sales-pack --to localBuild and run directly:
npm run build
node dist/index.js --helpSkillPack can copy files into agent skill directories. Before installing packs from people you do not trust:
skillpack download github:owner/repo
skillpack audit ./downloaded-packCurrent audit checks are intentionally lightweight. Treat skills as executable behavior: inspect instructions and scripts before using them in sensitive environments.
- Remote registry backend beyond GitHub Releases.
- Pack signing and provenance metadata.
- Stronger policy and security scanning.
- Team dashboards and drift detection.
- Workspace lockfiles.
- More agent adapters.
- Import/export compatibility with other skill ecosystems.
Issues and pull requests are welcome.
Useful contribution areas:
- new target adapters;
- better Windows path handling;
- richer audit rules;
- registry provider adapters;
- documentation examples;
- tests for GitHub release edge cases.
Before opening a PR:
npm run build
npm test
npm run lintMIT. See LICENSE.