From f4b1d8010528b83ac5de75b8deaf8968320988b8 Mon Sep 17 00:00:00 2001 From: cruldra Date: Thu, 3 Sep 2026 05:43:01 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(vscode):=20worktree=20?= =?UTF-8?q?=E5=A4=8D=E7=94=A8=E6=B5=8B=E8=AF=95=E5=9C=A8=20macOS=20?= =?UTF-8?q?=E4=B8=8A=E6=8C=89=E7=9C=9F=E5=AE=9E=E8=B7=AF=E5=BE=84=E6=AF=94?= =?UTF-8?q?=E8=BE=83=EF=BC=8C=E9=A1=BA=E6=89=8B=E6=B8=85=E6=8E=89=E6=97=A7?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude-Session: https://claude.ai/code/session_01KDcq9HcrVLs2c9tkRxasub --- vscode/package.json | 2 +- vscode/src/git/release.ts | 2 +- vscode/test/git/release.test.ts | 10 +++++----- vscode/test/git/worktreeFromRemote.test.ts | 6 ++++-- vscode/webview-ui/src/lib/cherryPickView.test.ts | 2 +- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/vscode/package.json b/vscode/package.json index f2f2efe..d40bbc8 100644 --- a/vscode/package.json +++ b/vscode/package.json @@ -2,7 +2,7 @@ "publisher": "clurdra", "name": "superpowers-vscode-clurdra", "displayName": "Superpowers-clurdra", - "version": "0.2.117", + "version": "0.2.118", "packageManager": "pnpm@10.27.0", "description": "Superpowers specs and plans Kanban explorer", "author": "clurdra", diff --git a/vscode/src/git/release.ts b/vscode/src/git/release.ts index 54027d0..d6bdb81 100644 --- a/vscode/src/git/release.ts +++ b/vscode/src/git/release.ts @@ -268,7 +268,7 @@ export async function listUnreleasedCommits(o: { cwd: string, devBranch: string, ) if (!out) return [] - const commits = out.split('\x1e').flatMap((chunk) => { + const commits = out.split('\x1E').flatMap((chunk) => { const trimmed = chunk.replace(/^\n+/, '').trimEnd() if (!trimmed) return [] diff --git a/vscode/test/git/release.test.ts b/vscode/test/git/release.test.ts index 5597d13..bed3b09 100644 --- a/vscode/test/git/release.test.ts +++ b/vscode/test/git/release.test.ts @@ -7,14 +7,14 @@ import { cherryPickToRelease, cutRelease, getReleaseStatus, + groupCommitsByPr, + indexUnreleasedByMergePr, listReleaseBranches, listUnreleasedCommits, normalizeReleasePrefix, + parseGiteaMergeSubject, pickCurrentRelease, todayReleaseBranch, - groupCommitsByPr, - parseGiteaMergeSubject, - indexUnreleasedByMergePr, } from '../../src/git/release' const gitEnv = { ...process.env, GIT_CONFIG_NOSYSTEM: '1', GIT_CONFIG_GLOBAL: '/dev/null', GIT_TERMINAL_PROMPT: '0', GIT_AUTHOR_NAME: 't', GIT_AUTHOR_EMAIL: 't@t', GIT_COMMITTER_NAME: 't', GIT_COMMITTER_EMAIL: 't@t' } @@ -60,7 +60,7 @@ describe('纯函数', () => { expect(pickCurrentRelease('release/', ['main'])).toBeUndefined() }) it('parseGiteaMergeSubject 认 Gitea 合并说明', () => { - expect(parseGiteaMergeSubject("Merge pull request '连续包月会员订阅体系' (#260) from feature/monthly-membership into main")).toEqual({ + expect(parseGiteaMergeSubject('Merge pull request \'连续包月会员订阅体系\' (#260) from feature/monthly-membership into main')).toEqual({ number: 260, title: '连续包月会员订阅体系', }) @@ -135,7 +135,7 @@ describe('集成', () => { const a = commit(fx.peer, 'b.txt', 'b', 'fix(admin): 会员档位隐藏') const b = commit(fx.peer, 'c.txt', 'c', 'fix(membership): 年付月度发卡') git(fx.peer, ['checkout', 'main']) - git(fx.peer, ['merge', '--no-ff', '-m', "Merge pull request '连续包月会员订阅体系' (#260) from feature into main", 'feature']) + git(fx.peer, ['merge', '--no-ff', '-m', 'Merge pull request \'连续包月会员订阅体系\' (#260) from feature into main', 'feature']) git(fx.peer, ['push', 'origin', 'main']) git(fx.repo, ['fetch', 'origin']) const map = await indexUnreleasedByMergePr({ diff --git a/vscode/test/git/worktreeFromRemote.test.ts b/vscode/test/git/worktreeFromRemote.test.ts index ae33b3e..791ea28 100644 --- a/vscode/test/git/worktreeFromRemote.test.ts +++ b/vscode/test/git/worktreeFromRemote.test.ts @@ -1,5 +1,5 @@ import { execFileSync } from 'node:child_process' -import { existsSync, promises as fsp, rmSync, writeFileSync } from 'node:fs' +import { existsSync, promises as fsp, realpathSync, rmSync, writeFileSync } from 'node:fs' import * as os from 'node:os' import * as path from 'node:path' import { afterEach, describe, expect, it } from 'vitest' @@ -24,7 +24,9 @@ interface Fixture { root: string, origin: string, repo: string, templatePath: st /** origin(bare)← 同事的 clone push feature 分支;repo 是接管方的 clone,只有 main。 */ async function setup(): Promise { - const root = await fsp.mkdtemp(path.join(os.tmpdir(), 'sw-remote-')) + // macOS 的 tmpdir 是 /var → /private/var 的软链,git worktree list 报的是真实路径; + // 夹具根目录先取真实路径,复用分支返回的路径才能和模板路径按字符串相等。 + const root = realpathSync(await fsp.mkdtemp(path.join(os.tmpdir(), 'sw-remote-'))) const origin = path.join(root, 'origin.git') git(root, ['init', '--bare', '-b', 'main', origin]) const peer = path.join(root, 'peer') diff --git a/vscode/webview-ui/src/lib/cherryPickView.test.ts b/vscode/webview-ui/src/lib/cherryPickView.test.ts index ff2422c..855f395 100644 --- a/vscode/webview-ui/src/lib/cherryPickView.test.ts +++ b/vscode/webview-ui/src/lib/cherryPickView.test.ts @@ -1,5 +1,5 @@ -import { describe, expect, it } from 'vitest' import type { ReleaseCommitGroup } from './messages' +import { describe, expect, it } from 'vitest' import { filterCherryPickGroups, uniqueAuthors } from './cherryPickView' const groups: ReleaseCommitGroup[] = [