Skip to main content

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.md metadata (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 repo
  • name: the name field from the SKILL.md frontmatter
  • description: the description field from the SKILL.md frontmatter

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:

  1. Locate the skill root inside the zip (the first-level directory containing SKILL.md, or the archive root)
  2. Parse the frontmatter and body of SKILL.md
  3. Collect every remaining file as a SkillResource, splitting them into TextResource and BinaryResource via binaryornot

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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dais_skills-0.1.5.tar.gz (8.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dais_skills-0.1.5-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

File details

Details for the file dais_skills-0.1.5.tar.gz.

File metadata

  • Download URL: dais_skills-0.1.5.tar.gz
  • Upload date:
  • Size: 8.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dais_skills-0.1.5.tar.gz
Algorithm Hash digest
SHA256 2b080507e421ab04732fdec81da67230aaa5e967009a4dfca3816639f1ae8970
MD5 4694863e2f0df99fa4bf0947a8b554af
BLAKE2b-256 86985a2db0b73066f2e2747ed94f5dffa99d51dda9f6e7541a754a541ca1c30b

See more details on using hashes here.

Provenance

The following attestation bundles were made for dais_skills-0.1.5.tar.gz:

Publisher: publish.yaml on Dais-Project/Dais-Skills

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dais_skills-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: dais_skills-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 13.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dais_skills-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 1de2b0a2341b20111d91e922b4f0d62ecb35006259b6502bc627ef0b4017b8fc
MD5 078795286e0bd2d55d58a00c6fc134f0
BLAKE2b-256 8b54ad87dd4378f20caeed3dab1fd593441b8267934e318536fee2ccae7656f9

See more details on using hashes here.

Provenance

The following attestation bundles were made for dais_skills-0.1.5-py3-none-any.whl:

Publisher: publish.yaml on Dais-Project/Dais-Skills

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.5 This release

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page