Skip to content

feat: cut releases locally, without a GitHub App - #14

Merged
andreszorro merged 1 commit into
mainfrom
feat/local-release-path
Aug 17, 2026
Merged

feat: cut releases locally, without a GitHub App#14
andreszorro merged 1 commit into
mainfrom
feat/local-release-path

Conversation

@andreszorro

Copy link
Copy Markdown
Collaborator

You do not need the GitHub App to ship. Creating one needs organization access, and until now that made releases impossible rather than merely manual — this removes the dependency.

pnpm release:pr     # opens or updates the release pull request
# review it, let ci finish, merge it
pnpm release:tag    # creates the tag and the GitHub Release
gh workflow run release.yml -f tag=v1.0.0   # attaches the build artifacts

It is the same tool, and on one axis it is better

scripts/release.sh runs the same release-please the workflow runs, against your own gh login. Nothing is stored and there is no secret to leak.

More usefully: the pull request it opens is authored by you, so ci runs on it. A pull request opened by GitHub Actions does not trigger workflows, so the automated path produces a release pull request that the main ruleset can never see a green ci on — the exact problem that made the App necessary in the first place. The local path does not have it.

Verified against this repository with --dry-run, and you already hold the admin role the ruleset bypasses, so nothing blocks the merge either.

Guards

  • Refuses to run anywhere but main — "Releases come from main, never from a branch" (MAINTAINERS.md).
  • Checks gh is installed and logged in, and says which is missing.
  • Prints the next command after each step, so the sequence does not have to be remembered.
  • shellcheck clean.

The App is now an upgrade, not a prerequisite

release.yml is unchanged and still does all of this automatically once AUTOMATION_APP_ID exists. The checklist item is reworded from "nothing releases until this exists" to what is actually true: optional for releases, still required to automate dependency updates.

biome ci clean · 380/380 tests · shellcheck clean · dry-run verified.

🤖 Generated with Claude Code

Creating a GitHub App needs organization access, which not every maintainer
has, and until now that made releases impossible rather than merely manual.

`pnpm release:pr` and `pnpm release:tag` run exactly the same release-please
against the maintainer's own `gh` login. Nothing is stored, no secret exists to
leak, and because the pull request is authored by a person rather than by
GitHub Actions it triggers `ci` — which a workflow-opened one does not, since
GITHUB_TOKEN pull requests do not start workflows.

So the local path is not a lesser fallback: on the check that matters it is
better than the automated one. The App remains the upgrade for when someone has
the access to create it, and release.yml is unchanged.

The script refuses to run anywhere but main, checks gh is installed and logged
in, and prints the next command at each step.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@andreszorro
andreszorro merged commit 2454580 into main Aug 17, 2026
10 checks passed
@upwind-code-us

upwind-code-us Bot commented Aug 17, 2026

Copy link
Copy Markdown

Upwind Upwind Code Scan - ⛔ Do Not Deploy

1 newly introduced vulnerabilities · 0 resolved · 1 total in this PR vs main

🔴 1 Critical


🔴 Critical · 1 finding
CVE Package Version Fix
CVE-2026-27606 rollup 4.52.5 4.59.0

View full analysis in Upwind Console

Scan completed in 48s

Scan history (1 scan)
Commit Scanned at New Resolved Net
ffbdc31 < 2026-08-17 01:39 UTC +1 0 +1

Last scanned: ffbdc31 · 2026-08-17 01:39 UTC

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