Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/preset_submission.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: Preset Submission
description: Submit your preset to the Spec Kit preset catalog
title: "[Preset]: Add "
labels: ["enhancement", "needs-triage"]
labels: ["triage-must-have"]
body:
- type: markdown
attributes:
Expand All @@ -14,7 +14,7 @@ body:
- Create a GitHub release with a version tag (e.g., v1.0.0)
- Test installation from the release archive: `specify preset add --from <download-url>`

**After submitting:** a maintainer applies the `preset-submission` label during issue triage, which starts the automated catalog validation. You don't need to apply any label or ask for one.
**After submitting:** GitHub automatically applies the `triage-must-have` intake verdict. A maintainer separately applies the `preset-submission` label during issue triage, which starts the automated catalog validation. You don't need to apply any label or ask for one.

- type: input
id: preset-id
Expand Down
14 changes: 8 additions & 6 deletions presets/PUBLISHING.md
Original file line number Diff line number Diff line change
Expand Up @@ -337,13 +337,15 @@ git push origin add-your-preset

## Verification Process

> **How submissions get picked up:** the automated catalog-validation workflow only runs
> once the `preset-submission` label is on the issue. On this public repository, contributors
> cannot apply that label themselves — a maintainer applies it during issue triage. Until then
> the issue simply waits in triage; there is no action required from you, and there is no need to
> re-request the label in a comment.
### What Happens After You Submit

After submission, maintainers will review:
1. GitHub applies the `triage-must-have` verdict when the issue is opened through the Preset Submission form. This intake automation is specific to preset submissions and does not change the manual triage rubric for other issues.
2. A maintainer reviews the issue during issue triage and applies the separate `preset-submission` label, which starts the automated catalog validation. On this public repository, contributors cannot apply that label themselves, so there is nothing to label or re-request — the issue simply waits in triage.
3. The automated workflow validates the submission and, when validation passes, updates `presets/catalog.community.json` and `docs/community/presets.md` in a draft pull request
4. A maintainer reviews the generated pull request and merges it when approved
5. Your preset becomes discoverable via `specify preset search`

### What Maintainers Check

1. **Manifest validation** — valid `preset.yml`, all files exist
2. **Template quality** — templates are useful and well-structured
Expand Down
14 changes: 13 additions & 1 deletion tests/test_github_workflows.py
Original file line number Diff line number Diff line change
Expand Up @@ -504,12 +504,24 @@ def test_extension_submission_form_applies_only_automatic_intake_verdict():
assert extension_form["labels"] == ["triage-must-have"]
assert "extension-submission" not in extension_form["labels"]


def test_preset_submission_form_applies_only_automatic_intake_verdict():
forms_dir = REPO_ROOT / ".github" / "ISSUE_TEMPLATE"
preset_form = yaml.safe_load(
(forms_dir / "preset_submission.yml").read_text(encoding="utf-8")
)

assert preset_form["labels"] == ["triage-must-have"]
assert "preset-submission" not in preset_form["labels"]


def test_other_issue_forms_do_not_apply_automatic_intake_verdict():
forms_dir = REPO_ROOT / ".github" / "ISSUE_TEMPLATE"
for form_name in (
"agent_request.yml",
"bug_report.yml",
"bundle_submission.yml",
"feature_request.yml",
"preset_submission.yml",
):
form = yaml.safe_load((forms_dir / form_name).read_text(encoding="utf-8"))
assert "triage-must-have" not in form["labels"]
Expand Down
Loading