{"version":3,"sources":["../../src/config.ts","../../src/multiRepoMerge.ts","../../src/cli.ts"],"names":["ConfigManager","path","os","fs","content","error","repo","existingIndex","r","name","history","MultiRepoMerge","config","repoDir","git","simpleGit","remoteUrlString","remoteUrl","errorMessage","gitError","sourceRepo","sourceBranch","targetRepo","targetBranch","sourceConfig","targetConfig","sourceGit","targetGit","normalizedSourceBranch","checkoutError","pullError","sourceRemoteName","sourceUrl","targetBranches","normalizedTargetBranch","targetBranchExists","branch","strategy","options","remoteBranches","diff","mergeResult","status","e","remoteName","branchName","normalizedBranchName","possibleRefs","branchList","parts","ref","fuzzyMatch","program","Command","configManager","repos","answers","inquirer","useHistory","historyMessage","confirm","merger","validBranches","line","match","mergeOptions","localConfigManager","input","authInfo","repoName"],"mappings":"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","file":"cli.cjs","sourcesContent":["import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\n\r\nexport interface RepoConfig {\r\n  name: string;\r\n  url: string;\r\n  type: 'gitee' | 'gitea';\r\n  token?: string;\r\n  username?: string;\r\n  password?: string;\r\n}\r\n\r\nexport interface RemoteMergeHistory {\r\n  sourceRepo: string;\r\n  sourceBranch: string;\r\n  targetRepo: string;\r\n  targetBranch: string;\r\n  options: {\r\n    showDiff?: boolean;\r\n    conflictStrategy?: 'ours' | 'theirs';\r\n    push?: boolean;\r\n  };\r\n  timestamp: number;\r\n}\r\n\r\nexport class ConfigManager {\r\n  private configPath: string;\r\n  private config: { repos: RepoConfig[]; remoteMergeHistory?: RemoteMergeHistory };\r\n\r\n  constructor() {\r\n    this.configPath = path.join(os.homedir(), '.supos-git-config.json');\r\n    this.config = this.loadConfig();\r\n  }\r\n\r\n  private loadConfig(): { repos: RepoConfig[]; remoteMergeHistory?: RemoteMergeHistory } {\r\n    try {\r\n      if (fs.existsSync(this.configPath)) {\r\n        const content = fs.readFileSync(this.configPath, 'utf-8');\r\n        return JSON.parse(content);\r\n      }\r\n    } catch (error) {\r\n      console.error('加载配置文件失败:', error);\r\n    }\r\n    return { repos: [] };\r\n  }\r\n\r\n  private saveConfig(): void {\r\n    try {\r\n      fs.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));\r\n    } catch (error: any) {\r\n      throw new Error(`保存配置文件失败: ${error.message}`);\r\n    }\r\n  }\r\n\r\n  addRepo(repo: RepoConfig): void {\r\n    const existingIndex = this.config.repos.findIndex((r) => r.name === repo.name);\r\n    if (existingIndex >= 0) {\r\n      this.config.repos[existingIndex] = repo;\r\n    } else {\r\n      this.config.repos.push(repo);\r\n    }\r\n    this.saveConfig();\r\n  }\r\n\r\n  getRepo(name: string): RepoConfig | undefined {\r\n    return this.config.repos.find((repo) => repo.name === name);\r\n  }\r\n\r\n  removeRepo(name: string): void {\r\n    this.config.repos = this.config.repos.filter((repo) => repo.name !== name);\r\n    this.saveConfig();\r\n  }\r\n\r\n  listRepos(): RepoConfig[] {\r\n    return this.config.repos;\r\n  }\r\n\r\n  /**\r\n   * 保存远程合并历史记录\r\n   * @param history 远程合并历史记录\r\n   */\r\n  saveRemoteMergeHistory(history: RemoteMergeHistory): void {\r\n    this.config.remoteMergeHistory = history;\r\n    this.saveConfig();\r\n  }\r\n\r\n  /**\r\n   * 获取远程合并历史记录\r\n   * @returns 远程合并历史记录，如果不存在则返回undefined\r\n   */\r\n  getRemoteMergeHistory(): RemoteMergeHistory | undefined {\r\n    return this.config.remoteMergeHistory;\r\n  }\r\n}\r\n","import simpleGit, { SimpleGit } from 'simple-git';\r\nimport path from 'node:path';\r\nimport fs from 'node:fs';\r\nimport os from 'node:os';\r\nimport { ConfigManager, RepoConfig } from './config';\r\n\r\nexport class MultiRepoMerge {\r\n  private configManager: ConfigManager;\r\n  private tempDir: string;\r\n\r\n  constructor() {\r\n    this.configManager = new ConfigManager();\r\n    this.tempDir = path.join(os.tmpdir(), 'supos-git-merge');\r\n    if (!fs.existsSync(this.tempDir)) {\r\n      fs.mkdirSync(this.tempDir, { recursive: true });\r\n    }\r\n  }\r\n\r\n  async initRepo(config: RepoConfig): Promise<SimpleGit> {\r\n    const repoDir = path.join(this.tempDir, config.name);\r\n    if (!fs.existsSync(repoDir)) {\r\n      fs.mkdirSync(repoDir, { recursive: true });\r\n    }\r\n\r\n    const git = simpleGit(repoDir);\r\n\r\n    // 添加进度监听器\r\n    // git.outputHandler((_, stdout, stderr) => {\r\n    //   stdout.pipe(process.stdout);\r\n    //   stderr.pipe(process.stderr);\r\n    // });\r\n\r\n    try {\r\n      // 初始化Git仓库（如果不存在）\r\n      if (!fs.existsSync(path.join(repoDir, '.git'))) {\r\n        await git.init();\r\n      }\r\n\r\n      // 配置认证信息\r\n      let remoteUrlString = config.url;\r\n      try {\r\n        const remoteUrl = new URL(config.url);\r\n        // 移除现有的认证信息（如果有）\r\n        remoteUrl.username = '';\r\n        remoteUrl.password = '';\r\n\r\n        // 重新构建URL，将认证信息放在正确的位置\r\n        if (config.token) {\r\n          remoteUrlString = remoteUrl\r\n            .toString()\r\n            .replace(/^(https?:\\/\\/)(.+)$/, `$1${encodeURIComponent(config.token)}@$2`);\r\n        } else if (config.username && config.password) {\r\n          remoteUrlString = remoteUrl\r\n            .toString()\r\n            .replace(\r\n              /^(https?:\\/\\/)(.+)$/,\r\n              `$1${encodeURIComponent(config.username)}:${encodeURIComponent(config.password)}@$2`\r\n            );\r\n        }\r\n      } catch (error) {\r\n        console.warn(`[${config.name}] URL解析失败，使用原始URL`);\r\n      }\r\n\r\n      // 确保origin远程仓库已配置\r\n      try {\r\n        const currentUrl = await git.remote(['get-url', 'origin']);\r\n        if (currentUrl?.trim() !== remoteUrlString.trim()) {\r\n          await git.remote(['set-url', 'origin', remoteUrlString]);\r\n        }\r\n      } catch {\r\n        await git.remote(['add', 'origin', remoteUrlString]);\r\n      }\r\n\r\n      // 使用更强的fetch参数，确保获取所有远程分支信息\r\n      await git.fetch(['--all', '--prune', '--tags', '--force']);\r\n      return git;\r\n    } catch (error: any) {\r\n      const errorMessage = error.message || '未知错误';\r\n      const gitError = error.git ? `\\nGit错误: ${JSON.stringify(error.git, null, 2)}` : '';\r\n      throw new Error(`[${config.name}] Git操作失败: ${errorMessage}${gitError}`);\r\n    }\r\n  }\r\n\r\n  async mergeCrossBranch(\r\n    sourceRepo: string,\r\n    sourceBranch: string,\r\n    targetRepo: string,\r\n    targetBranch: string\r\n  ): Promise<void> {\r\n    const sourceConfig = this.configManager.getRepo(sourceRepo);\r\n    const targetConfig = this.configManager.getRepo(targetRepo);\r\n\r\n    if (!sourceConfig || !targetConfig) {\r\n      throw new Error('源仓库或目标仓库配置不存在');\r\n    }\r\n\r\n    const sourceGit = await this.initRepo(sourceConfig);\r\n    const targetGit = await this.initRepo(targetConfig);\r\n\r\n    try {\r\n      // 在源仓库中获取最新代码并检查分支是否存在\r\n      await sourceGit.fetch(['--all', '--prune', '--tags', '--force']);\r\n\r\n      // 检查源分支是否存在\r\n      const sourceBranchExists = await this.checkRemoteBranchExists(sourceRepo, sourceBranch, sourceGit);\r\n      if (!sourceBranchExists) {\r\n        throw new Error(`源分支 '${sourceBranch}' 在仓库 '${sourceRepo}' 中不存在`);\r\n      }\r\n\r\n      const normalizedSourceBranch = sourceBranch.replace(/^(origin\\/|remotes\\/origin\\/|source_[^/]+\\/)/, '');\r\n\r\n      // 切换到源分支\r\n      try {\r\n        // 先尝试直接切换到本地分支\r\n        await sourceGit.checkout(normalizedSourceBranch);\r\n      } catch (error) {\r\n        // 如果本地分支不存在，创建并跟踪远程分支\r\n        try {\r\n          await sourceGit.checkout(['-b', normalizedSourceBranch, '--track', `origin/${normalizedSourceBranch}`]);\r\n        } catch (checkoutError) {\r\n          console.error(`[${sourceRepo}] 创建跟踪分支失败:`, checkoutError);\r\n          // 最后尝试直接获取远程分支内容\r\n          await sourceGit.fetch(['origin', normalizedSourceBranch, '--update-head-ok']);\r\n          // 创建本地分支但不设置跟踪\r\n          await sourceGit.checkout(['-b', normalizedSourceBranch]);\r\n        }\r\n      }\r\n\r\n      // 确保分支内容是最新的\r\n      try {\r\n        await sourceGit.pull('origin', normalizedSourceBranch);\r\n      } catch (pullError) {\r\n        console.warn(`[${sourceRepo}] 拉取更新失败，继续使用当前内容:`, pullError);\r\n      }\r\n\r\n      // 在目标仓库中设置源仓库为远程仓库\r\n      const sourceRemoteName = `source_${sourceRepo}`;\r\n      try {\r\n        await targetGit.remote(['remove', sourceRemoteName]);\r\n      } catch (error) {\r\n        // 忽略移除不存在的远程仓库时的错误\r\n      }\r\n      // 使用源仓库的认证信息构建URL\r\n      const sourceUrl = new URL(sourceConfig.url);\r\n      if (sourceConfig.token) {\r\n        sourceUrl.username = encodeURIComponent(sourceConfig.token);\r\n        sourceUrl.password = '';\r\n      } else if (sourceConfig.username && sourceConfig.password) {\r\n        sourceUrl.username = encodeURIComponent(sourceConfig.username);\r\n        sourceUrl.password = encodeURIComponent(sourceConfig.password);\r\n      }\r\n\r\n      await targetGit.remote(['add', sourceRemoteName, sourceUrl.toString()]);\r\n      await targetGit.fetch([sourceRemoteName, '--force']);\r\n      // 检查目标分支是否存在\r\n      await targetGit.fetch(['--all', '--prune', '--tags', '--force']);\r\n      const targetBranches = await targetGit.branch(['--all']);\r\n      const normalizedTargetBranch = targetBranch.replace(/^origin\\//, '');\r\n      let targetBranchExists = targetBranches.all.some((branch) => {\r\n        const normalizedBranch = branch\r\n          .trim()\r\n          .replace(/^remotes\\/origin\\//, '')\r\n          .replace(/^origin\\//, '');\r\n        const result = normalizedBranch === normalizedTargetBranch;\r\n        return result;\r\n      });\r\n\r\n      if (!targetBranchExists) {\r\n        // 尝试直接检查远程分支是否存在\r\n        const remoteBranches = await targetGit.listRemote(['--heads']);\r\n        targetBranchExists = remoteBranches.includes(`refs/heads/${normalizedTargetBranch}`);\r\n        if (!targetBranchExists) {\r\n          throw new Error(\r\n            `目标分支 '${targetBranch}' 在仓库 '${targetRepo}' 中不存在\\n可用的远程分支:\\n${targetBranches.all.join('\\n')}`\r\n          );\r\n        }\r\n\r\n        // 如果远程分支存在但本地没有，先创建本地跟踪分支\r\n        await targetGit.fetch(['origin', normalizedTargetBranch]);\r\n      }\r\n\r\n      // 切换到目标分支\r\n      try {\r\n        // 先尝试直接切换到本地分支\r\n        await targetGit.checkout(normalizedTargetBranch);\r\n      } catch (error) {\r\n        // 如果本地分支不存在，创建并跟踪远程分支\r\n        try {\r\n          await targetGit.checkout(['-b', normalizedTargetBranch, '--track', `origin/${normalizedTargetBranch}`]);\r\n        } catch (checkoutError) {\r\n          console.error(`[${targetRepo}] 创建跟踪分支失败:`, checkoutError);\r\n          // 最后尝试直接获取远程分支内容\r\n          await targetGit.fetch(['origin', normalizedTargetBranch, '--update-head-ok']);\r\n          // 创建本地分支但不设置跟踪\r\n          await targetGit.checkout(['-b', normalizedTargetBranch]);\r\n        }\r\n      }\r\n\r\n      // 确保分支内容是最新的\r\n      try {\r\n        await targetGit.pull('origin', normalizedTargetBranch);\r\n      } catch (pullError) {\r\n        console.warn(`[${targetRepo}] 拉取更新失败，继续使用当前内容:`, pullError);\r\n      }\r\n      try {\r\n        // 尝试合并源分支\r\n        await targetGit.merge([`${sourceRemoteName}/${normalizedSourceBranch}`]);\r\n        // 推送合并结果\r\n        await targetGit.push('origin', normalizedTargetBranch);\r\n      } catch (error: any) {\r\n        console.error(`[${targetRepo}] 合并失败:`, error.message);\r\n        throw new Error(`分支合并失败: ${error.message}`);\r\n      }\r\n      // 清理临时远程仓库\r\n      await targetGit.remote(['remove', sourceRemoteName]);\r\n    } catch (error: any) {\r\n      const errorMessage = error.message || '未知错误';\r\n      const gitError = error.git ? `\\nGit错误: ${JSON.stringify(error.git, null, 2)}` : '';\r\n      throw new Error(`跨仓库合并失败: ${errorMessage}${gitError}`);\r\n    }\r\n  }\r\n\r\n  async abortMerge(repo: string): Promise<void> {\r\n    const config = this.configManager.getRepo(repo);\r\n    if (!config) {\r\n      throw new Error('仓库配置不存在');\r\n    }\r\n    const git = await this.initRepo(config);\r\n    try {\r\n      await git.merge(['--abort']);\r\n    } catch (error: any) {\r\n      const errorMessage = error.message || '未知错误';\r\n      const gitError = error.git ? `\\nGit错误: ${JSON.stringify(error.git, null, 2)}` : '';\r\n      throw new Error(`中止合并失败: ${errorMessage}${gitError}`);\r\n    }\r\n  }\r\n\r\n  async resolveConflicts(repo: string, strategy: 'ours' | 'theirs'): Promise<void> {\r\n    const config = this.configManager.getRepo(repo);\r\n    if (!config) {\r\n      throw new Error('仓库配置不存在');\r\n    }\r\n\r\n    const git = await this.initRepo(config);\r\n    try {\r\n      if (strategy === 'ours') {\r\n        await git.checkout(['--ours', '.']);\r\n      } else {\r\n        await git.checkout(['--theirs', '.']);\r\n      }\r\n      await git.add('.');\r\n      console.log(`[${repo}] 冲突已解决`);\r\n    } catch (error: any) {\r\n      const errorMessage = error.message || '未知错误';\r\n      const gitError = error.git ? `\\nGit错误: ${JSON.stringify(error.git, null, 2)}` : '';\r\n      throw new Error(`解决冲突失败: ${errorMessage}${gitError}`);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 合并两个远程分支\r\n   * 相比mergeCrossBranch，此方法更专注于远程分支合并，减少了本地分支操作\r\n   * @param sourceRepo 源仓库名称\r\n   * @param sourceBranch 源分支名称\r\n   * @param targetRepo 目标仓库名称\r\n   * @param targetBranch 目标分支名称\r\n   * @param options 合并选项\r\n   */\r\n  async mergeRemoteBranches(\r\n    sourceRepo: string,\r\n    sourceBranch: string,\r\n    targetRepo: string,\r\n    targetBranch: string,\r\n    options: {\r\n      /** 是否在合并前显示差异 */\r\n      showDiff?: boolean;\r\n      /** 合并冲突时的自动解决策略 */\r\n      conflictStrategy?: 'ours' | 'theirs';\r\n      /** 是否推送合并结果 */\r\n      push?: boolean;\r\n    } = {}\r\n  ): Promise<void> {\r\n    const sourceConfig = this.configManager.getRepo(sourceRepo);\r\n    const targetConfig = this.configManager.getRepo(targetRepo);\r\n\r\n    if (!sourceConfig || !targetConfig) {\r\n      throw new Error('源仓库或目标仓库配置不存在');\r\n    }\r\n\r\n    // 规范化分支名称，移除可能的前缀\r\n    const normalizedSourceBranch = sourceBranch.replace(/^(remotes\\/)?origin\\//, '');\r\n    const normalizedTargetBranch = targetBranch.replace(/^(remotes\\/)?origin\\//, '');\r\n\r\n    const targetGit = await this.initRepo(targetConfig);\r\n    const sourceRemoteName = `source_${sourceRepo}`;\r\n\r\n    try {\r\n      // 1. 在目标仓库中设置源仓库为远程仓库\r\n      try {\r\n        await targetGit.remote(['remove', sourceRemoteName]);\r\n      } catch (error) {\r\n        // 忽略移除不存在的远程仓库时的错误\r\n      }\r\n\r\n      // 使用源仓库的认证信息构建URL\r\n      const sourceUrl = new URL(sourceConfig.url);\r\n      if (sourceConfig.token) {\r\n        sourceUrl.username = encodeURIComponent(sourceConfig.token);\r\n        sourceUrl.password = '';\r\n      } else if (sourceConfig.username && sourceConfig.password) {\r\n        sourceUrl.username = encodeURIComponent(sourceConfig.username);\r\n        sourceUrl.password = encodeURIComponent(sourceConfig.password);\r\n      }\r\n\r\n      await targetGit.remote(['add', sourceRemoteName, sourceUrl.toString()]);\r\n\r\n      // 2. 获取源仓库和目标仓库的最新代码\r\n      await targetGit.fetch(['--all', '--prune', '--tags']);\r\n      await targetGit.fetch([sourceRemoteName, '--force']);\r\n\r\n      // 3. 验证分支是否存在\r\n      const remoteBranches = await targetGit.listRemote(['--heads']);\r\n\r\n      // 检查源分支是否存在\r\n      const sourceExists =\r\n        (await this.checkRemoteBranchExists(sourceRemoteName, normalizedSourceBranch, targetGit)) ||\r\n        remoteBranches.includes(`refs/heads/${normalizedSourceBranch}`);\r\n      if (!sourceExists) {\r\n        // 尝试直接检查源仓库中的分支\r\n        const sourceGit = await this.initRepo(sourceConfig);\r\n        const sourceBranchExists = await this.checkRemoteBranchExists(sourceRepo, normalizedSourceBranch, sourceGit);\r\n        if (!sourceBranchExists) {\r\n          throw new Error(`源分支 '${sourceBranch}' 在仓库 '${sourceRepo}' 中不存在`);\r\n        }\r\n      }\r\n\r\n      // 检查目标分支是否存在\r\n      const targetExists = remoteBranches.includes(`refs/heads/${normalizedTargetBranch}`);\r\n      if (!targetExists) {\r\n        throw new Error(`目标分支 '${targetBranch}' 在仓库 '${targetRepo}' 中不存在`);\r\n      }\r\n\r\n      // 4. 切换到目标分支\r\n      try {\r\n        await targetGit.checkout(normalizedTargetBranch);\r\n      } catch (error) {\r\n        // 如果本地分支不存在，创建跟踪分支\r\n        await targetGit.checkout(['-b', normalizedTargetBranch, '--track', `origin/${normalizedTargetBranch}`]);\r\n      }\r\n\r\n      // 确保目标分支是最新的\r\n      await targetGit.pull('origin', normalizedTargetBranch);\r\n\r\n      // 5. 显示将要合并的差异（如果需要）\r\n      if (options.showDiff) {\r\n        console.log(`[${targetRepo}] 显示将要合并的差异...`);\r\n        const diff = await targetGit.diff([`HEAD`, `${sourceRemoteName}/${normalizedSourceBranch}`]);\r\n        console.log(diff);\r\n      }\r\n\r\n      // 6. 执行合并\r\n      try {\r\n        const mergeResult = await targetGit.merge([`${sourceRemoteName}/${normalizedSourceBranch}`]);\r\n        // 检查是否已经是最新的（Already up to date）\r\n        const hasRealChanges =\r\n          mergeResult.summary.changes > 0 || mergeResult.summary.insertions > 0 || mergeResult.summary.deletions > 0;\r\n        if (!hasRealChanges) {\r\n          console.log(`[${targetRepo}] 分支已经是最新的，无需合并`);\r\n          // 9. 清理临时远程仓库\r\n          console.log(`[${targetRepo}] 清理临时远程仓库...`);\r\n          await targetGit.remote(['remove', sourceRemoteName]);\r\n          return;\r\n        }\r\n        // 7. 如果有冲突且指定了冲突解决策略，自动解决冲突\r\n        if (options.conflictStrategy) {\r\n          const status = await targetGit.status();\r\n          if (status.conflicted.length > 0) {\r\n            console.log(\r\n              `[${targetRepo}] 检测到${status.conflicted.length}个冲突文件，使用${options.conflictStrategy === 'ours' ? '我们的' : '他们的'}策略解决...`\r\n            );\r\n            await this.resolveConflicts(targetRepo, options.conflictStrategy);\r\n            await targetGit.commit(\r\n              `自动合并 ${sourceRepo}/${normalizedSourceBranch} 到 ${targetRepo}/${normalizedTargetBranch}`\r\n            );\r\n          }\r\n        }\r\n\r\n        // 8. 推送合并结果（如果需要）\r\n        if (options.push !== false) {\r\n          // 默认推送\r\n          console.log(`[${targetRepo}] 推送合并结果...`);\r\n          await targetGit.push('origin', normalizedTargetBranch);\r\n          console.log(`[${targetRepo}] 推送完成`);\r\n        }\r\n      } catch (error: any) {\r\n        console.error(`[${targetRepo}] 合并失败:`, error.message);\r\n        throw new Error(`分支合并失败: ${error.message}`);\r\n      }\r\n\r\n      // 9. 清理临时远程仓库\r\n      console.log(`[${targetRepo}] 清理临时远程仓库...`);\r\n      await targetGit.remote(['remove', sourceRemoteName]);\r\n\r\n      console.log('远程分支合并完成');\r\n    } catch (error: any) {\r\n      // 清理临时远程仓库\r\n      try {\r\n        await targetGit.remote(['remove', sourceRemoteName]);\r\n      } catch (e) {\r\n        console.log(e);\r\n      }\r\n\r\n      const errorMessage = error.message || '未知错误';\r\n      const gitError = error.git ? `\\nGit错误: ${JSON.stringify(error.git, null, 2)}` : '';\r\n      throw new Error(`远程分支合并失败: ${errorMessage}${gitError}`);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 检查远程仓库中是否存在指定分支\r\n   * @param remoteName 远程仓库名称\r\n   * @param branchName 分支名称\r\n   * @param git Git实例\r\n   */\r\n  private async checkRemoteBranchExists(remoteName: string, branchName: string, git: SimpleGit): Promise<boolean> {\r\n    const remoteBranches = await git.listRemote(['--heads']);\r\n\r\n    // 规范化分支名称\r\n    const normalizedBranchName = branchName.replace(\r\n      /^(origin\\/|remotes\\/origin\\/|source_[^/]+\\/|refs\\/heads\\/|refs\\/remotes\\/[^/]+\\/)/,\r\n      ''\r\n    );\r\n\r\n    // 检查可能的分支引用格式\r\n    const possibleRefs = [\r\n      `refs/heads/${normalizedBranchName}`,\r\n      `refs/remotes/source_${remoteName}/${normalizedBranchName}`,\r\n      `refs/remotes/origin/${normalizedBranchName}`,\r\n      `HEAD:refs/heads/${normalizedBranchName}`,\r\n      normalizedBranchName,\r\n      `source_${remoteName}/${normalizedBranchName}`,\r\n      `origin/${normalizedBranchName}`,\r\n      `refs/remotes/${remoteName}/${normalizedBranchName}`,\r\n    ];\r\n\r\n    // 将远程分支列表拆分为数组并规范化\r\n    const branchList = remoteBranches\r\n      .split('\\n')\r\n      .map((branch) => {\r\n        const parts = branch.trim().split(/\\s+/);\r\n        return parts.length > 1 ? parts[1] : '';\r\n      })\r\n      .filter(Boolean);\r\n\r\n    // 检查所有可能的引用格式\r\n    for (const ref of possibleRefs) {\r\n      if (branchList.includes(ref)) {\r\n        return true;\r\n      }\r\n    }\r\n\r\n    // 如果精确匹配失败，尝试模糊匹配\r\n    const fuzzyMatch = branchList.some((branch) => {\r\n      const normalizedRemoteBranch = branch\r\n        .replace(/^refs\\/heads\\//, '')\r\n        .replace(/^refs\\/remotes\\/[^/]+\\//, '')\r\n        .replace(/^(origin\\/|source_[^/]+\\/)/, '');\r\n      const result = normalizedRemoteBranch === normalizedBranchName;\r\n      return result;\r\n    });\r\n\r\n    // 如果模糊匹配也失败，尝试直接检查远程仓库中的分支\r\n    if (!fuzzyMatch) {\r\n      try {\r\n        // 尝试直接从指定的远程仓库获取分支信息\r\n        const specificRemoteBranches = await git.listRemote([remoteName, '--heads']);\r\n\r\n        // 解析分支列表\r\n        const specificBranchList = specificRemoteBranches\r\n          .split('\\n')\r\n          .map((branch) => {\r\n            const parts = branch.trim().split(/\\s+/);\r\n            return parts.length > 1 ? parts[1] : '';\r\n          })\r\n          .filter(Boolean);\r\n\r\n        // 检查分支是否存在\r\n        const directMatch = specificBranchList.some((branch) => {\r\n          const remoteBranchName = branch.replace(/^refs\\/heads\\//, '');\r\n          const result = remoteBranchName === normalizedBranchName;\r\n          return result;\r\n        });\r\n\r\n        if (directMatch) {\r\n          return true;\r\n        }\r\n      } catch (error) {\r\n        console.warn(`从远程仓库 ${remoteName} 获取分支信息失败:`, error);\r\n        // 错误不影响整体流程，继续后续检查\r\n      }\r\n    }\r\n    return fuzzyMatch;\r\n  }\r\n}\r\n","#!/usr/bin/env node\r\n\r\nimport { Command } from 'commander';\r\nimport inquirer from 'inquirer';\r\nimport { MultiRepoMerge, ConfigManager } from './index';\r\n\r\nconst program = new Command();\r\nconst configManager = new ConfigManager();\r\n\r\nprogram\r\n  .name('supos-git')\r\n  .description('Git tools')\r\n  .version(process.env.PKG_VERSION || '0.0.1');\r\n\r\nprogram\r\n  .command('merge')\r\n  .description('合并跨仓库分支')\r\n  .option('-s, --source-repo <repo>', '源仓库名称')\r\n  .option('-b, --source-branch <branch>', '源分支名称')\r\n  .option('-t, --target-repo <repo>', '目标仓库名称')\r\n  .option('-tb, --target-branch <branch>', '目标分支名称')\r\n  .action(async (options) => {\r\n    try {\r\n      const repos = configManager.listRepos();\r\n      if (repos.length === 0) {\r\n        throw new Error('没有配置任何仓库，请先使用 config 命令配置仓库');\r\n      }\r\n\r\n      const answers = await inquirer.prompt([\r\n        {\r\n          type: 'list',\r\n          name: 'sourceRepo',\r\n          message: '请选择源仓库：',\r\n          choices: repos.map((repo) => repo.name),\r\n          when: !options.sourceRepo,\r\n        },\r\n        {\r\n          type: 'input',\r\n          name: 'sourceBranch',\r\n          message: '请输入源分支名称：',\r\n          when: !options.sourceBranch,\r\n        },\r\n        {\r\n          type: 'list',\r\n          name: 'targetRepo',\r\n          message: '请选择目标仓库：',\r\n          choices: repos.map((repo) => repo.name),\r\n          when: !options.targetRepo,\r\n        },\r\n        {\r\n          type: 'input',\r\n          name: 'targetBranch',\r\n          message: '请输入目标分支名称：',\r\n          when: !options.targetBranch,\r\n        },\r\n      ]);\r\n\r\n      const merger = new MultiRepoMerge();\r\n      await merger.mergeCrossBranch(\r\n        options.sourceRepo || answers.sourceRepo,\r\n        options.sourceBranch || answers.sourceBranch,\r\n        options.targetRepo || answers.targetRepo,\r\n        options.targetBranch || answers.targetBranch\r\n      );\r\n      console.log('分支合并成功');\r\n    } catch (error: any) {\r\n      console.error('分支合并失败:', error.message);\r\n      process.exit(1);\r\n    }\r\n  });\r\n\r\nprogram\r\n  .command('remote-merge')\r\n  .description('合并远程分支')\r\n  .option('-s, --source-repo <repo>', '源仓库名称')\r\n  .option('-b, --source-branch <branch>', '源分支名称')\r\n  .option('-t, --target-repo <repo>', '目标仓库名称')\r\n  .option('-tb, --target-branch <branch>', '目标分支名称')\r\n  .option('-d, --show-diff', '显示将要合并的差异')\r\n  .option('-c, --conflict-strategy <strategy>', '合并冲突时的自动解决策略 (ours/theirs)')\r\n  .option('-np, --no-push', '不推送合并结果')\r\n  .action(async (options) => {\r\n    try {\r\n      const repos = configManager.listRepos();\r\n      if (repos.length === 0) {\r\n        throw new Error('没有配置任何仓库，请先使用 config 命令配置仓库');\r\n      }\r\n\r\n      // 检查是否有历史记录\r\n      const history = configManager.getRemoteMergeHistory();\r\n      let useHistory = false;\r\n\r\n      if (history && !options.sourceRepo && !options.sourceBranch && !options.targetRepo && !options.targetBranch) {\r\n        // 构建历史记录的显示信息，包括合并选项\r\n        let historyMessage = `是否使用上次的合并配置？\\n源仓库: ${history.sourceRepo}\\n源分支: ${history.sourceBranch}\\n目标仓库: ${history.targetRepo}\\n目标分支: ${history.targetBranch}`;\r\n\r\n        // 添加合并选项信息\r\n        if (history.options) {\r\n          historyMessage += '\\n合并选项:';\r\n          if (history.options.showDiff !== undefined) {\r\n            historyMessage += `\\n- 显示差异: ${history.options.showDiff ? '是' : '否'}`;\r\n          }\r\n          if (history.options.conflictStrategy) {\r\n            historyMessage += `\\n- 冲突解决策略: ${history.options.conflictStrategy === 'ours' ? '使用我们的更改 (ours)' : '使用他们的更改 (theirs)'}`;\r\n          } else {\r\n            historyMessage += '\\n- 冲突解决策略: 不自动解决';\r\n          }\r\n          if (history.options.push !== undefined) {\r\n            historyMessage += `\\n- 推送合并结果: ${history.options.push ? '是' : '否'}`;\r\n          }\r\n        }\r\n\r\n        const { confirm } = await inquirer.prompt([\r\n          {\r\n            type: 'confirm',\r\n            name: 'confirm',\r\n            message: historyMessage,\r\n            default: true,\r\n          },\r\n        ]);\r\n        useHistory = confirm;\r\n      }\r\n\r\n      const answers = await inquirer.prompt([\r\n        {\r\n          type: 'list',\r\n          name: 'sourceRepo',\r\n          message: '请选择源仓库：',\r\n          choices: repos.map((repo) => repo.name),\r\n          when: !useHistory && !options.sourceRepo,\r\n        },\r\n        {\r\n          type: 'list',\r\n          name: 'sourceBranch',\r\n          message: '请选择源分支：',\r\n          when: !useHistory && !options.sourceBranch,\r\n          async choices(answers) {\r\n            const sourceRepo = answers.sourceRepo;\r\n            const merger = new MultiRepoMerge();\r\n            const repo = configManager.getRepo(sourceRepo);\r\n            if (!repo) {\r\n              throw new Error(`找不到仓库配置: ${sourceRepo}`);\r\n            }\r\n            const git = await merger.initRepo(repo);\r\n            // console.log(`[${sourceRepo}] 获取远程分支列表...`);\r\n            const remoteBranches = await git.listRemote(['--heads']);\r\n            // console.log(`[${sourceRepo}] 远程分支列表:`, remoteBranches);\r\n\r\n            const validBranches = remoteBranches\r\n              .split('\\n')\r\n              .filter((line) => line.trim())\r\n              .map((line) => {\r\n                const match = line.match(/refs\\/heads\\/(.+)$/);\r\n                return match ? match[1] : null;\r\n              })\r\n              .filter((branch) => branch !== null)\r\n              .sort();\r\n\r\n            if (validBranches.length === 0) {\r\n              throw new Error(`[${sourceRepo}] 未找到任何有效的远程分支`);\r\n            }\r\n\r\n            return validBranches;\r\n          },\r\n        },\r\n        {\r\n          type: 'list',\r\n          name: 'targetRepo',\r\n          message: '请选择目标仓库：',\r\n          choices: repos.map((repo) => repo.name),\r\n          when: !useHistory && !options.targetRepo,\r\n        },\r\n        {\r\n          type: 'list',\r\n          name: 'targetBranch',\r\n          message: '请选择目标分支：',\r\n          when: !useHistory && !options.targetBranch,\r\n          async choices(answers) {\r\n            const targetRepo = answers.targetRepo;\r\n            const merger = new MultiRepoMerge();\r\n            const repo = configManager.getRepo(targetRepo);\r\n            if (!repo) {\r\n              throw new Error(`找不到仓库配置: ${targetRepo}`);\r\n            }\r\n            const git = await merger.initRepo(repo);\r\n            const remoteBranches = await git.listRemote(['--heads']);\r\n\r\n            const validBranches = remoteBranches\r\n              .split('\\n')\r\n              .filter((line) => line.trim())\r\n              .map((line) => {\r\n                const match = line.match(/refs\\/heads\\/(.+)$/);\r\n                return match ? match[1] : null;\r\n              })\r\n              .filter((branch) => branch !== null)\r\n              .sort();\r\n\r\n            if (validBranches.length === 0) {\r\n              throw new Error(`[${targetRepo}] 未找到任何有效的远程分支`);\r\n            }\r\n\r\n            return validBranches;\r\n          },\r\n        },\r\n        {\r\n          type: 'confirm',\r\n          name: 'showDiff',\r\n          message: '是否显示将要合并的差异？',\r\n          default: false,\r\n          when: () => !useHistory && options.showDiff === undefined,\r\n        },\r\n        {\r\n          type: 'list',\r\n          name: 'conflictStrategy',\r\n          message: '请选择合并冲突时的自动解决策略：',\r\n          choices: [\r\n            { name: '不自动解决', value: null },\r\n            { name: '使用我们的更改 (ours)', value: 'ours' },\r\n            { name: '使用他们的更改 (theirs)', value: 'theirs' },\r\n          ],\r\n          when: () => !useHistory && !options.conflictStrategy && options.conflictStrategy !== null,\r\n        },\r\n      ]);\r\n\r\n      const merger = new MultiRepoMerge();\r\n      try {\r\n        // 合并选项\r\n        const mergeOptions =\r\n          useHistory && history?.options\r\n            ? { ...history.options } // 使用历史记录中的选项\r\n            : {\r\n                showDiff: options.showDiff !== undefined ? options.showDiff : answers.showDiff,\r\n                conflictStrategy: options.conflictStrategy || answers.conflictStrategy,\r\n                push: options.push,\r\n              };\r\n\r\n        await merger.mergeRemoteBranches(\r\n          useHistory ? history?.sourceRepo : options.sourceRepo || answers.sourceRepo,\r\n          useHistory ? history?.sourceBranch : options.sourceBranch || answers.sourceBranch,\r\n          useHistory ? history?.targetRepo : options.targetRepo || answers.targetRepo,\r\n          useHistory ? history?.targetBranch : options.targetBranch || answers.targetBranch,\r\n          mergeOptions\r\n        );\r\n\r\n        // 保存本次合并历史\r\n        configManager.saveRemoteMergeHistory({\r\n          sourceRepo: useHistory ? history?.sourceRepo : options.sourceRepo || answers.sourceRepo,\r\n          sourceBranch: useHistory ? history?.sourceBranch : options.sourceBranch || answers.sourceBranch,\r\n          targetRepo: useHistory ? history?.targetRepo : options.targetRepo || answers.targetRepo,\r\n          targetBranch: useHistory ? history?.targetBranch : options.targetBranch || answers.targetBranch,\r\n          options: mergeOptions,\r\n          timestamp: Date.now(),\r\n        });\r\n        // console.log('远程分支合并成功');\r\n      } catch (error: any) {\r\n        // 检查错误信息是否包含\"Already up to date\"\r\n        if (error.message && error.message.includes('Already up to date')) {\r\n          console.log('分支已经是最新的，无需合并');\r\n        } else {\r\n          console.error('远程分支合并失败:', error.message);\r\n          process.exit(1);\r\n        }\r\n      }\r\n    } catch (error: any) {\r\n      console.error('远程分支合并失败:', error.message);\r\n      process.exit(1);\r\n    }\r\n  });\r\n\r\nprogram\r\n  .command('abort')\r\n  .description('中止合并操作')\r\n  .option('-r, --repo <repo>', '仓库名称')\r\n  .action(async (options) => {\r\n    try {\r\n      if (!options.repo) {\r\n        const repos = configManager.listRepos();\r\n        const answers = await inquirer.prompt([\r\n          {\r\n            type: 'list',\r\n            name: 'repo',\r\n            message: '请选择要中止合并的仓库：',\r\n            choices: repos.map((repo) => repo.name),\r\n          },\r\n        ]);\r\n        options.repo = answers.repo;\r\n      }\r\n\r\n      const merger = new MultiRepoMerge();\r\n      await merger.abortMerge(options.repo);\r\n      console.log('成功中止合并操作');\r\n    } catch (error: any) {\r\n      console.error('中止合并失败:', error.message);\r\n      process.exit(1);\r\n    }\r\n  });\r\n\r\nprogram\r\n  .command('resolve')\r\n  .description('解决合并冲突')\r\n  .option('-r, --repo <repo>', '仓库名称')\r\n  .option('-s, --strategy <strategy>', '解决策略 (ours/theirs)')\r\n  .action(async (options) => {\r\n    try {\r\n      const answers = await inquirer.prompt([\r\n        {\r\n          type: 'list',\r\n          name: 'repo',\r\n          message: '请选择要解决冲突的仓库：',\r\n          choices: configManager.listRepos().map((repo) => repo.name),\r\n          when: !options.repo,\r\n        },\r\n        {\r\n          type: 'list',\r\n          name: 'strategy',\r\n          message: '请选择解决冲突的策略：',\r\n          choices: [\r\n            { name: '使用我们的更改 (ours)', value: 'ours' },\r\n            { name: '使用他们的更改 (theirs)', value: 'theirs' },\r\n          ],\r\n          when: !options.strategy,\r\n        },\r\n      ]);\r\n\r\n      const merger = new MultiRepoMerge();\r\n      await merger.resolveConflicts(\r\n        options.repo || answers.repo,\r\n        (options.strategy || answers.strategy) as 'ours' | 'theirs'\r\n      );\r\n      console.log('成功解决冲突');\r\n    } catch (error: any) {\r\n      console.error('解决冲突失败:', error.message);\r\n      process.exit(1);\r\n    }\r\n  });\r\n\r\nprogram\r\n  .command('config')\r\n  .description('配置仓库信息')\r\n  .option('-n, --name <name>', '仓库名称')\r\n  .option('-u, --url <url>', '仓库URL')\r\n  .option('-t, --token <token>', 'Git令牌')\r\n  .option('--username <username>', '用户名')\r\n  .option('--password <password>', '密码')\r\n  .action(async (options) => {\r\n    try {\r\n      // 在这里先创建 configManager 实例，确保在验证函数中可以使用\r\n      const localConfigManager = new ConfigManager();\r\n      const answers = await inquirer.prompt([\r\n        {\r\n          type: 'input',\r\n          name: 'name',\r\n          message: '请输入仓库名称：',\r\n          when: !options.name,\r\n          validate: (input) => {\r\n            if (!input) return '仓库名称不能为空';\r\n            if (!/^[\\w-]+$/.test(input)) return '仓库名称只能包含字母、数字、下划线和横线';\r\n            const repos = localConfigManager.listRepos() || [];\r\n            if (repos.some((repo) => repo.name === input)) return '仓库名称已存在';\r\n            return true;\r\n          },\r\n        },\r\n        {\r\n          type: 'input',\r\n          name: 'url',\r\n          message: '请输入仓库URL：',\r\n          when: !options.url,\r\n          validate: (input) => {\r\n            if (!input) return 'Git仓库URL不能为空';\r\n            try {\r\n              new URL(input);\r\n              if (!input.endsWith('.git')) return 'Git仓库URL必须以.git结尾';\r\n              return true;\r\n            } catch {\r\n              return '请输入有效的Git仓库URL';\r\n            }\r\n          },\r\n        },\r\n        {\r\n          type: 'list',\r\n          name: 'type',\r\n          message: '请选择仓库类型：',\r\n          choices: ['gitee', 'gitea'],\r\n        },\r\n        {\r\n          type: 'list',\r\n          name: 'authType',\r\n          message: '请选择认证方式：',\r\n          choices: ['token', 'password'],\r\n        },\r\n        {\r\n          type: 'password',\r\n          name: 'token',\r\n          message: '请输入Git令牌：',\r\n          when: (answers) => !options.token && answers.authType === 'token',\r\n          validate: (input) => (input ? true : 'Git令牌不能为空'),\r\n        },\r\n        {\r\n          type: 'input',\r\n          name: 'username',\r\n          message: '请输入用户名：',\r\n          when: (answers) => !options.username && answers.authType === 'password',\r\n          validate: (input) => (input ? true : '用户名不能为空'),\r\n        },\r\n        {\r\n          type: 'password',\r\n          name: 'password',\r\n          message: '请输入密码：',\r\n          when: (answers) => !options.password && answers.authType === 'password',\r\n          validate: (input) => (input ? true : '密码不能为空'),\r\n        },\r\n      ]);\r\n\r\n      // 验证认证信息的完整性\r\n      const authInfo = {\r\n        token: options.token || answers.token,\r\n        username: options.username || answers.username,\r\n        password: options.password || answers.password,\r\n      };\r\n\r\n      if (!authInfo.token && (!authInfo.username || !authInfo.password)) {\r\n        throw new Error('必须提供Git令牌或用户名密码');\r\n      }\r\n\r\n      const configManager = new ConfigManager();\r\n      const merger = new MultiRepoMerge();\r\n\r\n      // 验证认证信息\r\n      try {\r\n        await merger.initRepo({\r\n          name: options.name || answers.name,\r\n          url: options.url || answers.url,\r\n          type: answers.type,\r\n          ...authInfo,\r\n        });\r\n      } catch (error: any) {\r\n        throw new Error(`Git认证验证失败: ${error.message}`);\r\n      }\r\n\r\n      configManager.addRepo({\r\n        name: options.name || answers.name,\r\n        url: options.url || answers.url,\r\n        type: answers.type,\r\n        ...authInfo,\r\n      });\r\n      console.log('仓库配置已保存');\r\n    } catch (error: any) {\r\n      console.error('保存配置失败:', error.message);\r\n      process.exit(1);\r\n    }\r\n  });\r\n\r\nprogram\r\n  .command('list')\r\n  .description('列出所有已配置的仓库信息')\r\n  .action(() => {\r\n    try {\r\n      const repos = configManager.listRepos();\r\n      if (repos.length === 0) {\r\n        console.log('没有配置任何仓库，请先使用 config 命令配置仓库');\r\n        return;\r\n      }\r\n\r\n      console.log('\\n已配置的仓库信息：');\r\n      console.table(\r\n        repos.map((repo) => ({\r\n          名称: repo.name,\r\n          URL: repo.url,\r\n          类型: repo.type,\r\n          认证方式: repo.token ? 'token' : 'password',\r\n          用户名: repo.username || '-',\r\n        }))\r\n      );\r\n    } catch (error: any) {\r\n      console.error('获取仓库信息失败:', error.message);\r\n      process.exit(1);\r\n    }\r\n  });\r\n\r\nprogram\r\n  .command('remove')\r\n  .description('删除仓库配置')\r\n  .option('-n, --name <name>', '仓库名称')\r\n  .action(async (options) => {\r\n    try {\r\n      const repos = configManager.listRepos();\r\n      if (repos.length === 0) {\r\n        throw new Error('没有配置任何仓库，请先使用 config 命令配置仓库');\r\n      }\r\n\r\n      let repoName = options.name;\r\n      if (!repoName) {\r\n        const answers = await inquirer.prompt([\r\n          {\r\n            type: 'list',\r\n            name: 'name',\r\n            message: '请选择要删除的仓库：',\r\n            choices: repos.map((repo) => repo.name),\r\n          },\r\n        ]);\r\n        repoName = answers.name;\r\n      }\r\n\r\n      const confirm = await inquirer.prompt([\r\n        {\r\n          type: 'confirm',\r\n          name: 'sure',\r\n          message: `确定要删除仓库 \"${repoName}\" 的配置吗？`,\r\n          default: false,\r\n        },\r\n      ]);\r\n\r\n      if (confirm.sure) {\r\n        configManager.removeRepo(repoName);\r\n        console.log(`仓库 \"${repoName}\" 的配置已删除`);\r\n      } else {\r\n        console.log('操作已取消');\r\n      }\r\n    } catch (error: any) {\r\n      console.error('删除仓库配置失败:', error.message);\r\n      process.exit(1);\r\n    }\r\n  });\r\n\r\nprogram\r\n  .command('help')\r\n  .description('显示帮助信息')\r\n  .action(() => {\r\n    console.log(`\r\n使用说明：\r\n\r\n  git-tools <命令> [选项]\r\n\r\n可用命令：\r\n  merge  合并跨仓库分支\r\n    选项：\r\n      -s, --source-repo <repo>      源仓库名称\r\n      -b, --source-branch <branch>  源分支名称\r\n      -t, --target-repo <repo>      目标仓库名称\r\n      -tb, --target-branch <branch> 目标分支名称\r\n\r\n  remote-merge  合并远程分支\r\n    选项：\r\n      -s, --source-repo <repo>      源仓库名称\r\n      -b, --source-branch <branch>  源分支名称\r\n      -t, --target-repo <repo>      目标仓库名称\r\n      -tb, --target-branch <branch> 目标分支名称\r\n      -d, --show-diff               显示将要合并的差异\r\n      -c, --conflict-strategy <strategy> 合并冲突时的自动解决策略 (ours/theirs)\r\n      -np, --no-push                不推送合并结果\r\n\r\n  abort  中止合并操作\r\n    选项：\r\n      -r, --repo <repo>  仓库名称\r\n\r\n  resolve  解决合并冲突\r\n    选项：\r\n      -r, --repo <repo>          仓库名称\r\n      -s, --strategy <strategy>  解决策略 (ours/theirs)\r\n\r\n  config  配置仓库信息\r\n    选项：\r\n      -n, --name <name>        仓库名称\r\n      -u, --url <url>          仓库URL\r\n      -t, --token <token>      Git令牌\r\n      --username <username>    用户名\r\n      --password <password>    密码\r\n\r\n  remove  删除仓库配置\r\n    选项：\r\n      -n, --name <name>  仓库名称\r\n\r\n  list  列出所有已配置的仓库信息\r\n\r\n示例：\r\n  # 配置仓库\r\n  git-tools config -n myrepo -u https://github.com/user/repo.git -t your-token\r\n\r\n  # 合并分支\r\n  git-tools merge -s source-repo -b feature -t target-repo -tb main\r\n\r\n  # 合并远程分支（优化版本）\r\n  git-tools remote-merge -s source-repo -b feature -t target-repo -tb main -d -c ours\r\n\r\n  # 解决冲突\r\n  git-tools resolve -r myrepo -s ours\r\n\r\n  # 删除仓库配置\r\n  git-tools remove -n myrepo\r\n`);\r\n  });\r\n\r\nprogram.parse();\r\n"]}