From 00982f40359e106a9e8f272ae400d78226636a5b Mon Sep 17 00:00:00 2001 From: btea <2356281422@qq.com> Date: Thu, 15 Oct 2026 11:05:13 +0800 Subject: [PATCH 1/2] fix(progress): the progress returns isCancelled without real-time refresh --- packages/prompts/src/progress-bar.ts | 4 +++- packages/prompts/src/spinner.ts | 2 ++ packages/prompts/test/progress-bar.test.ts | 9 +++++++++ packages/prompts/test/spinner.test.ts | 12 ++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/prompts/src/progress-bar.ts b/packages/prompts/src/progress-bar.ts index 90079a10..713524cc 100644 --- a/packages/prompts/src/progress-bar.ts +++ b/packages/prompts/src/progress-bar.ts @@ -67,7 +67,9 @@ export function progress({ error: spin.error, clear: spin.clear, advance, - isCancelled: spin.isCancelled, + get isCancelled() { + return spin.isCancelled; + }, message: (msg: string) => advance(0, msg), }; } diff --git a/packages/prompts/src/spinner.ts b/packages/prompts/src/spinner.ts index 4db8dbdd..258cff35 100644 --- a/packages/prompts/src/spinner.ts +++ b/packages/prompts/src/spinner.ts @@ -134,6 +134,7 @@ export const spinner = ({ const start = (msg = ''): void => { isSpinnerActive = true; + isCancelled = false; _message = removeTrailingDots(msg); _origin = performance.now(); registerHooks(); @@ -186,6 +187,7 @@ export const spinner = ({ const _stop = (msg = '', code = 0, silent: boolean = false): void => { if (!isSpinnerActive) return; isSpinnerActive = false; + isCancelled = code === 1; clearInterval(loop); if (!accessible) { clearPrevMessage(); diff --git a/packages/prompts/test/progress-bar.test.ts b/packages/prompts/test/progress-bar.test.ts index a64061c8..377930ca 100644 --- a/packages/prompts/test/progress-bar.test.ts +++ b/packages/prompts/test/progress-bar.test.ts @@ -99,6 +99,15 @@ describe.each(['true', 'false'])('prompts - progress (isCI = %s)', (isCI) => { expect(output.buffer).toMatchSnapshot(); }); + test('tracks cancellation', () => { + const result = prompts.progress({ output }); + + result.start(); + result.cancel(); + + expect(result.isCancelled).toBe(true); + }); + test('renders error symbol when calling error()', () => { const result = prompts.progress({ output }); diff --git a/packages/prompts/test/spinner.test.ts b/packages/prompts/test/spinner.test.ts index 18896121..e23dd66c 100644 --- a/packages/prompts/test/spinner.test.ts +++ b/packages/prompts/test/spinner.test.ts @@ -130,6 +130,18 @@ describe.each(['true', 'false'])('spinner (isCI = %s)', (isCI) => { expect(output.buffer).toMatchSnapshot(); }); + test('tracks cancellation and resets it on restart', () => { + const result = prompts.spinner({ output }); + + result.start(); + result.cancel(); + expect(result.isCancelled).toBe(true); + + result.start(); + expect(result.isCancelled).toBe(false); + result.stop(); + }); + test('renders error symbol when calling error()', () => { const result = prompts.spinner({ output }); From 76d7c55768a002f8c581ff0f0e1e6f51c095f9e6 Mon Sep 17 00:00:00 2001 From: btea <2356281422@qq.com> Date: Thu, 15 Oct 2026 11:11:09 +0800 Subject: [PATCH 2/2] fix: add changeset --- .changeset/orange-dragons-rescue.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/orange-dragons-rescue.md diff --git a/.changeset/orange-dragons-rescue.md b/.changeset/orange-dragons-rescue.md new file mode 100644 index 00000000..daafc677 --- /dev/null +++ b/.changeset/orange-dragons-rescue.md @@ -0,0 +1,6 @@ +--- +"@clack/prompts": patch +"@clack/core": patch +--- + +Fix that isCancelled returned after calling cancel and start methods in progress does not refresh.