@zjex/git-workflow 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,169 +0,0 @@
1
- # 代码文档说明
2
-
3
- ## 已添加详细注释的文件
4
-
5
- ### ✅ src/commands/commit.ts
6
-
7
- **功能**: 交互式提交命令,支持 AI 自动生成和手动编写
8
-
9
- **注释内容**:
10
-
11
- - 模块级注释:说明 Conventional Commits 和 Gitmoji 规范
12
- - 函数注释:每个函数都有 JSDoc 注释
13
- - 步骤标记:用 `==========` 分隔不同的处理步骤
14
- - 行内注释:关键逻辑都有说明
15
-
16
- **关键函数**:
17
-
18
- - `commit()`: 主函数,处理整个提交流程
19
- - `buildManualCommitMessage()`: 手动构建 commit message
20
- - `parseGitStatus()`: 解析 git 状态
21
- - `formatFileStatus()`: 格式化文件状态显示
22
-
23
- ### ✅ src/index.ts
24
-
25
- **功能**: 主入口文件,CLI 应用初始化和命令注册
26
-
27
- **注释内容**:
28
-
29
- - 模块级注释:说明文件职责
30
- - 全局错误处理:Ctrl+C、未捕获异常、Promise 拒绝
31
- - 版本信息:构建时注入
32
- - 交互式主菜单:ASCII Logo 和命令选择
33
- - CLI 命令注册:所有命令的注册和配置
34
-
35
- ## 其他文件状态
36
-
37
- ### ✅ 无错误的文件(已通过 TypeScript 检查)
38
-
39
- - src/ai-service.ts
40
- - src/config.ts
41
- - src/utils.ts
42
- - src/update-notifier.ts
43
- - src/commands/branch.ts
44
- - src/commands/help.ts
45
- - src/commands/init.ts
46
- - src/commands/release.ts
47
- - src/commands/stash.ts
48
- - src/commands/tag.ts
49
- - src/commands/update.ts
50
-
51
- ## 代码质量改进
52
-
53
- ### 1. 类型安全
54
-
55
- - 所有函数都有明确的返回类型
56
- - 使用 TypeScript 的类型推导
57
- - 接口定义清晰(如 `FileStatus`)
58
-
59
- ### 2. 错误处理
60
-
61
- - 全局错误捕获
62
- - 优雅的 Ctrl+C 处理
63
- - 详细的错误提示信息
64
- - 提供手动执行命令
65
-
66
- ### 3. 用户体验
67
-
68
- - 提交前检查暂存文件
69
- - 清晰的步骤分隔
70
- - 彩色输出和 emoji
71
- - 交互式选择界面
72
-
73
- ### 4. 代码组织
74
-
75
- - 模块化设计
76
- - 单一职责原则
77
- - 清晰的函数命名
78
- - 详细的注释说明
79
-
80
- ## 关键改进点
81
-
82
- ### commit.ts
83
-
84
- 1. **修复了 `message` 变量未初始化问题**
85
-
86
- - 初始化为空字符串
87
- - 确保所有代码路径都会赋值
88
-
89
- 2. **添加提交前检查**
90
-
91
- - 再次验证是否有暂存文件
92
- - 避免空提交
93
-
94
- 3. **改进错误提示**
95
-
96
- - 显示完整错误信息
97
- - 提供手动执行命令
98
-
99
- 4. **修复 refactor 对齐问题**
100
- - 针对 ♻️ emoji 特殊处理
101
- - 动态调整间距
102
-
103
- ### index.ts
104
-
105
- 1. **完善错误处理**
106
-
107
- - 捕获所有类型的错误
108
- - 优雅退出
109
-
110
- 2. **添加模块说明**
111
- - 清晰的文件职责
112
- - 详细的功能说明
113
-
114
- ## 建议
115
-
116
- 如果需要给其他文件添加详细注释,可以按照以下优先级:
117
-
118
- 1. **高优先级**(核心业务逻辑):
119
-
120
- - src/ai-service.ts - AI commit 生成
121
- - src/config.ts - 配置管理
122
- - src/commands/tag.ts - Tag 管理
123
-
124
- 2. **中优先级**(常用功能):
125
-
126
- - src/commands/branch.ts - 分支管理
127
- - src/commands/stash.ts - Stash 管理
128
- - src/update-notifier.ts - 更新检查
129
-
130
- 3. **低优先级**(辅助功能):
131
- - src/utils.ts - 工具函数
132
- - src/commands/help.ts - 帮助信息
133
- - src/commands/init.ts - 初始化配置
134
-
135
- ## 注释规范
136
-
137
- ### JSDoc 注释格式
138
-
139
- ```typescript
140
- /**
141
- * 函数简短描述
142
- *
143
- * 详细说明(可选)
144
- *
145
- * @param paramName 参数说明
146
- * @returns 返回值说明
147
- */
148
- ```
149
-
150
- ### 行内注释
151
-
152
- ```typescript
153
- // 简短说明当前代码的作用
154
- const result = doSomething();
155
- ```
156
-
157
- ### 步骤标记
158
-
159
- ```typescript
160
- // ========== 步骤 1: 处理输入 ==========
161
- // ========== 步骤 2: 验证数据 ==========
162
- ```
163
-
164
- ## 总结
165
-
166
- ✅ 核心文件已添加详细注释
167
- ✅ 所有文件通过 TypeScript 检查
168
- ✅ 代码质量和可维护性显著提升
169
- ✅ 用户体验得到改善
package/TESTING.md DELETED
@@ -1,436 +0,0 @@
1
- # 测试体系说明
2
-
3
- ## 为什么需要测试?
4
-
5
- 在开发 CLI 工具时,测试能够:
6
-
7
- 1. **防止回归** - 确保新功能不会破坏现有功能
8
- 2. **提高信心** - 重构代码时更有底气
9
- 3. **文档作用** - 测试用例本身就是最好的使用示例
10
- 4. **快速反馈** - 比手动测试快得多
11
-
12
- ## 测试框架选择
13
-
14
- 我们选择 **Vitest** 的原因:
15
-
16
- - ✅ 快速 - 基于 Vite,启动和运行都很快
17
- - ✅ 兼容 Jest - API 与 Jest 几乎完全兼容
18
- - ✅ ESM 原生支持 - 无需额外配置
19
- - ✅ TypeScript 支持 - 开箱即用
20
- - ✅ UI 界面 - 提供可视化测试界面
21
- - ✅ 覆盖率报告 - 内置覆盖率工具
22
-
23
- ## 测试结构
24
-
25
- ```
26
- tests/
27
- ├── utils.test.ts # 工具函数测试
28
- ├── tag.test.ts # Tag 功能测试
29
- ├── commit.test.ts # Commit 功能测试
30
- └── README.md # 测试指南
31
- ```
32
-
33
- ## 当前测试覆盖
34
-
35
- ### Tag 功能 ✅
36
-
37
- - [x] 前缀提取(v, g, release-, 无前缀)
38
- - [x] Tag 分组逻辑
39
- - [x] 显示逻辑(最多 5 个)
40
- - [x] 列宽计算
41
- - [x] 省略号显示
42
-
43
- ### Commit 功能 ✅
44
-
45
- - [x] 提交类型定义
46
- - [x] 提交消息格式
47
- - [x] Refactor 对齐处理
48
- - [x] Emoji 使用
49
-
50
- ### Utils 功能 ✅
51
-
52
- - [x] 字符串操作
53
- - [x] 基本工具函数
54
-
55
- ## 运行测试
56
-
57
- ### 基本命令
58
-
59
- ```bash
60
- # 运行所有测试(单次)
61
- npm test
62
-
63
- # 监听模式(开发时使用)
64
- npm run test:watch
65
-
66
- # 可视化界面
67
- npm run test:ui
68
-
69
- # 生成覆盖率报告
70
- npm run test:coverage
71
- ```
72
-
73
- ### 运行特定测试
74
-
75
- ```bash
76
- # 只运行 tag 相关测试
77
- npx vitest tests/tag.test.ts
78
-
79
- # 只运行匹配的测试
80
- npx vitest -t "前缀提取"
81
-
82
- # 运行并查看详细输出
83
- npx vitest --reporter=verbose
84
- ```
85
-
86
- ## 编写测试
87
-
88
- ### 基本示例
89
-
90
- ```typescript
91
- import { describe, it, expect } from "vitest";
92
-
93
- describe("功能模块", () => {
94
- it("应该做某事", () => {
95
- const result = someFunction();
96
- expect(result).toBe(expectedValue);
97
- });
98
- });
99
- ```
100
-
101
- ### 测试分组
102
-
103
- ```typescript
104
- describe("Tag 功能", () => {
105
- describe("前缀提取", () => {
106
- it("应该提取 v 前缀", () => {
107
- // 测试代码
108
- });
109
-
110
- it("应该处理无前缀", () => {
111
- // 测试代码
112
- });
113
- });
114
-
115
- describe("Tag 分组", () => {
116
- it("应该按前缀分组", () => {
117
- // 测试代码
118
- });
119
- });
120
- });
121
- ```
122
-
123
- ### Mock 外部依赖
124
-
125
- ```typescript
126
- import { vi } from "vitest";
127
- import { execSync } from "child_process";
128
-
129
- // Mock 整个模块
130
- vi.mock("child_process");
131
-
132
- it("应该调用 git 命令", () => {
133
- const mockExecSync = vi.mocked(execSync);
134
- mockExecSync.mockReturnValue("v0.1.0\nv0.2.0");
135
-
136
- // 测试代码...
137
-
138
- expect(mockExecSync).toHaveBeenCalledWith("git tag -l");
139
- });
140
- ```
141
-
142
- ### 测试异步代码
143
-
144
- ```typescript
145
- it("应该异步获取数据", async () => {
146
- const result = await fetchData();
147
- expect(result).toBeDefined();
148
- });
149
- ```
150
-
151
- ## CI/CD 集成
152
-
153
- ### GitHub Actions
154
-
155
- 已配置 `.github/workflows/test.yml`:
156
-
157
- ```yaml
158
- name: Test
159
-
160
- on:
161
- push:
162
- branches: [main, dev]
163
- pull_request:
164
- branches: [main, dev]
165
-
166
- jobs:
167
- test:
168
- runs-on: ubuntu-latest
169
- strategy:
170
- matrix:
171
- node-version: [18.x, 20.x]
172
- steps:
173
- - uses: actions/checkout@v4
174
- - name: Setup Node.js
175
- uses: actions/setup-node@v4
176
- with:
177
- node-version: ${{ matrix.node-version }}
178
- - name: Install dependencies
179
- run: npm ci
180
- - name: Run tests
181
- run: npm test
182
- - name: Build
183
- run: npm run build
184
- ```
185
-
186
- ### Pre-commit Hook
187
-
188
- 已配置 `.husky/pre-commit`,每次提交前自动运行测试:
189
-
190
- ```bash
191
- #!/usr/bin/env sh
192
- . "$(dirname -- "$0")/_/husky.sh"
193
-
194
- # 运行测试
195
- npm test
196
- ```
197
-
198
- 如果测试失败,提交会被阻止。
199
-
200
- ## 测试最佳实践
201
-
202
- ### 1. 测试应该独立
203
-
204
- 每个测试不应该依赖其他测试的结果:
205
-
206
- ```typescript
207
- // ❌ 不好 - 依赖全局状态
208
- let result;
209
- it("测试 1", () => {
210
- result = doSomething();
211
- });
212
- it("测试 2", () => {
213
- expect(result).toBe(expected); // 依赖测试 1
214
- });
215
-
216
- // ✅ 好 - 每个测试独立
217
- it("测试 1", () => {
218
- const result = doSomething();
219
- expect(result).toBe(expected);
220
- });
221
- it("测试 2", () => {
222
- const result = doSomething();
223
- expect(result).toBe(expected);
224
- });
225
- ```
226
-
227
- ### 2. 使用描述性的测试名称
228
-
229
- ```typescript
230
- // ❌ 不好
231
- it("测试 1", () => {});
232
-
233
- // ✅ 好
234
- it("应该正确提取 v 前缀", () => {});
235
- it("无前缀时应该返回 (无前缀)", () => {});
236
- ```
237
-
238
- ### 3. 测试边界情况
239
-
240
- ```typescript
241
- describe("Tag 显示", () => {
242
- it("应该显示少于 5 个的所有 tag", () => {
243
- // 测试 1-4 个 tag
244
- });
245
-
246
- it("应该只显示最后 5 个 tag", () => {
247
- // 测试正好 5 个 tag
248
- });
249
-
250
- it("超过 5 个时应该显示省略号", () => {
251
- // 测试 6+ 个 tag
252
- });
253
-
254
- it("应该处理空数组", () => {
255
- // 测试 0 个 tag
256
- });
257
- });
258
- ```
259
-
260
- ### 4. 使用 beforeEach/afterEach
261
-
262
- ```typescript
263
- import { beforeEach, afterEach } from "vitest";
264
-
265
- describe("测试套件", () => {
266
- beforeEach(() => {
267
- // 每个测试前执行
268
- vi.clearAllMocks();
269
- });
270
-
271
- afterEach(() => {
272
- // 每个测试后执行
273
- vi.restoreAllMocks();
274
- });
275
-
276
- it("测试 1", () => {});
277
- it("测试 2", () => {});
278
- });
279
- ```
280
-
281
- ### 5. 测试覆盖率目标
282
-
283
- - **核心功能** - 100% 覆盖
284
- - **工具函数** - 90%+ 覆盖
285
- - **UI 交互** - 关键路径覆盖
286
-
287
- ## 添加新功能时的测试流程
288
-
289
- 1. **先写测试(TDD)**
290
-
291
- ```typescript
292
- // 1. 写测试
293
- it("应该支持新功能", () => {
294
- const result = newFeature();
295
- expect(result).toBe(expected);
296
- });
297
-
298
- // 2. 运行测试(应该失败)
299
- // npm test
300
-
301
- // 3. 实现功能
302
- function newFeature() {
303
- // 实现代码
304
- }
305
-
306
- // 4. 运行测试(应该通过)
307
- // npm test
308
- ```
309
-
310
- 2. **或先实现后测试**
311
-
312
- ```typescript
313
- // 1. 实现功能
314
- function newFeature() {
315
- // 实现代码
316
- }
317
-
318
- // 2. 写测试
319
- it("应该支持新功能", () => {
320
- const result = newFeature();
321
- expect(result).toBe(expected);
322
- });
323
-
324
- // 3. 运行测试
325
- // npm test
326
- ```
327
-
328
- 3. **提交前检查**
329
- ```bash
330
- # 运行所有测试
331
- npm test
332
- # 检查覆盖率
333
- npm run test:coverage
334
- # 构建验证
335
- npm run build
336
- ```
337
-
338
- ## 调试测试
339
-
340
- ### 使用 console.log
341
-
342
- ```typescript
343
- it("调试测试", () => {
344
- const result = someFunction();
345
- console.log("result:", result); // 会在测试输出中显示
346
- expect(result).toBe(expected);
347
- });
348
- ```
349
-
350
- ### 使用 test.only
351
-
352
- ```typescript
353
- // 只运行这一个测试
354
- it.only("调试这个测试", () => {
355
- // 测试代码
356
- });
357
- ```
358
-
359
- ### 使用 UI 界面
360
-
361
- ```bash
362
- npm run test:ui
363
- ```
364
-
365
- 在浏览器中查看测试结果,可以:
366
-
367
- - 查看测试树
368
- - 查看失败详情
369
- - 重新运行单个测试
370
- - 查看覆盖率
371
-
372
- ## 常见问题
373
-
374
- ### Q: 测试运行很慢怎么办?
375
-
376
- A: 使用监听模式,只运行改动的测试:
377
-
378
- ```bash
379
- npm run test:watch
380
- ```
381
-
382
- ### Q: 如何跳过某个测试?
383
-
384
- A: 使用 `it.skip`:
385
-
386
- ```typescript
387
- it.skip("暂时跳过这个测试", () => {
388
- // 测试代码
389
- });
390
- ```
391
-
392
- ### Q: 如何测试 CLI 交互?
393
-
394
- A: Mock inquirer 的 prompt:
395
-
396
- ```typescript
397
- import { vi } from "vitest";
398
- import { select } from "@inquirer/prompts";
399
-
400
- vi.mock("@inquirer/prompts");
401
-
402
- it("应该选择正确的选项", async () => {
403
- vi.mocked(select).mockResolvedValue("option1");
404
- // 测试代码
405
- });
406
- ```
407
-
408
- ### Q: 如何测试 git 命令?
409
-
410
- A: Mock child_process:
411
-
412
- ```typescript
413
- import { vi } from "vitest";
414
- import { execSync } from "child_process";
415
-
416
- vi.mock("child_process");
417
-
418
- it("应该执行 git 命令", () => {
419
- vi.mocked(execSync).mockReturnValue("success");
420
- // 测试代码
421
- });
422
- ```
423
-
424
- ## 未来计划
425
-
426
- - [ ] 增加集成测试
427
- - [ ] 增加 E2E 测试
428
- - [ ] 提高测试覆盖率到 90%+
429
- - [ ] 添加性能测试
430
- - [ ] 添加快照测试
431
-
432
- ## 参考资料
433
-
434
- - [Vitest 官方文档](https://vitest.dev/)
435
- - [Testing Best Practices](https://github.com/goldbergyoni/javascript-testing-best-practices)
436
- - [Jest Cheat Sheet](https://github.com/sapegin/jest-cheat-sheet)