🐛 fix(vscode): 修好单个会话 tab 从看板点回时不反向选中所属工单

Claude-Session: https://claude.ai/code/session_01FAA5YEyR7fzWj7gYQiLSqy
This commit is contained in:
cruldra committed 2026-08-26 13:42:30 +08:00
1 parent eee0170a63
commit 06fb5ecec2
4 files changed
+157 -77

No files matched your search

@@ -0,0 +1,74 @@
import { describe, expect, it } from 'vitest'
import { findTerminalByTabLabel, focusedTerminal, FocusedTerminalTracker } from './terminalTabs'
const t371 = { name: 'issue-371-测试' }
const t257 = { name: 'issue-257-实施 (feature/billing)' }
const t37 = { name: 'issue-37-测试' }
const terminals = [t37, t371, t257]
describe('findTerminalByTabLabel', () => {
it('精确匹配优先', () => {
expect(findTerminalByTabLabel(terminals, 'issue-371-测试')).toBe(t371)
})
it('tab label 被 OSC title 追加后缀时按前缀匹配', () => {
expect(findTerminalByTabLabel(terminals, 'issue-371-测试 (main)')).toBe(t371)
})
it('terminal name 带后缀而 label 是原名时也能匹配', () => {
expect(findTerminalByTabLabel(terminals, 'issue-257-实施')).toBe(t257)
})
it('issue-37 不会误配 issue-371', () => {
expect(findTerminalByTabLabel(terminals, 'issue-37-测试')).toBe(t37)
})
it('找不到返回 undefined', () => {
expect(findTerminalByTabLabel(terminals, 'Project Dashboard')).toBeUndefined()
})
})
describe('focusedTerminal', () => {
const isTerminal = (input: unknown): boolean => input === 'terminal'
it('活动 tab 是终端 → 解析出对应终端', () => {
expect(focusedTerminal({ label: 'issue-371-测试', input: 'terminal' }, isTerminal, terminals)).toBe(t371)
})
it('活动 tab 不是终端(看板 webview)→ undefined', () => {
expect(focusedTerminal({ label: 'Superpowers Kanban', input: 'webview' }, isTerminal, terminals)).toBeUndefined()
})
it('没有活动 tab → undefined', () => {
expect(focusedTerminal(undefined, isTerminal, terminals)).toBeUndefined()
})
})
describe('focusedTerminalTracker', () => {
it('只开一个终端 tab:点回看板再点回该 tab 要再次触发', () => {
const tracker = new FocusedTerminalTracker<{ name: string }>()
expect(tracker.sync(t371)).toBe(t371)
expect(tracker.sync(undefined)).toBeUndefined()
expect(tracker.sync(t371)).toBe(t371)
})
it('同一终端重复上报(label 改写)不触发', () => {
const tracker = new FocusedTerminalTracker<{ name: string }>()
expect(tracker.sync(t371)).toBe(t371)
expect(tracker.sync(t371)).toBeUndefined()
expect(tracker.sync(t371)).toBeUndefined()
})
it('在终端之间切换触发新终端', () => {
const tracker = new FocusedTerminalTracker<{ name: string }>()
expect(tracker.sync(t371)).toBe(t371)
expect(tracker.sync(t257)).toBe(t257)
expect(tracker.sync(t371)).toBe(t371)
})
it('焦点离开终端不触发', () => {
const tracker = new FocusedTerminalTracker<{ name: string }>()
tracker.sync(t371)
expect(tracker.sync(undefined)).toBeUndefined()
})
})