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.
Files changed (87) hide show
  1. satchel_agent-0.1.0/.agents/plugins/marketplace.json +21 -0
  2. satchel_agent-0.1.0/.claude-plugin/marketplace.json +43 -0
  3. satchel_agent-0.1.0/.claude-plugin/plugin.json +24 -0
  4. satchel_agent-0.1.0/.codex-plugin/plugin.json +44 -0
  5. satchel_agent-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +36 -0
  6. satchel_agent-0.1.0/.github/ISSUE_TEMPLATE/config.yml +2 -0
  7. satchel_agent-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +30 -0
  8. satchel_agent-0.1.0/.github/plugin/marketplace.json +24 -0
  9. satchel_agent-0.1.0/.github/plugin/plugin.json +23 -0
  10. satchel_agent-0.1.0/.github/workflows/ci.yml +22 -0
  11. satchel_agent-0.1.0/.github/workflows/publish.yml +25 -0
  12. satchel_agent-0.1.0/.gitignore +8 -0
  13. satchel_agent-0.1.0/CONTRIBUTING.md +49 -0
  14. satchel_agent-0.1.0/LICENSE +21 -0
  15. satchel_agent-0.1.0/PKG-INFO +281 -0
  16. satchel_agent-0.1.0/README.md +257 -0
  17. satchel_agent-0.1.0/ROADMAP.md +29 -0
  18. satchel_agent-0.1.0/SECURITY.md +30 -0
  19. satchel_agent-0.1.0/assets/cover.svg +162 -0
  20. satchel_agent-0.1.0/assets/logo.svg +21 -0
  21. satchel_agent-0.1.0/docs/release.md +48 -0
  22. satchel_agent-0.1.0/docs/schema.md +96 -0
  23. satchel_agent-0.1.0/docs/smoke-tests.md +54 -0
  24. satchel_agent-0.1.0/examples/basic/satchel.yaml +38 -0
  25. satchel_agent-0.1.0/examples/basic/skills/example/SKILL.md +8 -0
  26. satchel_agent-0.1.0/examples/release-auditor/.agents/plugins/marketplace.json +20 -0
  27. satchel_agent-0.1.0/examples/release-auditor/.claude-plugin/marketplace.json +30 -0
  28. satchel_agent-0.1.0/examples/release-auditor/.claude-plugin/plugin.json +17 -0
  29. satchel_agent-0.1.0/examples/release-auditor/.codex-plugin/plugin.json +28 -0
  30. satchel_agent-0.1.0/examples/release-auditor/.github/plugin/marketplace.json +21 -0
  31. satchel_agent-0.1.0/examples/release-auditor/.github/plugin/plugin.json +18 -0
  32. satchel_agent-0.1.0/examples/release-auditor/.mcp.json +4 -0
  33. satchel_agent-0.1.0/examples/release-auditor/hooks/hooks.json +4 -0
  34. satchel_agent-0.1.0/examples/release-auditor/satchel.yaml +50 -0
  35. satchel_agent-0.1.0/examples/release-auditor/skills/release-auditor/SKILL.md +13 -0
  36. satchel_agent-0.1.0/fixtures/antigravity-rich/.mcp.json +4 -0
  37. satchel_agent-0.1.0/fixtures/antigravity-rich/agents/reviewer/AGENT.md +4 -0
  38. satchel_agent-0.1.0/fixtures/antigravity-rich/hooks/hooks.json +4 -0
  39. satchel_agent-0.1.0/fixtures/antigravity-rich/rules/project.md +4 -0
  40. satchel_agent-0.1.0/fixtures/antigravity-rich/satchel.yaml +27 -0
  41. satchel_agent-0.1.0/fixtures/antigravity-rich/skills/antigravity-helper/SKILL.md +9 -0
  42. satchel_agent-0.1.0/fixtures/claude-rich/.mcp.json +4 -0
  43. satchel_agent-0.1.0/fixtures/claude-rich/agents/reviewer/AGENT.md +4 -0
  44. satchel_agent-0.1.0/fixtures/claude-rich/commands/check.md +4 -0
  45. satchel_agent-0.1.0/fixtures/claude-rich/hooks/hooks.json +4 -0
  46. satchel_agent-0.1.0/fixtures/claude-rich/satchel.yaml +28 -0
  47. satchel_agent-0.1.0/fixtures/claude-rich/skills/claude-helper/SKILL.md +9 -0
  48. satchel_agent-0.1.0/fixtures/codex-rich/.mcp.json +4 -0
  49. satchel_agent-0.1.0/fixtures/codex-rich/apps/app.json +5 -0
  50. satchel_agent-0.1.0/fixtures/codex-rich/hooks/hooks.json +4 -0
  51. satchel_agent-0.1.0/fixtures/codex-rich/satchel.yaml +32 -0
  52. satchel_agent-0.1.0/fixtures/codex-rich/skills/codex-helper/SKILL.md +9 -0
  53. satchel_agent-0.1.0/fixtures/copilot-rich/.mcp.json +4 -0
  54. satchel_agent-0.1.0/fixtures/copilot-rich/agents/reviewer/AGENT.md +4 -0
  55. satchel_agent-0.1.0/fixtures/copilot-rich/commands/check.md +4 -0
  56. satchel_agent-0.1.0/fixtures/copilot-rich/hooks/hooks.json +4 -0
  57. satchel_agent-0.1.0/fixtures/copilot-rich/lsp.json +4 -0
  58. satchel_agent-0.1.0/fixtures/copilot-rich/satchel.yaml +39 -0
  59. satchel_agent-0.1.0/fixtures/copilot-rich/skills/copilot-helper/SKILL.md +9 -0
  60. satchel_agent-0.1.0/fixtures/skills-and-mcp/.mcp.json +4 -0
  61. satchel_agent-0.1.0/fixtures/skills-and-mcp/satchel.yaml +22 -0
  62. satchel_agent-0.1.0/fixtures/skills-and-mcp/skills/mcp-helper/SKILL.md +9 -0
  63. satchel_agent-0.1.0/fixtures/skills-only/satchel.yaml +17 -0
  64. satchel_agent-0.1.0/fixtures/skills-only/skills/basic/SKILL.md +9 -0
  65. satchel_agent-0.1.0/fixtures/unsupported-mixed/satchel.yaml +18 -0
  66. satchel_agent-0.1.0/fixtures/unsupported-mixed/skills/mixed/SKILL.md +9 -0
  67. satchel_agent-0.1.0/pyproject.toml +56 -0
  68. satchel_agent-0.1.0/satchel.yaml +85 -0
  69. satchel_agent-0.1.0/schemas/satchel.schema.json +153 -0
  70. satchel_agent-0.1.0/skills/satchel/SKILL.md +56 -0
  71. satchel_agent-0.1.0/skills/satchel/references/manifest.md +77 -0
  72. satchel_agent-0.1.0/skills/satchel/references/workflows.md +63 -0
  73. satchel_agent-0.1.0/src/satchel/__init__.py +7 -0
  74. satchel_agent-0.1.0/src/satchel/cli.py +252 -0
  75. satchel_agent-0.1.0/src/satchel/core.py +40 -0
  76. satchel_agent-0.1.0/src/satchel/generate.py +78 -0
  77. satchel_agent-0.1.0/src/satchel/manifest.py +232 -0
  78. satchel_agent-0.1.0/src/satchel/targets/__init__.py +23 -0
  79. satchel_agent-0.1.0/src/satchel/targets/antigravity.py +138 -0
  80. satchel_agent-0.1.0/src/satchel/targets/base.py +283 -0
  81. satchel_agent-0.1.0/src/satchel/targets/claude.py +144 -0
  82. satchel_agent-0.1.0/src/satchel/targets/codex.py +173 -0
  83. satchel_agent-0.1.0/src/satchel/targets/copilot.py +164 -0
  84. satchel_agent-0.1.0/src/satchel/validate.py +99 -0
  85. satchel_agent-0.1.0/tests/test_cli.py +36 -0
  86. satchel_agent-0.1.0/tests/test_generate.py +268 -0
  87. 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,2 @@
1
+ blank_issues_enabled: true
2
+
@@ -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,8 @@
1
+ .pytest_cache/
2
+ .ruff_cache/
3
+ .venv/
4
+ __pycache__/
5
+ *.py[cod]
6
+ *.egg-info/
7
+ build/
8
+ dist/
@@ -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).