Skip to main content

Product-agnostic build tooling for agent plugin packages.

Project description

Satchel logo

Satchel builds multi-target agent plugin outputs from one satchel.yaml source package

Satchel

Satchel lets agent plugin authors build multi-target extensions from one source package.

Quick Start | Features | Usage | Release Readiness

Status: public alpha candidate. Satchel can generate and check Codex, Claude, and GitHub Copilot plugin manifests and marketplace files today. Antigravity output is available as an experimental target while its host install flow stabilizes.

Why Satchel

Modern agent plugins share useful building blocks: skills, SKILL.md metadata, supporting files, MCP configuration, hooks, and subagent definitions. Their manifests and marketplace catalogs are different enough that multi-target plugin repos can drift.

Satchel makes satchel.yaml the source of truth. Authors edit one portable package, then generate host-specific files and fail CI when generated outputs are stale.

Quick Start

git clone https://github.com/parkerhancock/satchel.git
cd satchel
uv run satchel init my-plugin
uv run satchel generate my-plugin
uv run satchel check my-plugin
uv run satchel smoke my-plugin

The generated files live at:

my-plugin/.codex-plugin/plugin.json
my-plugin/.claude-plugin/plugin.json
my-plugin/.github/plugin/plugin.json
my-plugin/.github/plugin/marketplace.json

Plugin Install

Satchel is packaged with Satchel. The repository root contains satchel.yaml, the generated host manifests, generated marketplace files, and a shared skills/satchel/SKILL.md.

Claude Code:

claude plugin marketplace add parkerhancock/satchel
claude plugin install satchel@satchel-marketplace

Codex:

codex plugin marketplace add parkerhancock/satchel

Then restart Codex, open the plugin directory, choose the Satchel marketplace, and install the Satchel plugin. Codex can also read the generated repo marketplace at .agents/plugins/marketplace.json, which points back to the Git-backed Satchel plugin source.

GitHub Copilot CLI:

copilot plugin marketplace add parkerhancock/satchel
copilot plugin install satchel@satchel-marketplace

Antigravity support is experimental. The adapter can generate a local package layout under .agents/plugins/, but install and marketplace behavior should be verified against the current Antigravity CLI or IDE before relying on it.

Features

Feature What it does
Neutral manifest Reads satchel.yaml as the package source of truth.
Target adapters Emits deterministic Codex, Claude, Copilot, and experimental Antigravity outputs through pluggable adapters.
Drift checks Fails when generated outputs are missing or stale.
Smoke tests Copies a package to a temporary directory, regenerates output, and validates the clean copy.
Host validation Runs non-mutating host validators where available, including claude plugin validate.
Path safety Rejects component and output paths that escape the package root.
Skill validation Checks each skill directory for SKILL.md, name, and description.
Fixture suite Exercises skills-only, MCP, target-rich, Antigravity, and unsupported-target packages.
Portability report Summarizes target support and shared components.

Usage

Create a package:

uv run satchel init my-plugin

Generate host manifests:

uv run satchel generate my-plugin

Check source validity and generated-file drift:

uv run satchel check my-plugin

Run host-aware validation when the host CLIs are installed:

uv run satchel check my-plugin --host

Run a clean-copy smoke test:

uv run satchel smoke my-plugin

Print a portability report:

uv run satchel report my-plugin

Manifest

Minimal satchel.yaml:

schema: satchel/v0
name: my-plugin
version: 0.1.0
description: Shared agent extension.
author:
  name: Your Team

components:
  skills:
    path: ./skills
  mcp:
    path: ./.mcp.json

targets:
  codex:
    enabled: true
    manifest: ./.codex-plugin/plugin.json
    interface:
      displayName: My Plugin
      shortDescription: Shared agent extension.
      category: Productivity
      capabilities:
        - Read

  claude:
    enabled: true
    manifest: ./.claude-plugin/plugin.json
    displayName: My Plugin

  copilot:
    enabled: true
    manifest: ./.github/plugin/plugin.json
    marketplace:
      path: ./.github/plugin/marketplace.json

  antigravity:
    enabled: false
    experimental: true
    output: ./.agents/plugins/my-plugin

Output Model

Source Codex Claude Copilot Antigravity
name, version, description .codex-plugin/plugin.json .claude-plugin/plugin.json .github/plugin/plugin.json plugin.json in the generated package root
components.skills.path skills field skills field skills field copied to skills/
components.mcp.path mcpServers field default .mcp.json mcpServers field copied to mcp_config.json
components.hooks.path hooks field default hooks/hooks.json hooks field copied to hooks.json
targets.codex.interface interface object not emitted not emitted not emitted
targets.claude.displayName not emitted displayName not emitted not emitted
target marketplace config .agents/plugins/marketplace.json .claude-plugin/marketplace.json .github/plugin/marketplace.json not supported yet

Generated manifests should be treated as build outputs. Edit satchel.yaml instead.

Commands

Command Purpose
satchel init <path> Create a minimal package with satchel.yaml and one skill.
satchel generate <path> Generate enabled host manifests.
satchel check <path> Validate source and fail on stale generated files.
satchel check <path> --host Add non-mutating host validators when available.
satchel smoke <path> Validate a regenerated temporary copy without mutating the source tree.
satchel report <path> Print a simple portability report.

Release Readiness

The repo now includes the release-readiness pieces needed for a public alpha:

Area Status
Host validation satchel check --host runs claude plugin validate when available and structural validators for generated Codex, Claude, Copilot, and Antigravity outputs.
Clean smoke tests satchel smoke regenerates and validates a temporary package copy.
CI .github/workflows/ci.yml runs lint, tests, satchel check, and satchel smoke.
Packaging pyproject.toml has public package metadata and .github/workflows/publish.yml supports trusted PyPI publishing from GitHub releases.
Project hygiene CONTRIBUTING.md, SECURITY.md, ROADMAP.md, and issue templates are present.
Schema docs docs/schema.md and schemas/satchel.schema.json document the manifest.
Fixtures fixtures/ covers skills-only, skills-and-MCP, Claude-rich, Codex-rich, Copilot-rich, Antigravity-rich, and unsupported-target packages.
Demo examples/release-auditor/ is a non-trivial generated multi-target plugin.

Operational release steps are documented in docs/release.md: configure PyPI trusted publishing, cut a GitHub release, then verify uv tool install satchel-agent or pipx install satchel-agent after publishing. The installed CLI command is still satchel.

Good follow-up work after public alpha:

  • generated marketplace patch mode
  • satchel pack --target codex|claude|copilot|antigravity
  • satchel smoke --target codex|claude|copilot|antigravity
  • optional plugin-scanner verify integration
  • generated docs from schemas/satchel.schema.json

Development

uv run ruff check .
uv run pytest
uv run satchel check .
uv run satchel smoke .
uv run satchel report examples/basic

License

Satchel is released under the MIT License.

Project details


Download files

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

Source Distribution

satchel_agent-0.1.0.tar.gz (38.8 kB view details)

Uploaded Source

Built Distribution

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

satchel_agent-0.1.0-py3-none-any.whl (21.6 kB view details)

Uploaded Python 3

File details

Details for the file satchel_agent-0.1.0.tar.gz.

File metadata

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

File hashes

Hashes for satchel_agent-0.1.0.tar.gz
Algorithm Hash digest
SHA256 23b7ca80be400c684a3d7e18402ed4e7a0ea522e328af88bd32560ab5c846df5
MD5 1746dde36de944c4fbcfbddca70e8538
BLAKE2b-256 1ac177ce33311ab0687b9fe4338d3e37a84d57a9b3f0d2f21266ace66b8edfe8

See more details on using hashes here.

Provenance

The following attestation bundles were made for satchel_agent-0.1.0.tar.gz:

Publisher: publish.yml on parkerhancock/satchel

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

File details

Details for the file satchel_agent-0.1.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for satchel_agent-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 45ff8ec8f322b53c983a32d8d03834845b312e6f689f453384a73524999773c0
MD5 1852bea6a1c2b72a3f62b166b286fa5e
BLAKE2b-256 c5ac7261f53cbbde98dae9019d2027d299dfc46779b1e9b90a59bbf1b9ad65d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for satchel_agent-0.1.0-py3-none-any.whl:

Publisher: publish.yml on parkerhancock/satchel

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

Supported by

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