Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Author and publish an Agent Skill with the skillship CLI. Use when creating a new SKILL.md from scratch, converting an existing skill to portable, or publishing with CI.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 49% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -15% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -12% | 0% |
Drive the skillship CLI to author and publish a portable Agent Skill. Run the CLI for the user; do not ask them to run commands manually.
Copy this checklist and track progress:
- [ ] 1. Locate or create the SKILL.md
- [ ] 2. Confirm publish target AND whether to add Cursor snippets (ask the user)
- [ ] 3. Add missing scaffolding if needed (--ci, --snippets)
- [ ] 4. Validate (skillship validate)
- [ ] 5. Fix any reported issues, re-validate until clean
- [ ] 6. Install (filesystem) or package (Claude upload)Ask the user the questions in Step 2 before running any init/install command. Never silently pass --snippets or pick an install scope for them.
A skill is a directory containing a SKILL.md. Find one in the project (search for SKILL.md). Determine <dir> = the folder that directly contains it.
./SKILL.md, not already underskills/<name>/) → relocate it so it follows the standard layout:
name from the SKILL.md frontmatter. If absent, derive acandidate from the project folder name.
name with the user (use AskQuestion). It must belowercase letters/numbers/hyphens (optionally :-namespaced).
skills/<name>/SKILL.md (: maps to - in the folder,e.g. skillship:author → skills/skillship-author/), then continue.
skills/<name>/ → go to Step 2.init from theproject root (it writes the skill body to skills/<name>/SKILL.md and repo files at the root). Do not pass --snippets yet — that is a separate decision made in Step 2:
bashnpx skillship@latest init <name> --ci
Then author the SKILL.md body following the create-skill skill's rules (third-person description, both WHAT and WHEN, under 500 lines). The skill name must be lowercase letters/numbers/hyphens and match the parent folder.
The scaffolded README.md has <owner>/<repo> placeholders in its install instructions. Replace them with the real GitHub owner/repo if you can determine them (e.g. from git remote get-url origin); otherwise ask the user for the values and fill them in.
Ask the user two things (use AskQuestion) before scaffolding or installing:
| Target | Mechanism | | --- | --- | | cursor, claude-code | Filesystem install | | claude-web, claude-cowork | Upload-only .skill zip |
cursor is a target. Snippets(cursor/rules/<name>.mdc + cursor/hooks.json) auto-wire a Cursor rule and hooks so the skill triggers automatically. This is opt-in and separate from installing into Cursor — never add it just because Cursor is a target. Ask "Add Cursor auto-trigger snippets (rules + hooks)?" and only pass --snippets if the user says yes.
Re-run init from the project root with the skill's name to fill in any missing CI workflows, snippets, or boilerplate. It writes only missing files and leaves existing files (including the authored SKILL.md) untouched:
bashnpx skillship@latest init <name> --ci [--snippets]
--ci adds .github/workflows/validate.yml and release.yml plusrelease-please-config.json for automated versioned releases.
--snippets adds cursor/rules/<name>.mdc and cursor/hooks.json. Includeit only if the user opted in during Step 2.
init also always writes a .gitignore (ignoring dist/, node_modules/,.DS_Store) so packaged artifacts and install output stay out of git.
bashnpx skillship@latest validate <dir> --profile all
--profile all is the strictest (Claude's 200-char description cap). Use --json if you need to parse results programmatically.
Read each failure, edit the SKILL.md, and re-run validate until it exits 0. Common failures: description over 200 chars, name not matching the folder, </> characters in the description, body over 500 lines (warning only).
Use the targets confirmed in Step 2.
Filesystem agents (e.g. Cursor, Claude Code):
bashnpx skillship@latest install <dir> --global -a cursor -a claude-code
Prefer --global when the skill lives in the project you are authoring it in: the source already sits at skills/<name>/, so a project-scoped install would copy/symlink it back into this same repo's .cursor/ and .claude/ (or .agents/) dirs — needless duplication. --global installs once under ~/.cursor / ~/.claude so the skill works everywhere, including here. Use a project-scoped install (omit --global) only when installing into a different consumer project. Add --copy to copy instead of symlink.
Upload-only surfaces (e.g. Claude Web / Cowork):
bashnpx skillship@latest package # bundles every skill under skills/ -> dist/<name>.skill
package validates each skill, then bundles them all into one .skill zip. <name> is the single skill's name or, for several skills, their common prefix (skillship-author + skillship-install → skillship). Then tell the user to upload dist/<name>.skill:
If the skill was scaffolded with init --ci, it auto-releases via release-please + Conventional Commits. After pushing, tell the user to enable Settings → Actions → Workflow permissions: "Read and write" and "Allow GitHub Actions to create and approve pull requests" so release-please can open release PRs and attach the .skill asset.
Other measured skills in the registry, with their headline benchmark lift.