A per-project Claude Code skill manager. Curate a hybrid registry of skills — yours, gstack's, team collections — and install chosen subsets (individually or as packs) into a project's .claude/skills/. Skills become active only in the projects you select them for, not in every Claude Code session system-wide.
Why it exists. Frameworks like gstack scatter ~80 skills into ~/.claude/skills/ so they load in every session, regardless of project. skillkit makes skill selection per-project and declarative: commit a skills.toml, sync anywhere.
| Doc | For |
|---|---|
| Tutorial: Getting started | Install → de-scatter gstack → build a pack → use it in a project |
| How-to guides | Task recipes: add skills, create packs, adopt gstack, vendor, author a skill |
| Reference | Every command and the three file formats |
| Design explanation | Why manifest+sync, live packs, the marker-safety model, adopt internals |
| Design spec | The original design record |
git clone <this-repo> ~/ai/skillkit
cd ~/ai/skillkit
uv tool install --editable .This puts skillkit on your PATH via uv's tool shim directory. If uv prints a PATH hint after install, add the suggested directory to your shell's $PATH.
Registry location — resolved in this order:
$SKILLKIT_REGISTRYenvironment variable- Default:
~/ai/skillkit(the cloned repo itself)
| Concept | Where it lives | What it is |
|---|---|---|
| Source | sources.toml in the registry |
A named root directory whose sub-dirs are skills. Declare your mine skills, gstack's dir, a shared team collection, etc. |
| Catalog | computed | Union of all source roots — every skill across all declared sources. |
| Pack | packs/*.toml in the registry |
A named bundle of skill refs (source:name). LIVE references: re-resolved on every sync, so updating a skill in a source is automatically picked up. |
| Project manifest | .claude/skills.toml (committed) |
Records which skills and packs a project wants. This is the intent; commit it so teammates can rehydrate. |
| Materialized skills | .claude/skills/ (gitignored by default) |
The actual skill directories, copied in by sync. Rehydrate with skillkit sync. |
[sources]
mine = "~/ai/skillkit/skills"
gstack = "~/.claude/skills/gstack"[pack]
name = "webapp"
description = "Skills for a typical web app project"
skills = ["mine:qa", "gstack:next-best-practices", "gstack:review"]| Command | What it does |
|---|---|
skillkit add <ref> |
Add a skill or pack to the project manifest and sync |
skillkit rm <ref> |
Remove a skill or pack from the manifest and sync |
skillkit pick |
Textual multiselect TUI — browse the catalog and toggle skills/packs |
skillkit sync |
Materialize the current manifest into .claude/skills/ |
skillkit update |
git pull the registry, then sync |
skillkit vendor |
Copy skills in and mark them committed (see Install Modes) |
skillkit list |
Show catalog with [*] next to installed skills/packs |
skillkit pack create <name> |
Interactively build a new pack (Textual picker → packs/<name>.toml) |
skillkit pack list |
List all packs in the registry |
skillkit pack show <name> |
Show a pack's details |
skillkit adopt gstack |
Register gstack's dir as a source and preview scattered dirs (dry run) |
skillkit adopt gstack --yes |
Same, plus move scattered gstack dirs to macOS Trash |
Ref syntax:
source:name— a specific skill, e.g.mine:qa,gstack:reviewpack:name— an entire pack, e.g.pack:webapp
.claude/skills/ is listed in .gitignore. Each teammate or CI environment runs skillkit sync after checkout to materialize skills locally. Only skills.toml is committed.
skillkit add gstack:review # adds to .claude/skills.toml, materializes immediately
skillkit sync # re-materialize anywhere after a fresh checkoutUseful for self-contained repos or when you want skills version-locked to the repo snapshot:
skillkit vendorThis runs sync then writes a !.claude/skills/ negation line to .gitignore, so the materialized skills directory is tracked by git. Commit both the manifest and the skills/ directory.
A skill is a directory containing a SKILL.md file. Front-matter declares metadata:
---
name: my-skill
description: Short description shown in catalog and picker
---
# My Skill
Instructions for Claude...Place skill directories under a root declared in sources.toml. They appear in skillkit list and the pick TUI immediately.
gstack installs its skills scattered into ~/.claude/skills/ alongside skills from other sources. adopt gstack consolidates this:
- Registers
~/.claude/skills/gstackas agstacksource insources.toml. - Detects "scattered" gstack skill dirs — top-level dirs in
~/.claude/skills/whose names match a dir inside~/.claude/skills/gstack/. - Without
--yes: shows the dry-run list of dirs that would be moved to Trash. No filesystem changes beyond writingsources.toml. - With
--yes: moves those scattered dirs to macOS Trash (reversible).
Always review the dry-run first. Scatter detection matches by directory name only — a non-gstack skill sharing a name with a gstack skill will be flagged.
skillkit adopt gstack # dry run — review the list
skillkit adopt gstack --yes # approved — move scattered dirs to TrashAfter running gstack-upgrade, gstack may re-scatter skills. Just re-run skillkit adopt gstack --yes.
This registry repo is PUBLIC.
Keep secrets, internal URLs, and client names out of skill files under skills/. A gitleaks pre-commit hook is configured in .pre-commit-config.yaml. Enable it once after cloning:
pre-commit installThe hook scans each commit for leaked credentials before they are pushed.
uv run pytest # 34 tests