A local skill registry and activation layer for coding agents.
Project description
Skillager
Skillager is a local CLI for discovering, reviewing, organizing, and materializing agent skills without loading every skill into every chat.
Register/discover -> review -> approve -> search metadata -> materialize on demand
Projects, Python libraries, npm packages, Cargo crates, tools, and personal skill repos can ship useful agent guidance. Skillager keeps that guidance searchable and reviewed, but out of the agent context until it is needed.
Quickstart
- Install skillager
uv tool install skillager
# or: pipx install skillager
- If you have any skill-collection repos like superpowers add them to skillager
skillager collection add path/to/your/collection --name descriptive_name
- Run
skillager setup --agent [your agent]in your project dir- Installation of skillager is global, setup is run per-project
- Work through any required approvals etc. (don't blindly trust skills from sources you don't know.)
- Open your agent of choice and tell them to run
skillager handoff --agent [your agent]
setup automatically discovers project skills, package-provided skills from Python environments, project node_modules, and Cargo.lock-selected Cargo crates, Python environment skills from project virtualenv or conda environments, collections, and native agent skills. It scans them and only marks content available to your agent after user approval. Skillager is meant to be installed once as a user tool; it does not need to live inside every project environment.
Skillager writes a small project note in AGENTS/CLAUDE.MD so the agent knows to run skillager working, use metadata commands, and ask you to run setup or bootstrap when user-authority review is needed.
[!IMPORTANT] Upgrading from 0.5.x? Tags are now project-local at
<project>/.skillager/tags.json, and lookback/session telemetry has been removed.After setup has recorded your projects, run
skillager state migrate-tags --to projects, then refresh active projects withskillager setup --agent your-agent.
Core Model
Skillager keeps three decisions separate:
- Approval: the user reviewed a skill at its current content hash.
- Curation: a project groups available skills into local tags such as
gis,workflows, orrelease. - Materialization: Skillager writes native, stub, or router skills for a specific agent and project.
[!TIP] Approval is not materialization. Keep useful skills approved and searchable, then materialize only what the current project needs.
Routers are usually the best fit for larger tags because the agent sees one compact skill and activates specific reviewed skills on demand.
Materialization modes:
native: copy the full reviewed skill into the agent's project skill directory.- Regular working project skills
stub: write a tiny handle that activates the reviewed skill through Skillager.- Skills you want to only manually activate -- keep the context out of the agent.
router: write one compact skill for a curated tag and let the agent choose from that tag.- Grouped skills to minimize context usage
Metadata commands stay metadata-only. status, list, search, show without --content, handoff, lint, and summary JSON outputs do not reveal full skill bodies.
Daily Commands
- Review or refresh approvals:
skillager setup --agent codex - Repair first-party working artifacts:
skillager bootstrap --agent codex - Diagnose state:
skillager doctor --agent codex - Create a project tag:
skillager tag create spatial-python - Add a skill to a tag:
skillager tag add spatial-python vibespatial/gis-domain - Inspect a tag:
skillager tag show spatial-python - Materialize a tag as one router skill:
skillager materialize --tag spatial-python --mode router --agent codex --scope project - Materialize one skill as a stub:
skillager materialize vibespatial/gis-domain --mode stub --agent codex --scope project - Reuse tags across projects:
skillager tag sync --from ../project-a --to ../project-b
For agent permission prompts, Skillager ships example read-only allowlists in examples/codex-allowlist.json and examples/claude-allowlist.json. They cover metadata commands; setup, review, doctor fixes, and other mutating commands should stay user-run unless you intentionally delegate them.
Collections
Skill repositories, shared skills, any grouping of skills etc are collections to skillager. Collections are a global inventory; project-local tags are optional project-level curation.
skillager collection add ~/skills/workflows --name workflows
skillager setup --agent codex
skillager search "release workflow" --agent codex --json # Usually run by your agent
After review, collection skills are searchable from any project on your machine. Use project-local tags only when you want a curated group or router/stub materializations:
skillager tag add workflows --from-collection workflows
skillager materialize --tag workflows --mode router --agent codex --scope project
Package Authors
Python libraries, npm packages, and Cargo crates can ship skills inside the package:
your_package/
__init__.py
.agents/skills/
fastapi-usage/
SKILL.md
skillager.yaml
references/
scripts/
your-npm-package/
package.json
.agents/skills/
react-query-usage/
SKILL.md
skillager.yaml
your-crate/
Cargo.toml
.agents/skills/
tokio-usage/
SKILL.md
skillager.yaml
Skillager discovers package skills after install from project Python environments, including virtualenv and conda environments, from project node_modules, and from Cargo crates selected by the current project's Cargo.lock without importing packages, running package scripts, or invoking Cargo. Users still review and approve them before an agent can activate them.
skillager.yaml is optional and structured-only to support safe skills. Put searchable prose in SKILL.md; manifests can declare audience, activation, compatibility constraints, and typed package targets. For CI, run uvx --from skillager-linter skillager-lint ..
Published/shared skill roots may also include optional release evidence such as skill.oms.sig, skill-card.md, or card.yaml. Skillager keeps these separate from approval and search; use skillager verify-signature <skill-id-or-path> --certificate-chain <pem> when you explicitly want to verify a signed skill.
See the package author guide for metadata and packaging details.
Safety Model
The scanner is deterministic, local, and not perfect. It looks for common agent-risk patterns such as instruction override attempts, hidden prompt requests, secret exfiltration language, credential paths, download-and-execute flows, network callbacks involving secrets, unattended approval language, shell execution requests, hidden control characters, encoded blobs, and oversized content.
It is a review aid, not a proof of safety. Human review decides availability, and agent-facing metadata commands only surface approved metadata.
Full review metadata separates the decision axes: approval records the owner decision, while review_gates reports scan, lint, signature, and availability status. The legacy trust field remains for compatibility.
Signatures are treated as provenance/integrity evidence, not safety signals. A verified signed skill still requires normal review before activation or materialization.
Docs
- User guide
- Agent CLI guide
- Skill repositories
- Package author guide
- Safety model
- Release runbook
- Security policy
External contributions are not being accepted yet while the early API and workflow settle.
Development
uv run python -m unittest discover -s tests
uv run python -m unittest discover -s packages/skillager-linter/tests
uv run --python 3.13 python scripts/check.py
uv build packages/skillager-linter
uv build
Skillager is released under the MIT License.
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 skillager-0.6.2.tar.gz.
File metadata
- Download URL: skillager-0.6.2.tar.gz
- Upload date:
- Size: 171.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b96fbc84dbf3ac9cfbe2204da9d94f23cf6ce496365cb87c3fed0d844a466166
|
|
| MD5 |
988d633d518e72ac2175895f8e5f1ee1
|
|
| BLAKE2b-256 |
1048089c08109e059a176cfe9315977bf82e0880ff39177dc8dfcb65e80059cd
|
Provenance
The following attestation bundles were made for skillager-0.6.2.tar.gz:
Publisher:
release.yml on jarmak-personal/skillager
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillager-0.6.2.tar.gz -
Subject digest:
b96fbc84dbf3ac9cfbe2204da9d94f23cf6ce496365cb87c3fed0d844a466166 - Sigstore transparency entry: 1626862018
- Sigstore integration time:
-
Permalink:
jarmak-personal/skillager@a35381565ed5a08ebe65cd2365f1f6999b71d48e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jarmak-personal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a35381565ed5a08ebe65cd2365f1f6999b71d48e -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file skillager-0.6.2-py3-none-any.whl.
File metadata
- Download URL: skillager-0.6.2-py3-none-any.whl
- Upload date:
- Size: 150.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
84b785f61c3f01ef0182483c95d240abc82ce1ec055436807708bb70039b7ef4
|
|
| MD5 |
5f6822508254c83794f94f98ff558ac3
|
|
| BLAKE2b-256 |
a787e8e25936514e81798daa8688bad2417e6dc76ee54e124735141c6adeeb94
|
Provenance
The following attestation bundles were made for skillager-0.6.2-py3-none-any.whl:
Publisher:
release.yml on jarmak-personal/skillager
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillager-0.6.2-py3-none-any.whl -
Subject digest:
84b785f61c3f01ef0182483c95d240abc82ce1ec055436807708bb70039b7ef4 - Sigstore transparency entry: 1626862040
- Sigstore integration time:
-
Permalink:
jarmak-personal/skillager@a35381565ed5a08ebe65cd2365f1f6999b71d48e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jarmak-personal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a35381565ed5a08ebe65cd2365f1f6999b71d48e -
Trigger Event:
workflow_dispatch
-
Statement type: