prime-dev-cli 2.0.7 → 2.0.9

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 (98) hide show
  1. package/config/projects.json +80 -24
  2. package/dist/server/.next/BUILD_ID +1 -1
  3. package/dist/server/.next/app-build-manifest.json +3 -3
  4. package/dist/server/.next/build-manifest.json +2 -2
  5. package/dist/server/.next/cache/.rscinfo +1 -1
  6. package/dist/server/.next/cache/.tsbuildinfo +1 -1
  7. package/dist/server/.next/cache/eslint/.cache_1qa5vxt +1 -1
  8. package/dist/server/.next/fallback-build-manifest.json +2 -2
  9. package/dist/server/.next/next-minimal-server.js.nft.json +1 -1
  10. package/dist/server/.next/next-server.js.nft.json +1 -1
  11. package/dist/server/.next/prerender-manifest.json +3 -3
  12. package/dist/server/.next/server/app/_not-found.html +1 -1
  13. package/dist/server/.next/server/app/_not-found.rsc +1 -1
  14. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route.js.nft.json +1 -1
  15. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route.js.nft.json +1 -1
  16. package/dist/server/.next/server/app/api/admin-git-batch-merge/route.js.nft.json +1 -1
  17. package/dist/server/.next/server/app/api/admin-git-batch-probe-remote-branch/route.js.nft.json +1 -1
  18. package/dist/server/.next/server/app/api/batch-list-branches/route.js +1 -1
  19. package/dist/server/.next/server/app/api/batch-list-branches/route.js.nft.json +1 -1
  20. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route.js +1 -1
  21. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route.js.nft.json +1 -1
  22. package/dist/server/.next/server/app/api/batch-switch-branch/route.js.nft.json +1 -1
  23. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route.js.nft.json +1 -1
  24. package/dist/server/.next/server/app/api/branch/switch/route.js.nft.json +1 -1
  25. package/dist/server/.next/server/app/api/branches/route.js.nft.json +1 -1
  26. package/dist/server/.next/server/app/api/check-workspace/route.js.nft.json +1 -1
  27. package/dist/server/.next/server/app/api/gwh-git-flow/route.js.nft.json +1 -1
  28. package/dist/server/.next/server/app/api/initialize-workspace/route.js.nft.json +1 -1
  29. package/dist/server/.next/server/app/api/microapp-proxy-config/route.js.nft.json +1 -1
  30. package/dist/server/.next/server/app/api/open-project/route.js.nft.json +1 -1
  31. package/dist/server/.next/server/app/api/project-config/route.js.nft.json +1 -1
  32. package/dist/server/.next/server/app/api/retry-project/route.js.nft.json +1 -1
  33. package/dist/server/.next/server/app/api/submodule-info/route.js.nft.json +1 -1
  34. package/dist/server/.next/server/app/api/uat-git-flow/route.js +2 -2
  35. package/dist/server/.next/server/app/api/uat-git-flow/route.js.nft.json +1 -1
  36. package/dist/server/.next/server/app/api/uat-git-flow/step/route.js +2 -2
  37. package/dist/server/.next/server/app/api/uat-git-flow/step/route.js.nft.json +1 -1
  38. package/dist/server/.next/server/app/configuration/page/app-build-manifest.json +1 -1
  39. package/dist/server/.next/server/app/configuration/page_client-reference-manifest.js +1 -1
  40. package/dist/server/.next/server/app/configuration.html +1 -1
  41. package/dist/server/.next/server/app/configuration.rsc +2 -2
  42. package/dist/server/.next/server/app/index.html +1 -1
  43. package/dist/server/.next/server/app/index.rsc +1 -1
  44. package/dist/server/.next/server/app/initialization/page/app-build-manifest.json +2 -2
  45. package/dist/server/.next/server/app/initialization/page.js.nft.json +1 -1
  46. package/dist/server/.next/server/app/initialization/page_client-reference-manifest.js +1 -1
  47. package/dist/server/.next/server/app/initialization.html +1 -1
  48. package/dist/server/.next/server/app/initialization.rsc +2 -2
  49. package/dist/server/.next/server/chunks/[root-of-the-server]__6c7b8215._.js +3 -0
  50. package/dist/server/.next/server/chunks/[root-of-the-server]__6c7b8215._.js.map +1 -0
  51. package/dist/server/.next/server/chunks/[root-of-the-server]__c52380bc._.js +3 -0
  52. package/dist/server/.next/server/chunks/[root-of-the-server]__c52380bc._.js.map +1 -0
  53. package/dist/server/.next/server/chunks/_24087f66._.js +1 -1
  54. package/dist/server/.next/server/chunks/_24087f66._.js.map +1 -1
  55. package/dist/server/.next/server/chunks/_61c263b3._.js +1 -1
  56. package/dist/server/.next/server/chunks/_61c263b3._.js.map +1 -1
  57. package/dist/server/.next/server/chunks/packages_server_42b02aec._.js +3 -0
  58. package/dist/server/.next/server/chunks/packages_server_42b02aec._.js.map +1 -0
  59. package/dist/server/.next/server/chunks/packages_server_854cbe00._.js +3 -0
  60. package/dist/server/.next/server/chunks/packages_server_854cbe00._.js.map +1 -0
  61. package/dist/server/.next/server/chunks/ssr/_283bdc73._.js +1 -1
  62. package/dist/server/.next/server/chunks/ssr/_283bdc73._.js.map +1 -1
  63. package/dist/server/.next/server/chunks/ssr/_c7905e3c._.js +1 -1
  64. package/dist/server/.next/server/chunks/ssr/_c7905e3c._.js.map +1 -1
  65. package/dist/server/.next/server/chunks/ssr/packages_server_src_622c27d6._.js +3 -0
  66. package/dist/server/.next/server/chunks/ssr/packages_server_src_622c27d6._.js.map +1 -0
  67. package/dist/server/.next/server/pages/404.html +1 -1
  68. package/dist/server/.next/server/pages/500.html +1 -1
  69. package/dist/server/.next/server/server-reference-manifest.js +1 -1
  70. package/dist/server/.next/server/server-reference-manifest.json +1 -1
  71. package/dist/server/.next/static/chunks/16b23f7570a551e1.js +3 -0
  72. package/dist/server/.next/static/chunks/{736431eeff70b2b7.js → 4e8de43e1f6c5336.js} +2 -2
  73. package/dist/server/.next/static/chunks/{51509164bafe1e57.js.map → 84a2f16086c26ab1.js.map} +1 -1
  74. package/dist/server/.next/static/chunks/b109f2fb91f36e31.js.map +1 -0
  75. package/dist/server/.next/static/chunks/{1ae3fa2333c12687.js → f3137530db91c282.js} +2 -2
  76. package/dist/server/.next/static/chunks/{227a962f4584edf8.js.map → fa09d2a29cc42906.js.map} +1 -1
  77. package/dist/server/.next/trace +2 -2
  78. package/package.json +1 -1
  79. package/plugin-marketplace/plugins/prime-dev-cli/skills/prime-workspace/SKILL.md +112 -22
  80. package/skills/prime-workspace/README.md +20 -2
  81. package/skills/prime-workspace/SKILL.md +510 -214
  82. package/skills/prime-workspace/references/api-contracts.md +125 -0
  83. package/skills/prime-workspace/references/microfrontend-proxy.md +155 -0
  84. package/dist/server/.next/server/chunks/[root-of-the-server]__131fe141._.js +0 -3
  85. package/dist/server/.next/server/chunks/[root-of-the-server]__131fe141._.js.map +0 -1
  86. package/dist/server/.next/server/chunks/[root-of-the-server]__36b87de0._.js +0 -3
  87. package/dist/server/.next/server/chunks/[root-of-the-server]__36b87de0._.js.map +0 -1
  88. package/dist/server/.next/server/chunks/packages_server_ccc16996._.js +0 -3
  89. package/dist/server/.next/server/chunks/packages_server_ccc16996._.js.map +0 -1
  90. package/dist/server/.next/server/chunks/packages_server_d1209331._.js +0 -3
  91. package/dist/server/.next/server/chunks/packages_server_d1209331._.js.map +0 -1
  92. package/dist/server/.next/server/chunks/ssr/packages_server_src_65e3de99._.js +0 -3
  93. package/dist/server/.next/server/chunks/ssr/packages_server_src_65e3de99._.js.map +0 -1
  94. package/dist/server/.next/static/chunks/6f824bb5811ceebd.js +0 -3
  95. package/dist/server/.next/static/chunks/f9854e63365b2956.js.map +0 -1
  96. /package/dist/server/.next/static/{Dz7Ultbv0aaqF3m4OrOHQ → zjt6jXsNQxDdU-RHF8TC7}/_buildManifest.js +0 -0
  97. /package/dist/server/.next/static/{Dz7Ultbv0aaqF3m4OrOHQ → zjt6jXsNQxDdU-RHF8TC7}/_clientMiddlewareManifest.json +0 -0
  98. /package/dist/server/.next/static/{Dz7Ultbv0aaqF3m4OrOHQ → zjt6jXsNQxDdU-RHF8TC7}/_ssgManifest.js +0 -0
@@ -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 | '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":"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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 {\n UAT_BASE_BRANCH_OPTIONS,\n isAllowedUatBaseBranch,\n getUatFinalMergeTargets,\n} from '@/lib/uat-base-branch';\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/${baseBranch}`,\n args: ['ls-remote', '--heads', 'origin', baseBranch],\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: `切换到 ${baseBranch}`,\n args: ['checkout', baseBranch],\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} 到 ${baseBranch}`,\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: `终止合并到 ${baseBranch}`,\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: `推送 ${baseBranch}`,\n args: ['push', 'origin', baseBranch],\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/${run.baseBranch} 不存在,无法合并。`);\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}] 工作区有未提交改动,请先处理后再合并 ${run.baseBranch}。`);\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}] 切换到 ${run.baseBranch} 失败: ${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}] 合并到 ${run.baseBranch} 冲突,准备终止合并。`);\n }\n break;\n }\n case 'need-merge-into-main-abort': {\n if (result.code !== 0) {\n run.feedbacks.push(`[${project.name}] 终止合并到 ${run.baseBranch} 失败: ${result.stderr || result.stdout}`);\n }\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 合并到 ${run.baseBranch} 冲突,已终止合并,请手动处理。`);\n break;\n }\n case 'need-push-main': {\n if (result.code === 0) {\n // 来源为 main-new 时只合回自身,不再走 fix/main 这一段\n if (getUatFinalMergeTargets(run.baseBranch).includes('fix/main')) {\n project.phase = 'need-fix-main-fetch';\n } else {\n project.status = 'done';\n project.phase = 'done';\n }\n } else {\n project.status = 'failed';\n run.feedbacks.push(`[${project.name}] 推送 ${run.baseBranch} 失败: ${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 (!isAllowedUatBaseBranch(baseBranch)) {\n return NextResponse.json({\n success: false,\n operationLogs,\n feedbacks: [`UAT 操作流从 origin 分支创建仅支持:${UAT_BASE_BRANCH_OPTIONS.join('、')}。`],\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,3 +1,3 @@
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})}}}};
1
+ module.exports={32970:e=>{"use strict";var{g:t,__dirname:i}=e;{e.s({POST:()=>m});var r=e.i(15494),o=e.i(87485),s=e.i(83886),a=e.i(30331),n=e.i(88941),u=e.i(35692),c=e.i(77159),h=e.i(90926),$=e.i(79810),l=e.i(34926),p=e.i(33808);let t=/\\s/;function d(e){return!(!e||t.test(e)||e.startsWith("-"))}function g(e,t){return new Promise((i,r)=>{let s=(0,o.spawn)("git",t,{cwd:e,stdio:["ignore","pipe","pipe"]}),a="",n="";s.stdout?.on("data",e=>{a+=e.toString()}),s.stderr?.on("data",e=>{n+=e.toString()}),s.on("close",e=>{i({code:e,stdout:a,stderr:n})}),s.on("error",e=>{r(e)})})}function f(e){return`git ${e.join(" ")}`}function w(e,t,i,r){0===r.code?e.push(`[${t}] 完成: ${i}`):e.push(`[${t}] 失败: ${i} ${r.stderr||r.stdout}`)}function k(e,t,i,r){let o=(0,l.appendIgnoredPathsFromCheckoutWarning)(r.stderr,i.ignoredUntrackedPaths);o.length>0&&e.push(`[${t}] 提示: 检测到子模块残留目录 ${o.join(", ")},状态检查将忽略对应未跟踪路径`)}async function m(e){let t="",i=new Set;try{let o=await e.json(),m=Array.isArray(o.projects)?o.projects:[],B="string"==typeof o.createBranch?o.createBranch.trim():"",b="string"==typeof o.baseBranch?o.baseBranch.trim():"",y="string"==typeof o.mergeBranch?o.mergeBranch.trim():"",A=!!o.dryRun,P="string"==typeof o.runId?o.runId:"",j=[],R=[],S=[],U=new Map,v=(e,t,i,r)=>{U.has(e)||(U.set(e,{success:t,reason:i,rollbackActions:r}),S.push({projectName:e,success:t,reason:i,rollbackActions:r}))},x=async(e,t,i)=>{let r=[];if(i.originalBranch&&"HEAD"!==i.originalBranch){let o=f(["checkout",i.originalBranch]);j.push(`[${e}] 回滚: ${o}`);let s=await g(t,["checkout",i.originalBranch]);w(j,e,`回滚切换分支 ${i.originalBranch}`,s),r.push(o)}if(i.createdLocalBranch&&!i.hadLocalBranch){let i=f(["branch","-D",B]);j.push(`[${e}] 回滚: ${i}`);let o=await g(t,["branch","-D",B]);w(j,e,`回滚删除本地分支 ${B}`,o),r.push(i)}return r};if(0===m.length||!B||!b||!y)return r.NextResponse.json({success:!1,operationLogs:j,feedbacks:["缺少必要参数,请填写完整后重试。"]},{status:400});if(!(0,h.isAllowedUatBaseBranch)(b))return r.NextResponse.json({success:!1,operationLogs:j,feedbacks:[`UAT 操作流从 origin 分支创建仅支持:${h.UAT_BASE_BRANCH_OPTIONS.join("、")}。`]},{status:400});if(!d(B)||!d(b)||!d(y))return r.NextResponse.json({success:!1,operationLogs:j,feedbacks:["分支名称不合法,请避免空格或以 - 开头。"]},{status:400});if(!P)return r.NextResponse.json({success:!1,operationLogs:j,feedbacks:["缺少 runId,请刷新页面后重试。"]},{status:400});(0,$.createUatGitFlowState)(P),t=P;let E=(0,h.getUatFinalMergeTargets)(b),N=await (0,u.getProjectsConfig)(),O=n.WORKSPACE_CONFIG.WORKSPACE_ROOT,T=[],C=()=>(0,$.isUatGitFlowAborted)(P);e:for(let e of m){if(C()){R.push("已收到中断请求,开始回滚已执行的本地操作。");break}let t=String(e),r=(0,c.sanitizeProjectName)(t);if(!r||r!==t){j.push(`[${t}] 失败: 项目名称包含无效字符`),R.push(`[${t}] 项目名称包含无效字符,已跳过。`),v(t,!1,"项目名称包含无效字符");continue}if(!N[r]){j.push(`[${r}] 失败: 未在项目配置中找到`),R.push(`[${r}] 未在项目配置中找到,已跳过。`),v(r,!1,"未在项目配置中找到");continue}let o=(0,a.join)(O,r);if(!(0,s.existsSync)(o)){j.push(`[${r}] 失败: 项目目录不存在`),R.push(`[${r}] 项目目录不存在,已跳过。`),v(r,!1,"项目目录不存在");continue}if(!(0,s.existsSync)((0,a.join)(o,".git"))){j.push(`[${r}] 失败: 非 Git 仓库`),R.push(`[${r}] 不是有效的 Git 仓库,已跳过。`),v(r,!1,"不是有效的 Git 仓库");continue}if(A){for(let e of(j.push(`[${r}] ${f(["fetch","origin"])}`),j.push(`[${r}] ${f(["ls-remote","--heads","origin",b])}`),j.push(`[${r}] ${f(["ls-remote","--heads","origin",B])}`),j.push(`[${r}] ${f(["show-ref","--verify",`refs/heads/${B}`])}`),j.push(`[${r}] ${f(["checkout","-B",B,`origin/${b}`])}`),j.push(`[${r}] ${f(["push","-u","origin",B])}`),j.push(`[${r}] ${f(["ls-remote","--heads","origin",y])}`),j.push(`[${r}] ${f(["status","--porcelain","--untracked-files=all"])}`),j.push(`[${r}] ${f(["checkout",B])}`),j.push(`[${r}] ${f(["merge","--no-ff","--no-edit",`origin/${y}`])}`),j.push(`[${r}] ${f(["push","origin",B])}`),E))j.push(`[${r}] ${f(["fetch","origin"])}`),j.push(`[${r}] ${f(["ls-remote","--heads","origin",e])}`),j.push(`[${r}] ${f(["status","--porcelain","--untracked-files=all"])}`),j.push(`[${r}] ${f(["checkout",e])}`),j.push(`[${r}] ${f(["merge","--no-ff","--no-edit",`origin/${B}`])}`),j.push(`[${r}] ${f(["push","origin",e])}`);continue}let n=await (0,p.createTempExecutionRepo)(o,r);if(!n.success){j.push(`[${r}] 失败: 创建临时执行仓库失败 ${n.error}`),R.push(`[${r}] 创建临时执行仓库失败: ${n.error}`),v(r,!1,"创建临时执行仓库失败");continue}let u=n.value.projectPath;i.add(n.value.tempRootPath),j.push(`[${r}] 使用临时目录执行: ${u}`),j.push(`[${r}] 检查当前分支`);let h=await g(u,["branch","--show-current"]);w(j,r,"当前分支检查",h);let $={originalBranch:h.stdout.replace(/\s+/g," ").trim()||"HEAD",createdLocalBranch:!1,hadLocalBranch:!0,ignoredUntrackedPaths:new Set};j.push(`[${r}] ${f(["fetch","origin"])}`);let d=await g(u,["fetch","origin"]);if(w(j,r,"拉取远端",d),0!==d.code){R.push(`[${r}] 拉取远端失败: ${d.stderr||d.stdout}`);let e=await x(r,u,$);v(r,!1,"拉取远端失败",e);continue}j.push(`[${r}] ${f(["ls-remote","--heads","origin",b])}`);let m=await g(u,["ls-remote","--heads","origin",b]);if(w(j,r,`检查 origin/${b}`,m),!m.stdout.trim()){R.push(`[${r}] origin/${b} 不存在,无法创建分支。`);let e=await x(r,u,$);v(r,!1,`origin/${b} 不存在`,e);continue}j.push(`[${r}] ${f(["ls-remote","--heads","origin",B])}`);let P=await g(u,["ls-remote","--heads","origin",B]);w(j,r,`检查远端分支 ${B}`,P),j.push(`[${r}] ${f(["show-ref","--verify",`refs/heads/${B}`])}`);let S=await g(u,["show-ref","--verify",`refs/heads/${B}`]);if(w(j,r,`检查本地分支 ${B}`,S),0===S.code){j.push(`[${r}] ${f(["checkout",B])}`);let e=await g(u,["checkout",B]);if(w(j,r,`切换到本地分支 ${B}`,e),k(j,r,$,e),0!==e.code){R.push(`[${r}] 切换到本地分支失败: ${e.stderr||e.stdout}`);let t=await x(r,u,$);v(r,!1,"切换到本地分支失败",t);continue}j.push(`[${r}] ${f(["fetch","origin"])}`);let t=await g(u,["fetch","origin"]);if(w(j,r,"拉取远端",t),0!==t.code){R.push(`[${r}] 拉取远端失败: ${t.stderr||t.stdout}`);let e=await x(r,u,$);v(r,!1,"拉取远端失败",e);continue}}else if($.hadLocalBranch=!1,P.stdout.trim()){j.push(`[${r}] ${f(["checkout","-B",B,`origin/${B}`])}`);let e=await g(u,["checkout","-B",B,`origin/${B}`]);if(w(j,r,`切换到远端分支 ${B}`,e),k(j,r,$,e),0!==e.code){R.push(`[${r}] 切换到已有远端分支失败: ${e.stderr||e.stdout}`);let t=await x(r,u,$);v(r,!1,"切换到已有远端分支失败",t);continue}}else{j.push(`[${r}] ${f(["checkout","-B",B,`origin/${b}`])}`);let e=await g(u,["checkout","-B",B,`origin/${b}`]);if(w(j,r,`创建分支 ${B}`,e),k(j,r,$,e),0!==e.code){R.push(`[${r}] 创建分支失败: ${e.stderr||e.stdout}`);let t=await x(r,u,$);v(r,!1,"创建分支失败",t);continue}$.createdLocalBranch=!0,j.push(`[${r}] ${f(["push","-u","origin",B])}`);let t=await g(u,["push","-u","origin",B]);if(w(j,r,`推送分支 ${B}`,t),0!==t.code){R.push(`[${r}] 推送新分支失败: ${t.stderr||t.stdout}`);let e=await x(r,u,$);v(r,!1,"推送新分支失败",e);continue}}j.push(`[${r}] ${f(["ls-remote","--heads","origin",y])}`);let U=await g(u,["ls-remote","--heads","origin",y]);if(w(j,r,`检查 origin/${y}`,U),!U.stdout.trim()){R.push(`[${r}] origin/${y} 不存在,无法合并。`);let e=await x(r,u,$);v(r,!1,`origin/${y} 不存在`,e);continue}if(T.push({name:r,path:u,info:$}),C()){R.push("已收到中断请求,开始回滚已执行的本地操作。");break}j.push(`[${r}] ${f(["status","--porcelain","--untracked-files=all"])}`);let F=await g(u,["status","--porcelain","--untracked-files=all"]);if(w(j,r,"检查工作区",F),(0,l.hasBlockingWorkspaceChanges)(F.stdout,$.ignoredUntrackedPaths)){R.push(`[${r}] 工作区有未提交改动,请先处理后再执行合并。`);let e=await x(r,u,$);v(r,!1,"工作区有未提交改动",e);continue}j.push(`[${r}] ${f(["checkout",B])}`);let L=await g(u,["checkout",B]);if(w(j,r,`切换到分支 ${B}`,L),k(j,r,$,L),0!==L.code){R.push(`[${r}] 切换到分支失败: ${L.stderr||L.stdout}`);let e=await x(r,u,$);v(r,!1,"切换到分支失败",e);continue}j.push(`[${r}] ${f(["merge","--no-ff","--no-edit",`origin/${y}`])}`);let G=await g(u,["merge","--no-ff","--no-edit",`origin/${y}`]);if(w(j,r,`合并 origin/${y}`,G),0!==G.code){j.push(`[${r}] ${f(["merge","--abort"])}`);let e=await g(u,["merge","--abort"]);w(j,r,"终止合并",e),R.push(`[${r}] 合并冲突,已终止合并,请手动处理。`);let t=await x(r,u,$);v(r,!1,"合并冲突",t);continue}j.push(`[${r}] ${f(["push","origin",B])}`);let D=await g(u,["push","origin",B]);if(w(j,r,`推送合并结果 ${B}`,D),0!==D.code){R.push(`[${r}] 推送合并结果失败: ${D.stderr||D.stdout}`);let e=await x(r,u,$);v(r,!1,"推送合并结果失败",e);continue}for(let e of E){j.push(`[${r}] ${f(["fetch","origin"])}`);let t=await g(u,["fetch","origin"]);if(w(j,r,"拉取远端",t),0!==t.code){R.push(`[${r}] 拉取远端失败: ${t.stderr||t.stdout}`);let e=await x(r,u,$);v(r,!1,"拉取远端失败",e);continue e}j.push(`[${r}] ${f(["ls-remote","--heads","origin",e])}`);let i=await g(u,["ls-remote","--heads","origin",e]);if(w(j,r,`检查 origin/${e}`,i),!i.stdout.trim()){R.push(`[${r}] origin/${e} 不存在,无法合并。`);let t=await x(r,u,$);v(r,!1,`origin/${e} 不存在`,t);continue e}j.push(`[${r}] ${f(["status","--porcelain","--untracked-files=all"])}`);let o=await g(u,["status","--porcelain","--untracked-files=all"]);if(w(j,r,"检查工作区",o),(0,l.hasBlockingWorkspaceChanges)(o.stdout,$.ignoredUntrackedPaths)){R.push(`[${r}] 工作区有未提交改动,请先处理后再合并 ${e}。`);let t=await x(r,u,$);v(r,!1,"工作区有未提交改动",t);continue e}j.push(`[${r}] ${f(["checkout",e])}`);let s=await g(u,["checkout",e]);if(w(j,r,`切换到 ${e}`,s),k(j,r,$,s),0!==s.code){R.push(`[${r}] 切换到 ${e} 失败: ${s.stderr||s.stdout}`);let t=await x(r,u,$);v(r,!1,`切换到 ${e} 失败`,t);continue e}j.push(`[${r}] ${f(["merge","--no-ff","--no-edit",`origin/${B}`])}`);let a=await g(u,["merge","--no-ff","--no-edit",`origin/${B}`]);if(w(j,r,`合并 origin/${B} 到 ${e}`,a),0!==a.code){j.push(`[${r}] ${f(["merge","--abort"])}`);let t=await g(u,["merge","--abort"]);w(j,r,`终止合并到 ${e}`,t),R.push(`[${r}] 合并到 ${e} 冲突,已终止合并,请手动处理。`);let i=await x(r,u,$);v(r,!1,`合并到 ${e} 冲突`,i);continue e}j.push(`[${r}] ${f(["push","origin",e])}`);let n=await g(u,["push","origin",e]);if(w(j,r,`推送 ${e}`,n),0!==n.code){R.push(`[${r}] 推送 ${e} 失败: ${n.stderr||n.stdout}`);let t=await x(r,u,$);v(r,!1,`推送 ${e} 失败`,t);continue e}}v(r,!0)}if((0,$.isUatGitFlowAborted)(P))for(let e of T.reverse()){let{name:t,path:i,info:r}=e;if(r.originalBranch&&"HEAD"!==r.originalBranch){j.push(`[${t}] 回滚: ${f(["checkout",r.originalBranch])}`);let e=await g(i,["checkout",r.originalBranch]);w(j,t,`回滚切换分支 ${r.originalBranch}`,e)}if(r.createdLocalBranch&&!r.hadLocalBranch){j.push(`[${t}] 回滚: ${f(["branch","-D",B])}`);let e=await g(i,["branch","-D",B]);w(j,t,`回滚删除本地分支 ${B}`,e)}}return r.NextResponse.json({success:0===R.length,operationLogs:j,feedbacks:R,projectResults:S})}catch(e){return console.error("UAT git 操作流执行失败:",e),r.NextResponse.json({success:!1,operationLogs:[],feedbacks:[e instanceof Error?e.message:"执行失败"]},{status:500})}finally{for(let e of i)try{await (0,p.cleanupTempExecutionRepo)(e)}catch(t){console.error(`清理临时目录失败: ${e}`,t)}t&&(0,$.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 r=e.i(45746),o=e.i(93828),s=e.i(18250),a=e.i(32970);let t=new r.AppRouteRouteModule({definition:{kind:o.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:a}),{workAsyncStorage:i,workUnitAsyncStorage:u,serverHooks:c}=t;function n(){return(0,s.patchFetch)({workAsyncStorage:i,workUnitAsyncStorage:u})}}}};
2
2
 
3
3
  //# sourceMappingURL=_61c263b3._.js.map