✨ feat(vscode): 看板默认显示团队工单,同事的卡只读并贴头像

看板范围默认从「只看我的」改为「团队全部」,同事移交或推进的工单不用
手动切开关就能看见。同事的卡片按 Gitea 归属(assignee 优先,无 assignee
退回创建者)判定为只读:禁止拖列、开会话、实施、合并分支、删 worktree、
删改工单,卡片右上角贴归属人头像,详情面板属性表整体消毒并显示只读徽章。
看 PR 改动、勾已查看、生成文件摘要属于本机审查动作,照常放行。

扩展侧在消息分发前统一拦截需要归属人身份的消息,兜住前端快照过期或工单
刚被重新指派的竞态;webhook 单卡上板时同步归属,避免增量卡漏进门禁。
头像由扩展侧带 token 抓回转 data URI 下发,绕开 webview CSP 对外链图片
的限制,按 URL 进程内缓存。

Claude-Session: https://claude.ai/code/session_01KSgcQwf1mWrb8qeTKFvJbV
This commit is contained in:
cruldra committed 2026-09-10 15:30:02 +08:00
1 parent e8963ac2a2
commit 9167b86708
26 files changed
+550 -34

No files matched your search

+41
View File
@@ -0,0 +1,41 @@
/**
* 同事工单的写操作门禁:看板范围切到「团队全部」后,别人的卡也在板上,
* 前端会把按钮藏掉,但 webview 消息仍可能因为竞态(卡刚被重新指派、
* 快照过期)送到扩展侧,所以这里做最终拦截——归属不是我就直接丢掉。
*
* 只拦「会改工单状态或在本机替别人跑会话」的消息。看 PR 改动、勾已查看、
* 生成文件摘要属于审查动作,落地在本机,照常放行。
*/
/** 必须是工单归属人才能执行的消息类型。 */
export const OWNER_ONLY_MESSAGE_TYPES: ReadonlySet<string> = new Set([
// 会话:在本机替别人开/恢复/关闭会话没有意义,worktree 也不在本机
'session/resume',
'session/focus',
'session/resume-review',
'session/resume-test',
'session/start-test',
'session/close-tab',
'brainstorm/continue',
'issue/implement',
// 工单状态:写回 Gitea
'column/change',
'issue/delete',
'issue/close',
'issue/generate-pr-diff-summary',
'issue/update-auto-review',
'issue/update-profile-path',
'issue/update-brainstorm-profile-path',
'issue/update-test-profile-path',
'dependency/set',
'dependency/clear',
'handoff/users',
'handoff/start',
// 分支与 worktree
'git/merge-preview',
'worktree/delete',
])
export function isOwnerOnlyMessage(type: string): boolean {
return OWNER_ONLY_MESSAGE_TYPES.has(type)
}