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.
- package/.harness/README.md +199 -0
- package/.harness/agents/code-reviewer/contract.yaml +64 -0
- package/.harness/agents/developer/contract.yaml +72 -0
- package/.harness/agents/gate-controller/contract.yaml +64 -0
- package/.harness/agents/project-manager/contract.yaml +77 -0
- package/.harness/agents/prompt-templates.md +352 -0
- package/.harness/agents/requirements-analyst/contract.yaml +64 -0
- package/.harness/agents/solution-designer/contract.yaml +75 -0
- package/.harness/agents/tester/contract.yaml +92 -0
- package/.harness/config/models.yaml +67 -0
- package/.harness/dev-map/backend/api-definition.md +131 -0
- package/.harness/dev-map/backend/auth-security.md +131 -0
- package/.harness/dev-map/backend/conventions-java.md +471 -0
- package/.harness/dev-map/backend/conventions.md +192 -0
- package/.harness/dev-map/backend/database.md +106 -0
- package/.harness/dev-map/backend/structure.md +140 -0
- package/.harness/dev-map/decisions.md +275 -0
- package/.harness/dev-map/frontend/api-integration.md +139 -0
- package/.harness/dev-map/frontend/components.md +178 -0
- package/.harness/dev-map/frontend/conventions.md +416 -0
- package/.harness/dev-map/frontend/state-management.md +170 -0
- package/.harness/dev-map/frontend/structure.md +103 -0
- package/.harness/dev-map/overview.md +267 -0
- package/.harness/docs/integration-test-plan.md +248 -0
- package/.harness/docs/team-guidelines/README.md +161 -0
- package/.harness/docs/team-guidelines/arch-team.md +811 -0
- package/.harness/docs/team-guidelines/collaboration.md +556 -0
- package/.harness/docs/team-guidelines/pm-team.md +337 -0
- package/.harness/docs/team-guidelines/qa-team.md +562 -0
- package/.harness/docs/team-guidelines/rd-team.md +714 -0
- package/.harness/docs/training-materials.md +280 -0
- package/.harness/gate/baseline.js +220 -0
- package/.harness/gate/checks/build-gates-frontend.js +152 -0
- package/.harness/gate/checks/build-gates-java.js +155 -0
- package/.harness/gate/checks/build-gates.js +119 -0
- package/.harness/gate/checks/engineering-consistency.js +138 -0
- package/.harness/gate/checks/security-quality.js +129 -0
- package/.harness/gate/checks/static-compliance.js +313 -0
- package/.harness/gate/checks/test-compliance.js +114 -0
- package/.harness/gate/index.js +315 -0
- package/.harness/mcp/config.yaml +435 -0
- package/.harness/rules/global/coding-standard.md +232 -0
- package/.harness/rules/global/commit-convention.md +165 -0
- package/.harness/rules/global/process-discipline.md +192 -0
- package/.harness/rules/global/security-baseline.md +306 -0
- package/.harness/rules/project/frontend-vue3.md +293 -0
- package/.harness/rules/project/java-backend.md +460 -0
- package/.harness/rules/project/web-specific.md +231 -0
- package/.harness/skills/build.md +192 -0
- package/.harness/skills/code-review.md +251 -0
- package/.harness/skills/docker-build.md +227 -0
- package/.harness/skills/docs-update.md +164 -0
- package/.harness/skills/java-build.md +261 -0
- package/.harness/skills/lint-check.md +482 -0
- package/.harness/skills/task-board-maintenance.md +105 -0
- package/.harness/skills/test-api.md +461 -0
- package/.harness/skills/test-e2e.md +431 -0
- package/.harness/skills/test-unit.md +649 -0
- package/.harness/skills/vue-frontend-build.md +344 -0
- package/.harness/specs/quality-feedback/implementation-guide.md +350 -0
- package/.harness/task-board.md +121 -0
- package/.harness/workflow/definition.yaml +504 -0
- package/.harness/workflow/validate.js +320 -0
- package/.harness/workflow/variants.yaml +253 -0
- package/README.md +237 -0
- package/bin/jsharness.js +53 -0
- package/lib/index.mjs +778 -0
- package/package.json +1 -0
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
# 静态检查技能 (lint-check)
|
|
2
|
+
|
|
3
|
+
> **执行角色**: 开发实现 Agent / 代码审查 Agent / Gate Scripts
|
|
4
|
+
> **触发时机**: 每次 commit 前、PR 提交时、Gate 门禁检查时
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## ESLint / Prettier 执行
|
|
9
|
+
|
|
10
|
+
### 基础命令
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# ESLint 全量检查
|
|
14
|
+
npx eslint . --ext .ts,.tsx,.js,.jsx --max-warnings 0
|
|
15
|
+
|
|
16
|
+
# 只检查变更文件(推荐用于 Git Hooks)
|
|
17
|
+
npx eslint $(git diff --name-only --diff-filter=ACM | grep -E '\.(ts|tsx|js|jsx)$')
|
|
18
|
+
|
|
19
|
+
# Prettier 格式化检查
|
|
20
|
+
npx prettier --check "src/**/*.{ts,tsx,js,jsx,css,json,md}"
|
|
21
|
+
|
|
22
|
+
# 自动修复
|
|
23
|
+
npx eslint . --fix && npx prettier --write "src/**/*.{ts,tsx,js,jsx}"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### ESLint 配置基准(flat config 示例)
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
// eslint.config.js
|
|
30
|
+
import js from '@eslint/js';
|
|
31
|
+
import tseslint from 'typescript-eslint';
|
|
32
|
+
import vuePlugin from 'eslint-plugin-vue';
|
|
33
|
+
|
|
34
|
+
export default tseslint.config(
|
|
35
|
+
js.configs.recommended,
|
|
36
|
+
...tseslint.configs.recommended,
|
|
37
|
+
...vuePlugin.configs['flat/recommended'],
|
|
38
|
+
{
|
|
39
|
+
plugins: {
|
|
40
|
+
'vue': vuePlugin,
|
|
41
|
+
},
|
|
42
|
+
rules: {
|
|
43
|
+
// === 错误级别 ===
|
|
44
|
+
'no-console': 'error',
|
|
45
|
+
'no-debugger': 'error',
|
|
46
|
+
'no-unused-vars': 'error',
|
|
47
|
+
'@typescript-eslint/no-explicit-any': 'error',
|
|
48
|
+
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
|
|
49
|
+
|
|
50
|
+
// === Vue3 核心规则 ===
|
|
51
|
+
'vue/multi-word-component-names': 'off',
|
|
52
|
+
'vue/require-default-prop': 'off',
|
|
53
|
+
'vue/no-unused-vars': 'error',
|
|
54
|
+
'vue/no-mutating-props': 'error',
|
|
55
|
+
'vue/require-v-for-key': 'error',
|
|
56
|
+
|
|
57
|
+
// === 风格一致性 ===
|
|
58
|
+
'eqeqeq': ['error', 'always'],
|
|
59
|
+
'curly': ['error', 'all'],
|
|
60
|
+
'prefer-const': 'error',
|
|
61
|
+
'no-var': 'error',
|
|
62
|
+
},
|
|
63
|
+
ignores: [
|
|
64
|
+
'dist/**',
|
|
65
|
+
'node_modules/**',
|
|
66
|
+
'coverage/**',
|
|
67
|
+
'*.config.js',
|
|
68
|
+
'*.config.ts',
|
|
69
|
+
],
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 安全扫描(npm audit / SAST)
|
|
77
|
+
|
|
78
|
+
### npm Audit
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# 扫描依赖漏洞
|
|
82
|
+
npm audit
|
|
83
|
+
|
|
84
|
+
# JSON 格式输出(供 Gate 脚本解析)
|
|
85
|
+
npm audit --json
|
|
86
|
+
|
|
87
|
+
# 按级别过滤
|
|
88
|
+
# 门禁标准:HIGH 和 CRITICAL 必须 = 0
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 漏洞分级处理
|
|
92
|
+
|
|
93
|
+
| 严重程度 | 数量限制 | 处理方式 |
|
|
94
|
+
|----------|---------|----------|
|
|
95
|
+
| CRITICAL | **= 0** | 门禁 FAIL,立即修复 |
|
|
96
|
+
| HIGH | **= 0** | 门禁 FAIL,24 小时内修复 |
|
|
97
|
+
| MODERATE | ≤ 5 | 记录警告,下次迭代修复 |
|
|
98
|
+
| LOW | 不限 | 记录,低优先级跟踪 |
|
|
99
|
+
|
|
100
|
+
### Secret 扫描(Git History 检测)
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# 检测 git 历史中的密钥泄露
|
|
104
|
+
npx detect-secrets scan [--baseline .secrets.baseline]
|
|
105
|
+
|
|
106
|
+
# 或者使用 Gitleaks
|
|
107
|
+
gitleaks detect --source . -v
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**检测目标**:
|
|
111
|
+
- AWS Access Key / Secret Key
|
|
112
|
+
- GitHub Personal Access Token
|
|
113
|
+
- JWT Secret
|
|
114
|
+
- Database Connection Strings
|
|
115
|
+
- Private Keys (.pem, .key)
|
|
116
|
+
- API Keys (Google, Stripe, etc.)
|
|
117
|
+
- Passwords in URLs
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 结果汇总与分级
|
|
122
|
+
|
|
123
|
+
### 输出格式
|
|
124
|
+
|
|
125
|
+
```yaml
|
|
126
|
+
lint_result:
|
|
127
|
+
timestamp: "2026-05-20T22:00:00Z"
|
|
128
|
+
tool: "eslint + prettier + npm-audit + gitleaks"
|
|
129
|
+
overall_status: pass | warning | fail
|
|
130
|
+
|
|
131
|
+
categories:
|
|
132
|
+
eslint:
|
|
133
|
+
status: pass
|
|
134
|
+
errors: 0
|
|
135
|
+
warnings: 0
|
|
136
|
+
files_scanned: 142
|
|
137
|
+
|
|
138
|
+
prettier:
|
|
139
|
+
status: pass
|
|
140
|
+
unformatted_files: 0
|
|
141
|
+
|
|
142
|
+
security:
|
|
143
|
+
npm_audit:
|
|
144
|
+
critical: 0
|
|
145
|
+
high: 0
|
|
146
|
+
moderate: 2
|
|
147
|
+
low: 8
|
|
148
|
+
secret_scan:
|
|
149
|
+
findings: 0
|
|
150
|
+
secrets_found: []
|
|
151
|
+
|
|
152
|
+
details:
|
|
153
|
+
issues: [] # 空 = 通过
|
|
154
|
+
# issues:
|
|
155
|
+
# - file: "src/utils/helper.ts"
|
|
156
|
+
# line: 23
|
|
157
|
+
# rule: "no-console"
|
|
158
|
+
# severity: "error"
|
|
159
|
+
# message: "Unexpected console.log"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 状态判定规则
|
|
163
|
+
|
|
164
|
+
```javascript
|
|
165
|
+
function determineStatus(result) {
|
|
166
|
+
// FAIL 条件(任一满足即 FAIL)
|
|
167
|
+
if (result.eslint.errors > 0) return 'fail';
|
|
168
|
+
if (result.security.npm_audit.critical > 0) return 'fail';
|
|
169
|
+
if (result.security.npm_audit.high > 0) return 'fail';
|
|
170
|
+
if (result.security.secret_scan.findings > 0) return 'fail';
|
|
171
|
+
|
|
172
|
+
// WARNING 条件
|
|
173
|
+
if (result.eslint.warnings > 0) return 'warning';
|
|
174
|
+
if (result.prettier.unformatted_files > 0) return 'warning';
|
|
175
|
+
if (result.security.npm_audit.moderate > 5) return 'warning';
|
|
176
|
+
|
|
177
|
+
// PASS
|
|
178
|
+
return 'pass';
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 白名单机制
|
|
183
|
+
|
|
184
|
+
某些情况允许例外(需在 `.harness/config/lint-whitelist.yaml` 中登记):
|
|
185
|
+
|
|
186
|
+
```yaml
|
|
187
|
+
whitelist:
|
|
188
|
+
rules:
|
|
189
|
+
- rule: "no-console"
|
|
190
|
+
reason: "CLI 工具入口文件需要 console 输出"
|
|
191
|
+
files: ["src/cli/index.ts"]
|
|
192
|
+
expires: "2026-06-30" # 白名单必须有到期日
|
|
193
|
+
|
|
194
|
+
paths:
|
|
195
|
+
- path: "src/legacy/"
|
|
196
|
+
reason: "遗留代码重构中,计划 Q3 完成"
|
|
197
|
+
expires: "2026-09-30"
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
# ════════════════════════════════════════════════════════
|
|
203
|
+
# Java 后端静态检查(Checkstyle + PMD + SpotBugs)
|
|
204
|
+
# ════════════════════════════════════════════════════════
|
|
205
|
+
|
|
206
|
+
> **适用技术栈**: Spring Boot / JDK21
|
|
207
|
+
> **参考规则**: `rules/project/java-backend.md` §命名规范
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Checkstyle — 代码风格检查
|
|
212
|
+
|
|
213
|
+
### Maven 执行
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# 运行 Checkstyle 检查
|
|
217
|
+
mvn checkstyle:check
|
|
218
|
+
|
|
219
|
+
# 查看详细报告(不阻塞)
|
|
220
|
+
mvn checkstyle:checkstyle
|
|
221
|
+
|
|
222
|
+
# 报告位置
|
|
223
|
+
# target/site/checkstyle.html # HTML 可视化报告
|
|
224
|
+
# target/site/checkstyle-result.xml # XML 格式原始数据
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### 推荐规则集配置
|
|
228
|
+
|
|
229
|
+
| 规则集 | 适用场景 | 严格度 |
|
|
230
|
+
|--------|---------|--------|
|
|
231
|
+
| `google_checks.xml` | 通用 Java 项目 | 中等 |
|
|
232
|
+
| `sun_checks.xml` | Sun/Oracle 风格 | 较松 |
|
|
233
|
+
| **自定义** (推荐) | 公司内部标准 | **按规范** |
|
|
234
|
+
|
|
235
|
+
### pom.xml 插件配置(推荐)
|
|
236
|
+
|
|
237
|
+
```xml
|
|
238
|
+
<plugin>
|
|
239
|
+
<groupId>org.apache.maven.plugins</groupId>
|
|
240
|
+
<artifactId>maven-checkstyle-plugin</artifactId>
|
|
241
|
+
<version>3.3.1</version>
|
|
242
|
+
<configuration>
|
|
243
|
+
<configLocation>checkstyle/custom-checks.xml</configLocation>
|
|
244
|
+
<encoding>UTF-8</encoding>
|
|
245
|
+
<consoleOutput>true</consoleOutput>
|
|
246
|
+
<failsOnError>true</failsOnError>
|
|
247
|
+
<!-- 排除自动生成的代码 -->
|
|
248
|
+
<excludes>**/entity/**,**/dto/**,**/vo/**</excludes>
|
|
249
|
+
</configuration>
|
|
250
|
+
<executions>
|
|
251
|
+
<execution>
|
|
252
|
+
<id>validate</id>
|
|
253
|
+
<phase>validate</phase>
|
|
254
|
+
<goals><goal>check</goal></goals>
|
|
255
|
+
</execution>
|
|
256
|
+
</executions>
|
|
257
|
+
</plugin>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### 常见违规及修复
|
|
261
|
+
|
|
262
|
+
| 违规 ID | 说明 | 修复方式 |
|
|
263
|
+
|---------|------|----------|
|
|
264
|
+
| `FileLength` | 单文件过长 (>1000 行) | 拆分职责到多个类 |
|
|
265
|
+
| `MethodLength` | 方法过长 (>50 行) | 提取子方法 |
|
|
266
|
+
| `LineLength` | 行超长 (>120 字符) | 换行或提取变量 |
|
|
267
|
+
| `JavadocMethod` | 缺少 Javadoc 注释 | 补充方法注释 |
|
|
268
|
+
| `MissingOverride` | 缺少 @Override | 添加注解 |
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## PMD — 代码质量分析
|
|
273
|
+
|
|
274
|
+
### Maven 执行
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
# 运行 PMD 分析
|
|
278
|
+
mvn pmd:pmd # 生成报告
|
|
279
|
+
mvn pmd:check # 门禁检查(失败则 build 失败)
|
|
280
|
+
|
|
281
|
+
# 报告位置
|
|
282
|
+
# target/site/pmd.html # HTML 报告
|
|
283
|
+
# target/pmd.xml # XML 原始数据
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### 常见问题模式分类
|
|
287
|
+
|
|
288
|
+
| 类别 | 示例 | 严重度 |
|
|
289
|
+
|------|------|--------|
|
|
290
|
+
| **代码复杂度** | CyclomaticComplexity > 10 | 🔴 高 |
|
|
291
|
+
| **空指针风险** | NullAssignment / ReturnNullFromCollection | 🔴 高 |
|
|
292
|
+
| **性能问题** | AvoidInstantiatingObjectsInLoops | 🟡 中 |
|
|
293
|
+
| **代码风格** | LongVariable / ShortVariable | ⚠️ 低 |
|
|
294
|
+
| **最佳实践** | UseArrayListInsteadOfVector | 🟡 中 |
|
|
295
|
+
|
|
296
|
+
### pom.xml 配置示例
|
|
297
|
+
|
|
298
|
+
```xml
|
|
299
|
+
<plugin>
|
|
300
|
+
<groupId>org.apache.maven.plugins</groupId>
|
|
301
|
+
<artifactId>maven-pmd-plugin</artifactId>
|
|
302
|
+
<version>3.21.2</version>
|
|
303
|
+
<configuration>
|
|
304
|
+
<rulesets>
|
|
305
|
+
<ruleset>pmd/rules/java-best-practices.xml</ruleset>
|
|
306
|
+
<ruleset>pmd/rules/java-codesize.xml</ruleset>
|
|
307
|
+
</rulesets>
|
|
308
|
+
<failOnViolation>true</failOnViolation>
|
|
309
|
+
<excludeFromFailureFile>pmd-exclude.properties</excludeFromFailureFile>
|
|
310
|
+
</configuration>
|
|
311
|
+
</plugin>
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## SpotBugs — Bug 模式检测
|
|
317
|
+
|
|
318
|
+
### Maven 执行
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
# 运行 SpotBugs 扫描
|
|
322
|
+
mvn spotbugs:spotbugs # 生成报告
|
|
323
|
+
mvn spotbugs:check # 门禁检查
|
|
324
|
+
|
|
325
|
+
# 报告位置
|
|
326
|
+
# target/spotbugsXml.xml # XML 报告
|
|
327
|
+
# target/spotbugsHtml.html # HTML 可视化报告(可选)
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### 必须修复的高优先级 Bug 模式
|
|
331
|
+
|
|
332
|
+
| Bug 模式 | 说明 | 风险 |
|
|
333
|
+
|----------|------|------|
|
|
334
|
+
| **NP_NULL_ON_SOME_PATH** | 可能的空指针解引用 | NPE 导致服务崩溃 |
|
|
335
|
+
| **OS_OPEN_STREAM** | 流未关闭 | 资源泄漏 |
|
|
336
|
+
| **SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE** | SQL 注入风险 | 安全漏洞! |
|
|
337
|
+
| **EI_EXPOSE_REP** | 内部状态可被外部修改 | 数据不一致 |
|
|
338
|
+
| **DM_CONVERTED_MAP** | HashMap 的 key 类型可能不一致 | ClassCastException |
|
|
339
|
+
|
|
340
|
+
### pom.xml 配置示例
|
|
341
|
+
|
|
342
|
+
```xml
|
|
343
|
+
<plugin>
|
|
344
|
+
<groupId>com.github.spotbugs</groupId>
|
|
345
|
+
<artifactId>spotbugs-maven-plugin</artifactId>
|
|
346
|
+
<version>4.8.3.1</version>
|
|
347
|
+
<configuration>
|
|
348
|
+
<effort>Max</effort>
|
|
349
|
+
<threshold>Low</threshold>
|
|
350
|
+
<failOnError>true</failOnError>
|
|
351
|
+
<excludeFilterFile>spotbugs-exclude.xml</excludeFilterFile>
|
|
352
|
+
<plugins>
|
|
353
|
+
<plugin>
|
|
354
|
+
<groupId>com.mebigfatguy.sbcontrib</groupId>
|
|
355
|
+
<artifactId>sbcontrib</artifactId>
|
|
356
|
+
<version>7.6.0</version>
|
|
357
|
+
</plugin>
|
|
358
|
+
</plugins>
|
|
359
|
+
</configuration>
|
|
360
|
+
<executions>
|
|
361
|
+
<execution>
|
|
362
|
+
<phase>verify</phase>
|
|
363
|
+
<goals><goal>check</goal></goals>
|
|
364
|
+
</execution>
|
|
365
|
+
</executions>
|
|
366
|
+
</plugin>
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## SonarQube — 代码质量平台
|
|
372
|
+
|
|
373
|
+
### 本地启动 SonarQube(开发环境)
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
# Docker 启动本地 SonarQube(快速验证用)
|
|
377
|
+
docker run -d --name sonarqube \
|
|
378
|
+
-p 9000:9000 \
|
|
379
|
+
-e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true \
|
|
380
|
+
sonarqube:community
|
|
381
|
+
|
|
382
|
+
# 访问 http://localhost:9000 (默认 admin/admin)
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
### 项目扫描命令
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
# Maven 方式扫描(推荐)
|
|
389
|
+
mvn sonar:sonar \
|
|
390
|
+
-Dsonar.host.url=http://localhost:9000 \
|
|
391
|
+
-Dsonar.login=YOUR_TOKEN \
|
|
392
|
+
-Dsonar.projectKey=com.jieshun:backend \
|
|
393
|
+
-Dsonar.sources=src/main/java \
|
|
394
|
+
-Dsonar.tests=src/test/java \
|
|
395
|
+
-Dsonar.java.binaries=target/classes \
|
|
396
|
+
-Dsonar.junit.reportPaths=target/surefire-reports \
|
|
397
|
+
-Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml
|
|
398
|
+
|
|
399
|
+
# CI 环境变量注入(避免硬编码 token)
|
|
400
|
+
# SONAR_TOKEN=xxx mvn sonar:sonar -Dsonar.host.url=$SONAR_URL
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
### Quality Gate 标准
|
|
404
|
+
|
|
405
|
+
| 维度 | 门禁值 | 说明 |
|
|
406
|
+
|------|--------|------|
|
|
407
|
+
| 覆盖率 (Coverage on New Code) | ≥ 80% | 新增代码必须达标 |
|
|
408
|
+
| Duplicated Lines (%) | ≤ 3% | 新增重复代码限制 |
|
|
409
|
+
| Maintainability Rating | A | 新增代码可维护性评级 |
|
|
410
|
+
| Reliability Rating | A/B | 新增代码可靠性 |
|
|
411
|
+
| Security Hotspots Reviewed | 100% | 安全热点必须审查 |
|
|
412
|
+
| Security Rating | A/B | 安全等级 |
|
|
413
|
+
| Blocker Issues | = 0 | 阻断级问题为零 |
|
|
414
|
+
| Critical Issues | = 0 | 严重问题为零 |
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## Java Lint 结果汇总模板
|
|
419
|
+
|
|
420
|
+
```yaml
|
|
421
|
+
lint_result_java:
|
|
422
|
+
timestamp: "2026-05-20T22:00:00Z"
|
|
423
|
+
tools: "Checkstyle + PMD + SpotBugs (+ SonarQube)"
|
|
424
|
+
project_type: "java"
|
|
425
|
+
overall_status: pass | warning | fail
|
|
426
|
+
|
|
427
|
+
categories:
|
|
428
|
+
checkstyle:
|
|
429
|
+
status: pass
|
|
430
|
+
errors: 0
|
|
431
|
+
warnings: 3 # 不阻断但需记录
|
|
432
|
+
files_scanned: 142
|
|
433
|
+
|
|
434
|
+
pmd:
|
|
435
|
+
violations_by_priority:
|
|
436
|
+
blocker: 0
|
|
437
|
+
high: 1
|
|
438
|
+
medium: 5
|
|
439
|
+
low: 12
|
|
440
|
+
|
|
441
|
+
spotbugs:
|
|
442
|
+
bug_categories:
|
|
443
|
+
correctness: 2 # NP_NULL 等
|
|
444
|
+
bad_practice: 1
|
|
445
|
+
performance: 0
|
|
446
|
+
security: 0 # 必须为 0!
|
|
447
|
+
|
|
448
|
+
sonarqube:
|
|
449
|
+
quality_gate: PASS
|
|
450
|
+
new_code_coverage_pct: 84.2
|
|
451
|
+
new_violations: 2
|
|
452
|
+
new_security_hotspots: 0
|
|
453
|
+
|
|
454
|
+
details:
|
|
455
|
+
issues: [] # 空 = 通过
|
|
456
|
+
# issues:
|
|
457
|
+
# - file: "src/main/java/com/jieshun/service/UserService.java"
|
|
458
|
+
# line: 45
|
|
459
|
+
# tool: "SpotBugs"
|
|
460
|
+
# pattern: "NP_NULL_ON_SOME_PATH"
|
|
461
|
+
# severity: "high"
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### 状态判定规则(Java)
|
|
465
|
+
|
|
466
|
+
```javascript
|
|
467
|
+
function determineJavaStatus(result) {
|
|
468
|
+
// FAIL 条件
|
|
469
|
+
if (result.checkstyle.errors > 0) return 'fail';
|
|
470
|
+
if (result.pmd.violations.blocker > 0) return 'fail';
|
|
471
|
+
if (result.spotbugs.bug_categories.security > 0) return 'fail'; // 安全红线
|
|
472
|
+
if (result.sonarqube.quality_gate === 'FAIL') return 'fail';
|
|
473
|
+
|
|
474
|
+
// WARNING 条件
|
|
475
|
+
if (result.pmd.violations.high > 0) return 'warning';
|
|
476
|
+
if (result.spotbugs.bug_categories.correctness > 3) return 'warning';
|
|
477
|
+
if (result.checkstyle.warnings > 10) return 'warning';
|
|
478
|
+
|
|
479
|
+
// PASS
|
|
480
|
+
return 'pass';
|
|
481
|
+
}
|
|
482
|
+
```
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# TaskBoard 维护 Skill
|
|
2
|
+
|
|
3
|
+
> **执行角色**: PM Agent / 工作流引擎
|
|
4
|
+
> **触发时机**: 任务状态变更时、每日定时、周报生成前
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 操作清单
|
|
9
|
+
|
|
10
|
+
### 1. 新任务注册
|
|
11
|
+
|
|
12
|
+
当 PM 收到新需求时:
|
|
13
|
+
|
|
14
|
+
```markdown
|
|
15
|
+
- [ ] 1. 分配 Task ID(格式:TASK-YYYYMMDD-NNN)
|
|
16
|
+
- [ ] 2. 判断流程变体类型
|
|
17
|
+
- [ ] 新功能 → 标准七阶段流程
|
|
18
|
+
- [ ] Bug 修复 → Bug 修复轻量流程
|
|
19
|
+
- [ ] P0/P1 生产问题 → 热修最快路径
|
|
20
|
+
- [ ] 文档/配置变更 → 微型流程
|
|
21
|
+
- [ ] 安全漏洞 → 安全响应流程
|
|
22
|
+
- [ ] 3. 在「待开始任务」表添加一行
|
|
23
|
+
- [ ] 4. 检查是否与历史任务重复(搜索 TaskBoard 和已关闭的 Issue)
|
|
24
|
+
- [ ] 5. 如有关联的 Issue/PR,填入对应编号
|
|
25
|
+
- [ ] 6. 更新「新增需求」计数器
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 2. 状态推进
|
|
29
|
+
|
|
30
|
+
当一个阶段完成,需要推入下一阶段:
|
|
31
|
+
|
|
32
|
+
```markdown
|
|
33
|
+
- [ ] 1. 从当前区域移动目标任务到下一区域
|
|
34
|
+
- [ ] 2. 更新「当前阶段」字段
|
|
35
|
+
- [ ] 3. 更新「负责Agent」字段为下一个角色
|
|
36
|
+
- [ ] 4. 更新「上次更新」为当前时间
|
|
37
|
+
- [ ] 5. 在备注中记录简要原因(可选)
|
|
38
|
+
- [ ] 6. 如果是打回,在「备注」中注明打回原因和来源角色
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 3. 交付归档
|
|
42
|
+
|
|
43
|
+
测试 PASS 后:
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
- [ ] 1. 移动到「已完成」区域
|
|
47
|
+
- [ ] 2. 填写「交付结论」
|
|
48
|
+
- [ ] PASS: 全部检查通过,无遗留问题
|
|
49
|
+
- [ ] CONDITIONAL_PASS: 通过但有必修项需跟踪
|
|
50
|
+
- [ ] 3. 计算「实际周期」(从进入开发到完成的自然日天数)
|
|
51
|
+
- [ ] 4. 填写「归档日期」
|
|
52
|
+
- [ ] 5. 收集并填写各阶段的文档链接
|
|
53
|
+
- [ ] 6. 更新度量指标
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 4. 度量数据计算
|
|
57
|
+
|
|
58
|
+
```yaml
|
|
59
|
+
metrics:
|
|
60
|
+
# 每次操作后自动更新
|
|
61
|
+
new_requirements_count:
|
|
62
|
+
calculation: "统计本周新增的任务数量"
|
|
63
|
+
|
|
64
|
+
completed_delivery_count:
|
|
65
|
+
calculation: "统计本周归档到已完成区的任务数量"
|
|
66
|
+
|
|
67
|
+
avg_cycle_time_days:
|
|
68
|
+
calculation: "已完成任务的 actual_cycle_time 平均值"
|
|
69
|
+
|
|
70
|
+
rollback_rate:
|
|
71
|
+
formula: "(总打回次数 / 总完成任务数) × 100"
|
|
72
|
+
target: "< 15%"
|
|
73
|
+
|
|
74
|
+
blocked_tasks_count:
|
|
75
|
+
calculation: "当前处于 HOLD 或 BLOCK 状态的任务数"
|
|
76
|
+
|
|
77
|
+
process_violation_count:
|
|
78
|
+
calculation: "本周期内 process-discipline 违规次数"
|
|
79
|
+
|
|
80
|
+
stage_load_balance:
|
|
81
|
+
check: "任一阶段的进行中任务数 > 3 时发出警告"
|
|
82
|
+
|
|
83
|
+
# 周报数据点
|
|
84
|
+
weekly_report_data_points:
|
|
85
|
+
- velocity: "每周完成的需求总数"
|
|
86
|
+
- lead_time: "从需求接收到交付的平均天数"
|
|
87
|
+
- quality_score: "Gate 通过率平均值"
|
|
88
|
+
- team_utilization: "各 Agent 的任务分布均匀度"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 5. 定期维护
|
|
92
|
+
|
|
93
|
+
```markdown
|
|
94
|
+
## 每日检查(PM Agent 自动执行)
|
|
95
|
+
- [ ] 检查是否有超时未更新的任务(超过 48 小时的进行中任务)
|
|
96
|
+
- [ ] 检查是否有阻塞超过 24 小时的任务
|
|
97
|
+
- [ ] 更新「最后更新」时间戳
|
|
98
|
+
|
|
99
|
+
## 每周清理(PM Agent 手动执行)
|
|
100
|
+
- [ ] 清理已取消或合并的重复条目
|
|
101
|
+
- [ ] 确认已完成任务都已正确归档
|
|
102
|
+
- [ ] 生成周度度量报告
|
|
103
|
+
- [ ] 识别瓶颈阶段(哪个阶段积压最多)
|
|
104
|
+
- [ ] 汇总流程违规情况并提出改进建议
|
|
105
|
+
```
|