✨ feat(vscode): 审查列可以手动标记为通过

This commit is contained in:
cruldra committed 2026-10-04 10:01:41 +08:00
1 parent 20249d6a08
commit 4094ffa49e
12 files changed
+157 -6

No files matched your search

+4
View File
@@ -598,6 +598,10 @@ export class KanbanWebviewPanel {
void issues.handleUpdateAutoReview(this, msg.issueNumber, msg.value)
return
}
if (msg.type === 'issue/update-review-passed') {
void issues.handleUpdateReviewPassed(this, msg.issueNumber, msg.value)
return
}
if (msg.type === 'issue/update-profile-path') {
void issues.handleUpdateProfilePath(this, msg.issueNumber, msg.profilePath)
return
+79
View File
@@ -1893,6 +1893,85 @@ export async function handleUpdateAutoReview(panel: KanbanWebviewPanel, issueNum
}
}
export async function handleUpdateReviewPassed(panel: KanbanWebviewPanel, issueNumber: number, value: boolean): Promise<void> {
const workspaceRoot = workspace.workspaceFolders?.[0]?.uri.fsPath
if (!workspaceRoot) {
panel.postMessage({
type: 'toast/show',
id: makeNonce(),
level: 'error',
message: '请先打开一个工作区文件夹',
dismissOnTimer: 5000,
})
return
}
const remote = await detectRepo(workspaceRoot)
if (!remote) {
panel.postMessage({
type: 'toast/show',
id: makeNonce(),
level: 'error',
message: '当前工作区没有 Gitea 远程仓库',
dismissOnTimer: 5000,
})
return
}
const token = await getToken(panel.context, remote.host)
if (!token) {
panel.postMessage({
type: 'toast/show',
id: makeNonce(),
level: 'error',
message: '请先完成 Gitea 配置',
dismissOnTimer: 5000,
})
return
}
let previousValue: boolean | undefined
try {
const existingState = await panel.readIssueState(issueNumber)
previousValue = typeof existingState.reviewPassed === 'boolean'
? existingState.reviewPassed
: undefined
}
catch {
previousValue = undefined
}
try {
await panel.mergeIssueState(issueNumber, { reviewPassed: value })
logger.add({
level: 'info',
source: 'panel',
message: `工单 #${issueNumber} reviewPassed=${value} 已持久化`,
})
}
catch (err) {
const message = err instanceof Error ? err.message : String(err)
logger.add({
level: 'error',
source: 'panel',
message: `持久化 reviewPassed 失败 (issue #${issueNumber})`,
details: message,
})
panel.postMessage({
type: 'toast/show',
id: makeNonce(),
level: 'error',
message: `保存工单 #${issueNumber} 审查通过标记失败: ${message}`,
dismissOnTimer: 6000,
})
panel.postMessage({
type: 'issue/patch',
issueNumber,
patch: { reviewPassed: previousValue },
})
}
}
/**
* Persist a per-issue `profilePath` override into the issue's state JSON
* comment. Implement / implement-resume sessions use this profile
+1
View File
@@ -228,6 +228,7 @@ export type WebviewToExtension
| { type: 'dependency/set', issueNumber: number, prerequisiteNumber: number }
| { type: 'dependency/clear', issueNumber: number, prerequisiteNumber: number }
| { type: 'issue/update-auto-review', issueNumber: number, value: boolean }
| { type: 'issue/update-review-passed', issueNumber: number, value: boolean }
| { type: 'issue/update-profile-path', issueNumber: number, profilePath: string }
| { type: 'issue/update-brainstorm-profile-path', issueNumber: number, brainstormProfilePath: string }
| { type: 'issue/clear-session', issueNumber: number, kind: 'brainstorm' | 'implement' | 'review' | 'test' | 'prototype' }
+1
View File
@@ -8,6 +8,7 @@ describe('isOwnerOnlyMessage', () => {
expect(isOwnerOnlyMessage('issue/close')).toBe(true)
expect(isOwnerOnlyMessage('dependency/set')).toBe(true)
expect(isOwnerOnlyMessage('issue/update-auto-review')).toBe(true)
expect(isOwnerOnlyMessage('issue/update-review-passed')).toBe(true)
expect(isOwnerOnlyMessage('issue/clear-session')).toBe(true)
})
+1
View File
@@ -27,6 +27,7 @@ export const OWNER_ONLY_MESSAGE_TYPES: ReadonlySet<string> = new Set([
'issue/close',
'issue/generate-pr-diff-summary',
'issue/update-auto-review',
'issue/update-review-passed',
'issue/update-profile-path',
'issue/update-brainstorm-profile-path',
'issue/clear-session',