jsharness 1.11.0 → 1.12.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.
Files changed (40) hide show
  1. package/.harness/README.md +1 -1
  2. package/.harness/agents/agent-dispatcher.md +66 -349
  3. package/.harness/agents/gate-controller/contract.yaml +1 -1
  4. package/.harness/agents/gate-controller/prompt.md +1 -1
  5. package/.harness/agents/gate-controller.md +1 -1
  6. package/.harness/agents/project-manager/contract.yaml +1 -1
  7. package/.harness/agents/project-manager/prompt.md +4 -1
  8. package/.harness/agents/project-manager.md +1 -1
  9. package/.harness/agents/requirements-analyst/contract.yaml +1 -1
  10. package/.harness/agents/requirements-analyst/prompt.md +2 -1
  11. package/.harness/agents/requirements-analyst.md +1 -1
  12. package/.harness/agents/solution-designer/contract.yaml +1 -1
  13. package/.harness/agents/solution-designer/prompt.md +1 -1
  14. package/.harness/agents/solution-designer.md +1 -1
  15. package/.harness/commands/js/deliver.md +43 -0
  16. package/.harness/commands/js/explore.md +18 -5
  17. package/.harness/commands/js/propose.md +4 -4
  18. package/.harness/doc/originRequirements/origin-main/.gitkeep +0 -0
  19. package/.harness/doc/prd/.gitkeep +0 -0
  20. package/.harness/doc/prd/prd-main/.gitkeep +0 -0
  21. package/.harness/doc/prd/prd-main/README.md +33 -0
  22. package/.harness/doc/team-guidelines/pm-team.md +1 -1
  23. package/.harness/doc/ttspec/.gitkeep +0 -0
  24. package/.harness/doc/ttspec/README.md +3 -3
  25. package/.harness/rules/project/frontend-coding-basics.md +519 -0
  26. package/.harness/skills/design-context-reader/SKILL.md +80 -0
  27. package/.harness/skills/docker-build/SKILL.md +1 -1
  28. package/.harness/skills/jsspec-deliver/SKILL.md +134 -0
  29. package/.harness/skills/{openspec-explore → jsspec-explore}/SKILL.md +35 -13
  30. package/.harness/skills/{openspec-propose → jsspec-propose}/SKILL.md +31 -16
  31. package/.harness/skills/{openspec-skill-creator → jsspec-skill-creator}/SKILL.md +17 -17
  32. package/.harness/workflow/definition.yaml +4 -4
  33. package/.harness/workflow/validate.js +1 -1
  34. package/files/front-coding-rules.md +665 -0
  35. package/lib/index.mjs +70 -1
  36. package/package.json +1 -1
  37. package/.harness/commands/js/apply.md +0 -31
  38. package/.harness/commands/js/archive.md +0 -31
  39. package/.harness/skills/openspec-apply/SKILL.md +0 -90
  40. package/.harness/skills/openspec-archive/SKILL.md +0 -77
@@ -0,0 +1,665 @@
1
+ ---
2
+ description: 通用前端开发规范(CSS / JavaScript / TypeScript / 模块化),适用于所有前端项目;项目专属规范(技术栈版本、目录结构、组件约定等)请配合具体项目规则文件
3
+ alwaysApply: true
4
+ enabled: true
5
+ Source:
6
+ HarnessRule: rules/project/frontend-coding-basics.md
7
+ Relation: 本文件为公司原始规范归档,.harness/rules/project/frontend-coding-basics.md 为去重精简版(与 coding-standard.md 和 frontend-vue3.md 去重后)
8
+ ---
9
+
10
+ # 通用前端开发规范
11
+
12
+ > 版本:v1.0.0 | 适用范围:所有前端项目(HTML / CSS / JavaScript / TypeScript)
13
+ > 说明:本规范为通用约束,**项目专属约束**(技术栈选型、目录结构、Vue/React 组件命名、状态管理、构建工具等)请参考各项目对应的项目规则文件(如 `frontend-project-rules.md`),两者必须同时遵守。
14
+
15
+ ---
16
+
17
+ ## 一、CSS 编码规范
18
+
19
+ ### 1.1 BEM 命名规范
20
+
21
+ class 命名使用 BEM(Block、Element、Modifier),使用 `__` 与 `--` 连接:
22
+
23
+ ```css
24
+ .block {} /* 块 */
25
+ .block__element {} /* 元素 */
26
+ .block--modifier {} /* 修饰符 */
27
+ ```
28
+
29
+ **为什么使用 BEM?** CSS 引擎查找样式表按从右到左顺序匹配,BEM 可减少嵌套层级,提升性能。
30
+
31
+ ```css
32
+ /* ❌ 错误:深层嵌套 */
33
+ .main .content .title .name { color: #fff; }
34
+
35
+ /* ✅ 正确:BEM 扁平化 */
36
+ .main-title .name { color: #fff; }
37
+ ```
38
+
39
+ ### 1.2 样式属性顺序
40
+
41
+ 按照以下顺序书写属性:
42
+
43
+ 1. **布局位置**(position, top, right, z-index, display, float 等)
44
+ 2. **尺寸大小**(width, height, padding, margin)
45
+ 3. **文字系列**(font, line-height, letter-spacing, color, text-align 等)
46
+ 4. **视觉效果**(background, border 等)
47
+ 5. **其他**(animation, transform 等)
48
+
49
+ ```css
50
+ /* ❌ 错误 */
51
+ .header {
52
+ background: #CCC;
53
+ font-size: 20px;
54
+ height: 50px;
55
+ border: 1px solid #bbb;
56
+ position: absolute;
57
+ left: 0;
58
+ top: 0;
59
+ width: 100%;
60
+ }
61
+
62
+ /* ✅ 正确 */
63
+ .header {
64
+ position: absolute;
65
+ left: 0;
66
+ top: 0;
67
+ width: 100%;
68
+ height: 50px;
69
+ font-size: 20px;
70
+ color: #f94000;
71
+ background: #CCC;
72
+ border: 1px solid #bbb;
73
+ }
74
+ ```
75
+
76
+ ### 1.3 选择器规范
77
+
78
+ - 选择器嵌套层级不大于 **3 级**
79
+ - 避免使用 ID 选择器及全局标签选择器
80
+ - CSS 选择器中避免使用标签名
81
+ - 尽量不要使用 `@import`(与 `<link>` 相比速度较慢)
82
+
83
+ ```css
84
+ /* ❌ 错误 */
85
+ div { padding-bottom: 0px; margin: 0em; }
86
+ button { border: 1px solid #ccc; }
87
+
88
+ /* ✅ 正确 */
89
+ .header { padding-bottom: 0px; margin: 0em; }
90
+ .custom-form { margin: 20px; }
91
+ ```
92
+
93
+ ### 1.4 规则声明块样式规范
94
+
95
+ 1. 每条样式独占一行
96
+ 2. 列表属性用逗号分隔,逗号后必须跟空格
97
+ 3. 选择器与左大括号 `{` 之间必须加空格
98
+ 4. 属性名与冒号之间不允许包含空格,冒号与属性值之间必须包含空格
99
+ 5. 每条样式以分号 `;` 结尾
100
+ 6. 右大括号 `}` 独占一行
101
+ 7. 每个规则声明间用空行分隔
102
+
103
+ ### 1.5 数值与长度规范
104
+
105
+ ```css
106
+ /* ✅ 0-1 小数省略整数部分的 0 */
107
+ .panel { opacity: .8; }
108
+
109
+ /* ✅ 长度为 0 时省略单位 */
110
+ .list { padding: 0 5px; }
111
+
112
+ /* ✅ 颜色缩写 */
113
+ .header { color: #f40; } /* 非 #ff4400 */
114
+
115
+ /* ❌ 避免使用命名色值 */
116
+ .button--success { color: lightgreen; }
117
+ ```
118
+
119
+ ### 1.6 字体排版规范
120
+
121
+ - 字号应不小于 **12px**(Windows 平台中文显示限制)
122
+ - `font-weight` 使用数值方式(如 `700` 而非 `bold`)
123
+ - `line-height` 使用数值而非像素值(浏览器会基于 font-size 自动计算)
124
+
125
+ ```css
126
+ /* ❌ 错误 */
127
+ .title { font-weight: bold; }
128
+ .container { line-height: 15px; }
129
+
130
+ /* ✅ 正确 */
131
+ .title { font-weight: 700; }
132
+ .container { line-height: 1.5; }
133
+ ```
134
+
135
+ ### 1.7 其他 CSS 规范
136
+
137
+ - 除公共样式外,业务代码中尽量不使用 `!important`
138
+ - 建议 z-index 分层管理
139
+ - Media Query 不得单独编排,须与相关规则一起定义
140
+ - 变量集中配置在全局变量中,方便统一管理
141
+
142
+ ---
143
+
144
+ ## 二、JavaScript / TypeScript 规范
145
+
146
+ ### 2.1 命名约定
147
+
148
+ | 类型 | 规范 | 示例 |
149
+ |------|------|------|
150
+ | 普通 | camelCase | `userData`, `handleClick` |
151
+ | 事件处理函数 | `handle` 前缀 | `handleSubmit`, `handleDelete`, `handleSearch` |
152
+ | 布尔值 | `is`/`has`/`can` 前缀 | `isLoading`, `hasError`, `canEdit` |
153
+ | 常量 | UPPER_SNAKE_CASE | `MAX_COUNT`, `API_BASE_URL` |
154
+
155
+ ### 2.2 对象规范
156
+
157
+ #### 2.2.1 使用字面量值创建对象
158
+
159
+ ```javascript
160
+ // ❌ 错误
161
+ const obj = new Object()
162
+
163
+ // ✅ 正确
164
+ const obj = {}
165
+ ```
166
+
167
+ #### 2.2.2 对象属性简写
168
+
169
+ ```javascript
170
+ const job = 'FrontEnd'
171
+
172
+ // ❌ 错误
173
+ const item = { job: job }
174
+
175
+ // ✅ 正确
176
+ const item = { job }
177
+ ```
178
+
179
+ #### 2.2.3 对象拷贝 — 优先使用展开运算符
180
+
181
+ ```javascript
182
+ // ❌ 错误
183
+ const copy = Object.assign({}, original, { c: 3 })
184
+
185
+ // ✅ 正确
186
+ const copy = { ...original, c: 3 }
187
+ const { a, ...noA } = copy // noA => { b: 2, c: 3 }
188
+ ```
189
+
190
+ #### 2.2.4 非法标识符引号
191
+
192
+ 只对非法标识符的属性使用引号:
193
+
194
+ ```javascript
195
+ // ❌ 错误
196
+ const bad = { 'foo': 3, 'bar': 4, 'data-blah': 5 }
197
+
198
+ // ✅ 正确
199
+ const good = { foo: 3, bar: 4, 'data-blah': 5 }
200
+ ```
201
+
202
+ #### 2.2.5 属性访问
203
+
204
+ 使用 `.` 来访问对象属性:
205
+
206
+ ```javascript
207
+ const joke = { name: 'haha', age: 28 }
208
+
209
+ // ❌ 错误
210
+ const name = joke['name']
211
+
212
+ // ✅ 正确
213
+ const name = joke.name
214
+ ```
215
+
216
+ ### 2.3 数组规范
217
+
218
+ #### 2.3.1 创建数组 — 使用字面量
219
+
220
+ ```javascript
221
+ // ❌ 错误
222
+ const items = new Array()
223
+
224
+ // ✅ 正确
225
+ const items = []
226
+ ```
227
+
228
+ #### 2.3.2 添加元素 — 使用 push
229
+
230
+ ```javascript
231
+ const items = []
232
+ // ❌ 错误
233
+ items[items.length] = 'test'
234
+
235
+ // ✅ 正确
236
+ items.push('test')
237
+ ```
238
+
239
+ #### 2.3.3 复制数组 — 使用展开运算符
240
+
241
+ ```javascript
242
+ // ❌ 错误:手动循环复制
243
+ // ✅ 正确
244
+ itemsCopy = [...items]
245
+ ```
246
+
247
+ #### 2.3.4 类数组转数组 — 使用 Array.from
248
+
249
+ ```javascript
250
+ const arrLike = { 0: 'foo', 1: 'bar', 2: 'baz', length: 3 }
251
+
252
+ // ❌ 错误
253
+ const arr = Array.prototype.slice.call(arrLike)
254
+
255
+ // ✅ 正确
256
+ const arr = Array.from(arrLike)
257
+ ```
258
+
259
+ #### 2.3.5 数组解构赋值
260
+
261
+ ```javascript
262
+ const arr = [1, 2, 3, 4]
263
+
264
+ // ❌ 错误
265
+ const first = arr[0]
266
+ const second = arr[1]
267
+
268
+ // ✅ 正确
269
+ const [first, second] = arr
270
+ ```
271
+
272
+ #### 2.3.6 数组 map 方法 — 必须有 return
273
+
274
+ ```javascript
275
+ // ❌ 错误
276
+ [[0, 1], [2, 3]].reduce((memo, item) => {
277
+ const flatten = memo.concat(item)
278
+ })
279
+
280
+ // ✅ 正确
281
+ [1, 2, 3].map(x => x + 1)
282
+
283
+ [1, 2, 3].map(x => {
284
+ const y = x + 1
285
+ return x * y
286
+ })
287
+ ```
288
+
289
+ ### 2.4 字符串规范
290
+
291
+ #### 2.4.1 定义 — 统一使用单引号
292
+
293
+ ```javascript
294
+ // ❌ 错误
295
+ const department = "JDC"
296
+
297
+ // ✅ 正确
298
+ const department = 'JDC'
299
+ ```
300
+
301
+ #### 2.4.2 动态生成 — 使用模板字符串
302
+
303
+ ```javascript
304
+ const test = 'test'
305
+
306
+ // ❌ 错误
307
+ const str = ['a', 'b', test].join()
308
+ const str = 'a' + 'b' + test
309
+
310
+ // ✅ 正确
311
+ const str = `ab${test}`
312
+ ```
313
+
314
+ #### 2.4.3 谨慎使用 eval()
315
+
316
+ 尽量不要对字符串使用 `eval()`,会导致安全漏洞。
317
+
318
+ ### 2.5 函数规范
319
+
320
+ #### 2.5.1 函数签名和函数体之间使用空格
321
+
322
+ ```javascript
323
+ // ❌ 错误
324
+ const f = function(){}
325
+ const g = function (){}
326
+
327
+ // ✅ 正确
328
+ const x = function b() {}
329
+ const y = function a() {}
330
+ ```
331
+
332
+ #### 2.5.2 不要使用 Function 构造函数创建函数
333
+
334
+ ```javascript
335
+ // ❌ 错误
336
+ const add = new Function('a', 'b', 'return a + b')
337
+
338
+ // ✅ 正确
339
+ const add = (a, b) => a + b
340
+ ```
341
+
342
+ #### 2.5.3 不要在非函数代码块中声明函数
343
+
344
+ ```javascript
345
+ // ❌ 错误
346
+ if (isUse) {
347
+ function test() { /* ... */ }
348
+ }
349
+
350
+ // ✅ 正确
351
+ let test
352
+ if (isUse) {
353
+ test = () => { /* ... */ }
354
+ }
355
+ ```
356
+
357
+ #### 2.5.4 不要使用 arguments,使用剩余运算符 ...
358
+
359
+ ```javascript
360
+ // ❌ 错误
361
+ function test() {
362
+ const args = Array.prototype.slice.call(arguments)
363
+ return args.join('')
364
+ }
365
+
366
+ // ✅ 正确
367
+ function test(...args) {
368
+ return args.join('')
369
+ }
370
+ ```
371
+
372
+ #### 2.5.5 使用参数默认值语法
373
+
374
+ ```javascript
375
+ // ❌ 错误
376
+ function handleThings(opts) {
377
+ opts = opts || {}
378
+ }
379
+
380
+ // ✅ 正确
381
+ function handleThings(opts = {}) {}
382
+ ```
383
+
384
+ #### 2.5.6 将默认值的参数放在最后
385
+
386
+ ```javascript
387
+ // ❌ 错误
388
+ function handleThings(opts = {}, name) {}
389
+
390
+ // ✅ 正确
391
+ function handleThings(name, opts = {}) {}
392
+ ```
393
+
394
+ #### 2.5.7 不要更改参数和对参数重新赋值
395
+
396
+ ```javascript
397
+ // ❌ 错误
398
+ const foo = function(bar) {
399
+ bar = 13
400
+ }
401
+
402
+ // ✅ 正确
403
+ const foo = function(bar) {
404
+ let baz = bar
405
+ }
406
+ ```
407
+
408
+ ### 2.6 箭头函数规范
409
+
410
+ #### 2.6.1 使用场景 — 传递匿名函数时优先使用箭头函数
411
+
412
+ ```javascript
413
+ // ❌ 错误
414
+ [1, 2, 3].map(function (x) {
415
+ return x + 1
416
+ })
417
+
418
+ // ✅ 正确
419
+ [1, 2, 3].map((x) => x + 1)
420
+ ```
421
+
422
+ #### 2.6.2 简写规则
423
+
424
+ - 函数体只包含一条无副作用的返回表达式 → 省略花括号,隐式 return
425
+ - 否则 → 保留花括号并使用 return 语句
426
+
427
+ ```javascript
428
+ // ✅ 正确:单一表达式
429
+ [1, 2, 3].map(number => `A string containing the ${number}.`)
430
+
431
+ // ✅ 正确:多行语句
432
+ [1, 2, 3].map((number) => {
433
+ const nextNumber = number + 1
434
+ return `A string containing the ${nextNumber}.`
435
+ })
436
+
437
+ // ✅ 正确:返回对象需加括号
438
+ [1, 2, 3].map((number, index) => ({ index: number }))
439
+ ```
440
+
441
+ ### 2.7 Switch 规范
442
+
443
+ 每个 case 做好防穿透处理(break),最后必须有 default 默认出口:
444
+
445
+ ```javascript
446
+ // ❌ 错误
447
+ switch (foo) {
448
+ case 1:
449
+ bar()
450
+ break
451
+ default:
452
+ baz()
453
+ break
454
+ case 2:
455
+ quux() // 缺少 break
456
+ break
457
+ }
458
+
459
+ // ✅ 正确
460
+ switch (foo) {
461
+ case 1:
462
+ bar()
463
+ break
464
+ case 2:
465
+ quux()
466
+ break
467
+ default:
468
+ baz()
469
+ break
470
+ }
471
+ ```
472
+
473
+ ### 2.8 ES6 语法规范
474
+
475
+ 开发中优先使用 ES6 新增语法糖和函数简化代码逻辑,使代码灵活可复用:
476
+
477
+ - **箭头函数** → 匿名函数场景
478
+ - **await/async** → 异步操作
479
+ - **解构赋值** → 对象、数组取值
480
+ - **let/const** → 变量声明(优先 const)
481
+ - **for...of** → 迭代遍历
482
+ - **展开运算符 ...** → 对象/数组拷贝、合并
483
+
484
+ ### 2.9 TypeScript 类型规范
485
+
486
+ - 优先使用具体类型,避免滥用 `any`
487
+ - 不确定类型时使用 `unknown` 而非 `any`
488
+ - 接口(interface)用于描述对象结构,类型别名(type)用于联合类型/工具类型
489
+ - 公共 API 入参/出参 MUST 显式声明类型
490
+
491
+ ```typescript
492
+ // ❌ 错误
493
+ function process(data: any): any { return data }
494
+
495
+ // ✅ 正确
496
+ interface UserData { id: string; name: string }
497
+ function process(data: UserData): UserData { return data }
498
+ ```
499
+
500
+ ---
501
+
502
+ ## 三、模块化开发规范
503
+
504
+ ### 3.1 使用标准 ES6 模块语法
505
+
506
+ ```javascript
507
+ // ❌ 错误
508
+ const util = require('./util')
509
+ module.exports = util
510
+
511
+ // ✅ 正确
512
+ import Util from './util'
513
+ export default Util
514
+
515
+ // 更好
516
+ import { Util } from './util'
517
+ ```
518
+
519
+ ### 3.2 确保只有一个默认 export
520
+
521
+ ```javascript
522
+ // ❌ 错误
523
+ import * as Util from './util'
524
+
525
+ // ✅ 正确
526
+ import Util from './util'
527
+ ```
528
+
529
+ ### 3.3 同个文件每个模块只允许 import 一次
530
+
531
+ ```javascript
532
+ // ❌ 错误
533
+ import foo from 'foo'
534
+ // ... 其他 imports ...
535
+ import { named1, named2 } from 'foo'
536
+
537
+ // ✅ 正确
538
+ import foo, { named1, named2 } from 'foo'
539
+ ```
540
+
541
+ ### 3.4 import 语句放在文件最前方
542
+
543
+ ```javascript
544
+ // ❌ 错误
545
+ import foo from 'foo'
546
+ foo.init()
547
+ import bar from 'bar'
548
+
549
+ // ✅ 正确
550
+ import foo from 'foo'
551
+ import bar from 'bar'
552
+
553
+ foo.init()
554
+ ```
555
+
556
+ ### 3.5 多行导入格式
557
+
558
+ 多行导入像多行数组和对象一样缩进:
559
+
560
+ ```javascript
561
+ // ❌ 错误
562
+ import { longNameA, longNameB, longNameC, longNameD, longNameE } from 'path'
563
+
564
+ // ✅ 正确
565
+ import {
566
+ longNameA,
567
+ longNameB,
568
+ longNameC,
569
+ longNameD,
570
+ longNameE
571
+ } from 'path'
572
+ ```
573
+
574
+ ### 3.6 禁止在 import 声明中使用 Webpack loader 语法
575
+
576
+ ```javascript
577
+ // ❌ 错误
578
+ import fooSass from 'css!sass!foo.scss'
579
+
580
+ // ✅ 正确
581
+ import fooSass from 'foo.scss'
582
+ ```
583
+
584
+ ---
585
+
586
+ ## 四、注释规范
587
+
588
+ ### 4.1 函数注释(JSDoc)
589
+
590
+ ```typescript
591
+ /** 打开创建弹窗 */
592
+ function openCreate(): void { ... }
593
+
594
+ /**
595
+ * 提交表单
596
+ * @param form - 表单数据
597
+ * @param isEdit - 是否编辑模式
598
+ */
599
+ async function submitForm(form: any, isEdit: boolean): Promise<void> { ... }
600
+ ```
601
+
602
+ ### 4.2 文件级注释
603
+
604
+ 每个公共模块/工具文件 MUST 在顶部添加文件级注释,说明文件用途:
605
+
606
+ ```typescript
607
+ /**
608
+ * HTTP 请求工具
609
+ * 封装 Axios 实例,统一处理 token、错误码、响应拦截
610
+ */
611
+ ```
612
+
613
+ ### 4.3 注释要点
614
+
615
+ - 注释内容 MUST 准确描述业务语义,禁止无意义注释(如 `// 处理` / `// 操作`)
616
+ - 复杂业务逻辑 MUST 添加注释,说明 **为什么** 这么做,而非 **做了什么**
617
+ - 已废弃代码 MUST 删除,禁止注释保留
618
+
619
+ ---
620
+
621
+ ## 五、通用禁止事项清单(MUST NOT)
622
+
623
+ | 编号 | 规则 | 说明 |
624
+ |------|------|------|
625
+ | C001 | 禁止滥用 `any` | 优先使用具体类型或 `unknown` |
626
+ | C002 | 禁止使用 `new Object()` / `new Array()` | 使用字面量 `{} / []` |
627
+ | C003 | 禁止使用 `eval()` | 存在安全漏洞 |
628
+ | C004 | 禁止深层 CSS 嵌套(>3 层) | 使用 BEM 命名扁平化 |
629
+ | C005 | 禁止全局标签选择器修改样式 | 使用类名选择器 |
630
+ | C006 | 禁止在非函数块中声明函数 | 改用变量赋值箭头函数 |
631
+ | C007 | 禁止使用 `arguments` | 使用剩余参数 `...args` |
632
+ | C008 | 禁止重复 import 同一模块 | 合并为单条 import 语句 |
633
+ | C009 | 禁止使用 `var` 声明变量 | 优先使用 `const`,必要时用 `let` |
634
+ | C010 | 禁止使用双引号定义字符串 | 统一使用单引号,动态字符串使用模板字符串 |
635
+ | C011 | 禁止 Switch 缺少 default 分支 | 必须包含 default 默认出口 |
636
+ | C012 | 禁止 import 后再添加 import | import 语句必须置于文件顶部 |
637
+
638
+ ---
639
+
640
+ ## 六、通用最佳实践检查清单
641
+
642
+ 在提交代码前,逐项确认:
643
+
644
+ **样式规范**
645
+ - [ ] CSS 选择器嵌套不超过 3 层
646
+ - [ ] 样式属性按 布局→尺寸→文字→视觉→其他 顺序排列
647
+ - [ ] 使用 BEM 命名规范组织 class
648
+ - [ ] 字号不小于 12px,font-weight 使用数值
649
+
650
+ **JS/TS 规范**
651
+ - [ ] 函数命名遵循 `handleXxx` 事件处理 / `isXxx` 布尔值 规范
652
+ - [ ] 优先使用 ES6 语法(箭头函数、解构、展开运算符等)
653
+ - [ ] 对象/数组使用字面量创建
654
+ - [ ] 常量使用 UPPER_SNAKE_CASE 命名
655
+ - [ ] 字符串统一使用单引号
656
+ - [ ] Switch 语句包含 default 分支
657
+ - [ ] import 语句置于文件顶部,无重复导入
658
+ - [ ] TypeScript 不滥用 `any`,公共 API 类型显式声明
659
+
660
+ **注释规范**
661
+ - [ ] 公共函数添加 JSDoc 注释
662
+ - [ ] 复杂业务逻辑添加说明性注释
663
+ - [ ] 无废弃注释代码
664
+
665
+ > 项目专属检查项(如 Vue/React 组件规范、状态管理、目录结构、构建工具等)请参考具体项目规则文件。