broskill
yo. broskill is a lightweight, quick-loading skill loader for agentic projects — a "skill" being a folder with instructions (SKILL.md) plus optional reference docs, python scripts as tools, and static assets. broskill's whole job is finding those folders, loading them, and turning their scripts into callable tools. That's it. That's the lib.
part of the bro lib family — small, opinionated, do-one-thing tools built to stop us from writing the same glue code every time we spin up a new agentic project.
why this exists
every time you start a new agent project you end up rebuilding the same boring plumbing: some way to discover "skills," some way to load their instructions, some way to turn a script into a tool the model can call. broskill is that plumbing, ripped out of real projects where we got tired of writing it again and again.
heads up: this is an opinionated lib. it works one way — SKILL.md + references/ + scripts/ + assets/, discovered off a skills/ folder. if that convention fits your project, great, you just saved yourself a bunch of setup. if it doesn't, this probably isn't your lib, and that's fine — go build your own, that's basically how broskill got made in the first place. inspired by real work and real struggle. voilà, here it is.
install
uv pip install -e .
the shape of a skill
skills/
read-file/
SKILL.md # frontmatter (name, description, version, ...) + instructions
references/
script.md # optional deep-dive docs, loaded on demand
scripts/
read_file.py # a get_args()-based python script -> becomes a callable tool
assets/
template.md # optional static files a skill hands out
SKILL.md's frontmatter has to match the Skill dataclass field-for-field (name, description, version required; tags, keywords, default, status optional). Want to build one from scratch? There's a skill for that: skills/create-skill.
quick start
load skills — SkillControl
from broskill.processing.path import find_root
from broskill.processing.skill import SkillControl
root = find_root() # walks up 'til it finds a skills/ folder
sc = SkillControl(root=root / "skills")
for skill in sc.list_skills():
print(skill.name, "-", skill.description)
body = sc.load_skill("read-file") # -> SKILL.md's instructions, as a str
ref = sc.load_skill_extension("read-file", "references/script.md")
Full runnable version: examples/case1.py.
turn a script into a tool — ToolControl
from broskill.processing.skill import SkillControl
from broskill.processing.tool import ToolControl, to_args
import subprocess, sys
sc = SkillControl(root=root / "skills")
sc.load_skill("read-file")
tc = ToolControl(sc)
tool = tc.load_tool("read-file", "scripts/list_files.py")
# tool.name, tool.description, tool.args -> ready to hand to an LLM's tool schema
result = subprocess.run(
[sys.executable, str(tool.path), *to_args({"path": "skills/**/*.md"})],
capture_output=True, text=True,
)
A script only needs one thing to become a tool: a module-level get_args() returning an argparse.ArgumentParser. broskill reads that parser and builds the schema for you — no separate tool-definition file to keep in sync. See skills/create-skill/references/script.md for the full contract.
Full runnable version: examples/case2.py.
running the tests
uv run pytest
uv run ruff check
more
VERSIONS.md— changelogLICENSE— MITskills/create-skill— a skill that helps you build more skillsskills/read-file— the skill used in both examples above, a decent reference for what a real skill looks like
stay chill, ship skills. 🤙
Release files for broskill 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| broskill-0.1.1.tar.gz | 50.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| broskill-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 60.7 kB
Release files / broskill-0.1.1.tar.gz
| Download URL | broskill-0.1.1.tar.gz |
|---|---|
| Size | 50.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2908b4640d3f6cdb5821c269cae39d2ca6e1fe0a25b7376817e93110d1462f68
|
|
BLAKE2b-256 checksum How to use checksums |
afdeb0c6bcb34c89dffe7766953870b8f812350523c9b7fdb1762baad9685f72
|
| 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 Sep 13, 2026.
Transparency logRelease files / broskill-0.1.1-py3-none-any.whl
| Download URL | broskill-0.1.1-py3-none-any.whl |
|---|---|
| Size | 10.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
74cb7afd29ebab99bf75afeb44a3fdb10b03274d3987f4a87532bef7d70de97d
|
|
BLAKE2b-256 checksum How to use checksums |
b6cd650eec7064b3efc1986a54af20cb0891fe08c772fdaf9eba8b4d210d520e
|
| 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 Sep 13, 2026.
Transparency log