Skip to main content

agent-skillctl

One shared skill library for all of your coding agents.

Manage local agent skills with an Nginx-inspired available / enabled workflow.

Python 3.11+ uv Textual Ruff License: MIT GitHub stars

Quick start · How it works · Usage · Configuration · Development


skillctl keeps one canonical copy of every skill and uses symlinks to control which skills your agents can see. Import once, enable or disable once, and every linked agent follows the same active skill set.

Why agent-skillctl?

Agent tools commonly keep skills in separate directories such as ~/.agents/skills and ~/.claude/skills. Copying the same skill into each location creates duplicates that drift over time and makes it difficult to know which version is active.

agent-skillctl gives you:

  • One source of truth — canonical skill copies live in ~/.agents/skills-available.
  • Instant toggles — enable or disable skills through a symlink-based active view without deleting their source files.
  • A visual manager — browse, import, enable, and disable skills from a keyboard- and mouse-friendly TUI.
  • Safe imports — validate skill directories, detect conflicts, verify copied content, and reject unsafe symlinks.
  • Recoverable takeovers — connect compatible agent roots to the shared view while preserving restorable backups.
  • Built-in diagnostics — inspect skills, adapters, broken links, and layout health with one command.

Quick start

Requirements

  • Python 3.11 or newer
  • uv for the recommended installation flow

Install

uv tool install agent-skillctl

Install from a local checkout instead:

uv tool install .

Both executable names launch the same CLI:

skillctl
# or
agent-skillctl

Run skillctl in an interactive terminal to open the manager. On first launch, an empty library opens directly on Scan & Import so you can discover existing skills.

How it works

The directory layout follows the same idea as Nginx's sites-available / sites-enabled model:

~/.agents/
├── skills-available/  # Canonical skill directories
├── skills/            # Symlinks for the currently enabled skills
├── backups/           # Recoverable backups created before takeover
├── config.toml        # Adapter configuration
├── registry.toml      # Import sources, timestamps, and content hashes
└── .skill-lock.json   # Existing npx skills metadata, preserved when present
Existing agent roots       Canonical library              Enabled view

~/.claude/skills ───┐      ~/.agents/skills-available/     ~/.agents/skills/
~/.other/skills ────┴─▶    ├── skill-a/          ───────▶  ├── skill-a -> ../skills-available/skill-a
       import               └── skill-b/          ───────▶  └── skill-b -> ../skills-available/skill-b
                                                             ▲
Compatible agent roots ─────────────── optional takeover ────┘

The canonical directory is never removed when a skill is disabled. Applying a new enabled set is transactional: skillctl builds a complete staged symlink view before replacing the previous one.

Usage

Interactive manager

skillctl

The TUI has two main views:

  • Choose — press Space to stage enable/disable changes, then Enter or select Apply to commit them.
  • Scan & Import — review configured adapters, inspect discovered skills, and choose an import mode.

Switch tabs with 1 and 2 or click them. Press q to exit.

Commands

Command Description
skillctl Open the interactive manager; print diagnostics when non-interactive
skillctl import Open the manager directly on Scan & Import
skillctl import -y Import valid skills from every adapter without prompts
skillctl import <adapter> -y Import valid skills from one adapter without prompts
skillctl check Show enabled skills, adapter status, and health diagnostics
skillctl restore <adapter> Restore the latest backup for a taken-over adapter

Use skillctl --help or skillctl <command> --help for the full CLI reference.

Import modes

Mode Behavior
Import only Copy valid skills into the shared library and leave the source root untouched
Import + takeover Import skills, back up the source root, and replace it with a link to the shared enabled view

Takeover is offered only when the entire source root is safe. Protected content, invalid directories, broken links, partial imports, or symlinks escaping the skill directory prevent takeover. The central agents adapter can never take itself over.

When a skill name already exists with different content, the interactive flow lets you skip it, rename the imported copy, or overwrite the canonical copy after creating a backup.

Configuration

Built-in adapters are packaged in src/skillctl/config.toml. During first-time initialization, skillctl copies that configuration to ~/.agents/config.toml; from then on, your local copy is authoritative.

Add an agent by defining its skill root:

[[adapters]]
name = "my-agent"
path = "~/.my-agent/skills"

Adapter configuration only describes where skills live. You choose between Import only and Import + takeover at import time.

Safety model

  • Existing non-skill files under ~/.agents/ are left untouched.
  • Codex .system and bundled content are ignored during import and block takeover of that root.
  • Imports are copied through a staging directory and verified with content hashes before being registered.
  • Skills containing symlinks that escape their own source directory are rejected.
  • Conflicting canonical copies are backed up before an overwrite.
  • Disabling a skill only removes its active symlink, never its canonical copy.

Development

Clone the repository and install all dependency groups:

git clone https://github.com/onewesong/agent-skillctl.git
cd agent-skillctl
uv sync --all-groups

Run the quality checks:

uv run pytest
uv run ruff check .
uv run mypy

For isolated manual testing, provide a temporary home directory:

uv run skillctl --home /tmp/skillctl-home

See DEVELOPMENT.md for the architecture and verification workflow, and CONTRIBUTING.md before submitting changes.

Contributing

Issues, documentation improvements, adapters, and tests are welcome. Please include coverage for both success and rollback paths when adding behavior.

License

Distributed under the MIT License.

Metadata

Release files for agent-skillctl 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for agent-skillctl 0.1.1
File Size Uploaded
agent_skillctl-0.1.1.tar.gz 48.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for agent-skillctl 0.1.1
File Interpreter ABI Platform
agent_skillctl-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 65.6 kB

Release files / agent_skillctl-0.1.1.tar.gz

Download URL agent_skillctl-0.1.1.tar.gz
Size 48.3 kB
Tags Source
SHA-256 checksum
How to use checksums
a7ee0f6da80cfe04fd51ccce7854b0c1f9b95694c40e73d59d8da98ee921b705
BLAKE2b-256 checksum
How to use checksums
60c836970c86f892e9607f5dd77588426cb3cbff3affd0c79a5d98809313bf91
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 11, 2026.

Transparency log

Release files / agent_skillctl-0.1.1-py3-none-any.whl

Download URL agent_skillctl-0.1.1-py3-none-any.whl
Size 17.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2d9b8dcc1f400d42712693f13b34f1d88bdb342d770f911bfce1d2247ea6151d
BLAKE2b-256 checksum
How to use checksums
cc22282eab28de7ac463ceaafc1733b2277431b96ded2263e4ddf6f151d964ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 11, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page