Skip to content

feat: /release — one-command release automation#219

Merged
forcingfx merged 11 commits into
mainfrom
feat/release-automation
May 31, 2026
Merged

feat: /release — one-command release automation#219
forcingfx merged 11 commits into
mainfrom
feat/release-automation

Conversation

@forcingfx

Copy link
Copy Markdown
Owner

Implements docs/superpowers/specs/2026-05-31-release-automation-design.md (+ plan docs/superpowers/plans/2026-05-31-release-automation.md).

What

Type /release (or /release X.Y.Z) and a release happens end-to-end, unattended:

  • Local skill (.claude/skills/release/) derives the version from conventional commits, drafts + lints the curated landing releases.mjs entry, builds the feed, pushes landing first, and polls until feedzero.app/releases.xml is live.
  • CI (.github/workflows/release.yml) then bumps package.json, refreshes the vendored fixture from the live feed, re-verifies the version lock, runs tsc + tests, tags vX.Y.Z, and publishes via the now-reusable docker-publish.yml (workflow_call).

Pieces

  • scripts/release/{compute-version,draft-notes,lint-notes}.ts — pure, fully unit-tested logic (19 tests).
  • tests/scripts/release-version-sync.test.ts — locks package.json to the vendored feed (fixes the lingering 0.9.0-vs-0.11.0 drift; fixture refreshed to 0.11.0).
  • docker-publish.ymlworkflow_call + version drift guard (tag/input must equal package.json).
  • release.yml — bump/fixture/test/commit/tag/publish.
  • .claude/skills/release/ replaces the buggy /new-release (which never tagged and had stale /kindle/ paths).
  • Runbook section: one-time setup (Actions write-to-main, or PAT fallback).

Guardrails

Four-way version lock: landing notes → vendored fixture → package.json → git tag. Abort-before-irreversible gates (red tests, landing-not-live, non-fixable lint).

Verification

  • npx vitest run → 3768 passed, 0 failed. tsc clean. actionlint clean on both workflows.
  • Dry-run on the last 15 commits computed 0.12.0, drafted bucketed notes, and the lint correctly flagged a non-conforming bullet (proving the unattended safety gate aborts on bad prose).

One-time setup you'll do before first /release

GitHub → Settings → Actions → Workflow permissions → Read and write (so release.yml can push the bump + tag), or the documented PAT fallback.

Not auto-merging.

🤖 Generated with Claude Code

github.sudoku and others added 11 commits May 31, 2026 20:45
Approved design for a `/release` command that cuts a release end-to-end:
local skill drafts curated landing notes + publishes the changelog feed
(landing-first), then CI bumps/tags/publishes the feedzero Docker image.
Hybrid execution, unattended note-drafting with a house-style lint gate,
version auto-derived from conventional commits, four-way version lock,
reusable docker-publish workflow. Supersedes the buggy /new-release skill.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bottom-up RGR plan (8 tasks): pure modules (compute-version, draft-notes,
lint-notes) with Vitest, lock-chain guard test, reusable docker-publish +
drift guard, release.yml, /release skill (retires /new-release), runbook.
Implements the 2026-05-31 release-automation design spec.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented May 31, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
feedzero Ready Ready Preview, Comment May 31, 2026 7:13pm

@forcingfx forcingfx merged commit f9e0fe5 into main May 31, 2026
14 checks passed
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.

1 participant