Contributor-facing branch, pull request, and merge guidance now lives in .github/CONTRIBUTING.md.
Repository-wide coding and runtime conventions now live in docs/conventions.md.
This document keeps the repo's git workflow reference, branch/tag patterns, hooks notes, and merge-strategy discussion.
Release automation is handled by the release-please job in .github/workflows/ci.yml.
- The existing handwritten changelog stays grouped under version
0.1.0in CHANGELOG.md. - The workflow runs
release-please-actionin manifest mode using release-please-config.json and .release-please-manifest.json. - Releases are tracked per workspace for
apps/*. - The workflow requires a GitHub App installation token.
- Troubleshooting lives in release-troubleshooting.md.
- A commit lands on
mainorrel/*. - The
release-pleasejob scans merged Conventional Commits for each configured workspace. - If releasable commits exist for one or more workspaces, it opens or updates workspace-scoped release PRs.
- When release PRs are merged,
release-pleaseupdates changelogs, creates workspace-scoped tags, and publishes GitHub releases.
feat,fix, anddepstrigger a release PR.chorecan appear in the changelog if a release is already happening, butchoreby itself does not trigger a release PR.- To force a release version manually, add a
Release-As: x.y.zfooter to the commit body.
Use a GitHub App instead of a PAT if you want release PRs and release-created events to trigger downstream workflows.
- Create the GitHub App under GitHub Settings → Developer settings → GitHub Apps → New GitHub App.
- Disable webhooks and grant these repository permissions:
Contents: Read and writePull requests: Read and writeIssues: Read and writeMetadata: Read-only
- Install the app on this repository.
- Add the app ID to variable
RELEASE_PLEASE_APP_IDand the PEM private key to secretRELEASE_PLEASE_APP_PRIVATE_KEY. - If your repository or organization restricts workflow-created PRs, enable the setting that allows GitHub Actions to create and approve pull requests.
Once configured, the workflow step uses actions/create-github-app-token to mint a short-lived installation token and passes it to release-please.
If the variable or secret is missing, the workflow fails early instead of falling back to GITHUB_TOKEN.
- <feat/fix/chore>/scope/<...>
- rel/, rel/
- can add -rc.1, -beta.1 suffixes as needed
- hotfix//<...>
- tag/
- main
| Branch | Branch from | Merge to | Notes |
|---|---|---|---|
rel/1.0 |
main |
main when production ready |
Active dev branch |
feat/fix/chore |
rel/1.0 |
rel/1.0 via PR |
Day-to-day work |
hotfix/scope/name |
main |
main + rel/1.0 + rel/2.0 |
Emergency only |
tag: v1.0.0 |
rel/1.0 after merge to main |
— | Full release tag |
tag: v1.0.1 |
rel/1.0 after hotfix merges in |
— | Patch tag, then rel/1.0 → main |
rel/1.1 |
main after v1.0.0 tag |
main when ready |
Cut from stable tag |
The consistent rule is: tags always come from rel/*, never directly from main. Main is the destination, not the source of truth for what shipped.
hotfix/payment-crash (check out from rel/v1.0)
→ merge to main (keeps main stable)
→ merge to rel/1.0
→ tag v1.0.1 here (patch tag on rel/1.0)
→ DO NOT DO THIS! DANGEROUS! merge rel/1.0 to main (main now has the patch)
→ cherry-pick to rel/2.0 (backport)
# remove hooks path
git config --local --unset-all core.hooksPath
# set hooks path explicitly
git config --local core.hooksPath .githooks
# or let npm prepare configure it during npm installThis repository uses native hooks from .githooks/.
- Pre-commit runs Biome checks on affected directories and schema validation tests where applicable.
- Pre-push runs workspace tests and schema validation checks.
npm installalso runsnpm prepare, which configures the hooks path automatically.
To skip hooks temporarily:
git commit --no-verify
git push --no-verifyFor the exact hook behavior, see .github/CONTRIBUTING.md.
Use the repo workflow rather than a per-team merge style.
- Day-to-day feature and fix PRs should use squash merge.
- Open those PRs from
feat/*,fix/*, orchore/*into the activerel/*branch. - Reserve
hotfix/*branches for urgent fixes that start frommain, merge tomain, and are then backported to activerel/*branches. - Use cherry-pick for hotfix backports when the same fix must land in multiple release branches.
This keeps release history predictable for release-please and matches the contributor workflow in .github/CONTRIBUTING.md.
Edit branch protection rules in Settings → Branches → Add branch protection rule to prevent merges when CI checks fail.
Create two rules:
- Pattern:
main - Pattern:
rel/*
For each pattern, enable:
| Setting | Action |
|---|---|
| Require a pull request before merging | Enable. Require 1 approval. Dismiss stale approvals on new commits. |
| Require status checks to pass | Enable. Require branches to be up to date. |
Add required checks: Commit Message Format, Biome Checks, Schema Validation Tests, Unit Tests, Integration Tests, E2E Tests |
|
| Require conversation resolution before merging | Enable. |
| Include administrators | Enable. Prevents bypass by repo admins. |
Please read the following scripts for more information
- CI workflow for non-CI file changes ci.yml
- CI workflow for CI file changes ci-meta.yml
Note: tests (unit, integration, e2e) are run for touched workspaces only, identified by the
detect-touched-workspaces, Skip test if npm script for test not found.
Once configured:
- PRs show red X if any required check fails.
- Merges are blocked until all checks pass and approvals are met.
- The branch protection rules apply uniformly across day-to-day work (
rel/*branches), production merges (main), and emergency hotfixes.