release

release is a cursor rule for Cursor from louisbrulenaudet/monorepo-template. It costs 0 tokens per session (1,528 once invoked), scanned A, original, Apache-2.0.

A guide to the repository's Changesets release process, which creates version changes and Git tags before deploying private Cloudflare Workers. It explicitly says the workspaces are not published to npm, the package registry.

In plain words
What is it for?
Use it when changing release workflows, version pull requests, Git tags, or the deployment step that promotes Workers.
Why use it?
It prevents releases from skipping the CI gate, using the wrong mode, or assuming that a Git tag also publishes packages.

Cursor rule for Cursor

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add rules/louisbrulenaudet/monorepo-template/release
Clone the repo
git clone --depth 1 https://github.com/louisbrulenaudet/monorepo-template

Made for: Cursor.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for release

README.md
[![agentmods](https://agentmods.dev/badge/rules/louisbrulenaudet/monorepo-template/release.svg)](https://agentmods.dev/rules/louisbrulenaudet/monorepo-template/release)
Your own site
<a href="https://agentmods.dev/rules/louisbrulenaudet/monorepo-template/release"><img src="https://agentmods.dev/badge/rules/louisbrulenaudet/monorepo-template/release.svg" alt="Measured on agentmods" height="20"></a>
Per session 0 Nothing until a file matches its globs; then the whole rule loads.
When invoked 1,528 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00000 $0.01528
Opus 5 $0.00000 $0.00764
Sonnet 5 $0.00000 $0.00306
Haiku 4.5 $0.00000 $0.00153

Measured 2d ago against content hash 02d8cc5e7d6a, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-05, from the pricing page.

Security

Grade A, and why

release scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.cursor/rules/ops/release.mdc · 51 lines

How it starts

The opening of the file, as written. The whole thing — 51 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Releases

Changesets computes versions; the pipeline is .github/workflows/release.yml. Read it for the job list; long step bodies live as bash-invoked scripts under .github/actions/ (convention: ops/ci.md). Human-facing "how do I" lives in .changeset/README.md; CI internals in ops/ci.md; the deploy in ops/cd.md.

Nothing is published to npm. Every workspace is private: true, no publishConfig, no .npmrc. A release is a git tag plus a Cloudflare Workers promote.

State machine

push to main ──► Release  (concurrency release-main, queue: max, never cancelled)
  ├─ gate         ALWAYS. uses ci.yml (full graph, not --affected)
  ├─ select-mode  'version' | 'none'   ('publish' is unreachable here)
  ├─ mode == 'version' → version → open/update the "chore: release" PR   [END]
  └─ mode != 'version' → tag (needs gate) → created? → deploy → uses cd.yml

Invariants

  • gate runs on every push to main, in both modes. While a release PR is open the mode is always version, so a gate placed only on the release path would leave main unvalidated for that PR's whole life. Do not move it under the mode != 'version' branch.
  • The tag is the idempotency key. create-release-tag skips when vX.Y.Z exists and reports created=false; deploy is gated on created == 'true', so re-running Release never re-deploys. The existence probe is three-way: 2xx skips, 404 creates, and any other probe failure fails the job rather than guessing. To redeploy on purpose use cd.yml's workflow_dispatch with the tag.
  • mode != 'version', not mode == 'publish'. select-mode returns publish only when publishable packages exist, and all of ours are private, so publish is unreachable and the equality test would never fire. This condition is load-bearing.
  • privatePackages.tag: false is deliberate. changeset git-tag (the v3 name of changeset tag) would emit one <app>@X.Y.Z per app; the deploy keys on one shared vX.Y.Z, which is why the tag is cut by create-release-tag instead.
  • fixed: [["*"]] is the app set, and it rests on apps being unscoped. Changesets expands every fixed entry with picomatch against package names, and * does not cross / - so the group is exactly the unscoped workspaces (the apps) and never an @repo/* package. A new app joins the shared version by existing. Nothing machine-checks the convention underneath - .syncpackrc.json's @repo/** group governs dependency specifiers, not workspace names, and pnpm boundaries never looks at a name - so it is kept by hand: never give an app a scoped name, and never add an unscoped package under packages/. An unscoped package there would silently join the release group and start bumping to the app version.
  • baseBranch: "main" and privatePackages.version: true are load-bearing. The documented defaults are "master" and {version: false, tag: false} — the latter would version nothing at all here.
  • The version PR branch is force-pushed, not accumulated. Every push to main resets changeset-release/main from the tip, re-runs changeset version, and force-pushes one commit. It can never be behind main or conflict with it, and manual edits to it are destroyed. Verified on PR #19: base tracked the newest main SHA with a single commit.
  • Tags created with GITHUB_TOKEN do not trigger workflows. This is why cd.yml has no push: tags: trigger and release.yml calls it directly. Do not "restore" a tag trigger; it is dead code (GitHub GITHUB_TOKEN docs; changesets/action#669).
  • queue: max, not the default. With queue: single, a third push replaces the pending run and that release is silently dropped.
  • CI is skipped on changeset-release/** head branches via a job-level if — a pull_request branches-ignore filters the base branch and cannot express this. The release commit is validated by gate on the merge commit instead, so no branch-protection exemption is needed.

Read the full file on GitHub · 51 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 2d ago First seen · 51 lines · 0 tokens per session scan A 02d8cc5e7d6a

Subscribe to this mod's changes

release is a cursor rule published in the GitHub repository louisbrulenaudet/monorepo-template (19 stars, last pushed 4d ago), licensed Apache-2.0. It costs nothing until one of its globs matches a file; then it loads 1,528 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-03.

Related

Other cursor rules, from other repositories

mcp-releasing

Steps and procedures for releasing MCP (Model Context Protocol) servers as NPM packages.

steipete/agent-rules · 0 tokens

changelog-generator-manual

This rule generates a comprehensive changelog.md file by analyzing all git tags and commits, creating a chronological record of all project changes with proper semantic versioning structure. The changelog.md file is stored at the root of the project.

usrrname/cursorrules · 0 tokens

release-commit-analysis-auto

This rule analyzes commits to determine if they should trigger a version bump. It categorizes conventional and non-conventional commits into Features, Bug Fixes, Breaking Changes, Documentation, and Other. It uses intelligent keyword matching for non-conventional commits and analyzes file changes to help categorize…

usrrname/cursorrules · 0 tokens

release-git-tags-auto

This rule checks for existing tags before creating new ones. It also offers to push the tag to the remote repository. It runs when users request release creation, version bumping, or package publishing.

usrrname/cursorrules · 0 tokens

release-validation-auto

This rule validates release prerequisites including branch naming conventions and package.json structure. It runs when users request release creation, version bumping, or package publishing. The rule ensures releases only occur from appropriate branches (release/, hotfix/, fix/) and validates package.json exists with…

usrrname/cursorrules · 0 tokens

release-version-bump-auto

Apply when the user is creating or preparing a release, version bump, tag, publish, or deploy. Validates semantic version bumps against change analysis (breaking/feat/fix), blocks inappropriate bumps, and guides major/minor/patch or custom version choice. Use for release workflows, package versioning, and…

usrrname/cursorrules · 67 tokens