Compare commits

...
5 Commits
Author SHA1 Message Date
changeset-internal-publish-bot[bot] 198f833dd7 v2.1.0 2026-08-13 10:58:59 +00:00
changesets-org-version-bot[bot] 7545547fe4 Version Packages (#719)
Co-authored-by: changesets-org-version-bot[bot] <288406890+changesets-org-version-bot[bot]@users.noreply.github.com>
2026-08-13 02:33:15 +00:00
Mateusz Burzyński 3043070b0d Prevent test warning annotations (#720) 2026-08-13 00:50:23 +00:00
Bjorn Lu 3b7c71c440 Add back cwd input (#718) 2026-08-12 13:10:39 +00:00
Bjorn Lu 6f58ba3580 Update pr-status message links to new faq (#716) 2026-08-12 10:34:14 +00:00
30 changed files with 439 additions and 21 deletions
+10
View File
@@ -1,5 +1,15 @@
# @changesets/action # @changesets/action
## 2.1.0
### Minor Changes
- [#718](https://github.com/changesets/action/pull/718) [`3b7c71c`](https://github.com/changesets/action/commit/3b7c71c440e75fca5d335f779290425fc1117fe8) Thanks [@bluwy](https://github.com/bluwy)! - Add a `cwd` input to the root action, `/select-mode`, `/version`, `/pack`, and `/publish` sub-actions to set the current working directory to execute Changesets in. This input existed in v1 but was incorrectly removed.
### Patch Changes
- [#716](https://github.com/changesets/action/pull/716) [`6f58ba3`](https://github.com/changesets/action/commit/6f58ba35801ec075a1c87569277591f8ef1a3029) Thanks [@bluwy](https://github.com/bluwy)! - Update `pr-status` message to link to the new faq page
## 2.0.0 ## 2.0.0
### Major Changes ### Major Changes
+1
View File
@@ -62,6 +62,7 @@ If using [trusted publishing](https://docs.npmjs.com/trusted-publishers), it's r
| `create-github-releases` | Whether to create Github releases after publish | | `create-github-releases` | Whether to create Github releases after publish |
| `push-git-tags` | Whether to create git tags after publish. If `create-github-releases` is set to `true`, this option will also always be `true`. | | `push-git-tags` | Whether to create git tags after publish. If `create-github-releases` is set to `true`, this option will also always be `true`. |
| `push-with-git-cli` | Whether to use the Git CLI instead of the GitHub API to push release commits and tags. Defaults to `false`. When using the GitHub API, commits and tags are signed using GitHub's GPG key and attributed to the user or app that owns the `github-token`. | | `push-with-git-cli` | Whether to use the Git CLI instead of the GitHub API to push release commits and tags. Defaults to `false`. When using the GitHub API, commits and tags are signed using GitHub's GPG key and attributed to the user or app that owns the `github-token`. |
| `cwd` | The working directory to execute Changesets in. Defaults to the root of the repository. |
| Outputs | Description | | Outputs | Description |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
+3
View File
@@ -47,6 +47,9 @@ inputs:
GitHub's GPG key and attributed to the user or app that owns the `github-token`. GitHub's GPG key and attributed to the user or app that owns the `github-token`.
required: false required: false
default: false default: false
cwd:
description: "The working directory to execute Changesets in. Defaults to the root of the repository."
required: false
outputs: outputs:
published: published:
description: A "true" or "false" string value to indicate whether a publishing is happened or not description: A "true" or "false" string value to indicate whether a publishing is happened or not
+12
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{A as e,D as t,E as n,O as r,f as i,j as a,k as o,m as s,o as c,p as l,s as u}from"./utils-CAuP846_.js";import{n as d,r as f,t as p}from"./run-NkR1hNWV.js";import{t as m}from"./readChangesetState-D-vw_tSH.js";(async()=>{let h=c(`cwd`)||process.cwd();await s(h),l({publish:`publish-script`,version:`version-script`,commit:`commit-mesage`,title:`pr-title`,branch:`pr-base-branch`,prDraft:`pr-draft`,createGithubReleases:`create-github-releases`}),i();let g=u(`github-token`);if(process.env.GITHUB_TOKEN&&process.env.GITHUB_TOKEN!==g)throw Error(`The GITHUB_TOKEN environment variable is set and does not match the "github-token" input. Please pass the custom GitHub token to the "github-token" input and remove the GITHUB_TOKEN environment variable to avoid conflicts.`);let _=t(`push-with-git-cli`),v=c(`pr-draft`);if(v!==void 0&&v!==`always`&&v!==`create`){e(`Invalid pr-draft: ${v}`);return}let y=new f({cwd:h,githubToken:g,pushWithGitCli:_}),{changesets:b}=await m(h),x=r(`publish-script`),S=b.length!==0,C=b.some(e=>e.releases.length>0),w=!!x;switch(a(`published`,`false`),a(`published-packages`,`[]`),a(`has-changesets`,String(S)),!0){case!S&&!w:o(`No changesets present or were removed by merging release PR. Not publishing because no publish script found.`);return;case!S&&w:{o(`No changesets found. Attempting to publish any unpublished packages to npm`);let e=t(`create-github-releases`),r=t(`push-git-tags`);if(e&&!r)throw Error(`The input 'create-github-releases' is set to true, but 'push-git-tags' is set to false. Creating GitHub releases requires pushing git tags. Please set 'push-git-tags' to true or set 'create-github-releases' to false.`);let i=await p({script:x,github:y,createGithubReleases:e,pushGitTags:r,cwd:h});i.published&&(a(`published`,`true`),a(`published-packages`,JSON.stringify(i.publishedPackages))),i.exitCode!==0&&(n(`Publish command exited with code ${i.exitCode}${i.published?`, but some packages were published: ${i.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`),process.exit(i.exitCode));return}case S&&!C:o(`All changesets are empty; not creating PR`);return;case S:{let{pullRequestNumber:e}=await d({script:c(`version-script`),github:y,cwd:h,prTitle:c(`pr-title`),commitMessage:c(`commit-message`),hasPublishScript:w,prDraft:v,branch:c(`pr-base-branch`)});a(`pr-number`,String(e));return}}})().catch(t=>{n(t),e(t.message)});export{};
+1
View File
@@ -0,0 +1 @@
import{A as e,j as t,m as n,n as r,o as i,t as a,y as o}from"./utils-CAuP846_.js";import s from"node:fs/promises";import c from"node:path";import l from"node:os";try{await u()}catch(t){e(t.message)}async function u(){let e=i(`cwd`)||process.cwd();await n(e);let r=i(`publish-plan-artifact-id`),a=process.env.RUNNER_TEMP??await s.realpath(l.tmpdir()),u=c.join(a,`changeset-pack-${Date.now()}`);await d(e,{outDir:u,publishPlanPath:r?await f(a,Number(r)):void 0});let m=await o.uploadArtifact(`changeset-pack-${Date.now()}`,await p(u),u,{retentionDays:30});if(m.id===void 0)throw Error(`Packed artifact upload did not return an artifact id`);t(`pack-dir-artifact-id`,String(m.id))}async function d(e,t){let n=[`pack`,`--out-dir`,t.outDir];t.publishPlanPath&&n.push(`--from-publish-plan`,t.publishPlanPath),await r(n,{cwd:e,env:process.env})}async function f(e,t){let n=await a(e,t,`changeset-publish-plan`);return c.join(n,`publish-plan.json`)}async function p(e){let t=await s.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=c.join(e,t.name);return t.isDirectory()?p(n):[n]}))).flat()}export{};
+1
View File
@@ -0,0 +1 @@
import{A as e,T as t,j as n,k as r,o as i,s as a,w as o}from"./utils-CAuP846_.js";try{await s()}catch(t){e(t.message)}async function s(){let e=o.payload.pull_request;if(!e)throw Error("This action should only be run on `pull_request_target` or `pull_request` events");let s=a(`github-token`),l=a(`body`),u=i(`update-id`),d=u?c(u):null,f=d?`${d}\n\n${l}`:l,p={repo:e.base.repo.name,owner:e.base.repo.owner.login,issue_number:e.number,body:f},m=t(s),h;if(d&&(r(`Checking for existing comment...`),h=await m.rest.issues.listComments({repo:e.base.repo.name,owner:e.base.repo.owner.login,issue_number:e.number}).then(e=>e.data.find(e=>e.body?.includes(d))?.id)),h)r(`Updating existing comment (id: ${h})...`),await m.rest.issues.updateComment({...p,comment_id:h}),n(`comment-id`,h);else{r(`Creating new comment...`);let e=await m.rest.issues.createComment(p);n(`comment-id`,e.data.id)}r(`Done!`)}function c(e){let t=`changesets-action-pr-comment`;return t===e?`<!-- ${t} -->`:`<!-- ${t}:${e} -->`}export{};
+38
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{A as e,D as t,j as n,m as r,o as i,s as a,t as o}from"./utils-CAuP846_.js";import{r as s,t as c}from"./run-NkR1hNWV.js";import l from"node:fs/promises";import u from"node:os";try{await d()}catch(t){e(t.message)}async function d(){let e=i(`cwd`)||process.cwd();await r(e);let d=a(`github-token`),f=i(`script`),p=i(`pack-dir-artifact-id`),m=t(`create-github-releases`),h=t(`push-git-tags`);if(m&&!h)throw Error(`The input 'create-github-releases' is set to true, but 'push-git-tags' is set to false. Creating GitHub releases requires pushing git tags. Please set 'push-git-tags' to true or set 'create-github-releases' to false.`);let g=new s({cwd:e,githubToken:d}),_=p?await o(process.env.RUNNER_TEMP??await l.realpath(u.tmpdir()),Number(p),`changeset-pack`):void 0,v=await c({script:f,github:g,createGithubReleases:m,pushGitTags:h,cwd:e,fromPackDir:_});if(v.published?(n(`published`,`true`),n(`published-packages`,JSON.stringify(v.publishedPackages))):n(`published`,`false`),v.exitCode!==0)throw Error(`Publish command exited with code ${v.exitCode}${v.published?`, but some packages were published: ${v.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`)}export{};
+1
View File
@@ -0,0 +1 @@
import{i as e,t}from"./dist-Bc2tm86q.js";async function n(n=process.cwd()){let r=await e(n),i=await t(n);return r!==void 0&&r.mode===`pre`?{preState:r,changesets:i.filter(e=>!e.id.startsWith(`pre/`))}:{preState:void 0,changesets:i}}export{n as t};
+98
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{A as e,j as t,m as n,n as r,o as i,y as a}from"./utils-CAuP846_.js";import{t as o}from"./readChangesetState-D-vw_tSH.js";import s from"node:fs/promises";import c from"node:path";import l from"node:os";try{await u()}catch(t){e(t.message)}async function u(){let e=i(`cwd`)||process.cwd();await n(e);let r=await d(e);if(t(`mode`,r.mode),r.mode===`publish`){let e=await a.uploadArtifact(c.basename(r.publishPlanPath,`.json`),[r.publishPlanPath],c.dirname(r.publishPlanPath),{skipArchive:!0,retentionDays:30});if(e.id===void 0)throw Error(`Publish plan artifact upload did not return an artifact id`);t(`publish-plan-artifact-id`,String(e.id))}}async function d(e){let{changesets:t}=await o(e);if(t.length>0)return t.some(e=>e.releases.length>0)?{mode:`version`}:{mode:`none`};let n=c.join(process.env.RUNNER_TEMP??await s.realpath(l.tmpdir()),`changeset-publish-plan-${Date.now()}`,`publish-plan.json`);return await r([`publish-plan`,`--output`,n],{cwd:e,env:process.env}),(await f(n)).length===0?{mode:`none`}:{mode:`publish`,publishPlanPath:n}}async function f(e){let t;try{t=await s.readFile(e,`utf8`)}catch(t){throw Error(`Failed to read publish plan at ${e}`,{cause:t})}let n;try{n=JSON.parse(t)}catch(t){throw Error(`Failed to parse publish plan at ${e}`,{cause:t})}if(typeof n!=`object`||!n||!(`version`in n)||typeof n.version!=`number`||!(`plan`in n)||!Array.isArray(n.plan))throw Error(`Invalid publish plan at ${e}: expected { version: number; plan: unknown[] }`);return n.plan}export{};
+228
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{A as e,D as t,f as n,j as r,m as i,o as a,s as o}from"./utils-CAuP846_.js";import{n as s,r as c}from"./run-NkR1hNWV.js";try{await l()}catch(t){e(t.message)}async function l(){let e=a(`cwd`)||process.cwd();await i(e),n();let l=o(`github-token`),u=a(`script`),d=o(`commit-message`),f=o(`pr-title`),p=a(`pr-draft`),m=a(`pr-base-branch`),h=t(`push-with-git-cli`);if(p!==void 0&&p!==`always`&&p!==`create`)throw Error(`Invalid pr-draft input: ${p}`);let g=new c({cwd:e,githubToken:l,pushWithGitCli:h}),{pullRequestNumber:_}=await s({script:u,github:g,cwd:e,prTitle:f,commitMessage:d,hasPublishScript:!0,prDraft:p,branch:m});r(`pr-number`,String(_))}export{};
+2 -1
View File
@@ -18,8 +18,9 @@ This action packs publishable packages into tarballs, complements [changesets/ac
<!-- api-start --> <!-- api-start -->
| Inputs | Description | | Inputs | Description |
| -------------------------- | --------------------------------------------------------------------- | | -------------------------- | --------------------------------------------------------------------------------------- |
| `publish-plan-artifact-id` | Artifact id for a publish plan generated by the select-mode subaction | | `publish-plan-artifact-id` | Artifact id for a publish plan generated by the select-mode subaction |
| `cwd` | The working directory to execute Changesets in. Defaults to the root of the repository. |
| Outputs | Description | | Outputs | Description |
| ---------------------- | ------------------------------------------- | | ---------------------- | ------------------------------------------- |
+3
View File
@@ -7,6 +7,9 @@ inputs:
publish-plan-artifact-id: publish-plan-artifact-id:
description: "Artifact id for a publish plan generated by the select-mode subaction" description: "Artifact id for a publish plan generated by the select-mode subaction"
required: false required: false
cwd:
description: "The working directory to execute Changesets in. Defaults to the root of the repository."
required: false
outputs: outputs:
pack-dir-artifact-id: pack-dir-artifact-id:
description: "Artifact id for the packed output directory" description: "Artifact id for the packed output directory"
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@changesets/action", "name": "@changesets/action",
"version": "2.0.0", "version": "2.1.0",
"private": true, "private": true,
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
+1
View File
@@ -25,6 +25,7 @@ This action publishes packages to npm.
| `pack-dir-artifact-id` | Artifact id for packed publish output generated by the pack subaction | | `pack-dir-artifact-id` | Artifact id for packed publish output generated by the pack subaction |
| `create-github-releases` | Whether to create Github releases after publish | | `create-github-releases` | Whether to create Github releases after publish |
| `push-git-tags` | Whether to create git tags after publish. If `create-github-releases` is set to `true`, this option will also always be `true`. | | `push-git-tags` | Whether to create git tags after publish. If `create-github-releases` is set to `true`, this option will also always be `true`. |
| `cwd` | The working directory to execute Changesets in. Defaults to the root of the repository. |
| Outputs | Description | | Outputs | Description |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
+3
View File
@@ -26,6 +26,9 @@ inputs:
this option will also always be `true`. this option will also always be `true`.
required: false required: false
default: true default: true
cwd:
description: "The working directory to execute Changesets in. Defaults to the root of the repository."
required: false
outputs: outputs:
published: published:
description: A "true" or "false" string value to indicate whether a publishing has happened or not description: A "true" or "false" string value to indicate whether a publishing has happened or not
+3 -1
View File
@@ -20,7 +20,9 @@ This action selects the mode to run a Changesets workflow:
<!-- api-start --> <!-- api-start -->
Inputs: _none_ | Inputs | Description |
| ------ | --------------------------------------------------------------------------------------- |
| `cwd` | The working directory to execute Changesets in. Defaults to the root of the repository. |
| Outputs | Description | | Outputs | Description |
| -------------------------- | ---------------------------------------------------------------------------- | | -------------------------- | ---------------------------------------------------------------------------- |
+4 -1
View File
@@ -3,7 +3,10 @@ description: Whether to version or publish in the current repo state
runs: runs:
using: node24 using: node24
main: ../dist/select-mode.js main: ../dist/select-mode.js
inputs: {} inputs:
cwd:
description: "The working directory to execute Changesets in. Defaults to the root of the repository."
required: false
outputs: outputs:
mode: mode:
description: "The mode to use for the current repo state: 'version', 'publish', or 'none'." description: "The mode to use for the current repo state: 'version', 'publish', or 'none'."
+1 -2
View File
@@ -11,8 +11,7 @@ import {
} from "./utils.ts"; } from "./utils.ts";
(async () => { (async () => {
// If the user needs to change the cwd, set `working-directory` in the step instead const cwd = getOptionalInput("cwd") || process.cwd();
const cwd = process.cwd();
await validateChangesetsCliVersion(cwd); await validateChangesetsCliVersion(cwd);
throwOnRenamedInputs({ throwOnRenamedInputs({
+1 -2
View File
@@ -17,8 +17,7 @@ try {
} }
async function main() { async function main() {
// If the user needs to change the cwd, set `working-directory` in the step instead const cwd = getOptionalInput("cwd") || process.cwd();
const cwd = process.cwd();
await validateChangesetsCliVersion(cwd); await validateChangesetsCliVersion(cwd);
const publishPlanArtifactId = getOptionalInput("publish-plan-artifact-id"); const publishPlanArtifactId = getOptionalInput("publish-plan-artifact-id");
+2 -2
View File
@@ -53,7 +53,7 @@ Latest commit: ${commitSha}
${getReleasePlanMessage(releasePlan)} ${getReleasePlanMessage(releasePlan)}
Not sure what this means? [Click here to learn what changesets are](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md). Not sure what this means? [Click here to learn what changesets are](https://changesets.dev/faq).
[Click here if you're a maintainer who wants to add another changeset to this PR](${newChangesetUrl})`; [Click here if you're a maintainer who wants to add another changeset to this PR](${newChangesetUrl})`;
} }
@@ -72,7 +72,7 @@ Merging this PR will not cause a version bump for any packages. If these changes
${getReleasePlanMessage(releasePlan)} ${getReleasePlanMessage(releasePlan)}
[Click here to learn what changesets are, and how to add one](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md). [Click here to learn what changesets are, and how to add one](https://changesets.dev/faq).
[Click here if you're a maintainer who wants to add a changeset to this PR](${newChangesetUrl})`; [Click here if you're a maintainer who wants to add a changeset to this PR](${newChangesetUrl})`;
} }
+1 -2
View File
@@ -17,8 +17,7 @@ try {
} }
async function main() { async function main() {
// If the user needs to change the cwd, set `working-directory` in the step instead const cwd = getOptionalInput("cwd") || process.cwd();
const cwd = process.cwd();
await validateChangesetsCliVersion(cwd); await validateChangesetsCliVersion(cwd);
const githubToken = getRequiredInput("github-token"); const githubToken = getRequiredInput("github-token");
+7 -3
View File
@@ -22,8 +22,12 @@ vi.mock("@actions/github", () => ({
graphql: mockedGraphql, graphql: mockedGraphql,
}), }),
})); }));
vi.mock("@actions/core", { spy: true }); vi.mock("@actions/core", async (importOriginal) => ({
const mockedWarning = vi.mocked(core.warning); ...(await importOriginal<typeof import("@actions/core")>()),
error: vi.fn(),
notice: vi.fn(),
warning: vi.fn(),
}));
vi.mock("@changesets/ghcommit"); vi.mock("@changesets/ghcommit");
let mockedGithubMethods = { let mockedGithubMethods = {
@@ -133,7 +137,7 @@ describe("publish", () => {
}); });
expect(result).toEqual({ published: false, exitCode: 0 }); expect(result).toEqual({ published: false, exitCode: 0 });
expect(mockedWarning).toHaveBeenCalledWith( expect(core.warning).toHaveBeenCalledWith(
expect.stringContaining( expect.stringContaining(
"GitHub releases and git tags cannot be created without this output", "GitHub releases and git tags cannot be created without this output",
), ),
+6 -2
View File
@@ -4,7 +4,11 @@ import path from "node:path";
import artifact from "@actions/artifact"; import artifact from "@actions/artifact";
import * as core from "@actions/core"; import * as core from "@actions/core";
import readChangesetState from "../readChangesetState.ts"; import readChangesetState from "../readChangesetState.ts";
import { execChangesetsCli, validateChangesetsCliVersion } from "../utils.ts"; import {
execChangesetsCli,
getOptionalInput,
validateChangesetsCliVersion,
} from "../utils.ts";
type ModeResult = type ModeResult =
| { | {
@@ -27,7 +31,7 @@ try {
} }
async function main() { async function main() {
const cwd = process.cwd(); const cwd = getOptionalInput("cwd") || process.cwd();
await validateChangesetsCliVersion(cwd); await validateChangesetsCliVersion(cwd);
const result = await getMode(cwd); const result = await getMode(cwd);
+1 -2
View File
@@ -15,8 +15,7 @@ try {
} }
async function main() { async function main() {
// If the user needs to change the cwd, set `working-directory` in the step instead const cwd = getOptionalInput("cwd") || process.cwd();
const cwd = process.cwd();
await validateChangesetsCliVersion(cwd); await validateChangesetsCliVersion(cwd);
throwOnRemovedCommitModeInput(); throwOnRemovedCommitModeInput();
+1
View File
@@ -31,6 +31,7 @@ This action versions packages and creates or updates a pull request with the cha
| `pr-draft` | Controls draft PR behavior. Use 'create' to create new version PRs as draft, or 'always' to also convert existing version PRs back to draft when updating them. | | `pr-draft` | Controls draft PR behavior. Use 'create' to create new version PRs as draft, or 'always' to also convert existing version PRs back to draft when updating them. |
| `pr-base-branch` | Sets the base branch of the PR. Defaults to `github.ref_name`. | | `pr-base-branch` | Sets the base branch of the PR. Defaults to `github.ref_name`. |
| `push-with-git-cli` | Whether to use the Git CLI instead of the GitHub API to push release commits. Defaults to `false`. When using the GitHub API, commits are signed using GitHub's GPG key and attributed to the user or app that owns the `github-token`. | | `push-with-git-cli` | Whether to use the Git CLI instead of the GitHub API to push release commits. Defaults to `false`. When using the GitHub API, commits are signed using GitHub's GPG key and attributed to the user or app that owns the `github-token`. |
| `cwd` | The working directory to execute Changesets in. Defaults to the root of the repository. |
| Outputs | Description | | Outputs | Description |
| ----------- | --------------------------------------------------- | | ----------- | --------------------------------------------------- |
+3
View File
@@ -34,6 +34,9 @@ inputs:
GPG key and attributed to the user or app that owns the `github-token`. GPG key and attributed to the user or app that owns the `github-token`.
required: false required: false
default: false default: false
cwd:
description: "The working directory to execute Changesets in. Defaults to the root of the repository."
required: false
outputs: outputs:
pr-number: pr-number:
description: The pull request number that was created or updated description: The pull request number that was created or updated