@mznjs/mbump 2.2.0 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,22 @@
5
5
  格式遵循 [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
7
7
 
8
+ ## [2.2.2] - 2026-07-05
9
+
10
+ ### 待补充
11
+
12
+ ## [2.2.1] - 2026-07-05
13
+
14
+ 🔧 工具变更
15
+
16
+ - eb0a7a12f75a7bea8c80fe141be832c92a6d294c chore: 更新项目依赖包版本 (package.json, pnpm-lock.yaml)
17
+
18
+ ## [2.2.1-beta.0] - 2026-07-05
19
+
20
+ ♻️ 代码重构
21
+
22
+ - 0fa4bd4b466607a6f656a3a95c53152963188a22 refactor(path,cli,rust): 优化导入方式和代码格式 (interactive.ts, RustManager.ts, path.ts)
23
+
8
24
  ## [2.2.0] - 2026-07-04
9
25
 
10
26
  ### 待补充
@@ -1,5 +1,3 @@
1
- import { createRequire } from "module";
2
-
3
1
  //#region rolldown:runtime
4
2
  var __defProp = Object.defineProperty;
5
3
  var __export = (target, all) => {
@@ -8,7 +6,6 @@ var __export = (target, all) => {
8
6
  enumerable: true
9
7
  });
10
8
  };
11
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
12
9
 
13
10
  //#endregion
14
- export { __export, __require };
11
+ export { __export };
package/dist/cli.js CHANGED
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { __require } from "./chunk-DAa1jVm7.js";
3
- import { RustManager, VersionManager, clearConfigCache, isPathLike, loadConfigAsync, logger_default } from "./path-Dxq6zEl-.js";
2
+ import { RustManager, VersionManager, clearConfigCache, isPathLike, loadConfigAsync, logger_default } from "./path-BvKf4Pq-.js";
4
3
  import { existsSync, readFileSync } from "node:fs";
5
4
  import { dirname, join, resolve } from "node:path";
6
5
  import { execSync } from "node:child_process";
@@ -14,15 +13,11 @@ async function selectVersionInteractive(config, packageName, currentVersion, roo
14
13
  let displayName = packageName;
15
14
  if (rootDir && packageName !== "default") {
16
15
  const pkgPath = config.packagePaths[packageName];
17
- if (pkgPath) {
18
- const { readFileSync: readFileSync$1 } = __require("node:fs");
19
- const { join: join$1, resolve: resolve$1 } = __require("node:path");
20
- try {
21
- const fullPath = resolve$1(rootDir, pkgPath);
22
- const pkgContent = JSON.parse(readFileSync$1(fullPath, "utf8"));
23
- if (pkgContent.name) displayName = pkgContent.name;
24
- } catch {}
25
- }
16
+ if (pkgPath) try {
17
+ const fullPath = resolve(rootDir, pkgPath);
18
+ const pkgContent = JSON.parse(readFileSync(fullPath, "utf8"));
19
+ if (pkgContent.name) displayName = pkgContent.name;
20
+ } catch {}
26
21
  }
27
22
  const choices = [
28
23
  {
@@ -472,7 +467,6 @@ async function main() {
472
467
  push: parsedArgs.push,
473
468
  customVersion: customVersion$1,
474
469
  tag: parsedArgs.tag,
475
- tagPrefix: parsedArgs.tagPrefix,
476
470
  changelog: parsedArgs.changelog,
477
471
  allowUncommitted: parsedArgs.allowUncommitted
478
472
  });
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","names":["config: Config","packageName: string","currentVersion: string","rootDir?: string","customVersion: string | null","input: string","rootDir: string","selections: PackageVersionSelections","args: string[]","defaults: DefaultsConfig","parsed: ParsedArgs","allowedTypes: ReleaseType[]","preview: PreviewResult","error: Error","context?: { packageName?: string, operation?: string }","current: number","total: number","width: number","packageName: string","status: 'processing' | 'success' | 'failed'","rootDir","inquirer","selectedType","customVersion: string | null","config","error: any","config: Config","packageVersionSelections: PackageVersionSelections","updatedPackagesInfo: Array<{ name: string, newVersion: string, pkgKey: string }>","errors: Array<{ packageName: string, error: Error }>","npmErrors: Array<{ packageName: string, error: Error }>"],"sources":["../src/cli/interactive.ts","../src/cli/parser.ts","../src/cli/index.ts"],"sourcesContent":["import type { Config, PackageVersionSelections, ReleaseType } from '@/types'\nimport inquirer from 'inquirer'\nimport semver from 'semver'\nimport { VersionManager } from '@/core/VersionManager'\n\nexport async function selectVersionInteractive(\n config: Config,\n packageName: string,\n currentVersion: string,\n rootDir?: string,\n): Promise<{ type: ReleaseType, customVersion: string | null }> {\n let displayName = packageName\n\n if (rootDir && packageName !== 'default') {\n const pkgPath = config.packagePaths[packageName]\n if (pkgPath) {\n const { readFileSync } = require('node:fs')\n const { join, resolve } = require('node:path')\n try {\n const fullPath = resolve(rootDir, pkgPath)\n const pkgContent = JSON.parse(readFileSync(fullPath, 'utf8'))\n if (pkgContent.name) {\n displayName = pkgContent.name\n }\n }\n catch {\n }\n }\n }\n\n const choices = [\n { name: `major ${semver.inc(currentVersion, 'major')}`, value: 'major' },\n { name: `minor ${semver.inc(currentVersion, 'minor')}`, value: 'minor' },\n { name: `patch ${semver.inc(currentVersion, 'patch')}`, value: 'patch' },\n { name: `next ${semver.inc(currentVersion, 'patch')}`, value: 'next' },\n { name: `conventional ${semver.inc(currentVersion, 'patch')}`, value: 'conventional' },\n {\n name: `pre-patch ${\n semver.prerelease(currentVersion)\n ? semver.inc(currentVersion, 'prerelease')\n : semver.inc(semver.coerce(currentVersion)!.version, 'prepatch', 'beta')\n }`,\n value: 'pre-patch',\n },\n {\n name: `pre-minor ${semver.inc(semver.coerce(currentVersion)!.version, 'preminor', 'beta')}`,\n value: 'pre-minor',\n },\n {\n name: `pre-major ${semver.inc(semver.coerce(currentVersion)!.version, 'premajor', 'beta')}`,\n value: 'pre-major',\n },\n { name: `as-is ${currentVersion}`, value: 'as-is' },\n { name: 'custom ...', value: 'custom' },\n ]\n\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'versionType',\n message: `[${displayName}] Current version ${currentVersion} »`,\n choices,\n default: config.defaults?.releaseType || 'patch',\n },\n ])\n\n const selectedType = answers.versionType as ReleaseType\n let customVersion: string | null = null\n\n if (selectedType === 'custom') {\n const customAnswer = await inquirer.prompt([\n {\n type: 'input',\n name: 'customVersion',\n message: 'Enter custom version:',\n validate: (input: string) => (semver.valid(input) ? true : 'Please enter a valid semver version'),\n },\n ])\n customVersion = customAnswer.customVersion\n }\n\n return { type: selectedType, customVersion }\n}\n\nexport async function selectAllVersionsInteractive(\n config: Config,\n rootDir: string,\n): Promise<PackageVersionSelections> {\n const versionManager = new VersionManager({ config, rootDir })\n const allPackageNames = Object.keys(config.packagePaths)\n const selections: PackageVersionSelections = {}\n\n for (const packageName of allPackageNames) {\n const currentVersion = versionManager.getPackageVersion(packageName)\n if (currentVersion) {\n const selection = await selectVersionInteractive(config, packageName, currentVersion, rootDir)\n selections[packageName] = selection\n }\n }\n\n return selections\n}\n","import type { DefaultsConfig, ParsedArgs, ReleaseType } from '@/types'\nimport { isPathLike } from '@/utils/path'\n\nexport function parseArgs(args: string[], defaults: DefaultsConfig = {}): ParsedArgs {\n const parsed: ParsedArgs = {\n package: null,\n projectPath: null,\n type: undefined,\n dryRun: defaults.dryRun || false,\n help: false,\n version: false,\n verbose: defaults.verbose || false,\n autoCommit: (defaults as any).git?.autoCommit !== false,\n push: (defaults as any).git?.push !== false,\n allowUncommitted: defaults.allowUncommitted || false,\n npm: defaults.npm || false,\n showConfig: false,\n rust: false,\n tag: (defaults as any).git?.tag !== false,\n tagPrefix: (defaults as any).git?.tagPrefix || 'v',\n changelog: (defaults as any).git?.changelog !== false,\n }\n\n const allowedTypes: ReleaseType[] = [\n 'major',\n 'minor',\n 'patch',\n 'pre-patch',\n 'pre-minor',\n 'pre-major',\n 'as-is',\n 'next',\n 'conventional',\n ]\n\n let i = 0\n while (i < args.length) {\n const arg = args[i]\n\n if (arg === '--dry-run' || arg === '-d') {\n parsed.dryRun = true\n i++\n }\n else if (arg === '--verbose' || arg === '-v') {\n parsed.verbose = true\n i++\n }\n else if (arg === '--no-commit' || arg === '-n') {\n parsed.autoCommit = false\n i++\n }\n else if (arg === '--no-push' || arg === '-p') {\n parsed.push = false\n i++\n }\n else if (arg === '--allow-uncommitted' || arg === '-u') {\n parsed.allowUncommitted = true\n i++\n }\n else if (arg === '--npm' || arg === '-N') {\n parsed.npm = true\n i++\n }\n else if (arg === '--show-config' || arg === '-c') {\n parsed.showConfig = true\n i++\n }\n else if (arg === '--rust' || arg === '-r') {\n parsed.rust = true\n i++\n }\n else if (arg === '--version' || arg === '-V') {\n parsed.version = true\n i++\n }\n else if (arg === '--type' || arg === '-t') {\n if (i + 1 < args.length) {\n const typeValue = args[i + 1] as ReleaseType\n if (allowedTypes.includes(typeValue)) {\n parsed.type = typeValue\n i += 2\n }\n else {\n throw new Error(`不支持的版本类型: ${typeValue},支持的类型: ${allowedTypes.join(', ')}`)\n }\n }\n else {\n throw new Error('--type 参数需要一个值')\n }\n }\n else if (arg.startsWith('--type=') || arg.startsWith('-t=')) {\n const typeValue = arg.split('=')[1] as ReleaseType\n if (allowedTypes.includes(typeValue)) {\n parsed.type = typeValue\n }\n else {\n throw new Error(`不支持的版本类型: ${typeValue},支持的类型: ${allowedTypes.join(', ')}`)\n }\n i++\n }\n else if (!arg.startsWith('-')) {\n if (!parsed.projectPath && !parsed.package) {\n if (isPathLike(arg)) {\n parsed.projectPath = arg\n }\n else {\n parsed.package = arg\n }\n }\n else if (allowedTypes.includes(arg as ReleaseType)) {\n parsed.type = arg as ReleaseType\n }\n else if (!parsed.package && !isPathLike(arg)) {\n parsed.package = arg\n }\n i++\n }\n else {\n i++\n }\n }\n\n return parsed\n}\n","#!/usr/bin/env node\nimport type { Config, PackageVersionSelections, PreviewResult, ReleaseType } from '@/types'\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport { clearConfigCache, loadConfigAsync } from '@/config/loader'\nimport { RustManager } from '@/core/RustManager'\nimport { VersionManager } from '@/core/VersionManager'\nimport log from '@/utils/logger'\nimport { selectAllVersionsInteractive, selectVersionInteractive } from './interactive'\nimport { parseArgs } from './parser'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\nfunction renderPreview(preview: PreviewResult): void {\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n\n for (const pkg of preview.packages) {\n log.info(` 📦 ${pkg.name}`)\n log.info(` 当前版本: ${pkg.oldVersion}`)\n log.info(` 新版本: ${pkg.newVersion}`)\n log.info(` Tag: ${pkg.tagName}`)\n log.info(` CHANGELOG: ${pkg.changelogEnabled ? '是' : pkg.isDefaultPackage ? '否(配置禁用)' : '跳过(子包)'}`)\n log.info('')\n }\n\n log.info(` Git Commit: ${preview.autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${preview.push ? '是' : '否'}`)\n log.info(` NPM Publish: ${preview.npm ? '是' : '否'}`)\n log.info('\\n✅ 以上为预览,未执行任何实际操作')\n}\n\nlet packageVersion = '1.0.0'\n// 尝试多个可能的路径查找package.json\nconst possiblePaths = [\n join(__dirname, '..', '..', 'package.json'),\n join(__dirname, '..', 'package.json'),\n join(process.cwd(), 'package.json'),\n]\n\n/**\n * 获取友好的错误提示和解决方案\n */\nfunction getFriendlyErrorMessage(error: Error): { message: string, solution?: string } {\n const errorMessage = error.message\n\n // 版本已存在\n if (errorMessage.includes('已存在')) {\n return {\n message: `⚠️ 版本 ${errorMessage.match(/版本 (.+?) 已存在/)?.[1] || ''} 已存在`,\n solution: '💡 请使用其他版本号,或运行 git tag -d <tag> 删除已有标签',\n }\n }\n\n // Git 冲突\n if (errorMessage.includes('Git conflict') || errorMessage.includes('conflict')) {\n return {\n message: '⚠️ 检测到 Git 冲突',\n solution: '💡 请先解决冲突后重试:git add . && git commit -m \"resolve conflicts\"',\n }\n }\n\n // NPM 认证失败\n if (errorMessage.includes('npm ERR! code E401') || errorMessage.includes('authentication')) {\n return {\n message: '🔐 NPM 认证失败',\n solution: '💡 请运行 npm login 或 pnpm login 登录后重试',\n }\n }\n\n // NPM 包已存在\n if (errorMessage.includes('npm ERR! code E403') || errorMessage.includes('cannot publish')) {\n return {\n message: '📦 NPM 包已存在或无权限',\n solution: '💡 检查包名是否已被占用,或确认是否有发布权限',\n }\n }\n\n // 网络错误\n if (errorMessage.includes('network') || errorMessage.includes('ENOTFOUND') || errorMessage.includes('ECONNREFUSED')) {\n return {\n message: '🌐 网络连接失败',\n solution: '💡 请检查网络连接,或配置 NPM 镜像源',\n }\n }\n\n // 文件路径安全\n if (errorMessage.includes('不安全的文件路径')) {\n return {\n message: '🔒 检测到不安全的文件路径',\n solution: '💡 请确保配置文件中的路径在项目根目录内',\n }\n }\n\n // 无效的包名\n if (errorMessage.includes('无效的包名')) {\n return {\n message: '❌ 无效的包名',\n solution: '💡 请检查配置文件中的 packagePaths 是否正确设置',\n }\n }\n\n // 不支持的版本类型\n if (errorMessage.includes('不支持的版本类型')) {\n return {\n message: '❌ 不支持的版本类型',\n solution: '💡 支持的版本类型: major, minor, patch, pre-patch, pre-minor, pre-major, next, as-is, conventional',\n }\n }\n\n // 无效的自定义版本号\n if (errorMessage.includes('无效的自定义版本号')) {\n return {\n message: '❌ 无效的自定义版本号',\n solution: '💡 请使用符合 semver 规范的版本号,如 1.0.0, 1.0.1-beta.1',\n }\n }\n\n // 版本计算失败\n if (errorMessage.includes('版本计算失败')) {\n return {\n message: '❌ 版本计算失败',\n solution: '💡 请检查当前版本号是否符合 semver 规范,或使用 --verbose 模式查看详细错误',\n }\n }\n\n // 无法计算新版本号\n if (errorMessage.includes('无法计算新版本号')) {\n return {\n message: '❌ 无法计算新版本号',\n solution: '💡 请检查当前版本号是否符合 semver 规范,或尝试使用不同的版本类型',\n }\n }\n\n // 文件读取失败\n if (errorMessage.includes('读取文件失败')) {\n return {\n message: '📁 文件读取失败',\n solution: '💡 请检查文件路径是否正确,文件是否存在且有读取权限',\n }\n }\n\n // 文件写入失败\n if (errorMessage.includes('写入文件失败')) {\n return {\n message: '📁 文件写入失败',\n solution: '💡 请检查文件路径是否正确,是否有写入权限,磁盘空间是否充足',\n }\n }\n\n // Git 操作失败\n if (errorMessage.includes('Git') && errorMessage.includes('失败')) {\n return {\n message: '🔧 Git 操作失败',\n solution: '💡 请检查 Git 仓库状态,确保有提交权限,或使用 --verbose 模式查看详细错误',\n }\n }\n\n // NPM 发布失败\n if (errorMessage.includes('发布失败')) {\n return {\n message: '🚀 NPM 发布失败',\n solution: '💡 请检查 NPM 配置、认证状态和网络连接,或使用 --verbose 模式查看详细错误',\n }\n }\n\n // Cargo.toml 相关错误\n if (errorMessage.includes('Cargo.toml')) {\n return {\n message: '🦀 Cargo.toml 操作失败',\n solution: '💡 请检查 Cargo.toml 文件是否存在,格式是否正确,或使用 --verbose 模式查看详细错误',\n }\n }\n\n // 不存在 package.json\n if (errorMessage.includes('不存在 package.json')) {\n return {\n message: '📦 package.json 不存在',\n solution: '💡 请确保指定的路径是一个有效的 Node.js 项目目录',\n }\n }\n\n // 路径不存在(放在 package.json 检查之后,避免误匹配)\n if (errorMessage.includes('路径') && errorMessage.includes('不存在') && !errorMessage.includes('package.json')) {\n return {\n message: '📂 路径不存在',\n solution: '💡 请检查路径是否正确,确保目录存在',\n }\n }\n\n // 配置错误\n if (errorMessage.includes('配置错误')) {\n return {\n message: '⚙️ 配置错误',\n solution: '💡 请检查配置文件是否正确,或使用 --show-config 查看当前配置',\n }\n }\n\n // 默认错误消息\n return {\n message: `❌ ${errorMessage}`,\n solution: '💡 请检查错误信息,或使用 --verbose 模式查看更多详情',\n }\n}\n\n/**\n * 显示友好的错误信息\n */\nfunction displayError(error: Error, context?: { packageName?: string, operation?: string }): void {\n const { message, solution } = getFriendlyErrorMessage(error)\n\n if (context?.packageName) {\n log.error(`包 ${context.packageName} ${context.operation || '操作'} 失败:`)\n }\n\n log.error(` ${message}`)\n\n if (solution) {\n log.info(` ${solution}`)\n }\n\n // 调试模式下显示详细错误\n if (process.env.DEBUG) {\n log.debug(`详细错误信息: ${JSON.stringify(error, null, 2)}`)\n }\n}\n\n/**\n * 渲染进度条\n * @param current 当前进度\n * @param total 总数量\n * @param width 进度条宽度(字符数)\n * @returns 进度条字符串\n */\nfunction renderProgressBar(current: number, total: number, width: number = 30): string {\n const percentage = Math.round((current / total) * 100)\n const filledLength = Math.round((width * current) / total)\n const emptyLength = width - filledLength\n\n const filled = '█'.repeat(filledLength)\n const empty = '░'.repeat(emptyLength)\n\n return `[${filled}${empty}] ${percentage}% | ${current}/${total}`\n}\n\n/**\n * 显示批量更新进度\n */\nfunction updateProgress(\n current: number,\n total: number,\n packageName: string,\n status: 'processing' | 'success' | 'failed',\n): void {\n const progressBar = renderProgressBar(current, total)\n const statusIcon = status === 'success' ? '✓' : status === 'failed' ? '✗' : '⟳'\n const statusText = status === 'processing' ? '处理中' : status === 'success' ? '完成' : '失败'\n\n // 清除当前行并显示新进度\n process.stdout.write(`\\r${progressBar} | ${statusIcon} ${packageName} - ${statusText} `)\n\n // 如果是最后一个或失败/成功,换行\n if (current === total || status !== 'processing') {\n process.stdout.write('\\n')\n }\n}\n\nfor (const packageJsonPath of possiblePaths) {\n try {\n if (existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'))\n packageVersion = packageJson.version || packageVersion\n break\n }\n }\n catch {\n // 继续尝试下一个路径\n }\n}\n\nprocess.env.NODE_NO_WARNINGS = '1'\n\nexport function showHelp(): void {\n const helpText = `🔧 mbump v${packageVersion}\n========================\n企业级版本管理工具,支持单包和monorepo场景\n\n用法: mbump [package|path] [type] [options]\n\n参数:\n [package] 要更新的包名称或 \"all\" 更新所有包\n [path] 项目目录路径(支持 ./path, ../path, /path, C:\\\\path),自动查找该目录下的 package.json\n [type] 版本升级类型: major, minor, patch, pre-patch, pre-minor, pre-major\n\n选项:\n --dry-run, -d 试运行模式,只显示将要执行的操作\n --verbose, -v 详细输出模式,显示更多执行细节\n --no-commit, -n 禁用自动git提交\n --no-push, -p 禁用自动推送到远程仓库\n --allow-uncommitted, -u 允许在有未提交更改的情况下继续操作\n --npm, -N 启用npm包发布功能(默认不发布)\n --show-config, -c 显示当前加载的完整配置信息\n --rust, -r 启用 Rust 项目模式,更新 Cargo.toml 中的版本号\n --version, -V 显示版本信息\n --help, -h 显示此帮助信息\n\n示例:\n mbump components patch # 将components包升级一个补丁版本\n mbump all minor # 将所有包升级一个小版本\n mbump plugins major --dry-run # 试运行升级plugins包主版本\n mbump core patch --no-push # 更新版本并提交到本地,但不推送到远程\n mbump components patch --npm # 更新版本并发布到npm\n\n # 路径模式(直接指定项目目录)\n mbump ./packages/my-pkg # 更新 ./packages/my-pkg 目录下的 package.json\n mbump ./packages/my-pkg patch # 指定版本类型\n mbump ../other-project minor # 更新上级目录的项目\n\n # Rust 项目模式(更新 Cargo.toml)\n mbump --rust patch # 更新当前目录 Rust 项目的补丁版本\n mbump -r minor # 更新当前目录 Rust 项目的小版本\n mbump -r major --dry-run # 试运行升级当前目录 Rust 项目的主版本\n mbump ./backend -r patch # 更新指定目录下的 Rust 项目\n mbump ./backend -r -d # 试运行模式更新指定目录下的 Rust 项目\n`\n log.info(helpText)\n}\n\nfunction hasUncommittedChanges(): boolean {\n try {\n const output = execSync('git status --porcelain', { encoding: 'utf8', stdio: 'pipe' })\n return output.trim() !== ''\n }\n catch {\n return false\n }\n}\n\nasync function main(): Promise<void> {\n try {\n const args = process.argv.slice(2)\n\n if (args.includes('--help') || args.includes('-h')) {\n showHelp()\n process.exit(0)\n }\n\n if (args.includes('--version') || args.includes('-V')) {\n log.info(`mbump v${packageVersion}`)\n process.exit(0)\n }\n\n const parsedArgs = parseArgs(args)\n\n if (parsedArgs.rust) {\n const rootDir = parsedArgs.projectPath\n ? resolve(process.cwd(), parsedArgs.projectPath)\n : process.cwd()\n\n if (parsedArgs.projectPath && !existsSync(rootDir)) {\n displayError(new Error(`路径 \"${parsedArgs.projectPath}\" 不存在`), {\n operation: '路径验证',\n })\n process.exit(1)\n }\n\n const rustManager = new RustManager(rootDir)\n\n if (parsedArgs.projectPath) {\n log.info(`切换到项目路径: ${rootDir}`)\n }\n\n if (hasUncommittedChanges()) {\n if (!parsedArgs.allowUncommitted) {\n log.warn('警告: 检测到未提交的Git更改')\n\n const inquirer = await import('inquirer')\n const answers = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'continue',\n message: parsedArgs.dryRun\n ? '是否继续(dry-run模式不会实际提交更改)?'\n : '是否提交这些更改并继续?',\n default: true,\n },\n ])\n\n if (!answers.continue) {\n log.info('操作已取消')\n process.exit(0)\n }\n\n if (!parsedArgs.dryRun) {\n const commitMessage = 'chore: update mbump config and settings'\n execSync(`git add . && git commit -m \"${commitMessage}\"`, { encoding: 'utf8', stdio: 'pipe' })\n log.success(`已提交更改: ${commitMessage}`)\n }\n else {\n log.info('dry-run模式: 跳过实际提交操作')\n }\n }\n else {\n log.warn('警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。')\n }\n }\n\n if (!rustManager.exists()) {\n displayError(new Error(`Cargo.toml 文件不存在于路径 \"${rootDir}\"`), {\n operation: 'Rust 项目检测',\n })\n log.info(`💡 请确保指定的路径是 Rust 项目根目录`)\n process.exit(1)\n }\n\n const currentVersion = rustManager.getCurrentVersion()\n if (!currentVersion) {\n displayError(new Error(`Cargo.toml 文件中未找到 [package] 部分的 version 字段`), {\n operation: '版本读取',\n })\n process.exit(1)\n }\n\n let selectedType = parsedArgs.type\n let customVersion: string | null = null\n\n if (!parsedArgs.type) {\n const config = {\n defaults: { releaseType: 'patch' },\n packagePaths: {},\n } as any\n const selection = await selectVersionInteractive(config, 'rust', currentVersion)\n selectedType = selection.type\n customVersion = selection.customVersion\n }\n\n try {\n rustManager.updateVersion(selectedType as ReleaseType, {\n dryRun: parsedArgs.dryRun,\n verbose: parsedArgs.verbose,\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n customVersion,\n tag: parsedArgs.tag,\n tagPrefix: parsedArgs.tagPrefix,\n changelog: parsedArgs.changelog,\n allowUncommitted: parsedArgs.allowUncommitted,\n })\n process.exit(0)\n }\n catch (error: any) {\n displayError(error, { operation: 'Rust 版本更新' })\n process.exit(1)\n }\n }\n\n if (parsedArgs.projectPath) {\n const resolvedProjectPath = resolve(process.cwd(), parsedArgs.projectPath)\n if (!existsSync(resolvedProjectPath)) {\n displayError(new Error(`路径 \"${parsedArgs.projectPath}\" 不存在`), { operation: '路径验证' })\n process.exit(1)\n }\n const pkgJsonPath = join(resolvedProjectPath, 'package.json')\n if (!existsSync(pkgJsonPath)) {\n displayError(new Error(`路径 \"${parsedArgs.projectPath}\" 中不存在 package.json`), { operation: 'package.json 检测' })\n log.info(`💡 请确保指定的路径是一个有效的 Node.js 项目目录`)\n process.exit(1)\n }\n\n log.info(`切换到项目路径: ${resolvedProjectPath}`)\n\n const pkgJsonContent = JSON.parse(readFileSync(pkgJsonPath, 'utf8'))\n const packageName = pkgJsonContent.name || 'default'\n\n parsedArgs.package = packageName\n\n clearConfigCache(resolvedProjectPath)\n const projectConfig = await loadConfigAsync(resolvedProjectPath)\n\n projectConfig.packagePaths = {\n [packageName]: pkgJsonPath,\n }\n\n const projectVersionManager = new VersionManager({ config: projectConfig, rootDir: resolvedProjectPath })\n log.setLevel(parsedArgs.verbose ? 'debug' : 'info')\n\n if (hasUncommittedChanges()) {\n if (!parsedArgs.allowUncommitted) {\n log.warn('警告: 检测到未提交的Git更改')\n\n const inquirer = await import('inquirer')\n const answers = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'continue',\n message: parsedArgs.dryRun\n ? '是否继续(dry-run模式不会实际提交更改)?'\n : '是否提交这些更改并继续?',\n default: true,\n },\n ])\n\n if (!answers.continue) {\n log.info('操作已取消')\n process.exit(0)\n }\n\n if (!parsedArgs.dryRun) {\n const commitMessage = 'chore: update mbump config and settings'\n execSync(`git add . && git commit -m \"${commitMessage}\"`, { encoding: 'utf8', stdio: 'pipe' })\n log.success(`已提交更改: ${commitMessage}`)\n }\n else {\n log.info('dry-run模式: 跳过实际提交操作')\n }\n }\n else {\n log.warn('警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。')\n }\n }\n\n let selectedType = parsedArgs.type\n let customVersion: string | null = null\n\n if (!parsedArgs.type) {\n const currentVersion = projectVersionManager.getPackageVersion(packageName)\n if (currentVersion) {\n const selection = await selectVersionInteractive(projectConfig, packageName, currentVersion, resolvedProjectPath)\n selectedType = selection.type\n customVersion = selection.customVersion\n }\n }\n\n if (parsedArgs.dryRun) {\n const preview = await projectVersionManager.previewUpdate(parsedArgs.package!, selectedType, {\n customVersion,\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n npm: parsedArgs.npm,\n })\n renderPreview(preview)\n process.exit(0)\n }\n\n await projectVersionManager.updateVersion(parsedArgs.package!, selectedType, {\n dryRun: parsedArgs.dryRun,\n verbose: parsedArgs.verbose,\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n npm: parsedArgs.npm,\n customVersion,\n })\n\n log.success(`版本更新完成`)\n process.exit(0)\n }\n\n const rootDir = process.cwd()\n const config: Config = await log.withSpinner('正在加载配置...', () => loadConfigAsync(rootDir), {\n succeedText: '配置加载完成',\n failText: '配置加载失败',\n })\n\n const parsedArgsWithDefaults = parseArgs(args, config.defaults)\n\n if (parsedArgsWithDefaults.showConfig) {\n log.info('📋 当前加载的配置:')\n log.info('')\n\n // 显示配置文件路径\n if (config.usedConfigPath) {\n const fileName = config.usedConfigPath.split(/[/\\\\]/).pop()\n log.info(` 配置文件: ${fileName}`)\n }\n else {\n log.info(' 配置文件: (默认配置)')\n }\n\n // 显示包路径\n log.info('')\n log.info('📦 包路径:')\n for (const [name, path] of Object.entries(config.packagePaths)) {\n log.info(` ${name}: ${path}`)\n }\n\n // 显示默认选项\n log.info('')\n log.info('⚙️ 默认选项:')\n log.info(` releaseType: ${config.defaults?.releaseType}`)\n log.info(` dryRun: ${config.defaults?.dryRun}`)\n log.info(` verbose: ${config.defaults?.verbose}`)\n log.info(` allowUncommitted: ${config.defaults?.allowUncommitted}`)\n log.info(` npm: ${config.defaults?.npm}`)\n\n // 显示 Git 选项\n log.info('')\n log.info('🔧 Git 选项:')\n log.info(` commit: ${config.git?.autoCommit}`)\n log.info(` push: ${config.git?.push}`)\n log.info(` tag: ${config.git?.tag}`)\n log.info(` changelog: ${config.git?.changelog}`)\n\n // 显示 Publish 选项\n log.info('')\n log.info('🚀 发布选项:')\n log.info(` command: ${config.publish?.command}`)\n log.info(` skipChecks: ${config.publish?.skipChecks}`)\n\n log.info('')\n process.exit(0)\n }\n\n const packageNames = Object.keys(config.packagePaths)\n if (!parsedArgsWithDefaults.package) {\n if (packageNames.includes('default')) {\n parsedArgsWithDefaults.package = 'default'\n }\n else if (packageNames.length === 1) {\n parsedArgsWithDefaults.package = packageNames[0]\n }\n else {\n displayError(new Error(`未指定包名\\n可用的包名: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`))\n process.exit(1)\n }\n }\n else if (parsedArgsWithDefaults.package !== 'all' && !packageNames.includes(parsedArgsWithDefaults.package)) {\n const maybePath = parsedArgsWithDefaults.package\n if (maybePath) {\n const resolvedPath = resolve(process.cwd(), maybePath)\n const pkgJsonPath = join(resolvedPath, 'package.json')\n if (existsSync(resolvedPath) && existsSync(pkgJsonPath)) {\n log.info(`切换到项目路径: ${resolvedPath}`)\n\n const pkgJsonContent = JSON.parse(readFileSync(pkgJsonPath, 'utf8'))\n const packageName = pkgJsonContent.name || 'default'\n\n clearConfigCache(resolvedPath)\n const projectConfig = await loadConfigAsync(resolvedPath)\n\n projectConfig.packagePaths = {\n [packageName]: pkgJsonPath,\n }\n\n const projectVersionManager = new VersionManager({ config: projectConfig, rootDir: resolvedPath })\n log.setLevel(parsedArgsWithDefaults.verbose ? 'debug' : 'info')\n\n let selectedType = parsedArgsWithDefaults.type\n let customVersion: string | null = null\n\n if (!parsedArgsWithDefaults.type) {\n const currentVersion = projectVersionManager.getPackageVersion(packageName)\n if (currentVersion) {\n const selection = await selectVersionInteractive(projectConfig, packageName, currentVersion, resolvedPath)\n selectedType = selection.type\n customVersion = selection.customVersion\n }\n }\n\n if (parsedArgsWithDefaults.dryRun) {\n const preview = await projectVersionManager.previewUpdate(packageName, selectedType, {\n customVersion,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n })\n renderPreview(preview)\n process.exit(0)\n }\n\n await projectVersionManager.updateVersion(packageName, selectedType, {\n dryRun: parsedArgsWithDefaults.dryRun,\n verbose: parsedArgsWithDefaults.verbose,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n customVersion,\n })\n\n log.success(`版本更新完成`)\n process.exit(0)\n }\n else {\n displayError(new Error(`包名 \"${parsedArgsWithDefaults.package}\" 未在配置中找到,且路径 \"${resolvedPath}\" 不是有效的项目目录`), {\n operation: '包名/路径解析',\n })\n log.info(`💡 可用的包名: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`)\n log.info(`💡 也可以使用路径模式: mbump ./packages/my-pkg`)\n process.exit(1)\n }\n }\n\n displayError(new Error(`包名 \"${parsedArgsWithDefaults.package}\" 未在配置中找到`), {\n operation: '包名解析',\n })\n log.info(`💡 可用的包名: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`)\n log.info(`💡 也可以使用路径模式: mbump ./packages/my-pkg`)\n process.exit(1)\n }\n\n const versionManager = new VersionManager({ config, rootDir })\n log.setLevel(parsedArgsWithDefaults.verbose ? 'debug' : 'info')\n\n if (hasUncommittedChanges()) {\n if (!parsedArgsWithDefaults.allowUncommitted) {\n log.warn('警告: 检测到未提交的Git更改')\n\n const inquirer = await import('inquirer')\n const answers = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'continue',\n message: parsedArgsWithDefaults.dryRun\n ? '是否继续(dry-run模式不会实际提交更改)?'\n : '是否提交这些更改并继续?',\n default: true,\n },\n ])\n\n if (!answers.continue) {\n log.info('操作已取消')\n process.exit(0)\n }\n\n if (!parsedArgsWithDefaults.dryRun) {\n const commitMessage = 'chore: update mbump config and settings'\n execSync(`git add . && git commit -m \"${commitMessage}\"`, { encoding: 'utf8', stdio: 'pipe' })\n log.success(`已提交更改: ${commitMessage}`)\n }\n else {\n log.info('dry-run模式: 跳过实际提交操作')\n }\n }\n else {\n log.warn('警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。')\n }\n }\n\n if (parsedArgsWithDefaults.verbose) {\n if (config.usedConfigPath) {\n const fileName = config.usedConfigPath.split('\\\\').pop() || config.usedConfigPath\n log.info(`使用配置文件: ${fileName}`)\n }\n log.info(`更新信息: 包=${parsedArgsWithDefaults.package}, 类型=${parsedArgsWithDefaults.type}${parsedArgsWithDefaults.dryRun ? ' (试运行)' : ''}`)\n }\n\n let selectedType = parsedArgsWithDefaults.type\n let customVersion: string | null = null\n const packageVersionSelections: PackageVersionSelections = {}\n\n if (!parsedArgsWithDefaults.type) {\n if (parsedArgsWithDefaults.package === 'all') {\n const selections = await selectAllVersionsInteractive(config, rootDir)\n Object.assign(packageVersionSelections, selections)\n }\n else {\n const packageName = parsedArgsWithDefaults.package!\n const currentVersion = versionManager.getPackageVersion(packageName)\n\n if (currentVersion) {\n const selection = await selectVersionInteractive(config, packageName, currentVersion)\n selectedType = selection.type\n customVersion = selection.customVersion\n }\n }\n }\n\n if (parsedArgsWithDefaults.package === 'all' && Object.keys(packageVersionSelections).length > 0) {\n if (parsedArgsWithDefaults.dryRun) {\n const preview = await versionManager.previewUpdate('all', 'patch', {\n packageVersionSelections,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n })\n renderPreview(preview)\n process.exit(0)\n }\n\n const updatedPackagesInfo: Array<{ name: string, newVersion: string, pkgKey: string }> = []\n const errors: Array<{ packageName: string, error: Error }> = []\n const packages = Object.entries(packageVersionSelections)\n const total = packages.length\n\n log.info(`\\n📦 开始批量更新 ${total} 个包...\\n`)\n\n for (let i = 0; i < packages.length; i++) {\n const [packageName, selection] = packages[i]\n const current = i + 1\n\n // 显示进度\n updateProgress(current, total, packageName, 'processing')\n\n try {\n const result = await versionManager.updateVersion(packageName, selection.type, {\n dryRun: parsedArgsWithDefaults.dryRun,\n verbose: parsedArgsWithDefaults.verbose,\n customVersion: selection.customVersion,\n autoCommit: false,\n push: false,\n isBatchMode: true, // 标识这是批量更新模式\n })\n\n // 收集更新的包信息,同时记录包名 key\n if (result.success && result.updatedPackages.length > 0) {\n updatedPackagesInfo.push(...result.updatedPackages.map(pkg => ({\n ...pkg,\n pkgKey: packageName,\n })))\n updateProgress(current, total, packageName, 'success')\n }\n else {\n updateProgress(current, total, packageName, 'failed')\n }\n }\n catch (error) {\n errors.push({ packageName, error: error as Error })\n displayError(error as Error, { packageName, operation: '更新' })\n updateProgress(current, total, packageName, 'failed')\n }\n }\n\n log.info('') // 空行分隔\n\n // 报告所有错误\n if (errors.length > 0) {\n log.error(`\\n❌ 批量更新完成,但有 ${errors.length} 个包更新失败:`)\n errors.forEach(({ packageName, error }) => {\n log.error(` - ${packageName}: ${error.message}`)\n })\n log.info('\\n💡 提示: 可以单独重试失败的包,或检查错误信息后重新运行')\n }\n\n if (!parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.autoCommit && updatedPackagesInfo.length > 0) {\n await versionManager.gitCommitAndPush(\n parsedArgsWithDefaults.push,\n updatedPackagesInfo,\n config.git?.tag !== false,\n config.git?.tagPrefix || 'v',\n )\n }\n\n if (parsedArgsWithDefaults.npm && !parsedArgsWithDefaults.dryRun) {\n const npmErrors: Array<{ packageName: string, error: Error }> = []\n const npmPackages = Object.entries(packageVersionSelections)\n const npmTotal = npmPackages.length\n\n log.info(`\\n🚀 开始发布 ${npmTotal} 个包到 NPM...\\n`)\n\n for (let i = 0; i < npmPackages.length; i++) {\n const [packageName, selection] = npmPackages[i]\n const npmCurrent = i + 1\n\n // 显示进度\n updateProgress(npmCurrent, npmTotal, packageName, 'processing')\n\n try {\n await versionManager.updateVersion(packageName, selection.type, {\n dryRun: false,\n verbose: parsedArgsWithDefaults.verbose,\n customVersion: selection.customVersion,\n autoCommit: false,\n push: false,\n npm: true,\n })\n\n updateProgress(npmCurrent, npmTotal, packageName, 'success')\n }\n catch (error) {\n npmErrors.push({ packageName, error: error as Error })\n displayError(error as Error, { packageName, operation: '发布' })\n updateProgress(npmCurrent, npmTotal, packageName, 'failed')\n }\n }\n\n log.info('') // 空行分隔\n\n // 报告 NPM 发布错误\n if (npmErrors.length > 0) {\n log.error(`\\n❌ NPM 发布完成,但有 ${npmErrors.length} 个包发布失败:`)\n npmErrors.forEach(({ packageName, error }) => {\n log.error(` - ${packageName}: ${error.message}`)\n })\n }\n }\n }\n else {\n if (parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.package) {\n const preview = await versionManager.previewUpdate(parsedArgsWithDefaults.package, selectedType, {\n customVersion,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n })\n renderPreview(preview)\n process.exit(0)\n }\n\n await versionManager.updateVersion(parsedArgsWithDefaults.package!, selectedType, {\n dryRun: parsedArgsWithDefaults.dryRun,\n verbose: parsedArgsWithDefaults.verbose,\n customVersion,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n })\n }\n\n log.success(`版本更新完成${parsedArgsWithDefaults.dryRun ? ' (试运行模式)' : ''}`)\n process.exit(0)\n }\n catch (error: any) {\n displayError(error as Error)\n process.exit(1)\n }\n}\n\nmain().catch((error: any) => {\n displayError(error as Error, { operation: 'CLI执行' })\n process.exit(1)\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","names":["config: Config","packageName: string","currentVersion: string","rootDir?: string","customVersion: string | null","input: string","rootDir: string","selections: PackageVersionSelections","args: string[]","defaults: DefaultsConfig","parsed: ParsedArgs","allowedTypes: ReleaseType[]","preview: PreviewResult","error: Error","context?: { packageName?: string, operation?: string }","current: number","total: number","width: number","packageName: string","status: 'processing' | 'success' | 'failed'","rootDir","inquirer","selectedType","customVersion: string | null","config","error: any","config: Config","packageVersionSelections: PackageVersionSelections","updatedPackagesInfo: Array<{ name: string, newVersion: string, pkgKey: string }>","errors: Array<{ packageName: string, error: Error }>","npmErrors: Array<{ packageName: string, error: Error }>"],"sources":["../src/cli/interactive.ts","../src/cli/parser.ts","../src/cli/index.ts"],"sourcesContent":["import type { Config, PackageVersionSelections, ReleaseType } from '@/types'\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport inquirer from 'inquirer'\nimport semver from 'semver'\nimport { VersionManager } from '@/core/VersionManager'\n\nexport async function selectVersionInteractive(\n config: Config,\n packageName: string,\n currentVersion: string,\n rootDir?: string,\n): Promise<{ type: ReleaseType, customVersion: string | null }> {\n let displayName = packageName\n\n if (rootDir && packageName !== 'default') {\n const pkgPath = config.packagePaths[packageName]\n if (pkgPath) {\n // const { readFileSync } = require('node:fs')\n // const { _join, resolve } = require('node:path')\n try {\n const fullPath = resolve(rootDir, pkgPath)\n const pkgContent = JSON.parse(readFileSync(fullPath, 'utf8'))\n if (pkgContent.name) {\n displayName = pkgContent.name\n }\n }\n catch {\n }\n }\n }\n\n const choices = [\n { name: `major ${semver.inc(currentVersion, 'major')}`, value: 'major' },\n { name: `minor ${semver.inc(currentVersion, 'minor')}`, value: 'minor' },\n { name: `patch ${semver.inc(currentVersion, 'patch')}`, value: 'patch' },\n { name: `next ${semver.inc(currentVersion, 'patch')}`, value: 'next' },\n { name: `conventional ${semver.inc(currentVersion, 'patch')}`, value: 'conventional' },\n {\n name: `pre-patch ${\n semver.prerelease(currentVersion)\n ? semver.inc(currentVersion, 'prerelease')\n : semver.inc(semver.coerce(currentVersion)!.version, 'prepatch', 'beta')\n }`,\n value: 'pre-patch',\n },\n {\n name: `pre-minor ${semver.inc(semver.coerce(currentVersion)!.version, 'preminor', 'beta')}`,\n value: 'pre-minor',\n },\n {\n name: `pre-major ${semver.inc(semver.coerce(currentVersion)!.version, 'premajor', 'beta')}`,\n value: 'pre-major',\n },\n { name: `as-is ${currentVersion}`, value: 'as-is' },\n { name: 'custom ...', value: 'custom' },\n ]\n\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'versionType',\n message: `[${displayName}] Current version ${currentVersion} »`,\n choices,\n default: config.defaults?.releaseType || 'patch',\n },\n ])\n\n const selectedType = answers.versionType as ReleaseType\n let customVersion: string | null = null\n\n if (selectedType === 'custom') {\n const customAnswer = await inquirer.prompt([\n {\n type: 'input',\n name: 'customVersion',\n message: 'Enter custom version:',\n validate: (input: string) => (semver.valid(input) ? true : 'Please enter a valid semver version'),\n },\n ])\n customVersion = customAnswer.customVersion\n }\n\n return { type: selectedType, customVersion }\n}\n\nexport async function selectAllVersionsInteractive(\n config: Config,\n rootDir: string,\n): Promise<PackageVersionSelections> {\n const versionManager = new VersionManager({ config, rootDir })\n const allPackageNames = Object.keys(config.packagePaths)\n const selections: PackageVersionSelections = {}\n\n for (const packageName of allPackageNames) {\n const currentVersion = versionManager.getPackageVersion(packageName)\n if (currentVersion) {\n const selection = await selectVersionInteractive(config, packageName, currentVersion, rootDir)\n selections[packageName] = selection\n }\n }\n\n return selections\n}\n","import type { DefaultsConfig, ParsedArgs, ReleaseType } from '@/types'\nimport { isPathLike } from '@/utils/path'\n\nexport function parseArgs(args: string[], defaults: DefaultsConfig = {}): ParsedArgs {\n const parsed: ParsedArgs = {\n package: null,\n projectPath: null,\n type: undefined,\n dryRun: defaults.dryRun || false,\n help: false,\n version: false,\n verbose: defaults.verbose || false,\n autoCommit: (defaults as any).git?.autoCommit !== false,\n push: (defaults as any).git?.push !== false,\n allowUncommitted: defaults.allowUncommitted || false,\n npm: defaults.npm || false,\n showConfig: false,\n rust: false,\n tag: (defaults as any).git?.tag !== false,\n tagPrefix: (defaults as any).git?.tagPrefix || 'v',\n changelog: (defaults as any).git?.changelog !== false,\n }\n\n const allowedTypes: ReleaseType[] = [\n 'major',\n 'minor',\n 'patch',\n 'pre-patch',\n 'pre-minor',\n 'pre-major',\n 'as-is',\n 'next',\n 'conventional',\n ]\n\n let i = 0\n while (i < args.length) {\n const arg = args[i]\n\n if (arg === '--dry-run' || arg === '-d') {\n parsed.dryRun = true\n i++\n }\n else if (arg === '--verbose' || arg === '-v') {\n parsed.verbose = true\n i++\n }\n else if (arg === '--no-commit' || arg === '-n') {\n parsed.autoCommit = false\n i++\n }\n else if (arg === '--no-push' || arg === '-p') {\n parsed.push = false\n i++\n }\n else if (arg === '--allow-uncommitted' || arg === '-u') {\n parsed.allowUncommitted = true\n i++\n }\n else if (arg === '--npm' || arg === '-N') {\n parsed.npm = true\n i++\n }\n else if (arg === '--show-config' || arg === '-c') {\n parsed.showConfig = true\n i++\n }\n else if (arg === '--rust' || arg === '-r') {\n parsed.rust = true\n i++\n }\n else if (arg === '--version' || arg === '-V') {\n parsed.version = true\n i++\n }\n else if (arg === '--type' || arg === '-t') {\n if (i + 1 < args.length) {\n const typeValue = args[i + 1] as ReleaseType\n if (allowedTypes.includes(typeValue)) {\n parsed.type = typeValue\n i += 2\n }\n else {\n throw new Error(`不支持的版本类型: ${typeValue},支持的类型: ${allowedTypes.join(', ')}`)\n }\n }\n else {\n throw new Error('--type 参数需要一个值')\n }\n }\n else if (arg.startsWith('--type=') || arg.startsWith('-t=')) {\n const typeValue = arg.split('=')[1] as ReleaseType\n if (allowedTypes.includes(typeValue)) {\n parsed.type = typeValue\n }\n else {\n throw new Error(`不支持的版本类型: ${typeValue},支持的类型: ${allowedTypes.join(', ')}`)\n }\n i++\n }\n else if (!arg.startsWith('-')) {\n if (!parsed.projectPath && !parsed.package) {\n if (isPathLike(arg)) {\n parsed.projectPath = arg\n }\n else {\n parsed.package = arg\n }\n }\n else if (allowedTypes.includes(arg as ReleaseType)) {\n parsed.type = arg as ReleaseType\n }\n else if (!parsed.package && !isPathLike(arg)) {\n parsed.package = arg\n }\n i++\n }\n else {\n i++\n }\n }\n\n return parsed\n}\n","#!/usr/bin/env node\nimport type { Config, PackageVersionSelections, PreviewResult, ReleaseType } from '@/types'\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport { clearConfigCache, loadConfigAsync } from '@/config/loader'\nimport { RustManager } from '@/core/RustManager'\nimport { VersionManager } from '@/core/VersionManager'\nimport log from '@/utils/logger'\nimport { selectAllVersionsInteractive, selectVersionInteractive } from './interactive'\nimport { parseArgs } from './parser'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\nfunction renderPreview(preview: PreviewResult): void {\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n\n for (const pkg of preview.packages) {\n log.info(` 📦 ${pkg.name}`)\n log.info(` 当前版本: ${pkg.oldVersion}`)\n log.info(` 新版本: ${pkg.newVersion}`)\n log.info(` Tag: ${pkg.tagName}`)\n log.info(` CHANGELOG: ${pkg.changelogEnabled ? '是' : pkg.isDefaultPackage ? '否(配置禁用)' : '跳过(子包)'}`)\n log.info('')\n }\n\n log.info(` Git Commit: ${preview.autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${preview.push ? '是' : '否'}`)\n log.info(` NPM Publish: ${preview.npm ? '是' : '否'}`)\n log.info('\\n✅ 以上为预览,未执行任何实际操作')\n}\n\nlet packageVersion = '1.0.0'\n// 尝试多个可能的路径查找package.json\nconst possiblePaths = [\n join(__dirname, '..', '..', 'package.json'),\n join(__dirname, '..', 'package.json'),\n join(process.cwd(), 'package.json'),\n]\n\n/**\n * 获取友好的错误提示和解决方案\n */\nfunction getFriendlyErrorMessage(error: Error): { message: string, solution?: string } {\n const errorMessage = error.message\n\n // 版本已存在\n if (errorMessage.includes('已存在')) {\n return {\n message: `⚠️ 版本 ${errorMessage.match(/版本 (.+?) 已存在/)?.[1] || ''} 已存在`,\n solution: '💡 请使用其他版本号,或运行 git tag -d <tag> 删除已有标签',\n }\n }\n\n // Git 冲突\n if (errorMessage.includes('Git conflict') || errorMessage.includes('conflict')) {\n return {\n message: '⚠️ 检测到 Git 冲突',\n solution: '💡 请先解决冲突后重试:git add . && git commit -m \"resolve conflicts\"',\n }\n }\n\n // NPM 认证失败\n if (errorMessage.includes('npm ERR! code E401') || errorMessage.includes('authentication')) {\n return {\n message: '🔐 NPM 认证失败',\n solution: '💡 请运行 npm login 或 pnpm login 登录后重试',\n }\n }\n\n // NPM 包已存在\n if (errorMessage.includes('npm ERR! code E403') || errorMessage.includes('cannot publish')) {\n return {\n message: '📦 NPM 包已存在或无权限',\n solution: '💡 检查包名是否已被占用,或确认是否有发布权限',\n }\n }\n\n // 网络错误\n if (errorMessage.includes('network') || errorMessage.includes('ENOTFOUND') || errorMessage.includes('ECONNREFUSED')) {\n return {\n message: '🌐 网络连接失败',\n solution: '💡 请检查网络连接,或配置 NPM 镜像源',\n }\n }\n\n // 文件路径安全\n if (errorMessage.includes('不安全的文件路径')) {\n return {\n message: '🔒 检测到不安全的文件路径',\n solution: '💡 请确保配置文件中的路径在项目根目录内',\n }\n }\n\n // 无效的包名\n if (errorMessage.includes('无效的包名')) {\n return {\n message: '❌ 无效的包名',\n solution: '💡 请检查配置文件中的 packagePaths 是否正确设置',\n }\n }\n\n // 不支持的版本类型\n if (errorMessage.includes('不支持的版本类型')) {\n return {\n message: '❌ 不支持的版本类型',\n solution: '💡 支持的版本类型: major, minor, patch, pre-patch, pre-minor, pre-major, next, as-is, conventional',\n }\n }\n\n // 无效的自定义版本号\n if (errorMessage.includes('无效的自定义版本号')) {\n return {\n message: '❌ 无效的自定义版本号',\n solution: '💡 请使用符合 semver 规范的版本号,如 1.0.0, 1.0.1-beta.1',\n }\n }\n\n // 版本计算失败\n if (errorMessage.includes('版本计算失败')) {\n return {\n message: '❌ 版本计算失败',\n solution: '💡 请检查当前版本号是否符合 semver 规范,或使用 --verbose 模式查看详细错误',\n }\n }\n\n // 无法计算新版本号\n if (errorMessage.includes('无法计算新版本号')) {\n return {\n message: '❌ 无法计算新版本号',\n solution: '💡 请检查当前版本号是否符合 semver 规范,或尝试使用不同的版本类型',\n }\n }\n\n // 文件读取失败\n if (errorMessage.includes('读取文件失败')) {\n return {\n message: '📁 文件读取失败',\n solution: '💡 请检查文件路径是否正确,文件是否存在且有读取权限',\n }\n }\n\n // 文件写入失败\n if (errorMessage.includes('写入文件失败')) {\n return {\n message: '📁 文件写入失败',\n solution: '💡 请检查文件路径是否正确,是否有写入权限,磁盘空间是否充足',\n }\n }\n\n // Git 操作失败\n if (errorMessage.includes('Git') && errorMessage.includes('失败')) {\n return {\n message: '🔧 Git 操作失败',\n solution: '💡 请检查 Git 仓库状态,确保有提交权限,或使用 --verbose 模式查看详细错误',\n }\n }\n\n // NPM 发布失败\n if (errorMessage.includes('发布失败')) {\n return {\n message: '🚀 NPM 发布失败',\n solution: '💡 请检查 NPM 配置、认证状态和网络连接,或使用 --verbose 模式查看详细错误',\n }\n }\n\n // Cargo.toml 相关错误\n if (errorMessage.includes('Cargo.toml')) {\n return {\n message: '🦀 Cargo.toml 操作失败',\n solution: '💡 请检查 Cargo.toml 文件是否存在,格式是否正确,或使用 --verbose 模式查看详细错误',\n }\n }\n\n // 不存在 package.json\n if (errorMessage.includes('不存在 package.json')) {\n return {\n message: '📦 package.json 不存在',\n solution: '💡 请确保指定的路径是一个有效的 Node.js 项目目录',\n }\n }\n\n // 路径不存在(放在 package.json 检查之后,避免误匹配)\n if (errorMessage.includes('路径') && errorMessage.includes('不存在') && !errorMessage.includes('package.json')) {\n return {\n message: '📂 路径不存在',\n solution: '💡 请检查路径是否正确,确保目录存在',\n }\n }\n\n // 配置错误\n if (errorMessage.includes('配置错误')) {\n return {\n message: '⚙️ 配置错误',\n solution: '💡 请检查配置文件是否正确,或使用 --show-config 查看当前配置',\n }\n }\n\n // 默认错误消息\n return {\n message: `❌ ${errorMessage}`,\n solution: '💡 请检查错误信息,或使用 --verbose 模式查看更多详情',\n }\n}\n\n/**\n * 显示友好的错误信息\n */\nfunction displayError(error: Error, context?: { packageName?: string, operation?: string }): void {\n const { message, solution } = getFriendlyErrorMessage(error)\n\n if (context?.packageName) {\n log.error(`包 ${context.packageName} ${context.operation || '操作'} 失败:`)\n }\n\n log.error(` ${message}`)\n\n if (solution) {\n log.info(` ${solution}`)\n }\n\n // 调试模式下显示详细错误\n if (process.env.DEBUG) {\n log.debug(`详细错误信息: ${JSON.stringify(error, null, 2)}`)\n }\n}\n\n/**\n * 渲染进度条\n * @param current 当前进度\n * @param total 总数量\n * @param width 进度条宽度(字符数)\n * @returns 进度条字符串\n */\nfunction renderProgressBar(current: number, total: number, width: number = 30): string {\n const percentage = Math.round((current / total) * 100)\n const filledLength = Math.round((width * current) / total)\n const emptyLength = width - filledLength\n\n const filled = '█'.repeat(filledLength)\n const empty = '░'.repeat(emptyLength)\n\n return `[${filled}${empty}] ${percentage}% | ${current}/${total}`\n}\n\n/**\n * 显示批量更新进度\n */\nfunction updateProgress(\n current: number,\n total: number,\n packageName: string,\n status: 'processing' | 'success' | 'failed',\n): void {\n const progressBar = renderProgressBar(current, total)\n const statusIcon = status === 'success' ? '✓' : status === 'failed' ? '✗' : '⟳'\n const statusText = status === 'processing' ? '处理中' : status === 'success' ? '完成' : '失败'\n\n // 清除当前行并显示新进度\n process.stdout.write(`\\r${progressBar} | ${statusIcon} ${packageName} - ${statusText} `)\n\n // 如果是最后一个或失败/成功,换行\n if (current === total || status !== 'processing') {\n process.stdout.write('\\n')\n }\n}\n\nfor (const packageJsonPath of possiblePaths) {\n try {\n if (existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'))\n packageVersion = packageJson.version || packageVersion\n break\n }\n }\n catch {\n // 继续尝试下一个路径\n }\n}\n\nprocess.env.NODE_NO_WARNINGS = '1'\n\nexport function showHelp(): void {\n const helpText = `🔧 mbump v${packageVersion}\n========================\n企业级版本管理工具,支持单包和monorepo场景\n\n用法: mbump [package|path] [type] [options]\n\n参数:\n [package] 要更新的包名称或 \"all\" 更新所有包\n [path] 项目目录路径(支持 ./path, ../path, /path, C:\\\\path),自动查找该目录下的 package.json\n [type] 版本升级类型: major, minor, patch, pre-patch, pre-minor, pre-major\n\n选项:\n --dry-run, -d 试运行模式,只显示将要执行的操作\n --verbose, -v 详细输出模式,显示更多执行细节\n --no-commit, -n 禁用自动git提交\n --no-push, -p 禁用自动推送到远程仓库\n --allow-uncommitted, -u 允许在有未提交更改的情况下继续操作\n --npm, -N 启用npm包发布功能(默认不发布)\n --show-config, -c 显示当前加载的完整配置信息\n --rust, -r 启用 Rust 项目模式,更新 Cargo.toml 中的版本号\n --version, -V 显示版本信息\n --help, -h 显示此帮助信息\n\n示例:\n mbump components patch # 将components包升级一个补丁版本\n mbump all minor # 将所有包升级一个小版本\n mbump plugins major --dry-run # 试运行升级plugins包主版本\n mbump core patch --no-push # 更新版本并提交到本地,但不推送到远程\n mbump components patch --npm # 更新版本并发布到npm\n\n # 路径模式(直接指定项目目录)\n mbump ./packages/my-pkg # 更新 ./packages/my-pkg 目录下的 package.json\n mbump ./packages/my-pkg patch # 指定版本类型\n mbump ../other-project minor # 更新上级目录的项目\n\n # Rust 项目模式(更新 Cargo.toml)\n mbump --rust patch # 更新当前目录 Rust 项目的补丁版本\n mbump -r minor # 更新当前目录 Rust 项目的小版本\n mbump -r major --dry-run # 试运行升级当前目录 Rust 项目的主版本\n mbump ./backend -r patch # 更新指定目录下的 Rust 项目\n mbump ./backend -r -d # 试运行模式更新指定目录下的 Rust 项目\n`\n log.info(helpText)\n}\n\nfunction hasUncommittedChanges(): boolean {\n try {\n const output = execSync('git status --porcelain', { encoding: 'utf8', stdio: 'pipe' })\n return output.trim() !== ''\n }\n catch {\n return false\n }\n}\n\nasync function main(): Promise<void> {\n try {\n const args = process.argv.slice(2)\n\n if (args.includes('--help') || args.includes('-h')) {\n showHelp()\n process.exit(0)\n }\n\n if (args.includes('--version') || args.includes('-V')) {\n log.info(`mbump v${packageVersion}`)\n process.exit(0)\n }\n\n const parsedArgs = parseArgs(args)\n\n if (parsedArgs.rust) {\n const rootDir = parsedArgs.projectPath\n ? resolve(process.cwd(), parsedArgs.projectPath)\n : process.cwd()\n\n if (parsedArgs.projectPath && !existsSync(rootDir)) {\n displayError(new Error(`路径 \"${parsedArgs.projectPath}\" 不存在`), {\n operation: '路径验证',\n })\n process.exit(1)\n }\n\n const rustManager = new RustManager(rootDir)\n\n if (parsedArgs.projectPath) {\n log.info(`切换到项目路径: ${rootDir}`)\n }\n\n if (hasUncommittedChanges()) {\n if (!parsedArgs.allowUncommitted) {\n log.warn('警告: 检测到未提交的Git更改')\n\n const inquirer = await import('inquirer')\n const answers = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'continue',\n message: parsedArgs.dryRun\n ? '是否继续(dry-run模式不会实际提交更改)?'\n : '是否提交这些更改并继续?',\n default: true,\n },\n ])\n\n if (!answers.continue) {\n log.info('操作已取消')\n process.exit(0)\n }\n\n if (!parsedArgs.dryRun) {\n const commitMessage = 'chore: update mbump config and settings'\n execSync(`git add . && git commit -m \"${commitMessage}\"`, { encoding: 'utf8', stdio: 'pipe' })\n log.success(`已提交更改: ${commitMessage}`)\n }\n else {\n log.info('dry-run模式: 跳过实际提交操作')\n }\n }\n else {\n log.warn('警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。')\n }\n }\n\n if (!rustManager.exists()) {\n displayError(new Error(`Cargo.toml 文件不存在于路径 \"${rootDir}\"`), {\n operation: 'Rust 项目检测',\n })\n log.info(`💡 请确保指定的路径是 Rust 项目根目录`)\n process.exit(1)\n }\n\n const currentVersion = rustManager.getCurrentVersion()\n if (!currentVersion) {\n displayError(new Error(`Cargo.toml 文件中未找到 [package] 部分的 version 字段`), {\n operation: '版本读取',\n })\n process.exit(1)\n }\n\n let selectedType = parsedArgs.type\n let customVersion: string | null = null\n\n if (!parsedArgs.type) {\n const config = {\n defaults: { releaseType: 'patch' },\n packagePaths: {},\n } as any\n const selection = await selectVersionInteractive(config, 'rust', currentVersion)\n selectedType = selection.type\n customVersion = selection.customVersion\n }\n\n try {\n rustManager.updateVersion(selectedType as ReleaseType, {\n dryRun: parsedArgs.dryRun,\n verbose: parsedArgs.verbose,\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n customVersion,\n tag: parsedArgs.tag,\n changelog: parsedArgs.changelog,\n allowUncommitted: parsedArgs.allowUncommitted,\n })\n process.exit(0)\n }\n catch (error: any) {\n displayError(error, { operation: 'Rust 版本更新' })\n process.exit(1)\n }\n }\n\n if (parsedArgs.projectPath) {\n const resolvedProjectPath = resolve(process.cwd(), parsedArgs.projectPath)\n if (!existsSync(resolvedProjectPath)) {\n displayError(new Error(`路径 \"${parsedArgs.projectPath}\" 不存在`), { operation: '路径验证' })\n process.exit(1)\n }\n const pkgJsonPath = join(resolvedProjectPath, 'package.json')\n if (!existsSync(pkgJsonPath)) {\n displayError(new Error(`路径 \"${parsedArgs.projectPath}\" 中不存在 package.json`), { operation: 'package.json 检测' })\n log.info(`💡 请确保指定的路径是一个有效的 Node.js 项目目录`)\n process.exit(1)\n }\n\n log.info(`切换到项目路径: ${resolvedProjectPath}`)\n\n const pkgJsonContent = JSON.parse(readFileSync(pkgJsonPath, 'utf8'))\n const packageName = pkgJsonContent.name || 'default'\n\n parsedArgs.package = packageName\n\n clearConfigCache(resolvedProjectPath)\n const projectConfig = await loadConfigAsync(resolvedProjectPath)\n\n projectConfig.packagePaths = {\n [packageName]: pkgJsonPath,\n }\n\n const projectVersionManager = new VersionManager({ config: projectConfig, rootDir: resolvedProjectPath })\n log.setLevel(parsedArgs.verbose ? 'debug' : 'info')\n\n if (hasUncommittedChanges()) {\n if (!parsedArgs.allowUncommitted) {\n log.warn('警告: 检测到未提交的Git更改')\n\n const inquirer = await import('inquirer')\n const answers = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'continue',\n message: parsedArgs.dryRun\n ? '是否继续(dry-run模式不会实际提交更改)?'\n : '是否提交这些更改并继续?',\n default: true,\n },\n ])\n\n if (!answers.continue) {\n log.info('操作已取消')\n process.exit(0)\n }\n\n if (!parsedArgs.dryRun) {\n const commitMessage = 'chore: update mbump config and settings'\n execSync(`git add . && git commit -m \"${commitMessage}\"`, { encoding: 'utf8', stdio: 'pipe' })\n log.success(`已提交更改: ${commitMessage}`)\n }\n else {\n log.info('dry-run模式: 跳过实际提交操作')\n }\n }\n else {\n log.warn('警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。')\n }\n }\n\n let selectedType = parsedArgs.type\n let customVersion: string | null = null\n\n if (!parsedArgs.type) {\n const currentVersion = projectVersionManager.getPackageVersion(packageName)\n if (currentVersion) {\n const selection = await selectVersionInteractive(projectConfig, packageName, currentVersion, resolvedProjectPath)\n selectedType = selection.type\n customVersion = selection.customVersion\n }\n }\n\n if (parsedArgs.dryRun) {\n const preview = await projectVersionManager.previewUpdate(parsedArgs.package!, selectedType, {\n customVersion,\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n npm: parsedArgs.npm,\n })\n renderPreview(preview)\n process.exit(0)\n }\n\n await projectVersionManager.updateVersion(parsedArgs.package!, selectedType, {\n dryRun: parsedArgs.dryRun,\n verbose: parsedArgs.verbose,\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n npm: parsedArgs.npm,\n customVersion,\n })\n\n log.success(`版本更新完成`)\n process.exit(0)\n }\n\n const rootDir = process.cwd()\n const config: Config = await log.withSpinner('正在加载配置...', () => loadConfigAsync(rootDir), {\n succeedText: '配置加载完成',\n failText: '配置加载失败',\n })\n\n const parsedArgsWithDefaults = parseArgs(args, config.defaults)\n\n if (parsedArgsWithDefaults.showConfig) {\n log.info('📋 当前加载的配置:')\n log.info('')\n\n // 显示配置文件路径\n if (config.usedConfigPath) {\n const fileName = config.usedConfigPath.split(/[/\\\\]/).pop()\n log.info(` 配置文件: ${fileName}`)\n }\n else {\n log.info(' 配置文件: (默认配置)')\n }\n\n // 显示包路径\n log.info('')\n log.info('📦 包路径:')\n for (const [name, path] of Object.entries(config.packagePaths)) {\n log.info(` ${name}: ${path}`)\n }\n\n // 显示默认选项\n log.info('')\n log.info('⚙️ 默认选项:')\n log.info(` releaseType: ${config.defaults?.releaseType}`)\n log.info(` dryRun: ${config.defaults?.dryRun}`)\n log.info(` verbose: ${config.defaults?.verbose}`)\n log.info(` allowUncommitted: ${config.defaults?.allowUncommitted}`)\n log.info(` npm: ${config.defaults?.npm}`)\n\n // 显示 Git 选项\n log.info('')\n log.info('🔧 Git 选项:')\n log.info(` commit: ${config.git?.autoCommit}`)\n log.info(` push: ${config.git?.push}`)\n log.info(` tag: ${config.git?.tag}`)\n log.info(` changelog: ${config.git?.changelog}`)\n\n // 显示 Publish 选项\n log.info('')\n log.info('🚀 发布选项:')\n log.info(` command: ${config.publish?.command}`)\n log.info(` skipChecks: ${config.publish?.skipChecks}`)\n\n log.info('')\n process.exit(0)\n }\n\n const packageNames = Object.keys(config.packagePaths)\n if (!parsedArgsWithDefaults.package) {\n if (packageNames.includes('default')) {\n parsedArgsWithDefaults.package = 'default'\n }\n else if (packageNames.length === 1) {\n parsedArgsWithDefaults.package = packageNames[0]\n }\n else {\n displayError(new Error(`未指定包名\\n可用的包名: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`))\n process.exit(1)\n }\n }\n else if (parsedArgsWithDefaults.package !== 'all' && !packageNames.includes(parsedArgsWithDefaults.package)) {\n const maybePath = parsedArgsWithDefaults.package\n if (maybePath) {\n const resolvedPath = resolve(process.cwd(), maybePath)\n const pkgJsonPath = join(resolvedPath, 'package.json')\n if (existsSync(resolvedPath) && existsSync(pkgJsonPath)) {\n log.info(`切换到项目路径: ${resolvedPath}`)\n\n const pkgJsonContent = JSON.parse(readFileSync(pkgJsonPath, 'utf8'))\n const packageName = pkgJsonContent.name || 'default'\n\n clearConfigCache(resolvedPath)\n const projectConfig = await loadConfigAsync(resolvedPath)\n\n projectConfig.packagePaths = {\n [packageName]: pkgJsonPath,\n }\n\n const projectVersionManager = new VersionManager({ config: projectConfig, rootDir: resolvedPath })\n log.setLevel(parsedArgsWithDefaults.verbose ? 'debug' : 'info')\n\n let selectedType = parsedArgsWithDefaults.type\n let customVersion: string | null = null\n\n if (!parsedArgsWithDefaults.type) {\n const currentVersion = projectVersionManager.getPackageVersion(packageName)\n if (currentVersion) {\n const selection = await selectVersionInteractive(projectConfig, packageName, currentVersion, resolvedPath)\n selectedType = selection.type\n customVersion = selection.customVersion\n }\n }\n\n if (parsedArgsWithDefaults.dryRun) {\n const preview = await projectVersionManager.previewUpdate(packageName, selectedType, {\n customVersion,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n })\n renderPreview(preview)\n process.exit(0)\n }\n\n await projectVersionManager.updateVersion(packageName, selectedType, {\n dryRun: parsedArgsWithDefaults.dryRun,\n verbose: parsedArgsWithDefaults.verbose,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n customVersion,\n })\n\n log.success(`版本更新完成`)\n process.exit(0)\n }\n else {\n displayError(new Error(`包名 \"${parsedArgsWithDefaults.package}\" 未在配置中找到,且路径 \"${resolvedPath}\" 不是有效的项目目录`), {\n operation: '包名/路径解析',\n })\n log.info(`💡 可用的包名: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`)\n log.info(`💡 也可以使用路径模式: mbump ./packages/my-pkg`)\n process.exit(1)\n }\n }\n\n displayError(new Error(`包名 \"${parsedArgsWithDefaults.package}\" 未在配置中找到`), {\n operation: '包名解析',\n })\n log.info(`💡 可用的包名: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`)\n log.info(`💡 也可以使用路径模式: mbump ./packages/my-pkg`)\n process.exit(1)\n }\n\n const versionManager = new VersionManager({ config, rootDir })\n log.setLevel(parsedArgsWithDefaults.verbose ? 'debug' : 'info')\n\n if (hasUncommittedChanges()) {\n if (!parsedArgsWithDefaults.allowUncommitted) {\n log.warn('警告: 检测到未提交的Git更改')\n\n const inquirer = await import('inquirer')\n const answers = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'continue',\n message: parsedArgsWithDefaults.dryRun\n ? '是否继续(dry-run模式不会实际提交更改)?'\n : '是否提交这些更改并继续?',\n default: true,\n },\n ])\n\n if (!answers.continue) {\n log.info('操作已取消')\n process.exit(0)\n }\n\n if (!parsedArgsWithDefaults.dryRun) {\n const commitMessage = 'chore: update mbump config and settings'\n execSync(`git add . && git commit -m \"${commitMessage}\"`, { encoding: 'utf8', stdio: 'pipe' })\n log.success(`已提交更改: ${commitMessage}`)\n }\n else {\n log.info('dry-run模式: 跳过实际提交操作')\n }\n }\n else {\n log.warn('警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。')\n }\n }\n\n if (parsedArgsWithDefaults.verbose) {\n if (config.usedConfigPath) {\n const fileName = config.usedConfigPath.split('\\\\').pop() || config.usedConfigPath\n log.info(`使用配置文件: ${fileName}`)\n }\n log.info(`更新信息: 包=${parsedArgsWithDefaults.package}, 类型=${parsedArgsWithDefaults.type}${parsedArgsWithDefaults.dryRun ? ' (试运行)' : ''}`)\n }\n\n let selectedType = parsedArgsWithDefaults.type\n let customVersion: string | null = null\n const packageVersionSelections: PackageVersionSelections = {}\n\n if (!parsedArgsWithDefaults.type) {\n if (parsedArgsWithDefaults.package === 'all') {\n const selections = await selectAllVersionsInteractive(config, rootDir)\n Object.assign(packageVersionSelections, selections)\n }\n else {\n const packageName = parsedArgsWithDefaults.package!\n const currentVersion = versionManager.getPackageVersion(packageName)\n\n if (currentVersion) {\n const selection = await selectVersionInteractive(config, packageName, currentVersion)\n selectedType = selection.type\n customVersion = selection.customVersion\n }\n }\n }\n\n if (parsedArgsWithDefaults.package === 'all' && Object.keys(packageVersionSelections).length > 0) {\n if (parsedArgsWithDefaults.dryRun) {\n const preview = await versionManager.previewUpdate('all', 'patch', {\n packageVersionSelections,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n })\n renderPreview(preview)\n process.exit(0)\n }\n\n const updatedPackagesInfo: Array<{ name: string, newVersion: string, pkgKey: string }> = []\n const errors: Array<{ packageName: string, error: Error }> = []\n const packages = Object.entries(packageVersionSelections)\n const total = packages.length\n\n log.info(`\\n📦 开始批量更新 ${total} 个包...\\n`)\n\n for (let i = 0; i < packages.length; i++) {\n const [packageName, selection] = packages[i]\n const current = i + 1\n\n // 显示进度\n updateProgress(current, total, packageName, 'processing')\n\n try {\n const result = await versionManager.updateVersion(packageName, selection.type, {\n dryRun: parsedArgsWithDefaults.dryRun,\n verbose: parsedArgsWithDefaults.verbose,\n customVersion: selection.customVersion,\n autoCommit: false,\n push: false,\n isBatchMode: true, // 标识这是批量更新模式\n })\n\n // 收集更新的包信息,同时记录包名 key\n if (result.success && result.updatedPackages.length > 0) {\n updatedPackagesInfo.push(...result.updatedPackages.map(pkg => ({\n ...pkg,\n pkgKey: packageName,\n })))\n updateProgress(current, total, packageName, 'success')\n }\n else {\n updateProgress(current, total, packageName, 'failed')\n }\n }\n catch (error) {\n errors.push({ packageName, error: error as Error })\n displayError(error as Error, { packageName, operation: '更新' })\n updateProgress(current, total, packageName, 'failed')\n }\n }\n\n log.info('') // 空行分隔\n\n // 报告所有错误\n if (errors.length > 0) {\n log.error(`\\n❌ 批量更新完成,但有 ${errors.length} 个包更新失败:`)\n errors.forEach(({ packageName, error }) => {\n log.error(` - ${packageName}: ${error.message}`)\n })\n log.info('\\n💡 提示: 可以单独重试失败的包,或检查错误信息后重新运行')\n }\n\n if (!parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.autoCommit && updatedPackagesInfo.length > 0) {\n await versionManager.gitCommitAndPush(\n parsedArgsWithDefaults.push,\n updatedPackagesInfo,\n config.git?.tag !== false,\n config.git?.tagPrefix || 'v',\n )\n }\n\n if (parsedArgsWithDefaults.npm && !parsedArgsWithDefaults.dryRun) {\n const npmErrors: Array<{ packageName: string, error: Error }> = []\n const npmPackages = Object.entries(packageVersionSelections)\n const npmTotal = npmPackages.length\n\n log.info(`\\n🚀 开始发布 ${npmTotal} 个包到 NPM...\\n`)\n\n for (let i = 0; i < npmPackages.length; i++) {\n const [packageName, selection] = npmPackages[i]\n const npmCurrent = i + 1\n\n // 显示进度\n updateProgress(npmCurrent, npmTotal, packageName, 'processing')\n\n try {\n await versionManager.updateVersion(packageName, selection.type, {\n dryRun: false,\n verbose: parsedArgsWithDefaults.verbose,\n customVersion: selection.customVersion,\n autoCommit: false,\n push: false,\n npm: true,\n })\n\n updateProgress(npmCurrent, npmTotal, packageName, 'success')\n }\n catch (error) {\n npmErrors.push({ packageName, error: error as Error })\n displayError(error as Error, { packageName, operation: '发布' })\n updateProgress(npmCurrent, npmTotal, packageName, 'failed')\n }\n }\n\n log.info('') // 空行分隔\n\n // 报告 NPM 发布错误\n if (npmErrors.length > 0) {\n log.error(`\\n❌ NPM 发布完成,但有 ${npmErrors.length} 个包发布失败:`)\n npmErrors.forEach(({ packageName, error }) => {\n log.error(` - ${packageName}: ${error.message}`)\n })\n }\n }\n }\n else {\n if (parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.package) {\n const preview = await versionManager.previewUpdate(parsedArgsWithDefaults.package, selectedType, {\n customVersion,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n })\n renderPreview(preview)\n process.exit(0)\n }\n\n await versionManager.updateVersion(parsedArgsWithDefaults.package!, selectedType, {\n dryRun: parsedArgsWithDefaults.dryRun,\n verbose: parsedArgsWithDefaults.verbose,\n customVersion,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n })\n }\n\n log.success(`版本更新完成${parsedArgsWithDefaults.dryRun ? ' (试运行模式)' : ''}`)\n process.exit(0)\n }\n catch (error: any) {\n displayError(error as Error)\n process.exit(1)\n }\n}\n\nmain().catch((error: any) => {\n displayError(error as Error, { operation: 'CLI执行' })\n process.exit(1)\n})\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { __export } from "./chunk-DAa1jVm7.js";
1
+ import { __export } from "./chunk-Cl8Af3a2.js";
2
2
  import { SemVer } from "semver";
3
3
 
4
4
  //#region src/types/index.d.ts
@@ -188,7 +188,6 @@ interface RustUpdateOptions {
188
188
  push?: boolean;
189
189
  customVersion?: string | null;
190
190
  tag?: boolean;
191
- tagPrefix?: string;
192
191
  changelog?: boolean;
193
192
  allowUncommitted?: boolean;
194
193
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/index.ts","../src/config/loader.ts","../src/config/schema.ts","../src/core/ChangelogManager.ts","../src/core/GitManager.ts","../src/core/RustManager.ts","../src/core/VersionManager.ts","../src/utils/logger.ts","../src/utils/path.ts","../src/utils/security.ts","../src/utils/semver.ts","../src/index.ts"],"sourcesContent":null,"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/index.ts","../src/config/loader.ts","../src/config/schema.ts","../src/core/ChangelogManager.ts","../src/core/GitManager.ts","../src/core/RustManager.ts","../src/core/VersionManager.ts","../src/utils/logger.ts","../src/utils/path.ts","../src/utils/security.ts","../src/utils/semver.ts","../src/index.ts"],"sourcesContent":null,"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { BASE_CONFIG, ChangelogManager, GitManager, RustManager, VersionManager, clearConfigCache, loadConfig, loadConfigAsync, logger_default, path_exports, security_exports, semver_exports } from "./path-Dxq6zEl-.js";
1
+ import { BASE_CONFIG, ChangelogManager, GitManager, RustManager, VersionManager, clearConfigCache, loadConfig, loadConfigAsync, logger_default, path_exports, security_exports, semver_exports } from "./path-BvKf4Pq-.js";
2
2
 
3
3
  //#region src/index.ts
4
4
  function defineConfig(config) {
@@ -1,12 +1,12 @@
1
- import { __export, __require } from "./chunk-DAa1jVm7.js";
1
+ import { __export } from "./chunk-Cl8Af3a2.js";
2
2
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
3
  import { createRequire } from "node:module";
4
4
  import { dirname, join, resolve } from "node:path";
5
5
  import { consola } from "consola";
6
6
  import ora from "ora";
7
7
  import { execSync } from "node:child_process";
8
- import * as toml from "@iarna/toml";
9
8
  import semver from "semver";
9
+ import * as toml from "toml";
10
10
  import process from "node:process";
11
11
 
12
12
  //#region src/utils/logger.ts
@@ -229,8 +229,8 @@ const parsers = {
229
229
  } },
230
230
  js: { parse(_, configPath) {
231
231
  try {
232
- const require$1 = createRequire(import.meta.url);
233
- const jsModule = require$1(configPath);
232
+ const require = createRequire(import.meta.url);
233
+ const jsModule = require(configPath);
234
234
  return jsModule.default || jsModule;
235
235
  } catch {
236
236
  return null;
@@ -273,9 +273,9 @@ async function loadConfigAsyncImpl(rootDir) {
273
273
  let config;
274
274
  try {
275
275
  if (configPath.endsWith(".ts")) {
276
- const require$1 = createRequire(import.meta.url);
277
- require$1("tsx");
278
- const tsModule = require$1(absPath);
276
+ const require = createRequire(import.meta.url);
277
+ require("tsx");
278
+ const tsModule = require(absPath);
279
279
  config = tsModule.default || tsModule;
280
280
  } else if (configPath.endsWith(".mjs")) {
281
281
  const jsModule = await import(`file://${absPath}`);
@@ -284,13 +284,13 @@ async function loadConfigAsyncImpl(rootDir) {
284
284
  const jsModule = await import(`file://${absPath}`);
285
285
  config = jsModule.default || jsModule;
286
286
  } catch {
287
- const require$1 = createRequire(import.meta.url);
288
- const cjsModule = require$1(absPath);
287
+ const require = createRequire(import.meta.url);
288
+ const cjsModule = require(absPath);
289
289
  config = cjsModule.default || cjsModule;
290
290
  }
291
291
  else if (configPath.endsWith(".cjs")) {
292
- const require$1 = createRequire(import.meta.url);
293
- const cjsModule = require$1(absPath);
292
+ const require = createRequire(import.meta.url);
293
+ const cjsModule = require(absPath);
294
294
  config = cjsModule.default || cjsModule;
295
295
  }
296
296
  if (typeof config === "function") config = config();
@@ -341,8 +341,8 @@ function loadConfigSyncImpl(rootDir) {
341
341
  for (const configPath of configPaths) try {
342
342
  const ext = getFileExtension(configPath);
343
343
  if (ext === "js") try {
344
- const require$1 = createRequire(import.meta.url);
345
- const jsModule = require$1(configPath);
344
+ const require = createRequire(import.meta.url);
345
+ const jsModule = require(configPath);
346
346
  let config = jsModule.default || jsModule;
347
347
  if (typeof config === "function") config = config();
348
348
  if (config && typeof config === "object") return {
@@ -838,7 +838,7 @@ var RustManager = class {
838
838
  }
839
839
  }
840
840
  updateVersion(releaseType, options = {}) {
841
- const { dryRun: dryRun$1 = false, verbose = false, customVersion = null, autoCommit = true, push = true, tag = true, tagPrefix = "v", changelog = true, allowUncommitted = false } = options;
841
+ const { dryRun: dryRun$1 = false, verbose = false, customVersion = null, autoCommit = true, push = true, tag = true, changelog = true, allowUncommitted = false } = options;
842
842
  if (!this.exists()) throw new Error(`Cargo.toml 文件不存在: ${this.cargoTomlPath}`);
843
843
  const oldVersion = this.getCurrentVersion();
844
844
  if (!oldVersion) throw new Error(`Cargo.toml 文件中未找到 [package] 部分的 version 字段`);
@@ -1507,12 +1507,11 @@ __export(path_exports, {
1507
1507
  resolvePath: () => resolvePath
1508
1508
  });
1509
1509
  function isPathLike(arg) {
1510
- return arg.startsWith("./") || arg.startsWith("../") || arg.startsWith(".\\") || arg.startsWith("..\\") || arg.startsWith("/") || arg.startsWith("\\") || /^[A-Za-z]:[\\/].*/.test(arg) || arg.startsWith("~") || arg === "." || arg.startsWith("\\\\") || arg.startsWith("//") || arg.includes("/") || arg.includes("\\") || arg.includes(".");
1510
+ return arg.startsWith("./") || arg.startsWith("../") || arg.startsWith(".\\") || arg.startsWith("..\\") || arg.startsWith("/") || arg.startsWith("\\") || /^[A-Z]:[\\/].*/i.test(arg) || arg.startsWith("~") || arg === "." || arg.startsWith("\\\\") || arg.startsWith("//") || arg.includes("/") || arg.includes("\\") || arg.includes(".");
1511
1511
  }
1512
1512
  function resolvePath(basePath, targetPath) {
1513
- const { resolve: resolve$1 } = __require("node:path");
1514
- if (targetPath.startsWith("/") || /^[a-z]:\\/i.test(targetPath)) return resolve$1(targetPath);
1515
- return resolve$1(basePath, targetPath);
1513
+ if (targetPath.startsWith("/") || /^[a-z]:\\/i.test(targetPath)) return resolve(targetPath);
1514
+ return resolve(basePath, targetPath);
1516
1515
  }
1517
1516
  function isAbsolutePath(path) {
1518
1517
  return path.startsWith("/") || /^[a-z]:\\/i.test(path) || path.startsWith("\\\\") || path.startsWith("//");
@@ -1520,4 +1519,4 @@ function isAbsolutePath(path) {
1520
1519
 
1521
1520
  //#endregion
1522
1521
  export { BASE_CONFIG, ChangelogManager, GitManager, RustManager, VersionManager, clearConfigCache, isPathLike, loadConfig, loadConfigAsync, logger_default, path_exports, security_exports, semver_exports };
1523
- //# sourceMappingURL=path-Dxq6zEl-.js.map
1522
+ //# sourceMappingURL=path-BvKf4Pq-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-BvKf4Pq-.js","names":["level: string","message: string","text: string","fn: () => Promise<T>","options: { succeedText?: string, failText?: string }","spinner: Ora","error","BASE_CONFIG: Config","config: Config","rootDir?: string","rootDir: string","config: Config","jsoncString: string","yamlString: string","result: Record<string, any>","value: any","current: any","tomlString: string","parsers: Record<string, ConfigParser>","content: string","configPath: string","_: string","path: string","config: any","userConfig: Partial<Config>","mergedConfig: Config","resolvedPackagePaths: Record<string, string>","missingPaths: Array<{ name: string, path: string, resolvedPath: string }>","resolvedPath: string","TYPE_CONFIG: Record<string, ChangelogTypeConfig>","rootDir: string","message: string","files: string[]","content: string","newVersion: string","commits: ChangelogCommit[]","packageName?: string","categorized: Record<\n string,\n { config: ChangelogTypeConfig, items: { message: string, files: string[] }[] }\n >","sortedCategories","header: string","newContent: string","rootDir: string","commits: { hash: string, message: string, files: string[] }[]","version: string","tagPrefix: string","packageName?: string","files: string[]","error","message: string","includeTags: boolean","push: boolean","createTag: boolean","tagVersion?: string","rootDir: string","releaseType: string","options: RustUpdateOptions","newVersion: string | null","semverType: semver.ReleaseType","prerelease: string | undefined","dryRun","error","newVersion: string","error: any","path: string","rootDir: string","command: string","name: string","version: string","currentVersion: string","releaseType: string","identifier?: string","v1: string","v2: string","oldVersion: string","newVersion: string","options: VersionManagerOptions","error","pkgPath?: string","pkgPath: string","pkgName: string","releaseType: ReleaseType","options: UpdateOptions","packages: PreviewPackage[]","newVersion: string | null","error: any","result: UpdateResult","finalVersion: string | null","isDefaultPackage","dryRun","packageName: string | undefined","e: any","commitMessage: string","gitError: any","push: boolean","updatedPackages?: Array<{ name: string, newVersion: string, pkgKey?: string }>","tag: boolean","tagPrefix: string","tagName: string","pkg: PackageInfo","version: string","oldVersion: string","newVersion: string","arg: string","basePath: string","targetPath: string","path: string"],"sources":["../src/utils/logger.ts","../src/config/schema.ts","../src/config/loader.ts","../src/core/ChangelogManager.ts","../src/core/GitManager.ts","../src/core/RustManager.ts","../src/utils/security.ts","../src/utils/semver.ts","../src/core/VersionManager.ts","../src/utils/path.ts"],"sourcesContent":["import type { Ora } from 'ora'\nimport { consola } from 'consola'\nimport ora from 'ora'\n\n// 创建 consola 实例,禁用时间戳\nconst logger = consola.create({\n formatOptions: {\n date: false, // 禁用时间戳\n },\n})\n\nexport function setLevel(level: string): void {\n logger.level = level === 'debug' ? 4 : 3\n}\n\nexport function debug(message: string): void {\n logger.debug(message)\n}\n\nexport function info(message: string): void {\n logger.info(message)\n}\n\nexport function success(message: string): void {\n logger.success(message)\n}\n\nexport function warn(message: string): void {\n logger.warn(message)\n}\n\nexport function error(message: string): void {\n logger.error(message)\n}\n\nexport function dryRun(message: string): void {\n logger.info(`[dry-run] ${message}`)\n}\n\nexport async function withSpinner<T>(\n text: string,\n fn: () => Promise<T>,\n options: { succeedText?: string, failText?: string } = {},\n): Promise<T> {\n const spinner: Ora = ora(text).start()\n\n try {\n const result = await fn()\n spinner.succeed(options.succeedText || text)\n console.log() // 添加空行,确保后续日志换行\n return result\n }\n catch (error) {\n spinner.fail(options.failText || text)\n console.log() // 添加空行\n throw error\n }\n}\n\nexport default {\n setLevel,\n debug,\n info,\n success,\n warn,\n error,\n dryRun,\n withSpinner,\n}\n","import type { Config } from '@/types'\n\nexport const BASE_CONFIG: Config = {\n packagePaths: {\n default: 'package.json',\n },\n defaults: {\n releaseType: 'patch',\n dryRun: false,\n verbose: false,\n allowUncommitted: false,\n npm: false,\n },\n git: {\n commitMessage: 'chore: bump version to {{newVersion}}',\n push: true,\n autoCommit: true,\n tag: true,\n tagPrefix: 'v',\n changelog: true,\n },\n publish: {\n command: 'pnpm publish --access public --no-git-checks',\n skipChecks: true,\n },\n}\n\nexport function validateConfig(config: Config): void {\n const errors: string[] = []\n\n if (config.git?.commitMessage && typeof config.git.commitMessage !== 'string') {\n errors.push('git.commitMessage 必须是字符串')\n }\n\n if (config.git?.tagPrefix && typeof config.git.tagPrefix !== 'string') {\n errors.push('git.tagPrefix 必须是字符串')\n }\n\n if (errors.length > 0) {\n throw new Error(`配置错误:\\n${errors.join('\\n')}`)\n }\n}\n\nexport function isValidConfig(config: Config): boolean {\n return (\n config\n && config.packagePaths\n && typeof config.packagePaths === 'object'\n && Object.keys(config.packagePaths).length > 0\n )\n}\n","import type { Config } from '@/types'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, join, resolve } from 'node:path'\nimport logger from '@/utils/logger'\nimport { BASE_CONFIG, isValidConfig } from './schema'\n\n/**\n * 配置缓存 - 避免重复读取和解析配置文件\n * Key: 项目根目录的绝对路径\n * Value: 配置对象\n */\nconst configCache = new Map<string, Config>()\n\n/**\n * 清除配置缓存\n * @param rootDir 可选,指定要清除的项目目录,不传则清除所有缓存\n */\nexport function clearConfigCache(rootDir?: string): void {\n if (rootDir) {\n const cacheKey = resolve(rootDir)\n configCache.delete(cacheKey)\n logger.debug(`已清除配置缓存: ${cacheKey}`)\n }\n else {\n configCache.clear()\n logger.debug('已清除所有配置缓存')\n }\n}\n\n/**\n * 获取缓存的配置\n * @param rootDir 项目根目录\n * @returns 缓存的配置,如果不存在则返回 null\n */\nfunction getCachedConfig(rootDir: string): Config | null {\n const cacheKey = resolve(rootDir)\n return configCache.get(cacheKey) || null\n}\n\n/**\n * 设置配置缓存\n * @param rootDir 项目根目录\n * @param config 配置对象\n */\nfunction setCachedConfig(rootDir: string, config: Config): void {\n const cacheKey = resolve(rootDir)\n configCache.set(cacheKey, config)\n logger.debug(`已缓存配置: ${cacheKey}`)\n}\n\nfunction removeJsoncComments(jsoncString: string): string {\n let cleanString = jsoncString.replace(/\\/\\/.*$/gm, '')\n cleanString = cleanString.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n return cleanString\n}\n\nfunction tryParseYaml(yamlString: string): Record<string, any> | null {\n try {\n const result: Record<string, any> = {}\n const lines = yamlString.split('\\n')\n\n for (let line of lines) {\n const commentIndex = line.indexOf('#')\n if (commentIndex !== -1) {\n line = line.substring(0, commentIndex).trim()\n }\n\n line = line.trim()\n if (line) {\n const colonIndex = line.indexOf(':')\n if (colonIndex > 0) {\n const keyPath = line.substring(0, colonIndex).trim()\n const valueStr = line.substring(colonIndex + 1).trim()\n let value: any = valueStr\n\n if (value === 'true') {\n value = true\n }\n else if (value === 'false') {\n value = false\n }\n else if (value === 'null') {\n value = null\n }\n else if (!Number.isNaN(Number(value)) && value !== '') {\n value = Number(value)\n }\n else if (value.startsWith('{') || value.startsWith('[')) {\n try {\n value = JSON.parse(value)\n }\n catch {\n // keep original value\n }\n }\n\n if (keyPath.includes('.')) {\n const parts = keyPath.split('.')\n let current: any = result\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!current[part])\n current[part] = {}\n current = current[part]\n }\n current[parts[parts.length - 1]] = value\n }\n else {\n result[keyPath] = value\n }\n }\n }\n }\n\n return result\n }\n catch {\n return null\n }\n}\n\nfunction tryParseToml(tomlString: string): Record<string, any> | null {\n try {\n const result: Record<string, any> = {}\n const lines = tomlString.split('\\n')\n\n for (let line of lines) {\n const commentIndex = line.indexOf('#')\n if (commentIndex !== -1) {\n line = line.substring(0, commentIndex).trim()\n }\n\n line = line.trim()\n if (line) {\n const equalsIndex = line.indexOf('=')\n if (equalsIndex > 0) {\n const keyPath = line.substring(0, equalsIndex).trim()\n const valueStr = line.substring(equalsIndex + 1).trim()\n let value: any = valueStr\n\n if (\n (value.startsWith('\"') && value.endsWith('\"'))\n || (value.startsWith('\\'') && value.endsWith('\\''))\n ) {\n value = value.slice(1, -1)\n }\n\n if (value === 'true') {\n value = true\n }\n else if (value === 'false') {\n value = false\n }\n else if (value === 'null') {\n value = null\n }\n else if (!Number.isNaN(Number(value)) && value !== '') {\n value = Number(value)\n }\n else if (value.startsWith('{') || value.startsWith('[')) {\n try {\n value = JSON.parse(value)\n }\n catch {\n // keep original value\n }\n }\n\n if (keyPath.includes('.')) {\n const parts = keyPath.split('.')\n let current: any = result\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!current[part])\n current[part] = {}\n current = current[part]\n }\n current[parts[parts.length - 1]] = value\n }\n else {\n result[keyPath] = value\n }\n }\n }\n }\n\n return result\n }\n catch {\n return null\n }\n}\n\ninterface ConfigParser {\n parse: (content: string, configPath: string) => Partial<Config> | null\n}\n\nconst parsers: Record<string, ConfigParser> = {\n json: {\n parse(content: string, configPath: string): Partial<Config> | null {\n let jsonContent = content\n if (configPath.endsWith('.jsonc')) {\n jsonContent = removeJsoncComments(content)\n }\n\n try {\n const parsedConfig = JSON.parse(jsonContent)\n if (configPath.includes('package.json')) {\n return parsedConfig.mbump || parsedConfig.mvbump || parsedConfig.bump || null\n }\n return parsedConfig\n }\n catch {\n return null\n }\n },\n },\n yaml: {\n parse(content: string): Partial<Config> | null {\n return tryParseYaml(content)\n },\n },\n toml: {\n parse(content: string): Partial<Config> | null {\n return tryParseToml(content)\n },\n },\n js: {\n parse(_: string, configPath: string): Partial<Config> | null {\n try {\n const require = createRequire(import.meta.url)\n const jsModule = require(configPath)\n return jsModule.default || jsModule\n }\n catch {\n return null\n }\n },\n },\n}\n\nfunction getFileExtension(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase()\n if (ext === 'yml')\n return 'yaml'\n if (ext === 'cjs' || ext === 'mjs' || ext === 'ts' || ext === 'js')\n return 'js'\n if (ext === 'jsonc')\n return 'json'\n return ext || ''\n}\n\nasync function loadConfigAsyncImpl(rootDir: string): Promise<{ config: Partial<Config>, path: string | null }> {\n // 定义配置文件优先级列表(从高到低)\n const configPaths = [\n // TypeScript 配置文件(需要 tsx 支持)\n join(rootDir, '.mbump.config.ts'),\n join(rootDir, '.zbump.config.ts'),\n // ES Module 配置文件(.mjs 和 .js with export default)\n join(rootDir, '.mbump.config.mjs'),\n join(rootDir, '.zbump.config.mjs'),\n join(rootDir, '.mbump.config.js'),\n join(rootDir, '.zbump.config.js'),\n // CommonJS 配置文件\n join(rootDir, '.mbump.config.cjs'),\n join(rootDir, '.zbump.config.cjs'),\n // JSON 格式配置文件\n join(rootDir, '.mbump.config.json'),\n join(rootDir, '.zbump.config.json'),\n join(rootDir, '.mbump.config.jsonc'),\n join(rootDir, '.zbump.config.jsonc'),\n // YAML 格式配置文件\n join(rootDir, '.mbump.config.yaml'),\n join(rootDir, '.zbump.config.yaml'),\n join(rootDir, '.mbump.config.yml'),\n join(rootDir, '.zbump.config.yml'),\n // TOML 格式配置文件\n join(rootDir, '.mbump.config.toml'),\n join(rootDir, '.zbump.config.toml'),\n // package.json 中的配置\n join(rootDir, 'package.json'),\n ]\n\n for (const configPath of configPaths) {\n try {\n const ext = getFileExtension(configPath)\n\n // 处理 JavaScript/TypeScript 类型的配置文件\n if (ext === 'js') {\n const absPath = resolve(rootDir, configPath)\n let config: any\n\n try {\n if (configPath.endsWith('.ts')) {\n // TypeScript 配置文件:使用 tsx 注册器\n const require = createRequire(import.meta.url)\n require('tsx')\n const tsModule = require(absPath)\n config = tsModule.default || tsModule\n }\n else if (configPath.endsWith('.mjs')) {\n // ES Module (.mjs):使用动态 import\n const jsModule = await import(`file://${absPath}`)\n config = jsModule.default || jsModule\n }\n else if (configPath.endsWith('.js')) {\n // .js 文件:优先尝试 ES Module,失败后尝试 CommonJS\n try {\n const jsModule = await import(`file://${absPath}`)\n config = jsModule.default || jsModule\n }\n catch {\n // 如果 ES Module 导入失败,尝试 CommonJS\n const require = createRequire(import.meta.url)\n const cjsModule = require(absPath)\n config = cjsModule.default || cjsModule\n }\n }\n else if (configPath.endsWith('.cjs')) {\n // CommonJS (.cjs):使用 require\n const require = createRequire(import.meta.url)\n const cjsModule = require(absPath)\n config = cjsModule.default || cjsModule\n }\n\n // 如果导出的是函数,则调用它获取配置\n if (typeof config === 'function') {\n config = config()\n }\n\n if (config && typeof config === 'object') {\n return { config, path: configPath }\n }\n }\n catch {\n // 记录错误但继续尝试下一个配置文件\n continue\n }\n }\n else {\n // 处理非 JS 类型的配置文件(JSON, YAML, TOML)\n const content = readFileSync(configPath, 'utf8')\n const parser = parsers[ext]\n if (parser) {\n const config = parser.parse(content, configPath)\n if (config && typeof config === 'object') {\n return { config, path: configPath }\n }\n }\n }\n }\n catch {\n // 文件不存在或读取失败,继续尝试下一个\n continue\n }\n }\n\n return { config: {}, path: null }\n}\n\nfunction loadConfigSyncImpl(rootDir: string): { config: Partial<Config>, path: string | null } {\n // 定义配置文件优先级列表(从高到低)\n // 注意:同步加载不支持 .ts 和 .mjs(因为它们需要异步导入)\n const configPaths = [\n // CommonJS 配置文件(优先)\n join(rootDir, '.mbump.config.cjs'),\n join(rootDir, '.zbump.config.cjs'),\n // JSON 格式配置文件\n join(rootDir, '.mbump.config.json'),\n join(rootDir, '.zbump.config.json'),\n join(rootDir, '.mbump.config.jsonc'),\n join(rootDir, '.zbump.config.jsonc'),\n // YAML 格式配置文件\n join(rootDir, '.mbump.config.yaml'),\n join(rootDir, '.zbump.config.yaml'),\n join(rootDir, '.mbump.config.yml'),\n join(rootDir, '.zbump.config.yml'),\n // TOML 格式配置文件\n join(rootDir, '.mbump.config.toml'),\n join(rootDir, '.zbump.config.toml'),\n // CommonJS .js 文件(可能包含 ES Module,会尝试兼容处理)\n join(rootDir, '.mbump.config.js'),\n join(rootDir, '.zbump.config.js'),\n // package.json 中的配置\n join(rootDir, 'package.json'),\n ]\n\n for (const configPath of configPaths) {\n try {\n const ext = getFileExtension(configPath)\n\n // 处理 JavaScript 类型的配置文件\n if (ext === 'js') {\n try {\n const require = createRequire(import.meta.url)\n const jsModule = require(configPath)\n let config = jsModule.default || jsModule\n\n // 如果导出的是函数,则调用它获取配置\n if (typeof config === 'function') {\n config = config()\n }\n\n if (config && typeof config === 'object') {\n return { config, path: configPath }\n }\n }\n catch {\n // 加载失败,继续尝试下一个配置文件\n continue\n }\n }\n else {\n // 处理非 JS 类型的配置文件(JSON, YAML, TOML)\n const content = readFileSync(configPath, 'utf8')\n const parser = parsers[ext]\n if (parser) {\n const config = parser.parse(content, configPath)\n if (config && typeof config === 'object') {\n return { config, path: configPath }\n }\n }\n }\n }\n catch {\n // 文件不存在或读取失败,继续尝试下一个\n continue\n }\n }\n\n return { config: {}, path: null }\n}\n\nfunction mergeConfig(userConfig: Partial<Config>, rootDir: string): Config {\n const userPackagePaths = userConfig?.packagePaths\n const hasUserPackagePaths = userPackagePaths && Object.keys(userPackagePaths).length > 0\n\n const mergedConfig: Config = {\n ...BASE_CONFIG,\n ...(userConfig || {}),\n packagePaths: {\n ...BASE_CONFIG.packagePaths,\n ...(hasUserPackagePaths ? userPackagePaths : {}),\n },\n defaults: {\n ...BASE_CONFIG.defaults,\n ...(userConfig?.defaults || {}),\n },\n git: {\n ...BASE_CONFIG.git,\n ...(userConfig?.git || {}),\n },\n publish: {\n ...BASE_CONFIG.publish,\n ...(userConfig?.publish || {}),\n },\n }\n\n if (!isValidConfig(mergedConfig)) {\n throw new Error(\n '配置无效:未找到有效的包路径配置\\n'\n + '请创建配置文件并添加至少一个包路径,例如:\\n'\n + '```\\n'\n + 'packagePaths: {\\n'\n + ' components: \\'packages/components/package.json\\',\\n'\n + ' plugins: \\'packages/plugins/package.json\\'\\n'\n + '}\\n'\n + '```',\n )\n }\n\n const resolvedPackagePaths: Record<string, string> = {}\n const missingPaths: Array<{ name: string, path: string, resolvedPath: string }> = []\n\n for (const [name, path] of Object.entries(mergedConfig.packagePaths)) {\n let resolvedPath: string\n if (path && typeof path === 'string') {\n if (!path.startsWith('/') && !/^[a-z]:\\\\/i.test(path)) {\n resolvedPath = resolve(rootDir, path)\n }\n else {\n resolvedPath = resolve(path)\n }\n resolvedPackagePaths[name] = resolvedPath\n\n if (!existsSync(resolvedPath)) {\n missingPaths.push({ name, path, resolvedPath })\n }\n }\n else {\n resolvedPackagePaths[name] = path\n }\n }\n\n if (missingPaths.length > 0) {\n const errorLines = missingPaths.map(({ name, path, resolvedPath }) =>\n ` - ${name}: \"${path}\" -> 解析为 \"${resolvedPath}\"(文件不存在)`,\n ).join('\\n')\n throw new Error(\n `配置错误:以下包路径指向的文件不存在\\n${\n errorLines\n }\\n\\n请检查配置文件中的 packagePaths 是否正确`,\n )\n }\n\n mergedConfig.packagePaths = resolvedPackagePaths\n\n return mergedConfig\n}\n\nexport async function loadConfigAsync(rootDir: string): Promise<Config> {\n const cached = getCachedConfig(rootDir)\n if (cached) {\n logger.debug('使用缓存的配置')\n return cached\n }\n\n const { config: userConfig, path: usedConfigPath } = await loadConfigAsyncImpl(rootDir)\n\n if (usedConfigPath) {\n logger.success(`配置加载完成 (配置文件: ${usedConfigPath})`)\n }\n else {\n logger.warn('未找到配置文件,将使用默认配置')\n }\n\n const configDir = usedConfigPath ? dirname(resolve(rootDir, usedConfigPath)) : rootDir\n const mergedConfig = mergeConfig(userConfig, configDir)\n mergedConfig.usedConfigPath = usedConfigPath\n\n setCachedConfig(rootDir, mergedConfig)\n\n return mergedConfig\n}\n\nexport function loadConfig(rootDir: string): Config {\n const cached = getCachedConfig(rootDir)\n if (cached) {\n logger.debug('使用缓存的配置')\n return cached\n }\n\n const { config: userConfig, path: usedConfigPath } = loadConfigSyncImpl(rootDir)\n\n if (usedConfigPath) {\n logger.success(`配置加载完成 (配置文件: ${usedConfigPath})`)\n }\n else {\n logger.warn('未找到配置文件,将使用默认配置')\n }\n\n const configDir = usedConfigPath ? dirname(resolve(rootDir, usedConfigPath)) : rootDir\n const mergedConfig = mergeConfig(userConfig, configDir)\n mergedConfig.usedConfigPath = usedConfigPath\n\n setCachedConfig(rootDir, mergedConfig)\n\n return mergedConfig\n}\n\nexport default loadConfig\n","import type { ChangelogCommit, ChangelogTypeConfig } from '@/types'\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\n\nexport const TYPE_CONFIG: Record<string, ChangelogTypeConfig> = {\n feat: { title: '🚀 新增功能', emoji: '🚀', color: 'green' },\n feature: { title: '🚀 新增功能', emoji: '🚀', color: 'green' },\n fix: { title: '🩹 缺陷修复', emoji: '🩹', color: 'red' },\n bugfix: { title: '🩹 缺陷修复', emoji: '🩹', color: 'red' },\n perf: { title: '🔥 性能优化', emoji: '🔥', color: 'yellow' },\n performance: { title: '🔥 性能优化', emoji: '🔥', color: 'yellow' },\n refactor: { title: '♻️ 代码重构', emoji: '♻️', color: 'cyan' },\n docs: { title: '📝 文档更新', emoji: '📝', color: 'blue' },\n style: { title: '💄 代码格式', emoji: '💄', color: 'white' },\n chore: { title: '🔧 工具变更', emoji: '🔧', color: 'gray' },\n build: { title: '📦 构建变更', emoji: '📦', color: 'magenta' },\n ci: { title: '👷 CI 变更', emoji: '👷', color: 'cyan' },\n test: { title: '✅ 测试更新', emoji: '✅', color: 'green' },\n revert: { title: '⏪ 回滚提交', emoji: '⏪', color: 'red' },\n breaking: { title: '💥 破坏性变更', emoji: '💥', color: 'red' },\n break: { title: '💥 破坏性变更', emoji: '💥', color: 'red' },\n}\n\nexport class ChangelogManager {\n private changelogPath: string\n\n constructor(rootDir: string) {\n this.changelogPath = `${rootDir}/CHANGELOG.md`\n }\n\n getTypeConfig(message: string): ChangelogTypeConfig {\n const match = message.match(/^(\\w+)(?:\\(([^)]+)\\))?:\\s*(.+)$/)\n if (match) {\n const [, type] = match\n return TYPE_CONFIG[type.toLowerCase()] || {\n title: '📦 其他变更',\n emoji: '📦',\n color: 'gray',\n }\n }\n return { title: '📦 其他变更', emoji: '📦', color: 'gray' }\n }\n\n formatFileNames(files: string[]): string[] {\n return files.map((f) => {\n const parts = f.split('/')\n return parts[parts.length - 1]\n })\n }\n\n detectChangelogFormat(content: string) {\n const lines = content.split('\\n')\n\n for (const line of lines) {\n if (line.startsWith('## [') || line.startsWith('## Version')) {\n return {\n hasHeader: true,\n titlePrefix: line.startsWith('## [') ? '## [' : '## ',\n usesBrackets: line.startsWith('## ['),\n sectionLevel: '###',\n }\n }\n }\n\n return {\n hasHeader: false,\n titlePrefix: '## [',\n usesBrackets: true,\n sectionLevel: '###',\n }\n }\n\n async updateChangelog(newVersion: string, commits: ChangelogCommit[], packageName?: string): Promise<void> {\n const today = new Date().toISOString().split('T')[0]\n\n // 构建版本标题:如果有包名,使用 {package-name}@{version} 格式\n const versionTitle = packageName ? `${packageName}@${newVersion}` : newVersion\n\n const categorized: Record<\n string,\n { config: ChangelogTypeConfig, items: { message: string, files: string[] }[] }\n > = {}\n\n for (const { hash, message, files } of commits) {\n const typeConfig = this.getTypeConfig(message)\n const typeKey = typeConfig.title\n\n if (!categorized[typeKey]) {\n categorized[typeKey] = { config: typeConfig, items: [] }\n }\n\n const fileNames = this.formatFileNames(files)\n const fileTag = fileNames.length > 0 ? ` (${fileNames.join(', ')})` : ''\n\n categorized[typeKey].items.push({\n message: `${hash} ${message}${fileTag}`,\n files,\n })\n }\n\n if (!existsSync(this.changelogPath)) {\n let content = `# 更新日志 (Changelog)\\n\\n本项目的所有重要变更都将记录在此文件中。\\n\\n格式遵循 [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\\n本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。\\n\\n`\n content += `## [${versionTitle}] - ${today}\\n\\n`\n\n const sortedCategories = Object.values(categorized).sort((a, b) => {\n const order = ['🚀', '🩹', '🔥', '♻️', '📝', '💄', '🔧', '📦', '👷', '✅', '⏪', '💥']\n return order.indexOf(a.config.emoji) - order.indexOf(b.config.emoji)\n })\n\n for (const category of sortedCategories) {\n content += `${category.config.title}\\n\\n`\n for (const item of category.items) {\n content += `- ${item.message}\\n`\n }\n content += '\\n'\n }\n\n await writeFileSync(this.changelogPath, content, 'utf-8')\n return\n }\n\n const existingContent = await readFileSync(this.changelogPath, 'utf-8')\n const format = this.detectChangelogFormat(existingContent)\n\n let header: string\n if (format.usesBrackets) {\n header = `${format.titlePrefix}${versionTitle}] - ${today}\\n\\n`\n }\n else {\n header = `${format.titlePrefix}${versionTitle} - ${today}\\n\\n`\n }\n\n const sortedCategories = Object.values(categorized).sort((a, b) => {\n const order = ['🚀', '🩹', '🔥', '♻️', '📝', '💄', '🔧', '📦', '👷', '✅', '⏪', '💥']\n return order.indexOf(a.config.emoji) - order.indexOf(b.config.emoji)\n })\n\n for (const category of sortedCategories) {\n header += `${category.config.title}\\n\\n`\n for (const item of category.items) {\n header += `- ${item.message}\\n`\n }\n header += '\\n'\n }\n\n if (commits.length === 0) {\n header += `### 待补充\\n\\n`\n }\n\n let newContent: string\n if (format.hasHeader) {\n const firstVersionIndex = existingContent.search(/^##\\s*\\[?/m)\n if (firstVersionIndex !== -1) {\n newContent\n = existingContent.slice(0, firstVersionIndex)\n + header\n + existingContent.slice(firstVersionIndex)\n }\n else {\n newContent = header + existingContent\n }\n }\n else {\n newContent = header + existingContent\n }\n\n await writeFileSync(this.changelogPath, newContent, 'utf-8')\n }\n}\n","import { execSync } from 'node:child_process'\nimport log from '@/utils/logger'\n\nexport class GitManager {\n private rootDir: string\n\n constructor(rootDir: string) {\n this.rootDir = rootDir\n }\n\n hasUncommittedChanges(): boolean {\n try {\n const output = execSync('git status --porcelain', {\n cwd: this.rootDir,\n encoding: 'utf8',\n stdio: 'pipe',\n })\n return output.trim() !== ''\n }\n catch {\n return false\n }\n }\n\n getLastTag(): string | null {\n try {\n const output = execSync('git describe --tags --abbrev=0', {\n cwd: this.rootDir,\n encoding: 'utf8',\n stdio: 'pipe',\n })\n return output.trim() || null\n }\n catch {\n return null\n }\n }\n\n getCommitsSinceLastTag(): { hash: string, message: string, files: string[] }[] {\n try {\n const lastTag = this.getLastTag()\n const range = lastTag ? `${lastTag}..HEAD` : '--max-count=50'\n\n // 使用 --format 和 --name-only 同时获取 commit hash、message 和文件列表\n const output = execSync(\n `git log ${range} --format=\"COMMIT_START%n%H%n%s\" --name-only`,\n {\n cwd: this.rootDir,\n encoding: 'utf8',\n stdio: 'pipe',\n },\n )\n\n const commits: { hash: string, message: string, files: string[] }[] = []\n const blocks = output.split('COMMIT_START').filter(Boolean)\n\n for (const block of blocks) {\n const lines = block.trim().split('\\n')\n if (lines.length === 0)\n continue\n\n // 第一行是 commit hash,第二行是 commit message\n const hash = lines[0]?.trim() || ''\n const message = lines[1]?.trim() || ''\n\n if (!hash || !message)\n continue\n\n // 其余行是文件列表\n const files = lines\n .slice(2)\n .map(f => f.trim())\n .filter(f => f && !f.startsWith('COMMIT_START'))\n\n commits.push({ hash, message, files })\n }\n\n return commits\n }\n catch {\n return []\n }\n }\n\n checkVersionExists(version: string, tagPrefix: string = 'v', packageName?: string): boolean {\n try {\n const tag = packageName ? `${packageName}@${version}` : `${tagPrefix}${version}`\n execSync(`git rev-parse --verify ${tag}`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n return true\n }\n catch {\n return false\n }\n }\n\n addFiles(files: string[]): void {\n try {\n execSync(`git add ${files.join(' ')}`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n }\n catch (error) {\n throw new Error(`Git add failed: ${(error as Error).message}`)\n }\n }\n\n commit(message: string): void {\n try {\n execSync(`git commit -m \"${message}\"`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.debug(`Git commit: ${message}`)\n }\n catch (error) {\n throw new Error(`Git commit failed: ${(error as Error).message}`)\n }\n }\n\n createTag(version: string, tagPrefix: string = 'v'): void {\n try {\n const tagName = `${tagPrefix}${version}`\n execSync(`git tag -a ${tagName} -m \"Release ${tagName}\"`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.success(`已创建 tag: ${tagName}`)\n }\n catch (error) {\n throw new Error(`创建 Tag 失败: ${(error as Error).message}`)\n }\n }\n\n push(includeTags: boolean = true): void {\n try {\n execSync('git push', {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.debug('Git push')\n\n if (includeTags) {\n execSync('git push --tags', {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.success('已推送 tags')\n }\n }\n catch (error) {\n throw new Error(`Git push failed: ${(error as Error).message}`)\n }\n }\n\n commitAndPush(message: string, push: boolean = true, createTag: boolean = false, tagVersion?: string, tagPrefix: string = 'v'): void {\n try {\n execSync('git config --local core.autocrlf false', {\n cwd: this.rootDir,\n stdio: 'ignore',\n })\n }\n catch {\n log.warn('Failed to set git config')\n }\n\n this.addFiles(['-u'])\n this.commit(message)\n\n if (createTag && tagVersion) {\n this.createTag(tagVersion, tagPrefix)\n }\n\n if (push) {\n try {\n this.push(createTag)\n }\n catch (error) {\n log.warn(`Git push failed: ${(error as Error).message}`)\n }\n }\n }\n}\n","import { execSync } from 'node:child_process'\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport semver from 'semver'\nimport * as toml from 'toml'\nimport log from '@/utils/logger'\nimport { ChangelogManager } from './ChangelogManager'\nimport { GitManager } from './GitManager'\n\nexport interface RustUpdateOptions {\n dryRun?: boolean\n verbose?: boolean\n autoCommit?: boolean\n push?: boolean\n customVersion?: string | null\n tag?: boolean\n changelog?: boolean\n allowUncommitted?: boolean\n}\n\nexport class RustManager {\n private cargoTomlPath: string\n private gitManager: GitManager\n private changelogManager: ChangelogManager\n private rootDir: string\n\n constructor(rootDir: string) {\n this.rootDir = rootDir\n this.cargoTomlPath = join(rootDir, 'Cargo.toml')\n this.gitManager = new GitManager(rootDir)\n this.changelogManager = new ChangelogManager(rootDir)\n }\n\n exists(): boolean {\n return existsSync(this.cargoTomlPath)\n }\n\n getCurrentVersion(): string | null {\n try {\n const content = readFileSync(this.cargoTomlPath, 'utf8')\n const parsed = toml.parse(content) as Record<string, any>\n if (parsed.package && typeof parsed.package.version === 'string') {\n return parsed.package.version\n }\n return null\n }\n catch {\n return null\n }\n }\n\n getPackageName(): string | null {\n try {\n const content = readFileSync(this.cargoTomlPath, 'utf8')\n const parsed = toml.parse(content) as Record<string, any>\n if (parsed.package && typeof parsed.package.name === 'string') {\n return parsed.package.name\n }\n return null\n }\n catch {\n return null\n }\n }\n\n updateVersion(releaseType: string, options: RustUpdateOptions = {}): { success: boolean, oldVersion: string, newVersion: string } {\n const {\n dryRun = false,\n verbose = false,\n customVersion = null,\n autoCommit = true,\n push = true,\n tag = true,\n changelog = true,\n allowUncommitted = false,\n } = options\n\n if (!this.exists()) {\n throw new Error(`Cargo.toml 文件不存在: ${this.cargoTomlPath}`)\n }\n\n const oldVersion = this.getCurrentVersion()\n if (!oldVersion) {\n throw new Error(`Cargo.toml 文件中未找到 [package] 部分的 version 字段`)\n }\n\n const packageName = this.getPackageName() || 'rust'\n\n let newVersion: string | null = null\n\n if (customVersion) {\n if (!semver.valid(customVersion)) {\n throw new Error(`无效的自定义版本号: ${customVersion}`)\n }\n newVersion = customVersion\n }\n else {\n let semverType: semver.ReleaseType = releaseType as semver.ReleaseType\n let prerelease: string | undefined\n\n if (releaseType === 'pre-patch') {\n semverType = 'prepatch'\n prerelease = 'beta'\n }\n else if (releaseType === 'pre-minor') {\n semverType = 'preminor'\n prerelease = 'beta'\n }\n else if (releaseType === 'pre-major') {\n semverType = 'premajor'\n prerelease = 'beta'\n }\n else if (releaseType === 'prerelease') {\n semverType = 'prerelease'\n prerelease = 'beta'\n }\n\n if (prerelease) {\n newVersion = semver.inc(oldVersion, semverType, prerelease)\n }\n else {\n newVersion = semver.inc(oldVersion, semverType)\n }\n\n if (!newVersion) {\n throw new Error(`无法计算新版本,当前版本 \"${oldVersion}\",版本类型 \"${releaseType}\"`)\n }\n }\n\n if (!semver.valid(newVersion)) {\n throw new Error(`计算出的新版本 \"${newVersion}\" 不是有效的 semver 版本号`)\n }\n\n if (verbose) {\n log.info(`读取 Cargo.toml: ${this.cargoTomlPath}`)\n log.info(`当前版本: ${oldVersion}`)\n log.info(`新版本: ${newVersion}`)\n }\n\n if (!dryRun && autoCommit && !allowUncommitted && this.gitManager.hasUncommittedChanges()) {\n throw new Error('存在未提交的更改,请先提交或使用 --allow-uncommitted 选项')\n }\n\n if (dryRun) {\n const tagName = `${packageName}@${newVersion}`\n log.info(`\\n🔍 Dry-run 模式 - Cargo.toml 版本更新预览:`)\n log.info(` 当前版本: ${oldVersion}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tag ? tagName : '跳过'}`)\n log.info(` CHANGELOG: ${changelog ? '是' : '跳过'}`)\n log.info(` Git Commit: ${autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${push ? '是' : '否'}`)\n log.info(`\\n✅ 以上为预览,未执行任何实际操作`)\n return { success: true, oldVersion, newVersion }\n }\n\n this.writeVersion(newVersion)\n\n const verifiedVersion = this.getCurrentVersion()\n if (verifiedVersion !== newVersion) {\n throw new Error(`版本更新验证失败,期望版本 \"${newVersion}\",实际版本 \"${verifiedVersion}\"`)\n }\n\n log.success(`Cargo.toml 版本更新完成: ${oldVersion} → ${newVersion}`)\n\n if (changelog) {\n try {\n const commits = this.gitManager.getCommitsSinceLastTag()\n this.changelogManager.updateChangelog(newVersion, commits)\n log.success(`已更新 CHANGELOG.md`)\n }\n catch (error) {\n log.warn(`更新 CHANGELOG.md 失败: ${(error as Error).message}`)\n }\n }\n\n if (autoCommit) {\n try {\n this.gitManager.addFiles(['-u'])\n this.gitManager.commit(`chore: bump version to ${newVersion}`)\n log.success(`已提交更改`)\n }\n catch (error) {\n log.warn(`提交更改失败: ${(error as Error).message}`)\n }\n\n if (tag) {\n const tagName = `${packageName}@${newVersion}`\n try {\n execSync(`git tag -a ${tagName} -m \"Release ${tagName}\"`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.success(`已创建 tag: ${tagName}`)\n }\n catch (error) {\n log.warn(`创建 tag ${tagName} 失败: ${(error as Error).message}`)\n }\n }\n\n if (push) {\n try {\n this.gitManager.push(tag)\n log.success(`已推送 commits 和 tags`)\n }\n catch (error) {\n log.warn(`推送失败: ${(error as Error).message}`)\n }\n }\n }\n\n return { success: true, oldVersion, newVersion }\n }\n\n private writeVersion(newVersion: string): void {\n try {\n const content = readFileSync(this.cargoTomlPath, 'utf8')\n const lines = content.split('\\n')\n let inPackageSection = false\n let versionUpdated = false\n\n const newLines = lines.map((line) => {\n const trimmedLine = line.trim()\n\n if (trimmedLine.startsWith('[package]')) {\n inPackageSection = true\n return line\n }\n\n if (trimmedLine.startsWith('[') && inPackageSection) {\n inPackageSection = false\n return line\n }\n\n if (inPackageSection) {\n const versionMatch = trimmedLine.match(/^version\\s*=\\s*[\"'](.+?)[\"']/)\n if (versionMatch) {\n versionUpdated = true\n const spaces = line.match(/^\\s*/)?.[0] || ''\n const quote = versionMatch[0].includes('\"') ? '\"' : \"'\"\n return `${spaces}version = ${quote}${newVersion}${quote}`\n }\n }\n\n return line\n })\n\n if (!versionUpdated) {\n let packageSectionIndex = -1\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].trim().startsWith('[package]')) {\n packageSectionIndex = i\n break\n }\n }\n\n if (packageSectionIndex !== -1) {\n newLines.splice(packageSectionIndex + 1, 0, `version = \"${newVersion}\"`)\n }\n else {\n newLines.unshift('[package]', `version = \"${newVersion}\"`)\n }\n }\n\n writeFileSync(this.cargoTomlPath, newLines.join('\\n'), { encoding: 'utf8' })\n }\n catch (error: any) {\n throw new Error(`写入 Cargo.toml 失败: ${error.message}`)\n }\n }\n}\n","import { resolve } from 'node:path'\n\nexport function validatePath(path: string, rootDir: string): boolean {\n const resolvedPath = resolve(path)\n return resolvedPath.startsWith(rootDir)\n}\n\nexport function validateCommand(command: string): boolean {\n const dangerousPatterns = [\n /;\\s*[a-z0-9]/i,\n /\\|\\|\\s*[a-z0-9]/i,\n /&&\\s*[a-z0-9]/i,\n /\\$\\(.*\\)/,\n /`.*`/,\n /\\|\\s*[a-z0-9]/i,\n ]\n\n return !dangerousPatterns.some(pattern => pattern.test(command))\n}\n\nexport function sanitizeFileName(name: string): string {\n return name.replace(/[<>:\"/\\\\|?*]/g, '_')\n}\n","import type { SemVer } from 'semver'\nimport semver from 'semver'\n\nexport function isValidVersion(version: string): boolean {\n return semver.valid(version) !== null\n}\n\nexport function parseVersion(version: string): SemVer | null {\n return semver.parse(version)\n}\n\nexport function incrementVersion(currentVersion: string, releaseType: string, identifier?: string): string | null {\n if (identifier) {\n return semver.inc(currentVersion, releaseType as semver.ReleaseType, identifier)\n }\n return semver.inc(currentVersion, releaseType as semver.ReleaseType)\n}\n\nexport function compareVersions(v1: string, v2: string): number {\n return semver.compare(v1, v2)\n}\n\nexport function getVersionDiff(oldVersion: string, newVersion: string): string | null {\n if (!semver.valid(oldVersion) || !semver.valid(newVersion)) {\n return null\n }\n\n if (semver.major(newVersion) > semver.major(oldVersion))\n return 'major'\n if (semver.minor(newVersion) > semver.minor(oldVersion))\n return 'minor'\n if (semver.patch(newVersion) > semver.patch(oldVersion))\n return 'patch'\n return null\n}\n\nexport function isPrerelease(version: string): boolean {\n return semver.prerelease(version) !== null\n}\n\nexport function coerceVersion(version: string): string | null {\n const coerced = semver.coerce(version)\n return coerced?.version || null\n}\n\nexport function getMajor(version: string): number | null {\n const parsed = semver.parse(version)\n return parsed?.major ?? null\n}\n\nexport function getMinor(version: string): number | null {\n const parsed = semver.parse(version)\n return parsed?.minor ?? null\n}\n\nexport function getPatch(version: string): number | null {\n const parsed = semver.parse(version)\n return parsed?.patch ?? null\n}\n","import type { Config, GitConfig, PackageInfo, PackagePaths, PreviewPackage, PreviewResult, PublishConfig, ReleaseType, UpdateOptions, UpdateResult, VersionManagerOptions } from '@/types'\nimport { readFileSync, writeFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport process from 'node:process'\nimport { loadConfig } from '@/config/loader'\nimport log from '@/utils/logger'\nimport { validateCommand, validatePath } from '@/utils/security'\nimport { getMajor, getMinor, getPatch, incrementVersion, isPrerelease, isValidVersion } from '@/utils/semver'\nimport { ChangelogManager } from './ChangelogManager'\nimport { GitManager } from './GitManager'\n\nexport class VersionManager {\n private config: Config\n private rootDir: string\n private packagePaths: PackagePaths\n private publishConfig: PublishConfig\n private gitConfig: GitConfig\n private gitPush: boolean\n private packageCache: Map<string, PackageInfo> = new Map()\n private gitManager: GitManager\n private changelogManager: ChangelogManager\n\n constructor(options: VersionManagerOptions = {}) {\n const { packagePaths, configPath, config, rootDir = process.cwd() } = options\n\n this.config = config || (configPath ? loadConfig(dirname(configPath)) : loadConfig(rootDir))\n this.rootDir = rootDir\n this.packagePaths = packagePaths || this.config.packagePaths\n this.publishConfig = this.config.publish || {}\n this.gitConfig = this.config.git || {}\n this.gitPush = this.gitConfig.push !== false\n this.gitManager = new GitManager(rootDir)\n this.changelogManager = new ChangelogManager(rootDir)\n\n if (!this.packagePaths || typeof this.packagePaths !== 'object' || Object.keys(this.packagePaths).length === 0) {\n throw new Error('配置错误:未找到有效的包路径配置')\n }\n\n this._preloadPackageCache()\n }\n\n /**\n * 预加载所有包信息到缓存,避免后续重复读取文件\n */\n private _preloadPackageCache(): void {\n for (const pkgPath of Object.values(this.packagePaths)) {\n try {\n this.getPackageInfo(pkgPath)\n }\n catch (error) {\n // 忽略预加载失败,在实际使用时再处理\n log.debug(`预加载包信息失败 ${pkgPath}: ${(error as Error).message}`)\n }\n }\n log.debug(`已预加载 ${this.packageCache.size} 个包的信息到缓存`)\n }\n\n /**\n * 清除包信息缓存\n * @param pkgPath 可选,指定要清除的包路径,不传则清除所有缓存\n */\n clearPackageCache(pkgPath?: string): void {\n if (pkgPath) {\n this.packageCache.delete(pkgPath)\n log.debug(`已清除包缓存: ${pkgPath}`)\n }\n else {\n this.packageCache.clear()\n log.debug('已清除所有包缓存')\n }\n }\n\n /**\n * 刷新指定包的缓存(重新从文件读取)\n * @param pkgPath 包的路径\n */\n refreshPackageCache(pkgPath: string): PackageInfo {\n this.packageCache.delete(pkgPath)\n return this.getPackageInfo(pkgPath)\n }\n\n /**\n * 获取缓存统计信息\n */\n getCacheStats(): { size: number, packages: string[] } {\n return {\n size: this.packageCache.size,\n packages: Array.from(this.packageCache.keys()),\n }\n }\n\n async previewUpdate(pkgName: string, releaseType: ReleaseType = 'patch', options: UpdateOptions = {}): Promise<PreviewResult> {\n const {\n packagePaths = this.packagePaths,\n customVersion = null,\n autoCommit = this.gitConfig.autoCommit !== false,\n push = this.gitConfig.push !== false,\n npm = false,\n changelog = this.gitConfig.changelog !== false,\n tagPrefix = this.gitConfig.tagPrefix || 'v',\n packageVersionSelections,\n } = options\n\n const packages: PreviewPackage[] = []\n\n if (pkgName === 'all' && packageVersionSelections) {\n for (const [packageName, selection] of Object.entries(packageVersionSelections)) {\n const pkgPath = packagePaths[packageName]\n if (!pkgPath) {\n throw new Error(`无效的包名: ${packageName}`)\n }\n\n const pkg = this.getPackageInfo(pkgPath)\n let newVersion: string | null = null\n\n if (selection.customVersion) {\n if (!isValidVersion(selection.customVersion)) {\n throw new Error(`无效的自定义版本号: ${selection.customVersion}`)\n }\n newVersion = selection.customVersion\n }\n else {\n try {\n switch (selection.type) {\n case 'major':\n case 'minor':\n case 'patch':\n newVersion = incrementVersion(pkg.version, selection.type)\n break\n case 'next':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n case 'pre-patch':\n if (isPrerelease(pkg.version)) {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prepatch', 'beta')\n }\n break\n case 'pre-minor':\n if (isPrerelease(pkg.version)) {\n const currentMinor = getMinor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n if (potentialVersion && (getMinor(potentialVersion) ?? 0) > currentMinor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n }\n break\n case 'pre-major':\n if (isPrerelease(pkg.version)) {\n const currentMajor = getMajor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n if (potentialVersion && (getMajor(potentialVersion) ?? 0) > currentMajor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n }\n break\n case 'as-is':\n newVersion = pkg.version\n break\n case 'conventional':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n default:\n throw new Error(`不支持的版本类型: ${selection.type}`)\n }\n }\n catch (error: any) {\n throw new Error(`版本计算失败: ${error.message}`)\n }\n }\n\n if (!newVersion) {\n throw new Error(`无法计算新版本号,当前版本: ${pkg.version},类型: ${selection.type}`)\n }\n\n const isDefaultPackage = packageName === 'default' || packagePaths[packageName] === 'package.json'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n packages.push({\n name: packageName,\n oldVersion: pkg.version,\n newVersion,\n tagName,\n changelogEnabled: changelog && isDefaultPackage,\n isDefaultPackage,\n })\n }\n }\n else {\n const targets = pkgName === 'all' ? Object.values(packagePaths) : [packagePaths[pkgName]]\n\n if (!targets.length || targets.some(path => !path)) {\n throw new Error(`无效的包名: ${pkgName}`)\n }\n\n for (const pkgPath of targets) {\n const pkg = this.getPackageInfo(pkgPath)\n let newVersion: string | null = null\n\n if (customVersion) {\n if (!isValidVersion(customVersion)) {\n throw new Error(`无效的自定义版本号: ${customVersion}`)\n }\n newVersion = customVersion\n }\n else {\n try {\n switch (releaseType) {\n case 'major':\n case 'minor':\n case 'patch':\n newVersion = incrementVersion(pkg.version, releaseType)\n break\n case 'next':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n case 'pre-patch':\n if (isPrerelease(pkg.version)) {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prepatch', 'beta')\n }\n break\n case 'pre-minor':\n if (isPrerelease(pkg.version)) {\n const currentMinor = getMinor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n if (potentialVersion && (getMinor(potentialVersion) ?? 0) > currentMinor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n }\n break\n case 'pre-major':\n if (isPrerelease(pkg.version)) {\n const currentMajor = getMajor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n if (potentialVersion && (getMajor(potentialVersion) ?? 0) > currentMajor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n }\n break\n case 'as-is':\n newVersion = pkg.version\n break\n case 'conventional':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n default:\n throw new Error(`不支持的版本类型: ${releaseType}`)\n }\n }\n catch (error: any) {\n throw new Error(`版本计算失败: ${error.message}`)\n }\n }\n\n if (!newVersion) {\n throw new Error(`无法计算新版本号,当前版本: ${pkg.version},类型: ${releaseType}`)\n }\n\n const isDefaultPackage = pkgName === 'default' || packagePaths[pkgName] === 'package.json'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n packages.push({\n name: pkg.name,\n oldVersion: pkg.version,\n newVersion,\n tagName,\n changelogEnabled: changelog && isDefaultPackage,\n isDefaultPackage,\n })\n }\n }\n\n return {\n packages,\n autoCommit,\n push,\n npm,\n }\n }\n\n async updateVersion(pkgName: string, releaseType: ReleaseType = 'patch', options: UpdateOptions = {}): Promise<UpdateResult> {\n const {\n dryRun = false,\n verbose = false,\n packagePaths = this.packagePaths,\n customVersion = null,\n autoCommit = this.gitConfig.autoCommit !== false,\n npm = false,\n changelog = this.gitConfig.changelog !== false,\n tag = this.gitConfig.tag !== false,\n tagPrefix = this.gitConfig.tagPrefix || 'v',\n isBatchMode = false, // 默认不是批量模式\n } = options\n\n const result: UpdateResult = {\n success: false,\n updatedPackages: [],\n publishedPackages: [],\n error: null,\n }\n\n return log.withSpinner(\n `正在更新${pkgName === 'all' ? '所有包' : `包${pkgName}`}的版本...`,\n\n async () => {\n try {\n const targets = pkgName === 'all' ? Object.values(packagePaths) : [packagePaths[pkgName]]\n\n if (!targets.length || targets.some(path => !path)) {\n throw new Error(`无效的包名: ${pkgName}`)\n }\n\n // 检查版本是否存在\n let finalVersion: string | null = null\n for (const pkgPath of targets) {\n const pkg = this.getPackageInfo(pkgPath)\n let newVersion: string | null = null\n\n if (customVersion) {\n if (!isValidVersion(customVersion)) {\n throw new Error(`无效的自定义版本号: ${customVersion}`)\n }\n newVersion = customVersion\n }\n else {\n try {\n switch (releaseType) {\n case 'major':\n case 'minor':\n case 'patch':\n newVersion = incrementVersion(pkg.version, releaseType)\n break\n case 'next':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n case 'pre-patch':\n if (isPrerelease(pkg.version)) {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prepatch', 'beta')\n }\n break\n case 'pre-minor':\n if (isPrerelease(pkg.version)) {\n const currentMinor = getMinor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n if (potentialVersion && (getMinor(potentialVersion) ?? 0) > currentMinor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n }\n break\n case 'pre-major':\n if (isPrerelease(pkg.version)) {\n const currentMajor = getMajor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n if (potentialVersion && (getMajor(potentialVersion) ?? 0) > currentMajor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n }\n break\n case 'as-is':\n newVersion = pkg.version\n break\n case 'conventional':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n default:\n throw new Error(`不支持的版本类型: ${releaseType}`)\n }\n }\n catch (error: any) {\n throw new Error(`版本计算失败: ${error.message}`)\n }\n }\n\n if (!newVersion) {\n throw new Error(`无法计算新版本号,当前版本: ${pkg.version},类型: ${releaseType}`)\n }\n\n // 只在第一个包时检查版本\n if (!finalVersion) {\n finalVersion = newVersion\n const isDefaultPackage = pkgName === 'default' || this.config.packagePaths[pkgName] === 'package.json'\n const versionTag = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n if (!dryRun && this.gitManager.checkVersionExists(newVersion, tagPrefix, isDefaultPackage ? undefined : pkg.name)) {\n throw new Error(`版本 ${versionTag} 已存在,请使用其他版本`)\n }\n }\n\n if (dryRun) {\n log.dryRun(`将更新 ${pkg.name} 从 v${pkg.version} 到 v${newVersion}`)\n }\n else {\n const updatedPkg = { ...pkg, version: newVersion }\n this.savePackageInfo(pkgPath, updatedPkg)\n log.info(`已更新 ${pkg.name} 到 v${newVersion}`)\n }\n\n result.updatedPackages.push({\n name: pkg.name,\n oldVersion: pkg.version,\n newVersion,\n pkgKey: pkgName,\n })\n }\n\n // 生成CHANGELOG\n // 在批量更新模式时,只有主项目包(default)才生成 CHANGELOG\n const isDefaultPackage = pkgName === 'default' || this.config.packagePaths[pkgName] === 'package.json'\n\n if (!dryRun && changelog && finalVersion) {\n // 如果是批量模式且不是主项目包,跳过 CHANGELOG 生成\n if (isBatchMode && !isDefaultPackage) {\n log.info(`子包 ${pkgName} 跳过 CHANGELOG 生成`)\n }\n else {\n try {\n const commits = this.gitManager.getCommitsSinceLastTag()\n\n // 主项目包不传 packageName(使用 tagPrefix 格式),子包传 packageName(使用 {package-name}@{version} 格式)\n let packageName: string | undefined\n if (!isDefaultPackage) {\n // 子包:获取 package.json 的 name 字段\n const firstPkg = this.getPackageInfo(targets[0])\n packageName = firstPkg.name\n }\n // 主项目包:packageName 为 undefined,ChangelogManager 会直接使用 version\n\n await this.changelogManager.updateChangelog(finalVersion, commits, packageName)\n log.success('已更新 CHANGELOG.md')\n }\n catch (changelogError) {\n log.warn(`CHANGELOG生成失败: ${(changelogError as Error).message}`)\n }\n }\n }\n\n if (!dryRun && npm) {\n for (const pkgPath of targets) {\n const pkg = this.getPackageInfo(pkgPath)\n const pkgDir = dirname(pkgPath)\n log.info(`\\n发布 ${pkg.name}...`)\n\n try {\n const publishCmd = this.publishConfig.command || 'pnpm publish --access public --no-git-checks'\n\n if (!validateCommand(publishCmd)) {\n throw new Error(`不安全的发布命令: ${publishCmd}`)\n }\n\n if (verbose) {\n log.debug(`执行命令: ${publishCmd} (在目录: ${pkgDir})`)\n }\n\n const { execSync } = await import('node:child_process')\n execSync(publishCmd, {\n cwd: pkgDir,\n stdio: 'inherit',\n })\n result.publishedPackages.push(pkg.name)\n }\n catch (e: any) {\n throw new Error(`发布失败 ${pkg.name}: ${e.message}`)\n }\n }\n }\n\n // Git提交和Tag\n if (!dryRun && autoCommit && result.updatedPackages.length > 0) {\n try {\n let commitMessage: string\n const updatedPackage = result.updatedPackages[0]\n const newVersion = updatedPackage.newVersion\n const isDefaultPackage = pkgName === 'default' || this.config.packagePaths[pkgName] === 'package.json'\n\n if (this.gitConfig.commitMessage && this.gitConfig.commitMessage !== 'chore: bump version to {{newVersion}}') {\n commitMessage = this.gitConfig.commitMessage.replace(/\\{\\{newVersion\\}\\}/g, newVersion)\n }\n else if (pkgName === 'all') {\n const versionInfo = result.updatedPackages.map(pkg => `${pkg.name}@${pkg.newVersion}`).join(', ')\n commitMessage = `chore: bump version for all packages\\n\\n${versionInfo}`\n }\n else {\n commitMessage = `chore: bump version for ${pkgName} to v${newVersion}`\n }\n\n // 主项目包使用 {tagPrefix}{version} 格式,子包使用 {package-name}@{version} 格式\n if (isDefaultPackage) {\n // 主项目包:使用配置的 tagPrefix (如 v1.0.1)\n this.gitManager.commitAndPush(commitMessage, this.gitPush, tag, newVersion, tagPrefix)\n }\n else {\n // 子包:创建 {package-name}@{version} 格式的 tag\n const { execSync } = await import('node:child_process')\n\n this.gitManager.addFiles(['-u'])\n this.gitManager.commit(commitMessage)\n\n // 创建 {package-name}@{version} 格式的 tag\n const tagName = `${updatedPackage.name}@${newVersion}`\n try {\n execSync(`git tag -a ${tagName} -m \"Release ${tagName}\"`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.success(`已创建 tag: ${tagName}`)\n }\n catch (tagError) {\n log.warn(`创建 tag ${tagName} 失败: ${(tagError as Error).message}`)\n }\n\n // 推送\n if (this.gitPush) {\n try {\n this.gitManager.push(true)\n }\n catch (pushError) {\n log.warn(`Git push failed: ${(pushError as Error).message}`)\n }\n }\n }\n }\n catch (gitError: any) {\n log.warn(`Git操作失败: ${gitError.message}`)\n }\n }\n\n result.success = true\n return result\n }\n catch (error: any) {\n result.error = error.message\n return result\n }\n },\n {\n succeedText: pkgName === 'all' ? '所有包版本更新完成' : `包 ${pkgName} 版本更新完成`,\n failText: '版本更新失败',\n },\n )\n }\n\n async gitCommitAndPush(\n push: boolean = true,\n updatedPackages?: Array<{ name: string, newVersion: string, pkgKey?: string }>,\n tag: boolean = this.gitConfig.tag !== false,\n tagPrefix: string = this.gitConfig.tagPrefix || 'v',\n ): Promise<void> {\n try {\n const commitMessage = 'chore: bump versions for multiple packages'\n\n // 如果提供了更新的包列表且启用了 tag,则为每个包创建独立的 tag\n if (tag && updatedPackages && updatedPackages.length > 0) {\n // 先提交更改\n this.gitManager.addFiles(['-u'])\n this.gitManager.commit(commitMessage)\n\n // 为每个包创建独立的 tag\n const { execSync } = await import('node:child_process')\n for (const pkg of updatedPackages) {\n let tagName: string\n\n // 通过 pkgKey 判断是否为主项目包\n const isMainPackage = pkg.pkgKey === 'default'\n\n if (isMainPackage) {\n // 主项目包:使用 {tagPrefix}{version} 格式\n tagName = `${tagPrefix}${pkg.newVersion}`\n }\n else {\n // 子包:使用 {package-name}@{version} 格式\n tagName = `${pkg.name}@${pkg.newVersion}`\n }\n\n try {\n execSync(`git tag -a ${tagName} -m \"Release ${tagName}\"`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.success(`已创建 tag: ${tagName}`)\n }\n catch (error) {\n log.warn(`创建 tag ${tagName} 失败: ${(error as Error).message}`)\n }\n }\n\n // 推送 commits 和 tags\n if (push) {\n try {\n this.gitManager.push(true)\n }\n catch (error) {\n log.warn(`Git push failed: ${(error as Error).message}`)\n }\n }\n }\n else {\n // 原有逻辑:不创建 tag\n this.gitManager.commitAndPush(commitMessage, push, false)\n }\n }\n catch (error: any) {\n log.warn(`Git操作失败: ${error.message}`)\n }\n }\n\n /**\n * 获取包信息(带缓存)\n * @param pkgPath 包的路径\n * @returns 包信息对象\n */\n getPackageInfo(pkgPath: string): PackageInfo {\n // 首先检查缓存\n const cached = this.packageCache.get(pkgPath)\n if (cached) {\n return cached\n }\n\n // 缓存未命中,从文件读取\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as PackageInfo\n // 写入缓存\n this.packageCache.set(pkgPath, pkg)\n return pkg\n }\n catch (error: any) {\n throw new Error(`读取文件失败 ${pkgPath}: ${error.message}`)\n }\n }\n\n private savePackageInfo(pkgPath: string, pkg: PackageInfo): void {\n if (!validatePath(pkgPath, this.rootDir)) {\n throw new Error(`不安全的文件路径: ${pkgPath}`)\n }\n\n try {\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`)\n // 更新缓存\n this.packageCache.set(pkgPath, pkg)\n }\n catch (error: any) {\n throw new Error(`写入文件失败 ${pkgPath}: ${error.message}`)\n }\n }\n\n getPackageVersion(pkgName: string): string | null {\n const pkgPath = this.packagePaths[pkgName]\n if (!pkgPath)\n return null\n\n try {\n const pkg = this.getPackageInfo(pkgPath)\n return pkg.version\n }\n catch {\n return null\n }\n }\n\n isValidVersion(version: string): boolean {\n return isValidVersion(version)\n }\n\n getVersionDiff(oldVersion: string, newVersion: string): string | null {\n if (!isValidVersion(oldVersion) || !isValidVersion(newVersion)) {\n return null\n }\n\n if ((getMajor(newVersion) ?? 0) > (getMajor(oldVersion) ?? 0))\n return 'major'\n if ((getMinor(newVersion) ?? 0) > (getMinor(oldVersion) ?? 0))\n return 'minor'\n if ((getPatch(newVersion) ?? 0) > (getPatch(oldVersion) ?? 0))\n return 'patch'\n return null\n }\n}\n\nexport default VersionManager\n","import { resolve } from 'node:path'\n\nexport function isPathLike(arg: string): boolean {\n return (\n arg.startsWith('./')\n || arg.startsWith('../')\n || arg.startsWith('.\\\\')\n || arg.startsWith('..\\\\')\n || arg.startsWith('/')\n || arg.startsWith('\\\\')\n || /^[A-Z]:[\\\\/].*/i.test(arg)\n || arg.startsWith('~')\n || arg === '.'\n || arg.startsWith('\\\\\\\\')\n || arg.startsWith('//')\n || arg.includes('/')\n || arg.includes('\\\\')\n || arg.includes('.')\n )\n}\n\nexport function resolvePath(basePath: string, targetPath: string): string {\n // const { resolve } = require('node:path')\n if (targetPath.startsWith('/') || /^[a-z]:\\\\/i.test(targetPath)) {\n return resolve(targetPath)\n }\n return resolve(basePath, targetPath)\n}\n\nexport function isAbsolutePath(path: string): boolean {\n return path.startsWith('/') || /^[a-z]:\\\\/i.test(path) || path.startsWith('\\\\\\\\') || path.startsWith('//')\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mznjs/mbump",
3
- "version": "2.2.0",
3
+ "version": "2.2.2",
4
4
  "type": "module",
5
5
  "description": "企业级版本管理工具,支持单包和monorepo场景",
6
6
  "main": "dist/index.js",
@@ -39,27 +39,26 @@
39
39
  "author": "mznjs",
40
40
  "license": "MIT",
41
41
  "dependencies": {
42
- "@iarna/toml": "^2.2.5",
43
42
  "consola": "^3.4.2",
44
- "inquirer": "^9.2.16",
43
+ "inquirer": "^9.3.8",
45
44
  "ora": "^8.2.0",
46
- "semver": "^7.5.4",
47
- "tsx": "^4.7.0"
45
+ "semver": "^7.8.5",
46
+ "toml": "^4.1.2",
47
+ "tsx": "^4.23.0"
48
48
  },
49
49
  "devDependencies": {
50
- "@antfu/eslint-config": "^9.0.0",
51
- "@mznjs/eslint-config": "^0.0.6",
52
- "@mznjs/tsconfig": "^1.0.1",
53
- "@types/iarna__toml": "^2.0.5",
54
- "@types/inquirer": "^9.0.9",
55
- "@types/node": "^25.9.1",
56
- "@types/semver": "^7.5.8",
57
- "eslint": "^10.4.0",
50
+ "@antfu/eslint-config": "^9.1.0",
51
+ "@mznjs/eslint-config": "^0.0.9",
52
+ "@mznjs/tsconfig": "^1.0.8",
53
+ "@types/inquirer": "^9.0.10",
54
+ "@types/node": "^25.9.4",
55
+ "@types/semver": "^7.7.1",
56
+ "eslint": "^10.6.0",
58
57
  "eslint-plugin-format": "^2.0.1",
59
58
  "rimraf": "^5.0.10",
60
- "tsdown": "^0.10.0",
59
+ "tsdown": "^0.10.2",
61
60
  "typescript": "^5.9.3",
62
- "vitest": "^1.5.0"
61
+ "vitest": "^1.6.1"
63
62
  },
64
63
  "publishConfig": {
65
64
  "access": "public"
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-Dxq6zEl-.js","names":["level: string","message: string","text: string","fn: () => Promise<T>","options: { succeedText?: string, failText?: string }","spinner: Ora","error","BASE_CONFIG: Config","config: Config","rootDir?: string","rootDir: string","config: Config","jsoncString: string","yamlString: string","result: Record<string, any>","value: any","current: any","tomlString: string","parsers: Record<string, ConfigParser>","content: string","configPath: string","_: string","require","path: string","config: any","userConfig: Partial<Config>","mergedConfig: Config","resolvedPackagePaths: Record<string, string>","missingPaths: Array<{ name: string, path: string, resolvedPath: string }>","resolvedPath: string","TYPE_CONFIG: Record<string, ChangelogTypeConfig>","rootDir: string","message: string","files: string[]","content: string","newVersion: string","commits: ChangelogCommit[]","packageName?: string","categorized: Record<\n string,\n { config: ChangelogTypeConfig, items: { message: string, files: string[] }[] }\n >","sortedCategories","header: string","newContent: string","rootDir: string","commits: { hash: string, message: string, files: string[] }[]","version: string","tagPrefix: string","packageName?: string","files: string[]","error","message: string","includeTags: boolean","push: boolean","createTag: boolean","tagVersion?: string","rootDir: string","releaseType: string","options: RustUpdateOptions","newVersion: string | null","semverType: semver.ReleaseType","prerelease: string | undefined","dryRun","error","newVersion: string","error: any","path: string","rootDir: string","command: string","name: string","version: string","currentVersion: string","releaseType: string","identifier?: string","v1: string","v2: string","oldVersion: string","newVersion: string","options: VersionManagerOptions","error","pkgPath?: string","pkgPath: string","pkgName: string","releaseType: ReleaseType","options: UpdateOptions","packages: PreviewPackage[]","newVersion: string | null","error: any","result: UpdateResult","finalVersion: string | null","isDefaultPackage","dryRun","packageName: string | undefined","e: any","commitMessage: string","gitError: any","push: boolean","updatedPackages?: Array<{ name: string, newVersion: string, pkgKey?: string }>","tag: boolean","tagPrefix: string","tagName: string","pkg: PackageInfo","version: string","oldVersion: string","newVersion: string","arg: string","basePath: string","targetPath: string","path: string"],"sources":["../src/utils/logger.ts","../src/config/schema.ts","../src/config/loader.ts","../src/core/ChangelogManager.ts","../src/core/GitManager.ts","../src/core/RustManager.ts","../src/utils/security.ts","../src/utils/semver.ts","../src/core/VersionManager.ts","../src/utils/path.ts"],"sourcesContent":["import type { Ora } from 'ora'\nimport { consola } from 'consola'\nimport ora from 'ora'\n\n// 创建 consola 实例,禁用时间戳\nconst logger = consola.create({\n formatOptions: {\n date: false, // 禁用时间戳\n },\n})\n\nexport function setLevel(level: string): void {\n logger.level = level === 'debug' ? 4 : 3\n}\n\nexport function debug(message: string): void {\n logger.debug(message)\n}\n\nexport function info(message: string): void {\n logger.info(message)\n}\n\nexport function success(message: string): void {\n logger.success(message)\n}\n\nexport function warn(message: string): void {\n logger.warn(message)\n}\n\nexport function error(message: string): void {\n logger.error(message)\n}\n\nexport function dryRun(message: string): void {\n logger.info(`[dry-run] ${message}`)\n}\n\nexport async function withSpinner<T>(\n text: string,\n fn: () => Promise<T>,\n options: { succeedText?: string, failText?: string } = {},\n): Promise<T> {\n const spinner: Ora = ora(text).start()\n\n try {\n const result = await fn()\n spinner.succeed(options.succeedText || text)\n console.log() // 添加空行,确保后续日志换行\n return result\n }\n catch (error) {\n spinner.fail(options.failText || text)\n console.log() // 添加空行\n throw error\n }\n}\n\nexport default {\n setLevel,\n debug,\n info,\n success,\n warn,\n error,\n dryRun,\n withSpinner,\n}\n","import type { Config } from '@/types'\n\nexport const BASE_CONFIG: Config = {\n packagePaths: {\n default: 'package.json',\n },\n defaults: {\n releaseType: 'patch',\n dryRun: false,\n verbose: false,\n allowUncommitted: false,\n npm: false,\n },\n git: {\n commitMessage: 'chore: bump version to {{newVersion}}',\n push: true,\n autoCommit: true,\n tag: true,\n tagPrefix: 'v',\n changelog: true,\n },\n publish: {\n command: 'pnpm publish --access public --no-git-checks',\n skipChecks: true,\n },\n}\n\nexport function validateConfig(config: Config): void {\n const errors: string[] = []\n\n if (config.git?.commitMessage && typeof config.git.commitMessage !== 'string') {\n errors.push('git.commitMessage 必须是字符串')\n }\n\n if (config.git?.tagPrefix && typeof config.git.tagPrefix !== 'string') {\n errors.push('git.tagPrefix 必须是字符串')\n }\n\n if (errors.length > 0) {\n throw new Error(`配置错误:\\n${errors.join('\\n')}`)\n }\n}\n\nexport function isValidConfig(config: Config): boolean {\n return (\n config\n && config.packagePaths\n && typeof config.packagePaths === 'object'\n && Object.keys(config.packagePaths).length > 0\n )\n}\n","import type { Config } from '@/types'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, join, resolve } from 'node:path'\nimport logger from '@/utils/logger'\nimport { BASE_CONFIG, isValidConfig } from './schema'\n\n/**\n * 配置缓存 - 避免重复读取和解析配置文件\n * Key: 项目根目录的绝对路径\n * Value: 配置对象\n */\nconst configCache = new Map<string, Config>()\n\n/**\n * 清除配置缓存\n * @param rootDir 可选,指定要清除的项目目录,不传则清除所有缓存\n */\nexport function clearConfigCache(rootDir?: string): void {\n if (rootDir) {\n const cacheKey = resolve(rootDir)\n configCache.delete(cacheKey)\n logger.debug(`已清除配置缓存: ${cacheKey}`)\n }\n else {\n configCache.clear()\n logger.debug('已清除所有配置缓存')\n }\n}\n\n/**\n * 获取缓存的配置\n * @param rootDir 项目根目录\n * @returns 缓存的配置,如果不存在则返回 null\n */\nfunction getCachedConfig(rootDir: string): Config | null {\n const cacheKey = resolve(rootDir)\n return configCache.get(cacheKey) || null\n}\n\n/**\n * 设置配置缓存\n * @param rootDir 项目根目录\n * @param config 配置对象\n */\nfunction setCachedConfig(rootDir: string, config: Config): void {\n const cacheKey = resolve(rootDir)\n configCache.set(cacheKey, config)\n logger.debug(`已缓存配置: ${cacheKey}`)\n}\n\nfunction removeJsoncComments(jsoncString: string): string {\n let cleanString = jsoncString.replace(/\\/\\/.*$/gm, '')\n cleanString = cleanString.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n return cleanString\n}\n\nfunction tryParseYaml(yamlString: string): Record<string, any> | null {\n try {\n const result: Record<string, any> = {}\n const lines = yamlString.split('\\n')\n\n for (let line of lines) {\n const commentIndex = line.indexOf('#')\n if (commentIndex !== -1) {\n line = line.substring(0, commentIndex).trim()\n }\n\n line = line.trim()\n if (line) {\n const colonIndex = line.indexOf(':')\n if (colonIndex > 0) {\n const keyPath = line.substring(0, colonIndex).trim()\n const valueStr = line.substring(colonIndex + 1).trim()\n let value: any = valueStr\n\n if (value === 'true') {\n value = true\n }\n else if (value === 'false') {\n value = false\n }\n else if (value === 'null') {\n value = null\n }\n else if (!Number.isNaN(Number(value)) && value !== '') {\n value = Number(value)\n }\n else if (value.startsWith('{') || value.startsWith('[')) {\n try {\n value = JSON.parse(value)\n }\n catch {\n // keep original value\n }\n }\n\n if (keyPath.includes('.')) {\n const parts = keyPath.split('.')\n let current: any = result\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!current[part])\n current[part] = {}\n current = current[part]\n }\n current[parts[parts.length - 1]] = value\n }\n else {\n result[keyPath] = value\n }\n }\n }\n }\n\n return result\n }\n catch {\n return null\n }\n}\n\nfunction tryParseToml(tomlString: string): Record<string, any> | null {\n try {\n const result: Record<string, any> = {}\n const lines = tomlString.split('\\n')\n\n for (let line of lines) {\n const commentIndex = line.indexOf('#')\n if (commentIndex !== -1) {\n line = line.substring(0, commentIndex).trim()\n }\n\n line = line.trim()\n if (line) {\n const equalsIndex = line.indexOf('=')\n if (equalsIndex > 0) {\n const keyPath = line.substring(0, equalsIndex).trim()\n const valueStr = line.substring(equalsIndex + 1).trim()\n let value: any = valueStr\n\n if (\n (value.startsWith('\"') && value.endsWith('\"'))\n || (value.startsWith('\\'') && value.endsWith('\\''))\n ) {\n value = value.slice(1, -1)\n }\n\n if (value === 'true') {\n value = true\n }\n else if (value === 'false') {\n value = false\n }\n else if (value === 'null') {\n value = null\n }\n else if (!Number.isNaN(Number(value)) && value !== '') {\n value = Number(value)\n }\n else if (value.startsWith('{') || value.startsWith('[')) {\n try {\n value = JSON.parse(value)\n }\n catch {\n // keep original value\n }\n }\n\n if (keyPath.includes('.')) {\n const parts = keyPath.split('.')\n let current: any = result\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!current[part])\n current[part] = {}\n current = current[part]\n }\n current[parts[parts.length - 1]] = value\n }\n else {\n result[keyPath] = value\n }\n }\n }\n }\n\n return result\n }\n catch {\n return null\n }\n}\n\ninterface ConfigParser {\n parse: (content: string, configPath: string) => Partial<Config> | null\n}\n\nconst parsers: Record<string, ConfigParser> = {\n json: {\n parse(content: string, configPath: string): Partial<Config> | null {\n let jsonContent = content\n if (configPath.endsWith('.jsonc')) {\n jsonContent = removeJsoncComments(content)\n }\n\n try {\n const parsedConfig = JSON.parse(jsonContent)\n if (configPath.includes('package.json')) {\n return parsedConfig.mbump || parsedConfig.mvbump || parsedConfig.bump || null\n }\n return parsedConfig\n }\n catch {\n return null\n }\n },\n },\n yaml: {\n parse(content: string): Partial<Config> | null {\n return tryParseYaml(content)\n },\n },\n toml: {\n parse(content: string): Partial<Config> | null {\n return tryParseToml(content)\n },\n },\n js: {\n parse(_: string, configPath: string): Partial<Config> | null {\n try {\n const require = createRequire(import.meta.url)\n const jsModule = require(configPath)\n return jsModule.default || jsModule\n }\n catch {\n return null\n }\n },\n },\n}\n\nfunction getFileExtension(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase()\n if (ext === 'yml')\n return 'yaml'\n if (ext === 'cjs' || ext === 'mjs' || ext === 'ts' || ext === 'js')\n return 'js'\n if (ext === 'jsonc')\n return 'json'\n return ext || ''\n}\n\nasync function loadConfigAsyncImpl(rootDir: string): Promise<{ config: Partial<Config>, path: string | null }> {\n // 定义配置文件优先级列表(从高到低)\n const configPaths = [\n // TypeScript 配置文件(需要 tsx 支持)\n join(rootDir, '.mbump.config.ts'),\n join(rootDir, '.zbump.config.ts'),\n // ES Module 配置文件(.mjs 和 .js with export default)\n join(rootDir, '.mbump.config.mjs'),\n join(rootDir, '.zbump.config.mjs'),\n join(rootDir, '.mbump.config.js'),\n join(rootDir, '.zbump.config.js'),\n // CommonJS 配置文件\n join(rootDir, '.mbump.config.cjs'),\n join(rootDir, '.zbump.config.cjs'),\n // JSON 格式配置文件\n join(rootDir, '.mbump.config.json'),\n join(rootDir, '.zbump.config.json'),\n join(rootDir, '.mbump.config.jsonc'),\n join(rootDir, '.zbump.config.jsonc'),\n // YAML 格式配置文件\n join(rootDir, '.mbump.config.yaml'),\n join(rootDir, '.zbump.config.yaml'),\n join(rootDir, '.mbump.config.yml'),\n join(rootDir, '.zbump.config.yml'),\n // TOML 格式配置文件\n join(rootDir, '.mbump.config.toml'),\n join(rootDir, '.zbump.config.toml'),\n // package.json 中的配置\n join(rootDir, 'package.json'),\n ]\n\n for (const configPath of configPaths) {\n try {\n const ext = getFileExtension(configPath)\n\n // 处理 JavaScript/TypeScript 类型的配置文件\n if (ext === 'js') {\n const absPath = resolve(rootDir, configPath)\n let config: any\n\n try {\n if (configPath.endsWith('.ts')) {\n // TypeScript 配置文件:使用 tsx 注册器\n const require = createRequire(import.meta.url)\n require('tsx')\n const tsModule = require(absPath)\n config = tsModule.default || tsModule\n }\n else if (configPath.endsWith('.mjs')) {\n // ES Module (.mjs):使用动态 import\n const jsModule = await import(`file://${absPath}`)\n config = jsModule.default || jsModule\n }\n else if (configPath.endsWith('.js')) {\n // .js 文件:优先尝试 ES Module,失败后尝试 CommonJS\n try {\n const jsModule = await import(`file://${absPath}`)\n config = jsModule.default || jsModule\n }\n catch {\n // 如果 ES Module 导入失败,尝试 CommonJS\n const require = createRequire(import.meta.url)\n const cjsModule = require(absPath)\n config = cjsModule.default || cjsModule\n }\n }\n else if (configPath.endsWith('.cjs')) {\n // CommonJS (.cjs):使用 require\n const require = createRequire(import.meta.url)\n const cjsModule = require(absPath)\n config = cjsModule.default || cjsModule\n }\n\n // 如果导出的是函数,则调用它获取配置\n if (typeof config === 'function') {\n config = config()\n }\n\n if (config && typeof config === 'object') {\n return { config, path: configPath }\n }\n }\n catch {\n // 记录错误但继续尝试下一个配置文件\n continue\n }\n }\n else {\n // 处理非 JS 类型的配置文件(JSON, YAML, TOML)\n const content = readFileSync(configPath, 'utf8')\n const parser = parsers[ext]\n if (parser) {\n const config = parser.parse(content, configPath)\n if (config && typeof config === 'object') {\n return { config, path: configPath }\n }\n }\n }\n }\n catch {\n // 文件不存在或读取失败,继续尝试下一个\n continue\n }\n }\n\n return { config: {}, path: null }\n}\n\nfunction loadConfigSyncImpl(rootDir: string): { config: Partial<Config>, path: string | null } {\n // 定义配置文件优先级列表(从高到低)\n // 注意:同步加载不支持 .ts 和 .mjs(因为它们需要异步导入)\n const configPaths = [\n // CommonJS 配置文件(优先)\n join(rootDir, '.mbump.config.cjs'),\n join(rootDir, '.zbump.config.cjs'),\n // JSON 格式配置文件\n join(rootDir, '.mbump.config.json'),\n join(rootDir, '.zbump.config.json'),\n join(rootDir, '.mbump.config.jsonc'),\n join(rootDir, '.zbump.config.jsonc'),\n // YAML 格式配置文件\n join(rootDir, '.mbump.config.yaml'),\n join(rootDir, '.zbump.config.yaml'),\n join(rootDir, '.mbump.config.yml'),\n join(rootDir, '.zbump.config.yml'),\n // TOML 格式配置文件\n join(rootDir, '.mbump.config.toml'),\n join(rootDir, '.zbump.config.toml'),\n // CommonJS .js 文件(可能包含 ES Module,会尝试兼容处理)\n join(rootDir, '.mbump.config.js'),\n join(rootDir, '.zbump.config.js'),\n // package.json 中的配置\n join(rootDir, 'package.json'),\n ]\n\n for (const configPath of configPaths) {\n try {\n const ext = getFileExtension(configPath)\n\n // 处理 JavaScript 类型的配置文件\n if (ext === 'js') {\n try {\n const require = createRequire(import.meta.url)\n const jsModule = require(configPath)\n let config = jsModule.default || jsModule\n\n // 如果导出的是函数,则调用它获取配置\n if (typeof config === 'function') {\n config = config()\n }\n\n if (config && typeof config === 'object') {\n return { config, path: configPath }\n }\n }\n catch {\n // 加载失败,继续尝试下一个配置文件\n continue\n }\n }\n else {\n // 处理非 JS 类型的配置文件(JSON, YAML, TOML)\n const content = readFileSync(configPath, 'utf8')\n const parser = parsers[ext]\n if (parser) {\n const config = parser.parse(content, configPath)\n if (config && typeof config === 'object') {\n return { config, path: configPath }\n }\n }\n }\n }\n catch {\n // 文件不存在或读取失败,继续尝试下一个\n continue\n }\n }\n\n return { config: {}, path: null }\n}\n\nfunction mergeConfig(userConfig: Partial<Config>, rootDir: string): Config {\n const userPackagePaths = userConfig?.packagePaths\n const hasUserPackagePaths = userPackagePaths && Object.keys(userPackagePaths).length > 0\n\n const mergedConfig: Config = {\n ...BASE_CONFIG,\n ...(userConfig || {}),\n packagePaths: {\n ...BASE_CONFIG.packagePaths,\n ...(hasUserPackagePaths ? userPackagePaths : {}),\n },\n defaults: {\n ...BASE_CONFIG.defaults,\n ...(userConfig?.defaults || {}),\n },\n git: {\n ...BASE_CONFIG.git,\n ...(userConfig?.git || {}),\n },\n publish: {\n ...BASE_CONFIG.publish,\n ...(userConfig?.publish || {}),\n },\n }\n\n if (!isValidConfig(mergedConfig)) {\n throw new Error(\n '配置无效:未找到有效的包路径配置\\n'\n + '请创建配置文件并添加至少一个包路径,例如:\\n'\n + '```\\n'\n + 'packagePaths: {\\n'\n + ' components: \\'packages/components/package.json\\',\\n'\n + ' plugins: \\'packages/plugins/package.json\\'\\n'\n + '}\\n'\n + '```',\n )\n }\n\n const resolvedPackagePaths: Record<string, string> = {}\n const missingPaths: Array<{ name: string, path: string, resolvedPath: string }> = []\n\n for (const [name, path] of Object.entries(mergedConfig.packagePaths)) {\n let resolvedPath: string\n if (path && typeof path === 'string') {\n if (!path.startsWith('/') && !/^[a-z]:\\\\/i.test(path)) {\n resolvedPath = resolve(rootDir, path)\n }\n else {\n resolvedPath = resolve(path)\n }\n resolvedPackagePaths[name] = resolvedPath\n\n if (!existsSync(resolvedPath)) {\n missingPaths.push({ name, path, resolvedPath })\n }\n }\n else {\n resolvedPackagePaths[name] = path\n }\n }\n\n if (missingPaths.length > 0) {\n const errorLines = missingPaths.map(({ name, path, resolvedPath }) =>\n ` - ${name}: \"${path}\" -> 解析为 \"${resolvedPath}\"(文件不存在)`,\n ).join('\\n')\n throw new Error(\n `配置错误:以下包路径指向的文件不存在\\n${\n errorLines\n }\\n\\n请检查配置文件中的 packagePaths 是否正确`,\n )\n }\n\n mergedConfig.packagePaths = resolvedPackagePaths\n\n return mergedConfig\n}\n\nexport async function loadConfigAsync(rootDir: string): Promise<Config> {\n const cached = getCachedConfig(rootDir)\n if (cached) {\n logger.debug('使用缓存的配置')\n return cached\n }\n\n const { config: userConfig, path: usedConfigPath } = await loadConfigAsyncImpl(rootDir)\n\n if (usedConfigPath) {\n logger.success(`配置加载完成 (配置文件: ${usedConfigPath})`)\n }\n else {\n logger.warn('未找到配置文件,将使用默认配置')\n }\n\n const configDir = usedConfigPath ? dirname(resolve(rootDir, usedConfigPath)) : rootDir\n const mergedConfig = mergeConfig(userConfig, configDir)\n mergedConfig.usedConfigPath = usedConfigPath\n\n setCachedConfig(rootDir, mergedConfig)\n\n return mergedConfig\n}\n\nexport function loadConfig(rootDir: string): Config {\n const cached = getCachedConfig(rootDir)\n if (cached) {\n logger.debug('使用缓存的配置')\n return cached\n }\n\n const { config: userConfig, path: usedConfigPath } = loadConfigSyncImpl(rootDir)\n\n if (usedConfigPath) {\n logger.success(`配置加载完成 (配置文件: ${usedConfigPath})`)\n }\n else {\n logger.warn('未找到配置文件,将使用默认配置')\n }\n\n const configDir = usedConfigPath ? dirname(resolve(rootDir, usedConfigPath)) : rootDir\n const mergedConfig = mergeConfig(userConfig, configDir)\n mergedConfig.usedConfigPath = usedConfigPath\n\n setCachedConfig(rootDir, mergedConfig)\n\n return mergedConfig\n}\n\nexport default loadConfig\n","import type { ChangelogCommit, ChangelogTypeConfig } from '@/types'\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\n\nexport const TYPE_CONFIG: Record<string, ChangelogTypeConfig> = {\n feat: { title: '🚀 新增功能', emoji: '🚀', color: 'green' },\n feature: { title: '🚀 新增功能', emoji: '🚀', color: 'green' },\n fix: { title: '🩹 缺陷修复', emoji: '🩹', color: 'red' },\n bugfix: { title: '🩹 缺陷修复', emoji: '🩹', color: 'red' },\n perf: { title: '🔥 性能优化', emoji: '🔥', color: 'yellow' },\n performance: { title: '🔥 性能优化', emoji: '🔥', color: 'yellow' },\n refactor: { title: '♻️ 代码重构', emoji: '♻️', color: 'cyan' },\n docs: { title: '📝 文档更新', emoji: '📝', color: 'blue' },\n style: { title: '💄 代码格式', emoji: '💄', color: 'white' },\n chore: { title: '🔧 工具变更', emoji: '🔧', color: 'gray' },\n build: { title: '📦 构建变更', emoji: '📦', color: 'magenta' },\n ci: { title: '👷 CI 变更', emoji: '👷', color: 'cyan' },\n test: { title: '✅ 测试更新', emoji: '✅', color: 'green' },\n revert: { title: '⏪ 回滚提交', emoji: '⏪', color: 'red' },\n breaking: { title: '💥 破坏性变更', emoji: '💥', color: 'red' },\n break: { title: '💥 破坏性变更', emoji: '💥', color: 'red' },\n}\n\nexport class ChangelogManager {\n private changelogPath: string\n\n constructor(rootDir: string) {\n this.changelogPath = `${rootDir}/CHANGELOG.md`\n }\n\n getTypeConfig(message: string): ChangelogTypeConfig {\n const match = message.match(/^(\\w+)(?:\\(([^)]+)\\))?:\\s*(.+)$/)\n if (match) {\n const [, type] = match\n return TYPE_CONFIG[type.toLowerCase()] || {\n title: '📦 其他变更',\n emoji: '📦',\n color: 'gray',\n }\n }\n return { title: '📦 其他变更', emoji: '📦', color: 'gray' }\n }\n\n formatFileNames(files: string[]): string[] {\n return files.map((f) => {\n const parts = f.split('/')\n return parts[parts.length - 1]\n })\n }\n\n detectChangelogFormat(content: string) {\n const lines = content.split('\\n')\n\n for (const line of lines) {\n if (line.startsWith('## [') || line.startsWith('## Version')) {\n return {\n hasHeader: true,\n titlePrefix: line.startsWith('## [') ? '## [' : '## ',\n usesBrackets: line.startsWith('## ['),\n sectionLevel: '###',\n }\n }\n }\n\n return {\n hasHeader: false,\n titlePrefix: '## [',\n usesBrackets: true,\n sectionLevel: '###',\n }\n }\n\n async updateChangelog(newVersion: string, commits: ChangelogCommit[], packageName?: string): Promise<void> {\n const today = new Date().toISOString().split('T')[0]\n\n // 构建版本标题:如果有包名,使用 {package-name}@{version} 格式\n const versionTitle = packageName ? `${packageName}@${newVersion}` : newVersion\n\n const categorized: Record<\n string,\n { config: ChangelogTypeConfig, items: { message: string, files: string[] }[] }\n > = {}\n\n for (const { hash, message, files } of commits) {\n const typeConfig = this.getTypeConfig(message)\n const typeKey = typeConfig.title\n\n if (!categorized[typeKey]) {\n categorized[typeKey] = { config: typeConfig, items: [] }\n }\n\n const fileNames = this.formatFileNames(files)\n const fileTag = fileNames.length > 0 ? ` (${fileNames.join(', ')})` : ''\n\n categorized[typeKey].items.push({\n message: `${hash} ${message}${fileTag}`,\n files,\n })\n }\n\n if (!existsSync(this.changelogPath)) {\n let content = `# 更新日志 (Changelog)\\n\\n本项目的所有重要变更都将记录在此文件中。\\n\\n格式遵循 [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\\n本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。\\n\\n`\n content += `## [${versionTitle}] - ${today}\\n\\n`\n\n const sortedCategories = Object.values(categorized).sort((a, b) => {\n const order = ['🚀', '🩹', '🔥', '♻️', '📝', '💄', '🔧', '📦', '👷', '✅', '⏪', '💥']\n return order.indexOf(a.config.emoji) - order.indexOf(b.config.emoji)\n })\n\n for (const category of sortedCategories) {\n content += `${category.config.title}\\n\\n`\n for (const item of category.items) {\n content += `- ${item.message}\\n`\n }\n content += '\\n'\n }\n\n await writeFileSync(this.changelogPath, content, 'utf-8')\n return\n }\n\n const existingContent = await readFileSync(this.changelogPath, 'utf-8')\n const format = this.detectChangelogFormat(existingContent)\n\n let header: string\n if (format.usesBrackets) {\n header = `${format.titlePrefix}${versionTitle}] - ${today}\\n\\n`\n }\n else {\n header = `${format.titlePrefix}${versionTitle} - ${today}\\n\\n`\n }\n\n const sortedCategories = Object.values(categorized).sort((a, b) => {\n const order = ['🚀', '🩹', '🔥', '♻️', '📝', '💄', '🔧', '📦', '👷', '✅', '⏪', '💥']\n return order.indexOf(a.config.emoji) - order.indexOf(b.config.emoji)\n })\n\n for (const category of sortedCategories) {\n header += `${category.config.title}\\n\\n`\n for (const item of category.items) {\n header += `- ${item.message}\\n`\n }\n header += '\\n'\n }\n\n if (commits.length === 0) {\n header += `### 待补充\\n\\n`\n }\n\n let newContent: string\n if (format.hasHeader) {\n const firstVersionIndex = existingContent.search(/^##\\s*\\[?/m)\n if (firstVersionIndex !== -1) {\n newContent\n = existingContent.slice(0, firstVersionIndex)\n + header\n + existingContent.slice(firstVersionIndex)\n }\n else {\n newContent = header + existingContent\n }\n }\n else {\n newContent = header + existingContent\n }\n\n await writeFileSync(this.changelogPath, newContent, 'utf-8')\n }\n}\n","import { execSync } from 'node:child_process'\nimport log from '@/utils/logger'\n\nexport class GitManager {\n private rootDir: string\n\n constructor(rootDir: string) {\n this.rootDir = rootDir\n }\n\n hasUncommittedChanges(): boolean {\n try {\n const output = execSync('git status --porcelain', {\n cwd: this.rootDir,\n encoding: 'utf8',\n stdio: 'pipe',\n })\n return output.trim() !== ''\n }\n catch {\n return false\n }\n }\n\n getLastTag(): string | null {\n try {\n const output = execSync('git describe --tags --abbrev=0', {\n cwd: this.rootDir,\n encoding: 'utf8',\n stdio: 'pipe',\n })\n return output.trim() || null\n }\n catch {\n return null\n }\n }\n\n getCommitsSinceLastTag(): { hash: string, message: string, files: string[] }[] {\n try {\n const lastTag = this.getLastTag()\n const range = lastTag ? `${lastTag}..HEAD` : '--max-count=50'\n\n // 使用 --format 和 --name-only 同时获取 commit hash、message 和文件列表\n const output = execSync(\n `git log ${range} --format=\"COMMIT_START%n%H%n%s\" --name-only`,\n {\n cwd: this.rootDir,\n encoding: 'utf8',\n stdio: 'pipe',\n },\n )\n\n const commits: { hash: string, message: string, files: string[] }[] = []\n const blocks = output.split('COMMIT_START').filter(Boolean)\n\n for (const block of blocks) {\n const lines = block.trim().split('\\n')\n if (lines.length === 0)\n continue\n\n // 第一行是 commit hash,第二行是 commit message\n const hash = lines[0]?.trim() || ''\n const message = lines[1]?.trim() || ''\n\n if (!hash || !message)\n continue\n\n // 其余行是文件列表\n const files = lines\n .slice(2)\n .map(f => f.trim())\n .filter(f => f && !f.startsWith('COMMIT_START'))\n\n commits.push({ hash, message, files })\n }\n\n return commits\n }\n catch {\n return []\n }\n }\n\n checkVersionExists(version: string, tagPrefix: string = 'v', packageName?: string): boolean {\n try {\n const tag = packageName ? `${packageName}@${version}` : `${tagPrefix}${version}`\n execSync(`git rev-parse --verify ${tag}`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n return true\n }\n catch {\n return false\n }\n }\n\n addFiles(files: string[]): void {\n try {\n execSync(`git add ${files.join(' ')}`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n }\n catch (error) {\n throw new Error(`Git add failed: ${(error as Error).message}`)\n }\n }\n\n commit(message: string): void {\n try {\n execSync(`git commit -m \"${message}\"`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.debug(`Git commit: ${message}`)\n }\n catch (error) {\n throw new Error(`Git commit failed: ${(error as Error).message}`)\n }\n }\n\n createTag(version: string, tagPrefix: string = 'v'): void {\n try {\n const tagName = `${tagPrefix}${version}`\n execSync(`git tag -a ${tagName} -m \"Release ${tagName}\"`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.success(`已创建 tag: ${tagName}`)\n }\n catch (error) {\n throw new Error(`创建 Tag 失败: ${(error as Error).message}`)\n }\n }\n\n push(includeTags: boolean = true): void {\n try {\n execSync('git push', {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.debug('Git push')\n\n if (includeTags) {\n execSync('git push --tags', {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.success('已推送 tags')\n }\n }\n catch (error) {\n throw new Error(`Git push failed: ${(error as Error).message}`)\n }\n }\n\n commitAndPush(message: string, push: boolean = true, createTag: boolean = false, tagVersion?: string, tagPrefix: string = 'v'): void {\n try {\n execSync('git config --local core.autocrlf false', {\n cwd: this.rootDir,\n stdio: 'ignore',\n })\n }\n catch {\n log.warn('Failed to set git config')\n }\n\n this.addFiles(['-u'])\n this.commit(message)\n\n if (createTag && tagVersion) {\n this.createTag(tagVersion, tagPrefix)\n }\n\n if (push) {\n try {\n this.push(createTag)\n }\n catch (error) {\n log.warn(`Git push failed: ${(error as Error).message}`)\n }\n }\n }\n}\n","import { execSync } from 'node:child_process'\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as toml from '@iarna/toml'\nimport semver from 'semver'\nimport log from '@/utils/logger'\nimport { ChangelogManager } from './ChangelogManager'\nimport { GitManager } from './GitManager'\n\nexport interface RustUpdateOptions {\n dryRun?: boolean\n verbose?: boolean\n autoCommit?: boolean\n push?: boolean\n customVersion?: string | null\n tag?: boolean\n tagPrefix?: string\n changelog?: boolean\n allowUncommitted?: boolean\n}\n\nexport class RustManager {\n private cargoTomlPath: string\n private gitManager: GitManager\n private changelogManager: ChangelogManager\n private rootDir: string\n\n constructor(rootDir: string) {\n this.rootDir = rootDir\n this.cargoTomlPath = join(rootDir, 'Cargo.toml')\n this.gitManager = new GitManager(rootDir)\n this.changelogManager = new ChangelogManager(rootDir)\n }\n\n exists(): boolean {\n return existsSync(this.cargoTomlPath)\n }\n\n getCurrentVersion(): string | null {\n try {\n const content = readFileSync(this.cargoTomlPath, 'utf8')\n const parsed = toml.parse(content) as Record<string, any>\n if (parsed.package && typeof parsed.package.version === 'string') {\n return parsed.package.version\n }\n return null\n }\n catch {\n return null\n }\n }\n\n getPackageName(): string | null {\n try {\n const content = readFileSync(this.cargoTomlPath, 'utf8')\n const parsed = toml.parse(content) as Record<string, any>\n if (parsed.package && typeof parsed.package.name === 'string') {\n return parsed.package.name\n }\n return null\n }\n catch {\n return null\n }\n }\n\n updateVersion(releaseType: string, options: RustUpdateOptions = {}): { success: boolean, oldVersion: string, newVersion: string } {\n const {\n dryRun = false,\n verbose = false,\n customVersion = null,\n autoCommit = true,\n push = true,\n tag = true,\n tagPrefix = 'v',\n changelog = true,\n allowUncommitted = false,\n } = options\n\n if (!this.exists()) {\n throw new Error(`Cargo.toml 文件不存在: ${this.cargoTomlPath}`)\n }\n\n const oldVersion = this.getCurrentVersion()\n if (!oldVersion) {\n throw new Error(`Cargo.toml 文件中未找到 [package] 部分的 version 字段`)\n }\n\n const packageName = this.getPackageName() || 'rust'\n\n let newVersion: string | null = null\n\n if (customVersion) {\n if (!semver.valid(customVersion)) {\n throw new Error(`无效的自定义版本号: ${customVersion}`)\n }\n newVersion = customVersion\n }\n else {\n let semverType: semver.ReleaseType = releaseType as semver.ReleaseType\n let prerelease: string | undefined\n\n if (releaseType === 'pre-patch') {\n semverType = 'prepatch'\n prerelease = 'beta'\n }\n else if (releaseType === 'pre-minor') {\n semverType = 'preminor'\n prerelease = 'beta'\n }\n else if (releaseType === 'pre-major') {\n semverType = 'premajor'\n prerelease = 'beta'\n }\n else if (releaseType === 'prerelease') {\n semverType = 'prerelease'\n prerelease = 'beta'\n }\n\n if (prerelease) {\n newVersion = semver.inc(oldVersion, semverType, prerelease)\n }\n else {\n newVersion = semver.inc(oldVersion, semverType)\n }\n\n if (!newVersion) {\n throw new Error(`无法计算新版本,当前版本 \"${oldVersion}\",版本类型 \"${releaseType}\"`)\n }\n }\n\n if (!semver.valid(newVersion)) {\n throw new Error(`计算出的新版本 \"${newVersion}\" 不是有效的 semver 版本号`)\n }\n\n if (verbose) {\n log.info(`读取 Cargo.toml: ${this.cargoTomlPath}`)\n log.info(`当前版本: ${oldVersion}`)\n log.info(`新版本: ${newVersion}`)\n }\n\n if (!dryRun && autoCommit && !allowUncommitted && this.gitManager.hasUncommittedChanges()) {\n throw new Error('存在未提交的更改,请先提交或使用 --allow-uncommitted 选项')\n }\n\n if (dryRun) {\n const tagName = `${packageName}@${newVersion}`\n log.info(`\\n🔍 Dry-run 模式 - Cargo.toml 版本更新预览:`)\n log.info(` 当前版本: ${oldVersion}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tag ? tagName : '跳过'}`)\n log.info(` CHANGELOG: ${changelog ? '是' : '跳过'}`)\n log.info(` Git Commit: ${autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${push ? '是' : '否'}`)\n log.info(`\\n✅ 以上为预览,未执行任何实际操作`)\n return { success: true, oldVersion, newVersion }\n }\n\n this.writeVersion(newVersion)\n\n const verifiedVersion = this.getCurrentVersion()\n if (verifiedVersion !== newVersion) {\n throw new Error(`版本更新验证失败,期望版本 \"${newVersion}\",实际版本 \"${verifiedVersion}\"`)\n }\n\n log.success(`Cargo.toml 版本更新完成: ${oldVersion} → ${newVersion}`)\n\n if (changelog) {\n try {\n const commits = this.gitManager.getCommitsSinceLastTag()\n this.changelogManager.updateChangelog(newVersion, commits)\n log.success(`已更新 CHANGELOG.md`)\n }\n catch (error) {\n log.warn(`更新 CHANGELOG.md 失败: ${(error as Error).message}`)\n }\n }\n\n if (autoCommit) {\n try {\n this.gitManager.addFiles(['-u'])\n this.gitManager.commit(`chore: bump version to ${newVersion}`)\n log.success(`已提交更改`)\n }\n catch (error) {\n log.warn(`提交更改失败: ${(error as Error).message}`)\n }\n\n if (tag) {\n const tagName = `${packageName}@${newVersion}`\n try {\n execSync(`git tag -a ${tagName} -m \"Release ${tagName}\"`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.success(`已创建 tag: ${tagName}`)\n }\n catch (error) {\n log.warn(`创建 tag ${tagName} 失败: ${(error as Error).message}`)\n }\n }\n\n if (push) {\n try {\n this.gitManager.push(tag)\n log.success(`已推送 commits 和 tags`)\n }\n catch (error) {\n log.warn(`推送失败: ${(error as Error).message}`)\n }\n }\n }\n\n return { success: true, oldVersion, newVersion }\n }\n\n private writeVersion(newVersion: string): void {\n try {\n const content = readFileSync(this.cargoTomlPath, 'utf8')\n const lines = content.split('\\n')\n let inPackageSection = false\n let versionUpdated = false\n\n const newLines = lines.map((line) => {\n const trimmedLine = line.trim()\n\n if (trimmedLine.startsWith('[package]')) {\n inPackageSection = true\n return line\n }\n\n if (trimmedLine.startsWith('[') && inPackageSection) {\n inPackageSection = false\n return line\n }\n\n if (inPackageSection) {\n const versionMatch = trimmedLine.match(/^version\\s*=\\s*[\"'](.+?)[\"']/)\n if (versionMatch) {\n versionUpdated = true\n const spaces = line.match(/^\\s*/)?.[0] || ''\n const quote = versionMatch[0].includes('\"') ? '\"' : \"'\"\n return `${spaces}version = ${quote}${newVersion}${quote}`\n }\n }\n\n return line\n })\n\n if (!versionUpdated) {\n let packageSectionIndex = -1\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].trim().startsWith('[package]')) {\n packageSectionIndex = i\n break\n }\n }\n\n if (packageSectionIndex !== -1) {\n newLines.splice(packageSectionIndex + 1, 0, `version = \"${newVersion}\"`)\n }\n else {\n newLines.unshift('[package]', `version = \"${newVersion}\"`)\n }\n }\n\n writeFileSync(this.cargoTomlPath, newLines.join('\\n'), { encoding: 'utf8' })\n }\n catch (error: any) {\n throw new Error(`写入 Cargo.toml 失败: ${error.message}`)\n }\n }\n}\n","import { resolve } from 'node:path'\n\nexport function validatePath(path: string, rootDir: string): boolean {\n const resolvedPath = resolve(path)\n return resolvedPath.startsWith(rootDir)\n}\n\nexport function validateCommand(command: string): boolean {\n const dangerousPatterns = [\n /;\\s*[a-z0-9]/i,\n /\\|\\|\\s*[a-z0-9]/i,\n /&&\\s*[a-z0-9]/i,\n /\\$\\(.*\\)/,\n /`.*`/,\n /\\|\\s*[a-z0-9]/i,\n ]\n\n return !dangerousPatterns.some(pattern => pattern.test(command))\n}\n\nexport function sanitizeFileName(name: string): string {\n return name.replace(/[<>:\"/\\\\|?*]/g, '_')\n}\n","import type { SemVer } from 'semver'\nimport semver from 'semver'\n\nexport function isValidVersion(version: string): boolean {\n return semver.valid(version) !== null\n}\n\nexport function parseVersion(version: string): SemVer | null {\n return semver.parse(version)\n}\n\nexport function incrementVersion(currentVersion: string, releaseType: string, identifier?: string): string | null {\n if (identifier) {\n return semver.inc(currentVersion, releaseType as semver.ReleaseType, identifier)\n }\n return semver.inc(currentVersion, releaseType as semver.ReleaseType)\n}\n\nexport function compareVersions(v1: string, v2: string): number {\n return semver.compare(v1, v2)\n}\n\nexport function getVersionDiff(oldVersion: string, newVersion: string): string | null {\n if (!semver.valid(oldVersion) || !semver.valid(newVersion)) {\n return null\n }\n\n if (semver.major(newVersion) > semver.major(oldVersion))\n return 'major'\n if (semver.minor(newVersion) > semver.minor(oldVersion))\n return 'minor'\n if (semver.patch(newVersion) > semver.patch(oldVersion))\n return 'patch'\n return null\n}\n\nexport function isPrerelease(version: string): boolean {\n return semver.prerelease(version) !== null\n}\n\nexport function coerceVersion(version: string): string | null {\n const coerced = semver.coerce(version)\n return coerced?.version || null\n}\n\nexport function getMajor(version: string): number | null {\n const parsed = semver.parse(version)\n return parsed?.major ?? null\n}\n\nexport function getMinor(version: string): number | null {\n const parsed = semver.parse(version)\n return parsed?.minor ?? null\n}\n\nexport function getPatch(version: string): number | null {\n const parsed = semver.parse(version)\n return parsed?.patch ?? null\n}\n","import type { Config, GitConfig, PackageInfo, PackagePaths, PreviewPackage, PreviewResult, PublishConfig, ReleaseType, UpdateOptions, UpdateResult, VersionManagerOptions } from '@/types'\nimport { readFileSync, writeFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport process from 'node:process'\nimport { loadConfig } from '@/config/loader'\nimport log from '@/utils/logger'\nimport { validateCommand, validatePath } from '@/utils/security'\nimport { getMajor, getMinor, getPatch, incrementVersion, isPrerelease, isValidVersion } from '@/utils/semver'\nimport { ChangelogManager } from './ChangelogManager'\nimport { GitManager } from './GitManager'\n\nexport class VersionManager {\n private config: Config\n private rootDir: string\n private packagePaths: PackagePaths\n private publishConfig: PublishConfig\n private gitConfig: GitConfig\n private gitPush: boolean\n private packageCache: Map<string, PackageInfo> = new Map()\n private gitManager: GitManager\n private changelogManager: ChangelogManager\n\n constructor(options: VersionManagerOptions = {}) {\n const { packagePaths, configPath, config, rootDir = process.cwd() } = options\n\n this.config = config || (configPath ? loadConfig(dirname(configPath)) : loadConfig(rootDir))\n this.rootDir = rootDir\n this.packagePaths = packagePaths || this.config.packagePaths\n this.publishConfig = this.config.publish || {}\n this.gitConfig = this.config.git || {}\n this.gitPush = this.gitConfig.push !== false\n this.gitManager = new GitManager(rootDir)\n this.changelogManager = new ChangelogManager(rootDir)\n\n if (!this.packagePaths || typeof this.packagePaths !== 'object' || Object.keys(this.packagePaths).length === 0) {\n throw new Error('配置错误:未找到有效的包路径配置')\n }\n\n this._preloadPackageCache()\n }\n\n /**\n * 预加载所有包信息到缓存,避免后续重复读取文件\n */\n private _preloadPackageCache(): void {\n for (const pkgPath of Object.values(this.packagePaths)) {\n try {\n this.getPackageInfo(pkgPath)\n }\n catch (error) {\n // 忽略预加载失败,在实际使用时再处理\n log.debug(`预加载包信息失败 ${pkgPath}: ${(error as Error).message}`)\n }\n }\n log.debug(`已预加载 ${this.packageCache.size} 个包的信息到缓存`)\n }\n\n /**\n * 清除包信息缓存\n * @param pkgPath 可选,指定要清除的包路径,不传则清除所有缓存\n */\n clearPackageCache(pkgPath?: string): void {\n if (pkgPath) {\n this.packageCache.delete(pkgPath)\n log.debug(`已清除包缓存: ${pkgPath}`)\n }\n else {\n this.packageCache.clear()\n log.debug('已清除所有包缓存')\n }\n }\n\n /**\n * 刷新指定包的缓存(重新从文件读取)\n * @param pkgPath 包的路径\n */\n refreshPackageCache(pkgPath: string): PackageInfo {\n this.packageCache.delete(pkgPath)\n return this.getPackageInfo(pkgPath)\n }\n\n /**\n * 获取缓存统计信息\n */\n getCacheStats(): { size: number, packages: string[] } {\n return {\n size: this.packageCache.size,\n packages: Array.from(this.packageCache.keys()),\n }\n }\n\n async previewUpdate(pkgName: string, releaseType: ReleaseType = 'patch', options: UpdateOptions = {}): Promise<PreviewResult> {\n const {\n packagePaths = this.packagePaths,\n customVersion = null,\n autoCommit = this.gitConfig.autoCommit !== false,\n push = this.gitConfig.push !== false,\n npm = false,\n changelog = this.gitConfig.changelog !== false,\n tagPrefix = this.gitConfig.tagPrefix || 'v',\n packageVersionSelections,\n } = options\n\n const packages: PreviewPackage[] = []\n\n if (pkgName === 'all' && packageVersionSelections) {\n for (const [packageName, selection] of Object.entries(packageVersionSelections)) {\n const pkgPath = packagePaths[packageName]\n if (!pkgPath) {\n throw new Error(`无效的包名: ${packageName}`)\n }\n\n const pkg = this.getPackageInfo(pkgPath)\n let newVersion: string | null = null\n\n if (selection.customVersion) {\n if (!isValidVersion(selection.customVersion)) {\n throw new Error(`无效的自定义版本号: ${selection.customVersion}`)\n }\n newVersion = selection.customVersion\n }\n else {\n try {\n switch (selection.type) {\n case 'major':\n case 'minor':\n case 'patch':\n newVersion = incrementVersion(pkg.version, selection.type)\n break\n case 'next':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n case 'pre-patch':\n if (isPrerelease(pkg.version)) {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prepatch', 'beta')\n }\n break\n case 'pre-minor':\n if (isPrerelease(pkg.version)) {\n const currentMinor = getMinor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n if (potentialVersion && (getMinor(potentialVersion) ?? 0) > currentMinor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n }\n break\n case 'pre-major':\n if (isPrerelease(pkg.version)) {\n const currentMajor = getMajor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n if (potentialVersion && (getMajor(potentialVersion) ?? 0) > currentMajor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n }\n break\n case 'as-is':\n newVersion = pkg.version\n break\n case 'conventional':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n default:\n throw new Error(`不支持的版本类型: ${selection.type}`)\n }\n }\n catch (error: any) {\n throw new Error(`版本计算失败: ${error.message}`)\n }\n }\n\n if (!newVersion) {\n throw new Error(`无法计算新版本号,当前版本: ${pkg.version},类型: ${selection.type}`)\n }\n\n const isDefaultPackage = packageName === 'default' || packagePaths[packageName] === 'package.json'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n packages.push({\n name: packageName,\n oldVersion: pkg.version,\n newVersion,\n tagName,\n changelogEnabled: changelog && isDefaultPackage,\n isDefaultPackage,\n })\n }\n }\n else {\n const targets = pkgName === 'all' ? Object.values(packagePaths) : [packagePaths[pkgName]]\n\n if (!targets.length || targets.some(path => !path)) {\n throw new Error(`无效的包名: ${pkgName}`)\n }\n\n for (const pkgPath of targets) {\n const pkg = this.getPackageInfo(pkgPath)\n let newVersion: string | null = null\n\n if (customVersion) {\n if (!isValidVersion(customVersion)) {\n throw new Error(`无效的自定义版本号: ${customVersion}`)\n }\n newVersion = customVersion\n }\n else {\n try {\n switch (releaseType) {\n case 'major':\n case 'minor':\n case 'patch':\n newVersion = incrementVersion(pkg.version, releaseType)\n break\n case 'next':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n case 'pre-patch':\n if (isPrerelease(pkg.version)) {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prepatch', 'beta')\n }\n break\n case 'pre-minor':\n if (isPrerelease(pkg.version)) {\n const currentMinor = getMinor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n if (potentialVersion && (getMinor(potentialVersion) ?? 0) > currentMinor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n }\n break\n case 'pre-major':\n if (isPrerelease(pkg.version)) {\n const currentMajor = getMajor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n if (potentialVersion && (getMajor(potentialVersion) ?? 0) > currentMajor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n }\n break\n case 'as-is':\n newVersion = pkg.version\n break\n case 'conventional':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n default:\n throw new Error(`不支持的版本类型: ${releaseType}`)\n }\n }\n catch (error: any) {\n throw new Error(`版本计算失败: ${error.message}`)\n }\n }\n\n if (!newVersion) {\n throw new Error(`无法计算新版本号,当前版本: ${pkg.version},类型: ${releaseType}`)\n }\n\n const isDefaultPackage = pkgName === 'default' || packagePaths[pkgName] === 'package.json'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n packages.push({\n name: pkg.name,\n oldVersion: pkg.version,\n newVersion,\n tagName,\n changelogEnabled: changelog && isDefaultPackage,\n isDefaultPackage,\n })\n }\n }\n\n return {\n packages,\n autoCommit,\n push,\n npm,\n }\n }\n\n async updateVersion(pkgName: string, releaseType: ReleaseType = 'patch', options: UpdateOptions = {}): Promise<UpdateResult> {\n const {\n dryRun = false,\n verbose = false,\n packagePaths = this.packagePaths,\n customVersion = null,\n autoCommit = this.gitConfig.autoCommit !== false,\n npm = false,\n changelog = this.gitConfig.changelog !== false,\n tag = this.gitConfig.tag !== false,\n tagPrefix = this.gitConfig.tagPrefix || 'v',\n isBatchMode = false, // 默认不是批量模式\n } = options\n\n const result: UpdateResult = {\n success: false,\n updatedPackages: [],\n publishedPackages: [],\n error: null,\n }\n\n return log.withSpinner(\n `正在更新${pkgName === 'all' ? '所有包' : `包${pkgName}`}的版本...`,\n\n async () => {\n try {\n const targets = pkgName === 'all' ? Object.values(packagePaths) : [packagePaths[pkgName]]\n\n if (!targets.length || targets.some(path => !path)) {\n throw new Error(`无效的包名: ${pkgName}`)\n }\n\n // 检查版本是否存在\n let finalVersion: string | null = null\n for (const pkgPath of targets) {\n const pkg = this.getPackageInfo(pkgPath)\n let newVersion: string | null = null\n\n if (customVersion) {\n if (!isValidVersion(customVersion)) {\n throw new Error(`无效的自定义版本号: ${customVersion}`)\n }\n newVersion = customVersion\n }\n else {\n try {\n switch (releaseType) {\n case 'major':\n case 'minor':\n case 'patch':\n newVersion = incrementVersion(pkg.version, releaseType)\n break\n case 'next':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n case 'pre-patch':\n if (isPrerelease(pkg.version)) {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prepatch', 'beta')\n }\n break\n case 'pre-minor':\n if (isPrerelease(pkg.version)) {\n const currentMinor = getMinor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n if (potentialVersion && (getMinor(potentialVersion) ?? 0) > currentMinor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'preminor', 'beta')\n }\n break\n case 'pre-major':\n if (isPrerelease(pkg.version)) {\n const currentMajor = getMajor(pkg.version) ?? 0\n const potentialVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n if (potentialVersion && (getMajor(potentialVersion) ?? 0) > currentMajor) {\n newVersion = potentialVersion\n }\n else {\n newVersion = incrementVersion(pkg.version, 'prerelease', 'beta')\n }\n }\n else {\n newVersion = incrementVersion(pkg.version, 'premajor', 'beta')\n }\n break\n case 'as-is':\n newVersion = pkg.version\n break\n case 'conventional':\n newVersion = incrementVersion(pkg.version, 'patch')\n break\n default:\n throw new Error(`不支持的版本类型: ${releaseType}`)\n }\n }\n catch (error: any) {\n throw new Error(`版本计算失败: ${error.message}`)\n }\n }\n\n if (!newVersion) {\n throw new Error(`无法计算新版本号,当前版本: ${pkg.version},类型: ${releaseType}`)\n }\n\n // 只在第一个包时检查版本\n if (!finalVersion) {\n finalVersion = newVersion\n const isDefaultPackage = pkgName === 'default' || this.config.packagePaths[pkgName] === 'package.json'\n const versionTag = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n if (!dryRun && this.gitManager.checkVersionExists(newVersion, tagPrefix, isDefaultPackage ? undefined : pkg.name)) {\n throw new Error(`版本 ${versionTag} 已存在,请使用其他版本`)\n }\n }\n\n if (dryRun) {\n log.dryRun(`将更新 ${pkg.name} 从 v${pkg.version} 到 v${newVersion}`)\n }\n else {\n const updatedPkg = { ...pkg, version: newVersion }\n this.savePackageInfo(pkgPath, updatedPkg)\n log.info(`已更新 ${pkg.name} 到 v${newVersion}`)\n }\n\n result.updatedPackages.push({\n name: pkg.name,\n oldVersion: pkg.version,\n newVersion,\n pkgKey: pkgName,\n })\n }\n\n // 生成CHANGELOG\n // 在批量更新模式时,只有主项目包(default)才生成 CHANGELOG\n const isDefaultPackage = pkgName === 'default' || this.config.packagePaths[pkgName] === 'package.json'\n\n if (!dryRun && changelog && finalVersion) {\n // 如果是批量模式且不是主项目包,跳过 CHANGELOG 生成\n if (isBatchMode && !isDefaultPackage) {\n log.info(`子包 ${pkgName} 跳过 CHANGELOG 生成`)\n }\n else {\n try {\n const commits = this.gitManager.getCommitsSinceLastTag()\n\n // 主项目包不传 packageName(使用 tagPrefix 格式),子包传 packageName(使用 {package-name}@{version} 格式)\n let packageName: string | undefined\n if (!isDefaultPackage) {\n // 子包:获取 package.json 的 name 字段\n const firstPkg = this.getPackageInfo(targets[0])\n packageName = firstPkg.name\n }\n // 主项目包:packageName 为 undefined,ChangelogManager 会直接使用 version\n\n await this.changelogManager.updateChangelog(finalVersion, commits, packageName)\n log.success('已更新 CHANGELOG.md')\n }\n catch (changelogError) {\n log.warn(`CHANGELOG生成失败: ${(changelogError as Error).message}`)\n }\n }\n }\n\n if (!dryRun && npm) {\n for (const pkgPath of targets) {\n const pkg = this.getPackageInfo(pkgPath)\n const pkgDir = dirname(pkgPath)\n log.info(`\\n发布 ${pkg.name}...`)\n\n try {\n const publishCmd = this.publishConfig.command || 'pnpm publish --access public --no-git-checks'\n\n if (!validateCommand(publishCmd)) {\n throw new Error(`不安全的发布命令: ${publishCmd}`)\n }\n\n if (verbose) {\n log.debug(`执行命令: ${publishCmd} (在目录: ${pkgDir})`)\n }\n\n const { execSync } = await import('node:child_process')\n execSync(publishCmd, {\n cwd: pkgDir,\n stdio: 'inherit',\n })\n result.publishedPackages.push(pkg.name)\n }\n catch (e: any) {\n throw new Error(`发布失败 ${pkg.name}: ${e.message}`)\n }\n }\n }\n\n // Git提交和Tag\n if (!dryRun && autoCommit && result.updatedPackages.length > 0) {\n try {\n let commitMessage: string\n const updatedPackage = result.updatedPackages[0]\n const newVersion = updatedPackage.newVersion\n const isDefaultPackage = pkgName === 'default' || this.config.packagePaths[pkgName] === 'package.json'\n\n if (this.gitConfig.commitMessage && this.gitConfig.commitMessage !== 'chore: bump version to {{newVersion}}') {\n commitMessage = this.gitConfig.commitMessage.replace(/\\{\\{newVersion\\}\\}/g, newVersion)\n }\n else if (pkgName === 'all') {\n const versionInfo = result.updatedPackages.map(pkg => `${pkg.name}@${pkg.newVersion}`).join(', ')\n commitMessage = `chore: bump version for all packages\\n\\n${versionInfo}`\n }\n else {\n commitMessage = `chore: bump version for ${pkgName} to v${newVersion}`\n }\n\n // 主项目包使用 {tagPrefix}{version} 格式,子包使用 {package-name}@{version} 格式\n if (isDefaultPackage) {\n // 主项目包:使用配置的 tagPrefix (如 v1.0.1)\n this.gitManager.commitAndPush(commitMessage, this.gitPush, tag, newVersion, tagPrefix)\n }\n else {\n // 子包:创建 {package-name}@{version} 格式的 tag\n const { execSync } = await import('node:child_process')\n\n this.gitManager.addFiles(['-u'])\n this.gitManager.commit(commitMessage)\n\n // 创建 {package-name}@{version} 格式的 tag\n const tagName = `${updatedPackage.name}@${newVersion}`\n try {\n execSync(`git tag -a ${tagName} -m \"Release ${tagName}\"`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.success(`已创建 tag: ${tagName}`)\n }\n catch (tagError) {\n log.warn(`创建 tag ${tagName} 失败: ${(tagError as Error).message}`)\n }\n\n // 推送\n if (this.gitPush) {\n try {\n this.gitManager.push(true)\n }\n catch (pushError) {\n log.warn(`Git push failed: ${(pushError as Error).message}`)\n }\n }\n }\n }\n catch (gitError: any) {\n log.warn(`Git操作失败: ${gitError.message}`)\n }\n }\n\n result.success = true\n return result\n }\n catch (error: any) {\n result.error = error.message\n return result\n }\n },\n {\n succeedText: pkgName === 'all' ? '所有包版本更新完成' : `包 ${pkgName} 版本更新完成`,\n failText: '版本更新失败',\n },\n )\n }\n\n async gitCommitAndPush(\n push: boolean = true,\n updatedPackages?: Array<{ name: string, newVersion: string, pkgKey?: string }>,\n tag: boolean = this.gitConfig.tag !== false,\n tagPrefix: string = this.gitConfig.tagPrefix || 'v',\n ): Promise<void> {\n try {\n const commitMessage = 'chore: bump versions for multiple packages'\n\n // 如果提供了更新的包列表且启用了 tag,则为每个包创建独立的 tag\n if (tag && updatedPackages && updatedPackages.length > 0) {\n // 先提交更改\n this.gitManager.addFiles(['-u'])\n this.gitManager.commit(commitMessage)\n\n // 为每个包创建独立的 tag\n const { execSync } = await import('node:child_process')\n for (const pkg of updatedPackages) {\n let tagName: string\n\n // 通过 pkgKey 判断是否为主项目包\n const isMainPackage = pkg.pkgKey === 'default'\n\n if (isMainPackage) {\n // 主项目包:使用 {tagPrefix}{version} 格式\n tagName = `${tagPrefix}${pkg.newVersion}`\n }\n else {\n // 子包:使用 {package-name}@{version} 格式\n tagName = `${pkg.name}@${pkg.newVersion}`\n }\n\n try {\n execSync(`git tag -a ${tagName} -m \"Release ${tagName}\"`, {\n cwd: this.rootDir,\n stdio: 'pipe',\n })\n log.success(`已创建 tag: ${tagName}`)\n }\n catch (error) {\n log.warn(`创建 tag ${tagName} 失败: ${(error as Error).message}`)\n }\n }\n\n // 推送 commits 和 tags\n if (push) {\n try {\n this.gitManager.push(true)\n }\n catch (error) {\n log.warn(`Git push failed: ${(error as Error).message}`)\n }\n }\n }\n else {\n // 原有逻辑:不创建 tag\n this.gitManager.commitAndPush(commitMessage, push, false)\n }\n }\n catch (error: any) {\n log.warn(`Git操作失败: ${error.message}`)\n }\n }\n\n /**\n * 获取包信息(带缓存)\n * @param pkgPath 包的路径\n * @returns 包信息对象\n */\n getPackageInfo(pkgPath: string): PackageInfo {\n // 首先检查缓存\n const cached = this.packageCache.get(pkgPath)\n if (cached) {\n return cached\n }\n\n // 缓存未命中,从文件读取\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as PackageInfo\n // 写入缓存\n this.packageCache.set(pkgPath, pkg)\n return pkg\n }\n catch (error: any) {\n throw new Error(`读取文件失败 ${pkgPath}: ${error.message}`)\n }\n }\n\n private savePackageInfo(pkgPath: string, pkg: PackageInfo): void {\n if (!validatePath(pkgPath, this.rootDir)) {\n throw new Error(`不安全的文件路径: ${pkgPath}`)\n }\n\n try {\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`)\n // 更新缓存\n this.packageCache.set(pkgPath, pkg)\n }\n catch (error: any) {\n throw new Error(`写入文件失败 ${pkgPath}: ${error.message}`)\n }\n }\n\n getPackageVersion(pkgName: string): string | null {\n const pkgPath = this.packagePaths[pkgName]\n if (!pkgPath)\n return null\n\n try {\n const pkg = this.getPackageInfo(pkgPath)\n return pkg.version\n }\n catch {\n return null\n }\n }\n\n isValidVersion(version: string): boolean {\n return isValidVersion(version)\n }\n\n getVersionDiff(oldVersion: string, newVersion: string): string | null {\n if (!isValidVersion(oldVersion) || !isValidVersion(newVersion)) {\n return null\n }\n\n if ((getMajor(newVersion) ?? 0) > (getMajor(oldVersion) ?? 0))\n return 'major'\n if ((getMinor(newVersion) ?? 0) > (getMinor(oldVersion) ?? 0))\n return 'minor'\n if ((getPatch(newVersion) ?? 0) > (getPatch(oldVersion) ?? 0))\n return 'patch'\n return null\n }\n}\n\nexport default VersionManager\n","export function isPathLike(arg: string): boolean {\n return (\n arg.startsWith('./') ||\n arg.startsWith('../') ||\n arg.startsWith('.\\\\') ||\n arg.startsWith('..\\\\') ||\n arg.startsWith('/') ||\n arg.startsWith('\\\\') ||\n /^[A-Za-z]:[\\\\/].*/.test(arg) ||\n arg.startsWith('~') ||\n arg === '.' ||\n arg.startsWith('\\\\\\\\') ||\n arg.startsWith('//') ||\n arg.includes('/') ||\n arg.includes('\\\\') ||\n arg.includes('.')\n )\n}\n\nexport function resolvePath(basePath: string, targetPath: string): string {\n const { resolve } = require('node:path')\n if (targetPath.startsWith('/') || /^[a-z]:\\\\/i.test(targetPath)) {\n return resolve(targetPath)\n }\n return resolve(basePath, targetPath)\n}\n\nexport function isAbsolutePath(path: string): boolean {\n return path.startsWith('/') || /^[a-z]:\\\\/i.test(path) || path.startsWith('\\\\\\\\') || path.startsWith('//')\n}"],"mappings":"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"}