mirror of
https://github.com/pnpm/pnpm.git
synced 2026-05-12 10:11:42 -04:00
* chore(release): wrap changeset version with cross-branch consumed-id ledger When a fix is cherry-picked from main to a release branch (or vice versa), the changeset file ends up on both branches. The release branch's release consumes and deletes its copy, but the cherry-picked copy on main survives the merge back and would be re-applied on the next main release. Introduce a small wrapper around `changeset version` that maintains a per-branch ledger at .changeset/.released/<branch>.txt. Each entry is a consumed changeset id; the file is written only by the branch it is named after, so the records merge across branches without conflicts. Before running `changeset version` the wrapper reads the union of every ledger file, hides matching .changeset/<id>.md files (rename to .md.released), then runs `changeset version` against the remaining set. Newly consumed ids are appended to the current branch's ledger; hidden files are removed afterward (their consumption is already on record elsewhere). On failure the hidden files are restored to keep the working tree clean. * docs: move release-ledger explanation out of AGENTS.md AGENTS.md is for instructions to AI agents working on the codebase, but the cross-branch ledger is release machinery that the maintainer running `pnpm bump` interacts with — agents authoring changesets do not need to know about it. Move the explanation to where someone runs into it: - .changeset/.released/README.md — discovered by anyone exploring the directory. - A short doc-comment header at the top of __utils__/scripts/src/bump.ts pointing readers there. * fix(scripts): harden bump wrapper edge cases from PR review - Use url.pathToFileURL(realpathSync(...)) to compare against import.meta.url so the direct-invocation guard works on Windows paths and through symlinks (Copilot review). - hideReleased() now iterates the changeset directory and filters by the released set instead of iterating the (potentially long) ledger and probing existsSync per entry (Copilot review). - hideReleased() restores already-renamed files if a later rename throws, so a partial failure leaves the .changeset directory in its original state (CodeRabbit review). - Move deleteHidden() into a finally so the .md.released files are cleaned up even if appendReleased() throws after a successful changeset version run (CodeRabbit review). - Add a unit test that forces hideReleased() to fail mid-loop and asserts the rollback.
69 lines
3.2 KiB
JSON
69 lines
3.2 KiB
JSON
{
|
|
"name": "monorepo-root",
|
|
"private": true,
|
|
"scripts": {
|
|
"bump": "node __utils__/scripts/src/bump.ts && pn update-manifests",
|
|
"changeset": "changeset",
|
|
"prepare": "husky",
|
|
"pretest": "pn compile-only && pn prepare-fixtures",
|
|
"prepare-fixtures": "pn --dir=__fixtures__ prepareFixtures",
|
|
"lint": "pn spellcheck && pn lint:meta && pn lint:ts",
|
|
"spellcheck": "cspell \"**/*.ts\" \"**/README.md\" \".changeset/*.md\" --no-progress",
|
|
"lint:ts": "eslint \"**/src/**/*.ts\" \"**/test/**/*.ts\" --cache",
|
|
"test-all": "pn pretest && pn lint && pn test-pkgs-all",
|
|
"ci:test-all": "pn prepare-fixtures && pn test-pkgs-all",
|
|
"remove-temp-dir": "shx rm -rf ../pnpm_tmp",
|
|
"test-pkgs-all": "pn remove-temp-dir && pn --no-sort --workspace-concurrency=1 -r .test",
|
|
"test-branch": "pn pretest && pn lint && git remote set-branches --add origin main && git fetch origin main && pn test-pkgs-branch",
|
|
"ci:test-branch": "pn prepare-fixtures && pn test-pkgs-branch",
|
|
"test-pkgs-branch": "pn remove-temp-dir && pn --workspace-concurrency=1 --filter=...[origin/main] --no-sort --if-present .test",
|
|
"compile-only": "tsgo --build workspace/workspace-manifest-reader workspace/projects-reader && pnx node@runtime:24.6.0 __utils__/scripts/src/typecheck-only.ts && pn -F=pnpm compile",
|
|
"compile": "pn compile-only && pn update-manifests",
|
|
"make-lcov": "shx mkdir -p coverage && lcov-result-merger './packages/*/coverage/lcov.info' 'coverage/lcov.info'",
|
|
"update-manifests": "pn meta-updater && pn install",
|
|
"meta-updater": "pn --filter=@pnpm-private/updater compile && pn exec meta-updater",
|
|
"lint:meta": "pn meta-updater --test",
|
|
"copy-artifacts": "node __utils__/scripts/src/copy-artifacts.ts",
|
|
"make-release-description": "pn --filter=@pnpm/get-release-text run write-release-text",
|
|
"release": "pn --filter=@pnpm/exe run build-artifacts && pn --filter=@pnpm/exe publish --tag=next-11 --access=public --provenance && pn publish --filter=!pnpm --filter=!@pnpm/exe --access=public --provenance && pn publish --filter=pnpm --tag=next-11 --access=public --provenance",
|
|
"dev-setup": "pn -C=./pnpm/dev link -g"
|
|
},
|
|
"devDependencies": {
|
|
"@changesets/cli": "catalog:",
|
|
"@commitlint/cli": "catalog:",
|
|
"@commitlint/config-conventional": "catalog:",
|
|
"@commitlint/prompt-cli": "catalog:",
|
|
"@pnpm/eslint-config": "workspace:*",
|
|
"@pnpm/jest-config": "workspace:*",
|
|
"@pnpm/meta-updater": "catalog:",
|
|
"@pnpm/tgz-fixtures": "catalog:",
|
|
"@pnpm/tsconfig": "workspace:*",
|
|
"@types/jest": "catalog:",
|
|
"@types/node": "catalog:",
|
|
"@types/picomatch": "catalog:",
|
|
"@typescript/native-preview": "catalog:",
|
|
"c8": "catalog:",
|
|
"concurrently": "catalog:",
|
|
"cross-env": "catalog:",
|
|
"cspell": "catalog:",
|
|
"eslint": "catalog:",
|
|
"eslint-plugin-regexp": "catalog:",
|
|
"husky": "catalog:",
|
|
"jest": "catalog:",
|
|
"keyv": "catalog:",
|
|
"lcov-result-merger": "catalog:",
|
|
"rimraf": "catalog:",
|
|
"shx": "catalog:",
|
|
"typescript": "catalog:",
|
|
"verdaccio": "catalog:"
|
|
},
|
|
"packageManager": "pnpm@11.0.5",
|
|
"devEngines": {
|
|
"packageManager": {
|
|
"name": "pnpm",
|
|
"version": "11.0.5",
|
|
"onFail": "download"
|
|
}
|
|
}
|
|
}
|