@@ -94,6 +94,23 @@ non-secret. For protected remote MCP servers, standard MCP Authorization is
9494performed by the MCP client and managed by its host/runtime, not declared as
9595Store package authentication metadata.
9696
97+ ## Source-built packages
98+
99+ Third-party Skills may be packaged from immutable upstream GitHub commits
100+ without checking their files into this branch. A closed recipe under
101+ ` v2/source-packages/<name>/ ` maps selected upstream directories into a standard,
102+ self-contained Agent Plugin. CI downloads the pinned commit, rejects unsafe
103+ archive entries, validates the complete package, and reproduces a deterministic
104+ ` .tar.gz ` artifact. ` release.json ` binds its GitHub Release URL, archive SHA-256,
105+ package ` sha256-tree-v1 ` digest, and catalog projection.
106+
107+ Published release assets are immutable. The publish workflow creates a missing
108+ asset, treats an existing byte-identical asset as a no-op, and fails rather than
109+ overwriting different bytes. Runtime clients verify both digests before native
110+ installation. Upstream source files exist in the release artifact because Agent
111+ Plugins 1.0.0 packages must be self-contained; they are not retained in Store
112+ main or a developer checkout.
113+
97114## Generated Store index
98115
99116` v2/catalog.json ` is a Clawdi Store index, not an Agent Plugins standard field.
@@ -103,28 +120,26 @@ It is generated only from packages that pass the validation above:
103120python3 v2/scripts/catalog.py --write
104121```
105122
106- The closed ` schemaVersion: 1 ` entry is a normalized listing and resolution
123+ The closed ` schemaVersion: 2 ` entry is a normalized listing and resolution
107124projection. It contains package ` name ` and ` version ` ; ` displayName ` , optional
108125` description ` and ` publisher ` , ` category ` , standard ` keywords ` , and ` languages ` ;
109- declared ` runtimes ` ; ` path ` and optional ` icon ` ; the ` sha256-tree-v1 ` ` digest ` ;
110- ` hasConfiguration ` ; and a closed ` components ` summary. ` components.skills `
126+ declared ` runtimes ` ; a closed ` source ` and optional in-Store ` icon ` ; the
127+ ` sha256-tree-v1 ` ` digest ` ; and a closed ` components ` summary. ` components.skills `
111128contains exact Skill names, while ` components.mcpServers ` maps exact server
112129names to declared ` stdio ` , ` streamable-http ` , or ` sse ` transports. It contains
113130no Skill bodies or descriptions and no MCP URLs, headers, commands, or
114131configuration data. Catalog-facing human strings and array items cannot
115132contain ASCII control characters or DEL.
116133
117- ` hasConfiguration ` is retained for catalog schema compatibility and is always
118- ` false ` . Packages cannot declare ` extensions["ai.clawdi"].configuration ` .
134+ Packages cannot declare ` extensions["ai.clawdi"].configuration ` .
119135
120- The index contains no Git commit. ` path ` is resolved relative to the directory
121- containing ` v2/catalog.json ` , so ` ./plugins/example-plugin ` selects
122- ` v2/plugins/example-plugin ` in the same snapshot. A consumer resolves an
123- external Store commit, verifies ` digest ` , and binds the install to that commit
124- plus digest. The index exposes one current published version per plugin; it is
125- not a multi-version registry. Existing installs remain pinned to their original
126- commit and digest after a newer version replaces or removes the listing; the
127- package bytes remain fetchable from that historical commit.
136+ For authored packages, ` source.type: "store" ` contains a path relative to the
137+ directory containing ` v2/catalog.json ` ; consumers bind it to the resolved Store
138+ commit. For source-built packages, ` source.type: "github-release" ` contains a
139+ canonical asset URL and archive SHA-256. Consumers persist the complete source
140+ object and the tree digest. The index exposes one current published version per
141+ plugin; it is not a multi-version registry. Existing installs remain pinned to
142+ their original source and digests after a listing changes or is removed.
128143
129144CI rejects generated-file drift. Its separate baseline check also rejects a
130145version regression or a changed digest for a ` name ` and ` version ` already
@@ -138,13 +153,15 @@ Run from the repository root:
138153
139154``` bash
140155python3 -m pip install -r v2/requirements.txt
156+ python3 v2/scripts/source_package.py --check
141157python3 v2/scripts/catalog.py --write
142158python3 v2/scripts/validate.py
143159python3 -m unittest discover -s v2/tests -v
144160```
145161
146- Validation is offline and scans only ` v2/plugins ` , then compares the checked-in
147- catalog with the deterministic generated bytes. The canonical upstream
162+ Local-package validation is offline. Source-package reproduction downloads only
163+ the immutable GitHub commits declared by recipes, then compares generated locks
164+ and catalog bytes. The canonical upstream
148165schemas are vendored under ` v2/schemas/ ` for source review and audit. The
149166validator performs explicit validation of the supported 1.0.0 contract; it is
150167not a general JSON Schema evaluator.
0 commit comments