# changesets/changesets — codebase unpack

> Canonical page: https://codevetter.com/unpack/changesets

This is a deterministic Repo Unpack scan of changesets/changesets — a structural map, not a review, security audit, or maintainer-endorsed description.

- Scanned commit: c73949ba7b3160a4aa5729223335c190de1528f8 (2026-09-22)
- Last upstream commit: Build(deps-dev): Bump unplugin-icons from 23.0.1 to 24.0.0 (#2314)
- Generated by codevetter 1.15.0 on 2026-10-02
- 325 files scanned · 1.9 MB

Source inspection; upstream code and tests were not executed.

## Languages

- TypeScript: 162 files
- Markdown: 87 files
- JSON: 31 files
- YAML: 12 files
- JavaScript: 2 files
- Vue: 2 files
- CSS: 1 files
- TOML: 1 files

## Repository structure

- packages/ — 212 files
- site/ — 49 files
- docs/ — 18 files
- scripts/ — 11 files
- assets/ — 10 files
- .github/ — 7 files
- .changeset/ — 2 files
- wiki/ — 1 files

Probable source entrypoint: `packages/` (inferred from the tree, not upstream docs)

## Source layout — packages/

- packages/apply-release-plan/ — 13 files
- packages/assemble-release-plan/ — 16 files
- packages/changelog-git/ — 4 files
- packages/changelog-github/ — 8 files
- packages/cli/ — 63 files
- packages/color/ — 2 files
- packages/config/ — 14 files
- packages/errors/ — 6 files
- packages/get-dependents-graph/ — 7 files
- packages/get-github-info/ — 12 files
- packages/get-release-plan/ — 5 files
- packages/get-version-range-type/ — 6 files
- packages/git/ — 6 files
- packages/logger/ — 6 files

## Package

- package.json: @changesets/repository v1.0.0 — 24 declared dependencies

## Structural health signals

Average score 9.1/10 across 96 files; 0 hotspots. These are deterministic review leads, not proof of a bug.

## Recent history

- c73949ba7b31 (2026-09-22) Build(deps-dev): Bump unplugin-icons from 23.0.1 to 24.0.0 (#2314)
- 70908e66a7cb (2026-09-21) Build(deps-dev): Bump the development-dependencies group with 7 updates (#2312)
- a4aae931d286 (2026-09-21) Build(deps): Bump the github-actions group with 5 updates (#2310)
- c9269c01af5f (2026-09-14) Version Packages (#2291)
- ca9d1103c209 (2026-09-14) Fix pnpm 10 publishing with npm 12 (#2276)

## Overview

Changesets helps package maintainers record release intent as Markdown, calculate coordinated version changes across workspaces, generate changelogs, and publish through npm, pnpm, or Yarn. This pinned checkout is the v3 development branch, with a modular TypeScript release engine, an interactive CLI, and a Vue/VitePress documentation site. Its distinctive boundary separates contributor-authored changesets, calculated release plans, and registry-aware publish plans, including a pack-then-publish artifact workflow.

## System map

The runtime consists of a Node CLI and separately published release-processing packages. Workspace discovery and configuration feed an in-memory planner, while application and publishing own filesystem and external side effects. The documentation site has a separate VitePress build and Netlify target. Repository scripts and GitHub workflows define distinct verification, preview, and release paths.
- The changeset executable enables Node's compile cache when available, imports @changesets/cli, then parses argv and awaits cli.runMatchedCommand(); ExitError controls the process exit code. — [packages/cli/bin.js#L1-9](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/bin.js#L1-L9) [packages/cli/src/index.ts#L11-28](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/index.ts#L11-L28) [packages/cli/src/index.ts#L54-61](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/index.ts#L54-L61)
- cac registrations in cli.ts dynamically load implementations for init, add, version, publish, publish-plan, pack, status, git-tag, and pre; add is the default command. — [packages/cli/src/cli.ts#L73-101](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L73-L101) [packages/cli/src/cli.ts#L103-172](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L103-L172) [packages/cli/src/cli.ts#L174-210](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L174-L210)
- getReleasePlan composes workspace discovery, config validation, changeset reading, prerelease-state reading, and assembleReleasePlan without applying the resulting plan. — [packages/get-release-plan/src/index.ts#L8-29](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/get-release-plan/src/index.ts#L8-L29)
- assembleReleasePlan owns calculated release state; applyReleasePlan owns manifest/changelog writes and changeset cleanup, returning touched paths for the CLI's optional commit step. — [packages/assemble-release-plan/src/index.ts#L123-150](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.ts#L123-L150) [packages/apply-release-plan/src/index.ts#L140-178](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L140-L178) [packages/apply-release-plan/src/index.ts#L190-235](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L190-L235) [packages/cli/src/commands/version/index.ts#L127-143](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/version/index.ts#L127-L143)
- Publishing crosses into package-manager subprocesses through PublishTool.info, pack, and publish; getPublishTool selects npm, version-aware pnpm, or Yarn Berry and rejects Yarn Classic. — [packages/cli/src/lib/types.ts#L4-10](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/lib/types.ts#L4-L10) [packages/cli/src/commands/publish/getPublishTool.ts#L30-55](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/getPublishTool.ts#L30-L55)
- pnpm workspaces include packages, scripts, and site; tsdown builds package entrypoints as ESM with declarations and publint, and apply-release-plan publishes only its dist directory. — [pnpm-workspace.yaml#L1-4](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/pnpm-workspace.yaml#L1-L4) [tsdown.config.ts#L5-28](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/tsdown.config.ts#L5-L28) [packages/apply-release-plan/package.json#L11-18](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/package.json#L11-L18)
- Root scripts expose bootstrap, build, Vitest, separate E2E testing, TypeScript checking, ESLint, oxfmt, and check-all; the package manager is pinned to pnpm 11.13.1. — [package.json#L19-37](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/package.json#L19-L37) [package.json#L73-83](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/package.json#L73-L83) [scripts/e2e/package.json#L6-8](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/scripts/e2e/package.json#L6-L8)
- Netlify builds packages and the VitePress site on Node 24; GitHub release automation separates mode selection, version PR creation, packing, and publishing, while labeled PRs can trigger pkg-pr-new previews. — [netlify.toml#L1-6](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/netlify.toml#L1-L6) [.github/workflows/publish.yml#L37-73](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/.github/workflows/publish.yml#L37-L73) [.github/workflows/publish.yml#L75-123](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/.github/workflows/publish.yml#L75-L123) [.github/workflows/pkg-pr-new.yml#L14-30](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/.github/workflows/pkg-pr-new.yml#L14-L30)

## Feature catalog

The CLI covers release setup, contributor input, release inspection, version application, artifact creation, and publication. Configuration controls coordinated groups, skipped/private packages, formatting, and generators. Prereleases and snapshots have explicit mode restrictions. The public documentation adds searchable guides, generated CLI help, and selected package references.
- init interactively chooses GitHub changelogs, automatic commits, access, and base branch, then writes .changeset/config.json and copies a README; an existing config makes it return early. — [packages/cli/src/commands/init/index.ts#L20-57](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/init/index.ts#L20-L57) [packages/cli/src/commands/init/index.ts#L89-122](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/init/index.ts#L89-L122)
- add supports interactive package/bump selection, explicit --major/--minor/--patch lists, --message, --empty, best-effort changed-package suggestions, and opening the created file in an editor. — [packages/cli/src/cli.ts#L81-100](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L81-L100) [packages/cli/src/commands/add/index.ts#L65-101](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/add/index.ts#L65-L101) [packages/cli/src/commands/add/index.ts#L168-170](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/add/index.ts#L168-L170)
- version applies package versions, internal dependency ranges, and changelogs; fixed groups release together, linked groups coordinate released versions, and config controls ignored/private packages and workspace-only range handling. — [packages/cli/src/commands/version/index.ts#L100-125](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/version/index.ts#L100-L125) [packages/config/src/config.ts#L75-109](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/config.ts#L75-L109) [packages/apply-release-plan/src/index.ts#L140-178](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L140-L178)
- status supports --since, verbose release details, and JSON output; it exits with an error when changed versionable packages exist but the assembled plan contains no changesets. — [packages/cli/src/cli.ts#L162-171](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L162-L171) [packages/cli/src/commands/status/index.ts#L25-66](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/status/index.ts#L25-L66) [packages/cli/src/commands/status/index.ts#L101-109](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/status/index.ts#L101-L109)
- pre enter/exit persists prerelease mode and tag; version also supports snapshots with configurable tag/time/commit suffixes, defaults their base to 0.0.0, and rejects snapshots in active prerelease mode. — [packages/pre/src/index.ts#L43-70](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/pre/src/index.ts#L43-L70) [packages/assemble-release-plan/src/index.ts#L37-83](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.ts#L37-L83) [packages/assemble-release-plan/src/index.ts#L86-109](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.ts#L86-L109) [packages/cli/src/commands/version/index.ts#L72-80](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/version/index.ts#L72-L80)
- publish-plan identifies registry-unpublished versions and optional private-package tags; pack writes tarballs plus publish-plan.json, and publish can consume that directory but rejects a custom tag in artifact mode. — [packages/cli/src/commands/publish-plan/getPublishPlan.ts#L273-307](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish-plan/getPublishPlan.ts#L273-L307) [packages/cli/src/commands/pack/index.ts#L45-60](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/pack/index.ts#L45-L60) [packages/cli/src/commands/pack/index.ts#L148-158](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/pack/index.ts#L148-L158) [packages/cli/src/commands/publish/index.ts#L110-154](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/index.ts#L110-L154)
- publish exposes OTP, dist-tag, artifact-directory, and Git-tag controls; git-tag is also standalone, and its older tag alias emits a deprecation warning. — [packages/cli/src/cli.ts#L119-130](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L119-L130) [packages/cli/src/cli.ts#L174-185](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L174-L185)
- The site offers local search, Guide/FAQ/Blog navigation, generated CLI help, and sidebar-selected package reference pages; GitHub changelogs add PR/commit/author links, issue references, and optional templates. — [site/.vitepress/config.ts#L110-147](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/site/.vitepress/config.ts#L110-L147) [site/guide/cli.data.ts#L99-122](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/site/guide/cli.data.ts#L99-L122) [site/packages/[pkg].paths.ts#L10-28](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/site/packages/%5Bpkg%5D.paths.ts#L10-L28) [packages/changelog-github/src/index.ts#L98-187](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/changelog-github/src/index.ts#L98-L187)

## Data flow

Release intent enters through CLI selections or editable changeset files. Schema validation and workspace discovery normalize configuration before the planner builds package-indexed state. Version application persists calculated results, while publishing independently compares current manifests against registry state. Artifact and reporting files are additional output boundaries with different formats and trust assumptions.
- normalizeOptions expands comma-separated bump/ignore values, removes aliases, keeps the last repeated scalar, and converts numeric-looking options to strings; CHANGESETS_OUTPUT supplies missing output paths. — [packages/cli/src/cli.ts#L19-70](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L19-L70)
- readConfig loads config.json from the discovered workspace root; validateConfig applies Valibot parsing, normalizeWrittenConfig, and package-aware validation rules before returning config or errors. — [packages/config/src/parse.ts#L25-56](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/parse.ts#L25-L56) [packages/config/src/parse.ts#L59-75](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/parse.ts#L59-L75) [packages/config/src/config.ts#L165-182](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/config.ts#L165-L182)
- writeChangeset converts releases and summary into quoted YAML frontmatter plus Markdown, assigns a human-readable ID, writes .changeset/<id>.md, and invokes the configured/detected formatter. — [packages/write/src/index.ts#L32-63](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/write/src/index.ts#L32-L63)
- readChangesets combines root and pre-directory Markdown, optionally filters by Git ref, excludes hidden/helper files, and returns parseChangesetFile results with path-derived IDs; parsing validates release names and types. — [packages/read/src/index.ts#L25-81](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/read/src/index.ts#L25-L81) [packages/parse/src/index.ts#L19-47](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/parse/src/index.ts#L19-L47) [packages/parse/src/index.ts#L74-108](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/parse/src/index.ts#L74-L108)
- flattenReleases builds a package-to-release Map, retains every contributing changeset ID, and selects the highest bump; assembleReleasePlan repeatedly mutates that state through dependents, fixed constraints, and links. — [packages/assemble-release-plan/src/flatten-releases.ts#L16-58](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/flatten-releases.ts#L16-L58) [packages/assemble-release-plan/src/index.ts#L150-183](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.ts#L150-L183)
- applyReleasePlan attaches Git commit metadata for changelog generators, edits package and root dependency fields, formats changelogs, then archives active-prerelease changesets or removes consumed ordinary changesets while preserving skipped ones. — [packages/apply-release-plan/src/index.ts#L140-182](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L140-L182) [packages/apply-release-plan/src/index.ts#L203-228](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L203-L228) [packages/apply-release-plan/src/index.ts#L287-310](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L287-L310)
- getUnpublishedPackages queues registry info calls, compares local versions against published versions, assigns access/tag, and sortReleases produces dependency-ordered chunks excluding dev dependencies; shared limits are 40 registry requests and 10 publishes. — [packages/cli/src/commands/publish-plan/getPublishPlan.ts#L106-118](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish-plan/getPublishPlan.ts#L106-L118) [packages/cli/src/commands/publish-plan/getPublishPlan.ts#L167-188](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish-plan/getPublishPlan.ts#L167-L188) [packages/cli/src/commands/publish-plan/getPublishPlan.ts#L223-270](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish-plan/getPublishPlan.ts#L223-L270) [packages/cli/src/lib/common.ts#L8-16](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/lib/common.ts#L8-L16)
- pack records relative tarball paths and SHA-256 integrity in a versioned JSON plan; publication resolves those paths, while Git-tag reporting appends NDJSON events and flushes the stream on async disposal. — [packages/cli/src/commands/pack/index.ts#L39-42](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/pack/index.ts#L39-L42) [packages/cli/src/commands/pack/index.ts#L110-119](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/pack/index.ts#L110-L119) [packages/cli/src/commands/publish/index.ts#L79-90](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/index.ts#L79-L90) [packages/cli/src/utils/output.ts#L17-34](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/utils/output.ts#L17-L34)

## Behavior traces

The inspected startup, add, version, and publish paths connect concrete command dispatch to their terminal effects. Additional traces cover status, prerelease persistence, and packing. These are source-derived execution sequences, not observed runtime results. Branches around skipped packages, prerelease state, authentication, and partial publication materially change the sequence.
- Startup: bin.js imports the CLI → index.ts calls cli.parse(run:false) → enables interactive guidance for TTY add/publish → displays the version intro → awaits runMatchedCommand; command actions import handlers lazily. — [packages/cli/bin.js#L3-9](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/bin.js#L3-L9) [packages/cli/src/index.ts#L11-28](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/index.ts#L11-L28) [packages/cli/src/cli.ts#L97-100](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L97-L100)
- Add: getPackages → ensureChangesetFolder → readConfig → filter versionable packages → best-effort getVersionableChangedPackages → createChangeset or empty intent → writeChangeset → optional getAddMessage/Git commit → optional launchEditor. — [packages/cli/src/commands/add/index.ts#L30-49](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/add/index.ts#L30-L49) [packages/cli/src/commands/add/index.ts#L65-125](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/add/index.ts#L65-L125) [packages/cli/src/commands/add/index.ts#L168-170](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/add/index.ts#L168-L170)
- Version: discover packages/read config → validate ignore names and skipped dependents → readChangesets/readPreState → reject snapshot/pre conflicts or absent intent → assembleReleasePlan → applyReleasePlan → optionally stage touched paths sequentially and commit. — [packages/cli/src/commands/version/index.ts#L27-70](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/version/index.ts#L27-L70) [packages/cli/src/commands/version/index.ts#L72-125](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/version/index.ts#L72-L125) [packages/cli/src/commands/version/index.ts#L127-143](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/version/index.ts#L127-L143)
- Planner: getRelevantChangesets rejects unknown packages and mixed skipped/non-skipped intent → getPreInfo → flattenReleases → build dependents graph → repeat determineDependents/matchFixedConstraint/applyLinks until stable → calculate output versions. — [packages/assemble-release-plan/src/index.ts#L138-183](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.ts#L138-L183) [packages/assemble-release-plan/src/index.ts#L219-235](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.ts#L219-L235) [packages/assemble-release-plan/src/index.ts#L249-280](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.ts#L249-L280)
- Status: getPackages/readConfig → readPreState/readChangesets → assembleReleasePlan → detect changed packages → enforce presence of changesets → either serialize the release plan or print sorted bump groups and optional IDs/new versions. — [packages/cli/src/commands/status/index.ts#L22-66](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/status/index.ts#L22-L66) [packages/cli/src/commands/status/index.ts#L84-109](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/status/index.ts#L84-L109)
- Prerelease persistence: enterPre writes mode/tag → version application moves consumed files into .changeset/pre → active-pre assembly excludes archived IDs → exitPre writes mode:exit → the next application removes pre.json and consumes releasable archived intent. — [packages/pre/src/index.ts#L43-70](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/pre/src/index.ts#L43-L70) [packages/apply-release-plan/src/index.ts#L114-119](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L114-L119) [packages/apply-release-plan/src/index.ts#L216-227](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L216-L227) [packages/assemble-release-plan/src/index.ts#L279-283](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.ts#L279-L283)
- Pack: discover/read config → read supplied plan or compute getPublishPlan → create output/packages → queue publishTool.pack calls → hash each returned tarball → attach metadata to original chunks → write publish-plan.json; Yarn rejects publishConfig.directory. — [packages/cli/src/commands/pack/index.ts#L45-98](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/pack/index.ts#L45-L98) [packages/cli/src/commands/pack/index.ts#L110-158](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/pack/index.ts#L110-L158)
- Publish: create reporter/discover adapter → load or compute plan → process dependency chunks → use TTY sequential probing or bulk publishing → recover eligible 2FA failures interactively → tag successes/tag-only entries → exit 1 for recorded failures. — [packages/cli/src/commands/publish/index.ts#L110-176](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/index.ts#L110-L176) [packages/cli/src/commands/publish/index.ts#L191-265](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/index.ts#L191-L265) [packages/cli/src/commands/publish/index.ts#L324-362](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/index.ts#L324-L362) [packages/cli/src/commands/publish/index.ts#L376-419](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/index.ts#L376-L419)

## Testing signals

Tests and CI were inspected, not executed; this report contains no passing test result or measured coverage percentage. Vitest covers planner logic, filesystem application, config rules, and mocked publication behavior. A separate E2E workspace exercises real CLI/package-manager processes against test infrastructure. Inspection is bounded, and explicit TODOs and fixture constraints limit what test existence establishes.
- Root Vitest excludes scripts/e2e, clears/restores mocks, and defines slow-test timeouts; the separate E2E config has its own timeout and both configurations allow focused tests. — [vitest.config.ts#L3-23](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/vitest.config.ts#L3-L23) [scripts/e2e/vitest.config.ts#L3-10](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/scripts/e2e/vitest.config.ts#L3-L10)
- Planner tests use FakeFullState and assert basic releases, snapshot formats, maximum-bump merging, and transitive dependent updates; these assertions were read, not executed. — [packages/assemble-release-plan/src/index.test.ts#L1-50](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.test.ts#L1-L50) [packages/assemble-release-plan/src/index.test.ts#L96-112](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.test.ts#L96-L112) [packages/assemble-release-plan/src/index.test.ts#L183-204](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.test.ts#L183-L204)
- apply-release-plan tests create filesystem fixtures, resolve built CLI generator paths, invoke applyReleasePlan, and assert exact manifest text preservation; duplicate-package-plan rejection remains an it.todo case. — [packages/apply-release-plan/src/index.test.ts#L24-31](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.test.ts#L24-L31) [packages/apply-release-plan/src/index.test.ts#L121-143](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.test.ts#L121-L143) [packages/apply-release-plan/src/index.test.ts#L153-179](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.test.ts#L153-L179) [packages/apply-release-plan/src/index.test.ts#L3140-3143](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.test.ts#L3140-L3143)
- Config tests assert duplicate fixed/linked-group errors and skipped-dependent validation with a private-package exception; schema tests compare generated JSON against tracked schema.json. — [packages/config/src/parse.test.ts#L626-662](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/parse.test.ts#L626-L662) [packages/config/src/parse.test.ts#L665-713](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/parse.test.ts#L665-L713) [packages/config/scripts/json-schema.test.ts#L4-11](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/scripts/json-schema.test.ts#L4-L11)
- Publish unit tests mock Git and tinyexec, assert dependency-first invocation/tag ordering, and simulate expired-OTP recovery back to bulk mode; they do not exercise real authentication in those cases. — [packages/cli/src/commands/publish/__tests__/index.test.ts#L22-31](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/__tests__/index.test.ts#L22-L31) [packages/cli/src/commands/publish/__tests__/index.test.ts#L175-200](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/__tests__/index.test.ts#L175-L200) [packages/cli/src/commands/publish/__tests__/index.test.ts#L526-599](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/__tests__/index.test.ts#L526-L599)
- Pack E2E tests explicitly use precomputed plans to avoid registry dependence, assert tarball/metadata output, exercise lifecycle stdout, and require a failed lifecycle to leave no publish-plan.json. — [scripts/e2e/pack.test.ts#L37-105](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/scripts/e2e/pack.test.ts#L37-L105) [scripts/e2e/pack.test.ts#L108-165](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/scripts/e2e/pack.test.ts#L108-L165) [scripts/e2e/pack.test.ts#L168-224](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/scripts/e2e/pack.test.ts#L168-L224)
- The publish E2E OTP case runs a TTY CLI against a configured test registry, submits a fixture OTP, and checks failed/successful PUT requests; E2E dependencies include npm 10–12, pnpm 10–12, Yarn 4, and a PTY library. — [scripts/e2e/publish.test.ts#L2022-2048](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/scripts/e2e/publish.test.ts#L2022-L2048) [scripts/e2e/publish.test.ts#L2050-2101](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/scripts/e2e/publish.test.ts#L2050-L2101) [scripts/e2e/package.json#L15-29](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/scripts/e2e/package.json#L15-L29)
- Inspected CI builds before tests, runs Node 22/24/26 on Ubuntu and Node 24 on macOS/Windows, uploads Ubuntu/Node-24 coverage, and separately runs E2E/type/lint/format checks; root check-all does not include E2E or site builds. — [.github/workflows/ci.yml#L62-110](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/.github/workflows/ci.yml#L62-L110) [.github/workflows/ci.yml#L114-159](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/.github/workflows/ci.yml#L114-L159) [package.json#L31-35](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/package.json#L31-L35)

## Risk map

These are source observations and narrowly labeled hypotheses, not confirmed vulnerabilities. Sensitive boundaries include configured executable modules, package-manager subprocesses, caller-selected paths, Git writes, and authenticated GitHub requests. Release application and publication can leave partial effects when later operations fail. Artifact validation and compatibility assumptions deserve focused verification before broader reliance.
- Configured changelog and commit modules are dynamically imported from the consumer's .changeset context with a CLI-context fallback; configuration therefore selects executable code in the invoking process. — [packages/apply-release-plan/src/index.ts#L259-284](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L259-L284) [packages/cli/src/commit/getCommitFunctions.ts#L19-44](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commit/getCommitFunctions.ts#L19-L44)
- readPlanFile checks only the outer object, plan array, and version; artifact publishing then trusts entry fields and resolves tarball paths, without checking the integrity metadata in the inspected publish path. — [packages/cli/src/commands/publish-plan/getPublishPlan.ts#L60-77](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish-plan/getPublishPlan.ts#L60-L77) [packages/cli/src/commands/pack/index.ts#L110-119](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/pack/index.ts#L110-L119) [packages/cli/src/commands/publish/index.ts#L79-90](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/index.ts#L79-L90) [packages/cli/src/commands/publish/index.ts#L149-154](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/index.ts#L149-L154)
- The publish-plan source explicitly documents that registry identity is omitted and planning/publishing require matching configuration; pnpm and Yarn info queries use fetch-registry behavior rather than publishConfig.registry overrides. — [packages/cli/src/commands/publish-plan/getPublishPlan.ts#L37-44](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish-plan/getPublishPlan.ts#L37-L44) [packages/cli/src/lib/pnpm.ts#L95-110](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/lib/pnpm.ts#L95-L110) [packages/cli/src/lib/yarn.ts#L82-89](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/lib/yarn.ts#L82-L89)
- applyReleasePlan writes manifests/changelogs sequentially before formatting and changeset cleanup, with no rollback in that sequence; later failures can leave earlier writes. Publishing similarly retains successful publications and tags when another package fails. — [packages/apply-release-plan/src/index.ts#L140-182](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L140-L182) [packages/apply-release-plan/src/index.ts#L190-232](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L190-L232) [packages/cli/src/commands/publish/index.ts#L366-419](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/index.ts#L366-L419)
- readPreState parses JSON without structural validation and may migrate v2 state by renaming changesets and rewriting pre.json; callers such as status can therefore mutate legacy state through a read-named API. — [packages/pre/src/index.ts#L15-40](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/pre/src/index.ts#L15-L40) [packages/pre/src/index.ts#L73-112](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/pre/src/index.ts#L73-L112) [packages/cli/src/commands/status/index.ts#L28-30](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/status/index.ts#L28-L30)
- npm pack/publish delegate lifecycle execution to an external CLI; publish passes OTP as an argument and inherits other environment values after clearing OTP variables. pack/output paths and publishConfig.directory are caller/config-selected filesystem boundaries. — [packages/cli/src/lib/npm.ts#L54-59](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/lib/npm.ts#L54-L59) [packages/cli/src/lib/npm.ts#L232-243](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/lib/npm.ts#L232-L243) [packages/cli/src/lib/npm.ts#L346-374](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/lib/npm.ts#L346-L374) [packages/cli/src/commands/pack/index.ts#L52-58](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/pack/index.ts#L52-L58)
- GitHub helpers can read a consumer-cwd .env and send GITHUB_TOKEN to configured GITHUB_GRAPHQL_URL; changelog commit lookup may deepen shallow clones through git fetch. These are network/credential boundaries visible in source, not actions performed in this investigation. — [packages/get-github-info/src/env.ts#L5-33](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/get-github-info/src/env.ts#L5-L33) [packages/get-github-info/src/dataloader.ts#L91-120](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/get-github-info/src/dataloader.ts#L91-L120) [packages/git/src/index.ts#L129-136](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/git/src/index.ts#L129-L136) [packages/git/src/index.ts#L186-192](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/git/src/index.ts#L186-L192)
- Two reporting compatibility hypotheses need reproduction: createGitTags records success without checking git.tag's false result, and release-utils.runPublish still extracts 'New tag:' text while current CLI tag formatting emits 'Created git tags:'. (inferred) — [packages/git/src/index.ts#L39-46](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/git/src/index.ts#L39-L46) [packages/cli/src/commands/git-tag/utils.ts#L28-40](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/git-tag/utils.ts#L28-L40) [packages/cli/src/commands/git-tag/utils.ts#L57-68](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/git-tag/utils.ts#L57-L68) [packages/release-utils/src/run.ts#L46-85](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/release-utils/src/run.ts#L46-L85)

## Extension points

The primary extension mechanisms are configurable generator modules and internal command/adapter tables. Shared types separate contributor intent, calculated releases, and publication results. Config rules and schema generation provide coordinated validation hooks. Documentation generation also plugs into CLI registrations and package sidebar entries.
- New CLI behavior belongs in cac command registrations with normalization and lazy handler imports; the existing command table demonstrates array-valued options, aliases, examples, and required-option checks. — [packages/cli/src/cli.ts#L81-117](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L81-L117) [packages/cli/src/cli.ts#L145-159](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L145-L159)
- Changelog plugins implement getReleaseLine and getDependencyReleaseLine, may return promises, and receive configured options; the loader requires both functions and handles default-export interoperability. — [packages/types/src/index.ts#L169-183](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/types/src/index.ts#L169-L183) [packages/apply-release-plan/src/index.ts#L269-284](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L269-L284) [packages/apply-release-plan/src/index.ts#L296-310](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.ts#L296-L310)
- Commit plugins expose getAddMessage and/or getVersionMessage; config accepts booleans, module strings, or module/options tuples, with true normalized to the built-in commit generator. — [packages/config/src/config.ts#L34-40](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/config.ts#L34-L40) [packages/config/src/config.ts#L175-179](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/config.ts#L175-L179) [packages/cli/src/commit/getCommitFunctions.ts#L29-46](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commit/getCommitFunctions.ts#L29-L46)
- PublishTool is the internal adapter contract for info, pack, publish, and OTP extraction; adding a manager requires changing its name union and getPublishTool selection, not registering an arbitrary external plugin. — [packages/cli/src/lib/types.ts#L4-10](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/lib/types.ts#L4-L10) [packages/cli/src/commands/publish/getPublishTool.ts#L30-55](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish/getPublishTool.ts#L30-L55)
- WrittenConfigSchema defines accepted options/defaults, normalizeWrittenConfig reconciles alternate forms, and the rules array runs package-aware checks over one shared errors/warnings context. — [packages/config/src/config.ts#L45-73](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/config.ts#L45-L73) [packages/config/src/config.ts#L165-182](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/config.ts#L165-L182) [packages/config/src/rules.ts#L186-205](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/rules.ts#L186-L205)
- Configuration schema changes feed generateJsonSchema, which converts WrittenConfigSchema to draft-2020-12 JSON and writes schema.json; a file-snapshot test checks generated/schema alignment. — [packages/config/scripts/generate-json-schema.ts#L7-34](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/scripts/generate-json-schema.ts#L7-L34) [packages/config/scripts/json-schema.test.ts#L8-11](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/scripts/json-schema.test.ts#L8-L11)
- Release policy helpers plug into assembleReleasePlan's stabilization loop; changes to dependent propagation, fixed constraints, or links must preserve their mutation/change-reporting contract and final version computation. — [packages/assemble-release-plan/src/index.ts#L161-183](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.ts#L161-L183) [packages/assemble-release-plan/src/index.ts#L219-235](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.ts#L219-L235) [packages/assemble-release-plan/src/determine-dependents.ts#L16-26](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/determine-dependents.ts#L16-L26)
- Documentation extensions use VitePress sidebar entries and package README/manifest generation; CLI reference help comes from helpMessageTasks invoking the same CLI parser, while package builds inherit shared tsdown configuration. — [site/.vitepress/config.ts#L235-242](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/site/.vitepress/config.ts#L235-L242) [site/packages/[pkg].paths.ts#L10-28](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/site/packages/%5Bpkg%5D.paths.ts#L10-L28) [site/guide/cli.data.ts#L24-35](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/site/guide/cli.data.ts#L24-L35) [site/guide/cli.data.ts#L105-122](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/site/guide/cli.data.ts#L105-L122)

## Contributor handoff

Tests and CI were inspected, not executed, and the findings are a bounded onboarding map rather than exhaustive coverage or a verification certificate. Start with the relevant command, shared contracts, and side-effect-owning package before changing behavior. Preserve distinctions between release planning, filesystem application, and registry publication. Future checks must respect task authorization because several apparently convenient APIs or scripts perform writes, subprocess execution, or remote operations.
- Treat this checkout as v3 development, verify behavior against local source, and use the pinned pnpm/Node requirements; README explicitly points v2 users to a different maintenance branch. — [README.md#L1-2](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/README.md#L1-L2) [package.json#L73-83](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/package.json#L73-L83) [packages/cli/package.json#L64-68](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/package.json#L64-L68)
- Read cli.ts plus the affected handler and shared types first; ReleasePlan and PublishPlan are different contracts, with the latter carrying ordered publish/tag-only chunks rather than proposed bumps. — [packages/cli/src/cli.ts#L103-159](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/cli.ts#L103-L159) [packages/types/src/index.ts#L58-71](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/types/src/index.ts#L58-L71) [packages/cli/src/commands/publish-plan/getPublishPlan.ts#L45-58](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/cli/src/commands/publish-plan/getPublishPlan.ts#L45-L58)
- Keep semver-policy changes in assembly helpers and manifest edits in apply-release-plan; retain dev-dependent none releases and file/link/workspace range exceptions instead of treating every dependency edge as a version bump. — [packages/assemble-release-plan/src/index.ts#L152-183](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/index.ts#L152-L183) [packages/assemble-release-plan/src/determine-dependents.ts#L100-116](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/assemble-release-plan/src/determine-dependents.ts#L100-L116) [packages/apply-release-plan/src/version-package.ts#L45-92](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/version-package.ts#L45-L92)
- Configuration changes should update WrittenConfig/Config, WrittenConfigSchema, normalization/rules, and generated schema together; schema snapshot tests are the narrow alignment check. — [packages/types/src/index.ts#L100-155](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/types/src/index.ts#L100-L155) [packages/config/src/config.ts#L45-73](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/config.ts#L45-L73) [packages/config/src/parse.ts#L25-51](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/src/parse.ts#L25-L51) [packages/config/scripts/json-schema.test.ts#L8-11](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/config/scripts/json-schema.test.ts#L8-L11)
- Build before authorized tests that resolve dist generators: the apply-release-plan suite references built CLI changelog/commit files, and CI supplies build artifacts before test jobs. Then target the affected Vitest file before broader root checks. — [packages/apply-release-plan/src/index.test.ts#L24-31](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/apply-release-plan/src/index.test.ts#L24-L31) [.github/workflows/ci.yml#L62-82](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/.github/workflows/ci.yml#L62-L82) [package.json#L23-33](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/package.json#L23-L33)
- E2E is separately bootstrapped, excluded from root test/typechecking, and requires Node 24 or newer; use the relevant pack/publish suite for authorized adapter work instead of assuming check-all includes it. — [package.json#L21-33](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/package.json#L21-L33) [vitest.config.ts#L5-6](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/vitest.config.ts#L5-L6) [tsconfig.json#L18-20](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/tsconfig.json#L18-L20) [scripts/e2e/package.json#L31-32](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/scripts/e2e/package.json#L31-L32)
- Follow explicit .ts ESM imports, inline type-import conventions, and == null checks; named exports are preferred, but index/config exceptions retain default exports for compatibility. — [packages/get-release-plan/src/index.ts#L1-6](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/get-release-plan/src/index.ts#L1-L6) [eslint.config.js#L49-72](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/eslint.config.js#L49-L72) [eslint.config.js#L98-110](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/eslint.config.js#L98-L110) [packages/get-release-plan/src/index.ts#L32-34](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/get-release-plan/src/index.ts#L32-L34)
- For read-only investigations inspect tests/CI without executing them: readPreState may rewrite legacy files, runVersion resets/commits/force-pushes, and runPublish invokes an arbitrary command then pulls/pushes; these APIs are not safe inspection helpers. — [packages/pre/src/index.ts#L95-112](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/pre/src/index.ts#L95-L112) [packages/release-utils/src/run.ts#L29-41](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/release-utils/src/run.ts#L29-L41) [packages/release-utils/src/run.ts#L111-146](https://github.com/changesets/changesets/blob/c73949ba7b3160a4aa5729223335c190de1528f8/packages/release-utils/src/run.ts#L111-L146)

Source repository: https://github.com/changesets/changesets
Full evidence corpus: https://github.com/Codevetter/codevetter/tree/main/benchmarks/repo-unpacks/changesets.json

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
