Skip to content

Align extension release workflows with presets - #45

Merged
mnriem merged 4 commits into
github:mainfrom
mnriem:mnriem-spec-kit-extension-releases
Oct 5, 2026
Merged

mnriem merged 4 commits into
github:mainfrom
mnriem:mnriem-spec-kit-extension-releases

Conversation

@mnriem

@mnriem mnriem commented Oct 5, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • Align extension releases with the preset and Spec Kit architecture: a manual trigger validates inputs and pushes <directory>-vX.Y.Z; a separate tag-triggered job validates metadata, builds the ZIP inline, and publishes the release.
  • Use secrets.RELEASE_PAT in both trigger checkout steps, following Spec Kit's core release-trigger idiom. Keep checkout-persisted credentials for the tag push.
  • Address the first review's five findings: safe notes files in both publishers, scoped preset/extension tag filters, final--v version parsing, corrected grammar, and an actual extension directory example.
  • Address the follow-up version/URL concerns: both triggers reject manifest/catalog version mismatches before tagging, and both triggers and publishers require download_url to match the release repository, tag, and ZIP asset.
  • Restore package identity and containment safeguards in both package types: manifest IDs must match selected directories, package IDs must follow their existing namespace/slug conventions, and symlinked roots or package contents are rejected before reading manifests or creating archives. Direct tag pushes receive the same publisher checks.
  • Preserve the upstream extension-canvas-design identity and package-test removal. Keep maintainer/release documentation aligned with this behavior. The branch is rebased onto upstream main's Actions dependency updates.

Reference comparison

Spec Kit core and mnriem/spec-kit-extensions both use manual dispatch → PAT-authenticated tag push → separate publisher. The extension reference injects its PAT via the remote URL at the push step; this PR keeps Spec Kit core's checkout-token idiom. The reference's broad tag filter, first-delimiter parsing, and direct changelog interpolation are not copied: this repository hosts both package types and needs disjoint filters and safe notes handling.

Validation

  • actionlint v1.7.12 passes for all four release workflows.
  • The first two rounds' temporary checks covered real package ZIPs/publication arguments, tag routing, literal challenging changelog content, final-delimiter parsing, optional version prefixes, invalid versions/missing metadata, catalog URL components, and local-only tag pushes/duplicate rejection.
  • Thirteen current regression checks pass against the actual workflow scripts: valid real packages and ZIP byte contents, manifest ID mismatches/missing IDs, identity-before-version ordering, invalid/path-traversing directory IDs, symlinked roots, links to a temporary checkout's Git config, hidden/dangling/manifest/nested directory links, prior version/URL safeguards, valid IDs containing multiple -v delimiters, and structural/PAT alignment. Invalid preflights produce no tag output, archive, or publication call.
  • No real release workflow was dispatched and no release tag or GitHub release was created. Git-config link cases use only temporary test repositories; no real credentials are read. The removed package test suite was not restored.

Release setup

Maintainers must configure the repository Actions secret RELEASE_PAT with a token authorized to push tags before using the manual triggers. Default GITHUB_TOKEN tag pushes do not start the separate publisher. Publishers use GITHUB_TOKEN to create their release.

Preset tags are copilot-*-vX.Y.Z; extension tags are extension-*-vX.Y.Z. Update both the catalog version and its download URL before tagging. Both publishers retain one job with inline shell ZIP packaging; there are no reusable-workflow calls, artifact handoffs, or unrelated publisher failures.

Copilot AI balanced review requested due to automatic review settings October 5, 2026 17:23

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The workflows introduce unsafe release-note interpolation, guaranteed unrelated failures, and tag-validation regressions.

Review effort: Balanced
Findings: 1 High severity · 2 Medium severity · 2 Low severity

Open (5)
What changed in this PR

Aligns extension releases with the preset release model and documents the shared PAT-based tag handoff.

Changes:

  • Reworks extension publishing into separate tag-trigger and publisher workflows.
  • Uses RELEASE_PAT for manual release tag pushes.
  • Updates maintainer and release documentation.
File Description
AGENTS.md Documents release workflow parity and requirements.
spec-kit-presets/​README.md Documents PAT-based preset releases.
spec-kit-extensions/​README.md Updates extension release instructions.
.github/​workflows/​release-preset.yml Broadens the preset tag filter.
.github/​workflows/​release-preset-trigger.yml Adds PAT-authenticated checkout.
.github/​workflows/​release-extension.yml Replaces extension publishing with the preset-style workflow.
.github/​workflows/​release-extension-trigger.yml Adds standalone extension tag creation.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread .github/workflows/release-extension.yml Outdated
Comment thread .github/workflows/release-extension.yml Outdated
Comment thread .github/workflows/release-extension.yml Outdated
Comment thread .github/workflows/release-extension-trigger.yml Outdated
Comment thread .github/workflows/release-extension-trigger.yml Outdated
Copilot AI balanced review requested due to automatic review settings October 5, 2026 17:50

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

Version validation must occur before tagging, and catalog release URLs must be verified before publication.

Review effort: Balanced
Findings: None

Resolved since last review (5)
Previously missed (2)

In code that hasn't changed since last review

Medium severity Validate extension and catalog versions before creating tags

.github/​workflows/​release-extension-trigger.yml:56

The trigger creates the tag without checking that the requested version matches extension.yml and the catalog. A typo such as 0.2.0 while both files still say 0.1.0 therefore leaves a pushed tag that the publisher deterministically rejects; rerunning this trigger then fails because the tag already exists. Validate both versions before tagging, and mirror the safeguard in the preset trigger to preserve the required structural alignment.

Medium severity Validate download_url matches the new release before publishing

.github/​workflows/​release-extension.yml:59

This now validates only the catalog version, so a version bump can publish successfully while download_url still points to the previous tag or asset. That leaves the catalog serving the wrong package and violates the alignment requirement in AGENTS.md:122-126; the previous workflow explicitly checked the expected release URL. Restore that check before publishing.

Copilot AI balanced review requested due to automatic review settings October 5, 2026 18:20
@mnriem

mnriem commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Addressed both additional concerns in review 5418559574 with commit 41faa4c:

  • Both manual triggers now check the requested version against the manifest and catalog before creating or pushing a tag.
  • Both triggers and publishers require the catalog download URL to match the actual release repository, exact tag, and package ZIP filename. A stale URL is rejected before tagging as well as before packaging/publication.

The preset and extension workflows remain structurally aligned, with the same PAT-authenticated trigger and separate single-job publisher architecture. All four workflows pass actionlint; nine additional local regression checks cover valid packages, version mismatches, missing metadata, incorrect URL components, and local-only tag pushes/duplicate rejection. No real release was dispatched.

These two concerns appear in the review summary rather than new inline threads, so there are no new threads to resolve.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The workflows and documentation consistently implement the described release model without unresolved issues.

Review effort: Balanced
Findings: None

mnriem and others added 3 commits October 5, 2026 13:29
Use the same tag-triggered release structure and RELEASE_PAT checkout credentials for both package types. Preserve the upstream extension-canvas-design rename and package cleanup, and document the shared tag-filter behavior.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve the Spec Kit manual-trigger and separate publisher architecture while scoping package tags, parsing the final version delimiter, and passing release notes through a file. Correct extension help text and document the package-specific differences.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Check requested versions against manifests and catalogs in both manual triggers. Require catalog URLs to match the release repository, tag, and ZIP asset in triggers and publishers, preserving preset and extension workflow alignment.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 5, 2026 18:29
@mnriem
mnriem force-pushed the mnriem-spec-kit-extension-releases branch from 41faa4c to 7a9b133 Compare October 5, 2026 18:29

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The extension workflow permits manifest identity mismatches and can publish symlink-dereferenced sensitive files.

Review effort: Balanced
Findings: 2 High severity · 1 Medium severity

Open (3)

Comment thread .github/workflows/release-extension.yml
Comment thread .github/workflows/release-extension.yml
Comment thread .github/workflows/release-extension-trigger.yml
Restore manifest ID checks before version validation in both triggers and publishers. Reject symlinked package roots and contents before parsing manifests or archiving, and enforce existing package ID namespaces to keep package paths contained.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 5, 2026 18:38

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

Credentialed tag pushing and release publication were not exercised end to end, warranting final human validation.

Review effort: Balanced
Findings: None

Resolved since last review (3)

@mnriem

mnriem commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Acknowledged review 5419076590: there are no new code findings, and the three previous findings are resolved. Credentialed end-to-end release validation remains pending; the local regression checks do not prove the GitHub PAT-to-tag-push handoff or live publication.

Read-only secret-name metadata currently lists no repository or inherited organization RELEASE_PAT available to this repository. No secret values were accessed, and no real release was dispatched.

Maintainer validation for the first authorized releases after these workflows reach main:

  1. Configure RELEASE_PAT with permission to push release tags, and choose unreleased package versions whose manifest IDs/versions and catalog URLs match the intended repository, tag, and asset.
  2. Run the extension and preset manual triggers for their intended releases. Confirm each creates its exact tag and automatically starts only the matching publisher, without manually dispatching the publisher.
  3. Confirm publication succeeds, download each ZIP, and verify the manifest is at the archive root, packaged ID/version and contents are correct, release notes match the changelog, and the catalog URL downloads that exact asset. Record both trigger and publisher run URLs as end-to-end evidence.

This is an outstanding operational acceptance check, not an additional workflow change. No live tag push or publication is claimed as validated.

@mnriem
mnriem merged commit 2e24761 into github:main Oct 5, 2026
6 checks passed
@mnriem
mnriem deleted the mnriem-spec-kit-extension-releases branch October 5, 2026 19:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants