dais-skills
A Python package for programmatically discovering, downloading, and parsing Agent Skills.
Currently supports GitHub as a skill source. GitLab, arbitrary Git repositories, and custom sources (e.g. S3) are planned.
This project is in early development. The API may change at any time and backward compatibility is not guaranteed yet.
Features
- Scan a repository: given a GitHub repo URL, list every skill in it along with its path, name, and description
- Download a skill: given a repo URL and a skill path, package that skill directory as a zip byte stream
- Parse a skill archive: extract
SKILL.mdmetadata (with frontmatter) and every resource file (auto-classified as text or binary) from a zip
Installation
Requires Python 3.14+.
uv add dais-skills
# or
pip install dais-skills
Quick Start
Scan a repository for skills
import asyncio
from dais_skills import scan_repo
async def main():
skills = await scan_repo("https://github.com/<owner>/<repo>")
for s in skills:
print(s.path, "-", s.name)
print(" ", s.description)
asyncio.run(main())
scan_repo returns list[ScannedSkill], where each item has:
path: the skill directory path inside the reponame: thenamefield from theSKILL.mdfrontmatterdescription: thedescriptionfield from theSKILL.mdfrontmatter
The scanner walks the priority directories defined by the Agent Skills specification (such as skills/, .claude/skills/, .github/skills/, and so on) and skips irrelevant directories like node_modules, .git, dist, build, and __pycache__.
Download a single skill as a zip
import asyncio
from dais_skills import download_skill_zip
async def main():
data: bytes = await download_skill_zip(
"https://github.com/<owner>/<repo>",
"skills/my-skill",
)
with open("my-skill.zip", "wb") as f:
f.write(data)
asyncio.run(main())
skill_path may point at either the skill directory or the SKILL.md inside it. Both forms are treated as equivalent.
You can also pass an existing httpx.AsyncClient via the optional keyword-only argument client to reuse connections across calls.
Parse a downloaded skill archive
import zipfile
from dais_skills import Skill
with zipfile.ZipFile("my-skill.zip") as zf:
skill = Skill.from_zip(zf)
print(skill.name, skill.description)
print("license:", skill.license)
print("compatibility:", skill.compatibility)
print("allowed-tools:", skill.allowed_tools)
print("metadata:", skill.metadata)
print("body:", skill.content[:80])
for res in skill.resources:
if res.type == "text":
print("[text]", res.relative, len(res.content))
else:
print("[bin] ", res.relative, len(res.content))
Skill.from_zip will:
- Locate the skill root inside the zip (the first-level directory containing
SKILL.md, or the archive root) - Parse the frontmatter and body of
SKILL.md - Collect every remaining file as a
SkillResource, splitting them intoTextResourceandBinaryResourceviabinaryornot
Public API
Exported from the top-level package:
| Name | Description |
|---|---|
scan_repo(repo_url) -> list[ScannedSkill] |
Scan a repository and return a summary of every skill found |
download_skill_zip(repo_url, skill_path, *, client=None) -> bytes |
Download the given skill directory and pack it into a zip; optional httpx.AsyncClient reuse |
Skill.from_zip(zip_file) -> Skill |
Parse a full skill object from a zip file |
ScannedSkill |
Scan-result dataclass (path, name, description) |
Skill |
Fully parsed skill dataclass (name, description, content, optional license / compatibility / allowed_tools, metadata, resources) |
SkillResource |
TextResource | BinaryResource |
SkillException |
Base exception for this package |
ScannerError |
Base error for scanning failures |
InvalidRepoUrlError |
Invalid repository URL (scanner) |
RepositoryTreeFetchError |
Failed to fetch repository tree |
DownloaderError |
Base error for download failures |
InvalidSkillPathError |
Invalid skill path |
SkillPathNotFoundError |
Skill path not found in repository |
SkillTreeFetchError |
Failed to fetch repository tree for download |
SkillFileDownloadError |
Failed to download a skill file |
ExtractorException |
Base error for archive extraction failures |
InvalidSkillArchiveError |
Invalid skill archive |
SkillRootNotFoundError |
Skill root not found in archive |
SkillMdNotFoundError |
SKILL.md not found in archive |
GitHub client exceptions (GitHubError, InvalidGitHubUrlError, GitHubApiError, GitHubTreeFetchError, GitHubBlobFetchError) are available from dais_skills.public.
Development
uv sync
uv run pytest # run unit tests
uv run pytest -m smoke # run end-to-end smoke tests that hit real network services
Roadmap
- Scan skills in a GitHub repository
- Download and package a single skill from GitHub
- Parse a skill archive
- GitLab repository support
- Arbitrary remote Git repository support
- S3 and other custom sources
Metadata
Release files for dais-skills 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dais_skills-0.1.5.tar.gz | 8.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dais_skills-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.5 kB
Release files / dais_skills-0.1.5.tar.gz
| Download URL | dais_skills-0.1.5.tar.gz |
|---|---|
| Size | 8.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2b080507e421ab04732fdec81da67230aaa5e967009a4dfca3816639f1ae8970
|
|
BLAKE2b-256 checksum How to use checksums |
86985a2db0b73066f2e2747ed94f5dffa99d51dda9f6e7541a754a541ca1c30b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 12, 2026.
Transparency logRelease files / dais_skills-0.1.5-py3-none-any.whl
| Download URL | dais_skills-0.1.5-py3-none-any.whl |
|---|---|
| Size | 13.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1de2b0a2341b20111d91e922b4f0d62ecb35006259b6502bc627ef0b4017b8fc
|
|
BLAKE2b-256 checksum How to use checksums |
8b54ad87dd4378f20caeed3dab1fd593441b8267934e318536fee2ccae7656f9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 12, 2026.
Transparency log