dev-playbooks-cn 1.0.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.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +466 -0
  3. package/bin/devbooks.js +987 -0
  4. package/package.json +43 -0
  5. package/skills/Skills/344/275/277/347/224/250/350/257/264/346/230/216.md +446 -0
  6. package/skills/Skill/345/274/200/345/217/221/346/214/207/345/215/227.md +248 -0
  7. package/skills/_shared/context-detection-template.md +315 -0
  8. package/skills/_shared/mcp-enhancement-template.md +144 -0
  9. package/skills/_shared/references//351/200/232/347/224/250/345/256/210/351/227/250/345/215/217/350/256/256.md +114 -0
  10. package/skills/_template/config-discovery-template.md +126 -0
  11. package/skills/devbooks-brownfield-bootstrap/SKILL.md +167 -0
  12. package/skills/devbooks-brownfield-bootstrap/references//344/273/243/347/240/201/345/257/274/350/210/252/347/255/226/347/225/245.md +203 -0
  13. package/skills/devbooks-brownfield-bootstrap/references//345/255/230/351/207/217/351/241/271/347/233/256/345/210/235/345/247/213/345/214/226.md +96 -0
  14. package/skills/devbooks-brownfield-bootstrap/references//345/255/230/351/207/217/351/241/271/347/233/256/345/210/235/345/247/213/345/214/226/346/217/220/347/244/272/350/257/215.md +115 -0
  15. package/skills/devbooks-brownfield-bootstrap/references//346/234/257/350/257/255/350/241/250/346/250/241/346/235/277.md +42 -0
  16. package/skills/devbooks-brownfield-bootstrap/scripts/cod-update.sh +357 -0
  17. package/skills/devbooks-brownfield-bootstrap/templates/project-profile-template.md +172 -0
  18. package/skills/devbooks-c4-map/SKILL.md +151 -0
  19. package/skills/devbooks-c4-map/references/C4/346/236/266/346/236/204/345/234/260/345/233/276/346/217/220/347/244/272/350/257/215.md +33 -0
  20. package/skills/devbooks-c4-map/references//345/210/206/345/261/202/347/272/246/346/235/237/346/243/200/346/237/245/346/270/205/345/215/225.md +185 -0
  21. package/skills/devbooks-code-review/SKILL.md +175 -0
  22. package/skills/devbooks-code-review/references/PR/346/250/241/346/235/277/344/270/216/346/214/207/345/215/227.md +321 -0
  23. package/skills/devbooks-code-review/references//344/273/243/347/240/201/350/257/204/345/256/241/346/217/220/347/244/272/350/257/215.md +100 -0
  24. package/skills/devbooks-code-review/references//345/235/217/345/221/263/351/201/223/351/200/237/346/237/245/350/241/250.md +495 -0
  25. package/skills/devbooks-code-review/references//350/265/204/346/272/220/347/256/241/347/220/206/345/256/241/346/237/245/346/270/205/345/215/225.md +311 -0
  26. package/skills/devbooks-coder/SKILL.md +219 -0
  27. package/skills/devbooks-coder/references//344/273/243/347/240/201/345/256/236/347/216/260/346/217/220/347/244/272/350/257/215.md +70 -0
  28. package/skills/devbooks-coder/references//344/275/216/351/243/216/351/231/251/346/224/271/345/212/250/346/212/200/346/234/257.md +275 -0
  29. package/skills/devbooks-coder/references//346/227/245/345/277/227/350/247/204/350/214/203.md +329 -0
  30. package/skills/devbooks-coder/references//347/274/226/347/240/201/351/243/216/346/240/274/347/273/206/345/210/231.md +351 -0
  31. package/skills/devbooks-coder/references//351/224/231/350/257/257/347/240/201/350/247/204/350/214/203.md +463 -0
  32. package/skills/devbooks-delivery-workflow/SKILL.md +217 -0
  33. package/skills/devbooks-delivery-workflow/references//344/272/244/344/273/230/351/252/214/346/224/266/345/267/245/344/275/234/346/265/201.md +256 -0
  34. package/skills/devbooks-delivery-workflow/references//345/216/237/345/236/213-/347/224/237/344/272/247/345/217/214/350/275/250/346/250/241/345/274/217.md +168 -0
  35. package/skills/devbooks-delivery-workflow/references//345/217/230/346/233/264/351/252/214/350/257/201/344/270/216/350/277/275/346/272/257/346/250/241/346/235/277.md +133 -0
  36. package/skills/devbooks-delivery-workflow/scripts/ac-trace-check.sh +330 -0
  37. package/skills/devbooks-delivery-workflow/scripts/audit-scope.sh +262 -0
  38. package/skills/devbooks-delivery-workflow/scripts/change-check.sh +1040 -0
  39. package/skills/devbooks-delivery-workflow/scripts/change-codemod-scaffold.sh +135 -0
  40. package/skills/devbooks-delivery-workflow/scripts/change-evidence.sh +152 -0
  41. package/skills/devbooks-delivery-workflow/scripts/change-scaffold.sh +442 -0
  42. package/skills/devbooks-delivery-workflow/scripts/change-spec-delta-scaffold.sh +136 -0
  43. package/skills/devbooks-delivery-workflow/scripts/constitution-check.sh +237 -0
  44. package/skills/devbooks-delivery-workflow/scripts/env-match-check.sh +128 -0
  45. package/skills/devbooks-delivery-workflow/scripts/fitness-check.sh +387 -0
  46. package/skills/devbooks-delivery-workflow/scripts/guardrail-check.sh +519 -0
  47. package/skills/devbooks-delivery-workflow/scripts/handoff-check.sh +141 -0
  48. package/skills/devbooks-delivery-workflow/scripts/hygiene-check.sh +340 -0
  49. package/skills/devbooks-delivery-workflow/scripts/migrate-from-openspec.sh +385 -0
  50. package/skills/devbooks-delivery-workflow/scripts/migrate-to-v2-gates.sh +202 -0
  51. package/skills/devbooks-delivery-workflow/scripts/progress-dashboard.sh +319 -0
  52. package/skills/devbooks-delivery-workflow/scripts/prototype-promote.sh +341 -0
  53. package/skills/devbooks-delivery-workflow/scripts/spec-preview.sh +203 -0
  54. package/skills/devbooks-delivery-workflow/scripts/spec-promote.sh +118 -0
  55. package/skills/devbooks-delivery-workflow/scripts/spec-rollback.sh +124 -0
  56. package/skills/devbooks-delivery-workflow/scripts/spec-stage.sh +117 -0
  57. package/skills/devbooks-delivery-workflow/scripts/verify-all.sh +78 -0
  58. package/skills/devbooks-delivery-workflow/scripts/verify-npm-package.sh +123 -0
  59. package/skills/devbooks-delivery-workflow/scripts/verify-openspec-free.sh +81 -0
  60. package/skills/devbooks-delivery-workflow/scripts/verify-slash-commands.sh +146 -0
  61. package/skills/devbooks-delivery-workflow/templates/handoff.md +50 -0
  62. package/skills/devbooks-design-backport/SKILL.md +73 -0
  63. package/skills/devbooks-design-backport/references//345/233/236/345/206/231/350/256/276/350/256/241/346/226/207/346/241/243/346/217/220/347/244/272/350/257/215.md +196 -0
  64. package/skills/devbooks-design-doc/SKILL.md +121 -0
  65. package/skills/devbooks-design-doc/references//345/276/256/346/234/215/345/212/241/350/256/276/350/256/241/346/270/205/345/215/225.md +149 -0
  66. package/skills/devbooks-design-doc/references//350/256/276/350/256/241/346/226/207/346/241/243/346/217/220/347/244/272/350/257/215.md +189 -0
  67. package/skills/devbooks-design-doc/references//351/232/220/347/247/201/345/220/210/350/247/204/346/243/200/346/237/245/346/270/205/345/215/225.md +240 -0
  68. package/skills/devbooks-entropy-monitor/SKILL.md +188 -0
  69. package/skills/devbooks-entropy-monitor/references//347/206/265/345/272/246/351/207/217/346/226/271/346/263/225/350/256/272.md +223 -0
  70. package/skills/devbooks-entropy-monitor/scripts/entropy-measure.sh +449 -0
  71. package/skills/devbooks-entropy-monitor/scripts/entropy-report.sh +303 -0
  72. package/skills/devbooks-entropy-monitor/templates/thresholds.json +99 -0
  73. package/skills/devbooks-federation/SKILL.md +264 -0
  74. package/skills/devbooks-federation/scripts/federation-check.sh +144 -0
  75. package/skills/devbooks-federation/templates/federation.yaml +89 -0
  76. package/skills/devbooks-impact-analysis/SKILL.md +135 -0
  77. package/skills/devbooks-impact-analysis/references//345/275/261/345/223/215/345/210/206/346/236/220/346/217/220/347/244/272/350/257/215.md +82 -0
  78. package/skills/devbooks-impact-analysis/scripts/graph-cache.sh +214 -0
  79. package/skills/devbooks-implementation-plan/SKILL.md +83 -0
  80. package/skills/devbooks-implementation-plan/references//347/274/226/347/240/201/350/256/241/345/210/222/346/217/220/347/244/272/350/257/215.md +99 -0
  81. package/skills/devbooks-index-bootstrap/SKILL.md +240 -0
  82. package/skills/devbooks-proposal-author/SKILL.md +83 -0
  83. package/skills/devbooks-proposal-author/references//346/217/220/346/241/210/346/222/260/345/206/231/346/217/220/347/244/272/350/257/215.md +66 -0
  84. package/skills/devbooks-proposal-challenger/SKILL.md +86 -0
  85. package/skills/devbooks-proposal-challenger/references//344/274/246/347/220/206/344/270/216/345/220/210/350/247/204/346/243/200/346/237/245/346/270/205/345/215/225.md +176 -0
  86. package/skills/devbooks-proposal-challenger/references//346/217/220/346/241/210/350/264/250/347/226/221/346/217/220/347/244/272/350/257/215.md +57 -0
  87. package/skills/devbooks-proposal-debate-workflow/SKILL.md +78 -0
  88. package/skills/devbooks-proposal-debate-workflow/references//346/217/220/346/241/210/345/257/271/350/276/251/345/267/245/344/275/234/346/265/201.md +24 -0
  89. package/skills/devbooks-proposal-debate-workflow/references//346/217/220/346/241/210/345/257/271/350/276/251/346/250/241/346/235/277.md +35 -0
  90. package/skills/devbooks-proposal-debate-workflow/scripts/proposal-debate-check.sh +102 -0
  91. package/skills/devbooks-proposal-judge/SKILL.md +78 -0
  92. package/skills/devbooks-proposal-judge/references//346/217/220/346/241/210/350/243/201/345/206/263/346/217/220/347/244/272/350/257/215.md +37 -0
  93. package/skills/devbooks-router/SKILL.md +346 -0
  94. package/skills/devbooks-spec-contract/SKILL.md +191 -0
  95. package/skills/devbooks-spec-contract/references/API/350/256/276/350/256/241/346/214/207/345/215/227.md +349 -0
  96. package/skills/devbooks-spec-contract/references//345/245/221/347/272/246/344/270/216/346/225/260/346/215/256/345/256/232/344/271/211/346/217/220/347/244/272/350/257/215.md +85 -0
  97. package/skills/devbooks-spec-contract/references//350/247/204/346/240/274/345/217/230/346/233/264/346/217/220/347/244/272/350/257/215.md +63 -0
  98. package/skills/devbooks-spec-contract/references//351/232/220/345/274/217/345/217/230/346/233/264/346/243/200/346/265/213/346/217/220/347/244/272/350/257/215.md +183 -0
  99. package/skills/devbooks-spec-contract/scripts/implicit-change-detect.sh +378 -0
  100. package/skills/devbooks-spec-gardener/SKILL.md +72 -0
  101. package/skills/devbooks-spec-gardener/references//350/247/204/346/240/274/345/233/255/344/270/201/346/217/220/347/244/272/350/257/215.md +41 -0
  102. package/skills/devbooks-test-owner/SKILL.md +172 -0
  103. package/skills/devbooks-test-owner/references//345/217/230/346/233/264/351/252/214/350/257/201/344/270/216/350/277/275/346/272/257/346/250/241/346/235/277.md +228 -0
  104. package/skills/devbooks-test-owner/references//345/274/202/346/255/245/347/263/273/347/273/237/346/265/213/350/257/225/347/255/226/347/225/245.md +316 -0
  105. package/skills/devbooks-test-owner/references//346/265/213/350/257/225/344/273/243/347/240/201/346/217/220/347/244/272/350/257/215.md +208 -0
  106. package/skills/devbooks-test-owner/references//346/265/213/350/257/225/345/210/206/345/261/202/347/255/226/347/225/245.md +281 -0
  107. package/skills/devbooks-test-owner/references//346/265/213/350/257/225/351/251/261/345/212/250.md +394 -0
  108. package/skills/devbooks-test-owner/references//350/247/243/344/276/235/350/265/226/346/212/200/346/234/257/351/200/237/346/237/245/350/241/250.md +432 -0
  109. package/skills/devbooks-test-reviewer/SKILL.md +189 -0
  110. package/templates/.devbooks/config.yaml +88 -0
  111. package/templates/claude-commands/devbooks/apply.md +38 -0
  112. package/templates/claude-commands/devbooks/archive.md +33 -0
  113. package/templates/claude-commands/devbooks/backport.md +19 -0
  114. package/templates/claude-commands/devbooks/bootstrap.md +19 -0
  115. package/templates/claude-commands/devbooks/c4.md +19 -0
  116. package/templates/claude-commands/devbooks/challenger.md +19 -0
  117. package/templates/claude-commands/devbooks/code.md +19 -0
  118. package/templates/claude-commands/devbooks/debate.md +19 -0
  119. package/templates/claude-commands/devbooks/delivery.md +19 -0
  120. package/templates/claude-commands/devbooks/design.md +19 -0
  121. package/templates/claude-commands/devbooks/entropy.md +19 -0
  122. package/templates/claude-commands/devbooks/federation.md +19 -0
  123. package/templates/claude-commands/devbooks/gardener.md +19 -0
  124. package/templates/claude-commands/devbooks/impact.md +19 -0
  125. package/templates/claude-commands/devbooks/index.md +19 -0
  126. package/templates/claude-commands/devbooks/judge.md +19 -0
  127. package/templates/claude-commands/devbooks/plan.md +19 -0
  128. package/templates/claude-commands/devbooks/proposal.md +19 -0
  129. package/templates/claude-commands/devbooks/quick.md +42 -0
  130. package/templates/claude-commands/devbooks/review.md +19 -0
  131. package/templates/claude-commands/devbooks/router.md +19 -0
  132. package/templates/claude-commands/devbooks/spec.md +19 -0
  133. package/templates/claude-commands/devbooks/test-review.md +19 -0
  134. package/templates/claude-commands/devbooks/test.md +19 -0
  135. package/templates/dev-playbooks/README.md +458 -0
  136. package/templates/dev-playbooks/changes/.gitkeep +1 -0
  137. package/templates/dev-playbooks/constitution.md +116 -0
  138. package/templates/dev-playbooks/project.md +96 -0
  139. package/templates/dev-playbooks/scripts/.gitkeep +1 -0
  140. package/templates/dev-playbooks/specs/_meta/anti-patterns/.gitkeep +2 -0
  141. package/templates/dev-playbooks/specs/_meta/glossary.md +47 -0
  142. package/templates/dev-playbooks/specs/_meta/project-profile.md +79 -0
  143. package/templates/dev-playbooks/specs/architecture/fitness-rules.md +95 -0
@@ -0,0 +1,351 @@
1
+ # 编码风格细则
2
+
3
+ 借鉴 VS Code 的 `guidelines/CODING_GUIDELINES.md`,本文档定义了代码风格的具体规范。
4
+
5
+ ---
6
+
7
+ ## 1) 命名规范
8
+
9
+ ### TypeScript/JavaScript
10
+
11
+ | 类型 | 规范 | 示例 |
12
+ |------|------|------|
13
+ | 类名 | PascalCase | `UserService`, `HttpClient` |
14
+ | 接口名 | PascalCase(无 I 前缀) | `User`, `Config` |
15
+ | 函数名 | camelCase | `getUserById`, `parseConfig` |
16
+ | 变量名 | camelCase | `userName`, `isActive` |
17
+ | 常量 | UPPER_SNAKE_CASE | `MAX_RETRY_COUNT`, `API_URL` |
18
+ | 私有成员 | 下划线前缀 | `_cache`, `_disposed` |
19
+ | 布尔变量 | is/has/can/should 前缀 | `isValid`, `hasPermission` |
20
+
21
+ ### 文件命名
22
+
23
+ | 类型 | 规范 | 示例 |
24
+ |------|------|------|
25
+ | 组件文件 | PascalCase | `UserProfile.tsx` |
26
+ | 工具文件 | camelCase | `stringUtils.ts` |
27
+ | 测试文件 | 源文件名 + `.test` | `userService.test.ts` |
28
+ | 类型文件 | 源文件名 + `.types` | `api.types.ts` |
29
+
30
+ ---
31
+
32
+ ## 2) 代码组织
33
+
34
+ ### 导入顺序
35
+
36
+ ```typescript
37
+ // 1. Node.js 内置模块
38
+ import * as fs from 'fs';
39
+ import * as path from 'path';
40
+
41
+ // 2. 第三方库(按字母排序)
42
+ import { Observable } from 'rxjs';
43
+ import * as vscode from 'vscode';
44
+
45
+ // 3. 内部模块(按层级排序:base → platform → 业务)
46
+ import { Disposable } from '@/base/common/lifecycle';
47
+ import { IConfigService } from '@/platform/config/common/config';
48
+
49
+ // 4. 相对导入(按距离排序:远 → 近)
50
+ import { UserModel } from '../models/user';
51
+ import { formatDate } from './utils';
52
+
53
+ // 5. 类型导入(单独分组)
54
+ import type { User, Config } from '../types';
55
+ ```
56
+
57
+ ### 导出顺序
58
+
59
+ ```typescript
60
+ // 1. 类型导出
61
+ export type { User, Config };
62
+ export interface IService { ... }
63
+
64
+ // 2. 常量导出
65
+ export const DEFAULT_CONFIG = { ... };
66
+
67
+ // 3. 函数导出
68
+ export function createUser() { ... }
69
+
70
+ // 4. 类导出
71
+ export class UserService { ... }
72
+
73
+ // 5. 默认导出(仅用于模块入口)
74
+ export default UserService;
75
+ ```
76
+
77
+ ---
78
+
79
+ ## 3) 函数规范
80
+
81
+ ### 函数长度
82
+
83
+ - **推荐**:≤ 30 行
84
+ - **警告**:30-50 行
85
+ - **禁止**:> 50 行(必须拆分)
86
+
87
+ ### 参数数量
88
+
89
+ - **推荐**:≤ 3 个
90
+ - **警告**:4-5 个
91
+ - **禁止**:> 5 个(使用对象参数)
92
+
93
+ ```typescript
94
+ // 违规:参数过多
95
+ function createUser(name: string, email: string, age: number,
96
+ role: string, department: string, manager: string) { ... }
97
+
98
+ // 正确:使用对象参数
99
+ interface CreateUserOptions {
100
+ name: string;
101
+ email: string;
102
+ age: number;
103
+ role: string;
104
+ department: string;
105
+ manager: string;
106
+ }
107
+
108
+ function createUser(options: CreateUserOptions) { ... }
109
+ ```
110
+
111
+ ### 返回值
112
+
113
+ ```typescript
114
+ // 违规:多处返回,难以追踪
115
+ function process(data: Data): Result {
116
+ if (!data) return null;
117
+ if (data.type === 'A') return processA(data);
118
+ if (data.type === 'B') return processB(data);
119
+ return processDefault(data);
120
+ }
121
+
122
+ // 正确:单一出口,清晰的控制流
123
+ function process(data: Data): Result {
124
+ let result: Result;
125
+
126
+ if (!data) {
127
+ result = null;
128
+ } else if (data.type === 'A') {
129
+ result = processA(data);
130
+ } else if (data.type === 'B') {
131
+ result = processB(data);
132
+ } else {
133
+ result = processDefault(data);
134
+ }
135
+
136
+ return result;
137
+ }
138
+ ```
139
+
140
+ ---
141
+
142
+ ## 4) 类型安全
143
+
144
+ ### 禁止的模式
145
+
146
+ ```typescript
147
+ // 禁止:any 类型
148
+ function process(data: any) { ... } // ❌
149
+
150
+ // 正确:使用 unknown 或具体类型
151
+ function process(data: unknown) { ... } // ✓
152
+ function process(data: Record<string, unknown>) { ... } // ✓
153
+
154
+ // 禁止:类型断言跳过检查
155
+ const user = {} as User; // ❌
156
+
157
+ // 正确:构造完整对象
158
+ const user: User = {
159
+ id: '1',
160
+ name: 'John',
161
+ email: 'john@example.com'
162
+ }; // ✓
163
+
164
+ // 禁止:非空断言
165
+ const name = user!.name; // ❌
166
+
167
+ // 正确:显式检查
168
+ const name = user?.name ?? 'default'; // ✓
169
+ ```
170
+
171
+ ### 推荐的模式
172
+
173
+ ```typescript
174
+ // 使用类型守卫
175
+ function isUser(obj: unknown): obj is User {
176
+ return typeof obj === 'object' && obj !== null && 'id' in obj;
177
+ }
178
+
179
+ // 使用 satisfies 运算符(TypeScript 4.9+)
180
+ const config = {
181
+ host: 'localhost',
182
+ port: 3000
183
+ } satisfies Config;
184
+
185
+ // 使用 const 断言
186
+ const ROLES = ['admin', 'user', 'guest'] as const;
187
+ type Role = typeof ROLES[number];
188
+ ```
189
+
190
+ ---
191
+
192
+ ## 5) 错误处理
193
+
194
+ ### 异常规范
195
+
196
+ ```typescript
197
+ // 禁止:吞掉异常
198
+ try {
199
+ await riskyOperation();
200
+ } catch (e) {
201
+ // 什么都不做 ❌
202
+ }
203
+
204
+ // 正确:记录并重新抛出或处理
205
+ try {
206
+ await riskyOperation();
207
+ } catch (e) {
208
+ logger.error('Operation failed', e);
209
+ throw new OperationError('Failed to complete operation', { cause: e });
210
+ }
211
+
212
+ // 正确:明确处理
213
+ try {
214
+ await riskyOperation();
215
+ } catch (e) {
216
+ if (e instanceof NetworkError) {
217
+ return fallbackValue;
218
+ }
219
+ throw e;
220
+ }
221
+ ```
222
+
223
+ ### 错误类定义
224
+
225
+ ```typescript
226
+ // 创建自定义错误类
227
+ class ApplicationError extends Error {
228
+ constructor(
229
+ message: string,
230
+ public readonly code: string,
231
+ public readonly details?: Record<string, unknown>
232
+ ) {
233
+ super(message);
234
+ this.name = this.constructor.name;
235
+ }
236
+ }
237
+
238
+ class ValidationError extends ApplicationError {
239
+ constructor(message: string, details?: Record<string, unknown>) {
240
+ super(message, 'VALIDATION_ERROR', details);
241
+ }
242
+ }
243
+ ```
244
+
245
+ ---
246
+
247
+ ## 6) 注释规范
248
+
249
+ ### 何时添加注释
250
+
251
+ | 场景 | 是否需要注释 |
252
+ |------|--------------|
253
+ | 代码"做什么"(what) | ❌ 代码自解释 |
254
+ | 代码"为什么"(why) | ✓ 需要注释 |
255
+ | 复杂算法 | ✓ 需要注释 |
256
+ | 临时解决方案 | ✓ 需要注释 + TODO |
257
+ | 公共 API | ✓ 需要 JSDoc |
258
+
259
+ ### JSDoc 格式
260
+
261
+ ```typescript
262
+ /**
263
+ * 根据用户 ID 获取用户信息
264
+ *
265
+ * @param id - 用户的唯一标识符
266
+ * @returns 用户对象,如果不存在则返回 undefined
267
+ * @throws {ValidationError} 当 id 格式无效时
268
+ *
269
+ * @example
270
+ * ```typescript
271
+ * const user = await getUserById('123');
272
+ * if (user) {
273
+ * console.log(user.name);
274
+ * }
275
+ * ```
276
+ */
277
+ async function getUserById(id: string): Promise<User | undefined> {
278
+ // ...
279
+ }
280
+ ```
281
+
282
+ ### TODO 格式
283
+
284
+ ```typescript
285
+ // TODO(#123): 优化查询性能,当前实现在大数据量时较慢
286
+ // FIXME(#456): 修复边界条件处理
287
+ // HACK: 临时解决方案,等待上游库修复后移除
288
+ // NOTE: 这里使用了非标准 API,需要在 Node 18+ 环境运行
289
+ ```
290
+
291
+ ---
292
+
293
+ ## 7) 异步代码
294
+
295
+ ### Promise vs async/await
296
+
297
+ ```typescript
298
+ // 推荐:使用 async/await
299
+ async function fetchUserData(id: string): Promise<UserData> {
300
+ const user = await getUser(id);
301
+ const profile = await getProfile(user.profileId);
302
+ return { user, profile };
303
+ }
304
+
305
+ // 并行执行
306
+ async function fetchAllData(ids: string[]): Promise<UserData[]> {
307
+ return Promise.all(ids.map(id => fetchUserData(id)));
308
+ }
309
+
310
+ // 避免:混用 then 和 await
311
+ async function badExample() {
312
+ const user = await getUser(id);
313
+ return getProfile(user.profileId).then(p => ({ user, profile: p })); // ❌
314
+ }
315
+ ```
316
+
317
+ ### 取消支持
318
+
319
+ ```typescript
320
+ // 使用 AbortController
321
+ async function fetchWithTimeout(
322
+ url: string,
323
+ timeoutMs: number
324
+ ): Promise<Response> {
325
+ const controller = new AbortController();
326
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
327
+
328
+ try {
329
+ return await fetch(url, { signal: controller.signal });
330
+ } finally {
331
+ clearTimeout(timeoutId);
332
+ }
333
+ }
334
+ ```
335
+
336
+ ---
337
+
338
+ ## 8) 检查清单
339
+
340
+ 代码提交前确认:
341
+
342
+ - [ ] 命名符合规范(PascalCase/camelCase)
343
+ - [ ] 导入顺序正确
344
+ - [ ] 函数长度 ≤ 30 行
345
+ - [ ] 参数数量 ≤ 3 个
346
+ - [ ] 无 `any` 类型
347
+ - [ ] 无 `@ts-ignore`
348
+ - [ ] 异常已正确处理
349
+ - [ ] 复杂逻辑有注释
350
+ - [ ] 公共 API 有 JSDoc
351
+ - [ ] TODO 关联 issue 编号