From e90ba29fb5b8d6b1115ea75f71181e3046674786 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 9 Mar 2026 01:42:07 +0000 Subject: [PATCH 1/9] feat: add prerelease (rc) support to release workflow https://claude.ai/code/session_01ULoEJZPc1AfKpew9Pz8w9H --- .github/workflows/release.yml | 47 ++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2c88dd3a..9415c08f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,6 +20,14 @@ on: description: New version default: patch required: true + prerelease: + type: choice + options: + - '' + - rc + description: Prerelease tag (leave empty for stable release) + default: '' + required: false permissions: contents: read @@ -62,9 +70,20 @@ jobs: env: LATEST_TAG: ${{ steps.get_latest_tag.outputs.latest_tag }} NEW_VERSION_TYPE: ${{ github.event.inputs.newversion }} + PRERELEASE: ${{ github.event.inputs.prerelease }} run: | npm version "$LATEST_TAG" --no-git-tag-version --allow-same-version - npm version "$NEW_VERSION_TYPE" --no-git-tag-version + + if [ -n "$PRERELEASE" ]; then + current_version=$(node -p "require('./package.json').version") + if echo "$current_version" | grep -q -- "-${PRERELEASE}\."; then + npm version prerelease --preid "$PRERELEASE" --no-git-tag-version + else + npm version "pre${NEW_VERSION_TYPE}" --preid "$PRERELEASE" --no-git-tag-version + fi + else + npm version "$NEW_VERSION_TYPE" --no-git-tag-version + fi new_version=$(node -p "require('./package.json').version") new_tag="v${new_version}" @@ -106,12 +125,26 @@ jobs: - name: Publish to npm if: inputs.environment != 'dry-run' working-directory: apps/cli - run: npm publish --provenance --access public + env: + PRERELEASE: ${{ inputs.prerelease }} + run: | + if [ -n "$PRERELEASE" ]; then + npm publish --provenance --access public --tag "$PRERELEASE" + else + npm publish --provenance --access public + fi - name: Publish dry run if: inputs.environment == 'dry-run' working-directory: apps/cli - run: npm publish --provenance --access public --dry-run + env: + PRERELEASE: ${{ inputs.prerelease }} + run: | + if [ -n "$PRERELEASE" ]; then + npm publish --provenance --access public --dry-run --tag "$PRERELEASE" + else + npm publish --provenance --access public --dry-run + fi - name: Configure git if: inputs.environment != 'dry-run' @@ -137,7 +170,13 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} NEW_TAG: ${{ needs.build.outputs.new_tag }} PREVIOUS_TAG: ${{ needs.build.outputs.previous_tag }} - run: gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_TAG" + PRERELEASE: ${{ inputs.prerelease }} + run: | + if [ -n "$PRERELEASE" ]; then + gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_TAG" --prerelease + else + gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_TAG" + fi - name: Preview release notes (dry-run) if: inputs.environment == 'dry-run' From 2923286f36572205d6251764bd927cf9a9ba4966 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 9 Mar 2026 01:53:04 +0000 Subject: [PATCH 2/9] fix: use latest stable tag for release notes on stable releases When promoting from rc to stable, release notes now cover all changes since the last stable version, not just since the last rc. https://claude.ai/code/session_01ULoEJZPc1AfKpew9Pz8w9H --- .github/workflows/release.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9415c08f..04c15f2e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,6 +49,7 @@ jobs: outputs: new_tag: ${{ steps.bump_version.outputs.new_tag }} previous_tag: ${{ steps.get_latest_tag.outputs.latest_tag }} + previous_stable_tag: ${{ steps.get_latest_tag.outputs.latest_stable_tag }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: @@ -64,6 +65,10 @@ jobs: latest_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0") echo "latest_tag=${latest_tag}" >> "$GITHUB_OUTPUT" + latest_stable_tag=$(git tag --list 'v*' --sort=-v:refname | grep -v '-' | head -n 1) + latest_stable_tag="${latest_stable_tag:-v0.0.0}" + echo "latest_stable_tag=${latest_stable_tag}" >> "$GITHUB_OUTPUT" + - name: Bump version id: bump_version working-directory: apps/cli @@ -170,12 +175,13 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} NEW_TAG: ${{ needs.build.outputs.new_tag }} PREVIOUS_TAG: ${{ needs.build.outputs.previous_tag }} + PREVIOUS_STABLE_TAG: ${{ needs.build.outputs.previous_stable_tag }} PRERELEASE: ${{ inputs.prerelease }} run: | if [ -n "$PRERELEASE" ]; then gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_TAG" --prerelease else - gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_TAG" + gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_STABLE_TAG" fi - name: Preview release notes (dry-run) @@ -184,13 +190,21 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} NEW_TAG: ${{ needs.build.outputs.new_tag }} PREVIOUS_TAG: ${{ needs.build.outputs.previous_tag }} + PREVIOUS_STABLE_TAG: ${{ needs.build.outputs.previous_stable_tag }} + PRERELEASE: ${{ inputs.prerelease }} REPOSITORY: ${{ github.repository }} TARGET_COMMITISH: ${{ github.sha }} run: | + if [ -n "$PRERELEASE" ]; then + notes_start_tag="$PREVIOUS_TAG" + else + notes_start_tag="$PREVIOUS_STABLE_TAG" + fi + echo "## Release notes for ${NEW_TAG}" >> "$GITHUB_STEP_SUMMARY" echo "" >> "$GITHUB_STEP_SUMMARY" gh api "repos/${REPOSITORY}/releases/generate-notes" \ -f tag_name="$NEW_TAG" \ -f target_commitish="$TARGET_COMMITISH" \ - -f previous_tag_name="$PREVIOUS_TAG" \ + -f previous_tag_name="$notes_start_tag" \ --jq '.body' >> "$GITHUB_STEP_SUMMARY" From e767f1bee9d7de43b3f8f03800e3d377c2ca20bb Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 9 Mar 2026 01:55:02 +0000 Subject: [PATCH 3/9] refactor: replace prerelease input with preminor/premajor/prerelease version types Instead of a separate prerelease input, add preminor, premajor, and prerelease directly to the newversion options. This maps directly to npm version commands and avoids confusion about input combinations. https://claude.ai/code/session_01ULoEJZPc1AfKpew9Pz8w9H --- .github/workflows/release.yml | 92 ++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 44 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04c15f2e..6dc7445f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,17 +17,12 @@ on: - patch - minor - major - description: New version + - preminor + - premajor + - prerelease + description: New version (preminor/premajor create rc, prerelease bumps rc number) default: patch required: true - prerelease: - type: choice - options: - - '' - - rc - description: Prerelease tag (leave empty for stable release) - default: '' - required: false permissions: contents: read @@ -75,20 +70,17 @@ jobs: env: LATEST_TAG: ${{ steps.get_latest_tag.outputs.latest_tag }} NEW_VERSION_TYPE: ${{ github.event.inputs.newversion }} - PRERELEASE: ${{ github.event.inputs.prerelease }} run: | npm version "$LATEST_TAG" --no-git-tag-version --allow-same-version - if [ -n "$PRERELEASE" ]; then - current_version=$(node -p "require('./package.json').version") - if echo "$current_version" | grep -q -- "-${PRERELEASE}\."; then - npm version prerelease --preid "$PRERELEASE" --no-git-tag-version - else - npm version "pre${NEW_VERSION_TYPE}" --preid "$PRERELEASE" --no-git-tag-version - fi - else - npm version "$NEW_VERSION_TYPE" --no-git-tag-version - fi + case "$NEW_VERSION_TYPE" in + preminor|premajor|prerelease) + npm version "$NEW_VERSION_TYPE" --preid rc --no-git-tag-version + ;; + *) + npm version "$NEW_VERSION_TYPE" --no-git-tag-version + ;; + esac new_version=$(node -p "require('./package.json').version") new_tag="v${new_version}" @@ -131,25 +123,31 @@ jobs: if: inputs.environment != 'dry-run' working-directory: apps/cli env: - PRERELEASE: ${{ inputs.prerelease }} + NEW_VERSION_TYPE: ${{ inputs.newversion }} run: | - if [ -n "$PRERELEASE" ]; then - npm publish --provenance --access public --tag "$PRERELEASE" - else - npm publish --provenance --access public - fi + case "$NEW_VERSION_TYPE" in + preminor|premajor|prerelease) + npm publish --provenance --access public --tag rc + ;; + *) + npm publish --provenance --access public + ;; + esac - name: Publish dry run if: inputs.environment == 'dry-run' working-directory: apps/cli env: - PRERELEASE: ${{ inputs.prerelease }} + NEW_VERSION_TYPE: ${{ inputs.newversion }} run: | - if [ -n "$PRERELEASE" ]; then - npm publish --provenance --access public --dry-run --tag "$PRERELEASE" - else - npm publish --provenance --access public --dry-run - fi + case "$NEW_VERSION_TYPE" in + preminor|premajor|prerelease) + npm publish --provenance --access public --dry-run --tag rc + ;; + *) + npm publish --provenance --access public --dry-run + ;; + esac - name: Configure git if: inputs.environment != 'dry-run' @@ -176,13 +174,16 @@ jobs: NEW_TAG: ${{ needs.build.outputs.new_tag }} PREVIOUS_TAG: ${{ needs.build.outputs.previous_tag }} PREVIOUS_STABLE_TAG: ${{ needs.build.outputs.previous_stable_tag }} - PRERELEASE: ${{ inputs.prerelease }} + NEW_VERSION_TYPE: ${{ inputs.newversion }} run: | - if [ -n "$PRERELEASE" ]; then - gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_TAG" --prerelease - else - gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_STABLE_TAG" - fi + case "$NEW_VERSION_TYPE" in + preminor|premajor|prerelease) + gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_TAG" --prerelease + ;; + *) + gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_STABLE_TAG" + ;; + esac - name: Preview release notes (dry-run) if: inputs.environment == 'dry-run' @@ -191,15 +192,18 @@ jobs: NEW_TAG: ${{ needs.build.outputs.new_tag }} PREVIOUS_TAG: ${{ needs.build.outputs.previous_tag }} PREVIOUS_STABLE_TAG: ${{ needs.build.outputs.previous_stable_tag }} - PRERELEASE: ${{ inputs.prerelease }} + NEW_VERSION_TYPE: ${{ inputs.newversion }} REPOSITORY: ${{ github.repository }} TARGET_COMMITISH: ${{ github.sha }} run: | - if [ -n "$PRERELEASE" ]; then - notes_start_tag="$PREVIOUS_TAG" - else - notes_start_tag="$PREVIOUS_STABLE_TAG" - fi + case "$NEW_VERSION_TYPE" in + preminor|premajor|prerelease) + notes_start_tag="$PREVIOUS_TAG" + ;; + *) + notes_start_tag="$PREVIOUS_STABLE_TAG" + ;; + esac echo "## Release notes for ${NEW_TAG}" >> "$GITHUB_STEP_SUMMARY" echo "" >> "$GITHUB_STEP_SUMMARY" From 6e2478ab5b533288cd5a790137ed38632c08d11a Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 9 Mar 2026 02:01:26 +0000 Subject: [PATCH 4/9] refactor: use boolean checkbox for prerelease instead of version type options Simpler UI: newversion stays as patch/minor/major, and a separate checkbox controls whether to release as rc. When checked and the current version is already an rc, it bumps the rc number instead. https://claude.ai/code/session_01ULoEJZPc1AfKpew9Pz8w9H --- .github/workflows/release.yml | 88 ++++++++++++++++------------------- 1 file changed, 40 insertions(+), 48 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6dc7445f..7ef7d248 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,12 +17,13 @@ on: - patch - minor - major - - preminor - - premajor - - prerelease - description: New version (preminor/premajor create rc, prerelease bumps rc number) + description: New version default: patch required: true + prerelease: + type: boolean + description: Release as rc (prerelease) + default: false permissions: contents: read @@ -70,17 +71,20 @@ jobs: env: LATEST_TAG: ${{ steps.get_latest_tag.outputs.latest_tag }} NEW_VERSION_TYPE: ${{ github.event.inputs.newversion }} + PRERELEASE: ${{ github.event.inputs.prerelease }} run: | npm version "$LATEST_TAG" --no-git-tag-version --allow-same-version - case "$NEW_VERSION_TYPE" in - preminor|premajor|prerelease) - npm version "$NEW_VERSION_TYPE" --preid rc --no-git-tag-version - ;; - *) - npm version "$NEW_VERSION_TYPE" --no-git-tag-version - ;; - esac + if [ "$PRERELEASE" = "true" ]; then + current_version=$(node -p "require('./package.json').version") + if echo "$current_version" | grep -q -- "-rc\."; then + npm version prerelease --preid rc --no-git-tag-version + else + npm version "pre${NEW_VERSION_TYPE}" --preid rc --no-git-tag-version + fi + else + npm version "$NEW_VERSION_TYPE" --no-git-tag-version + fi new_version=$(node -p "require('./package.json').version") new_tag="v${new_version}" @@ -123,31 +127,25 @@ jobs: if: inputs.environment != 'dry-run' working-directory: apps/cli env: - NEW_VERSION_TYPE: ${{ inputs.newversion }} + PRERELEASE: ${{ inputs.prerelease }} run: | - case "$NEW_VERSION_TYPE" in - preminor|premajor|prerelease) - npm publish --provenance --access public --tag rc - ;; - *) - npm publish --provenance --access public - ;; - esac + if [ "$PRERELEASE" = "true" ]; then + npm publish --provenance --access public --tag rc + else + npm publish --provenance --access public + fi - name: Publish dry run if: inputs.environment == 'dry-run' working-directory: apps/cli env: - NEW_VERSION_TYPE: ${{ inputs.newversion }} + PRERELEASE: ${{ inputs.prerelease }} run: | - case "$NEW_VERSION_TYPE" in - preminor|premajor|prerelease) - npm publish --provenance --access public --dry-run --tag rc - ;; - *) - npm publish --provenance --access public --dry-run - ;; - esac + if [ "$PRERELEASE" = "true" ]; then + npm publish --provenance --access public --dry-run --tag rc + else + npm publish --provenance --access public --dry-run + fi - name: Configure git if: inputs.environment != 'dry-run' @@ -174,16 +172,13 @@ jobs: NEW_TAG: ${{ needs.build.outputs.new_tag }} PREVIOUS_TAG: ${{ needs.build.outputs.previous_tag }} PREVIOUS_STABLE_TAG: ${{ needs.build.outputs.previous_stable_tag }} - NEW_VERSION_TYPE: ${{ inputs.newversion }} + PRERELEASE: ${{ inputs.prerelease }} run: | - case "$NEW_VERSION_TYPE" in - preminor|premajor|prerelease) - gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_TAG" --prerelease - ;; - *) - gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_STABLE_TAG" - ;; - esac + if [ "$PRERELEASE" = "true" ]; then + gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_TAG" --prerelease + else + gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_STABLE_TAG" + fi - name: Preview release notes (dry-run) if: inputs.environment == 'dry-run' @@ -192,18 +187,15 @@ jobs: NEW_TAG: ${{ needs.build.outputs.new_tag }} PREVIOUS_TAG: ${{ needs.build.outputs.previous_tag }} PREVIOUS_STABLE_TAG: ${{ needs.build.outputs.previous_stable_tag }} - NEW_VERSION_TYPE: ${{ inputs.newversion }} + PRERELEASE: ${{ inputs.prerelease }} REPOSITORY: ${{ github.repository }} TARGET_COMMITISH: ${{ github.sha }} run: | - case "$NEW_VERSION_TYPE" in - preminor|premajor|prerelease) - notes_start_tag="$PREVIOUS_TAG" - ;; - *) - notes_start_tag="$PREVIOUS_STABLE_TAG" - ;; - esac + if [ "$PRERELEASE" = "true" ]; then + notes_start_tag="$PREVIOUS_TAG" + else + notes_start_tag="$PREVIOUS_STABLE_TAG" + fi echo "## Release notes for ${NEW_TAG}" >> "$GITHUB_STEP_SUMMARY" echo "" >> "$GITHUB_STEP_SUMMARY" From 2ec5687afbfe4b1b793087451d90e962e17015b4 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 9 Mar 2026 02:05:31 +0000 Subject: [PATCH 5/9] refactor: consolidate duplicate dry-run and production steps Merge publish and release note steps by using DRY_RUN flag to conditionally add --dry-run or switch to preview mode, eliminating step duplication. https://claude.ai/code/session_01ULoEJZPc1AfKpew9Pz8w9H --- .github/workflows/release.yml | 60 +++++++++++++---------------------- 1 file changed, 22 insertions(+), 38 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7ef7d248..f70f92a1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -124,28 +124,19 @@ jobs: path: apps/cli - name: Publish to npm - if: inputs.environment != 'dry-run' working-directory: apps/cli env: PRERELEASE: ${{ inputs.prerelease }} + DRY_RUN: ${{ inputs.environment == 'dry-run' }} run: | + flags="--provenance --access public" if [ "$PRERELEASE" = "true" ]; then - npm publish --provenance --access public --tag rc - else - npm publish --provenance --access public + flags="$flags --tag rc" fi - - - name: Publish dry run - if: inputs.environment == 'dry-run' - working-directory: apps/cli - env: - PRERELEASE: ${{ inputs.prerelease }} - run: | - if [ "$PRERELEASE" = "true" ]; then - npm publish --provenance --access public --dry-run --tag rc - else - npm publish --provenance --access public --dry-run + if [ "$DRY_RUN" = "true" ]; then + flags="$flags --dry-run" fi + npm publish $flags - name: Configure git if: inputs.environment != 'dry-run' @@ -166,28 +157,13 @@ jobs: git push origin "${NEW_TAG}" - name: Create GitHub release - if: inputs.environment != 'dry-run' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NEW_TAG: ${{ needs.build.outputs.new_tag }} - PREVIOUS_TAG: ${{ needs.build.outputs.previous_tag }} - PREVIOUS_STABLE_TAG: ${{ needs.build.outputs.previous_stable_tag }} - PRERELEASE: ${{ inputs.prerelease }} - run: | - if [ "$PRERELEASE" = "true" ]; then - gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_TAG" --prerelease - else - gh release create "$NEW_TAG" --generate-notes --notes-start-tag "$PREVIOUS_STABLE_TAG" - fi - - - name: Preview release notes (dry-run) - if: inputs.environment == 'dry-run' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} NEW_TAG: ${{ needs.build.outputs.new_tag }} PREVIOUS_TAG: ${{ needs.build.outputs.previous_tag }} PREVIOUS_STABLE_TAG: ${{ needs.build.outputs.previous_stable_tag }} PRERELEASE: ${{ inputs.prerelease }} + DRY_RUN: ${{ inputs.environment == 'dry-run' }} REPOSITORY: ${{ github.repository }} TARGET_COMMITISH: ${{ github.sha }} run: | @@ -197,10 +173,18 @@ jobs: notes_start_tag="$PREVIOUS_STABLE_TAG" fi - echo "## Release notes for ${NEW_TAG}" >> "$GITHUB_STEP_SUMMARY" - echo "" >> "$GITHUB_STEP_SUMMARY" - gh api "repos/${REPOSITORY}/releases/generate-notes" \ - -f tag_name="$NEW_TAG" \ - -f target_commitish="$TARGET_COMMITISH" \ - -f previous_tag_name="$notes_start_tag" \ - --jq '.body' >> "$GITHUB_STEP_SUMMARY" + if [ "$DRY_RUN" = "true" ]; then + echo "## Release notes for ${NEW_TAG}" >> "$GITHUB_STEP_SUMMARY" + echo "" >> "$GITHUB_STEP_SUMMARY" + gh api "repos/${REPOSITORY}/releases/generate-notes" \ + -f tag_name="$NEW_TAG" \ + -f target_commitish="$TARGET_COMMITISH" \ + -f previous_tag_name="$notes_start_tag" \ + --jq '.body' >> "$GITHUB_STEP_SUMMARY" + else + flags="--generate-notes --notes-start-tag $notes_start_tag" + if [ "$PRERELEASE" = "true" ]; then + flags="$flags --prerelease" + fi + gh release create "$NEW_TAG" $flags + fi From b9bf740a053ba2f7c7f5e217db4c29dbb248da73 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 9 Mar 2026 02:11:15 +0000 Subject: [PATCH 6/9] refactor: deduplicate env vars using workflow-level and job-level env MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PRERELEASE and DRY_RUN → workflow-level env - NEW_TAG, PREVIOUS_TAG, PREVIOUS_STABLE_TAG → publish job-level env - Remove redundant step-level env definitions https://claude.ai/code/session_01ULoEJZPc1AfKpew9Pz8w9H --- .github/workflows/release.yml | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f70f92a1..df9284b6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,6 +25,10 @@ on: description: Release as rc (prerelease) default: false +env: + PRERELEASE: ${{ inputs.prerelease }} + DRY_RUN: ${{ inputs.environment == 'dry-run' }} + permissions: contents: read @@ -70,8 +74,7 @@ jobs: working-directory: apps/cli env: LATEST_TAG: ${{ steps.get_latest_tag.outputs.latest_tag }} - NEW_VERSION_TYPE: ${{ github.event.inputs.newversion }} - PRERELEASE: ${{ github.event.inputs.prerelease }} + NEW_VERSION_TYPE: ${{ inputs.newversion }} run: | npm version "$LATEST_TAG" --no-git-tag-version --allow-same-version @@ -110,6 +113,10 @@ jobs: permissions: contents: write id-token: write + env: + NEW_TAG: ${{ needs.build.outputs.new_tag }} + PREVIOUS_TAG: ${{ needs.build.outputs.previous_tag }} + PREVIOUS_STABLE_TAG: ${{ needs.build.outputs.previous_stable_tag }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -125,9 +132,6 @@ jobs: - name: Publish to npm working-directory: apps/cli - env: - PRERELEASE: ${{ inputs.prerelease }} - DRY_RUN: ${{ inputs.environment == 'dry-run' }} run: | flags="--provenance --access public" if [ "$PRERELEASE" = "true" ]; then @@ -147,7 +151,6 @@ jobs: - name: Push version commit and tag if: inputs.environment != 'dry-run' env: - NEW_TAG: ${{ needs.build.outputs.new_tag }} REF_NAME: ${{ github.ref_name }} run: | git add apps/cli/package.json @@ -159,11 +162,6 @@ jobs: - name: Create GitHub release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NEW_TAG: ${{ needs.build.outputs.new_tag }} - PREVIOUS_TAG: ${{ needs.build.outputs.previous_tag }} - PREVIOUS_STABLE_TAG: ${{ needs.build.outputs.previous_stable_tag }} - PRERELEASE: ${{ inputs.prerelease }} - DRY_RUN: ${{ inputs.environment == 'dry-run' }} REPOSITORY: ${{ github.repository }} TARGET_COMMITISH: ${{ github.sha }} run: | From a09a6354012cdfcd9641e1a728c3ad4fa98f37b4 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 9 Mar 2026 02:13:50 +0000 Subject: [PATCH 7/9] docs: add release input combinations table to CONTRIBUTING.md https://claude.ai/code/session_01ULoEJZPc1AfKpew9Pz8w9H --- CONTRIBUTING.md | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 021506ab..f16c8373 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -64,9 +64,11 @@ pnpm --filter @nulab/bee build Releases are triggered manually via the [Release workflow](https://github.com/nulab/bee/actions/workflows/release.yml) (`workflow_dispatch`). 1. Go to **Actions > Release > Run workflow**. -2. Select the **environment** (`dry-run` or production). -3. Select the **version bump** (`patch`, `minor`, or `major`). -4. The workflow will: +2. Select the inputs: + - **environment** — `dry-run` (default) or `production` + - **newversion** — `patch`, `minor`, or `major` + - **prerelease** — check to release as rc (prerelease) +3. The workflow will: - Bump the version in `apps/cli/package.json` - Build the CLI - Publish to npm with provenance @@ -74,6 +76,18 @@ Releases are triggered manually via the [Release workflow](https://github.com/nu Dry-run mode publishes with `--dry-run` and skips git tag/push, so it's safe to test. +### Input combinations + +| newversion | prerelease | Example result | npm tag | +|---|---|---|---| +| `minor` | unchecked | `1.0.0` → `1.1.0` | `latest` | +| `major` | unchecked | `1.0.0` → `2.0.0` | `latest` | +| `patch` | unchecked | `1.0.1` → `1.0.2` | `latest` | +| `minor` | checked | `1.0.0` → `1.1.0-rc.0` | `rc` | +| `major` | checked | `1.0.0` → `2.0.0-rc.0` | `rc` | +| `minor` | checked | `1.1.0-rc.0` → `1.1.0-rc.1` (already rc: bumps rc number) | `rc` | +| `minor` | unchecked | `1.1.0-rc.1` → `1.1.0` (promote to stable) | `latest` | + ## Documentation Site The documentation site (`apps/docs`) uses Astro Starlight. Command reference pages are auto-generated from CLI source code — do not create markdown files under `apps/docs/src/content/docs/commands/`. See [CLAUDE.md](CLAUDE.md#documentation-site-appsdocs) for details. From 98a89aa1b877145e83836ec86242c942e2113a0a Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 9 Mar 2026 02:15:25 +0000 Subject: [PATCH 8/9] refactor: move NEW_VERSION_TYPE to workflow-level env All input-derived env vars are now consistently defined at workflow level: NEW_VERSION_TYPE, PRERELEASE, DRY_RUN. https://claude.ai/code/session_01ULoEJZPc1AfKpew9Pz8w9H --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index df9284b6..03716e0d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,6 +26,7 @@ on: default: false env: + NEW_VERSION_TYPE: ${{ inputs.newversion }} PRERELEASE: ${{ inputs.prerelease }} DRY_RUN: ${{ inputs.environment == 'dry-run' }} @@ -74,7 +75,6 @@ jobs: working-directory: apps/cli env: LATEST_TAG: ${{ steps.get_latest_tag.outputs.latest_tag }} - NEW_VERSION_TYPE: ${{ inputs.newversion }} run: | npm version "$LATEST_TAG" --no-git-tag-version --allow-same-version From 2f9b2b94ab291b2784add26daf5f28655d2a02e6 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 9 Mar 2026 02:21:30 +0000 Subject: [PATCH 9/9] style: fix markdown table formatting in CONTRIBUTING.md https://claude.ai/code/session_01ULoEJZPc1AfKpew9Pz8w9H --- CONTRIBUTING.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f16c8373..0345ce4a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -78,15 +78,15 @@ Dry-run mode publishes with `--dry-run` and skips git tag/push, so it's safe to ### Input combinations -| newversion | prerelease | Example result | npm tag | -|---|---|---|---| -| `minor` | unchecked | `1.0.0` → `1.1.0` | `latest` | -| `major` | unchecked | `1.0.0` → `2.0.0` | `latest` | -| `patch` | unchecked | `1.0.1` → `1.0.2` | `latest` | -| `minor` | checked | `1.0.0` → `1.1.0-rc.0` | `rc` | -| `major` | checked | `1.0.0` → `2.0.0-rc.0` | `rc` | -| `minor` | checked | `1.1.0-rc.0` → `1.1.0-rc.1` (already rc: bumps rc number) | `rc` | -| `minor` | unchecked | `1.1.0-rc.1` → `1.1.0` (promote to stable) | `latest` | +| newversion | prerelease | Example result | npm tag | +| ---------- | ---------- | --------------------------------------------------------- | -------- | +| `minor` | unchecked | `1.0.0` → `1.1.0` | `latest` | +| `major` | unchecked | `1.0.0` → `2.0.0` | `latest` | +| `patch` | unchecked | `1.0.1` → `1.0.2` | `latest` | +| `minor` | checked | `1.0.0` → `1.1.0-rc.0` | `rc` | +| `major` | checked | `1.0.0` → `2.0.0-rc.0` | `rc` | +| `minor` | checked | `1.1.0-rc.0` → `1.1.0-rc.1` (already rc: bumps rc number) | `rc` | +| `minor` | unchecked | `1.1.0-rc.1` → `1.1.0` (promote to stable) | `latest` | ## Documentation Site