✨ feat(vscode): 代码阅读侧栏可以按审查工单只看 PR 改过的文件:标题栏「选工单」列出看板「审查」列,选中后树里只剩改过的文件(M / A / D 着色),点开的是本机工作副本里 PR 最新的代码,没有就拉 PR 分支建一个,「显示全部」退出

This commit is contained in:
cruldra committed 2026-09-27 17:36:02 +08:00
1 parent c009187f6c
commit 8e2cdfaf17
18 files changed
+1053 -40

No files matched your search

+4 -24
View File
@@ -13,38 +13,18 @@ import type { KanbanWebviewPanel } from '../KanbanPanel'
import { accessSync, constants } from 'node:fs'
import { createPatch } from 'diff'
import { workspace } from 'vscode'
import { getToken } from '../../auth/secrets'
import { resolveCommitProfileForRun } from '../../cc/commitProfile'
import { parsePrDiffMode } from '../../cc/prDiffMode'
import { resolveProfilePath } from '../../cc/profiles'
import { spawnClaude } from '../../cc/spawnClaude'
import { detectRepo } from '../../git/remote'
import { getPullRequest, getRawFile, listPullRequestFiles } from '../../gitea/api'
import { resolveRepoContext } from '../../gitea/repoContext'
import { readStateJsonComment } from '../../gitea/stateJson'
import { readFileSummaries, readSummarySession, writeFileSummary, writeSummarySession } from '../../sessions/prFileSummaryStore'
import { readConfirmedSigs, writeConfirmedSigs } from '../../sessions/prReviewStore'
import { getEffectivePrDiffSummaryProfilePath } from '../../settings/store'
import { makeNonce } from '../../webview/html'
/**
* 解析当前工作区的 Gitea 仓库与 token。三者任一缺失返回 undefined,
* 调用方据此走空态/错误分支。
*/
async function resolveRepoContext(panel: KanbanWebviewPanel): Promise<
{ host: string, owner: string, repo: string, token: string } | undefined
> {
const workspaceRoot = workspace.workspaceFolders?.[0]?.uri.fsPath
if (!workspaceRoot)
return undefined
const remote = await detectRepo(workspaceRoot)
if (!remote)
return undefined
const token = await getToken(panel.context, remote.host)
if (!token)
return undefined
return { host: remote.host, owner: remote.owner, repo: remote.repo, token }
}
/** 从工单的 state JSON 取 PR 号。无则返回 undefined(前端按空态处理,不算错误)。 */
async function resolvePrNumber(
ctx: { host: string, owner: string, repo: string, token: string },
@@ -124,7 +104,7 @@ function fileSig(f: { status: string, additions: number, deletions: number }): s
*/
export async function handleGetPrFiles(panel: KanbanWebviewPanel, issueNumber: number): Promise<void> {
try {
const ctx = await resolveRepoContext(panel)
const ctx = await resolveRepoContext(panel.context)
if (!ctx) {
panel.postMessage({ type: 'pr-files/show', issueNumber, files: [], confirmed: [], summaries: {} })
return
@@ -188,7 +168,7 @@ export async function handleGetPrFileDiff(
args: { issueNumber: number, path: string, previousPath?: string },
): Promise<void> {
try {
const ctx = await resolveRepoContext(panel)
const ctx = await resolveRepoContext(panel.context)
if (!ctx) {
panel.postMessage({ type: 'pr-file-diff/show', issueNumber: args.issueNumber, path: args.path, oldContent: '', newContent: '' })
return
@@ -277,7 +257,7 @@ export async function handleGeneratePrFileSummary(
const { issueNumber, path: filePath } = args
try {
const workspaceRoot = workspace.workspaceFolders?.[0]?.uri.fsPath
const ctx = await resolveRepoContext(panel)
const ctx = await resolveRepoContext(panel.context)
if (!ctx || !workspaceRoot) {
panel.postMessage({ type: 'pr-file-summary/show', issueNumber, path: filePath, error: '当前工作区没有 Gitea 仓库或未配置 token' })
return