Skip to content

Commit 9fa05b9

Browse files
mnriemCopilot
andauthored
feat: automate community workflow step submissions (#4873)
* feat: automate community workflow step submissions Add a maintainer-triggered issue submission flow with metadata-only validation, tag-pinned file digests, scoped draft catalog PRs, and contributor documentation. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: harden workflow step submission validation Keep setup failures recoverable, reuse CLI step ID validation, and gate per-file downloads and hashing through a tested repository-owned helper. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: enforce installer limits for submitted step packages Validate file and directory counts and nesting before downloading, fetch complete packages with a cumulative byte budget, and cover rejected package paths and exact limit boundaries. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: classify transient HTTP errors before curl size failures Prioritize known HTTP responses over curl exit codes, treat HTTP 408 as a blocked timeout, and cover status/exit combinations with ordinary and one-byte remaining budgets. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: reject case-insensitive step package path collisions Compare package file paths component-wise with casefold before downloads, rejecting duplicate file aliases and file/directory conflicts while preserving noncolliding paths. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * docs: clarify workflow step submission activation and provenance Document maintainer-label activation and distinguish the required archive download URL from catalog per-file distribution URLs. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: align workflow step archive and documentation contracts Reject unsupported GitHub-generated tgz archives while retaining named tgz release assets, and accept any tag-pinned Markdown usage document rather than requiring README.md. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: clarify step license validation and author attribution Require valid SPDX identifiers and matching release-license metadata before catalog edits. Align table rendering with other community submissions without conflating package authors and maintainers; preserve Decision maintainer attribution in prose. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: enable public REST access for tagged step license metadata Allow api.github.com in agent URL and firewall policies and prescribe the enabled web-fetch route. Cover compiled access, isolation, and retained host restrictions with a regression test. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: support epoch releases and document submission URL alphabets Accept PEP 440 epoch markers in release tags and archive URLs while retaining package path restrictions. Document accepted character sets and percent-escape exclusions, and cover epoch route compatibility and mismatches. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: isolate step downloads from curl config and proxy auth failures Place --disable first in curl arguments, verify hostile config isolation with real curl and a local proxy, and classify HTTP 407 as an environment blocker before exit-code handling. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * test: compare license REST allowlist domains exactly Replace ambiguous hostname membership assertions flagged by CodeQL with explicit exact-entry comparisons and add lookalike-domain negative cases for firewall and ingestion policies. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: remove undisclosed step documentation policy requirement Keep discovery-only policy in Spec Kit guidance without rejecting complete external usage documentation for not repeating it. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: verify step catalog history and shared submission contracts Follow the preset verifier snapshot/generated pattern to enforce release migration, preserved history, complete existing digests, and publication gating. Include workflow-step in common community contract coverage while retaining archive-specific matrices. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: preserve catalog reader error classification by phase Align with the preset verifier by honoring the caller's error type for filesystem and decoding failures. Cover missing, non-UTF-8, directory, and permission failures without changing original-evidence blocker semantics. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: reject duplicate JSON fields in step submission evidence Detect duplicate object keys at every depth before snapshot comparison, preserving generated repair, original-evidence blocker, and submission-failure classifications. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: certify canonical metadata before step catalog snapshots Compare every required current-entry metadata field against independently captured form values, including archive and repository provenance, compatibility, and optional changelog. Reject incomplete or miscopied entries before generating expected catalog state. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent 34d460f commit 9fa05b9

13 files changed

Lines changed: 4433 additions & 97 deletions

‎.gitattributes‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@
55
# Keep it exempt from git's whitespace checks (git diff --check / CI) since its
66
# generated formatting is not hand-edited.
77
.specify/memory/constitution.md -whitespace
8+
9+
.github/workflows/*.lock.yml linguist-generated=true

‎.github/ISSUE_TEMPLATE/workflow_step_submission.yml‎

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ body:
66
- type: markdown
77
attributes:
88
value: |
9-
Thanks for contributing a workflow step type! This form captures the package, release, and catalog metadata needed for manual community catalog review.
9+
Thanks for contributing a workflow step type! This form captures the package, release, and catalog metadata needed for community catalog review.
1010
1111
**Before submitting:**
1212
- Review the [Community Workflow Step Types guide](https://github.com/github/spec-kit/blob/main/docs/community/workflow-steps.md)
@@ -16,13 +16,13 @@ body:
1616
- Provide version-pinned URLs and SHA-256 digests for every catalog-downloaded file
1717
- Test the release artifact with `specify workflow step add <step-id> --from <download-url>`
1818
19-
**After submitting:** GitHub automatically applies only the `triage-must-have` intake verdict. This phase is intake-only: no validation workflow or draft pull request is triggered. Maintainers currently review the metadata manually and, when accepted, update the community catalog through the normal reviewed pull request process.
19+
**After submitting:** GitHub automatically applies only the `triage-must-have` intake verdict. A maintainer applies `workflow-step-submission` during triage to start automated metadata validation. Opening the form alone does not start validation. Successful validation proposes a draft catalog pull request for maintainer review; submitted Python is never reviewed or executed by this automation.
2020
2121
- type: input
2222
id: step-id
2323
attributes:
2424
label: Step Type ID
25-
description: Exact catalog key and `step.type_key`; it must be one safe path component and must not collide with a built-in step type
25+
description: Exact catalog key and `step.type_key`; use lowercase letters, digits, and hyphens in one safe path component, avoiding built-in types and Windows device names such as con, aux, com1, and lpt1
2626
placeholder: "e.g., deploy"
2727
validations:
2828
required: true
@@ -76,7 +76,11 @@ body:
7676
id: download-url
7777
attributes:
7878
label: Download URL
79-
description: URL to the versioned `.zip`, `.tar.gz`, or `.tgz` step package archive for this release
79+
description: >-
80+
URL to the versioned step package archive; GitHub-generated tag archives support `.zip` and `.tar.gz`,
81+
while named release assets may also use `.tgz`. The URL path must match `^[A-Za-z0-9._~+!/-]+$`;
82+
percent escapes, spaces, query strings, fragments, and dot/traversal segments are rejected.
83+
Tags have no slashes; `+` and `!` support PEP 440 local versions and epochs.
8084
placeholder: "https://github.com/your-org/spec-kit-step-deploy/releases/download/v1.0.0/deploy-1.0.0.zip"
8185
validations:
8286
required: true
@@ -85,7 +89,10 @@ body:
8589
id: step-yml-url
8690
attributes:
8791
label: step.yml URL
88-
description: Exact tag-pinned HTTPS URL used as the catalog `step_yml_url` (or `url`)
92+
description: >-
93+
Exact tag-pinned raw GitHub HTTPS URL used as the catalog `step_yml_url` (or `url`).
94+
The file path within the tag must match `^[A-Za-z0-9._~/-]+$`, without percent escapes or spaces;
95+
tags may additionally contain `+` and `!`.
8996
placeholder: "https://raw.githubusercontent.com/your-org/spec-kit-step-deploy/v1.0.0/step.yml"
9097
validations:
9198
required: true
@@ -94,7 +101,10 @@ body:
94101
id: init-url
95102
attributes:
96103
label: __init__.py URL
97-
description: Exact tag-pinned HTTPS URL used as the catalog `init_url`
104+
description: >-
105+
Exact tag-pinned raw GitHub HTTPS URL used as the catalog `init_url`.
106+
The file path within the tag must match `^[A-Za-z0-9._~/-]+$`, without percent escapes or spaces;
107+
tags may additionally contain `+` and `!`.
98108
placeholder: "https://raw.githubusercontent.com/your-org/spec-kit-step-deploy/v1.0.0/__init__.py"
99109
validations:
100110
required: true
@@ -104,9 +114,13 @@ body:
104114
attributes:
105115
label: Extra File URLs
106116
description: >-
107-
JSON mapping of every additional package-relative file path to its exact tag-pinned HTTPS URL.
117+
JSON mapping of every additional package-relative file path to its exact tag-pinned raw GitHub HTTPS URL.
118+
Package-relative keys and file paths within the tag must match `^[A-Za-z0-9._~/-]+$`;
119+
percent escapes, spaces, query strings, and fragments are rejected. Tags may additionally contain `+` and `!`.
108120
Paths must use forward slashes, be relative and non-empty, contain no empty, `.` or `..` segments,
109-
and must not case-insensitively alias `step.yml` or `__init__.py`. Enter `{}` when there are no extra files.
121+
and must not case-insensitively alias `step.yml` or `__init__.py`, another file, or a package directory.
122+
Case-insensitive aliases of `.git`, `__pycache__`, and `.DS_Store` are forbidden.
123+
Enter `{}` when there are no extra files.
110124
render: json
111125
placeholder: |
112126
{
@@ -183,7 +197,7 @@ body:
183197
id: documentation
184198
attributes:
185199
label: Documentation URL
186-
description: Tag-pinned documentation covering configuration, outputs, failure behavior, side effects, and an example workflow
200+
description: Tag-pinned Markdown documentation (`.md`) covering configuration, outputs, failure behavior, side effects, and an example workflow; README.md is not required
187201
placeholder: "https://github.com/your-org/spec-kit-step-deploy/blob/v1.0.0/README.md"
188202
validations:
189203
required: true

0 commit comments

Comments
 (0)