jsharness 1.5.0 → 1.6.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 (37) hide show
  1. package/.harness/agents/developer/contract.yaml +1 -1
  2. package/.harness/agents/prompt-templates.md +28 -4
  3. package/.harness/agents/solution-designer/contract.yaml +84 -28
  4. package/.harness/dev-map/backend/api-definition.md +10 -12
  5. package/.harness/dev-map/backend/auth-security.md +53 -28
  6. package/.harness/dev-map/backend/conventions-java.md +72 -60
  7. package/.harness/dev-map/backend/conventions.md +127 -163
  8. package/.harness/dev-map/backend/structure.md +142 -92
  9. package/.harness/dev-map/decisions.md +1 -1
  10. package/.harness/dev-map/frontend/structure.md +1 -1
  11. package/.harness/dev-map/overview.md +10 -9
  12. package/.harness/gate/checks/static-compliance.js +2 -2
  13. package/.harness/gate/checks/test-compliance.js +4 -4
  14. package/.harness/rules/global/coding-standard.md +15 -8
  15. package/.harness/rules/global/commit-convention.md +7 -0
  16. package/.harness/rules/global/design-document-boundary.md +115 -0
  17. package/.harness/rules/global/process-discipline.md +7 -0
  18. package/.harness/rules/global/security-baseline.md +27 -23
  19. package/.harness/rules/project/frontend-vue3.md +9 -0
  20. package/.harness/rules/project/java-backend.md +129 -22
  21. package/.harness/rules/project/web-specific.md +27 -14
  22. package/.harness/skills/architecture-designer/SKILL.md +768 -0
  23. package/.harness/skills/{build.md → build/SKILL.md} +7 -0
  24. package/.harness/skills/{code-review.md → code-review/SKILL.md} +7 -0
  25. package/.harness/skills/{docker-build.md → docker-build/SKILL.md} +7 -0
  26. package/.harness/skills/{docs-update.md → docs-update/SKILL.md} +7 -0
  27. package/.harness/skills/{java-build.md → java-build/SKILL.md} +12 -2
  28. package/.harness/skills/{lint-check.md → lint-check/SKILL.md} +7 -0
  29. package/.harness/skills/{task-board-maintenance.md → task-board-maintenance/SKILL.md} +7 -0
  30. package/.harness/skills/{test-api.md → test-api/SKILL.md} +21 -14
  31. package/.harness/skills/{test-e2e.md → test-e2e/SKILL.md} +7 -0
  32. package/.harness/skills/{test-unit.md → test-unit/SKILL.md} +50 -44
  33. package/.harness/skills/{vue-frontend-build.md → vue-frontend-build/SKILL.md} +11 -0
  34. package/.harness/workflow/definition.yaml +37 -3
  35. package/bin/jsharness.js +1 -0
  36. package/lib/index.mjs +306 -27
  37. package/package.json +2 -1
@@ -57,7 +57,7 @@ Step 9: 创建 PR/MR(附上变更说明)
57
57
  | 维度 | 前端标准 | 后端 (Java) 标准 | 引用规则 |
58
58
  |------|---------|----------------|----------|
59
59
  | 类型安全 | strict mode, no `any` | 泛型 + 无 RawType + Optional 非空检查 | coding-standard A3/A28 |
60
- | 函数复杂度 | ≤ 50 行, 圈复杂度 ≤ 10 | ≤ 80 行, 圈复杂度 ≤ 15 | coding-standard A03 |
60
+ | 函数复杂度 | ≤ 50 行, 圈复杂度 ≤ 10 | ≤ 80 行, 圈复杂度 ≤ 10 | coding-standard A03 |
61
61
  | 测试覆盖率 | 新代码 ≥ 85% (Vitest) | 新代码 ≥ 80% (JaCoCo) | test-unit / java-backend §13 |
62
62
  | 提交规范 | Conventional Commits | Conventional Commits | commit-convention |
63
63
  | 安全合规 | 无硬编码凭证、参数化查询 | SM4 加密存储、SQL 预编译、脱敏返回 | security-baseline / java-backend §11 |
@@ -97,6 +97,7 @@
97
97
  - 你负责基于需求文档输出完整的技术方案
98
98
  - 你是连接"做什么"和"怎么实现"的关键环节
99
99
  - 你的方案将直接指导开发者的编码工作
100
+ - 你在架构设计阶段引用 architecture-designer skill 获取完整设计模板
100
101
 
101
102
  ## 你的输入
102
103
  - 需求文档(来自需求分析师)
@@ -106,25 +107,45 @@
106
107
 
107
108
  ## 你的输出(必须全部交付)
108
109
  1. 技术设计文档(design-{task-id}.md)
110
+ - **必须先判断需求复杂度**(简单 vs 复杂,参见 design-document-boundary 规则 §3)
111
+ - 简单需求(< 3000 行):简化模板,单体架构,Context+Container 层
112
+ - 复杂需求(≥ 3000 行):完整模板,C4模型+限界上下文+领域模型
109
113
  - 架构设计、接口定义、数据模型
110
- - 关键实现逻辑(文字描述)
114
+ - 关键实现逻辑(文字描述,非代码)
111
115
  - 影响面分析和风险
112
- 2. API 定义(api-definition.yaml
113
- 3. 数据模型设计(data-model.md
116
+ 2. API 定义(api-definition.yaml)— 每服务独立 OpenAPI 3.0 YAML
117
+ 3. 数据模型设计(data-model.md)— ER图 + 领域模型描述
114
118
  4. 如有新的技术决策 → ADR 记录
115
119
 
116
120
  ## 你的约束
117
121
  - ❌ 不写可执行代码
118
122
  - ❌ 不修改需求文档
119
123
  - ❌ 不做最终可行性判决(那是闸门的活)
124
+ - ❌ 设计文档禁止包含代码/测试/监控/日志/部署/数据库优化(参见 design-document-boundary 规则)
120
125
  - ✅ 必须参考 dev-map 中的已有约定
121
126
  - ✅ 接口定义必须足够详细,可供开发者和测试者直接使用
127
+ - ✅ 必须先判断需求复杂度再选择设计深度
128
+ - ✅ 引用 architecture-designer skill 获取 C4模型、领域模型、类图等完整设计规范
122
129
 
123
130
  ## 设计原则
124
131
  - 优先复用 dev-map 中的已有模式
125
- - 接口设计遵循 RESTful 规范
132
+ - 接口设计遵循 RESTful 规范 + OpenAPI 3.0
126
133
  - 考虑向前兼容性
127
134
  - 注明所有假设条件和依赖
135
+ - 支持国产化:数据库选型明确 MySQL/达梦 DM8,国产化场景优先达梦
136
+
137
+ ## 技术栈
138
+ - 后端: Spring Boot 3.x + JDK21 + MyBatis-Plus + Nacos 3.0
139
+ - 数据库: MySQL 8.0 / 达梦 DM8(国产化场景)
140
+ - 缓存: Redis
141
+ - 前端: Vue3 + TypeScript + Element Plus
142
+
143
+ ## 关键参考文件
144
+ - skills/architecture-designer/SKILL.md — 架构设计完整模板
145
+ - rules/global/design-document-boundary.md — 设计文档边界约束 + 复杂度分流
146
+ - rules/project/java-backend.md — 后端编码规范
147
+ - rules/project/frontend-vue3.md — 前端编码规范
148
+ - rules/global/security-baseline.md — 安全红线
128
149
  ```
129
150
 
130
151
  ---
@@ -237,6 +258,9 @@
237
258
  - JDK21 虚拟线程中 **禁止 synchronized**,改用 ReentrantLock
238
259
  - 事务范围最小化,外部 HTTP/文件操作放事务外
239
260
  - 敏感数据 SM4 加密存储,API 返回脱敏
261
+ - 数据库选型:MySQL 8.0 / 达梦 DM8(国产化场景),设计文档必须明确标注
262
+ - 服务注册到 Nacos 3.0,配置从 Nacos 动态拉取
263
+ - 服务级别标注 L0-L3,核心服务必须高可用
240
264
  - **参考规则**: `.harness/rules/project/java-backend.md`
241
265
  ```
242
266
 
@@ -9,28 +9,36 @@ max_turns: 15 # 方案设计可能需要深入讨论
9
9
 
10
10
  ### 主要职责
11
11
  1. **技术方案设计** — 基于需求文档输出完整的技术方案
12
- 2. **接口设计**定义前后端接口契约(API Schema)
13
- 3. **数据模型设计**定义数据库表结构和关系
14
- 4. **风险评估**识别技术风险点和应对策略
15
- 5. **dev-map 参考** 查阅现有模块,避免重复造轮子
12
+ 2. **架构设计**引用 architecture-designer skill 进行 C4 模型、限界上下文、领域模型设计
13
+ 3. **接口设计**定义前后端接口契约(OpenAPI 3.0 / API Schema)
14
+ 4. **数据模型设计**定义数据库表结构、关系和 ER 图
15
+ 5. **风险评估**识别技术风险点和应对策略
16
+ 6. **dev-map 参考** — 查阅现有模块,避免重复造轮子
16
17
 
17
18
  ### 输入
18
- | 输入来源 | 格式 | 说明 |
19
- |----------|------|------|
20
- | 需求文档 | requirements-{id}.md | 需求分析师的产出 |
21
- | 验收标准 | acceptance-criteria.md | 需要满足的条件 |
22
- | dev-map 现有架构 | dev-map/**/* | 既有模块和模式参考 |
23
- | ADR 决策记录 | dev-map/decisions.md | 已有的重要技术决策 |
19
+ || 输入来源 | 格式 | 说明 |
20
+ ||----------|------|------|
21
+ || 需求文档 | requirements-{id}.md | 需求分析师的产出 |
22
+ || 验收标准 | acceptance-criteria.md | 需要满足的条件 |
23
+ || dev-map 现有架构 | dev-map/**/* | 既有模块和模式参考 |
24
+ || ADR 决策记录 | dev-map/decisions.md | 已有的重要技术决策 |
24
25
 
25
26
  ### 输出(必须交付物)
26
- | 产出物 | 格式 | 说明 |
27
- |--------|------|------|
28
- | **技术设计文档** | design-{task-id}.md | 完整的技术方案 |
29
- | **API 定义** | api-definition.yaml | OpenAPI/Swagger 规范 |
30
- | **数据模型** | data-model.md | ER 图文字描述 + 迁移计划 |
31
- | **技术决策记录** | decisions.md | 本方案中的 ADR(如有新决策)|
27
+ || 产出物 | 格式 | 说明 |
28
+ ||--------|------|------|
29
+ || **技术设计文档** | design-{task-id}.md | 完整的技术方案(参见 architecture-designer skill 模板)|
30
+ || **API 定义** | api-definition.yaml | OpenAPI 3.0 规范(每服务独立文件)|
31
+ || **数据模型** | data-model.md | ER + 领域模型描述 + 迁移计划 |
32
+ || **技术决策记录** | decisions.md | 本方案中的 ADR(如有新决策)|
32
33
 
33
34
  ### 技术设计文档模板
35
+
36
+ > **重要**: 完整的模板、C4 架构图规范、领域模型设计规范参见 `skills/architecture-designer/SKILL.md`
37
+ > 以下为文档结构概要,具体内容格式以 skill 为准。
38
+
39
+ **第一步**: 判断需求复杂度(参见 `rules/global/design-document-boundary.md` §3)
40
+
41
+ **简单需求**(预估 < 3000 行)模板:
34
42
  ```markdown
35
43
  # 技术设计方案:{需求标题}
36
44
 
@@ -38,38 +46,86 @@ max_turns: 15 # 方案设计可能需要深入讨论
38
46
  - 一句话总结方案
39
47
  - 涉及的技术栈和组件
40
48
 
41
- ## 2. 架构设计
42
- - 整体架构图(Mermaid/文字描述)
49
+ ## 2. 架构设计(简化)
50
+ - 整体架构图(Context + Container 层)
43
51
  - 组件职责划分
44
52
  - 数据流向
45
53
 
46
54
  ## 3. 接口设计
47
55
  - RESTful API 端点列表
48
56
  - 请求/响应格式
49
- - 错误码定义
50
57
 
51
58
  ## 4. 数据模型
52
- - 表结构设计(新增/修改的表)
53
- - 字段说明
59
+ - ER 图
60
+ - 表结构设计
54
61
  - 索引策略
55
62
 
56
63
  ## 5. 关键实现逻辑
57
- - 核心算法/流程的文字描述(非代码)
58
- - 状态机定义(如果有)
59
- - 并发控制策略
64
+ - 核心流程的文字描述(非代码)
60
65
 
61
66
  ## 6. 影响面分析
62
- - 需要修改的现有文件
63
- - 可能影响的其他功能
64
- - 数据库迁移脚本
65
67
 
66
68
  ## 7. 风险与缓解
67
- | 风险 | 影响 | 概率 | 缓解措施 |
69
+ ```
70
+
71
+ **复杂需求**(预估 ≥ 3000 行)模板:
72
+ ```markdown
73
+ # 技术设计方案:{需求标题}
74
+
75
+ ## 1. 概述
76
+ - 一句话总结方案
77
+ - 技术栈选择理由
78
+
79
+ ## 2. 用例图
80
+ - UML UseCase 图(Mermaid)
81
+ - 关键用例描述
82
+
83
+ ## 3. 架构设计
84
+ - C4 模型(Context → Container → Component 三层)
85
+ - 架构分层(表示层/业务层/数据层)
86
+
87
+ ## 4. 限界上下文划分
88
+ - 上下文映射图
89
+ - 上下文间通信方式
90
+
91
+ ## 5. 服务设计
92
+ - 服务拆分表(含服务级别 L0-L3)
93
+ - 服务间通信(同步/异步)
94
+
95
+ ## 6. 领域模型设计
96
+ - 聚合根、实体、值对象描述
97
+ - 领域事件定义
98
+ - 领域模型到 ER 图映射
99
+
100
+ ## 7. 接口设计
101
+ - 每服务独立 OpenAPI 3.0 YAML
102
+ - 统一响应格式
103
+
104
+ ## 8. 数据模型
105
+ - ER 图
106
+ - 表结构设计(含通用字段)
107
+ - 索引策略
108
+
109
+ ## 9. 类图设计
110
+ - 核心聚合根类图
111
+ - 仓储接口类图
112
+
113
+ ## 10. 数据架构
114
+ - 数据存储策略
115
+ - 数据一致性策略
116
+ - 数据库选型(MySQL / 达梦 DM8)
117
+
118
+ ## 11. 影响面分析
119
+
120
+ ## 12. 风险与缓解
68
121
  ```
69
122
 
70
123
  ## 边界约束
71
124
  - ❌ 不写可执行的实现代码(那是开发者的事)
72
125
  - ❌ 不修改需求文档内容(走变更请求流程)
73
126
  - ❌ 不做最终可行性判决(那是闸门的职责)
127
+ - ❌ 设计文档禁止包含代码/测试/监控/日志/部署/数据库优化(参见 `rules/global/design-document-boundary.md`)
74
128
  - ✅ 必须参考 dev-map 中已有的模式和约定
75
129
  - ✅ 必须定义清晰的接口契约供开发和测试使用
130
+ - ✅ 必须先判断需求复杂度再选择设计深度(简单 vs 复杂模板)
131
+ - ✅ 引用 `skills/architecture-designer/SKILL.md` 获取完整设计模板和规范
@@ -25,7 +25,7 @@ POST /api/v1/orders/:id/cancel # 取消订单
25
25
  POST /api/v1/auth/refresh # 刷新 Token
26
26
 
27
27
  # 过滤/排序/分页
28
- GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
28
+ GET /api/v1/users?role=admin&pageNo=1&pageSize=20&sort=createdAt-desc
29
29
  ```
30
30
 
31
31
  ### 统一响应格式
@@ -34,7 +34,7 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
34
34
 
35
35
  ```json
36
36
  {
37
- "code": 0,
37
+ "code": 200,
38
38
  "data": { ... },
39
39
  "message": "success",
40
40
  "timestamp": 1700000000000
@@ -45,15 +45,13 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
45
45
 
46
46
  ```json
47
47
  {
48
- "code": 0,
48
+ "code": 200,
49
49
  "data": {
50
- "items": [ ... ],
51
- "pagination": {
52
- "page": 1,
53
- "pageSize": 20,
54
- "total": 150,
55
- "totalPages": 8
56
- }
50
+ "list": [ ... ],
51
+ "total": 150,
52
+ "pageNo": 1,
53
+ "pageSize": 20,
54
+ "pages": 8
57
55
  },
58
56
  "message": "success",
59
57
  "timestamp": 1700000000000
@@ -64,7 +62,7 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
64
62
 
65
63
  ```json
66
64
  {
67
- "code": 20001,
65
+ "code": 400,
68
66
  "message": "参数校验失败",
69
67
  "details": [
70
68
  {
@@ -99,7 +97,7 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
99
97
 
100
98
  | 参数 | 类型 | 默认值 | 说明 |
101
99
  |------|------|--------|------|
102
- | `page` | integer | 1 | 页码(从 1 开始)|
100
+ | `pageNo` | integer | 1 | 页码(从 1 开始)|
103
101
  | `pageSize` | integer | 20 | 每页数量(最大 100)|
104
102
  | `sort` | string | `-createdAt` | 排序字段(`-` 表示降序)|
105
103
 
@@ -62,21 +62,42 @@
62
62
  | `viewer` | 只读访问 | 只读用户 |
63
63
  | `user` | 自身数据的读写 | 普通注册用户 |
64
64
 
65
- ### 权限守卫实现
66
-
67
- ```typescript
68
- @UseGuards(JwtAuthGuard)
69
- @Roles(Role.ADMIN, Role.EDITOR)
70
- @Controller('admin/posts')
71
- export class AdminPostController {
72
- // 只有 admin 和 editor 才能访问
73
- @Post()
74
- createPost() {}
65
+ ### Spring Security 权限校验实现
66
+
67
+ ```java
68
+ // ========== 权限注解使用 ==========
69
+ @RestController
70
+ @RequestMapping("/api/v1/admin/users")
71
+ @RequiredArgsConstructor
72
+ public class AdminUserController {
73
+
74
+ @PreAuthorize("hasRole('ADMIN') or hasRole('SUPER_ADMIN')")
75
+ @GetMapping
76
+ @Operation(summary = "分页查询用户(后台管理)")
77
+ public CommonResult<PageResult<UserRespVO>> page(@Valid UserPageReqVO reqVO) {
78
+ return success(userService.getUserPage(reqVO));
79
+ }
80
+
81
+ @PreAuthorize("hasRole('SUPER_ADMIN')")
82
+ @DeleteMapping("/{id}")
83
+ @Operation(summary = "删除用户")
84
+ public CommonResult<Boolean> delete(@PathVariable("id") Long id) {
85
+ userService.deleteUser(id);
86
+ return success(true);
87
+ }
75
88
  }
76
89
 
77
- @Roles(Role.ADMIN) // 只有 admin
78
- @Delete(':id')
79
- deletePost() {}
90
+ // ========== 方法级资源权限校验 ==========
91
+ @Service
92
+ @RequiredArgsConstructor
93
+ public class ProjectServiceImpl implements ProjectService {
94
+
95
+ @Override
96
+ @PreAuthorize("hasPermission(#projectId, 'project', 'edit')")
97
+ public void updateProject(Long projectId, ProjectUpdateReqVO reqVO) {
98
+ // 只有项目成员才能编辑
99
+ }
100
+ }
80
101
  ```
81
102
 
82
103
  ### 权限矩阵
@@ -90,42 +111,46 @@ deletePost() {}
90
111
  | 数据查看 | ✅ | ✅ | ✅ | ✅ | 自身 |
91
112
  | 系统配置 | ✅ | ❌ | ❌ | ❌ | ❌ |
92
113
 
93
- ## 安全中间件链
114
+ ## Spring Security 过滤器链
94
115
 
95
116
  ```
96
117
  请求进入
97
118
 
98
- ├── Helmet (安全头设置)
119
+ ├── SecurityHeadersFilter (安全头设置)
99
120
  │ ├── X-Frame-Options: DENY
100
121
  │ ├── X-Content-Type-Options: nosniff
101
122
  │ └── X-XSS-Protection: 1; mode=block
102
123
 
103
- ├── Rate Limiter (速率限制)
124
+ ├── RateLimitFilter (速率限制 — 基于 Redis + Redisson)
104
125
  │ ├── 全局: 100 req/min
105
126
  │ ├── 登录: 5 req/min (同一 IP)
106
127
  │ └── API: 60 req/min (同一用户)
107
128
 
108
- ├── CORS (跨域控制)
129
+ ├── CorsFilter (跨域控制 — Spring 配置)
109
130
  │ ├── Allow-Origin: [白名单]
110
131
  │ ├── Allow-Methods: GET,POST,PUT,DELETE
111
132
  │ └── Credentials: true
112
133
 
113
- ├── JwtAuthGuard (JWT 认证)
114
- │ ├── 白名单路径跳过: /health, /public/*
115
- │ └── 提取 payload注入 request.user
134
+ ├── JwtAuthenticationFilter (JWT 认证)
135
+ │ ├── 白名单路径跳过: /health, /public/*, /api/v1/auth/login
136
+ │ └── 解析 Token设置 SecurityContext
116
137
 
117
- └── RolesGuard (角色鉴权)
118
- ├── 检查用户角色是否匹配 @Roles()
138
+ └── @PreAuthorize (方法级鉴权)
139
+ ├── 检查用户角色是否匹配
119
140
  └── 不匹配 → 403 Forbidden
120
141
  ```
121
142
 
122
143
  ## 安全 Checklist
123
144
 
124
- - [ ] 所有敏感接口都有认证保护
145
+ - [ ] 所有敏感接口都有认证保护(`@PreAuthorize`)
125
146
  - [ ] Password 使用 bcrypt (cost ≥ 12) 哈希存储
126
- - [ ] Refresh Token 支持吊销(logout 时失效)
147
+ - [ ] 敏感数据(手机号/身份证)使用国密 SM4 加密存储
148
+ - [ ] Refresh Token 支持吊销(logout 时从 DB 删除)
127
149
  - [ ] 登录限制:连续 5 次失败锁定 15 分钟
128
- - [ ] CSRF Token 保护写操作(如果使用 Cookie)
129
- - [ ] SQL 注入防护:全部参数化查询
130
- - [ ] XSS 防护:输出转义、CSP 策略
131
- - [ ] 日志脱敏:不记录 password/token 等敏感字段
150
+ - [ ] CSRF 防护:SameSite Cookie 或 CSRF Token
151
+ - [ ] SQL 注入防护:MyBatis 全部使用 `#{}` 预编译参数绑定
152
+ - [ ] XSS 防护:响应数据脱敏、CSP 策略
153
+ - [ ] 日志脱敏:不记录 password/token/手机号明文等敏感字段
154
+ - [ ] API 响应脱敏:手机号中间4位*、身份证中间*、密码返回 null
155
+ - [ ] Redis key 必须设置 TTL,禁止永不过期
156
+ - [ ] 虚拟线程中禁止使用 synchronized,改用 ReentrantLock