Skip to main content

A Python environment 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, 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

  1. Install skillager
uv tool install skillager
# or: pipx install skillager
  1. If you have any skill-collection repos like superpowers add them to skillager
    • skillager collection add path/to/your/collection --name descriptive_name
  2. 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.)
  3. Open your agent of choice and tell them to run skillager handoff --agent [your agent]

setup automatically discovers project skills, package-provided skills, virtualenv skills, 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 virtualenv.

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 with skillager 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, or release.
  • 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

Library Authors

Python libraries can ship skills inside the package:

your_package/
  __init__.py
  .agents/skills/
    fastapi-usage/
      SKILL.md
      skillager.yaml
      references/
      scripts/

Skillager discovers package skills after install without importing the package. 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 library 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

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

skillager-0.6.1.tar.gz (165.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

skillager-0.6.1-py3-none-any.whl (146.6 kB view details)

Uploaded Python 3

File details

Details for the file skillager-0.6.1.tar.gz.

File metadata

  • Download URL: skillager-0.6.1.tar.gz
  • Upload date:
  • Size: 165.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for skillager-0.6.1.tar.gz
Algorithm Hash digest
SHA256 9ba89130d17ea2e88fae36d18c0440205a6c108a1458dee366ce37f5956369de
MD5 fcc3c460906d36e45ff1e474ed7a976c
BLAKE2b-256 d4fd8560f05a46867b1b858271ea05c41c7fe4617b64349f7f92bbec485361ce

See more details on using hashes here.

Provenance

The following attestation bundles were made for skillager-0.6.1.tar.gz:

Publisher: release.yml on jarmak-personal/skillager

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file skillager-0.6.1-py3-none-any.whl.

File metadata

  • Download URL: skillager-0.6.1-py3-none-any.whl
  • Upload date:
  • Size: 146.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for skillager-0.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e4540a3e4102947b3d57a6e22d444451266f29b8370a73062bcdf927a7e5b897
MD5 e74b723565be8bf976f44234b33e3812
BLAKE2b-256 3bd6ae28e569bebbe493a5996b9221c94f5ee55e41dc4ab4c3f768fcb0b15a45

See more details on using hashes here.

Provenance

The following attestation bundles were made for skillager-0.6.1-py3-none-any.whl:

Publisher: release.yml on jarmak-personal/skillager

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page