aigent 0.5.0

A library, CLI, and Claude plugin for managing agent skill definitions
Documentation

Agent skills are an open standard for packaging reusable instructions that AI coding agents can discover and invoke automatically. Each skill is defined in a SKILL.md file — a Markdown document fronted by YAML metadata (name, description, compatibility, allowed tools) that tells the agent what the skill does and when to invoke it. The metadata is indexed at session start for fast discovery; the full Markdown body is loaded on demand, following a progressive-disclosure pattern that keeps the context window lean.

The aigent tool validates, formats, and assembles these skill files so you can focus on writing the instructions rather than fighting the specification.

Table of contents

Installation

Pre-built binaries are available for all major platforms — no Rust toolchain required. If you prefer to build from source, see From crates.io or From source below.

Pre-built binaries

Download a pre-built binary from the latest release (Linux x86_64/aarch64, macOS x86_64/aarch64, Windows x86_64).

Install script (Linux and macOS)

The script detects the OS and architecture, downloads the latest release archive from GitHub, verifies its SHA-256 checksum, and extracts the binary to ~/.local/bin.

curl -fsSL https://raw.githubusercontent.com/wkusnierczyk/aigent/main/install.sh | bash

Or download and review the script before running:

curl -fsSL https://raw.githubusercontent.com/wkusnierczyk/aigent/main/install.sh -o install.sh
less install.sh        # review the script
bash install.sh

From crates.io

Requires Rust (stable toolchain).

cargo install aigent

From source

git clone https://github.com/wkusnierczyk/aigent.git
cd aigent
cargo install --path .

Quick start

Note
The examples below use the aigent CLI.

# Initialize a new skill
aigent init my-skill/

# Create a skill from a description
aigent new "Process PDF files and extract text" --no-llm

# Validate (from inside a skill directory — path defaults to .)
cd my-skill/
aigent validate --structure

# Or specify a path explicitly
aigent validate my-skill/ --structure

# Run validate + semantic quality checks
aigent check my-skill/

# Score a skill against best practices (0–100)
aigent score my-skill/

# Format a SKILL.md (canonical key order, clean whitespace)
aigent format my-skill/

# Probe skill activation against a query
aigent probe my-skill/ --query "process PDF files"

# Run fixture-based test suite
aigent test my-skill/

# Check for upgrade opportunities
aigent upgrade my-skill/

# Assemble skills into a Claude Code plugin
aigent build my-skill/ other-skill/ --output ./dist

# Generate a skill catalog
aigent doc skills/ --recursive

# Read skill properties as JSON
aigent properties my-skill/

# Generate XML prompt for LLM injection
aigent prompt my-skill/ other-skill/

To enable LLM-enhanced generation, set an API key in your environment (for example, export ANTHROPIC_API_KEY=sk-...).

Without an API key, the builder uses deterministic mode, which requires no configuration. See Builder Modes for details.

Library usage

use std::path::Path;

// Validate a skill directory
let errors = aigent::validate(Path::new("my-skill"));

// Read skill properties
let props = aigent::read_properties(Path::new("my-skill")).unwrap();

// Generate prompt XML
let xml = aigent::to_prompt(&[Path::new("skill-a"), Path::new("skill-b")]);

// Format a SKILL.md
let result = aigent::format_skill(Path::new("my-skill")).unwrap();

// Assemble skills into a plugin
let opts = aigent::AssembleOptions {
    output_dir: std::path::PathBuf::from("./dist"),
    name: None,
    validate: true,
};
let result = aigent::assemble_plugin(
    &[Path::new("skill-a"), Path::new("skill-b")], &opts,
).unwrap();

// Build a skill
let spec = aigent::SkillSpec {
    purpose: "Process PDF files".to_string(),
    no_llm: true,
    ..Default::default()
};
let result = aigent::build_skill(&spec).unwrap();

SKILL.md format

The format follows the Agent Skills open standard, originally defined by Anthropic. Skills are defined in SKILL.md files with YAML frontmatter and a Markdown body.

Note
skill.md is also recognized, but SKILL.md is preferred.

For example:

---
name: extract-csv-data
description: >-
  Extract and transform data from CSV files. Use when the user needs
  to parse, filter, or aggregate CSV data.
license: MIT
compatibility: claude
allowed-tools: Read, Write, Bash
---

# Extract CSV Data

Parse and transform CSV files into structured data.

## When to use

Use this skill when:
- The user asks to extract data from CSV files
- The task involves filtering or aggregating tabular data

## Instructions

1. Read the CSV file using the Read tool
2. Parse the header row to identify columns
3. Apply any requested filters or transformations

Frontmatter fields

Field Required Description
name yes Kebab-case identifier (e.g., extract-csv-data)
description yes Free-text description of what the skill does and when to use it
license no Free-text licence string (e.g., MIT)
compatibility no Free-text string indicating compatible agent platforms (e.g., claude-code)
allowed-tools no Comma-separated list of tools the skill may use (e.g., Bash, Read, Write)

Validation rules

Field Rule
name, description Required and non-empty
name Lowercase letters, digits, and hyphens only; maximum 64 characters
name Must not contain reserved words (anthropic, claude)
name No XML tags; must match directory name
name Unicode NFKC normalization applied before validation (e.g., fi)
description Maximum 1024 characters; no XML/HTML tags
compatibility Maximum 500 characters (if present)
Body Warning if longer than 500 lines

Builder modes

The skill builder operates in two modes:

Deterministic — Always available, zero configuration. Uses heuristic rules to derive skill names (gerund form, kebab-case), descriptions, and Markdown bodies. Output is formulaic but valid.

LLM-enhanced — Auto-detected via environment variables. Produces richer, more natural output. Each generation step (name, description, body) independently falls back to deterministic on LLM failure.

Provider detection order

Priority Environment Variable Provider
1 ANTHROPIC_API_KEY Anthropic Claude
2 OPENAI_API_KEY OpenAI
3 GOOGLE_API_KEY Google Gemini
4 OLLAMA_HOST Ollama (local)

Available models

Default models as of 2026-02-20:

Provider Environment Variable Default Model Override Variable
Anthropic ANTHROPIC_API_KEY claude-sonnet-4-20250514 ANTHROPIC_MODEL
OpenAI OPENAI_API_KEY gpt-4o OPENAI_MODEL
Google GOOGLE_API_KEY gemini-2.0-flash GOOGLE_MODEL
Ollama OLLAMA_HOST llama3.2 OLLAMA_MODEL

OpenAI-compatible endpoints (vLLM, LM Studio, etc.) are supported via OPENAI_API_BASE or OPENAI_BASE_URL.

Use --no-llm to force deterministic mode regardless of available providers.

Compliance

aigent is built to be fully compliant with the Agent Skills open standard and the Python reference implementation.

Specification coverage

Three-way comparison of the Anthropic agent skill specification, aigent, and the Python reference implementation.

The following table shows key validation rules from the Anthropic specification. Additional checks (frontmatter structure, metadata keys, YAML syntax) are implemented but not listed as they are standard parser behaviour.

Rule aigent Specification Python Reference
Name ≤ 64 characters
Name: lowercase + hyphens
Name: no XML tags
Name: no reserved words
Name: Unicode NFKC
Description: non-empty
Description ≤ 1024 characters
Description: no XML tags
Frontmatter --- delimiters
Compatibility ≤ 500 characters
Body ≤ 500 lines warning
Prompt XML format
Path canonicalization
Post-build validation

aigent implements all rules from the specification, plus additional checks (Unicode NFKC normalization, path canonicalization, post-build validation) that go beyond both the specification and the reference implementation.

aigent vs. plugin-dev

Anthropic's plugin-dev plugin (bundled with Claude Code) and aigent are complementary tools for skill development.

aigent plugin-dev
What Rust CLI + library Claude Code plugin (LLM-guided)
Scope Deep: SKILL.md toolchain Broad: entire plugin ecosystem
Validation Deterministic — typed diagnostics, error codes, JSON output Heuristic — agent-based review
Scoring Weighted 0–100 with CI gating Not available
Formatting aigent format — idempotent, --check for CI Not available
Testing Fixture-based (tests.yml) + single-query probe General guidance only
Assembly aigent build — reproducible, scriptable /create-plugin — guided, interactive
Ecosystem Skills only Skills + commands + agents + hooks + MCP + settings

Overall:

  • aigent handles the depth of SKILL.md quality enforcement (validation, scoring, formatting, testing, assembly).
  • plugin-dev covers the breadth of the Claude Code plugin ecosystem (7 component types, ~21,000 words of guidance).

Use plugin-dev to learn patterns; use aigent to enforce them.

Note
aigent is in active development and will likely cover more of plugin-dev's functionality in future releases (see Roadmap).

For a complete comparison, see dev/plugin-dev.md.

Extras

Features in aigent that go beyond the specification and reference implementation.

Feature Description
Semantic linting Quality checks: third-person descriptions, trigger phrases, gerund names, generic names
Quality scoring Weighted 0–100 score with distinct pass/fail labels per check
Auto-fix Automatic correction of fixable issues (e.g., name casing)
Skill builder Generate skills from natural language (deterministic + multi-provider LLM)
Interactive build Step-by-step confirmation mode for skill generation
Skill tester (probe) Simulate skill activation with weighted scoring formula (0.5×description + 0.3×trigger + 0.2×name)
Fixture-based testing Run test suites from tests.yml with expected match/no-match and minimum score thresholds
SKILL.md formatter Canonical YAML key ordering, consistent whitespace, idempotent formatting
Skill-to-plugin assembly Package skill directories into a Claude Code plugin with plugin.json manifest
Skill upgrade Detect and apply best-practice upgrades with --full mode (validate + lint + fix + upgrade)
Unified check command check = validate + semantic lint; --no-validate for lint-only
Directory structure validation Check for missing references, script permissions, nesting depth
Cross-skill conflict detection Name collisions, description similarity, token budget analysis
Documentation generation Markdown skill catalog with diff-aware output
Watch mode Continuous validation on filesystem changes (optional notify feature)
Multi-format prompt output XML, JSON, YAML, Markdown prompt generation
Multi-format validation output Text and JSON diagnostic output
Token budget estimation Per-skill and total token usage reporting
Claude Code plugin Hybrid skills that work with or without the CLI installed

CLI reference

Run aigent --help for a list of commands.
Run aigent <command> --help for details on a specific command (flags, arguments, examples).

Full API documentation is available at docs.rs/aigent.

Commands

Quality spectrum: validate (specification conformance) → check (+ semantic quality) → score (quantitative 0–100).

Note When no path is given, the current directory is used. This lets you run aigent validate, aigent format --check, etc. without specifying a path when the current directory contains a SKILL.md file. The tool does not search parent directories.

Note Backward compatibility: The following old command names are available as hidden aliases and continue to work.

Old name Current name
create new
fmt format
lint check
read-properties properties
to-prompt prompt

Exit codes

All commands exit 0 on success and 1 on failure. The table below clarifies what "success" means for each command.

Command Exit 0 Exit 1
build Plugin assembled successfully Assembly error
check No errors Errors found (warnings do not affect exit code)
doc Catalog generated I/O error
format All files already formatted Files were reformatted (with --check) or error
init Template created Directory already exists or I/O error
new Skill created Build error
probe At least one result printed All directories failed to parse
prompt Prompt generated No valid skills found
properties Properties printed Parse error
score Perfect score (100/100) Score below 100
test All test cases pass Any test case fails
upgrade No suggestions, or applied successfully Unapplied suggestions remain, or error
validate No errors Errors found (warnings do not affect exit code)

Command flags

build (assembly) flags

Assemble skills into a Claude Code plugin.

check flags

Run validate + semantic lint checks (superset of validate).

format flags

Format SKILL.md files (canonical key order, clean whitespace).

new flags

Create a skill from natural language.

probe flags

Probe skill activation against a sample user query.

test flags

Run fixture-based test suites from tests.yml.

upgrade flags

Check a skill for upgrade opportunities.

validate flags

Validate skill directories against the specification.

Validation targets control which frontmatter fields are considered known:

Target Description
standard (default) Only Anthropic specification fields; warns on extras like argument-hint
claude-code Standard fields plus Claude Code extension fields (e.g., argument-hint, context)
permissive No unknown-field warnings; all fields accepted

Note
Semantic lint checks are available with check.
Use aigent check for combined validation + linting, or aigent check --no-validate for lint-only.

Command examples

build — Assemble skills into a plugin

Packages one or more skill directories into a Claude Code plugin directory with a plugin.json manifest, skills/ subdirectory, and scaffolded agents/ and hooks/ directories.

$ aigent build skills/aigent-validator skills/aigent-scorer --output ./dist
Assembled 2 skill(s) into ./dist

The output structure:

dist/
├── plugin.json
├── skills/
│   ├── aigent-validator/
│   │   └── SKILL.md
│   └── aigent-scorer/
│       └── SKILL.md
├── agents/
└── hooks/

check — Validate + semantic quality checks

Runs specification conformance (like validate) plus semantic quality checks: third-person descriptions, trigger phrases, gerund name forms, generic names, and description detail. Use --no-validate to skip specification checks and run semantic lint only.

Diagnostics use three severity levels:

  • error — specification violation (causes exit 1)
  • warning — specification conformance issue (does not affect exit code)
  • info — quality suggestion from semantic lint (does not affect exit code)
$ aigent check skills/aigent-validator
warning: unexpected metadata field: 'argument-hint'
info: name does not use gerund form

Semantic lint only:

$ aigent check --no-validate skills/aigent-validator
info: name does not use gerund form

doc — Generate a skill catalog

Produces a markdown catalog of skills. Use --recursive to discover skills in subdirectories, and --output to write to a file (diff-aware — only writes if content changed).

$ aigent doc skills --recursive
# Skill Catalog

## aigent-builder
> Generates AI agent skill definitions (SKILL.md files) from natural
> language descriptions. ...
**Location**: `skills/aigent-builder/SKILL.md`

---

## aigent-scorer
> Scores AI agent skill definitions (SKILL.md files) against the Anthropic
> best-practices checklist. ...
**Location**: `skills/aigent-scorer/SKILL.md`

---

## aigent-validator
> Validates AI agent skill definitions (SKILL.md files) against the
> Anthropic agent skill specification. ...
**Location**: `skills/aigent-validator/SKILL.md`

---
$ aigent doc skills --recursive --output catalog.md
(writes catalog.md; re-running skips write if content unchanged)

format — Format SKILL.md files

Normalizes SKILL.md files with canonical YAML key ordering, consistent whitespace, and clean formatting. The operation is idempotent — running it twice produces no further changes.

$ aigent format my-skill/
Formatted my-skill/

Check mode reports which files would change without modifying them, and shows a unified diff of the changes:

$ aigent format --check my-skill/
Would reformat: my-skill/
--- my-skill/
+++ my-skill/ (formatted)
@@ -1,6 +1,6 @@
 ---
-allowed-tools: Bash, Read, Write
 name: my-skill
 description: ...
+allowed-tools: Bash, Read, Write
 ---

init — Create a template SKILL.md

Scaffolds a skill directory with a template SKILL.md ready for editing.

$ aigent init my-skill
Created my-skill/SKILL.md
$ cat my-skill/SKILL.md
---
name: my-skill
description: Describe what this skill does and when to use it
---

# My Skill

## Quick start
[Add quick start instructions here]

## Usage
[Add detailed usage instructions here]

new — Create a skill from natural language

Creates a complete skill directory with SKILL.md from a purpose description. Uses LLM when an API key is available, or --no-llm for deterministic mode.

$ aigent new "Extract text from PDF files" --no-llm
Created skill 'extracting-text-pdf-files' at extracting-text-pdf-files

The generated SKILL.md includes derived name, description, and a template body:

---
name: extracting-text-pdf-files
description: Extract text from PDF files. Use when working with files.
---
# Extracting Text Pdf Files

## Quick start
Extract text from PDF files

## Usage
Use this skill to Extract text from PDF files.

probe — Simulate skill activation

Probes whether a skill's description would activate for a given user query. This is a dry-run of skill discovery — "if a user said this, would Claude pick up that skill?" Accepts multiple directories — results are ranked by match score (best first).

Uses a weighted formula to compute a match score (0.0–1.0):

  • 0.5 × description overlap — fraction of query tokens in description
  • 0.3 × trigger score — match against trigger phrases ("Use when...")
  • 0.2 × name score — query-to-name token overlap

Categories based on weighted score:

  • Strong (≥ 0.4) — skill would reliably activate
  • Weak (≥ 0.15) — might activate, but description could be improved
  • None (< 0.15) — skill would not activate for this query

Also reports estimated token cost and any validation issues.

Single directory:

$ aigent probe skills/aigent-validator --query "validate a skill"
Skill: aigent-validator
Query: "validate a skill"
Description: Validates AI agent skill definitions (SKILL.md files) against
the Anthropic agent skill specification. ...

Activation: STRONG ✓ — description aligns well with query (score: 0.65)
Token footprint: ~76 tokens

Validation warnings (1):
  warning: unexpected metadata field: 'argument-hint'

Multiple directories (results ranked by score, best first):

$ aigent probe skills/* --query "validate a skill"
Skill: aigent-validator
...
Activation: STRONG ✓ — description aligns well with query (score: 0.65)

Skill: aigent-scorer
...
Activation: WEAK ⚠ — some overlap, but description may not trigger reliably (score: 0.25)

Skill: aigent-builder
...
Activation: NONE ✗ — description does not match the test query (score: 0.00)

Default directory (from inside a skill directory):

$ cd skills/aigent-validator
$ aigent probe --query "validate a skill"
Skill: aigent-validator
...
Activation: STRONG ✓ — description aligns well with query (score: 0.65)

prompt — Generate XML prompt block

Generates the <available_skills> XML block that gets injected into Claude's system prompt. Accepts multiple skill directories.

$ aigent prompt skills/aigent-validator
<available_skills>
  <skill>
    <name>aigent-validator</name>
    <description>Validates AI agent skill definitions ...</description>
    <location>skills/aigent-validator/SKILL.md</location>
  </skill>
</available_skills>

properties — Output skill metadata as JSON

Parses the SKILL.md frontmatter and outputs structured JSON. Useful for scripting and integration with other tools.

$ aigent properties skills/aigent-validator
{
  "name": "aigent-validator",
  "description": "Validates AI agent skill definitions ...",
  "allowed-tools": "Bash(aigent validate *), Bash(command -v *), Read, Glob",
  "metadata": {
    "argument-hint": "[skill-directory-or-file]"
  }
}

score — Rate a skill 0–100

Rates a skill from 0 to 100 against the Anthropic best-practices checklist. The score has two weighted categories:

  • Structural (60 points) — Checks that the SKILL.md parses correctly, the name matches the directory, required fields are present, no unknown fields exist, and the body is within size limits. All six checks must pass to earn the 60 points; any failure zeros the structural score.

  • Quality (40 points) — Five semantic lint checks worth 8 points each: third-person description, trigger phrase ("Use when..."), gerund name form (converting-pdfs not pdf-converter), specific (non-generic) name, and description length (≥ 20 words).

The exit code is 0 for a perfect score and 1 otherwise, making it suitable for CI gating.

Example — a skill that passes all checks:

$ aigent score converting-pdfs/
Score: 100/100

Structural (60/60):
  [PASS] SKILL.md exists and is parseable
  [PASS] Name format valid
  [PASS] Description valid
  [PASS] Required fields present
  [PASS] No unknown fields
  [PASS] Body within size limits

Quality (40/40):
  [PASS] Third-person description
  [PASS] Trigger phrase present
  [PASS] Gerund name form
  [PASS] Specific name
  [PASS] Detailed description

Example — a skill with issues. Each check shows a distinct label for its pass/fail state (e.g., "No unknown fields" when passing, "Unknown fields found" when failing):

$ aigent score aigent-validator/
Score: 32/100

Structural (0/60):
  [PASS] SKILL.md exists and is parseable
  [PASS] Name format valid
  [PASS] Description valid
  [PASS] Required fields present
  [FAIL] Unknown fields found
         unexpected metadata field: 'argument-hint'
  [PASS] Body within size limits

Quality (32/40):
  [PASS] Third-person description
  [PASS] Trigger phrase present
  [FAIL] Non-gerund name form
         name does not use gerund form
  [PASS] Specific name
  [PASS] Detailed description

test — Run fixture-based test suites

Runs test suites defined in tests.yml files alongside skills. Each test case specifies an input query, whether it should match, and an optional minimum score threshold.

Generate a template tests.yml:

$ aigent test --generate my-skill/
Generated my-skill/tests.yml
# Test fixture for my-skill
# Run with: aigent test my-skill/
queries:
- input: process pdf files and extract text
  should_match: true
  min_score: 0.3
- input: something completely unrelated to this skill
  should_match: false

Run the test suite:

$ aigent test my-skill/
[PASS] "process pdf files" (score: 0.65)
[PASS] "something completely unrelated to this skill" (score: 0.00)

2 passed, 0 failed, 2 total

upgrade — Detect and apply best-practice improvements

Checks for recommended-but-optional fields and patterns. Use --apply to write missing fields into the SKILL.md. The --full flag first runs validate + lint and optionally fixes errors before analysing upgrades.

$ aigent upgrade skills/aigent-validator
Missing 'compatibility' field — recommended for multi-platform skills.
Missing 'metadata.version' — recommended for tracking skill versions.
Missing 'metadata.author' — recommended for attribution.

Run with --apply to apply 3 suggestion(s).
$ aigent upgrade --apply skills/aigent-validator
(applies missing fields in-place, prints confirmation to stderr)

Full mode runs validate + lint first, and with --apply fixes errors before performing upgrades:

$ aigent upgrade --full --apply skills/aigent-validator
[full] Applied 1 validation/lint fix(es)
Missing 'compatibility' field — recommended for multi-platform skills.

validate — Check skill directories for specification conformance

Validates one or more skill directories against the Anthropic specification. Exit code 0 means valid; non-zero means errors were found (warnings do not affect exit code). For combined validation + semantic quality checks, use check instead.

$ aigent validate my-skill/
(no output — skill is valid)

With --structure for directory layout checks:

$ aigent validate skills/aigent-validator --structure
warning: unexpected metadata field: 'argument-hint'

Multiple directories trigger cross-skill conflict detection automatically:

$ aigent validate skills/aigent-validator skills/aigent-builder skills/aigent-scorer
skills/aigent-validator:
  warning: unexpected metadata field: 'argument-hint'
skills/aigent-builder:
  warning: unexpected metadata field: 'argument-hint'
  warning: unexpected metadata field: 'context'
skills/aigent-scorer:
  warning: unexpected metadata field: 'argument-hint'

3 skills: 0 ok, 0 errors, 3 warnings only

JSON output for CI integration:

$ aigent validate skills/aigent-validator --format json
[
  {
    "diagnostics": [
      {
        "code": "W001",
        "field": "metadata",
        "message": "unexpected metadata field: 'argument-hint'",
        "severity": "warning"
      }
    ],
    "path": "skills/aigent-validator"
  }
]

Watch mode

The --watch flag on validate monitors skill directories for filesystem changes and re-validates automatically on each edit — a live feedback loop while developing skills.

Watch mode is behind a Cargo feature gate because it pulls in platform-specific filesystem notification libraries (notify, fsevent-sys on macOS, inotify on Linux). Without the feature, the binary is smaller and has fewer dependencies.

Building with watch mode:

# Build with watch support
cargo build --release --features watch

# Run with watch support (--features must be passed every time)
cargo run --release --features watch -- validate --watch skills/

# Or install with watch support
cargo install aigent --features watch

Note
Cargo feature flags are per-invocation — they are not remembered between builds. You must pass --features watch on every cargo build or cargo run invocation. Building debug with --features watch does not enable it for release builds, and vice versa.

Without the watch feature, using --watch prints a helpful error:

$ aigent validate --watch my-skill/
Watch mode requires the 'watch' feature. Rebuild with: cargo build --features watch

Global flags

API reference

Full Rust API documentation with examples is published at docs.rs/aigent.

Types

Type Module Description
SkillProperties models Parsed skill metadata (name, description, licence, compatibility, allowed-tools)
SkillSpec builder Input specification for skill generation (purpose, optional overrides)
BuildResult builder Build output (properties, files written, output directory)
ClarityAssessment builder Purpose clarity evaluation result (clear flag, follow-up questions)
Diagnostic diagnostics Structured diagnostic with severity, code, message, field, suggestion
ScoreResult scorer Quality score result with structural and semantic categories
TestResult tester Skill activation probe result (query match, score, diagnostics, token cost)
TestSuiteResult test_runner Fixture-based test suite result (passed, failed, per-case results)
FormatResult formatter SKILL.md formatting result (changed flag, formatted content)
AssembleOptions assembler Options for skill-to-plugin assembly (output dir, name, validate)
AssembleResult assembler Assembly output (plugin directory, skill count)
SkillEntry prompt Collected skill entry for prompt generation (name, description, location)
AigentError errors Error enum: Parse, Validation, Build, Io, Yaml
Result<T> errors Convenience alias for std::result::Result<T, AigentError>

Functions

Function Module Description
validate(&Path) -> Vec<Diagnostic> validator Validate skill directory
validate_with_target(&Path, ValidationTarget) validator Validate with target profile
read_properties(&Path) -> Result<SkillProperties> parser Parse directory into SkillProperties
find_skill_md(&Path) -> Option<PathBuf> parser Find SKILL.md in directory (prefers uppercase)
parse_frontmatter(&str) -> Result<(HashMap, String)> parser Split YAML frontmatter and body
to_prompt(&[&Path]) -> String prompt Generate <available_skills> XML system prompt
to_prompt_format(&[&Path], PromptFormat) -> String prompt Generate prompt in specified format
lint(&SkillProperties, &str) -> Vec<Diagnostic> linter Run semantic quality checks
score(&Path) -> ScoreResult scorer Score skill against best-practices checklist
test_skill(&Path, &str) -> Result<TestResult> tester Probe skill activation against a query
format_skill(&Path) -> Result<FormatResult> formatter Format SKILL.md with canonical key order
format_content(&str) -> Result<String> formatter Format SKILL.md content string
assemble_plugin(&[&Path], &AssembleOptions) -> Result<AssembleResult> assembler Assemble skills into a plugin
run_test_suite(&Path) -> Result<TestSuiteResult> test_runner Run fixture-based test suite
generate_fixture(&Path) -> Result<String> test_runner Generate template tests.yml from skill metadata
validate_structure(&Path) -> Vec<Diagnostic> structure Validate directory structure
detect_conflicts(&[SkillEntry]) -> Vec<Diagnostic> conflict Detect cross-skill conflicts
apply_fixes(&Path, &[Diagnostic]) -> Result<usize> fixer Apply automatic fixes
build_skill(&SkillSpec) -> Result<BuildResult> builder Full build pipeline with post-build validation
derive_name(&str) -> String builder Derive kebab-case name from purpose (deterministic)
assess_clarity(&str) -> ClarityAssessment builder Evaluate if purpose is clear enough for generation
init_skill(&Path, SkillTemplate) -> Result<PathBuf> builder Initialize skill directory with template SKILL.md

Traits

Trait Module Description
LlmProvider builder::llm Text generation provider interface (generate(system, user) -> Result<String>)

Claude Code plugin

This repository is a Claude Code plugin. It provides three skills that Claude can use to build, validate, and score SKILL.md files interactively.

Skills

Skill Description
aigent-builder Generates SKILL.md definitions from natural language. Triggered by "create a skill", "build a skill", etc.
aigent-validator Validates SKILL.md files against the Anthropic specification. Triggered by "validate a skill", "check a skill", etc.
aigent-scorer Scores SKILL.md files against best-practices checklist. Triggered by "score a skill", "rate a skill", etc.

All skills operate in hybrid mode: they use the aigent CLI when it is installed, and fall back to Claude-based generation/validation when it is not. This means the plugin works out of the box — no installation required — but produces higher-quality results with aigent available.

Plugin installation

To use the plugin in Claude Code, add it to your project's .claude/settings.json:

{
  "permissions": {
    "allow": []
  },
  "plugins": [
    "wkusnierczyk/aigent"
  ]
}

Development

Prerequisites

  • Rust (stable toolchain)
  • cargo (included with Rust)

Setup

git clone https://github.com/wkusnierczyk/aigent.git
cd aigent
cargo build

Optional tooling

cargo install cargo-edit            # Adds `cargo set-version` for release versioning

Common tasks

cargo build                         # Build (debug)
cargo build --release               # Build (release)
cargo test                          # Run all tests
cargo clippy -- -D warnings         # Lint (warnings as errors)
cargo fmt                           # Format code
cargo fmt --check                   # Check formatting

Project structure

src/
├── lib.rs                          # Library root — re-exports public API
├── errors.rs                       # Error types (thiserror)
├── models.rs                       # SkillProperties (serde)
├── parser.rs                       # SKILL.md frontmatter parser (serde_yaml_ng)
├── validator.rs                    # Metadata and directory validator
├── linter.rs                       # Semantic lint checks
├── fixer.rs                        # Auto-fix for fixable diagnostics
├── diagnostics.rs                  # Structured diagnostics with error codes
├── prompt.rs                       # Multi-format prompt generation
├── scorer.rs                       # Quality scoring with pass/fail labels (0–100)
├── structure.rs                    # Directory structure validation
├── conflict.rs                     # Cross-skill conflict detection
├── tester.rs                       # Skill activation probe with weighted scoring
├── formatter.rs                    # SKILL.md formatting (canonical key order, whitespace)
├── assembler.rs                    # Skill-to-plugin assembly
├── test_runner.rs                  # Fixture-based testing (tests.yml)
├── fs_util.rs                      # Symlink-safe filesystem helpers
├── main.rs                         # CLI entry point (clap)
└── builder/
    ├── mod.rs                      # Build pipeline orchestration
    ├── deterministic.rs            # Heuristic name/description/body generation
    ├── llm.rs                      # LLM provider trait and generation functions
    ├── template.rs                 # Template for init command
    ├── util.rs                     # Internal utilities
    └── providers/
        ├── mod.rs                  # Provider module declarations
        ├── anthropic.rs            # Anthropic Claude API
        ├── openai.rs               # OpenAI (and compatible) API
        ├── google.rs               # Google Gemini API
        └── ollama.rs               # Ollama local API

Versioning

Version is stored in Cargo.toml (single source of truth) and read at compile time via env!("CARGO_PKG_VERSION").

Milestones

Status: Implementation complete (M1–M14). In review.

Project tracked at github.com/users/wkusnierczyk/projects/39.

Milestone Title Status
M1 Project Scaffolding
M2 Errors and Models
M3 Parser
M4 Validator
M5 Prompt
M6 CLI
M7 Builder
M8 Main Module and Documentation
M9 Claude Code Plugin
M10 Improvements and Extensions
M11 Builder and Prompt Enhancements
M12 Ecosystem and Workflow
M13 Enhancements
M14 SRE Review
M15 Plugin Ecosystem Validation 🔲

Roadmap

M15: Plugin Ecosystem Validation — extend aigent's deterministic validation from SKILL.md to the full Claude Code plugin ecosystem. Complements plugin-dev by mechanizing the rules it teaches through prose and LLM-driven agents:

  • Hook validation (hooks.json) — replaces plugin-dev's validate-hook-schema.sh
  • Agent file validation (.md frontmatter) — replaces plugin-dev's validate-agent.sh
  • Plugin manifest validation (plugin.json) — mechanizes plugin-validator agent checks
  • Command file validation (.md frontmatter) — first deterministic validator for commands
  • Cross-component consistency checks — unique to aigent, no plugin-dev equivalent

5 issues (#97#101). See dev/plugin-dev.md for the full analysis.

CI/CD and release workflows

Continuous integration

The main branch is protected: direct pushes are not allowed. Changes are merged via squash-merge of pull requests only, requiring green CI/CD and positive reviews.

Every pull request runs the CI pipeline on three OSes (Linux, macOS, Windows).

Step Command
Formatting cargo fmt --check
Linting cargo clippy -- -D warnings
Testing cargo test
Release build cargo build --release

Release workflow

Releases are automated via scripts/version.sh release:

./scripts/version.sh release 0.5.0     # explicit version
./scripts/version.sh release patch      # auto-increment patch
./scripts/version.sh release minor      # auto-increment minor

This single command:

  1. Checks for a clean working tree and that the version tag doesn't exist
  2. Generates a changelog from merged PRs since the previous tag (via gh)
  3. Writes the changelog to CHANGES.md
  4. Updates version across all files (Cargo.toml, plugin.json, README.md, Cargo.lock)
  5. Commits, tags, and pushes — triggering the release workflow

Use --dry-run to preview without executing:

./scripts/version.sh release patch --dry-run

Prerequisite: The gh CLI must be installed and authenticated for changelog generation.

Once the v* tag is pushed, the release workflow runs:

Architecture OS Full name
x86_64 linux x86_64-unknown-linux-gnu
aarch64 linux aarch64-unknown-linux-gnu (via cross)
x86_64 macos x86_64-apple-darwin
aarch64 macos aarch64-apple-darwin
x86_64 windows x86_64-pc-windows-msvc
Step Action
Test Full test suite on Ubuntu
Build Cross-compile the five targets above
Release Create GitHub Release with changelog and binary assets
Publish Publish to crates.io

References

Reference Description
Anthropic agent skill specification Official specification for SKILL.md format and validation rules
Agent Skills organisation Umbrella for agent skills tooling
agentskills/agentskills Python reference implementation
anthropics/skills Anthropic's skills repository
docs.rs/aigent Rust API documentation
crates.io/crates/aigent Package registry

About and licence

aigent: Rust AI Agent Skills Tool
├─ version:    0.5.0
├─ author:     Wacław Kuśnierczyk
├─ developer:  mailto:waclaw.kusnierczyk@gmail.com
├─ source:     https://github.com/wkusnierczyk/aigent
└─ licence:    MIT https://opensource.org/licenses/MIT

MIT — see opensource.org/licenses/MIT.