jsharness 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 (68) hide show
  1. package/.harness/README.md +199 -0
  2. package/.harness/agents/code-reviewer/contract.yaml +64 -0
  3. package/.harness/agents/developer/contract.yaml +72 -0
  4. package/.harness/agents/gate-controller/contract.yaml +64 -0
  5. package/.harness/agents/project-manager/contract.yaml +77 -0
  6. package/.harness/agents/prompt-templates.md +352 -0
  7. package/.harness/agents/requirements-analyst/contract.yaml +64 -0
  8. package/.harness/agents/solution-designer/contract.yaml +75 -0
  9. package/.harness/agents/tester/contract.yaml +92 -0
  10. package/.harness/config/models.yaml +67 -0
  11. package/.harness/dev-map/backend/api-definition.md +131 -0
  12. package/.harness/dev-map/backend/auth-security.md +131 -0
  13. package/.harness/dev-map/backend/conventions-java.md +471 -0
  14. package/.harness/dev-map/backend/conventions.md +192 -0
  15. package/.harness/dev-map/backend/database.md +106 -0
  16. package/.harness/dev-map/backend/structure.md +140 -0
  17. package/.harness/dev-map/decisions.md +275 -0
  18. package/.harness/dev-map/frontend/api-integration.md +139 -0
  19. package/.harness/dev-map/frontend/components.md +178 -0
  20. package/.harness/dev-map/frontend/conventions.md +416 -0
  21. package/.harness/dev-map/frontend/state-management.md +170 -0
  22. package/.harness/dev-map/frontend/structure.md +103 -0
  23. package/.harness/dev-map/overview.md +267 -0
  24. package/.harness/docs/integration-test-plan.md +248 -0
  25. package/.harness/docs/team-guidelines/README.md +161 -0
  26. package/.harness/docs/team-guidelines/arch-team.md +811 -0
  27. package/.harness/docs/team-guidelines/collaboration.md +556 -0
  28. package/.harness/docs/team-guidelines/pm-team.md +337 -0
  29. package/.harness/docs/team-guidelines/qa-team.md +562 -0
  30. package/.harness/docs/team-guidelines/rd-team.md +714 -0
  31. package/.harness/docs/training-materials.md +280 -0
  32. package/.harness/gate/baseline.js +220 -0
  33. package/.harness/gate/checks/build-gates-frontend.js +152 -0
  34. package/.harness/gate/checks/build-gates-java.js +155 -0
  35. package/.harness/gate/checks/build-gates.js +119 -0
  36. package/.harness/gate/checks/engineering-consistency.js +138 -0
  37. package/.harness/gate/checks/security-quality.js +129 -0
  38. package/.harness/gate/checks/static-compliance.js +313 -0
  39. package/.harness/gate/checks/test-compliance.js +114 -0
  40. package/.harness/gate/index.js +315 -0
  41. package/.harness/mcp/config.yaml +435 -0
  42. package/.harness/rules/global/coding-standard.md +232 -0
  43. package/.harness/rules/global/commit-convention.md +165 -0
  44. package/.harness/rules/global/process-discipline.md +192 -0
  45. package/.harness/rules/global/security-baseline.md +306 -0
  46. package/.harness/rules/project/frontend-vue3.md +293 -0
  47. package/.harness/rules/project/java-backend.md +460 -0
  48. package/.harness/rules/project/web-specific.md +231 -0
  49. package/.harness/skills/build.md +192 -0
  50. package/.harness/skills/code-review.md +251 -0
  51. package/.harness/skills/docker-build.md +227 -0
  52. package/.harness/skills/docs-update.md +164 -0
  53. package/.harness/skills/java-build.md +261 -0
  54. package/.harness/skills/lint-check.md +482 -0
  55. package/.harness/skills/task-board-maintenance.md +105 -0
  56. package/.harness/skills/test-api.md +461 -0
  57. package/.harness/skills/test-e2e.md +431 -0
  58. package/.harness/skills/test-unit.md +649 -0
  59. package/.harness/skills/vue-frontend-build.md +344 -0
  60. package/.harness/specs/quality-feedback/implementation-guide.md +350 -0
  61. package/.harness/task-board.md +121 -0
  62. package/.harness/workflow/definition.yaml +504 -0
  63. package/.harness/workflow/validate.js +320 -0
  64. package/.harness/workflow/variants.yaml +253 -0
  65. package/README.md +237 -0
  66. package/bin/jsharness.js +53 -0
  67. package/lib/index.mjs +778 -0
  68. package/package.json +1 -0
@@ -0,0 +1,714 @@
1
+ # 研发团队 (RD) Harness 使用规范
2
+
3
+ > **适用角色**: 前端开发、后端开发、全栈开发
4
+ > **对应 Agent**: 开发实现 Agent (developer) + 代码审查 Agent (code-reviewer)
5
+ > **模型档位**: Standard(开发)/ Strong(审查)
6
+ > **参考契约**: `.harness/agents/developer/contract.yaml` + `.harness/agents/code-reviewer/contract.yaml`
7
+ > **核心规则**: `rules/global/coding-standard.md` / `rules/global/security-baseline.md` / `rules/global/commit-convention.md`
8
+
9
+ ---
10
+
11
+ ## 一、角色定位:你是质量的创造者
12
+
13
+ ### 1.1 双重身份
14
+
15
+ 每个研发人员在 Harness 中承担 **两个角色**:
16
+
17
+ ```
18
+ ┌─────────────────────────────────────────────────┐
19
+ │ 研发人员的双重身份 │
20
+ ├──────────────────┬──────────────────────────────┤
21
+ │ 🔨 开发者 │ 🔍 代码审查者 │
22
+ │ (Developer) │ (Code Reviewer) │
23
+ ├──────────────────┼──────────────────────────────┤
24
+ │ 写代码 │ 审查同事代码 │
25
+ │ 写单元测试 │ 给出 PASS/条件PASS/FAIL 裁决 │
26
+ │ 跑 Gate 自检 │ 识别安全和性能风险 │
27
+ │ 更新 dev-map │ 提供改进建议 │
28
+ │ 创建 PR/MR │ 保护主分支质量 │
29
+ └──────────────────┴──────────────────────────────┘
30
+ ```
31
+
32
+ **重要原则**: 你不能审查自己的 PR/MR。必须由另一位开发者进行交叉审查。
33
+
34
+ ### 1.2 绝对禁止做的事
35
+
36
+ | # | 禁止行为 | 触发后果 |
37
+ |---|---------|---------|
38
+ | 1 | **硬编码密钥/token/密码** | Gate D 类 FAIL + 安全事件通报 |
39
+ | 2 | **提交带 console.log/debugger 的代码** | Gate A 类 WARNING → 累积 3 次 FAIL |
40
+ | 3 | **裸 `any` 类型无注释说明** | Code Review A 类扣分 |
41
+ | 4 | **跳过任意一步自检流程** | PR 直接打回 |
42
+ | 5 | **自行合并自己的 PR/MR** | 严重违规,撤销合并 |
43
+ | 6 | **引入未声明的依赖** | Code Review FAIL |
44
+ | 7 | **修改上游文档**(需求/设计) | 流程违规警告 |
45
+ | 8 | **覆盖率不达标就提交 PR** | Gate C 类 FAIL |
46
+
47
+ ---
48
+
49
+ ## 二、开发实现阶段规范(开发者身份)
50
+
51
+ ### 2.1 标准工作流(8 步,一步都不能少)
52
+
53
+ ```
54
+ 收到设计文档 ──→ ①阅读理解 ──→ ②编码实现 ──→ ③编写单元测试
55
+ ↓ │
56
+ dev-map 参考 ④Build 检查
57
+ ↓ 编译失败→回②
58
+ Rule/Skill 参考 ↓
59
+ │ ⑤单元测试执行
60
+ │ 失败→回②/③
61
+ │ ↓
62
+ │ ⑥Lint 检查
63
+ │ 有warning→修复重跑
64
+ │ ↓
65
+ │ ⑦更新dev-map
66
+ │ (有结构变化时)
67
+ │ ↓
68
+ │ ⑧Commit+创建PR
69
+ │ 格式不符→修正重提
70
+ ↓ ↓
71
+ 全部PASS ✓ ───────────────────────────────→ 进入代码审查阶段
72
+ ```
73
+
74
+ #### Step ①: 阅读理解
75
+
76
+ **必读文件清单**:
77
+
78
+ | 序号 | 文件 | 位置 | 目的 |
79
+ |-----|------|------|------|
80
+ | 1 | 技术设计文档 | `{deliverables}/design-{id}.md` | 了解实现方案 |
81
+ | 2 | API 定义 | `{deliverables}/api-definition.yaml` | 明确接口规格 |
82
+ | 3 | 数据模型 | `{deliverables}/data-model.md` | 了解数据结构 |
83
+ | 4 | dev-map 相关分区 | `.harness/dev-map/{frontend,backend}/` | 了解现有约定 |
84
+ | 5 | 编码规范 | `.harness/rules/global/coding-standard.md` | 遵循代码风格 |
85
+
86
+ **阅读后应确认**:
87
+ - [ ] 理解了所有接口的输入输出
88
+ - [ ] 知道代码应该放在哪个目录
89
+ - [ ] 了解现有的命名约定和模式
90
+ - [ ] 识别出可能的风险点和疑问(如有,先问再动手)
91
+
92
+ #### Step ②: 编码实现
93
+
94
+ **编码规范速查**:
95
+
96
+ ```javascript
97
+ // ✅ 正确示例
98
+ interface UserProfile {
99
+ id: string; // 用户唯一标识
100
+ name: string; // 用户显示名
101
+ email: string; // 登录邮箱
102
+ createdAt: Date; // 注册时间
103
+ }
104
+
105
+ // ❌ 错误示例
106
+ // 裸 any —— 必须注释说明为什么无法确定类型
107
+ const data: any = fetchData();
108
+
109
+ // ❌ 错误示例
110
+ // 硬编码密钥
111
+ const API_KEY = 'sk-abc123456789';
112
+ // 应该用环境变量 process.env.API_KEY
113
+ ```
114
+
115
+ **文件命名约定**:
116
+
117
+ | 类型 | 约定 | 示例 |
118
+ |-----|------|------|
119
+ | 组件文件 | PascalCase + .tsx | `UserProfile.tsx` |
120
+ | 工具函数 | camelCase + .ts | `formatDate.ts` |
121
+ | 类型定义 | camelCase + .types.ts | `user.types.ts` |
122
+ | 常量 | UPPER_SNAKE_CASE.ts | `API_ENDPOINTS.ts` |
123
+ | 测试文件 | *.test.ts / *.spec.ts | `UserProfile.test.ts` |
124
+ | Hook 文件 | use + PascalCase | `useUserProfile.ts` |
125
+
126
+ #### Step ③: 编写/更新单元测试
127
+
128
+ **测试覆盖率要求**:
129
+
130
+ | 代码类型 | 行覆盖率目标 | 分支覆盖率目标 |
131
+ |---------|------------|--------------|
132
+ | 核心业务逻辑 | ≥ 85% | ≥ 75% |
133
+ | 工具函数 | ≥ 90% | ≥ 80% |
134
+ | 组件渲染 | ≥ 70% | ≥ 60% |
135
+ | 配置/常量 | ≥ 50% | - |
136
+
137
+ **测试命名约定**:
138
+
139
+ ```typescript
140
+ // ✅ 正确:describe + it 清晰表达意图
141
+ describe('UserProfile', () => {
142
+ describe('getUserById', () => {
143
+ it('当用户存在时返回用户信息', async () => {...});
144
+ it('当用户不存在时抛出 NotFoundError', async () => {...});
145
+ it('当 ID 格式无效时抛出 ValidationError', async () => {...});
146
+ });
147
+ });
148
+
149
+ // ❌ 错误:模糊的测试名
150
+ it('should work', () => {...});
151
+ it('test user', () => {...});
152
+ ```
153
+
154
+ #### Step ④: Build 检查
155
+
156
+ ```bash
157
+ # 前端项目
158
+ npm run build # 或 pnpm build
159
+ # 或 TypeScript 类型检查
160
+ npx tsc --noEmit
161
+
162
+ # 后端项目
163
+ npm run compile # 或对应编译命令
164
+ ```
165
+
166
+ **通过标准**:
167
+ - ✅ 零编译错误
168
+ - ✅ 零 TypeScript 类型错误(error 级别)
169
+ - ⚠️ warning 可以存在但建议修复
170
+
171
+ #### Step ⑤: 单元测试执行
172
+
173
+ ```bash
174
+ # 运行全部测试
175
+ npm test # 或 npm run test:unit
176
+
177
+ # 运行特定文件的测试
178
+ npm test -- --grep "UserProfile"
179
+
180
+ # 生成覆盖率报告
181
+ npm test -- --coverage
182
+ ```
183
+
184
+ **通过标准**:
185
+ - ✅ 所有测试用例通过
186
+ - ✅ 覆盖率达到上述目标值
187
+ - ⚠️ 覆盖率低于基线但高于最低门槛 → WARNING
188
+
189
+ #### Step ⑥: Lint 检查
190
+
191
+ ```bash
192
+ # ESLint 检查
193
+ npx eslint src/ --ext .ts,.tsx
194
+
195
+ # Prettier 格式化检查
196
+ npx prettier --check "src/**/*.{ts,tsx}"
197
+
198
+ # 一键修复(自动修复的问题)
199
+ npx eslint src/ --ext .ts,.tsx --fix
200
+ npx prettier --write "src/**/*.{ts,tsx}"
201
+ ```
202
+
203
+ **通过标准**:
204
+ - ✅ ESLint: 零 error,零 warning(理想状态)
205
+ - ✅ Prettier: 格式完全符合
206
+ - ⚠️ 存在 warning 时必须说明理由(加 // eslint-disable-next-line 注释)
207
+
208
+ #### Step ⑦: 更新 dev-map
209
+
210
+ **何时必须更新**:
211
+ - 新增了模块/目录/页面
212
+ - 修改了公共组件的接口
213
+ - 变更了 API 路由
214
+ - 修改了数据库表结构
215
+ - 变更了状态管理方式
216
+
217
+ **不需要更新的情况**:
218
+ - 只改了组件内部实现
219
+ - 修复了 bug 未涉及结构变化
220
+ - 调整了样式
221
+
222
+ **更新格式**:
223
+
224
+ ```markdown
225
+ <!-- 在对应的 dev-map 文件中追加 -->
226
+
227
+ ### {日期} 更新记录
228
+ - **更新人**: {姓名}
229
+ - **变更类型**: 新增模块 / 接口变更 / 结构调整
230
+ - **变更内容**:
231
+ - 新增 `src/features/user-profile/` 目录
232
+ - 新增 API: GET /api/users/:id
233
+ - 更新 User 类型定义
234
+ - **影响范围**: 前端用户模块、后端用户 API
235
+ ```
236
+
237
+ #### Step ⑧: 规范 Commit + 创建 PR
238
+
239
+ **Commit Message 规范(Conventional Commits)**:
240
+
241
+ ```
242
+ <type>(<scope>): <subject>
243
+
244
+ <body>
245
+
246
+ <footer>
247
+ ```
248
+
249
+ **Type 列表**:
250
+
251
+ | Type | 用途 | 示例 |
252
+ |------|------|------|
253
+ | feat | 新功能 | `feat(auth): add OAuth2 login support` |
254
+ | fix | Bug 修复 | `fix(api): resolve timeout issue in user fetch` |
255
+ | docs | 文档变更 | `docs(readme): update installation steps` |
256
+ | style | 代码格式(不影响功能) | `style(button): fix indentation` |
257
+ | refactor | 重构(非新功能非修复) | `refactor(service): extract validation logic` |
258
+ | perf | 性能优化 | `perf(list): virtualize long list rendering` |
259
+ | test | 测试相关 | `test(user): add edge case tests` |
260
+ | chore | 构建/工具变更 | `chore(deps): update eslint to v9` |
261
+
262
+ **PR/MR 模板**:
263
+
264
+ ```markdown
265
+ ## 变更概述
266
+ {简要描述这个 PR 做了什么}
267
+
268
+ ## 关联需求
269
+ - 需求文档: #{Issue链接}
270
+ - 设计文档: {design-{id}.md}
271
+
272
+ ## 变更类型
273
+ - [ ] 新功能
274
+ - [ ] Bug 修复
275
+ - [ ] 重构
276
+ - [ ] 文档更新
277
+ - [ ] 其他: ___
278
+
279
+ ## 测试清单
280
+ - [ ] 单元测试已添加/更新并通过
281
+ - [ ] 覆盖率达标: __%
282
+ - [ ] 手动测试通过
283
+ - [ ] 无 console.log/debugger 残留
284
+
285
+ ## 自检报告
286
+ - Build: ✅ PASS / ❌ FAIL
287
+ - Test: ✅ PASS (覆盖率 __%) / ❌ FAIL
288
+ - Lint: ✅ PASS / ❌ FAIL (___ warnings)
289
+
290
+ ## 影响面分析
291
+ - 涉及模块: ___
292
+ - 潜在风险: ___
293
+ - dev-map 更新: [是/否] ({文件路径})
294
+
295
+ ## 截图/Demo(UI 变更必填)
296
+ {附截图或 Demo 链接}
297
+ ```
298
+
299
+ ---
300
+
301
+ ## 三、代码审查规范(审查者身份)
302
+
303
+ ### 3.1 审查维度与权重
304
+
305
+ | 维度 | 权重 | 检查项 |
306
+ |-----|------|-------|
307
+ | **A. 代码质量** | 30% | A1 命名清晰度、A2 复杂度控制、A3 类型安全、A4 错误处理、A5 DRY原则、A6 可读性 |
308
+ | **B. 规范遵循** | 15% | B1 Commit 规范、B2 分支策略、B3 PR 描述完整性、B4 文档同步、B5 文件组织 |
309
+ | **C. 安全与风险** | 25% | C1 凭证管理、C2 注入防护、C3 权限控制、C4 敏感数据处理、C5 依赖安全 |
310
+ | **D. 性能考量** | 10% | D1 N+1 查询、D2 内存泄漏、D3 包体积、D4 渲染性能 |
311
+ | **E. 测试覆盖** | 20% | E1 测试存在性、E2 覆盖率达标、E3 测试质量 |
312
+
313
+ ### 3.2 裁决标准
314
+
315
+ #### FAIL(直接打回)— 以下任一条件触发
316
+
317
+ - [ ] **C 类安全检查不通过**(最高优先级)
318
+ - [ ] **A 类总分 < 60%**
319
+ - [ ] **新代码完全没有测试**
320
+ - [ ] **单 PR > 1000 行且无合理拆分理由**
321
+ - [ ] **测试覆盖率回归 > 5%**
322
+
323
+ #### CONDITIONAL_PASS(修后可通过)
324
+
325
+ - [ ] 总分 ≥ 80%,但存在 **必修问题**
326
+ - [ ] 必须列出:
327
+ - 🔴 **必修问题**(必须修才能合入)
328
+ - 🟡 **建议改进**(本轮可不修,建议开跟踪 Issue)
329
+
330
+ #### PASS(直接通过)
331
+
332
+ - [ ] 总分 ≥ 90%
333
+ - [ ] 无安全问题
334
+ - [ ] 无必修问题
335
+ - [ ] 覆盖率达标或提升
336
+
337
+ ### 3.3 审查评论规范
338
+
339
+ ```markdown
340
+ ## 🔴 必修问题
341
+
342
+ ### C1-凭证泄露风险
343
+ **位置**: `src/api/client.ts:23`
344
+ **问题**: API Key 不应出现在代码中,应使用环境变量。
345
+ **建议**: 改为 `process.env.API_KEY`
346
+ **严重程度**: 高
347
+
348
+ ## 🟡 建议改进
349
+
350
+ ### A1-变量命名
351
+ **位置**: `src/utils/helper.ts:45`
352
+ **问题**: 变量名 `data` 过于泛型
353
+ **建议**: 改为更具描述性的名字如 `userData`
354
+ **严重程度**: 低(可选)
355
+
356
+ ---
357
+ **审查结论**: CONDITIONAL_PASS
358
+ **总分**: 82/100
359
+ **必修问题数**: 1
360
+ **建议改进数**: 2
361
+ ```
362
+
363
+ ---
364
+
365
+ ## 四、Gate 门禁检查详解
366
+
367
+ ### 4.1 五类检查一览
368
+
369
+ | 类别 | 检查脚本 | 检查内容 | 失败后果 |
370
+ |-----|---------|---------|---------|
371
+ | **A 静态规范** | `static-compliance.js` | ESLint/Prettier/console残留/硬编码/TODO/命名/Secret | WARNING/FAIL |
372
+ | **B 构建门槛** | `build-gates.js` | 前端build/后端编译/Docker构建/TS类型检查/依赖安装 | **FAIL** |
373
+ | **C 测试合规** | `test-compliance.js` | 单元测试/E2E/API集成/测试数量对比 | **FAIL** |
374
+ | **D 安全质量** | `security-quality.js` | CVE依赖审计/CR Approval状态 | **FAIL** |
375
+ | **E 一致性** | `engineering-consistency.js` | CHANGELOG/迁移文件/dev-map/配置同步 | WARNING/FAIL |
376
+
377
+ ### 4.2 运行门禁检查
378
+
379
+ ```bash
380
+ # 完整检查
381
+ node .harness/gate/index.js
382
+
383
+ # 只生成报告
384
+ node .harness/gate/index.js --report
385
+
386
+ # 与基线对比(检测回归)
387
+ node .harness/gate/index.js --baseline
388
+
389
+ # 保存当前状态为新基线
390
+ node .harness/gate/index.js --save-baseline
391
+ ```
392
+
393
+ ### 4.3 基线对比机制
394
+
395
+ **首次运行**:
396
+ ```bash
397
+ # 在项目稳定状态下保存基线
398
+ node .harness/gate/index.js --save-baseline
399
+ # → 生成 .harness/gate/baseline.json
400
+ ```
401
+
402
+ **后续对比**:
403
+ ```bash
404
+ # 每次 PR 前对比基线
405
+ node .harness/gate/index.js --baseline
406
+ # → 输出 REGRESSION(退化)或 IMPROVEMENT(改进)标记
407
+ ```
408
+
409
+ **回归判定规则**:
410
+ - 测试覆盖率下降 > 5% → **REGRESSION 自动打回**
411
+ - 新增 A/B 类 FAIL → **自动打回**
412
+ - 安全高危问题 → **立即阻断**
413
+
414
+ ---
415
+
416
+ ## 五、dev-map 维护规范
417
+
418
+ ### 5.1 原则:谁改代码谁改地图
419
+
420
+ ```
421
+ 你修改了代码 → 检查是否影响 dev-map → 是 → 更新 → 提交时包含 dev-map 变更
422
+ → 否 → 继续正常提交
423
+ ```
424
+
425
+ ### 5.2 dev-map 目录结构
426
+
427
+ ```
428
+ .harness/dev-map/
429
+ ├── overview.md # 总览索引 ← PM 维护
430
+ ├── frontend/
431
+ │ ├── structure.md # 目录结构与路由 ← 前端开发维护
432
+ │ ├── components.md # 组件库与复用模式 ← 前端开发维护
433
+ │ ├── state-management.md # 状态管理 ← 前端开发维护
434
+ │ ├── api-integration.md # 前端 API 调用 ← 前端+后端共同维护
435
+ │ └── conventions.md # 前端编码惯例 ← 前端开发维护
436
+ ├── backend/
437
+ │ ├── structure.md # 模块划分与分层 ← 后端开发维护
438
+ │ ├── database.md # 数据模型与迁移 ← 后端开发维护
439
+ │ ├── api-definition.md # API 设计规范 ← 后端开发维护
440
+ │ ├── auth-security.md # 认证与安全 ← 后端+安全组维护
441
+ │ └── conventions.md # 后端编码惯例 ← 后端开发维护
442
+ └── decisions.md # ADR 决策记录 ← 架构师+开发者共同维护
443
+ ```
444
+
445
+ ### 5.3 更新 Checklist
446
+
447
+ 提交代码前自查:
448
+
449
+ - [ ] 我修改/新增了哪些文件?
450
+ - [ ] 这些变更是否影响了已有的架构描述?
451
+ - [ ] 是否新增了需要记录的 API 端点?
452
+ - [ ] 是否引入了新的依赖或技术选型?(需要 ADR 吗?)
453
+ - [ ] 如果以上任一为"是",dev-map 是否已同步更新?
454
+
455
+ ---
456
+
457
+ ## 六、绩效考核关联指标
458
+
459
+ | 指标 | 目标值 | 权重 | 数据来源 |
460
+ |-----|-------|------|---------|
461
+ | 代码质量评分(CR A类) | ≥ 75% | 20% | Code Review 记录 |
462
+ | 安全违规次数 | = 0 高危 | 20%(一票否决) | Gate D 类 + CR C类 |
463
+ | 单元测试覆盖率 | 达标率 ≥ 90% | 15% | Gate C 类报告 |
464
+ | 自检通过率(首次) | ≥ 70% | 15% | PR 打回记录 |
465
+ | dev-map 同步率 | ≥ 95% | 10% | 抽查 |
466
+ | Code Review 及时性 | ≤ 24h 响应 | 10% | CR 响应时间 |
467
+ | Commit 规范遵循 | 100% 符合 | 10% | Git log 抽查 |
468
+
469
+ ---
470
+
471
+ ## 七、常用命令速查
472
+
473
+ ```bash
474
+ # === 开发日常 ===
475
+ npm run dev # 启动开发服务器
476
+ npm run build # 构建检查
477
+ npm test # 运行测试
478
+ npm run lint # ESLint 检查
479
+ npm run format # Prettier 格式化
480
+
481
+ # === Gate 检查 ===
482
+ node .harness/gate/index.js # 完整检查
483
+ node .harness/gate/index.js --save-baseline # 保存基线
484
+ node .harness/gate/index.js --baseline # 对比基线
485
+
486
+ # === Workflow 校验 ===
487
+ node .harness/workflow/validate.js # 校验流程完整性
488
+
489
+ # === 规则查询 ===
490
+ cat .harness/rules/global/coding-standard.md # 编码规范
491
+ cat .harness/rules/global/security-baseline.md # 安全红线
492
+ cat .harness/rules/global/commit-convention.md # 提交规范
493
+
494
+ # === Skill 参考 ===
495
+ cat .harness/skills/build.md # 构建技能
496
+ cat .harness/skills/code-review.md # 审查技能
497
+ cat .harness/skills/test-unit.md # 单测技能
498
+ ```
499
+
500
+ ---
501
+
502
+ ## 八、开发者自查清单
503
+
504
+ ### 提交 PR 前(必须逐条确认)
505
+
506
+ #### 代码质量
507
+ - [ ] 命名清晰有意义(无 a/b/tmp 之类)
508
+ - [ ] 无裸 `any` 类型(或有充分注释说明理由)
509
+ - [ ] 函数/方法长度合理(一般不超过 50 行)
510
+ - [ ] 无重复代码(DRY 原则)
511
+ - [ ] 错误处理完善(try-catch / Result 类型)
512
+
513
+ #### 安全检查
514
+ - [ ] 无硬编码密钥/token/密码
515
+ - [ ] 无 SQL 注入/XSS 风险
516
+ - [ ] 敏感数据有脱敏处理
517
+ - [ ] API 调用有权限校验
518
+
519
+ #### 测试
520
+ - [ ] 新增代码有对应单元测试
521
+ - [ ] 覆盖率达到目标值
522
+ - [ ] 测试命名清晰表达意图
523
+ - [ ] 无跳过的测试(skip/it.skip)
524
+
525
+ #### 规范
526
+ - [ ] Commit message 符合 Conventional Commits
527
+ - [ ] PR 描述完整(使用了模板)
528
+ - [ ] 分支名符合规范(feature/xxx, fix/xxx 等)
529
+ - [ ] 无 console.log / debugger 残留
530
+ - [ ] 无 TODO/FIXME 残留(或有跟踪 Issue)
531
+
532
+ #### 文档
533
+ - [ ] dev-map 已更新(如有结构性变化)
534
+ - [ ] 复杂逻辑有注释说明"为什么"而非"是什么"
535
+
536
+ ---
537
+
538
+ ## 九、Java 后端开发者附加指南
539
+
540
+ > **参考规则**: `rules/project/java-backend.md` | **构建技能**: `skills/java-build.md` | **Dev-map**: `dev-map/backend/conventions-java.md`
541
+
542
+ ### 9.1 日常开发 Checklist
543
+
544
+ ```bash
545
+ # === 编译 ===
546
+ mvn clean compile # 编译检查
547
+
548
+ # === 测试 ===
549
+ mvn test # 运行全部单元测试
550
+ mvn test -Dtest=UserServiceTest # 指定测试类
551
+ mvn test jacoco:report # 生成覆盖率报告(目标 ≥80%)
552
+
553
+ # === 打包 ===
554
+ mvn package -DskipTests # 跳过测试打包
555
+
556
+ # === 快速诊断 ===
557
+ mvn clean compile -e # 显示完整错误堆栈
558
+ mvn dependency:tree # 查看依赖树
559
+ ```
560
+
561
+ ### 9.2 各层自检要点
562
+
563
+ | 层级 | 自检要点 | 参考规则 |
564
+ |------|---------|----------|
565
+ | Controller | 只做路由+校验?@PostMapping?@Valid?返回 CommonResult? | JB-A1, JB-C1/C4 |
566
+ | Service | 接口+impl 分离?@RequiredArgsConstructor?事务最小化?外部调用放事务外? | JB-A2, JB-E5 |
567
+ | Mapper | 纯接口?SQL 在 XML?#{}` 预编译?无 @Select 注解? | JB-A3, JB-D1/D2 |
568
+ | Entity/VO | 类后缀正确?字段 private?时间用 LocalDateTime? | JB-B2, A28 |
569
+
570
+ ### 9.3 提交 PR 前 — 后端 22 项自查清单
571
+
572
+ #### 架构与分层(4 项)
573
+ - [ ] Controller 只做路由和参数校验,无业务逻辑
574
+ - [ ] Service 做业务编排(非 CRUD 直通 Mapper)
575
+ - [ ] Mapper 为纯接口且 SQL 在 XML 中
576
+ - [ ] 模块依赖方向正确(无循环/反向/跨层跳跃)
577
+
578
+ #### 命名与规范(5 项)
579
+ - [ ] 包名为 `com.jieshun`
580
+ - [ ] 类后缀符合 9 种标准后缀
581
+ - [ ] public 类有完整 Javadoc
582
+ - [ ] 方法命名清晰表达意图
583
+ - [ ] 常量使用 UPPER_SNAKE_CASE
584
+
585
+ #### 参数与返回值(4 项)
586
+ - [ ] Controller 参数有 JSR303 校验注解
587
+ - [ ] 使用 ReqVO/RespVO 分层传参
588
+ - [ ] 禁止 Map 和 Entity 直接暴露
589
+ - [ ] 返回值使用统一 Result 封装
590
+
591
+ #### 数据库与 SQL(3 项)
592
+ - [ ] SQL 使用 `#{}` 预编译
593
+ - [ ] 分页使用拦截器(非手动 LIMIT)
594
+ - [ ] 表结构变更已有 ALTER 脚本
595
+
596
+ #### 安全与质量(6 项)
597
+ - [ ] 敏感数据 SM4 加密存储
598
+ - [ ] 响应数据已脱敏
599
+ - [ ] Redis key 有 TTL
600
+ - [ ] 日志使用 `{}` 参数化
601
+ - [ ] 事务范围最小化
602
+ - [ ] 虚拟线程中无 synchronized(改 ReentrantLock)
603
+
604
+ ### 9.4 虚拟线程注意事项
605
+
606
+ ```java
607
+ // ✅ 正确:虚拟线程 + ReentrantLock
608
+ private final ReentrantLock lock = new ReentrantLock();
609
+
610
+ // ❌ 错误:虚拟线程 + synchronized → 导致 pinning!
611
+ public synchronized void badMethod() { ... }
612
+ ```
613
+
614
+ **核心原则**: JDK21 虚拟线程环境下,**synchronized 会导致 pinning**(固定到平台线程),失去虚拟线程优势。必须使用 `ReentrantLock` 替代。
615
+
616
+ ### 9.5 Redis 操作常见坑点
617
+
618
+ | 坑点 | 正确做法 |
619
+ |------|---------|
620
+ | 忘记设置 TTL | 写入时 **必须** 设置过期时间 |
621
+ | 手写 SETNX 实现锁 | 使用 **Redisson** 的 RLock |
622
+ | Key 命名随意 | 统一定义在 **RedisKeyConstants** 常量类 |
623
+ | 把 Redis 当数据库用 | Redis **仅用于缓存**,禁止持久化场景 |
624
+
625
+ ---
626
+
627
+ ## 十、Vue3 前端开发者附加指南
628
+
629
+ > **参考规则**: `rules/project/frontend-vue3.md` | **构建技能**: `skills/vue-frontend-build.md` | **Dev-map**: `dev-map/frontend/conventions.md`
630
+
631
+ ### 10.1 日常开发 Checklist
632
+
633
+ ```bash
634
+ # === 开发服务器 ===
635
+ npm run dev # 启动 Vite 开发服务器
636
+
637
+ # === 类型检查 ===
638
+ npx vue-tsc --noEmit # TypeScript 类型检查
639
+
640
+ # === 构建 ===
641
+ npm run build # 生产构建
642
+ npm run build -- --mode analyze # 构建分析(包体积)
643
+
644
+ # === Lint + Format ===
645
+ npx eslint src/ --ext .ts,.tsx,.vue # ESLint 检查
646
+ npx prettier --write "src/**/*.{ts,vue}" # 格式化
647
+ npm run lint:fix # 自动修复
648
+
649
+ # === 测试 ===
650
+ npm test / npx vitest run # Vitest 单元测试
651
+ npx vitest run --coverage # 带覆盖率
652
+ ```
653
+
654
+ ### 10.2 组件编写自检要点
655
+
656
+ | 检查项 | 要求 |
657
+ |--------|------|
658
+ | API 用法 | `<script setup lang="ts">` |
659
+ | Props 定义 | TS interface 或 `defineProps<T>()` |
660
+ | 类型安全 | 无裸 any(或注释说明理由)|
661
+ | Element Plus | ElMessage 反馈、v-loading 加载、图标包裹 |
662
+ | Pinia Store | 跨组件状态走 Store,禁 prop drilling > 2 层 |
663
+ | 变量命名 | camelCase(变量) / UPPER_SNAKE_CASE(常量) / is前缀(布尔) / handle前缀(事件) |
664
+
665
+ ### 10.3 提交 PR 前 — 前端自查清单
666
+
667
+ - [ ] 全部使用 Composition API(无 Options API)
668
+ - [ ] Props 有明确 TS 类型定义
669
+ - [ ] 无裸 any 类型(或有注释说明)
670
+ - [ ] Element Plus 组件规范使用正确
671
+ - [ ] 文件命名符合 PascalCase(组件)+ kebab-case(目录)
672
+ - [ ] `npx vue-tsc --noEmit` 零 Type Error
673
+ - [ ] `npm run build` 构建成功
674
+ - [ ] ESLint 零 error,零 warning(理想状态)
675
+ - [ ] 新增代码有对应单测,覆盖率达标
676
+ - [ ] 无 console.log / debugger 残留
677
+
678
+ ### 10.4 Pinia Store 使用规范
679
+
680
+ ```typescript
681
+ // ✅ 正确:标准 Store 结构
682
+ export const useUserStore = defineStore('user', {
683
+ state: () => ({ userInfo: null, token: '' }), // 有类型
684
+ getters: {
685
+ isLoggedIn: (state) => !!state.token, // 计算属性派生
686
+ isAdmin: (state) => state.permissions.includes('admin'),
687
+ },
688
+ actions: {
689
+ async login(credentials) { /* ... */ }, // 异步操作
690
+ logout() { this.$reset(); }, // 重置
691
+ },
692
+ });
693
+ ```
694
+
695
+ **Store 规范**:
696
+ - State 字段必须有 TS 类型
697
+ - Getters 用于计算派生数据
698
+ - Actions 用于异步操作和批量修改
699
+ - 禁止在组件外直接修改 State(通过 Actions 修改)
700
+
701
+ ### 10.5 Element Plus 常见用法速查
702
+
703
+ | 场景 | 用法 |
704
+ |------|------|
705
+ | 成功提示 | `ElMessage.success('操作成功')` |
706
+ | 错误提示 | `ElMessage.error('操作失败')` |
707
+ | 确认弹窗 | `await ElMessageBox.confirm('确定?', '提示', {...})` |
708
+ | 加载状态 | `<div v-loading="isLoading">内容</div>` |
709
+ | 表单校验 | `<el-form :model="form" :rules="rules">` |
710
+ | 分页 | `<el-pagination :total="total" @current-change="handlePageChange" />` |
711
+
712
+ ---
713
+
714
+ *本规范是研发团队在 Harness 体系中的完整操作指南。请严格遵守,保护代码质量和团队协作效率。*