Skip to content

Commit 8a11b57

Browse files
committed
Add community bundle submission automation
Add the discovery-only community bundle catalog, online and offline catalog loading, and a restricted agentic workflow for validating bundle submissions and opening draft catalog PRs. Assisted-by: GitHub Copilot (model: GPT-5.6 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: fbe794bc-667a-4c9e-b48b-825067debc6d
1 parent f065e27 commit 8a11b57

12 files changed

Lines changed: 2156 additions & 11 deletions

File tree

.github/aw/actions-lock.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,30 @@
11
{
22
"entries": {
3+
"actions/checkout@v6.0.3": {
4+
"repo": "actions/checkout",
5+
"version": "v6.0.3",
6+
"sha": "df4cb1c069e1874edd31b4311f1884172cec0e10"
7+
},
8+
"actions/download-artifact@v8.0.1": {
9+
"repo": "actions/download-artifact",
10+
"version": "v8.0.1",
11+
"sha": "3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c"
12+
},
313
"actions/github-script@v9.0.0": {
414
"repo": "actions/github-script",
515
"version": "v9.0.0",
616
"sha": "3a2844b7e9c422d3c10d287c895573f7108da1b3"
717
},
18+
"actions/setup-node@v6.4.0": {
19+
"repo": "actions/setup-node",
20+
"version": "v6.4.0",
21+
"sha": "48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e"
22+
},
23+
"actions/upload-artifact@v7.0.1": {
24+
"repo": "actions/upload-artifact",
25+
"version": "v7.0.1",
26+
"sha": "043fb46d1a93c77aae656e7c1c64a875d1fc6a0a"
27+
},
828
"github/gh-aw-actions/setup@v0.79.8": {
929
"repo": "github/gh-aw-actions/setup",
1030
"version": "v0.79.8",

.github/workflows/add-community-bundle.lock.yml

Lines changed: 1726 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,270 @@
1+
---
2+
description: "Process community bundle submission issues - validate, add to catalog, and open a PR for maintainer review"
3+
emoji: "📦"
4+
5+
on:
6+
issues:
7+
types: [labeled]
8+
names: [bundle-submission]
9+
skip-bots: [github-actions, copilot, dependabot]
10+
11+
tools:
12+
edit:
13+
bash: ["echo", "grep", "sort", "python3", "jq", "date"]
14+
github:
15+
toolsets: [issues, repos]
16+
min-integrity: none
17+
web-fetch:
18+
19+
permissions:
20+
contents: read
21+
issues: read
22+
23+
checkout:
24+
fetch-depth: 0
25+
26+
safe-outputs:
27+
noop:
28+
report-as-issue: false
29+
create-pull-request:
30+
title-prefix: "[bundle] "
31+
labels: [bundle-submission, automated]
32+
draft: true
33+
max: 1
34+
allowed-files:
35+
- bundles/catalog.community.json
36+
- docs/community/bundles.md
37+
protected-files:
38+
policy: blocked
39+
exclude:
40+
- README.md
41+
- CHANGELOG.md
42+
add-comment:
43+
max: 2
44+
add-labels:
45+
allowed: [bundle-submission, validation-passed, validation-failed, needs-info]
46+
max: 3
47+
---
48+
49+
# Add Community Bundle from Issue Submission
50+
51+
You are a catalog maintenance agent for the Spec Kit project. Process community
52+
bundle submission issues and create draft pull requests that add or update
53+
entries in the community bundle catalog.
54+
55+
Community bundles are untrusted. Validate metadata and distribution evidence,
56+
but do not claim to audit, endorse, or support bundle code or the components it
57+
installs. Never register a submitted companion catalog automatically.
58+
59+
## Triggering Conditions
60+
61+
This workflow is triggered by an `issues: labeled` event and is gated to the
62+
`bundle-submission` label. Before processing, verify that the issue title starts
63+
with `[Bundle]:`. If it does not, stop without commenting.
64+
65+
## Step 1 - Read and Parse the Issue
66+
67+
Read issue #${{ github.event.issue.number }} and extract these issue-form fields:
68+
69+
| Field | Issue Form ID | Required |
70+
|-------|---------------|----------|
71+
| Bundle ID | `bundle-id` | Yes |
72+
| Bundle Name | `bundle-name` | Yes |
73+
| Version | `version` | Yes |
74+
| Role or Team | `role` | Yes |
75+
| Description | `description` | Yes |
76+
| Author | `author` | Yes |
77+
| Repository URL | `repository` | Yes |
78+
| Download URL | `download-url` | Yes |
79+
| Documentation URL | `documentation` | Yes |
80+
| License | `license` | Yes |
81+
| Required Spec Kit Version | `speckit-version` | Yes |
82+
| Integration Target | `integration` | No |
83+
| Components Provided | `components-provided` | Yes |
84+
| Required Component Catalogs | `required-catalogs` | Yes |
85+
| Tags | `tags` | Yes |
86+
| Key Features | `features` | Yes |
87+
| Testing Details | `testing-details` | Yes |
88+
| Example Usage | `example-usage` | Yes |
89+
| Proposed Catalog Entry | `catalog-entry` | Yes |
90+
91+
Issue-form values appear beneath headings matching their labels.
92+
93+
## Step 2 - Validate the Submission
94+
95+
Run every check and collect all failures before deciding the outcome.
96+
97+
### 2a. Bundle ID and version
98+
99+
- The bundle ID must match
100+
`^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$`.
101+
- The version must be semantic version `X.Y.Z` with digits only and no `v`
102+
prefix.
103+
104+
### 2b. Repository and documentation
105+
106+
- Restrict repository and documentation URLs to public GitHub URLs before
107+
fetching them.
108+
- Confirm the repository exists and contains `bundle.yml`, `README.md`, and a
109+
license file (`LICENSE`, `LICENSE.md`, or `LICENSE.txt`).
110+
- The documentation URL must resolve to a readable Markdown file that explains
111+
the bundle's intended role, installed components, required catalogs, and
112+
installation steps.
113+
- Confirm the repository's `bundle.yml` matches the submitted bundle ID,
114+
version, role, author, license, Spec Kit requirement, integration target, and
115+
component summary.
116+
117+
### 2c. Release artifact
118+
119+
- The download URL must be an HTTPS GitHub release asset URL under the submitted
120+
repository:
121+
`https://github.com/<owner>/<repo>/releases/download/<tag>/<asset>.zip`.
122+
- Confirm the release exists, its tag corresponds to the submitted version
123+
(`vX.Y.Z` or `X.Y.Z`), and the exact ZIP asset is attached to that release.
124+
- Confirm the asset name is versioned and consistent with the submitted bundle
125+
ID and version.
126+
127+
Do not fetch arbitrary user-provided URLs. Do not claim the artifact was
128+
executed or audited; rely on the required submission attestations for build and
129+
installation evidence.
130+
131+
### 2d. Catalog entry
132+
133+
Parse the proposed JSON and require one entry under the submitted bundle ID.
134+
Confirm that:
135+
136+
- `id`, `name`, `version`, `role`, `description`, `author`, `license`,
137+
`download_url`, and `repository` match the submission and manifest.
138+
- `requires.speckit_version` matches the submission.
139+
- `provides` contains non-negative integer counts for `extensions`, `presets`,
140+
`steps`, and `workflows`, matching the manifest.
141+
- `tags` contains 2-5 lowercase strings and matches the submitted tags.
142+
- `verified` is the boolean value `false`. Community entries must never be
143+
marked verified.
144+
145+
### 2e. Component resolution
146+
147+
- `Required Component Catalogs` must explicitly say `None` or list every
148+
non-default extension, preset, workflow, and step catalog needed by the
149+
bundle.
150+
- Compare the manifest references, README, required-catalog field, testing
151+
details, and example usage for consistency.
152+
- If non-default catalogs are required, ensure each URL is HTTPS, the README
153+
documents the corresponding `catalog add` command, and the testing details
154+
say those catalogs were registered in the clean-project test.
155+
- If the field says `None` but a component is not bundled and cannot be found
156+
in a default Spec Kit catalog, fail validation and ask the submitter to list
157+
and document its catalog.
158+
159+
The community bundle catalog itself remains discovery-only. Companion catalog
160+
URLs are documentation and validation metadata, not catalogs this workflow
161+
should add to Spec Kit.
162+
163+
### 2f. Checklists and testing evidence
164+
165+
- Confirm every required checkbox in Testing Checklist and Submission
166+
Requirements is checked (`[x]`).
167+
- Confirm Testing Details describe validation, build, artifact installation,
168+
and clean-project testing.
169+
- Confirm Example Usage includes artifact installation and, when applicable,
170+
all required catalog setup commands.
171+
172+
### Validation outcome
173+
174+
If any check fails:
175+
176+
1. Comment once with every failed check and a specific correction.
177+
2. Add `validation-failed`; add `needs-info` when submitter input is needed.
178+
3. Stop without editing files or creating a pull request.
179+
180+
If all checks pass, add `validation-passed` and continue.
181+
182+
## Step 3 - Determine Add or Update
183+
184+
Search `bundles/catalog.community.json` for the bundle ID.
185+
186+
- If absent, add a new entry.
187+
- If present, update the existing entry in place.
188+
189+
Treat a submitted version lower than or equal to the existing catalog version
190+
as a validation failure unless the issue clearly documents a metadata-only
191+
correction at the same version.
192+
193+
## Step 4 - Update the Community Catalog
194+
195+
Edit `bundles/catalog.community.json`. Insert new entries alphabetically by
196+
bundle ID. The entry shape is:
197+
198+
```json
199+
{
200+
"<bundle-id>": {
201+
"name": "<bundle-name>",
202+
"id": "<bundle-id>",
203+
"version": "<version>",
204+
"role": "<role>",
205+
"description": "<description>",
206+
"author": "<author>",
207+
"license": "<license>",
208+
"download_url": "<download-url>",
209+
"repository": "<repository>",
210+
"requires": {
211+
"speckit_version": "<speckit-version>"
212+
},
213+
"provides": {
214+
"extensions": 0,
215+
"presets": 0,
216+
"steps": 0,
217+
"workflows": 0
218+
},
219+
"tags": ["<tag>"],
220+
"verified": false
221+
}
222+
}
223+
```
224+
225+
Use the validated proposed entry rather than inventing metadata. Keep
226+
`verified: false`. Update the top-level `updated_at` to today's UTC date at
227+
midnight and preserve the top-level `catalog_url`.
228+
229+
Validate the complete file:
230+
231+
```bash
232+
python3 -c "import json; json.load(open('bundles/catalog.community.json')); print('Valid JSON')"
233+
```
234+
235+
## Step 5 - Update Community Documentation
236+
237+
Add or update the bundle in `docs/community/bundles.md`. Keep rows alphabetical
238+
by bundle name:
239+
240+
```text
241+
| <Name> | <Description> | `<role>` | <component counts> | <None or documented> | [<repo-name>](<repository>) |
242+
```
243+
244+
Render component counts compactly, omitting zero-valued component types. Use
245+
`None` when no companion catalogs are needed and `Documented` otherwise; the
246+
repository README remains the source for the actual URLs.
247+
248+
## Step 6 - Create a Draft Pull Request
249+
250+
Create one draft pull request.
251+
252+
- New entry branch: `add-<bundle-id>-bundle`
253+
- Update branch: `update-<bundle-id>-bundle`
254+
- New title: `Add <Bundle Name> bundle to community catalog`
255+
- Update title: `Update <Bundle Name> bundle to v<version>`
256+
257+
The commit and PR description must summarize the catalog and documentation
258+
changes, list the validation results, include
259+
`Closes #${{ github.event.issue.number }}`, and mention the submitter with
260+
`cc @<issue-author>`.
261+
262+
## Important Rules
263+
264+
- Modify only `bundles/catalog.community.json` and
265+
`docs/community/bundles.md`.
266+
- Keep JSON entries sorted by ID and documentation rows sorted by name.
267+
- Never set a community bundle's `verified` field to true.
268+
- Never add, enable, or change the policy of a submitted catalog.
269+
- Never describe validation as a security audit or endorsement.
270+
- Use `Closes`, not `Fixes`, for the submission issue.

.github/workflows/catalog-assign.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ jobs:
99
if: >
1010
(github.event.action == 'opened' && (
1111
contains(github.event.issue.labels.*.name, 'extension-submission') ||
12-
contains(github.event.issue.labels.*.name, 'preset-submission')
12+
contains(github.event.issue.labels.*.name, 'preset-submission') ||
13+
contains(github.event.issue.labels.*.name, 'bundle-submission')
1314
)) ||
1415
(github.event.action == 'labeled' && (
1516
github.event.label.name == 'extension-submission' ||
16-
github.event.label.name == 'preset-submission'
17+
github.event.label.name == 'preset-submission' ||
18+
github.event.label.name == 'bundle-submission'
1719
))
1820
runs-on: ubuntu-latest
1921
permissions:

bundles/catalog.community.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"schema_version": "1.0",
3+
"updated_at": "2026-07-15T00:00:00Z",
4+
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/bundles/catalog.community.json",
5+
"bundles": {}
6+
}

docs/community/bundles.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
66
Bundles compose existing Spec Kit components — extensions, presets, workflows, and steps — into a single role or team stack. They are useful when a user should be able to install a tested set of components together instead of following several separate install commands.
77

8-
Accepted community bundle entries will be listed here once a community bundle catalog is available. To submit a bundle for review, file a [Bundle Submission](https://github.com/github/spec-kit/issues/new?template=bundle_submission.yml) issue.
8+
Accepted community bundle entries are published in [`bundles/catalog.community.json`](https://github.com/github/spec-kit/blob/main/bundles/catalog.community.json) and listed below. The built-in community source is discovery-only: `specify bundle search` and `specify bundle info` can inspect entries, but installing by ID requires explicitly adding an install-allowed catalog. To submit a bundle for review, file a [Bundle Submission](https://github.com/github/spec-kit/issues/new?template=bundle_submission.yml) issue.
9+
10+
| Bundle | Purpose | Role or team | Provides | Required catalogs | URL |
11+
|--------|---------|--------------|----------|-------------------|-----|
912

1013
## What to Submit
1114

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ packages = ["src/specify_cli"]
4747
"workflows/speckit" = "specify_cli/core_pack/workflows/speckit"
4848
# Bundled presets (installable via `specify preset add <name>` or `specify init --preset <name>`)
4949
"presets/lean" = "specify_cli/core_pack/presets/lean"
50+
# Community bundle catalog snapshot (used for offline discovery)
51+
"bundles/catalog.community.json" = "specify_cli/core_pack/bundles/catalog.community.json"
5052

5153
[project.optional-dependencies]
5254
test = [

0 commit comments

Comments
 (0)