Compare commits

...
Author SHA1 Message Date
github-actions[bot] ee7a001fa4 v2.0.0-next.1 2026-06-23 12:53:55 +00:00
changesets-org-version-bot[bot]andgithub-actions[bot] 0490518932 Version Packages (next) (#664)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-23 11:29:25 +00:00
Mateusz Burzyński dc29b738b5 Fix the /version subaction to not crash on missing pr-base-branch input (#666)
* use `getOptionalInput` consistently

* introduce `getRequiredInput`

* add changeset
2026-06-23 11:26:43 +00:00
Mateusz Burzyński ccb38113ea Fix the computed publish plan path passed internally to changeset pack by the /pack subaction (#663)
* Fix the computed publish plan path passed internally to `changeset pack` by the `/pack` subaction

* fix it
2026-06-23 10:00:39 +00:00
Mateusz Burzyński cf37561cd9 Fix description of the /version's script input (#665) 2026-06-23 09:55:13 +00:00
Mateusz Burzyński 5c88881fff Fixed usage of --from-publish-plan flag used by the /pack subaction (#662) 2026-06-23 09:25:48 +00:00
27 changed files with 473 additions and 30 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"@changesets/action": patch
---
Fix the computed publish plan path passed internally to `changeset pack` by the `/pack` subaction.
+8 -1
View File
@@ -4,5 +4,12 @@
"initialVersions": {
"@changesets/action": "1.9.0"
},
"changesets": ["eight-clocks-pull", "eighty-doors-swim", "lemon-turtles-itch"]
"changesets": [
"all-cars-grin",
"eight-clocks-pull",
"eighty-doors-swim",
"lemon-turtles-itch",
"ready-mangos-boil",
"silent-tips-dance"
]
}
+5
View File
@@ -0,0 +1,5 @@
---
"@changesets/action": patch
---
Fixed usage of `--from-publish-plan` flag used by the `/pack` subaction
+5
View File
@@ -0,0 +1,5 @@
---
"@changesets/action": patch
---
Fix the `/version` subaction to not crash on missing `pr-base-branch` input. This input is meant to be optional.
+10
View File
@@ -1,5 +1,15 @@
# @changesets/action
## 2.0.0-next.1
### Patch Changes
- [#663](https://github.com/changesets/action/pull/663) [`ccb3811`](https://github.com/changesets/action/commit/ccb38113eaaa4a13eb6aabe09520e49cc8519b84) Thanks [@Andarist](https://github.com/Andarist)! - Fix the computed publish plan path passed internally to `changeset pack` by the `/pack` subaction.
- [#662](https://github.com/changesets/action/pull/662) [`5c88881`](https://github.com/changesets/action/commit/5c88881fff1f0d8b055d4a2d3a74a8ce843db6f3) Thanks [@Andarist](https://github.com/Andarist)! - Fixed usage of `--from-publish-plan` flag used by the `/pack` subaction
- [#666](https://github.com/changesets/action/pull/666) [`dc29b73`](https://github.com/changesets/action/commit/dc29b738b532d9e95f46b9bf493e2e3fdf48a7ed) Thanks [@Andarist](https://github.com/Andarist)! - Fix the `/version` subaction to not crash on missing `pr-base-branch` input. This input is meant to be optional.
## 2.0.0-next.0
### Major Changes
+5 -5
View File
@@ -65,7 +65,7 @@ jobs:
run: pnpm install --frozen-lockfile
- name: Create Release Pull Request
uses: changesets/action@v1
uses: changesets/action@v2
```
#### With Publishing
@@ -103,7 +103,7 @@ jobs:
- name: Create Release Pull Request or Publish to npm
id: changesets
uses: changesets/action@v1
uses: changesets/action@v2
with:
# This expects you to have a script called release which does a build for your packages and calls changeset publish
publish: pnpm release
@@ -170,7 +170,7 @@ jobs:
- name: Create Release Pull Request or Publish to npm
id: changesets
uses: changesets/action@v1
uses: changesets/action@v2
- name: Publish
if: steps.changesets.outputs.hasChangesets == 'false'
@@ -214,7 +214,7 @@ jobs:
run: pnpm install --frozen-lockfile
- name: Create Release Pull Request
uses: changesets/action@v1
uses: changesets/action@v2
with:
# this expects you to have a npm script called version that runs some logic and then calls `changeset version`.
version: pnpm version
@@ -225,7 +225,7 @@ jobs:
If you are using [Yarn Plug'n'Play](https://yarnpkg.com/features/pnp), you should use a custom `version` command so that the action can resolve the `changeset` CLI:
```yaml
- uses: changesets/action@v1
- uses: changesets/action@v2
with:
version: yarn changeset version
# ...
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
import{_ as e,g as t,h as n,m as r,p as i,v as a}from"./get-packages.cjs-Dvdg-NAr.js";import{i as o,n as s,r as c,t as l}from"./run-CRWwTmP3.js";import{r as u,s as d}from"./utils-DQTbg3yF.js";import{t as f}from"./readChangesetState-D8jsqLyj.js";import p from"node:fs/promises";(async()=>{let m=process.env.GITHUB_TOKEN||n(`github-token`);if(!m){e(`Please add the GITHUB_TOKEN to the changesets action`);return}let h=process.cwd(),g=c(m),_=d(`commitMode`)??`git-cli`,v=d(`prDraft`);if(_!==`git-cli`&&_!==`github-api`){e(`Invalid commit mode: ${_}`);return}if(v!==void 0&&v!==`always`&&v!==`create`){e(`Invalid prDraft: ${v}`);return}let y=new o({octokit:_===`github-api`?g:void 0,cwd:h});r(`setupGitUser`)&&(t(`setting git user`),await y.setupUser()),t(`setting GitHub credentials`),await p.writeFile(`${process.env.HOME}/.netrc`,`machine github.com\nlogin github-actions[bot]\npassword ${m}`);let{changesets:b}=await f(h),x=n(`publish`),S=b.length!==0,C=b.some(e=>e.releases.length>0),w=!!x;switch(a(`published`,`false`),a(`publishedPackages`,`[]`),a(`hasChangesets`,String(S)),!0){case!S&&!w:t(`No changesets present or were removed by merging release PR. Not publishing because no publish script found.`);return;case!S&&w:{if(t(`No changesets found. Attempting to publish any unpublished packages to npm`),process.env.NPM_TOKEN){let e=`${process.env.HOME}/.npmrc`;await u(e)?(t(`Found existing user .npmrc file`),(await p.readFile(e,`utf8`)).split(`
`).find(e=>/^\s*\/\/registry\.npmjs\.org\/:[_-]authToken=/i.test(e))?t(`Found existing auth token for the npm registry in the user .npmrc file`):(t(`Didn't find existing auth token for the npm registry in the user .npmrc file, creating one`),await p.appendFile(e,`\n//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\n`))):(t(`No user .npmrc file found, creating one with NPM_TOKEN used as auth token`),await p.writeFile(e,`//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\n`))}else process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN&&process.env.ACTIONS_ID_TOKEN_REQUEST_URL?t(`No NPM_TOKEN found, but OIDC is available - using npm trusted publishing`):t(`No NPM_TOKEN or OIDC available - assuming npm is already authenticated`);let e=await l({script:x,githubToken:m,git:y,octokit:g,createGithubReleases:r(`createGithubReleases`),cwd:h});e.published&&(a(`published`,`true`),a(`publishedPackages`,JSON.stringify(e.publishedPackages))),e.exitCode!==0&&(i(`Publish command exited with code ${e.exitCode}${e.published?`, but some packages were published: ${e.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`),process.exit(e.exitCode));return}case S&&!C:t(`All changesets are empty; not creating PR`);return;case S:{let e=c(m),{pullRequestNumber:t}=await s({script:d(`version`),githubToken:m,git:y,octokit:e,cwd:h,prTitle:d(`title`),commitMessage:d(`commit`),hasPublishScript:w,prDraft:v,branch:d(`branch`)});a(`pullRequestNumber`,String(t));return}}})().catch(t=>{i(t),e(t.message)});export{};
+1
View File
@@ -0,0 +1 @@
import{_ as e,v as t}from"./get-packages.cjs-Dvdg-NAr.js";import{f as n,n as r,s as i,t as a}from"./utils-DQTbg3yF.js";import o from"node:fs/promises";import s from"node:path";import c from"node:os";try{await l()}catch(t){e(t.message)}async function l(){let e=i(`publish-plan-artifact-id`),r=process.cwd(),a=process.env.RUNNER_TEMP??await o.realpath(c.tmpdir()),l=s.join(a,`changeset-pack-${Date.now()}`);await u(r,{outDir:l,publishPlanPath:e?await d(a,Number(e)):void 0});let p=await n.uploadArtifact(`changeset-pack-${Date.now()}`,await f(l),l,{retentionDays:30});if(p.id===void 0)throw Error(`Packed artifact upload did not return an artifact id`);t(`pack-dir-artifact-id`,String(p.id))}async function u(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 d(e,t){let n=await a(e,t,`changeset-publish-plan`);return s.join(n,`publish-plan.json`)}async function f(e){let t=await o.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=s.join(e,t.name);return t.isDirectory()?f(n):[n]}))).flat()}export{};
+1
View File
@@ -0,0 +1 @@
import{_ as e,c as t,g as n,l as r,v as i}from"./get-packages.cjs-Dvdg-NAr.js";import{c as a,s as o}from"./utils-DQTbg3yF.js";try{await s()}catch(t){e(t.message)}async function s(){let e=t.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=o(`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=r(s),h;d&&(n(`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?(n(`Updating existing comment (id: ${h})...`),await m.rest.issues.updateComment({...p,comment_id:h}),i(`comment-id`,h)):(n(`Creating new comment...`),i(`comment-id`,(await m.rest.issues.createComment(p)).data.id)),n(`Done!`)}function c(e){let t=`changesets-action-pr-comment`;return t===e?`<!-- ${t} -->`:`<!-- ${t}:${e} -->`}export{};
+39
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{_ as e,m as t,v as n}from"./get-packages.cjs-Dvdg-NAr.js";import{i as r,r as i,t as a}from"./run-CRWwTmP3.js";import{c as o,s,t as c}from"./utils-DQTbg3yF.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=o(`github-token`),d=s(`script`),f=s(`pack-dir-artifact-id`),p=t(`create-github-releases`),m=process.cwd(),h=i(e),g=await a({script:d,githubToken:e,git:new r({octokit:h,cwd:m}),octokit:h,createGithubReleases:p,cwd:m,fromPackDir:f?await c(process.env.RUNNER_TEMP??await l.realpath(u.tmpdir()),Number(f),`changeset-pack`):void 0});if(g.published?(n(`published`,`true`),n(`published-packages`,JSON.stringify(g.publishedPackages))):n(`published`,`false`),g.exitCode!==0)throw Error(`Publish command exited with code ${g.exitCode}${g.published?`, but some packages were published: ${g.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`)}export{};
+1
View File
@@ -0,0 +1 @@
import{o as e,t}from"./changesets-read.esm-D6fW_L6x.js";async function n(n=process.cwd()){let r=await e(n),i=await t(n);if(r!==void 0&&r.mode===`pre`){let e=new Set(r.changesets);return{preState:r,changesets:i.filter(t=>!e.has(t.id))}}return{preState:void 0,changesets:i}}export{n as t};
+149
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{_ as e,v as t}from"./get-packages.cjs-Dvdg-NAr.js";import{f as n,n as r}from"./utils-DQTbg3yF.js";import{t as i}from"./readChangesetState-D8jsqLyj.js";import a from"node:fs/promises";import o from"node:path";import s from"node:os";try{await c()}catch(t){e(t.message)}async function c(){let e=await l();if(t(`mode`,e.mode),e.mode===`publish`){let r=await n.uploadArtifact(o.basename(e.publishPlanPath,`.json`),[e.publishPlanPath],o.dirname(e.publishPlanPath),{skipArchive:!0,retentionDays:30});if(r.id===void 0)throw Error(`Publish plan artifact upload did not return an artifact id`);t(`publish-plan-artifact-id`,String(r.id))}}async function l(){let{changesets:e}=await i();if(e.length>0)return e.some(e=>e.releases.length>0)?{mode:`version`}:{mode:`none`};let t=process.cwd(),n=o.join(process.env.RUNNER_TEMP??await a.realpath(s.tmpdir()),`changeset-publish-plan-${Date.now()}`,`publish-plan.json`);return await r([`publish-plan`,`--output`,n],{cwd:t,env:process.env}),(await u(n)).length===0?{mode:`none`}:{mode:`publish`,publishPlanPath:n}}async function u(e){let t;try{t=await a.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{};
+80
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{_ as e,g as t,m as n,v as r}from"./get-packages.cjs-Dvdg-NAr.js";import{i,n as a,r as o}from"./run-CRWwTmP3.js";import{c as s,s as c}from"./utils-DQTbg3yF.js";try{await l()}catch(t){e(t.message)}async function l(){let e=s(`github-token`),l=c(`script`),u=s(`commit-message`),d=s(`pr-title`),f=c(`pr-draft`),p=c(`pr-base-branch`),m=c(`commit-mode`)??`git-cli`,h=n(`setup-git-user`);if(f!==void 0&&f!==`always`&&f!==`create`)throw Error(`Invalid pr-draft input: ${f}`);let g=process.cwd(),_=o(e),v=new i({octokit:m===`github-api`?_:void 0,cwd:g});h&&(t(`setting git user`),await v.setupUser());let{pullRequestNumber:y}=await a({script:l,githubToken:e,git:v,octokit:_,cwd:g,prTitle:d,commitMessage:u,hasPublishScript:!0,prDraft:f,branch:p});r(`pr-number`,String(y))}export{};
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@changesets/action",
"version": "2.0.0-next.0",
"version": "2.0.0-next.1",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
+1 -4
View File
@@ -1,13 +1,10 @@
import fs from "node:fs/promises";
import path from "node:path";
import * as core from "@actions/core";
import { Git } from "./git.ts";
import { setupOctokit } from "./octokit.ts";
import readChangesetState from "./readChangesetState.ts";
import { runPublish, runVersion } from "./run.ts";
import { fileExists } from "./utils.ts";
const getOptionalInput = (name: string) => core.getInput(name) || undefined;
import { fileExists, getOptionalInput } from "./utils.ts";
(async () => {
// to maintain compatibility with workflows created before github-token input was introduced
+7 -3
View File
@@ -3,7 +3,11 @@ import os from "node:os";
import path from "node:path";
import artifact from "@actions/artifact";
import * as core from "@actions/core";
import { downloadArtifact, execChangesetsCli } from "../utils.ts";
import {
downloadArtifact,
execChangesetsCli,
getOptionalInput,
} from "../utils.ts";
try {
await main();
@@ -12,7 +16,7 @@ try {
}
async function main() {
const publishPlanArtifactId = core.getInput("publish-plan-artifact-id");
const publishPlanArtifactId = getOptionalInput("publish-plan-artifact-id");
// If the user needs to change the cwd, set `working-directory` in the step instead
const cwd = process.cwd();
@@ -49,7 +53,7 @@ async function pack(
) {
const cliArgs = ["pack", "--out-dir", args.outDir];
if (args.publishPlanPath) {
cliArgs.push("--from-plan", args.publishPlanPath);
cliArgs.push("--from-publish-plan", args.publishPlanPath);
}
await execChangesetsCli(cliArgs, {
+4 -3
View File
@@ -1,5 +1,6 @@
import * as core from "@actions/core";
import * as github from "@actions/github";
import { getOptionalInput, getRequiredInput } from "../utils.ts";
type Octokit = ReturnType<typeof github.getOctokit>;
type CreateCommentParams = NonNullable<
@@ -23,9 +24,9 @@ async function main() {
);
}
const githubToken = core.getInput("github-token", { required: true });
const body = core.getInput("body", { required: true });
const updateId = core.getInput("update-id");
const githubToken = getRequiredInput("github-token");
const body = getRequiredInput("body");
const updateId = getOptionalInput("update-id");
const commentMarker = updateId ? getCommentMarker(updateId) : null;
const commentBody = commentMarker ? `${commentMarker}\n\n${body}` : body;
+8 -4
View File
@@ -4,7 +4,11 @@ import * as core from "@actions/core";
import { Git } from "../git.ts";
import { setupOctokit } from "../octokit.ts";
import { runPublish } from "../run.ts";
import { downloadArtifact } from "../utils.ts";
import {
downloadArtifact,
getOptionalInput,
getRequiredInput,
} from "../utils.ts";
try {
await main();
@@ -13,9 +17,9 @@ try {
}
async function main() {
const githubToken = core.getInput("github-token", { required: true });
const script = core.getInput("script");
const packDirArtifactId = core.getInput("pack-dir-artifact-id");
const githubToken = getRequiredInput("github-token");
const script = getOptionalInput("script");
const packDirArtifactId = getOptionalInput("pack-dir-artifact-id");
const createGithubReleases = core.getBooleanInput("create-github-releases");
// If the user needs to change the cwd, set `working-directory` in the step instead
+3 -1
View File
@@ -64,7 +64,9 @@ async function getMode(): Promise<ModeResult> {
const cwd = process.cwd();
const publishPlanPath = path.join(
process.env.RUNNER_TEMP ?? (await fs.realpath(os.tmpdir())),
`changeset-publish-plan-${Date.now()}.json`,
`changeset-publish-plan-${Date.now()}`,
// we need a stable filename here (in a unique dirname) so the artifact download can find this cleanly
"publish-plan.json",
);
await execChangesetsCli(["publish-plan", "--output", publishPlanPath], {
cwd,
+12
View File
@@ -2,6 +2,7 @@ import fs from "node:fs/promises";
import { createRequire } from "node:module";
import path from "node:path";
import artifact from "@actions/artifact";
import * as core from "@actions/core";
import {
exec,
getExecOutput,
@@ -123,6 +124,17 @@ export function fileExists(filePath: string) {
);
}
export function getOptionalInput(name: string) {
// normalize empty string default return value of `core.getInput` to undefined
return core.getInput(name) || undefined;
}
export function getRequiredInput(name: string) {
// it's just a small utility wrapper, mainly introduced for usage parity with our custom `getOptionalInput`
// note: `core.getBooleanInput` gets used directly as it already normalizes the return value nicely
return core.getInput(name, { required: true });
}
function resolveChangesetsCli(cwd: string) {
return require.resolve("@changesets/cli/bin.js", {
paths: [cwd],
+8 -7
View File
@@ -2,6 +2,7 @@ import * as core from "@actions/core";
import { Git } from "../git.ts";
import { setupOctokit } from "../octokit.ts";
import { runVersion } from "../run.ts";
import { getOptionalInput, getRequiredInput } from "../utils.ts";
try {
await main();
@@ -10,13 +11,13 @@ try {
}
async function main() {
const githubToken = core.getInput("github-token", { required: true });
const script = core.getInput("script");
const commitMessage = core.getInput("commit-message", { required: true });
const prTitle = core.getInput("pr-title", { required: true });
const prDraft = core.getInput("pr-draft") || undefined;
const prBaseBranch = core.getInput("pr-base-branch");
const commitMode = core.getInput("commit-mode") || "git-cli";
const githubToken = getRequiredInput("github-token");
const script = getOptionalInput("script");
const commitMessage = getRequiredInput("commit-message");
const prTitle = getRequiredInput("pr-title");
const prDraft = getOptionalInput("pr-draft");
const prBaseBranch = getOptionalInput("pr-base-branch");
const commitMode = getOptionalInput("commit-mode") ?? "git-cli";
const setupGitUser = core.getBooleanInput("setup-git-user");
// Validations
+1 -1
View File
@@ -9,7 +9,7 @@ inputs:
required: false
default: ${{ github.token }}
script:
description: "The command to use to publish packages"
description: "The command to use to version packages"
required: false
commit-message:
description: "The commit message. Default to `Version Packages`"