Skip to content
Back to skills

Versioning Policy

ASecurity

SemVer rules for Squad's stable, preview, insider, and local package versions

  • 802 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 6, 2026
ai-agentsbashgit

Works with

  • cli

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned October 6, 2026

npx -y skills add sbroenne/mcp-server-excel --skill versioning-policy --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Versioning Policy?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Versioning Policy
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/sbroenne-versioning-policy/badge)](https://www.skillsdirectory.com/skills/sbroenne-versioning-policy)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: "versioning-policy"
description: "SemVer rules for Squad's stable, preview, insider, and local package versions"
domain: "release, versioning, npm, CI"
confidence: "high"
source: "earned (PR #640 workspace resolution incident and automated release channels)"
---

## Context

Squad publishes `@bradygaster/squad-sdk` and
`@bradygaster/squad-cli` from one npm workspace. Their versions and the root
version move together. A mismatched prerelease dependency can make npm silently
resolve an older registry SDK instead of the local workspace.

## 1. Supported versions

| Use | Version | Committed branch |
|---|---|---|
| Stable release | `MAJOR.MINOR.PATCH` | `main`, and briefly `dev` during promotion |
| Preview release | `MAJOR.MINOR.PATCH-preview.N` | `dev` |
| Insider snapshot | `MAJOR.MINOR.PATCH-insider.N` | Generated by the insider workflow |
| Local build | `MAJOR.MINOR.PATCH-build.N` | Never committed |

`preview` is a release channel, not a branch. Stable promotion merges a
sanitized release tree directly from `dev` to `main`.

## 2. Package versions stay in lockstep

These versions must always be identical:

- `package.json`
- `packages/squad-sdk/package.json`
- `packages/squad-cli/package.json`
- the corresponding workspace entries in `package-lock.json`

Use the workspace-aware version command:

```bash
npm version "$VERSION" --workspaces --include-workspace-root --no-git-tag-version
```

Never edit only one package version.

## 3. Prerelease workspace dependency rule

The CLI depends on the SDK through a SemVer range. SemVer deliberately excludes
prereleases unless the comparator names a prerelease with the same base version.
For example, `>=0.13.0` does not match `0.14.0-preview.1`.

For every committed preview version, set both the CLI manifest and lockfile
dependency floor to that exact preview:

```bash
npm pkg set "dependencies.@bradygaster/squad-sdk=>=$VERSION" \
  --workspace @bradygaster/squad-cli
npm install --package-lock-only
```

For `VERSION=0.14.0-preview.1`, the required range is
`>=0.14.0-preview.1`. Before stable promotion, change the version and floor to
`0.14.0` / `>=0.14.0`; never leave a prerelease floor in a stable release.

This rule prevents the PR #640 failure mode, where the build succeeded against
a stale published SDK rather than the workspace SDK.

## 4. Local build versions are ephemeral

`scripts/bump-build.mjs` may create `-build.N` versions for local development.

- Never commit a `-build.N` version.
- The script skips itself when `CI=true` or `SKIP_BUILD_BUMP=1`.
- If a build changes manifests locally, restore the intended release source
  versions before committing.

## 5. Release lifecycle

1. On a release-preparation branch from `dev`, set the next
   `X.Y.Z-preview.N` version and matching SDK dependency floor.
2. Merge to `dev`, wait for CI, and dispatch `squad-release.yml` from `dev`.
3. Repeat with a new immutable preview version when another candidate is needed.
4. Dispatch `squad-insider-publish.yml` whenever an on-demand development
   snapshot is needed; it computes the next immutable `X.Y.Z-insider.N`.
5. Prepare stable `X.Y.Z` and its stable SDK dependency floor on `dev`.
6. Dispatch `squad-promote.yml`; it sanitizes `dev`, pushes `main`, and
   explicitly dispatches the stable release.
7. Open the next preview-version PR for continued development.

A preview such as `0.14.0-preview.1` is never renamed or converted in place.
Stable `0.14.0` is a separate immutable package version and GitHub tag.

## 6. Ownership

The current Release Manager owns release version changes. Other agents may update
versions only when explicitly assigned release work or when reverting an
accidentally committed local `-build.N` version.

## 7. CI enforcement

CI verifies:

- root, SDK, and CLI versions match;
- package-lock workspace versions match;
- committed prereleases use approved `preview` or `insider` identifiers;
- a preview CLI dependency and lockfile entry equal `>=VERSION`;
- stable source does not retain a prerelease dependency floor; and
- workspace packages resolve through local links rather than stale registry
  packages.

Release workflows repeat the dependency checks before creating a tag or
publishing.

## Quick reference

| Rule | Summary |
|---|---|
| Insider | The workflow generates `X.Y.Z-insider.N` from the stable base version |
| Preview | Commit `X.Y.Z-preview.N` to `dev` for an on-demand prerelease |
| Stable | Only `X.Y.Z` may release from `main` |
| Sync | Root, SDK, CLI, and lockfile workspace versions must match |
| Dependency | Preview CLI range and lockfile entry must be `>=VERSION` |
| Local build | `-build.N` is local-only and never committed |
| Ownership | The current Release Manager owns planned release version changes |

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…