* chore(npm): rebrand packages to @opengsd scope Rename: - get-shit-done-redux → @opengsd/get-shit-done-redux - @gsd-redux/sdk → @opengsd/gsd-sdk Add publishConfig.access=public for first-time scoped publish. CLI binary names (get-shit-done-redux, gsd-sdk, gsd-tools) unchanged. Sweeps install commands, npx invocations, CI publish/version-check workflows, tests, docs, READMEs (all translations), and the PACKAGE_NAME constant in check-latest-version. Bumps qs 6.15.1 → 6.15.2 to clear a moderate advisory surfaced by the audit-clean test (GHSA-q8mj-m7cp-5q26). Closes #126 * chore: pin 2.0.0 release + remove canary workflow - Bump both packages 1.50.0-canary.0 → 2.0.0 for first @opengsd publish - Remove .github/workflows/canary.yml and canary dist-tag handling in release.yml / release-sdk.yml - Drop canary section from VERSIONING.md Refs #126 * chore: address review findings + harden tarball-smoke timeout - .changeset/opengsd-org-rename.md: match project's custom parse.cjs frontmatter (type: Changed / pr: 127); the scoped @changesets/cli keys were silently rejected. - CONTEXT.md: drop two canary-stream policy lines and a dangling DEFECT.CANARY-VERSION-LEAK.cross-ref now that canary.yml is gone. - tests/release-tarball-smoke.install.test.cjs: pass timeout: 600_000 for npm pack + global install; the 3-minute runNpm default was timing out on slower Docker hosts (cartographer). Refs #126 * fix(sdk): add missing type/runtime devDependencies for build prepublishOnly invokes tsc which couldn't resolve @types/node, @types/ws, or synckit. They had been hoisted from root but were not declared in sdk/'s own package.json — first publish from a clean SDK tree failed. Refs #126 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ci): use npm pack stdout instead of glob to find tarball `npm pack --silent` for a scoped package (@opengsd/get-shit-done-redux) produces `opengsd-get-shit-done-redux-*.tgz`, not `get-shit-done-redux-*.tgz`. Capture the filename from stdout instead of a hardcoded glob so the step works regardless of package name format. Fixes smoke (ubuntu-latest, 22, false) CI failure. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * ci: treat workflow-file changes as test-skip eligible `.github/workflows/install-smoke.yml` (and other workflow files) were in neither `test.yml` paths nor `test-skip.yml` paths-ignore, so neither workflow ran on a workflow-only commit — leaving the required test-skip check perpetually missing. Refs #126 * chore: reset version to 1.0.0 for first @opengsd publish Nothing has been published yet under the @opengsd scope, so the inaugural release uses 1.0.0 rather than 2.0.0. The "major bump" in the changeset reflects the breaking install-command change for users migrating from the prior unscoped `get-shit-done-redux`, not a numeric continuation from a 1.x line under the new identity. Refs #126 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
7.1 KiB
Versioning & Release Strategy
GSD follows Semantic Versioning 2.0.0 with three release tiers mapped to npm dist-tags.
Release Tiers
| Tier | What ships | Version format | npm tag | Branch | Install |
|---|---|---|---|---|---|
| Patch | Bug fixes only | 1.27.1 |
latest |
hotfix/1.27.1 |
npx @opengsd/get-shit-done-redux@latest |
| Minor | Fixes + enhancements | 1.28.0 |
latest (after RC) |
release/1.28.0 |
npx @opengsd/get-shit-done-redux@next (RC) |
| Major | Fixes + enhancements + features | 2.0.0 |
latest (after beta) |
release/2.0.0 |
npx @opengsd/get-shit-done-redux@next (beta) |
npm Dist-Tags
Only two tags, following Angular/Next.js convention:
| Tag | Meaning | Installed by |
|---|---|---|
latest |
Stable production release | npm install @opengsd/get-shit-done-redux (default) |
next |
Pre-release (RC or beta) | npm install @opengsd/get-shit-done-redux@next (opt-in) |
The version string (-rc.1 vs -beta.1) communicates stability level. Users never get pre-releases unless they explicitly opt in.
Semver Rules
| Increment | When | Examples |
|---|---|---|
| PATCH (1.27.x) | Bug fixes, typo corrections, test additions | Hook filter fix, config corruption fix |
| MINOR (1.x.0) | Non-breaking enhancements, new commands, new runtime support | New workflow command, discuss-mode feature |
| MAJOR (x.0.0) | Breaking changes to config format, CLI flags, or runtime API; new features that alter existing behavior | Removing a command, changing config schema |
Pre-Release Version Progression
Major and minor releases use different pre-release types:
Minor: 1.28.0-rc.1 → 1.28.0-rc.2 → 1.28.0
Major: 2.0.0-beta.1 → 2.0.0-beta.2 → 2.0.0
- beta (major releases only): Feature-complete but not fully tested. API mostly stable. Used for major releases to signal a longer testing cycle.
- rc (minor releases only): Production-ready candidate. Only critical fixes expected.
- Each version uses one pre-release type throughout its cycle. The
rcaction in the release workflow automatically selects the correct type based on the version.
Branch Structure
main ← stable, always deployable
│
├── hotfix/1.27.1 ← patch: cherry-pick fix from main, publish to latest
│
├── release/1.28.0 ← minor: accumulate fixes + enhancements, RC cycle
│ ├── v1.28.0-rc.1 ← tag: published to next
│ └── v1.28.0 ← tag: promoted to latest
│
├── release/2.0.0 ← major: features + breaking changes, beta cycle
│ ├── v2.0.0-beta.1 ← tag: published to next
│ ├── v2.0.0-beta.2 ← tag: published to next
│ └── v2.0.0 ← tag: promoted to latest
│
├── fix/1200-bug-description ← bug fix branch (merges to main)
├── feat/925-feature-name ← feature branch (merges to main)
└── chore/1206-maintenance ← maintenance branch (merges to main)
Release Workflows
Patch Release (Hotfix)
For fixes that need to ship without waiting for the next minor.
A hotfix vX.YY.Z cumulatively includes everything in vX.YY.{Z-1} plus every fix:/chore: commit landed on main since that base. The base tag is the anchor — git cherry $BASE_TAG main reveals exactly which commits are still unshipped, and the new vX.YY.Z tag becomes the next hotfix's base, so the cycle is self-documenting.
Two paths
Path A — hotfix.yml (canonical, two-step):
- Trigger
hotfix.ymlwithaction=create,version=1.27.1,auto_cherry_pick=true(default).- Workflow detects
BASE_TAG= highestv1.27.*<v1.27.1(so1.27.1branches fromv1.27.0;1.27.2would branch fromv1.27.1). - Branches
hotfix/1.27.1fromBASE_TAG. - Auto-cherry-picks every
fix:/chore:commit onorigin/mainnot already in the base, oldest-first. Patch-equivalents are skipped viagit cherry.feat:/refactor:are never auto-included. - On conflict the workflow halts with the offending SHA. Resolve manually on the branch, then re-run finalize with
auto_cherry_pick=false. - Bumps
package.json(andsdk/package.json), pushes the branch, and lists every included SHA in the run summary.
- Workflow detects
- (Optional) push additional manual commits to
hotfix/1.27.1. - Trigger
hotfix.ymlwithaction=finalize. The workflow:- Runs
install-smokecross-platform gate. - Runs full test suite + coverage.
- Builds SDK, bundles
sdk-bundle/gsd-sdk.tgzinside the CC tarball (parity withrelease-sdk.yml). - Tags
v1.27.1, publishes to@latest, re-points@next → v1.27.1. - Opens merge-back PR against
main.
- Runs
Path B — release-sdk.yml (stopgap, one-shot):
Active while the @opengsd/gsd-sdk npm token is unavailable; bundles the SDK inside the CC tarball.
- Trigger
release-sdk.ymlwithaction=hotfix,version=1.27.1,auto_cherry_pick=true.- The
preparejob creates the branch and cherry-picks (same logic as Path A). install-smokeruns against the new branch.- The
releasejob tags, publishes to@latest, re-points@next, opens merge-back PR. - Idempotent: if
hotfix/1.27.1already exists (e.g. you ranhotfix.yml createfirst), the prepare job checks it out and re-runs cherry-pick as a no-op.
- The
dry_run=trueexercises the full pipeline without pushing the branch or publishing.
Minor Release (Standard Cycle)
For accumulated fixes and enhancements.
- Trigger
release.ymlwith actioncreateand version (e.g.,1.28.0) - Workflow creates
release/1.28.0branch from main, bumps package.json - Trigger
release.ymlwith actionrcto publish1.28.0-rc.1tonext - Test the RC:
npx @opengsd/get-shit-done-redux@next - If issues found: fix on release branch, publish
rc.2,rc.3, etc. - Trigger
release.ymlwith actionfinalize— publishes1.28.0tolatest - Merge release branch to main
Major Release
Same as minor but uses -beta.N instead of -rc.N, signaling a longer testing cycle.
- Trigger
release.ymlwith actioncreateand version (e.g.,2.0.0) - Trigger
release.ymlwith actionrcto publish2.0.0-beta.1tonext - If issues found: fix on release branch, publish
beta.2,beta.3, etc. - Trigger
release.ymlwith actionfinalize-- publishes2.0.0tolatest - Merge release branch to main
Conventional Commits
Branch names map to commit types:
| Branch prefix | Commit type | Version bump |
|---|---|---|
fix/ |
fix: |
PATCH |
feat/ |
feat: |
MINOR |
hotfix/ |
fix: |
PATCH (immediate) |
chore/ |
chore: |
none |
docs/ |
docs: |
none |
refactor/ |
refactor: |
none |
Publishing Commands (Reference)
# Stable release (sets latest tag automatically)
npm publish
# Pre-release (must use --tag to avoid overwriting latest)
npm publish --tag next
# Verify what latest and next point to
npm dist-tag ls @opengsd/get-shit-done-redux