my-code-style 1.7.2 → 1.8.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 +14 -0
- package/README.md +129 -70
- package/bin/init +3 -0
- package/package.json +1 -1
- package/src/commitlint/base.cjs +50 -4
- package/src/commitlint/scopes.cjs +6 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
## 变更日志
|
|
2
2
|
|
|
3
|
+
## [1.8.0](https://github.com/myvn/codeStyle/compare/v1.7.2...v1.8.0) (2026-09-20)
|
|
4
|
+
|
|
5
|
+
### ✨ Features | 新功能
|
|
6
|
+
|
|
7
|
+
- **commitlint:** cz 交互提示改中文,类型列表与 type-enum 对齐 ([2462c92](https://github.com/myvn/codeStyle/commit/2462c92ff85cee06e67ddcd039593fede2a217ff))
|
|
8
|
+
|
|
9
|
+
### 🐛 Bug Fixes | Bug 修复
|
|
10
|
+
|
|
11
|
+
- **publish:** provenance 核验改成两层,30 秒预算不再把成功的发布误判成失败 ([5b83f4e](https://github.com/myvn/codeStyle/commit/5b83f4e996fcbd1573813945a20a92b46e339396))
|
|
12
|
+
- **publish:** 增强 provenance 校验与日志自证,同步文档与发布流程 ([ba6db63](https://github.com/myvn/codeStyle/commit/ba6db63dce8144f53ad2be9c49278ff67b924518))
|
|
13
|
+
- **修复:** Merge branch 'arena/01a0b214-codestyle' ([7c024dc](https://github.com/myvn/codeStyle/commit/7c024dce1bc1ef9d7fc9ef03b74f936b87a4704a))
|
|
14
|
+
|
|
15
|
+
## [1.5.0](https://github.com/myvn/codeStyle/compare/v1.4.0...v1.5.0) (2026-09-18)
|
|
16
|
+
|
|
3
17
|
### [1.7.2](https://github.com/myvn/codeStyle/compare/v1.7.1...v1.7.2) (2026-09-20)
|
|
4
18
|
|
|
5
19
|
### 🐛 Bug Fixes | Bug 修复
|
package/README.md
CHANGED
|
@@ -6,6 +6,8 @@ Lint/Format/Git 配置工程化 npm 包。适用于 Vue 3 + TypeScript + uni-app
|
|
|
6
6
|
|
|
7
7
|
## 项目文档
|
|
8
8
|
|
|
9
|
+
> 随 npm 包发布的只有本 README 与 `CHANGELOG.md`;下面其余文档在仓库里(`docs/` 与 `TECHNICAL_DOC.md` 未列入 `files` 白名单),装包后在 `node_modules/my-code-style/README.md` 能看到的就是本文件。
|
|
10
|
+
|
|
9
11
|
- [HTML 项目技术全景](docs/project-overview.html):下载或克隆仓库后,用浏览器直接打开,查看项目结构、配置架构、接入流程与维护注意事项;支持离线阅读和打印。
|
|
10
12
|
- [Markdown 技术文档](TECHNICAL_DOC.md)
|
|
11
13
|
- [使用说明书](docs/manual.md):使用后的优点、带来的福利与解决的问题、完整使用步骤与常见问题 FAQ
|
|
@@ -46,6 +48,48 @@ init 脚本会自动检测技术栈类型(uni-app / Vue 3 / Node 基础库)
|
|
|
46
48
|
| 样式代码 | 基本无人检查 | stylelint 覆盖 SCSS/Less/Vue 内嵌样式 |
|
|
47
49
|
| 规则同步 | 每个项目各抄一份 | 升级一个依赖版本,全项目生效 |
|
|
48
50
|
|
|
51
|
+
### 用 `pnpm cz` 提交(交互式)
|
|
52
|
+
|
|
53
|
+
`czg` 由**暂存区驱动**——没有暂存文件会直接报 `No files added to staging!` 并退出,所以顺序是先 `git add` 再 `pnpm cz`:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
git add -A
|
|
57
|
+
pnpm cz # = czg;npm 项目:npm run cz
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
六步交互,**除类型外每一步都能直接回车跳过**:
|
|
61
|
+
|
|
62
|
+
| 步骤 | 界面 | 说明 |
|
|
63
|
+
| ---- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
64
|
+
| 1 | 选择类型 | 15 种(见下表),支持输入关键字过滤 |
|
|
65
|
+
| 2 | 选择 scope | 候选来自 `src/` 下的目录(自动转单数:`components` → `component`);默认值按**暂存文件**推断,改了 `src/api/` 默认就是 `api`;也可选「自定义」手填或「不填」 |
|
|
66
|
+
| 3 | 一句话描述 | 右侧 `[N more chars allowed]` 是还能写多少字符,已扣除 `类型(scope): ` 前缀——上限就是 commitlint 的 `header-max-length`(本配置 108) |
|
|
67
|
+
| 4 | 详细描述 | 可选,写多行时用管道符分隔 |
|
|
68
|
+
| 5 | BREAKING CHANGE | 可选 |
|
|
69
|
+
| 6 | 关联 ISSUE | 可选(如 `#31, #34`),最后预览并确认 Y/n |
|
|
70
|
+
|
|
71
|
+
| 类型 | 含义 | 类型 | 含义 |
|
|
72
|
+
| ---------- | ---------------------------------- | ---------- | ----------------------------- |
|
|
73
|
+
| `feat` | 新功能 | `build` | 影响构建系统或外部依赖的变更 |
|
|
74
|
+
| `fix` | 修复缺陷 | `ci` | CI 配置与脚本变更 |
|
|
75
|
+
| `docs` | 仅文档变更 | `chore` | 其他不涉及 src 与测试的杂项 |
|
|
76
|
+
| `style` | 不影响代码含义的格式调整 | `revert` | 回滚此前的提交 |
|
|
77
|
+
| `refactor` | 既非修复缺陷也非新增功能的代码调整 | `wip` | 开发中(临时提交) |
|
|
78
|
+
| `perf` | 性能优化 | `workflow` | 工作流改进 |
|
|
79
|
+
| `test` | 补测试或修正既有测试 | `types` | 类型定义文件变更 |
|
|
80
|
+
| | | `release` | 发布相关(版本号 / 变更日志) |
|
|
81
|
+
|
|
82
|
+
省键盘的写法:
|
|
83
|
+
|
|
84
|
+
| 写法 | 作用 |
|
|
85
|
+
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
86
|
+
| `pnpm cz :f` | 用预置别名直接提交:`f`=`docs: fix typos`、`r`=`docs: update README`、`s`=`style: update code format`、`b`=`build: bump dependencies`、`c`=`chore: update config` |
|
|
87
|
+
| `pnpm cz -r` | 重放上一条提交信息(改完文件再提交同样的说明) |
|
|
88
|
+
| `pnpm cz --help` | 其他模式:`emoji` / `break` / `ai` / `gpg` / `checkbox`(默认都不开启) |
|
|
89
|
+
| `git commit -m "feat(api): 说明"` | 不用交互也行,但**冒号后必须有空格**,否则报 `type may not be empty` + `subject may not be empty` |
|
|
90
|
+
|
|
91
|
+
提交时 `commit-msg` 钩子会用同一份 commitlint 配置复核:type 必须是上表 15 种之一、描述不能为空、标题 ≤ 108 字符;`Merge branch …` / `Revert …` 这类消息自动忽略。想换提示语言或措辞,见下方常见问题。
|
|
92
|
+
|
|
49
93
|
## 生成的文件
|
|
50
94
|
|
|
51
95
|
| 文件 | 说明 |
|
|
@@ -173,30 +217,32 @@ npx my-code-style-init [--dry-run] [--backup] [--version|-v] [--help|-h]
|
|
|
173
217
|
|
|
174
218
|
## 常见问题(使用中遇到的问题)
|
|
175
219
|
|
|
176
|
-
| 现象 | 原因
|
|
177
|
-
| -------------------------------------------------------------------- |
|
|
178
|
-
| 只装了 `my-code-style`,`pnpm lint` 报找不到 eslint | peerDependencies 全部是 optional,不会自动安装
|
|
179
|
-
| `pnpm prepare` 输出 `.git can't be found`,hooks 不生效 | husky 必须在 git 仓库内执行
|
|
180
|
-
| 安装依赖报 `ERR_PNPM_IGNORED_BUILDS`(如 `unrs-resolver`) | pnpm 10+ 默认拦截依赖的构建脚本
|
|
181
|
-
| `eslint` 声明 `>=8.0.0` 却生成了 Flat Config | 无上界范围 npm 实际会装 9,CLI 按 9 生成
|
|
182
|
-
| 重复 init 后,改过的 `.prettierrc.cjs` / hooks 被覆盖 | 除 ESLint 入口与已存在的 `.gitignore` 外,目标文件一律覆盖
|
|
183
|
-
| 自定义 `lint-staged` 分组消失 | `lint-staged` 为整体替换,避免残留失效分组
|
|
184
|
-
| 提交时 lint 报错、提交失败 | 修不了的错误(语法错误、非法 CSS 属性)会阻止提交
|
|
185
|
-
| 提交信息被拒(`type may not be empty` / `subject may not be empty`) | 提交信息需符合 conventional commits
|
|
186
|
-
|
|
|
187
|
-
| `pnpm
|
|
188
|
-
|
|
|
189
|
-
| `
|
|
220
|
+
| 现象 | 原因 | 处理 |
|
|
221
|
+
| -------------------------------------------------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
222
|
+
| 只装了 `my-code-style`,`pnpm lint` 报找不到 eslint | peerDependencies 全部是 optional,不会自动安装 | 按 CLI 结尾输出的清单装全,**别漏 `typescript`**(`@typescript-eslint/parser` / `typescript-eslint` 的必需 peer) |
|
|
223
|
+
| `pnpm prepare` 输出 `.git can't be found`,hooks 不生效 | husky 必须在 git 仓库内执行 | 先 `git init`、再 `pnpm prepare`;验证 `git config core.hooksPath` 输出 `.husky/_` |
|
|
224
|
+
| 安装依赖报 `ERR_PNPM_IGNORED_BUILDS`(如 `unrs-resolver`) | pnpm 10+ 默认拦截依赖的构建脚本 | 执行 `pnpm approve-builds` 后重新安装,不是初始化失败 |
|
|
225
|
+
| `eslint` 声明 `>=8.0.0` 却生成了 Flat Config | 无上界范围 npm 实际会装 9,CLI 按 9 生成 | 确定留在 8 就把范围收紧到 `<9`(如 `~8.57.0`)后重跑 init |
|
|
226
|
+
| 重复 init 后,改过的 `.prettierrc.cjs` / hooks 被覆盖 | 除 ESLint 入口与已存在的 `.gitignore` 外,目标文件一律覆盖 | 先用 `--dry-run` 看清单、用 `--backup` 留档(备份含 `package.json`,目录会自动写入 `.gitignore`) |
|
|
227
|
+
| 自定义 `lint-staged` 分组消失 | `lint-staged` 为整体替换,避免残留失效分组 | 从 `.my-code-style-backup/package.json` 恢复后手动合并 |
|
|
228
|
+
| 提交时 lint 报错、提交失败 | 修不了的错误(语法错误、非法 CSS 属性)会阻止提交 | 按提示修复;紧急情况可用 `git commit --no-verify`,但请在 **CI 用 `pnpm lint` 兜底** |
|
|
229
|
+
| 提交信息被拒(`type may not be empty` / `subject may not be empty`) | 提交信息需符合 conventional commits,`类型(范围): 描述` 的**冒号后必须有空格** | 先看冒号后面有没有空格(`fix:(修复)…` 会被判成 type 与 subject 双空);用 `pnpm cz` 交互式生成;header 上限 108 字符 |
|
|
230
|
+
| `pnpm cz` 报 `No files added to staging!` | czg 由暂存区驱动:没有暂存文件就不启动(`--all` / `-a` 也不绕过) | 先 `git add -A` 再 `pnpm cz`;scope 候选与默认值也是按暂存区推断的 |
|
|
231
|
+
| 想让 `pnpm cz` 的提示换成英文/自己的措辞 | 提示语来自 `prompt.messages`,本包默认中文 | 在项目的 `.commitlintrc.cjs` 里覆盖 `prompt.messages`(标题)与 `prompt.types`(类型描述);scope 列表里的「自定义 / 不填」对应 `customScopesAlias` / `emptyScopesAlias` |
|
|
232
|
+
| 老项目已有 `.eslintrc.*`,init 只读退出 | ESLint 版本与配置格式冲突时 CLI 拒绝写入 | 先确认/迁移版本,再重跑 init |
|
|
233
|
+
| `pnpm release` 之后如何发布 | `release` 只生成版本、CHANGELOG、提交与 tag | 另行执行 `npm publish` |
|
|
234
|
+
| 装完看到一片 `unmet peer` 警告,要不要管 | npm 遇到不满足的 peer 会直接 ERESOLVE 拒装,pnpm 只打印 WARN 就装完 | 先看警告来自谁:`unmet peer … from my-code-style` 说明版本声明没跟上,先升级本包;来自别的包(如 `postcss-html@1.8.1` 却要 `^2`)按提示对齐。重跑 `init` 会主动体检(范围精确到 minor,例如 `vue-eslint-parser 10.2.0` 不满足 `^10.3.0`)并打印对齐命令 |
|
|
235
|
+
| `stylelint` 该用 16 还是 17 | 两条线都支持:`stylelint ^16.24.0 \|\| ^17.0.0` | 16 线(`stylelint-config-recommended@17`)兼容面最广;17 线要 stylelint 17 + `config-recommended@18` + `recommended-scss@17` + `stylelint-order@7/8`,且 Node ≥ 22.12。两条线都有真实运行回归(集成套件跑 16 线,Stylelint 17 套件跑 17 线) |
|
|
190
236
|
|
|
191
237
|
完整 FAQ(含更多场景与解释)见 [docs/manual.md](docs/manual.md#五使用中遇到的问题faq)。
|
|
192
238
|
|
|
193
239
|
## 测试套件
|
|
194
240
|
|
|
195
241
|
```bash
|
|
196
|
-
npm run test:all # 全量运行
|
|
242
|
+
npm run test:all # 全量运行 175 项:用例明细 + 分类统计 + 最慢文件定位
|
|
197
243
|
npm run diagnose # 换机器后先跑它:进程 / git / 文件系统 / hooks 各占多少
|
|
198
244
|
npm run sweep # 给本机找最佳文件级并发(扫 integration 套件)
|
|
199
|
-
npm test # 只跑基础 CLI 与配置矩阵(
|
|
245
|
+
npm test # 只跑基础 CLI 与配置矩阵(81 项)
|
|
200
246
|
npm run test:integration:setup # 安装现代化隔离依赖运行环境
|
|
201
247
|
npm run test:integration # Flat Config、真实 Husky 及提交链路测试(59 项)
|
|
202
248
|
npm run test:legacy:setup # 安装 ESLint 8 隔离运行环境
|
|
@@ -211,64 +257,62 @@ npm run test:stylelint17 # Stylelint 17 生态兼容性回归(8 项)
|
|
|
211
257
|
```text
|
|
212
258
|
my-code-style 测试套件
|
|
213
259
|
|
|
214
|
-
▶ [1/4] 基础 CLI 与配置矩阵 (共
|
|
215
|
-
✓ 运行器 TAP 解析:统计通过与失败、SKIP 与每用例耗时 ·
|
|
216
|
-
✓ 运行器表格:CJK 宽度按两列计算,耗时格式化区分秒与毫秒 ·
|
|
217
|
-
✓
|
|
218
|
-
✓
|
|
260
|
+
▶ [1/4] 基础 CLI 与配置矩阵 (共 81 项,5 文件 · 3 文件并发(自动:2 核 / 内存 4G))
|
|
261
|
+
✓ 运行器 TAP 解析:统计通过与失败、SKIP 与每用例耗时 · 2ms
|
|
262
|
+
✓ 运行器表格:CJK 宽度按两列计算,耗时格式化区分秒与毫秒 · 1ms
|
|
263
|
+
✓ cz 交互提示为中文,且可选类型与 type-enum 一一对应 · 1ms
|
|
264
|
+
✓ 初始化结尾指引把 cz 用法说清楚(先 git add + 指到 README 手册) · 83ms
|
|
219
265
|
…
|
|
220
|
-
✓ 通过
|
|
266
|
+
✓ 通过 81 · 3.8s · 最慢文件 init-matrix.test.cjs 3.5s
|
|
221
267
|
|
|
222
268
|
▶ [2/4] 现代工具链与提交链 (共 59 项,23 文件 · 3 文件并发(自动:2 核 / 内存 4G))
|
|
223
|
-
✓ 完整提交链:JS/TS/Vue/nvue/CSS/less 自动修复及二次复检 ·
|
|
269
|
+
✓ 完整提交链:JS/TS/Vue/nvue/CSS/less 自动修复及二次复检 · 10.9s
|
|
224
270
|
✓ 发布防呆:HEAD 已有 v* tag 时拦截(此时 standard-version 会静默抬版并写出空 CHANGELOG) · 461ms
|
|
225
271
|
…
|
|
226
|
-
✓ 通过 59 ·
|
|
272
|
+
✓ 通过 59 · 41.6s · 最慢文件 commit-chain-scss.test.cjs 11.5s
|
|
227
273
|
|
|
228
274
|
▶ [3/4] ESLint 8 兼容性 (共 27 项,1 文件 · 3 文件并发(自动:2 核 / 内存 4G))
|
|
229
275
|
✓ 独立运行 ESLint 8 支持下限而非 ESLint 9 · 1ms
|
|
230
|
-
✓ ESLint 8 base:实际 CLI 加载生成配置并接受正常文件 · 1.
|
|
276
|
+
✓ ESLint 8 base:实际 CLI 加载生成配置并接受正常文件 · 1.7s
|
|
231
277
|
…
|
|
232
|
-
✓ 通过 27 ·
|
|
278
|
+
✓ 通过 27 · 20.5s
|
|
233
279
|
|
|
234
280
|
▶ [4/4] Stylelint 17 兼容性 (共 8 项,1 文件 · 3 文件并发(自动:2 核 / 内存 4G))
|
|
235
|
-
✓ stylelint 17
|
|
236
|
-
✓ stylelint 17
|
|
281
|
+
✓ 隔离环境装的是 stylelint 17(不是 16) · 2ms
|
|
282
|
+
✓ 生成的 .stylelintrc.cjs 在 stylelint 17 下可加载并放过正常 SCSS · 747ms
|
|
237
283
|
…
|
|
238
|
-
✓ 通过 8 ·
|
|
284
|
+
✓ 通过 8 · 7.5s
|
|
239
285
|
|
|
240
286
|
──────────────────────────────────────────────────────
|
|
241
287
|
套件 通过 失败 跳过 用时
|
|
242
288
|
──────────────────────────────────────────────────────
|
|
243
|
-
基础 CLI 与配置矩阵
|
|
244
|
-
现代工具链与提交链 59 0 -
|
|
245
|
-
ESLint 8 兼容性 27 0 -
|
|
246
|
-
Stylelint 17 兼容性 8 0 -
|
|
289
|
+
基础 CLI 与配置矩阵 81 0 - 3.8s
|
|
290
|
+
现代工具链与提交链 59 0 - 41.6s
|
|
291
|
+
ESLint 8 兼容性 27 0 - 20.5s
|
|
292
|
+
Stylelint 17 兼容性 8 0 - 7.5s
|
|
247
293
|
──────────────────────────────────────────────────────
|
|
248
|
-
合计
|
|
294
|
+
合计 175 0 - 73.5s
|
|
249
295
|
──────────────────────────────────────────────────────
|
|
250
296
|
|
|
251
|
-
⏱ 最慢文件:eslint8.test.cjs
|
|
297
|
+
⏱ 最慢文件:eslint8.test.cjs 20.5s · commit-chain-scss.test.cjs 11.5s · commit-chain-both.test.cjs 11.2s
|
|
252
298
|
|
|
253
|
-
✅ 全部通过:
|
|
299
|
+
✅ 全部通过:175/175 项,用时 73.5s
|
|
254
300
|
```
|
|
255
301
|
|
|
256
|
-
|
|
257
|
-
|
|
258
302
|
终端里每个套件下方还有一条实时进度条(`██████░░░░ 38/66 失败 0 4.0s`)。附加参数:
|
|
259
303
|
|
|
260
|
-
| 参数
|
|
261
|
-
|
|
|
262
|
-
| `-- --quiet`
|
|
263
|
-
| `-- --parallel`
|
|
264
|
-
| `-- --serial`
|
|
265
|
-
| `-- --jobs=2`
|
|
266
|
-
| `-- --suite=base,legacy` | 只跑指定套件(base / integration / legacy,逗号分隔)
|
|
267
|
-
| `-- --concurrency=4`
|
|
268
|
-
| `-- --verbose`
|
|
269
|
-
| `-- --profile`
|
|
270
|
-
| `-- --no-count`
|
|
271
|
-
| `-- --progress`
|
|
304
|
+
| 参数 | 作用 |
|
|
305
|
+
| ------------------------ | ---------------------------------------------------------- |
|
|
306
|
+
| `-- --quiet` | 只看套件结论与汇总表,不列用例明细(长输出时用) |
|
|
307
|
+
| `-- --parallel` | 强制四个套件同时跑(核数 ≥ 8 时默认已自动开启) |
|
|
308
|
+
| `-- --serial` | 强制串行(CI 形态,输出顺序最稳定) |
|
|
309
|
+
| `-- --jobs=2` | 配合并行限制同时运行的套件数,其余排队(面板显示"等待中") |
|
|
310
|
+
| `-- --suite=base,legacy` | 只跑指定套件(base / integration / legacy,逗号分隔) |
|
|
311
|
+
| `-- --concurrency=4` | 覆盖套件内文件级并发(默认按核数与内存自动算,封顶 8) |
|
|
312
|
+
| `-- --verbose` | 展开每个套件的原始 TAP 输出(排查单条用例) |
|
|
313
|
+
| `-- --profile` | 额外列出每个测试文件的耗时(定位集成套件瓶颈时用) |
|
|
314
|
+
| `-- --no-count` | 跳过预统计,进度条退化为"已完成 N 项" |
|
|
315
|
+
| `-- --progress` | 在非 TTY(CI 日志)中也强制刷新进度行 |
|
|
272
316
|
|
|
273
317
|
### 并行跑更快
|
|
274
318
|
|
|
@@ -299,17 +343,17 @@ npm run test:all -- --profile # 看每个测试文件耗时,定位瓶颈
|
|
|
299
343
|
决定,所以文件尽量拆到"一个文件一次提交"。每个套件跑完会直接告诉你最慢文件是谁,
|
|
300
344
|
汇总区再给一次全局 `⏱ 最慢文件`:
|
|
301
345
|
|
|
302
|
-
| integration 子文件(23 个)
|
|
303
|
-
|
|
|
304
|
-
| `commit-chain-{scss,less,both}`
|
|
305
|
-
| `empty-commit-guard`
|
|
306
|
-
| `git-mv-rm`
|
|
307
|
-
| `embedded-style-{vue,nvue,mixed-less}`
|
|
308
|
-
| `git-edge-{first-commit,stash}`
|
|
309
|
-
| `partial-staging{,-unstaged,-invalid-message,-conflict}` | 0.5–1.7s
|
|
310
|
-
| `error-recovery-{css,scss,less,js,ts,vue,nvue}`
|
|
311
|
-
| `lint`
|
|
312
|
-
| `release`
|
|
346
|
+
| integration 子文件(23 个) | 单文件耗时(2 核、串行) | 内容 |
|
|
347
|
+
| -------------------------------------------------------- | ------------------------ | --------------------------------------- |
|
|
348
|
+
| `commit-chain-{scss,less,both}` | 2.7–3.3s | 三种预处理器的完整提交链(各 1 次提交) |
|
|
349
|
+
| `empty-commit-guard` | 2.7s | 空提交守卫(重复暂存不得产生漂移提交) |
|
|
350
|
+
| `git-mv-rm` | 3.2s | `git mv` / `git rm` 走 lint-staged |
|
|
351
|
+
| `embedded-style-{vue,nvue,mixed-less}` | 1.9–2.0s | Vue/nvue 内嵌样式错误拦截 |
|
|
352
|
+
| `git-edge-{first-commit,stash}` | 2.1s / 1.7s | 首次提交、用户 stash 保留 |
|
|
353
|
+
| `partial-staging{,-unstaged,-invalid-message,-conflict}` | 0.5–1.7s | 部分暂存与冲突恢复 |
|
|
354
|
+
| `error-recovery-{css,scss,less,js,ts,vue,nvue}` | 0.5–1.4s | 不可修复错误的回滚 |
|
|
355
|
+
| `lint` | 3.9s | 32 条规则与格式化行为(无提交链) |
|
|
356
|
+
| `release` | 0.8s | standard-version |
|
|
313
357
|
|
|
314
358
|
两层并发都要控制规模,所以默认并发不交给 Node 猜,而是运行器自己算——**核数 × 1.5
|
|
315
359
|
(至少 核数 - 1),再乘内存上限,最后封顶 8**(16 核机器实测:4/6/8/12/16/24 并发对应
|
|
@@ -321,16 +365,16 @@ npm run test:all -- --profile # 看每个测试文件耗时,定位瓶颈
|
|
|
321
365
|
|
|
322
366
|
实测(2 核沙箱,沙箱内存 4G,所以自动并发是 3)——下表是引入 hook 优化那次的对照运行(当时 168 项):
|
|
323
367
|
|
|
324
|
-
| 运行方式
|
|
325
|
-
|
|
|
326
|
-
| 串行套件 + 文件级并发 1(CI 旧形态)
|
|
327
|
-
| 串行套件 + 自动并发 3(默认)
|
|
328
|
-
| `--parallel` 四套件 + 自动并发 3
|
|
329
|
-
| `node --test demo-test/integration/*.test.cjs`(Node 自己调度,等同旧命令) | 43.7s(只看集成套件那一段)
|
|
330
|
-
| `npm run test:integration`(运行器调度,自动并发 3)
|
|
331
|
-
| 串行套件 + 文件级并发 23(全部一波)
|
|
368
|
+
| 运行方式 | 墙钟时间 |
|
|
369
|
+
| --------------------------------------------------------------------------- | ------------------------------------------- |
|
|
370
|
+
| 串行套件 + 文件级并发 1(CI 旧形态) | 62.4s(hook 改造前同配置 70.3s) |
|
|
371
|
+
| 串行套件 + 自动并发 3(默认) | 47.2s(hook 改造前同配置 51.8s) |
|
|
372
|
+
| `--parallel` 四套件 + 自动并发 3 | 43.0s(hook 改造前同配置 46.6s) |
|
|
373
|
+
| `node --test demo-test/integration/*.test.cjs`(Node 自己调度,等同旧命令) | 43.7s(只看集成套件那一段) |
|
|
374
|
+
| `npm run test:integration`(运行器调度,自动并发 3) | 30.6s(只看集成套件那一段) |
|
|
375
|
+
| 串行套件 + 文件级并发 23(全部一波) | ✗ 3.8G 内存沙箱被 OOM 压垮(19 项 SIGKILL) |
|
|
332
376
|
|
|
333
|
-
同机复测(
|
|
377
|
+
同机复测(175 项,同一台 2 核沙箱连续跑;绝对秒数随机器负载波动,相对关系稳定):串行套件 + 文件级并发 1 = 85.1s、默认自动并发 3 = 73.5s、`--parallel` 四套件 = 63.8s、`npm run test:integration` = 40.7s、`node --test demo-test/integration/*.test.cjs` = 54.5s。
|
|
334
378
|
|
|
335
379
|
(2 核沙箱里并行收益被 CPU 争抢吃掉大半,`--concurrency=1` 时单个文件只要 0.7–4.2s;
|
|
336
380
|
16 核机器上集成套件那段 ≈ 最慢子文件,即"一次真实提交"的量级。)
|
|
@@ -361,6 +405,21 @@ npm run release:push
|
|
|
361
405
|
|
|
362
406
|
`.github/workflows/publish.yml` 只接受 **`v*` tag** 触发(`workflow_dispatch` 会先校验 ref,分支上手动触发直接失败),并且在测试全绿 + `npm pack --dry-run` 通过后才发布;发布步骤失败即失败,不做静默降级。
|
|
363
407
|
|
|
408
|
+
### 发布后的 provenance 自动核验(npm 页面上的绿勾)
|
|
409
|
+
|
|
410
|
+
绿勾 = 该版本带 provenance 证明。工作流用两层核验保证它不会悄悄消失:
|
|
411
|
+
|
|
412
|
+
1. **发布当场自证**(不等 registry):npm 真正生成 provenance 时必定打印
|
|
413
|
+
`Signed provenance statement with source and build information from GitHub Actions`,
|
|
414
|
+
工作流把这行当硬断言——没有就当场失败标红。1.7.1 正是漏了 `--provenance`,日志里没有这行、
|
|
415
|
+
流程却全绿,只有 npm 页面少一个勾。
|
|
416
|
+
2. **registry 侧回查**:轮询 `https://registry.npmjs.org/-/npm/v1/attestations/my-code-style@<version>`,
|
|
417
|
+
前 6 次每 10 秒、之后每 30 秒,共约 5.5 分钟。**这里的耐心是必需的**:1.7.2 的 attestation
|
|
418
|
+
在发布后约 2 分钟才可查(透明日志签名时间 06:47:57Z,而 publish 结束于 06:45:49Z),
|
|
419
|
+
30 秒的预算会把一次成功的发布误判成失败。
|
|
420
|
+
|
|
421
|
+
等待参数可用环境变量覆盖(`MAX_ATTEMPTS` / `FAST_ATTEMPTS` / `RETRY_FAST` / `RETRY_SLOW`),便于本地复现这套轮询逻辑。
|
|
422
|
+
|
|
364
423
|
### 发布凭据(推荐切到 Trusted Publishing)
|
|
365
424
|
|
|
366
425
|
工作流默认按 **npm Trusted Publishing(OIDC)→ `NPM_TOKEN`** 的顺序取凭据:`NPM_TOKEN` secret 存在时用 token,删掉后**无需改代码**自动改走 OIDC。切换步骤:
|
package/bin/init
CHANGED
|
@@ -1071,6 +1071,9 @@ function main() {
|
|
|
1071
1071
|
console.log(" 3. 使用 czg 提交 commit:")
|
|
1072
1072
|
}
|
|
1073
1073
|
console.log(` ${runScriptCommand(pm, "cz")}`)
|
|
1074
|
+
console.log(
|
|
1075
|
+
" (先 git add 暂存改动;交互步骤、类型与 scope 规则见本包 README《用 pnpm cz 提交》)",
|
|
1076
|
+
)
|
|
1074
1077
|
if (pm === "pnpm") {
|
|
1075
1078
|
console.log("")
|
|
1076
1079
|
console.log(" 提示:pnpm 10+ 默认拦截依赖的构建脚本,若安装时提示")
|
package/package.json
CHANGED
package/src/commitlint/base.cjs
CHANGED
|
@@ -38,10 +38,56 @@ module.exports = {
|
|
|
38
38
|
b: "build: bump dependencies",
|
|
39
39
|
c: "chore: update config",
|
|
40
40
|
},
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
// czg 的交互提示(cz-git 的 prompt.messages)。默认中文,因为本包其余输出都是中文;
|
|
42
|
+
// 想改回英文或换成自己的措辞,在你项目的 .commitlintrc.cjs 里覆盖 prompt.messages 即可。
|
|
43
|
+
messages: {
|
|
44
|
+
type: "选择你要提交的变更类型:",
|
|
45
|
+
scope: "选择一个 SCOPE(可选,回车跳过):",
|
|
46
|
+
customScope: "输入自定义 SCOPE:",
|
|
47
|
+
subject: "用一句话描述这次变更(祈使句):\n",
|
|
48
|
+
body: '补充详细描述(可选)。用 "|" 换行:\n',
|
|
49
|
+
markBreaking: '是否包含 BREAKING CHANGE(标题加 "!")(可选)?',
|
|
50
|
+
breaking: '列出 BREAKING CHANGE(可选)。用 "|" 换行:\n',
|
|
51
|
+
footerPrefixesSelect: "选择 ISSUES 类型(可选):",
|
|
52
|
+
customFooterPrefix: "输入 ISSUES 前缀:",
|
|
53
|
+
footer: "列出受影响的 ISSUE,例如 #31、#34:\n",
|
|
54
|
+
generatingByAI: "正在用 AI 生成描述…",
|
|
55
|
+
generatedSelectByAI: "从 AI 生成的描述里选一个:",
|
|
56
|
+
confirmCommit: "确认按上面的信息提交吗?",
|
|
57
|
+
},
|
|
58
|
+
// scope 列表里的两个特殊选项(默认是英文 custom / empty)
|
|
59
|
+
customScopesAlias: "自定义",
|
|
60
|
+
emptyScopesAlias: "不填",
|
|
61
|
+
// 与 rules.type-enum 一一对应:type-enum 有的这里都要能选到,反之亦然
|
|
62
|
+
// (此前 release 只写在 type-enum 里,czg 的选择列表里没有它;见回归测试)。
|
|
63
|
+
types: [
|
|
64
|
+
{ value: "feat", name: "feat: 新功能", emoji: ":sparkles:" },
|
|
65
|
+
{ value: "fix", name: "fix: 修复缺陷", emoji: ":bug:" },
|
|
66
|
+
{ value: "docs", name: "docs: 仅文档变更", emoji: ":memo:" },
|
|
67
|
+
{ value: "style", name: "style: 不影响代码含义的格式调整", emoji: ":lipstick:" },
|
|
68
|
+
{
|
|
69
|
+
value: "refactor",
|
|
70
|
+
name: "refactor: 既非修复缺陷也非新增功能的代码调整",
|
|
71
|
+
emoji: ":recycle:",
|
|
72
|
+
},
|
|
73
|
+
{ value: "perf", name: "perf: 性能优化", emoji: ":zap:" },
|
|
74
|
+
{ value: "test", name: "test: 补测试或修正既有测试", emoji: ":white_check_mark:" },
|
|
75
|
+
{
|
|
76
|
+
value: "build",
|
|
77
|
+
name: "build: 影响构建系统或外部依赖的变更",
|
|
78
|
+
emoji: ":package:",
|
|
79
|
+
},
|
|
80
|
+
{ value: "ci", name: "ci: CI 配置与脚本变更", emoji: ":ferris_wheel:" },
|
|
81
|
+
{ value: "chore", name: "chore: 其他不涉及 src 与测试的杂项", emoji: ":hammer:" },
|
|
82
|
+
{ value: "revert", name: "revert: 回滚此前的提交", emoji: ":rewind:" },
|
|
83
|
+
{ value: "wip", name: "wip: 开发中(临时提交)", emoji: ":construction:" },
|
|
84
|
+
{ value: "workflow", name: "workflow: 工作流改进", emoji: ":gear:" },
|
|
85
|
+
{ value: "types", name: "types: 类型定义文件变更", emoji: ":label:" },
|
|
86
|
+
{
|
|
87
|
+
value: "release",
|
|
88
|
+
name: "release: 发布相关(版本号 / 变更日志)",
|
|
89
|
+
emoji: ":bookmark:",
|
|
90
|
+
},
|
|
45
91
|
],
|
|
46
92
|
},
|
|
47
93
|
}
|
|
@@ -162,12 +162,16 @@ function getStagedFiles(cwd) {
|
|
|
162
162
|
const staged = []
|
|
163
163
|
for (let i = 0; i < parts.length; i++) {
|
|
164
164
|
const entry = parts[i]
|
|
165
|
-
if (!entry)
|
|
165
|
+
if (!entry) {
|
|
166
|
+
continue
|
|
167
|
+
}
|
|
166
168
|
const x = entry[0]
|
|
167
169
|
const isRenameOrCopy = x === "R" || x === "C"
|
|
168
170
|
const filePath = entry.slice(3)
|
|
169
171
|
if (x !== " " && x !== "?" && x !== "!") {
|
|
170
|
-
if (filePath)
|
|
172
|
+
if (filePath) {
|
|
173
|
+
staged.push(filePath)
|
|
174
|
+
}
|
|
171
175
|
}
|
|
172
176
|
if (isRenameOrCopy) {
|
|
173
177
|
i++
|