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,192 @@
1
+ # 项目构建技能 (build)
2
+
3
+ > ⚠️ **已废弃 (DEPRECATED)** — `harness-java-fullchain` change | 2026-05-21
4
+ >
5
+ > 本文件已被技术栈专属构建技能替代。**请根据项目类型使用对应的 Skill:**
6
+ >
7
+ > | 项目类型 | 推荐使用 Skill | 说明 |
8
+ > |---------|---------------|------|
9
+ > | **Vue3 + Vite 前端** | `skills/vue-frontend-build.md` | 完整的 Vite/TS/ESLint/Vitest/构建优化 |
10
+ > | **Spring Boot (JDK21) 后端** | `skills/java-build.md` | 完整的 Maven/测试/JaCoCo/Docker/CI 流程 |
11
+ >
12
+ > ---
13
+ > 以下内容保留作为**通用参考/历史存档**,workflow 已切换为按技术栈条件引用上述专属 Skill。
14
+
15
+ ---
16
+
17
+ > **执行角色**: 开发实现 Agent / CI Pipeline
18
+ > **触发时机**: 代码修改完成后、提交 PR 前、CI 构建时
19
+
20
+ ---
21
+
22
+ ## 前端构建流程
23
+
24
+ ### Step 1: 依赖安装
25
+ ```bash
26
+ # 使用 pnpm(推荐)或 npm
27
+ pnpm install
28
+
29
+ # 检查依赖安全
30
+ npm audit --audit-level=moderate
31
+ ```
32
+
33
+ **通过标准**: 安装无 error,无 HIGH/CRITICAL 安全漏洞
34
+
35
+ ### Step 2: 类型检查
36
+ ```bash
37
+ # TypeScript 严格模式类型检查
38
+ npx tsc --noEmit
39
+
40
+ # 或使用项目配置的命令
41
+ npm run type-check
42
+ ```
43
+
44
+ **通过标准**: 零 type error
45
+
46
+ ### Step 3: 代码格式化检查
47
+ ```bash
48
+ # ESLint 检查
49
+ npx eslint . --ext .ts,.vue,.js --max-warnings 0
50
+
51
+ # Prettier 格式化验证
52
+ npx prettier --check "src/**/*.{ts,vue,js,css,md}"
53
+ ```
54
+
55
+ **通过标准**: 零 warning(白名单规则除外)
56
+
57
+ ### Step 4: 生产构建
58
+ ```bash
59
+ # Vue3 + Vite(推荐)
60
+ npm run build
61
+
62
+ # 或具体命令
63
+ vite build # Vite
64
+ ```
65
+
66
+ ### Step 5: 构建产物分析(可选但推荐)
67
+ ```bash
68
+ # 分析打包体积
69
+ npx @next/analyze # Next.js
70
+ npx rollup-plugin-visualizer # Vite/Webpack
71
+
72
+ # 通过标准:
73
+ # - 首屏 JS ≤ 200KB (gzip)
74
+ # - 单 chunk ≤ 100KB (gzip)
75
+ ```
76
+
77
+ **通过标准**: 构建成功,退出码 0,产物体积在限制内
78
+
79
+ ---
80
+
81
+ ## 后端编译流程
82
+
83
+ ### Step 1: 编译检查
84
+ ```bash
85
+ # TypeScript 后端(如 NestJS)
86
+ npx tsc --noEmit
87
+
88
+ # Java (Maven)
89
+ mvn compile
90
+
91
+ # Go
92
+ go build ./...
93
+ ```
94
+
95
+ **通过标准**: 编译零错误
96
+
97
+ ### Step 2: Lint 检查
98
+ ```bash
99
+ # NestJS / Node.js
100
+ npx eslint . --ext .ts
101
+
102
+ # Java
103
+ mvn checkstyle:check
104
+
105
+ # Go
106
+ golangci-lint run ./...
107
+ ```
108
+
109
+ **通过标准**: 零 warning(可配置的白名单)
110
+
111
+ ---
112
+
113
+ ## TypeScript 类型检查专项
114
+
115
+ ### 配置要求
116
+
117
+ ```jsonc
118
+ // tsconfig.json 必须启用
119
+ {
120
+ "compilerOptions": {
121
+ "strict": true,
122
+ "noImplicitAny": true,
123
+ "strictNullChecks": true,
124
+ "strictFunctionTypes": true,
125
+ "noUncheckedIndexedAccess": true
126
+ }
127
+ }
128
+ ```
129
+
130
+ ### any 类型使用规范
131
+
132
+ | 场景 | 是否允许 | 要求 |
133
+ |------|---------|------|
134
+ | 新增代码 | 禁止 | 必须定义明确类型 |
135
+ | 遗留系统重构 | 有条件允许 | 必须注释 `// TODO(#issue): replace with proper type` |
136
+ | 第三方类型缺失 | 允许 | 封装一层并定义接口 |
137
+ | JSON.parse 结果 | 禁止 | 使用泛型或 Zod 校验 |
138
+
139
+ ---
140
+
141
+ ## 构建失败处理策略
142
+
143
+ ```
144
+ 构建失败
145
+
146
+ ├── 依赖安装失败 → 检查 lockfile 一致性 / 清缓存重试 / 检查网络
147
+
148
+ ├── 类型错误 → 定位错误位置 → 修复类型 → 重新运行
149
+ │ └── 如果是第三方库类型问题 → 添加 type declaration
150
+
151
+ ├── Lint 错误 → 运行 `--fix` 自动修复 → 手动修复剩余项
152
+
153
+ ├── 生产构建失败 → 检查 build log → 定位问题 → 修复
154
+ │ └── 常见原因:动态 import 路径错误 / 环境变量缺失
155
+
156
+ └── 体积超限 → 分析 bundle → 排查大依赖 → 懒加载 / tree-shaking
157
+ ```
158
+
159
+ ## 构建结果输出模板
160
+
161
+ ```yaml
162
+ build_result:
163
+ timestamp: "2026-05-20T22:00:00Z"
164
+ status: pass | fail
165
+ duration_seconds: 45
166
+
167
+ frontend:
168
+ typecheck:
169
+ errors: 0
170
+ warnings: 0
171
+ lint:
172
+ errors: 0
173
+ warnings: 0
174
+ build:
175
+ success: true
176
+ output_size_kb:
177
+ total: 180
178
+ gzip: 62
179
+
180
+ backend:
181
+ compile:
182
+ success: true
183
+ lint:
184
+ errors: 0
185
+ warnings: 2
186
+
187
+ security_audit:
188
+ critical: 0
189
+ high: 0
190
+ moderate: 3
191
+ low: 5
192
+ ```
@@ -0,0 +1,251 @@
1
+ # 代码审查技能 (code-review)
2
+
3
+ > **执行角色**: 代码审查 Agent
4
+ > **触发时机**: 开发者提交 PR/MR 后、合并前
5
+
6
+ ---
7
+
8
+ ## 审查逐项检查清单
9
+
10
+ ### A 类:代码质量(必须全部通过)
11
+
12
+ | # | 检查项 | 标准 | 权重 |
13
+ |---|--------|------|------|
14
+ | A1 | **命名规范** | 符合 coding-standard.md 中的命名约定 | ⭐⭐⭐ |
15
+ | A2 | **函数复杂度** | 单函数 ≤ 50 行,圈复杂度 ≤ 10 | ⭐⭐⭐ |
16
+ | A3 | **类型安全** | 无裸 `any`,TypeScript strict 模式通过 | ⭐⭐⭐ |
17
+ | A4 | **错误处理** | try-catch 完善,有明确的错误传播链 | ⭐⭐⭐ |
18
+ | A5 | **代码重复** | 无明显的复制粘贴(DRY 原则) | ⭐⭐ |
19
+ | A6 | **死代码** | 无未使用的导入、变量、函数 | ⭐⭐ |
20
+
21
+ ### B 类:规范遵循(必须全部通过)
22
+
23
+ | # | 检查项 | 标准 | 权重 |
24
+ |---|--------|------|------|
25
+ | B1 | **提交规范** | Commit Message 符合 Conventional Commits | ⭐⭐ |
26
+ | B2 | **分支策略** | 分支名称符合 feature/description-issue 格式 | ⭐ |
27
+ | B3 | **PR 描述完整** | 含变更说明+测试方案+影响范围 | ⭐⭐⭐ |
28
+ | B4 | **文档同步** | dev-map 相关部分已更新 | ⭐⭐ |
29
+ | B5 | **CHANGELOG** | 用户可见的功能已更新 CHANGELOG | ⭐ |
30
+
31
+ ### C 类:安全与风险(一票否决)
32
+
33
+ | # | 检查项 | 标准 | 权重 |
34
+ |---|--------|------|------|
35
+ | C1 | **无硬编码凭证** | 无密钥/token/密码出现在代码中 | 🔴 |
36
+ | C2 | **注入防护** | SQL 参数化、XSS 转义、输入校验到位 | 🔴 |
37
+ | C3 | **敏感数据处理** | 日志脱敏、传输加密 | 🔴 |
38
+ | C4 | **依赖安全** | 无新的 HIGH/CRITICAL 漏洞引入 | 🔴 |
39
+ | C5 | **权限控制** | 新增 API 有适当的认证/授权 | 🔴 |
40
+
41
+ ### D 类:性能考量(建议性)
42
+
43
+ | # | 检查项 | 标准 | 权重 |
44
+ |---|--------|------|------|
45
+ | D1 | **N+1 查询** | 无明显的 N+1 问题(循环中查询数据库)| ⭐⭐ |
46
+ | D2 | **内存泄漏** | 事件监听器/定时器正确清理 | ⭐⭐ |
47
+ | D3 | **大数据处理** | 列表使用虚拟滚动/分页 | ⭐ |
48
+ | D4 | **包体积** | 新增依赖评估对 bundle size 的影响 | ⭐ |
49
+
50
+ ### E 类:测试覆盖(必须通过)
51
+
52
+ | # | 检查项 | 标准 | 权重 |
53
+ |---|--------|------|------|
54
+ | E1 | **单元测试** | 新增/修改代码有对应单测 | ⭐⭐⭐ |
55
+ | E2 | **覆盖率** | 新代码覆盖率 ≥ 85% | ⭐⭐⭐ |
56
+ | E3 | **测试质量** | 测试有意义(非假断言)| ⭐⭐ |
57
+
58
+ ---
59
+
60
+ ## 变更影响面分析
61
+
62
+ ### 影响范围评估矩阵
63
+
64
+ ```yaml
65
+ change_impact_analysis:
66
+ pr_number: "#123"
67
+ changed_files_count: 12
68
+ insertions: 450
69
+ deletions: 120
70
+
71
+ affected_modules:
72
+ - name: "用户模块"
73
+ files: ["src/features/user/*.ts"]
74
+ risk_level: high
75
+ impact_reason: "认证逻辑变更,可能影响所有登录流程"
76
+
77
+ - name: "API 层"
78
+ files: ["src/api/user.ts", "src/api/auth.ts"]
79
+ risk_level: medium
80
+ impact_reason: "新增了两个接口端点"
81
+
82
+ cross_module_dependencies:
83
+ - from: "订单模块"
84
+ to: "用户模块"
85
+ coupling_type: "API 调用"
86
+ needs_verification: true
87
+ note: "订单创建时会调用用户服务"
88
+
89
+ regression_risk_score: 7 # 1-10 分制
90
+ recommended_reviewers:
91
+ - "backend-team-lead"
92
+ - "security-reviewer"
93
+ ```
94
+
95
+ ---
96
+
97
+ ## 审查报告输出格式
98
+
99
+ ```markdown
100
+ # Code Review Report — PR #123: feat(auth): JWT 双 Token 刷新机制
101
+
102
+ ## 总评: **CONDITIONAL PASS** ✅🟡
103
+
104
+ | 维度 | 得分 | 状态 |
105
+ |------|------|------|
106
+ | 代码质量 (A) | 18/20 | PASS |
107
+ | 规范遵循 (B) | 13/15 | PASS |
108
+ | 安全风险 (C) | 5/5 | PASS |
109
+ | 性能考量 (D) | 4/5 | PASS |
110
+ | 测试覆盖 (E) | 7/10 | WARNING |
111
+
112
+ **综合评分: 47/55 (85%)**
113
+
114
+ ---
115
+
116
+ ## 必修问题(合并前必须解决)
117
+
118
+ ### 🔴 C5: 新增刷新接口缺少权限中间件
119
+ - **文件**: `src/api/auth/refresh.ts:15`
120
+ - **现状**: `/api/v1/auth/refresh` 未添加 `@UseGuards(JwtAuthGuard)`
121
+ - **风险**: 攻击者可能利用 refresh token 进行越权操作
122
+ - **要求**: 添加 RefreshTokenGuard,限制调用频率
123
+
124
+ ### ⚠️ E2: `refreshToken()` 函数缺少错误路径测试
125
+ - **文件**: `src/services/auth.test.ts`
126
+ - **现状**: 只覆盖了正常刷新路径
127
+ - **要求**: 补充 token 过期、token 被撤销、并发刷新等异常场景
128
+
129
+ ---
130
+
131
+ ## 建议改进(本次可不改,记录到技术债)
132
+
133
+ ### 💡 D1: 可考虑将 token 存储迁移至 HttpOnly Cookie
134
+ - 当前方案 localStorage 在 XSS 场景下有风险
135
+ - 可作为独立优化任务跟进
136
+
137
+ ---
138
+
139
+ ## 结论
140
+
141
+ **审查结论**: CONDITIONAL_PASS — 解决 2 个必修问题后可通过
142
+
143
+ **审查人**: code-reviewer-agent
144
+ **审查耗时**: 12 分钟
145
+ **下次审查时间**: 修正后自动触发
146
+ ```
147
+
148
+ ---
149
+
150
+ ## 打回条件
151
+
152
+ 以下任一条件满足时,**直接打回(FAIL)**:
153
+
154
+ 1. **C 类任何一项不通过**(安全红线)
155
+ 2. **A 类得分 < 60%**
156
+ 3. **PR 描述缺失或不完整**(B3 不通过且拒绝补充)
157
+ 4. **无测试覆盖的新功能代码**(E1 不通过)
158
+ 5. **影响面过大未拆分**(单 PR 超过 1000 行增量且无合理理由)
159
+ 6. **基线对比出现 REGRESSION**(测试覆盖率下降超过 5%)
160
+
161
+ ---
162
+
163
+ ## 前后端技术栈专项检查
164
+
165
+ > **来源**: `files/java-backend-coding-standards/SKILL.md` + `files/frontend-project-conventions/SKILL.md`
166
+ > **归档日期**: 2026-05-21
167
+
168
+ ### Java 后端专项检查(22 项)
169
+
170
+ #### JB-A: 架构与分层检查(4 项)
171
+
172
+ | # | 检查项 | 标准 | 权重 |
173
+ |---|--------|------|------|
174
+ | JB-A1 | Controller 薄层 | Controller 只做路由和校验,无业务逻辑 | 🔴 |
175
+ | JB-A2 | Service 编排 | Service 做业务编排(非 CRUD 直通 Mapper) | ⭐⭐⭐ |
176
+ | JB-A3 | Mapper 纯接口 | Mapper 不继承 BaseMapper,复杂 SQL 在 XML 中 | ⭐⭐ |
177
+ | JB-A4 | 依赖方向正确 | 无循环/反向/跨层跳跃依赖 | 🔴 |
178
+
179
+ #### JB-B: 命名与规范检查(5 项)
180
+
181
+ | # | 检查项 | 标准 | 权重 |
182
+ |---|--------|------|------|
183
+ | JB-B1 | 包名规范 | 必须为 `com.jieshun`(禁止 `com.jscicd`) | ⭐ |
184
+ | JB-B2 | 类后缀标准 | 符合 9 种标准后缀(Entity/DTO/VO/ReqVO/RespVO/Enum/Service/ServiceImpl/Controller/Mapper)| ⭐⭐ |
185
+ | JB-B3 | Javadoc 注释 | public 类有完整 Javadoc | ⭐ |
186
+ | JB-B4 | 方法命名清晰 | 动词开头,语义明确表达意图 | ⭐⭐ |
187
+ | JB-B5 | 常量风格 | 使用 UPPER_SNAKE_CASE | ⭐ |
188
+
189
+ #### JB-C: 参数与返回值检查(4 项)
190
+
191
+ | # | 检查项 | 标准 | 权重 |
192
+ |---|--------|------|------|
193
+ | JB-C1 | JSR303 校验 | Controller 参数有 `@Valid` / `@Validated` 注解 | ⭐⭐⭐ |
194
+ | JB-C2 | ReqVO/RespVO | 使用 ReqVO 入参、RespVO 出参分层传递 | ⭐⭐⭐ |
195
+ | JB-C3 | 禁 Map/Entity | 禁止 Map 和 Entity 直接暴露 | 🔴 |
196
+ | JB-C4 | Result 封装 | 返回值用统一 Result/CommonResult 封装 | ⭐⭐ |
197
+
198
+ #### JB-D: 数据库与 SQL 检查(3 项)
199
+
200
+ | # | 检查项 | 标准 | 权重 |
201
+ |---|--------|------|------|
202
+ | JB-D1 | SQL 预编译 | 使用 `#{}` 预编译参数绑定(防注入)| 🔴 |
203
+ | JB-D2 | 分页拦截器 | 分页使用拦截器自动 LIMIT,非手动写 | ⭐⭐ |
204
+ | JB-D3 | ALTER 脚本 | 表结构变更必须有 ALTER 脚本(禁删重建)| ⭐ |
205
+
206
+ #### JB-E: 安全与质量检查(6 项)
207
+
208
+ | # | 检查项 | 标准 | 权重 |
209
+ |---|--------|------|------|
210
+ | JB-E1 | SM4 加密存储 | 敏感数据(手机号/身份证等)SM4 加密 | 🔴 |
211
+ | JB-E2 | RespVO 脱敏 | 手机号/邮箱/身份证按格式脱敏 | 🔴 |
212
+ | JB-E3 | Redis TTL | Redis key 必须设置过期时间 | ⭐⭐ |
213
+ | JB-E4 | 参数化日志 | 日志使用 `{}` 占位符,禁字符串拼接 | ⭐⭐ |
214
+ | JB-E5 | 事务最小化 | @Transactional 范围最小化,外部调用放事务外 | ⭐⭐⭐ |
215
+ | JB-E6 | 虚拟线程无 synchronized | JDK21 虚拟线程中无 synchronized(改 ReentrantLock)| 🔴 |
216
+
217
+ ### Vue3 前端专项检查
218
+
219
+ #### FV-A: Composition API 与 TypeScript(4 项)
220
+
221
+ | # | 检查项 | 标准 | 权重 |
222
+ |---|--------|------|------|
223
+ | FV-A1 | Composition API 强制 | 只允许 `<script setup lang="ts">`,禁止 Options API | 🔴 |
224
+ | FV-A2 | 类型安全 | Props 用 TS interface 定义,禁止裸 any | ⭐⭐⭐ |
225
+ | FV-A3 | Pinia 类型完整 | Store state/getters/actions 有明确类型标注 | ⭐⭐ |
226
+ | FV-A4 | 导出类型规范 | 组件导出类型与文件命名一致 | ⭐ |
227
+
228
+ #### FV-B: Element Plus 规范(3 项)
229
+
230
+ | # | 检查项 | 标准 | 权重 |
231
+ |---|--------|------|------|
232
+ | FV-B1 | 消息提示 | 使用 ElMessage/ElMessageBox,不自行实现 toast | ⭐⭐ |
233
+ | FV-B2 | 加载状态 | 使用 v-loading 指令,非手动控制变量 | ⭐ |
234
+ | FV-B3 | 图标包裹 | 图标组件包裹在容器标签中 | ⭐ |
235
+
236
+ #### FV-C: 命名与组织(3 项)
237
+
238
+ | # | 检查项 | 标准 | 权重 |
239
+ |---|--------|------|------|
240
+ | FV-C1 | 文件命名 | PascalCase 组件文件,kebab-case 目录 | ⭐⭐ |
241
+ | FV-C2 | 变量命名 | camelCase 变量/函数,UPPER_SNAKE_CASE 常量 | ⭐⭐ |
242
+ | FV-C3 | 布尔/事件命名 | is前缀布尔/handle前缀事件 | ⭐ |
243
+
244
+ ### 技术栈专项裁决补充
245
+
246
+ | 违规类型 | 默认处理 | 说明 |
247
+ |---------|---------|------|
248
+ | Java 架构分层违反(JB-A1/A4) | **C 类 FAIL** | 直接打回修复 |
249
+ | Java 安全违规(JB-D1, JB-E1/E2/E6) | **C 类 FAIL** | 安全红线 |
250
+ | Vue3 Options API(FV-A1) | **A 类扣分** | 每处 -10 分 |
251
+ | Vue3 裸 any 无注释(FV-A2) | **A 类扣分** | 每处 -5 分 |
@@ -0,0 +1,227 @@
1
+ # Docker 构建技能 (docker-build)
2
+
3
+ > **执行角色**: 开发实现 Agent / CI Pipeline
4
+ > **触发时机**: PR 合并到 develop/main 时、发布镜像时
5
+
6
+ ---
7
+
8
+ ## Dockerfile 构建执行
9
+
10
+ ### 构建命令
11
+
12
+ ```bash
13
+ # 构建镜像
14
+ docker build -t myapp:latest .
15
+
16
+ # 多阶段构建(生产环境推荐)
17
+ docker build -f Dockerfile.prod -t myapp:prod .
18
+
19
+ # 带构建参数
20
+ docker build \
21
+ --build-arg NODE_ENV=production \
22
+ --build-arg APP_VERSION=v1.2.3 \
23
+ -t myapp:v1.2.3 .
24
+
25
+ # 构建并验证容器可启动
26
+ docker build -t myapp:test . && \
27
+ docker run --rm -d -p 3000:3000 myapp:test && \
28
+ sleep 5 && \
29
+ curl -f http://localhost:3000/api/health && \
30
+ echo "Build OK" || echo "Build FAILED"
31
+ ```
32
+
33
+ ### Dockerfile 最佳实践模板(Node.js 多阶段构建)
34
+
35
+ ```dockerfile
36
+ # ============================================
37
+ # Stage 1: 构建阶段
38
+ # ============================================
39
+ FROM node:20-alpine AS builder
40
+
41
+ WORKDIR /app
42
+
43
+ # 先复制依赖定义文件,利用 Docker 缓存层
44
+ COPY package.json package-lock.json* ./
45
+
46
+ RUN npm ci --only=production=false
47
+
48
+ # 复制源码并构建
49
+ COPY . .
50
+ RUN npm run build
51
+
52
+ # ============================================
53
+ # Stage 2: 运行阶段(精简生产镜像)
54
+ # ============================================
55
+ FROM node:20-alpine AS runner
56
+
57
+ WORKDIR /app
58
+
59
+ # 创建非 root 用户
60
+ RUN addgroup --system --gid 1001 nodejs && \
61
+ adduser --system --uid 1001 nextjs
62
+
63
+ # 从构建阶段复制必要产物
64
+ COPY --from=builder /app/public ./public
65
+ COPY --from=builder --chown=nodejs:nodejs /app/.next/standalone ./
66
+ COPY --from=builder --chown=nodejs:nodejs /app/.next/static ./.next/static
67
+
68
+ USER nextjs
69
+
70
+ EXPOSE 3000
71
+ ENV PORT 3000
72
+ ENV HOSTNAME "0.0.0.0"
73
+
74
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
75
+ CMD node healthcheck.js || exit 1
76
+
77
+ CMD ["node", "server.js"]
78
+ ```
79
+
80
+ ---
81
+
82
+ ## 镜像标签规范
83
+
84
+ ### 标签策略
85
+
86
+ ```
87
+ 格式: {image-name}:{version}-{git-sha}
88
+
89
+ 示例:
90
+ myapp:v1.2.3-a1b2c3d # 正式版本
91
+ myapp:latest # 最新稳定版(指向 main 分支最新构建)
92
+ myapp:develop-abc1234 # 开发版
93
+ myapp:pr-123-def456 # PR 预览版
94
+ myapp:v1.2.3-rc.1-xyz789 # 候选发布版
95
+ ```
96
+
97
+ ### 强制元数据标签
98
+
99
+ ```bash
100
+ # 为镜像添加标准化元数据
101
+ docker build \
102
+ --label "org.opencontainers.image.title=MyApp" \
103
+ --label "org.opencontainers.image.version=v1.2.3" \
104
+ --label "org.opencontainers.image.created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
105
+ --label "org.opencontainers.image.revision=$(git rev-parse HEAD)" \
106
+ --label "org.opencontainers.image.source=https://github.com/org/myapp" \
107
+ -t myapp:v1.2.3 .
108
+ ```
109
+
110
+ ---
111
+
112
+ ## 镜像大小优化检查
113
+
114
+ ### 限制标准
115
+
116
+ | 镜像类型 | 最大大小 | 目标大小 |
117
+ |----------|---------|---------|
118
+ | 前端应用镜像 | 200 MB | < 150 MB |
119
+ | 后端 API 镜像 | 300 MB | < 200 MB |
120
+ | 全栈应用镜像 | 500 MB | < 350 MB |
121
+
122
+ ### 优化检查清单
123
+
124
+ ```bash
125
+ # 1. 检查镜像大小
126
+ docker images myapp:v1.2.3 --format "{{.Size}}"
127
+
128
+ # 2. 检查镜像层数
129
+ docker history myapp:v1.2.3 | wc -l
130
+ # 目标:< 15 层
131
+
132
+ # 3. 分析镜像内容(dive 工具)
133
+ dive myapp:v1.2.3
134
+
135
+ # 4. 检查安全漏洞
136
+ docker scan myapp:v1.2.3
137
+ # 或使用 Trivy
138
+ trivy image --severity HIGH,CRITICAL myapp:v1.2.3
139
+ ```
140
+
141
+ ### 优化技巧速查
142
+
143
+ | 技巧 | 效果 | 适用场景 |
144
+ |------|------|---------|
145
+ | **多阶段构建** | 减少 ~80% 体积 | 所有生产镜像 |
146
+ | **Alpine 基础镜像** | 减少 ~50% 体积 | 无 glibc 依赖的应用 |
147
+ | **.dockerignore** | 加速构建、减少上下文 | 所有项目 |
148
+ | **npm ci --omit=dev** | 不拷贝 devDependencies | 生产镜像 |
149
+ | **合并 RUN 指令** | 减少层数 | 多个 apt-get/install 步骤 |
150
+ | **清理缓存** | 减少 ~100MB+ | npm/pip/apt 后清理 cache |
151
+
152
+ ### .dockerignore 模板
153
+
154
+ ```
155
+ # Dependencies
156
+ node_modules
157
+ npm-debug.log
158
+ yarn-error.log
159
+
160
+ # Build output
161
+ .next
162
+ dist
163
+ build
164
+ coverage
165
+
166
+ # Development
167
+ .env
168
+ .env.local
169
+ .env.*.local
170
+
171
+ # IDE
172
+ .idea
173
+ .vscode
174
+ *.swp
175
+ *.swo
176
+
177
+ # VCS
178
+ .git
179
+ .gitignore
180
+
181
+ # Docs
182
+ README.md
183
+ LICENSE
184
+
185
+ # Harness(不需要进入镜像)
186
+ .harness/
187
+ openspec/
188
+ *.gate-report.json
189
+ ```
190
+
191
+ ---
192
+
193
+ ## Docker Build 结果输出模板
194
+
195
+ ```yaml
196
+ docker_build_result:
197
+ timestamp: "2026-05-20T22:00:00Z"
198
+ status: pass | fail
199
+
200
+ image:
201
+ name: "myapp"
202
+ tag: "v1.2.3-a1b2c3d"
203
+ size_mb: 145.3
204
+ layers: 11
205
+ base_image: "node:20-alpine"
206
+
207
+ optimization:
208
+ multi_stage: true
209
+ distroless: false
210
+ non_root_user: true
211
+
212
+ security_scan:
213
+ tool: "trivy"
214
+ critical: 0
215
+ high: 0
216
+ medium: 3
217
+ low: 8
218
+
219
+ verification:
220
+ container_start: true
221
+ health_check_pass: true
222
+ endpoint_response: 200
223
+
224
+ baseline_comparison:
225
+ size_delta_mb: -2.1 # 负数表示变小(好)
226
+ vulnerability_change: 0 # 不应增加
227
+ ```