开会话原先要先全量拉工单(含每张工单的评论、依赖、PR)做前置锁检查, 再各读一次 state JSON 给 pre-create 钩子和终端图标,几秒后才 createTerminal。 - 锁检查改用主进程已算好的工单快照,快照里没有该工单才回落全量拉取 - state JSON 一次读两处用,且提前发起与本地准备重叠 - 会话行 spinner 由扩展的 session/tab-settled 消息驱动,不再是固定 1.5s 假动画, 消息丢失时 60s 超时兜底 Claude-Session: https://claude.ai/code/session_01Kgmb1LvrPmFX3NoUDB4zZC
26 lines
816 B
TypeScript
26 lines
816 B
TypeScript
import type { Issue } from '../gitea/types'
|
|
|
|
export interface LockedReason {
|
|
locked: boolean
|
|
prerequisiteNumber?: number
|
|
prerequisiteColumn?: string
|
|
}
|
|
|
|
/**
|
|
* 纯判定:工单被未完成的前置挡住才算锁定。快照里找不到工单或前置一律放行,
|
|
* 与 webview 的 `isIssueLocked` 保持同一语义。
|
|
*/
|
|
export function evaluateLockedReason(issues: Issue[], issueNumber: number): LockedReason {
|
|
const issue = issues.find(i => i.number === issueNumber)
|
|
if (!issue || issue.prerequisite === undefined)
|
|
return { locked: false }
|
|
const prereq = issues.find(i => i.number === issue.prerequisite)
|
|
if (!prereq || prereq.column === 'done')
|
|
return { locked: false }
|
|
return {
|
|
locked: true,
|
|
prerequisiteNumber: prereq.number,
|
|
prerequisiteColumn: prereq.column,
|
|
}
|
|
}
|