@mznjs/mbump 2.2.0 → 2.3.0
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 +151 -0
- package/README.md +189 -149
- package/dist/{chunk-DAa1jVm7.js → chunk-Cl8Af3a2.js} +1 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +87 -68
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +37 -36
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/{path-Dxq6zEl-.js → path-CDDLZPST.js} +194 -226
- package/dist/path-CDDLZPST.js.map +1 -0
- package/package.json +15 -16
- package/dist/path-Dxq6zEl-.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { RustManager, VersionManager, clearConfigCache, isPathLike, loadConfigAsync, logger_default } from "./path-Dxq6zEl-.js";
|
|
2
|
+
import { VersionManager, clearConfigCache, isPathLike, loadConfigAsync, logger_default } from "./path-CDDLZPST.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";
|
|
7
|
-
import semver from "semver";
|
|
8
6
|
import process from "node:process";
|
|
7
|
+
import semver from "semver";
|
|
9
8
|
import { fileURLToPath } from "node:url";
|
|
10
9
|
import inquirer from "inquirer";
|
|
11
10
|
|
|
@@ -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
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
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
|
{
|
|
@@ -120,7 +115,7 @@ function parseArgs(args, defaults = {}) {
|
|
|
120
115
|
autoCommit: defaults.git?.autoCommit !== false,
|
|
121
116
|
push: defaults.git?.push !== false,
|
|
122
117
|
allowUncommitted: defaults.allowUncommitted || false,
|
|
123
|
-
|
|
118
|
+
publish: defaults.publish || false,
|
|
124
119
|
showConfig: false,
|
|
125
120
|
rust: false,
|
|
126
121
|
tag: defaults.git?.tag !== false,
|
|
@@ -156,8 +151,8 @@ function parseArgs(args, defaults = {}) {
|
|
|
156
151
|
} else if (arg === "--allow-uncommitted" || arg === "-u") {
|
|
157
152
|
parsed.allowUncommitted = true;
|
|
158
153
|
i++;
|
|
159
|
-
} else if (arg === "--
|
|
160
|
-
parsed.
|
|
154
|
+
} else if (arg === "--publish" || arg === "-P") {
|
|
155
|
+
parsed.publish = true;
|
|
161
156
|
i++;
|
|
162
157
|
} else if (arg === "--show-config" || arg === "-c") {
|
|
163
158
|
parsed.showConfig = true;
|
|
@@ -207,7 +202,7 @@ function renderPreview(preview) {
|
|
|
207
202
|
}
|
|
208
203
|
logger_default.info(` Git Commit: ${preview.autoCommit ? "是" : "否"}`);
|
|
209
204
|
logger_default.info(` Git Push: ${preview.push ? "是" : "否"}`);
|
|
210
|
-
logger_default.info(`
|
|
205
|
+
logger_default.info(` Publish: ${preview.publish ? "是" : "否"}`);
|
|
211
206
|
logger_default.info("\n✅ 以上为预览,未执行任何实际操作");
|
|
212
207
|
}
|
|
213
208
|
let packageVersion = "1.0.0";
|
|
@@ -363,7 +358,7 @@ function showHelp() {
|
|
|
363
358
|
--no-commit, -n 禁用自动git提交
|
|
364
359
|
--no-push, -p 禁用自动推送到远程仓库
|
|
365
360
|
--allow-uncommitted, -u 允许在有未提交更改的情况下继续操作
|
|
366
|
-
--
|
|
361
|
+
--publish, -P 启用包发布功能(默认不发布)
|
|
367
362
|
--show-config, -c 显示当前加载的完整配置信息
|
|
368
363
|
--rust, -r 启用 Rust 项目模式,更新 Cargo.toml 中的版本号
|
|
369
364
|
--version, -V 显示版本信息
|
|
@@ -374,7 +369,7 @@ function showHelp() {
|
|
|
374
369
|
mbump all minor # 将所有包升级一个小版本
|
|
375
370
|
mbump plugins major --dry-run # 试运行升级plugins包主版本
|
|
376
371
|
mbump core patch --no-push # 更新版本并提交到本地,但不推送到远程
|
|
377
|
-
mbump components patch --
|
|
372
|
+
mbump components patch --publish # 更新版本并发布
|
|
378
373
|
|
|
379
374
|
# 路径模式(直接指定项目目录)
|
|
380
375
|
mbump ./packages/my-pkg # 更新 ./packages/my-pkg 目录下的 package.json
|
|
@@ -419,8 +414,38 @@ async function main() {
|
|
|
419
414
|
displayError(new Error(`路径 "${parsedArgs.projectPath}" 不存在`), { operation: "路径验证" });
|
|
420
415
|
process.exit(1);
|
|
421
416
|
}
|
|
422
|
-
const
|
|
417
|
+
const cargoTomlPath = join(rootDir$1, "Cargo.toml");
|
|
418
|
+
if (!existsSync(cargoTomlPath)) {
|
|
419
|
+
displayError(new Error(`Cargo.toml 文件不存在于路径 "${rootDir$1}"`), { operation: "Rust 项目检测" });
|
|
420
|
+
logger_default.info(`💡 请确保指定的路径是 Rust 项目根目录`);
|
|
421
|
+
process.exit(1);
|
|
422
|
+
}
|
|
423
423
|
if (parsedArgs.projectPath) logger_default.info(`切换到项目路径: ${rootDir$1}`);
|
|
424
|
+
let packageName = "default";
|
|
425
|
+
try {
|
|
426
|
+
const content = readFileSync(cargoTomlPath, "utf8");
|
|
427
|
+
const toml = await import("toml");
|
|
428
|
+
const parsed = toml.parse(content);
|
|
429
|
+
packageName = parsed.package?.name || "rust";
|
|
430
|
+
} catch {
|
|
431
|
+
packageName = "rust";
|
|
432
|
+
}
|
|
433
|
+
const projectConfig = {
|
|
434
|
+
packagePaths: { [packageName]: cargoTomlPath },
|
|
435
|
+
defaults: { releaseType: "patch" },
|
|
436
|
+
git: {
|
|
437
|
+
autoCommit: parsedArgs.autoCommit,
|
|
438
|
+
push: parsedArgs.push,
|
|
439
|
+
tag: parsedArgs.tag,
|
|
440
|
+
changelog: parsedArgs.changelog
|
|
441
|
+
}
|
|
442
|
+
};
|
|
443
|
+
const versionManager$1 = new VersionManager({
|
|
444
|
+
config: projectConfig,
|
|
445
|
+
rootDir: rootDir$1,
|
|
446
|
+
projectType: "rust"
|
|
447
|
+
});
|
|
448
|
+
logger_default.setLevel(parsedArgs.verbose ? "debug" : "info");
|
|
424
449
|
if (hasUncommittedChanges()) if (!parsedArgs.allowUncommitted) {
|
|
425
450
|
logger_default.warn("警告: 检测到未提交的Git更改");
|
|
426
451
|
const inquirer$1 = await import("inquirer");
|
|
@@ -443,12 +468,7 @@ async function main() {
|
|
|
443
468
|
logger_default.success(`已提交更改: ${commitMessage}`);
|
|
444
469
|
} else logger_default.info("dry-run模式: 跳过实际提交操作");
|
|
445
470
|
} else logger_default.warn("警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。");
|
|
446
|
-
|
|
447
|
-
displayError(new Error(`Cargo.toml 文件不存在于路径 "${rootDir$1}"`), { operation: "Rust 项目检测" });
|
|
448
|
-
logger_default.info(`💡 请确保指定的路径是 Rust 项目根目录`);
|
|
449
|
-
process.exit(1);
|
|
450
|
-
}
|
|
451
|
-
const currentVersion = rustManager.getCurrentVersion();
|
|
471
|
+
const currentVersion = versionManager$1.getPackageVersion(packageName);
|
|
452
472
|
if (!currentVersion) {
|
|
453
473
|
displayError(new Error(`Cargo.toml 文件中未找到 [package] 部分的 version 字段`), { operation: "版本读取" });
|
|
454
474
|
process.exit(1);
|
|
@@ -456,31 +476,30 @@ async function main() {
|
|
|
456
476
|
let selectedType$1 = parsedArgs.type;
|
|
457
477
|
let customVersion$1 = null;
|
|
458
478
|
if (!parsedArgs.type) {
|
|
459
|
-
const
|
|
460
|
-
defaults: { releaseType: "patch" },
|
|
461
|
-
packagePaths: {}
|
|
462
|
-
};
|
|
463
|
-
const selection = await selectVersionInteractive(config$1, "rust", currentVersion);
|
|
479
|
+
const selection = await selectVersionInteractive(projectConfig, packageName, currentVersion, rootDir$1);
|
|
464
480
|
selectedType$1 = selection.type;
|
|
465
481
|
customVersion$1 = selection.customVersion;
|
|
466
482
|
}
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
dryRun: parsedArgs.dryRun,
|
|
470
|
-
verbose: parsedArgs.verbose,
|
|
471
|
-
autoCommit: parsedArgs.autoCommit,
|
|
472
|
-
push: parsedArgs.push,
|
|
483
|
+
if (parsedArgs.dryRun) {
|
|
484
|
+
const preview = await versionManager$1.previewUpdate(packageName, selectedType$1, {
|
|
473
485
|
customVersion: customVersion$1,
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
changelog: parsedArgs.changelog,
|
|
477
|
-
allowUncommitted: parsedArgs.allowUncommitted
|
|
486
|
+
autoCommit: parsedArgs.autoCommit,
|
|
487
|
+
push: parsedArgs.push
|
|
478
488
|
});
|
|
489
|
+
renderPreview(preview);
|
|
479
490
|
process.exit(0);
|
|
480
|
-
} catch (error) {
|
|
481
|
-
displayError(error, { operation: "Rust 版本更新" });
|
|
482
|
-
process.exit(1);
|
|
483
491
|
}
|
|
492
|
+
await versionManager$1.updateVersion(packageName, selectedType$1, {
|
|
493
|
+
dryRun: parsedArgs.dryRun,
|
|
494
|
+
verbose: parsedArgs.verbose,
|
|
495
|
+
autoCommit: parsedArgs.autoCommit,
|
|
496
|
+
push: parsedArgs.push,
|
|
497
|
+
customVersion: customVersion$1,
|
|
498
|
+
tag: parsedArgs.tag,
|
|
499
|
+
changelog: parsedArgs.changelog
|
|
500
|
+
});
|
|
501
|
+
logger_default.success(`版本更新完成`);
|
|
502
|
+
process.exit(0);
|
|
484
503
|
}
|
|
485
504
|
if (parsedArgs.projectPath) {
|
|
486
505
|
const resolvedProjectPath = resolve(process.cwd(), parsedArgs.projectPath);
|
|
@@ -543,7 +562,7 @@ async function main() {
|
|
|
543
562
|
customVersion: customVersion$1,
|
|
544
563
|
autoCommit: parsedArgs.autoCommit,
|
|
545
564
|
push: parsedArgs.push,
|
|
546
|
-
|
|
565
|
+
publish: parsedArgs.publish
|
|
547
566
|
});
|
|
548
567
|
renderPreview(preview);
|
|
549
568
|
process.exit(0);
|
|
@@ -553,7 +572,7 @@ async function main() {
|
|
|
553
572
|
verbose: parsedArgs.verbose,
|
|
554
573
|
autoCommit: parsedArgs.autoCommit,
|
|
555
574
|
push: parsedArgs.push,
|
|
556
|
-
|
|
575
|
+
publish: parsedArgs.publish,
|
|
557
576
|
customVersion: customVersion$1
|
|
558
577
|
});
|
|
559
578
|
logger_default.success(`版本更新完成`);
|
|
@@ -581,7 +600,7 @@ async function main() {
|
|
|
581
600
|
logger_default.info(` dryRun: ${config.defaults?.dryRun}`);
|
|
582
601
|
logger_default.info(` verbose: ${config.defaults?.verbose}`);
|
|
583
602
|
logger_default.info(` allowUncommitted: ${config.defaults?.allowUncommitted}`);
|
|
584
|
-
logger_default.info(`
|
|
603
|
+
logger_default.info(` publish: ${config.defaults?.publish}`);
|
|
585
604
|
logger_default.info("");
|
|
586
605
|
logger_default.info("🔧 Git 选项:");
|
|
587
606
|
logger_default.info(` commit: ${config.git?.autoCommit}`);
|
|
@@ -634,7 +653,7 @@ async function main() {
|
|
|
634
653
|
customVersion: customVersion$1,
|
|
635
654
|
autoCommit: parsedArgsWithDefaults.autoCommit,
|
|
636
655
|
push: parsedArgsWithDefaults.push,
|
|
637
|
-
|
|
656
|
+
publish: parsedArgsWithDefaults.publish
|
|
638
657
|
});
|
|
639
658
|
renderPreview(preview);
|
|
640
659
|
process.exit(0);
|
|
@@ -644,7 +663,7 @@ async function main() {
|
|
|
644
663
|
verbose: parsedArgsWithDefaults.verbose,
|
|
645
664
|
autoCommit: parsedArgsWithDefaults.autoCommit,
|
|
646
665
|
push: parsedArgsWithDefaults.push,
|
|
647
|
-
|
|
666
|
+
publish: parsedArgsWithDefaults.publish,
|
|
648
667
|
customVersion: customVersion$1
|
|
649
668
|
});
|
|
650
669
|
logger_default.success(`版本更新完成`);
|
|
@@ -716,7 +735,7 @@ async function main() {
|
|
|
716
735
|
packageVersionSelections,
|
|
717
736
|
autoCommit: parsedArgsWithDefaults.autoCommit,
|
|
718
737
|
push: parsedArgsWithDefaults.push,
|
|
719
|
-
|
|
738
|
+
publish: parsedArgsWithDefaults.publish
|
|
720
739
|
});
|
|
721
740
|
renderPreview(preview);
|
|
722
741
|
process.exit(0);
|
|
@@ -766,16 +785,16 @@ async function main() {
|
|
|
766
785
|
});
|
|
767
786
|
logger_default.info("\n💡 提示: 可以单独重试失败的包,或检查错误信息后重新运行");
|
|
768
787
|
}
|
|
769
|
-
if (!parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.autoCommit && updatedPackagesInfo.length > 0) await versionManager.gitCommitAndPush(parsedArgsWithDefaults.push, updatedPackagesInfo, config.git?.tag !== false
|
|
770
|
-
if (parsedArgsWithDefaults.
|
|
771
|
-
const
|
|
772
|
-
const
|
|
773
|
-
const
|
|
774
|
-
logger_default.info(`\n🚀 开始发布 ${
|
|
775
|
-
for (let i = 0; i <
|
|
776
|
-
const [packageName, selection] =
|
|
777
|
-
const
|
|
778
|
-
updateProgress(
|
|
788
|
+
if (!parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.autoCommit && updatedPackagesInfo.length > 0) await versionManager.gitCommitAndPush(parsedArgsWithDefaults.push, updatedPackagesInfo, config.git?.tag !== false);
|
|
789
|
+
if (parsedArgsWithDefaults.publish && !parsedArgsWithDefaults.dryRun) {
|
|
790
|
+
const publishErrors = [];
|
|
791
|
+
const publishPackages = Object.entries(packageVersionSelections);
|
|
792
|
+
const publishTotal = publishPackages.length;
|
|
793
|
+
logger_default.info(`\n🚀 开始发布 ${publishTotal} 个包...\n`);
|
|
794
|
+
for (let i = 0; i < publishPackages.length; i++) {
|
|
795
|
+
const [packageName, selection] = publishPackages[i];
|
|
796
|
+
const publishCurrent = i + 1;
|
|
797
|
+
updateProgress(publishCurrent, publishTotal, packageName, "processing");
|
|
779
798
|
try {
|
|
780
799
|
await versionManager.updateVersion(packageName, selection.type, {
|
|
781
800
|
dryRun: false,
|
|
@@ -783,11 +802,11 @@ async function main() {
|
|
|
783
802
|
customVersion: selection.customVersion,
|
|
784
803
|
autoCommit: false,
|
|
785
804
|
push: false,
|
|
786
|
-
|
|
805
|
+
publish: true
|
|
787
806
|
});
|
|
788
|
-
updateProgress(
|
|
807
|
+
updateProgress(publishCurrent, publishTotal, packageName, "success");
|
|
789
808
|
} catch (error) {
|
|
790
|
-
|
|
809
|
+
publishErrors.push({
|
|
791
810
|
packageName,
|
|
792
811
|
error
|
|
793
812
|
});
|
|
@@ -795,13 +814,13 @@ async function main() {
|
|
|
795
814
|
packageName,
|
|
796
815
|
operation: "发布"
|
|
797
816
|
});
|
|
798
|
-
updateProgress(
|
|
817
|
+
updateProgress(publishCurrent, publishTotal, packageName, "failed");
|
|
799
818
|
}
|
|
800
819
|
}
|
|
801
820
|
logger_default.info("");
|
|
802
|
-
if (
|
|
803
|
-
logger_default.error(`\n❌
|
|
804
|
-
|
|
821
|
+
if (publishErrors.length > 0) {
|
|
822
|
+
logger_default.error(`\n❌ 发布完成,但有 ${publishErrors.length} 个包发布失败:`);
|
|
823
|
+
publishErrors.forEach(({ packageName, error }) => {
|
|
805
824
|
logger_default.error(` - ${packageName}: ${error.message}`);
|
|
806
825
|
});
|
|
807
826
|
}
|
|
@@ -812,7 +831,7 @@ async function main() {
|
|
|
812
831
|
customVersion,
|
|
813
832
|
autoCommit: parsedArgsWithDefaults.autoCommit,
|
|
814
833
|
push: parsedArgsWithDefaults.push,
|
|
815
|
-
|
|
834
|
+
publish: parsedArgsWithDefaults.publish
|
|
816
835
|
});
|
|
817
836
|
renderPreview(preview);
|
|
818
837
|
process.exit(0);
|
|
@@ -823,7 +842,7 @@ async function main() {
|
|
|
823
842
|
customVersion,
|
|
824
843
|
autoCommit: parsedArgsWithDefaults.autoCommit,
|
|
825
844
|
push: parsedArgsWithDefaults.push,
|
|
826
|
-
|
|
845
|
+
publish: parsedArgsWithDefaults.publish
|
|
827
846
|
});
|
|
828
847
|
}
|
|
829
848
|
logger_default.success(`版本更新完成${parsedArgsWithDefaults.dryRun ? " (试运行模式)" : ""}`);
|
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","projectConfig: Config","versionManager","inquirer","selectedType","customVersion: string | null","config: Config","packageVersionSelections: PackageVersionSelections","updatedPackagesInfo: Array<{ name: string, newVersion: string, pkgKey: string }>","errors: Array<{ packageName: string, error: Error }>","publishErrors: Array<{ packageName: string, error: Error }>","error: any"],"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 publish: defaults.publish || 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 === '--publish' || arg === '-P') {\n parsed.publish = 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 } 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 { 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(` Publish: ${preview.publish ? '是' : '否'}`)\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 --publish, -P 启用包发布功能(默认不发布)\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 --publish # 更新版本并发布\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 cargoTomlPath = join(rootDir, 'Cargo.toml')\n if (!existsSync(cargoTomlPath)) {\n displayError(new Error(`Cargo.toml 文件不存在于路径 \"${rootDir}\"`), {\n operation: 'Rust 项目检测',\n })\n log.info(`💡 请确保指定的路径是 Rust 项目根目录`)\n process.exit(1)\n }\n\n if (parsedArgs.projectPath) {\n log.info(`切换到项目路径: ${rootDir}`)\n }\n\n let packageName = 'default'\n try {\n const content = readFileSync(cargoTomlPath, 'utf8')\n const toml = await import('toml')\n const parsed = toml.parse(content) as Record<string, any>\n packageName = parsed.package?.name || 'rust'\n }\n catch {\n packageName = 'rust'\n }\n\n const projectConfig: Config = {\n packagePaths: {\n [packageName]: cargoTomlPath,\n },\n defaults: {\n releaseType: 'patch',\n },\n git: {\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n tag: parsedArgs.tag,\n changelog: parsedArgs.changelog,\n },\n }\n\n const versionManager = new VersionManager({ config: projectConfig, rootDir, projectType: 'rust' })\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 const currentVersion = versionManager.getPackageVersion(packageName)\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 selection = await selectVersionInteractive(projectConfig, packageName, currentVersion, rootDir)\n selectedType = selection.type\n customVersion = selection.customVersion\n }\n\n if (parsedArgs.dryRun) {\n const preview = await versionManager.previewUpdate(packageName, selectedType, {\n customVersion,\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n })\n renderPreview(preview)\n process.exit(0)\n }\n\n await versionManager.updateVersion(packageName, selectedType, {\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 })\n\n log.success(`版本更新完成`)\n process.exit(0)\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 publish: parsedArgs.publish,\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 publish: parsedArgs.publish,\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(` publish: ${config.defaults?.publish}`)\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 publish: parsedArgsWithDefaults.publish,\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 publish: parsedArgsWithDefaults.publish,\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 publish: parsedArgsWithDefaults.publish,\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 )\n }\n\n if (parsedArgsWithDefaults.publish && !parsedArgsWithDefaults.dryRun) {\n const publishErrors: Array<{ packageName: string, error: Error }> = []\n const publishPackages = Object.entries(packageVersionSelections)\n const publishTotal = publishPackages.length\n\n log.info(`\\n🚀 开始发布 ${publishTotal} 个包...\\n`)\n\n for (let i = 0; i < publishPackages.length; i++) {\n const [packageName, selection] = publishPackages[i]\n const publishCurrent = i + 1\n\n updateProgress(publishCurrent, publishTotal, 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 publish: true,\n })\n\n updateProgress(publishCurrent, publishTotal, packageName, 'success')\n }\n catch (error) {\n publishErrors.push({ packageName, error: error as Error })\n displayError(error as Error, { packageName, operation: '发布' })\n updateProgress(publishCurrent, publishTotal, packageName, 'failed')\n }\n }\n\n log.info('')\n\n if (publishErrors.length > 0) {\n log.error(`\\n❌ 发布完成,但有 ${publishErrors.length} 个包发布失败:`)\n publishErrors.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 publish: parsedArgsWithDefaults.publish,\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 publish: parsedArgsWithDefaults.publish,\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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"}
|