From 378ab441298bca8527b88979f4f2de4aa215da6e Mon Sep 17 00:00:00 2001 From: Bhagya Mudgal Date: Sat, 5 Sep 2026 03:23:46 +0530 Subject: [PATCH] fix: stop select prompts duplicating options on arrow-key navigation The 0.x @clack/prompts select renderer leaves stale option rows on screen when moving with the arrow keys, so the editor and worktree pickers showed repeated entries. Upstream fixed the renderer in 1.x with no backport, so move to @clack/prompts 1.7 and adapt the two text validators to its narrower value type. --- .changeset/tidy-pandas-repeat.md | 5 +++++ bun.lock | 10 +++------- package.json | 2 +- src/commands/setup.ts | 4 ++-- 4 files changed, 11 insertions(+), 10 deletions(-) create mode 100644 .changeset/tidy-pandas-repeat.md diff --git a/.changeset/tidy-pandas-repeat.md b/.changeset/tidy-pandas-repeat.md new file mode 100644 index 0000000..0e5a18a --- /dev/null +++ b/.changeset/tidy-pandas-repeat.md @@ -0,0 +1,5 @@ +--- +"worktree-cli": patch +--- + +Fix interactive select lists duplicating options when navigating with arrow keys by upgrading @clack/prompts to 1.x diff --git a/bun.lock b/bun.lock index 3265f8b..cd3fce9 100644 --- a/bun.lock +++ b/bun.lock @@ -5,7 +5,7 @@ "": { "name": "worktree-cli", "dependencies": { - "@clack/prompts": "^0.9", + "@clack/prompts": "^1.7.0", "@drizzle-team/brocli": "^0.10", "zod": "^4", }, @@ -54,9 +54,9 @@ "@changesets/write": ["@changesets/write@1.0.1", "", { "dependencies": { "@changesets/format": "^0.1.1", "@changesets/types": "^7.0.0", "human-id": "^4.2.0" } }, "sha512-q/ThtP9gcnEP6xlv7LrY26C2mHqdGBti/MmOVngt/M/oIGYkssmQGxPK9WzBNt2juVcH/vml2WQ+ra8LXYOTaA=="], - "@clack/core": ["@clack/core@0.4.1", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA=="], + "@clack/core": ["@clack/core@1.4.3", "", { "dependencies": { "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ=="], - "@clack/prompts": ["@clack/prompts@0.9.1", "", { "dependencies": { "@clack/core": "0.4.1", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg=="], + "@clack/prompts": ["@clack/prompts@1.7.0", "", { "dependencies": { "@clack/core": "1.4.3", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A=="], "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], @@ -334,8 +334,6 @@ "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], - "@changesets/cli/@clack/prompts": ["@clack/prompts@1.7.0", "", { "dependencies": { "@clack/core": "1.4.3", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A=="], - "@changesets/parse/yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], @@ -351,7 +349,5 @@ "log-update/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - - "@changesets/cli/@clack/prompts/@clack/core": ["@clack/core@1.4.3", "", { "dependencies": { "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ=="], } } diff --git a/package.json b/package.json index c2d97d3..0dc4771 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ ] }, "dependencies": { - "@clack/prompts": "^0.9", + "@clack/prompts": "^1.7.0", "@drizzle-team/brocli": "^0.10", "zod": "^4" }, diff --git a/src/commands/setup.ts b/src/commands/setup.ts index 0dca71e..ef59a20 100644 --- a/src/commands/setup.ts +++ b/src/commands/setup.ts @@ -117,7 +117,7 @@ async function promptForBase( message: "Enter default base branch", initialValue: currentBase ?? candidates[0] ?? "", validate: function (value) { - if (value.trim() === "") return "Base branch is required."; + if ((value ?? "").trim() === "") return "Base branch is required."; return undefined; }, }); @@ -133,7 +133,7 @@ async function promptForDir(currentDir: string): Promise { message: "Worktree directory name", initialValue: currentDir, validate: function (value) { - return validateDirValue(value.trim()) ?? undefined; + return validateDirValue((value ?? "").trim()) ?? undefined; }, }); if (p.isCancel(entered)) {