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 ..

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.

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.0.tar.gz (158.8 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.0-py3-none-any.whl (140.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: skillager-0.6.0.tar.gz
  • Upload date:
  • Size: 158.8 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.0.tar.gz
Algorithm Hash digest
SHA256 874dd50f648963aa48027567ec06a926f6cceb921019b0f82b40f3a9dcf1edb8
MD5 ff0fcb5aee6d1a9bfc81dd447d385336
BLAKE2b-256 6c37002a06e8a6dd285ba5b9f66f8d61aeac1413d9c7ded2ba1b7737e30e15a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for skillager-0.6.0.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.0-py3-none-any.whl.

File metadata

  • Download URL: skillager-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 140.7 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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 de1d0c6185a16f95ec4dad9fd72976993bddee7d4fd0f3ae224ec504c8b6f47f
MD5 53e27201228dd0c0627fd31a3c00b8fa
BLAKE2b-256 c4c905e598f8ca1248f1e442bb640c5d14b405c403c9f0f551c452fc5bebfc4f

See more details on using hashes here.

Provenance

The following attestation bundles were made for skillager-0.6.0-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