prime-dev-cli 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/.next/BUILD_ID +1 -1
- package/dist/server/.next/app-build-manifest.json +1 -1
- package/dist/server/.next/app-path-routes-manifest.json +5 -0
- package/dist/server/.next/build-manifest.json +6 -6
- package/dist/server/.next/cache/.tsbuildinfo +1 -1
- package/dist/server/.next/cache/eslint/.cache_1qa5vxt +1 -1
- package/dist/server/.next/fallback-build-manifest.json +6 -6
- package/dist/server/.next/next-minimal-server.js.nft.json +1 -1
- package/dist/server/.next/next-server.js.nft.json +1 -1
- package/dist/server/.next/prerender-manifest.json +3 -3
- package/dist/server/.next/server/app/_not-found.html +1 -1
- package/dist/server/.next/server/app/_not-found.rsc +1 -1
- package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/app-build-manifest.json +10 -0
- package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/build-manifest.json +16 -0
- package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route.js +8 -0
- package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route.js.map +5 -0
- package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route.js.nft.json +1 -0
- package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route_client-reference-manifest.js +2 -0
- package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/app-build-manifest.json +10 -0
- package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/build-manifest.json +16 -0
- package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route.js +8 -0
- package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route.js.map +5 -0
- package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route.js.nft.json +1 -0
- package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route_client-reference-manifest.js +2 -0
- package/dist/server/.next/server/app/api/admin-git-batch-merge/route/app-build-manifest.json +10 -0
- package/dist/server/.next/server/app/api/admin-git-batch-merge/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/admin-git-batch-merge/route/build-manifest.json +16 -0
- package/dist/server/.next/server/app/api/admin-git-batch-merge/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/admin-git-batch-merge/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/admin-git-batch-merge/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/admin-git-batch-merge/route.js +8 -0
- package/dist/server/.next/server/app/api/admin-git-batch-merge/route.js.map +5 -0
- package/dist/server/.next/server/app/api/admin-git-batch-merge/route.js.nft.json +1 -0
- package/dist/server/.next/server/app/api/admin-git-batch-merge/route_client-reference-manifest.js +2 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/app-build-manifest.json +10 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/build-manifest.json +16 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/abort/route.js +8 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/abort/route.js.map +5 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/abort/route.js.nft.json +1 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/abort/route_client-reference-manifest.js +2 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/route/app-build-manifest.json +10 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/route/build-manifest.json +16 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/route.js +9 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/route.js.map +5 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/route.js.nft.json +1 -0
- package/dist/server/.next/server/app/api/gwh-git-flow/route_client-reference-manifest.js +2 -0
- package/dist/server/.next/server/app/api/uat-git-flow/route.js +2 -2
- package/dist/server/.next/server/app/api/uat-git-flow/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/uat-git-flow/step/route.js +2 -2
- package/dist/server/.next/server/app/api/uat-git-flow/step/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/configuration.html +1 -1
- package/dist/server/.next/server/app/configuration.rsc +1 -1
- package/dist/server/.next/server/app/index.html +1 -1
- package/dist/server/.next/server/app/index.rsc +1 -1
- package/dist/server/.next/server/app/initialization/page/app-build-manifest.json +1 -1
- package/dist/server/.next/server/app/initialization/page_client-reference-manifest.js +1 -1
- package/dist/server/.next/server/app/initialization.html +1 -1
- package/dist/server/.next/server/app/initialization.rsc +2 -2
- package/dist/server/.next/server/app-paths-manifest.json +5 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__0f9a35fc._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__0f9a35fc._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__37bfbf6b._.js +16 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__37bfbf6b._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__66dc5e6b._.js +16 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__66dc5e6b._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__8a8561ea._.js +16 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__8a8561ea._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__98088bea._.js +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__98088bea._.js.map +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__4ad2e049._.js → [root-of-the-server]__9f7a6c58._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__4ad2e049._.js.map → [root-of-the-server]__9f7a6c58._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__a8ae0f8f._.js → [root-of-the-server]__ac6efee1._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__a8ae0f8f._.js.map → [root-of-the-server]__ac6efee1._.js.map} +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__f111df8e._.js +16 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__f111df8e._.js.map +1 -0
- package/dist/server/.next/server/chunks/_24087f66._.js +1 -1
- package/dist/server/.next/server/chunks/_24087f66._.js.map +1 -1
- package/dist/server/.next/server/chunks/_61c263b3._.js +1 -1
- package/dist/server/.next/server/chunks/_61c263b3._.js.map +1 -1
- package/dist/server/.next/server/chunks/_f35a5421._.js +3 -0
- package/dist/server/.next/server/chunks/_f35a5421._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js +1 -1
- package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js.map +1 -1
- package/dist/server/.next/server/middleware-build-manifest.js +4 -4
- package/dist/server/.next/server/pages/404.html +1 -1
- package/dist/server/.next/server/pages/500.html +1 -1
- package/dist/server/.next/server/pages/_app/build-manifest.json +2 -2
- package/dist/server/.next/server/pages/_error/build-manifest.json +2 -2
- package/dist/server/.next/static/chunks/{1091ba2f3c451a47.js → 0a55e0a2ff3b09e0.js} +1 -1
- package/dist/server/.next/static/chunks/13acbe5989647429.js +3 -0
- package/dist/server/.next/static/chunks/{1aa036ed62a506c8.js → 6803a56f8e33c487.js} +2 -2
- package/dist/server/.next/static/chunks/{1154a499e8e3867b.js → 8f80ca1e88635b12.js} +1 -1
- package/dist/server/.next/static/chunks/{2602bf706e977560.js.map → acb330991f8ec5eb.js.map} +1 -1
- package/dist/server/.next/static/chunks/f5014a46b22ea191.js.map +1 -0
- package/dist/server/.next/static/chunks/pages/_app.js +2 -2
- package/dist/server/.next/static/chunks/pages/_error.js +2 -2
- package/dist/server/.next/trace +2 -1
- package/package.json +1 -1
- package/dist/server/.next/static/chunks/36cdd24a97bd8ed5.js +0 -3
- package/dist/server/.next/static/chunks/df7954b7bd4ea3eb.js.map +0 -1
- /package/dist/server/.next/static/{y0HjvfId3sNkXoR9vLiLd → -cMGDUj-YvI_2FwzuOQqe}/_buildManifest.js +0 -0
- /package/dist/server/.next/static/{y0HjvfId3sNkXoR9vLiLd → -cMGDUj-YvI_2FwzuOQqe}/_clientMiddlewareManifest.json +0 -0
- /package/dist/server/.next/static/{y0HjvfId3sNkXoR9vLiLd → -cMGDUj-YvI_2FwzuOQqe}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["turbopack:///[project]/packages/server/src/app/api/uat-git-flow/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server';\nimport { spawn } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { sanitizeProjectName } from '@/lib/git-operations';\nimport { createUatGitFlowState, clearUatGitFlowState, isUatGitFlowAborted } from './state';\nimport {\n appendIgnoredPathsFromCheckoutWarning,\n hasBlockingWorkspaceChanges,\n} from './git-status-utils';\nimport { cleanupTempExecutionRepo, createTempExecutionRepo } from './temp-repo';\n\ntype GitResult = {\n code: number | null;\n stdout: string;\n stderr: string;\n};\n\nconst invalidBranchChars = /\\\\s/;\n\nfunction isValidBranchName(name: string) {\n if (!name) return false;\n if (invalidBranchChars.test(name)) return false;\n if (name.startsWith('-')) return false;\n return true;\n}\n\nfunction runGitCommand(cwd: string, args: string[]): Promise<GitResult> {\n return new Promise((resolve, reject) => {\n const child = spawn('git', args, {\n cwd,\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n resolve({ code, stdout, stderr });\n });\n\n child.on('error', (error) => {\n reject(error);\n });\n });\n}\n\nfunction formatCommand(args: string[]) {\n return `git ${args.join(' ')}`;\n}\n\ntype GitProjectInfo = {\n originalBranch: string;\n createdLocalBranch: boolean;\n hadLocalBranch: boolean;\n ignoredUntrackedPaths: Set<string>;\n};\n\nfunction sanitizeLogValue(value: string) {\n return value.replace(/\\s+/g, ' ').trim();\n}\n\nfunction logCommandResult(operationLogs: string[], projectName: string, step: string, result: GitResult) {\n if (result.code === 0) {\n operationLogs.push(`[${projectName}] 完成: ${step}`);\n } else {\n operationLogs.push(`[${projectName}] 失败: ${step} ${result.stderr || result.stdout}`);\n }\n}\n\nfunction trackCheckoutWarnings(\n operationLogs: string[],\n projectName: string,\n projectInfo: GitProjectInfo,\n result: GitResult,\n) {\n const addedPaths = appendIgnoredPathsFromCheckoutWarning(result.stderr, projectInfo.ignoredUntrackedPaths);\n if (addedPaths.length > 0) {\n operationLogs.push(`[${projectName}] 提示: 检测到子模块残留目录 ${addedPaths.join(', ')},状态检查将忽略对应未跟踪路径`);\n }\n}\n\nexport async function POST(request: NextRequest) {\n let activeRunId = '';\n const tempRootPaths = new Set<string>();\n try {\n const body = await request.json();\n const projects = Array.isArray(body.projects) ? body.projects : [];\n const createBranch = typeof body.createBranch === 'string' ? body.createBranch.trim() : '';\n const baseBranch = typeof body.baseBranch === 'string' ? body.baseBranch.trim() : '';\n const mergeBranch = typeof body.mergeBranch === 'string' ? body.mergeBranch.trim() : '';\n const dryRun = Boolean(body.dryRun);\n const runId = typeof body.runId === 'string' ? body.runId : '';\n\n const operationLogs: string[] = [];\n const feedbacks: string[] = [];\n const projectResults: Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n rollbackActions?: string[];\n }> = [];\n const resultMap = new Map<string, { success: boolean; reason?: string; rollbackActions?: string[] }>();\n const setProjectResult = (\n projectName: string,\n success: boolean,\n reason?: string,\n rollbackActions?: string[]\n ) => {\n if (resultMap.has(projectName)) {\n return;\n }\n resultMap.set(projectName, { success, reason, rollbackActions });\n projectResults.push({ projectName, success, reason, rollbackActions });\n };\n const rollbackProject = async (projectName: string, projectPath: string, info: GitProjectInfo) => {\n const actions: string[] = [];\n if (info.originalBranch && info.originalBranch !== 'HEAD') {\n const command = formatCommand(['checkout', info.originalBranch]);\n operationLogs.push(`[${projectName}] 回滚: ${command}`);\n const rollbackCheckout = await runGitCommand(projectPath, ['checkout', info.originalBranch]);\n logCommandResult(operationLogs, projectName, `回滚切换分支 ${info.originalBranch}`, rollbackCheckout);\n actions.push(command);\n }\n\n if (info.createdLocalBranch && !info.hadLocalBranch) {\n const command = formatCommand(['branch', '-D', createBranch]);\n operationLogs.push(`[${projectName}] 回滚: ${command}`);\n const rollbackDelete = await runGitCommand(projectPath, ['branch', '-D', createBranch]);\n logCommandResult(operationLogs, projectName, `回滚删除本地分支 ${createBranch}`, rollbackDelete);\n actions.push(command);\n }\n\n return actions;\n };\n\n if (projects.length === 0 || !createBranch || !baseBranch || !mergeBranch) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: ['缺少必要参数,请填写完整后重试。'],\n }, { status: 400 });\n }\n\n if (!isValidBranchName(createBranch) || !isValidBranchName(baseBranch) || !isValidBranchName(mergeBranch)) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: ['分支名称不合法,请避免空格或以 - 开头。'],\n }, { status: 400 });\n }\n\n if (!runId) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: ['缺少 runId,请刷新页面后重试。'],\n }, { status: 400 });\n }\n\n createUatGitFlowState(runId);\n activeRunId = runId;\n\n const projectsConfig = await getProjectsConfig();\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n const touchedProjects: Array<{ name: string; path: string; info: GitProjectInfo }> = [];\n\n const checkAbort = () => isUatGitFlowAborted(runId);\n\n for (const rawProjectName of projects) {\n if (checkAbort()) {\n feedbacks.push('已收到中断请求,开始回滚已执行的本地操作。');\n break;\n }\n\n const originalName = String(rawProjectName);\n const projectName = sanitizeProjectName(originalName);\n\n if (!projectName || projectName !== originalName) {\n operationLogs.push(`[${originalName}] 失败: 项目名称包含无效字符`);\n feedbacks.push(`[${originalName}] 项目名称包含无效字符,已跳过。`);\n setProjectResult(originalName, false, '项目名称包含无效字符');\n continue;\n }\n\n if (!projectsConfig[projectName]) {\n operationLogs.push(`[${projectName}] 失败: 未在项目配置中找到`);\n feedbacks.push(`[${projectName}] 未在项目配置中找到,已跳过。`);\n setProjectResult(projectName, false, '未在项目配置中找到');\n continue;\n }\n\n const projectPath = join(workspacePath, projectName);\n if (!existsSync(projectPath)) {\n operationLogs.push(`[${projectName}] 失败: 项目目录不存在`);\n feedbacks.push(`[${projectName}] 项目目录不存在,已跳过。`);\n setProjectResult(projectName, false, '项目目录不存在');\n continue;\n }\n\n if (!existsSync(join(projectPath, '.git'))) {\n operationLogs.push(`[${projectName}] 失败: 非 Git 仓库`);\n feedbacks.push(`[${projectName}] 不是有效的 Git 仓库,已跳过。`);\n setProjectResult(projectName, false, '不是有效的 Git 仓库');\n continue;\n }\n\n if (dryRun) {\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', baseBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', createBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['show-ref', '--verify', `refs/heads/${createBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', '-B', createBranch, `origin/${baseBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['push', '-u', 'origin', createBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', mergeBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', createBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${mergeBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', createBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', 'main'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', 'main'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${createBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', 'main'])}`);\n continue;\n }\n\n const tempRepoResult = await createTempExecutionRepo(projectPath, projectName);\n if (!tempRepoResult.success) {\n operationLogs.push(`[${projectName}] 失败: 创建临时执行仓库失败 ${tempRepoResult.error}`);\n feedbacks.push(`[${projectName}] 创建临时执行仓库失败: ${tempRepoResult.error}`);\n setProjectResult(projectName, false, '创建临时执行仓库失败');\n continue;\n }\n\n const executionPath = tempRepoResult.value.projectPath;\n tempRootPaths.add(tempRepoResult.value.tempRootPath);\n operationLogs.push(`[${projectName}] 使用临时目录执行: ${executionPath}`);\n\n operationLogs.push(`[${projectName}] 检查当前分支`);\n const currentBranchResult = await runGitCommand(executionPath, ['branch', '--show-current']);\n logCommandResult(operationLogs, projectName, '当前分支检查', currentBranchResult);\n const originalBranch = sanitizeLogValue(currentBranchResult.stdout) || 'HEAD';\n const projectInfo: GitProjectInfo = {\n originalBranch,\n createdLocalBranch: false,\n hadLocalBranch: true,\n ignoredUntrackedPaths: new Set<string>(),\n };\n\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n const fetchResult = await runGitCommand(executionPath, ['fetch', 'origin']);\n logCommandResult(operationLogs, projectName, '拉取远端', fetchResult);\n if (fetchResult.code !== 0) {\n feedbacks.push(`[${projectName}] 拉取远端失败: ${fetchResult.stderr || fetchResult.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '拉取远端失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', baseBranch])}`);\n const baseExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', baseBranch]);\n logCommandResult(operationLogs, projectName, `检查 origin/${baseBranch}`, baseExists);\n if (!baseExists.stdout.trim()) {\n feedbacks.push(`[${projectName}] origin/${baseBranch} 不存在,无法创建分支。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `origin/${baseBranch} 不存在`, rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', createBranch])}`);\n const remoteCreateExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', createBranch]);\n logCommandResult(operationLogs, projectName, `检查远端分支 ${createBranch}`, remoteCreateExists);\n operationLogs.push(`[${projectName}] ${formatCommand(['show-ref', '--verify', `refs/heads/${createBranch}`])}`);\n const localCreateExists = await runGitCommand(executionPath, ['show-ref', '--verify', `refs/heads/${createBranch}`]);\n logCommandResult(operationLogs, projectName, `检查本地分支 ${createBranch}`, localCreateExists);\n\n if (localCreateExists.code === 0) {\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', createBranch])}`);\n const checkoutLocal = await runGitCommand(executionPath, ['checkout', createBranch]);\n logCommandResult(operationLogs, projectName, `切换到本地分支 ${createBranch}`, checkoutLocal);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, checkoutLocal);\n if (checkoutLocal.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到本地分支失败: ${checkoutLocal.stderr || checkoutLocal.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '切换到本地分支失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n const fetchLocalBranch = await runGitCommand(executionPath, ['fetch', 'origin']);\n logCommandResult(operationLogs, projectName, '拉取远端', fetchLocalBranch);\n if (fetchLocalBranch.code !== 0) {\n feedbacks.push(`[${projectName}] 拉取远端失败: ${fetchLocalBranch.stderr || fetchLocalBranch.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '拉取远端失败', rollbackActions);\n continue;\n }\n } else {\n projectInfo.hadLocalBranch = false;\n if (remoteCreateExists.stdout.trim()) {\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', '-B', createBranch, `origin/${createBranch}`])}`);\n const checkoutRemote = await runGitCommand(executionPath, ['checkout', '-B', createBranch, `origin/${createBranch}`]);\n logCommandResult(operationLogs, projectName, `切换到远端分支 ${createBranch}`, checkoutRemote);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, checkoutRemote);\n if (checkoutRemote.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到已有远端分支失败: ${checkoutRemote.stderr || checkoutRemote.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '切换到已有远端分支失败', rollbackActions);\n continue;\n }\n } else {\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', '-B', createBranch, `origin/${baseBranch}`])}`);\n const createResult = await runGitCommand(executionPath, ['checkout', '-B', createBranch, `origin/${baseBranch}`]);\n logCommandResult(operationLogs, projectName, `创建分支 ${createBranch}`, createResult);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, createResult);\n if (createResult.code !== 0) {\n feedbacks.push(`[${projectName}] 创建分支失败: ${createResult.stderr || createResult.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '创建分支失败', rollbackActions);\n continue;\n }\n projectInfo.createdLocalBranch = true;\n\n operationLogs.push(`[${projectName}] ${formatCommand(['push', '-u', 'origin', createBranch])}`);\n const pushResult = await runGitCommand(executionPath, ['push', '-u', 'origin', createBranch]);\n logCommandResult(operationLogs, projectName, `推送分支 ${createBranch}`, pushResult);\n if (pushResult.code !== 0) {\n feedbacks.push(`[${projectName}] 推送新分支失败: ${pushResult.stderr || pushResult.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '推送新分支失败', rollbackActions);\n continue;\n }\n }\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', mergeBranch])}`);\n const mergeExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', mergeBranch]);\n logCommandResult(operationLogs, projectName, `检查 origin/${mergeBranch}`, mergeExists);\n if (!mergeExists.stdout.trim()) {\n feedbacks.push(`[${projectName}] origin/${mergeBranch} 不存在,无法合并。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `origin/${mergeBranch} 不存在`, rollbackActions);\n continue;\n }\n\n touchedProjects.push({ name: projectName, path: executionPath, info: projectInfo });\n\n if (checkAbort()) {\n feedbacks.push('已收到中断请求,开始回滚已执行的本地操作。');\n break;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n const statusResult = await runGitCommand(executionPath, ['status', '--porcelain', '--untracked-files=all']);\n logCommandResult(operationLogs, projectName, '检查工作区', statusResult);\n if (hasBlockingWorkspaceChanges(statusResult.stdout, projectInfo.ignoredUntrackedPaths)) {\n feedbacks.push(`[${projectName}] 工作区有未提交改动,请先处理后再执行合并。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '工作区有未提交改动', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', createBranch])}`);\n const ensureBranch = await runGitCommand(executionPath, ['checkout', createBranch]);\n logCommandResult(operationLogs, projectName, `切换到分支 ${createBranch}`, ensureBranch);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, ensureBranch);\n if (ensureBranch.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到分支失败: ${ensureBranch.stderr || ensureBranch.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '切换到分支失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${mergeBranch}`])}`);\n const mergeResult = await runGitCommand(executionPath, ['merge', '--no-ff', '--no-edit', `origin/${mergeBranch}`]);\n logCommandResult(operationLogs, projectName, `合并 origin/${mergeBranch}`, mergeResult);\n if (mergeResult.code !== 0) {\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--abort'])}`);\n const abortResult = await runGitCommand(executionPath, ['merge', '--abort']);\n logCommandResult(operationLogs, projectName, '终止合并', abortResult);\n feedbacks.push(`[${projectName}] 合并冲突,已终止合并,请手动处理。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '合并冲突', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', createBranch])}`);\n const pushMerge = await runGitCommand(executionPath, ['push', 'origin', createBranch]);\n logCommandResult(operationLogs, projectName, `推送合并结果 ${createBranch}`, pushMerge);\n if (pushMerge.code !== 0) {\n feedbacks.push(`[${projectName}] 推送合并结果失败: ${pushMerge.stderr || pushMerge.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '推送合并结果失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n const fetchMain = await runGitCommand(executionPath, ['fetch', 'origin']);\n logCommandResult(operationLogs, projectName, '拉取远端', fetchMain);\n if (fetchMain.code !== 0) {\n feedbacks.push(`[${projectName}] 拉取远端失败: ${fetchMain.stderr || fetchMain.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '拉取远端失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', 'main'])}`);\n const mainExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', 'main']);\n logCommandResult(operationLogs, projectName, '检查 origin/main', mainExists);\n if (!mainExists.stdout.trim()) {\n feedbacks.push(`[${projectName}] origin/main 不存在,无法合并。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, 'origin/main 不存在', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n const statusMain = await runGitCommand(executionPath, ['status', '--porcelain', '--untracked-files=all']);\n logCommandResult(operationLogs, projectName, '检查工作区', statusMain);\n if (hasBlockingWorkspaceChanges(statusMain.stdout, projectInfo.ignoredUntrackedPaths)) {\n feedbacks.push(`[${projectName}] 工作区有未提交改动,请先处理后再合并 main。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '工作区有未提交改动', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', 'main'])}`);\n const checkoutMain = await runGitCommand(executionPath, ['checkout', 'main']);\n logCommandResult(operationLogs, projectName, '切换到 main', checkoutMain);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, checkoutMain);\n if (checkoutMain.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到 main 失败: ${checkoutMain.stderr || checkoutMain.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '切换到 main 失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${createBranch}`])}`);\n const mergeIntoMain = await runGitCommand(executionPath, ['merge', '--no-ff', '--no-edit', `origin/${createBranch}`]);\n logCommandResult(operationLogs, projectName, `合并 origin/${createBranch} 到 main`, mergeIntoMain);\n if (mergeIntoMain.code !== 0) {\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--abort'])}`);\n const abortMain = await runGitCommand(executionPath, ['merge', '--abort']);\n logCommandResult(operationLogs, projectName, '终止合并到 main', abortMain);\n feedbacks.push(`[${projectName}] 合并到 main 冲突,已终止合并,请手动处理。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '合并到 main 冲突', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', 'main'])}`);\n const pushMain = await runGitCommand(executionPath, ['push', 'origin', 'main']);\n logCommandResult(operationLogs, projectName, '推送 main', pushMain);\n if (pushMain.code !== 0) {\n feedbacks.push(`[${projectName}] 推送 main 失败: ${pushMain.stderr || pushMain.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '推送 main 失败', rollbackActions);\n continue;\n }\n\n setProjectResult(projectName, true);\n }\n\n if (isUatGitFlowAborted(runId)) {\n for (const touched of touchedProjects.reverse()) {\n const { name, path, info } = touched;\n const projectPath = path;\n\n if (info.originalBranch && info.originalBranch !== 'HEAD') {\n operationLogs.push(`[${name}] 回滚: ${formatCommand(['checkout', info.originalBranch])}`);\n const rollbackCheckout = await runGitCommand(projectPath, ['checkout', info.originalBranch]);\n logCommandResult(operationLogs, name, `回滚切换分支 ${info.originalBranch}`, rollbackCheckout);\n }\n\n if (info.createdLocalBranch && !info.hadLocalBranch) {\n operationLogs.push(`[${name}] 回滚: ${formatCommand(['branch', '-D', createBranch])}`);\n const rollbackDelete = await runGitCommand(projectPath, ['branch', '-D', createBranch]);\n logCommandResult(operationLogs, name, `回滚删除本地分支 ${createBranch}`, rollbackDelete);\n }\n }\n }\n\n return NextResponse.json({\n success: feedbacks.length === 0,\n operationLogs,\n feedbacks,\n projectResults,\n });\n } catch (error) {\n console.error('UAT git 操作流执行失败:', error);\n return NextResponse.json({\n success: false,\n operationLogs: [],\n feedbacks: [error instanceof Error ? error.message : '执行失败'],\n }, { status: 500 });\n } finally {\n for (const tempRootPath of tempRootPaths) {\n try {\n await cleanupTempExecutionRepo(tempRootPath);\n } catch (cleanupError) {\n console.error(`清理临时目录失败: ${tempRootPath}`, cleanupError);\n }\n }\n\n if (activeRunId) {\n clearUatGitFlowState(activeRunId);\n }\n }\n}\n","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"iFAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAIA,EAAA,EAAA,CAAA,CAAA,OAQA,IAAM,EAAqB,MAE3B,SAAS,EAAkB,CAAY,UACjC,CAAC,GACD,EAAmB,CADZ,GACgB,CAAC,GADV,CAEd,EAAK,CAD0B,OAAO,EACvB,CAAC,KAEtB,CAF4B,AAI5B,OAJmC,EAI1B,EAAc,CAAW,CAAE,CAAc,EAChD,OAAO,IAAI,QAAQ,CAAC,EAAS,KAC3B,IAAM,EAAQ,CAAA,EAAA,EAAA,KAAI,AAAJ,EAAM,MAAO,EAAM,KAC/B,EACA,MAAO,CAAC,OAFI,EAEM,OAAQ,OAC5B,AADmC,GAG/B,EAAS,GACT,EAAS,GAEb,EAAM,MAAM,EAAE,GAAG,OAAQ,AAAC,IACxB,GAAU,EAAK,QAAQ,EACzB,GAEA,EAAM,MAAM,EAAE,GAAG,OAAQ,AAAC,IACxB,GAAU,EAAK,QAAQ,EACzB,GAEA,EAAM,EAAE,CAAC,QAAS,AAAC,IACjB,EAAQ,MAAE,SAAM,EAAQ,QAAO,EACjC,GAEA,EAAM,EAAE,CAAC,QAAS,AAAC,IACjB,EAAO,EACT,EACF,EACF,CAEA,SAAS,EAAc,CAAc,EACnC,MAAO,CAAC,IAAI,EAAE,EAAK,IAAI,CAAC,KAAA,CAAM,AAChC,CAaA,SAAS,EAAiB,CAAuB,CAAE,CAAmB,CAAE,CAAY,CAAE,CAAiB,EACjG,AAAgB,GAAG,GAAZ,IAAI,CACb,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,MAAM,EAAE,EAAA,CAAM,EAEjD,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,MAAM,EAAE,EAAK,CAAC,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,CAEvF,CAEA,SAAS,EACP,CAAuB,CACvB,CAAmB,CACnB,CAA2B,CAC3B,CAAiB,EAEjB,IAAM,EAAa,GAAA,EAAA,oCAAA,CAAA,AAAoC,EAAE,EAAO,MAAM,CAAE,EAAY,qBAAqB,EACrG,EAAW,MAAM,CAAG,GAAG,AACzB,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,iBAAiB,EAAE,EAAW,IAAI,CAAC,MAAM,eAAe,CAAC,CAEhG,CAEO,eAAe,EAAK,CAAoB,EAC7C,IAAI,EAAc,GACZ,EAAgB,IAAI,IAC1B,GAAI,CACF,IAAM,EAAO,MAAM,EAAQ,IAAI,GACzB,EAAW,MAAM,OAAO,CAAC,EAAK,QAAQ,EAAI,EAAK,QAAQ,CAAG,EAAE,CAC5D,EAAe,AAA6B,iBAAtB,EAAK,YAAY,CAAgB,EAAK,YAAY,CAAC,IAAI,GAAK,GAClF,EAAwC,UAA3B,OAAO,EAAK,UAAU,CAAgB,EAAK,UAAU,CAAC,IAAI,GAAK,GAC5E,EAA0C,UAA5B,OAAO,EAAK,WAAW,CAAgB,EAAK,WAAW,CAAC,IAAI,GAAK,GAC/E,GAAS,CAAQ,EAAK,MAAM,CAC5B,EAA8B,UAAtB,OAAO,EAAK,KAAK,CAAgB,EAAK,KAAK,CAAG,GAEtD,EAA0B,EAAE,CAC5B,EAAsB,EAAE,CACxB,EAKD,EAAE,CACD,EAAY,IAAI,IAChB,EAAmB,CACvB,EACA,EACA,EACA,KAEI,EAAU,GAAG,CAAC,KAGlB,EAAU,GAAG,CAAC,EAAa,CAHK,AAGH,iBAAS,EAAQ,iBAAgB,GAC9D,EAAe,IAAI,CAAC,aAAE,UAAa,EAAS,yBAAQ,CAAgB,GACtE,EACM,EAAkB,MAAO,EAAqB,EAAqB,KACvE,IAAM,EAAoB,EAAE,CAC5B,GAAI,EAAK,cAAc,EAA4B,SAAxB,EAAK,cAAc,CAAa,CACzD,IAAM,EAAU,EAAc,CAAC,WAAY,EAAK,cAAc,CAAC,EAC/D,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,MAAM,EAAE,EAAA,CAAS,EACpD,IAAM,EAAmB,MAAM,EAAc,EAAa,CAAC,WAAY,EAAK,cAAc,CAAC,EAC3F,EAAiB,EAAe,EAAa,CAAC,OAAO,EAAE,EAAK,cAAc,CAAA,CAAE,CAAE,GAC9E,EAAQ,IAAI,CAAC,EACf,CAEA,GAAI,EAAK,kBAAkB,EAAI,CAAC,EAAK,cAAc,CAAE,CACnD,IAAM,EAAU,EAAc,CAAC,SAAU,KAAM,EAAa,EAC5D,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,MAAM,EAAE,EAAA,CAAS,EACpD,IAAM,EAAiB,MAAM,EAAc,EAAa,CAAC,SAAU,KAAM,EAAa,EACtF,EAAiB,EAAe,EAAa,CAAC,SAAS,EAAE,EAAA,CAAc,CAAE,GACzE,EAAQ,IAAI,CAAC,EACf,CAEA,OAAO,CACT,EAEA,GAAwB,IAApB,EAAS,MAAM,EAAU,CAAC,GAAgB,CAAC,GAAc,CAAC,EAC5D,OAAO,EAAA,EADkE,UACtD,CAAC,IAAI,CAAC,CACvB,SAAS,QADJ,QAEL,EACA,UAAW,CAAC,mBACd,AADiC,EAC9B,CAAE,OAAQ,GAAI,GAGnB,GAAI,CAAC,EAAkB,IAAiB,CAAC,EAAkB,IAAe,CAAC,EAAkB,GAC3F,OAAO,EAAA,EADkG,UACtF,CAAC,IAAI,CAAC,CACvB,SAAS,QADJ,QAEL,EACA,UAAW,CAAC,wBAAwB,AACtC,EAAG,CAAE,OAAQ,GAAI,GAGnB,GAAI,CAAC,EACH,KADU,EACH,EAAA,YAAY,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,UAGL,UAAW,CAAC,qBACd,AADmC,EAChC,CAAE,OAAQ,GAAI,GAGnB,CAAA,EAAA,EAAA,qBAAA,AAAoB,EAAE,GACtB,EAAc,EAEd,IAAM,EAHN,AAGuB,MAAM,CAAA,EAAA,EAAA,iBAAA,AAAgB,IACvC,EAAgB,EAAA,WADO,KACS,CAAC,cAAc,CAC/C,EAA+E,EAD/D,AACiE,CAEjF,EAAa,IAAM,CAAA,EAAA,EAAA,mBAAA,AAAkB,EAAE,GAE7C,IAAK,IAAM,IAFc,CAEI,EAAU,CACrC,GAAI,IAAc,CAChB,EAAU,IAAI,CAAC,yBACf,KACF,CAEA,IAAM,EAAe,OAAO,GACtB,EAAc,CAAA,EAAA,EAAA,mBAAA,AAAkB,EAAE,GAExC,GAAI,CAAC,GAAe,IAAgB,CAFhB,CAE8B,CAChD,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAa,gBAAgB,CAAC,EACrD,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAa,iBAAiB,CAAC,EAClD,EAAiB,GAAc,EAAO,cACtC,QACF,CAEA,GAAI,CAAC,CAAc,CAAC,EAAY,CAAE,CAChC,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,eAAe,CAAC,EACnD,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,gBAAgB,CAAC,EAChD,EAAiB,GAAa,EAAO,aACrC,QACF,CAEA,IAAM,EAAc,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAe,GACxC,GAAI,CAAC,GAAA,EAAA,UAAA,AAAS,EAAE,GAAc,CADV,AAElB,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,OADhC,MAC6C,CAAC,EACjD,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,cAAc,CAAC,EAC9C,EAAiB,GAAa,EAAO,WACrC,QACF,CAEA,GAAI,CAAC,GAAA,EAAA,UAAA,AAAS,EAAE,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAa,SAAU,CAC1C,CADG,CACW,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,KADrB,SACmC,CAAC,EAClD,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,mBAAmB,CAAC,EACnD,EAAiB,EAAa,GAAO,gBACrC,QACF,CAEA,GAAI,EAAQ,CACV,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,QAAS,SAAS,EAAA,CAAG,EAC3E,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,YAAa,UAAW,SAAU,EAAW,EAAA,CAAG,EACtG,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,YAAa,UAAW,SAAU,EAAa,EAAA,CAAG,EACxG,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,WAAY,WAAY,CAAC,WAAW,EAAE,EAAA,CAAc,CAAC,EAAA,CAAG,EAC9G,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,WAAY,KAAM,EAAc,CAAC,OAAO,EAAE,EAAA,CAAY,CAAC,EAAA,CAAG,EAChH,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,OAAQ,KAAM,SAAU,EAAa,EAAA,CAAG,EAC9F,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,YAAa,UAAW,SAAU,EAAY,EAAA,CAAG,EACvG,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,SAAU,cAAe,wBAAwB,EAAA,CAAG,EAC1G,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,WAAY,EAAa,EAAA,CAAG,EAClF,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,QAAS,UAAW,YAAa,CAAC,OAAO,EAAE,EAAA,CAAa,CAAC,EAAA,CAAG,EAClH,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,OAAQ,SAAU,EAAa,EAAA,CAAG,EACxF,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,WAAY,OAAO,EAAA,CAAG,EAC5E,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,QAAS,SAAS,EAAA,CAAG,EAC3E,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,YAAa,UAAW,SAAU,OAAO,EAAA,CAAG,EAClG,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,SAAU,cAAe,wBAAwB,EAAA,CAAG,EAC1G,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,QAAS,UAAW,YAAa,CAAC,OAAO,EAAE,EAAA,CAAc,CAAC,EAAA,CAAG,EACnH,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,OAAQ,SAAU,OAAO,EAAA,CAAG,EAClF,QACF,CAEA,IAAM,EAAiB,MAAM,CAAA,EAAA,EAAA,uBAAA,AAAsB,EAAE,EAAa,GAClE,GAAI,CAAC,EADwB,AACT,OAAO,CAAE,CAC3B,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,iBAAiB,EAAE,EAAe,KAAK,CAAA,CAAE,EAC5E,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,cAAc,EAAE,EAAe,KAAK,CAAA,CAAE,EACrE,EAAiB,GAAa,EAAO,cACrC,QACF,CAEA,IAAM,EAAgB,EAAe,KAAK,CAAC,WAAW,CACtD,EAAc,GAAG,CAAC,EAAe,KAAK,CAAC,YAAY,EACnD,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,YAAY,EAAE,EAAA,CAAe,EAEhE,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,QAAQ,CAAC,EAC5C,IAAM,EAAsB,MAAM,EAAc,EAAe,CAAC,SAAU,iBAAiB,EAC3F,EAAiB,EAAe,EAAa,SAAU,GAEvD,IAAM,EAA8B,CAClC,eAFqB,AAAiB,AAxLrC,EAwLyD,MAAM,CAxLzD,OAAO,CAAC,OAAQ,KAAK,IAAI,IAwLqC,OAGrE,oBAAoB,EACpB,gBAAgB,EAChB,sBAAuB,IAAI,GAC7B,EAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,QAAS,SAAS,EAAA,CAAG,EAC3E,IAAM,EAAc,MAAM,EAAc,EAAe,CAAC,QAAS,SAAS,EAE1E,GADA,EAAiB,EAAe,EAAa,OAAQ,GAC5B,IAArB,EAAY,IAAI,CAAQ,CAC1B,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,UAAU,EAAE,EAAY,MAAM,EAAI,EAAY,MAAM,CAAA,CAAE,EACrF,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,SAAU,GAC/C,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,YAAa,UAAW,SAAU,EAAW,EAAA,CAAG,EACtG,IAAM,EAAa,MAAM,EAAc,EAAe,CAAC,YAAa,UAAW,SAAU,EAAW,EAEpG,GADA,EAAiB,EAAe,EAAa,CAAC,UAAU,EAAE,EAAA,CAAY,CAAE,GACpE,CAAC,EAAW,MAAM,CAAC,IAAI,GAAI,CAC7B,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,SAAS,EAAE,EAAW,YAAY,CAAC,EAClE,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,CAAC,OAAO,EAAE,EAAW,IAAI,CAAC,CAAE,GACjE,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,YAAa,UAAW,SAAU,EAAa,EAAA,CAAG,EACxG,IAAM,EAAqB,MAAM,EAAc,EAAe,CAAC,YAAa,UAAW,SAAU,EAAa,EAC9G,EAAiB,EAAe,EAAa,CAAC,OAAO,EAAE,EAAA,CAAc,CAAE,GACvE,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,WAAY,WAAY,CAAC,WAAW,EAAE,EAAA,CAAc,CAAC,EAAA,CAAG,EAC9G,IAAM,EAAoB,MAAM,EAAc,EAAe,CAAC,WAAY,WAAY,CAAC,WAAW,EAAE,EAAA,CAAc,CAAC,EAGnH,GAFA,EAAiB,EAAe,EAAa,CAAC,OAAO,EAAE,EAAA,CAAc,CAAE,GAExC,IAA3B,EAAkB,IAAI,CAAQ,CAChC,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,WAAY,EAAa,EAAA,CAAG,EAClF,IAAM,EAAgB,MAAM,EAAc,EAAe,CAAC,WAAY,EAAa,EAGnF,GAFA,EAAiB,EAAe,EAAa,CAAC,QAAQ,EAAE,EAAA,CAAc,CAAE,GACxE,EAAsB,EAAe,EAAa,EAAa,GACpC,IAAvB,EAAc,IAAI,CAAQ,CAC5B,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,aAAa,EAAE,EAAc,MAAM,EAAI,EAAc,MAAM,CAAA,CAAE,EAC5F,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,YAAa,GAClD,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,QAAS,SAAS,EAAA,CAAG,EAC3E,IAAM,EAAmB,MAAM,EAAc,EAAe,CAAC,QAAS,SAAS,EAE/E,GADA,EAAiB,EAAe,EAAa,OAAQ,GACvB,IAA1B,EAAiB,IAAI,CAAQ,CAC/B,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,UAAU,EAAE,EAAiB,MAAM,EAAI,EAAiB,MAAM,CAAA,CAAE,EAC/F,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,SAAU,GAC/C,QACF,CACF,MAEE,CAFK,EACL,EAAY,cAAc,EAAG,EACzB,EAAmB,MAAM,CAAC,IAAI,GAAI,CACpC,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,WAAY,KAAM,EAAc,CAAC,OAAO,EAAE,EAAA,CAAc,CAAC,EAAA,CAAG,EAClH,IAAM,EAAiB,MAAM,EAAc,EAAe,CAAC,WAAY,KAAM,EAAc,CAAC,OAAO,EAAE,EAAA,CAAc,CAAC,EAGpH,GAFA,EAAiB,EAAe,EAAa,CAAC,QAAQ,EAAE,EAAA,CAAc,CAAE,GACxE,EAAsB,EAAe,EAAa,EAAa,GACnC,IAAxB,EAAe,IAAI,CAAQ,CAC7B,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,eAAe,EAAE,EAAe,MAAM,EAAI,EAAe,MAAM,CAAA,CAAE,EAChG,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,cAAe,GACpD,QACF,CACF,KAAO,CACL,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,WAAY,KAAM,EAAc,CAAC,OAAO,EAAE,EAAA,CAAY,CAAC,EAAA,CAAG,EAChH,IAAM,EAAe,MAAM,EAAc,EAAe,CAAC,WAAY,KAAM,EAAc,CAAC,OAAO,EAAE,EAAA,CAAY,CAAC,EAGhH,GAFA,EAAiB,EAAe,EAAa,CAAC,KAAK,EAAE,EAAA,CAAc,CAAE,GACrE,EAAsB,EAAe,EAAa,EAAa,GACrC,IAAtB,EAAa,IAAI,CAAQ,CAC3B,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,UAAU,EAAE,EAAa,MAAM,EAAI,EAAa,MAAM,CAAA,CAAE,EACvF,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,SAAU,GAC/C,QACF,CACA,EAAY,kBAAkB,EAAG,EAEjC,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,OAAQ,KAAM,SAAU,EAAa,EAAA,CAAG,EAC9F,IAAM,EAAa,MAAM,EAAc,EAAe,CAAC,OAAQ,KAAM,SAAU,EAAa,EAE5F,GADA,EAAiB,EAAe,EAAa,CAAC,KAAK,EAAE,EAAA,CAAc,CAAE,GAC7C,IAApB,EAAW,IAAI,CAAQ,CACzB,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,WAAW,EAAE,EAAW,MAAM,EAAI,EAAW,MAAM,CAAA,CAAE,EACpF,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,EAAa,GAAO,UAAW,GAChD,QACF,CACF,CAGF,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,YAAa,UAAW,SAAU,EAAY,EAAA,CAAG,EACvG,IAAM,EAAc,MAAM,EAAc,EAAe,CAAC,YAAa,UAAW,SAAU,EAAY,EAEtG,GADA,EAAiB,EAAe,EAAa,CAAC,UAAU,EAAE,EAAA,CAAa,CAAE,GACrE,CAAC,EAAY,MAAM,CAAC,IAAI,GAAI,CAC9B,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,SAAS,EAAE,EAAY,UAAU,CAAC,EACjE,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,CAAC,OAAO,EAAE,EAAY,IAAI,CAAC,CAAE,GAClE,QACF,CAIA,GAFA,EAAgB,IAAI,CAAC,CAAE,KAAM,EAAa,KAAM,EAAe,KAAM,CAAY,GAE7E,IAAc,CAChB,EAAU,IAAI,CAAC,yBACf,KACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,SAAU,cAAe,wBAAwB,EAAA,CAAG,EAC1G,IAAM,EAAe,MAAM,EAAc,EAAe,CAAC,SAAU,cAAe,wBAAwB,EAE1G,GADA,EAAiB,EAAe,EAAa,QAAS,GAClD,CAAA,EAAA,EAAA,2BAAA,AAA0B,EAAE,EAAa,KAAzC,CAA+C,CAAE,EAAY,qBAAqB,EAAG,CACvF,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,uBAAuB,CAAC,EACvD,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,YAAa,GAClD,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,WAAY,EAAa,EAAA,CAAG,EAClF,IAAM,EAAe,MAAM,EAAc,EAAe,CAAC,WAAY,EAAa,EAGlF,GAFA,EAAiB,EAAe,EAAa,CAAC,MAAM,EAAE,EAAA,CAAc,CAAE,GACtE,EAAsB,EAAe,EAAa,EAAa,GACrC,AAAtB,MAAa,IAAI,CAAQ,CAC3B,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,WAAW,EAAE,EAAa,MAAM,EAAI,EAAa,MAAM,CAAA,CAAE,EACxF,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,UAAW,GAChD,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,QAAS,UAAW,YAAa,CAAC,OAAO,EAAE,EAAA,CAAa,CAAC,EAAA,CAAG,EAClH,IAAM,EAAc,MAAM,EAAc,EAAe,CAAC,QAAS,UAAW,YAAa,CAAC,OAAO,EAAE,EAAA,CAAa,CAAC,EAEjH,GADA,EAAiB,EAAe,EAAa,CAAC,UAAU,EAAE,EAAA,CAAa,CAAE,GAChD,AAArB,MAAY,IAAI,CAAQ,CAC1B,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,QAAS,UAAU,EAAA,CAAG,EAC5E,IAAM,EAAc,MAAM,EAAc,EAAe,CAAC,QAAS,UAAU,EAC3E,EAAiB,EAAe,EAAa,OAAQ,GACrD,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,mBAAmB,CAAC,EACnD,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,OAAQ,GAC7C,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,OAAQ,SAAU,EAAa,EAAA,CAAG,EACxF,IAAM,EAAY,MAAM,EAAc,EAAe,CAAC,OAAQ,SAAU,EAAa,EAErF,GADA,EAAiB,EAAe,EAAa,CAAC,OAAO,EAAE,EAAA,CAAc,CAAE,GAChD,IAAnB,EAAU,IAAI,CAAQ,CACxB,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,YAAY,EAAE,EAAU,MAAM,EAAI,EAAU,MAAM,CAAA,CAAE,EACnF,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,WAAY,GACjD,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,QAAS,SAAS,EAAA,CAAG,EAC3E,IAAM,EAAY,MAAM,EAAc,EAAe,CAAC,QAAS,SAAS,EAExE,GADA,EAAiB,EAAe,EAAa,OAAQ,GAC9B,IAAnB,EAAU,IAAI,CAAQ,CACxB,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,UAAU,EAAE,EAAU,MAAM,EAAI,EAAU,MAAM,CAAA,CAAE,EACjF,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,SAAU,GAC/C,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,YAAa,UAAW,SAAU,OAAO,EAAA,CAAG,EAClG,IAAM,EAAa,MAAM,EAAc,EAAe,CAAC,YAAa,UAAW,SAAU,OAAO,EAEhG,GADA,EAAiB,EAAe,EAAa,iBAAkB,GAC3D,CAAC,EAAW,MAAM,CAAC,IAAI,GAAI,CAC7B,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,uBAAuB,CAAC,EACvD,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,kBAAmB,GACxD,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,SAAU,cAAe,wBAAwB,EAAA,CAAG,EAC1G,IAAM,EAAa,MAAM,EAAc,EAAe,CAAC,SAAU,cAAe,wBAAwB,EAExG,GADA,EAAiB,EAAe,EAAa,QAAS,GAClD,CAAA,EAAA,EAAA,2BAAA,AAA0B,EAAE,EAAW,KAAvC,CAA6C,CAAE,EAAY,qBAAqB,EAAG,CACrF,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,0BAA0B,CAAC,EAC1D,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,YAAa,GAClD,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,WAAY,OAAO,EAAA,CAAG,EAC5E,IAAM,EAAe,MAAM,EAAc,EAAe,CAAC,WAAY,OAAO,EAG5E,GAFA,EAAiB,EAAe,EAAa,WAAY,GACzD,EAAsB,EAAe,EAAa,EAAa,GAC3D,AAAsB,MAAT,IAAI,CAAQ,CAC3B,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,eAAe,EAAE,EAAa,MAAM,EAAI,EAAa,MAAM,CAAA,CAAE,EAC5F,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,cAAe,GACpD,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,QAAS,UAAW,YAAa,CAAC,OAAO,EAAE,EAAA,CAAc,CAAC,EAAA,CAAG,EACnH,IAAM,EAAgB,MAAM,EAAc,EAAe,CAAC,QAAS,UAAW,YAAa,CAAC,OAAO,EAAE,EAAA,CAAc,CAAC,EAEpH,GADA,EAAiB,EAAe,EAAa,CAAC,UAAU,EAAE,EAAa,OAAO,CAAC,CAAE,GACtD,IAAvB,EAAc,IAAI,CAAQ,CAC5B,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,QAAS,UAAU,EAAA,CAAG,EAC5E,IAAM,EAAY,MAAM,EAAc,EAAe,CAAC,QAAS,UAAU,EACzE,EAAiB,EAAe,EAAa,aAAc,GAC3D,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,0BAA0B,CAAC,EAC1D,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,cAAe,GACpD,QACF,CAEA,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,EAAE,EAAE,EAAc,CAAC,OAAQ,SAAU,OAAO,EAAA,CAAG,EAClF,IAAM,EAAW,MAAM,EAAc,EAAe,CAAC,OAAQ,SAAU,OAAO,EAE9E,GADA,EAAiB,EAAe,EAAa,UAAW,GACpD,AAAkB,MAAT,IAAI,CAAQ,CACvB,EAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,cAAc,EAAE,EAAS,MAAM,EAAI,EAAS,MAAM,CAAA,CAAE,EACnF,IAAM,EAAkB,MAAM,EAAgB,EAAa,EAAe,GAC1E,EAAiB,GAAa,EAAO,aAAc,GACnD,QACF,CAEA,EAAiB,EAAa,GAChC,CAEA,GAAI,CAAA,EAAA,EAAA,mBAAA,AAAkB,EAAE,GACtB,IAAK,CADyB,GACnB,IADT,CACoB,EAAgB,OAAO,GAAI,CAC/C,GAAM,MAAE,CAAI,MAAE,CAAI,MAAE,CAAI,CAAE,CAAG,EAG7B,GAAI,EAAK,cAAc,EAA4B,SAAxB,EAAK,cAAc,CAAa,CACzD,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAK,MAAM,EAAE,EAAc,CAAC,WAAY,EAAK,cAAc,CAAC,EAAA,CAAG,EACtF,IAAM,EAAmB,MAAM,IAA2B,CAAC,SAAd,EAA0B,EAAK,cAAc,CAAC,EAC3F,EAAiB,EAAe,EAAM,CAAC,OAAO,EAAE,EAAK,cAAc,CAAA,CAAE,CAAE,EACzE,CAEA,GAAI,EAAK,kBAAkB,EAAI,CAAC,EAAK,cAAc,CAAE,CACnD,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAK,MAAM,EAAE,EAAc,CAAC,SAAU,KAAM,EAAa,EAAA,CAAG,EACnF,IAAM,EAAiB,MAAM,EAVX,EAUsC,CAAC,SAAd,AAAwB,KAAM,EAAa,EACtF,EAAiB,EAAe,EAAM,CAAC,SAAS,EAAE,EAAA,CAAc,CAAE,EACpE,CACF,CAGF,OAAO,EAAA,YAAY,CAAC,IAAI,CAAC,CACvB,QAA8B,IAArB,EAAU,GADd,GACoB,eACzB,YACA,iBACA,CACF,EACF,CAAE,MAAO,EAAO,CAEd,OADA,QAAQ,KAAK,CAAC,mBAAoB,GAC3B,EAAA,YAAY,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,QAEU,EAAE,CACjB,UAAW,CAAC,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,AAC9D,EAAG,CAAE,OAAQ,GAAI,EACnB,QAAU,CACR,IAAK,IAAM,KAAgB,EACzB,GAAI,CACF,MAAM,CAAA,CAFgC,CAEhC,EAAA,wBAAA,AAAuB,EAAE,EACjC,CAAE,MAAO,CADD,CACe,CACrB,QAAQ,KAAK,CAAC,CAAC,UAAU,EAAE,EAAA,CAAc,CAAE,EAC7C,CAGE,GACF,CAAA,EAAA,EAAA,KADe,eACf,AAAmB,EAAE,EAEzB,CACF,WAHM,qJCrgBN,IAAA,EAGO,EAAA,CAFLA,AAEK,CAAA,OACP,EAA0B,EAAyB,CAA1CC,AAA0C,CAAA,GAAA,EAH9B,EAIrB,CADkB,CAD2C,AAEnB,EAAA,CAAjCC,AAAiC,CAFnC,AAEmC,GADhB,CAC8C,GAExE,EAAwC,EAAA,CAAA,CAFjBC,AAEiB,EAA5BC,KAWZ,IAAMC,AAb4B,EAad,GAXM,CAWN,EAAIL,AAbkB,YAEF,OAWhBA,CAAoB,CAC1CM,WAAY,CACVC,KAAMN,EAAAA,SAAAA,CAAUO,SAAS,CACzBC,KAAM,0BACNC,SAAU,oBACVC,SAAU,QACVC,WAAY,EACd,EACAC,iBAAkB,8DAClBC,iBAXF,CAA0B,WAYxBV,CACF,GAKM,kBAAEW,CAAgB,sBAAEC,CAAoB,aAAEC,CAAW,CAAE,CAAGZ,EAEhE,SAASH,IACP,MAAA,CAAA,EAAA,EAAOC,UAAAA,EAAY,kBACjBY,uBACAC,CACF,EACF","ignoreList":[1]}
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/app/api/uat-git-flow/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server';\nimport { spawn } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { sanitizeProjectName } from '@/lib/git-operations';\nimport { createUatGitFlowState, clearUatGitFlowState, isUatGitFlowAborted } from './state';\nimport {\n appendIgnoredPathsFromCheckoutWarning,\n hasBlockingWorkspaceChanges,\n} from './git-status-utils';\nimport { cleanupTempExecutionRepo, createTempExecutionRepo } from './temp-repo';\n\ntype GitResult = {\n code: number | null;\n stdout: string;\n stderr: string;\n};\n\nconst invalidBranchChars = /\\\\s/;\nconst FIXED_BASE_BRANCH = 'main';\nconst FINAL_MERGE_TARGET_BRANCHES = ['main', 'fix/main'] as const;\n\nfunction isValidBranchName(name: string) {\n if (!name) return false;\n if (invalidBranchChars.test(name)) return false;\n if (name.startsWith('-')) return false;\n return true;\n}\n\nfunction runGitCommand(cwd: string, args: string[]): Promise<GitResult> {\n return new Promise((resolve, reject) => {\n const child = spawn('git', args, {\n cwd,\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n resolve({ code, stdout, stderr });\n });\n\n child.on('error', (error) => {\n reject(error);\n });\n });\n}\n\nfunction formatCommand(args: string[]) {\n return `git ${args.join(' ')}`;\n}\n\ntype GitProjectInfo = {\n originalBranch: string;\n createdLocalBranch: boolean;\n hadLocalBranch: boolean;\n ignoredUntrackedPaths: Set<string>;\n};\n\nfunction sanitizeLogValue(value: string) {\n return value.replace(/\\s+/g, ' ').trim();\n}\n\nfunction logCommandResult(operationLogs: string[], projectName: string, step: string, result: GitResult) {\n if (result.code === 0) {\n operationLogs.push(`[${projectName}] 完成: ${step}`);\n } else {\n operationLogs.push(`[${projectName}] 失败: ${step} ${result.stderr || result.stdout}`);\n }\n}\n\nfunction trackCheckoutWarnings(\n operationLogs: string[],\n projectName: string,\n projectInfo: GitProjectInfo,\n result: GitResult,\n) {\n const addedPaths = appendIgnoredPathsFromCheckoutWarning(result.stderr, projectInfo.ignoredUntrackedPaths);\n if (addedPaths.length > 0) {\n operationLogs.push(`[${projectName}] 提示: 检测到子模块残留目录 ${addedPaths.join(', ')},状态检查将忽略对应未跟踪路径`);\n }\n}\n\nexport async function POST(request: NextRequest) {\n let activeRunId = '';\n const tempRootPaths = new Set<string>();\n try {\n const body = await request.json();\n const projects = Array.isArray(body.projects) ? body.projects : [];\n const createBranch = typeof body.createBranch === 'string' ? body.createBranch.trim() : '';\n const baseBranch = typeof body.baseBranch === 'string' ? body.baseBranch.trim() : '';\n const mergeBranch = typeof body.mergeBranch === 'string' ? body.mergeBranch.trim() : '';\n const dryRun = Boolean(body.dryRun);\n const runId = typeof body.runId === 'string' ? body.runId : '';\n\n const operationLogs: string[] = [];\n const feedbacks: string[] = [];\n const projectResults: Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n rollbackActions?: string[];\n }> = [];\n const resultMap = new Map<string, { success: boolean; reason?: string; rollbackActions?: string[] }>();\n const setProjectResult = (\n projectName: string,\n success: boolean,\n reason?: string,\n rollbackActions?: string[]\n ) => {\n if (resultMap.has(projectName)) {\n return;\n }\n resultMap.set(projectName, { success, reason, rollbackActions });\n projectResults.push({ projectName, success, reason, rollbackActions });\n };\n const rollbackProject = async (projectName: string, projectPath: string, info: GitProjectInfo) => {\n const actions: string[] = [];\n if (info.originalBranch && info.originalBranch !== 'HEAD') {\n const command = formatCommand(['checkout', info.originalBranch]);\n operationLogs.push(`[${projectName}] 回滚: ${command}`);\n const rollbackCheckout = await runGitCommand(projectPath, ['checkout', info.originalBranch]);\n logCommandResult(operationLogs, projectName, `回滚切换分支 ${info.originalBranch}`, rollbackCheckout);\n actions.push(command);\n }\n\n if (info.createdLocalBranch && !info.hadLocalBranch) {\n const command = formatCommand(['branch', '-D', createBranch]);\n operationLogs.push(`[${projectName}] 回滚: ${command}`);\n const rollbackDelete = await runGitCommand(projectPath, ['branch', '-D', createBranch]);\n logCommandResult(operationLogs, projectName, `回滚删除本地分支 ${createBranch}`, rollbackDelete);\n actions.push(command);\n }\n\n return actions;\n };\n\n if (projects.length === 0 || !createBranch || !baseBranch || !mergeBranch) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: ['缺少必要参数,请填写完整后重试。'],\n }, { status: 400 });\n }\n\n if (baseBranch !== FIXED_BASE_BRANCH) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: [`UAT 操作流从 origin 分支创建固定为 ${FIXED_BASE_BRANCH}。`],\n }, { status: 400 });\n }\n\n if (!isValidBranchName(createBranch) || !isValidBranchName(baseBranch) || !isValidBranchName(mergeBranch)) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: ['分支名称不合法,请避免空格或以 - 开头。'],\n }, { status: 400 });\n }\n\n if (!runId) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: ['缺少 runId,请刷新页面后重试。'],\n }, { status: 400 });\n }\n\n createUatGitFlowState(runId);\n activeRunId = runId;\n\n const projectsConfig = await getProjectsConfig();\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n const touchedProjects: Array<{ name: string; path: string; info: GitProjectInfo }> = [];\n\n const checkAbort = () => isUatGitFlowAborted(runId);\n\n projectLoop: for (const rawProjectName of projects) {\n if (checkAbort()) {\n feedbacks.push('已收到中断请求,开始回滚已执行的本地操作。');\n break;\n }\n\n const originalName = String(rawProjectName);\n const projectName = sanitizeProjectName(originalName);\n\n if (!projectName || projectName !== originalName) {\n operationLogs.push(`[${originalName}] 失败: 项目名称包含无效字符`);\n feedbacks.push(`[${originalName}] 项目名称包含无效字符,已跳过。`);\n setProjectResult(originalName, false, '项目名称包含无效字符');\n continue;\n }\n\n if (!projectsConfig[projectName]) {\n operationLogs.push(`[${projectName}] 失败: 未在项目配置中找到`);\n feedbacks.push(`[${projectName}] 未在项目配置中找到,已跳过。`);\n setProjectResult(projectName, false, '未在项目配置中找到');\n continue;\n }\n\n const projectPath = join(workspacePath, projectName);\n if (!existsSync(projectPath)) {\n operationLogs.push(`[${projectName}] 失败: 项目目录不存在`);\n feedbacks.push(`[${projectName}] 项目目录不存在,已跳过。`);\n setProjectResult(projectName, false, '项目目录不存在');\n continue;\n }\n\n if (!existsSync(join(projectPath, '.git'))) {\n operationLogs.push(`[${projectName}] 失败: 非 Git 仓库`);\n feedbacks.push(`[${projectName}] 不是有效的 Git 仓库,已跳过。`);\n setProjectResult(projectName, false, '不是有效的 Git 仓库');\n continue;\n }\n\n if (dryRun) {\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', baseBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', createBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['show-ref', '--verify', `refs/heads/${createBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', '-B', createBranch, `origin/${baseBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['push', '-u', 'origin', createBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', mergeBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', createBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${mergeBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', createBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', 'main'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', 'main'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${createBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', 'main'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', 'fix/main'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', 'fix/main'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${createBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', 'fix/main'])}`);\n continue;\n }\n\n const tempRepoResult = await createTempExecutionRepo(projectPath, projectName);\n if (!tempRepoResult.success) {\n operationLogs.push(`[${projectName}] 失败: 创建临时执行仓库失败 ${tempRepoResult.error}`);\n feedbacks.push(`[${projectName}] 创建临时执行仓库失败: ${tempRepoResult.error}`);\n setProjectResult(projectName, false, '创建临时执行仓库失败');\n continue;\n }\n\n const executionPath = tempRepoResult.value.projectPath;\n tempRootPaths.add(tempRepoResult.value.tempRootPath);\n operationLogs.push(`[${projectName}] 使用临时目录执行: ${executionPath}`);\n\n operationLogs.push(`[${projectName}] 检查当前分支`);\n const currentBranchResult = await runGitCommand(executionPath, ['branch', '--show-current']);\n logCommandResult(operationLogs, projectName, '当前分支检查', currentBranchResult);\n const originalBranch = sanitizeLogValue(currentBranchResult.stdout) || 'HEAD';\n const projectInfo: GitProjectInfo = {\n originalBranch,\n createdLocalBranch: false,\n hadLocalBranch: true,\n ignoredUntrackedPaths: new Set<string>(),\n };\n\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n const fetchResult = await runGitCommand(executionPath, ['fetch', 'origin']);\n logCommandResult(operationLogs, projectName, '拉取远端', fetchResult);\n if (fetchResult.code !== 0) {\n feedbacks.push(`[${projectName}] 拉取远端失败: ${fetchResult.stderr || fetchResult.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '拉取远端失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', baseBranch])}`);\n const baseExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', baseBranch]);\n logCommandResult(operationLogs, projectName, `检查 origin/${baseBranch}`, baseExists);\n if (!baseExists.stdout.trim()) {\n feedbacks.push(`[${projectName}] origin/${baseBranch} 不存在,无法创建分支。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `origin/${baseBranch} 不存在`, rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', createBranch])}`);\n const remoteCreateExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', createBranch]);\n logCommandResult(operationLogs, projectName, `检查远端分支 ${createBranch}`, remoteCreateExists);\n operationLogs.push(`[${projectName}] ${formatCommand(['show-ref', '--verify', `refs/heads/${createBranch}`])}`);\n const localCreateExists = await runGitCommand(executionPath, ['show-ref', '--verify', `refs/heads/${createBranch}`]);\n logCommandResult(operationLogs, projectName, `检查本地分支 ${createBranch}`, localCreateExists);\n\n if (localCreateExists.code === 0) {\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', createBranch])}`);\n const checkoutLocal = await runGitCommand(executionPath, ['checkout', createBranch]);\n logCommandResult(operationLogs, projectName, `切换到本地分支 ${createBranch}`, checkoutLocal);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, checkoutLocal);\n if (checkoutLocal.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到本地分支失败: ${checkoutLocal.stderr || checkoutLocal.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '切换到本地分支失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n const fetchLocalBranch = await runGitCommand(executionPath, ['fetch', 'origin']);\n logCommandResult(operationLogs, projectName, '拉取远端', fetchLocalBranch);\n if (fetchLocalBranch.code !== 0) {\n feedbacks.push(`[${projectName}] 拉取远端失败: ${fetchLocalBranch.stderr || fetchLocalBranch.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '拉取远端失败', rollbackActions);\n continue;\n }\n } else {\n projectInfo.hadLocalBranch = false;\n if (remoteCreateExists.stdout.trim()) {\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', '-B', createBranch, `origin/${createBranch}`])}`);\n const checkoutRemote = await runGitCommand(executionPath, ['checkout', '-B', createBranch, `origin/${createBranch}`]);\n logCommandResult(operationLogs, projectName, `切换到远端分支 ${createBranch}`, checkoutRemote);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, checkoutRemote);\n if (checkoutRemote.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到已有远端分支失败: ${checkoutRemote.stderr || checkoutRemote.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '切换到已有远端分支失败', rollbackActions);\n continue;\n }\n } else {\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', '-B', createBranch, `origin/${baseBranch}`])}`);\n const createResult = await runGitCommand(executionPath, ['checkout', '-B', createBranch, `origin/${baseBranch}`]);\n logCommandResult(operationLogs, projectName, `创建分支 ${createBranch}`, createResult);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, createResult);\n if (createResult.code !== 0) {\n feedbacks.push(`[${projectName}] 创建分支失败: ${createResult.stderr || createResult.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '创建分支失败', rollbackActions);\n continue;\n }\n projectInfo.createdLocalBranch = true;\n\n operationLogs.push(`[${projectName}] ${formatCommand(['push', '-u', 'origin', createBranch])}`);\n const pushResult = await runGitCommand(executionPath, ['push', '-u', 'origin', createBranch]);\n logCommandResult(operationLogs, projectName, `推送分支 ${createBranch}`, pushResult);\n if (pushResult.code !== 0) {\n feedbacks.push(`[${projectName}] 推送新分支失败: ${pushResult.stderr || pushResult.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '推送新分支失败', rollbackActions);\n continue;\n }\n }\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', mergeBranch])}`);\n const mergeExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', mergeBranch]);\n logCommandResult(operationLogs, projectName, `检查 origin/${mergeBranch}`, mergeExists);\n if (!mergeExists.stdout.trim()) {\n feedbacks.push(`[${projectName}] origin/${mergeBranch} 不存在,无法合并。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `origin/${mergeBranch} 不存在`, rollbackActions);\n continue;\n }\n\n touchedProjects.push({ name: projectName, path: executionPath, info: projectInfo });\n\n if (checkAbort()) {\n feedbacks.push('已收到中断请求,开始回滚已执行的本地操作。');\n break;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n const statusResult = await runGitCommand(executionPath, ['status', '--porcelain', '--untracked-files=all']);\n logCommandResult(operationLogs, projectName, '检查工作区', statusResult);\n if (hasBlockingWorkspaceChanges(statusResult.stdout, projectInfo.ignoredUntrackedPaths)) {\n feedbacks.push(`[${projectName}] 工作区有未提交改动,请先处理后再执行合并。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '工作区有未提交改动', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', createBranch])}`);\n const ensureBranch = await runGitCommand(executionPath, ['checkout', createBranch]);\n logCommandResult(operationLogs, projectName, `切换到分支 ${createBranch}`, ensureBranch);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, ensureBranch);\n if (ensureBranch.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到分支失败: ${ensureBranch.stderr || ensureBranch.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '切换到分支失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${mergeBranch}`])}`);\n const mergeResult = await runGitCommand(executionPath, ['merge', '--no-ff', '--no-edit', `origin/${mergeBranch}`]);\n logCommandResult(operationLogs, projectName, `合并 origin/${mergeBranch}`, mergeResult);\n if (mergeResult.code !== 0) {\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--abort'])}`);\n const abortResult = await runGitCommand(executionPath, ['merge', '--abort']);\n logCommandResult(operationLogs, projectName, '终止合并', abortResult);\n feedbacks.push(`[${projectName}] 合并冲突,已终止合并,请手动处理。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '合并冲突', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', createBranch])}`);\n const pushMerge = await runGitCommand(executionPath, ['push', 'origin', createBranch]);\n logCommandResult(operationLogs, projectName, `推送合并结果 ${createBranch}`, pushMerge);\n if (pushMerge.code !== 0) {\n feedbacks.push(`[${projectName}] 推送合并结果失败: ${pushMerge.stderr || pushMerge.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '推送合并结果失败', rollbackActions);\n continue;\n }\n\n for (const targetBranch of FINAL_MERGE_TARGET_BRANCHES) {\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n const fetchTarget = await runGitCommand(executionPath, ['fetch', 'origin']);\n logCommandResult(operationLogs, projectName, '拉取远端', fetchTarget);\n if (fetchTarget.code !== 0) {\n feedbacks.push(`[${projectName}] 拉取远端失败: ${fetchTarget.stderr || fetchTarget.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '拉取远端失败', rollbackActions);\n continue projectLoop;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', targetBranch])}`);\n const targetExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', targetBranch]);\n logCommandResult(operationLogs, projectName, `检查 origin/${targetBranch}`, targetExists);\n if (!targetExists.stdout.trim()) {\n feedbacks.push(`[${projectName}] origin/${targetBranch} 不存在,无法合并。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `origin/${targetBranch} 不存在`, rollbackActions);\n continue projectLoop;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n const statusTarget = await runGitCommand(executionPath, ['status', '--porcelain', '--untracked-files=all']);\n logCommandResult(operationLogs, projectName, '检查工作区', statusTarget);\n if (hasBlockingWorkspaceChanges(statusTarget.stdout, projectInfo.ignoredUntrackedPaths)) {\n feedbacks.push(`[${projectName}] 工作区有未提交改动,请先处理后再合并 ${targetBranch}。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '工作区有未提交改动', rollbackActions);\n continue projectLoop;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', targetBranch])}`);\n const checkoutTarget = await runGitCommand(executionPath, ['checkout', targetBranch]);\n logCommandResult(operationLogs, projectName, `切换到 ${targetBranch}`, checkoutTarget);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, checkoutTarget);\n if (checkoutTarget.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到 ${targetBranch} 失败: ${checkoutTarget.stderr || checkoutTarget.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `切换到 ${targetBranch} 失败`, rollbackActions);\n continue projectLoop;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${createBranch}`])}`);\n const mergeIntoTarget = await runGitCommand(executionPath, ['merge', '--no-ff', '--no-edit', `origin/${createBranch}`]);\n logCommandResult(operationLogs, projectName, `合并 origin/${createBranch} 到 ${targetBranch}`, mergeIntoTarget);\n if (mergeIntoTarget.code !== 0) {\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--abort'])}`);\n const abortTarget = await runGitCommand(executionPath, ['merge', '--abort']);\n logCommandResult(operationLogs, projectName, `终止合并到 ${targetBranch}`, abortTarget);\n feedbacks.push(`[${projectName}] 合并到 ${targetBranch} 冲突,已终止合并,请手动处理。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `合并到 ${targetBranch} 冲突`, rollbackActions);\n continue projectLoop;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', targetBranch])}`);\n const pushTarget = await runGitCommand(executionPath, ['push', 'origin', targetBranch]);\n logCommandResult(operationLogs, projectName, `推送 ${targetBranch}`, pushTarget);\n if (pushTarget.code !== 0) {\n feedbacks.push(`[${projectName}] 推送 ${targetBranch} 失败: ${pushTarget.stderr || pushTarget.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `推送 ${targetBranch} 失败`, rollbackActions);\n continue projectLoop;\n }\n }\n\n setProjectResult(projectName, true);\n }\n\n if (isUatGitFlowAborted(runId)) {\n for (const touched of touchedProjects.reverse()) {\n const { name, path, info } = touched;\n const projectPath = path;\n\n if (info.originalBranch && info.originalBranch !== 'HEAD') {\n operationLogs.push(`[${name}] 回滚: ${formatCommand(['checkout', info.originalBranch])}`);\n const rollbackCheckout = await runGitCommand(projectPath, ['checkout', info.originalBranch]);\n logCommandResult(operationLogs, name, `回滚切换分支 ${info.originalBranch}`, rollbackCheckout);\n }\n\n if (info.createdLocalBranch && !info.hadLocalBranch) {\n operationLogs.push(`[${name}] 回滚: ${formatCommand(['branch', '-D', createBranch])}`);\n const rollbackDelete = await runGitCommand(projectPath, ['branch', '-D', createBranch]);\n logCommandResult(operationLogs, name, `回滚删除本地分支 ${createBranch}`, rollbackDelete);\n }\n }\n }\n\n return NextResponse.json({\n success: feedbacks.length === 0,\n operationLogs,\n feedbacks,\n projectResults,\n });\n } catch (error) {\n console.error('UAT git 操作流执行失败:', error);\n return NextResponse.json({\n success: false,\n operationLogs: [],\n feedbacks: [error instanceof Error ? error.message : '执行失败'],\n }, { status: 500 });\n } finally {\n for (const tempRootPath of tempRootPaths) {\n try {\n await cleanupTempExecutionRepo(tempRootPath);\n } catch (cleanupError) {\n console.error(`清理临时目录失败: ${tempRootPath}`, cleanupError);\n }\n }\n\n if (activeRunId) {\n clearUatGitFlowState(activeRunId);\n }\n }\n}\n","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[1]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports={6849:e=>{"use strict";var{g:t,__dirname:i}=e;{e.s({POST:()=>k});var r=e.i(15494),o=e.i(87485),s=e.i(83886),a=e.i(30331),n=e.i(88941),u=e.i(35692),c=e.i(77159),h=e.i(16829),$=e.i(34926),l=e.i(33808);let t=/\\s/,i=["GWH","fix/GWH"];function p(e){return!(!e||t.test(e)||e.startsWith("-"))}function d(e,t){return new Promise((i,r)=>{let s=(0,o.spawn)("git",t,{cwd:e,stdio:["ignore","pipe","pipe"]}),a="",n="";s.stdout?.on("data",e=>{a+=e.toString()}),s.stderr?.on("data",e=>{n+=e.toString()}),s.on("close",e=>{i({code:e,stdout:a,stderr:n})}),s.on("error",e=>{r(e)})})}function g(e){return`git ${e.join(" ")}`}function f(e,t,i,r){0===r.code?e.push(`[${t}] 完成: ${i}`):e.push(`[${t}] 失败: ${i} ${r.stderr||r.stdout}`)}function w(e,t,i,r){let o=(0,$.appendIgnoredPathsFromCheckoutWarning)(r.stderr,i.ignoredUntrackedPaths);o.length>0&&e.push(`[${t}] 提示: 检测到子模块残留目录 ${o.join(", ")},状态检查将忽略对应未跟踪路径`)}async function k(e){let t="",o=new Set;try{let k=await e.json(),m=Array.isArray(k.projects)?k.projects:[],B="string"==typeof k.createBranch?k.createBranch.trim():"",b="string"==typeof k.baseBranch?k.baseBranch.trim():"",y="string"==typeof k.mergeBranch?k.mergeBranch.trim():"",P=!!k.dryRun,j="string"==typeof k.runId?k.runId:"",R=[],G=[],S=[],v=new Map,x=(e,t,i,r)=>{v.has(e)||(v.set(e,{success:t,reason:i,rollbackActions:r}),S.push({projectName:e,success:t,reason:i,rollbackActions:r}))},A=async(e,t,i)=>{let r=[];if(i.originalBranch&&"HEAD"!==i.originalBranch){let o=g(["checkout",i.originalBranch]);R.push(`[${e}] 回滚: ${o}`);let s=await d(t,["checkout",i.originalBranch]);f(R,e,`回滚切换分支 ${i.originalBranch}`,s),r.push(o)}if(i.createdLocalBranch&&!i.hadLocalBranch){let i=g(["branch","-D",B]);R.push(`[${e}] 回滚: ${i}`);let o=await d(t,["branch","-D",B]);f(R,e,`回滚删除本地分支 ${B}`,o),r.push(i)}return r};if(0===m.length||!B||!b||!y)return r.NextResponse.json({success:!1,operationLogs:R,feedbacks:["缺少必要参数,请填写完整后重试。"]},{status:400});if("GWH"!==b)return r.NextResponse.json({success:!1,operationLogs:R,feedbacks:[`武汉协和版本操作流从 origin 分支创建固定为 GWH。`]},{status:400});if(!p(B)||!p(b)||!p(y))return r.NextResponse.json({success:!1,operationLogs:R,feedbacks:["分支名称不合法,请避免空格或以 - 开头。"]},{status:400});if(!j)return r.NextResponse.json({success:!1,operationLogs:R,feedbacks:["缺少 runId,请刷新页面后重试。"]},{status:400});(0,h.createGwhGitFlowState)(j),t=j;let W=await (0,u.getProjectsConfig)(),E=n.WORKSPACE_CONFIG.WORKSPACE_ROOT,L=[],C=()=>(0,h.isGwhGitFlowAborted)(j);e:for(let e of m){if(C()){G.push("已收到中断请求,开始回滚已执行的本地操作。");break}let t=String(e),r=(0,c.sanitizeProjectName)(t);if(!r||r!==t){R.push(`[${t}] 失败: 项目名称包含无效字符`),G.push(`[${t}] 项目名称包含无效字符,已跳过。`),x(t,!1,"项目名称包含无效字符");continue}if(!W[r]){R.push(`[${r}] 失败: 未在项目配置中找到`),G.push(`[${r}] 未在项目配置中找到,已跳过。`),x(r,!1,"未在项目配置中找到");continue}let n=(0,a.join)(E,r);if(!(0,s.existsSync)(n)){R.push(`[${r}] 失败: 项目目录不存在`),G.push(`[${r}] 项目目录不存在,已跳过。`),x(r,!1,"项目目录不存在");continue}if(!(0,s.existsSync)((0,a.join)(n,".git"))){R.push(`[${r}] 失败: 非 Git 仓库`),G.push(`[${r}] 不是有效的 Git 仓库,已跳过。`),x(r,!1,"不是有效的 Git 仓库");continue}if(P){for(let e of(R.push(`[${r}] ${g(["fetch","origin"])}`),R.push(`[${r}] ${g(["ls-remote","--heads","origin",b])}`),R.push(`[${r}] ${g(["ls-remote","--heads","origin",B])}`),R.push(`[${r}] ${g(["show-ref","--verify",`refs/heads/${B}`])}`),R.push(`[${r}] ${g(["checkout","-B",B,`origin/${b}`])}`),R.push(`[${r}] ${g(["push","-u","origin",B])}`),R.push(`[${r}] ${g(["ls-remote","--heads","origin",y])}`),R.push(`[${r}] ${g(["status","--porcelain","--untracked-files=all"])}`),R.push(`[${r}] ${g(["checkout",B])}`),R.push(`[${r}] ${g(["merge","--no-ff","--no-edit",`origin/${y}`])}`),R.push(`[${r}] ${g(["push","origin",B])}`),i))R.push(`[${r}] ${g(["fetch","origin"])}`),R.push(`[${r}] ${g(["ls-remote","--heads","origin",e])}`),R.push(`[${r}] ${g(["status","--porcelain","--untracked-files=all"])}`),R.push(`[${r}] ${g(["checkout",e])}`),R.push(`[${r}] ${g(["merge","--no-ff","--no-edit",`origin/${B}`])}`),R.push(`[${r}] ${g(["push","origin",e])}`);continue}let u=await (0,l.createTempExecutionRepo)(n,r);if(!u.success){R.push(`[${r}] 失败: 创建临时执行仓库失败 ${u.error}`),G.push(`[${r}] 创建临时执行仓库失败: ${u.error}`),x(r,!1,"创建临时执行仓库失败");continue}let h=u.value.projectPath;o.add(u.value.tempRootPath),R.push(`[${r}] 使用临时目录执行: ${h}`),R.push(`[${r}] 检查当前分支`);let p=await d(h,["branch","--show-current"]);f(R,r,"当前分支检查",p);let k={originalBranch:p.stdout.replace(/\s+/g," ").trim()||"HEAD",createdLocalBranch:!1,hadLocalBranch:!0,ignoredUntrackedPaths:new Set};R.push(`[${r}] ${g(["fetch","origin"])}`);let m=await d(h,["fetch","origin"]);if(f(R,r,"拉取远端",m),0!==m.code){G.push(`[${r}] 拉取远端失败: ${m.stderr||m.stdout}`);let e=await A(r,h,k);x(r,!1,"拉取远端失败",e);continue}R.push(`[${r}] ${g(["ls-remote","--heads","origin",b])}`);let j=await d(h,["ls-remote","--heads","origin",b]);if(f(R,r,`检查 origin/${b}`,j),!j.stdout.trim()){G.push(`[${r}] origin/${b} 不存在,无法创建分支。`);let e=await A(r,h,k);x(r,!1,`origin/${b} 不存在`,e);continue}R.push(`[${r}] ${g(["ls-remote","--heads","origin",B])}`);let S=await d(h,["ls-remote","--heads","origin",B]);f(R,r,`检查远端分支 ${B}`,S),R.push(`[${r}] ${g(["show-ref","--verify",`refs/heads/${B}`])}`);let v=await d(h,["show-ref","--verify",`refs/heads/${B}`]);if(f(R,r,`检查本地分支 ${B}`,v),0===v.code){R.push(`[${r}] ${g(["checkout",B])}`);let e=await d(h,["checkout",B]);if(f(R,r,`切换到本地分支 ${B}`,e),w(R,r,k,e),0!==e.code){G.push(`[${r}] 切换到本地分支失败: ${e.stderr||e.stdout}`);let t=await A(r,h,k);x(r,!1,"切换到本地分支失败",t);continue}R.push(`[${r}] ${g(["fetch","origin"])}`);let t=await d(h,["fetch","origin"]);if(f(R,r,"拉取远端",t),0!==t.code){G.push(`[${r}] 拉取远端失败: ${t.stderr||t.stdout}`);let e=await A(r,h,k);x(r,!1,"拉取远端失败",e);continue}}else if(k.hadLocalBranch=!1,S.stdout.trim()){R.push(`[${r}] ${g(["checkout","-B",B,`origin/${B}`])}`);let e=await d(h,["checkout","-B",B,`origin/${B}`]);if(f(R,r,`切换到远端分支 ${B}`,e),w(R,r,k,e),0!==e.code){G.push(`[${r}] 切换到已有远端分支失败: ${e.stderr||e.stdout}`);let t=await A(r,h,k);x(r,!1,"切换到已有远端分支失败",t);continue}}else{R.push(`[${r}] ${g(["checkout","-B",B,`origin/${b}`])}`);let e=await d(h,["checkout","-B",B,`origin/${b}`]);if(f(R,r,`创建分支 ${B}`,e),w(R,r,k,e),0!==e.code){G.push(`[${r}] 创建分支失败: ${e.stderr||e.stdout}`);let t=await A(r,h,k);x(r,!1,"创建分支失败",t);continue}k.createdLocalBranch=!0,R.push(`[${r}] ${g(["push","-u","origin",B])}`);let t=await d(h,["push","-u","origin",B]);if(f(R,r,`推送分支 ${B}`,t),0!==t.code){G.push(`[${r}] 推送新分支失败: ${t.stderr||t.stdout}`);let e=await A(r,h,k);x(r,!1,"推送新分支失败",e);continue}}R.push(`[${r}] ${g(["ls-remote","--heads","origin",y])}`);let F=await d(h,["ls-remote","--heads","origin",y]);if(f(R,r,`检查 origin/${y}`,F),!F.stdout.trim()){G.push(`[${r}] origin/${y} 不存在,无法合并。`);let e=await A(r,h,k);x(r,!1,`origin/${y} 不存在`,e);continue}if(L.push({name:r,path:h,info:k}),C()){G.push("已收到中断请求,开始回滚已执行的本地操作。");break}R.push(`[${r}] ${g(["status","--porcelain","--untracked-files=all"])}`);let H=await d(h,["status","--porcelain","--untracked-files=all"]);if(f(R,r,"检查工作区",H),(0,$.hasBlockingWorkspaceChanges)(H.stdout,k.ignoredUntrackedPaths)){G.push(`[${r}] 工作区有未提交改动,请先处理后再执行合并。`);let e=await A(r,h,k);x(r,!1,"工作区有未提交改动",e);continue}R.push(`[${r}] ${g(["checkout",B])}`);let N=await d(h,["checkout",B]);if(f(R,r,`切换到分支 ${B}`,N),w(R,r,k,N),0!==N.code){G.push(`[${r}] 切换到分支失败: ${N.stderr||N.stdout}`);let e=await A(r,h,k);x(r,!1,"切换到分支失败",e);continue}R.push(`[${r}] ${g(["merge","--no-ff","--no-edit",`origin/${y}`])}`);let O=await d(h,["merge","--no-ff","--no-edit",`origin/${y}`]);if(f(R,r,`合并 origin/${y}`,O),0!==O.code){R.push(`[${r}] ${g(["merge","--abort"])}`);let e=await d(h,["merge","--abort"]);f(R,r,"终止合并",e),G.push(`[${r}] 合并冲突,已终止合并,请手动处理。`);let t=await A(r,h,k);x(r,!1,"合并冲突",t);continue}R.push(`[${r}] ${g(["push","origin",B])}`);let D=await d(h,["push","origin",B]);if(f(R,r,`推送合并结果 ${B}`,D),0!==D.code){G.push(`[${r}] 推送合并结果失败: ${D.stderr||D.stdout}`);let e=await A(r,h,k);x(r,!1,"推送合并结果失败",e);continue}for(let e of i){R.push(`[${r}] ${g(["fetch","origin"])}`);let t=await d(h,["fetch","origin"]);if(f(R,r,"拉取远端",t),0!==t.code){G.push(`[${r}] 拉取远端失败: ${t.stderr||t.stdout}`);let e=await A(r,h,k);x(r,!1,"拉取远端失败",e);continue e}R.push(`[${r}] ${g(["ls-remote","--heads","origin",e])}`);let i=await d(h,["ls-remote","--heads","origin",e]);if(f(R,r,`检查 origin/${e}`,i),!i.stdout.trim()){G.push(`[${r}] origin/${e} 不存在,无法合并。`);let t=await A(r,h,k);x(r,!1,`origin/${e} 不存在`,t);continue e}R.push(`[${r}] ${g(["status","--porcelain","--untracked-files=all"])}`);let o=await d(h,["status","--porcelain","--untracked-files=all"]);if(f(R,r,"检查工作区",o),(0,$.hasBlockingWorkspaceChanges)(o.stdout,k.ignoredUntrackedPaths)){G.push(`[${r}] 工作区有未提交改动,请先处理后再合并 ${e}。`);let t=await A(r,h,k);x(r,!1,"工作区有未提交改动",t);continue e}R.push(`[${r}] ${g(["checkout",e])}`);let s=await d(h,["checkout",e]);if(f(R,r,`切换到 ${e}`,s),w(R,r,k,s),0!==s.code){G.push(`[${r}] 切换到 ${e} 失败: ${s.stderr||s.stdout}`);let t=await A(r,h,k);x(r,!1,`切换到 ${e} 失败`,t);continue e}R.push(`[${r}] ${g(["merge","--no-ff","--no-edit",`origin/${B}`])}`);let a=await d(h,["merge","--no-ff","--no-edit",`origin/${B}`]);if(f(R,r,`合并 origin/${B} 到 ${e}`,a),0!==a.code){R.push(`[${r}] ${g(["merge","--abort"])}`);let t=await d(h,["merge","--abort"]);f(R,r,`终止合并到 ${e}`,t),G.push(`[${r}] 合并到 ${e} 冲突,已终止合并,请手动处理。`);let i=await A(r,h,k);x(r,!1,`合并到 ${e} 冲突`,i);continue e}R.push(`[${r}] ${g(["push","origin",e])}`);let n=await d(h,["push","origin",e]);if(f(R,r,`推送 ${e}`,n),0!==n.code){G.push(`[${r}] 推送 ${e} 失败: ${n.stderr||n.stdout}`);let t=await A(r,h,k);x(r,!1,`推送 ${e} 失败`,t);continue e}}x(r,!0)}if((0,h.isGwhGitFlowAborted)(j))for(let e of L.reverse()){let{name:t,path:i,info:r}=e;if(r.originalBranch&&"HEAD"!==r.originalBranch){R.push(`[${t}] 回滚: ${g(["checkout",r.originalBranch])}`);let e=await d(i,["checkout",r.originalBranch]);f(R,t,`回滚切换分支 ${r.originalBranch}`,e)}if(r.createdLocalBranch&&!r.hadLocalBranch){R.push(`[${t}] 回滚: ${g(["branch","-D",B])}`);let e=await d(i,["branch","-D",B]);f(R,t,`回滚删除本地分支 ${B}`,e)}}return r.NextResponse.json({success:0===G.length,operationLogs:R,feedbacks:G,projectResults:S})}catch(e){return console.error("武汉协和版本 git 操作流执行失败:",e),r.NextResponse.json({success:!1,operationLogs:[],feedbacks:[e instanceof Error?e.message:"执行失败"]},{status:500})}finally{for(let e of o)try{await (0,l.cleanupTempExecutionRepo)(e)}catch(t){console.error(`清理临时目录失败: ${e}`,t)}t&&(0,h.clearGwhGitFlowState)(t)}}}},71834:e=>{"use strict";var{g:t,__dirname:i}=e;{e.s({patchFetch:()=>n,routeModule:()=>t,serverHooks:()=>c,workAsyncStorage:()=>i,workUnitAsyncStorage:()=>u});var r=e.i(45746),o=e.i(93828),s=e.i(18250),a=e.i(6849);let t=new r.AppRouteRouteModule({definition:{kind:o.RouteKind.APP_ROUTE,page:"/api/gwh-git-flow/route",pathname:"/api/gwh-git-flow",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/gwh-git-flow/route.ts",nextConfigOutput:"",userland:a}),{workAsyncStorage:i,workUnitAsyncStorage:u,serverHooks:c}=t;function n(){return(0,s.patchFetch)({workAsyncStorage:i,workUnitAsyncStorage:u})}}}};
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=_f35a5421._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/app/api/gwh-git-flow/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server';\nimport { spawn } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { sanitizeProjectName } from '@/lib/git-operations';\nimport { createGwhGitFlowState, clearGwhGitFlowState, isGwhGitFlowAborted } from './state';\nimport {\n appendIgnoredPathsFromCheckoutWarning,\n hasBlockingWorkspaceChanges,\n} from '@/app/api/uat-git-flow/git-status-utils';\nimport { cleanupTempExecutionRepo, createTempExecutionRepo } from '@/app/api/uat-git-flow/temp-repo';\n\ntype GitResult = {\n code: number | null;\n stdout: string;\n stderr: string;\n};\n\nconst invalidBranchChars = /\\\\s/;\nconst FIXED_BASE_BRANCH = 'GWH';\nconst FINAL_MERGE_TARGET_BRANCHES = ['GWH', 'fix/GWH'] as const;\n\nfunction isValidBranchName(name: string) {\n if (!name) return false;\n if (invalidBranchChars.test(name)) return false;\n if (name.startsWith('-')) return false;\n return true;\n}\n\nfunction runGitCommand(cwd: string, args: string[]): Promise<GitResult> {\n return new Promise((resolve, reject) => {\n const child = spawn('git', args, {\n cwd,\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n resolve({ code, stdout, stderr });\n });\n\n child.on('error', (error) => {\n reject(error);\n });\n });\n}\n\nfunction formatCommand(args: string[]) {\n return `git ${args.join(' ')}`;\n}\n\ntype GitProjectInfo = {\n originalBranch: string;\n createdLocalBranch: boolean;\n hadLocalBranch: boolean;\n ignoredUntrackedPaths: Set<string>;\n};\n\nfunction sanitizeLogValue(value: string) {\n return value.replace(/\\s+/g, ' ').trim();\n}\n\nfunction logCommandResult(operationLogs: string[], projectName: string, step: string, result: GitResult) {\n if (result.code === 0) {\n operationLogs.push(`[${projectName}] 完成: ${step}`);\n } else {\n operationLogs.push(`[${projectName}] 失败: ${step} ${result.stderr || result.stdout}`);\n }\n}\n\nfunction trackCheckoutWarnings(\n operationLogs: string[],\n projectName: string,\n projectInfo: GitProjectInfo,\n result: GitResult,\n) {\n const addedPaths = appendIgnoredPathsFromCheckoutWarning(result.stderr, projectInfo.ignoredUntrackedPaths);\n if (addedPaths.length > 0) {\n operationLogs.push(`[${projectName}] 提示: 检测到子模块残留目录 ${addedPaths.join(', ')},状态检查将忽略对应未跟踪路径`);\n }\n}\n\nexport async function POST(request: NextRequest) {\n let activeRunId = '';\n const tempRootPaths = new Set<string>();\n try {\n const body = await request.json();\n const projects = Array.isArray(body.projects) ? body.projects : [];\n const createBranch = typeof body.createBranch === 'string' ? body.createBranch.trim() : '';\n const baseBranch = typeof body.baseBranch === 'string' ? body.baseBranch.trim() : '';\n const mergeBranch = typeof body.mergeBranch === 'string' ? body.mergeBranch.trim() : '';\n const dryRun = Boolean(body.dryRun);\n const runId = typeof body.runId === 'string' ? body.runId : '';\n\n const operationLogs: string[] = [];\n const feedbacks: string[] = [];\n const projectResults: Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n rollbackActions?: string[];\n }> = [];\n const resultMap = new Map<string, { success: boolean; reason?: string; rollbackActions?: string[] }>();\n const setProjectResult = (\n projectName: string,\n success: boolean,\n reason?: string,\n rollbackActions?: string[]\n ) => {\n if (resultMap.has(projectName)) {\n return;\n }\n resultMap.set(projectName, { success, reason, rollbackActions });\n projectResults.push({ projectName, success, reason, rollbackActions });\n };\n const rollbackProject = async (projectName: string, projectPath: string, info: GitProjectInfo) => {\n const actions: string[] = [];\n if (info.originalBranch && info.originalBranch !== 'HEAD') {\n const command = formatCommand(['checkout', info.originalBranch]);\n operationLogs.push(`[${projectName}] 回滚: ${command}`);\n const rollbackCheckout = await runGitCommand(projectPath, ['checkout', info.originalBranch]);\n logCommandResult(operationLogs, projectName, `回滚切换分支 ${info.originalBranch}`, rollbackCheckout);\n actions.push(command);\n }\n\n if (info.createdLocalBranch && !info.hadLocalBranch) {\n const command = formatCommand(['branch', '-D', createBranch]);\n operationLogs.push(`[${projectName}] 回滚: ${command}`);\n const rollbackDelete = await runGitCommand(projectPath, ['branch', '-D', createBranch]);\n logCommandResult(operationLogs, projectName, `回滚删除本地分支 ${createBranch}`, rollbackDelete);\n actions.push(command);\n }\n\n return actions;\n };\n\n if (projects.length === 0 || !createBranch || !baseBranch || !mergeBranch) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: ['缺少必要参数,请填写完整后重试。'],\n }, { status: 400 });\n }\n\n if (baseBranch !== FIXED_BASE_BRANCH) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: [`武汉协和版本操作流从 origin 分支创建固定为 ${FIXED_BASE_BRANCH}。`],\n }, { status: 400 });\n }\n\n if (!isValidBranchName(createBranch) || !isValidBranchName(baseBranch) || !isValidBranchName(mergeBranch)) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: ['分支名称不合法,请避免空格或以 - 开头。'],\n }, { status: 400 });\n }\n\n if (!runId) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: ['缺少 runId,请刷新页面后重试。'],\n }, { status: 400 });\n }\n\n createGwhGitFlowState(runId);\n activeRunId = runId;\n\n const projectsConfig = await getProjectsConfig();\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n const touchedProjects: Array<{ name: string; path: string; info: GitProjectInfo }> = [];\n\n const checkAbort = () => isGwhGitFlowAborted(runId);\n\n projectLoop: for (const rawProjectName of projects) {\n if (checkAbort()) {\n feedbacks.push('已收到中断请求,开始回滚已执行的本地操作。');\n break;\n }\n\n const originalName = String(rawProjectName);\n const projectName = sanitizeProjectName(originalName);\n\n if (!projectName || projectName !== originalName) {\n operationLogs.push(`[${originalName}] 失败: 项目名称包含无效字符`);\n feedbacks.push(`[${originalName}] 项目名称包含无效字符,已跳过。`);\n setProjectResult(originalName, false, '项目名称包含无效字符');\n continue;\n }\n\n if (!projectsConfig[projectName]) {\n operationLogs.push(`[${projectName}] 失败: 未在项目配置中找到`);\n feedbacks.push(`[${projectName}] 未在项目配置中找到,已跳过。`);\n setProjectResult(projectName, false, '未在项目配置中找到');\n continue;\n }\n\n const projectPath = join(workspacePath, projectName);\n if (!existsSync(projectPath)) {\n operationLogs.push(`[${projectName}] 失败: 项目目录不存在`);\n feedbacks.push(`[${projectName}] 项目目录不存在,已跳过。`);\n setProjectResult(projectName, false, '项目目录不存在');\n continue;\n }\n\n if (!existsSync(join(projectPath, '.git'))) {\n operationLogs.push(`[${projectName}] 失败: 非 Git 仓库`);\n feedbacks.push(`[${projectName}] 不是有效的 Git 仓库,已跳过。`);\n setProjectResult(projectName, false, '不是有效的 Git 仓库');\n continue;\n }\n\n if (dryRun) {\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', baseBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', createBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['show-ref', '--verify', `refs/heads/${createBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', '-B', createBranch, `origin/${baseBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['push', '-u', 'origin', createBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', mergeBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', createBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${mergeBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', createBranch])}`);\n\n for (const targetBranch of FINAL_MERGE_TARGET_BRANCHES) {\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', targetBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', targetBranch])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${createBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', targetBranch])}`);\n }\n continue;\n }\n\n const tempRepoResult = await createTempExecutionRepo(projectPath, projectName);\n if (!tempRepoResult.success) {\n operationLogs.push(`[${projectName}] 失败: 创建临时执行仓库失败 ${tempRepoResult.error}`);\n feedbacks.push(`[${projectName}] 创建临时执行仓库失败: ${tempRepoResult.error}`);\n setProjectResult(projectName, false, '创建临时执行仓库失败');\n continue;\n }\n\n const executionPath = tempRepoResult.value.projectPath;\n tempRootPaths.add(tempRepoResult.value.tempRootPath);\n operationLogs.push(`[${projectName}] 使用临时目录执行: ${executionPath}`);\n\n operationLogs.push(`[${projectName}] 检查当前分支`);\n const currentBranchResult = await runGitCommand(executionPath, ['branch', '--show-current']);\n logCommandResult(operationLogs, projectName, '当前分支检查', currentBranchResult);\n const originalBranch = sanitizeLogValue(currentBranchResult.stdout) || 'HEAD';\n const projectInfo: GitProjectInfo = {\n originalBranch,\n createdLocalBranch: false,\n hadLocalBranch: true,\n ignoredUntrackedPaths: new Set<string>(),\n };\n\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n const fetchResult = await runGitCommand(executionPath, ['fetch', 'origin']);\n logCommandResult(operationLogs, projectName, '拉取远端', fetchResult);\n if (fetchResult.code !== 0) {\n feedbacks.push(`[${projectName}] 拉取远端失败: ${fetchResult.stderr || fetchResult.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '拉取远端失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', baseBranch])}`);\n const baseExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', baseBranch]);\n logCommandResult(operationLogs, projectName, `检查 origin/${baseBranch}`, baseExists);\n if (!baseExists.stdout.trim()) {\n feedbacks.push(`[${projectName}] origin/${baseBranch} 不存在,无法创建分支。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `origin/${baseBranch} 不存在`, rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', createBranch])}`);\n const remoteCreateExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', createBranch]);\n logCommandResult(operationLogs, projectName, `检查远端分支 ${createBranch}`, remoteCreateExists);\n operationLogs.push(`[${projectName}] ${formatCommand(['show-ref', '--verify', `refs/heads/${createBranch}`])}`);\n const localCreateExists = await runGitCommand(executionPath, ['show-ref', '--verify', `refs/heads/${createBranch}`]);\n logCommandResult(operationLogs, projectName, `检查本地分支 ${createBranch}`, localCreateExists);\n\n if (localCreateExists.code === 0) {\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', createBranch])}`);\n const checkoutLocal = await runGitCommand(executionPath, ['checkout', createBranch]);\n logCommandResult(operationLogs, projectName, `切换到本地分支 ${createBranch}`, checkoutLocal);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, checkoutLocal);\n if (checkoutLocal.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到本地分支失败: ${checkoutLocal.stderr || checkoutLocal.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '切换到本地分支失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n const fetchLocalBranch = await runGitCommand(executionPath, ['fetch', 'origin']);\n logCommandResult(operationLogs, projectName, '拉取远端', fetchLocalBranch);\n if (fetchLocalBranch.code !== 0) {\n feedbacks.push(`[${projectName}] 拉取远端失败: ${fetchLocalBranch.stderr || fetchLocalBranch.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '拉取远端失败', rollbackActions);\n continue;\n }\n } else {\n projectInfo.hadLocalBranch = false;\n if (remoteCreateExists.stdout.trim()) {\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', '-B', createBranch, `origin/${createBranch}`])}`);\n const checkoutRemote = await runGitCommand(executionPath, ['checkout', '-B', createBranch, `origin/${createBranch}`]);\n logCommandResult(operationLogs, projectName, `切换到远端分支 ${createBranch}`, checkoutRemote);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, checkoutRemote);\n if (checkoutRemote.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到已有远端分支失败: ${checkoutRemote.stderr || checkoutRemote.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '切换到已有远端分支失败', rollbackActions);\n continue;\n }\n } else {\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', '-B', createBranch, `origin/${baseBranch}`])}`);\n const createResult = await runGitCommand(executionPath, ['checkout', '-B', createBranch, `origin/${baseBranch}`]);\n logCommandResult(operationLogs, projectName, `创建分支 ${createBranch}`, createResult);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, createResult);\n if (createResult.code !== 0) {\n feedbacks.push(`[${projectName}] 创建分支失败: ${createResult.stderr || createResult.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '创建分支失败', rollbackActions);\n continue;\n }\n projectInfo.createdLocalBranch = true;\n\n operationLogs.push(`[${projectName}] ${formatCommand(['push', '-u', 'origin', createBranch])}`);\n const pushResult = await runGitCommand(executionPath, ['push', '-u', 'origin', createBranch]);\n logCommandResult(operationLogs, projectName, `推送分支 ${createBranch}`, pushResult);\n if (pushResult.code !== 0) {\n feedbacks.push(`[${projectName}] 推送新分支失败: ${pushResult.stderr || pushResult.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '推送新分支失败', rollbackActions);\n continue;\n }\n }\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', mergeBranch])}`);\n const mergeExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', mergeBranch]);\n logCommandResult(operationLogs, projectName, `检查 origin/${mergeBranch}`, mergeExists);\n if (!mergeExists.stdout.trim()) {\n feedbacks.push(`[${projectName}] origin/${mergeBranch} 不存在,无法合并。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `origin/${mergeBranch} 不存在`, rollbackActions);\n continue;\n }\n\n touchedProjects.push({ name: projectName, path: executionPath, info: projectInfo });\n\n if (checkAbort()) {\n feedbacks.push('已收到中断请求,开始回滚已执行的本地操作。');\n break;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n const statusResult = await runGitCommand(executionPath, ['status', '--porcelain', '--untracked-files=all']);\n logCommandResult(operationLogs, projectName, '检查工作区', statusResult);\n if (hasBlockingWorkspaceChanges(statusResult.stdout, projectInfo.ignoredUntrackedPaths)) {\n feedbacks.push(`[${projectName}] 工作区有未提交改动,请先处理后再执行合并。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '工作区有未提交改动', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', createBranch])}`);\n const ensureBranch = await runGitCommand(executionPath, ['checkout', createBranch]);\n logCommandResult(operationLogs, projectName, `切换到分支 ${createBranch}`, ensureBranch);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, ensureBranch);\n if (ensureBranch.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到分支失败: ${ensureBranch.stderr || ensureBranch.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '切换到分支失败', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${mergeBranch}`])}`);\n const mergeResult = await runGitCommand(executionPath, ['merge', '--no-ff', '--no-edit', `origin/${mergeBranch}`]);\n logCommandResult(operationLogs, projectName, `合并 origin/${mergeBranch}`, mergeResult);\n if (mergeResult.code !== 0) {\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--abort'])}`);\n const abortResult = await runGitCommand(executionPath, ['merge', '--abort']);\n logCommandResult(operationLogs, projectName, '终止合并', abortResult);\n feedbacks.push(`[${projectName}] 合并冲突,已终止合并,请手动处理。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '合并冲突', rollbackActions);\n continue;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', createBranch])}`);\n const pushMerge = await runGitCommand(executionPath, ['push', 'origin', createBranch]);\n logCommandResult(operationLogs, projectName, `推送合并结果 ${createBranch}`, pushMerge);\n if (pushMerge.code !== 0) {\n feedbacks.push(`[${projectName}] 推送合并结果失败: ${pushMerge.stderr || pushMerge.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '推送合并结果失败', rollbackActions);\n continue;\n }\n\n for (const targetBranch of FINAL_MERGE_TARGET_BRANCHES) {\n operationLogs.push(`[${projectName}] ${formatCommand(['fetch', 'origin'])}`);\n const fetchTarget = await runGitCommand(executionPath, ['fetch', 'origin']);\n logCommandResult(operationLogs, projectName, '拉取远端', fetchTarget);\n if (fetchTarget.code !== 0) {\n feedbacks.push(`[${projectName}] 拉取远端失败: ${fetchTarget.stderr || fetchTarget.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '拉取远端失败', rollbackActions);\n continue projectLoop;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['ls-remote', '--heads', 'origin', targetBranch])}`);\n const targetExists = await runGitCommand(executionPath, ['ls-remote', '--heads', 'origin', targetBranch]);\n logCommandResult(operationLogs, projectName, `检查 origin/${targetBranch}`, targetExists);\n if (!targetExists.stdout.trim()) {\n feedbacks.push(`[${projectName}] origin/${targetBranch} 不存在,无法合并。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `origin/${targetBranch} 不存在`, rollbackActions);\n continue projectLoop;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['status', '--porcelain', '--untracked-files=all'])}`);\n const statusTarget = await runGitCommand(executionPath, ['status', '--porcelain', '--untracked-files=all']);\n logCommandResult(operationLogs, projectName, '检查工作区', statusTarget);\n if (hasBlockingWorkspaceChanges(statusTarget.stdout, projectInfo.ignoredUntrackedPaths)) {\n feedbacks.push(`[${projectName}] 工作区有未提交改动,请先处理后再合并 ${targetBranch}。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, '工作区有未提交改动', rollbackActions);\n continue projectLoop;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['checkout', targetBranch])}`);\n const checkoutTarget = await runGitCommand(executionPath, ['checkout', targetBranch]);\n logCommandResult(operationLogs, projectName, `切换到 ${targetBranch}`, checkoutTarget);\n trackCheckoutWarnings(operationLogs, projectName, projectInfo, checkoutTarget);\n if (checkoutTarget.code !== 0) {\n feedbacks.push(`[${projectName}] 切换到 ${targetBranch} 失败: ${checkoutTarget.stderr || checkoutTarget.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `切换到 ${targetBranch} 失败`, rollbackActions);\n continue projectLoop;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--no-ff', '--no-edit', `origin/${createBranch}`])}`);\n const mergeIntoTarget = await runGitCommand(executionPath, ['merge', '--no-ff', '--no-edit', `origin/${createBranch}`]);\n logCommandResult(operationLogs, projectName, `合并 origin/${createBranch} 到 ${targetBranch}`, mergeIntoTarget);\n if (mergeIntoTarget.code !== 0) {\n operationLogs.push(`[${projectName}] ${formatCommand(['merge', '--abort'])}`);\n const abortTarget = await runGitCommand(executionPath, ['merge', '--abort']);\n logCommandResult(operationLogs, projectName, `终止合并到 ${targetBranch}`, abortTarget);\n feedbacks.push(`[${projectName}] 合并到 ${targetBranch} 冲突,已终止合并,请手动处理。`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `合并到 ${targetBranch} 冲突`, rollbackActions);\n continue projectLoop;\n }\n\n operationLogs.push(`[${projectName}] ${formatCommand(['push', 'origin', targetBranch])}`);\n const pushTarget = await runGitCommand(executionPath, ['push', 'origin', targetBranch]);\n logCommandResult(operationLogs, projectName, `推送 ${targetBranch}`, pushTarget);\n if (pushTarget.code !== 0) {\n feedbacks.push(`[${projectName}] 推送 ${targetBranch} 失败: ${pushTarget.stderr || pushTarget.stdout}`);\n const rollbackActions = await rollbackProject(projectName, executionPath, projectInfo);\n setProjectResult(projectName, false, `推送 ${targetBranch} 失败`, rollbackActions);\n continue projectLoop;\n }\n }\n\n setProjectResult(projectName, true);\n }\n\n if (isGwhGitFlowAborted(runId)) {\n for (const touched of touchedProjects.reverse()) {\n const { name, path, info } = touched;\n const projectPath = path;\n\n if (info.originalBranch && info.originalBranch !== 'HEAD') {\n operationLogs.push(`[${name}] 回滚: ${formatCommand(['checkout', info.originalBranch])}`);\n const rollbackCheckout = await runGitCommand(projectPath, ['checkout', info.originalBranch]);\n logCommandResult(operationLogs, name, `回滚切换分支 ${info.originalBranch}`, rollbackCheckout);\n }\n\n if (info.createdLocalBranch && !info.hadLocalBranch) {\n operationLogs.push(`[${name}] 回滚: ${formatCommand(['branch', '-D', createBranch])}`);\n const rollbackDelete = await runGitCommand(projectPath, ['branch', '-D', createBranch]);\n logCommandResult(operationLogs, name, `回滚删除本地分支 ${createBranch}`, rollbackDelete);\n }\n }\n }\n\n return NextResponse.json({\n success: feedbacks.length === 0,\n operationLogs,\n feedbacks,\n projectResults,\n });\n } catch (error) {\n console.error('武汉协和版本 git 操作流执行失败:', error);\n return NextResponse.json({\n success: false,\n operationLogs: [],\n feedbacks: [error instanceof Error ? error.message : '执行失败'],\n }, { status: 500 });\n } finally {\n for (const tempRootPath of tempRootPaths) {\n try {\n await cleanupTempExecutionRepo(tempRootPath);\n } catch (cleanupError) {\n console.error(`清理临时目录失败: ${tempRootPath}`, cleanupError);\n }\n }\n\n if (activeRunId) {\n clearGwhGitFlowState(activeRunId);\n }\n }\n}\n","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[1]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports={67450:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({PROJECT_CONFIG_PATH:()=>c,ProjectStatus:()=>f,WORKSPACE_CONFIG:()=>b});var d=a.i(13442),e=a.i(30331);let b={WORKSPACE_ROOT:(0,e.join)((0,d.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,d.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},c=(0,e.join)((0,d.homedir)(),".prime-projects.json");var f=function(a){return a.PENDING="pending",a.EXISTING="existing",a.CLONING="cloning",a.SUCCESS="success",a.FAILED="failed",a.RETRYING="retrying",a.INCOMPLETE="incomplete",a}({})}},90250:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});var d=a.i(99559),e=a.i(57560),f=a.i(40490),g=a.i(50923),h=a.i(2031),i=a.i(94688),j=a.i(58413),k=a.i(22529),l=a.i(67450);let b=()=>{let a=(0,f.useRouter)(),[b,c]=(0,e.useState)({isInitializing:!1,isCompleted:!1,isLoading:!0,hasCompleted:!1,globalProgress:0,globalMessage:"正在检查工作空间状态...",projects:{}}),[m,n]=(0,e.useState)({selectedProjects:[],createBranch:"release/GDirect-",baseBranch:"main",mergeBranch:""}),[o,p]=(0,e.useState)({isRunning:!1,operationLogs:[],feedbacks:[],runId:""}),[q,r]=(0,e.useState)(!1),[s,t]=(0,e.useState)(null),[u,v]=(0,e.useState)(!1),[w,x]=(0,e.useState)(!1),[y,z]=(0,e.useState)([]),[A,B]=(0,e.useState)({});(0,e.useEffect)(()=>{C()},[]),(0,e.useEffect)(()=>{(async()=>{try{let a=await fetch("/api/admin-status"),b=await a.json();r(!!b?.isAdmin)}catch(a){console.error("获取管理员状态失败:",a),r(!1)}})()},[]);let C=async()=>{try{c(a=>({...a,isLoading:!0,globalMessage:"正在检查工作空间状态..."}));let a=await fetch("/api/check-workspace"),b=await a.json();if(b.success){let a={};b.projects.forEach(b=>{a[b.name]={name:b.name,status:b.status,progress:100*(b.status===l.ProjectStatus.EXISTING),message:b.message,canRetry:!1,needsCleanup:b.needsCleanup||!1}}),c(c=>({...c,isLoading:!1,projects:a,globalMessage:b.message||"检查完成"}))}else c(a=>({...a,isLoading:!1,globalMessage:b.error||"检查工作空间状态失败"}))}catch(a){c(a=>({...a,isLoading:!1,globalMessage:"无法连接到服务器,请刷新页面重试"})),console.error("检查工作空间状态失败:",a)}},D=a=>{switch(a.type){case"initialization":case"workspace_created":case"projects_loaded":if(c(b=>({...b,globalProgress:a.progress||0,globalMessage:a.message||""})),a.projects&&Array.isArray(a.projects)){let b={};a.projects.forEach(a=>{b[a]={name:a,status:l.ProjectStatus.PENDING,progress:0,message:"等待开始...",canRetry:!1}}),c(a=>({...a,projects:b}))}break;case"project_existing":if(a.projectName){let b=a.projectName;c(c=>({...c,globalProgress:a.progress??c.globalProgress,globalMessage:a.message??"",projects:{...c.projects,[b]:{...c.projects[b],status:l.ProjectStatus.EXISTING,message:"项目已存在",progress:100,canRetry:!1}}}))}break;case"project_start":if(a.projectName){let b=a.projectName;c(c=>({...c,globalProgress:a.progress??c.globalProgress,globalMessage:a.message??"",projects:{...c.projects,[b]:{...c.projects[b],status:l.ProjectStatus.CLONING,message:"开始克隆...",progress:0}}}))}break;case"project_progress":if(a.projectName){let b=a.projectName;c(c=>({...c,globalProgress:a.progress??c.globalProgress,projects:{...c.projects,[b]:{...c.projects[b],message:a.message??"",progress:Math.min(a.progress??0,100)}}}))}break;case"project_success":if(a.projectName){let b=a.projectName;c(c=>({...c,globalProgress:a.progress??c.globalProgress,projects:{...c.projects,[b]:{...c.projects[b],status:l.ProjectStatus.SUCCESS,message:"克隆成功",progress:100,canRetry:!1}}}))}break;case"project_failed":if(a.projectName){let b=a.projectName;c(c=>({...c,globalProgress:a.progress??c.globalProgress,projects:{...c.projects,[b]:{...c.projects[b],status:l.ProjectStatus.FAILED,message:"克隆失败",error:a.error,canRetry:!0}}}))}break;case"command_log":if(a.projectName&&a.logType&&void 0!==a.content&&a.timestamp){let b=a.projectName,d=a.logType,e=a.content,f=a.timestamp;c(a=>({...a,projects:{...a.projects,[b]:{...a.projects[b],logs:[...a.projects[b]?.logs||[],{type:d,content:e,timestamp:f}].slice(-1e3)}}}))}break;case"completion":c(b=>({...b,isInitializing:!1,isCompleted:!0,hasCompleted:!0,globalProgress:100,globalMessage:a.message??"初始化完成",completionSummary:a.result?{success:a.result.success,totalProjects:a.result.totalProjects,successCount:a.result.successCount,failedCount:a.result.failedCount,duration:a.result.duration}:void 0}));break;case"error":c(b=>({...b,isInitializing:!1,hasCompleted:!0,globalMessage:a.message??"发生错误",globalProgress:a.progress??b.globalProgress}))}},E=async(a,b="cursor")=>{c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],isOpening:!0}}}));try{let d=await fetch("/api/open-project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:a,editor:b})}),e=await d.json();if(e.success&&e.editorUrl){let a=document.createElement("a");a.href=e.editorUrl,a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a)}else console.error("打开项目失败:",e.error);c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],isOpening:!1}}}))}catch(b){c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],isOpening:!1}}})),console.error("打开项目失败:",b)}},F=async a=>{c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],isCleaningUp:!0}}}));try{let b=await fetch("/api/cleanup-project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:a})}),d=await b.json();d.success?c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],status:l.ProjectStatus.PENDING,message:"已清理,待克隆",isCleaningUp:!1,needsCleanup:!1}}})):c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],isCleaningUp:!1,error:d.error}}}))}catch(b){c(c=>({...c,projects:{...c.projects,[a]:{...c.projects[a],isCleaningUp:!1,error:b instanceof Error?b.message:String(b)}}}))}},G=async a=>{c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],status:l.ProjectStatus.RETRYING,message:"正在重试...",progress:0,canRetry:!1}}}));try{let b=await fetch("/api/retry-project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:a})}),d=await b.json();c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],status:d.success?l.ProjectStatus.SUCCESS:l.ProjectStatus.FAILED,message:d.message,error:d.error,progress:d.success?100:b.projects[a].progress,canRetry:!d.success}}}))}catch(b){c(c=>({...c,projects:{...c.projects,[a]:{...c.projects[a],status:l.ProjectStatus.FAILED,message:"重试失败",error:b instanceof Error?b.message:String(b),canRetry:!0}}}))}},H=a=>{switch(a){case l.ProjectStatus.EXISTING:case l.ProjectStatus.SUCCESS:return"text-green-600 bg-green-50 border-green-200";case l.ProjectStatus.FAILED:return"text-red-600 bg-red-50 border-red-200";case l.ProjectStatus.INCOMPLETE:return"text-orange-600 bg-orange-50 border-orange-200";case l.ProjectStatus.CLONING:case l.ProjectStatus.RETRYING:return"text-blue-600 bg-blue-50 border-blue-200";case l.ProjectStatus.PENDING:default:return"text-gray-600 bg-gray-50 border-gray-200"}},I=a=>{switch(a){case l.ProjectStatus.PENDING:return"待克隆";case l.ProjectStatus.EXISTING:return"已存在";case l.ProjectStatus.CLONING:return"克隆中";case l.ProjectStatus.SUCCESS:return"成功";case l.ProjectStatus.FAILED:return"失败";case l.ProjectStatus.INCOMPLETE:return"不完整";case l.ProjectStatus.RETRYING:return"重试中";default:return"未知"}},J=()=>{let a=Object.values(b.projects);return a.length>0&&a.every(a=>a.status===l.ProjectStatus.EXISTING)},K=b=>{a.push(`/configuration?project=${encodeURIComponent(b)}`)},L=(a,b)=>{n(c=>({...c,[a]:b}))},M=async a=>{let b=[];if(0===m.selectedProjects.length&&b.push("请先选择至少一个项目。"),m.createBranch.trim()||b.push("请填写创建分支名。"),m.baseBranch.trim()||b.push("请填写从 origin 哪个分支创建。"),m.mergeBranch.trim()||b.push("请填写被合并分支名称。"),b.length>0)return void p({isRunning:!1,operationLogs:[],feedbacks:b,runId:""});let c=`uat-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;p({isRunning:!0,operationLogs:[],feedbacks:[],runId:c});try{let b=await fetch("/api/uat-git-flow",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projects:m.selectedProjects,createBranch:m.createBranch.trim(),baseBranch:m.baseBranch.trim(),mergeBranch:m.mergeBranch.trim(),dryRun:a,runId:c})}),d=await b.json();p({isRunning:!1,operationLogs:Array.isArray(d.operationLogs)?d.operationLogs:[],feedbacks:Array.isArray(d.feedbacks)?d.feedbacks:[d.error||"执行失败"],runId:""}),Array.isArray(d.projectResults)&&(z(d.projectResults),x(!0))}catch(a){p({isRunning:!1,operationLogs:[],feedbacks:[a instanceof Error?a.message:"执行失败"],runId:""}),z([]),x(!1)}},N=async()=>{if(s&&o.runId)try{let a=await fetch("/api/uat-git-flow/step",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"execute",runId:o.runId,stepId:s.stepId})}),b=await a.json(),c=Array.isArray(b.operationLogs)?b.operationLogs:[],d=Array.isArray(b.feedbacks)?b.feedbacks:[b.error||"执行失败"];if(!b.success){p(a=>({...a,isRunning:!1,operationLogs:c,feedbacks:d,runId:""})),t(null),v(!1);return}p(a=>({...a,operationLogs:c,feedbacks:d,isRunning:!b.isComplete,runId:b.isComplete?"":a.runId})),b.nextStep?(t(b.nextStep),v(!0)):(t(null),v(!1),Array.isArray(b.projectResults)&&(z(b.projectResults),x(!0)))}catch(a){p(b=>({...b,isRunning:!1,operationLogs:b.operationLogs,feedbacks:[...b.feedbacks,a instanceof Error?a.message:"执行失败"],runId:""})),t(null),v(!1)}},O=async()=>{if(o.runId)try{let a=await fetch("/api/uat-git-flow/abort",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({runId:o.runId})}),b=await a.json();b&&Array.isArray(b.operationLogs)?p(a=>({...a,isRunning:!1,operationLogs:b.operationLogs,feedbacks:Array.isArray(b.feedbacks)?b.feedbacks:a.feedbacks,runId:""})):p(a=>({...a,isRunning:!1,runId:""})),Array.isArray(b.projectResults)&&(z(b.projectResults),x(!0)),t(null),v(!1)}catch(a){p(b=>({...b,feedbacks:[...b.feedbacks,a instanceof Error?a.message:"中断失败"]}))}};return(0,d.jsxs)("div",{className:"container mx-auto p-4 sm:p-6 md:p-8",children:[(0,d.jsxs)("div",{className:"flex justify-between items-center mb-6",children:[(0,d.jsx)("h1",{className:"text-2xl font-bold",children:"项目初始化"}),b.isLoading?(0,d.jsx)(g.Button,{disabled:!0,children:"检查中..."}):(0,d.jsx)(g.Button,{onClick:()=>{c(a=>({...a,isInitializing:!0,isCompleted:!1,hasCompleted:!1,globalProgress:0,globalMessage:"正在连接服务器...",projects:{},completionSummary:void 0}));let a=new EventSource("/api/initialize-workspace");a.onmessage=a=>{try{let b=JSON.parse(a.data);D(b)}catch(a){console.error("解析 SSE 消息失败:",a)}},a.onerror=()=>{c(a=>a.hasCompleted?a:{...a,isInitializing:!1,globalMessage:"连接服务器失败,请重试"}),a.close()},a.addEventListener("error",()=>{a.close()})},disabled:b.isInitializing,children:b.isInitializing?"初始化中...":"创建项目空间"})]}),(b.isInitializing||b.isCompleted)&&!J()&&(0,d.jsxs)("div",{className:"mb-6 p-4 bg-gray-50 rounded-lg",children:[(0,d.jsxs)("div",{className:"flex justify-between items-center mb-2",children:[(0,d.jsx)("span",{className:"text-sm font-medium",children:b.globalMessage}),(0,d.jsxs)("span",{className:"text-sm text-gray-600",children:[b.globalProgress,"%"]})]}),(0,d.jsx)("div",{className:"w-full bg-gray-200 rounded-full h-2",children:(0,d.jsx)("div",{className:"bg-blue-600 h-2 rounded-full transition-all duration-300",style:{width:`${b.globalProgress}%`}})})]}),b.completionSummary&&!J()&&(0,d.jsxs)("div",{className:`mb-6 p-4 rounded-lg border ${b.completionSummary.success?"bg-green-50 border-green-200":"bg-yellow-50 border-yellow-200"}`,children:[(0,d.jsx)("h3",{className:"font-semibold mb-2",children:"初始化完成"}),(0,d.jsxs)("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm",children:[(0,d.jsxs)("div",{children:["总项目数: ",b.completionSummary.totalProjects]}),(0,d.jsxs)("div",{className:"text-green-600",children:["成功: ",b.completionSummary.successCount]}),(0,d.jsxs)("div",{className:"text-red-600",children:["失败: ",b.completionSummary.failedCount]}),(0,d.jsxs)("div",{children:["耗时: ",Math.round(b.completionSummary.duration/1e3),"s"]})]})]}),(0,d.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4",children:Object.keys(b.projects).length>0?Object.values(b.projects).map(a=>(0,d.jsxs)("div",{className:`border rounded-lg p-4 ${H(a.status)}`,children:[(0,d.jsxs)("div",{className:"flex justify-between items-start mb-2",children:[(0,d.jsx)("h2",{className:"font-semibold cursor-pointer hover:text-blue-600 transition-colors",onClick:()=>K(a.name),title:"点击进入项目配置",children:a.name}),(0,d.jsx)("span",{className:"text-xs px-2 py-1 rounded-full bg-white",children:I(a.status)})]}),(0,d.jsx)("p",{className:"text-sm mb-2",children:a.message}),a.status===l.ProjectStatus.CLONING||a.status===l.ProjectStatus.RETRYING?(0,d.jsxs)("div",{className:"mb-2",children:[(0,d.jsx)("div",{className:"w-full bg-white rounded-full h-1",children:(0,d.jsx)("div",{className:"bg-current h-1 rounded-full transition-all duration-300",style:{width:`${a.progress}%`}})}),(0,d.jsxs)("span",{className:"text-xs",children:[a.progress,"%"]})]}):null,a.error&&(0,d.jsx)("p",{className:"text-xs text-red-600 mb-2",children:a.error}),(0,d.jsxs)("div",{className:"space-y-2",children:[a.canRetry&&(0,d.jsx)(g.Button,{size:"sm",variant:"outline",onClick:()=>G(a.name),className:"w-full",children:"重试"}),a.needsCleanup&&a.status===l.ProjectStatus.INCOMPLETE&&(0,d.jsx)(g.Button,{size:"sm",variant:"destructive",onClick:()=>F(a.name),disabled:a.isCleaningUp,className:"w-full",children:a.isCleaningUp?"清理中...":"清理项目"}),(a.status===l.ProjectStatus.EXISTING||a.status===l.ProjectStatus.SUCCESS)&&(0,d.jsx)(h.EditorSplitButton,{onOpen:b=>E(a.name,b),loading:a.isOpening,loadingText:"打开中...",size:"sm",variant:"default",className:"w-full"}),a.logs&&a.logs.length>0&&(0,d.jsx)(g.Button,{size:"sm",variant:"outline",onClick:()=>B(b=>({...b,[a.name]:!b[a.name]})),className:"w-full",children:A[a.name]?"隐藏日志":`查看日志 (${a.logs.length})`})]}),A[a.name]&&a.logs&&a.logs.length>0&&(0,d.jsx)("div",{className:"mt-3 border-t pt-3",children:(0,d.jsx)("div",{className:"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto",children:a.logs.map((a,b)=>(0,d.jsxs)("div",{className:`mb-1 ${"stderr"===a.type?"text-red-400":"progress"===a.type?"text-yellow-400":"text-green-400"}`,children:[(0,d.jsx)("span",{className:"text-gray-500 mr-2",children:new Date(a.timestamp).toLocaleTimeString()}),(0,d.jsxs)("span",{className:"text-blue-400 mr-2",children:["[",a.type,"]"]}),(0,d.jsx)("span",{className:"whitespace-pre-wrap",children:a.content})]},b))})})]},a.name)):(0,d.jsx)("div",{className:"col-span-full text-center text-gray-500 py-8",children:b.isLoading?"正在检查项目状态...":b.isInitializing?"正在加载项目...":'点击"创建项目空间"开始初始化'})}),q&&(0,d.jsxs)("div",{className:"mt-8 rounded-lg border bg-white p-4 shadow-sm",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4",children:[(0,d.jsx)("h2",{className:"text-lg font-semibold",children:"UAT上线前 Git 操作流"}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.Button,{onClick:()=>M(!1),disabled:o.isRunning,children:o.isRunning?"执行中...":"执行"}),(0,d.jsx)(g.Button,{variant:"outline",onClick:()=>M(!0),disabled:o.isRunning,children:"DRY RUN"}),(0,d.jsx)(g.Button,{variant:"destructive",onClick:O,disabled:!o.isRunning,children:"中断"})]})]}),(0,d.jsxs)("div",{className:"grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"uat-projects",children:"选择项目"}),(0,d.jsx)("select",{id:"uat-projects",multiple:!0,value:m.selectedProjects,onChange:a=>{let b=Array.from(a.target.selectedOptions).map(a=>a.value);n(a=>({...a,selectedProjects:b}))},className:"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",children:0===Object.keys(b.projects).length?(0,d.jsx)("option",{value:"",disabled:!0,children:"暂无可用项目"}):Object.keys(b.projects).map(a=>(0,d.jsx)("option",{value:a,children:a},a))}),(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"按住 Command / Ctrl 可多选"})]}),(0,d.jsxs)("div",{className:"grid gap-4",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"uat-create-branch",children:"创建分支名"}),(0,d.jsx)(i.Input,{id:"uat-create-branch",value:m.createBranch,onChange:a=>L("createBranch",a.target.value),placeholder:"例如: release/uat-2026-01"})]}),(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"uat-base-branch",children:"从 origin 哪个分支创建"}),(0,d.jsx)(i.Input,{id:"uat-base-branch",value:m.baseBranch,onChange:a=>L("baseBranch",a.target.value),placeholder:"例如: develop"})]}),(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"uat-merge-branch",children:"被合并分支名称"}),(0,d.jsx)(i.Input,{id:"uat-merge-branch",value:m.mergeBranch,onChange:a=>L("mergeBranch",a.target.value),placeholder:"例如: release/candidate"})]})]})]}),(0,d.jsxs)("div",{className:"mt-6 grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"操作记录"}),0===o.operationLogs.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无记录"}):(0,d.jsx)("div",{className:"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto",children:o.operationLogs.map((a,b)=>(0,d.jsx)("div",{className:"mb-1 whitespace-pre-wrap",children:a},b))})]}),(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"反馈信息"}),0===o.feedbacks.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无反馈"}):(0,d.jsx)("div",{className:"space-y-1 text-sm",children:o.feedbacks.map((a,b)=>(0,d.jsx)("div",{className:"rounded bg-gray-50 px-2 py-1 text-gray-700",children:a},b))})]})]})]}),(0,d.jsx)(k.Dialog,{open:!1,onOpenChange:a=>{!a&&s&&o.isRunning||v(a)},children:(0,d.jsxs)(k.DialogContent,{showCloseButton:!1,children:[(0,d.jsxs)(k.DialogHeader,{children:[(0,d.jsx)(k.DialogTitle,{children:"确认执行下一步"}),(0,d.jsx)(k.DialogDescription,{children:s?`${s.projectName} \xb7 ${s.description}`:"准备下一步执行"})]}),(0,d.jsx)("div",{className:"rounded-md border bg-gray-50 p-3 text-sm font-mono text-gray-700",children:s?s.command:""}),(0,d.jsxs)(k.DialogFooter,{children:[(0,d.jsx)(g.Button,{variant:"outline",onClick:O,children:"取消执行"}),(0,d.jsx)(g.Button,{onClick:N,disabled:!s,children:"确认并执行"})]})]})}),(0,d.jsx)(k.Dialog,{open:q&&w,onOpenChange:x,children:(0,d.jsxs)(k.DialogContent,{children:[(0,d.jsxs)(k.DialogHeader,{children:[(0,d.jsx)(k.DialogTitle,{children:"操作结果"}),(0,d.jsx)(k.DialogDescription,{children:"查看所有项目执行结果"})]}),(0,d.jsx)("div",{className:"space-y-2",children:0===y.length?(0,d.jsx)("p",{className:"text-sm text-gray-500",children:"暂无结果"}):y.map(a=>(0,d.jsxs)("div",{className:`rounded-md border px-3 py-2 text-sm ${a.success?"bg-green-50 text-green-700":"bg-red-50 text-red-700"}`,children:[(0,d.jsxs)("div",{className:"flex items-start justify-between",children:[(0,d.jsx)("span",{className:"font-medium",children:a.projectName}),(0,d.jsx)("span",{className:"ml-4 text-right",children:a.success?"成功":a.reason||"失败"})]}),!a.success&&a.rollbackActions&&a.rollbackActions.length>0&&(0,d.jsxs)("div",{className:"mt-2 text-xs text-gray-600",children:[(0,d.jsx)("div",{className:"font-semibold text-gray-700",children:"已回滚操作:"}),(0,d.jsx)("ul",{className:"mt-1 list-disc pl-4",children:a.rollbackActions.map((b,c)=>(0,d.jsx)("li",{children:b},`${a.projectName}-rollback-${c}`))})]})]},a.projectName))}),(0,d.jsx)(k.DialogFooter,{children:(0,d.jsx)(g.Button,{onClick:()=>x(!1),children:"关闭"})})]})})]})}}}};
|
|
1
|
+
module.exports={67450:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({PROJECT_CONFIG_PATH:()=>c,ProjectStatus:()=>f,WORKSPACE_CONFIG:()=>b});var d=a.i(13442),e=a.i(30331);let b={WORKSPACE_ROOT:(0,e.join)((0,d.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,d.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},c=(0,e.join)((0,d.homedir)(),".prime-projects.json");var f=function(a){return a.PENDING="pending",a.EXISTING="existing",a.CLONING="cloning",a.SUCCESS="success",a.FAILED="failed",a.RETRYING="retrying",a.INCOMPLETE="incomplete",a}({})}},90250:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});var d=a.i(99559),e=a.i(57560),f=a.i(40490),g=a.i(50923),h=a.i(2031),i=a.i(94688),j=a.i(58413),k=a.i(22529),l=a.i(67450);let b=()=>{let a=(0,f.useRouter)(),[b,c]=(0,e.useState)({isInitializing:!1,isCompleted:!1,isLoading:!0,hasCompleted:!1,globalProgress:0,globalMessage:"正在检查工作空间状态...",projects:{}}),[m,n]=(0,e.useState)({selectedProjects:[],createBranch:"release/",baseBranch:"main",mergeBranch:"feature/"}),[o,p]=(0,e.useState)({isRunning:!1,operationLogs:[],feedbacks:[],runId:""}),[q,r]=(0,e.useState)({selectedProjects:[],createBranch:"release/",baseBranch:"GWH",mergeBranch:"feature/"}),[s,t]=(0,e.useState)({isRunning:!1,operationLogs:[],feedbacks:[],runId:""}),[u,v]=(0,e.useState)({selectedProjects:[],targetBranch:"main",sourceBranch:""}),[w,x]=(0,e.useState)({isRunning:!1,operationLogs:[],feedbacks:[],progress:0,totalProjects:0,completedProjects:0,currentProject:""}),[y,z]=(0,e.useState)({selectedProjects:[],createBranch:"",baseBranch:"main"}),[A,B]=(0,e.useState)({isRunning:!1,operationLogs:[],feedbacks:[],progress:0,totalProjects:0,completedProjects:0,currentProject:""}),[C,D]=(0,e.useState)({selectedProjects:[],branchName:""}),[E,F]=(0,e.useState)({isRunning:!1,operationLogs:[],feedbacks:[],progress:0,totalProjects:0,completedProjects:0,currentProject:""}),[G,H]=(0,e.useState)(!1),[I,J]=(0,e.useState)(null),[K,L]=(0,e.useState)(!1),[M,N]=(0,e.useState)(!1),[O,P]=(0,e.useState)([]),[Q,R]=(0,e.useState)({});(0,e.useEffect)(()=>{S()},[]),(0,e.useEffect)(()=>{(async()=>{try{let a=await fetch("/api/admin-status"),b=await a.json();H(!!b?.isAdmin)}catch(a){console.error("获取管理员状态失败:",a),H(!1)}})()},[]);let S=async()=>{try{c(a=>({...a,isLoading:!0,globalMessage:"正在检查工作空间状态..."}));let a=await fetch("/api/check-workspace"),b=await a.json();if(b.success){let a={};b.projects.forEach(b=>{a[b.name]={name:b.name,status:b.status,progress:100*(b.status===l.ProjectStatus.EXISTING),message:b.message,canRetry:!1,needsCleanup:b.needsCleanup||!1}}),c(c=>({...c,isLoading:!1,projects:a,globalMessage:b.message||"检查完成"}))}else c(a=>({...a,isLoading:!1,globalMessage:b.error||"检查工作空间状态失败"}))}catch(a){c(a=>({...a,isLoading:!1,globalMessage:"无法连接到服务器,请刷新页面重试"})),console.error("检查工作空间状态失败:",a)}},T=a=>{switch(a.type){case"initialization":case"workspace_created":case"projects_loaded":if(c(b=>({...b,globalProgress:a.progress||0,globalMessage:a.message||""})),a.projects&&Array.isArray(a.projects)){let b={};a.projects.forEach(a=>{b[a]={name:a,status:l.ProjectStatus.PENDING,progress:0,message:"等待开始...",canRetry:!1}}),c(a=>({...a,projects:b}))}break;case"project_existing":if(a.projectName){let b=a.projectName;c(c=>({...c,globalProgress:a.progress??c.globalProgress,globalMessage:a.message??"",projects:{...c.projects,[b]:{...c.projects[b],status:l.ProjectStatus.EXISTING,message:"项目已存在",progress:100,canRetry:!1}}}))}break;case"project_start":if(a.projectName){let b=a.projectName;c(c=>({...c,globalProgress:a.progress??c.globalProgress,globalMessage:a.message??"",projects:{...c.projects,[b]:{...c.projects[b],status:l.ProjectStatus.CLONING,message:"开始克隆...",progress:0}}}))}break;case"project_progress":if(a.projectName){let b=a.projectName;c(c=>({...c,globalProgress:a.progress??c.globalProgress,projects:{...c.projects,[b]:{...c.projects[b],message:a.message??"",progress:Math.min(a.progress??0,100)}}}))}break;case"project_success":if(a.projectName){let b=a.projectName;c(c=>({...c,globalProgress:a.progress??c.globalProgress,projects:{...c.projects,[b]:{...c.projects[b],status:l.ProjectStatus.SUCCESS,message:"克隆成功",progress:100,canRetry:!1}}}))}break;case"project_failed":if(a.projectName){let b=a.projectName;c(c=>({...c,globalProgress:a.progress??c.globalProgress,projects:{...c.projects,[b]:{...c.projects[b],status:l.ProjectStatus.FAILED,message:"克隆失败",error:a.error,canRetry:!0}}}))}break;case"command_log":if(a.projectName&&a.logType&&void 0!==a.content&&a.timestamp){let b=a.projectName,d=a.logType,e=a.content,f=a.timestamp;c(a=>({...a,projects:{...a.projects,[b]:{...a.projects[b],logs:[...a.projects[b]?.logs||[],{type:d,content:e,timestamp:f}].slice(-1e3)}}}))}break;case"completion":c(b=>({...b,isInitializing:!1,isCompleted:!0,hasCompleted:!0,globalProgress:100,globalMessage:a.message??"初始化完成",completionSummary:a.result?{success:a.result.success,totalProjects:a.result.totalProjects,successCount:a.result.successCount,failedCount:a.result.failedCount,duration:a.result.duration}:void 0}));break;case"error":c(b=>({...b,isInitializing:!1,hasCompleted:!0,globalMessage:a.message??"发生错误",globalProgress:a.progress??b.globalProgress}))}},U=async(a,b="cursor")=>{c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],isOpening:!0}}}));try{let d=await fetch("/api/open-project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:a,editor:b})}),e=await d.json();if(e.success&&e.editorUrl){let a=document.createElement("a");a.href=e.editorUrl,a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a)}else console.error("打开项目失败:",e.error);c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],isOpening:!1}}}))}catch(b){c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],isOpening:!1}}})),console.error("打开项目失败:",b)}},V=async a=>{c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],isCleaningUp:!0}}}));try{let b=await fetch("/api/cleanup-project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:a})}),d=await b.json();d.success?c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],status:l.ProjectStatus.PENDING,message:"已清理,待克隆",isCleaningUp:!1,needsCleanup:!1}}})):c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],isCleaningUp:!1,error:d.error}}}))}catch(b){c(c=>({...c,projects:{...c.projects,[a]:{...c.projects[a],isCleaningUp:!1,error:b instanceof Error?b.message:String(b)}}}))}},W=async a=>{c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],status:l.ProjectStatus.RETRYING,message:"正在重试...",progress:0,canRetry:!1}}}));try{let b=await fetch("/api/retry-project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:a})}),d=await b.json();c(b=>({...b,projects:{...b.projects,[a]:{...b.projects[a],status:d.success?l.ProjectStatus.SUCCESS:l.ProjectStatus.FAILED,message:d.message,error:d.error,progress:d.success?100:b.projects[a].progress,canRetry:!d.success}}}))}catch(b){c(c=>({...c,projects:{...c.projects,[a]:{...c.projects[a],status:l.ProjectStatus.FAILED,message:"重试失败",error:b instanceof Error?b.message:String(b),canRetry:!0}}}))}},X=a=>{switch(a){case l.ProjectStatus.EXISTING:case l.ProjectStatus.SUCCESS:return"text-green-600 bg-green-50 border-green-200";case l.ProjectStatus.FAILED:return"text-red-600 bg-red-50 border-red-200";case l.ProjectStatus.INCOMPLETE:return"text-orange-600 bg-orange-50 border-orange-200";case l.ProjectStatus.CLONING:case l.ProjectStatus.RETRYING:return"text-blue-600 bg-blue-50 border-blue-200";case l.ProjectStatus.PENDING:default:return"text-gray-600 bg-gray-50 border-gray-200"}},Y=a=>{switch(a){case l.ProjectStatus.PENDING:return"待克隆";case l.ProjectStatus.EXISTING:return"已存在";case l.ProjectStatus.CLONING:return"克隆中";case l.ProjectStatus.SUCCESS:return"成功";case l.ProjectStatus.FAILED:return"失败";case l.ProjectStatus.INCOMPLETE:return"不完整";case l.ProjectStatus.RETRYING:return"重试中";default:return"未知"}},Z=()=>{let a=Object.values(b.projects);return a.length>0&&a.every(a=>a.status===l.ProjectStatus.EXISTING)},$=b=>{a.push(`/configuration?project=${encodeURIComponent(b)}`)},_=(a,b)=>{n(c=>({...c,[a]:b}))},aa=(a,b)=>{r(c=>({...c,[a]:b}))},ab=(a,b)=>{v(c=>({...c,[a]:b}))},ac=(a,b)=>{z(c=>({...c,[a]:b}))},ad=a=>{D(b=>({...b,branchName:a}))},ae=async a=>{let b=[];if(0===u.selectedProjects.length&&b.push("请先选择至少一个项目。"),u.targetBranch.trim()||b.push("请填写合入分支名称。"),u.sourceBranch.trim()||b.push("请填写被合入分支名称。"),b.length>0)return void x({isRunning:!1,operationLogs:[],feedbacks:b,progress:0,totalProjects:0,completedProjects:0,currentProject:""});let c=u.selectedProjects.length;x({isRunning:!0,operationLogs:[`开始批量分支合并,共 ${c} 个项目...`],feedbacks:[],progress:0,totalProjects:c,completedProjects:0,currentProject:""});let d=[],e=[];for(let b=0;b<u.selectedProjects.length;b++){let f=u.selectedProjects[b];x(a=>({...a,currentProject:f,completedProjects:b,progress:Math.round(b/c*100),operationLogs:[...a.operationLogs,`[进度] ${b+1}/${c} 开始处理项目 ${f}`]}));try{let b=await fetch("/api/admin-git-batch-merge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projects:[f],targetBranch:u.targetBranch.trim(),sourceBranch:u.sourceBranch.trim(),dryRun:a})}),c=await b.json(),g=Array.isArray(c.operationLogs)?c.operationLogs:[],h=Array.isArray(c.feedbacks)?c.feedbacks:[c.error||"执行失败"];x(a=>({...a,operationLogs:[...a.operationLogs,...g],feedbacks:[...a.feedbacks,...h]})),e.push(...h),Array.isArray(c.projectResults)&&d.push(...c.projectResults)}catch(b){let a=b instanceof Error?b.message:"执行失败";x(b=>({...b,operationLogs:[...b.operationLogs,`[${f}] 请求失败: ${a}`],feedbacks:[...b.feedbacks,`[${f}] ${a}`]})),e.push(`[${f}] ${a}`),d.push({projectName:f,success:!1,reason:a})}}x(a=>({...a,isRunning:!1,progress:100,completedProjects:c,currentProject:"",operationLogs:[...a.operationLogs,"批量分支合并执行完成。"],feedbacks:e.length>0?e:a.feedbacks})),d.length>0?(P(d),N(!0)):(P([]),N(!1))},af=async a=>{let b=[];if(0===y.selectedProjects.length&&b.push("请先选择至少一个项目。"),y.createBranch.trim()||b.push("请填写新分支名称。"),y.baseBranch.trim()||b.push("请填写来源分支名称。"),b.length>0)return void B({isRunning:!1,operationLogs:[],feedbacks:b,progress:0,totalProjects:0,completedProjects:0,currentProject:""});let c=y.selectedProjects.length;B({isRunning:!0,operationLogs:[`开始批量新建分支,共 ${c} 个项目...`],feedbacks:[],progress:0,totalProjects:c,completedProjects:0,currentProject:""});let d=[],e=[];for(let b=0;b<y.selectedProjects.length;b++){let f=y.selectedProjects[b];B(a=>({...a,currentProject:f,completedProjects:b,progress:Math.round(b/c*100),operationLogs:[...a.operationLogs,`[进度] ${b+1}/${c} 开始处理项目 ${f}`]}));try{let b=await fetch("/api/admin-git-batch-create-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projects:[f],createBranch:y.createBranch.trim(),baseBranch:y.baseBranch.trim(),dryRun:a})}),c=await b.json(),g=Array.isArray(c.operationLogs)?c.operationLogs:[],h=Array.isArray(c.feedbacks)?c.feedbacks:[c.error||"执行失败"];B(a=>({...a,operationLogs:[...a.operationLogs,...g],feedbacks:[...a.feedbacks,...h]})),e.push(...h),Array.isArray(c.projectResults)&&d.push(...c.projectResults)}catch(b){let a=b instanceof Error?b.message:"执行失败";B(b=>({...b,operationLogs:[...b.operationLogs,`[${f}] 请求失败: ${a}`],feedbacks:[...b.feedbacks,`[${f}] ${a}`]})),e.push(`[${f}] ${a}`),d.push({projectName:f,success:!1,reason:a})}}B(a=>({...a,isRunning:!1,progress:100,completedProjects:c,currentProject:"",operationLogs:[...a.operationLogs,"批量新建分支执行完成。"],feedbacks:e.length>0?e:a.feedbacks})),d.length>0?(P(d),N(!0)):(P([]),N(!1))},ag=async a=>{let b=[];if(0===C.selectedProjects.length&&b.push("请先选择至少一个项目。"),C.branchName.trim()||b.push("请填写远端分支名称。"),b.length>0)return void F({isRunning:!1,operationLogs:[],feedbacks:b,progress:0,totalProjects:0,completedProjects:0,currentProject:""});let c=C.selectedProjects.length;F({isRunning:!0,operationLogs:[`开始批量删除远端分支,共 ${c} 个项目...`],feedbacks:[],progress:0,totalProjects:c,completedProjects:0,currentProject:""});let d=[],e=[];for(let b=0;b<C.selectedProjects.length;b++){let f=C.selectedProjects[b];F(a=>({...a,currentProject:f,completedProjects:b,progress:Math.round(b/c*100),operationLogs:[...a.operationLogs,`[进度] ${b+1}/${c} 开始处理项目 ${f}`]}));try{let b=await fetch("/api/admin-git-batch-delete-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projects:[f],branchName:C.branchName.trim(),dryRun:a})}),c=await b.json(),g=Array.isArray(c.operationLogs)?c.operationLogs:[],h=Array.isArray(c.feedbacks)?c.feedbacks:[c.error||"执行失败"];F(a=>({...a,operationLogs:[...a.operationLogs,...g],feedbacks:[...a.feedbacks,...h]})),e.push(...h),Array.isArray(c.projectResults)&&d.push(...c.projectResults)}catch(b){let a=b instanceof Error?b.message:"执行失败";F(b=>({...b,operationLogs:[...b.operationLogs,`[${f}] 请求失败: ${a}`],feedbacks:[...b.feedbacks,`[${f}] ${a}`]})),e.push(`[${f}] ${a}`),d.push({projectName:f,success:!1,reason:a})}}F(a=>({...a,isRunning:!1,progress:100,completedProjects:c,currentProject:"",operationLogs:[...a.operationLogs,"批量删除远端分支执行完成。"],feedbacks:e.length>0?e:a.feedbacks})),d.length>0?(P(d),N(!0)):(P([]),N(!1))},ah=async a=>{let b=[];if(0===m.selectedProjects.length&&b.push("请先选择至少一个项目。"),m.createBranch.trim()||b.push("请填写创建分支名。"),m.baseBranch.trim()||b.push("请填写从 origin 哪个分支创建。"),m.mergeBranch.trim()||b.push("请填写被合并分支名称。"),b.length>0)return void p({isRunning:!1,operationLogs:[],feedbacks:b,runId:""});let c=`uat-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;p({isRunning:!0,operationLogs:[],feedbacks:[],runId:c});try{let b=await fetch("/api/uat-git-flow",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projects:m.selectedProjects,createBranch:m.createBranch.trim(),baseBranch:"main",mergeBranch:m.mergeBranch.trim(),dryRun:a,runId:c})}),d=await b.json();p({isRunning:!1,operationLogs:Array.isArray(d.operationLogs)?d.operationLogs:[],feedbacks:Array.isArray(d.feedbacks)?d.feedbacks:[d.error||"执行失败"],runId:""}),Array.isArray(d.projectResults)&&(P(d.projectResults),N(!0))}catch(a){p({isRunning:!1,operationLogs:[],feedbacks:[a instanceof Error?a.message:"执行失败"],runId:""}),P([]),N(!1)}},ai=async a=>{let b=[];if(0===q.selectedProjects.length&&b.push("请先选择至少一个项目。"),q.createBranch.trim()||b.push("请填写创建分支名。"),q.baseBranch.trim()||b.push("请填写从 origin 哪个分支创建。"),q.mergeBranch.trim()||b.push("请填写被合并分支名称。"),b.length>0)return void t({isRunning:!1,operationLogs:[],feedbacks:b,runId:""});let c=`gwh-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;t({isRunning:!0,operationLogs:[],feedbacks:[],runId:c});try{let b=await fetch("/api/gwh-git-flow",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projects:q.selectedProjects,createBranch:q.createBranch.trim(),baseBranch:"GWH",mergeBranch:q.mergeBranch.trim(),dryRun:a,runId:c})}),d=await b.json();t({isRunning:!1,operationLogs:Array.isArray(d.operationLogs)?d.operationLogs:[],feedbacks:Array.isArray(d.feedbacks)?d.feedbacks:[d.error||"执行失败"],runId:""}),Array.isArray(d.projectResults)&&(P(d.projectResults),N(!0))}catch(a){t({isRunning:!1,operationLogs:[],feedbacks:[a instanceof Error?a.message:"执行失败"],runId:""}),P([]),N(!1)}},aj=async()=>{if(I&&o.runId)try{let a=await fetch("/api/uat-git-flow/step",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"execute",runId:o.runId,stepId:I.stepId})}),b=await a.json(),c=Array.isArray(b.operationLogs)?b.operationLogs:[],d=Array.isArray(b.feedbacks)?b.feedbacks:[b.error||"执行失败"];if(!b.success){p(a=>({...a,isRunning:!1,operationLogs:c,feedbacks:d,runId:""})),J(null),L(!1);return}p(a=>({...a,operationLogs:c,feedbacks:d,isRunning:!b.isComplete,runId:b.isComplete?"":a.runId})),b.nextStep?(J(b.nextStep),L(!0)):(J(null),L(!1),Array.isArray(b.projectResults)&&(P(b.projectResults),N(!0)))}catch(a){p(b=>({...b,isRunning:!1,operationLogs:b.operationLogs,feedbacks:[...b.feedbacks,a instanceof Error?a.message:"执行失败"],runId:""})),J(null),L(!1)}},ak=async()=>{if(o.runId)try{let a=await fetch("/api/uat-git-flow/abort",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({runId:o.runId})}),b=await a.json();b&&Array.isArray(b.operationLogs)?p(a=>({...a,isRunning:!1,operationLogs:b.operationLogs,feedbacks:Array.isArray(b.feedbacks)?b.feedbacks:a.feedbacks,runId:""})):p(a=>({...a,isRunning:!1,runId:""})),Array.isArray(b.projectResults)&&(P(b.projectResults),N(!0)),J(null),L(!1)}catch(a){p(b=>({...b,feedbacks:[...b.feedbacks,a instanceof Error?a.message:"中断失败"]}))}},al=async()=>{if(s.runId)try{let a=await fetch("/api/gwh-git-flow/abort",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({runId:s.runId})}),b=await a.json();b&&Array.isArray(b.operationLogs)?t(a=>({...a,isRunning:!1,operationLogs:b.operationLogs,feedbacks:Array.isArray(b.feedbacks)?b.feedbacks:a.feedbacks,runId:""})):t(a=>({...a,isRunning:!1,runId:""})),Array.isArray(b.projectResults)&&(P(b.projectResults),N(!0))}catch(a){t(b=>({...b,feedbacks:[...b.feedbacks,a instanceof Error?a.message:"中断失败"]}))}};return(0,d.jsxs)("div",{className:"container mx-auto p-4 sm:p-6 md:p-8",children:[(0,d.jsxs)("div",{className:"flex justify-between items-center mb-6",children:[(0,d.jsx)("h1",{className:"text-2xl font-bold",children:"项目初始化"}),b.isLoading?(0,d.jsx)(g.Button,{disabled:!0,children:"检查中..."}):(0,d.jsx)(g.Button,{onClick:()=>{c(a=>({...a,isInitializing:!0,isCompleted:!1,hasCompleted:!1,globalProgress:0,globalMessage:"正在连接服务器...",projects:{},completionSummary:void 0}));let a=new EventSource("/api/initialize-workspace");a.onmessage=a=>{try{let b=JSON.parse(a.data);T(b)}catch(a){console.error("解析 SSE 消息失败:",a)}},a.onerror=()=>{c(a=>a.hasCompleted?a:{...a,isInitializing:!1,globalMessage:"连接服务器失败,请重试"}),a.close()},a.addEventListener("error",()=>{a.close()})},disabled:b.isInitializing,children:b.isInitializing?"初始化中...":"创建项目空间"})]}),(b.isInitializing||b.isCompleted)&&!Z()&&(0,d.jsxs)("div",{className:"mb-6 p-4 bg-gray-50 rounded-lg",children:[(0,d.jsxs)("div",{className:"flex justify-between items-center mb-2",children:[(0,d.jsx)("span",{className:"text-sm font-medium",children:b.globalMessage}),(0,d.jsxs)("span",{className:"text-sm text-gray-600",children:[b.globalProgress,"%"]})]}),(0,d.jsx)("div",{className:"w-full bg-gray-200 rounded-full h-2",children:(0,d.jsx)("div",{className:"bg-blue-600 h-2 rounded-full transition-all duration-300",style:{width:`${b.globalProgress}%`}})})]}),b.completionSummary&&!Z()&&(0,d.jsxs)("div",{className:`mb-6 p-4 rounded-lg border ${b.completionSummary.success?"bg-green-50 border-green-200":"bg-yellow-50 border-yellow-200"}`,children:[(0,d.jsx)("h3",{className:"font-semibold mb-2",children:"初始化完成"}),(0,d.jsxs)("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm",children:[(0,d.jsxs)("div",{children:["总项目数: ",b.completionSummary.totalProjects]}),(0,d.jsxs)("div",{className:"text-green-600",children:["成功: ",b.completionSummary.successCount]}),(0,d.jsxs)("div",{className:"text-red-600",children:["失败: ",b.completionSummary.failedCount]}),(0,d.jsxs)("div",{children:["耗时: ",Math.round(b.completionSummary.duration/1e3),"s"]})]})]}),(0,d.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4",children:Object.keys(b.projects).length>0?Object.values(b.projects).map(a=>(0,d.jsxs)("div",{className:`border rounded-lg p-4 ${X(a.status)}`,children:[(0,d.jsxs)("div",{className:"flex justify-between items-start mb-2",children:[(0,d.jsx)("h2",{className:"font-semibold cursor-pointer hover:text-blue-600 transition-colors",onClick:()=>$(a.name),title:"点击进入项目配置",children:a.name}),(0,d.jsx)("span",{className:"text-xs px-2 py-1 rounded-full bg-white",children:Y(a.status)})]}),(0,d.jsx)("p",{className:"text-sm mb-2",children:a.message}),a.status===l.ProjectStatus.CLONING||a.status===l.ProjectStatus.RETRYING?(0,d.jsxs)("div",{className:"mb-2",children:[(0,d.jsx)("div",{className:"w-full bg-white rounded-full h-1",children:(0,d.jsx)("div",{className:"bg-current h-1 rounded-full transition-all duration-300",style:{width:`${a.progress}%`}})}),(0,d.jsxs)("span",{className:"text-xs",children:[a.progress,"%"]})]}):null,a.error&&(0,d.jsx)("p",{className:"text-xs text-red-600 mb-2",children:a.error}),(0,d.jsxs)("div",{className:"space-y-2",children:[a.canRetry&&(0,d.jsx)(g.Button,{size:"sm",variant:"outline",onClick:()=>W(a.name),className:"w-full",children:"重试"}),a.needsCleanup&&a.status===l.ProjectStatus.INCOMPLETE&&(0,d.jsx)(g.Button,{size:"sm",variant:"destructive",onClick:()=>V(a.name),disabled:a.isCleaningUp,className:"w-full",children:a.isCleaningUp?"清理中...":"清理项目"}),(a.status===l.ProjectStatus.EXISTING||a.status===l.ProjectStatus.SUCCESS)&&(0,d.jsx)(h.EditorSplitButton,{onOpen:b=>U(a.name,b),loading:a.isOpening,loadingText:"打开中...",size:"sm",variant:"default",className:"w-full"}),a.logs&&a.logs.length>0&&(0,d.jsx)(g.Button,{size:"sm",variant:"outline",onClick:()=>R(b=>({...b,[a.name]:!b[a.name]})),className:"w-full",children:Q[a.name]?"隐藏日志":`查看日志 (${a.logs.length})`})]}),Q[a.name]&&a.logs&&a.logs.length>0&&(0,d.jsx)("div",{className:"mt-3 border-t pt-3",children:(0,d.jsx)("div",{className:"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto",children:a.logs.map((a,b)=>(0,d.jsxs)("div",{className:`mb-1 ${"stderr"===a.type?"text-red-400":"progress"===a.type?"text-yellow-400":"text-green-400"}`,children:[(0,d.jsx)("span",{className:"text-gray-500 mr-2",children:new Date(a.timestamp).toLocaleTimeString()}),(0,d.jsxs)("span",{className:"text-blue-400 mr-2",children:["[",a.type,"]"]}),(0,d.jsx)("span",{className:"whitespace-pre-wrap",children:a.content})]},b))})})]},a.name)):(0,d.jsx)("div",{className:"col-span-full text-center text-gray-500 py-8",children:b.isLoading?"正在检查项目状态...":b.isInitializing?"正在加载项目...":'点击"创建项目空间"开始初始化'})}),G&&(0,d.jsxs)("div",{className:"mt-8 rounded-lg border bg-white p-4 shadow-sm",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4",children:[(0,d.jsx)("h2",{className:"text-lg font-semibold",children:"UAT上线前 Git 操作流"}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.Button,{onClick:()=>ah(!1),disabled:o.isRunning,children:o.isRunning?"执行中...":"执行"}),(0,d.jsx)(g.Button,{variant:"outline",onClick:()=>ah(!0),disabled:o.isRunning,children:"DRY RUN"}),(0,d.jsx)(g.Button,{variant:"destructive",onClick:ak,disabled:!o.isRunning,children:"中断"})]})]}),(0,d.jsxs)("div",{className:"grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"uat-projects",children:"选择项目"}),(0,d.jsx)("select",{id:"uat-projects",multiple:!0,value:m.selectedProjects,onChange:a=>{let b=Array.from(a.target.selectedOptions).map(a=>a.value);n(a=>({...a,selectedProjects:b}))},className:"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",children:0===Object.keys(b.projects).length?(0,d.jsx)("option",{value:"",disabled:!0,children:"暂无可用项目"}):Object.keys(b.projects).map(a=>(0,d.jsx)("option",{value:a,children:a},a))}),(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"按住 Command / Ctrl 可多选"})]}),(0,d.jsxs)("div",{className:"grid gap-4",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"uat-create-branch",children:"创建分支名"}),(0,d.jsx)(i.Input,{id:"uat-create-branch",value:m.createBranch,onChange:a=>_("createBranch",a.target.value),placeholder:"例如: release/uat-2026-01"})]}),(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"uat-base-branch",children:"从 origin 哪个分支创建(固定)"}),(0,d.jsx)(i.Input,{id:"uat-base-branch",value:m.baseBranch,disabled:!0,placeholder:"main"})]}),(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"uat-merge-branch",children:"被合并分支名称"}),(0,d.jsx)(i.Input,{id:"uat-merge-branch",value:m.mergeBranch,onChange:a=>_("mergeBranch",a.target.value),placeholder:"例如: feature/xxx"})]})]})]}),(0,d.jsxs)("div",{className:"mt-6 grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"操作记录"}),0===o.operationLogs.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无记录"}):(0,d.jsx)("div",{className:"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto",children:o.operationLogs.map((a,b)=>(0,d.jsx)("div",{className:"mb-1 whitespace-pre-wrap",children:a},b))})]}),(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"反馈信息"}),0===o.feedbacks.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无反馈"}):(0,d.jsx)("div",{className:"space-y-1 text-sm",children:o.feedbacks.map((a,b)=>(0,d.jsx)("div",{className:"rounded bg-gray-50 px-2 py-1 text-gray-700",children:a},b))})]})]})]}),G&&(0,d.jsxs)("div",{className:"mt-8 rounded-lg border bg-white p-4 shadow-sm",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4",children:[(0,d.jsx)("h2",{className:"text-lg font-semibold",children:"武汉协和版本上线前 Git 操作流"}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.Button,{onClick:()=>ai(!1),disabled:s.isRunning,children:s.isRunning?"执行中...":"执行"}),(0,d.jsx)(g.Button,{variant:"outline",onClick:()=>ai(!0),disabled:s.isRunning,children:"DRY RUN"}),(0,d.jsx)(g.Button,{variant:"destructive",onClick:al,disabled:!s.isRunning,children:"中断"})]})]}),(0,d.jsxs)("div",{className:"grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"gwh-projects",children:"选择项目"}),(0,d.jsx)("select",{id:"gwh-projects",multiple:!0,value:q.selectedProjects,onChange:a=>{let b=Array.from(a.target.selectedOptions).map(a=>a.value);r(a=>({...a,selectedProjects:b}))},className:"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",children:0===Object.keys(b.projects).length?(0,d.jsx)("option",{value:"",disabled:!0,children:"暂无可用项目"}):Object.keys(b.projects).map(a=>(0,d.jsx)("option",{value:a,children:a},a))}),(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"按住 Command / Ctrl 可多选"})]}),(0,d.jsxs)("div",{className:"grid gap-4",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"gwh-create-branch",children:"创建分支名"}),(0,d.jsx)(i.Input,{id:"gwh-create-branch",value:q.createBranch,onChange:a=>aa("createBranch",a.target.value),placeholder:"例如: release/whxh-2026-03"})]}),(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"gwh-base-branch",children:"从 origin 哪个分支创建(固定)"}),(0,d.jsx)(i.Input,{id:"gwh-base-branch",value:q.baseBranch,disabled:!0,placeholder:"GWH"})]}),(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"gwh-merge-branch",children:"被合并分支名称"}),(0,d.jsx)(i.Input,{id:"gwh-merge-branch",value:q.mergeBranch,onChange:a=>aa("mergeBranch",a.target.value),placeholder:"例如: feature/xxx"})]})]})]}),(0,d.jsxs)("div",{className:"mt-6 grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"操作记录"}),0===s.operationLogs.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无记录"}):(0,d.jsx)("div",{className:"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto",children:s.operationLogs.map((a,b)=>(0,d.jsx)("div",{className:"mb-1 whitespace-pre-wrap",children:a},b))})]}),(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"反馈信息"}),0===s.feedbacks.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无反馈"}):(0,d.jsx)("div",{className:"space-y-1 text-sm",children:s.feedbacks.map((a,b)=>(0,d.jsx)("div",{className:"rounded bg-gray-50 px-2 py-1 text-gray-700",children:a},b))})]})]})]}),G&&(0,d.jsxs)("div",{className:"mt-8 rounded-lg border bg-white p-4 shadow-sm",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4",children:[(0,d.jsx)("h2",{className:"text-lg font-semibold",children:"常用 Git 分支操作 · 批量分支合并"}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.Button,{onClick:()=>ae(!1),disabled:w.isRunning,children:w.isRunning?"执行中...":"执行"}),(0,d.jsx)(g.Button,{variant:"outline",onClick:()=>ae(!0),disabled:w.isRunning,children:"DRY RUN"})]})]}),(0,d.jsxs)("div",{className:"grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"batch-merge-projects",children:"选择项目"}),(0,d.jsx)("select",{id:"batch-merge-projects",multiple:!0,value:u.selectedProjects,onChange:a=>{let b=Array.from(a.target.selectedOptions).map(a=>a.value);v(a=>({...a,selectedProjects:b}))},className:"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",children:0===Object.keys(b.projects).length?(0,d.jsx)("option",{value:"",disabled:!0,children:"暂无可用项目"}):Object.keys(b.projects).map(a=>(0,d.jsx)("option",{value:a,children:a},a))}),(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"按住 Command / Ctrl 可多选"})]}),(0,d.jsxs)("div",{className:"grid gap-4",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"batch-merge-target-branch",children:"合入分支名称"}),(0,d.jsx)(i.Input,{id:"batch-merge-target-branch",value:u.targetBranch,onChange:a=>ab("targetBranch",a.target.value),placeholder:"例如: main"})]}),(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"batch-merge-source-branch",children:"被合入分支名称"}),(0,d.jsx)(i.Input,{id:"batch-merge-source-branch",value:u.sourceBranch,onChange:a=>ab("sourceBranch",a.target.value),placeholder:"例如: release/candidate"})]})]})]}),(w.isRunning||w.progress>0)&&(0,d.jsxs)("div",{className:"mt-4 rounded-lg border p-3",children:[(0,d.jsxs)("div",{className:"flex justify-between items-center mb-2 text-sm",children:[(0,d.jsxs)("span",{children:["进度: ",w.completedProjects,"/",w.totalProjects,w.currentProject?` \xb7 当前项目: ${w.currentProject}`:""]}),(0,d.jsxs)("span",{children:[w.progress,"%"]})]}),(0,d.jsx)("div",{className:"w-full bg-gray-200 rounded-full h-2",children:(0,d.jsx)("div",{className:"bg-blue-600 h-2 rounded-full transition-all duration-300",style:{width:`${w.progress}%`}})})]}),(0,d.jsxs)("div",{className:"mt-6 grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"操作记录"}),0===w.operationLogs.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无记录"}):(0,d.jsx)("div",{className:"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto",children:w.operationLogs.map((a,b)=>(0,d.jsx)("div",{className:"mb-1 whitespace-pre-wrap",children:a},b))})]}),(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"反馈信息"}),0===w.feedbacks.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无反馈"}):(0,d.jsx)("div",{className:"space-y-1 text-sm",children:w.feedbacks.map((a,b)=>(0,d.jsx)("div",{className:"rounded bg-gray-50 px-2 py-1 text-gray-700",children:a},b))})]})]})]}),G&&(0,d.jsxs)("div",{className:"mt-8 rounded-lg border bg-white p-4 shadow-sm",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4",children:[(0,d.jsx)("h2",{className:"text-lg font-semibold",children:"常用 Git 分支操作 · 批量新建分支"}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.Button,{onClick:()=>af(!1),disabled:A.isRunning,children:A.isRunning?"执行中...":"执行"}),(0,d.jsx)(g.Button,{variant:"outline",onClick:()=>af(!0),disabled:A.isRunning,children:"DRY RUN"})]})]}),(0,d.jsxs)("div",{className:"grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"batch-create-branch-projects",children:"选择项目"}),(0,d.jsx)("select",{id:"batch-create-branch-projects",multiple:!0,value:y.selectedProjects,onChange:a=>{let b=Array.from(a.target.selectedOptions).map(a=>a.value);z(a=>({...a,selectedProjects:b}))},className:"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",children:0===Object.keys(b.projects).length?(0,d.jsx)("option",{value:"",disabled:!0,children:"暂无可用项目"}):Object.keys(b.projects).map(a=>(0,d.jsx)("option",{value:a,children:a},a))}),(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"按住 Command / Ctrl 可多选"})]}),(0,d.jsxs)("div",{className:"grid gap-4",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"batch-create-branch-name",children:"新分支名称"}),(0,d.jsx)(i.Input,{id:"batch-create-branch-name",value:y.createBranch,onChange:a=>ac("createBranch",a.target.value),placeholder:"例如: release/2026-03"})]}),(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"batch-create-branch-base",children:"来源分支名称"}),(0,d.jsx)(i.Input,{id:"batch-create-branch-base",value:y.baseBranch,onChange:a=>ac("baseBranch",a.target.value),placeholder:"例如: main"})]})]})]}),(A.isRunning||A.progress>0)&&(0,d.jsxs)("div",{className:"mt-4 rounded-lg border p-3",children:[(0,d.jsxs)("div",{className:"flex justify-between items-center mb-2 text-sm",children:[(0,d.jsxs)("span",{children:["进度: ",A.completedProjects,"/",A.totalProjects,A.currentProject?` \xb7 当前项目: ${A.currentProject}`:""]}),(0,d.jsxs)("span",{children:[A.progress,"%"]})]}),(0,d.jsx)("div",{className:"w-full bg-gray-200 rounded-full h-2",children:(0,d.jsx)("div",{className:"bg-blue-600 h-2 rounded-full transition-all duration-300",style:{width:`${A.progress}%`}})})]}),(0,d.jsxs)("div",{className:"mt-6 grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"操作记录"}),0===A.operationLogs.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无记录"}):(0,d.jsx)("div",{className:"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto",children:A.operationLogs.map((a,b)=>(0,d.jsx)("div",{className:"mb-1 whitespace-pre-wrap",children:a},b))})]}),(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"反馈信息"}),0===A.feedbacks.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无反馈"}):(0,d.jsx)("div",{className:"space-y-1 text-sm",children:A.feedbacks.map((a,b)=>(0,d.jsx)("div",{className:"rounded bg-gray-50 px-2 py-1 text-gray-700",children:a},b))})]})]})]}),G&&(0,d.jsxs)("div",{className:"mt-8 rounded-lg border bg-white p-4 shadow-sm",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4",children:[(0,d.jsx)("h2",{className:"text-lg font-semibold",children:"常用 Git 分支操作 · 批量删除远端分支"}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.Button,{onClick:()=>ag(!1),disabled:E.isRunning,children:E.isRunning?"执行中...":"执行"}),(0,d.jsx)(g.Button,{variant:"outline",onClick:()=>ag(!0),disabled:E.isRunning,children:"DRY RUN"})]})]}),(0,d.jsxs)("div",{className:"grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"batch-delete-branch-projects",children:"选择项目"}),(0,d.jsx)("select",{id:"batch-delete-branch-projects",multiple:!0,value:C.selectedProjects,onChange:a=>{let b=Array.from(a.target.selectedOptions).map(a=>a.value);D(a=>({...a,selectedProjects:b}))},className:"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",children:0===Object.keys(b.projects).length?(0,d.jsx)("option",{value:"",disabled:!0,children:"暂无可用项目"}):Object.keys(b.projects).map(a=>(0,d.jsx)("option",{value:a,children:a},a))}),(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"按住 Command / Ctrl 可多选"})]}),(0,d.jsx)("div",{className:"grid gap-4",children:(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(j.Label,{htmlFor:"batch-delete-branch-name",children:"远端分支名称"}),(0,d.jsx)(i.Input,{id:"batch-delete-branch-name",value:C.branchName,onChange:a=>ad(a.target.value),placeholder:"例如: release/2026-03"})]})})]}),(E.isRunning||E.progress>0)&&(0,d.jsxs)("div",{className:"mt-4 rounded-lg border p-3",children:[(0,d.jsxs)("div",{className:"flex justify-between items-center mb-2 text-sm",children:[(0,d.jsxs)("span",{children:["进度: ",E.completedProjects,"/",E.totalProjects,E.currentProject?` \xb7 当前项目: ${E.currentProject}`:""]}),(0,d.jsxs)("span",{children:[E.progress,"%"]})]}),(0,d.jsx)("div",{className:"w-full bg-gray-200 rounded-full h-2",children:(0,d.jsx)("div",{className:"bg-blue-600 h-2 rounded-full transition-all duration-300",style:{width:`${E.progress}%`}})})]}),(0,d.jsxs)("div",{className:"mt-6 grid gap-4 md:grid-cols-2",children:[(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"操作记录"}),0===E.operationLogs.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无记录"}):(0,d.jsx)("div",{className:"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto",children:E.operationLogs.map((a,b)=>(0,d.jsx)("div",{className:"mb-1 whitespace-pre-wrap",children:a},b))})]}),(0,d.jsxs)("div",{className:"rounded-lg border p-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold mb-2",children:"反馈信息"}),0===E.feedbacks.length?(0,d.jsx)("p",{className:"text-xs text-gray-500",children:"暂无反馈"}):(0,d.jsx)("div",{className:"space-y-1 text-sm",children:E.feedbacks.map((a,b)=>(0,d.jsx)("div",{className:"rounded bg-gray-50 px-2 py-1 text-gray-700",children:a},b))})]})]})]}),(0,d.jsx)(k.Dialog,{open:!1,onOpenChange:a=>{!a&&I&&o.isRunning||L(a)},children:(0,d.jsxs)(k.DialogContent,{showCloseButton:!1,children:[(0,d.jsxs)(k.DialogHeader,{children:[(0,d.jsx)(k.DialogTitle,{children:"确认执行下一步"}),(0,d.jsx)(k.DialogDescription,{children:I?`${I.projectName} \xb7 ${I.description}`:"准备下一步执行"})]}),(0,d.jsx)("div",{className:"rounded-md border bg-gray-50 p-3 text-sm font-mono text-gray-700",children:I?I.command:""}),(0,d.jsxs)(k.DialogFooter,{children:[(0,d.jsx)(g.Button,{variant:"outline",onClick:ak,children:"取消执行"}),(0,d.jsx)(g.Button,{onClick:aj,disabled:!I,children:"确认并执行"})]})]})}),(0,d.jsx)(k.Dialog,{open:G&&M,onOpenChange:N,children:(0,d.jsxs)(k.DialogContent,{children:[(0,d.jsxs)(k.DialogHeader,{children:[(0,d.jsx)(k.DialogTitle,{children:"操作结果"}),(0,d.jsx)(k.DialogDescription,{children:"查看所有项目执行结果"})]}),(0,d.jsx)("div",{className:"space-y-2",children:0===O.length?(0,d.jsx)("p",{className:"text-sm text-gray-500",children:"暂无结果"}):O.map(a=>(0,d.jsxs)("div",{className:`rounded-md border px-3 py-2 text-sm ${a.success?"bg-green-50 text-green-700":"bg-red-50 text-red-700"}`,children:[(0,d.jsxs)("div",{className:"flex items-start justify-between",children:[(0,d.jsx)("span",{className:"font-medium",children:a.projectName}),(0,d.jsx)("span",{className:"ml-4 text-right",children:a.success?"成功":a.reason||"失败"})]}),!a.success&&a.rollbackActions&&a.rollbackActions.length>0&&(0,d.jsxs)("div",{className:"mt-2 text-xs text-gray-600",children:[(0,d.jsx)("div",{className:"font-semibold text-gray-700",children:"已回滚操作:"}),(0,d.jsx)("ul",{className:"mt-1 list-disc pl-4",children:a.rollbackActions.map((b,c)=>(0,d.jsx)("li",{children:b},`${a.projectName}-rollback-${c}`))})]})]},a.projectName))}),(0,d.jsx)(k.DialogFooter,{children:(0,d.jsx)(g.Button,{onClick:()=>N(!1),children:"关闭"})})]})})]})}}}};
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=packages_server_src_7cef6dbd._.js.map
|