Skip to content

chore: switch release-please to single-package mode (one tag for all)#33

Merged
minjun0219 merged 1 commit into
mainfrom
claude/release-please-single-package-mode
May 6, 2026
Merged

chore: switch release-please to single-package mode (one tag for all)#33
minjun0219 merged 1 commit into
mainfrom
claude/release-please-single-package-mode

Conversation

@minjun0219

Copy link
Copy Markdown
Owner

Summary

Restructure the release-please pipeline so the entire monorepo cuts a single coordinated release per cycle — one vX.Y.Z git tag, one GitHub Release, one root CHANGELOG.md — instead of producing per-package tags and Releases. Supersedes #32, which kept the per-package monorepo structure but ran into asymmetric tag namespaces and linked-versions plugin edge cases.

In practice all three workspace packages — ogpeek (engine, npm), @ogpeek/react (drop-in components, npm), ogpeek-extension (Chrome MV3 wrapper, GitHub Release zip) — are co-developed and ship together. @ogpeek/react and the extension are both wrappers around the engine and aren't useful out of sync with it. Treating them as one product matches reality and removes a class of release-tooling edge cases (phantom bumps, mismatched starting versions, asymmetric tag formats, missing path anchors for Release-As footers).

Changes

release-please-config.json

  • Replace the per-package map with a single root entry ("." path).
  • package-name: "ogpeek" (the project name; matches the existing vX.Y.Z tag namespace, so v0.5.0 stays a meaningful boundary).
  • include-component-in-tag: false → tags are vX.Y.Z with no prefix, continuing the existing convention.
  • extra-files lists every package.json that release-please should bump in lockstep with the root version: ogpeek, @ogpeek/react, ogpeek-extension. release-please's built-in node updater handles each version field automatically.
  • Drop the linked-versions plugin and separate-pull-requests flag — both unnecessary in single-package mode.

.release-please-manifest.json

  • Collapse the two per-package entries into a single "." entry at "0.5.0" — matching ogpeek + @ogpeek/react on npm and the existing v0.5.0 tag.

.github/workflows/release-please.yml

  • Replace the four per-package outputs with a single release_created + tag_name pair, both keyed against the "." path.
  • Gate publish-ogpeek and publish-ogpeek-react on the same single output so they always fire together with the new umbrella release.
  • Add publish-ogpeek-extension that runs alongside the other two: builds the workspace libs explicitly (no reliance on the website-anchored libs:build script), runs build:chrome + the zip script directly to avoid double-building libs through package:chrome, and uploads dist/ogpeek-chrome.zip to the GitHub Release with --clobber for re-run idempotency. Uses GITHUB_TOKEN only — no npm credentials, no OIDC.

Trade-offs

  • Lockstep versioning: All three packages always share a version. A fix in one bumps all three (phantom bump for the others — new npm publishes / new zip even if their content is unchanged). Acceptable because the three move together anyway.
  • Per-package CHANGELOGs go stale: packages/ogpeek/CHANGELOG.md and packages/ogpeek-react/CHANGELOG.md keep their historical entries but won't get new ones — the next release writes only to the root CHANGELOG.md. The umbrella release notes are the new source of truth, scoped per-package via Conventional Commit scopes (feat(ogpeek-extension):, fix(ogpeek-react):, etc.) inside each entry.
  • Orphaned per-component tags: ogpeek-react-v0.5.0 (created in chore: release main #31) stays in git/on GitHub but won't get successors. Harmless.

Test plan (after merge)

This commit is a chore:, so the release-please run on push will not propose a release immediately. The next feat:/fix: that lands on main will produce the first single-package-mode release PR. Expected:

  • One chore: release main PR with the new version bumped on a single root CHANGELOG.md.
  • All three package.json files (packages/ogpeek/, packages/ogpeek-react/, packages/ogpeek-extension/) updated to the new version via extra-files.
  • Merging the release PR cuts a single vX.Y.Z tag + a single GitHub Release.
  • Three publish jobs fire from the one release_created event: publish-ogpeek (npm), publish-ogpeek-react (npm), publish-ogpeek-extension (GitHub Release zip upload).

If a smoke test is preferred without waiting for a real change, force one with a Release-As: 0.5.1 footer on a follow-up commit on this branch before merge.

Korean

요약

release-please를 모노레포 모드 → 단일 패키지 모드로 전환. 한 번의 릴리즈 사이클에 git 태그 1개 (vX.Y.Z), GitHub Release 1개, CHANGELOG 1개 (루트) — 패키지별로 따로 찍지 않음. #32을 대체.

세 패키지(ogpeek 엔진 / @ogpeek/react 컴포넌트 / ogpeek-extension 확장)가 사실상 함께 진화하고 함께 발표되는 한 제품이라는 결정에 따라 설정을 그 모양으로 맞춤. 이전 모노레포 모드에서 발생하던 비대칭 태그, linked-versions 플러그인 가장자리 케이스, Release-As path-anchor 문제 등이 일괄 사라짐.

핵심 변경

  • release-please-config.json: 단일 루트 entry (".") + extra-files로 세 패키지의 package.json#version을 한꺼번에 bump. linked-versions / separate-pull-requests 플래그 제거.
  • .release-please-manifest.json: {".": "0.5.0"} 한 줄.
  • 워크플로우: output 단순화 (release_created / tag_name 한 쌍), 세 publish job이 같은 single output에 게이팅. extension job은 GITHUB_TOKEN만 써서 GitHub Release에 zip 업로드.

트레이드오프

  • 셋이 항상 lockstep — 한쪽에 fix 들어와도 셋 다 새 버전으로 publish/zip (phantom bump). 어차피 함께 발표되는 제품이라 수용 가능.
  • 기존 per-package CHANGELOG는 역사 기록으로 남되 신규 항목은 루트 CHANGELOG로만 들어감. 항목 안에서 feat(ogpeek-extension): 같은 Conventional Commit scope로 어느 패키지 변경인지 구분.
  • 기존 ogpeek-react-v0.5.0 같은 component-prefixed 태그는 orphan으로 남지만 무해.

검증 (머지 후)

이 커밋은 chore라서 즉시 릴리즈 PR이 열리지는 않음. 다음 feat/fix가 main에 들어오면 그때 첫 single-mode 릴리즈 PR 생성 → 머지 → vX.Y.Z 태그 1개 + 세 publish job 동시 작동.

스모크 테스트를 즉시 보고 싶으면 머지 전에 이 브랜치에 Release-As: 0.5.1 footer 박은 커밋 추가하면 됩니다.

https://claude.ai/code/session_0162rG86ukDFiBZfqgEADYfp


Generated by Claude Code

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented May 6, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
ogpeek 65e98bf Commit Preview URL

Branch Preview URL
May 06 2026, 09:35 AM

@minjun0219 minjun0219 force-pushed the claude/release-please-single-package-mode branch from 194623e to 700b992 Compare May 6, 2026 09:23
@minjun0219 minjun0219 marked this pull request as ready for review May 6, 2026 09:27
Copilot AI review requested due to automatic review settings May 6, 2026 09:27

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 700b9922d3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/release-please.yml Outdated
@minjun0219 minjun0219 force-pushed the claude/release-please-single-package-mode branch from 700b992 to 15af5fd Compare May 6, 2026 09:32

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR reconfigures the repository’s release-please setup to cut one coordinated monorepo release per cycle (single vX.Y.Z tag + single GitHub Release + single root CHANGELOG.md), and updates the release workflow so all publish steps key off that single release event.

Changes:

  • Switch release-please-config.json from per-package entries to a single root (".") package with extra-files to bump all workspace package versions in lockstep.
  • Collapse .release-please-manifest.json to a single "." version entry.
  • Simplify .github/workflows/release-please.yml outputs to one release_created/tag_name pair and add a job to build + upload the Chrome extension zip to the GitHub Release.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
release-please-config.json Moves to single root package mode and uses extra-files to bump all workspace package versions together.
.release-please-manifest.json Collapses manifest to a single "." version entry for the whole repo release.
.github/workflows/release-please.yml Gates all publish steps on the single root release output and adds extension zip upload to the GitHub Release.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread release-please-config.json
Comment thread .github/workflows/release-please.yml
Restructure the release-please pipeline so the entire monorepo cuts a
single coordinated release per cycle — one git tag, one GitHub Release,
one CHANGELOG — instead of producing per-package tags and Releases.

Why
---

The earlier setup tracked each workspace package independently:
  - packages/ogpeek as bare-tagged "vX.Y.Z" on npm
  - packages/ogpeek-react as "ogpeek-react-vX.Y.Z" on npm
  - packages/ogpeek-extension (added in #28/#30) as "ogpeek-extension-vX.Y.Z"
    on GitHub Releases

That's the standard release-please monorepo shape, but it produces
asymmetric tag namespaces (one bare, two prefixed) and forces every
"do they release together?" question through linked-versions plugin
configuration, which we already started running into on #32.

In practice all three packages are co-developed and ship together —
@ogpeek/react and ogpeek-extension are both wrappers around the engine
and aren't useful at versions out of sync with it. Treating them as one
product matches reality and removes a class of release-tooling
edge cases (phantom bumps, plugin behavior on mismatched starting
versions, asymmetric tag formats, missing path anchors for Release-As
footers).

Changes
-------

- release-please-config.json:
  - Replace the per-package map with a single root entry ("." path).
    package-name is "ogpeek" (the project name; matches the existing
    "vX.Y.Z" tag namespace, so v0.5.0 stays a meaningful boundary).
  - include-component-in-tag stays false → tags are "vX.Y.Z" with no
    prefix, continuing the existing convention.
  - extra-files lists every package.json that release-please should
    bump in lockstep with the root version: ogpeek, @ogpeek/react,
    ogpeek-extension. release-please's built-in node updater handles
    each "version" field automatically.
  - Drop the linked-versions plugin and separate-pull-requests flag —
    both unnecessary in single-package mode (there's only one
    component to coordinate).

- .release-please-manifest.json: collapse the two per-package entries
  into a single "." entry at "0.5.0" — matching ogpeek + @ogpeek/react
  on npm and the existing v0.5.0 tag.

- .github/workflows/release-please.yml:
  - Replace the four per-package outputs with a single release_created
    + tag_name pair, both keyed against the "." path.
  - Gate publish-ogpeek and publish-ogpeek-react on the same single
    output so they always fire together with the new umbrella release.
  - Add publish-ogpeek-extension that runs alongside the other two:
    builds the workspace libs explicitly (no reliance on the
    website-anchored libs:build script), runs build:chrome + the zip
    script directly to avoid double-building libs through package:chrome,
    and uploads dist/ogpeek-chrome.zip to the GitHub Release with
    --clobber for re-run idempotency. This job uses GITHUB_TOKEN only
    (contents: write) — no npm credentials, no OIDC.

Trade-offs
----------

- All three packages always share a version going forward. A fix in
  one package bumps all three (phantom bump for the others on npm /
  on a new GitHub Release). Acceptable because the three move
  together anyway.
- Per-package CHANGELOG.md files (packages/ogpeek/CHANGELOG.md,
  packages/ogpeek-react/CHANGELOG.md) keep their historical entries
  but won't get new ones — the next release writes only to the root
  CHANGELOG.md. That's intentional: the umbrella release notes are
  the new source of truth, scoped per-package via Conventional Commit
  scopes (feat(ogpeek-extension), fix(ogpeek-react), etc.) inside
  each entry.
- Existing per-component tags (ogpeek-react-v0.5.0) become orphaned
  but harmless — git keeps them; GitHub keeps the matching Release.

Verification after merge
------------------------

This commit is a chore (no Conventional Commit type that triggers a
bump), so the release-please run on push will not propose a release.
The next feat/fix that lands on main will produce the first
single-package-mode release PR — expected:

  - One "chore: release main" PR with version bumped to 0.5.1 / 0.6.0 /
    1.0.0 (per the bump rules) on the root CHANGELOG.
  - All three package.jsons updated to the new version via extra-files.
  - Merging cuts a single "vX.Y.Z" tag + a single GitHub Release.
  - Three publish jobs fire from the one release_created event:
    publish-ogpeek (npm), publish-ogpeek-react (npm),
    publish-ogpeek-extension (GitHub Release zip upload).

Supersedes #32, which approached the extension-tracking problem within
the existing per-package monorepo structure.

https://claude.ai/code/session_0162rG86ukDFiBZfqgEADYfp
@minjun0219 minjun0219 force-pushed the claude/release-please-single-package-mode branch from 15af5fd to 65e98bf Compare May 6, 2026 09:34
@minjun0219 minjun0219 merged commit 37d4754 into main May 6, 2026
4 checks passed
@minjun0219 minjun0219 deleted the claude/release-please-single-package-mode branch May 6, 2026 09:44
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