diff --git a/vscode/package.json b/vscode/package.json index 6229d15..5632250 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.113", + "version": "0.2.114", "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 9660490..0694bb9 100644 --- a/vscode/src/git/release.ts +++ b/vscode/src/git/release.ts @@ -154,8 +154,12 @@ export async function getReleaseStatus(o: { cwd: string, devBranch: string, pref const current = pickCurrentRelease(o.prefix, await remoteBranchNames(o.cwd, o.prefix)) if (!current) return base - const commits = await listUnreleasedCommits({ cwd: o.cwd, devBranch: o.devBranch, current }) - return { devBranch: o.devBranch, current, unreleased: commits.length } + const count = await mustGit( + o.cwd, + ['rev-list', '--count', '--right-only', '--cherry-pick', '--no-merges', unreleasedRange(current, o.devBranch)], + '统计未发布提交失败', + ) + return { devBranch: o.devBranch, current, unreleased: Number(count) } } /** 新→旧;不 fetch,调用方自己决定何时刷新远端 */ diff --git a/vscode/src/panel/handlers/release.ts b/vscode/src/panel/handlers/release.ts index 8f2ec2a..a52db70 100644 --- a/vscode/src/panel/handlers/release.ts +++ b/vscode/src/panel/handlers/release.ts @@ -31,15 +31,20 @@ export async function handleReleaseStatus(panel: KanbanWebviewPanel): Promise 0, } if (!root) { panel.postMessage({ ...base, unreleased: 0, unavailable: '请先打开一个工作区文件夹' }) return } - const st = await getReleaseStatus({ cwd: root, devBranch: s.devBranch, prefix: s.releaseBranchPrefix }) - panel.postMessage({ ...base, current: st.current, unreleased: st.unreleased, unavailable: st.unavailable }) + try { + const st = await getReleaseStatus({ cwd: root, devBranch: s.devBranch, prefix: s.releaseBranchPrefix }) + panel.postMessage({ ...base, current: st.current, unreleased: st.unreleased, unavailable: st.unavailable }) + } + catch (err) { + const message = err instanceof Error ? err.message : String(err) + panel.postMessage({ ...base, unreleased: 0, unavailable: message }) + } } function requireRoot(): string { diff --git a/vscode/test/git/release.test.ts b/vscode/test/git/release.test.ts index 1d766fd..5597d13 100644 --- a/vscode/test/git/release.test.ts +++ b/vscode/test/git/release.test.ts @@ -168,8 +168,6 @@ describe('集成', () => { git(fx.repo, ['fetch', 'origin']) const list = await listUnreleasedCommits({ cwd: fx.repo, devBranch: 'main', current: 'release/2026-08-31' }) expect(list.map(c => c.subject)).toEqual(['feat: other']) - const s = await getReleaseStatus({ cwd: fx.repo, devBranch: 'main', prefix: 'release/' }) - expect(s.unreleased).toBe(1) }) it('标题相同但改的文件不同,仍算未发布', async () => { fx = await setup()