prime-dev-cli 2.0.8 → 2.0.10

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 (86) 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 +9 -9
  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-switch-branch/route.js.nft.json +1 -1
  19. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route.js.nft.json +1 -1
  20. package/dist/server/.next/server/app/api/branch/switch/route.js.nft.json +1 -1
  21. package/dist/server/.next/server/app/api/branches/route.js.nft.json +1 -1
  22. package/dist/server/.next/server/app/api/check-workspace/route.js.nft.json +1 -1
  23. package/dist/server/.next/server/app/api/gwh-git-flow/route.js.nft.json +1 -1
  24. package/dist/server/.next/server/app/api/initialize-workspace/route.js.nft.json +1 -1
  25. package/dist/server/.next/server/app/api/microapp-proxy-config/route.js.nft.json +1 -1
  26. package/dist/server/.next/server/app/api/open-project/route.js.nft.json +1 -1
  27. package/dist/server/.next/server/app/api/project-config/route.js.nft.json +1 -1
  28. package/dist/server/.next/server/app/api/retry-project/route.js.nft.json +1 -1
  29. package/dist/server/.next/server/app/api/submodule-info/route.js.nft.json +1 -1
  30. package/dist/server/.next/server/app/api/uat-git-flow/route.js +1 -1
  31. package/dist/server/.next/server/app/api/uat-git-flow/route.js.nft.json +1 -1
  32. package/dist/server/.next/server/app/api/uat-git-flow/step/route.js +1 -1
  33. package/dist/server/.next/server/app/api/uat-git-flow/step/route.js.nft.json +1 -1
  34. package/dist/server/.next/server/app/configuration/page/app-build-manifest.json +1 -1
  35. package/dist/server/.next/server/app/configuration/page_client-reference-manifest.js +1 -1
  36. package/dist/server/.next/server/app/configuration.html +1 -1
  37. package/dist/server/.next/server/app/configuration.rsc +2 -2
  38. package/dist/server/.next/server/app/index.html +1 -1
  39. package/dist/server/.next/server/app/index.rsc +1 -1
  40. package/dist/server/.next/server/app/initialization/page/app-build-manifest.json +2 -2
  41. package/dist/server/.next/server/app/initialization/page.js.nft.json +1 -1
  42. package/dist/server/.next/server/app/initialization/page_client-reference-manifest.js +1 -1
  43. package/dist/server/.next/server/app/initialization.html +1 -1
  44. package/dist/server/.next/server/app/initialization.rsc +2 -2
  45. package/dist/server/.next/server/chunks/_24087f66._.js +1 -1
  46. package/dist/server/.next/server/chunks/_24087f66._.js.map +1 -1
  47. package/dist/server/.next/server/chunks/_61c263b3._.js +1 -1
  48. package/dist/server/.next/server/chunks/_61c263b3._.js.map +1 -1
  49. package/dist/server/.next/server/chunks/packages_server_42b02aec._.js +3 -0
  50. package/dist/server/.next/server/chunks/packages_server_42b02aec._.js.map +1 -0
  51. package/dist/server/.next/server/chunks/packages_server_854cbe00._.js +3 -0
  52. package/dist/server/.next/server/chunks/packages_server_854cbe00._.js.map +1 -0
  53. package/dist/server/.next/server/chunks/ssr/_283bdc73._.js +1 -1
  54. package/dist/server/.next/server/chunks/ssr/_283bdc73._.js.map +1 -1
  55. package/dist/server/.next/server/chunks/ssr/_c7905e3c._.js +1 -1
  56. package/dist/server/.next/server/chunks/ssr/_c7905e3c._.js.map +1 -1
  57. package/dist/server/.next/server/chunks/ssr/packages_server_src_622c27d6._.js +3 -0
  58. package/dist/server/.next/server/chunks/ssr/packages_server_src_622c27d6._.js.map +1 -0
  59. package/dist/server/.next/server/pages/404.html +1 -1
  60. package/dist/server/.next/server/pages/500.html +1 -1
  61. package/dist/server/.next/server/server-reference-manifest.js +1 -1
  62. package/dist/server/.next/server/server-reference-manifest.json +1 -1
  63. package/dist/server/.next/static/chunks/2dfd52ecb63ce530.js.map +1 -0
  64. package/dist/server/.next/static/chunks/{45543bd9f83f509f.js → 4e8de43e1f6c5336.js} +2 -2
  65. package/dist/server/.next/static/chunks/51016cbb3e241c61.js +3 -0
  66. package/dist/server/.next/static/chunks/{8e1056102ab0be45.js.map → 84a2f16086c26ab1.js.map} +1 -1
  67. package/dist/server/.next/static/chunks/{4c54a6f1b63a5c72.js → f3137530db91c282.js} +2 -2
  68. package/dist/server/.next/static/chunks/{0e959ec3ce9fc799.js.map → fa09d2a29cc42906.js.map} +1 -1
  69. package/dist/server/.next/trace +2 -2
  70. package/package.json +2 -2
  71. package/plugin-marketplace/plugins/prime-dev-cli/skills/prime-workspace/SKILL.md +112 -22
  72. package/skills/prime-workspace/README.md +20 -2
  73. package/skills/prime-workspace/SKILL.md +510 -214
  74. package/skills/prime-workspace/references/api-contracts.md +125 -0
  75. package/skills/prime-workspace/references/microfrontend-proxy.md +155 -0
  76. package/dist/server/.next/server/chunks/packages_server_ccc16996._.js +0 -3
  77. package/dist/server/.next/server/chunks/packages_server_ccc16996._.js.map +0 -1
  78. package/dist/server/.next/server/chunks/packages_server_d1209331._.js +0 -3
  79. package/dist/server/.next/server/chunks/packages_server_d1209331._.js.map +0 -1
  80. package/dist/server/.next/server/chunks/ssr/packages_server_src_65e3de99._.js +0 -3
  81. package/dist/server/.next/server/chunks/ssr/packages_server_src_65e3de99._.js.map +0 -1
  82. package/dist/server/.next/static/chunks/4608598ca6cc0991.js.map +0 -1
  83. package/dist/server/.next/static/chunks/fce82d5fa17f0367.js +0 -3
  84. /package/dist/server/.next/static/{TtpaZZwrnzkXloBpwEr24 → HajrbQiEu_dEojCWqcu4x}/_buildManifest.js +0 -0
  85. /package/dist/server/.next/static/{TtpaZZwrnzkXloBpwEr24 → HajrbQiEu_dEojCWqcu4x}/_clientMiddlewareManifest.json +0 -0
  86. /package/dist/server/.next/static/{TtpaZZwrnzkXloBpwEr24 → HajrbQiEu_dEojCWqcu4x}/_ssgManifest.js +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/server/src/components/BranchSwitcher.tsx","turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/components/project-initializer.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n} from '@/components/ui/dropdown-menu';\nimport { CheckIcon, ChevronDownIcon } from 'lucide-react';\nimport { filterBranchOptions } from '@/lib/branch-filter';\n\n// 子仓库固定路径:项目根目录下的 submodules/common\nconst SUB_PATH = 'submodules/common';\n\ninterface BranchSwitcherProps {\n projectName: string;\n /** sub: 子仓库形态(紫色 + common 标签);main: 主仓库形态(蓝色) */\n variant: 'main' | 'sub';\n /** 主仓库形态:切换成功后回调(用于通知子仓库组件重新检测) */\n onSwitched?: () => void;\n /** 子仓库形态:信号值变化时重新检测子仓库存在性(主仓库切换分支后触发) */\n refreshSignal?: number;\n}\n\ninterface BranchInfo {\n exists: boolean;\n currentBranch: string | null;\n detached: boolean;\n commitHash: string;\n}\n\n/**\n * 项目(或子仓库)分支展示与切换。\n * - 主仓库形态:项目卡片内展示当前项目分支,支持下拉搜索切换。\n * - 子仓库形态:展示 submodules/common 子仓库分支,仅在该子仓库被当前分支跟踪时展示。\n * 项目卡片已有项目名,子仓库标签只显示 common,不重复项目名。\n */\nexport default function BranchSwitcher({ projectName, variant, onSwitched, refreshSignal }: BranchSwitcherProps) {\n const isSub = variant === 'sub';\n\n // 当前分支信息:子仓库场景来自 submodule-info 检测;主仓库场景来自 branches 接口\n const [branchInfo, setBranchInfo] = useState<BranchInfo | null>(null);\n const [subModuleExists, setSubModuleExists] = useState<boolean | null>(null);\n\n // 下拉相关状态\n const [menuOpen, setMenuOpen] = useState(false);\n const [remoteBranches, setRemoteBranches] = useState<string[]>([]);\n const [branchesLoading, setBranchesLoading] = useState(false);\n const [branchesError, setBranchesError] = useState<string | null>(null);\n const [keyword, setKeyword] = useState('');\n const [switchingBranch, setSwitchingBranch] = useState<string | null>(null);\n\n // 切换失败 message 提示\n const [toastMessage, setToastMessage] = useState<string | null>(null);\n const toastTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const showToast = (message: string) => {\n setToastMessage(message);\n if (toastTimerRef.current) clearTimeout(toastTimerRef.current);\n toastTimerRef.current = setTimeout(() => setToastMessage(null), 5000);\n };\n\n // 获取当前分支信息\n const fetchCurrentBranch = useCallback(async () => {\n if (isSub) {\n // 子仓库场景:先检测子仓库是否存在(目录 + .git + gitlink 跟踪)\n try {\n const response = await fetch(\n `/api/submodule-info?project=${encodeURIComponent(projectName)}&subPath=${encodeURIComponent(SUB_PATH)}`\n );\n const result = await response.json();\n if (result.success && result.data) {\n setSubModuleExists(Boolean(result.data.exists));\n setBranchInfo(result.data);\n }\n } catch (err) {\n console.error(`获取子仓库信息失败 (${projectName}):`, err);\n }\n } else {\n // 主仓库场景:branches 接口同时返回当前分支\n try {\n const response = await fetch(`/api/branches?project=${encodeURIComponent(projectName)}`);\n const result = await response.json();\n if (result.success && result.data?.exists) {\n setBranchInfo({\n exists: true,\n currentBranch: result.data.currentBranch || null,\n detached: false,\n commitHash: '',\n });\n }\n } catch (err) {\n console.error(`获取项目分支信息失败 (${projectName}):`, err);\n }\n }\n }, [isSub, projectName]);\n\n // 获取远程分支列表(打开下拉时懒加载,每次重新获取)\n const fetchRemoteBranches = useCallback(async () => {\n setBranchesLoading(true);\n setBranchesError(null);\n try {\n const subPathParam = isSub ? `&subPath=${encodeURIComponent(SUB_PATH)}` : '';\n const response = await fetch(`/api/branches?project=${encodeURIComponent(projectName)}${subPathParam}`);\n const result = await response.json();\n if (result.success) {\n setRemoteBranches(result.data?.branches || []);\n } else {\n setBranchesError(result.error || '获取远程分支失败');\n }\n } catch (err) {\n console.error(`获取远程分支失败 (${projectName}):`, err);\n setBranchesError('网络请求失败');\n } finally {\n setBranchesLoading(false);\n }\n }, [isSub, projectName]);\n\n useEffect(() => {\n fetchCurrentBranch();\n // refreshSignal 变化(主仓库切换分支)时重新检测子仓库存在性\n }, [fetchCurrentBranch, refreshSignal]);\n\n // 组件卸载时清理定时器\n useEffect(() => {\n return () => {\n if (toastTimerRef.current) clearTimeout(toastTimerRef.current);\n };\n }, []);\n\n // 打开/关闭下拉\n const handleMenuOpenChange = (open: boolean) => {\n setMenuOpen(open);\n if (open) {\n setKeyword('');\n fetchRemoteBranches();\n }\n };\n\n // 切换分支\n const handleSwitchBranch = async (branchName: string) => {\n if (switchingBranch) return;\n if (branchName === branchInfo?.currentBranch) return;\n\n setSwitchingBranch(branchName);\n\n try {\n const response = await fetch('/api/branch/switch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(isSub\n ? { projectName, branchName, subPath: SUB_PATH }\n : { projectName, branchName }),\n });\n\n const result = await response.json();\n\n if (result.success) {\n setMenuOpen(false);\n setKeyword('');\n await fetchCurrentBranch();\n onSwitched?.();\n } else {\n // 切换失败:关闭下拉,message 提示原因,分支展示保持原样(操作无效)\n setMenuOpen(false);\n setKeyword('');\n showToast(result.error || '切换分支失败');\n }\n } catch (err) {\n console.error(`切换分支失败 (${projectName}):`, err);\n setMenuOpen(false);\n showToast('切换分支失败: 网络错误');\n } finally {\n setSwitchingBranch(null);\n }\n };\n\n // 子仓库形态:目录不存在或未被当前项目跟踪时,不展示\n if (isSub && subModuleExists === false) {\n return null;\n }\n\n // 当前显示名:detached 时显示短 commit hash\n const displayName = branchInfo\n ? branchInfo.detached\n ? branchInfo.commitHash\n ? `(detached) ${branchInfo.commitHash}`\n : '(detached)'\n : (branchInfo.currentBranch || '未知分支')\n : '';\n\n // 过滤 + 默认只展示前5项,更多靠搜索\n const { visible, total } = filterBranchOptions(remoteBranches, keyword);\n\n // 主仓库:蓝色区块;子仓库:紫色区块\n const containerClass = isSub\n ? 'flex items-center gap-1.5 px-2 py-1 bg-purple-50 border border-purple-200 rounded-md min-w-0'\n : 'flex items-center gap-1.5 px-2 py-1 bg-blue-50 border border-blue-200 rounded-md min-w-0';\n const labelClass = isSub\n ? 'text-xs font-medium text-purple-700 truncate shrink-0 max-w-[8rem]'\n : 'text-xs font-medium text-blue-700 truncate shrink-0 max-w-[8rem]';\n const triggerClass = isSub\n ? 'flex items-center gap-1 text-xs font-medium text-purple-800 hover:bg-purple-100 rounded px-1 transition-colors min-w-0'\n : 'flex items-center gap-1 text-xs font-medium text-blue-800 hover:bg-blue-100 rounded px-1 transition-colors min-w-0';\n\n return (\n <>\n <div className={containerClass}>\n {/* 子仓库形态显示 common 标签(卡片已有项目名,不再重复) */}\n {isSub && (\n <span\n className={labelClass}\n title={`子仓库: ${projectName}/${SUB_PATH}`}\n >\n common\n </span>\n )}\n <DropdownMenu open={menuOpen} onOpenChange={handleMenuOpenChange}>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={triggerClass}\n title={isSub\n ? `点击切换子仓库(${projectName}/submodules/common)分支`\n : `点击切换 ${projectName} 分支`}\n >\n <span className=\"truncate max-w-[10rem]\">{displayName}</span>\n <ChevronDownIcon className=\"size-3 opacity-60 shrink-0\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-72\">\n {/* 搜索框 */}\n <div className=\"p-1\">\n <Input\n value={keyword}\n onChange={(e) => setKeyword(e.target.value)}\n placeholder=\"搜索分支...\"\n className=\"h-8\"\n />\n </div>\n <DropdownMenuSeparator />\n\n {/* 加载中 */}\n {branchesLoading && (\n <div className=\"flex items-center justify-center gap-2 px-3 py-4 text-sm text-gray-500\">\n <span className=\"animate-spin w-3 h-3 border-2 border-blue-500 border-t-transparent rounded-full\"></span>\n 加载远程分支中...\n </div>\n )}\n\n {/* 加载失败 */}\n {!branchesLoading && branchesError && (\n <div className=\"px-3 py-3 text-sm\">\n <p className=\"text-red-600\">{branchesError}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={fetchRemoteBranches}\n className=\"mt-2 h-7 px-2 text-xs\"\n >\n 重试\n </Button>\n </div>\n )}\n\n {/* 无分支 / 无匹配 */}\n {!branchesLoading && !branchesError && remoteBranches.length === 0 && (\n <div className=\"px-3 py-4 text-sm text-gray-500\">暂无远程分支</div>\n )}\n {!branchesLoading && !branchesError && remoteBranches.length > 0 && total === 0 && (\n <div className=\"px-3 py-4 text-sm text-gray-500\">没有匹配的分支</div>\n )}\n\n {/* 分支列表 */}\n {!branchesLoading && !branchesError && total > 0 && (\n <div className=\"max-h-64 overflow-y-auto\">\n {visible.map((branch) => (\n <DropdownMenuItem\n key={branch}\n disabled={switchingBranch !== null}\n className=\"flex items-center justify-between\"\n onSelect={(e) => {\n e.preventDefault();\n handleSwitchBranch(branch);\n }}\n >\n <span className=\"min-w-0 flex-1 truncate\">{branch}</span>\n <span className=\"flex items-center gap-2 shrink-0\">\n {branch === branchInfo?.currentBranch && (\n <CheckIcon className=\"size-4 text-blue-600\" />\n )}\n {switchingBranch === branch && (\n <span className=\"animate-spin w-3 h-3 border-2 border-blue-500 border-t-transparent rounded-full\"></span>\n )}\n </span>\n </DropdownMenuItem>\n ))}\n {total > visible.length && (\n <div className=\"px-3 py-2 text-xs text-gray-400 border-t\">\n 共 {total} 个匹配分支,仅展示前 {visible.length} 项,更多请使用上方搜索\n </div>\n )}\n </div>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n {toastMessage && (\n <div className=\"fixed top-16 right-4 z-50 max-w-sm px-4 py-3 bg-red-50 border border-red-200 rounded-md shadow-lg text-sm text-red-600\">\n {toastMessage}\n </div>\n )}\n </>\n );\n}\n","import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ApiProxyRewrite {\n mode: 'none' | 'remove' | 'replace';\n targetPrefix?: string;\n}\n\nexport interface ApiProxyItem {\n prefix: string;\n proxyKey?: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n rewrite?: ApiProxyRewrite;\n}\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n envFileName: string;\n apiProxies: ApiProxyItem[];\n subApps?: string[];\n startCommand?: string;\n /**\n * 微应用路径标识:用于在共享宿主(micro-app 域名)下区分兄弟子应用。\n * 插件按 micro-app 元素的 default-page / url 是否“包含”该值来选中对应本地 host。\n * 例如 micro-components 为 \"/micro/components\"、360-icrc-site 为 \"/micro/360-icrc-site\"。\n */\n microPath?: string;\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n projectName?: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n}\n","\"use client\";\n\nimport { useEffect, useState, type ChangeEvent } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { Button } from '@/components/ui/button';\nimport { EditorSplitButton } from '@/components/EditorSplitButton';\nimport BranchSwitcher from '@/components/BranchSwitcher';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n} from '@/components/ui/dropdown-menu';\nimport { CheckIcon, ChevronDownIcon } from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { ProjectStatus } from '@/lib/workspace-types';\nimport { filterBranchOptions } from '@/lib/branch-filter';\nimport type { EditorType } from '@/lib/editor-operations';\n\ninterface ProjectState {\n name: string;\n status: ProjectStatus;\n progress: number;\n message: string;\n error?: string;\n canRetry: boolean;\n isOpening?: boolean;\n isCleaningUp?: boolean;\n needsCleanup?: boolean;\n logs?: Array<{type: 'stdout' | 'stderr' | 'progress', content: string, timestamp: number}>;\n}\n\ninterface InitializationState {\n isInitializing: boolean;\n isCompleted: boolean;\n isLoading: boolean;\n hasCompleted: boolean;\n globalProgress: number;\n globalMessage: string;\n projects: Record<string, ProjectState>;\n completionSummary?: {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n duration: number;\n };\n}\n\nexport function validateBatchProbeRemoteBranchForm(selectedProjects: string[], branchName: string): string[] {\n const feedbacks: string[] = [];\n\n if (selectedProjects.length === 0) {\n feedbacks.push('请先选择至少一个项目。');\n }\n\n if (!branchName.trim()) {\n feedbacks.push('请填写远端分支名称。');\n }\n\n return feedbacks;\n}\n\nexport function validateBatchSwitchBranchForm(selectedProjects: string[], branchName: string): string[] {\n const feedbacks: string[] = [];\n\n if (selectedProjects.length === 0) {\n feedbacks.push('请先选择至少一个项目。');\n }\n\n if (!branchName.trim()) {\n feedbacks.push('请选择目标分支。');\n }\n\n return feedbacks;\n}\n\nexport function buildBatchSwitchBranchPayload(projectName: string, branchName: string, dryRun: boolean) {\n return {\n projects: [projectName],\n branchName: branchName.trim(),\n dryRun,\n };\n}\n\nexport function validateBatchSwitchSubBranchForm(selectedProjects: string[], branchName: string): string[] {\n const feedbacks: string[] = [];\n\n if (selectedProjects.length === 0) {\n feedbacks.push('请先选择至少一个项目。');\n }\n\n if (!branchName.trim()) {\n feedbacks.push('请选择子仓库目标分支。');\n }\n\n return feedbacks;\n}\n\nexport function buildBatchSwitchSubBranchPayload(projectName: string, branchName: string, dryRun: boolean) {\n return {\n projects: [projectName],\n branchName: branchName.trim(),\n dryRun,\n };\n}\n\nexport function buildBatchProbeRemoteBranchPayload(projectName: string, branchName: string, dryRun: boolean) {\n return {\n projects: [projectName],\n branchName: branchName.trim(),\n dryRun,\n };\n}\n\nexport function mapProbeRemoteBranchResultText(result: { success: boolean; exists?: boolean }): string {\n if (result.exists === true) {\n return '存在';\n }\n\n if (result.exists === false) {\n return '不存在';\n }\n\n if (!result.success) {\n return '执行失败';\n }\n\n return '成功';\n}\n\nconst ProjectInitializer = () => {\n const router = useRouter();\n const [state, setState] = useState<InitializationState>({\n isInitializing: false,\n isCompleted: false,\n isLoading: true,\n hasCompleted: false,\n globalProgress: 0,\n globalMessage: '正在检查工作空间状态...',\n projects: {},\n });\n\n const [uatForm, setUatForm] = useState({\n selectedProjects: [] as string[],\n createBranch: 'release/',\n baseBranch: 'main',\n mergeBranch: 'feature/',\n });\n\n const [uatRunState, setUatRunState] = useState({\n isRunning: false,\n operationLogs: [] as string[],\n feedbacks: [] as string[],\n runId: '',\n });\n\n const [gwhForm, setGwhForm] = useState({\n selectedProjects: [] as string[],\n createBranch: 'release/',\n baseBranch: 'GWH',\n mergeBranch: 'feature/',\n });\n\n const [gwhRunState, setGwhRunState] = useState({\n isRunning: false,\n operationLogs: [] as string[],\n feedbacks: [] as string[],\n runId: '',\n });\n\n const [batchMergeForm, setBatchMergeForm] = useState({\n selectedProjects: [] as string[],\n targetBranch: 'main',\n sourceBranch: '',\n });\n\n const [batchMergeRunState, setBatchMergeRunState] = useState({\n isRunning: false,\n operationLogs: [] as string[],\n feedbacks: [] as string[],\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n\n const [batchCreateBranchForm, setBatchCreateBranchForm] = useState({\n selectedProjects: [] as string[],\n createBranch: '',\n baseBranch: 'main',\n });\n\n const [batchCreateBranchRunState, setBatchCreateBranchRunState] = useState({\n isRunning: false,\n operationLogs: [] as string[],\n feedbacks: [] as string[],\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n\n const [batchDeleteBranchForm, setBatchDeleteBranchForm] = useState({\n selectedProjects: [] as string[],\n branchName: '',\n });\n\n const [batchDeleteBranchRunState, setBatchDeleteBranchRunState] = useState({\n isRunning: false,\n operationLogs: [] as string[],\n feedbacks: [] as string[],\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n\n const [batchProbeBranchForm, setBatchProbeBranchForm] = useState({\n selectedProjects: [] as string[],\n branchName: '',\n });\n\n const [batchProbeBranchRunState, setBatchProbeBranchRunState] = useState({\n isRunning: false,\n operationLogs: [] as string[],\n feedbacks: [] as string[],\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n\n // 批量切换分支:表单与运行状态\n const [batchSwitchForm, setBatchSwitchForm] = useState({\n selectedProjects: [] as string[],\n branchName: '',\n });\n\n const [batchSwitchRunState, setBatchSwitchRunState] = useState({\n isRunning: false,\n operationLogs: [] as string[],\n feedbacks: [] as string[],\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n\n // 批量切换分支:分支下拉(聚合所有项目分支,支持搜索)\n const [batchSwitchBranchOptions, setBatchSwitchBranchOptions] = useState<string[]>([]);\n const [batchSwitchBranchesLoading, setBatchSwitchBranchesLoading] = useState(false);\n const [batchSwitchBranchesError, setBatchSwitchBranchesError] = useState<string | null>(null);\n const [batchSwitchMenuOpen, setBatchSwitchMenuOpen] = useState(false);\n const [batchSwitchKeyword, setBatchSwitchKeyword] = useState('');\n\n // 批量切换分支:结果对话框(非 admin 也可查看)\n const [batchSwitchProjectResults, setBatchSwitchProjectResults] = useState<Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n }>>([]);\n const [batchSwitchShowResultDialog, setBatchSwitchShowResultDialog] = useState(false);\n\n // 批量切换子仓库(submodules/common)分支:表单与运行状态\n const [batchSwitchSubForm, setBatchSwitchSubForm] = useState({\n selectedProjects: [] as string[],\n branchName: '',\n });\n\n const [batchSwitchSubRunState, setBatchSwitchSubRunState] = useState({\n isRunning: false,\n operationLogs: [] as string[],\n feedbacks: [] as string[],\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n\n // 批量切换子仓库分支:分支下拉(聚合各项目子仓库分支,支持搜索)\n const [batchSwitchSubBranchOptions, setBatchSwitchSubBranchOptions] = useState<string[]>([]);\n const [batchSwitchSubBranchesLoading, setBatchSwitchSubBranchesLoading] = useState(false);\n const [batchSwitchSubBranchesError, setBatchSwitchSubBranchesError] = useState<string | null>(null);\n const [batchSwitchSubMenuOpen, setBatchSwitchSubMenuOpen] = useState(false);\n const [batchSwitchSubKeyword, setBatchSwitchSubKeyword] = useState('');\n\n // 批量切换子仓库分支:结果对话框(非 admin 也可查看)\n const [batchSwitchSubProjectResults, setBatchSwitchSubProjectResults] = useState<Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n }>>([]);\n const [batchSwitchSubShowResultDialog, setBatchSwitchSubShowResultDialog] = useState(false);\n\n const [isAdmin, setIsAdmin] = useState(false);\n\n const [pendingStep, setPendingStep] = useState<{\n stepId: string;\n projectName: string;\n description: string;\n command: string;\n } | null>(null);\n const [isConfirmOpen, setIsConfirmOpen] = useState(false);\n const useStepConfirm = false;\n const [showResultDialog, setShowResultDialog] = useState(false);\n const [projectResults, setProjectResults] = useState<Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n rollbackActions?: string[];\n exists?: boolean;\n }>>([]);\n \n const [expandedLogs, setExpandedLogs] = useState<Record<string, boolean>>({});\n // 主仓库分支切换成功后递增对应项目的信号,用于通知子仓库分支组件重新检测\n const [branchSwitchSignals, setBranchSwitchSignals] = useState<Record<string, number>>({});\n\n // 页面加载时检查工作空间状态\n useEffect(() => {\n checkWorkspaceStatus();\n }, []);\n\n useEffect(() => {\n const fetchAdminStatus = async () => {\n try {\n const response = await fetch('/api/admin-status');\n const data = await response.json();\n setIsAdmin(Boolean(data?.isAdmin));\n } catch (error) {\n console.error('获取管理员状态失败:', error);\n setIsAdmin(false);\n }\n };\n fetchAdminStatus();\n }, []);\n\n // 检查工作空间状态\n const checkWorkspaceStatus = async () => {\n try {\n setState(prev => ({\n ...prev,\n isLoading: true,\n globalMessage: '正在检查工作空间状态...',\n }));\n\n const response = await fetch('/api/check-workspace');\n const data = await response.json();\n\n if (data.success) {\n const projectStates: Record<string, ProjectState> = {};\n data.projects.forEach((project: { name: string; status: ProjectStatus; message: string; needsCleanup?: boolean }) => {\n projectStates[project.name] = {\n name: project.name,\n status: project.status,\n progress: project.status === ProjectStatus.EXISTING ? 100 : 0,\n message: project.message,\n canRetry: false,\n needsCleanup: project.needsCleanup || false,\n };\n });\n\n setState(prev => ({\n ...prev,\n isLoading: false,\n projects: projectStates,\n globalMessage: data.message || '检查完成',\n }));\n } else {\n setState(prev => ({\n ...prev,\n isLoading: false,\n globalMessage: data.error || '检查工作空间状态失败',\n }));\n }\n } catch (error) {\n setState(prev => ({\n ...prev,\n isLoading: false,\n globalMessage: '无法连接到服务器,请刷新页面重试',\n }));\n console.error('检查工作空间状态失败:', error);\n }\n };\n\n // 开始初始化工作空间\n const startInitialization = () => {\n setState(prev => ({\n ...prev,\n isInitializing: true,\n isCompleted: false,\n hasCompleted: false,\n globalProgress: 0,\n globalMessage: '正在连接服务器...',\n projects: {},\n completionSummary: undefined,\n }));\n\n // 创建 EventSource 连接\n const eventSource = new EventSource('/api/initialize-workspace');\n\n eventSource.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n handleSSEMessage(data);\n } catch (error) {\n console.error('解析 SSE 消息失败:', error);\n }\n };\n\n eventSource.onerror = () => {\n setState(prev => {\n // 如果已经收到完成消息,则不显示错误(这是正常的连接关闭)\n if (prev.hasCompleted) {\n return prev;\n }\n \n return {\n ...prev,\n isInitializing: false,\n globalMessage: '连接服务器失败,请重试',\n };\n });\n eventSource.close();\n };\n\n // 监听连接关闭\n eventSource.addEventListener('error', () => {\n eventSource.close();\n });\n };\n\n // 处理 SSE 消息\n const handleSSEMessage = (data: {\n type: string;\n progress?: number;\n message?: string;\n projects?: string[];\n projectName?: string;\n error?: string;\n logType?: 'stdout' | 'stderr' | 'progress';\n content?: string;\n timestamp?: number;\n result?: {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n duration: number;\n };\n }) => {\n switch (data.type) {\n case 'initialization':\n case 'workspace_created':\n case 'projects_loaded':\n setState(prev => ({\n ...prev,\n globalProgress: (data.progress as number) || 0,\n globalMessage: (data.message as string) || '',\n }));\n \n // 如果收到项目列表,初始化项目状态\n if (data.projects && Array.isArray(data.projects)) {\n const projectStates: Record<string, ProjectState> = {};\n data.projects.forEach((projectName: string) => {\n projectStates[projectName] = {\n name: projectName,\n status: ProjectStatus.PENDING,\n progress: 0,\n message: '等待开始...',\n canRetry: false,\n };\n });\n setState(prev => ({ ...prev, projects: projectStates }));\n }\n break;\n\n case 'project_existing':\n if (data.projectName) {\n const projectName = data.projectName;\n setState(prev => ({\n ...prev,\n globalProgress: data.progress ?? prev.globalProgress,\n globalMessage: data.message ?? '',\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n status: ProjectStatus.EXISTING,\n message: '项目已存在',\n progress: 100,\n canRetry: false,\n },\n },\n }));\n }\n break;\n\n case 'project_start':\n if (data.projectName) {\n const projectName = data.projectName;\n setState(prev => ({\n ...prev,\n globalProgress: data.progress ?? prev.globalProgress,\n globalMessage: data.message ?? '',\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n status: ProjectStatus.CLONING,\n message: '开始克隆...',\n progress: 0,\n },\n },\n }));\n }\n break;\n\n case 'project_progress':\n if (data.projectName) {\n const projectName = data.projectName;\n setState(prev => ({\n ...prev,\n globalProgress: data.progress ?? prev.globalProgress,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n message: data.message ?? '',\n progress: Math.min(data.progress ?? 0, 100),\n },\n },\n }));\n }\n break;\n\n case 'project_success':\n if (data.projectName) {\n const projectName = data.projectName;\n setState(prev => ({\n ...prev,\n globalProgress: data.progress ?? prev.globalProgress,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n status: ProjectStatus.SUCCESS,\n message: '克隆成功',\n progress: 100,\n canRetry: false,\n },\n },\n }));\n }\n break;\n\n case 'project_failed':\n if (data.projectName) {\n const projectName = data.projectName;\n setState(prev => ({\n ...prev,\n globalProgress: data.progress ?? prev.globalProgress,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n status: ProjectStatus.FAILED,\n message: '克隆失败',\n error: data.error,\n canRetry: true,\n },\n },\n }));\n }\n break;\n\n case 'command_log':\n if (data.projectName && data.logType && data.content !== undefined && data.timestamp) {\n const projectName = data.projectName;\n const logType = data.logType as 'stdout' | 'stderr' | 'progress';\n const content = data.content as string;\n const timestamp = data.timestamp as number;\n \n setState(prev => ({\n ...prev,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n logs: [\n ...(prev.projects[projectName]?.logs || []),\n {\n type: logType,\n content: content,\n timestamp: timestamp,\n }\n ].slice(-1000), // 保留最新的1000条日志\n },\n },\n }));\n }\n break;\n\n case 'completion':\n setState(prev => ({\n ...prev,\n isInitializing: false,\n isCompleted: true,\n hasCompleted: true,\n globalProgress: 100,\n globalMessage: data.message ?? '初始化完成',\n completionSummary: data.result ? {\n success: data.result.success,\n totalProjects: data.result.totalProjects,\n successCount: data.result.successCount,\n failedCount: data.result.failedCount,\n duration: data.result.duration,\n } : undefined,\n }));\n break;\n\n case 'error':\n setState(prev => ({\n ...prev,\n isInitializing: false,\n hasCompleted: true,\n globalMessage: data.message ?? '发生错误',\n globalProgress: data.progress ?? prev.globalProgress,\n }));\n break;\n }\n };\n\n // 在编辑器中打开项目(使用 editor schema 协议)\n const openProject = async (projectName: string, editor: EditorType = 'cursor') => {\n setState(prev => ({\n ...prev,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n isOpening: true,\n },\n },\n }));\n\n try {\n const response = await fetch('/api/open-project', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ projectName, editor }),\n });\n\n const result = await response.json();\n\n if (result.success && result.editorUrl) {\n // 使用编辑器 schema 协议打开项目\n // 创建临时链接并点击,这样可以触发系统调用对应的编辑器应用程序\n const link = document.createElement('a');\n link.href = result.editorUrl;\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else {\n console.error('打开项目失败:', result.error);\n }\n\n setState(prev => ({\n ...prev,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n isOpening: false,\n },\n },\n }));\n } catch (error) {\n setState(prev => ({\n ...prev,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n isOpening: false,\n },\n },\n }));\n console.error('打开项目失败:', error);\n }\n };\n\n // 清理不完整的项目\n const cleanupProject = async (projectName: string) => {\n setState(prev => ({\n ...prev,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n isCleaningUp: true,\n },\n },\n }));\n\n try {\n const response = await fetch('/api/cleanup-project', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ projectName }),\n });\n\n const result = await response.json();\n\n if (result.success) {\n setState(prev => ({\n ...prev,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n status: ProjectStatus.PENDING,\n message: '已清理,待克隆',\n isCleaningUp: false,\n needsCleanup: false,\n },\n },\n }));\n } else {\n setState(prev => ({\n ...prev,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n isCleaningUp: false,\n error: result.error,\n },\n },\n }));\n }\n } catch (error) {\n setState(prev => ({\n ...prev,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n isCleaningUp: false,\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }));\n }\n };\n\n // 重试单个项目\n const retryProject = async (projectName: string) => {\n setState(prev => ({\n ...prev,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n status: ProjectStatus.RETRYING,\n message: '正在重试...',\n progress: 0,\n canRetry: false,\n },\n },\n }));\n\n try {\n const response = await fetch('/api/retry-project', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ projectName }),\n });\n\n const result = await response.json();\n\n setState(prev => ({\n ...prev,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n status: result.success ? ProjectStatus.SUCCESS : ProjectStatus.FAILED,\n message: result.message,\n error: result.error,\n progress: result.success ? 100 : prev.projects[projectName].progress,\n canRetry: !result.success,\n },\n },\n }));\n } catch (error) {\n setState(prev => ({\n ...prev,\n projects: {\n ...prev.projects,\n [projectName]: {\n ...prev.projects[projectName],\n status: ProjectStatus.FAILED,\n message: '重试失败',\n error: error instanceof Error ? error.message : String(error),\n canRetry: true,\n },\n },\n }));\n }\n };\n\n // 获取状态样式\n const getStatusColor = (status: ProjectStatus) => {\n switch (status) {\n case ProjectStatus.EXISTING:\n return 'text-green-600 bg-green-50 border-green-200';\n case ProjectStatus.SUCCESS:\n return 'text-green-600 bg-green-50 border-green-200';\n case ProjectStatus.FAILED:\n return 'text-red-600 bg-red-50 border-red-200';\n case ProjectStatus.INCOMPLETE:\n return 'text-orange-600 bg-orange-50 border-orange-200';\n case ProjectStatus.CLONING:\n case ProjectStatus.RETRYING:\n return 'text-blue-600 bg-blue-50 border-blue-200';\n case ProjectStatus.PENDING:\n return 'text-gray-600 bg-gray-50 border-gray-200';\n default:\n return 'text-gray-600 bg-gray-50 border-gray-200';\n }\n };\n\n const getStatusText = (status: ProjectStatus) => {\n switch (status) {\n case ProjectStatus.PENDING:\n return '待克隆';\n case ProjectStatus.EXISTING:\n return '已存在';\n case ProjectStatus.CLONING:\n return '克隆中';\n case ProjectStatus.SUCCESS:\n return '成功';\n case ProjectStatus.FAILED:\n return '失败';\n case ProjectStatus.INCOMPLETE:\n return '不完整';\n case ProjectStatus.RETRYING:\n return '重试中';\n default:\n return '未知';\n }\n };\n\n // 判断是否所有项目都已存在\n const isAllProjectsExisting = () => {\n const projectValues = Object.values(state.projects);\n return projectValues.length > 0 && \n projectValues.every(project => project.status === ProjectStatus.EXISTING);\n };\n\n // 导航到项目配置页面\n const navigateToProjectConfig = (projectName: string) => {\n router.push(`/configuration?project=${encodeURIComponent(projectName)}`);\n };\n\n const handleProjectSelection = (event: ChangeEvent<HTMLSelectElement>) => {\n const selectedProjects = Array.from(event.target.selectedOptions).map(option => option.value);\n setUatForm(prev => ({\n ...prev,\n selectedProjects,\n }));\n };\n\n const handleGwhProjectSelection = (event: ChangeEvent<HTMLSelectElement>) => {\n const selectedProjects = Array.from(event.target.selectedOptions).map(option => option.value);\n setGwhForm(prev => ({\n ...prev,\n selectedProjects,\n }));\n };\n\n const handleBatchMergeProjectSelection = (event: ChangeEvent<HTMLSelectElement>) => {\n const selectedProjects = Array.from(event.target.selectedOptions).map(option => option.value);\n setBatchMergeForm(prev => ({\n ...prev,\n selectedProjects,\n }));\n };\n\n const handleBatchCreateBranchProjectSelection = (event: ChangeEvent<HTMLSelectElement>) => {\n const selectedProjects = Array.from(event.target.selectedOptions).map(option => option.value);\n setBatchCreateBranchForm(prev => ({\n ...prev,\n selectedProjects,\n }));\n };\n\n const handleBatchDeleteBranchProjectSelection = (event: ChangeEvent<HTMLSelectElement>) => {\n const selectedProjects = Array.from(event.target.selectedOptions).map(option => option.value);\n setBatchDeleteBranchForm(prev => ({\n ...prev,\n selectedProjects,\n }));\n };\n\n const handleBatchProbeBranchProjectSelection = (event: ChangeEvent<HTMLSelectElement>) => {\n const selectedProjects = Array.from(event.target.selectedOptions).map(option => option.value);\n setBatchProbeBranchForm(prev => ({\n ...prev,\n selectedProjects,\n }));\n };\n\n const updateUatField = (\n field: 'createBranch' | 'baseBranch' | 'mergeBranch',\n value: string\n ) => {\n setUatForm(prev => ({\n ...prev,\n [field]: value,\n }));\n };\n\n const updateGwhField = (\n field: 'createBranch' | 'baseBranch' | 'mergeBranch',\n value: string\n ) => {\n setGwhForm(prev => ({\n ...prev,\n [field]: value,\n }));\n };\n\n const updateBatchMergeField = (\n field: 'targetBranch' | 'sourceBranch',\n value: string,\n ) => {\n setBatchMergeForm(prev => ({\n ...prev,\n [field]: value,\n }));\n };\n\n const updateBatchCreateBranchField = (\n field: 'createBranch' | 'baseBranch',\n value: string,\n ) => {\n setBatchCreateBranchForm(prev => ({\n ...prev,\n [field]: value,\n }));\n };\n\n const updateBatchDeleteBranchField = (value: string) => {\n setBatchDeleteBranchForm(prev => ({\n ...prev,\n branchName: value,\n }));\n };\n\n const updateBatchProbeBranchField = (value: string) => {\n setBatchProbeBranchForm(prev => ({\n ...prev,\n branchName: value,\n }));\n };\n\n const handleBatchSwitchProjectSelection = (event: ChangeEvent<HTMLSelectElement>) => {\n const selectedProjects = Array.from(event.target.selectedOptions).map(option => option.value);\n setBatchSwitchForm(prev => ({\n ...prev,\n selectedProjects,\n }));\n };\n\n const handleSelectBatchSwitchBranch = (branchName: string) => {\n setBatchSwitchForm(prev => ({\n ...prev,\n branchName,\n }));\n setBatchSwitchMenuOpen(false);\n setBatchSwitchKeyword('');\n };\n\n // 打开分支下拉时聚合获取所有(或已选)项目的远程分支,每次打开都重新获取\n const fetchBatchSwitchBranchOptions = async () => {\n // 未选择项目时聚合所有项目,已选择时只聚合所选项目\n const projects = batchSwitchForm.selectedProjects.length > 0\n ? batchSwitchForm.selectedProjects\n : Object.keys(state.projects);\n\n if (projects.length === 0) {\n setBatchSwitchBranchesError('暂无可用的项目');\n setBatchSwitchBranchOptions([]);\n return;\n }\n\n setBatchSwitchBranchesLoading(true);\n setBatchSwitchBranchesError(null);\n try {\n const response = await fetch('/api/batch-list-branches', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ projects }),\n });\n const result = await response.json();\n if (result.success) {\n setBatchSwitchBranchOptions(result.branches || []);\n if (Array.isArray(result.failedProjects) && result.failedProjects.length > 0) {\n setBatchSwitchBranchesError(\n `${result.failedProjects.length} 个项目获取分支失败(已跳过): ${result.failedProjects\n .map((item: { projectName: string }) => item.projectName)\n .join(', ')}`,\n );\n }\n } else {\n setBatchSwitchBranchesError(result.error || '获取分支列表失败');\n setBatchSwitchBranchOptions([]);\n }\n } catch (err) {\n console.error('获取批量分支列表失败:', err);\n setBatchSwitchBranchesError('网络请求失败');\n setBatchSwitchBranchOptions([]);\n } finally {\n setBatchSwitchBranchesLoading(false);\n }\n };\n\n const handleBatchSwitchMenuOpenChange = (open: boolean) => {\n setBatchSwitchMenuOpen(open);\n if (open) {\n setBatchSwitchKeyword('');\n fetchBatchSwitchBranchOptions();\n }\n };\n\n const runBatchBranchMerge = async (dryRun: boolean) => {\n const feedbacks: string[] = [];\n\n if (batchMergeForm.selectedProjects.length === 0) {\n feedbacks.push('请先选择至少一个项目。');\n }\n\n if (!batchMergeForm.targetBranch.trim()) {\n feedbacks.push('请填写合入分支名称。');\n }\n\n if (!batchMergeForm.sourceBranch.trim()) {\n feedbacks.push('请填写被合入分支名称。');\n }\n\n if (feedbacks.length > 0) {\n setBatchMergeRunState({\n isRunning: false,\n operationLogs: [],\n feedbacks,\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n return;\n }\n\n const totalProjects = batchMergeForm.selectedProjects.length;\n setBatchMergeRunState({\n isRunning: true,\n operationLogs: [`开始批量分支合并,共 ${totalProjects} 个项目...`],\n feedbacks: [],\n progress: 0,\n totalProjects,\n completedProjects: 0,\n currentProject: '',\n });\n\n const allProjectResults: Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n rollbackActions?: string[];\n }> = [];\n const allFeedbacks: string[] = [];\n\n for (let index = 0; index < batchMergeForm.selectedProjects.length; index++) {\n const projectName = batchMergeForm.selectedProjects[index];\n setBatchMergeRunState(prev => ({\n ...prev,\n currentProject: projectName,\n completedProjects: index,\n progress: Math.round((index / totalProjects) * 100),\n operationLogs: [\n ...prev.operationLogs,\n `[进度] ${index + 1}/${totalProjects} 开始处理项目 ${projectName}`,\n ],\n }));\n\n try {\n const response = await fetch('/api/admin-git-batch-merge', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n projects: [projectName],\n targetBranch: batchMergeForm.targetBranch.trim(),\n sourceBranch: batchMergeForm.sourceBranch.trim(),\n dryRun,\n }),\n });\n\n const result = await response.json();\n const operationLogs = Array.isArray(result.operationLogs) ? result.operationLogs : [];\n const feedback = Array.isArray(result.feedbacks) ? result.feedbacks : [result.error || '执行失败'];\n\n setBatchMergeRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, ...operationLogs],\n feedbacks: [...prev.feedbacks, ...feedback],\n }));\n\n allFeedbacks.push(...feedback);\n if (Array.isArray(result.projectResults)) {\n allProjectResults.push(...result.projectResults);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : '执行失败';\n setBatchMergeRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, `[${projectName}] 请求失败: ${message}`],\n feedbacks: [...prev.feedbacks, `[${projectName}] ${message}`],\n }));\n allFeedbacks.push(`[${projectName}] ${message}`);\n allProjectResults.push({\n projectName,\n success: false,\n reason: message,\n });\n }\n }\n\n setBatchMergeRunState(prev => ({\n ...prev,\n isRunning: false,\n progress: 100,\n completedProjects: totalProjects,\n currentProject: '',\n operationLogs: [...prev.operationLogs, '批量分支合并执行完成。'],\n feedbacks: allFeedbacks.length > 0 ? allFeedbacks : prev.feedbacks,\n }));\n\n if (allProjectResults.length > 0) {\n setProjectResults(allProjectResults);\n setShowResultDialog(true);\n } else {\n setProjectResults([]);\n setShowResultDialog(false);\n }\n };\n\n const runBatchCreateBranch = async (dryRun: boolean) => {\n const feedbacks: string[] = [];\n\n if (batchCreateBranchForm.selectedProjects.length === 0) {\n feedbacks.push('请先选择至少一个项目。');\n }\n\n if (!batchCreateBranchForm.createBranch.trim()) {\n feedbacks.push('请填写新分支名称。');\n }\n\n if (!batchCreateBranchForm.baseBranch.trim()) {\n feedbacks.push('请填写来源分支名称。');\n }\n\n if (feedbacks.length > 0) {\n setBatchCreateBranchRunState({\n isRunning: false,\n operationLogs: [],\n feedbacks,\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n return;\n }\n\n const totalProjects = batchCreateBranchForm.selectedProjects.length;\n setBatchCreateBranchRunState({\n isRunning: true,\n operationLogs: [`开始批量新建分支,共 ${totalProjects} 个项目...`],\n feedbacks: [],\n progress: 0,\n totalProjects,\n completedProjects: 0,\n currentProject: '',\n });\n\n const allProjectResults: Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n rollbackActions?: string[];\n }> = [];\n const allFeedbacks: string[] = [];\n\n for (let index = 0; index < batchCreateBranchForm.selectedProjects.length; index++) {\n const projectName = batchCreateBranchForm.selectedProjects[index];\n setBatchCreateBranchRunState(prev => ({\n ...prev,\n currentProject: projectName,\n completedProjects: index,\n progress: Math.round((index / totalProjects) * 100),\n operationLogs: [\n ...prev.operationLogs,\n `[进度] ${index + 1}/${totalProjects} 开始处理项目 ${projectName}`,\n ],\n }));\n\n try {\n const response = await fetch('/api/admin-git-batch-create-branch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n projects: [projectName],\n createBranch: batchCreateBranchForm.createBranch.trim(),\n baseBranch: batchCreateBranchForm.baseBranch.trim(),\n dryRun,\n }),\n });\n\n const result = await response.json();\n const operationLogs = Array.isArray(result.operationLogs) ? result.operationLogs : [];\n const feedback = Array.isArray(result.feedbacks) ? result.feedbacks : [result.error || '执行失败'];\n\n setBatchCreateBranchRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, ...operationLogs],\n feedbacks: [...prev.feedbacks, ...feedback],\n }));\n\n allFeedbacks.push(...feedback);\n if (Array.isArray(result.projectResults)) {\n allProjectResults.push(...result.projectResults);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : '执行失败';\n setBatchCreateBranchRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, `[${projectName}] 请求失败: ${message}`],\n feedbacks: [...prev.feedbacks, `[${projectName}] ${message}`],\n }));\n allFeedbacks.push(`[${projectName}] ${message}`);\n allProjectResults.push({\n projectName,\n success: false,\n reason: message,\n });\n }\n }\n\n setBatchCreateBranchRunState(prev => ({\n ...prev,\n isRunning: false,\n progress: 100,\n completedProjects: totalProjects,\n currentProject: '',\n operationLogs: [...prev.operationLogs, '批量新建分支执行完成。'],\n feedbacks: allFeedbacks.length > 0 ? allFeedbacks : prev.feedbacks,\n }));\n\n if (allProjectResults.length > 0) {\n setProjectResults(allProjectResults);\n setShowResultDialog(true);\n } else {\n setProjectResults([]);\n setShowResultDialog(false);\n }\n };\n\n const runBatchDeleteRemoteBranch = async (dryRun: boolean) => {\n const feedbacks: string[] = [];\n\n if (batchDeleteBranchForm.selectedProjects.length === 0) {\n feedbacks.push('请先选择至少一个项目。');\n }\n\n if (!batchDeleteBranchForm.branchName.trim()) {\n feedbacks.push('请填写远端分支名称。');\n }\n\n if (feedbacks.length > 0) {\n setBatchDeleteBranchRunState({\n isRunning: false,\n operationLogs: [],\n feedbacks,\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n return;\n }\n\n const totalProjects = batchDeleteBranchForm.selectedProjects.length;\n setBatchDeleteBranchRunState({\n isRunning: true,\n operationLogs: [`开始批量删除远端分支,共 ${totalProjects} 个项目...`],\n feedbacks: [],\n progress: 0,\n totalProjects,\n completedProjects: 0,\n currentProject: '',\n });\n\n const allProjectResults: Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n rollbackActions?: string[];\n }> = [];\n const allFeedbacks: string[] = [];\n\n for (let index = 0; index < batchDeleteBranchForm.selectedProjects.length; index++) {\n const projectName = batchDeleteBranchForm.selectedProjects[index];\n setBatchDeleteBranchRunState(prev => ({\n ...prev,\n currentProject: projectName,\n completedProjects: index,\n progress: Math.round((index / totalProjects) * 100),\n operationLogs: [\n ...prev.operationLogs,\n `[进度] ${index + 1}/${totalProjects} 开始处理项目 ${projectName}`,\n ],\n }));\n\n try {\n const response = await fetch('/api/admin-git-batch-delete-branch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n projects: [projectName],\n branchName: batchDeleteBranchForm.branchName.trim(),\n dryRun,\n }),\n });\n\n const result = await response.json();\n const operationLogs = Array.isArray(result.operationLogs) ? result.operationLogs : [];\n const feedback = Array.isArray(result.feedbacks) ? result.feedbacks : [result.error || '执行失败'];\n\n setBatchDeleteBranchRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, ...operationLogs],\n feedbacks: [...prev.feedbacks, ...feedback],\n }));\n\n allFeedbacks.push(...feedback);\n if (Array.isArray(result.projectResults)) {\n allProjectResults.push(...result.projectResults);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : '执行失败';\n setBatchDeleteBranchRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, `[${projectName}] 请求失败: ${message}`],\n feedbacks: [...prev.feedbacks, `[${projectName}] ${message}`],\n }));\n allFeedbacks.push(`[${projectName}] ${message}`);\n allProjectResults.push({\n projectName,\n success: false,\n reason: message,\n });\n }\n }\n\n setBatchDeleteBranchRunState(prev => ({\n ...prev,\n isRunning: false,\n progress: 100,\n completedProjects: totalProjects,\n currentProject: '',\n operationLogs: [...prev.operationLogs, '批量删除远端分支执行完成。'],\n feedbacks: allFeedbacks.length > 0 ? allFeedbacks : prev.feedbacks,\n }));\n\n if (allProjectResults.length > 0) {\n setProjectResults(allProjectResults);\n setShowResultDialog(true);\n } else {\n setProjectResults([]);\n setShowResultDialog(false);\n }\n };\n\n const runBatchProbeRemoteBranch = async (dryRun: boolean) => {\n const feedbacks = validateBatchProbeRemoteBranchForm(\n batchProbeBranchForm.selectedProjects,\n batchProbeBranchForm.branchName,\n );\n\n if (feedbacks.length > 0) {\n setBatchProbeBranchRunState({\n isRunning: false,\n operationLogs: [],\n feedbacks,\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n return;\n }\n\n const totalProjects = batchProbeBranchForm.selectedProjects.length;\n setBatchProbeBranchRunState({\n isRunning: true,\n operationLogs: [`开始批量探测远端分支,共 ${totalProjects} 个项目...`],\n feedbacks: [],\n progress: 0,\n totalProjects,\n completedProjects: 0,\n currentProject: '',\n });\n\n const allProjectResults: Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n rollbackActions?: string[];\n exists?: boolean;\n }> = [];\n const allFeedbacks: string[] = [];\n\n for (let index = 0; index < batchProbeBranchForm.selectedProjects.length; index++) {\n const projectName = batchProbeBranchForm.selectedProjects[index];\n setBatchProbeBranchRunState(prev => ({\n ...prev,\n currentProject: projectName,\n completedProjects: index,\n progress: Math.round((index / totalProjects) * 100),\n operationLogs: [\n ...prev.operationLogs,\n `[进度] ${index + 1}/${totalProjects} 开始处理项目 ${projectName}`,\n ],\n }));\n\n try {\n const response = await fetch('/api/admin-git-batch-probe-remote-branch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(\n buildBatchProbeRemoteBranchPayload(projectName, batchProbeBranchForm.branchName, dryRun),\n ),\n });\n\n const result = await response.json();\n const operationLogs = Array.isArray(result.operationLogs) ? result.operationLogs : [];\n const feedback = Array.isArray(result.feedbacks) ? result.feedbacks : [result.error || '执行失败'];\n\n setBatchProbeBranchRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, ...operationLogs],\n feedbacks: [...prev.feedbacks, ...feedback],\n }));\n\n allFeedbacks.push(...feedback);\n if (Array.isArray(result.projectResults)) {\n allProjectResults.push(...result.projectResults);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : '执行失败';\n setBatchProbeBranchRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, `[${projectName}] 请求失败: ${message}`],\n feedbacks: [...prev.feedbacks, `[${projectName}] ${message}`],\n }));\n allFeedbacks.push(`[${projectName}] ${message}`);\n allProjectResults.push({\n projectName,\n success: false,\n reason: message,\n });\n }\n }\n\n setBatchProbeBranchRunState(prev => ({\n ...prev,\n isRunning: false,\n progress: 100,\n completedProjects: totalProjects,\n currentProject: '',\n operationLogs: [...prev.operationLogs, '批量探测远端分支执行完成。'],\n feedbacks: allFeedbacks.length > 0 ? allFeedbacks : prev.feedbacks,\n }));\n\n if (allProjectResults.length > 0) {\n setProjectResults(allProjectResults);\n setShowResultDialog(true);\n } else {\n setProjectResults([]);\n setShowResultDialog(false);\n }\n };\n\n const runBatchSwitchBranch = async (dryRun: boolean) => {\n const feedbacks = validateBatchSwitchBranchForm(\n batchSwitchForm.selectedProjects,\n batchSwitchForm.branchName,\n );\n\n if (feedbacks.length > 0) {\n setBatchSwitchRunState({\n isRunning: false,\n operationLogs: [],\n feedbacks,\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n return;\n }\n\n const totalProjects = batchSwitchForm.selectedProjects.length;\n const targetBranch = batchSwitchForm.branchName.trim();\n setBatchSwitchRunState({\n isRunning: true,\n operationLogs: [\n `开始批量切换分支${dryRun ? '(DRY RUN)' : ''},目标分支: ${targetBranch},共 ${totalProjects} 个项目...`,\n ],\n feedbacks: [],\n progress: 0,\n totalProjects,\n completedProjects: 0,\n currentProject: '',\n });\n\n const allProjectResults: Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n }> = [];\n const allFeedbacks: string[] = [];\n\n for (let index = 0; index < batchSwitchForm.selectedProjects.length; index++) {\n const projectName = batchSwitchForm.selectedProjects[index];\n setBatchSwitchRunState(prev => ({\n ...prev,\n currentProject: projectName,\n completedProjects: index,\n progress: Math.round((index / totalProjects) * 100),\n operationLogs: [\n ...prev.operationLogs,\n `[进度] ${index + 1}/${totalProjects} 开始处理项目 ${projectName}`,\n ],\n }));\n\n try {\n const response = await fetch('/api/batch-switch-branch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(\n buildBatchSwitchBranchPayload(projectName, targetBranch, dryRun),\n ),\n });\n\n const result = await response.json();\n const operationLogs = Array.isArray(result.operationLogs) ? result.operationLogs : [];\n const feedback = Array.isArray(result.feedbacks) ? result.feedbacks : [result.error || '执行失败'];\n\n setBatchSwitchRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, ...operationLogs],\n feedbacks: [...prev.feedbacks, ...feedback],\n }));\n\n allFeedbacks.push(...feedback);\n if (Array.isArray(result.projectResults)) {\n allProjectResults.push(...result.projectResults);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : '执行失败';\n setBatchSwitchRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, `[${projectName}] 请求失败: ${message}`],\n feedbacks: [...prev.feedbacks, `[${projectName}] ${message}`],\n }));\n allFeedbacks.push(`[${projectName}] ${message}`);\n allProjectResults.push({\n projectName,\n success: false,\n reason: message,\n });\n }\n }\n\n const successCount = allProjectResults.filter(result => result.success).length;\n const failedCount = allProjectResults.length - successCount;\n\n setBatchSwitchRunState(prev => ({\n ...prev,\n isRunning: false,\n progress: 100,\n completedProjects: totalProjects,\n currentProject: '',\n operationLogs: [\n ...prev.operationLogs,\n `批量切换分支执行完成。总结: 共 ${allProjectResults.length} 个项目,成功 ${successCount} 个,失败 ${failedCount} 个。`,\n ],\n feedbacks: allFeedbacks.length > 0 ? allFeedbacks : prev.feedbacks,\n }));\n\n if (allProjectResults.length > 0) {\n setBatchSwitchProjectResults(allProjectResults);\n setBatchSwitchShowResultDialog(true);\n } else {\n setBatchSwitchProjectResults([]);\n setBatchSwitchShowResultDialog(false);\n }\n\n // 批量切换完成后刷新项目卡片上的分支展示\n refreshProjectBranchSignals(allProjectResults.map(result => result.projectName));\n };\n\n // 批量切换执行完成后,通知对应项目的卡片分支展示(主仓库+子仓库)重新获取最新状态\n const refreshProjectBranchSignals = (projectNames: string[]) => {\n setBranchSwitchSignals(prev => {\n const next = { ...prev };\n projectNames.forEach(name => {\n next[name] = (next[name] || 0) + 1;\n });\n return next;\n });\n };\n\n const handleBatchSwitchSubProjectSelection = (event: ChangeEvent<HTMLSelectElement>) => {\n const selectedProjects = Array.from(event.target.selectedOptions).map(option => option.value);\n setBatchSwitchSubForm(prev => ({\n ...prev,\n selectedProjects,\n }));\n };\n\n const handleSelectBatchSwitchSubBranch = (branchName: string) => {\n setBatchSwitchSubForm(prev => ({\n ...prev,\n branchName,\n }));\n setBatchSwitchSubMenuOpen(false);\n setBatchSwitchSubKeyword('');\n };\n\n // 打开子仓库分支下拉时聚合获取所有(或已选)项目的 submodules/common 分支,每次打开都重新获取\n const fetchBatchSwitchSubBranchOptions = async () => {\n // 未选择项目时聚合所有项目,已选择时只聚合所选项目\n const projects = batchSwitchSubForm.selectedProjects.length > 0\n ? batchSwitchSubForm.selectedProjects\n : Object.keys(state.projects);\n\n if (projects.length === 0) {\n setBatchSwitchSubBranchesError('暂无可用的项目');\n setBatchSwitchSubBranchOptions([]);\n return;\n }\n\n setBatchSwitchSubBranchesLoading(true);\n setBatchSwitchSubBranchesError(null);\n try {\n const response = await fetch('/api/batch-list-submodule-branches', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ projects }),\n });\n const result = await response.json();\n if (result.success) {\n setBatchSwitchSubBranchOptions(result.branches || []);\n if (Array.isArray(result.failedProjects) && result.failedProjects.length > 0) {\n setBatchSwitchSubBranchesError(\n `${result.failedProjects.length} 个项目获取子仓库分支失败(已跳过): ${result.failedProjects\n .map((item: { projectName: string }) => item.projectName)\n .join(', ')}`,\n );\n }\n } else {\n setBatchSwitchSubBranchesError(result.error || '获取子仓库分支列表失败');\n setBatchSwitchSubBranchOptions([]);\n }\n } catch (err) {\n console.error('获取批量子仓库分支列表失败:', err);\n setBatchSwitchSubBranchesError('网络请求失败');\n setBatchSwitchSubBranchOptions([]);\n } finally {\n setBatchSwitchSubBranchesLoading(false);\n }\n };\n\n const handleBatchSwitchSubMenuOpenChange = (open: boolean) => {\n setBatchSwitchSubMenuOpen(open);\n if (open) {\n setBatchSwitchSubKeyword('');\n fetchBatchSwitchSubBranchOptions();\n }\n };\n\n const runBatchSwitchSubBranch = async (dryRun: boolean) => {\n const feedbacks = validateBatchSwitchSubBranchForm(\n batchSwitchSubForm.selectedProjects,\n batchSwitchSubForm.branchName,\n );\n\n if (feedbacks.length > 0) {\n setBatchSwitchSubRunState({\n isRunning: false,\n operationLogs: [],\n feedbacks,\n progress: 0,\n totalProjects: 0,\n completedProjects: 0,\n currentProject: '',\n });\n return;\n }\n\n const totalProjects = batchSwitchSubForm.selectedProjects.length;\n const targetBranch = batchSwitchSubForm.branchName.trim();\n setBatchSwitchSubRunState({\n isRunning: true,\n operationLogs: [\n `开始批量切换子仓库(submodules/common)分支${dryRun ? '(DRY RUN)' : ''},目标分支: ${targetBranch},共 ${totalProjects} 个项目...`,\n ],\n feedbacks: [],\n progress: 0,\n totalProjects,\n completedProjects: 0,\n currentProject: '',\n });\n\n const allProjectResults: Array<{\n projectName: string;\n success: boolean;\n reason?: string;\n }> = [];\n const allFeedbacks: string[] = [];\n\n for (let index = 0; index < batchSwitchSubForm.selectedProjects.length; index++) {\n const projectName = batchSwitchSubForm.selectedProjects[index];\n setBatchSwitchSubRunState(prev => ({\n ...prev,\n currentProject: projectName,\n completedProjects: index,\n progress: Math.round((index / totalProjects) * 100),\n operationLogs: [\n ...prev.operationLogs,\n `[进度] ${index + 1}/${totalProjects} 开始处理项目 ${projectName}`,\n ],\n }));\n\n try {\n const response = await fetch('/api/batch-switch-submodule-branch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(\n buildBatchSwitchSubBranchPayload(projectName, targetBranch, dryRun),\n ),\n });\n\n const result = await response.json();\n const operationLogs = Array.isArray(result.operationLogs) ? result.operationLogs : [];\n const feedback = Array.isArray(result.feedbacks) ? result.feedbacks : [result.error || '执行失败'];\n\n setBatchSwitchSubRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, ...operationLogs],\n feedbacks: [...prev.feedbacks, ...feedback],\n }));\n\n allFeedbacks.push(...feedback);\n if (Array.isArray(result.projectResults)) {\n allProjectResults.push(...result.projectResults);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : '执行失败';\n setBatchSwitchSubRunState(prev => ({\n ...prev,\n operationLogs: [...prev.operationLogs, `[${projectName}] 请求失败: ${message}`],\n feedbacks: [...prev.feedbacks, `[${projectName}] ${message}`],\n }));\n allFeedbacks.push(`[${projectName}] ${message}`);\n allProjectResults.push({\n projectName,\n success: false,\n reason: message,\n });\n }\n }\n\n const successCount = allProjectResults.filter(result => result.success).length;\n const failedCount = allProjectResults.length - successCount;\n\n setBatchSwitchSubRunState(prev => ({\n ...prev,\n isRunning: false,\n progress: 100,\n completedProjects: totalProjects,\n currentProject: '',\n operationLogs: [\n ...prev.operationLogs,\n `批量切换子仓库分支执行完成。总结: 共 ${allProjectResults.length} 个项目,成功 ${successCount} 个,失败 ${failedCount} 个。`,\n ],\n feedbacks: allFeedbacks.length > 0 ? allFeedbacks : prev.feedbacks,\n }));\n\n if (allProjectResults.length > 0) {\n setBatchSwitchSubProjectResults(allProjectResults);\n setBatchSwitchSubShowResultDialog(true);\n } else {\n setBatchSwitchSubProjectResults([]);\n setBatchSwitchSubShowResultDialog(false);\n }\n\n // 批量切换子仓库完成后刷新项目卡片上的分支展示\n refreshProjectBranchSignals(allProjectResults.map(result => result.projectName));\n };\n\n const runUatGitFlow = async (dryRun: boolean) => {\n const feedbacks: string[] = [];\n\n if (uatForm.selectedProjects.length === 0) {\n feedbacks.push('请先选择至少一个项目。');\n }\n\n if (!uatForm.createBranch.trim()) {\n feedbacks.push('请填写创建分支名。');\n }\n\n if (!uatForm.baseBranch.trim()) {\n feedbacks.push('请填写从 origin 哪个分支创建。');\n }\n\n if (!uatForm.mergeBranch.trim()) {\n feedbacks.push('请填写被合并分支名称。');\n }\n\n if (feedbacks.length > 0) {\n setUatRunState({\n isRunning: false,\n operationLogs: [],\n feedbacks,\n runId: '',\n });\n return;\n }\n\n const runId = `uat-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n setUatRunState({\n isRunning: true,\n operationLogs: [],\n feedbacks: [],\n runId,\n });\n\n if (dryRun || !useStepConfirm) {\n try {\n const response = await fetch('/api/uat-git-flow', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n projects: uatForm.selectedProjects,\n createBranch: uatForm.createBranch.trim(),\n baseBranch: 'main',\n mergeBranch: uatForm.mergeBranch.trim(),\n dryRun,\n runId,\n }),\n });\n\n const result = await response.json();\n\n setUatRunState({\n isRunning: false,\n operationLogs: Array.isArray(result.operationLogs) ? result.operationLogs : [],\n feedbacks: Array.isArray(result.feedbacks) ? result.feedbacks : [result.error || '执行失败'],\n runId: '',\n });\n if (Array.isArray(result.projectResults)) {\n setProjectResults(result.projectResults);\n setShowResultDialog(true);\n }\n } catch (error) {\n setUatRunState({\n isRunning: false,\n operationLogs: [],\n feedbacks: [error instanceof Error ? error.message : '执行失败'],\n runId: '',\n });\n setProjectResults([]);\n setShowResultDialog(false);\n }\n return;\n }\n\n try {\n const response = await fetch('/api/uat-git-flow/step', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n action: 'start',\n projects: uatForm.selectedProjects,\n createBranch: uatForm.createBranch.trim(),\n baseBranch: 'main',\n mergeBranch: uatForm.mergeBranch.trim(),\n runId,\n }),\n });\n\n const result = await response.json();\n const logs = Array.isArray(result.operationLogs) ? result.operationLogs : [];\n const feedback = Array.isArray(result.feedbacks) ? result.feedbacks : [result.error || '执行失败'];\n\n if (!result.success) {\n setUatRunState({\n isRunning: false,\n operationLogs: logs,\n feedbacks: feedback,\n runId: '',\n });\n return;\n }\n\n setUatRunState(prev => ({\n ...prev,\n isRunning: !result.isComplete,\n operationLogs: logs,\n feedbacks: feedback,\n runId,\n }));\n\n if (result.nextStep) {\n setPendingStep(result.nextStep);\n setIsConfirmOpen(true);\n } else {\n setPendingStep(null);\n setIsConfirmOpen(false);\n setUatRunState(prev => ({ ...prev, isRunning: false, runId: '' }));\n if (Array.isArray(result.projectResults)) {\n setProjectResults(result.projectResults);\n setShowResultDialog(true);\n }\n }\n } catch (error) {\n setUatRunState({\n isRunning: false,\n operationLogs: [],\n feedbacks: [error instanceof Error ? error.message : '执行失败'],\n runId: '',\n });\n setPendingStep(null);\n setIsConfirmOpen(false);\n }\n };\n\n const runGwhGitFlow = async (dryRun: boolean) => {\n const feedbacks: string[] = [];\n\n if (gwhForm.selectedProjects.length === 0) {\n feedbacks.push('请先选择至少一个项目。');\n }\n\n if (!gwhForm.createBranch.trim()) {\n feedbacks.push('请填写创建分支名。');\n }\n\n if (!gwhForm.baseBranch.trim()) {\n feedbacks.push('请填写从 origin 哪个分支创建。');\n }\n\n if (!gwhForm.mergeBranch.trim()) {\n feedbacks.push('请填写被合并分支名称。');\n }\n\n if (feedbacks.length > 0) {\n setGwhRunState({\n isRunning: false,\n operationLogs: [],\n feedbacks,\n runId: '',\n });\n return;\n }\n\n const runId = `gwh-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n setGwhRunState({\n isRunning: true,\n operationLogs: [],\n feedbacks: [],\n runId,\n });\n\n try {\n const response = await fetch('/api/gwh-git-flow', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n projects: gwhForm.selectedProjects,\n createBranch: gwhForm.createBranch.trim(),\n baseBranch: 'GWH',\n mergeBranch: gwhForm.mergeBranch.trim(),\n dryRun,\n runId,\n }),\n });\n\n const result = await response.json();\n\n setGwhRunState({\n isRunning: false,\n operationLogs: Array.isArray(result.operationLogs) ? result.operationLogs : [],\n feedbacks: Array.isArray(result.feedbacks) ? result.feedbacks : [result.error || '执行失败'],\n runId: '',\n });\n if (Array.isArray(result.projectResults)) {\n setProjectResults(result.projectResults);\n setShowResultDialog(true);\n }\n } catch (error) {\n setGwhRunState({\n isRunning: false,\n operationLogs: [],\n feedbacks: [error instanceof Error ? error.message : '执行失败'],\n runId: '',\n });\n setProjectResults([]);\n setShowResultDialog(false);\n }\n };\n\n const confirmNextStep = async () => {\n if (!pendingStep || !uatRunState.runId) return;\n try {\n const response = await fetch('/api/uat-git-flow/step', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n action: 'execute',\n runId: uatRunState.runId,\n stepId: pendingStep.stepId,\n }),\n });\n\n const result = await response.json();\n const logs = Array.isArray(result.operationLogs) ? result.operationLogs : [];\n const feedback = Array.isArray(result.feedbacks) ? result.feedbacks : [result.error || '执行失败'];\n\n if (!result.success) {\n setUatRunState(prev => ({\n ...prev,\n isRunning: false,\n operationLogs: logs,\n feedbacks: feedback,\n runId: '',\n }));\n setPendingStep(null);\n setIsConfirmOpen(false);\n return;\n }\n\n setUatRunState(prev => ({\n ...prev,\n operationLogs: logs,\n feedbacks: feedback,\n isRunning: !result.isComplete,\n runId: result.isComplete ? '' : prev.runId,\n }));\n\n if (result.nextStep) {\n setPendingStep(result.nextStep);\n setIsConfirmOpen(true);\n } else {\n setPendingStep(null);\n setIsConfirmOpen(false);\n if (Array.isArray(result.projectResults)) {\n setProjectResults(result.projectResults);\n setShowResultDialog(true);\n }\n }\n } catch (error) {\n setUatRunState(prev => ({\n ...prev,\n isRunning: false,\n operationLogs: prev.operationLogs,\n feedbacks: [...prev.feedbacks, error instanceof Error ? error.message : '执行失败'],\n runId: '',\n }));\n setPendingStep(null);\n setIsConfirmOpen(false);\n }\n };\n\n const abortUatGitFlow = async () => {\n if (!uatRunState.runId) return;\n try {\n const response = await fetch(useStepConfirm ? '/api/uat-git-flow/step' : '/api/uat-git-flow/abort', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: useStepConfirm\n ? JSON.stringify({ action: 'abort', runId: uatRunState.runId })\n : JSON.stringify({ runId: uatRunState.runId }),\n });\n const result = await response.json();\n if (result && Array.isArray(result.operationLogs)) {\n setUatRunState(prev => ({\n ...prev,\n isRunning: false,\n operationLogs: result.operationLogs,\n feedbacks: Array.isArray(result.feedbacks) ? result.feedbacks : prev.feedbacks,\n runId: '',\n }));\n } else {\n setUatRunState(prev => ({\n ...prev,\n isRunning: false,\n runId: '',\n }));\n }\n if (Array.isArray(result.projectResults)) {\n setProjectResults(result.projectResults);\n setShowResultDialog(true);\n }\n setPendingStep(null);\n setIsConfirmOpen(false);\n } catch (error) {\n setUatRunState(prev => ({\n ...prev,\n feedbacks: [...prev.feedbacks, error instanceof Error ? error.message : '中断失败'],\n }));\n }\n };\n\n const abortGwhGitFlow = async () => {\n if (!gwhRunState.runId) return;\n try {\n const response = await fetch('/api/gwh-git-flow/abort', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ runId: gwhRunState.runId }),\n });\n const result = await response.json();\n if (result && Array.isArray(result.operationLogs)) {\n setGwhRunState(prev => ({\n ...prev,\n isRunning: false,\n operationLogs: result.operationLogs,\n feedbacks: Array.isArray(result.feedbacks) ? result.feedbacks : prev.feedbacks,\n runId: '',\n }));\n } else {\n setGwhRunState(prev => ({\n ...prev,\n isRunning: false,\n runId: '',\n }));\n }\n if (Array.isArray(result.projectResults)) {\n setProjectResults(result.projectResults);\n setShowResultDialog(true);\n }\n } catch (error) {\n setGwhRunState(prev => ({\n ...prev,\n feedbacks: [...prev.feedbacks, error instanceof Error ? error.message : '中断失败'],\n }));\n }\n };\n\n const handleConfirmOpenChange = (open: boolean) => {\n if (!open && pendingStep && uatRunState.isRunning) {\n return;\n }\n setIsConfirmOpen(open);\n };\n\n // 批量切换目标分支下拉:过滤 + 默认只展示前5项,更多靠搜索\n const batchSwitchFilteredBranches = filterBranchOptions(batchSwitchBranchOptions, batchSwitchKeyword);\n // 批量切换子仓库目标分支下拉:过滤 + 默认只展示前5项,更多靠搜索\n const batchSwitchSubFilteredBranches = filterBranchOptions(batchSwitchSubBranchOptions, batchSwitchSubKeyword);\n\n return (\n <div className=\"container mx-auto p-4 sm:p-6 md:p-8\">\n <div className=\"flex justify-between items-center mb-6\">\n <h1 className=\"text-2xl font-bold\">项目初始化</h1>\n {state.isLoading ? (\n <Button disabled>检查中...</Button>\n ) : (\n <Button \n onClick={startInitialization}\n disabled={state.isInitializing}\n >\n {state.isInitializing ? '初始化中...' : '创建项目空间'}\n </Button>\n )}\n </div>\n\n {/* 全局进度 */}\n {(state.isInitializing || state.isCompleted) && !isAllProjectsExisting() && (\n <div className=\"mb-6 p-4 bg-gray-50 rounded-lg\">\n <div className=\"flex justify-between items-center mb-2\">\n <span className=\"text-sm font-medium\">{state.globalMessage}</span>\n <span className=\"text-sm text-gray-600\">{state.globalProgress}%</span>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div \n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${state.globalProgress}%` }}\n />\n </div>\n </div>\n )}\n\n {/* 完成总结 */}\n {state.completionSummary && !isAllProjectsExisting() && (\n <div className={`mb-6 p-4 rounded-lg border ${\n state.completionSummary.success \n ? 'bg-green-50 border-green-200' \n : 'bg-yellow-50 border-yellow-200'\n }`}>\n <h3 className=\"font-semibold mb-2\">初始化完成</h3>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm\">\n <div>总项目数: {state.completionSummary.totalProjects}</div>\n <div className=\"text-green-600\">成功: {state.completionSummary.successCount}</div>\n <div className=\"text-red-600\">失败: {state.completionSummary.failedCount}</div>\n <div>耗时: {Math.round(state.completionSummary.duration / 1000)}s</div>\n </div>\n </div>\n )}\n\n {/* 项目列表 */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4\">\n {Object.keys(state.projects).length > 0 ? (\n Object.values(state.projects).map((project) => (\n <div \n key={project.name} \n className={`border rounded-lg p-4 ${getStatusColor(project.status)}`}\n >\n <div className=\"flex justify-between items-start mb-2\">\n <h2 \n className=\"font-semibold cursor-pointer hover:text-blue-600 transition-colors\"\n onClick={() => navigateToProjectConfig(project.name)}\n title=\"点击进入项目配置\"\n >\n {project.name}\n </h2>\n <span className=\"text-xs px-2 py-1 rounded-full bg-white\">\n {getStatusText(project.status)}\n </span>\n </div>\n \n <p className=\"text-sm mb-2\">{project.message}</p>\n \n {project.status === ProjectStatus.CLONING || project.status === ProjectStatus.RETRYING ? (\n <div className=\"mb-2\">\n <div className=\"w-full bg-white rounded-full h-1\">\n <div \n className=\"bg-current h-1 rounded-full transition-all duration-300\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n <span className=\"text-xs\">{project.progress}%</span>\n </div>\n ) : null}\n\n {project.error && (\n <p className=\"text-xs text-red-600 mb-2\">{project.error}</p>\n )}\n\n {/* 项目主仓库分支展示与切换 */}\n {(project.status === ProjectStatus.EXISTING || project.status === ProjectStatus.SUCCESS) && (\n <div className=\"mb-2\">\n <BranchSwitcher\n projectName={project.name}\n variant=\"main\"\n refreshSignal={branchSwitchSignals[project.name] || 0}\n onSwitched={() =>\n setBranchSwitchSignals(prev => ({\n ...prev,\n [project.name]: (prev[project.name] || 0) + 1,\n }))\n }\n />\n </div>\n )}\n\n {/* 子仓库(submodules/common)分支展示与切换:仅在项目已完成且跟踪该子仓库时展示 */}\n {(project.status === ProjectStatus.EXISTING || project.status === ProjectStatus.SUCCESS) && (\n <div className=\"mb-2\">\n <BranchSwitcher\n projectName={project.name}\n variant=\"sub\"\n refreshSignal={branchSwitchSignals[project.name] || 0}\n />\n </div>\n )}\n\n <div className=\"space-y-2\">\n {project.canRetry && (\n <Button \n size=\"sm\"\n variant=\"outline\"\n onClick={() => retryProject(project.name)}\n className=\"w-full\"\n >\n 重试\n </Button>\n )}\n \n {project.needsCleanup && project.status === ProjectStatus.INCOMPLETE && (\n <Button \n size=\"sm\"\n variant=\"destructive\"\n onClick={() => cleanupProject(project.name)}\n disabled={project.isCleaningUp}\n className=\"w-full\"\n >\n {project.isCleaningUp ? '清理中...' : '清理项目'}\n </Button>\n )}\n \n {(project.status === ProjectStatus.EXISTING || project.status === ProjectStatus.SUCCESS) && (\n <EditorSplitButton\n onOpen={(editor) => openProject(project.name, editor)}\n loading={project.isOpening}\n loadingText=\"打开中...\"\n size=\"sm\"\n variant=\"default\"\n className=\"w-full\"\n />\n )}\n \n {project.logs && project.logs.length > 0 && (\n <Button \n size=\"sm\"\n variant=\"outline\"\n onClick={() => setExpandedLogs(prev => ({\n ...prev,\n [project.name]: !prev[project.name]\n }))}\n className=\"w-full\"\n >\n {expandedLogs[project.name] ? '隐藏日志' : `查看日志 (${project.logs.length})`}\n </Button>\n )}\n </div>\n\n {/* 日志显示区域 */}\n {expandedLogs[project.name] && project.logs && project.logs.length > 0 && (\n <div className=\"mt-3 border-t pt-3\">\n <div className=\"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto\">\n {project.logs.map((log, index) => (\n <div key={index} className={`mb-1 ${\n log.type === 'stderr' \n ? 'text-red-400' \n : log.type === 'progress' \n ? 'text-yellow-400' \n : 'text-green-400'\n }`}>\n <span className=\"text-gray-500 mr-2\">\n {new Date(log.timestamp).toLocaleTimeString()}\n </span>\n <span className=\"text-blue-400 mr-2\">[{log.type}]</span>\n <span className=\"whitespace-pre-wrap\">{log.content}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n ))\n ) : (\n <div className=\"col-span-full text-center text-gray-500 py-8\">\n {state.isLoading ? '正在检查项目状态...' : \n state.isInitializing ? '正在加载项目...' : \n '点击\"创建项目空间\"开始初始化'}\n </div>\n )}\n </div>\n\n {/* UAT Git 操作流 */}\n {isAdmin && (\n <div className=\"mt-8 rounded-lg border bg-white p-4 shadow-sm\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4\">\n <h2 className=\"text-lg font-semibold\">UAT上线前 Git 操作流</h2>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => runUatGitFlow(false)}\n disabled={uatRunState.isRunning}\n >\n {uatRunState.isRunning ? '执行中...' : '执行'}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => runUatGitFlow(true)}\n disabled={uatRunState.isRunning}\n >\n DRY RUN\n </Button>\n <Button\n variant=\"destructive\"\n onClick={abortUatGitFlow}\n disabled={!uatRunState.isRunning}\n >\n 中断\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"uat-projects\">选择项目</Label>\n <select\n id=\"uat-projects\"\n multiple\n value={uatForm.selectedProjects}\n onChange={handleProjectSelection}\n className=\"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\"\n >\n {Object.keys(state.projects).length === 0 ? (\n <option value=\"\" disabled>暂无可用项目</option>\n ) : (\n Object.keys(state.projects).map(projectName => (\n <option key={projectName} value={projectName}>\n {projectName}\n </option>\n ))\n )}\n </select>\n <p className=\"text-xs text-gray-500\">按住 Command / Ctrl 可多选</p>\n </div>\n\n <div className=\"grid gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"uat-create-branch\">创建分支名</Label>\n <Input\n id=\"uat-create-branch\"\n value={uatForm.createBranch}\n onChange={(event) => updateUatField('createBranch', event.target.value)}\n placeholder=\"例如: release/uat-2026-01\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"uat-base-branch\">从 origin 哪个分支创建(固定)</Label>\n <Input\n id=\"uat-base-branch\"\n value={uatForm.baseBranch}\n disabled\n placeholder=\"main\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"uat-merge-branch\">被合并分支名称</Label>\n <Input\n id=\"uat-merge-branch\"\n value={uatForm.mergeBranch}\n onChange={(event) => updateUatField('mergeBranch', event.target.value)}\n placeholder=\"例如: feature/xxx\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"mt-6 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">操作记录</h3>\n {uatRunState.operationLogs.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无记录</p>\n ) : (\n <div className=\"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto\">\n {uatRunState.operationLogs.map((log, index) => (\n <div key={index} className=\"mb-1 whitespace-pre-wrap\">\n {log}\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">反馈信息</h3>\n {uatRunState.feedbacks.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无反馈</p>\n ) : (\n <div className=\"space-y-1 text-sm\">\n {uatRunState.feedbacks.map((message, index) => (\n <div key={index} className=\"rounded bg-gray-50 px-2 py-1 text-gray-700\">\n {message}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {isAdmin && (\n <div className=\"mt-8 rounded-lg border bg-white p-4 shadow-sm\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4\">\n <h2 className=\"text-lg font-semibold\">武汉协和版本上线前 Git 操作流</h2>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => runGwhGitFlow(false)}\n disabled={gwhRunState.isRunning}\n >\n {gwhRunState.isRunning ? '执行中...' : '执行'}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => runGwhGitFlow(true)}\n disabled={gwhRunState.isRunning}\n >\n DRY RUN\n </Button>\n <Button\n variant=\"destructive\"\n onClick={abortGwhGitFlow}\n disabled={!gwhRunState.isRunning}\n >\n 中断\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"gwh-projects\">选择项目</Label>\n <select\n id=\"gwh-projects\"\n multiple\n value={gwhForm.selectedProjects}\n onChange={handleGwhProjectSelection}\n className=\"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\"\n >\n {Object.keys(state.projects).length === 0 ? (\n <option value=\"\" disabled>暂无可用项目</option>\n ) : (\n Object.keys(state.projects).map(projectName => (\n <option key={projectName} value={projectName}>\n {projectName}\n </option>\n ))\n )}\n </select>\n <p className=\"text-xs text-gray-500\">按住 Command / Ctrl 可多选</p>\n </div>\n\n <div className=\"grid gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"gwh-create-branch\">创建分支名</Label>\n <Input\n id=\"gwh-create-branch\"\n value={gwhForm.createBranch}\n onChange={(event) => updateGwhField('createBranch', event.target.value)}\n placeholder=\"例如: release/whxh-2026-03\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"gwh-base-branch\">从 origin 哪个分支创建(固定)</Label>\n <Input\n id=\"gwh-base-branch\"\n value={gwhForm.baseBranch}\n disabled\n placeholder=\"GWH\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"gwh-merge-branch\">被合并分支名称</Label>\n <Input\n id=\"gwh-merge-branch\"\n value={gwhForm.mergeBranch}\n onChange={(event) => updateGwhField('mergeBranch', event.target.value)}\n placeholder=\"例如: feature/xxx\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"mt-6 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">操作记录</h3>\n {gwhRunState.operationLogs.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无记录</p>\n ) : (\n <div className=\"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto\">\n {gwhRunState.operationLogs.map((log, index) => (\n <div key={index} className=\"mb-1 whitespace-pre-wrap\">\n {log}\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">反馈信息</h3>\n {gwhRunState.feedbacks.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无反馈</p>\n ) : (\n <div className=\"space-y-1 text-sm\">\n {gwhRunState.feedbacks.map((message, index) => (\n <div key={index} className=\"rounded bg-gray-50 px-2 py-1 text-gray-700\">\n {message}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {isAdmin && (\n <div className=\"mt-8 rounded-lg border bg-white p-4 shadow-sm\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4\">\n <h2 className=\"text-lg font-semibold\">常用 Git 分支操作 · 批量分支合并</h2>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => runBatchBranchMerge(false)}\n disabled={batchMergeRunState.isRunning}\n >\n {batchMergeRunState.isRunning ? '执行中...' : '执行'}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => runBatchBranchMerge(true)}\n disabled={batchMergeRunState.isRunning}\n >\n DRY RUN\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-merge-projects\">选择项目</Label>\n <select\n id=\"batch-merge-projects\"\n multiple\n value={batchMergeForm.selectedProjects}\n onChange={handleBatchMergeProjectSelection}\n className=\"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\"\n >\n {Object.keys(state.projects).length === 0 ? (\n <option value=\"\" disabled>暂无可用项目</option>\n ) : (\n Object.keys(state.projects).map(projectName => (\n <option key={projectName} value={projectName}>\n {projectName}\n </option>\n ))\n )}\n </select>\n <p className=\"text-xs text-gray-500\">按住 Command / Ctrl 可多选</p>\n </div>\n\n <div className=\"grid gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-merge-target-branch\">合入分支名称</Label>\n <Input\n id=\"batch-merge-target-branch\"\n value={batchMergeForm.targetBranch}\n onChange={(event) => updateBatchMergeField('targetBranch', event.target.value)}\n placeholder=\"例如: main\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-merge-source-branch\">被合入分支名称</Label>\n <Input\n id=\"batch-merge-source-branch\"\n value={batchMergeForm.sourceBranch}\n onChange={(event) => updateBatchMergeField('sourceBranch', event.target.value)}\n placeholder=\"例如: release/candidate\"\n />\n </div>\n </div>\n </div>\n\n {(batchMergeRunState.isRunning || batchMergeRunState.progress > 0) && (\n <div className=\"mt-4 rounded-lg border p-3\">\n <div className=\"flex justify-between items-center mb-2 text-sm\">\n <span>\n 进度: {batchMergeRunState.completedProjects}/{batchMergeRunState.totalProjects}\n {batchMergeRunState.currentProject ? ` · 当前项目: ${batchMergeRunState.currentProject}` : ''}\n </span>\n <span>{batchMergeRunState.progress}%</span>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${batchMergeRunState.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <div className=\"mt-6 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">操作记录</h3>\n {batchMergeRunState.operationLogs.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无记录</p>\n ) : (\n <div className=\"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto\">\n {batchMergeRunState.operationLogs.map((log, index) => (\n <div key={index} className=\"mb-1 whitespace-pre-wrap\">\n {log}\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">反馈信息</h3>\n {batchMergeRunState.feedbacks.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无反馈</p>\n ) : (\n <div className=\"space-y-1 text-sm\">\n {batchMergeRunState.feedbacks.map((message, index) => (\n <div key={index} className=\"rounded bg-gray-50 px-2 py-1 text-gray-700\">\n {message}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {isAdmin && (\n <div className=\"mt-8 rounded-lg border bg-white p-4 shadow-sm\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4\">\n <h2 className=\"text-lg font-semibold\">常用 Git 分支操作 · 批量新建分支</h2>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => runBatchCreateBranch(false)}\n disabled={batchCreateBranchRunState.isRunning}\n >\n {batchCreateBranchRunState.isRunning ? '执行中...' : '执行'}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => runBatchCreateBranch(true)}\n disabled={batchCreateBranchRunState.isRunning}\n >\n DRY RUN\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-create-branch-projects\">选择项目</Label>\n <select\n id=\"batch-create-branch-projects\"\n multiple\n value={batchCreateBranchForm.selectedProjects}\n onChange={handleBatchCreateBranchProjectSelection}\n className=\"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\"\n >\n {Object.keys(state.projects).length === 0 ? (\n <option value=\"\" disabled>暂无可用项目</option>\n ) : (\n Object.keys(state.projects).map(projectName => (\n <option key={projectName} value={projectName}>\n {projectName}\n </option>\n ))\n )}\n </select>\n <p className=\"text-xs text-gray-500\">按住 Command / Ctrl 可多选</p>\n </div>\n\n <div className=\"grid gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-create-branch-name\">新分支名称</Label>\n <Input\n id=\"batch-create-branch-name\"\n value={batchCreateBranchForm.createBranch}\n onChange={(event) => updateBatchCreateBranchField('createBranch', event.target.value)}\n placeholder=\"例如: release/2026-03\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-create-branch-base\">来源分支名称</Label>\n <Input\n id=\"batch-create-branch-base\"\n value={batchCreateBranchForm.baseBranch}\n onChange={(event) => updateBatchCreateBranchField('baseBranch', event.target.value)}\n placeholder=\"例如: main\"\n />\n </div>\n </div>\n </div>\n\n {(batchCreateBranchRunState.isRunning || batchCreateBranchRunState.progress > 0) && (\n <div className=\"mt-4 rounded-lg border p-3\">\n <div className=\"flex justify-between items-center mb-2 text-sm\">\n <span>\n 进度: {batchCreateBranchRunState.completedProjects}/{batchCreateBranchRunState.totalProjects}\n {batchCreateBranchRunState.currentProject ? ` · 当前项目: ${batchCreateBranchRunState.currentProject}` : ''}\n </span>\n <span>{batchCreateBranchRunState.progress}%</span>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${batchCreateBranchRunState.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <div className=\"mt-6 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">操作记录</h3>\n {batchCreateBranchRunState.operationLogs.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无记录</p>\n ) : (\n <div className=\"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto\">\n {batchCreateBranchRunState.operationLogs.map((log, index) => (\n <div key={index} className=\"mb-1 whitespace-pre-wrap\">\n {log}\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">反馈信息</h3>\n {batchCreateBranchRunState.feedbacks.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无反馈</p>\n ) : (\n <div className=\"space-y-1 text-sm\">\n {batchCreateBranchRunState.feedbacks.map((message, index) => (\n <div key={index} className=\"rounded bg-gray-50 px-2 py-1 text-gray-700\">\n {message}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {isAdmin && (\n <div className=\"mt-8 rounded-lg border bg-white p-4 shadow-sm\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4\">\n <h2 className=\"text-lg font-semibold\">常用 Git 分支操作 · 批量删除远端分支</h2>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => runBatchDeleteRemoteBranch(false)}\n disabled={batchDeleteBranchRunState.isRunning}\n >\n {batchDeleteBranchRunState.isRunning ? '执行中...' : '执行'}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => runBatchDeleteRemoteBranch(true)}\n disabled={batchDeleteBranchRunState.isRunning}\n >\n DRY RUN\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-delete-branch-projects\">选择项目</Label>\n <select\n id=\"batch-delete-branch-projects\"\n multiple\n value={batchDeleteBranchForm.selectedProjects}\n onChange={handleBatchDeleteBranchProjectSelection}\n className=\"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\"\n >\n {Object.keys(state.projects).length === 0 ? (\n <option value=\"\" disabled>暂无可用项目</option>\n ) : (\n Object.keys(state.projects).map(projectName => (\n <option key={projectName} value={projectName}>\n {projectName}\n </option>\n ))\n )}\n </select>\n <p className=\"text-xs text-gray-500\">按住 Command / Ctrl 可多选</p>\n </div>\n\n <div className=\"grid gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-delete-branch-name\">远端分支名称</Label>\n <Input\n id=\"batch-delete-branch-name\"\n value={batchDeleteBranchForm.branchName}\n onChange={(event) => updateBatchDeleteBranchField(event.target.value)}\n placeholder=\"例如: release/2026-03\"\n />\n </div>\n </div>\n </div>\n\n {(batchDeleteBranchRunState.isRunning || batchDeleteBranchRunState.progress > 0) && (\n <div className=\"mt-4 rounded-lg border p-3\">\n <div className=\"flex justify-between items-center mb-2 text-sm\">\n <span>\n 进度: {batchDeleteBranchRunState.completedProjects}/{batchDeleteBranchRunState.totalProjects}\n {batchDeleteBranchRunState.currentProject ? ` · 当前项目: ${batchDeleteBranchRunState.currentProject}` : ''}\n </span>\n <span>{batchDeleteBranchRunState.progress}%</span>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${batchDeleteBranchRunState.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <div className=\"mt-6 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">操作记录</h3>\n {batchDeleteBranchRunState.operationLogs.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无记录</p>\n ) : (\n <div className=\"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto\">\n {batchDeleteBranchRunState.operationLogs.map((log, index) => (\n <div key={index} className=\"mb-1 whitespace-pre-wrap\">\n {log}\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">反馈信息</h3>\n {batchDeleteBranchRunState.feedbacks.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无反馈</p>\n ) : (\n <div className=\"space-y-1 text-sm\">\n {batchDeleteBranchRunState.feedbacks.map((message, index) => (\n <div key={index} className=\"rounded bg-gray-50 px-2 py-1 text-gray-700\">\n {message}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {isAdmin && (\n <div className=\"mt-8 rounded-lg border bg-white p-4 shadow-sm\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4\">\n <h2 className=\"text-lg font-semibold\">常用 Git 分支操作 · 批量探测远端分支</h2>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => runBatchProbeRemoteBranch(false)}\n disabled={batchProbeBranchRunState.isRunning}\n >\n {batchProbeBranchRunState.isRunning ? '执行中...' : '执行'}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => runBatchProbeRemoteBranch(true)}\n disabled={batchProbeBranchRunState.isRunning}\n >\n DRY RUN\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-probe-branch-projects\">选择项目</Label>\n <select\n id=\"batch-probe-branch-projects\"\n multiple\n value={batchProbeBranchForm.selectedProjects}\n onChange={handleBatchProbeBranchProjectSelection}\n className=\"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\"\n >\n {Object.keys(state.projects).length === 0 ? (\n <option value=\"\" disabled>暂无可用项目</option>\n ) : (\n Object.keys(state.projects).map(projectName => (\n <option key={projectName} value={projectName}>\n {projectName}\n </option>\n ))\n )}\n </select>\n <p className=\"text-xs text-gray-500\">按住 Command / Ctrl 可多选</p>\n </div>\n\n <div className=\"grid gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-probe-branch-name\">远端分支名称</Label>\n <Input\n id=\"batch-probe-branch-name\"\n value={batchProbeBranchForm.branchName}\n onChange={(event) => updateBatchProbeBranchField(event.target.value)}\n placeholder=\"例如: release/2026-03\"\n />\n </div>\n </div>\n </div>\n\n {(batchProbeBranchRunState.isRunning || batchProbeBranchRunState.progress > 0) && (\n <div className=\"mt-4 rounded-lg border p-3\">\n <div className=\"flex justify-between items-center mb-2 text-sm\">\n <span>\n 进度: {batchProbeBranchRunState.completedProjects}/{batchProbeBranchRunState.totalProjects}\n {batchProbeBranchRunState.currentProject ? ` · 当前项目: ${batchProbeBranchRunState.currentProject}` : ''}\n </span>\n <span>{batchProbeBranchRunState.progress}%</span>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${batchProbeBranchRunState.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <div className=\"mt-6 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">操作记录</h3>\n {batchProbeBranchRunState.operationLogs.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无记录</p>\n ) : (\n <div className=\"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto\">\n {batchProbeBranchRunState.operationLogs.map((log, index) => (\n <div key={index} className=\"mb-1 whitespace-pre-wrap\">\n {log}\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">反馈信息</h3>\n {batchProbeBranchRunState.feedbacks.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无反馈</p>\n ) : (\n <div className=\"space-y-1 text-sm\">\n {batchProbeBranchRunState.feedbacks.map((message, index) => (\n <div key={index} className=\"rounded bg-gray-50 px-2 py-1 text-gray-700\">\n {message}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* 批量切换分支:非 admin 也可操作 */}\n <div className=\"mt-8 rounded-lg border bg-white p-4 shadow-sm\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4\">\n <h2 className=\"text-lg font-semibold\">常用 Git 分支操作 · 批量切换分支</h2>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => runBatchSwitchBranch(false)}\n disabled={batchSwitchRunState.isRunning}\n >\n {batchSwitchRunState.isRunning ? '执行中...' : '执行'}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => runBatchSwitchBranch(true)}\n disabled={batchSwitchRunState.isRunning}\n >\n DRY RUN\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-switch-branch-projects\">选择项目</Label>\n <select\n id=\"batch-switch-branch-projects\"\n multiple\n value={batchSwitchForm.selectedProjects}\n onChange={handleBatchSwitchProjectSelection}\n className=\"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\"\n >\n {Object.keys(state.projects).length === 0 ? (\n <option value=\"\" disabled>暂无可用项目</option>\n ) : (\n Object.keys(state.projects).map(projectName => (\n <option key={projectName} value={projectName}>\n {projectName}\n </option>\n ))\n )}\n </select>\n <p className=\"text-xs text-gray-500\">按住 Command / Ctrl 可多选;未选择时下拉聚合所有项目分支</p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-switch-branch-name\">目标分支</Label>\n <DropdownMenu\n open={batchSwitchMenuOpen}\n onOpenChange={handleBatchSwitchMenuOpenChange}\n >\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n className=\"w-full justify-between font-normal\"\n >\n <span className=\"truncate\">\n {batchSwitchForm.branchName || (batchSwitchBranchesLoading ? '加载中...' : '点击选择目标分支')}\n </span>\n <ChevronDownIcon className=\"size-4 opacity-50 shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-72\">\n {/* 搜索框 */}\n <div className=\"p-1\">\n <Input\n value={batchSwitchKeyword}\n onChange={(e) => setBatchSwitchKeyword(e.target.value)}\n placeholder=\"搜索分支...\"\n className=\"h-8\"\n />\n </div>\n <DropdownMenuSeparator />\n\n {/* 加载中 */}\n {batchSwitchBranchesLoading && (\n <div className=\"flex items-center justify-center gap-2 px-3 py-4 text-sm text-gray-500\">\n <span className=\"animate-spin w-3 h-3 border-2 border-blue-500 border-t-transparent rounded-full\"></span>\n 聚合获取各项目远程分支中...\n </div>\n )}\n\n {/* 加载失败 / 部分项目失败 */}\n {!batchSwitchBranchesLoading && batchSwitchBranchesError && (\n <div className=\"px-3 py-3 text-sm\">\n <p className=\"text-red-600\">{batchSwitchBranchesError}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={fetchBatchSwitchBranchOptions}\n className=\"mt-2 h-7 px-2 text-xs\"\n >\n 重试\n </Button>\n </div>\n )}\n\n {/* 分支列表(聚合去重 + 搜索过滤,默认只展示前5项) */}\n {!batchSwitchBranchesLoading && !batchSwitchBranchesError && (\n <>\n {batchSwitchBranchOptions.length === 0 ? (\n <div className=\"px-3 py-4 text-sm text-gray-500\">暂无可用的远程分支</div>\n ) : batchSwitchFilteredBranches.total === 0 ? (\n <div className=\"px-3 py-4 text-sm text-gray-500\">没有匹配的分支</div>\n ) : (\n <>\n {batchSwitchFilteredBranches.visible.map(branch => (\n <DropdownMenuItem\n key={branch}\n className=\"flex items-center justify-between\"\n onSelect={(e) => {\n e.preventDefault();\n handleSelectBatchSwitchBranch(branch);\n }}\n >\n <span className=\"min-w-0 flex-1 truncate\">{branch}</span>\n {branch === batchSwitchForm.branchName && (\n <CheckIcon className=\"size-4 text-blue-600 shrink-0\" />\n )}\n </DropdownMenuItem>\n ))}\n {batchSwitchFilteredBranches.total > batchSwitchFilteredBranches.visible.length && (\n <div className=\"px-3 py-2 text-xs text-gray-400 border-t\">\n 共 {batchSwitchFilteredBranches.total} 个匹配分支,仅展示前 {batchSwitchFilteredBranches.visible.length} 项,更多请使用上方搜索\n </div>\n )}\n </>\n )}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n {batchSwitchForm.branchName && (\n <p className=\"text-xs text-gray-500\">\n 目标分支: <span className=\"text-blue-600 font-medium\">{batchSwitchForm.branchName}</span>\n </p>\n )}\n </div>\n </div>\n\n {(batchSwitchRunState.isRunning || batchSwitchRunState.progress > 0) && (\n <div className=\"mt-4 rounded-lg border p-3\">\n <div className=\"flex justify-between items-center mb-2 text-sm\">\n <span>\n 进度: {batchSwitchRunState.completedProjects}/{batchSwitchRunState.totalProjects}\n {batchSwitchRunState.currentProject ? ` · 当前项目: ${batchSwitchRunState.currentProject}` : ''}\n </span>\n <span>{batchSwitchRunState.progress}%</span>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${batchSwitchRunState.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <div className=\"mt-6 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">操作记录</h3>\n {batchSwitchRunState.operationLogs.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无记录</p>\n ) : (\n <div className=\"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto\">\n {batchSwitchRunState.operationLogs.map((log, index) => (\n <div key={index} className=\"mb-1 whitespace-pre-wrap\">\n {log}\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">反馈信息</h3>\n {batchSwitchRunState.feedbacks.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无反馈</p>\n ) : (\n <div className=\"space-y-1 text-sm\">\n {batchSwitchRunState.feedbacks.map((message, index) => (\n <div key={index} className=\"rounded bg-gray-50 px-2 py-1 text-gray-700\">\n {message}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* 批量切换子仓库(submodules/common)分支:非 admin 也可操作 */}\n <div className=\"mt-8 rounded-lg border bg-white p-4 shadow-sm\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4\">\n <h2 className=\"text-lg font-semibold\">常用 Git 分支操作 · 批量切换子仓库(submodules/common)分支</h2>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => runBatchSwitchSubBranch(false)}\n disabled={batchSwitchSubRunState.isRunning}\n >\n {batchSwitchSubRunState.isRunning ? '执行中...' : '执行'}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => runBatchSwitchSubBranch(true)}\n disabled={batchSwitchSubRunState.isRunning}\n >\n DRY RUN\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-switch-sub-projects\">选择项目</Label>\n <select\n id=\"batch-switch-sub-projects\"\n multiple\n value={batchSwitchSubForm.selectedProjects}\n onChange={handleBatchSwitchSubProjectSelection}\n className=\"w-full min-h-[140px] rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\"\n >\n {Object.keys(state.projects).length === 0 ? (\n <option value=\"\" disabled>暂无可用项目</option>\n ) : (\n Object.keys(state.projects).map(projectName => (\n <option key={projectName} value={projectName}>\n {projectName}\n </option>\n ))\n )}\n </select>\n <p className=\"text-xs text-gray-500\">按住 Command / Ctrl 可多选;未选择时下拉聚合所有项目子仓库分支</p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"batch-switch-sub-name\">目标分支</Label>\n <DropdownMenu\n open={batchSwitchSubMenuOpen}\n onOpenChange={handleBatchSwitchSubMenuOpenChange}\n >\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n className=\"w-full justify-between font-normal\"\n >\n <span className=\"truncate\">\n {batchSwitchSubForm.branchName || (batchSwitchSubBranchesLoading ? '加载中...' : '点击选择目标分支')}\n </span>\n <ChevronDownIcon className=\"size-4 opacity-50 shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-72\">\n {/* 搜索框 */}\n <div className=\"p-1\">\n <Input\n value={batchSwitchSubKeyword}\n onChange={(e) => setBatchSwitchSubKeyword(e.target.value)}\n placeholder=\"搜索分支...\"\n className=\"h-8\"\n />\n </div>\n <DropdownMenuSeparator />\n\n {/* 加载中 */}\n {batchSwitchSubBranchesLoading && (\n <div className=\"flex items-center justify-center gap-2 px-3 py-4 text-sm text-gray-500\">\n <span className=\"animate-spin w-3 h-3 border-2 border-blue-500 border-t-transparent rounded-full\"></span>\n 聚合获取各项目子仓库远程分支中...\n </div>\n )}\n\n {/* 加载失败 / 部分项目失败 */}\n {!batchSwitchSubBranchesLoading && batchSwitchSubBranchesError && (\n <div className=\"px-3 py-3 text-sm\">\n <p className=\"text-red-600\">{batchSwitchSubBranchesError}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={fetchBatchSwitchSubBranchOptions}\n className=\"mt-2 h-7 px-2 text-xs\"\n >\n 重试\n </Button>\n </div>\n )}\n\n {/* 分支列表(聚合去重 + 搜索过滤,默认只展示前5项) */}\n {!batchSwitchSubBranchesLoading && !batchSwitchSubBranchesError && (\n <>\n {batchSwitchSubBranchOptions.length === 0 ? (\n <div className=\"px-3 py-4 text-sm text-gray-500\">暂无可用的子仓库远程分支</div>\n ) : batchSwitchSubFilteredBranches.total === 0 ? (\n <div className=\"px-3 py-4 text-sm text-gray-500\">没有匹配的分支</div>\n ) : (\n <>\n {batchSwitchSubFilteredBranches.visible.map(branch => (\n <DropdownMenuItem\n key={branch}\n className=\"flex items-center justify-between\"\n onSelect={(e) => {\n e.preventDefault();\n handleSelectBatchSwitchSubBranch(branch);\n }}\n >\n <span className=\"min-w-0 flex-1 truncate\">{branch}</span>\n {branch === batchSwitchSubForm.branchName && (\n <CheckIcon className=\"size-4 text-blue-600 shrink-0\" />\n )}\n </DropdownMenuItem>\n ))}\n {batchSwitchSubFilteredBranches.total > batchSwitchSubFilteredBranches.visible.length && (\n <div className=\"px-3 py-2 text-xs text-gray-400 border-t\">\n 共 {batchSwitchSubFilteredBranches.total} 个匹配分支,仅展示前 {batchSwitchSubFilteredBranches.visible.length} 项,更多请使用上方搜索\n </div>\n )}\n </>\n )}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n {batchSwitchSubForm.branchName && (\n <p className=\"text-xs text-gray-500\">\n 目标分支: <span className=\"text-blue-600 font-medium\">{batchSwitchSubForm.branchName}</span>\n </p>\n )}\n </div>\n </div>\n\n {(batchSwitchSubRunState.isRunning || batchSwitchSubRunState.progress > 0) && (\n <div className=\"mt-4 rounded-lg border p-3\">\n <div className=\"flex justify-between items-center mb-2 text-sm\">\n <span>\n 进度: {batchSwitchSubRunState.completedProjects}/{batchSwitchSubRunState.totalProjects}\n {batchSwitchSubRunState.currentProject ? ` · 当前项目: ${batchSwitchSubRunState.currentProject}` : ''}\n </span>\n <span>{batchSwitchSubRunState.progress}%</span>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${batchSwitchSubRunState.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <div className=\"mt-6 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">操作记录</h3>\n {batchSwitchSubRunState.operationLogs.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无记录</p>\n ) : (\n <div className=\"bg-black text-white rounded text-xs font-mono p-2 max-h-48 overflow-y-auto\">\n {batchSwitchSubRunState.operationLogs.map((log, index) => (\n <div key={index} className=\"mb-1 whitespace-pre-wrap\">\n {log}\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"rounded-lg border p-3\">\n <h3 className=\"text-sm font-semibold mb-2\">反馈信息</h3>\n {batchSwitchSubRunState.feedbacks.length === 0 ? (\n <p className=\"text-xs text-gray-500\">暂无反馈</p>\n ) : (\n <div className=\"space-y-1 text-sm\">\n {batchSwitchSubRunState.feedbacks.map((message, index) => (\n <div key={index} className=\"rounded bg-gray-50 px-2 py-1 text-gray-700\">\n {message}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n\n <Dialog open={useStepConfirm && isConfirmOpen} onOpenChange={handleConfirmOpenChange}>\n <DialogContent showCloseButton={false}>\n <DialogHeader>\n <DialogTitle>确认执行下一步</DialogTitle>\n <DialogDescription>\n {pendingStep ? `${pendingStep.projectName} · ${pendingStep.description}` : '准备下一步执行'}\n </DialogDescription>\n </DialogHeader>\n <div className=\"rounded-md border bg-gray-50 p-3 text-sm font-mono text-gray-700\">\n {pendingStep ? pendingStep.command : ''}\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={abortUatGitFlow}>\n 取消执行\n </Button>\n <Button onClick={confirmNextStep} disabled={!pendingStep}>\n 确认并执行\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog open={isAdmin && showResultDialog} onOpenChange={setShowResultDialog}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>操作结果</DialogTitle>\n <DialogDescription>查看所有项目执行结果</DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {projectResults.length === 0 ? (\n <p className=\"text-sm text-gray-500\">暂无结果</p>\n ) : (\n projectResults.map((result) => (\n <div\n key={result.projectName}\n className={`rounded-md border px-3 py-2 text-sm ${\n result.success ? 'bg-green-50 text-green-700' : 'bg-red-50 text-red-700'\n }`}\n >\n <div className=\"flex items-start justify-between\">\n <span className=\"font-medium\">{result.projectName}</span>\n <span className=\"ml-4 text-right\">\n {result.exists === true || result.exists === false\n ? mapProbeRemoteBranchResultText(result)\n : result.success\n ? '成功'\n : result.reason || '失败'}\n </span>\n </div>\n {!result.success && result.rollbackActions && result.rollbackActions.length > 0 && (\n <div className=\"mt-2 text-xs text-gray-600\">\n <div className=\"font-semibold text-gray-700\">已回滚操作:</div>\n <ul className=\"mt-1 list-disc pl-4\">\n {result.rollbackActions.map((action, index) => (\n <li key={`${result.projectName}-rollback-${index}`}>{action}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n ))\n )}\n </div>\n <DialogFooter>\n <Button onClick={() => setShowResultDialog(false)}>关闭</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* 批量切换分支结果对话框(非 admin 也可查看) */}\n <Dialog open={batchSwitchShowResultDialog} onOpenChange={setBatchSwitchShowResultDialog}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>批量切换分支结果</DialogTitle>\n <DialogDescription>\n {(() => {\n const successCount = batchSwitchProjectResults.filter(result => result.success).length;\n const failedCount = batchSwitchProjectResults.length - successCount;\n return `共 ${batchSwitchProjectResults.length} 个项目,成功 ${successCount} 个,失败 ${failedCount} 个`;\n })()}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {batchSwitchProjectResults.length === 0 ? (\n <p className=\"text-sm text-gray-500\">暂无结果</p>\n ) : (\n batchSwitchProjectResults.map((result) => (\n <div\n key={result.projectName}\n className={`rounded-md border px-3 py-2 text-sm ${\n result.success ? 'bg-green-50 text-green-700' : 'bg-red-50 text-red-700'\n }`}\n >\n <div className=\"flex items-start justify-between\">\n <span className=\"font-medium\">{result.projectName}</span>\n <span className=\"ml-4 text-right\">\n {result.success ? '成功' : result.reason || '失败'}\n </span>\n </div>\n </div>\n ))\n )}\n </div>\n <DialogFooter>\n <Button onClick={() => setBatchSwitchShowResultDialog(false)}>关闭</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* 批量切换子仓库分支结果对话框(非 admin 也可查看) */}\n <Dialog open={batchSwitchSubShowResultDialog} onOpenChange={setBatchSwitchSubShowResultDialog}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>批量切换子仓库分支结果</DialogTitle>\n <DialogDescription>\n {(() => {\n const successCount = batchSwitchSubProjectResults.filter(result => result.success).length;\n const failedCount = batchSwitchSubProjectResults.length - successCount;\n return `共 ${batchSwitchSubProjectResults.length} 个项目,成功 ${successCount} 个,失败 ${failedCount} 个`;\n })()}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {batchSwitchSubProjectResults.length === 0 ? (\n <p className=\"text-sm text-gray-500\">暂无结果</p>\n ) : (\n batchSwitchSubProjectResults.map((result) => (\n <div\n key={result.projectName}\n className={`rounded-md border px-3 py-2 text-sm ${\n result.success ? 'bg-green-50 text-green-700' : 'bg-red-50 text-red-700'\n }`}\n >\n <div className=\"flex items-start justify-between\">\n <span className=\"font-medium\">{result.projectName}</span>\n <span className=\"ml-4 text-right\">\n {result.success ? '成功' : result.reason || '失败'}\n </span>\n </div>\n </div>\n ))\n )}\n </div>\n <DialogFooter>\n <Button onClick={() => setBatchSwitchSubShowResultDialog(false)}>关闭</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n\nexport default ProjectInitializer;\n"],"names":[],"mappings":"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"}