Handbook
Versioning and release notes (consuming repositories)
A single policy for how product-facing version numbers and human-readable release history relate, plus optional local automation shipped from Blueprints. Use it for any repo that ships software (SPA, Python package…
What it is
A single policy for how product-facing version numbers and human-readable release history relate, plus optional local automation shipped from Blueprints. Use it for any repo that ships software (SPA, Python package, mobile app, desktop shell) and keeps a Keep a Changelog–style CHANGELOG.md.
Canonical automation (optional): blueprints/sdlc/methodologies/forge/setup/install-version-release-hook.sh installs a post-commit hook that calls hooks/version-release-post-commit.py. The hook is opt-in per repository via a committed manifest .forge/version-release.json at the repository root.
Principles
- Semantic versioning for anything users or integrators pin — follow Semantic Versioning 2.0.0 unless a platform forbids it (then document the exception in the repo’s own
VERSIONING.mdorREADME). - One changelog per release line that matters to humans — usually
CHANGELOG.mdat repo root or next to the versioned artifact (for examplelenses-enterprise/CHANGELOG.mdfor Forge Studio). - Build metadata is not semver — git SHA, build timestamps, and CI build numbers support supportability; they do not replace semver bumps.
- MAJOR / MINOR are human; PATCH can be automatic — teams choose breaking and feature increments (
MAJOR/MINOR) by editing the configured version file (for examplepackage.json). The hook may auto-incrementPATCHonly after commits that touch configured watch paths, so every shipped code change advances the patch line without a manual edit. Pre-release tags on the version string (for example1.0.0-beta.1) disable PATCH auto-bump until you return to plainX.Y.Z. [Unreleased]→ dated section on human line moves — the hook finalizes Keep a Changelog[Unreleased]into[x.y.z] — dateonly whenMAJORorMINORincreases vsHEAD~1(not on PATCH-only increases), so patch automation does not create a new dated section on every commit.- Blueprints stays methodology-only — this file defines policy and tooling entry points; product-specific semver tables (for example Studio vs Python server in forge-lenses) live in the product repo beside the artifact, and may link here for the shared rules.
Where version lives (by repo shape)
| Product shape | Typical version source | Changelog |
|---|---|---|
| Node / Vite / React | package.json version |
Adjacent CHANGELOG.md or repo root |
| Python package | pyproject.toml [project].version or __version__ in the package __init__.py |
Repo root or docs/ per team |
| Android | versionName / versionCode in Gradle |
Play listing + CHANGELOG.md |
| Static site generator | Optional package.json or generator constant |
Site “what’s new” or root CHANGELOG.md if you ship a versioned kit |
Multi-surface repositories (example: Python server + React Studio in one git repo): use separate semver lines and separate changelog sections or files when the surfaces ship or break compatibility independently; document the split in a short repo-local VERSIONING.md.
Release workflow (human + optional hook)
- Edit prose under
## [Unreleased]as needed; the hook appends a bullet from the commit subject when watched paths change. - PATCH: on those commits, if the version file’s
versionline was not part of the developer’s diff vsHEAD~1, the hook incrementsPATCHand amends (seehooks/version-release-post-commit.py). - MAJOR / MINOR: edit
versionin the configured file (and adjustCHANGELOGintent); on commit, the hook finalizes[Unreleased]into[x.y.z] — datewhen it sees MAJOR or MINOR rise vsHEAD~1. - Tag or publish per your DevOps practice.
Set "auto_patch": false in .forge/version-release.json to keep PATCH fully manual.
Skip automation for a commit: put [skip-changelog] in the commit subject or body. [skip-version] is accepted as an alias.
Safety: the hook skips merge commits (two parents) and skips when CI is set to a non-empty value.
Reinforcement after Blueprints init or submodule update
git submodule update --init --recursive(or your routine bump) soblueprints/sdlc/...exists../blueprints/sdlc/methodologies/forge/setup/forge-init.sh(once per repo) already prints optional next steps; it mentions the version/release hook installer.- Optionally:
bash blueprints/sdlc/methodologies/forge/setup/install-version-release-hook.sh - Add
.forge/version-release.json— start fromtemplates/version-release.manifest.example.json.
Related
- Example manifest:
templates/version-release.manifest.example.json - Installer:
install-version-release-hook.sh - Hook implementation:
hooks/version-release-post-commit.py