Generic installer core for projects that distribute agent skills
Project description
Agent Skill Installer
agent-skill-installer provides the agent-skill-installer command and the
agent_skill_installer Python package for projects that distribute agent
skills. The command can install skills from PyPI wheels, GitHub archives, or
local SKILL.md directories; the library exposes the same installer machinery
for custom integrations.
The core is intentionally project-neutral. It does not ship a skill and does not know about any specific skill package.
Currently Supported Agents
- Codex
- Claude Code
Examples
The examples/ directory contains runnable integration examples:
examples/demo-installer/is a complete skill-carrying Python package with a bundled demo skill and a project-specific CLI wrapper.examples/api-install/shows how to install and uninstall a skill directly through the Python API without exposing a package CLI.
See examples/README.md
for the files to inspect and the commands to run.
What It Provides
- Codex and Claude Code install targets.
globalandreposcopes.- Bundled skill copy installs.
- Editable installs from a local checkout containing
skill/SKILL.mdor a rootSKILL.md. - PyPI wheel installs that extract only the project skill payload.
- GitHub archive installs from repository root,
skill/, or an explicit tree path. - Install manifests for ownership checks and uninstall cleanup.
- Discoverability hook blocks with project-specific markers.
- A generic console app with a text UI, no-UI mode, and reusable CLI functions for custom tools.
Command Usage
Run the generic UI and choose an external source:
agent-skill-installer
The generic command installs from local repos or skill directories, PyPI
packages, and GitHub repos. Use --no-ui for scripts.
When you run the interactive command from a development checkout that contains
SKILL.md or skill/SKILL.md, the UI shows the local repo or skill directory
source first and uses that detected path as the default. This is the fastest
development-mode path for testing a skill before publishing it.
Install a published skill package by extracting its bundled skill payload from a wheel:
agent-skill-installer --no-ui install \
--pypi-package your-skill-package \
--pypi-version 1.2.3 \
--agent all \
--scope global
The interactive PyPI package and GitHub URL prompts remember the 10 most recent
successful installs for each source in
~/.agent-skill-installer/recent-installations.json and offer them in
filterable dropdowns. If that state file cannot be read, the installer ignores
it and continues with an empty recent list.
After a PyPI package and version are selected in the UI, the installer downloads
the wheel to a temporary directory and validates that it contains a bundled
SKILL.md. The final install reuses that same downloaded wheel.
Install directly from GitHub without cloning:
agent-skill-installer --no-ui install \
--github-url https://github.com/OWNER/REPO/tree/main/skill \
--agent codex \
--scope repo
Install a local repo or skill directory:
agent-skill-installer --no-ui install \
--local-repo ./your-skill-package \
--skill-name your-skill-package \
--agent codex \
--scope repo
Uninstall a skill installed by the generic command:
agent-skill-installer --no-ui uninstall \
--skill-name your-skill-package \
--agent codex \
--scope repo
Library Usage
Projects may also import Installer directly for tests, custom tooling, or
applications that want to drive installation themselves:
from agent_skill_installer import Installer, SkillProject
PROJECT = SkillProject(
package_name="your-skill-package",
import_name="your_skill_package",
version="1.2.3",
skill_name="your-skill-package",
description="Use this skill for my project workflows.",
)
Installer(PROJECT).install(["codex"], "global")
Installer(PROJECT).install(["claude"], "repo")
Installer(PROJECT).uninstall(["codex"], "global")
By default, bundled installs read skill files from
your_skill_package/_skill inside the project package. Tests or development tools
can point bundled_skill_source at a filesystem directory.
Use In Your Skill Package
agent-skill-installer can install directly from generic sources, so a skill
package does not need to expose its own installer command. Packages that still
want a project-specific command may wrap the shared CLI helpers.
Package Layout
A typical setuptools project looks like this:
your-skill-package/
MANIFEST.in
pyproject.toml
src/
your_skill_package/
__init__.py
cli.py
_skill/
SKILL.md
agents/
openai.yaml
scripts/
helper.py
The bundled skill directory must contain SKILL.md. By default, the installer
looks for that directory at your_skill_package/_skill, where your_skill_package is
the SkillProject.import_name value and _skill is the default
SkillProject.bundled_skill_path.
Package Configuration
The skill package should depend on this library and include the bundled skill files in its wheel:
[build-system]
requires = ["setuptools>=77"]
build-backend = "setuptools.build_meta"
[project]
name = "your-skill-package"
version = "1.2.3"
description = "Install the your-skill-package skill for supported agents"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"agent-skill-installer>=0.1.0",
]
[tool.setuptools.packages.find]
where = ["src"]
[tool.setuptools]
include-package-data = true
For setuptools, include the bundled skill payload with MANIFEST.in:
recursive-include src/your_skill_package/_skill *
If you use another build backend, configure the equivalent package-data rule so
the built wheel contains your_skill_package/_skill/SKILL.md and any related skill
files.
Project Metadata
Put the project version somewhere importable by the wrapper:
"""My agent skill package."""
__version__ = "1.2.3"
If you want a project-specific wrapper, create a file such as
src/your_skill_package/cli.py:
from __future__ import annotations
from agent_skill_installer import SkillProject
from agent_skill_installer.cli import main as installer_main
from . import __version__
PROJECT = SkillProject(
package_name="your-skill-package",
import_name="your_skill_package",
version=__version__,
skill_name="your-skill-package",
description="Use this skill for my project workflows.",
)
def main(argv=None) -> int:
return installer_main(argv, project=PROJECT)
The most important fields are:
| Field | Purpose |
|---|---|
package_name |
Distribution name and manifest ownership name. Usually the PyPI project name. |
import_name |
Import package that contains the bundled skill files. |
version |
Version recorded in install manifests and shown by the CLI. Keep it aligned with the package version. |
skill_name |
Installed skill directory name and default discoverability trigger. |
description |
Text used in default discoverability hook blocks. |
bundled_skill_path |
Package-relative bundled skill directory. Defaults to _skill. |
bundled_skill_source |
Optional filesystem directory for tests or custom development tooling. |
pypi_project_name |
Optional PyPI project name when it differs from package_name. |
hook_blocks |
Optional per-agent custom discoverability blocks keyed by codex or claude. |
manifest_package_aliases |
Optional old package names accepted when migrating existing installs. |
marker_slug_override |
Optional discoverability marker slug for preserving hook markers during renames. |
Local Development
Install directly from a local repo or skill directory while developing:
agent-skill-installer --no-ui install \
--local-repo ./your-skill-package \
--skill-name your-skill-package \
--agent all \
--scope repo
agent-skill-installer --no-ui uninstall \
--skill-name your-skill-package \
--agent all \
--scope repo
Use --scope repo from inside the repository where the agent should discover
the skill, or pass --repo PATH.
The interactive generic command also detects local development sources. From a
directory containing SKILL.md or skill/SKILL.md, run:
agent-skill-installer
The first install source option will be local development mode, with the local skill path already selected as the default.
Installed Paths
The installer supports these targets:
| Agent | Scope | Skill directory | Hook file |
|---|---|---|---|
| Codex | repo |
<repo>/.codex/skills/<skill_name> |
<repo>/AGENTS.md |
| Codex | global |
~/.codex/skills/<skill_name> |
~/.codex/AGENTS.md |
| Claude Code | repo |
<repo>/.claude/skills/<skill_name> |
<repo>/CLAUDE.md |
| Claude Code | global |
~/.claude/skills/<skill_name> |
~/.claude/CLAUDE.md |
Each install writes a manifest owned by the package. The manifest lets later installs replace only owned files and lets uninstall remove the skill, discoverability block, and directories the installer created.
PyPI Release Flow
After publishing your skill package to PyPI, users can install the bundled skill directly from the published wheel:
agent-skill-installer --no-ui install \
--pypi-package your-skill-package \
--agent all \
--scope global
Pin a specific published wheel version when desired:
agent-skill-installer --no-ui install \
--pypi-package your-skill-package \
--pypi-version 1.2.3 \
--agent all \
--scope global
That mode downloads the named wheel and extracts only the bundled skill payload, without installing that downloaded wheel into the current Python environment.
GitHub Source Installs
The generic command can also install the skill payload directly from a GitHub archive:
agent-skill-installer --no-ui install \
--github-url https://github.com/example/your-skill-package \
--agent all \
--scope global
By default this uses the main ref and looks for either skill/SKILL.md or a
root SKILL.md. For a specific ref or nested skill directory, use either a tree
URL or explicit flags:
agent-skill-installer --no-ui install \
--github-url https://github.com/example/your-skill-package/tree/v1/packages/skill \
--agent codex \
--scope repo
agent-skill-installer --no-ui install \
--github-url https://github.com/example/your-skill-package \
--github-ref v1 \
--github-path packages/skill \
--agent codex \
--scope repo
Before release, a minimal package check is:
python -m build
python -m twine check dist/*
python -m pip install dist/your_skill_package-1.2.3-py3-none-any.whl
Then verify the generic command against the published package:
agent-skill-installer --version
agent-skill-installer --no-ui install \
--pypi-package your-skill-package --pypi-version 1.2.3 \
--agent codex --scope repo
agent-skill-installer --no-ui uninstall \
--skill-name your-skill-package --agent codex --scope repo
Status
This is a standalone, generic installer. Skill packages can rely on the
agent-skill-installer command directly, or use the Python APIs for custom
integration.
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
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 agent_skill_installer-0.1.0.tar.gz.
File metadata
- Download URL: agent_skill_installer-0.1.0.tar.gz
- Upload date:
- Size: 59.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a956b3f072d79c0f6ea9fc8c08f03e21caf24b164e7ec46363be1f4afaad5158
|
|
| MD5 |
90f0c1721f8eeba704006c696c9141d2
|
|
| BLAKE2b-256 |
9a35f1edd3ed7ff27ba1403bd49856a49c6a192c967986a949ce1b5bab627fd7
|
Provenance
The following attestation bundles were made for agent_skill_installer-0.1.0.tar.gz:
Publisher:
publish.yml on omry/agent-skill-installer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agent_skill_installer-0.1.0.tar.gz -
Subject digest:
a956b3f072d79c0f6ea9fc8c08f03e21caf24b164e7ec46363be1f4afaad5158 - Sigstore transparency entry: 1574538868
- Sigstore integration time:
-
Permalink:
omry/agent-skill-installer@a7e1a542cda4ae27097c9000643f10eb37cbcdf8 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/omry
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a7e1a542cda4ae27097c9000643f10eb37cbcdf8 -
Trigger Event:
release
-
Statement type:
File details
Details for the file agent_skill_installer-0.1.0-py3-none-any.whl.
File metadata
- Download URL: agent_skill_installer-0.1.0-py3-none-any.whl
- Upload date:
- Size: 50.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8858b6955e20cf593484ae713082ff5b359b24f9b35fbd932d827023dc588406
|
|
| MD5 |
ce03b052016ca1405b2476a2f7f17295
|
|
| BLAKE2b-256 |
2c43153a72b0956b8487c57f57e5dd25da5bfd31be40091b53b6828f25a5229a
|
Provenance
The following attestation bundles were made for agent_skill_installer-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on omry/agent-skill-installer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agent_skill_installer-0.1.0-py3-none-any.whl -
Subject digest:
8858b6955e20cf593484ae713082ff5b359b24f9b35fbd932d827023dc588406 - Sigstore transparency entry: 1574538910
- Sigstore integration time:
-
Permalink:
omry/agent-skill-installer@a7e1a542cda4ae27097c9000643f10eb37cbcdf8 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/omry
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a7e1a542cda4ae27097c9000643f10eb37cbcdf8 -
Trigger Event:
release
-
Statement type: