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.
Files changed (119) hide show
  1. package/dist/server/.next/BUILD_ID +1 -1
  2. package/dist/server/.next/app-build-manifest.json +1 -1
  3. package/dist/server/.next/app-path-routes-manifest.json +5 -0
  4. package/dist/server/.next/build-manifest.json +6 -6
  5. package/dist/server/.next/cache/.tsbuildinfo +1 -1
  6. package/dist/server/.next/cache/eslint/.cache_1qa5vxt +1 -1
  7. package/dist/server/.next/fallback-build-manifest.json +6 -6
  8. package/dist/server/.next/next-minimal-server.js.nft.json +1 -1
  9. package/dist/server/.next/next-server.js.nft.json +1 -1
  10. package/dist/server/.next/prerender-manifest.json +3 -3
  11. package/dist/server/.next/server/app/_not-found.html +1 -1
  12. package/dist/server/.next/server/app/_not-found.rsc +1 -1
  13. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/app-build-manifest.json +10 -0
  14. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/app-paths-manifest.json +3 -0
  15. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/build-manifest.json +16 -0
  16. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/next-font-manifest.json +6 -0
  17. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/react-loadable-manifest.json +1 -0
  18. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route/server-reference-manifest.json +4 -0
  19. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route.js +8 -0
  20. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route.js.map +5 -0
  21. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route.js.nft.json +1 -0
  22. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route_client-reference-manifest.js +2 -0
  23. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/app-build-manifest.json +10 -0
  24. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/app-paths-manifest.json +3 -0
  25. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/build-manifest.json +16 -0
  26. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/next-font-manifest.json +6 -0
  27. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/react-loadable-manifest.json +1 -0
  28. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route/server-reference-manifest.json +4 -0
  29. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route.js +8 -0
  30. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route.js.map +5 -0
  31. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route.js.nft.json +1 -0
  32. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route_client-reference-manifest.js +2 -0
  33. package/dist/server/.next/server/app/api/admin-git-batch-merge/route/app-build-manifest.json +10 -0
  34. package/dist/server/.next/server/app/api/admin-git-batch-merge/route/app-paths-manifest.json +3 -0
  35. package/dist/server/.next/server/app/api/admin-git-batch-merge/route/build-manifest.json +16 -0
  36. package/dist/server/.next/server/app/api/admin-git-batch-merge/route/next-font-manifest.json +6 -0
  37. package/dist/server/.next/server/app/api/admin-git-batch-merge/route/react-loadable-manifest.json +1 -0
  38. package/dist/server/.next/server/app/api/admin-git-batch-merge/route/server-reference-manifest.json +4 -0
  39. package/dist/server/.next/server/app/api/admin-git-batch-merge/route.js +8 -0
  40. package/dist/server/.next/server/app/api/admin-git-batch-merge/route.js.map +5 -0
  41. package/dist/server/.next/server/app/api/admin-git-batch-merge/route.js.nft.json +1 -0
  42. package/dist/server/.next/server/app/api/admin-git-batch-merge/route_client-reference-manifest.js +2 -0
  43. package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/app-build-manifest.json +10 -0
  44. package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/app-paths-manifest.json +3 -0
  45. package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/build-manifest.json +16 -0
  46. package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/next-font-manifest.json +6 -0
  47. package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/react-loadable-manifest.json +1 -0
  48. package/dist/server/.next/server/app/api/gwh-git-flow/abort/route/server-reference-manifest.json +4 -0
  49. package/dist/server/.next/server/app/api/gwh-git-flow/abort/route.js +8 -0
  50. package/dist/server/.next/server/app/api/gwh-git-flow/abort/route.js.map +5 -0
  51. package/dist/server/.next/server/app/api/gwh-git-flow/abort/route.js.nft.json +1 -0
  52. package/dist/server/.next/server/app/api/gwh-git-flow/abort/route_client-reference-manifest.js +2 -0
  53. package/dist/server/.next/server/app/api/gwh-git-flow/route/app-build-manifest.json +10 -0
  54. package/dist/server/.next/server/app/api/gwh-git-flow/route/app-paths-manifest.json +3 -0
  55. package/dist/server/.next/server/app/api/gwh-git-flow/route/build-manifest.json +16 -0
  56. package/dist/server/.next/server/app/api/gwh-git-flow/route/next-font-manifest.json +6 -0
  57. package/dist/server/.next/server/app/api/gwh-git-flow/route/react-loadable-manifest.json +1 -0
  58. package/dist/server/.next/server/app/api/gwh-git-flow/route/server-reference-manifest.json +4 -0
  59. package/dist/server/.next/server/app/api/gwh-git-flow/route.js +9 -0
  60. package/dist/server/.next/server/app/api/gwh-git-flow/route.js.map +5 -0
  61. package/dist/server/.next/server/app/api/gwh-git-flow/route.js.nft.json +1 -0
  62. package/dist/server/.next/server/app/api/gwh-git-flow/route_client-reference-manifest.js +2 -0
  63. package/dist/server/.next/server/app/api/uat-git-flow/route.js +2 -2
  64. package/dist/server/.next/server/app/api/uat-git-flow/route.js.nft.json +1 -1
  65. package/dist/server/.next/server/app/api/uat-git-flow/step/route.js +2 -2
  66. package/dist/server/.next/server/app/api/uat-git-flow/step/route.js.nft.json +1 -1
  67. package/dist/server/.next/server/app/configuration.html +1 -1
  68. package/dist/server/.next/server/app/configuration.rsc +1 -1
  69. package/dist/server/.next/server/app/index.html +1 -1
  70. package/dist/server/.next/server/app/index.rsc +1 -1
  71. package/dist/server/.next/server/app/initialization/page/app-build-manifest.json +1 -1
  72. package/dist/server/.next/server/app/initialization/page_client-reference-manifest.js +1 -1
  73. package/dist/server/.next/server/app/initialization.html +1 -1
  74. package/dist/server/.next/server/app/initialization.rsc +2 -2
  75. package/dist/server/.next/server/app-paths-manifest.json +5 -0
  76. package/dist/server/.next/server/chunks/[root-of-the-server]__0f9a35fc._.js +3 -0
  77. package/dist/server/.next/server/chunks/[root-of-the-server]__0f9a35fc._.js.map +1 -0
  78. package/dist/server/.next/server/chunks/[root-of-the-server]__37bfbf6b._.js +16 -0
  79. package/dist/server/.next/server/chunks/[root-of-the-server]__37bfbf6b._.js.map +1 -0
  80. package/dist/server/.next/server/chunks/[root-of-the-server]__66dc5e6b._.js +16 -0
  81. package/dist/server/.next/server/chunks/[root-of-the-server]__66dc5e6b._.js.map +1 -0
  82. package/dist/server/.next/server/chunks/[root-of-the-server]__8a8561ea._.js +16 -0
  83. package/dist/server/.next/server/chunks/[root-of-the-server]__8a8561ea._.js.map +1 -0
  84. package/dist/server/.next/server/chunks/[root-of-the-server]__98088bea._.js +1 -1
  85. package/dist/server/.next/server/chunks/[root-of-the-server]__98088bea._.js.map +1 -1
  86. package/dist/server/.next/server/chunks/{[root-of-the-server]__4ad2e049._.js → [root-of-the-server]__9f7a6c58._.js} +2 -2
  87. package/dist/server/.next/server/chunks/{[root-of-the-server]__4ad2e049._.js.map → [root-of-the-server]__9f7a6c58._.js.map} +1 -1
  88. package/dist/server/.next/server/chunks/{[root-of-the-server]__a8ae0f8f._.js → [root-of-the-server]__ac6efee1._.js} +2 -2
  89. package/dist/server/.next/server/chunks/{[root-of-the-server]__a8ae0f8f._.js.map → [root-of-the-server]__ac6efee1._.js.map} +1 -1
  90. package/dist/server/.next/server/chunks/[root-of-the-server]__f111df8e._.js +16 -0
  91. package/dist/server/.next/server/chunks/[root-of-the-server]__f111df8e._.js.map +1 -0
  92. package/dist/server/.next/server/chunks/_24087f66._.js +1 -1
  93. package/dist/server/.next/server/chunks/_24087f66._.js.map +1 -1
  94. package/dist/server/.next/server/chunks/_61c263b3._.js +1 -1
  95. package/dist/server/.next/server/chunks/_61c263b3._.js.map +1 -1
  96. package/dist/server/.next/server/chunks/_f35a5421._.js +3 -0
  97. package/dist/server/.next/server/chunks/_f35a5421._.js.map +1 -0
  98. package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js +1 -1
  99. package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js.map +1 -1
  100. package/dist/server/.next/server/middleware-build-manifest.js +4 -4
  101. package/dist/server/.next/server/pages/404.html +1 -1
  102. package/dist/server/.next/server/pages/500.html +1 -1
  103. package/dist/server/.next/server/pages/_app/build-manifest.json +2 -2
  104. package/dist/server/.next/server/pages/_error/build-manifest.json +2 -2
  105. package/dist/server/.next/static/chunks/{1091ba2f3c451a47.js → 0a55e0a2ff3b09e0.js} +1 -1
  106. package/dist/server/.next/static/chunks/13acbe5989647429.js +3 -0
  107. package/dist/server/.next/static/chunks/{1aa036ed62a506c8.js → 6803a56f8e33c487.js} +2 -2
  108. package/dist/server/.next/static/chunks/{1154a499e8e3867b.js → 8f80ca1e88635b12.js} +1 -1
  109. package/dist/server/.next/static/chunks/{2602bf706e977560.js.map → acb330991f8ec5eb.js.map} +1 -1
  110. package/dist/server/.next/static/chunks/f5014a46b22ea191.js.map +1 -0
  111. package/dist/server/.next/static/chunks/pages/_app.js +2 -2
  112. package/dist/server/.next/static/chunks/pages/_error.js +2 -2
  113. package/dist/server/.next/trace +2 -1
  114. package/package.json +1 -1
  115. package/dist/server/.next/static/chunks/36cdd24a97bd8ed5.js +0 -3
  116. package/dist/server/.next/static/chunks/df7954b7bd4ea3eb.js.map +0 -1
  117. /package/dist/server/.next/static/{y0HjvfId3sNkXoR9vLiLd → -cMGDUj-YvI_2FwzuOQqe}/_buildManifest.js +0 -0
  118. /package/dist/server/.next/static/{y0HjvfId3sNkXoR9vLiLd → -cMGDUj-YvI_2FwzuOQqe}/_clientMiddlewareManifest.json +0 -0
  119. /package/dist/server/.next/static/{y0HjvfId3sNkXoR9vLiLd → -cMGDUj-YvI_2FwzuOQqe}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/git-operations.ts","turbopack:///[project]/packages/server/src/app/api/uat-git-flow/temp-repo.ts","turbopack:///[project]/packages/server/src/app/api/uat-git-flow/git-status-utils.ts","turbopack:///[project]/packages/server/src/app/api/admin-git-batch-create-branch/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 { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n projectName?: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n}\n","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n projectName?: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}\n","import { spawn, ChildProcess } from 'child_process';\nimport { existsSync, mkdirSync } from 'fs';\nimport { promises as fs } from 'fs';\nimport { join, basename } from 'path';\nimport {\n ProjectStatus,\n type GitOperationConfig,\n type ProjectProgress,\n} from './workspace-types';\n\n/**\n * 创建工作空间目录\n * @param workspacePath 工作空间路径\n * @returns 创建结果\n */\nexport async function createWorkspaceDirectory(workspacePath: string): Promise<{ success: boolean; error?: string }> {\n try {\n if (!existsSync(workspacePath)) {\n mkdirSync(workspacePath, { recursive: true });\n }\n return { success: true };\n } catch (error) {\n return { \n success: false, \n error: `创建工作空间目录失败: ${error instanceof Error ? error.message : String(error)}` \n };\n }\n}\n\n/**\n * 执行 Git 克隆操作\n * @param config Git 操作配置\n * @returns Promise<ProjectProgress>\n */\nexport async function cloneRepository(config: GitOperationConfig): Promise<ProjectProgress> {\n const { repoUrl, projectName: configuredProjectName, targetDir, timeout, onProgress, onError, onLog } = config;\n const projectName = configuredProjectName?.trim() || basename(repoUrl, '.git');\n \n return new Promise<ProjectProgress>((resolve) => {\n const startTime = Date.now();\n \n // 更新开始状态\n const initialProgress: ProjectProgress = {\n projectName,\n status: ProjectStatus.CLONING,\n progress: 0,\n message: '开始克隆项目...',\n startTime,\n };\n onProgress?.(0, '开始克隆项目...');\n\n // 执行 git clone 命令\n const targetPath = join(targetDir, projectName);\n // 添加 --progress 参数来强制显示进度,--verbose 显示详细信息\n const gitArgs = ['clone', '--progress', '--verbose', repoUrl, targetPath];\n \n // 记录命令启动信息\n onLog?.(projectName, 'stdout', `[开始克隆] 执行命令: git ${gitArgs.join(' ')}\\n`);\n onLog?.(projectName, 'stdout', `[目标目录] ${targetPath}\\n`);\n onLog?.(projectName, 'stdout', `[仓库地址] ${repoUrl}\\n`);\n \n const gitProcess: ChildProcess = spawn('git', gitArgs, {\n cwd: targetDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let errorOutput = '';\n let progressValue = 0;\n \n // 记录进程启动成功\n onLog?.(projectName, 'stdout', `[进程启动] Git 进程 PID: ${gitProcess.pid}\\n`);\n\n // 设置超时\n const timeoutId = setTimeout(() => {\n onLog?.(projectName, 'stderr', `[超时警告] Git 进程运行超过 ${timeout / 1000}s,即将终止\\n`);\n gitProcess.kill('SIGTERM');\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆操作超时',\n error: `克隆操作超时 (${timeout / 1000}s)`,\n endTime: Date.now(),\n };\n onLog?.(projectName, 'stderr', `[进程终止] 克隆操作超时\\n`);\n onError?.(`${projectName}: 克隆操作超时`);\n resolve(errorResult);\n }, timeout);\n\n // 处理标准输出\n gitProcess.stdout?.on('data', (data: Buffer) => {\n const stdoutText = data.toString();\n \n // 实时发送日志\n onLog?.(projectName, 'stdout', stdoutText);\n \n // 模拟进度更新(Git 克隆没有内置进度,这里基于时间估算)\n progressValue = Math.min(progressValue + 10, 80);\n onProgress?.(progressValue, '正在克隆代码...');\n });\n\n // 处理错误输出\n gitProcess.stderr?.on('data', (data: Buffer) => {\n const stderrText = data.toString();\n errorOutput += stderrText;\n \n // 判断是进度信息还是错误信息\n const isProgressInfo = stderrText.includes('remote:') || \n stderrText.includes('Receiving objects') || \n stderrText.includes('Resolving deltas') ||\n stderrText.includes('Counting objects') ||\n stderrText.includes('Enumerating objects') ||\n stderrText.includes('Compressing objects') ||\n stderrText.includes('upload-pack') ||\n stderrText.includes('POST git-') ||\n stderrText.includes('正克隆到') ||\n stderrText.includes('Cloning into');\n \n // 根据内容类型发送不同的日志\n if (isProgressInfo) {\n onLog?.(projectName, 'progress', stderrText);\n } else {\n onLog?.(projectName, 'stderr', stderrText);\n }\n \n // Git 的进度信息通常在 stderr 中\n if (stderrText.includes('Receiving objects') || stderrText.includes('Resolving deltas')) {\n progressValue = Math.min(progressValue + 5, 90);\n onProgress?.(progressValue, '正在接收对象...');\n } else if (stderrText.includes('Counting objects')) {\n progressValue = Math.min(progressValue + 2, 70);\n onProgress?.(progressValue, '正在计算对象...');\n } else if (stderrText.includes('Enumerating objects')) {\n progressValue = Math.min(progressValue + 2, 50);\n onProgress?.(progressValue, '正在枚举对象...');\n }\n });\n\n // 处理进程结束\n gitProcess.on('close', (code: number | null) => {\n clearTimeout(timeoutId);\n const endTime = Date.now();\n const duration = endTime - startTime;\n \n onLog?.(projectName, 'stdout', `[进程结束] Git 进程退出,代码: ${code},耗时: ${Math.round(duration / 1000)}s\\n`);\n \n if (code === 0) {\n // 克隆成功\n onLog?.(projectName, 'stdout', `[克隆成功] 项目已成功克隆到: ${targetPath}\\n`);\n const successResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.SUCCESS,\n progress: 100,\n message: '克隆完成',\n endTime,\n };\n onProgress?.(100, '克隆完成');\n resolve(successResult);\n } else {\n // 克隆失败\n const parsedError = parseGitError(errorOutput);\n onLog?.(projectName, 'stderr', `[克隆失败] 错误信息: ${parsedError}\\n`);\n onLog?.(projectName, 'stderr', `[完整错误输出]\\n${errorOutput}\\n`);\n \n const failureResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆失败',\n error: parsedError || `Git 进程退出,代码: ${code}`,\n endTime,\n };\n onError?.(`${projectName}: ${failureResult.error}`);\n resolve(failureResult);\n }\n });\n\n // 处理进程错误\n gitProcess.on('error', (error: Error) => {\n clearTimeout(timeoutId);\n onLog?.(projectName, 'stderr', `[进程错误] Git 进程启动失败: ${error.message}\\n`);\n onLog?.(projectName, 'stderr', `[错误详情] ${error.stack || 'No stack trace'}\\n`);\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '进程启动失败',\n error: `进程启动失败: ${error.message}`,\n endTime: Date.now(),\n };\n onError?.(`${projectName}: ${error.message}`);\n resolve(errorResult);\n });\n });\n}\n\n/**\n * 解析 Git 错误信息,提供用户友好的错误描述\n * @param errorOutput Git stderr 输出\n * @returns 用户友好的错误描述\n */\nfunction parseGitError(errorOutput: string): string {\n const lowerOutput = errorOutput.toLowerCase();\n \n if (lowerOutput.includes('authentication failed') || lowerOutput.includes('access denied')) {\n return '身份验证失败,请检查仓库访问权限';\n }\n \n if (lowerOutput.includes('repository not found') || lowerOutput.includes('not found')) {\n return '仓库不存在或无法访问';\n }\n \n if (lowerOutput.includes('network') || lowerOutput.includes('connection')) {\n return '网络连接问题,请检查网络设置';\n }\n \n if (lowerOutput.includes('timeout')) {\n return '网络超时,请重试';\n }\n \n if (lowerOutput.includes('permission denied')) {\n return '权限被拒绝,请检查文件系统权限';\n }\n \n if (lowerOutput.includes('already exists')) {\n return '目标目录已存在';\n }\n \n // 返回原始错误的前200个字符\n return errorOutput.slice(0, 200) + (errorOutput.length > 200 ? '...' : '');\n}\n\n/**\n * 验证 Git 仓库 URL 格式\n * @param url Git 仓库 URL\n * @returns 是否有效\n */\nexport function isValidGitUrl(url: string): boolean {\n const gitUrlPattern = /^(https?:\\/\\/|git@)[^\\s]+\\.git$/i;\n return gitUrlPattern.test(url);\n}\n\n/**\n * 清理项目名称,移除不安全字符\n * @param projectName 项目名称\n * @returns 清理后的项目名称\n */\nexport function sanitizeProjectName(projectName: string): string {\n return projectName.replace(/[^a-zA-Z0-9\\-_]/g, '');\n}\n\n/**\n * 项目检查结果类型\n */\nexport type ProjectCheckResult = {\n exists: boolean;\n status: 'not_exists' | 'complete' | 'incomplete';\n needsCleanup: boolean;\n};\n\n/**\n * 检查项目状态(详细版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<ProjectCheckResult> 详细的项目状态\n */\nexport async function checkProjectStatus(workspacePath: string, projectName: string): Promise<ProjectCheckResult> {\n try {\n const projectPath = join(workspacePath, projectName);\n \n // 检查项目目录是否存在\n if (!existsSync(projectPath)) {\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n \n // 检查是否为 Git 仓库(存在 .git 目录)\n const gitPath = join(projectPath, '.git');\n if (!existsSync(gitPath)) {\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n // 更严格的完整性检查\n const isComplete = await isGitRepositoryComplete(projectPath);\n if (!isComplete) {\n console.log(`检测到不完整的Git仓库: ${projectPath}`);\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n return {\n exists: true,\n status: 'complete',\n needsCleanup: false\n };\n } catch (error) {\n console.error(`检查项目 ${projectName} 状态时出错:`, error);\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n}\n\n/**\n * 检查项目是否已存在于工作空间中(兼容版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<boolean> 项目是否存在且为有效的 Git 仓库\n */\nexport async function checkProjectExists(workspacePath: string, projectName: string): Promise<boolean> {\n const result = await checkProjectStatus(workspacePath, projectName);\n return result.status === 'complete';\n}\n\n/**\n * 检查Git仓库是否完整\n * @param projectPath 项目路径\n * @returns Promise<boolean> 仓库是否完整\n */\nasync function isGitRepositoryComplete(projectPath: string): Promise<boolean> {\n try {\n const gitPath = join(projectPath, '.git');\n \n // 检查关键的Git文件是否存在\n const requiredFiles = ['HEAD', 'config', 'refs'];\n for (const file of requiredFiles) {\n const filePath = join(gitPath, file);\n if (!existsSync(filePath)) {\n return false;\n }\n }\n \n // 检查是否有实际的项目文件(不只是.git目录)\n const entries = await fs.readdir(projectPath);\n const nonGitFiles = entries.filter((entry: string) => entry !== '.git');\n \n // 如果只有.git目录,说明克隆未完成\n if (nonGitFiles.length === 0) {\n return false;\n }\n \n // 检查HEAD文件是否有效\n const headPath = join(gitPath, 'HEAD');\n const headContent = await fs.readFile(headPath, 'utf-8');\n if (!headContent.trim() || headContent.includes('unborn')) {\n return false;\n }\n \n return true;\n } catch (error) {\n console.error('检查Git仓库完整性时出错:', error);\n return false;\n }\n}\n\n/**\n * 清理不完整的项目目录\n * @param projectPath 项目路径\n */\nexport async function cleanupIncompleteProject(projectPath: string): Promise<void> {\n try {\n console.log(`正在清理不完整的项目: ${projectPath}`);\n await fs.rm(projectPath, { recursive: true, force: true });\n console.log(`清理完成: ${projectPath}`);\n } catch (error) {\n console.error(`清理项目失败 ${projectPath}:`, error);\n // 清理失败不抛出错误,避免阻塞后续流程\n }\n}\n\n/**\n * 批量检查多个项目的存在状态\n * @param workspacePath 工作空间路径\n * @param projectNames 项目名称列表\n * @returns Promise<Record<string, boolean>> 项目名称到存在状态的映射\n */\nexport async function checkMultipleProjectsExist(\n workspacePath: string, \n projectNames: string[]\n): Promise<Record<string, boolean>> {\n const results: Record<string, boolean> = {};\n \n // 并行检查所有项目\n const checks = projectNames.map(async (projectName) => {\n const exists = await checkProjectExists(workspacePath, projectName);\n results[projectName] = exists;\n });\n \n await Promise.all(checks);\n return results;\n} \n","import { spawn } from 'child_process';\nimport { mkdtemp, rm } from 'fs/promises';\nimport { tmpdir } from 'os';\nimport { join } from 'path';\n\ntype GitResult = {\n code: number | null;\n stdout: string;\n stderr: string;\n};\n\nasync function 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 sanitizeProjectNameForTemp(projectName: string) {\n return projectName.replace(/[^a-zA-Z0-9\\-_]/g, '-');\n}\n\nexport type TempExecutionRepo = {\n tempRootPath: string;\n projectPath: string;\n};\n\nexport async function createTempExecutionRepo(sourceProjectPath: string, projectName: string): Promise<{\n success: true;\n value: TempExecutionRepo;\n} | {\n success: false;\n error: string;\n}> {\n const remoteResult = await runGitCommand(sourceProjectPath, ['remote', 'get-url', 'origin']);\n if (remoteResult.code !== 0) {\n return {\n success: false,\n error: remoteResult.stderr || remoteResult.stdout || '读取 origin 地址失败',\n };\n }\n\n const remoteUrl = remoteResult.stdout.trim();\n if (!remoteUrl) {\n return {\n success: false,\n error: 'origin 远端地址为空',\n };\n }\n\n const prefix = `prime-uat-${sanitizeProjectNameForTemp(projectName)}-`;\n const tempRootPath = await mkdtemp(join(tmpdir(), prefix));\n const tempProjectPath = join(tempRootPath, projectName);\n\n const cloneResult = await runGitCommand(tempRootPath, ['clone', '--no-tags', remoteUrl, tempProjectPath]);\n if (cloneResult.code !== 0) {\n await rm(tempRootPath, { recursive: true, force: true });\n return {\n success: false,\n error: cloneResult.stderr || cloneResult.stdout || '克隆临时仓库失败',\n };\n }\n\n return {\n success: true,\n value: {\n tempRootPath,\n projectPath: tempProjectPath,\n },\n };\n}\n\nexport async function cleanupTempExecutionRepo(tempRootPath: string) {\n await rm(tempRootPath, { recursive: true, force: true });\n}\n","const unableToRmdirWarningPattern = /warning:\\s+unable to rmdir '([^']+)': Directory not empty/g;\n\nfunction normalizeGitPath(path: string) {\n return path\n .trim()\n .replace(/\\\\/g, '/')\n .replace(/^\\.\\/+/, '')\n .replace(/\\/+$/, '');\n}\n\nfunction parseStatusPath(line: string) {\n const rawPath = line.length >= 3 ? line.slice(3).trim() : '';\n if (!rawPath) return '';\n\n const unquoted = rawPath.startsWith('\"') && rawPath.endsWith('\"')\n ? rawPath.slice(1, -1)\n : rawPath;\n const renamedSeparator = ' -> ';\n const renamedIndex = unquoted.lastIndexOf(renamedSeparator);\n const targetPath = renamedIndex === -1\n ? unquoted\n : unquoted.slice(renamedIndex + renamedSeparator.length);\n\n return normalizeGitPath(targetPath);\n}\n\nexport function extractUnableToRmdirPaths(stderr: string) {\n const matchedPaths = new Set<string>();\n let match: RegExpExecArray | null;\n\n while ((match = unableToRmdirWarningPattern.exec(stderr)) !== null) {\n const normalizedPath = normalizeGitPath(match[1] || '');\n if (normalizedPath) {\n matchedPaths.add(normalizedPath);\n }\n }\n\n unableToRmdirWarningPattern.lastIndex = 0;\n return [...matchedPaths];\n}\n\nexport function appendIgnoredPathsFromCheckoutWarning(stderr: string, ignoredPaths: Set<string>) {\n const addedPaths: string[] = [];\n for (const path of extractUnableToRmdirPaths(stderr)) {\n if (!ignoredPaths.has(path)) {\n ignoredPaths.add(path);\n addedPaths.push(path);\n }\n }\n return addedPaths;\n}\n\nexport function hasBlockingWorkspaceChanges(statusOutput: string, ignoredUntrackedPaths?: Iterable<string>) {\n const ignoredPathSet = new Set<string>();\n if (ignoredUntrackedPaths) {\n for (const path of ignoredUntrackedPaths) {\n const normalizedPath = normalizeGitPath(path);\n if (normalizedPath) {\n ignoredPathSet.add(normalizedPath);\n }\n }\n }\n\n if (ignoredPathSet.size === 0) {\n return statusOutput.trim().length > 0;\n }\n\n const lines = statusOutput.split(/\\r?\\n/).filter(line => line.length > 0);\n for (const line of lines) {\n const statusCode = line.slice(0, 2);\n if (statusCode !== '??') {\n return true;\n }\n\n const statusPath = parseStatusPath(line);\n if (!statusPath) {\n return true;\n }\n\n let shouldIgnore = false;\n for (const ignoredPath of ignoredPathSet) {\n if (statusPath === ignoredPath || statusPath.startsWith(`${ignoredPath}/`)) {\n shouldIgnore = true;\n break;\n }\n }\n\n if (!shouldIgnore) {\n return true;\n }\n }\n\n return false;\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { spawn } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { sanitizeProjectName } from '@/lib/git-operations';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { cleanupTempExecutionRepo, createTempExecutionRepo } from '@/app/api/uat-git-flow/temp-repo';\nimport { appendIgnoredPathsFromCheckoutWarning } from '@/app/api/uat-git-flow/git-status-utils';\n\ntype GitResult = {\n code: number | null;\n stdout: string;\n stderr: string;\n};\n\ntype BatchCreateProjectInfo = {\n ignoredUntrackedPaths: Set<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\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: BatchCreateProjectInfo,\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 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 dryRun = Boolean(body.dryRun);\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\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)) return;\n resultMap.set(projectName, { success, reason, rollbackActions });\n projectResults.push({ projectName, success, reason, rollbackActions });\n };\n\n if (projects.length === 0 || !createBranch || !baseBranch) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: ['缺少必要参数,请填写完整后重试。'],\n }, { status: 400 });\n }\n\n if (!isValidBranchName(createBranch) || !isValidBranchName(baseBranch)) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: ['分支名称不合法,请避免空格或以 - 开头。'],\n }, { status: 400 });\n }\n\n const projectsConfig = await getProjectsConfig();\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n\n for (const rawProjectName of projects) {\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(['checkout', '-B', createBranch, `origin/${baseBranch}`])}`);\n operationLogs.push(`[${projectName}] ${formatCommand(['push', '-u', 'origin', createBranch])}`);\n setProjectResult(projectName, true);\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 const projectInfo: BatchCreateProjectInfo = {\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 setProjectResult(projectName, false, '拉取远端失败');\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 setProjectResult(projectName, false, `origin/${baseBranch} 不存在`);\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, `检查 origin/${createBranch}`, remoteCreateExists);\n\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 setProjectResult(projectName, false, '切换到已有远端分支失败');\n continue;\n }\n feedbacks.push(`[${projectName}] origin/${createBranch} 已存在,已直接使用该分支。`);\n setProjectResult(projectName, true);\n continue;\n }\n\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 setProjectResult(projectName, false, '创建分支失败');\n continue;\n }\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 setProjectResult(projectName, false, '推送新分支失败');\n continue;\n }\n\n setProjectResult(projectName, true);\n }\n\n return NextResponse.json({\n success: feedbacks.filter(message => message.includes('失败')).length === 0,\n operationLogs,\n feedbacks,\n projectResults,\n });\n } catch (error) {\n console.error('批量新建分支执行失败:', 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}\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":[6]}
@@ -1,3 +1,3 @@
1
- module.exports={75405:e=>{"use strict";var{g:t,__dirname:a}=e;{e.s({clearStepRun:()=>o,createStepRun:()=>r,getStepRun:()=>s,updateStepRun:()=>c});let t=new Map;function n(){let e=Date.now();for(let[a,n]of t.entries())e-n.updatedAt>36e5&&t.delete(a)}function r(e){n(),t.set(e.runId,{...e,updatedAt:Date.now()})}function s(e){n();let a=t.get(e);return a||null}function c(e){t.set(e.runId,{...e,updatedAt:Date.now()})}function o(e){t.delete(e)}}},9967:e=>{"use strict";var{g:t,__dirname:a}=e;{e.s({POST:()=>N});var n=e.i(15494),r=e.i(87485),s=e.i(83886),c=e.i(30331),o=e.i(88941),i=e.i(35692),d=e.i(77159),u=e.i(79810),p=e.i(34926),h=e.i(33808),m=e.i(75405);let t=/\\s/;function l(e){return!(!e||t.test(e)||e.startsWith("-"))}function g(e,t){return new Promise((a,n)=>{let s=(0,r.spawn)("git",t,{cwd:e,stdio:["ignore","pipe","pipe"]}),c="",o="";s.stdout?.on("data",e=>{c+=e.toString()}),s.stderr?.on("data",e=>{o+=e.toString()}),s.on("close",e=>{a({code:e,stdout:c,stderr:o})}),s.on("error",e=>{n(e)})})}function k(e){return`git ${e.join(" ")}`}function f(e,t,a,n){0===n.code?e.push(`[${t}] 完成: ${a}`):e.push(`[${t}] 失败: ${a} ${n.stderr||n.stdout}`)}function $(e){for(let t=e.currentIndex;t<e.projects.length;t+=1){let a=e.projects[t];if("pending"!==a.status){e.currentIndex=t+1;continue}let n=function(e,t){if("pending"!==t.status)return null;let{createBranch:a,baseBranch:n,mergeBranch:r}=e;switch(t.phase){case"need-current-branch":return{id:`${t.name}-current-branch-${Date.now()}`,projectName:t.name,description:"检查当前分支",args:["branch","--show-current"],kind:"need-current-branch"};case"need-fetch":return{id:`${t.name}-fetch-${Date.now()}`,projectName:t.name,description:"拉取远端",args:["fetch","origin"],kind:"need-fetch"};case"need-base-check":return{id:`${t.name}-base-check-${Date.now()}`,projectName:t.name,description:`检查 origin/${n}`,args:["ls-remote","--heads","origin",n],kind:"need-base-check"};case"need-remote-create-check":return{id:`${t.name}-remote-create-check-${Date.now()}`,projectName:t.name,description:`检查远端分支 ${a}`,args:["ls-remote","--heads","origin",a],kind:"need-remote-create-check"};case"need-local-create-check":return{id:`${t.name}-local-create-check-${Date.now()}`,projectName:t.name,description:`检查本地分支 ${a}`,args:["show-ref","--verify",`refs/heads/${a}`],kind:"need-local-create-check"};case"need-checkout-remote-create":return{id:`${t.name}-checkout-remote-${Date.now()}`,projectName:t.name,description:`切换到远端分支 ${a}`,args:["checkout","-B",a,`origin/${a}`],kind:"need-checkout-remote-create"};case"need-create-branch":return{id:`${t.name}-create-branch-${Date.now()}`,projectName:t.name,description:`创建分支 ${a}`,args:["checkout","-B",a,`origin/${n}`],kind:"need-create-branch"};case"need-push-branch":return{id:`${t.name}-push-branch-${Date.now()}`,projectName:t.name,description:`推送分支 ${a}`,args:["push","-u","origin",a],kind:"need-push-branch"};case"need-merge-check":return{id:`${t.name}-merge-check-${Date.now()}`,projectName:t.name,description:`检查 origin/${r}`,args:["ls-remote","--heads","origin",r],kind:"need-merge-check"};case"need-status":return{id:`${t.name}-status-${Date.now()}`,projectName:t.name,description:"检查工作区",args:["status","--porcelain","--untracked-files=all"],kind:"need-status"};case"need-checkout-create":return{id:`${t.name}-checkout-create-${Date.now()}`,projectName:t.name,description:`切换到分支 ${a}`,args:["checkout",a],kind:"need-checkout-create"};case"need-fetch-after-checkout":return{id:`${t.name}-fetch-after-checkout-${Date.now()}`,projectName:t.name,description:"拉取远端",args:["fetch","origin"],kind:"need-fetch-after-checkout"};case"need-merge":return{id:`${t.name}-merge-${Date.now()}`,projectName:t.name,description:`合并 origin/${r}`,args:["merge","--no-ff","--no-edit",`origin/${r}`],kind:"need-merge"};case"need-merge-abort":return{id:`${t.name}-merge-abort-${Date.now()}`,projectName:t.name,description:"终止合并",args:["merge","--abort"],kind:"need-merge-abort"};case"need-push-merge":return{id:`${t.name}-push-merge-${Date.now()}`,projectName:t.name,description:`推送合并结果 ${a}`,args:["push","origin",a],kind:"need-push-merge"};case"need-main-fetch":return{id:`${t.name}-main-fetch-${Date.now()}`,projectName:t.name,description:"拉取远端",args:["fetch","origin"],kind:"need-main-fetch"};case"need-main-check":return{id:`${t.name}-main-check-${Date.now()}`,projectName:t.name,description:"检查 origin/main",args:["ls-remote","--heads","origin","main"],kind:"need-main-check"};case"need-status-main":return{id:`${t.name}-status-main-${Date.now()}`,projectName:t.name,description:"检查工作区",args:["status","--porcelain","--untracked-files=all"],kind:"need-status-main"};case"need-checkout-main":return{id:`${t.name}-checkout-main-${Date.now()}`,projectName:t.name,description:"切换到 main",args:["checkout","main"],kind:"need-checkout-main"};case"need-merge-into-main":return{id:`${t.name}-merge-into-main-${Date.now()}`,projectName:t.name,description:`合并 origin/${a} 到 main`,args:["merge","--no-ff","--no-edit",`origin/${a}`],kind:"need-merge-into-main"};case"need-merge-into-main-abort":return{id:`${t.name}-merge-into-main-abort-${Date.now()}`,projectName:t.name,description:"终止合并到 main",args:["merge","--abort"],kind:"need-merge-into-main-abort"};case"need-push-main":return{id:`${t.name}-push-main-${Date.now()}`,projectName:t.name,description:"推送 main",args:["push","origin","main"],kind:"need-push-main"};default:return null}}(e,a);if(n)return e.currentIndex=t,e.currentStep=n,n;e.currentIndex=t+1}return e.currentStep=null,null}async function b(e){let{createBranch:t}=e;for(let a of[...e.projects].reverse()){if(!a.originalBranch)continue;e.operationLogs.push(`[${a.name}] 回滚: ${k(["checkout",a.originalBranch])}`);let n=await g(a.path,["checkout",a.originalBranch]);if(f(e.operationLogs,a.name,`回滚切换分支 ${a.originalBranch}`,n),a.createdLocalBranch&&!a.hadLocalBranch){e.operationLogs.push(`[${a.name}] 回滚: ${k(["branch","-D",t])}`);let n=await g(a.path,["branch","-D",t]);f(e.operationLogs,a.name,`回滚删除本地分支 ${t}`,n)}}}async function w(e,t){let a=e.projects.find(e=>e.name===t.projectName);if(!a)return void e.feedbacks.push(`[${t.projectName}] 项目不存在,跳过。`);e.operationLogs.push(`[${a.name}] ${k(t.args)}`);let n=await g(a.path,t.args);switch(f(e.operationLogs,a.name,t.description,n),("need-checkout-remote-create"===t.kind||"need-create-branch"===t.kind||"need-checkout-create"===t.kind||"need-checkout-main"===t.kind)&&function(e,t,a){let n=new Set(t.ignoredUntrackedPaths??[]),r=(0,p.appendIgnoredPathsFromCheckoutWarning)(a.stderr,n);r.length>0&&(t.ignoredUntrackedPaths=[...n],e.operationLogs.push(`[${t.name}] 提示: 检测到子模块残留目录 ${r.join(", ")},状态检查将忽略对应未跟踪路径`))}(e,a,n),t.kind){case"need-current-branch":a.originalBranch=n.stdout.replace(/\s+/g," ").trim()||"HEAD",0===n.code?a.phase="need-fetch":(a.status="failed",e.feedbacks.push(`[${a.name}] 获取当前分支失败。`));break;case"need-fetch":0===n.code?a.phase="need-base-check":(a.status="failed",e.feedbacks.push(`[${a.name}] 拉取远端失败: ${n.stderr||n.stdout}`));break;case"need-base-check":a.baseExists=!!n.stdout.trim(),a.baseExists?a.phase="need-remote-create-check":(a.status="failed",e.feedbacks.push(`[${a.name}] origin/${e.baseBranch} 不存在,无法创建分支。`));break;case"need-remote-create-check":a.remoteCreateExists=!!n.stdout.trim(),a.phase="need-local-create-check";break;case"need-local-create-check":a.localCreateExists=0===n.code,a.localCreateExists?a.phase="need-checkout-create":a.remoteCreateExists?(a.hadLocalBranch=!1,a.phase="need-checkout-remote-create"):(a.hadLocalBranch=!1,a.phase="need-create-branch");break;case"need-checkout-remote-create":0===n.code?a.phase="need-merge-check":(a.status="failed",e.feedbacks.push(`[${a.name}] 切换到远端分支失败: ${n.stderr||n.stdout}`));break;case"need-create-branch":0===n.code?(a.createdLocalBranch=!0,a.phase="need-push-branch"):(a.status="failed",e.feedbacks.push(`[${a.name}] 创建分支失败: ${n.stderr||n.stdout}`));break;case"need-push-branch":0===n.code?a.phase="need-merge-check":(a.status="failed",e.feedbacks.push(`[${a.name}] 推送新分支失败: ${n.stderr||n.stdout}`));break;case"need-merge-check":a.mergeExists=!!n.stdout.trim(),a.mergeExists?a.phase="need-status":(a.status="failed",e.feedbacks.push(`[${a.name}] origin/${e.mergeBranch} 不存在,无法合并。`));break;case"need-status":a.statusClean=!(0,p.hasBlockingWorkspaceChanges)(n.stdout,a.ignoredUntrackedPaths),a.statusClean?a.phase="need-checkout-create":(a.status="failed",e.feedbacks.push(`[${a.name}] 工作区有未提交改动,请先处理后再执行合并。`));break;case"need-checkout-create":0===n.code?a.phase="need-fetch-after-checkout":(a.status="failed",e.feedbacks.push(`[${a.name}] 切换到分支失败: ${n.stderr||n.stdout}`));break;case"need-fetch-after-checkout":0===n.code?a.phase="need-merge":(a.status="failed",e.feedbacks.push(`[${a.name}] 拉取远端失败: ${n.stderr||n.stdout}`));break;case"need-merge":0===n.code?a.phase="need-push-merge":(a.phase="need-merge-abort",e.feedbacks.push(`[${a.name}] 合并冲突,准备终止合并。`));break;case"need-merge-abort":0!==n.code&&e.feedbacks.push(`[${a.name}] 终止合并失败: ${n.stderr||n.stdout}`),a.status="failed",e.feedbacks.push(`[${a.name}] 合并冲突,已终止合并,请手动处理。`);break;case"need-push-merge":0===n.code?a.phase="need-main-fetch":(a.status="failed",e.feedbacks.push(`[${a.name}] 推送合并结果失败: ${n.stderr||n.stdout}`));break;case"need-main-fetch":0===n.code?a.phase="need-main-check":(a.status="failed",e.feedbacks.push(`[${a.name}] 拉取远端失败: ${n.stderr||n.stdout}`));break;case"need-main-check":n.stdout.trim()?a.phase="need-status-main":(a.status="failed",e.feedbacks.push(`[${a.name}] origin/main 不存在,无法合并。`));break;case"need-status-main":(0,p.hasBlockingWorkspaceChanges)(n.stdout,a.ignoredUntrackedPaths)?(a.status="failed",e.feedbacks.push(`[${a.name}] 工作区有未提交改动,请先处理后再合并 main。`)):a.phase="need-checkout-main";break;case"need-checkout-main":0===n.code?a.phase="need-merge-into-main":(a.status="failed",e.feedbacks.push(`[${a.name}] 切换到 main 失败: ${n.stderr||n.stdout}`));break;case"need-merge-into-main":0===n.code?a.phase="need-push-main":(a.phase="need-merge-into-main-abort",e.feedbacks.push(`[${a.name}] 合并到 main 冲突,准备终止合并。`));break;case"need-merge-into-main-abort":0!==n.code&&e.feedbacks.push(`[${a.name}] 终止合并到 main 失败: ${n.stderr||n.stdout}`),a.status="failed",e.feedbacks.push(`[${a.name}] 合并到 main 冲突,已终止合并,请手动处理。`);break;case"need-push-main":0===n.code?(a.status="done",a.phase="done"):(a.status="failed",e.feedbacks.push(`[${a.name}] 推送 main 失败: ${n.stderr||n.stdout}`))}}async function j(e){for(let t of new Set(e.projects.map(e=>e.tempRootPath).filter(Boolean)))try{await (0,h.cleanupTempExecutionRepo)(t)}catch(e){console.error(`清理临时目录失败: ${t}`,e)}}async function N(e){try{let r=await e.json(),p="string"==typeof r.action?r.action:"";if("start"===p){let e=Array.isArray(r.projects)?r.projects:[],p="string"==typeof r.createBranch?r.createBranch.trim():"",g="string"==typeof r.baseBranch?r.baseBranch.trim():"",f="string"==typeof r.mergeBranch?r.mergeBranch.trim():"",b="string"==typeof r.runId?r.runId:"",w=[],N=[],x=new Set;if(0===e.length||!p||!g||!f)return n.NextResponse.json({success:!1,operationLogs:w,feedbacks:["缺少必要参数,请填写完整后重试。"]},{status:400});if(!l(p)||!l(g)||!l(f))return n.NextResponse.json({success:!1,operationLogs:w,feedbacks:["分支名称不合法,请避免空格或以 - 开头。"]},{status:400});if(!b)return n.NextResponse.json({success:!1,operationLogs:w,feedbacks:["缺少 runId,请刷新页面后重试。"]},{status:400});(0,u.createUatGitFlowState)(b);let S=await (0,i.getProjectsConfig)(),R=o.WORKSPACE_CONFIG.WORKSPACE_ROOT,L=[];try{for(let n of e){var t,a;let e=String(n),r=(0,d.sanitizeProjectName)(e);if(!r||r!==e){w.push(`[${e}] 失败: 项目名称包含无效字符`),N.push(`[${e}] 项目名称包含无效字符,已跳过。`);continue}if(!S[r]){w.push(`[${r}] 失败: 未在项目配置中找到`),N.push(`[${r}] 未在项目配置中找到,已跳过。`);continue}let o=(0,c.join)(R,r);if(!(0,s.existsSync)(o)){w.push(`[${r}] 失败: 项目目录不存在`),N.push(`[${r}] 项目目录不存在,已跳过。`);continue}if(!(0,s.existsSync)((0,c.join)(o,".git"))){w.push(`[${r}] 失败: 非 Git 仓库`),N.push(`[${r}] 不是有效的 Git 仓库,已跳过。`);continue}let i=await (0,h.createTempExecutionRepo)(o,r);if(!i.success){w.push(`[${r}] 失败: 创建临时执行仓库失败 ${i.error}`),N.push(`[${r}] 创建临时执行仓库失败: ${i.error}`);continue}x.add(i.value.tempRootPath),w.push(`[${r}] 使用临时目录执行: ${i.value.projectPath}`),L.push((t=i.value.projectPath,a=i.value.tempRootPath,{name:r,path:t,tempRootPath:a,phase:"need-current-branch",status:"pending",originalBranch:"",createdLocalBranch:!1,hadLocalBranch:!0,ignoredUntrackedPaths:[],baseExists:null,remoteCreateExists:null,localCreateExists:null,mergeExists:null,statusClean:null}))}}catch(e){for(let e of x)try{await (0,h.cleanupTempExecutionRepo)(e)}catch(t){console.error(`清理临时目录失败: ${e}`,t)}throw(0,u.clearUatGitFlowState)(b),e}let D={runId:b,createBranch:p,baseBranch:g,mergeBranch:f,projects:L,currentIndex:0,operationLogs:w,feedbacks:N,currentStep:null,updatedAt:Date.now()},B=$(D);return B?(0,m.createStepRun)(D):(await j(D),(0,u.clearUatGitFlowState)(b)),n.NextResponse.json({success:!0,runId:b,nextStep:B?{stepId:B.id,projectName:B.projectName,description:B.description,command:k(B.args)}:null,operationLogs:D.operationLogs,feedbacks:D.feedbacks,isComplete:null===B})}if("execute"===p){let e="string"==typeof r.runId?r.runId:"",t="string"==typeof r.stepId?r.stepId:"",a=(0,m.getStepRun)(e);if(!a)return n.NextResponse.json({success:!1,operationLogs:[],feedbacks:["未找到执行上下文,请重新开始。"]},{status:404});if((0,u.isUatGitFlowAborted)(e))return a.operationLogs.push("已收到中断请求,开始回滚已执行的本地操作。"),await b(a),await j(a),(0,m.clearStepRun)(e),(0,u.clearUatGitFlowState)(e),n.NextResponse.json({success:!0,runId:e,nextStep:null,operationLogs:a.operationLogs,feedbacks:a.feedbacks,isComplete:!0,aborted:!0});if(!a.currentStep||a.currentStep.id!==t)return n.NextResponse.json({success:!1,operationLogs:a.operationLogs,feedbacks:["步骤已更新,请重新确认。"]},{status:409});await w(a,a.currentStep);let s=$(a);return(0,m.updateStepRun)(a),s||(await j(a),(0,m.clearStepRun)(e),(0,u.clearUatGitFlowState)(e)),n.NextResponse.json({success:!0,runId:e,nextStep:s?{stepId:s.id,projectName:s.projectName,description:s.description,command:k(s.args)}:null,operationLogs:a.operationLogs,feedbacks:a.feedbacks,isComplete:null===s})}if("abort"===p){let e="string"==typeof r.runId?r.runId:"",t=(0,m.getStepRun)(e);if(!t)return n.NextResponse.json({success:!1,operationLogs:[],feedbacks:["未找到执行上下文,请重新开始。"]},{status:404});return t.operationLogs.push("已收到中断请求,开始回滚已执行的本地操作。"),await b(t),await j(t),(0,m.clearStepRun)(e),(0,u.clearUatGitFlowState)(e),n.NextResponse.json({success:!0,runId:e,nextStep:null,operationLogs:t.operationLogs,feedbacks:t.feedbacks,isComplete:!0,aborted:!0})}return n.NextResponse.json({success:!1,operationLogs:[],feedbacks:["未知操作类型。"]},{status:400})}catch(e){return console.error("UAT git 分步执行失败:",e),n.NextResponse.json({success:!1,operationLogs:[],feedbacks:[e instanceof Error?e.message:"执行失败"]},{status:500})}}}},3301:e=>{"use strict";var{g:t,__dirname:a}=e;{e.s({patchFetch:()=>o,routeModule:()=>t,serverHooks:()=>d,workAsyncStorage:()=>a,workUnitAsyncStorage:()=>i});var n=e.i(45746),r=e.i(93828),s=e.i(18250),c=e.i(9967);let t=new n.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/uat-git-flow/step/route",pathname:"/api/uat-git-flow/step",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/uat-git-flow/step/route.ts",nextConfigOutput:"",userland:c}),{workAsyncStorage:a,workUnitAsyncStorage:i,serverHooks:d}=t;function o(){return(0,s.patchFetch)({workAsyncStorage:a,workUnitAsyncStorage:i})}}}};
1
+ module.exports={75405:e=>{"use strict";var{g:a,__dirname:t}=e;{e.s({clearStepRun:()=>c,createStepRun:()=>s,getStepRun:()=>r,updateStepRun:()=>i});let a=new Map;function n(){let e=Date.now();for(let[t,n]of a.entries())e-n.updatedAt>36e5&&a.delete(t)}function s(e){n(),a.set(e.runId,{...e,updatedAt:Date.now()})}function r(e){n();let t=a.get(e);return t||null}function i(e){a.set(e.runId,{...e,updatedAt:Date.now()})}function c(e){a.delete(e)}}},9967:e=>{"use strict";var{g:a,__dirname:t}=e;{e.s({POST:()=>j});var n=e.i(15494),s=e.i(87485),r=e.i(83886),i=e.i(30331),c=e.i(88941),o=e.i(35692),d=e.i(77159),u=e.i(79810),m=e.i(34926),p=e.i(33808),h=e.i(75405);let a=/\\s/,t="main";function f(e){return!(!e||a.test(e)||e.startsWith("-"))}function g(e,a){return new Promise((t,n)=>{let r=(0,s.spawn)("git",a,{cwd:e,stdio:["ignore","pipe","pipe"]}),i="",c="";r.stdout?.on("data",e=>{i+=e.toString()}),r.stderr?.on("data",e=>{c+=e.toString()}),r.on("close",e=>{t({code:e,stdout:i,stderr:c})}),r.on("error",e=>{n(e)})})}function k(e){return`git ${e.join(" ")}`}function l(e,a,t,n){0===n.code?e.push(`[${a}] 完成: ${t}`):e.push(`[${a}] 失败: ${t} ${n.stderr||n.stdout}`)}function $(e){for(let a=e.currentIndex;a<e.projects.length;a+=1){let t=e.projects[a];if("pending"!==t.status){e.currentIndex=a+1;continue}let n=function(e,a){if("pending"!==a.status)return null;let{createBranch:t,baseBranch:n,mergeBranch:s}=e;switch(a.phase){case"need-current-branch":return{id:`${a.name}-current-branch-${Date.now()}`,projectName:a.name,description:"检查当前分支",args:["branch","--show-current"],kind:"need-current-branch"};case"need-fetch":return{id:`${a.name}-fetch-${Date.now()}`,projectName:a.name,description:"拉取远端",args:["fetch","origin"],kind:"need-fetch"};case"need-base-check":return{id:`${a.name}-base-check-${Date.now()}`,projectName:a.name,description:`检查 origin/${n}`,args:["ls-remote","--heads","origin",n],kind:"need-base-check"};case"need-remote-create-check":return{id:`${a.name}-remote-create-check-${Date.now()}`,projectName:a.name,description:`检查远端分支 ${t}`,args:["ls-remote","--heads","origin",t],kind:"need-remote-create-check"};case"need-local-create-check":return{id:`${a.name}-local-create-check-${Date.now()}`,projectName:a.name,description:`检查本地分支 ${t}`,args:["show-ref","--verify",`refs/heads/${t}`],kind:"need-local-create-check"};case"need-checkout-remote-create":return{id:`${a.name}-checkout-remote-${Date.now()}`,projectName:a.name,description:`切换到远端分支 ${t}`,args:["checkout","-B",t,`origin/${t}`],kind:"need-checkout-remote-create"};case"need-create-branch":return{id:`${a.name}-create-branch-${Date.now()}`,projectName:a.name,description:`创建分支 ${t}`,args:["checkout","-B",t,`origin/${n}`],kind:"need-create-branch"};case"need-push-branch":return{id:`${a.name}-push-branch-${Date.now()}`,projectName:a.name,description:`推送分支 ${t}`,args:["push","-u","origin",t],kind:"need-push-branch"};case"need-merge-check":return{id:`${a.name}-merge-check-${Date.now()}`,projectName:a.name,description:`检查 origin/${s}`,args:["ls-remote","--heads","origin",s],kind:"need-merge-check"};case"need-status":return{id:`${a.name}-status-${Date.now()}`,projectName:a.name,description:"检查工作区",args:["status","--porcelain","--untracked-files=all"],kind:"need-status"};case"need-checkout-create":return{id:`${a.name}-checkout-create-${Date.now()}`,projectName:a.name,description:`切换到分支 ${t}`,args:["checkout",t],kind:"need-checkout-create"};case"need-fetch-after-checkout":return{id:`${a.name}-fetch-after-checkout-${Date.now()}`,projectName:a.name,description:"拉取远端",args:["fetch","origin"],kind:"need-fetch-after-checkout"};case"need-merge":return{id:`${a.name}-merge-${Date.now()}`,projectName:a.name,description:`合并 origin/${s}`,args:["merge","--no-ff","--no-edit",`origin/${s}`],kind:"need-merge"};case"need-merge-abort":return{id:`${a.name}-merge-abort-${Date.now()}`,projectName:a.name,description:"终止合并",args:["merge","--abort"],kind:"need-merge-abort"};case"need-push-merge":return{id:`${a.name}-push-merge-${Date.now()}`,projectName:a.name,description:`推送合并结果 ${t}`,args:["push","origin",t],kind:"need-push-merge"};case"need-main-fetch":return{id:`${a.name}-main-fetch-${Date.now()}`,projectName:a.name,description:"拉取远端",args:["fetch","origin"],kind:"need-main-fetch"};case"need-main-check":return{id:`${a.name}-main-check-${Date.now()}`,projectName:a.name,description:"检查 origin/main",args:["ls-remote","--heads","origin","main"],kind:"need-main-check"};case"need-status-main":return{id:`${a.name}-status-main-${Date.now()}`,projectName:a.name,description:"检查工作区",args:["status","--porcelain","--untracked-files=all"],kind:"need-status-main"};case"need-checkout-main":return{id:`${a.name}-checkout-main-${Date.now()}`,projectName:a.name,description:"切换到 main",args:["checkout","main"],kind:"need-checkout-main"};case"need-merge-into-main":return{id:`${a.name}-merge-into-main-${Date.now()}`,projectName:a.name,description:`合并 origin/${t} 到 main`,args:["merge","--no-ff","--no-edit",`origin/${t}`],kind:"need-merge-into-main"};case"need-merge-into-main-abort":return{id:`${a.name}-merge-into-main-abort-${Date.now()}`,projectName:a.name,description:"终止合并到 main",args:["merge","--abort"],kind:"need-merge-into-main-abort"};case"need-push-main":return{id:`${a.name}-push-main-${Date.now()}`,projectName:a.name,description:"推送 main",args:["push","origin","main"],kind:"need-push-main"};case"need-fix-main-fetch":return{id:`${a.name}-fix-main-fetch-${Date.now()}`,projectName:a.name,description:"拉取远端",args:["fetch","origin"],kind:"need-fix-main-fetch"};case"need-fix-main-check":return{id:`${a.name}-fix-main-check-${Date.now()}`,projectName:a.name,description:"检查 origin/fix/main",args:["ls-remote","--heads","origin","fix/main"],kind:"need-fix-main-check"};case"need-status-fix-main":return{id:`${a.name}-status-fix-main-${Date.now()}`,projectName:a.name,description:"检查工作区",args:["status","--porcelain","--untracked-files=all"],kind:"need-status-fix-main"};case"need-checkout-fix-main":return{id:`${a.name}-checkout-fix-main-${Date.now()}`,projectName:a.name,description:"切换到 fix/main",args:["checkout","fix/main"],kind:"need-checkout-fix-main"};case"need-merge-into-fix-main":return{id:`${a.name}-merge-into-fix-main-${Date.now()}`,projectName:a.name,description:`合并 origin/${t} 到 fix/main`,args:["merge","--no-ff","--no-edit",`origin/${t}`],kind:"need-merge-into-fix-main"};case"need-merge-into-fix-main-abort":return{id:`${a.name}-merge-into-fix-main-abort-${Date.now()}`,projectName:a.name,description:"终止合并到 fix/main",args:["merge","--abort"],kind:"need-merge-into-fix-main-abort"};case"need-push-fix-main":return{id:`${a.name}-push-fix-main-${Date.now()}`,projectName:a.name,description:"推送 fix/main",args:["push","origin","fix/main"],kind:"need-push-fix-main"};default:return null}}(e,t);if(n)return e.currentIndex=a,e.currentStep=n,n;e.currentIndex=a+1}return e.currentStep=null,null}async function b(e){let{createBranch:a}=e;for(let t of[...e.projects].reverse()){if(!t.originalBranch)continue;e.operationLogs.push(`[${t.name}] 回滚: ${k(["checkout",t.originalBranch])}`);let n=await g(t.path,["checkout",t.originalBranch]);if(l(e.operationLogs,t.name,`回滚切换分支 ${t.originalBranch}`,n),t.createdLocalBranch&&!t.hadLocalBranch){e.operationLogs.push(`[${t.name}] 回滚: ${k(["branch","-D",a])}`);let n=await g(t.path,["branch","-D",a]);l(e.operationLogs,t.name,`回滚删除本地分支 ${a}`,n)}}}async function x(e,a){let t=e.projects.find(e=>e.name===a.projectName);if(!t)return void e.feedbacks.push(`[${a.projectName}] 项目不存在,跳过。`);e.operationLogs.push(`[${t.name}] ${k(a.args)}`);let n=await g(t.path,a.args);switch(l(e.operationLogs,t.name,a.description,n),("need-checkout-remote-create"===a.kind||"need-create-branch"===a.kind||"need-checkout-create"===a.kind||"need-checkout-main"===a.kind||"need-checkout-fix-main"===a.kind)&&function(e,a,t){let n=new Set(a.ignoredUntrackedPaths??[]),s=(0,m.appendIgnoredPathsFromCheckoutWarning)(t.stderr,n);s.length>0&&(a.ignoredUntrackedPaths=[...n],e.operationLogs.push(`[${a.name}] 提示: 检测到子模块残留目录 ${s.join(", ")},状态检查将忽略对应未跟踪路径`))}(e,t,n),a.kind){case"need-current-branch":t.originalBranch=n.stdout.replace(/\s+/g," ").trim()||"HEAD",0===n.code?t.phase="need-fetch":(t.status="failed",e.feedbacks.push(`[${t.name}] 获取当前分支失败。`));break;case"need-fetch":0===n.code?t.phase="need-base-check":(t.status="failed",e.feedbacks.push(`[${t.name}] 拉取远端失败: ${n.stderr||n.stdout}`));break;case"need-base-check":t.baseExists=!!n.stdout.trim(),t.baseExists?t.phase="need-remote-create-check":(t.status="failed",e.feedbacks.push(`[${t.name}] origin/${e.baseBranch} 不存在,无法创建分支。`));break;case"need-remote-create-check":t.remoteCreateExists=!!n.stdout.trim(),t.phase="need-local-create-check";break;case"need-local-create-check":t.localCreateExists=0===n.code,t.localCreateExists?t.phase="need-checkout-create":t.remoteCreateExists?(t.hadLocalBranch=!1,t.phase="need-checkout-remote-create"):(t.hadLocalBranch=!1,t.phase="need-create-branch");break;case"need-checkout-remote-create":0===n.code?t.phase="need-merge-check":(t.status="failed",e.feedbacks.push(`[${t.name}] 切换到远端分支失败: ${n.stderr||n.stdout}`));break;case"need-create-branch":0===n.code?(t.createdLocalBranch=!0,t.phase="need-push-branch"):(t.status="failed",e.feedbacks.push(`[${t.name}] 创建分支失败: ${n.stderr||n.stdout}`));break;case"need-push-branch":0===n.code?t.phase="need-merge-check":(t.status="failed",e.feedbacks.push(`[${t.name}] 推送新分支失败: ${n.stderr||n.stdout}`));break;case"need-merge-check":t.mergeExists=!!n.stdout.trim(),t.mergeExists?t.phase="need-status":(t.status="failed",e.feedbacks.push(`[${t.name}] origin/${e.mergeBranch} 不存在,无法合并。`));break;case"need-status":t.statusClean=!(0,m.hasBlockingWorkspaceChanges)(n.stdout,t.ignoredUntrackedPaths),t.statusClean?t.phase="need-checkout-create":(t.status="failed",e.feedbacks.push(`[${t.name}] 工作区有未提交改动,请先处理后再执行合并。`));break;case"need-checkout-create":0===n.code?t.phase="need-fetch-after-checkout":(t.status="failed",e.feedbacks.push(`[${t.name}] 切换到分支失败: ${n.stderr||n.stdout}`));break;case"need-fetch-after-checkout":0===n.code?t.phase="need-merge":(t.status="failed",e.feedbacks.push(`[${t.name}] 拉取远端失败: ${n.stderr||n.stdout}`));break;case"need-merge":0===n.code?t.phase="need-push-merge":(t.phase="need-merge-abort",e.feedbacks.push(`[${t.name}] 合并冲突,准备终止合并。`));break;case"need-merge-abort":0!==n.code&&e.feedbacks.push(`[${t.name}] 终止合并失败: ${n.stderr||n.stdout}`),t.status="failed",e.feedbacks.push(`[${t.name}] 合并冲突,已终止合并,请手动处理。`);break;case"need-push-merge":0===n.code?t.phase="need-main-fetch":(t.status="failed",e.feedbacks.push(`[${t.name}] 推送合并结果失败: ${n.stderr||n.stdout}`));break;case"need-main-fetch":0===n.code?t.phase="need-main-check":(t.status="failed",e.feedbacks.push(`[${t.name}] 拉取远端失败: ${n.stderr||n.stdout}`));break;case"need-main-check":n.stdout.trim()?t.phase="need-status-main":(t.status="failed",e.feedbacks.push(`[${t.name}] origin/main 不存在,无法合并。`));break;case"need-status-main":(0,m.hasBlockingWorkspaceChanges)(n.stdout,t.ignoredUntrackedPaths)?(t.status="failed",e.feedbacks.push(`[${t.name}] 工作区有未提交改动,请先处理后再合并 main。`)):t.phase="need-checkout-main";break;case"need-checkout-main":0===n.code?t.phase="need-merge-into-main":(t.status="failed",e.feedbacks.push(`[${t.name}] 切换到 main 失败: ${n.stderr||n.stdout}`));break;case"need-merge-into-main":0===n.code?t.phase="need-push-main":(t.phase="need-merge-into-main-abort",e.feedbacks.push(`[${t.name}] 合并到 main 冲突,准备终止合并。`));break;case"need-merge-into-main-abort":0!==n.code&&e.feedbacks.push(`[${t.name}] 终止合并到 main 失败: ${n.stderr||n.stdout}`),t.status="failed",e.feedbacks.push(`[${t.name}] 合并到 main 冲突,已终止合并,请手动处理。`);break;case"need-push-main":0===n.code?t.phase="need-fix-main-fetch":(t.status="failed",e.feedbacks.push(`[${t.name}] 推送 main 失败: ${n.stderr||n.stdout}`));break;case"need-fix-main-fetch":0===n.code?t.phase="need-fix-main-check":(t.status="failed",e.feedbacks.push(`[${t.name}] 拉取远端失败: ${n.stderr||n.stdout}`));break;case"need-fix-main-check":n.stdout.trim()?t.phase="need-status-fix-main":(t.status="failed",e.feedbacks.push(`[${t.name}] origin/fix/main 不存在,无法合并。`));break;case"need-status-fix-main":(0,m.hasBlockingWorkspaceChanges)(n.stdout,t.ignoredUntrackedPaths)?(t.status="failed",e.feedbacks.push(`[${t.name}] 工作区有未提交改动,请先处理后再合并 fix/main。`)):t.phase="need-checkout-fix-main";break;case"need-checkout-fix-main":0===n.code?t.phase="need-merge-into-fix-main":(t.status="failed",e.feedbacks.push(`[${t.name}] 切换到 fix/main 失败: ${n.stderr||n.stdout}`));break;case"need-merge-into-fix-main":0===n.code?t.phase="need-push-fix-main":(t.phase="need-merge-into-fix-main-abort",e.feedbacks.push(`[${t.name}] 合并到 fix/main 冲突,准备终止合并。`));break;case"need-merge-into-fix-main-abort":0!==n.code&&e.feedbacks.push(`[${t.name}] 终止合并到 fix/main 失败: ${n.stderr||n.stdout}`),t.status="failed",e.feedbacks.push(`[${t.name}] 合并到 fix/main 冲突,已终止合并,请手动处理。`);break;case"need-push-fix-main":0===n.code?(t.status="done",t.phase="done"):(t.status="failed",e.feedbacks.push(`[${t.name}] 推送 fix/main 失败: ${n.stderr||n.stdout}`))}}async function w(e){for(let a of new Set(e.projects.map(e=>e.tempRootPath).filter(Boolean)))try{await (0,p.cleanupTempExecutionRepo)(a)}catch(e){console.error(`清理临时目录失败: ${a}`,e)}}async function j(e){try{let m=await e.json(),g="string"==typeof m.action?m.action:"";if("start"===g){let e=Array.isArray(m.projects)?m.projects:[],g="string"==typeof m.createBranch?m.createBranch.trim():"",l="string"==typeof m.baseBranch?m.baseBranch.trim():"",b="string"==typeof m.mergeBranch?m.mergeBranch.trim():"",x="string"==typeof m.runId?m.runId:"",j=[],N=[],S=new Set;if(0===e.length||!g||!l||!b)return n.NextResponse.json({success:!1,operationLogs:j,feedbacks:["缺少必要参数,请填写完整后重试。"]},{status:400});if(l!==t)return n.NextResponse.json({success:!1,operationLogs:j,feedbacks:[`UAT 操作流从 origin 分支创建固定为 ${t}。`]},{status:400});if(!f(g)||!f(l)||!f(b))return n.NextResponse.json({success:!1,operationLogs:j,feedbacks:["分支名称不合法,请避免空格或以 - 开头。"]},{status:400});if(!x)return n.NextResponse.json({success:!1,operationLogs:j,feedbacks:["缺少 runId,请刷新页面后重试。"]},{status:400});(0,u.createUatGitFlowState)(x);let R=await (0,o.getProjectsConfig)(),D=c.WORKSPACE_CONFIG.WORKSPACE_ROOT,L=[];try{for(let t of e){var a,s;let e=String(t),n=(0,d.sanitizeProjectName)(e);if(!n||n!==e){j.push(`[${e}] 失败: 项目名称包含无效字符`),N.push(`[${e}] 项目名称包含无效字符,已跳过。`);continue}if(!R[n]){j.push(`[${n}] 失败: 未在项目配置中找到`),N.push(`[${n}] 未在项目配置中找到,已跳过。`);continue}let c=(0,i.join)(D,n);if(!(0,r.existsSync)(c)){j.push(`[${n}] 失败: 项目目录不存在`),N.push(`[${n}] 项目目录不存在,已跳过。`);continue}if(!(0,r.existsSync)((0,i.join)(c,".git"))){j.push(`[${n}] 失败: 非 Git 仓库`),N.push(`[${n}] 不是有效的 Git 仓库,已跳过。`);continue}let o=await (0,p.createTempExecutionRepo)(c,n);if(!o.success){j.push(`[${n}] 失败: 创建临时执行仓库失败 ${o.error}`),N.push(`[${n}] 创建临时执行仓库失败: ${o.error}`);continue}S.add(o.value.tempRootPath),j.push(`[${n}] 使用临时目录执行: ${o.value.projectPath}`),L.push((a=o.value.projectPath,s=o.value.tempRootPath,{name:n,path:a,tempRootPath:s,phase:"need-current-branch",status:"pending",originalBranch:"",createdLocalBranch:!1,hadLocalBranch:!0,ignoredUntrackedPaths:[],baseExists:null,remoteCreateExists:null,localCreateExists:null,mergeExists:null,statusClean:null}))}}catch(e){for(let e of S)try{await (0,p.cleanupTempExecutionRepo)(e)}catch(a){console.error(`清理临时目录失败: ${e}`,a)}throw(0,u.clearUatGitFlowState)(x),e}let B={runId:x,createBranch:g,baseBranch:l,mergeBranch:b,projects:L,currentIndex:0,operationLogs:j,feedbacks:N,currentStep:null,updatedAt:Date.now()},y=$(B);return y?(0,h.createStepRun)(B):(await w(B),(0,u.clearUatGitFlowState)(x)),n.NextResponse.json({success:!0,runId:x,nextStep:y?{stepId:y.id,projectName:y.projectName,description:y.description,command:k(y.args)}:null,operationLogs:B.operationLogs,feedbacks:B.feedbacks,isComplete:null===y})}if("execute"===g){let e="string"==typeof m.runId?m.runId:"",a="string"==typeof m.stepId?m.stepId:"",t=(0,h.getStepRun)(e);if(!t)return n.NextResponse.json({success:!1,operationLogs:[],feedbacks:["未找到执行上下文,请重新开始。"]},{status:404});if((0,u.isUatGitFlowAborted)(e))return t.operationLogs.push("已收到中断请求,开始回滚已执行的本地操作。"),await b(t),await w(t),(0,h.clearStepRun)(e),(0,u.clearUatGitFlowState)(e),n.NextResponse.json({success:!0,runId:e,nextStep:null,operationLogs:t.operationLogs,feedbacks:t.feedbacks,isComplete:!0,aborted:!0});if(!t.currentStep||t.currentStep.id!==a)return n.NextResponse.json({success:!1,operationLogs:t.operationLogs,feedbacks:["步骤已更新,请重新确认。"]},{status:409});await x(t,t.currentStep);let s=$(t);return(0,h.updateStepRun)(t),s||(await w(t),(0,h.clearStepRun)(e),(0,u.clearUatGitFlowState)(e)),n.NextResponse.json({success:!0,runId:e,nextStep:s?{stepId:s.id,projectName:s.projectName,description:s.description,command:k(s.args)}:null,operationLogs:t.operationLogs,feedbacks:t.feedbacks,isComplete:null===s})}if("abort"===g){let e="string"==typeof m.runId?m.runId:"",a=(0,h.getStepRun)(e);if(!a)return n.NextResponse.json({success:!1,operationLogs:[],feedbacks:["未找到执行上下文,请重新开始。"]},{status:404});return a.operationLogs.push("已收到中断请求,开始回滚已执行的本地操作。"),await b(a),await w(a),(0,h.clearStepRun)(e),(0,u.clearUatGitFlowState)(e),n.NextResponse.json({success:!0,runId:e,nextStep:null,operationLogs:a.operationLogs,feedbacks:a.feedbacks,isComplete:!0,aborted:!0})}return n.NextResponse.json({success:!1,operationLogs:[],feedbacks:["未知操作类型。"]},{status:400})}catch(e){return console.error("UAT git 分步执行失败:",e),n.NextResponse.json({success:!1,operationLogs:[],feedbacks:[e instanceof Error?e.message:"执行失败"]},{status:500})}}}},3301:e=>{"use strict";var{g:a,__dirname:t}=e;{e.s({patchFetch:()=>c,routeModule:()=>a,serverHooks:()=>d,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>o});var n=e.i(45746),s=e.i(93828),r=e.i(18250),i=e.i(9967);let a=new n.AppRouteRouteModule({definition:{kind:s.RouteKind.APP_ROUTE,page:"/api/uat-git-flow/step/route",pathname:"/api/uat-git-flow/step",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/uat-git-flow/step/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:t,workUnitAsyncStorage:o,serverHooks:d}=a;function c(){return(0,r.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:o})}}}};
2
2
 
3
3
  //# sourceMappingURL=_24087f66._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/server/src/app/api/uat-git-flow/step-state.ts","turbopack:///[project]/packages/server/src/app/api/uat-git-flow/step/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":["type ProjectPhase =\n | 'need-current-branch'\n | 'need-fetch'\n | 'need-base-check'\n | 'need-remote-create-check'\n | 'need-local-create-check'\n | 'need-checkout-remote-create'\n | 'need-create-branch'\n | 'need-push-branch'\n | 'need-merge-check'\n | 'need-status'\n | 'need-checkout-create'\n | 'need-fetch-after-checkout'\n | 'need-merge'\n | 'need-merge-abort'\n | 'need-push-merge'\n | 'need-checkout-main'\n | 'need-merge-into-main'\n | 'need-merge-into-main-abort'\n | 'need-main-check'\n | 'need-status-main'\n | 'need-main-fetch'\n | 'need-push-main'\n | 'done'\n | 'failed';\n\nexport type StepDescriptor = {\n id: string;\n projectName: string;\n description: string;\n args: string[];\n kind: ProjectPhase;\n};\n\nexport type ProjectRunState = {\n name: string;\n path: string;\n tempRootPath: string;\n phase: ProjectPhase;\n status: 'pending' | 'done' | 'failed';\n originalBranch: string;\n createdLocalBranch: boolean;\n hadLocalBranch: boolean;\n ignoredUntrackedPaths: string[];\n baseExists: boolean | null;\n remoteCreateExists: boolean | null;\n localCreateExists: boolean | null;\n mergeExists: boolean | null;\n statusClean: boolean | null;\n};\n\nexport type RunState = {\n runId: string;\n createBranch: string;\n baseBranch: string;\n mergeBranch: string;\n projects: ProjectRunState[];\n currentIndex: number;\n operationLogs: string[];\n feedbacks: string[];\n currentStep: StepDescriptor | null;\n updatedAt: number;\n};\n\nconst runStates = new Map<string, RunState>();\nconst RUN_STATE_TTL = 1000 * 60 * 60;\n\nfunction cleanupRunStates() {\n const now = Date.now();\n for (const [runId, state] of runStates.entries()) {\n if (now - state.updatedAt > RUN_STATE_TTL) {\n runStates.delete(runId);\n }\n }\n}\n\nexport function createStepRun(state: RunState) {\n cleanupRunStates();\n runStates.set(state.runId, { ...state, updatedAt: Date.now() });\n}\n\nexport function getStepRun(runId: string) {\n cleanupRunStates();\n const state = runStates.get(runId);\n if (!state) return null;\n return state;\n}\n\nexport function updateStepRun(state: RunState) {\n runStates.set(state.runId, { ...state, updatedAt: Date.now() });\n}\n\nexport function clearStepRun(runId: string) {\n runStates.delete(runId);\n}\n","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, isUatGitFlowAborted, clearUatGitFlowState } from '../state';\nimport {\n appendIgnoredPathsFromCheckoutWarning,\n hasBlockingWorkspaceChanges,\n} from '../git-status-utils';\nimport { cleanupTempExecutionRepo, createTempExecutionRepo } from '../temp-repo';\nimport {\n clearStepRun,\n createStepRun,\n getStepRun,\n updateStepRun,\n type ProjectRunState,\n type RunState,\n type StepDescriptor,\n} from '../step-state';\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\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(run: RunState, project: ProjectRunState, result: GitResult) {\n const ignoredPathSet = new Set(project.ignoredUntrackedPaths ?? []);\n const addedPaths = appendIgnoredPathsFromCheckoutWarning(result.stderr, ignoredPathSet);\n if (addedPaths.length > 0) {\n project.ignoredUntrackedPaths = [...ignoredPathSet];\n run.operationLogs.push(`[${project.name}] 提示: 检测到子模块残留目录 ${addedPaths.join(', ')},状态检查将忽略对应未跟踪路径`);\n }\n}\n\nfunction initProjectRunState(projectName: string, projectPath: string, tempRootPath: string): ProjectRunState {\n return {\n name: projectName,\n path: projectPath,\n tempRootPath,\n phase: 'need-current-branch',\n status: 'pending',\n originalBranch: '',\n createdLocalBranch: false,\n hadLocalBranch: true,\n ignoredUntrackedPaths: [],\n baseExists: null,\n remoteCreateExists: null,\n localCreateExists: null,\n mergeExists: null,\n statusClean: null,\n };\n}\n\nfunction buildStep(run: RunState, project: ProjectRunState): StepDescriptor | null {\n if (project.status !== 'pending') return null;\n const { createBranch, baseBranch, mergeBranch } = run;\n\n switch (project.phase) {\n case 'need-current-branch':\n return {\n id: `${project.name}-current-branch-${Date.now()}`,\n projectName: project.name,\n description: '检查当前分支',\n args: ['branch', '--show-current'],\n kind: 'need-current-branch',\n };\n case 'need-fetch':\n return {\n id: `${project.name}-fetch-${Date.now()}`,\n projectName: project.name,\n description: '拉取远端',\n args: ['fetch', 'origin'],\n kind: 'need-fetch',\n };\n case 'need-base-check':\n return {\n id: `${project.name}-base-check-${Date.now()}`,\n projectName: project.name,\n description: `检查 origin/${baseBranch}`,\n args: ['ls-remote', '--heads', 'origin', baseBranch],\n kind: 'need-base-check',\n };\n case 'need-remote-create-check':\n return {\n id: `${project.name}-remote-create-check-${Date.now()}`,\n projectName: project.name,\n description: `检查远端分支 ${createBranch}`,\n args: ['ls-remote', '--heads', 'origin', createBranch],\n kind: 'need-remote-create-check',\n };\n case 'need-local-create-check':\n return {\n id: `${project.name}-local-create-check-${Date.now()}`,\n projectName: project.name,\n description: `检查本地分支 ${createBranch}`,\n args: ['show-ref', '--verify', `refs/heads/${createBranch}`],\n kind: 'need-local-create-check',\n };\n case 'need-checkout-remote-create':\n return {\n id: `${project.name}-checkout-remote-${Date.now()}`,\n projectName: project.name,\n description: `切换到远端分支 ${createBranch}`,\n args: ['checkout', '-B', createBranch, `origin/${createBranch}`],\n kind: 'need-checkout-remote-create',\n };\n case 'need-create-branch':\n return {\n id: `${project.name}-create-branch-${Date.now()}`,\n projectName: project.name,\n description: `创建分支 ${createBranch}`,\n args: ['checkout', '-B', createBranch, `origin/${baseBranch}`],\n kind: 'need-create-branch',\n };\n case 'need-push-branch':\n return {\n id: `${project.name}-push-branch-${Date.now()}`,\n projectName: project.name,\n description: `推送分支 ${createBranch}`,\n args: ['push', '-u', 'origin', createBranch],\n kind: 'need-push-branch',\n };\n case 'need-merge-check':\n return {\n id: `${project.name}-merge-check-${Date.now()}`,\n projectName: project.name,\n description: `检查 origin/${mergeBranch}`,\n args: ['ls-remote', '--heads', 'origin', mergeBranch],\n kind: 'need-merge-check',\n };\n case 'need-status':\n return {\n id: `${project.name}-status-${Date.now()}`,\n projectName: project.name,\n description: '检查工作区',\n args: ['status', '--porcelain', '--untracked-files=all'],\n kind: 'need-status',\n };\n case 'need-checkout-create':\n return {\n id: `${project.name}-checkout-create-${Date.now()}`,\n projectName: project.name,\n description: `切换到分支 ${createBranch}`,\n args: ['checkout', createBranch],\n kind: 'need-checkout-create',\n };\n case 'need-fetch-after-checkout':\n return {\n id: `${project.name}-fetch-after-checkout-${Date.now()}`,\n projectName: project.name,\n description: '拉取远端',\n args: ['fetch', 'origin'],\n kind: 'need-fetch-after-checkout',\n };\n case 'need-merge':\n return {\n id: `${project.name}-merge-${Date.now()}`,\n projectName: project.name,\n description: `合并 origin/${mergeBranch}`,\n args: ['merge', '--no-ff', '--no-edit', `origin/${mergeBranch}`],\n kind: 'need-merge',\n };\n case 'need-merge-abort':\n return {\n id: `${project.name}-merge-abort-${Date.now()}`,\n projectName: project.name,\n description: '终止合并',\n args: ['merge', '--abort'],\n kind: 'need-merge-abort',\n };\n case 'need-push-merge':\n return {\n id: `${project.name}-push-merge-${Date.now()}`,\n projectName: project.name,\n description: `推送合并结果 ${createBranch}`,\n args: ['push', 'origin', createBranch],\n kind: 'need-push-merge',\n };\n case 'need-main-fetch':\n return {\n id: `${project.name}-main-fetch-${Date.now()}`,\n projectName: project.name,\n description: '拉取远端',\n args: ['fetch', 'origin'],\n kind: 'need-main-fetch',\n };\n case 'need-main-check':\n return {\n id: `${project.name}-main-check-${Date.now()}`,\n projectName: project.name,\n description: '检查 origin/main',\n args: ['ls-remote', '--heads', 'origin', 'main'],\n kind: 'need-main-check',\n };\n case 'need-status-main':\n return {\n id: `${project.name}-status-main-${Date.now()}`,\n projectName: project.name,\n description: '检查工作区',\n args: ['status', '--porcelain', '--untracked-files=all'],\n kind: 'need-status-main',\n };\n case 'need-checkout-main':\n return {\n id: `${project.name}-checkout-main-${Date.now()}`,\n projectName: project.name,\n description: '切换到 main',\n args: ['checkout', 'main'],\n kind: 'need-checkout-main',\n };\n case 'need-merge-into-main':\n return {\n id: `${project.name}-merge-into-main-${Date.now()}`,\n projectName: project.name,\n description: `合并 origin/${createBranch} 到 main`,\n args: ['merge', '--no-ff', '--no-edit', `origin/${createBranch}`],\n kind: 'need-merge-into-main',\n };\n case 'need-merge-into-main-abort':\n return {\n id: `${project.name}-merge-into-main-abort-${Date.now()}`,\n projectName: project.name,\n description: '终止合并到 main',\n args: ['merge', '--abort'],\n kind: 'need-merge-into-main-abort',\n };\n case 'need-push-main':\n return {\n id: `${project.name}-push-main-${Date.now()}`,\n projectName: project.name,\n description: '推送 main',\n args: ['push', 'origin', 'main'],\n kind: 'need-push-main',\n };\n default:\n return null;\n }\n}\n\nfunction advanceToNextStep(run: RunState) {\n for (let i = run.currentIndex; i < run.projects.length; i += 1) {\n const project = run.projects[i];\n if (project.status !== 'pending') {\n run.currentIndex = i + 1;\n continue;\n }\n const step = buildStep(run, project);\n if (step) {\n run.currentIndex = i;\n run.currentStep = step;\n return step;\n }\n run.currentIndex = i + 1;\n }\n run.currentStep = null;\n return null;\n}\n\nasync function rollbackRun(run: RunState) {\n const { createBranch } = run;\n for (const project of [...run.projects].reverse()) {\n if (!project.originalBranch) continue;\n run.operationLogs.push(`[${project.name}] 回滚: ${formatCommand(['checkout', project.originalBranch])}`);\n const rollbackCheckout = await runGitCommand(project.path, ['checkout', project.originalBranch]);\n logCommandResult(run.operationLogs, project.name, `回滚切换分支 ${project.originalBranch}`, rollbackCheckout);\n\n if (project.createdLocalBranch && !project.hadLocalBranch) {\n run.operationLogs.push(`[${project.name}] 回滚: ${formatCommand(['branch', '-D', createBranch])}`);\n const rollbackDelete = await runGitCommand(project.path, ['branch', '-D', createBranch]);\n logCommandResult(run.operationLogs, project.name, `回滚删除本地分支 ${createBranch}`, rollbackDelete);\n }\n }\n}\n\nasync function executeStep(run: RunState, step: StepDescriptor) {\n const project = run.projects.find(item => item.name === step.projectName);\n if (!project) {\n run.feedbacks.push(`[${step.projectName}] 项目不存在,跳过。`);\n return;\n }\n\n run.operationLogs.push(`[${project.name}] ${formatCommand(step.args)}`);\n const result = await runGitCommand(project.path, step.args);\n logCommandResult(run.operationLogs, project.name, step.description, result);\n\n if (\n step.kind === 'need-checkout-remote-create'\n || step.kind === 'need-create-branch'\n || step.kind === 'need-checkout-create'\n || step.kind === 'need-checkout-main'\n ) {\n trackCheckoutWarnings(run, project, result);\n }\n\n switch (step.kind) {\n case 'need-current-branch': {\n project.originalBranch = sanitizeLogValue(result.stdout) || 'HEAD';\n if (result.code === 0) {\n project.phase = 'need-fetch';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 获取当前分支失败。`);\n }\n break;\n }\n case 'need-fetch': {\n if (result.code === 0) {\n project.phase = 'need-base-check';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 拉取远端失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-base-check': {\n project.baseExists = Boolean(result.stdout.trim());\n if (!project.baseExists) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] origin/${run.baseBranch} 不存在,无法创建分支。`);\n } else {\n project.phase = 'need-remote-create-check';\n }\n break;\n }\n case 'need-remote-create-check': {\n project.remoteCreateExists = Boolean(result.stdout.trim());\n project.phase = 'need-local-create-check';\n break;\n }\n case 'need-local-create-check': {\n project.localCreateExists = result.code === 0;\n if (project.localCreateExists) {\n project.phase = 'need-checkout-create';\n } else if (project.remoteCreateExists) {\n project.hadLocalBranch = false;\n project.phase = 'need-checkout-remote-create';\n } else {\n project.hadLocalBranch = false;\n project.phase = 'need-create-branch';\n }\n break;\n }\n case 'need-checkout-remote-create': {\n if (result.code === 0) {\n project.phase = 'need-merge-check';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 切换到远端分支失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-create-branch': {\n if (result.code === 0) {\n project.createdLocalBranch = true;\n project.phase = 'need-push-branch';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 创建分支失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-push-branch': {\n if (result.code === 0) {\n project.phase = 'need-merge-check';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 推送新分支失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-merge-check': {\n project.mergeExists = Boolean(result.stdout.trim());\n if (!project.mergeExists) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] origin/${run.mergeBranch} 不存在,无法合并。`);\n } else {\n project.phase = 'need-status';\n }\n break;\n }\n case 'need-status': {\n project.statusClean = !hasBlockingWorkspaceChanges(result.stdout, project.ignoredUntrackedPaths);\n if (!project.statusClean) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 工作区有未提交改动,请先处理后再执行合并。`);\n } else {\n project.phase = 'need-checkout-create';\n }\n break;\n }\n case 'need-checkout-create': {\n if (result.code === 0) {\n project.phase = 'need-fetch-after-checkout';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 切换到分支失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-fetch-after-checkout': {\n if (result.code === 0) {\n project.phase = 'need-merge';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 拉取远端失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-merge': {\n if (result.code === 0) {\n project.phase = 'need-push-merge';\n } else {\n project.phase = 'need-merge-abort';\n run.feedbacks.push(`[${project.name}] 合并冲突,准备终止合并。`);\n }\n break;\n }\n case 'need-merge-abort': {\n if (result.code !== 0) {\n run.feedbacks.push(`[${project.name}] 终止合并失败: ${result.stderr || result.stdout}`);\n }\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 合并冲突,已终止合并,请手动处理。`);\n break;\n }\n case 'need-push-merge': {\n if (result.code === 0) {\n project.phase = 'need-main-fetch';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 推送合并结果失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-main-fetch': {\n if (result.code === 0) {\n project.phase = 'need-main-check';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 拉取远端失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-main-check': {\n const mainExists = Boolean(result.stdout.trim());\n if (!mainExists) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] origin/main 不存在,无法合并。`);\n } else {\n project.phase = 'need-status-main';\n }\n break;\n }\n case 'need-status-main': {\n const statusClean = !hasBlockingWorkspaceChanges(result.stdout, project.ignoredUntrackedPaths);\n if (!statusClean) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 工作区有未提交改动,请先处理后再合并 main。`);\n } else {\n project.phase = 'need-checkout-main';\n }\n break;\n }\n case 'need-checkout-main': {\n if (result.code === 0) {\n project.phase = 'need-merge-into-main';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 切换到 main 失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-merge-into-main': {\n if (result.code === 0) {\n project.phase = 'need-push-main';\n } else {\n project.phase = 'need-merge-into-main-abort';\n run.feedbacks.push(`[${project.name}] 合并到 main 冲突,准备终止合并。`);\n }\n break;\n }\n case 'need-merge-into-main-abort': {\n if (result.code !== 0) {\n run.feedbacks.push(`[${project.name}] 终止合并到 main 失败: ${result.stderr || result.stdout}`);\n }\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 合并到 main 冲突,已终止合并,请手动处理。`);\n break;\n }\n case 'need-push-main': {\n if (result.code === 0) {\n project.status = 'done';\n project.phase = 'done';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 推送 main 失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n default:\n break;\n }\n}\n\nasync function cleanupRunTempRepos(run: RunState) {\n const tempRootPaths = new Set(run.projects.map(project => project.tempRootPath).filter(Boolean));\n for (const tempRootPath of tempRootPaths) {\n try {\n await cleanupTempExecutionRepo(tempRootPath);\n } catch (error) {\n console.error(`清理临时目录失败: ${tempRootPath}`, error);\n }\n }\n}\n\nexport async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n const action = typeof body.action === 'string' ? body.action : '';\n\n if (action === 'start') {\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 runId = typeof body.runId === 'string' ? body.runId : '';\n\n const operationLogs: string[] = [];\n const feedbacks: string[] = [];\n const createdTempRootPaths = new Set<string>();\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 const projectsConfig = await getProjectsConfig();\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n const runProjects: ProjectRunState[] = [];\n\n try {\n for (const rawProjectName of projects) {\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 continue;\n }\n\n if (!projectsConfig[projectName]) {\n operationLogs.push(`[${projectName}] 失败: 未在项目配置中找到`);\n feedbacks.push(`[${projectName}] 未在项目配置中找到,已跳过。`);\n continue;\n }\n\n const projectPath = join(workspacePath, projectName);\n if (!existsSync(projectPath)) {\n operationLogs.push(`[${projectName}] 失败: 项目目录不存在`);\n feedbacks.push(`[${projectName}] 项目目录不存在,已跳过。`);\n continue;\n }\n\n if (!existsSync(join(projectPath, '.git'))) {\n operationLogs.push(`[${projectName}] 失败: 非 Git 仓库`);\n feedbacks.push(`[${projectName}] 不是有效的 Git 仓库,已跳过。`);\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 continue;\n }\n\n createdTempRootPaths.add(tempRepoResult.value.tempRootPath);\n operationLogs.push(`[${projectName}] 使用临时目录执行: ${tempRepoResult.value.projectPath}`);\n runProjects.push(initProjectRunState(\n projectName,\n tempRepoResult.value.projectPath,\n tempRepoResult.value.tempRootPath,\n ));\n }\n } catch (error) {\n for (const tempRootPath of createdTempRootPaths) {\n try {\n await cleanupTempExecutionRepo(tempRootPath);\n } catch (cleanupError) {\n console.error(`清理临时目录失败: ${tempRootPath}`, cleanupError);\n }\n }\n clearUatGitFlowState(runId);\n throw error;\n }\n\n const runState: RunState = {\n runId,\n createBranch,\n baseBranch,\n mergeBranch,\n projects: runProjects,\n currentIndex: 0,\n operationLogs,\n feedbacks,\n currentStep: null,\n updatedAt: Date.now(),\n };\n\n const nextStep = advanceToNextStep(runState);\n if (nextStep) {\n createStepRun(runState);\n } else {\n await cleanupRunTempRepos(runState);\n clearUatGitFlowState(runId);\n }\n\n return NextResponse.json({\n success: true,\n runId,\n nextStep: nextStep ? {\n stepId: nextStep.id,\n projectName: nextStep.projectName,\n description: nextStep.description,\n command: formatCommand(nextStep.args),\n } : null,\n operationLogs: runState.operationLogs,\n feedbacks: runState.feedbacks,\n isComplete: nextStep === null,\n });\n }\n\n if (action === 'execute') {\n const runId = typeof body.runId === 'string' ? body.runId : '';\n const stepId = typeof body.stepId === 'string' ? body.stepId : '';\n\n const runState = getStepRun(runId);\n if (!runState) {\n return NextResponse.json({\n success: false,\n operationLogs: [],\n feedbacks: ['未找到执行上下文,请重新开始。'],\n }, { status: 404 });\n }\n\n if (isUatGitFlowAborted(runId)) {\n runState.operationLogs.push('已收到中断请求,开始回滚已执行的本地操作。');\n await rollbackRun(runState);\n await cleanupRunTempRepos(runState);\n clearStepRun(runId);\n clearUatGitFlowState(runId);\n return NextResponse.json({\n success: true,\n runId,\n nextStep: null,\n operationLogs: runState.operationLogs,\n feedbacks: runState.feedbacks,\n isComplete: true,\n aborted: true,\n });\n }\n\n if (!runState.currentStep || runState.currentStep.id !== stepId) {\n return NextResponse.json({\n success: false,\n operationLogs: runState.operationLogs,\n feedbacks: ['步骤已更新,请重新确认。'],\n }, { status: 409 });\n }\n\n await executeStep(runState, runState.currentStep);\n\n const nextStep = advanceToNextStep(runState);\n updateStepRun(runState);\n\n if (!nextStep) {\n await cleanupRunTempRepos(runState);\n clearStepRun(runId);\n clearUatGitFlowState(runId);\n }\n\n return NextResponse.json({\n success: true,\n runId,\n nextStep: nextStep ? {\n stepId: nextStep.id,\n projectName: nextStep.projectName,\n description: nextStep.description,\n command: formatCommand(nextStep.args),\n } : null,\n operationLogs: runState.operationLogs,\n feedbacks: runState.feedbacks,\n isComplete: nextStep === null,\n });\n }\n\n if (action === 'abort') {\n const runId = typeof body.runId === 'string' ? body.runId : '';\n const runState = getStepRun(runId);\n if (!runState) {\n return NextResponse.json({\n success: false,\n operationLogs: [],\n feedbacks: ['未找到执行上下文,请重新开始。'],\n }, { status: 404 });\n }\n\n runState.operationLogs.push('已收到中断请求,开始回滚已执行的本地操作。');\n await rollbackRun(runState);\n await cleanupRunTempRepos(runState);\n clearStepRun(runId);\n clearUatGitFlowState(runId);\n\n return NextResponse.json({\n success: true,\n runId,\n nextStep: null,\n operationLogs: runState.operationLogs,\n feedbacks: runState.feedbacks,\n isComplete: true,\n aborted: true,\n });\n }\n\n return NextResponse.json({\n success: false,\n operationLogs: [],\n feedbacks: ['未知操作类型。'],\n }, { status: 400 });\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 }\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":[2]}
1
+ {"version":3,"sources":["turbopack:///[project]/packages/server/src/app/api/uat-git-flow/step-state.ts","turbopack:///[project]/packages/server/src/app/api/uat-git-flow/step/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":["type ProjectPhase =\n | 'need-current-branch'\n | 'need-fetch'\n | 'need-base-check'\n | 'need-remote-create-check'\n | 'need-local-create-check'\n | 'need-checkout-remote-create'\n | 'need-create-branch'\n | 'need-push-branch'\n | 'need-merge-check'\n | 'need-status'\n | 'need-checkout-create'\n | 'need-fetch-after-checkout'\n | 'need-merge'\n | 'need-merge-abort'\n | 'need-push-merge'\n | 'need-checkout-main'\n | 'need-merge-into-main'\n | 'need-merge-into-main-abort'\n | 'need-main-check'\n | 'need-status-main'\n | 'need-main-fetch'\n | 'need-push-main'\n | 'need-fix-main-fetch'\n | 'need-fix-main-check'\n | 'need-status-fix-main'\n | 'need-checkout-fix-main'\n | 'need-merge-into-fix-main'\n | 'need-merge-into-fix-main-abort'\n | 'need-push-fix-main'\n | 'done'\n | 'failed';\n\nexport type StepDescriptor = {\n id: string;\n projectName: string;\n description: string;\n args: string[];\n kind: ProjectPhase;\n};\n\nexport type ProjectRunState = {\n name: string;\n path: string;\n tempRootPath: string;\n phase: ProjectPhase;\n status: 'pending' | 'done' | 'failed';\n originalBranch: string;\n createdLocalBranch: boolean;\n hadLocalBranch: boolean;\n ignoredUntrackedPaths: string[];\n baseExists: boolean | null;\n remoteCreateExists: boolean | null;\n localCreateExists: boolean | null;\n mergeExists: boolean | null;\n statusClean: boolean | null;\n};\n\nexport type RunState = {\n runId: string;\n createBranch: string;\n baseBranch: string;\n mergeBranch: string;\n projects: ProjectRunState[];\n currentIndex: number;\n operationLogs: string[];\n feedbacks: string[];\n currentStep: StepDescriptor | null;\n updatedAt: number;\n};\n\nconst runStates = new Map<string, RunState>();\nconst RUN_STATE_TTL = 1000 * 60 * 60;\n\nfunction cleanupRunStates() {\n const now = Date.now();\n for (const [runId, state] of runStates.entries()) {\n if (now - state.updatedAt > RUN_STATE_TTL) {\n runStates.delete(runId);\n }\n }\n}\n\nexport function createStepRun(state: RunState) {\n cleanupRunStates();\n runStates.set(state.runId, { ...state, updatedAt: Date.now() });\n}\n\nexport function getStepRun(runId: string) {\n cleanupRunStates();\n const state = runStates.get(runId);\n if (!state) return null;\n return state;\n}\n\nexport function updateStepRun(state: RunState) {\n runStates.set(state.runId, { ...state, updatedAt: Date.now() });\n}\n\nexport function clearStepRun(runId: string) {\n runStates.delete(runId);\n}\n","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, isUatGitFlowAborted, clearUatGitFlowState } from '../state';\nimport {\n appendIgnoredPathsFromCheckoutWarning,\n hasBlockingWorkspaceChanges,\n} from '../git-status-utils';\nimport { cleanupTempExecutionRepo, createTempExecutionRepo } from '../temp-repo';\nimport {\n clearStepRun,\n createStepRun,\n getStepRun,\n updateStepRun,\n type ProjectRunState,\n type RunState,\n type StepDescriptor,\n} from '../step-state';\n\ntype GitResult = {\n code: number | null;\n stdout: string;\n stderr: string;\n};\n\nconst invalidBranchChars = /\\\\s/;\nconst FIXED_BASE_BRANCH = 'main';\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\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(run: RunState, project: ProjectRunState, result: GitResult) {\n const ignoredPathSet = new Set(project.ignoredUntrackedPaths ?? []);\n const addedPaths = appendIgnoredPathsFromCheckoutWarning(result.stderr, ignoredPathSet);\n if (addedPaths.length > 0) {\n project.ignoredUntrackedPaths = [...ignoredPathSet];\n run.operationLogs.push(`[${project.name}] 提示: 检测到子模块残留目录 ${addedPaths.join(', ')},状态检查将忽略对应未跟踪路径`);\n }\n}\n\nfunction initProjectRunState(projectName: string, projectPath: string, tempRootPath: string): ProjectRunState {\n return {\n name: projectName,\n path: projectPath,\n tempRootPath,\n phase: 'need-current-branch',\n status: 'pending',\n originalBranch: '',\n createdLocalBranch: false,\n hadLocalBranch: true,\n ignoredUntrackedPaths: [],\n baseExists: null,\n remoteCreateExists: null,\n localCreateExists: null,\n mergeExists: null,\n statusClean: null,\n };\n}\n\nfunction buildStep(run: RunState, project: ProjectRunState): StepDescriptor | null {\n if (project.status !== 'pending') return null;\n const { createBranch, baseBranch, mergeBranch } = run;\n\n switch (project.phase) {\n case 'need-current-branch':\n return {\n id: `${project.name}-current-branch-${Date.now()}`,\n projectName: project.name,\n description: '检查当前分支',\n args: ['branch', '--show-current'],\n kind: 'need-current-branch',\n };\n case 'need-fetch':\n return {\n id: `${project.name}-fetch-${Date.now()}`,\n projectName: project.name,\n description: '拉取远端',\n args: ['fetch', 'origin'],\n kind: 'need-fetch',\n };\n case 'need-base-check':\n return {\n id: `${project.name}-base-check-${Date.now()}`,\n projectName: project.name,\n description: `检查 origin/${baseBranch}`,\n args: ['ls-remote', '--heads', 'origin', baseBranch],\n kind: 'need-base-check',\n };\n case 'need-remote-create-check':\n return {\n id: `${project.name}-remote-create-check-${Date.now()}`,\n projectName: project.name,\n description: `检查远端分支 ${createBranch}`,\n args: ['ls-remote', '--heads', 'origin', createBranch],\n kind: 'need-remote-create-check',\n };\n case 'need-local-create-check':\n return {\n id: `${project.name}-local-create-check-${Date.now()}`,\n projectName: project.name,\n description: `检查本地分支 ${createBranch}`,\n args: ['show-ref', '--verify', `refs/heads/${createBranch}`],\n kind: 'need-local-create-check',\n };\n case 'need-checkout-remote-create':\n return {\n id: `${project.name}-checkout-remote-${Date.now()}`,\n projectName: project.name,\n description: `切换到远端分支 ${createBranch}`,\n args: ['checkout', '-B', createBranch, `origin/${createBranch}`],\n kind: 'need-checkout-remote-create',\n };\n case 'need-create-branch':\n return {\n id: `${project.name}-create-branch-${Date.now()}`,\n projectName: project.name,\n description: `创建分支 ${createBranch}`,\n args: ['checkout', '-B', createBranch, `origin/${baseBranch}`],\n kind: 'need-create-branch',\n };\n case 'need-push-branch':\n return {\n id: `${project.name}-push-branch-${Date.now()}`,\n projectName: project.name,\n description: `推送分支 ${createBranch}`,\n args: ['push', '-u', 'origin', createBranch],\n kind: 'need-push-branch',\n };\n case 'need-merge-check':\n return {\n id: `${project.name}-merge-check-${Date.now()}`,\n projectName: project.name,\n description: `检查 origin/${mergeBranch}`,\n args: ['ls-remote', '--heads', 'origin', mergeBranch],\n kind: 'need-merge-check',\n };\n case 'need-status':\n return {\n id: `${project.name}-status-${Date.now()}`,\n projectName: project.name,\n description: '检查工作区',\n args: ['status', '--porcelain', '--untracked-files=all'],\n kind: 'need-status',\n };\n case 'need-checkout-create':\n return {\n id: `${project.name}-checkout-create-${Date.now()}`,\n projectName: project.name,\n description: `切换到分支 ${createBranch}`,\n args: ['checkout', createBranch],\n kind: 'need-checkout-create',\n };\n case 'need-fetch-after-checkout':\n return {\n id: `${project.name}-fetch-after-checkout-${Date.now()}`,\n projectName: project.name,\n description: '拉取远端',\n args: ['fetch', 'origin'],\n kind: 'need-fetch-after-checkout',\n };\n case 'need-merge':\n return {\n id: `${project.name}-merge-${Date.now()}`,\n projectName: project.name,\n description: `合并 origin/${mergeBranch}`,\n args: ['merge', '--no-ff', '--no-edit', `origin/${mergeBranch}`],\n kind: 'need-merge',\n };\n case 'need-merge-abort':\n return {\n id: `${project.name}-merge-abort-${Date.now()}`,\n projectName: project.name,\n description: '终止合并',\n args: ['merge', '--abort'],\n kind: 'need-merge-abort',\n };\n case 'need-push-merge':\n return {\n id: `${project.name}-push-merge-${Date.now()}`,\n projectName: project.name,\n description: `推送合并结果 ${createBranch}`,\n args: ['push', 'origin', createBranch],\n kind: 'need-push-merge',\n };\n case 'need-main-fetch':\n return {\n id: `${project.name}-main-fetch-${Date.now()}`,\n projectName: project.name,\n description: '拉取远端',\n args: ['fetch', 'origin'],\n kind: 'need-main-fetch',\n };\n case 'need-main-check':\n return {\n id: `${project.name}-main-check-${Date.now()}`,\n projectName: project.name,\n description: '检查 origin/main',\n args: ['ls-remote', '--heads', 'origin', 'main'],\n kind: 'need-main-check',\n };\n case 'need-status-main':\n return {\n id: `${project.name}-status-main-${Date.now()}`,\n projectName: project.name,\n description: '检查工作区',\n args: ['status', '--porcelain', '--untracked-files=all'],\n kind: 'need-status-main',\n };\n case 'need-checkout-main':\n return {\n id: `${project.name}-checkout-main-${Date.now()}`,\n projectName: project.name,\n description: '切换到 main',\n args: ['checkout', 'main'],\n kind: 'need-checkout-main',\n };\n case 'need-merge-into-main':\n return {\n id: `${project.name}-merge-into-main-${Date.now()}`,\n projectName: project.name,\n description: `合并 origin/${createBranch} 到 main`,\n args: ['merge', '--no-ff', '--no-edit', `origin/${createBranch}`],\n kind: 'need-merge-into-main',\n };\n case 'need-merge-into-main-abort':\n return {\n id: `${project.name}-merge-into-main-abort-${Date.now()}`,\n projectName: project.name,\n description: '终止合并到 main',\n args: ['merge', '--abort'],\n kind: 'need-merge-into-main-abort',\n };\n case 'need-push-main':\n return {\n id: `${project.name}-push-main-${Date.now()}`,\n projectName: project.name,\n description: '推送 main',\n args: ['push', 'origin', 'main'],\n kind: 'need-push-main',\n };\n case 'need-fix-main-fetch':\n return {\n id: `${project.name}-fix-main-fetch-${Date.now()}`,\n projectName: project.name,\n description: '拉取远端',\n args: ['fetch', 'origin'],\n kind: 'need-fix-main-fetch',\n };\n case 'need-fix-main-check':\n return {\n id: `${project.name}-fix-main-check-${Date.now()}`,\n projectName: project.name,\n description: '检查 origin/fix/main',\n args: ['ls-remote', '--heads', 'origin', 'fix/main'],\n kind: 'need-fix-main-check',\n };\n case 'need-status-fix-main':\n return {\n id: `${project.name}-status-fix-main-${Date.now()}`,\n projectName: project.name,\n description: '检查工作区',\n args: ['status', '--porcelain', '--untracked-files=all'],\n kind: 'need-status-fix-main',\n };\n case 'need-checkout-fix-main':\n return {\n id: `${project.name}-checkout-fix-main-${Date.now()}`,\n projectName: project.name,\n description: '切换到 fix/main',\n args: ['checkout', 'fix/main'],\n kind: 'need-checkout-fix-main',\n };\n case 'need-merge-into-fix-main':\n return {\n id: `${project.name}-merge-into-fix-main-${Date.now()}`,\n projectName: project.name,\n description: `合并 origin/${createBranch} 到 fix/main`,\n args: ['merge', '--no-ff', '--no-edit', `origin/${createBranch}`],\n kind: 'need-merge-into-fix-main',\n };\n case 'need-merge-into-fix-main-abort':\n return {\n id: `${project.name}-merge-into-fix-main-abort-${Date.now()}`,\n projectName: project.name,\n description: '终止合并到 fix/main',\n args: ['merge', '--abort'],\n kind: 'need-merge-into-fix-main-abort',\n };\n case 'need-push-fix-main':\n return {\n id: `${project.name}-push-fix-main-${Date.now()}`,\n projectName: project.name,\n description: '推送 fix/main',\n args: ['push', 'origin', 'fix/main'],\n kind: 'need-push-fix-main',\n };\n default:\n return null;\n }\n}\n\nfunction advanceToNextStep(run: RunState) {\n for (let i = run.currentIndex; i < run.projects.length; i += 1) {\n const project = run.projects[i];\n if (project.status !== 'pending') {\n run.currentIndex = i + 1;\n continue;\n }\n const step = buildStep(run, project);\n if (step) {\n run.currentIndex = i;\n run.currentStep = step;\n return step;\n }\n run.currentIndex = i + 1;\n }\n run.currentStep = null;\n return null;\n}\n\nasync function rollbackRun(run: RunState) {\n const { createBranch } = run;\n for (const project of [...run.projects].reverse()) {\n if (!project.originalBranch) continue;\n run.operationLogs.push(`[${project.name}] 回滚: ${formatCommand(['checkout', project.originalBranch])}`);\n const rollbackCheckout = await runGitCommand(project.path, ['checkout', project.originalBranch]);\n logCommandResult(run.operationLogs, project.name, `回滚切换分支 ${project.originalBranch}`, rollbackCheckout);\n\n if (project.createdLocalBranch && !project.hadLocalBranch) {\n run.operationLogs.push(`[${project.name}] 回滚: ${formatCommand(['branch', '-D', createBranch])}`);\n const rollbackDelete = await runGitCommand(project.path, ['branch', '-D', createBranch]);\n logCommandResult(run.operationLogs, project.name, `回滚删除本地分支 ${createBranch}`, rollbackDelete);\n }\n }\n}\n\nasync function executeStep(run: RunState, step: StepDescriptor) {\n const project = run.projects.find(item => item.name === step.projectName);\n if (!project) {\n run.feedbacks.push(`[${step.projectName}] 项目不存在,跳过。`);\n return;\n }\n\n run.operationLogs.push(`[${project.name}] ${formatCommand(step.args)}`);\n const result = await runGitCommand(project.path, step.args);\n logCommandResult(run.operationLogs, project.name, step.description, result);\n\n if (\n step.kind === 'need-checkout-remote-create'\n || step.kind === 'need-create-branch'\n || step.kind === 'need-checkout-create'\n || step.kind === 'need-checkout-main'\n || step.kind === 'need-checkout-fix-main'\n ) {\n trackCheckoutWarnings(run, project, result);\n }\n\n switch (step.kind) {\n case 'need-current-branch': {\n project.originalBranch = sanitizeLogValue(result.stdout) || 'HEAD';\n if (result.code === 0) {\n project.phase = 'need-fetch';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 获取当前分支失败。`);\n }\n break;\n }\n case 'need-fetch': {\n if (result.code === 0) {\n project.phase = 'need-base-check';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 拉取远端失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-base-check': {\n project.baseExists = Boolean(result.stdout.trim());\n if (!project.baseExists) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] origin/${run.baseBranch} 不存在,无法创建分支。`);\n } else {\n project.phase = 'need-remote-create-check';\n }\n break;\n }\n case 'need-remote-create-check': {\n project.remoteCreateExists = Boolean(result.stdout.trim());\n project.phase = 'need-local-create-check';\n break;\n }\n case 'need-local-create-check': {\n project.localCreateExists = result.code === 0;\n if (project.localCreateExists) {\n project.phase = 'need-checkout-create';\n } else if (project.remoteCreateExists) {\n project.hadLocalBranch = false;\n project.phase = 'need-checkout-remote-create';\n } else {\n project.hadLocalBranch = false;\n project.phase = 'need-create-branch';\n }\n break;\n }\n case 'need-checkout-remote-create': {\n if (result.code === 0) {\n project.phase = 'need-merge-check';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 切换到远端分支失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-create-branch': {\n if (result.code === 0) {\n project.createdLocalBranch = true;\n project.phase = 'need-push-branch';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 创建分支失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-push-branch': {\n if (result.code === 0) {\n project.phase = 'need-merge-check';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 推送新分支失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-merge-check': {\n project.mergeExists = Boolean(result.stdout.trim());\n if (!project.mergeExists) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] origin/${run.mergeBranch} 不存在,无法合并。`);\n } else {\n project.phase = 'need-status';\n }\n break;\n }\n case 'need-status': {\n project.statusClean = !hasBlockingWorkspaceChanges(result.stdout, project.ignoredUntrackedPaths);\n if (!project.statusClean) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 工作区有未提交改动,请先处理后再执行合并。`);\n } else {\n project.phase = 'need-checkout-create';\n }\n break;\n }\n case 'need-checkout-create': {\n if (result.code === 0) {\n project.phase = 'need-fetch-after-checkout';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 切换到分支失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-fetch-after-checkout': {\n if (result.code === 0) {\n project.phase = 'need-merge';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 拉取远端失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-merge': {\n if (result.code === 0) {\n project.phase = 'need-push-merge';\n } else {\n project.phase = 'need-merge-abort';\n run.feedbacks.push(`[${project.name}] 合并冲突,准备终止合并。`);\n }\n break;\n }\n case 'need-merge-abort': {\n if (result.code !== 0) {\n run.feedbacks.push(`[${project.name}] 终止合并失败: ${result.stderr || result.stdout}`);\n }\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 合并冲突,已终止合并,请手动处理。`);\n break;\n }\n case 'need-push-merge': {\n if (result.code === 0) {\n project.phase = 'need-main-fetch';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 推送合并结果失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-main-fetch': {\n if (result.code === 0) {\n project.phase = 'need-main-check';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 拉取远端失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-main-check': {\n const mainExists = Boolean(result.stdout.trim());\n if (!mainExists) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] origin/main 不存在,无法合并。`);\n } else {\n project.phase = 'need-status-main';\n }\n break;\n }\n case 'need-status-main': {\n const statusClean = !hasBlockingWorkspaceChanges(result.stdout, project.ignoredUntrackedPaths);\n if (!statusClean) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 工作区有未提交改动,请先处理后再合并 main。`);\n } else {\n project.phase = 'need-checkout-main';\n }\n break;\n }\n case 'need-checkout-main': {\n if (result.code === 0) {\n project.phase = 'need-merge-into-main';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 切换到 main 失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-merge-into-main': {\n if (result.code === 0) {\n project.phase = 'need-push-main';\n } else {\n project.phase = 'need-merge-into-main-abort';\n run.feedbacks.push(`[${project.name}] 合并到 main 冲突,准备终止合并。`);\n }\n break;\n }\n case 'need-merge-into-main-abort': {\n if (result.code !== 0) {\n run.feedbacks.push(`[${project.name}] 终止合并到 main 失败: ${result.stderr || result.stdout}`);\n }\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 合并到 main 冲突,已终止合并,请手动处理。`);\n break;\n }\n case 'need-push-main': {\n if (result.code === 0) {\n project.phase = 'need-fix-main-fetch';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 推送 main 失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-fix-main-fetch': {\n if (result.code === 0) {\n project.phase = 'need-fix-main-check';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 拉取远端失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-fix-main-check': {\n const fixMainExists = Boolean(result.stdout.trim());\n if (!fixMainExists) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] origin/fix/main 不存在,无法合并。`);\n } else {\n project.phase = 'need-status-fix-main';\n }\n break;\n }\n case 'need-status-fix-main': {\n const statusClean = !hasBlockingWorkspaceChanges(result.stdout, project.ignoredUntrackedPaths);\n if (!statusClean) {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 工作区有未提交改动,请先处理后再合并 fix/main。`);\n } else {\n project.phase = 'need-checkout-fix-main';\n }\n break;\n }\n case 'need-checkout-fix-main': {\n if (result.code === 0) {\n project.phase = 'need-merge-into-fix-main';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 切换到 fix/main 失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n case 'need-merge-into-fix-main': {\n if (result.code === 0) {\n project.phase = 'need-push-fix-main';\n } else {\n project.phase = 'need-merge-into-fix-main-abort';\n run.feedbacks.push(`[${project.name}] 合并到 fix/main 冲突,准备终止合并。`);\n }\n break;\n }\n case 'need-merge-into-fix-main-abort': {\n if (result.code !== 0) {\n run.feedbacks.push(`[${project.name}] 终止合并到 fix/main 失败: ${result.stderr || result.stdout}`);\n }\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 合并到 fix/main 冲突,已终止合并,请手动处理。`);\n break;\n }\n case 'need-push-fix-main': {\n if (result.code === 0) {\n project.status = 'done';\n project.phase = 'done';\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 推送 fix/main 失败: ${result.stderr || result.stdout}`);\n }\n break;\n }\n default:\n break;\n }\n}\n\nasync function cleanupRunTempRepos(run: RunState) {\n const tempRootPaths = new Set(run.projects.map(project => project.tempRootPath).filter(Boolean));\n for (const tempRootPath of tempRootPaths) {\n try {\n await cleanupTempExecutionRepo(tempRootPath);\n } catch (error) {\n console.error(`清理临时目录失败: ${tempRootPath}`, error);\n }\n }\n}\n\nexport async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n const action = typeof body.action === 'string' ? body.action : '';\n\n if (action === 'start') {\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 runId = typeof body.runId === 'string' ? body.runId : '';\n\n const operationLogs: string[] = [];\n const feedbacks: string[] = [];\n const createdTempRootPaths = new Set<string>();\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 const projectsConfig = await getProjectsConfig();\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n const runProjects: ProjectRunState[] = [];\n\n try {\n for (const rawProjectName of projects) {\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 continue;\n }\n\n if (!projectsConfig[projectName]) {\n operationLogs.push(`[${projectName}] 失败: 未在项目配置中找到`);\n feedbacks.push(`[${projectName}] 未在项目配置中找到,已跳过。`);\n continue;\n }\n\n const projectPath = join(workspacePath, projectName);\n if (!existsSync(projectPath)) {\n operationLogs.push(`[${projectName}] 失败: 项目目录不存在`);\n feedbacks.push(`[${projectName}] 项目目录不存在,已跳过。`);\n continue;\n }\n\n if (!existsSync(join(projectPath, '.git'))) {\n operationLogs.push(`[${projectName}] 失败: 非 Git 仓库`);\n feedbacks.push(`[${projectName}] 不是有效的 Git 仓库,已跳过。`);\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 continue;\n }\n\n createdTempRootPaths.add(tempRepoResult.value.tempRootPath);\n operationLogs.push(`[${projectName}] 使用临时目录执行: ${tempRepoResult.value.projectPath}`);\n runProjects.push(initProjectRunState(\n projectName,\n tempRepoResult.value.projectPath,\n tempRepoResult.value.tempRootPath,\n ));\n }\n } catch (error) {\n for (const tempRootPath of createdTempRootPaths) {\n try {\n await cleanupTempExecutionRepo(tempRootPath);\n } catch (cleanupError) {\n console.error(`清理临时目录失败: ${tempRootPath}`, cleanupError);\n }\n }\n clearUatGitFlowState(runId);\n throw error;\n }\n\n const runState: RunState = {\n runId,\n createBranch,\n baseBranch,\n mergeBranch,\n projects: runProjects,\n currentIndex: 0,\n operationLogs,\n feedbacks,\n currentStep: null,\n updatedAt: Date.now(),\n };\n\n const nextStep = advanceToNextStep(runState);\n if (nextStep) {\n createStepRun(runState);\n } else {\n await cleanupRunTempRepos(runState);\n clearUatGitFlowState(runId);\n }\n\n return NextResponse.json({\n success: true,\n runId,\n nextStep: nextStep ? {\n stepId: nextStep.id,\n projectName: nextStep.projectName,\n description: nextStep.description,\n command: formatCommand(nextStep.args),\n } : null,\n operationLogs: runState.operationLogs,\n feedbacks: runState.feedbacks,\n isComplete: nextStep === null,\n });\n }\n\n if (action === 'execute') {\n const runId = typeof body.runId === 'string' ? body.runId : '';\n const stepId = typeof body.stepId === 'string' ? body.stepId : '';\n\n const runState = getStepRun(runId);\n if (!runState) {\n return NextResponse.json({\n success: false,\n operationLogs: [],\n feedbacks: ['未找到执行上下文,请重新开始。'],\n }, { status: 404 });\n }\n\n if (isUatGitFlowAborted(runId)) {\n runState.operationLogs.push('已收到中断请求,开始回滚已执行的本地操作。');\n await rollbackRun(runState);\n await cleanupRunTempRepos(runState);\n clearStepRun(runId);\n clearUatGitFlowState(runId);\n return NextResponse.json({\n success: true,\n runId,\n nextStep: null,\n operationLogs: runState.operationLogs,\n feedbacks: runState.feedbacks,\n isComplete: true,\n aborted: true,\n });\n }\n\n if (!runState.currentStep || runState.currentStep.id !== stepId) {\n return NextResponse.json({\n success: false,\n operationLogs: runState.operationLogs,\n feedbacks: ['步骤已更新,请重新确认。'],\n }, { status: 409 });\n }\n\n await executeStep(runState, runState.currentStep);\n\n const nextStep = advanceToNextStep(runState);\n updateStepRun(runState);\n\n if (!nextStep) {\n await cleanupRunTempRepos(runState);\n clearStepRun(runId);\n clearUatGitFlowState(runId);\n }\n\n return NextResponse.json({\n success: true,\n runId,\n nextStep: nextStep ? {\n stepId: nextStep.id,\n projectName: nextStep.projectName,\n description: nextStep.description,\n command: formatCommand(nextStep.args),\n } : null,\n operationLogs: runState.operationLogs,\n feedbacks: runState.feedbacks,\n isComplete: nextStep === null,\n });\n }\n\n if (action === 'abort') {\n const runId = typeof body.runId === 'string' ? body.runId : '';\n const runState = getStepRun(runId);\n if (!runState) {\n return NextResponse.json({\n success: false,\n operationLogs: [],\n feedbacks: ['未找到执行上下文,请重新开始。'],\n }, { status: 404 });\n }\n\n runState.operationLogs.push('已收到中断请求,开始回滚已执行的本地操作。');\n await rollbackRun(runState);\n await cleanupRunTempRepos(runState);\n clearStepRun(runId);\n clearUatGitFlowState(runId);\n\n return NextResponse.json({\n success: true,\n runId,\n nextStep: null,\n operationLogs: runState.operationLogs,\n feedbacks: runState.feedbacks,\n isComplete: true,\n aborted: true,\n });\n }\n\n return NextResponse.json({\n success: false,\n operationLogs: [],\n feedbacks: ['未知操作类型。'],\n }, { status: 400 });\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 }\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":"kJAuEA,IAAM,EAAY,IAAI,IAGtB,SAAS,IACP,IAAM,EAAM,KAAK,GAAG,GACpB,IAAK,GAAM,CAAC,EAAO,EAAM,GAAI,EAAU,OAAO,GAAI,AAC5C,EAAM,EAAM,SAAS,CALP,EAKU,IAC1B,CANuB,CAMb,IANkB,EAMZ,CAAC,EADwB,AAI/C,CAEO,SAAS,EAAc,CAAe,EAC3C,IACA,EAAU,GAAG,CAAC,EAAM,KAAK,CAAE,CAAE,GAAG,CAAK,CAAE,UAAW,KAAK,GAAG,EAAG,EAC/D,CAEO,SAAS,EAAW,CAAa,EACtC,IACA,IAAM,EAAQ,EAAU,GAAG,CAAC,UAC5B,AAAK,GAAc,CAAf,GAEN,AAFc,CAIP,SAAS,EAAc,CAAe,EAC3C,EAAU,GAAG,CAAC,EAAM,KAAK,CAAE,CAAE,GAAG,CAAK,CAAE,UAAW,KAAK,GAAG,EAAG,EAC/D,CAEO,SAAS,EAAa,CAAa,EACxC,EAAU,MAAM,CAAC,EACnB,oECrGA,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,OACA,EAAA,EAAA,CAAA,CAAA,OAgBA,IAAM,EAAqB,MACrB,EAAoB,OAE1B,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,KAAA,AAAI,EAAE,MAAO,EAAM,KAC/B,EACA,MAAO,CAAC,OAFI,EAEM,OAAQ,OAAO,AACnC,GAEI,EAAS,GACT,EAAS,EAEb,GAAM,MAAM,EAAE,GAAG,OAAS,AAAD,IACvB,GAAU,EAAK,QAAQ,EACzB,GAEA,EAAM,MAAM,EAAE,GAAG,OAAQ,AAAC,IACxB,GAAU,EAAK,QAAQ,EACzB,GAEA,EAAM,EAAE,CAAC,QAAU,AAAD,IAChB,EAAQ,MAAE,EAAM,gBAAQ,CAAO,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,CAMA,SAAS,EAAiB,CAAuB,CAAE,CAAmB,CAAE,CAAY,CAAE,CAAiB,EACjF,GAAG,CAAnB,EAAO,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,CAgRA,SAAS,EAAkB,CAAa,EACtC,IAAK,IAAI,EAAI,EAAI,YAAY,CAAE,EAAI,EAAI,QAAQ,CAAC,MAAM,CAAE,GAAK,EAAG,CAC9D,IAAM,EAAU,EAAI,QAAQ,CAAC,EAAE,CAC/B,GAAuB,YAAnB,EAAQ,MAAM,CAAgB,CAChC,EAAI,YAAY,CAAG,EAAI,EACvB,QACF,CACA,IAAM,EAAO,AAzPjB,SAAS,AAAU,CAAa,CAAE,CAAwB,EACxD,GAAuB,YAAnB,EAAQ,MAAM,CAAgB,OAAO,KACzC,GAAM,cAAE,CAAY,YAAE,CAAU,aAAE,CAAW,CAAE,CAAG,EAElD,OAAQ,EAAQ,KAAK,EACnB,IAAK,sBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,GAAA,CAAI,CAClD,YAAa,EAAQ,IAAI,CACzB,YAAa,SACb,KAAM,CAAC,SAAU,iBAAiB,CAClC,KAAM,qBACR,CACF,KAAK,aACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,GAAA,CAAI,CACzC,YAAa,EAAQ,IAAI,CACzB,YAAa,OACb,KAAM,CAAC,QAAS,SAAS,CACzB,KAAM,YACR,CACF,KAAK,kBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,GAAA,CAAI,CAC9C,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,UAAU,EAAE,EAAA,CAAY,CACtC,KAAM,CAAC,YAAa,UAAW,SAAU,EAAW,CACpD,KAAM,iBACR,CACF,KAAK,2BACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,qBAAqB,EAAE,KAAK,GAAG,GAAA,CAAI,CACvD,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,OAAO,EAAE,EAAA,CAAc,CACrC,KAAM,CAAC,YAAa,UAAW,SAAU,EAAa,CACtD,KAAM,0BACR,CACF,KAAK,0BACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,oBAAoB,EAAE,KAAK,GAAG,GAAA,CAAI,CACtD,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,OAAO,EAAE,EAAA,CAAc,CACrC,KAAM,CAAC,WAAY,WAAY,CAAC,WAAW,EAAE,EAAA,CAAc,CAAC,CAC5D,KAAM,yBACR,CACF,KAAK,8BACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,iBAAiB,EAAE,KAAK,GAAG,GAAA,CAAI,CACnD,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,QAAQ,EAAE,EAAA,CAAc,CACtC,KAAM,CAAC,WAAY,KAAM,EAAc,CAAC,OAAO,EAAE,EAAA,CAAc,CAAC,CAChE,KAAM,6BACR,CACF,KAAK,qBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,GAAA,CAAI,CACjD,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,KAAK,EAAE,EAAA,CAAc,CACnC,KAAM,CAAC,WAAY,KAAM,EAAc,CAAC,OAAO,EAAE,EAAA,CAAY,CAAC,CAC9D,KAAM,oBACR,CACF,KAAK,mBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,GAAA,CAAI,CAC/C,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,KAAK,EAAE,EAAA,CAAc,CACnC,KAAM,CAAC,OAAQ,KAAM,SAAU,EAAa,CAC5C,KAAM,kBACR,CACF,KAAK,mBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,GAAA,CAAI,CAC/C,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,UAAU,EAAE,EAAA,CAAa,CACvC,KAAM,CAAC,YAAa,UAAW,SAAU,EAAY,CACrD,KAAM,kBACR,CACF,KAAK,cACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,GAAA,CAAI,CAC1C,YAAa,EAAQ,IAAI,CACzB,YAAa,QACb,KAAM,CAAC,SAAU,cAAe,wBAAwB,CACxD,KAAM,aACR,CACF,KAAK,uBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,iBAAiB,EAAE,KAAK,GAAG,GAAA,CAAI,CACnD,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,MAAM,EAAE,EAAA,CAAc,CACpC,KAAM,CAAC,WAAY,EAAa,CAChC,KAAM,sBACR,CACF,KAAK,4BACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,sBAAsB,EAAE,KAAK,GAAG,GAAA,CAAI,CACxD,YAAa,EAAQ,IAAI,CACzB,YAAa,OACb,KAAM,CAAC,QAAS,SAAS,CACzB,KAAM,2BACR,CACF,KAAK,aACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,GAAA,CAAI,CACzC,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,UAAU,EAAE,EAAA,CAAa,CACvC,KAAM,CAAC,QAAS,UAAW,YAAa,CAAC,OAAO,EAAE,EAAA,CAAa,CAAC,CAChE,KAAM,YACR,CACF,KAAK,mBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,GAAA,CAAI,CAC/C,YAAa,EAAQ,IAAI,CACzB,YAAa,OACb,KAAM,CAAC,QAAS,UAAU,CAC1B,KAAM,kBACR,CACF,KAAK,kBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,GAAA,CAAI,CAC9C,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,OAAO,EAAE,EAAA,CAAc,CACrC,KAAM,CAAC,OAAQ,SAAU,EAAa,CACtC,KAAM,iBACR,CACF,KAAK,kBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,GAAA,CAAI,CAC9C,YAAa,EAAQ,IAAI,CACzB,YAAa,OACb,KAAM,CAAC,QAAS,SAAS,CACzB,KAAM,iBACR,CACF,KAAK,kBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,GAAA,CAAI,CAC9C,YAAa,EAAQ,IAAI,CACzB,YAAa,iBACb,KAAM,CAAC,YAAa,UAAW,SAAU,OAAO,CAChD,KAAM,iBACR,CACF,KAAK,mBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,GAAA,CAAI,CAC/C,YAAa,EAAQ,IAAI,CACzB,YAAa,QACb,KAAM,CAAC,SAAU,cAAe,wBAAwB,CACxD,KAAM,kBACR,CACF,KAAK,qBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,GAAA,CAAI,CACjD,YAAa,EAAQ,IAAI,CACzB,YAAa,WACb,KAAM,CAAC,WAAY,OAAO,CAC1B,KAAM,oBACR,CACF,KAAK,uBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,iBAAiB,EAAE,KAAK,GAAG,GAAA,CAAI,CACnD,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,UAAU,EAAE,EAAa,OAAO,CAAC,CAC/C,KAAM,CAAC,QAAS,UAAW,YAAa,CAAC,OAAO,EAAE,EAAA,CAAc,CAAC,CACjE,KAAM,sBACR,CACF,KAAK,6BACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,uBAAuB,EAAE,KAAK,GAAG,GAAA,CAAI,CACzD,YAAa,EAAQ,IAAI,CACzB,YAAa,aACb,KAAM,CAAC,QAAS,UAAU,CAC1B,KAAM,4BACR,CACF,KAAK,iBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,GAAA,CAAI,CAC7C,YAAa,EAAQ,IAAI,CACzB,YAAa,UACb,KAAM,CAAC,OAAQ,SAAU,OAAO,CAChC,KAAM,gBACR,CACF,KAAK,sBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,GAAA,CAAI,CAClD,YAAa,EAAQ,IAAI,CACzB,YAAa,OACb,KAAM,CAAC,QAAS,SAAS,CACzB,KAAM,qBACR,CACF,KAAK,sBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,GAAA,CAAI,CAClD,YAAa,EAAQ,IAAI,CACzB,YAAa,qBACb,KAAM,CAAC,YAAa,UAAW,SAAU,WAAW,CACpD,KAAM,qBACR,CACF,KAAK,uBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,iBAAiB,EAAE,KAAK,GAAG,GAAA,CAAI,CACnD,YAAa,EAAQ,IAAI,CACzB,YAAa,QACb,KAAM,CAAC,SAAU,cAAe,wBAAwB,CACxD,KAAM,sBACR,CACF,KAAK,yBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,mBAAmB,EAAE,KAAK,GAAG,GAAA,CAAI,CACrD,YAAa,EAAQ,IAAI,CACzB,YAAa,eACb,KAAM,CAAC,WAAY,WAAW,CAC9B,KAAM,wBACR,CACF,KAAK,2BACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,qBAAqB,EAAE,KAAK,GAAG,GAAA,CAAI,CACvD,YAAa,EAAQ,IAAI,CACzB,YAAa,CAAC,UAAU,EAAE,EAAa,WAAW,CAAC,CACnD,KAAM,CAAC,QAAS,UAAW,YAAa,CAAC,OAAO,EAAE,EAAA,CAAc,CAAC,CACjE,KAAM,0BACR,CACF,KAAK,iCACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,2BAA2B,EAAE,KAAK,GAAG,GAAA,CAAI,CAC7D,YAAa,EAAQ,IAAI,CACzB,YAAa,iBACb,KAAM,CAAC,QAAS,UAAU,CAC1B,KAAM,gCACR,CACF,KAAK,qBACH,MAAO,CACL,GAAI,CAAA,EAAG,EAAQ,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,GAAA,CAAI,CACjD,YAAa,EAAQ,IAAI,CACzB,YAAa,cACb,KAAM,CAAC,OAAQ,SAAU,WAAW,CACpC,KAAM,oBACR,CACF,SACE,OAAO,IACX,CACF,EAS2B,EAAK,GAC5B,GAAI,EAGF,IAHQ,GACR,EAAI,YAAY,CAAG,EACnB,EAAI,WAAW,CAAG,EACX,EAET,EAAI,YAAY,CAAG,EAAI,CACzB,CAEA,OADA,EAAI,WAAW,CAAG,KACX,IACT,CAEA,eAAe,EAAY,CAAa,EACtC,GAAM,cAAE,CAAY,CAAE,CAAG,EACzB,IAAK,IAAM,IAAW,IAAI,EAAI,QAAQ,CAAC,CAAC,OAAO,GAAI,CACjD,GAAI,CAAC,EAAQ,cAAc,CAAE,SAC7B,EAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,MAAM,EAAE,EAAc,CAAC,WAAY,EAAQ,cAAc,CAAC,EAAA,CAAG,EACrG,IAAM,EAAmB,MAAM,EAAc,EAAQ,IAAI,CAAE,CAAC,WAAY,EAAQ,cAAc,CAAC,EAG/F,GAFA,EAAiB,EAAI,aAAa,CAAE,EAAQ,IAAI,CAAE,CAAC,OAAO,EAAE,EAAQ,cAAc,CAAA,CAAE,CAAE,GAElF,EAAQ,kBAAkB,EAAI,CAAC,EAAQ,cAAc,CAAE,CACzD,EAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,MAAM,EAAE,EAAc,CAAC,SAAU,KAAM,EAAa,EAAA,CAAG,EAC/F,IAAM,EAAiB,MAAM,EAAc,EAAQ,IAAI,CAAE,CAAC,SAAU,KAAM,EAAa,EACvF,EAAiB,EAAI,aAAa,CAAE,EAAQ,IAAI,CAAE,CAAC,SAAS,EAAE,EAAA,CAAc,CAAE,EAChF,CACF,CACF,CAEA,eAAe,EAAY,CAAa,CAAE,CAAoB,EAC5D,IAAM,EAAU,EAAI,QAAQ,CAAC,IAAI,CAAC,GAAQ,EAAK,IAAI,GAAK,EAAK,WAAW,EACxE,GAAI,CAAC,EAAS,YACZ,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAK,WAAW,CAAC,WAAW,CAAC,EAItD,EAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,EAAE,EAAE,EAAc,EAAK,IAAI,EAAA,CAAG,EACtE,IAAM,EAAS,MAAM,EAAc,EAAQ,IAAI,CAAE,EAAK,IAAI,EAa1D,OAZA,EAAiB,EAAI,aAAa,CAAE,EAAQ,IAAI,CAAE,EAAK,WAAW,CAAE,IAGpD,gCAAd,EAAK,IAAI,EACQ,uBAAd,EAAK,IAAI,EACK,yBAAd,EAAK,IAAI,EACK,uBAAd,EAAK,IAAI,EACK,2BAAd,EAAK,IAAI,AAAK,GAEjB,AAnUJ,AAkUI,SAlUK,AAAsB,CAAa,CAAE,CAAwB,CAAE,CAAiB,EACvF,IAAM,EAAiB,IAAI,IAAI,EAAQ,qBAAqB,EAAI,EAAE,EAC5D,EAAa,CAAA,EAAA,EAAA,oCAAA,CAAoC,AAApC,EAAsC,EAAO,MAAM,CAAE,GACpE,EAAW,MAAM,CAAG,GAAG,CACzB,EAAQ,qBAAqB,CAAG,IAAI,EAAe,CACnD,EAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,iBAAiB,EAAE,EAAW,IAAI,CAAC,MAAM,eAAe,CAAC,EAErG,EA4T0B,EAAK,EAAS,GAG9B,EAAK,IAAI,EACf,IAAK,sBACH,EAAQ,cAAc,CAAG,AAAiB,AAnVvC,EAmV8C,MAAM,CAnV9C,OAAO,CAAC,OAAQ,KAAK,IAAI,IAmV0B,OACxC,GAAG,CAAnB,EAAO,IAAI,CACb,EAAQ,KAAK,CAAG,cAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,WAAW,CAAC,GAElD,KAEF,KAAK,aACiB,GAAG,CAAnB,EAAO,IAAI,CACb,EAAQ,KAAK,CAAG,mBAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,UAAU,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAElF,KAEF,KAAK,kBACH,EAAQ,UAAU,EAAG,CAAQ,EAAO,MAAM,CAAC,IAAI,GAC1C,EAAQ,UAAU,CAIrB,CAJuB,CAIf,KAAK,CAAG,4BAHhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,SAAS,EAAE,EAAI,UAAU,CAAC,YAAY,CAAC,GAI7E,KAEF,KAAK,2BACH,EAAQ,kBAAkB,EAAG,CAAQ,EAAO,MAAM,CAAC,IAAI,GACvD,EAAQ,KAAK,CAAG,0BAChB,KAEF,KAAK,0BACH,EAAQ,iBAAiB,CAAmB,IAAhB,EAAO,IAAI,CACnC,EAAQ,iBAAiB,CAC3B,CAD6B,CACrB,KAAK,CAAG,uBACP,EAAQ,kBAAkB,EAAE,AACrC,EAAQ,cAAc,EAAG,EACzB,EAAQ,KAAK,CAAG,gCAEhB,EAAQ,cAAc,EAAG,EACzB,EAAQ,KAAK,CAAG,sBAElB,KAEF,KAAK,8BACiB,GAAG,CAAnB,EAAO,IAAI,CACb,EAAQ,KAAK,CAAG,oBAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,aAAa,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAErF,KAEF,KAAK,qBACiB,GAAG,CAAnB,EAAO,IAAI,EACb,EAAQ,kBAAkB,EAAG,EAC7B,EAAQ,KAAK,CAAG,qBAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,UAAU,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAElF,KAEF,KAAK,mBACiB,GAAG,CAAnB,EAAO,IAAI,CACb,EAAQ,KAAK,CAAG,oBAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,WAAW,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAEnF,KAEF,KAAK,mBACH,EAAQ,WAAW,EAAG,CAAQ,EAAO,MAAM,CAAC,IAAI,GAC3C,EAAQ,WAAW,CAItB,CAJwB,CAIhB,KAAK,CAAG,eAHhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,SAAS,EAAE,EAAI,WAAW,CAAC,UAAU,CAAC,GAI5E,KAEF,KAAK,cACH,EAAQ,WAAW,CAAG,CAAC,CAAA,EAAA,EAAA,2BAAA,AAA0B,EAAE,EAAO,KAAnC,CAAyC,CAAE,EAAQ,qBAAqB,EAC1F,EAAQ,WAAW,CAItB,CAJwB,CAIhB,KAAK,CAAG,wBAHhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,uBAAuB,CAAC,GAI9D,KAEF,KAAK,uBACC,AAAgB,GAAG,GAAZ,IAAI,CACb,EAAQ,KAAK,CAAG,6BAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,WAAW,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAEnF,KAEF,KAAK,4BACiB,AAAhB,GAAmB,GAAZ,IAAI,CACb,EAAQ,KAAK,CAAG,cAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,UAAU,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAElF,KAEF,KAAK,aACiB,GAAG,CAAnB,EAAO,IAAI,CACb,EAAQ,KAAK,CAAG,mBAEhB,EAAQ,KAAK,CAAG,mBAChB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,cAAc,CAAC,GAErD,KAEF,KAAK,mBACiB,GAAG,CAAnB,EAAO,IAAI,EACb,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,UAAU,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,EAElF,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,mBAAmB,CAAC,EACxD,KAEF,KAAK,kBACiB,GAAG,CAAnB,EAAO,IAAI,CACb,EAAQ,KAAK,CAAG,mBAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,YAAY,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAEpF,KAEF,KAAK,kBACiB,GAAG,CAAnB,EAAO,IAAI,CACb,EAAQ,KAAK,CAAG,mBAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,UAAU,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAElF,KAEF,KAAK,kBACwB,EAAO,MAAM,CAAC,IAAI,GAK3C,EAAQ,KAAK,CAAG,oBAHhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,uBAAuB,CAAC,GAI9D,KAEF,KAAK,mBACkB,CAAA,EAAA,EAAA,2BAAA,AAA0B,EAAE,EAAO,KAAnC,CAAyC,CAAE,EAAQ,qBAAqB,GAE3F,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,0BAA0B,CAAC,GAE/D,EAAQ,KAAK,CAAG,qBAElB,KAEF,KAAK,qBACiB,GAAG,CAAnB,EAAO,IAAI,CACb,EAAQ,KAAK,CAAG,wBAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,eAAe,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAEvF,KAEF,KAAK,uBACC,AAAgB,GAAG,GAAZ,IAAI,CACb,EAAQ,KAAK,CAAG,kBAEhB,EAAQ,KAAK,CAAG,6BAChB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,qBAAqB,CAAC,GAE5D,KAEF,KAAK,6BACiB,GAAG,CAAnB,EAAO,IAAI,EACb,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,iBAAiB,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,EAEzF,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,0BAA0B,CAAC,EAC/D,KAEF,KAAK,iBACiB,GAAG,CAAnB,EAAO,IAAI,CACb,EAAQ,KAAK,CAAG,uBAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,cAAc,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAEtF,KAEF,KAAK,sBACC,AAAgB,GAAG,GAAZ,IAAI,CACb,EAAQ,KAAK,CAAG,uBAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,UAAU,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAElF,KAEF,KAAK,sBAC2B,EAAO,MAAM,CAAC,IAAI,GAK9C,EAAQ,KAAK,CAAG,wBAHhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,2BAA2B,CAAC,GAIlE,KAEF,KAAK,uBACkB,CAAA,EAAA,EAAA,2BAAA,AAA0B,EAAE,EAAO,KAAnC,CAAyC,CAAE,EAAQ,qBAAqB,GAE3F,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,8BAA8B,CAAC,GAEnE,EAAQ,KAAK,CAAG,yBAElB,KAEF,KAAK,yBACiB,GAAG,CAAnB,EAAO,IAAI,CACb,EAAQ,KAAK,CAAG,4BAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,mBAAmB,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,GAE3F,KAEF,KAAK,2BACC,AAAgB,GAAG,GAAZ,IAAI,CACb,EAAQ,KAAK,CAAG,sBAEhB,EAAQ,KAAK,CAAG,iCAChB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,yBAAyB,CAAC,GAEhE,KAEF,KAAK,iCACiB,GAAG,CAAnB,EAAO,IAAI,EACb,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,qBAAqB,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,EAE7F,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,8BAA8B,CAAC,EACnE,KAEF,KAAK,qBACiB,GAAG,CAAnB,EAAO,IAAI,EACb,EAAQ,MAAM,CAAG,OACjB,EAAQ,KAAK,CAAG,SAEhB,EAAQ,MAAM,CAAG,SACjB,EAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAQ,IAAI,CAAC,kBAAkB,EAAE,EAAO,MAAM,EAAI,EAAO,MAAM,CAAA,CAAE,EAM9F,CACF,CAEA,eAAe,EAAoB,CAAa,EAE9C,IAAK,IAAM,KADW,IAAI,IAAI,EAAI,CACP,OADe,CAAC,GAAG,CAAC,EACL,CADgB,EAAQ,YAAY,EAAE,MAAM,CAAC,UAErF,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,wBAAA,AAAuB,EAAE,EACjC,CAAE,MAAO,CADD,CACQ,CACd,QAAQ,KAAK,CAAC,CAAC,UAAU,EAAE,EAAA,CAAc,CAAE,EAC7C,CAEJ,CAEO,eAAe,EAAK,CAAoB,EAC7C,GAAI,CACF,IAAM,EAAO,MAAM,EAAQ,IAAI,GACzB,EAAgC,UAAvB,OAAO,EAAK,MAAM,CAAgB,EAAK,MAAM,CAAG,GAE/D,GAAe,UAAX,EAAoB,CACtB,IAAM,EAAW,MAAM,OAAO,CAAC,EAAK,QAAQ,EAAI,EAAK,QAAQ,CAAG,EAAE,CAC5D,EAA4C,UAA7B,OAAO,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,EAA8B,UAAtB,OAAO,EAAK,KAAK,CAAgB,EAAK,KAAK,CAAG,GAEtD,EAA0B,EAAE,CAC5B,EAAsB,EAAE,CACxB,EAAuB,IAAI,IAEjC,GAAI,AAAoB,MAAX,MAAM,EAAU,CAAC,GAAgB,CAAC,GAAc,CAAC,EAC5D,OAAO,EAAA,EADkE,UACtD,CAAC,IAAI,CAAC,CACvB,SAAS,QADJ,QAEL,EACA,UAAW,CAAC,mBAAmB,AACjC,EAAG,CAAE,OAAQ,GAAI,GAGnB,GAAI,IAAe,EACjB,OAAO,EAAA,QAD6B,IACjB,CAAC,IAAI,CAAC,CACvB,SAAS,QADJ,QAEL,EACA,UAAW,CAAC,CAAC,wBAAwB,EAAE,EAAkB,CAAC,CAAC,CAAC,AAC9D,EAAG,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,QADJ,QAEL,EACA,UAAW,CAAC,qBAAqB,AACnC,EAAG,CAAE,OAAQ,GAAI,GAGnB,CAAA,EAAA,EAAA,qBAAA,AAAoB,EAAE,GACtB,IAAM,EAAiB,IADvB,EAC6B,CAAA,EAAA,EAAA,iBAAA,AAAgB,IACvC,EAAgB,EAAA,WADO,KACS,CAAC,cAAc,CAC/C,EAAiC,EADjB,AACmB,CAEzC,GAAI,CACF,IAAK,IAAM,KAAkB,EAAU,SACrC,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,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,QACF,CAEA,IAAM,EAAc,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAe,GACxC,GAAI,CAAC,CAAA,EAAA,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,QACF,CAEA,GAAI,CAAC,CAAA,EAAA,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,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,QACF,CAEA,EAAqB,GAAG,CAAC,EAAe,KAAK,CAAC,YAAY,EAC1D,EAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAY,YAAY,EAAE,EAAe,KAAK,CAAC,WAAW,CAAA,CAAE,EACnF,EAAY,IAAI,CAAC,CAtrBuB,EAwrBtC,EAAe,KAAK,CAAC,CAxrBoC,UAwrBzB,CAxrB2B,EAyrB3D,EAAe,KAAK,CAAC,EAzrB0D,UAyrB9C,CAxrBpC,CACL,KAqrBQ,CArrBF,CACN,KAAM,eACN,EACA,MAAO,sBACP,OAAQ,UACR,eAAgB,GAChB,mBAAoB,GACpB,gBAAgB,EAChB,sBAAuB,EAAE,CACzB,WAAY,KACZ,mBAAoB,KACpB,kBAAmB,KACnB,YAAa,KACb,YAAa,IACf,GA2qBM,CACF,CAAE,MAAO,EAAO,CACd,IAAK,IAAM,KAAgB,EACzB,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,IAFuC,oBAEhB,AAAvB,EAAyB,EACjC,CAAE,MAAO,CADD,CACe,CACrB,QAAQ,KAAK,CAAC,CAAC,UAAU,EAAE,EAAA,CAAc,CAAE,EAC7C,CAGF,KADA,CAAA,EAAA,EAAA,oBAAA,AAAmB,EAAE,GACf,CACR,CAEA,IAAM,EAAqB,GAJzB,IAKA,eACA,aACA,cACA,EACA,SAAU,EACV,aAAc,gBACd,YACA,EACA,YAAa,KACb,UAAW,KAAK,GAAG,EACrB,EAEM,EAAW,EAAkB,GAQnC,OAPI,EACF,CAAA,EAAA,EAAA,GADY,UACZ,AAAY,EAAE,IAEd,MAAM,EAAoB,GAC1B,CAAA,EAAA,EAAA,CAHA,mBAGA,AAAmB,EAAE,IAGhB,EAAA,QAHL,IAGiB,CAAC,IAAI,CAAC,CACvB,SAAS,QACT,AAFK,EAGL,SAAU,EAAW,CACnB,OAAQ,EAAS,EAAE,CACnB,YAAa,EAAS,WAAW,CACjC,YAAa,EAAS,WAAW,CACjC,QAAS,EAAc,EAAS,IAAI,CACtC,EAAI,KACJ,cAAe,EAAS,aAAa,CACrC,UAAW,EAAS,SAAS,CAC7B,WAAyB,OAAb,CACd,EACF,CAEA,GAAe,YAAX,EAAsB,CACxB,IAAM,EAA8B,UAAtB,OAAO,EAAK,KAAK,CAAgB,EAAK,KAAK,CAAG,GACtD,EAAgC,UAAvB,OAAO,EAAK,MAAM,CAAgB,EAAK,MAAM,CAAG,GAEzD,EAAW,CAAA,EAAA,EAAA,UAAA,AAAS,EAAE,GAC5B,GAAI,CAAC,EACH,OAAO,CADM,CACN,MAFQ,MAEI,CAAC,IAAI,CAAC,CACvB,QAAS,GACT,MAFK,QAEU,EAAE,CACjB,UAAW,CAAC,kBAAkB,AAChC,EAAG,CAAE,OAAQ,GAAI,GAGnB,GAAI,CAAA,EAAA,EAAA,mBAAA,AAAkB,EAAE,GAMtB,KAN8B,EAC9B,EAAS,GADP,UACoB,CAAC,IAAI,CAAC,yBAC5B,MAAM,EAAY,GAClB,MAAM,EAAoB,GAC1B,CAAA,EAAA,EAAA,YAAA,AAAW,EAAE,GACb,CAAA,EAAA,EAAA,cADA,MACA,AAAmB,EAAE,GACd,EAAA,SADP,GACmB,CAAC,IAAI,CAAC,CACvB,SAAS,QACT,AAFK,EAGL,SAAU,KACV,cAAe,EAAS,aAAa,CACrC,UAAW,EAAS,SAAS,CAC7B,YAAY,EACZ,SAAS,CACX,GAGF,GAAI,CAAC,EAAS,WAAW,EAAI,EAAS,WAAW,CAAC,EAAE,GAAK,EACvD,MAD+D,CACxD,EAAA,YAAY,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,QAEU,EAAS,aAAa,CACrC,UAAW,CAAC,eAAe,AAC7B,EAAG,CAAE,OAAQ,GAAI,EAGnB,OAAM,EAAY,EAAU,EAAS,WAAW,EAEhD,IAAM,EAAW,EAAkB,GASnC,MARA,CAAA,EAAA,EAAA,aAAA,AAAY,EAAE,GAET,IACH,MAAM,AADO,EACa,GAC1B,CAAA,EAAA,AAJF,EAIE,YAAA,AAAW,EAAE,GACb,CAAA,EAAA,EAAA,cADA,MACA,AAAmB,EAAE,IAGhB,EAAA,QAHL,IAGiB,CAAC,IAAI,CAAC,CACvB,SAAS,QADJ,AAEL,EACA,SAAU,EAAW,CACnB,OAAQ,EAAS,EAAE,CACnB,YAAa,EAAS,WAAW,CACjC,YAAa,EAAS,WAAW,CACjC,QAAS,EAAc,EAAS,IAAI,CACtC,EAAI,KACJ,cAAe,EAAS,aAAa,CACrC,UAAW,EAAS,SAAS,CAC7B,WAAyB,OAAb,CACd,EACF,CAEA,GAAI,AAAW,YAAS,CACtB,IAAM,EAA8B,UAAtB,OAAO,EAAK,KAAK,CAAgB,EAAK,KAAK,CAAG,GACtD,EAAW,CAAA,EAAA,EAAA,UAAA,AAAS,EAAE,GAC5B,GAAI,CAAC,EACH,OAAO,CADM,CACN,MAFQ,MAEI,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,QAEU,EAAE,CACjB,UAAW,CAAC,kBAAkB,AAChC,EAAG,CAAE,OAAQ,GAAI,GASnB,OANA,EAAS,aAAa,CAAC,IAAI,CAAC,yBAC5B,MAAM,EAAY,GAClB,MAAM,EAAoB,GAC1B,CAAA,EAAA,EAAA,YAAA,AAAW,EAAE,GACb,CAAA,EAAA,EAAA,cADA,MACA,AAAmB,EAAE,GAEd,EAAA,SAFP,GAEmB,CAAC,IAAI,CAAC,CACvB,SAAS,QADJ,AAEL,EACA,SAAU,KACV,cAAe,EAAS,aAAa,CACrC,UAAW,EAAS,SAAS,CAC7B,YAAY,EACZ,SAAS,CACX,EACF,CAEA,OAAO,EAAA,YAAY,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,QAEU,EAAE,CACjB,UAAW,CAAC,UAAU,AACxB,EAAG,CAAE,OAAQ,GAAI,EACnB,CAAE,MAAO,EAAO,CAEd,OADA,QAAQ,KAAK,CAAC,kBAAmB,GAC1B,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,CACF,gKCj7BA,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,IAWZ,IAAMC,CAb4B,CAad,IAXM,AAWN,EAAIL,CAbkB,YAEF,MAWhBA,CAAoB,CAC1CM,WAAY,CACVC,KAAMN,EAAAA,SAAAA,CAAUO,SAAS,CACzBC,KAAM,+BACNC,SAAU,yBACVC,SAAU,QACVC,WAAY,EACd,EACAC,iBAAkB,mEAClBC,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":[2]}
@@ -1,3 +1,3 @@
1
- module.exports={32970:t=>{"use strict";var{g:e,__dirname:i}=t;{t.s({POST:()=>m});var a=t.i(15494),n=t.i(87485),r=t.i(83886),o=t.i(30331),s=t.i(88941),u=t.i(35692),c=t.i(77159),h=t.i(79810),$=t.i(34926),l=t.i(33808);let e=/\\s/;function p(t){return!(!t||e.test(t)||t.startsWith("-"))}function d(t,e){return new Promise((i,a)=>{let r=(0,n.spawn)("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",s="";r.stdout?.on("data",t=>{o+=t.toString()}),r.stderr?.on("data",t=>{s+=t.toString()}),r.on("close",t=>{i({code:t,stdout:o,stderr:s})}),r.on("error",t=>{a(t)})})}function g(t){return`git ${t.join(" ")}`}function f(t,e,i,a){0===a.code?t.push(`[${e}] 完成: ${i}`):t.push(`[${e}] 失败: ${i} ${a.stderr||a.stdout}`)}function w(t,e,i,a){let n=(0,$.appendIgnoredPathsFromCheckoutWarning)(a.stderr,i.ignoredUntrackedPaths);n.length>0&&t.push(`[${e}] 提示: 检测到子模块残留目录 ${n.join(", ")},状态检查将忽略对应未跟踪路径`)}async function m(t){let e="",i=new Set;try{let n=await t.json(),m=Array.isArray(n.projects)?n.projects:[],k="string"==typeof n.createBranch?n.createBranch.trim():"",B="string"==typeof n.baseBranch?n.baseBranch.trim():"",b="string"==typeof n.mergeBranch?n.mergeBranch.trim():"",y=!!n.dryRun,P="string"==typeof n.runId?n.runId:"",j=[],R=[],A=[],S=new Map,v=(t,e,i,a)=>{S.has(t)||(S.set(t,{success:e,reason:i,rollbackActions:a}),A.push({projectName:t,success:e,reason:i,rollbackActions:a}))},x=async(t,e,i)=>{let a=[];if(i.originalBranch&&"HEAD"!==i.originalBranch){let n=g(["checkout",i.originalBranch]);j.push(`[${t}] 回滚: ${n}`);let r=await d(e,["checkout",i.originalBranch]);f(j,t,`回滚切换分支 ${i.originalBranch}`,r),a.push(n)}if(i.createdLocalBranch&&!i.hadLocalBranch){let i=g(["branch","-D",k]);j.push(`[${t}] 回滚: ${i}`);let n=await d(e,["branch","-D",k]);f(j,t,`回滚删除本地分支 ${k}`,n),a.push(i)}return a};if(0===m.length||!k||!B||!b)return a.NextResponse.json({success:!1,operationLogs:j,feedbacks:["缺少必要参数,请填写完整后重试。"]},{status:400});if(!p(k)||!p(B)||!p(b))return a.NextResponse.json({success:!1,operationLogs:j,feedbacks:["分支名称不合法,请避免空格或以 - 开头。"]},{status:400});if(!P)return a.NextResponse.json({success:!1,operationLogs:j,feedbacks:["缺少 runId,请刷新页面后重试。"]},{status:400});(0,h.createUatGitFlowState)(P),e=P;let U=await (0,u.getProjectsConfig)(),E=s.WORKSPACE_CONFIG.WORKSPACE_ROOT,L=[],C=()=>(0,h.isUatGitFlowAborted)(P);for(let t of m){if(C()){R.push("已收到中断请求,开始回滚已执行的本地操作。");break}let e=String(t),a=(0,c.sanitizeProjectName)(e);if(!a||a!==e){j.push(`[${e}] 失败: 项目名称包含无效字符`),R.push(`[${e}] 项目名称包含无效字符,已跳过。`),v(e,!1,"项目名称包含无效字符");continue}if(!U[a]){j.push(`[${a}] 失败: 未在项目配置中找到`),R.push(`[${a}] 未在项目配置中找到,已跳过。`),v(a,!1,"未在项目配置中找到");continue}let n=(0,o.join)(E,a);if(!(0,r.existsSync)(n)){j.push(`[${a}] 失败: 项目目录不存在`),R.push(`[${a}] 项目目录不存在,已跳过。`),v(a,!1,"项目目录不存在");continue}if(!(0,r.existsSync)((0,o.join)(n,".git"))){j.push(`[${a}] 失败: 非 Git 仓库`),R.push(`[${a}] 不是有效的 Git 仓库,已跳过。`),v(a,!1,"不是有效的 Git 仓库");continue}if(y){j.push(`[${a}] ${g(["fetch","origin"])}`),j.push(`[${a}] ${g(["ls-remote","--heads","origin",B])}`),j.push(`[${a}] ${g(["ls-remote","--heads","origin",k])}`),j.push(`[${a}] ${g(["show-ref","--verify",`refs/heads/${k}`])}`),j.push(`[${a}] ${g(["checkout","-B",k,`origin/${B}`])}`),j.push(`[${a}] ${g(["push","-u","origin",k])}`),j.push(`[${a}] ${g(["ls-remote","--heads","origin",b])}`),j.push(`[${a}] ${g(["status","--porcelain","--untracked-files=all"])}`),j.push(`[${a}] ${g(["checkout",k])}`),j.push(`[${a}] ${g(["merge","--no-ff","--no-edit",`origin/${b}`])}`),j.push(`[${a}] ${g(["push","origin",k])}`),j.push(`[${a}] ${g(["checkout","main"])}`),j.push(`[${a}] ${g(["fetch","origin"])}`),j.push(`[${a}] ${g(["ls-remote","--heads","origin","main"])}`),j.push(`[${a}] ${g(["status","--porcelain","--untracked-files=all"])}`),j.push(`[${a}] ${g(["merge","--no-ff","--no-edit",`origin/${k}`])}`),j.push(`[${a}] ${g(["push","origin","main"])}`);continue}let s=await (0,l.createTempExecutionRepo)(n,a);if(!s.success){j.push(`[${a}] 失败: 创建临时执行仓库失败 ${s.error}`),R.push(`[${a}] 创建临时执行仓库失败: ${s.error}`),v(a,!1,"创建临时执行仓库失败");continue}let u=s.value.projectPath;i.add(s.value.tempRootPath),j.push(`[${a}] 使用临时目录执行: ${u}`),j.push(`[${a}] 检查当前分支`);let h=await d(u,["branch","--show-current"]);f(j,a,"当前分支检查",h);let p={originalBranch:h.stdout.replace(/\s+/g," ").trim()||"HEAD",createdLocalBranch:!1,hadLocalBranch:!0,ignoredUntrackedPaths:new Set};j.push(`[${a}] ${g(["fetch","origin"])}`);let m=await d(u,["fetch","origin"]);if(f(j,a,"拉取远端",m),0!==m.code){R.push(`[${a}] 拉取远端失败: ${m.stderr||m.stdout}`);let t=await x(a,u,p);v(a,!1,"拉取远端失败",t);continue}j.push(`[${a}] ${g(["ls-remote","--heads","origin",B])}`);let P=await d(u,["ls-remote","--heads","origin",B]);if(f(j,a,`检查 origin/${B}`,P),!P.stdout.trim()){R.push(`[${a}] origin/${B} 不存在,无法创建分支。`);let t=await x(a,u,p);v(a,!1,`origin/${B} 不存在`,t);continue}j.push(`[${a}] ${g(["ls-remote","--heads","origin",k])}`);let A=await d(u,["ls-remote","--heads","origin",k]);f(j,a,`检查远端分支 ${k}`,A),j.push(`[${a}] ${g(["show-ref","--verify",`refs/heads/${k}`])}`);let S=await d(u,["show-ref","--verify",`refs/heads/${k}`]);if(f(j,a,`检查本地分支 ${k}`,S),0===S.code){j.push(`[${a}] ${g(["checkout",k])}`);let t=await d(u,["checkout",k]);if(f(j,a,`切换到本地分支 ${k}`,t),w(j,a,p,t),0!==t.code){R.push(`[${a}] 切换到本地分支失败: ${t.stderr||t.stdout}`);let e=await x(a,u,p);v(a,!1,"切换到本地分支失败",e);continue}j.push(`[${a}] ${g(["fetch","origin"])}`);let e=await d(u,["fetch","origin"]);if(f(j,a,"拉取远端",e),0!==e.code){R.push(`[${a}] 拉取远端失败: ${e.stderr||e.stdout}`);let t=await x(a,u,p);v(a,!1,"拉取远端失败",t);continue}}else if(p.hadLocalBranch=!1,A.stdout.trim()){j.push(`[${a}] ${g(["checkout","-B",k,`origin/${k}`])}`);let t=await d(u,["checkout","-B",k,`origin/${k}`]);if(f(j,a,`切换到远端分支 ${k}`,t),w(j,a,p,t),0!==t.code){R.push(`[${a}] 切换到已有远端分支失败: ${t.stderr||t.stdout}`);let e=await x(a,u,p);v(a,!1,"切换到已有远端分支失败",e);continue}}else{j.push(`[${a}] ${g(["checkout","-B",k,`origin/${B}`])}`);let t=await d(u,["checkout","-B",k,`origin/${B}`]);if(f(j,a,`创建分支 ${k}`,t),w(j,a,p,t),0!==t.code){R.push(`[${a}] 创建分支失败: ${t.stderr||t.stdout}`);let e=await x(a,u,p);v(a,!1,"创建分支失败",e);continue}p.createdLocalBranch=!0,j.push(`[${a}] ${g(["push","-u","origin",k])}`);let e=await d(u,["push","-u","origin",k]);if(f(j,a,`推送分支 ${k}`,e),0!==e.code){R.push(`[${a}] 推送新分支失败: ${e.stderr||e.stdout}`);let t=await x(a,u,p);v(a,!1,"推送新分支失败",t);continue}}j.push(`[${a}] ${g(["ls-remote","--heads","origin",b])}`);let F=await d(u,["ls-remote","--heads","origin",b]);if(f(j,a,`检查 origin/${b}`,F),!F.stdout.trim()){R.push(`[${a}] origin/${b} 不存在,无法合并。`);let t=await x(a,u,p);v(a,!1,`origin/${b} 不存在`,t);continue}if(L.push({name:a,path:u,info:p}),C()){R.push("已收到中断请求,开始回滚已执行的本地操作。");break}j.push(`[${a}] ${g(["status","--porcelain","--untracked-files=all"])}`);let G=await d(u,["status","--porcelain","--untracked-files=all"]);if(f(j,a,"检查工作区",G),(0,$.hasBlockingWorkspaceChanges)(G.stdout,p.ignoredUntrackedPaths)){R.push(`[${a}] 工作区有未提交改动,请先处理后再执行合并。`);let t=await x(a,u,p);v(a,!1,"工作区有未提交改动",t);continue}j.push(`[${a}] ${g(["checkout",k])}`);let O=await d(u,["checkout",k]);if(f(j,a,`切换到分支 ${k}`,O),w(j,a,p,O),0!==O.code){R.push(`[${a}] 切换到分支失败: ${O.stderr||O.stdout}`);let t=await x(a,u,p);v(a,!1,"切换到分支失败",t);continue}j.push(`[${a}] ${g(["merge","--no-ff","--no-edit",`origin/${b}`])}`);let D=await d(u,["merge","--no-ff","--no-edit",`origin/${b}`]);if(f(j,a,`合并 origin/${b}`,D),0!==D.code){j.push(`[${a}] ${g(["merge","--abort"])}`);let t=await d(u,["merge","--abort"]);f(j,a,"终止合并",t),R.push(`[${a}] 合并冲突,已终止合并,请手动处理。`);let e=await x(a,u,p);v(a,!1,"合并冲突",e);continue}j.push(`[${a}] ${g(["push","origin",k])}`);let N=await d(u,["push","origin",k]);if(f(j,a,`推送合并结果 ${k}`,N),0!==N.code){R.push(`[${a}] 推送合并结果失败: ${N.stderr||N.stdout}`);let t=await x(a,u,p);v(a,!1,"推送合并结果失败",t);continue}j.push(`[${a}] ${g(["fetch","origin"])}`);let T=await d(u,["fetch","origin"]);if(f(j,a,"拉取远端",T),0!==T.code){R.push(`[${a}] 拉取远端失败: ${T.stderr||T.stdout}`);let t=await x(a,u,p);v(a,!1,"拉取远端失败",t);continue}j.push(`[${a}] ${g(["ls-remote","--heads","origin","main"])}`);let W=await d(u,["ls-remote","--heads","origin","main"]);if(f(j,a,"检查 origin/main",W),!W.stdout.trim()){R.push(`[${a}] origin/main 不存在,无法合并。`);let t=await x(a,u,p);v(a,!1,"origin/main 不存在",t);continue}j.push(`[${a}] ${g(["status","--porcelain","--untracked-files=all"])}`);let I=await d(u,["status","--porcelain","--untracked-files=all"]);if(f(j,a,"检查工作区",I),(0,$.hasBlockingWorkspaceChanges)(I.stdout,p.ignoredUntrackedPaths)){R.push(`[${a}] 工作区有未提交改动,请先处理后再合并 main。`);let t=await x(a,u,p);v(a,!1,"工作区有未提交改动",t);continue}j.push(`[${a}] ${g(["checkout","main"])}`);let H=await d(u,["checkout","main"]);if(f(j,a,"切换到 main",H),w(j,a,p,H),0!==H.code){R.push(`[${a}] 切换到 main 失败: ${H.stderr||H.stdout}`);let t=await x(a,u,p);v(a,!1,"切换到 main 失败",t);continue}j.push(`[${a}] ${g(["merge","--no-ff","--no-edit",`origin/${k}`])}`);let K=await d(u,["merge","--no-ff","--no-edit",`origin/${k}`]);if(f(j,a,`合并 origin/${k} 到 main`,K),0!==K.code){j.push(`[${a}] ${g(["merge","--abort"])}`);let t=await d(u,["merge","--abort"]);f(j,a,"终止合并到 main",t),R.push(`[${a}] 合并到 main 冲突,已终止合并,请手动处理。`);let e=await x(a,u,p);v(a,!1,"合并到 main 冲突",e);continue}j.push(`[${a}] ${g(["push","origin","main"])}`);let M=await d(u,["push","origin","main"]);if(f(j,a,"推送 main",M),0!==M.code){R.push(`[${a}] 推送 main 失败: ${M.stderr||M.stdout}`);let t=await x(a,u,p);v(a,!1,"推送 main 失败",t);continue}v(a,!0)}if((0,h.isUatGitFlowAborted)(P))for(let t of L.reverse()){let{name:e,path:i,info:a}=t;if(a.originalBranch&&"HEAD"!==a.originalBranch){j.push(`[${e}] 回滚: ${g(["checkout",a.originalBranch])}`);let t=await d(i,["checkout",a.originalBranch]);f(j,e,`回滚切换分支 ${a.originalBranch}`,t)}if(a.createdLocalBranch&&!a.hadLocalBranch){j.push(`[${e}] 回滚: ${g(["branch","-D",k])}`);let t=await d(i,["branch","-D",k]);f(j,e,`回滚删除本地分支 ${k}`,t)}}return a.NextResponse.json({success:0===R.length,operationLogs:j,feedbacks:R,projectResults:A})}catch(t){return console.error("UAT git 操作流执行失败:",t),a.NextResponse.json({success:!1,operationLogs:[],feedbacks:[t instanceof Error?t.message:"执行失败"]},{status:500})}finally{for(let t of i)try{await (0,l.cleanupTempExecutionRepo)(t)}catch(e){console.error(`清理临时目录失败: ${t}`,e)}e&&(0,h.clearUatGitFlowState)(e)}}}},7044:t=>{"use strict";var{g:e,__dirname:i}=t;{t.s({patchFetch:()=>s,routeModule:()=>e,serverHooks:()=>c,workAsyncStorage:()=>i,workUnitAsyncStorage:()=>u});var a=t.i(45746),n=t.i(93828),r=t.i(18250),o=t.i(32970);let e=new a.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/uat-git-flow/route",pathname:"/api/uat-git-flow",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/uat-git-flow/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:i,workUnitAsyncStorage:u,serverHooks:c}=e;function s(){return(0,r.patchFetch)({workAsyncStorage:i,workUnitAsyncStorage:u})}}}};
1
+ module.exports={32970:e=>{"use strict";var{g:t,__dirname:i}=e;{e.s({POST:()=>m});var s=e.i(15494),r=e.i(87485),a=e.i(83886),o=e.i(30331),n=e.i(88941),u=e.i(35692),c=e.i(77159),h=e.i(79810),$=e.i(34926),l=e.i(33808);let t=/\\s/,i="main",k=["main","fix/main"];function p(e){return!(!e||t.test(e)||e.startsWith("-"))}function d(e,t){return new Promise((i,s)=>{let a=(0,r.spawn)("git",t,{cwd:e,stdio:["ignore","pipe","pipe"]}),o="",n="";a.stdout?.on("data",e=>{o+=e.toString()}),a.stderr?.on("data",e=>{n+=e.toString()}),a.on("close",e=>{i({code:e,stdout:o,stderr:n})}),a.on("error",e=>{s(e)})})}function g(e){return`git ${e.join(" ")}`}function f(e,t,i,s){0===s.code?e.push(`[${t}] 完成: ${i}`):e.push(`[${t}] 失败: ${i} ${s.stderr||s.stdout}`)}function w(e,t,i,s){let r=(0,$.appendIgnoredPathsFromCheckoutWarning)(s.stderr,i.ignoredUntrackedPaths);r.length>0&&e.push(`[${t}] 提示: 检测到子模块残留目录 ${r.join(", ")},状态检查将忽略对应未跟踪路径`)}async function m(e){let t="",r=new Set;try{let m=await e.json(),B=Array.isArray(m.projects)?m.projects:[],b="string"==typeof m.createBranch?m.createBranch.trim():"",y="string"==typeof m.baseBranch?m.baseBranch.trim():"",P="string"==typeof m.mergeBranch?m.mergeBranch.trim():"",j=!!m.dryRun,R="string"==typeof m.runId?m.runId:"",x=[],A=[],S=[],v=new Map,U=(e,t,i,s)=>{v.has(e)||(v.set(e,{success:t,reason:i,rollbackActions:s}),S.push({projectName:e,success:t,reason:i,rollbackActions:s}))},E=async(e,t,i)=>{let s=[];if(i.originalBranch&&"HEAD"!==i.originalBranch){let r=g(["checkout",i.originalBranch]);x.push(`[${e}] 回滚: ${r}`);let a=await d(t,["checkout",i.originalBranch]);f(x,e,`回滚切换分支 ${i.originalBranch}`,a),s.push(r)}if(i.createdLocalBranch&&!i.hadLocalBranch){let i=g(["branch","-D",b]);x.push(`[${e}] 回滚: ${i}`);let r=await d(t,["branch","-D",b]);f(x,e,`回滚删除本地分支 ${b}`,r),s.push(i)}return s};if(0===B.length||!b||!y||!P)return s.NextResponse.json({success:!1,operationLogs:x,feedbacks:["缺少必要参数,请填写完整后重试。"]},{status:400});if(y!==i)return s.NextResponse.json({success:!1,operationLogs:x,feedbacks:[`UAT 操作流从 origin 分支创建固定为 ${i}。`]},{status:400});if(!p(b)||!p(y)||!p(P))return s.NextResponse.json({success:!1,operationLogs:x,feedbacks:["分支名称不合法,请避免空格或以 - 开头。"]},{status:400});if(!R)return s.NextResponse.json({success:!1,operationLogs:x,feedbacks:["缺少 runId,请刷新页面后重试。"]},{status:400});(0,h.createUatGitFlowState)(R),t=R;let L=await (0,u.getProjectsConfig)(),C=n.WORKSPACE_CONFIG.WORKSPACE_ROOT,F=[],G=()=>(0,h.isUatGitFlowAborted)(R);e:for(let e of B){if(G()){A.push("已收到中断请求,开始回滚已执行的本地操作。");break}let t=String(e),i=(0,c.sanitizeProjectName)(t);if(!i||i!==t){x.push(`[${t}] 失败: 项目名称包含无效字符`),A.push(`[${t}] 项目名称包含无效字符,已跳过。`),U(t,!1,"项目名称包含无效字符");continue}if(!L[i]){x.push(`[${i}] 失败: 未在项目配置中找到`),A.push(`[${i}] 未在项目配置中找到,已跳过。`),U(i,!1,"未在项目配置中找到");continue}let s=(0,o.join)(C,i);if(!(0,a.existsSync)(s)){x.push(`[${i}] 失败: 项目目录不存在`),A.push(`[${i}] 项目目录不存在,已跳过。`),U(i,!1,"项目目录不存在");continue}if(!(0,a.existsSync)((0,o.join)(s,".git"))){x.push(`[${i}] 失败: 非 Git 仓库`),A.push(`[${i}] 不是有效的 Git 仓库,已跳过。`),U(i,!1,"不是有效的 Git 仓库");continue}if(j){x.push(`[${i}] ${g(["fetch","origin"])}`),x.push(`[${i}] ${g(["ls-remote","--heads","origin",y])}`),x.push(`[${i}] ${g(["ls-remote","--heads","origin",b])}`),x.push(`[${i}] ${g(["show-ref","--verify",`refs/heads/${b}`])}`),x.push(`[${i}] ${g(["checkout","-B",b,`origin/${y}`])}`),x.push(`[${i}] ${g(["push","-u","origin",b])}`),x.push(`[${i}] ${g(["ls-remote","--heads","origin",P])}`),x.push(`[${i}] ${g(["status","--porcelain","--untracked-files=all"])}`),x.push(`[${i}] ${g(["checkout",b])}`),x.push(`[${i}] ${g(["merge","--no-ff","--no-edit",`origin/${P}`])}`),x.push(`[${i}] ${g(["push","origin",b])}`),x.push(`[${i}] ${g(["checkout","main"])}`),x.push(`[${i}] ${g(["fetch","origin"])}`),x.push(`[${i}] ${g(["ls-remote","--heads","origin","main"])}`),x.push(`[${i}] ${g(["status","--porcelain","--untracked-files=all"])}`),x.push(`[${i}] ${g(["merge","--no-ff","--no-edit",`origin/${b}`])}`),x.push(`[${i}] ${g(["push","origin","main"])}`),x.push(`[${i}] ${g(["fetch","origin"])}`),x.push(`[${i}] ${g(["ls-remote","--heads","origin","fix/main"])}`),x.push(`[${i}] ${g(["status","--porcelain","--untracked-files=all"])}`),x.push(`[${i}] ${g(["checkout","fix/main"])}`),x.push(`[${i}] ${g(["merge","--no-ff","--no-edit",`origin/${b}`])}`),x.push(`[${i}] ${g(["push","origin","fix/main"])}`);continue}let n=await (0,l.createTempExecutionRepo)(s,i);if(!n.success){x.push(`[${i}] 失败: 创建临时执行仓库失败 ${n.error}`),A.push(`[${i}] 创建临时执行仓库失败: ${n.error}`),U(i,!1,"创建临时执行仓库失败");continue}let u=n.value.projectPath;r.add(n.value.tempRootPath),x.push(`[${i}] 使用临时目录执行: ${u}`),x.push(`[${i}] 检查当前分支`);let h=await d(u,["branch","--show-current"]);f(x,i,"当前分支检查",h);let p={originalBranch:h.stdout.replace(/\s+/g," ").trim()||"HEAD",createdLocalBranch:!1,hadLocalBranch:!0,ignoredUntrackedPaths:new Set};x.push(`[${i}] ${g(["fetch","origin"])}`);let m=await d(u,["fetch","origin"]);if(f(x,i,"拉取远端",m),0!==m.code){A.push(`[${i}] 拉取远端失败: ${m.stderr||m.stdout}`);let e=await E(i,u,p);U(i,!1,"拉取远端失败",e);continue}x.push(`[${i}] ${g(["ls-remote","--heads","origin",y])}`);let B=await d(u,["ls-remote","--heads","origin",y]);if(f(x,i,`检查 origin/${y}`,B),!B.stdout.trim()){A.push(`[${i}] origin/${y} 不存在,无法创建分支。`);let e=await E(i,u,p);U(i,!1,`origin/${y} 不存在`,e);continue}x.push(`[${i}] ${g(["ls-remote","--heads","origin",b])}`);let R=await d(u,["ls-remote","--heads","origin",b]);f(x,i,`检查远端分支 ${b}`,R),x.push(`[${i}] ${g(["show-ref","--verify",`refs/heads/${b}`])}`);let S=await d(u,["show-ref","--verify",`refs/heads/${b}`]);if(f(x,i,`检查本地分支 ${b}`,S),0===S.code){x.push(`[${i}] ${g(["checkout",b])}`);let e=await d(u,["checkout",b]);if(f(x,i,`切换到本地分支 ${b}`,e),w(x,i,p,e),0!==e.code){A.push(`[${i}] 切换到本地分支失败: ${e.stderr||e.stdout}`);let t=await E(i,u,p);U(i,!1,"切换到本地分支失败",t);continue}x.push(`[${i}] ${g(["fetch","origin"])}`);let t=await d(u,["fetch","origin"]);if(f(x,i,"拉取远端",t),0!==t.code){A.push(`[${i}] 拉取远端失败: ${t.stderr||t.stdout}`);let e=await E(i,u,p);U(i,!1,"拉取远端失败",e);continue}}else if(p.hadLocalBranch=!1,R.stdout.trim()){x.push(`[${i}] ${g(["checkout","-B",b,`origin/${b}`])}`);let e=await d(u,["checkout","-B",b,`origin/${b}`]);if(f(x,i,`切换到远端分支 ${b}`,e),w(x,i,p,e),0!==e.code){A.push(`[${i}] 切换到已有远端分支失败: ${e.stderr||e.stdout}`);let t=await E(i,u,p);U(i,!1,"切换到已有远端分支失败",t);continue}}else{x.push(`[${i}] ${g(["checkout","-B",b,`origin/${y}`])}`);let e=await d(u,["checkout","-B",b,`origin/${y}`]);if(f(x,i,`创建分支 ${b}`,e),w(x,i,p,e),0!==e.code){A.push(`[${i}] 创建分支失败: ${e.stderr||e.stdout}`);let t=await E(i,u,p);U(i,!1,"创建分支失败",t);continue}p.createdLocalBranch=!0,x.push(`[${i}] ${g(["push","-u","origin",b])}`);let t=await d(u,["push","-u","origin",b]);if(f(x,i,`推送分支 ${b}`,t),0!==t.code){A.push(`[${i}] 推送新分支失败: ${t.stderr||t.stdout}`);let e=await E(i,u,p);U(i,!1,"推送新分支失败",e);continue}}x.push(`[${i}] ${g(["ls-remote","--heads","origin",P])}`);let v=await d(u,["ls-remote","--heads","origin",P]);if(f(x,i,`检查 origin/${P}`,v),!v.stdout.trim()){A.push(`[${i}] origin/${P} 不存在,无法合并。`);let e=await E(i,u,p);U(i,!1,`origin/${P} 不存在`,e);continue}if(F.push({name:i,path:u,info:p}),G()){A.push("已收到中断请求,开始回滚已执行的本地操作。");break}x.push(`[${i}] ${g(["status","--porcelain","--untracked-files=all"])}`);let N=await d(u,["status","--porcelain","--untracked-files=all"]);if(f(x,i,"检查工作区",N),(0,$.hasBlockingWorkspaceChanges)(N.stdout,p.ignoredUntrackedPaths)){A.push(`[${i}] 工作区有未提交改动,请先处理后再执行合并。`);let e=await E(i,u,p);U(i,!1,"工作区有未提交改动",e);continue}x.push(`[${i}] ${g(["checkout",b])}`);let O=await d(u,["checkout",b]);if(f(x,i,`切换到分支 ${b}`,O),w(x,i,p,O),0!==O.code){A.push(`[${i}] 切换到分支失败: ${O.stderr||O.stdout}`);let e=await E(i,u,p);U(i,!1,"切换到分支失败",e);continue}x.push(`[${i}] ${g(["merge","--no-ff","--no-edit",`origin/${P}`])}`);let D=await d(u,["merge","--no-ff","--no-edit",`origin/${P}`]);if(f(x,i,`合并 origin/${P}`,D),0!==D.code){x.push(`[${i}] ${g(["merge","--abort"])}`);let e=await d(u,["merge","--abort"]);f(x,i,"终止合并",e),A.push(`[${i}] 合并冲突,已终止合并,请手动处理。`);let t=await E(i,u,p);U(i,!1,"合并冲突",t);continue}x.push(`[${i}] ${g(["push","origin",b])}`);let T=await d(u,["push","origin",b]);if(f(x,i,`推送合并结果 ${b}`,T),0!==T.code){A.push(`[${i}] 推送合并结果失败: ${T.stderr||T.stdout}`);let e=await E(i,u,p);U(i,!1,"推送合并结果失败",e);continue}for(let e of k){x.push(`[${i}] ${g(["fetch","origin"])}`);let t=await d(u,["fetch","origin"]);if(f(x,i,"拉取远端",t),0!==t.code){A.push(`[${i}] 拉取远端失败: ${t.stderr||t.stdout}`);let e=await E(i,u,p);U(i,!1,"拉取远端失败",e);continue e}x.push(`[${i}] ${g(["ls-remote","--heads","origin",e])}`);let s=await d(u,["ls-remote","--heads","origin",e]);if(f(x,i,`检查 origin/${e}`,s),!s.stdout.trim()){A.push(`[${i}] origin/${e} 不存在,无法合并。`);let t=await E(i,u,p);U(i,!1,`origin/${e} 不存在`,t);continue e}x.push(`[${i}] ${g(["status","--porcelain","--untracked-files=all"])}`);let r=await d(u,["status","--porcelain","--untracked-files=all"]);if(f(x,i,"检查工作区",r),(0,$.hasBlockingWorkspaceChanges)(r.stdout,p.ignoredUntrackedPaths)){A.push(`[${i}] 工作区有未提交改动,请先处理后再合并 ${e}。`);let t=await E(i,u,p);U(i,!1,"工作区有未提交改动",t);continue e}x.push(`[${i}] ${g(["checkout",e])}`);let a=await d(u,["checkout",e]);if(f(x,i,`切换到 ${e}`,a),w(x,i,p,a),0!==a.code){A.push(`[${i}] 切换到 ${e} 失败: ${a.stderr||a.stdout}`);let t=await E(i,u,p);U(i,!1,`切换到 ${e} 失败`,t);continue e}x.push(`[${i}] ${g(["merge","--no-ff","--no-edit",`origin/${b}`])}`);let o=await d(u,["merge","--no-ff","--no-edit",`origin/${b}`]);if(f(x,i,`合并 origin/${b} 到 ${e}`,o),0!==o.code){x.push(`[${i}] ${g(["merge","--abort"])}`);let t=await d(u,["merge","--abort"]);f(x,i,`终止合并到 ${e}`,t),A.push(`[${i}] 合并到 ${e} 冲突,已终止合并,请手动处理。`);let s=await E(i,u,p);U(i,!1,`合并到 ${e} 冲突`,s);continue e}x.push(`[${i}] ${g(["push","origin",e])}`);let n=await d(u,["push","origin",e]);if(f(x,i,`推送 ${e}`,n),0!==n.code){A.push(`[${i}] 推送 ${e} 失败: ${n.stderr||n.stdout}`);let t=await E(i,u,p);U(i,!1,`推送 ${e} 失败`,t);continue e}}U(i,!0)}if((0,h.isUatGitFlowAborted)(R))for(let e of F.reverse()){let{name:t,path:i,info:s}=e;if(s.originalBranch&&"HEAD"!==s.originalBranch){x.push(`[${t}] 回滚: ${g(["checkout",s.originalBranch])}`);let e=await d(i,["checkout",s.originalBranch]);f(x,t,`回滚切换分支 ${s.originalBranch}`,e)}if(s.createdLocalBranch&&!s.hadLocalBranch){x.push(`[${t}] 回滚: ${g(["branch","-D",b])}`);let e=await d(i,["branch","-D",b]);f(x,t,`回滚删除本地分支 ${b}`,e)}}return s.NextResponse.json({success:0===A.length,operationLogs:x,feedbacks:A,projectResults:S})}catch(e){return console.error("UAT git 操作流执行失败:",e),s.NextResponse.json({success:!1,operationLogs:[],feedbacks:[e instanceof Error?e.message:"执行失败"]},{status:500})}finally{for(let e of r)try{await (0,l.cleanupTempExecutionRepo)(e)}catch(t){console.error(`清理临时目录失败: ${e}`,t)}t&&(0,h.clearUatGitFlowState)(t)}}}},7044:e=>{"use strict";var{g:t,__dirname:i}=e;{e.s({patchFetch:()=>n,routeModule:()=>t,serverHooks:()=>c,workAsyncStorage:()=>i,workUnitAsyncStorage:()=>u});var s=e.i(45746),r=e.i(93828),a=e.i(18250),o=e.i(32970);let t=new s.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/uat-git-flow/route",pathname:"/api/uat-git-flow",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/uat-git-flow/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:i,workUnitAsyncStorage:u,serverHooks:c}=t;function n(){return(0,a.patchFetch)({workAsyncStorage:i,workUnitAsyncStorage:u})}}}};
2
2
 
3
3
  //# sourceMappingURL=_61c263b3._.js.map