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,165 @@
1
+ # Git 提交规范 (commit-convention)
2
+
3
+ > **级别**: 必须遵守 | **适用范围**: 全局
4
+
5
+ ## 1. Conventional Commits 格式
6
+
7
+ ```
8
+ <type>(<scope>): <subject>
9
+
10
+ [optional body]
11
+
12
+ [optional footer(s)]
13
+ ```
14
+
15
+ ### Type 类型
16
+
17
+ | Type | 描述 | 使用场景 |
18
+ |------|------|----------|
19
+ | `feat` | 新功能 | 新增功能、能力、页面 |
20
+ | `fix` | Bug 修复 | 修复缺陷 |
21
+ | `docs` | 文档变更 | 仅文档修改(不含代码变动) |
22
+ | `style` | 代码格式 | 不影响运行的格式调整(空格、分号等) |
23
+ | `refactor` | 重构 | 不是新功能也不是修复的代码改动 |
24
+ | `perf` | 性能优化 | 提升性能的代码变更 |
25
+ | `test` | 测试相关 | 新增或修改测试用例 |
26
+ | `chore` | 构建/工具 | 构建、依赖、工具链变更 |
27
+ | `ci` | CI 配置 | CI 流水线配置修改 |
28
+ | `revert` | 回滚 | 回退之前的提交 |
29
+
30
+ ### Scope 范围约定
31
+
32
+ | Scope | 对应区域 | 示例 |
33
+ |-------|----------|------|
34
+ | `auth` | 认证模块 | `feat(auth)` |
35
+ | `user` | 用户模块 | `fix(user)` |
36
+ | `api` | 后端 API | `feat(api)` |
37
+ | `ui` | 通用 UI 组件 | `style(ui)` |
38
+ | `dashboard` | 仪表盘页 | `feat(dashboard)` |
39
+ | `ci` | CI/CD 相关 | `chore(ci)` |
40
+ | `deps` | 依赖更新 | `chore(deps)` |
41
+ | `harness` | Harness 配置 | `chore(harness)` |
42
+
43
+ ### Subject 规范
44
+
45
+ - 使用中文或英文(团队统一选择中文)
46
+ - 不超过 50 字符
47
+ - 不以句号结尾
48
+ - 使用祈使语气("添加"而非"添加了")
49
+
50
+ ```
51
+ ✅ feat(auth): 添加 JWT 双 Token 刷新机制
52
+ ✅ fix(api): 修复用户查询分页边界越界问题
53
+ ✅ refactor(db): 将用户表拆分为用户和账户两张表
54
+ ❌ feat(auth): 我加了一个JWT刷新的功能。
55
+ ❌ fix: 改了个bug
56
+ ❌ Feat(Auth): Add jwt refresh...
57
+ ```
58
+
59
+ ## 2. Issue / PR 关联要求
60
+
61
+ ### 2.1 Commit 关联 Issue
62
+
63
+ 每次提交必须在 Body 中关联 Issue:
64
+
65
+ ```
66
+ feat(dashboard): 添加数据导出功能
67
+
68
+ Closes #123
69
+ Related #124
70
+ ```
71
+
72
+ ### 2.2 PR Title 格式
73
+
74
+ PR 标题必须符合 commit message 格式:
75
+
76
+ ```
77
+ feat(dashboard): 添加数据导出功能 (#123)
78
+ ```
79
+
80
+ ### 2.3 自动化校验
81
+
82
+ 提交前必须通过以下检查:
83
+
84
+ ```bash
85
+ # 1. Commit lint 检查
86
+ npx commitlint --from=HEAD~1
87
+
88
+ # 2. Branch name 校验
89
+ # 格式: type/description-issueNumber
90
+ # 例: feat/user-export-123, fix/api-pagination-456
91
+
92
+ # 3. PR 模板必须填写
93
+ # - 变更描述
94
+ # - 测试方案
95
+ # - 影响范围评估
96
+ ```
97
+
98
+ ## 3. Commit Message 质量门禁
99
+
100
+ ### 3.1 禁止提交
101
+
102
+ | 场景 | 处理方式 |
103
+ |------|----------|
104
+ | 包含 `.only` / `.skip` 测试标记 | 拒绝合并 |
105
+ | 含有 `console.log` / `debugger` 残留 | 拒绝合并 |
106
+ | 含有硬编码密钥/token | 拒绝合并 + 安全告警 |
107
+ | 未通过 ESLint/Prettier 检查 | 拒绝合并 |
108
+ | 未运行测试或测试失败 | 拒绝合并 |
109
+ | 无关联 Issue 的独立提交 | 警告但不阻止(hotfix 除外)|
110
+
111
+ ### 3.2 Squash 策略
112
+
113
+ - Feature 分支合并到 develop 时 **Squash** 为一个 commit
114
+ - Hotfix 分支合并到 main 时保留完整历史
115
+ - Squash 后的 commit message 以 PR Title 为准
116
+
117
+ ### 3.3 Commit Message 示例库
118
+
119
+ ```
120
+ # 功能开发
121
+ feat(user): 实现用户头像上传与裁剪功能
122
+ feat(notification): 添加站内消息实时推送(WebSocket)
123
+
124
+ # Bug 修复
125
+ fix(login): 修复记住登录状态在 Safari 下失效的问题
126
+ fix(api): 解决并发请求导致的竞态条件
127
+
128
+ # 文档更新
129
+ docs(readme): 更新本地开发环境搭建指南
130
+ docs(api): 补充批量接口的请求示例
131
+
132
+ # 重构
133
+ refactor(state): 将 Vuex store 迁移为 Pinia
134
+ refactor(component): 抽离 DataTable 为通用组件
135
+
136
+ # 性能优化
137
+ perf(list): 虚拟滚动替换长列表渲染(10000+ 条数据)
138
+
139
+ # 测试
140
+ test(user): 补充用户权限边界用例
141
+ test(e2e): 添加购物车结算全流程测试
142
+
143
+ # 依赖管理
144
+ chore(deps): 升级 Vue3 到最新补丁版本
145
+ chore(deps): 更新 TypeScript 至 5.x
146
+ ```
147
+
148
+ ## 4. Git 分支策略
149
+
150
+ ```
151
+ main (生产环境)
152
+ ↑ merge (fast-forward or squash)
153
+ develop (开发集成分支)
154
+ ↑ merge (PR/MR)
155
+ feature/description-xxx (功能分支)
156
+ bugfix/description-xxx (Bug 修复分支)
157
+ hotfix/description-xxx (紧急热修复,直接从 main 分出)
158
+
159
+ release/x.y.z (发布准备分支)
160
+ ```
161
+
162
+ **分支生命周期**:
163
+ - feature/bugfix 分支存在不超过 **2 周**
164
+ - 超期未合入需申请延期或关闭重建
165
+ - 合并后删除远程分支(保护 main/develop)
@@ -0,0 +1,192 @@
1
+ # 流程纪律规则 (process-discipline)
2
+
3
+ > **级别**: 必须遵守 | **适用范围**: 全局
4
+
5
+ > 本规则定义 Harness 工作流中的纪律约束,确保多 Agent 协作时的秩序和质量。
6
+
7
+ ---
8
+
9
+ ## 1. 代码修改三步验证
10
+
11
+ **任何代码修改完成后,必须依次完成以下三步才能进入下一阶段:**
12
+
13
+ ```
14
+ Step 1: 编译通过(Build Pass)
15
+
16
+ Step 2: 测试通过(Test Pass)
17
+
18
+ Step 3: 自检验证(Self-Check Pass)
19
+
20
+ 进入代码审查阶段
21
+ ```
22
+
23
+ ### 1.1 各步骤的具体要求
24
+
25
+ | 步骤 | 命令/动作 | 通过标准 |
26
+ |------|-----------|----------|
27
+ | **编译通过** | `npm run build` / `tsc --noEmit` | 零编译错误 |
28
+ | **测试通过** | `npm run test` | 全部用例 PASS,覆盖率不低于基线 |
29
+ | **自检验证** | `npm run lint` + `npm run gate` | 零 warning(白名单外)|
30
+
31
+ ### 1.2 违反后果
32
+
33
+ 跳过任何一步 → **代码审查 Agent 直接打回** → 记录一次流程违规
34
+
35
+ 连续 3 次流程违规 → **闸门总控 Agent 触发人工介入审查**
36
+
37
+ ---
38
+
39
+ ## 2. 文档修改权责规则
40
+
41
+ ### 2.1 核心原则:**下游不得修改上游文档**
42
+
43
+ ```
44
+ 需求分析 → 方案设计 → 开发实现 → 代码审查 → 测试验证
45
+ ↑ │
46
+ └───── 下游可以提Issue,但不得直接改 ─┘
47
+ ```
48
+
49
+ | 角色 | 可以修改 | 不能修改 |
50
+ |------|----------|----------|
51
+ | 方案设计师 | 设计文档 | 需求文档 |
52
+ | 开发者 | 实现笔记 | 需求文档、设计文档 |
53
+ | 代码审查员 | 审查报告 | 需求文档、设计文档、实现代码的业务逻辑 |
54
+ | 测试人员 | 测试报告 | 需求文档(验收标准除外)|
55
+
56
+ ### 2.2 变更请求流程
57
+
58
+ 如果下游发现问题需要上游修正:
59
+
60
+ ```markdown
61
+ ## 变更请求模板(由下游角色发起)
62
+
63
+ ### 来源阶段
64
+ - 当前角色:[developer / code-reviewer / tester]
65
+ - 发现问题的阶段:[requirements-analysis / solution-design]
66
+
67
+ ### 问题描述
68
+ - [具体描述发现的矛盾/遗漏/错误]
69
+
70
+ ### 建议修改内容
71
+ - [建议上游如何调整]
72
+
73
+ ### 影响评估
74
+ - [如果不改,对当前阶段的影响]
75
+ - [如果修改,对已完成工作的回溯影响]
76
+ ```
77
+
78
+ **变更请求提交后,由 PM 路由给对应上游角色裁决。**
79
+
80
+ ---
81
+
82
+ ## 3. PM 边界约束
83
+
84
+ ### 3.1 PM 角色的核心职责
85
+
86
+ PM Agent 的职责是**路由和协调**,不是技术判断:
87
+
88
+ | ✅ 应该做的 | ❌ 禁止做的 |
89
+ |-------------|------------|
90
+ | 接收需求,分配给需求分析师 | 直接指定技术实现方案 |
91
+ | 追踪各阶段进度 | 评价代码质量好坏 |
92
+ | 维护 TaskBoard 看板 | 越过闸门总控强行推进 |
93
+ | 组织评审会议 | 修改技术文档的内容细节 |
94
+ | 处理跨角色协作冲突 | 给出具体的技术选型决定 |
95
+
96
+ ### 3.2 违规检测
97
+
98
+ 以下行为将被标记为 **PM 越界**:
99
+
100
+ 1. **技术干预**:PM 在非路由决策中给出具体的技术指令
101
+ ```
102
+ ❌ "这个功能应该用 Redis 缓存"
103
+ ✅ "性能要求是响应时间 < 200ms,请方案设计师评估技术方案"
104
+ ```
105
+
106
+ 2. **绕过流程**:PM 直接跳过某个阶段推进任务
107
+ ```
108
+ ❌ "这个简单,直接让开发做吧,不需要方案设计"
109
+ ✅ "这是一个小改动,走文档/配置微型流程变体"
110
+ ```
111
+
112
+ 3. **修改产出物**:PM 直接编辑需求文档以外的其他文档
113
+
114
+ ---
115
+
116
+ ## 4. 交付完整性规则
117
+
118
+ ### 4.1 每个阶段的交付清单
119
+
120
+ | 阶段 | 必须交付物 | 可选交付物 |
121
+ |------|-----------|-----------|
122
+ | **需求分析** | 需求文档(含验收标准)、TaskBoard 更新 | 竞品分析 |
123
+ | **方案设计** | 技术设计文档、接口定义 | ADR 决策记录 |
124
+ | **开发实现** | 代码(已 Commit)、单元测试、dev-map 更新 | 技术笔记 |
125
+ | **代码审查** | 审查报告(PASS/FAIL 结论 + 逐项打分) | 重构建议 |
126
+ | **测试验证** | 测试报告(覆盖范围 + 结果 + 缺陷列表) | 性能报告 |
127
+
128
+ ### 4.2 交付物质量标准
129
+
130
+ - 所有文档必须是 **Markdown 格式**
131
+ - 代码必须有 **JSDoc 注释**(公开 API)
132
+ - 测试必须有 **清晰的用例描述**(describe/it)
133
+ - 审查报告必须有 **量化评分**
134
+
135
+ ---
136
+
137
+ ## 5. 并发与冲突处理规则
138
+
139
+ ### 5.1 多任务并行约束
140
+
141
+ | 约束 | 规则 |
142
+ |------|------|
143
+ | 同一需求的各阶段 | **串行**执行(不允许并行) |
144
+ | 不同需求的同阶段 | **允许并行** |
145
+ | 同一模块的不同需求 | **谨慎并行**(注意合并冲突)|
146
+ | 紧急 hotfix | **独占通道**(其他任务暂停或排队)|
147
+
148
+ ### 5.2 合并冲突处理
149
+
150
+ ```
151
+ 1. 发现冲突 → 停止当前任务,先解决冲突
152
+ 2. 解决冲突 → 重新跑 Step 1-3(编译+测试+自检)
153
+ 3. 冲突解决后 → 继续原有流程
154
+ 4. 如果冲突涉及核心架构 → 提交给闸门总控评估
155
+ ```
156
+
157
+ ---
158
+
159
+ ## 6. 时间与时效规则
160
+
161
+ | 时效要求 | 限制 |
162
+ |----------|------|
163
+ | Feature 分支存活时间 | ≤ 14 天 |
164
+ | PR/MR 响应时间(审查员) | ≤ 24 小时(工作日)|
165
+ | PR/MR 响应时间(开发者修反馈) | ≤ 48 小时 |
166
+ | 阻塞升级时限 | 超过 24 小时未解决 → 自动升级到 PM |
167
+ | 需求文档有效期 | 批准后 30 天内必须进入开发,否则重新评估 |
168
+
169
+ ---
170
+
171
+ ## 7. 违规记录与奖惩
172
+
173
+ ### 7.1 违规分级
174
+
175
+ | 级别 | 定义 | 后果 |
176
+ |------|------|------|
177
+ | 🟡 警告 | 轻微偏离流程,未造成实质影响 | 记录警告,不阻断流程 |
178
+ | 🟠 严重 | 跳过关键环节,可能影响质量 | 当次任务打回重来 |
179
+ | 🔴 致命 | 违反安全红线或导致线上事故 | 阻断 + 人工介入 + 事后复盘 |
180
+
181
+ ### 7.2 违规统计
182
+
183
+ 每周汇总违规数据,纳入度量指标:
184
+
185
+ ```yaml
186
+ metrics:
187
+ process_compliance_rate: # 流程合规率(目标 > 95%)
188
+ avg_cycle_time: # 平均交付周期
189
+ rework_rate: # 返工率
190
+ pm_boundary_violations: # PM 越界次数
191
+ downstream_edit_incidents: # 下游修改上游次数
192
+ ```
@@ -0,0 +1,306 @@
1
+ # 安全红线规则 (security-baseline)
2
+
3
+ > **级别**: **红线 — 违反即阻塞** | **适用范围**: 全局
4
+
5
+ > ⚠️ 本规则定义的安全底线**不可绕过、不可协商**。任何违反将触发:
6
+ > - 门禁脚本自动 FAIL(D 类检查项)
7
+ > - 自动打回到开发者 Agent
8
+ > - 安全告警通知技术负责人
9
+
10
+ ---
11
+
12
+ ## 1. 密钥与凭证管理(绝对红线)
13
+
14
+ ### 1.1 禁止行为
15
+
16
+ ```bash
17
+ # 🔴 严重违规 — 以下任何一项都将导致门禁直接 FAIL
18
+ ❌ 代码中包含硬编码密钥/API Key/Token
19
+ ❌ 代码中包含数据库密码/连接串
20
+ ❌ .env 文件被提交到仓库
21
+ ❌ 凭证出现在日志输出中
22
+ ❌ 凭证通过 URL 参数传递
23
+ ❌ 在前端代码中嵌入任何服务端凭证
24
+ ```
25
+
26
+ ### 1.2 正确做法
27
+
28
+ ```typescript
29
+ // ✅ 正确:使用环境变量
30
+ const dbUrl = process.env.DATABASE_URL;
31
+
32
+ // ✅ 正确:使用密钥管理服务
33
+ const secret = await secretsManager.get('JWT_SECRET');
34
+
35
+ // ✅ 正确:前后端分离,凭证只在服务器端
36
+ // API Key 通过服务端代理转发,不暴露给前端
37
+ ```
38
+
39
+ ### 1.3 凭证分类
40
+
41
+ | 凭证类型 | 存储位置 | 读取方式 | 轮转周期 |
42
+ |----------|----------|----------|----------|
43
+ | 数据库密码 | K8s Secret / Vault | 环境变量注入 | 90 天 |
44
+ | JWT Secret | Vault / AWS Secrets Manager | 启动时加载 | 90 天 |
45
+ | 第三方 API Key | Vault / 环境变量 | 运行时获取 | 按供应商策略 |
46
+ | OAuth ClientSecret | Vault | 启动时加载 | 不轮转(轮转需重新授权) |
47
+
48
+ ---
49
+
50
+ ## 2. 输入验证与注入防护
51
+
52
+ ### 2.1 SQL 注入防护
53
+
54
+ ```typescript
55
+ // ❌ 禁止:字符串拼接 SQL
56
+ const query = `SELECT * FROM users WHERE id = ${userId}`;
57
+
58
+ // ✅ 正确:使用参数化查询
59
+ const query = 'SELECT * FROM users WHERE id = $1';
60
+ await db.query(query, [userId]);
61
+ ```
62
+
63
+ ### 2.2 XSS 防护(前端)
64
+
65
+ ```vue
66
+ <!-- ❌ 危险:v-html 直接渲染用户输入 -->
67
+ <div v-html="userInput"></div>
68
+
69
+ <!-- ✅ 安全:Vue3 模板默认自动转义插值 -->
70
+ <div>{{ userInput }}</div>
71
+
72
+ <!-- ✅ 如需渲染富文本:先 sanitize -->
73
+ import DOMPurify from 'dompurify';
74
+ <div v-html="DOMPurify.sanitize(richText)"></div>
75
+ ```
76
+
77
+ ### 2.3 CSRF 防护
78
+
79
+ - 所有状态变更请求必须携带 CSRF Token 或使用 SameSite Cookie
80
+ - API 必须验证 Origin / Referer header
81
+ - 敏感操作(删除、支付等)需要二次确认
82
+
83
+ ### 2.4 命令注入防护
84
+
85
+ ```javascript
86
+ // ❌ 危险:用户输入直接拼接到命令
87
+ exec(`convert ${fileName} -resize 100x100 output.jpg`);
88
+
89
+ // ✅ 安全:使用参数列表形式
90
+ execFile('convert', [fileName, '-resize', '100x100', 'output.jpg']);
91
+ ```
92
+
93
+ ---
94
+
95
+ ## 3. 国密 SM4 加密要求
96
+
97
+ > **来源**: `files/java-backend-coding-standards/SKILL.md` §12 安全规范 | **归档日期**: 2026-05-21
98
+
99
+ ### 3.1 强制加密存储
100
+
101
+ | 数据类型 | 加密算法 | 要求 |
102
+ |---------|---------|------|
103
+ | 手机号 | 国密 SM4 | 存储前加密,读取时解密 |
104
+ | 身份证号 | 国密 SM4 | 全字段加密存储 |
105
+ | 密码 | bcrypt(不可逆哈希) | cost ≥ 12 |
106
+ | 银行卡号 | 国密 SM4 | 仅存后4位明文,其余加密 |
107
+
108
+ **强制**: 敏感信息必须使用国密 SM4 算法加密后存库,禁止明文存储。
109
+
110
+ ### 3.2 预编译强制要求(SQL 注入防护细化)
111
+
112
+ | 规则 | 要求 | 违规后果 |
113
+ |------|------|----------|
114
+ | MyBatis `#{}` | 必须 使用 `#{}` 预编译参数绑定 | **安全红线 FAIL** |
115
+ | 禁止 `${}` | 禁止 `${}` 直接拼接 SQL 字符串 | **安全红线 FAIL** |
116
+ | 例外场景 | 动态表名等特殊场景必须有白名单校验 + Code Review 确认 | 需审批 |
117
+
118
+ ---
119
+
120
+ ## 4. API 响应脱敏要求
121
+
122
+ > **来源**: `files/java-backend-coding-standards/SKILL.md` §11.2 | **归档日期**: 2026-05-21
123
+
124
+ 通过 RespVO 返回用户敏感数据时,后端 **必须** 自动脱敏:
125
+
126
+ | 数据类型 | 脱敏格式 | 示例 |
127
+ |---------|---------|------|
128
+ | 手机号 | 中间4位替换为 * | `138****1234` |
129
+ | 密码 | 返回 null 或 `******` | null / `******` |
130
+ | 邮箱 | @ 前部分脱敏 | `u***@example.com` |
131
+ | 身份证号 | 中间替换为 * | `110***********1234` |
132
+ | 银行卡号 | 仅显示后4位 | `************5678` |
133
+
134
+ ---
135
+
136
+ ## 5. Redis 安全要求
137
+
138
+ > **来源**: `files/java-backend-coding-standards/SKILL.md` §8 Redis 规范 | **归档日期**: 2026-05-21
139
+
140
+ | # | 规则 | 要求 | 违规后果 |
141
+ |---|------|------|----------|
142
+ | RS-01 | TTL 强制 | 写入 Redis 数据必须 设置 TTL(过期时间) | Gate FAIL |
143
+ | RS-02 | Hash 容量限制 | 单个 Hash 的 field 数量 ≤ 50000 | WARNING |
144
+ | RS-03 | Key 命名规范 | Key 定义在 `RedisKeyConstants` 常量类,格式为 `模块:业务:唯一标识` | WARNING |
145
+ | RS-04 | 定位限制 | Redis 仅用于缓存用途,禁止作为持久存储 | FAIL |
146
+
147
+ ---
148
+
149
+ ## 6. 日志脱敏要求
150
+
151
+ > **来源**: `files/AI_RULE.md` (A35) + `files/java-backend-coding-standards/SKILL.md` §7 日志规范 | **归档日期**: 2026-05-21
152
+
153
+ | # | 规则 | 要求 |
154
+ |---|------|------|
155
+ | LOG-01 | 敏感信息禁明文 | 密码/token/密钥/手机号/身份证等敏感信息禁止明文打日志 |
156
+ | LOG-02 | 占位符输出 | 必须使用 `{}` 参数化方式,禁字符串拼接 |
157
+ | LOG-03 | 异常对象保留 | catch 时异常对象 e 必须保留在日志中(`log.error("描述", e)`)|
158
+ | LOG-04 | 日志大小限制 | 单条日志不超过 1KB,大对象序列化为摘要 |
159
+ | LOG-05 | 链路追踪 | 必须包含 traceId 和 spanId |
160
+
161
+ ---
162
+
163
+ ## 7. Shell 脚本安全要求
164
+
165
+ > **来源**: `files/AI_RULE.md` (A37) | **归档日期**: 2026-05-21
166
+
167
+ | 规则 | 要求 |
168
+ |------|------|
169
+ | 禁止明文密码 | Shell/Bash 脚本中禁止出现明文密码或密钥 |
170
+ | 凭证获取方式 | 必须通过环境变量或密钥管理服务获取凭证 |
171
+ | 脚本权限 | 敏感脚本设置最小必要权限(chmod 700/500)|
172
+
173
+ ---
174
+
175
+ ## 8. 认证与授权
176
+
177
+ ### 8.1 认证要求
178
+
179
+ | 要求 | 标准 |
180
+ |------|------|
181
+ | 密码存储 | bcrypt / argon2 哈希(cost ≥ 12) |
182
+ | 密码策略 | 最少 8 位,含大小写+数字+特殊字符 |
183
+ | 登录限流 | 5 次/分钟,超过锁定 15 分钟 |
184
+ | 会话管理 | JWT Access Token(15min)+ Refresh Token(7天)|
185
+ | MFA 支持 | 敏感操作必须启用 MFA |
186
+
187
+ ### 8.2 授权要求
188
+
189
+ ```typescript
190
+ // ✅ 正确:每个 API 端点都要做权限校验
191
+ @UseGuards(JwtAuthGuard, RolesGuard)
192
+ @Roles(Role.ADMIN)
193
+ @Delete('/users/:id')
194
+ async deleteUser(@Param('id') id: string) {
195
+ // 业务逻辑
196
+ }
197
+
198
+ // ✅ 正细粒度:资源级权限检查
199
+ async updateProject(userId: string, projectId: string) {
200
+ await this.ensureProjectMember(userId, projectId);
201
+ // 只有项目成员才能编辑
202
+ }
203
+ ```
204
+
205
+ ### 8.3 数据隔离
206
+
207
+ - 多租户数据必须强制 tenant_id 过滤
208
+ - 行级安全(RLS):数据库层面也要兜底
209
+ - 禁止 `SELECT *` 无条件查询
210
+
211
+ ---
212
+
213
+ ## 9. 依赖安全
214
+
215
+ ### 9.1 依赖扫描流程
216
+
217
+ ```bash
218
+ # 每次 PR 必须执行
219
+ npm audit --audit-level=moderate
220
+
221
+ # Gate 脚本 D 类检查项会自动执行此命令
222
+ # 发现 HIGH/CRITICAL 漏洞 → 门禁 FAIL
223
+ ```
224
+
225
+ ### 9.2 依赖版本管理
226
+
227
+ | 操作 | 要求 |
228
+ |------|------|
229
+ | 新增依赖 | 必须确认许可证兼容性(MIT/Apache-2.0/BSD)|
230
+ | 升级依赖 | 先在分支验证,不能直接在 main 升级 |
231
+ | 移除依赖 | 确认无残留引用 |
232
+ | 锁定文件 | `package-lock.json` 必须提交入库 |
233
+
234
+ ### 9.3 许可证黑名单
235
+
236
+ 以下许可证**禁止引入**:
237
+
238
+ - GPL-3.0(传染性开源协议)
239
+ - AGPL-3.0
240
+ - 任何商业许可证未授权的付费包
241
+
242
+ ---
243
+
244
+ ## 10. 数据安全
245
+
246
+ ### 10.1 敏感数据处理
247
+
248
+ | 数据类型 | 处理要求 |
249
+ |----------|----------|
250
+ | 手机号 | 脱敏显示:138****1234 |
251
+ | 身份证号 | 不记录明文,哈希存储 |
252
+ | 银行卡号 | 只显示后 4 位 |
253
+ | 密码 | 永远不记录日志 |
254
+ | 地址 | 按 GDPR/个人信息保护法最小必要原则 |
255
+
256
+ ### 10.2 日志安全
257
+
258
+ ```typescript
259
+ // ❌ 禁止:日志中包含敏感字段
260
+ logger.info('User login', { email, password, phone });
261
+
262
+ // ✅ 正确:脱敏或排除敏感字段
263
+ logger.info('User login', {
264
+ email: maskEmail(email),
265
+ userId,
266
+ // password 绝对不记录
267
+ });
268
+ ```
269
+
270
+ ### 10.3 HTTPS 与传输加密
271
+
272
+ - 生产环境强制 HTTPS(HSTS 启用)
273
+ - Cookie 设置 `Secure; HttpOnly; SameSite=Strict`
274
+ - API 通信使用 TLS 1.2+
275
+ - 禁止自签名证书(开发环境除外)
276
+
277
+ ---
278
+
279
+ ## 11. 安全响应流程
280
+
281
+ 发现安全问题后的处理步骤:
282
+
283
+ ```
284
+ 1. 立即停止相关功能的部署/发布
285
+ 2. 评估影响范围(受影响用户/数据)
286
+ 3. 在 24 小时内完成修复并 hotfix 上线
287
+ 4. 记录安全事件报告(存入 dev-map/security-incidents.md)
288
+ 5. 复盘根因,补充 Rule/Skill 防止再犯
289
+ ```
290
+
291
+ ---
292
+
293
+ ## 安全检查清单(Gate Scripts D 类引用)
294
+
295
+ - [ ] 无硬编码密钥/Token/密码
296
+ - [ ] 无 SQL 注入风险(全部 `#{}` 预编译)
297
+ - [ ] 无 XSS 风险(输入正确转义)
298
+ - [ ] 依赖审计无 HIGH/CRITICAL 漏洞
299
+ - [ ] 认证/授权中间件齐全
300
+ - [ ] 日志不含敏感信息
301
+ - [ ] HTTPS/HSTS 正确配置
302
+ - [ ] 敏感数据正确脱敏处理
303
+ - [ ] [新增] 敏感数据已 SM4 加密存储
304
+ - [ ] [新增] Redis key 已设置 TTL
305
+ - [ ] [新增] Shell 脚本无明文密码
306
+ - [ ] [新增] API 响应数据已按格式脱敏