Skip to content

fix(workflows): add pre-release companion pipeline with even/odd versioning#735

Merged
WilliamBerryiii merged 7 commits intomainfrom
fix/release-please-prerelease
Feb 23, 2026
Merged

fix(workflows): add pre-release companion pipeline with even/odd versioning#735
WilliamBerryiii merged 7 commits intomainfrom
fix/release-please-prerelease

Conversation

@agreaves-ms
Copy link
Copy Markdown
Collaborator

fix(workflows): add pre-release companion pipeline with even/odd versioning

Description

This PR introduces an automated pre-release publishing pipeline for the VS Code extension ecosystem, using an even/odd minor version strategy. Even minor versions represent stable releases managed by release-please, while odd minor versions represent pre-releases managed by the new companion workflows. The pipeline spans the full lifecycle from version computation through marketplace publishing.

Pre-Release Pipeline

Two new workflows establish the automated pre-release flow.

The even/odd convention provides a clear separation between stable and pre-release versions without additional metadata or suffixes.

  • Added prerelease.yml, triggered on push to main, which computes the next odd-minor version from .release-please-manifest.json, generates a conventional-commit changelog, force-updates the prerelease/next branch, commits version bumps across four file locations, and creates or updates a pre-release PR with the autorelease: prerelease label
  • Added prerelease-release.yml, triggered on PR merge from prerelease/next, which extracts and validates the version from the PR title, creates a git tag and draft GitHub Release, packages extensions via the reusable extension-package.yml with the PreRelease channel, attests build provenance, uploads VSIX artifacts, and promotes the release from draft to published
  • Both workflows use GitHub App tokens for authenticated operations and enforce odd-minor validation with modular arithmetic checks
  • Breaking change detection scans commit history for BREAKING CHANGE markers and bumps the major version accordingly
  • Normalized YAML indentation from 4-space to 2-space to match repository conventions

Stable Release Integration

The existing release-please pipeline in main.yml gained a reset-prerelease job that runs after a stable release. It force-updates prerelease/next to the release commit and recalculates the pre-release PR title to reflect the post-release baseline version.

Extension Publish Enhancements

extension-publish.yml received a channel input (Stable/PreRelease) that flows through to packaging and the vsce publish command with conditional --pre-release flag. Expression injection mitigations hardened the workflow by moving github.event.release.tag_name and inputs.version into env context variables. Stable version auto-detection switched from gh release view to gh release list --exclude-drafts --exclude-pre-releases to prevent pre-release tags from polluting detection.

Related Issue(s)

None

Type of Change

Select all that apply:

Code & Documentation:

  • Bug fix (non-breaking change fixing an issue)
  • New feature (non-breaking change adding functionality)
  • Breaking change (fix or feature causing existing functionality to change)
  • Documentation update

Infrastructure & Configuration:

  • GitHub Actions workflow
  • Linting configuration (markdown, PowerShell, etc.)
  • Security configuration
  • DevContainer configuration
  • Dependency update

AI Artifacts:

  • Reviewed contribution with prompt-builder agent and addressed all feedback
  • Copilot instructions (.github/instructions/*.instructions.md)
  • Copilot prompt (.github/prompts/*.prompt.md)
  • Copilot agent (.github/agents/*.agent.md)
  • Copilot skill (.github/skills/*/SKILL.md)

Note for AI Artifact Contributors:

  • Agents: Research, indexing/referencing other project (using standard VS Code GitHub Copilot/MCP tools), planning, and general implementation agents likely already exist. Review .github/agents/ before creating new ones.
  • Skills: Must include both bash and PowerShell scripts. See Skills.
  • Model Versions: Only contributions targeting the latest Anthropic and OpenAI models will be accepted. Older model versions (e.g., GPT-3.5, Claude 3) will be rejected.
  • See Agents Not Accepted and Model Version Requirements.

Other:

  • Script/automation (.ps1, .sh, .py)
  • Other (please describe):

Sample Prompts (for AI Artifact Contributions)

User Request:

Execution Flow:

Output Artifacts:

Success Indicators:

For detailed contribution requirements, see:

Testing

Automated validation commands:

Check Command Status
Markdown linting npm run lint:md Passed
Spell checking npm run spell-check Passed
Frontmatter validation npm run lint:frontmatter Passed
Skill structure validation npm run validate:skills Passed
Link validation npm run lint:md-links Passed
PowerShell analysis npm run lint:ps Passed
Plugin freshness npm run plugin:generate Passed

Security analysis:

  • Expression injection mitigations verified in extension-publish.yml: GitHub context expressions moved from inline interpolation to env blocks
  • All action references use full SHA pins
  • Permissions follow least-privilege: contents: read at workflow level, elevated at job level only where needed
  • persist-credentials: false set on checkout steps

Diff-based assessments:

  • Verified action SHA pins match existing patterns across all four workflow files
  • Confirmed concurrency groups set on both new workflows
  • Validated odd-minor arithmetic checks appear in both prerelease.yml (computation) and prerelease-release.yml (validation)
  • Manual testing was not performed

Checklist

Required Checks

  • Documentation is updated (if applicable) (N/A — no documentation changes needed for workflow additions)
  • Files follow existing naming conventions
  • Changes are backwards compatible (if applicable)
  • Tests added for new functionality (if applicable) (N/A — workflow changes)

AI Artifact Contributions

  • Used /prompt-analyze to review contribution
  • Addressed all feedback from prompt-builder review
  • Verified contribution follows common standards and type-specific requirements

Required Automated Checks

The following validation commands must pass before merging:

  • Markdown linting: npm run lint:md
  • Spell checking: npm run spell-check
  • Frontmatter validation: npm run lint:frontmatter
  • Skill structure validation: npm run validate:skills
  • Link validation: npm run lint:md-links
  • PowerShell analysis: npm run lint:ps
  • Plugin freshness: npm run plugin:generate

Security Considerations

  • This PR does not contain any sensitive or NDA information
  • Any new dependencies have been reviewed for security issues (N/A — no new dependencies added)
  • Security-related scripts follow the principle of least privilege (N/A — no security scripts modified)

Additional Notes

  • YAML indentation in both new workflow files was normalized from 4-space to 2-space to match repository conventions. The original commit 87d2463 referenced "2-space indentation" but the correction had been applied only to extension-publish.yml.

@agreaves-ms agreaves-ms requested a review from a team as a code owner February 23, 2026 00:02
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Feb 23, 2026

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

OpenSSF Scorecard

PackageVersionScoreDetails
actions/actions/checkout de0fac2e4500dabe0009e67214ff5f5447ce83dd 🟢 6.2
Details
CheckScoreReason
Maintained🟢 45 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4
Code-Review🟢 10all changesets reviewed
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Signed-Releases⚠️ -1no releases found
Pinned-Dependencies🟢 3dependency not pinned by hash detected -- score normalized to 3
Security-Policy🟢 9security policy file detected
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 8SAST tool detected but not run on all commits
actions/actions/create-github-app-token 29824e69f54612133e76f7eaac726eef6c875baf 🟢 5.4
Details
CheckScoreReason
Code-Review⚠️ 0Found 1/11 approved changesets -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Maintained⚠️ 12 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies🟢 5dependency not pinned by hash detected -- score normalized to 5
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 9security policy file detected
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
Packaging🟢 10packaging workflow detected
SAST🟢 10SAST tool is run on all commits

Scanned Files

  • .github/workflows/extension-publish.yml
  • .github/workflows/prerelease.yml

agreaves-ms and others added 5 commits February 22, 2026 16:51
…dd versioning

- add prerelease.yml managing ODD minor pre-release PR lifecycle on prerelease/next
- add prerelease-release.yml for pre-release merge, tag, release, and VSIX packaging
- add reset-prerelease job to main.yml for post-release branch reset
- add channel input to extension-publish.yml for pre-release Marketplace publishing

✨ - Generated by Copilot
- change version detection to use latest release tag excluding drafts and pre-releases
- add validation for odd minor version in pre-release process

🔧 - Generated by Copilot
…ardening

- Convert prerelease.yml and prerelease-release.yml from 4-space to
  2-space YAML indentation matching codebase convention (IV-007)
- Migrate inputs.version and github.event.release.tag_name to env
  context in extension-publish.yml (IV-002)
- Replace heredoc with printf for release body in
  extension-publish.yml to prevent injection (IV-003)
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
@agreaves-ms agreaves-ms force-pushed the fix/release-please-prerelease branch from 500fc8a to 7fbec20 Compare February 23, 2026 00:51
…y and quality

- fix critical shell injection in extension-publish-prerelease.yml (C1)
- add semver format and even-minor parity validation to stable publish (M1, M2)
- add concurrency block and prefix stripping to pre-release publish (M3, M4)
- bound changelog generation to 100 commits when no prior tag exists (M5)
- extract reusable extension-publish-marketplace.yml workflow (m1)

🔒 - Generated by Copilot
- resolve merge conflict in extension-publish.yml
- normalize 4-space to 2-space YAML indentation in new workflow files
- move inline ${{ }} expressions from run blocks to env blocks

🔧 - Generated by Copilot
@WilliamBerryiii WilliamBerryiii merged commit 933a7b1 into main Feb 23, 2026
21 checks passed
WilliamBerryiii pushed a commit that referenced this pull request Feb 28, 2026
## Pre-Release 3.1.44

### ✨ Features

- add Docusaurus 3 documentation site with GitHub Pages deployment
(#680)
- add workflow permissions validation for OpenSSF Scorecard compliance
(#759)
- add DT coach return path handoff to task-researcher (#591) (#758)
- add DT subagent handoff workflow instructions (#592) (#757)
- create dt-method-06-deep.instructions.md (#602) (#748)
- create dt-method-05-deep.instructions.md (#747)
- add DT-aware task-implementor context instructions (#755)
- extract embedded PowerShell from workflows into testable scripts
(#738)
- add gitleaks binary-based secret scanning as PR gate (#734)
- add SBOM generation, attestation, and diff tooling to release pipeline
(#730)
- add dt-learning-tutor agent for DT education (#662)
- add DT image prompt generation guidance for Method 5 (#726)
- add DT-aware task-reviewer review context (#714)
- add dt-method-next routing prompt (#713)
- create dt-method-04-deep.instructions.md (#709)
- add Implementation Space exit handoff prompt for DT workflows (#708)
- add Write-CIStepSummary markdown table to Test-SHAStaleness github
output (#660)
- add dt-handoff-solution-space prompt for Solution Spac… (#707)

### 🐛 Bug Fixes

- update sidebar link color to meet WCAG AA contrast requirements (#814)
- harden even/odd versioning against regression and syntax errors (#816)
- replace even/odd versioning with SemVer -rc.N suffixes (#811)
- ensure prerelease label exists before PR creation (#806)
- replace Docusaurus favicons with Microsoft logo (#808)
- add missing subagents and shared instructions to collection manifests
(#804)
- standardize file path conventions for copilot-tracking output (#784)
- enforce project-scoped artifact isolation across DT files (#766)
- add top-level permissions to copilot-setup-steps.yml (#760)
- update broken file directives and markdown links after collection
directory reorg (#743)
- add pre-release companion pipeline with even/odd versioning (#735)
- exclude auto-generated CHANGELOG.md from spell check (#756)
- add job-level permissions to extension-publish.yml (#729)
- resolve handoff dependencies using display names (#727)
- add job-level permissions to validate-version in
extension-publish-prerelease (#731)
- replace parent-directory VS Code settings paths with per-subdirectory
enumeration (#732)

### 📚 Documentation

- add Design Thinking documentation and DT-to-RPI handoff (#789)
- add customization guides for HVE Core artifacts (#772)
- reconcile documentation against implementation (#771)
- document accepted Token-Permissions risks and add
lint:dependency-pinning (#763)
- add Design Thinking section to hve-core-all collection description
(#762)

### ♻️ Refactoring

- move collection scripts from plugins to collections (#728)
- remove duplicate git diff logic in frontmatter validator (#473)

### 🔧 Maintenance

- bump basic-ftp from 5.0.5 to 5.2.0 (#780)
- standardize script path references in SKILL.md files (#768)
- bump the github-actions group across 1 directory with 2 updates (#752)

---
*Managed automatically by pre-release workflow.*

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
WilliamBerryiii pushed a commit that referenced this pull request Feb 28, 2026
## Pre-Release 3.1.46

### ✨ Features

- add Docusaurus 3 documentation site with GitHub Pages deployment
(#680)
- add workflow permissions validation for OpenSSF Scorecard compliance
(#759)
- add DT coach return path handoff to task-researcher (#591) (#758)
- add DT subagent handoff workflow instructions (#592) (#757)
- create dt-method-06-deep.instructions.md (#602) (#748)
- create dt-method-05-deep.instructions.md (#747)
- add DT-aware task-implementor context instructions (#755)
- extract embedded PowerShell from workflows into testable scripts
(#738)
- add gitleaks binary-based secret scanning as PR gate (#734)
- add SBOM generation, attestation, and diff tooling to release pipeline
(#730)
- add dt-learning-tutor agent for DT education (#662)
- add DT image prompt generation guidance for Method 5 (#726)
- add DT-aware task-reviewer review context (#714)
- add dt-method-next routing prompt (#713)
- create dt-method-04-deep.instructions.md (#709)
- add Implementation Space exit handoff prompt for DT workflows (#708)
- add Write-CIStepSummary markdown table to Test-SHAStaleness github
output (#660)
- add dt-handoff-solution-space prompt for Solution Spac… (#707)

### 🐛 Bug Fixes

- update prerelease publish to use even/odd convention (#822)
- update sidebar link color to meet WCAG AA contrast requirements (#814)
- harden even/odd versioning against regression and syntax errors (#816)
- replace even/odd versioning with SemVer -rc.N suffixes (#811)
- ensure prerelease label exists before PR creation (#806)
- replace Docusaurus favicons with Microsoft logo (#808)
- add missing subagents and shared instructions to collection manifests
(#804)
- standardize file path conventions for copilot-tracking output (#784)
- enforce project-scoped artifact isolation across DT files (#766)
- add top-level permissions to copilot-setup-steps.yml (#760)
- update broken file directives and markdown links after collection
directory reorg (#743)
- add pre-release companion pipeline with even/odd versioning (#735)
- exclude auto-generated CHANGELOG.md from spell check (#756)
- add job-level permissions to extension-publish.yml (#729)
- resolve handoff dependencies using display names (#727)
- add job-level permissions to validate-version in
extension-publish-prerelease (#731)
- replace parent-directory VS Code settings paths with per-subdirectory
enumeration (#732)

### 📚 Documentation

- add Design Thinking documentation and DT-to-RPI handoff (#789)
- add customization guides for HVE Core artifacts (#772)
- reconcile documentation against implementation (#771)
- document accepted Token-Permissions risks and add
lint:dependency-pinning (#763)
- add Design Thinking section to hve-core-all collection description
(#762)

### ♻️ Refactoring

- move collection scripts from plugins to collections (#728)
- remove duplicate git diff logic in frontmatter validator (#473)

### 🔧 Maintenance

- pre-release 3.1.44 (#819)
- bump basic-ftp from 5.0.5 to 5.2.0 (#780)
- standardize script path references in SKILL.md files (#768)
- bump the github-actions group across 1 directory with 2 updates (#752)

---
*Managed automatically by pre-release workflow.*

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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.

3 participants