satchel-agent 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- satchel_agent-0.1.0/.agents/plugins/marketplace.json +21 -0
- satchel_agent-0.1.0/.claude-plugin/marketplace.json +43 -0
- satchel_agent-0.1.0/.claude-plugin/plugin.json +24 -0
- satchel_agent-0.1.0/.codex-plugin/plugin.json +44 -0
- satchel_agent-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +36 -0
- satchel_agent-0.1.0/.github/ISSUE_TEMPLATE/config.yml +2 -0
- satchel_agent-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +30 -0
- satchel_agent-0.1.0/.github/plugin/marketplace.json +24 -0
- satchel_agent-0.1.0/.github/plugin/plugin.json +23 -0
- satchel_agent-0.1.0/.github/workflows/ci.yml +22 -0
- satchel_agent-0.1.0/.github/workflows/publish.yml +25 -0
- satchel_agent-0.1.0/.gitignore +8 -0
- satchel_agent-0.1.0/CONTRIBUTING.md +49 -0
- satchel_agent-0.1.0/LICENSE +21 -0
- satchel_agent-0.1.0/PKG-INFO +281 -0
- satchel_agent-0.1.0/README.md +257 -0
- satchel_agent-0.1.0/ROADMAP.md +29 -0
- satchel_agent-0.1.0/SECURITY.md +30 -0
- satchel_agent-0.1.0/assets/cover.svg +162 -0
- satchel_agent-0.1.0/assets/logo.svg +21 -0
- satchel_agent-0.1.0/docs/release.md +48 -0
- satchel_agent-0.1.0/docs/schema.md +96 -0
- satchel_agent-0.1.0/docs/smoke-tests.md +54 -0
- satchel_agent-0.1.0/examples/basic/satchel.yaml +38 -0
- satchel_agent-0.1.0/examples/basic/skills/example/SKILL.md +8 -0
- satchel_agent-0.1.0/examples/release-auditor/.agents/plugins/marketplace.json +20 -0
- satchel_agent-0.1.0/examples/release-auditor/.claude-plugin/marketplace.json +30 -0
- satchel_agent-0.1.0/examples/release-auditor/.claude-plugin/plugin.json +17 -0
- satchel_agent-0.1.0/examples/release-auditor/.codex-plugin/plugin.json +28 -0
- satchel_agent-0.1.0/examples/release-auditor/.github/plugin/marketplace.json +21 -0
- satchel_agent-0.1.0/examples/release-auditor/.github/plugin/plugin.json +18 -0
- satchel_agent-0.1.0/examples/release-auditor/.mcp.json +4 -0
- satchel_agent-0.1.0/examples/release-auditor/hooks/hooks.json +4 -0
- satchel_agent-0.1.0/examples/release-auditor/satchel.yaml +50 -0
- satchel_agent-0.1.0/examples/release-auditor/skills/release-auditor/SKILL.md +13 -0
- satchel_agent-0.1.0/fixtures/antigravity-rich/.mcp.json +4 -0
- satchel_agent-0.1.0/fixtures/antigravity-rich/agents/reviewer/AGENT.md +4 -0
- satchel_agent-0.1.0/fixtures/antigravity-rich/hooks/hooks.json +4 -0
- satchel_agent-0.1.0/fixtures/antigravity-rich/rules/project.md +4 -0
- satchel_agent-0.1.0/fixtures/antigravity-rich/satchel.yaml +27 -0
- satchel_agent-0.1.0/fixtures/antigravity-rich/skills/antigravity-helper/SKILL.md +9 -0
- satchel_agent-0.1.0/fixtures/claude-rich/.mcp.json +4 -0
- satchel_agent-0.1.0/fixtures/claude-rich/agents/reviewer/AGENT.md +4 -0
- satchel_agent-0.1.0/fixtures/claude-rich/commands/check.md +4 -0
- satchel_agent-0.1.0/fixtures/claude-rich/hooks/hooks.json +4 -0
- satchel_agent-0.1.0/fixtures/claude-rich/satchel.yaml +28 -0
- satchel_agent-0.1.0/fixtures/claude-rich/skills/claude-helper/SKILL.md +9 -0
- satchel_agent-0.1.0/fixtures/codex-rich/.mcp.json +4 -0
- satchel_agent-0.1.0/fixtures/codex-rich/apps/app.json +5 -0
- satchel_agent-0.1.0/fixtures/codex-rich/hooks/hooks.json +4 -0
- satchel_agent-0.1.0/fixtures/codex-rich/satchel.yaml +32 -0
- satchel_agent-0.1.0/fixtures/codex-rich/skills/codex-helper/SKILL.md +9 -0
- satchel_agent-0.1.0/fixtures/copilot-rich/.mcp.json +4 -0
- satchel_agent-0.1.0/fixtures/copilot-rich/agents/reviewer/AGENT.md +4 -0
- satchel_agent-0.1.0/fixtures/copilot-rich/commands/check.md +4 -0
- satchel_agent-0.1.0/fixtures/copilot-rich/hooks/hooks.json +4 -0
- satchel_agent-0.1.0/fixtures/copilot-rich/lsp.json +4 -0
- satchel_agent-0.1.0/fixtures/copilot-rich/satchel.yaml +39 -0
- satchel_agent-0.1.0/fixtures/copilot-rich/skills/copilot-helper/SKILL.md +9 -0
- satchel_agent-0.1.0/fixtures/skills-and-mcp/.mcp.json +4 -0
- satchel_agent-0.1.0/fixtures/skills-and-mcp/satchel.yaml +22 -0
- satchel_agent-0.1.0/fixtures/skills-and-mcp/skills/mcp-helper/SKILL.md +9 -0
- satchel_agent-0.1.0/fixtures/skills-only/satchel.yaml +17 -0
- satchel_agent-0.1.0/fixtures/skills-only/skills/basic/SKILL.md +9 -0
- satchel_agent-0.1.0/fixtures/unsupported-mixed/satchel.yaml +18 -0
- satchel_agent-0.1.0/fixtures/unsupported-mixed/skills/mixed/SKILL.md +9 -0
- satchel_agent-0.1.0/pyproject.toml +56 -0
- satchel_agent-0.1.0/satchel.yaml +85 -0
- satchel_agent-0.1.0/schemas/satchel.schema.json +153 -0
- satchel_agent-0.1.0/skills/satchel/SKILL.md +56 -0
- satchel_agent-0.1.0/skills/satchel/references/manifest.md +77 -0
- satchel_agent-0.1.0/skills/satchel/references/workflows.md +63 -0
- satchel_agent-0.1.0/src/satchel/__init__.py +7 -0
- satchel_agent-0.1.0/src/satchel/cli.py +252 -0
- satchel_agent-0.1.0/src/satchel/core.py +40 -0
- satchel_agent-0.1.0/src/satchel/generate.py +78 -0
- satchel_agent-0.1.0/src/satchel/manifest.py +232 -0
- satchel_agent-0.1.0/src/satchel/targets/__init__.py +23 -0
- satchel_agent-0.1.0/src/satchel/targets/antigravity.py +138 -0
- satchel_agent-0.1.0/src/satchel/targets/base.py +283 -0
- satchel_agent-0.1.0/src/satchel/targets/claude.py +144 -0
- satchel_agent-0.1.0/src/satchel/targets/codex.py +173 -0
- satchel_agent-0.1.0/src/satchel/targets/copilot.py +164 -0
- satchel_agent-0.1.0/src/satchel/validate.py +99 -0
- satchel_agent-0.1.0/tests/test_cli.py +36 -0
- satchel_agent-0.1.0/tests/test_generate.py +268 -0
- satchel_agent-0.1.0/uv.lock +167 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "satchel-marketplace",
|
|
3
|
+
"interface": {
|
|
4
|
+
"displayName": "Satchel"
|
|
5
|
+
},
|
|
6
|
+
"plugins": [
|
|
7
|
+
{
|
|
8
|
+
"name": "satchel",
|
|
9
|
+
"source": {
|
|
10
|
+
"source": "url",
|
|
11
|
+
"url": "https://github.com/parkerhancock/satchel.git",
|
|
12
|
+
"ref": "main"
|
|
13
|
+
},
|
|
14
|
+
"policy": {
|
|
15
|
+
"installation": "AVAILABLE",
|
|
16
|
+
"authentication": "ON_INSTALL"
|
|
17
|
+
},
|
|
18
|
+
"category": "Productivity"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://docs.claude.com/schemas/claude-plugin-marketplace-v1.json",
|
|
3
|
+
"name": "satchel-marketplace",
|
|
4
|
+
"description": "Build agent plugin manifests from one product-agnostic source package.",
|
|
5
|
+
"plugins": [
|
|
6
|
+
{
|
|
7
|
+
"name": "satchel",
|
|
8
|
+
"source": {
|
|
9
|
+
"source": "github",
|
|
10
|
+
"repo": "parkerhancock/satchel",
|
|
11
|
+
"ref": "main"
|
|
12
|
+
},
|
|
13
|
+
"description": "Build agent plugin manifests from one product-agnostic source package.",
|
|
14
|
+
"version": "0.1.0",
|
|
15
|
+
"displayName": "Satchel",
|
|
16
|
+
"author": {
|
|
17
|
+
"name": "Parker Hancock",
|
|
18
|
+
"url": "https://github.com/parkerhancock"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/parkerhancock/satchel",
|
|
21
|
+
"repository": "https://github.com/parkerhancock/satchel",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"keywords": [
|
|
24
|
+
"agents",
|
|
25
|
+
"plugins",
|
|
26
|
+
"codex",
|
|
27
|
+
"claude",
|
|
28
|
+
"copilot",
|
|
29
|
+
"antigravity",
|
|
30
|
+
"skills",
|
|
31
|
+
"mcp"
|
|
32
|
+
],
|
|
33
|
+
"category": "Productivity",
|
|
34
|
+
"skills": [
|
|
35
|
+
"./skills/satchel"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"owner": {
|
|
40
|
+
"name": "Parker Hancock",
|
|
41
|
+
"url": "https://github.com/parkerhancock"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "satchel",
|
|
3
|
+
"displayName": "Satchel",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Build agent plugin manifests from one product-agnostic source package.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Parker Hancock",
|
|
8
|
+
"url": "https://github.com/parkerhancock"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/parkerhancock/satchel",
|
|
11
|
+
"repository": "https://github.com/parkerhancock/satchel",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"agents",
|
|
15
|
+
"plugins",
|
|
16
|
+
"codex",
|
|
17
|
+
"claude",
|
|
18
|
+
"copilot",
|
|
19
|
+
"antigravity",
|
|
20
|
+
"skills",
|
|
21
|
+
"mcp"
|
|
22
|
+
],
|
|
23
|
+
"skills": "./skills/"
|
|
24
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "satchel",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Build agent plugin manifests from one product-agnostic source package.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Parker Hancock",
|
|
7
|
+
"url": "https://github.com/parkerhancock"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/parkerhancock/satchel",
|
|
10
|
+
"repository": "https://github.com/parkerhancock/satchel",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"agents",
|
|
14
|
+
"plugins",
|
|
15
|
+
"codex",
|
|
16
|
+
"claude",
|
|
17
|
+
"copilot",
|
|
18
|
+
"antigravity",
|
|
19
|
+
"skills",
|
|
20
|
+
"mcp"
|
|
21
|
+
],
|
|
22
|
+
"skills": "./skills/",
|
|
23
|
+
"interface": {
|
|
24
|
+
"displayName": "Satchel",
|
|
25
|
+
"shortDescription": "Build agent plugins from one source package.",
|
|
26
|
+
"developerName": "Parker Hancock",
|
|
27
|
+
"category": "Productivity",
|
|
28
|
+
"longDescription": "Product-agnostic authoring tools for agent extensions. Satchel keeps satchel.yaml as the source of truth, then generates host-specific plugin files and checks generated-file drift.",
|
|
29
|
+
"capabilities": [
|
|
30
|
+
"Read",
|
|
31
|
+
"Write"
|
|
32
|
+
],
|
|
33
|
+
"websiteURL": "https://github.com/parkerhancock/satchel",
|
|
34
|
+
"defaultPrompt": [
|
|
35
|
+
"Use Satchel to add or validate a product-agnostic agent plugin package."
|
|
36
|
+
],
|
|
37
|
+
"brandColor": "#e5a82f",
|
|
38
|
+
"composerIcon": "./assets/logo.svg",
|
|
39
|
+
"logo": "./assets/logo.svg",
|
|
40
|
+
"screenshots": [
|
|
41
|
+
"./assets/cover.svg"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Report a Satchel bug.
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: Problem
|
|
10
|
+
description: What went wrong?
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: reproduce
|
|
15
|
+
attributes:
|
|
16
|
+
label: Steps to Reproduce
|
|
17
|
+
description: Include a minimal satchel.yaml when possible.
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: expected
|
|
22
|
+
attributes:
|
|
23
|
+
label: Expected Behavior
|
|
24
|
+
validations:
|
|
25
|
+
required: true
|
|
26
|
+
- type: textarea
|
|
27
|
+
id: actual
|
|
28
|
+
attributes:
|
|
29
|
+
label: Actual Behavior
|
|
30
|
+
validations:
|
|
31
|
+
required: true
|
|
32
|
+
- type: input
|
|
33
|
+
id: version
|
|
34
|
+
attributes:
|
|
35
|
+
label: Satchel Version
|
|
36
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest a target, component, or workflow improvement.
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: Problem
|
|
10
|
+
description: What user workflow should Satchel make simpler?
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: proposal
|
|
15
|
+
attributes:
|
|
16
|
+
label: Proposed Design
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
- type: dropdown
|
|
20
|
+
id: target
|
|
21
|
+
attributes:
|
|
22
|
+
label: Target
|
|
23
|
+
options:
|
|
24
|
+
- Cross-target
|
|
25
|
+
- Codex
|
|
26
|
+
- Claude
|
|
27
|
+
- GitHub Copilot
|
|
28
|
+
- Antigravity
|
|
29
|
+
- Other
|
|
30
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "satchel-marketplace",
|
|
3
|
+
"metadata": {
|
|
4
|
+
"description": "Build agent plugin manifests from one product-agnostic source package.",
|
|
5
|
+
"version": "0.1.0"
|
|
6
|
+
},
|
|
7
|
+
"plugins": [
|
|
8
|
+
{
|
|
9
|
+
"name": "satchel",
|
|
10
|
+
"description": "Build agent plugin manifests from one product-agnostic source package.",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"source": {
|
|
13
|
+
"type": "github",
|
|
14
|
+
"repo": "parkerhancock/satchel",
|
|
15
|
+
"ref": "main"
|
|
16
|
+
},
|
|
17
|
+
"category": "Productivity"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"owner": {
|
|
21
|
+
"name": "Parker Hancock",
|
|
22
|
+
"url": "https://github.com/parkerhancock"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "satchel",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Build agent plugin manifests from one product-agnostic source package.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Parker Hancock",
|
|
7
|
+
"url": "https://github.com/parkerhancock"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/parkerhancock/satchel",
|
|
10
|
+
"repository": "https://github.com/parkerhancock/satchel",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"agents",
|
|
14
|
+
"plugins",
|
|
15
|
+
"codex",
|
|
16
|
+
"claude",
|
|
17
|
+
"copilot",
|
|
18
|
+
"antigravity",
|
|
19
|
+
"skills",
|
|
20
|
+
"mcp"
|
|
21
|
+
],
|
|
22
|
+
"skills": "./skills/"
|
|
23
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
- uses: astral-sh/setup-uv@v5
|
|
14
|
+
- uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: "3.12"
|
|
17
|
+
- run: uv sync --dev
|
|
18
|
+
- run: uv run ruff check .
|
|
19
|
+
- run: uv run pytest
|
|
20
|
+
- run: uv run satchel check .
|
|
21
|
+
- run: uv run satchel smoke .
|
|
22
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
id-token: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
pypi:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: astral-sh/setup-uv@v5
|
|
17
|
+
- uses: actions/setup-python@v5
|
|
18
|
+
with:
|
|
19
|
+
python-version: "3.12"
|
|
20
|
+
- run: uv sync --dev
|
|
21
|
+
- run: uv run ruff check .
|
|
22
|
+
- run: uv run pytest
|
|
23
|
+
- run: uv build
|
|
24
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
25
|
+
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Contributing to Satchel
|
|
2
|
+
|
|
3
|
+
Satchel is a small Python project with generated plugin outputs. Keep changes
|
|
4
|
+
deterministic, source-first, and easy to validate.
|
|
5
|
+
|
|
6
|
+
## Setup
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
uv sync
|
|
10
|
+
uv run satchel report examples/basic
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Development Flow
|
|
14
|
+
|
|
15
|
+
Edit `satchel.yaml`, source code, fixtures, or docs first. Generated host files
|
|
16
|
+
should be updated with `satchel generate`, not hand-edited.
|
|
17
|
+
|
|
18
|
+
Run the local checks before opening a pull request:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
uv run ruff check .
|
|
22
|
+
uv run pytest
|
|
23
|
+
uv run satchel check .
|
|
24
|
+
uv run satchel smoke .
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Use host validators when the host CLIs are installed:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
uv run satchel check . --host
|
|
31
|
+
uv run satchel smoke . --host
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Fixtures
|
|
35
|
+
|
|
36
|
+
The `fixtures/` directory is the conformance suite. Add or update a fixture when
|
|
37
|
+
you add a target, component, or portability rule.
|
|
38
|
+
|
|
39
|
+
## Generated Outputs
|
|
40
|
+
|
|
41
|
+
The repository root is itself a Satchel package. If you change `satchel.yaml`,
|
|
42
|
+
`skills/`, or target adapters, regenerate the root outputs:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
uv run satchel generate .
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Do the same for examples that commit generated host output.
|
|
49
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Parker Hancock
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: satchel-agent
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Product-agnostic build tooling for agent plugin packages.
|
|
5
|
+
Project-URL: Homepage, https://github.com/parkerhancock/satchel
|
|
6
|
+
Project-URL: Repository, https://github.com/parkerhancock/satchel
|
|
7
|
+
Project-URL: Issues, https://github.com/parkerhancock/satchel/issues
|
|
8
|
+
Project-URL: Documentation, https://github.com/parkerhancock/satchel#readme
|
|
9
|
+
Author-email: Parker Hancock <parker@hancock.ai>
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: agents,antigravity,claude,codex,copilot,mcp,plugins,skills
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Requires-Dist: pyyaml>=6.0
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
<p align="center">
|
|
26
|
+
<img src="assets/logo.svg" alt="Satchel logo" width="112" />
|
|
27
|
+
</p>
|
|
28
|
+
|
|
29
|
+
<p align="center">
|
|
30
|
+
<img src="assets/cover.svg" alt="Satchel builds multi-target agent plugin outputs from one satchel.yaml source package" width="760" />
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
<h1 align="center">Satchel</h1>
|
|
34
|
+
|
|
35
|
+
<p align="center">
|
|
36
|
+
<strong>Satchel lets agent plugin authors build multi-target extensions from one source package.</strong>
|
|
37
|
+
</p>
|
|
38
|
+
|
|
39
|
+
<p align="center">
|
|
40
|
+
<a href="#quick-start">Quick Start</a> |
|
|
41
|
+
<a href="#features">Features</a> |
|
|
42
|
+
<a href="#usage">Usage</a> |
|
|
43
|
+
<a href="#release-readiness">Release Readiness</a>
|
|
44
|
+
</p>
|
|
45
|
+
|
|
46
|
+
> Status: public alpha candidate. Satchel can generate and check Codex,
|
|
47
|
+
> Claude, and GitHub Copilot plugin manifests and marketplace files today.
|
|
48
|
+
> Antigravity output is available as an experimental target while its host
|
|
49
|
+
> install flow stabilizes.
|
|
50
|
+
|
|
51
|
+
## Why Satchel
|
|
52
|
+
|
|
53
|
+
Modern agent plugins share useful building blocks: skills, `SKILL.md`
|
|
54
|
+
metadata, supporting files, MCP configuration, hooks, and subagent definitions.
|
|
55
|
+
Their manifests and marketplace catalogs are different enough that multi-target
|
|
56
|
+
plugin repos can drift.
|
|
57
|
+
|
|
58
|
+
Satchel makes `satchel.yaml` the source of truth. Authors edit one portable
|
|
59
|
+
package, then generate host-specific files and fail CI when generated outputs
|
|
60
|
+
are stale.
|
|
61
|
+
|
|
62
|
+
## Quick Start
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
git clone https://github.com/parkerhancock/satchel.git
|
|
66
|
+
cd satchel
|
|
67
|
+
uv run satchel init my-plugin
|
|
68
|
+
uv run satchel generate my-plugin
|
|
69
|
+
uv run satchel check my-plugin
|
|
70
|
+
uv run satchel smoke my-plugin
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The generated files live at:
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
my-plugin/.codex-plugin/plugin.json
|
|
77
|
+
my-plugin/.claude-plugin/plugin.json
|
|
78
|
+
my-plugin/.github/plugin/plugin.json
|
|
79
|
+
my-plugin/.github/plugin/marketplace.json
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Plugin Install
|
|
83
|
+
|
|
84
|
+
Satchel is packaged with Satchel. The repository root contains `satchel.yaml`,
|
|
85
|
+
the generated host manifests, generated marketplace files, and a shared
|
|
86
|
+
`skills/satchel/SKILL.md`.
|
|
87
|
+
|
|
88
|
+
Claude Code:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
claude plugin marketplace add parkerhancock/satchel
|
|
92
|
+
claude plugin install satchel@satchel-marketplace
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Codex:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
codex plugin marketplace add parkerhancock/satchel
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Then restart Codex, open the plugin directory, choose the Satchel marketplace,
|
|
102
|
+
and install the Satchel plugin. Codex can also read the generated repo
|
|
103
|
+
marketplace at `.agents/plugins/marketplace.json`, which points back to the
|
|
104
|
+
Git-backed Satchel plugin source.
|
|
105
|
+
|
|
106
|
+
GitHub Copilot CLI:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
copilot plugin marketplace add parkerhancock/satchel
|
|
110
|
+
copilot plugin install satchel@satchel-marketplace
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Antigravity support is experimental. The adapter can generate a local package
|
|
114
|
+
layout under `.agents/plugins/`, but install and marketplace behavior should be
|
|
115
|
+
verified against the current Antigravity CLI or IDE before relying on it.
|
|
116
|
+
|
|
117
|
+
## Features
|
|
118
|
+
|
|
119
|
+
| Feature | What it does |
|
|
120
|
+
| --- | --- |
|
|
121
|
+
| **Neutral manifest** | Reads `satchel.yaml` as the package source of truth. |
|
|
122
|
+
| **Target adapters** | Emits deterministic Codex, Claude, Copilot, and experimental Antigravity outputs through pluggable adapters. |
|
|
123
|
+
| **Drift checks** | Fails when generated outputs are missing or stale. |
|
|
124
|
+
| **Smoke tests** | Copies a package to a temporary directory, regenerates output, and validates the clean copy. |
|
|
125
|
+
| **Host validation** | Runs non-mutating host validators where available, including `claude plugin validate`. |
|
|
126
|
+
| **Path safety** | Rejects component and output paths that escape the package root. |
|
|
127
|
+
| **Skill validation** | Checks each skill directory for `SKILL.md`, `name`, and `description`. |
|
|
128
|
+
| **Fixture suite** | Exercises skills-only, MCP, target-rich, Antigravity, and unsupported-target packages. |
|
|
129
|
+
| **Portability report** | Summarizes target support and shared components. |
|
|
130
|
+
|
|
131
|
+
## Usage
|
|
132
|
+
|
|
133
|
+
Create a package:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
uv run satchel init my-plugin
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Generate host manifests:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
uv run satchel generate my-plugin
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Check source validity and generated-file drift:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
uv run satchel check my-plugin
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Run host-aware validation when the host CLIs are installed:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
uv run satchel check my-plugin --host
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Run a clean-copy smoke test:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
uv run satchel smoke my-plugin
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Print a portability report:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
uv run satchel report my-plugin
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Manifest
|
|
170
|
+
|
|
171
|
+
Minimal `satchel.yaml`:
|
|
172
|
+
|
|
173
|
+
```yaml
|
|
174
|
+
schema: satchel/v0
|
|
175
|
+
name: my-plugin
|
|
176
|
+
version: 0.1.0
|
|
177
|
+
description: Shared agent extension.
|
|
178
|
+
author:
|
|
179
|
+
name: Your Team
|
|
180
|
+
|
|
181
|
+
components:
|
|
182
|
+
skills:
|
|
183
|
+
path: ./skills
|
|
184
|
+
mcp:
|
|
185
|
+
path: ./.mcp.json
|
|
186
|
+
|
|
187
|
+
targets:
|
|
188
|
+
codex:
|
|
189
|
+
enabled: true
|
|
190
|
+
manifest: ./.codex-plugin/plugin.json
|
|
191
|
+
interface:
|
|
192
|
+
displayName: My Plugin
|
|
193
|
+
shortDescription: Shared agent extension.
|
|
194
|
+
category: Productivity
|
|
195
|
+
capabilities:
|
|
196
|
+
- Read
|
|
197
|
+
|
|
198
|
+
claude:
|
|
199
|
+
enabled: true
|
|
200
|
+
manifest: ./.claude-plugin/plugin.json
|
|
201
|
+
displayName: My Plugin
|
|
202
|
+
|
|
203
|
+
copilot:
|
|
204
|
+
enabled: true
|
|
205
|
+
manifest: ./.github/plugin/plugin.json
|
|
206
|
+
marketplace:
|
|
207
|
+
path: ./.github/plugin/marketplace.json
|
|
208
|
+
|
|
209
|
+
antigravity:
|
|
210
|
+
enabled: false
|
|
211
|
+
experimental: true
|
|
212
|
+
output: ./.agents/plugins/my-plugin
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Output Model
|
|
216
|
+
|
|
217
|
+
| Source | Codex | Claude | Copilot | Antigravity |
|
|
218
|
+
| --- | --- | --- | --- | --- |
|
|
219
|
+
| `name`, `version`, `description` | `.codex-plugin/plugin.json` | `.claude-plugin/plugin.json` | `.github/plugin/plugin.json` | `plugin.json` in the generated package root |
|
|
220
|
+
| `components.skills.path` | `skills` field | `skills` field | `skills` field | copied to `skills/` |
|
|
221
|
+
| `components.mcp.path` | `mcpServers` field | default `.mcp.json` | `mcpServers` field | copied to `mcp_config.json` |
|
|
222
|
+
| `components.hooks.path` | `hooks` field | default `hooks/hooks.json` | `hooks` field | copied to `hooks.json` |
|
|
223
|
+
| `targets.codex.interface` | `interface` object | not emitted | not emitted | not emitted |
|
|
224
|
+
| `targets.claude.displayName` | not emitted | `displayName` | not emitted | not emitted |
|
|
225
|
+
| target marketplace config | `.agents/plugins/marketplace.json` | `.claude-plugin/marketplace.json` | `.github/plugin/marketplace.json` | not supported yet |
|
|
226
|
+
|
|
227
|
+
Generated manifests should be treated as build outputs. Edit `satchel.yaml`
|
|
228
|
+
instead.
|
|
229
|
+
|
|
230
|
+
## Commands
|
|
231
|
+
|
|
232
|
+
| Command | Purpose |
|
|
233
|
+
| --- | --- |
|
|
234
|
+
| `satchel init <path>` | Create a minimal package with `satchel.yaml` and one skill. |
|
|
235
|
+
| `satchel generate <path>` | Generate enabled host manifests. |
|
|
236
|
+
| `satchel check <path>` | Validate source and fail on stale generated files. |
|
|
237
|
+
| `satchel check <path> --host` | Add non-mutating host validators when available. |
|
|
238
|
+
| `satchel smoke <path>` | Validate a regenerated temporary copy without mutating the source tree. |
|
|
239
|
+
| `satchel report <path>` | Print a simple portability report. |
|
|
240
|
+
|
|
241
|
+
## Release Readiness
|
|
242
|
+
|
|
243
|
+
The repo now includes the release-readiness pieces needed for a public alpha:
|
|
244
|
+
|
|
245
|
+
| Area | Status |
|
|
246
|
+
| --- | --- |
|
|
247
|
+
| Host validation | `satchel check --host` runs `claude plugin validate` when available and structural validators for generated Codex, Claude, Copilot, and Antigravity outputs. |
|
|
248
|
+
| Clean smoke tests | `satchel smoke` regenerates and validates a temporary package copy. |
|
|
249
|
+
| CI | `.github/workflows/ci.yml` runs lint, tests, `satchel check`, and `satchel smoke`. |
|
|
250
|
+
| Packaging | `pyproject.toml` has public package metadata and `.github/workflows/publish.yml` supports trusted PyPI publishing from GitHub releases. |
|
|
251
|
+
| Project hygiene | `CONTRIBUTING.md`, `SECURITY.md`, `ROADMAP.md`, and issue templates are present. |
|
|
252
|
+
| Schema docs | `docs/schema.md` and `schemas/satchel.schema.json` document the manifest. |
|
|
253
|
+
| Fixtures | `fixtures/` covers skills-only, skills-and-MCP, Claude-rich, Codex-rich, Copilot-rich, Antigravity-rich, and unsupported-target packages. |
|
|
254
|
+
| Demo | `examples/release-auditor/` is a non-trivial generated multi-target plugin. |
|
|
255
|
+
|
|
256
|
+
Operational release steps are documented in `docs/release.md`: configure PyPI
|
|
257
|
+
trusted publishing, cut a GitHub release, then verify
|
|
258
|
+
`uv tool install satchel-agent` or `pipx install satchel-agent` after
|
|
259
|
+
publishing. The installed CLI command is still `satchel`.
|
|
260
|
+
|
|
261
|
+
Good follow-up work after public alpha:
|
|
262
|
+
|
|
263
|
+
- generated marketplace patch mode
|
|
264
|
+
- `satchel pack --target codex|claude|copilot|antigravity`
|
|
265
|
+
- `satchel smoke --target codex|claude|copilot|antigravity`
|
|
266
|
+
- optional `plugin-scanner verify` integration
|
|
267
|
+
- generated docs from `schemas/satchel.schema.json`
|
|
268
|
+
|
|
269
|
+
## Development
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
uv run ruff check .
|
|
273
|
+
uv run pytest
|
|
274
|
+
uv run satchel check .
|
|
275
|
+
uv run satchel smoke .
|
|
276
|
+
uv run satchel report examples/basic
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## License
|
|
280
|
+
|
|
281
|
+
Satchel is released under the [MIT License](LICENSE).
|