♻️ refactor(vscode): 设置项 autoBuildBranch 换成发布分支前缀与 Jenkins 任务

Claude-Session: https://claude.ai/code/session_01HTMgwaE3woqM5yvsHiuSAa
This commit is contained in:
cruldra committed 2026-08-31 23:38:53 +08:00
1 parent fa32d4a88b
commit 6f59b4f3fd
13 files changed
+149 -66

No files matched your search

+6 -2
View File
@@ -865,7 +865,9 @@ export class KanbanWebviewPanel {
autoReview: s.autoReview,
reviewPrompt: s.reviewPrompt,
devBranch: s.devBranch,
autoBuildBranch: s.autoBuildBranch,
releaseBranchPrefix: s.releaseBranchPrefix,
jenkinsJob: s.jenkinsJob,
jenkinsProdHost: s.jenkinsProdHost,
worktreeDirectory: s.worktreeDirectory,
worktreeOpenWith: s.worktreeOpenWith,
pycharmCommand: s.pycharmCommand,
@@ -945,7 +947,9 @@ export class KanbanWebviewPanel {
autoReview: s.autoReview,
reviewPrompt: s.reviewPrompt,
devBranch: s.devBranch,
autoBuildBranch: s.autoBuildBranch,
releaseBranchPrefix: s.releaseBranchPrefix,
jenkinsJob: s.jenkinsJob,
jenkinsProdHost: s.jenkinsProdHost,
worktreeDirectory: s.worktreeDirectory,
worktreeOpenWith: s.worktreeOpenWith,
pycharmCommand: s.pycharmCommand,
+3 -4
View File
@@ -5,7 +5,7 @@ import { logger } from '../../logging/logger'
/**
* 清理一个 feature 分支(远程 + 本地),供「拖到完成」和「手动删除 worktree」两处共用。
*
* - 受保护分支(main/master/devBranch/autoBuildBranch)直接跳过,绝不删。
* - 受保护分支(main/master/devBranch)直接跳过,绝不删。
* - 远程删除走 gitea API,需 remote + token;缺任一则只删本地,不阻断。
* - 本地删除是强删(deleteLocalBranch 内部 `git branch -D`):调用方语义是「连分支一起删」,
* 未合并也照删。
@@ -20,17 +20,16 @@ export async function cleanupFeatureBranch(opts: {
branch: string
issueNumber: number
devBranch?: string
autoBuildBranch?: string
/** 缺 remote 或 token 时跳过远程删除,只删本地。 */
remote?: { host: string, owner: string, repo: string }
token?: string
}): Promise<void> {
const { workspaceRoot, branch, issueNumber, devBranch, autoBuildBranch, remote, token } = opts
const { workspaceRoot, branch, issueNumber, devBranch, remote, token } = opts
if (!branch)
return
const protectedBranches = new Set(
['main', 'master', devBranch, autoBuildBranch].filter((b): b is string => Boolean(b)),
['main', 'master', devBranch].filter((b): b is string => Boolean(b)),
)
if (protectedBranches.has(branch)) {
logger.add({ level: 'warn', source: 'panel', message: `跳过受保护分支清理 ${branch} (issue #${issueNumber})` })
+1 -1
View File
@@ -342,7 +342,7 @@ export async function handleHandoffStart(panel: KanbanWebviewPanel, issueNumber:
}
if (branch) {
const settings = getSettings(panel.context)
await cleanupFeatureBranch({ workspaceRoot, branch, issueNumber, devBranch: settings.devBranch, autoBuildBranch: settings.autoBuildBranch })
await cleanupFeatureBranch({ workspaceRoot, branch, issueNumber, devBranch: settings.devBranch })
}
// ⑦ 本机墓碑:sid/profile/worktreePath 归零。worktree 没删掉时保留
-2
View File
@@ -506,7 +506,6 @@ export async function handleColumnChange(panel: KanbanWebviewPanel, issueNumber:
branch: featureBranch,
issueNumber,
devBranch: settingsForBranchCleanup.devBranch,
autoBuildBranch: settingsForBranchCleanup.autoBuildBranch,
remote,
token,
})
@@ -786,7 +785,6 @@ export async function handleResetToTodo(panel: KanbanWebviewPanel, issueNumber:
branch: featureBranch,
issueNumber,
devBranch: settingsForBranchCleanup.devBranch,
autoBuildBranch: settingsForBranchCleanup.autoBuildBranch,
remote,
token,
})
-1
View File
@@ -761,7 +761,6 @@ export async function handleImplement(
branch,
issueNumber,
devBranch: settings.devBranch,
autoBuildBranch: settings.autoBuildBranch,
remote,
token,
})
+16 -8
View File
@@ -28,7 +28,9 @@ export async function handleSettingsSave(panel: KanbanWebviewPanel, payload: {
autoReview: boolean
reviewPrompt: string
devBranch: string
autoBuildBranch: string
releaseBranchPrefix: string
jenkinsJob: string
jenkinsProdHost: string
worktreeDirectory: string
worktreeOpenWith: 'vscode' | 'pycharm'
pycharmCommand: string
@@ -55,7 +57,10 @@ export async function handleSettingsSave(panel: KanbanWebviewPanel, payload: {
const trimmedYtClose = payload.youtrackCloseCommand.trim()
const trimmedYtToken = payload.youtrackToken.trim()
const trimmedDevBranch = payload.devBranch.trim()
const trimmedAutoBuildBranch = payload.autoBuildBranch.trim()
// 发布前缀 / Jenkins 任务 / 正式服 host:只 trim,空值回退在 getSettings 读时做。
const trimmedReleasePrefix = payload.releaseBranchPrefix.trim()
const trimmedJenkinsJob = payload.jenkinsJob.trim()
const trimmedJenkinsProdHost = payload.jenkinsProdHost.trim()
// worktree dir template: '' = "use default", so don't preserve blanks
// specially — getSettings falls back to the default at read time.
const trimmedWorktreeDir = payload.worktreeDirectory.trim()
@@ -101,7 +106,9 @@ export async function handleSettingsSave(panel: KanbanWebviewPanel, payload: {
autoReview: payload.autoReview,
reviewPrompt: payload.reviewPrompt || prev.reviewPrompt,
devBranch: trimmedDevBranch || prev.devBranch,
autoBuildBranch: trimmedAutoBuildBranch,
releaseBranchPrefix: trimmedReleasePrefix || prev.releaseBranchPrefix,
jenkinsJob: trimmedJenkinsJob,
jenkinsProdHost: trimmedJenkinsProdHost || prev.jenkinsProdHost,
worktreeDirectory: trimmedWorktreeDir || prev.worktreeDirectory,
worktreeOpenWith: payload.worktreeOpenWith || prev.worktreeOpenWith,
pycharmCommand: trimmedPycharmCmd || prev.pycharmCommand,
@@ -126,11 +133,10 @@ export async function handleSettingsSave(panel: KanbanWebviewPanel, payload: {
implementPlanPrompt: payload.implementPlanPrompt,
autoReview: payload.autoReview,
reviewPrompt: payload.reviewPrompt,
// Persist trimmed values; '' is meaningful for autoBuildBranch
// ("follow devBranch"), so don't coerce — getSettings handles the
// fallback at read time.
devBranch: trimmedDevBranch,
autoBuildBranch: trimmedAutoBuildBranch,
releaseBranchPrefix: trimmedReleasePrefix,
jenkinsJob: trimmedJenkinsJob,
jenkinsProdHost: trimmedJenkinsProdHost,
worktreeDirectory: trimmedWorktreeDir,
worktreeOpenWith: payload.worktreeOpenWith,
pycharmCommand: trimmedPycharmCmd,
@@ -233,7 +239,9 @@ export async function handleEditSettingsRequest(panel: KanbanWebviewPanel): Prom
autoReview: s.autoReview,
reviewPrompt: s.reviewPrompt,
devBranch: s.devBranch,
autoBuildBranch: s.autoBuildBranch,
releaseBranchPrefix: s.releaseBranchPrefix,
jenkinsJob: s.jenkinsJob,
jenkinsProdHost: s.jenkinsProdHost,
worktreeDirectory: s.worktreeDirectory,
worktreeOpenWith: s.worktreeOpenWith,
pycharmCommand: s.pycharmCommand,
-1
View File
@@ -139,7 +139,6 @@ export async function handleDeleteWorktree(panel: KanbanWebviewPanel, issueNumbe
branch,
issueNumber,
devBranch: settingsForHook.devBranch,
autoBuildBranch: settingsForHook.autoBuildBranch,
remote: remote ? { host: remote.host, owner: remote.owner, repo: remote.repo } : undefined,
token,
})
+17 -9
View File
@@ -73,7 +73,9 @@ export type ExtensionToWebview
autoReview: boolean
reviewPrompt: string
devBranch: string
autoBuildBranch: string
releaseBranchPrefix: string
jenkinsJob: string
jenkinsProdHost: string
worktreeDirectory: string
worktreeOpenWith: 'vscode' | 'pycharm'
pycharmCommand: string
@@ -109,13 +111,15 @@ export type ExtensionToWebview
| { type: 'logs/cleared' }
| { type: 'commit/state', running: boolean }
| { type: 'commit/has-changes', value: boolean }
// 发布点状态:nextBranch 是今天要切的分支全名,由扩展侧算好,webview 不自己拼日期。
| {
type: 'branch-sync/status'
behind: number
type: 'release/status'
devBranch: string
autoBuildBranch: string
unavailable?: boolean
reason?: string
current?: string
nextBranch: string
unreleased: number
unavailable?: string
running: boolean
}
| { type: 'env-lock/status', locked: boolean, fileCount: number, failedCount?: number }
| { type: 'issue/remove', issueNumber: number }
@@ -145,7 +149,9 @@ export type WebviewToExtension
autoReview: boolean
reviewPrompt: string
devBranch: string
autoBuildBranch: string
releaseBranchPrefix: string
jenkinsJob: string
jenkinsProdHost: string
worktreeDirectory: string
worktreeOpenWith: 'vscode' | 'pycharm'
pycharmCommand: string
@@ -200,8 +206,10 @@ export type WebviewToExtension
| { type: 'logs/clear' }
| { type: 'commit/run' }
| { type: 'session/close-tab', issueNumber: number, kind: 'brainstorm' | 'implement' | 'review' | 'test' }
| { type: 'branch-sync/check' }
| { type: 'branch-sync/run' }
| { type: 'release/check' }
| { type: 'release/cut' }
| { type: 'release/cherry-pick' }
| { type: 'release/deploy' }
| { type: 'env-lock/check' }
| { type: 'env-lock/toggle' }
| { type: 'issue/delete', issueNumber: number }