Skip to main content

skill-guard

The quality gate for Agent Skills.

PyPI version License Python 3.11+

skill-guard is a CLI tool that validates, secures, and checks Agent Skills, with the default workflow centered on pre-merge repository gates.

The Problem

Agent Skills are powerful. They're also ungoverned. As soon as more than one person contributes skills to a shared agent, things break in hard-to-diagnose ways:

  • A new skill's description overlaps with an existing one → agent picks the wrong skill half the time
  • Skills with dangerous scripts get merged because nobody reviewed the scripts/ directory
  • Nobody knows what skills are installed, who owns them, or whether they still work
  • A skill passes every test in isolation but fails when the real agent uses it with 25 other skills loaded

skill-guard is the quality gate that catches these problems before they reach production.

What It Does

ONBOARDING (pre-merge, in CI):
  skill-guard validate   → format compliance + quality scoring
  skill-guard secure     → scan for dangerous patterns
  skill-guard conflict   → detect trigger overlap with existing skills
  skill-guard check      → runs validate + secure + conflict as a single gate

Quick Start

pip install skill-guard

# Initialize in your skills repo
skill-guard init

# Run the default gate
skill-guard check ./skills/my-skill/ --against ./skills/

If you only learn one command, learn check. It is the default pre-merge workflow and the command the GitHub Actions path is built around.

Advanced / Secondary Commands

Use these when you need to inspect one part of the gate in isolation or run non-default workflows:

# Format and metadata quality only
skill-guard validate ./skills/my-skill/

# Security only
skill-guard secure ./skills/my-skill/
skill-guard secure ./skills/my-skill/ --skip-references

# Conflict detection only
skill-guard conflict ./skills/my-skill/ --against ./skills/

Example Output

$ skill-guard validate ./skills/my-skill/

 skill-guard validate — my-skill
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Check                     ┃ Result                                           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ skill_md_exists           │ ✅ SKILL.md found                                │
│ valid_yaml_frontmatter    │ ✅ Valid YAML frontmatter                        │
│ name_field_present        │ ✅ name: my-skill                                │
│ description_field_present │ ✅ description field present                     │
│ directory_name_matches    │ ✅ Directory name matches skill name             │
│ description_trigger_hint  │ ✅ Description contains trigger hint ('Use when')│
│ no_broken_body_paths      │ ✅ No broken relative paths in SKILL.md body     │
│ evals_directory_exists    │ ⚠️ No evals/ directory found                     │
│                           │ → Create evals/evals.json or evals/config.yaml   │
│ metadata_has_author       │ ✅ author: my-team                               │
│ metadata_has_version      │ ✅ version: 1.0                                  │
└───────────────────────────┴──────────────────────────────────────────────────┘
Score: 97/100 | Grade: A | Blockers: 0 | Warnings: 1

Prerequisites

Requirement Version Notes
Python 3.11+ Required. 3.12 and 3.13 tested.
pip any recent Bundled with Python
typer ≥0.13.0 Installed automatically

Note: every skill-guard command works fully offline — no agent or API key needed.

The default offline path is already useful on its own: validate catches structure and metadata problems, secure catches risky patterns with remediation hints, conflict flags overlapping triggers, and check combines those static gates into one pre-merge decision.

Installation

# Core (static analysis — no agent required)
pip install skill-guard

# Optional embeddings support
pip install skill-guard[embeddings]

# Optional LLM-based conflict detection
pip install skill-guard[llm]

Conflict Detection Modes

# TF-IDF (default)
skill-guard conflict ./skills/my-skill/ --against ./skills/ --method tfidf

# Embeddings-based overlap detection
skill-guard conflict ./skills/my-skill/ --against ./skills/ --method embeddings

# Choose a different embeddings model
skill-guard conflict ./skills/my-skill/ --against ./skills/ --method embeddings --model all-MiniLM-L12-v2

# Offline embeddings (local model only; no downloads)
skill-guard conflict ./skills/my-skill/ --against ./skills/ --method embeddings \
  --model-path /models/all-MiniLM-L6-v2 --offline

# LLM-based overlap detection
export OPENAI_API_KEY=...
skill-guard conflict ./skills/my-skill/ --against ./skills/ --method llm

embeddings uses the all-MiniLM-L6-v2 sentence-transformers model by default (override with --model, --model-path, or conflict.embeddings_model/conflict.embeddings_model_path) and caches downloads under conflict.embeddings_cache_dir (default .skill-guard-cache/embeddings/). On first download, it prints a "Downloading model..." message to stderr. Use --offline to require a local/cached model and skip downloads. llm uses the OpenAI Chat API with gpt-4o-mini by default.

Ignoring known conflicts

Add conflict_ignore to your SKILL.md frontmatter to skip comparisons against specific skills:

---
name: my-skill
description: "Use when ..."
conflict_ignore:
  - legacy-skill
  - skills/legacy-skill/SKILL.md
---

Documentation

Anthropic Spec Validation

skill-guard validate includes Anthropic AgentSkills spec compliance checks by default. Set validate.anthropic_spec: false in skill-guard.yaml if you need to disable those additional findings.

Exit Codes

  • 0: success
  • 1: validation/security failures
  • 2: warnings only (when fail_on_warning is false)
  • 3: config error
  • 4: parse error

Pre-commit

Use pre-commit to enforce checks before skill changes land:

repos:
  - repo: https://github.com/vaibhavtupe/skill-guard
    rev: v0.9.0
    hooks:
      - id: skill-guard-validate
      - id: skill-guard-secure
      - id: skill-guard-check

These hooks run against changed SKILL.md files, deduplicate by skill root, and then execute the corresponding skill-guard command for each affected skill.

Templates

Use skill-guard init --template base to scaffold a new skill, or skill-guard init --list-templates to see the available scaffolds. Generated templates include SKILL.md, evals/evals.json, references/, scripts/, and assets/ so they validate immediately.

GitHub Actions

name: skill-guard PR Gate

on:
  pull_request:
    paths:
      - "skills/**"

jobs:
  skill-guard:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"
      - run: python -m pip install skill-guard
      - run: |
          skill-guard check skills/ \
            --changed \
            --base-ref "${{ github.event.pull_request.base.sha }}" \
            --head-ref "${{ github.sha }}" \
            --format md > skill-guard-summary.md

See docs/ci-integration.md for the canonical workflow, JSON + markdown artifact strategy, and the checked-in example at .github/workflows/skill-guard-pr-gate.yml.

What skill-guard Does NOT Do

  • Does not replace Anthropic's skill-creator for writing skills
  • Does not host or serve skills — skills live in your repo
  • Does not modify skills — it reports issues, authors fix them
  • Does not require a database or server — everything runs from files in your repo

Contributing

See CONTRIBUTING.md. We welcome contributions of all kinds.

For planning and release discipline:

  • ROADMAP.md is the canonical scope source
  • docs/automation-policy.md defines PM ↔ Dev workflow
  • docs/release-gate.md is the required pre-release checklist

License

Apache 2.0. See LICENSE.

Download files

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

Source Distribution

skill_guard-0.9.0.tar.gz (110.9 kB view details)

Uploaded Source

Built Distribution

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

skill_guard-0.9.0-py3-none-any.whl (58.0 kB view details)

Uploaded Python 3

File details

Details for the file skill_guard-0.9.0.tar.gz.

File metadata

  • Download URL: skill_guard-0.9.0.tar.gz
  • Upload date:
  • Size: 110.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for skill_guard-0.9.0.tar.gz
Algorithm Hash digest
SHA256 b4020e1d078287e22db7a0df29a8547a448ae223def196df5bc73a2aba6e160c
MD5 314925493822276d26083325b4606516
BLAKE2b-256 963bba93befbe5382117c452c8d88ae1f2ad59e28facec7e06342d11e2524ab4

See more details on using hashes here.

Provenance

The following attestation bundles were made for skill_guard-0.9.0.tar.gz:

Publisher: publish.yaml on vaibhavtupe/skill-guard

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

File details

Details for the file skill_guard-0.9.0-py3-none-any.whl.

File metadata

  • Download URL: skill_guard-0.9.0-py3-none-any.whl
  • Upload date:
  • Size: 58.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for skill_guard-0.9.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e993ff43288051a09ba42eee4a738856e421ba1dce5f21199368fe7254d042cc
MD5 c1c64f5f8fa69914e095c56d0f6a3879
BLAKE2b-256 9f9d070a36f6159ea22e51d147258c3f83a94f3d4fb282e54fa8ea4a3811d27c

See more details on using hashes here.

Provenance

The following attestation bundles were made for skill_guard-0.9.0-py3-none-any.whl:

Publisher: publish.yaml on vaibhavtupe/skill-guard

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.9.0 This release

2 files

0.8.0

2 files

0.7.2

2 files

0.7.1

2 files

0.7.0

2 files

0.6.0

2 files

0.5.0

2 files

0.4.5

2 files

0.4.4

2 files

0.4.3

2 files

0.4.2

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