@mznjs/mbump 2.0.3 → 2.1.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 CHANGED
@@ -5,6 +5,30 @@
5
5
  格式遵循 [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
7
7
 
8
+ ## [2.1.0] - 2026-07-04
9
+
10
+ 🚀 新增功能
11
+
12
+ - feat(cli): 优化路径支持与命令行参数,新增更多路径格式和快捷参数 (README.md, index.ts, parser.ts)
13
+
14
+ ## [2.0.4] - 2026-07-04
15
+
16
+ 🚀 新增功能
17
+
18
+ - feat(cli): 新增--version/-V参数用于显示版本信息 (index.ts, parser.ts, index.ts)
19
+
20
+ ## [2.0.4-beta.1] - 2026-07-04
21
+
22
+ ♻️ 代码重构
23
+
24
+ - refactor(cli): 重构参数解析和配置加载逻辑 (index.ts)
25
+
26
+ ## [2.0.4-beta.0] - 2026-07-04
27
+
28
+ 🚀 新增功能
29
+
30
+ - feat(cli): 新增路径模式支持,允许直接指定项目目录更新版本 (README.md, index.ts, parser.ts, index.ts)
31
+
8
32
  ## [2.0.3] - 2026-07-04
9
33
 
10
34
  ♻️ 代码重构
package/README.md CHANGED
@@ -18,18 +18,45 @@
18
18
  - ✅ 智能配置加载(支持异步/同步)
19
19
  - ✅ 未提交更改检测与处理
20
20
  - ✅ 详细日志输出模式
21
+ - ✅ **零配置启动** - 无需配置文件即可使用
21
22
 
22
23
  ## 📦 安装
23
24
 
25
+ ### 全局安装(推荐)
26
+
27
+ 适合在多个项目中使用,一次安装,全局可用:
28
+
24
29
  ```bash
25
30
  npm install -g @mznjs/mbump
26
31
  # 或
27
32
  pnpm add -g @mznjs/mbump
28
33
  ```
29
34
 
35
+ **全局安装特性**:
36
+ - ✅ 所有依赖(包括 `tsx`)已移至 `dependencies`,确保全局安装后正常工作
37
+ - ✅ 支持 `.ts` 配置文件的自动编译
38
+ - ✅ 可在任意项目目录下使用
39
+
40
+ ### 本地安装
41
+
42
+ 适合在单个项目中使用,作为开发依赖:
43
+
44
+ ```bash
45
+ npm install @mznjs/mbump -D
46
+ # 或
47
+ pnpm add @mznjs/mbump -D
48
+ ```
49
+
50
+ **本地安装特性**:
51
+ - ✅ 项目级依赖,不影响全局环境
52
+ - ✅ 可在 `package.json` 的 `scripts` 中使用
53
+ - ✅ 推荐在 CI/CD 流程中使用
54
+
30
55
  ## 🚀 快速开始
31
56
 
32
- ### 单包项目
57
+ ### 单包项目(零配置)
58
+
59
+ 无需任何配置文件,mbump 会自动使用默认配置 `{ default: 'package.json' }`:
33
60
 
34
61
  ```bash
35
62
  # 升级补丁版本
@@ -45,9 +72,59 @@ mbump major
45
72
  mbump
46
73
  ```
47
74
 
75
+ **零配置行为**:
76
+ - ✅ 自动识别当前目录的 `package.json`
77
+ - ✅ 使用 `default` 作为包名
78
+ - ✅ 创建 Git Tag:`v{version}`(如 `v1.0.1`)
79
+ - ✅ 生成 CHANGELOG.md
80
+
81
+ ### 路径模式(直接指定项目目录)
82
+
83
+ 无需配置文件,直接指定项目目录路径,mbump 会自动查找该目录下的 `package.json`:
84
+
85
+ ```bash
86
+ # 更新指定目录下的 package.json(默认 patch)
87
+ mbump ./packages/my-pkg
88
+
89
+ # 指定版本类型
90
+ mbump ./packages/my-pkg patch
91
+ mbump ./packages/my-pkg minor
92
+ mbump ./packages/my-pkg major
93
+
94
+ # 使用上级目录
95
+ mbump ../other-project
96
+
97
+ # 使用绝对路径
98
+ mbump /path/to/project
99
+ mbump C:\projects\my-app
100
+ ```
101
+
102
+ **支持的路径格式**:
103
+
104
+ | 格式类型 | 示例 | 说明 |
105
+ |----------|------|------|
106
+ | Unix 相对路径 | `./packages/theme` | 以 `./` 开头 |
107
+ | Windows 相对路径 | `.\frontend` | 以 `.\` 开头 |
108
+ | 当前目录 | `.` | 单个点 |
109
+ | 上级目录 | `../other-project` | 以 `../` 或 `..\` 开头 |
110
+ | 简单目录名 | `frontend` | 直接使用目录名(会自动检测) |
111
+ | Unix 绝对路径 | `/usr/local/project` | 以 `/` 开头 |
112
+ | Windows 绝对路径 | `\Windows\System32` | 以 `\` 开头 |
113
+ | Windows 驱动器 | `C:\Projects\app` | 驱动器字母 + `:\` |
114
+ | 用户主目录 | `~/projects/my-app` | 以 `~` 开头 |
115
+ | UNC 网络路径 | `\\server\share\project` | 以 `\\` 开头 |
116
+
117
+ **路径模式特性**:
118
+ - ✅ 支持多种路径格式(相对路径、绝对路径、驱动器路径、UNC 路径等)
119
+ - ✅ 自动检测路径下是否存在 `package.json`
120
+ - ✅ 使用默认配置 `{ default: 'package.json' }`
121
+ - ✅ 支持所有命令行选项(`--dry-run`, `--verbose`, `--npm` 等)
122
+ - ✅ 适合快速更新独立的子包或临时项目
123
+ - ✅ 智能回退:如果包名在配置中找不到,会自动检查是否为有效目录路径
124
+
48
125
  ### Monorepo 项目
49
126
 
50
- 创建配置文件 `.mbump.config.json`:
127
+ 创建配置文件 `.mbump.config.json`(或其他支持的格式):
51
128
 
52
129
  ```json
53
130
  {
@@ -59,6 +136,11 @@ mbump
59
136
  }
60
137
  ```
61
138
 
139
+ **重要特性**:
140
+ - ✅ **默认包始终保留**:即使配置了 `packagePaths`,`default` 键(指向根目录 `package.json`)仍然会被保留
141
+ - ✅ **路径解析基准**:相对路径相对于配置文件所在目录解析,而非当前工作目录
142
+ - ✅ **统一路径处理**:配置中的路径在加载时会自动解析为绝对路径
143
+
62
144
  ```bash
63
145
  # 更新所有包(交互式选择每个包的版本)
64
146
  mbump all
@@ -66,6 +148,9 @@ mbump all
66
148
  # 更新指定包
67
149
  mbump components minor
68
150
 
151
+ # 更新根目录包
152
+ mbump default patch
153
+
69
154
  # 试运行模式(不实际执行)
70
155
  mbump components minor --dry-run
71
156
 
@@ -76,10 +161,11 @@ mbump components patch --npm
76
161
  ## 💻 命令行参数
77
162
 
78
163
  ```
79
- 用法: mbump [package] [type] [options]
164
+ 用法: mbump [package|path] [type] [options]
80
165
 
81
166
  参数:
82
167
  [package] 要更新的包名称或 "all" 更新所有包
168
+ [path] 项目目录路径(支持 ./path, ../path, /path, C:\path),自动查找该目录下的 package.json
83
169
  [type] 版本升级类型: major, minor, patch, pre-patch, pre-minor, pre-major
84
170
 
85
171
  选项:
@@ -88,8 +174,9 @@ mbump components patch --npm
88
174
  --no-commit, -n 禁用自动git提交
89
175
  --no-push, -p 禁用自动推送到远程仓库
90
176
  --allow-uncommitted, -u 允许在有未提交更改的情况下继续操作
91
- --npm 启用npm/pnpm包发布功能(默认不发布)
92
- --show-config 显示当前加载的完整配置信息
177
+ --npm, -N 启用npm/pnpm包发布功能(默认不发布)
178
+ --show-config, -c 显示当前加载的完整配置信息
179
+ --version, -V 显示当前版本号
93
180
  --help, -h 显示此帮助信息
94
181
 
95
182
  示例:
@@ -100,6 +187,17 @@ mbump components patch --npm
100
187
  mbump components patch --npm # 更新版本并发布到npm/pnpm
101
188
  mbump # 交互式选择包和版本类型
102
189
  mbump --show-config # 查看当前配置
190
+ mbump --version # 查看当前版本号
191
+
192
+ # 路径模式
193
+ mbump ./packages/my-pkg # 更新 ./packages/my-pkg 目录下的 package.json
194
+ mbump ./packages/my-pkg patch # 指定版本类型
195
+ mbump ../other-project minor # 更新上级目录的项目
196
+ mbump /path/to/project major # 使用绝对路径
197
+ mbump ./packages/my-pkg --dry-run # 试运行模式
198
+ mbump .\frontend\ # Windows 风格路径(PowerShell)
199
+ mbump frontend # 直接使用目录名(自动检测)
200
+ mbump ~/projects/my-app # 使用用户主目录路径
103
201
  ```
104
202
 
105
203
  ## ⚙️ 配置文件
@@ -286,7 +384,35 @@ export default () => ({
286
384
 
287
385
  | 选项 | 类型 | 默认值 | 说明 |
288
386
  |------|------|--------|------|
289
- | `packagePaths` | `Record<string, string>` | `{ default: 'package.json' }` | 包路径映射(必需) |
387
+ | `packagePaths` | `Record<string, string>` | `{ default: 'package.json' }` | 包路径映射,相对路径相对于配置文件所在目录解析 |
388
+
389
+ **packagePaths 配置说明**:
390
+
391
+ 1. **默认配置**:即使不配置 `packagePaths`,系统也会自动使用 `{ default: 'package.json' }`
392
+ 2. **默认包保留**:用户配置 `packagePaths` 时,`default` 键始终会被保留,指向根目录的 `package.json`
393
+ 3. **路径解析基准**:相对路径相对于配置文件所在目录解析,而非 `process.cwd()`
394
+ 4. **示例**:
395
+ ```typescript
396
+ // .mbump.config.ts(位于项目根目录)
397
+ export default {
398
+ packagePaths: {
399
+ theme: 'packages/theme/package.json', // 解析为 /project/packages/theme/package.json
400
+ web: 'packages/web/package.json', // 解析为 /project/packages/web/package.json
401
+ utils: 'plugins/utils/package.json', // 解析为 /project/plugins/utils/package.json
402
+ core: 'plugins/core/package.json', // 解析为 /project/plugins/core/package.json
403
+ },
404
+ } satisfies Config
405
+ ```
406
+ 最终合并后的配置会包含:
407
+ ```typescript
408
+ {
409
+ default: '/project/package.json', // 自动保留
410
+ theme: '/project/packages/theme/package.json',
411
+ web: '/project/packages/web/package.json',
412
+ utils: '/project/plugins/utils/package.json',
413
+ core: '/project/plugins/core/package.json',
414
+ }
415
+ ```
290
416
 
291
417
  #### defaults 选项
292
418
 
@@ -317,12 +443,12 @@ mbump 根据包的类型采用不同的 Tag 命名策略:
317
443
  - **Tag 格式**: `{tagPrefix}{version}`
318
444
  - **使用前缀**: 是(默认 `v`)
319
445
  - **识别条件**: 包名为 `default` 或包路径为 `package.json`(根目录)
320
- - **示例**:
446
+ - **示例**:
321
447
  ```bash
322
448
  mbump default patch
323
449
  # 假设 package.json 中 "name": "@my-org/monorepo"
324
450
  # → 创建 Tag: v1.0.1
325
-
451
+
326
452
  # 自定义前缀
327
453
  mbump default minor
328
454
  # 如果配置 git.tagPrefix = "release-"
@@ -332,7 +458,7 @@ mbump 根据包的类型采用不同的 Tag 命名策略:
332
458
  #### 子包 (所有非主项目包)
333
459
  - **Tag 格式**: `{package-name}@{version}`
334
460
  - **不使用前缀**: 直接使用 package.json 中的 `name` 字段
335
- - **适用场景**:
461
+ - **适用场景**:
336
462
  - 单独更新子包:`mbump components patch`
337
463
  - 批量更新所有包:`mbump all`
338
464
  - **示例**:
@@ -340,7 +466,7 @@ mbump 根据包的类型采用不同的 Tag 命名策略:
340
466
  mbump components patch
341
467
  # 假设 components/package.json 中 "name": "@my-org/components"
342
468
  # → 创建 Tag: @my-org/components@1.0.1
343
-
469
+
344
470
  mbump cli minor
345
471
  # 假设 cli/package.json 中 "name": "@my-org/cli"
346
472
  # → 创建 Tag: @my-org/cli@2.3.0
@@ -420,6 +546,15 @@ mbump components patch --changelog
420
546
 
421
547
  #### 单包项目
422
548
 
549
+ 无需配置文件,直接使用默认配置:
550
+
551
+ ```bash
552
+ # 直接使用,自动识别当前目录的 package.json
553
+ mbump patch
554
+ ```
555
+
556
+ 如果需要自定义配置:
557
+
423
558
  ```json
424
559
  {
425
560
  "packagePaths": {
@@ -768,6 +903,23 @@ mbump 提供了友好的错误提示信息,帮助用户快速理解和解决
768
903
  - 检查 `.mbump.config.js` 中的 `packagePaths` 配置
769
904
  - 确保包名与配置中的 key 一致
770
905
 
906
+ #### 8. 包路径不存在
907
+
908
+ **错误信息**:
909
+ ```
910
+ 配置错误:以下包路径指向的文件不存在
911
+ - components: "packages/components/package.json" -> 解析为 "/path/to/project/packages/components/package.json"(文件不存在)
912
+
913
+ 请检查配置文件中的 packagePaths 是否正确
914
+ ```
915
+
916
+ **原因**:配置文件中指定的 package.json 文件不存在
917
+
918
+ **解决方案**:
919
+ - 检查路径是否正确
920
+ - 确保文件已创建
921
+ - 相对路径是相对于配置文件所在目录解析的
922
+
771
923
  ### 调试模式
772
924
 
773
925
  如果遇到未知错误,可以使用 `DEBUG` 环境变量查看详细信息:
@@ -1047,7 +1199,6 @@ setInterval(() => {
1047
1199
  // CI/CD 环境中可以禁用缓存(每次都是全新环境)
1048
1200
  const manager = new VersionManager({
1049
1201
  rootDir,
1050
- // 未来可以添加配置选项
1051
1202
  })
1052
1203
  ```
1053
1204
 
@@ -1172,7 +1323,6 @@ pnpm test:watch
1172
1323
  beforeEach(() => {
1173
1324
  tempDir = join(os.tmpdir(), `mbump-test-${Date.now()}`)
1174
1325
  mkdirSync(tempDir, { recursive: true })
1175
- // 初始化 Git 仓库...
1176
1326
  })
1177
1327
 
1178
1328
  afterEach(() => {
@@ -1191,78 +1341,12 @@ afterEach(() => {
1191
1341
  #### 3. 真实场景
1192
1342
  使用真实的 Git 命令和文件系统操作:
1193
1343
  ```typescript
1194
- // 初始化 Git 仓库
1195
1344
  execSync('git init', { cwd: tempDir })
1196
1345
  execSync('git config user.email "test@example.com"', { cwd: tempDir })
1197
-
1198
- // 创建 commits
1199
1346
  execSync('git add . && git commit -m "feat: feature"', { cwd: tempDir })
1200
-
1201
- // 验证 Git Tag
1202
1347
  const tags = execSync('git tag', { cwd: tempDir, encoding: 'utf8' })
1203
1348
  ```
1204
1349
 
1205
- ### 测试示例
1206
-
1207
- #### 单包更新测试
1208
- ```typescript
1209
- it('应该成功更新单个包的版本号', async () => {
1210
- createPackageFile('test-package', '1.0.0')
1211
- createConfigFile({ default: 'package.json' })
1212
- createInitialCommit()
1213
-
1214
- const manager = new VersionManager({ rootDir: tempDir })
1215
- const result = await manager.updateVersion('default', 'minor', {
1216
- dryRun: false,
1217
- autoCommit: true,
1218
- npm: false,
1219
- changelog: false,
1220
- })
1221
-
1222
- expect(result.success).toBe(true)
1223
- expect(result.updatedPackages[0].newVersion).toBe('1.1.0')
1224
-
1225
- const pkgContent = JSON.parse(readFileSync(join(tempDir, 'package.json'), 'utf8'))
1226
- expect(pkgContent.version).toBe('1.1.0')
1227
- })
1228
- ```
1229
-
1230
- #### Git Tag 测试
1231
- ```typescript
1232
- it('应该在版本更新后创建 Git Tag', async () => {
1233
- createPackageFile('test-package', '1.0.0')
1234
- createConfigFile({ default: 'package.json' })
1235
- createInitialCommit()
1236
-
1237
- const manager = new VersionManager({ rootDir: tempDir })
1238
- await manager.updateVersion('default', 'minor', {
1239
- dryRun: false,
1240
- autoCommit: true,
1241
- npm: false,
1242
- changelog: false,
1243
- tag: true,
1244
- })
1245
-
1246
- const tags = execSync('git tag', { cwd: tempDir, encoding: 'utf8' }).trim().split('\n')
1247
- expect(tags).toContain('v1.1.0')
1248
- })
1249
- ```
1250
-
1251
- #### 缓存机制测试
1252
- ```typescript
1253
- it('应该预加载包信息到缓存', () => {
1254
- createPackageFile('test-package', '1.0.0')
1255
- createConfigFile({ default: 'package.json' })
1256
- createInitialCommit()
1257
-
1258
- const manager = new VersionManager({ rootDir: tempDir })
1259
- const stats = manager.getCacheStats()
1260
-
1261
- expect(stats.size).toBeGreaterThan(0)
1262
- expect(stats.packages).toContain(join(tempDir, 'package.json'))
1263
- })
1264
- ```
1265
-
1266
1350
  ### 持续集成
1267
1351
 
1268
1352
  测试已集成到 CI/CD 流程中,每次提交都会自动运行:
@@ -1290,155 +1374,6 @@ it('应该预加载包信息到缓存', () => {
1290
1374
  - **conventional**: 根据 commits 自动生成版本类型
1291
1375
  - **as-is**: 保持当前版本不变(仅更新 CHANGELOG)
1292
1376
 
1293
- ## 🧪 测试
1294
-
1295
- mbump 拥有完善的测试体系,包括单元测试和集成测试,确保代码质量和功能稳定性。
1296
-
1297
- ### 测试覆盖范围
1298
-
1299
- #### 单元测试 (Unit Tests)
1300
- - ✅ **版本计算**:验证 semver 版本递增逻辑
1301
- - ✅ **安全检查**:验证路径遍历防护、命令注入防护
1302
- - ✅ **工具函数**:验证各种辅助函数的正确性
1303
-
1304
- #### 集成测试 (Integration Tests)
1305
- - ✅ **单包版本更新**:验证单个包的版本号更新流程
1306
- - ✅ **批量版本更新**:验证多个包同时更新的场景
1307
- - ✅ **CHANGELOG 生成**:验证 CHANGELOG.md 文件的创建和内容
1308
- - ✅ **Git Tag 管理**:验证 Git 标签的创建、前缀配置等
1309
- - ✅ **Dry-run 模式**:验证试运行模式不修改文件
1310
- - ✅ **缓存机制**:验证配置缓存和包信息缓存
1311
- - ✅ **错误处理**:验证无效包名、版本冲突等异常场景
1312
-
1313
- ### 运行测试
1314
-
1315
- ```bash
1316
- # 运行所有测试
1317
- pnpm test
1318
-
1319
- # 运行特定测试文件
1320
- pnpm test tests/integration.test.ts
1321
-
1322
- # 监听模式(开发时使用)
1323
- pnpm test:watch
1324
- ```
1325
-
1326
- ### 测试统计
1327
-
1328
- | 测试类型 | 测试文件数 | 测试用例数 | 通过率 |
1329
- |---------|-----------|-----------|--------|
1330
- | 单元测试 | 2 | 12 | 100% ✅ |
1331
- | 集成测试 | 1 | 16 | 100% ✅ |
1332
- | **总计** | **3** | **28** | **100%** ✅ |
1333
-
1334
- ### 集成测试特点
1335
-
1336
- #### 1. 隔离环境
1337
- 每个测试在临时目录中执行,避免污染真实项目:
1338
- ```typescript
1339
- beforeEach(() => {
1340
- tempDir = join(os.tmpdir(), `mbump-test-${Date.now()}`)
1341
- mkdirSync(tempDir, { recursive: true })
1342
- // 初始化 Git 仓库...
1343
- })
1344
-
1345
- afterEach(() => {
1346
- rmSync(tempDir, { recursive: true, force: true })
1347
- })
1348
- ```
1349
-
1350
- #### 2. 完整工作流
1351
- 测试完整的版本更新流程:
1352
- - 创建临时 Git 仓库
1353
- - 创建 package.json 和配置文件
1354
- - 执行版本更新
1355
- - 验证结果(版本号、Git Tag、CHANGELOG)
1356
- - 清理临时文件
1357
-
1358
- #### 3. 真实场景
1359
- 使用真实的 Git 命令和文件系统操作:
1360
- ```typescript
1361
- // 初始化 Git 仓库
1362
- execSync('git init', { cwd: tempDir })
1363
- execSync('git config user.email "test@example.com"', { cwd: tempDir })
1364
-
1365
- // 创建 commits
1366
- execSync('git add . && git commit -m "feat: feature"', { cwd: tempDir })
1367
-
1368
- // 验证 Git Tag
1369
- const tags = execSync('git tag', { cwd: tempDir, encoding: 'utf8' })
1370
- ```
1371
-
1372
- ### 测试示例
1373
-
1374
- #### 单包更新测试
1375
- ```typescript
1376
- it('应该成功更新单个包的版本号', async () => {
1377
- createPackageFile('test-package', '1.0.0')
1378
- createConfigFile({ default: 'package.json' })
1379
- createInitialCommit()
1380
-
1381
- const manager = new VersionManager({ rootDir: tempDir })
1382
- const result = await manager.updateVersion('default', 'minor', {
1383
- dryRun: false,
1384
- autoCommit: true,
1385
- npm: false,
1386
- changelog: false,
1387
- })
1388
-
1389
- expect(result.success).toBe(true)
1390
- expect(result.updatedPackages[0].newVersion).toBe('1.1.0')
1391
-
1392
- const pkgContent = JSON.parse(readFileSync(join(tempDir, 'package.json'), 'utf8'))
1393
- expect(pkgContent.version).toBe('1.1.0')
1394
- })
1395
- ```
1396
-
1397
- #### Git Tag 测试
1398
- ```typescript
1399
- it('应该在版本更新后创建 Git Tag', async () => {
1400
- createPackageFile('test-package', '1.0.0')
1401
- createConfigFile({ default: 'package.json' })
1402
- createInitialCommit()
1403
-
1404
- const manager = new VersionManager({ rootDir: tempDir })
1405
- await manager.updateVersion('default', 'minor', {
1406
- dryRun: false,
1407
- autoCommit: true,
1408
- npm: false,
1409
- changelog: false,
1410
- tag: true,
1411
- })
1412
-
1413
- const tags = execSync('git tag', { cwd: tempDir, encoding: 'utf8' }).trim().split('\n')
1414
- expect(tags).toContain('v1.1.0')
1415
- })
1416
- ```
1417
-
1418
- #### 缓存机制测试
1419
- ```typescript
1420
- it('应该预加载包信息到缓存', () => {
1421
- createPackageFile('test-package', '1.0.0')
1422
- createConfigFile({ default: 'package.json' })
1423
- createInitialCommit()
1424
-
1425
- const manager = new VersionManager({ rootDir: tempDir })
1426
- const stats = manager.getCacheStats()
1427
-
1428
- expect(stats.size).toBeGreaterThan(0)
1429
- expect(stats.packages).toContain(join(tempDir, 'package.json'))
1430
- })
1431
- ```
1432
-
1433
- ### 持续集成
1434
-
1435
- 测试已集成到 CI/CD 流程中,每次提交都会自动运行:
1436
- - ✅ 代码构建
1437
- - ✅ 类型检查
1438
- - ✅ ESLint 检查
1439
- - ✅ 单元测试
1440
- - ✅ 集成测试
1441
-
1442
1377
  ## 🎯 使用场景
1443
1378
 
1444
1379
  ### 场景 1: 日常开发
@@ -1478,7 +1413,23 @@ mbump all patch
1478
1413
  mbump all minor --dry-run
1479
1414
  ```
1480
1415
 
1481
- ### 场景 4: CI/CD 自动化
1416
+ ### 场景 4: 路径模式(快速更新独立子包)
1417
+
1418
+ ```bash
1419
+ # 快速更新指定目录下的 package.json
1420
+ mbump ./packages/my-pkg
1421
+
1422
+ # 指定版本类型
1423
+ mbump ./packages/my-pkg minor
1424
+
1425
+ # 更新上级目录的项目
1426
+ mbump ../other-project
1427
+
1428
+ # 试运行模式
1429
+ mbump ./packages/my-pkg --dry-run
1430
+ ```
1431
+
1432
+ ### 场景 5: CI/CD 自动化
1482
1433
 
1483
1434
  ```bash
1484
1435
  # 在 CI 环境中自动发布
@@ -1509,10 +1460,11 @@ mbump --show-config
1509
1460
  配置文件: .mbump.config.mjs
1510
1461
 
1511
1462
  📦 包路径:
1512
- components: package.json
1513
- cli: packages/cli/package.json
1463
+ default: /path/to/project/package.json
1464
+ components: /path/to/project/packages/components/package.json
1465
+ cli: /path/to/project/packages/cli/package.json
1514
1466
 
1515
- ⚙️ 默认选项:
1467
+ ⚙️ 默认选项:
1516
1468
  releaseType: patch
1517
1469
  dryRun: false
1518
1470
  verbose: false
@@ -1699,17 +1651,20 @@ git push --tags
1699
1651
 
1700
1652
  1. **Git 要求**: 确保项目在 Git 仓库中,且已配置用户信息
1701
1653
  2. **未提交更改**: 默认情况下,存在未提交更改时会提示确认
1702
- 3. **配置文件**: 至少需要配置 `packagePaths`,其他选项可使用默认值
1703
- 4. **Node 版本**: 需要 Node.js >= 18.0.0
1704
- 5. **包管理器**: 默认使用 pnpm 发布,可在配置中修改为 npm 或 yarn
1705
- 6. **TypeScript 配置**: `.ts` 格式需要安装 `tsx` 依赖
1706
- 7. **ES Module**: `.mjs` 格式仅支持异步加载
1654
+ 3. **零配置支持**: 无需配置文件即可使用,系统自动使用默认配置 `{ default: 'package.json' }`
1655
+ 4. **路径模式**: 支持 `mbump ./path` 模式,自动查找指定目录下的 `package.json`,适合快速更新独立子包
1656
+ 5. **Node 版本**: 需要 Node.js >= 18.0.0
1657
+ 6. **包管理器**: 默认使用 pnpm 发布,可在配置中修改为 npm 或 yarn
1658
+ 7. **路径解析**: 相对路径相对于配置文件所在目录解析,而非当前工作目录
1659
+ 8. **默认包保留**: `default` 键始终指向根目录的 `package.json`,即使配置了其他包路径
1660
+ 9. **全局安装**: 支持 `npm install -g @mznjs/mbump`,所有依赖已移至 `dependencies` 确保全局安装后可用
1661
+ 10. **配置文件格式**: 支持 `.ts`/`.mjs`/`.js`/`.cjs`/`.json`/`.yaml`/`.yml`/`.toml` 多种格式
1662
+ 11. **配置文件优先级**: 按以下顺序查找:`.ts` → `.mjs` → `.js` → `.cjs` → `.json` → `.yaml` → `.yml` → `.toml` → `package.json`
1707
1663
 
1708
1664
  ## 📚 更多资源
1709
1665
 
1710
1666
  - [配置示例](./config-examples/) - 各种格式的配置文件示例
1711
1667
  - [CHANGELOG](./CHANGELOG.md) - 版本更新历史
1712
- - [GitHub Issues](https://github.com/mznjs/mbump/issues) - 问题反馈
1713
1668
 
1714
1669
  ## 🤝 贡献指南
1715
1670
 
@@ -1746,5 +1701,3 @@ MIT License
1746
1701
  ---
1747
1702
 
1748
1703
  **mbump** - 让版本管理更简单!🚀
1749
-
1750
- ```
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { VersionManager, loadConfigAsync, logger_default } from "./VersionManager-CwsuNWyP.js";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
- import { dirname, join } from "node:path";
4
+ import { dirname, join, resolve } from "node:path";
5
5
  import { execSync } from "node:child_process";
6
6
  import process from "node:process";
7
7
  import semver from "semver";
@@ -94,12 +94,17 @@ async function selectAllVersionsInteractive(config, rootDir) {
94
94
 
95
95
  //#endregion
96
96
  //#region src/cli/parser.ts
97
+ function isPathLike(arg) {
98
+ 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(".");
99
+ }
97
100
  function parseArgs(args, defaults = {}) {
98
101
  const parsed = {
99
102
  package: null,
103
+ projectPath: null,
100
104
  type: defaults.releaseType || defaults.type || "patch",
101
105
  dryRun: defaults.dryRun || false,
102
106
  help: false,
107
+ version: false,
103
108
  verbose: defaults.verbose || false,
104
109
  autoCommit: defaults.git?.autoCommit !== false,
105
110
  push: defaults.git?.push !== false,
@@ -136,12 +141,15 @@ function parseArgs(args, defaults = {}) {
136
141
  } else if (arg === "--allow-uncommitted" || arg === "-u") {
137
142
  parsed.allowUncommitted = true;
138
143
  i++;
139
- } else if (arg === "--npm" || arg === "-npm") {
144
+ } else if (arg === "--npm" || arg === "-N") {
140
145
  parsed.npm = true;
141
146
  i++;
142
- } else if (arg === "--show-config") {
147
+ } else if (arg === "--show-config" || arg === "-c") {
143
148
  parsed.showConfig = true;
144
149
  i++;
150
+ } else if (arg === "--version" || arg === "-V") {
151
+ parsed.version = true;
152
+ i++;
145
153
  } else if (arg === "--type" || arg === "-t") if (i + 1 < args.length) {
146
154
  const typeValue = args[i + 1];
147
155
  if (allowedTypes.includes(typeValue)) {
@@ -155,8 +163,10 @@ function parseArgs(args, defaults = {}) {
155
163
  else throw new Error(`不支持的版本类型: ${typeValue},支持的类型: ${allowedTypes.join(", ")}`);
156
164
  i++;
157
165
  } else if (!arg.startsWith("-")) {
158
- if (!parsed.package) parsed.package = arg;
166
+ if (!parsed.projectPath && !parsed.package) if (isPathLike(arg)) parsed.projectPath = arg;
167
+ else parsed.package = arg;
159
168
  else if (allowedTypes.includes(arg)) parsed.type = arg;
169
+ else if (!parsed.package && !isPathLike(arg)) parsed.package = arg;
160
170
  i++;
161
171
  } else i++;
162
172
  }
@@ -259,10 +269,11 @@ function showHelp() {
259
269
  ========================
260
270
  企业级版本管理工具,支持单包和monorepo场景
261
271
 
262
- 用法: mbump [package] [type] [options]
272
+ 用法: mbump [package|path] [type] [options]
263
273
 
264
274
  参数:
265
275
  [package] 要更新的包名称或 "all" 更新所有包
276
+ [path] 项目目录路径(支持 ./path, ../path, /path, C:\\path),自动查找该目录下的 package.json
266
277
  [type] 版本升级类型: major, minor, patch, pre-patch, pre-minor, pre-major
267
278
 
268
279
  选项:
@@ -271,8 +282,9 @@ function showHelp() {
271
282
  --no-commit, -n 禁用自动git提交
272
283
  --no-push, -p 禁用自动推送到远程仓库
273
284
  --allow-uncommitted, -u 允许在有未提交更改的情况下继续操作
274
- --npm, -npm 启用npm包发布功能(默认不发布)
275
- --show-config 显示当前加载的完整配置信息
285
+ --npm, -N 启用npm包发布功能(默认不发布)
286
+ --show-config, -c 显示当前加载的完整配置信息
287
+ --version, -V 显示版本信息
276
288
  --help, -h 显示此帮助信息
277
289
 
278
290
  示例:
@@ -281,6 +293,11 @@ function showHelp() {
281
293
  mbump plugins major --dry-run # 试运行升级plugins包主版本
282
294
  mbump core patch --no-push # 更新版本并提交到本地,但不推送到远程
283
295
  mbump components patch --npm # 更新版本并发布到npm
296
+
297
+ # 路径模式(直接指定项目目录)
298
+ mbump ./packages/my-pkg # 更新 ./packages/my-pkg 目录下的 package.json
299
+ mbump ./packages/my-pkg patch # 指定版本类型
300
+ mbump ../other-project minor # 更新上级目录的项目
284
301
  `;
285
302
  logger_default.info(helpText);
286
303
  }
@@ -302,13 +319,64 @@ async function main() {
302
319
  showHelp();
303
320
  process.exit(0);
304
321
  }
322
+ if (args.includes("--version") || args.includes("-V")) {
323
+ logger_default.info(`mbump v${packageVersion}`);
324
+ process.exit(0);
325
+ }
326
+ const parsedArgs = parseArgs(args);
327
+ if (parsedArgs.projectPath) {
328
+ const resolvedProjectPath = resolve(process.cwd(), parsedArgs.projectPath);
329
+ if (!existsSync(resolvedProjectPath)) throw new Error(`路径 "${parsedArgs.projectPath}" 不存在`);
330
+ const pkgJsonPath = join(resolvedProjectPath, "package.json");
331
+ if (!existsSync(pkgJsonPath)) throw new Error(`路径 "${parsedArgs.projectPath}" 中不存在 package.json`);
332
+ logger_default.info(`切换到项目路径: ${resolvedProjectPath}`);
333
+ const projectConfig = await loadConfigAsync(resolvedProjectPath);
334
+ parsedArgs.package = "default";
335
+ const projectVersionManager = new VersionManager({
336
+ config: projectConfig,
337
+ rootDir: resolvedProjectPath
338
+ });
339
+ logger_default.setLevel(parsedArgs.verbose ? "debug" : "info");
340
+ const pkgPath = projectConfig.packagePaths[parsedArgs.package];
341
+ const pkg = projectVersionManager.getPackageInfo(pkgPath);
342
+ const newVersion = semver.inc(pkg.version, parsedArgs.type);
343
+ if (!newVersion) {
344
+ displayError(new Error(`无法计算新版本,当前版本 "${pkg.version}",版本类型 "${parsedArgs.type}"`), { operation: "版本计算" });
345
+ process.exit(1);
346
+ }
347
+ const isDefaultPackage = parsedArgs.package === "default" || pkgPath === "package.json";
348
+ const tagPrefix = projectConfig.git?.tagPrefix || "v";
349
+ const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`;
350
+ if (parsedArgs.dryRun) {
351
+ logger_default.info("🔍 Dry-run 模式 - 以下操作将被执行:\n");
352
+ logger_default.info(` 📦 ${parsedArgs.package}`);
353
+ logger_default.info(` 当前版本: ${pkg.version}`);
354
+ logger_default.info(` 新版本: ${newVersion}`);
355
+ logger_default.info(` Tag: ${tagName}`);
356
+ logger_default.info(` CHANGELOG: ${projectConfig.git?.changelog !== false ? "是" : "否(配置禁用)"}`);
357
+ logger_default.info(` Git Commit: ${parsedArgs.autoCommit ? "是" : "否"}`);
358
+ logger_default.info(` Git Push: ${parsedArgs.push ? "是" : "否"}`);
359
+ logger_default.info(` NPM Publish: ${parsedArgs.npm ? "是" : "否"}`);
360
+ logger_default.info("\n✅ 以上为预览,未执行任何实际操作");
361
+ process.exit(0);
362
+ }
363
+ await projectVersionManager.updateVersion(parsedArgs.package, parsedArgs.type, {
364
+ dryRun: parsedArgs.dryRun,
365
+ verbose: parsedArgs.verbose,
366
+ autoCommit: parsedArgs.autoCommit,
367
+ push: parsedArgs.push,
368
+ npm: parsedArgs.npm
369
+ });
370
+ logger_default.success(`版本更新完成`);
371
+ process.exit(0);
372
+ }
305
373
  const rootDir = process.cwd();
306
374
  const config = await logger_default.withSpinner("正在加载配置...", () => loadConfigAsync(rootDir), {
307
375
  succeedText: "配置加载完成",
308
376
  failText: "配置加载失败"
309
377
  });
310
- const parsedArgs = parseArgs(args, config.defaults);
311
- if (parsedArgs.showConfig) {
378
+ const parsedArgsWithDefaults = parseArgs(args, config.defaults);
379
+ if (parsedArgsWithDefaults.showConfig) {
312
380
  logger_default.info("📋 当前加载的配置:");
313
381
  logger_default.info("");
314
382
  if (config.usedConfigPath) {
@@ -339,30 +407,87 @@ async function main() {
339
407
  process.exit(0);
340
408
  }
341
409
  const packageNames = Object.keys(config.packagePaths);
342
- if (!parsedArgs.package) if (packageNames.includes("default")) parsedArgs.package = "default";
343
- else if (packageNames.length === 1) parsedArgs.package = packageNames[0];
344
- else throw new Error(`未指定包名
345
- 请指定要更新的包名,可选包: ${packageNames.join(", ")} 或使用 "all" 更新所有包`);
346
- else if (parsedArgs.package !== "all" && !packageNames.includes(parsedArgs.package)) throw new Error(`包名 "${parsedArgs.package}" 未在配置中找到\n可用的包名: ${packageNames.join(", ")} 或使用 "all" 更新所有包`);
410
+ if (!parsedArgsWithDefaults.package) if (packageNames.includes("default")) parsedArgsWithDefaults.package = "default";
411
+ else if (packageNames.length === 1) parsedArgsWithDefaults.package = packageNames[0];
412
+ else {
413
+ displayError(new Error(`未指定包名\n可用的包名: ${packageNames.join(", ")} 或使用 "all" 更新所有包`));
414
+ process.exit(1);
415
+ }
416
+ else if (parsedArgsWithDefaults.package !== "all" && !packageNames.includes(parsedArgsWithDefaults.package)) {
417
+ const maybePath = parsedArgsWithDefaults.package;
418
+ if (maybePath) {
419
+ const resolvedPath = resolve(process.cwd(), maybePath);
420
+ const pkgJsonPath = join(resolvedPath, "package.json");
421
+ if (existsSync(resolvedPath) && existsSync(pkgJsonPath)) {
422
+ logger_default.info(`切换到项目路径: ${resolvedPath}`);
423
+ const projectConfig = await loadConfigAsync(resolvedPath);
424
+ const projectVersionManager = new VersionManager({
425
+ config: projectConfig,
426
+ rootDir: resolvedPath
427
+ });
428
+ logger_default.setLevel(parsedArgsWithDefaults.verbose ? "debug" : "info");
429
+ const pkgPath = projectConfig.packagePaths.default;
430
+ const pkg = projectVersionManager.getPackageInfo(pkgPath);
431
+ const newVersion = semver.inc(pkg.version, parsedArgsWithDefaults.type);
432
+ if (!newVersion) {
433
+ displayError(new Error(`无法计算新版本,当前版本 "${pkg.version}",版本类型 "${parsedArgsWithDefaults.type}"`), { operation: "版本计算" });
434
+ process.exit(1);
435
+ }
436
+ const tagPrefix = projectConfig.git?.tagPrefix || "v";
437
+ const tagName = `${tagPrefix}${newVersion}`;
438
+ if (parsedArgsWithDefaults.dryRun) {
439
+ logger_default.info("🔍 Dry-run 模式 - 以下操作将被执行:\n");
440
+ logger_default.info(` 📦 default`);
441
+ logger_default.info(` 当前版本: ${pkg.version}`);
442
+ logger_default.info(` 新版本: ${newVersion}`);
443
+ logger_default.info(` Tag: ${tagName}`);
444
+ logger_default.info(` CHANGELOG: ${projectConfig.git?.changelog !== false ? "是" : "否(配置禁用)"}`);
445
+ logger_default.info(` Git Commit: ${parsedArgsWithDefaults.autoCommit ? "是" : "否"}`);
446
+ logger_default.info(` Git Push: ${parsedArgsWithDefaults.push ? "是" : "否"}`);
447
+ logger_default.info(` NPM Publish: ${parsedArgsWithDefaults.npm ? "是" : "否"}`);
448
+ logger_default.info("\n✅ 以上为预览,未执行任何实际操作");
449
+ process.exit(0);
450
+ }
451
+ await projectVersionManager.updateVersion("default", parsedArgsWithDefaults.type, {
452
+ dryRun: parsedArgsWithDefaults.dryRun,
453
+ verbose: parsedArgsWithDefaults.verbose,
454
+ autoCommit: parsedArgsWithDefaults.autoCommit,
455
+ push: parsedArgsWithDefaults.push,
456
+ npm: parsedArgsWithDefaults.npm
457
+ });
458
+ logger_default.success(`版本更新完成`);
459
+ process.exit(0);
460
+ } else {
461
+ displayError(new Error(`包名 "${parsedArgsWithDefaults.package}" 未在配置中找到,且路径 "${resolvedPath}" 不是有效的项目目录`), { operation: "包名/路径解析" });
462
+ logger_default.info(`💡 可用的包名: ${packageNames.join(", ")} 或使用 "all" 更新所有包`);
463
+ logger_default.info(`💡 也可以使用路径模式: mbump ./packages/my-pkg`);
464
+ process.exit(1);
465
+ }
466
+ }
467
+ displayError(new Error(`包名 "${parsedArgsWithDefaults.package}" 未在配置中找到`), { operation: "包名解析" });
468
+ logger_default.info(`💡 可用的包名: ${packageNames.join(", ")} 或使用 "all" 更新所有包`);
469
+ logger_default.info(`💡 也可以使用路径模式: mbump ./packages/my-pkg`);
470
+ process.exit(1);
471
+ }
347
472
  const versionManager = new VersionManager({
348
473
  config,
349
474
  rootDir
350
475
  });
351
- logger_default.setLevel(parsedArgs.verbose ? "debug" : "info");
352
- if (hasUncommittedChanges()) if (!parsedArgs.allowUncommitted) {
476
+ logger_default.setLevel(parsedArgsWithDefaults.verbose ? "debug" : "info");
477
+ if (hasUncommittedChanges()) if (!parsedArgsWithDefaults.allowUncommitted) {
353
478
  logger_default.warn("警告: 检测到未提交的Git更改");
354
479
  const inquirer$1 = await import("inquirer");
355
480
  const answers = await inquirer$1.default.prompt([{
356
481
  type: "confirm",
357
482
  name: "continue",
358
- message: parsedArgs.dryRun ? "是否继续(dry-run模式不会实际提交更改)?" : "是否提交这些更改并继续?",
483
+ message: parsedArgsWithDefaults.dryRun ? "是否继续(dry-run模式不会实际提交更改)?" : "是否提交这些更改并继续?",
359
484
  default: true
360
485
  }]);
361
486
  if (!answers.continue) {
362
487
  logger_default.info("操作已取消");
363
488
  process.exit(0);
364
489
  }
365
- if (!parsedArgs.dryRun) {
490
+ if (!parsedArgsWithDefaults.dryRun) {
366
491
  const commitMessage = "chore: update mbump config and settings";
367
492
  execSync(`git add . && git commit -m "${commitMessage}"`, {
368
493
  encoding: "utf8",
@@ -371,21 +496,21 @@ async function main() {
371
496
  logger_default.success(`已提交更改: ${commitMessage}`);
372
497
  } else logger_default.info("dry-run模式: 跳过实际提交操作");
373
498
  } else logger_default.warn("警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。");
374
- if (parsedArgs.verbose) {
499
+ if (parsedArgsWithDefaults.verbose) {
375
500
  if (config.usedConfigPath) {
376
501
  const fileName = config.usedConfigPath.split("\\").pop() || config.usedConfigPath;
377
502
  logger_default.info(`使用配置文件: ${fileName}`);
378
503
  }
379
- logger_default.info(`更新信息: 包=${parsedArgs.package}, 类型=${parsedArgs.type}${parsedArgs.dryRun ? " (试运行)" : ""}`);
504
+ logger_default.info(`更新信息: 包=${parsedArgsWithDefaults.package}, 类型=${parsedArgsWithDefaults.type}${parsedArgsWithDefaults.dryRun ? " (试运行)" : ""}`);
380
505
  }
381
- let selectedType = parsedArgs.type;
506
+ let selectedType = parsedArgsWithDefaults.type;
382
507
  let customVersion = null;
383
508
  const packageVersionSelections = {};
384
- if (!args.some((arg) => arg === "--type" || arg.startsWith("--type=") || arg === "-t" || arg.startsWith("-t="))) if (parsedArgs.package === "all") {
509
+ if (!args.some((arg) => arg === "--type" || arg.startsWith("--type=") || arg === "-t" || arg.startsWith("-t="))) if (parsedArgsWithDefaults.package === "all") {
385
510
  const selections = await selectAllVersionsInteractive(config, rootDir);
386
511
  Object.assign(packageVersionSelections, selections);
387
512
  } else {
388
- const packageName = parsedArgs.package;
513
+ const packageName = parsedArgsWithDefaults.package;
389
514
  const currentVersion = versionManager.getPackageVersion(packageName);
390
515
  if (currentVersion) {
391
516
  const selection = await selectVersionInteractive(config, packageName, currentVersion);
@@ -393,8 +518,8 @@ async function main() {
393
518
  customVersion = selection.customVersion;
394
519
  }
395
520
  }
396
- if (parsedArgs.package === "all" && Object.keys(packageVersionSelections).length > 0) {
397
- if (parsedArgs.dryRun) {
521
+ if (parsedArgsWithDefaults.package === "all" && Object.keys(packageVersionSelections).length > 0) {
522
+ if (parsedArgsWithDefaults.dryRun) {
398
523
  logger_default.info("🔍 Dry-run 模式 - 以下操作将被执行:\n");
399
524
  for (const [packageName, selection] of Object.entries(packageVersionSelections)) {
400
525
  const pkgPath = config.packagePaths[packageName];
@@ -424,8 +549,8 @@ async function main() {
424
549
  updateProgress(current, total, packageName, "processing");
425
550
  try {
426
551
  const result = await versionManager.updateVersion(packageName, selection.type, {
427
- dryRun: parsedArgs.dryRun,
428
- verbose: parsedArgs.verbose,
552
+ dryRun: parsedArgsWithDefaults.dryRun,
553
+ verbose: parsedArgsWithDefaults.verbose,
429
554
  customVersion: selection.customVersion,
430
555
  autoCommit: false,
431
556
  push: false,
@@ -458,8 +583,8 @@ async function main() {
458
583
  });
459
584
  logger_default.info("\n💡 提示: 可以单独重试失败的包,或检查错误信息后重新运行");
460
585
  }
461
- if (!parsedArgs.dryRun && parsedArgs.autoCommit && updatedPackagesInfo.length > 0) await versionManager.gitCommitAndPush(parsedArgs.push, updatedPackagesInfo, config.git?.tag !== false, config.git?.tagPrefix || "v");
462
- if (parsedArgs.npm && !parsedArgs.dryRun) {
586
+ if (!parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.autoCommit && updatedPackagesInfo.length > 0) await versionManager.gitCommitAndPush(parsedArgsWithDefaults.push, updatedPackagesInfo, config.git?.tag !== false, config.git?.tagPrefix || "v");
587
+ if (parsedArgsWithDefaults.npm && !parsedArgsWithDefaults.dryRun) {
463
588
  const npmErrors = [];
464
589
  const npmPackages = Object.entries(packageVersionSelections);
465
590
  const npmTotal = npmPackages.length;
@@ -471,7 +596,7 @@ async function main() {
471
596
  try {
472
597
  await versionManager.updateVersion(packageName, selection.type, {
473
598
  dryRun: false,
474
- verbose: parsedArgs.verbose,
599
+ verbose: parsedArgsWithDefaults.verbose,
475
600
  customVersion: selection.customVersion,
476
601
  autoCommit: false,
477
602
  push: false,
@@ -499,35 +624,35 @@ async function main() {
499
624
  }
500
625
  }
501
626
  } else {
502
- if (parsedArgs.dryRun && parsedArgs.package) {
503
- const pkgPath = config.packagePaths[parsedArgs.package];
627
+ if (parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.package) {
628
+ const pkgPath = config.packagePaths[parsedArgsWithDefaults.package];
504
629
  const pkg = versionManager.getPackageInfo(pkgPath);
505
630
  const newVersion = customVersion || semver.inc(pkg.version, selectedType);
506
- const isDefaultPackage = parsedArgs.package === "default" || pkgPath === "package.json";
631
+ const isDefaultPackage = parsedArgsWithDefaults.package === "default" || pkgPath === "package.json";
507
632
  const tagPrefix = config.git?.tagPrefix || "v";
508
633
  const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`;
509
634
  logger_default.info("🔍 Dry-run 模式 - 以下操作将被执行:\n");
510
- logger_default.info(` 📦 ${parsedArgs.package}`);
635
+ logger_default.info(` 📦 ${parsedArgsWithDefaults.package}`);
511
636
  logger_default.info(` 当前版本: ${pkg.version}`);
512
637
  logger_default.info(` 新版本: ${newVersion}`);
513
638
  logger_default.info(` Tag: ${tagName}`);
514
639
  logger_default.info(` CHANGELOG: ${config.git?.changelog !== false ? "是" : "否(配置禁用)"}`);
515
- logger_default.info(` Git Commit: ${parsedArgs.autoCommit ? "是" : "否"}`);
516
- logger_default.info(` Git Push: ${parsedArgs.push ? "是" : "否"}`);
517
- logger_default.info(` NPM Publish: ${parsedArgs.npm ? "是" : "否"}`);
640
+ logger_default.info(` Git Commit: ${parsedArgsWithDefaults.autoCommit ? "是" : "否"}`);
641
+ logger_default.info(` Git Push: ${parsedArgsWithDefaults.push ? "是" : "否"}`);
642
+ logger_default.info(` NPM Publish: ${parsedArgsWithDefaults.npm ? "是" : "否"}`);
518
643
  logger_default.info("\n✅ 以上为预览,未执行任何实际操作");
519
644
  process.exit(0);
520
645
  }
521
- await versionManager.updateVersion(parsedArgs.package, selectedType, {
522
- dryRun: parsedArgs.dryRun,
523
- verbose: parsedArgs.verbose,
646
+ await versionManager.updateVersion(parsedArgsWithDefaults.package, selectedType, {
647
+ dryRun: parsedArgsWithDefaults.dryRun,
648
+ verbose: parsedArgsWithDefaults.verbose,
524
649
  customVersion,
525
- autoCommit: parsedArgs.autoCommit,
526
- push: parsedArgs.push,
527
- npm: parsedArgs.npm
650
+ autoCommit: parsedArgsWithDefaults.autoCommit,
651
+ push: parsedArgsWithDefaults.push,
652
+ npm: parsedArgsWithDefaults.npm
528
653
  });
529
654
  }
530
- logger_default.success(`版本更新完成${parsedArgs.dryRun ? " (试运行模式)" : ""}`);
655
+ logger_default.success(`版本更新完成${parsedArgsWithDefaults.dryRun ? " (试运行模式)" : ""}`);
531
656
  process.exit(0);
532
657
  } catch (error) {
533
658
  displayError(error);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","names":["config: Config","packageName: string","currentVersion: string","customVersion: string | null","input: string","rootDir: string","selections: PackageVersionSelections","args: string[]","defaults: DefaultsConfig","parsed: ParsedArgs","allowedTypes: ReleaseType[]","error: Error","context?: { packageName?: string, operation?: string }","current: number","total: number","width: number","packageName: string","status: 'processing' | 'success' | 'failed'","config: Config","inquirer","customVersion: string | null","packageVersionSelections: PackageVersionSelections","updatedPackagesInfo: Array<{ name: string, newVersion: string, pkgKey: string }>","errors: Array<{ packageName: string, error: Error }>","npmErrors: 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 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): Promise<{ type: ReleaseType, customVersion: string | null }> {\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: `[${packageName}] 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)\n selections[packageName] = selection\n }\n }\n\n return selections\n}\n","import type { DefaultsConfig, ParsedArgs, ReleaseType } from '@/types'\n\nexport function parseArgs(args: string[], defaults: DefaultsConfig = {}): ParsedArgs {\n const parsed: ParsedArgs = {\n package: null,\n type: (defaults.releaseType || defaults.type || 'patch') as ReleaseType,\n dryRun: defaults.dryRun || false,\n help: 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 }\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 === '-npm') {\n parsed.npm = true\n i++\n }\n else if (arg === '--show-config') {\n parsed.showConfig = 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.package) {\n parsed.package = arg\n }\n else if (allowedTypes.includes(arg as ReleaseType)) {\n parsed.type = arg as ReleaseType\n }\n i++\n }\n else {\n i++\n }\n }\n\n return parsed\n}\n","#!/usr/bin/env node\nimport type { Config, PackageVersionSelections } from '@/types'\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport semver from 'semver'\nimport { 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\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 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] [type] [options]\n\n参数:\n [package] 要更新的包名称或 \"all\" 更新所有包\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, -npm 启用npm包发布功能(默认不发布)\n --show-config 显示当前加载的完整配置信息\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 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 const rootDir = process.cwd()\n const config: Config = await log.withSpinner('正在加载配置...', () => loadConfigAsync(rootDir), {\n succeedText: '配置加载完成',\n failText: '配置加载失败',\n })\n\n const parsedArgs = parseArgs(args, config.defaults)\n\n if (parsedArgs.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 (!parsedArgs.package) {\n if (packageNames.includes('default')) {\n parsedArgs.package = 'default'\n }\n else if (packageNames.length === 1) {\n parsedArgs.package = packageNames[0]\n }\n else {\n throw new Error(\n '未指定包名\\n' + `请指定要更新的包名,可选包: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`,\n )\n }\n }\n else if (parsedArgs.package !== 'all' && !packageNames.includes(parsedArgs.package)) {\n throw new Error(\n `包名 \"${parsedArgs.package}\" 未在配置中找到\\n` + `可用的包名: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`,\n )\n }\n\n const versionManager = new VersionManager({ config, rootDir })\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 if (parsedArgs.verbose) {\n if (config.usedConfigPath) {\n const fileName = config.usedConfigPath.split('\\\\').pop() || config.usedConfigPath\n log.info(`使用配置文件: ${fileName}`)\n }\n log.info(`更新信息: 包=${parsedArgs.package}, 类型=${parsedArgs.type}${parsedArgs.dryRun ? ' (试运行)' : ''}`)\n }\n\n let selectedType = parsedArgs.type\n let customVersion: string | null = null\n const packageVersionSelections: PackageVersionSelections = {}\n\n if (\n !args.some(arg => arg === '--type' || arg.startsWith('--type=') || arg === '-t' || arg.startsWith('-t='))\n ) {\n if (parsedArgs.package === 'all') {\n const selections = await selectAllVersionsInteractive(config, rootDir)\n Object.assign(packageVersionSelections, selections)\n }\n else {\n const packageName = parsedArgs.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 (parsedArgs.package === 'all' && Object.keys(packageVersionSelections).length > 0) {\n // Dry-run 模式:显示详细预览\n if (parsedArgs.dryRun) {\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n\n for (const [packageName, selection] of Object.entries(packageVersionSelections)) {\n const pkgPath = config.packagePaths[packageName]\n const pkg = versionManager.getPackageInfo(pkgPath)\n // 使用 as any 绕过类型检查,因为我们的 ReleaseType 包含额外的选项\n const newVersion = selection.customVersion || semver.inc(pkg.version, selection.type as any)!\n\n // 判断是否为主项目包\n const isDefaultPackage = packageName === 'default' || pkgPath === 'package.json'\n const tagPrefix = config.git?.tagPrefix || 'v'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n log.info(` 📦 ${packageName}`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${isDefaultPackage && config.git?.changelog !== false ? '是' : '跳过(子包或配置禁用)'}`)\n log.info('')\n }\n\n log.info('✅ 以上为预览,未执行任何实际操作')\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: parsedArgs.dryRun,\n verbose: parsedArgs.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 (!parsedArgs.dryRun && parsedArgs.autoCommit && updatedPackagesInfo.length > 0) {\n await versionManager.gitCommitAndPush(\n parsedArgs.push,\n updatedPackagesInfo,\n config.git?.tag !== false,\n config.git?.tagPrefix || 'v',\n )\n }\n\n if (parsedArgs.npm && !parsedArgs.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: parsedArgs.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 // 单包更新的 dry-run 预览\n if (parsedArgs.dryRun && parsedArgs.package) {\n const pkgPath = config.packagePaths[parsedArgs.package]\n const pkg = versionManager.getPackageInfo(pkgPath)\n // 使用 as any 绕过类型检查\n const newVersion = customVersion || semver.inc(pkg.version, selectedType as any)!\n\n // 判断是否为主项目包\n const isDefaultPackage = parsedArgs.package === 'default' || pkgPath === 'package.json'\n const tagPrefix = config.git?.tagPrefix || 'v'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n log.info(` 📦 ${parsedArgs.package}`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${config.git?.changelog !== false ? '是' : '否(配置禁用)'}`)\n log.info(` Git Commit: ${parsedArgs.autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${parsedArgs.push ? '是' : '否'}`)\n log.info(` NPM Publish: ${parsedArgs.npm ? '是' : '否'}`)\n log.info('\\n✅ 以上为预览,未执行任何实际操作')\n process.exit(0)\n }\n\n await versionManager.updateVersion(parsedArgs.package!, selectedType, {\n dryRun: parsedArgs.dryRun,\n verbose: parsedArgs.verbose,\n customVersion,\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n npm: parsedArgs.npm,\n })\n }\n\n log.success(`版本更新完成${parsedArgs.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","customVersion: string | null","input: string","rootDir: string","selections: PackageVersionSelections","arg: string","args: string[]","defaults: DefaultsConfig","parsed: ParsedArgs","allowedTypes: ReleaseType[]","error: Error","context?: { packageName?: string, operation?: string }","current: number","total: number","width: number","packageName: string","status: 'processing' | 'success' | 'failed'","config: Config","inquirer","customVersion: string | null","packageVersionSelections: PackageVersionSelections","updatedPackagesInfo: Array<{ name: string, newVersion: string, pkgKey: string }>","errors: Array<{ packageName: string, error: Error }>","npmErrors: 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 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): Promise<{ type: ReleaseType, customVersion: string | null }> {\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: `[${packageName}] 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)\n selections[packageName] = selection\n }\n }\n\n return selections\n}\n","import type { DefaultsConfig, ParsedArgs, ReleaseType } from '@/types'\n\nfunction 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 parseArgs(args: string[], defaults: DefaultsConfig = {}): ParsedArgs {\n const parsed: ParsedArgs = {\n package: null,\n projectPath: null,\n type: (defaults.releaseType || defaults.type || 'patch') as ReleaseType,\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 }\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 === '--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 } 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 semver from 'semver'\nimport { 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\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 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 --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 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.projectPath) {\n const resolvedProjectPath = resolve(process.cwd(), parsedArgs.projectPath)\n if (!existsSync(resolvedProjectPath)) {\n throw new Error(`路径 \"${parsedArgs.projectPath}\" 不存在`)\n }\n const pkgJsonPath = join(resolvedProjectPath, 'package.json')\n if (!existsSync(pkgJsonPath)) {\n throw new Error(`路径 \"${parsedArgs.projectPath}\" 中不存在 package.json`)\n }\n\n log.info(`切换到项目路径: ${resolvedProjectPath}`)\n const projectConfig = await loadConfigAsync(resolvedProjectPath)\n\n parsedArgs.package = 'default'\n\n const projectVersionManager = new VersionManager({ config: projectConfig, rootDir: resolvedProjectPath })\n log.setLevel(parsedArgs.verbose ? 'debug' : 'info')\n\n const pkgPath = projectConfig.packagePaths[parsedArgs.package!]\n const pkg = projectVersionManager.getPackageInfo(pkgPath)\n const newVersion = semver.inc(pkg.version, parsedArgs.type as semver.ReleaseType)\n\n if (!newVersion) {\n displayError(new Error(`无法计算新版本,当前版本 \"${pkg.version}\",版本类型 \"${parsedArgs.type}\"`), {\n operation: '版本计算',\n })\n process.exit(1)\n }\n\n const isDefaultPackage = parsedArgs.package === 'default' || pkgPath === 'package.json'\n const tagPrefix = projectConfig.git?.tagPrefix || 'v'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n if (parsedArgs.dryRun) {\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n log.info(` 📦 ${parsedArgs.package}`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${projectConfig.git?.changelog !== false ? '是' : '否(配置禁用)'}`)\n log.info(` Git Commit: ${parsedArgs.autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${parsedArgs.push ? '是' : '否'}`)\n log.info(` NPM Publish: ${parsedArgs.npm ? '是' : '否'}`)\n log.info('\\n✅ 以上为预览,未执行任何实际操作')\n process.exit(0)\n }\n\n await projectVersionManager.updateVersion(parsedArgs.package!, parsedArgs.type, {\n dryRun: parsedArgs.dryRun,\n verbose: parsedArgs.verbose,\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n npm: parsedArgs.npm,\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 const projectConfig = await loadConfigAsync(resolvedPath)\n\n const projectVersionManager = new VersionManager({ config: projectConfig, rootDir: resolvedPath })\n log.setLevel(parsedArgsWithDefaults.verbose ? 'debug' : 'info')\n\n const pkgPath = projectConfig.packagePaths.default\n const pkg = projectVersionManager.getPackageInfo(pkgPath)\n const newVersion = semver.inc(pkg.version, parsedArgsWithDefaults.type as semver.ReleaseType)\n\n if (!newVersion) {\n displayError(new Error(`无法计算新版本,当前版本 \"${pkg.version}\",版本类型 \"${parsedArgsWithDefaults.type}\"`), {\n operation: '版本计算',\n })\n process.exit(1)\n }\n\n const tagPrefix = projectConfig.git?.tagPrefix || 'v'\n const tagName = `${tagPrefix}${newVersion}`\n\n if (parsedArgsWithDefaults.dryRun) {\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n log.info(` 📦 default`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${projectConfig.git?.changelog !== false ? '是' : '否(配置禁用)'}`)\n log.info(` Git Commit: ${parsedArgsWithDefaults.autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${parsedArgsWithDefaults.push ? '是' : '否'}`)\n log.info(` NPM Publish: ${parsedArgsWithDefaults.npm ? '是' : '否'}`)\n log.info('\\n✅ 以上为预览,未执行任何实际操作')\n process.exit(0)\n }\n\n await projectVersionManager.updateVersion('default', parsedArgsWithDefaults.type, {\n dryRun: parsedArgsWithDefaults.dryRun,\n verbose: parsedArgsWithDefaults.verbose,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\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 (\n !args.some(arg => arg === '--type' || arg.startsWith('--type=') || arg === '-t' || arg.startsWith('-t='))\n ) {\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 // Dry-run 模式:显示详细预览\n if (parsedArgsWithDefaults.dryRun) {\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n\n for (const [packageName, selection] of Object.entries(packageVersionSelections)) {\n const pkgPath = config.packagePaths[packageName]\n const pkg = versionManager.getPackageInfo(pkgPath)\n // 使用 as any 绕过类型检查,因为我们的 ReleaseType 包含额外的选项\n const newVersion = selection.customVersion || semver.inc(pkg.version, selection.type as any)!\n\n // 判断是否为主项目包\n const isDefaultPackage = packageName === 'default' || pkgPath === 'package.json'\n const tagPrefix = config.git?.tagPrefix || 'v'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n log.info(` 📦 ${packageName}`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${isDefaultPackage && config.git?.changelog !== false ? '是' : '跳过(子包或配置禁用)'}`)\n log.info('')\n }\n\n log.info('✅ 以上为预览,未执行任何实际操作')\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 // 单包更新的 dry-run 预览\n if (parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.package) {\n const pkgPath = config.packagePaths[parsedArgsWithDefaults.package]\n const pkg = versionManager.getPackageInfo(pkgPath)\n // 使用 as any 绕过类型检查\n const newVersion = customVersion || semver.inc(pkg.version, selectedType as any)!\n\n // 判断是否为主项目包\n const isDefaultPackage = parsedArgsWithDefaults.package === 'default' || pkgPath === 'package.json'\n const tagPrefix = config.git?.tagPrefix || 'v'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n log.info(` 📦 ${parsedArgsWithDefaults.package}`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${config.git?.changelog !== false ? '是' : '否(配置禁用)'}`)\n log.info(` Git Commit: ${parsedArgsWithDefaults.autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${parsedArgsWithDefaults.push ? '是' : '否'}`)\n log.info(` NPM Publish: ${parsedArgsWithDefaults.npm ? '是' : '否'}`)\n log.info('\\n✅ 以上为预览,未执行任何实际操作')\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
@@ -73,9 +73,11 @@ interface UpdateResult {
73
73
  }
74
74
  interface ParsedArgs {
75
75
  package: string | null;
76
+ projectPath: string | null;
76
77
  type: ReleaseType;
77
78
  dryRun: boolean;
78
79
  help: boolean;
80
+ version: boolean;
79
81
  verbose: boolean;
80
82
  autoCommit: boolean;
81
83
  push: boolean;
@@ -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/VersionManager.ts","../src/utils/logger.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/VersionManager.ts","../src/utils/logger.ts","../src/utils/security.ts","../src/utils/semver.ts","../src/index.ts"],"sourcesContent":null,"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mznjs/mbump",
3
- "version": "2.0.3",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "description": "企业级版本管理工具,支持单包和monorepo场景",
6
6
  "main": "dist/index.js",