@pigcloud/skills 1.0.11 → 1.1.2
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/CHANGELOG.md +25 -20
- package/README.en.md +41 -75
- package/README.md +26 -39
- package/bin/cli.js +260 -151
- package/bin/rules-loader.js +271 -484
- package/codex-commands/README.md +25 -23
- package/codex-commands/commands/analyze.md +21 -22
- package/codex-commands/commands/build.md +22 -22
- package/codex-commands/commands/design.md +21 -22
- package/codex-commands/commands/distill.md +21 -21
- package/codex-commands/commands/doc.md +21 -22
- package/codex-commands/commands/infra.md +21 -21
- package/codex-commands/commands/init.md +20 -20
- package/codex-commands/commands/kb.md +21 -20
- package/codex-commands/commands/perf.md +21 -21
- package/codex-commands/commands/prd.md +21 -22
- package/codex-commands/commands/review.md +21 -22
- package/codex-commands/commands/security.md +21 -22
- package/codex-commands/commands/test.md +21 -21
- package/codex-commands/commands/workflow.md +21 -20
- package/package.json +5 -2
- package/rules/core/index.md +26 -41
- package/rules/delivery/index.md +25 -0
- package/rules/design/index.md +25 -0
- package/rules/discovery/index.md +25 -0
- package/rules/implementation/index.md +25 -0
- package/rules/index.md +24 -39
- package/rules/overlays/index.md +19 -19
- package/rules/overlays/pig-cloud.md +20 -45
- package/rules/shared/index.md +25 -0
- package/rules/skill-stage-map.json +26 -0
- package/rules/stages.json +48 -0
- package/rules/validation/index.md +25 -0
- package/scripts/add-skill-reference-nav.js +3 -0
- package/scripts/bootstrap-skill-specs.js +96 -0
- package/scripts/ci-validator.sh +51 -114
- package/scripts/generate-skill-prompt-library.js +3 -0
- package/scripts/golden-prompt-suite.current.js +211 -0
- package/scripts/migrate-skill-packages.js +309 -0
- package/scripts/run-golden-replays.js +110 -79
- package/scripts/validate-rules.js +128 -125
- package/scripts/validate-skill-replay-signals.js +45 -57
- package/scripts/validate-skill-shapes.js +153 -127
- package/scripts/validate-skill-stop-rules.js +54 -46
- package/skills/01-discovery/ambiguity-detection/SKILL.md +30 -0
- package/skills/01-discovery/ambiguity-detection/assets/golden-prompt-suite.current.js +22 -0
- package/skills/01-discovery/ambiguity-detection/references/README.md +17 -0
- package/skills/01-discovery/ambiguity-detection/references/cases.md +26 -0
- package/skills/01-discovery/ambiguity-detection/references/prompt-template.md +18 -0
- package/skills/01-discovery/ambiguity-detection/skill-spec.json +26 -0
- package/skills/01-discovery/business-analysis/SKILL.md +30 -0
- package/skills/01-discovery/business-analysis/assets/golden-prompt-suite.current.js +22 -0
- package/skills/01-discovery/business-analysis/references/README.md +17 -0
- package/skills/01-discovery/business-analysis/references/cases.md +26 -0
- package/skills/01-discovery/business-analysis/references/prompt-template.md +18 -0
- package/skills/01-discovery/business-analysis/skill-spec.json +26 -0
- package/skills/01-discovery/impact-analysis/SKILL.md +30 -0
- package/skills/01-discovery/impact-analysis/assets/golden-prompt-suite.current.js +22 -0
- package/skills/01-discovery/impact-analysis/references/README.md +17 -0
- package/skills/01-discovery/impact-analysis/references/cases.md +26 -0
- package/skills/01-discovery/impact-analysis/references/prompt-template.md +18 -0
- package/skills/01-discovery/impact-analysis/skill-spec.json +26 -0
- package/skills/01-discovery/requirement-discovery/SKILL.md +30 -0
- package/skills/01-discovery/requirement-discovery/assets/golden-prompt-suite.current.js +24 -0
- package/skills/01-discovery/requirement-discovery/references/README.md +17 -0
- package/skills/01-discovery/requirement-discovery/references/cases.md +28 -0
- package/skills/01-discovery/requirement-discovery/references/prompt-template.md +18 -0
- package/skills/01-discovery/requirement-discovery/skill-spec.json +26 -0
- package/skills/02-design/api-design/SKILL.md +29 -0
- package/skills/02-design/api-design/assets/golden-prompt-suite.current.js +22 -0
- package/skills/02-design/api-design/references/README.md +17 -0
- package/skills/02-design/api-design/references/cases.md +26 -0
- package/skills/02-design/api-design/references/prompt-template.md +18 -0
- package/skills/02-design/api-design/skill-spec.json +25 -0
- package/skills/02-design/architecture-design/SKILL.md +29 -0
- package/skills/02-design/architecture-design/assets/golden-prompt-suite.current.js +22 -0
- package/skills/02-design/architecture-design/references/README.md +17 -0
- package/skills/02-design/architecture-design/references/cases.md +26 -0
- package/skills/02-design/architecture-design/references/prompt-template.md +18 -0
- package/skills/02-design/architecture-design/skill-spec.json +25 -0
- package/skills/02-design/database-design/SKILL.md +29 -0
- package/skills/02-design/database-design/assets/golden-prompt-suite.current.js +22 -0
- package/skills/02-design/database-design/references/README.md +17 -0
- package/skills/02-design/database-design/references/cases.md +26 -0
- package/skills/02-design/database-design/references/prompt-template.md +18 -0
- package/skills/02-design/database-design/skill-spec.json +25 -0
- package/skills/02-design/task-breakdown/SKILL.md +29 -0
- package/skills/02-design/task-breakdown/assets/golden-prompt-suite.current.js +22 -0
- package/skills/02-design/task-breakdown/references/README.md +17 -0
- package/skills/02-design/task-breakdown/references/cases.md +26 -0
- package/skills/02-design/task-breakdown/references/prompt-template.md +18 -0
- package/skills/02-design/task-breakdown/skill-spec.json +25 -0
- package/skills/03-implementation/backend-development/SKILL.md +29 -0
- package/skills/03-implementation/backend-development/assets/golden-prompt-suite.current.js +22 -0
- package/skills/03-implementation/backend-development/references/README.md +17 -0
- package/skills/03-implementation/backend-development/references/cases.md +26 -0
- package/skills/03-implementation/backend-development/references/prompt-template.md +18 -0
- package/skills/03-implementation/backend-development/skill-spec.json +25 -0
- package/skills/03-implementation/bug-fix/SKILL.md +29 -0
- package/skills/03-implementation/bug-fix/assets/golden-prompt-suite.current.js +22 -0
- package/skills/03-implementation/bug-fix/references/README.md +17 -0
- package/skills/03-implementation/bug-fix/references/cases.md +26 -0
- package/skills/03-implementation/bug-fix/references/prompt-template.md +18 -0
- package/skills/03-implementation/bug-fix/skill-spec.json +25 -0
- package/skills/03-implementation/database-change/SKILL.md +29 -0
- package/skills/03-implementation/database-change/assets/golden-prompt-suite.current.js +22 -0
- package/skills/03-implementation/database-change/references/README.md +17 -0
- package/skills/03-implementation/database-change/references/cases.md +26 -0
- package/skills/03-implementation/database-change/references/prompt-template.md +18 -0
- package/skills/03-implementation/database-change/skill-spec.json +25 -0
- package/skills/03-implementation/frontend-development/SKILL.md +29 -0
- package/skills/03-implementation/frontend-development/assets/golden-prompt-suite.current.js +22 -0
- package/skills/03-implementation/frontend-development/references/README.md +17 -0
- package/skills/03-implementation/frontend-development/references/cases.md +26 -0
- package/skills/03-implementation/frontend-development/references/prompt-template.md +18 -0
- package/skills/03-implementation/frontend-development/skill-spec.json +25 -0
- package/skills/04-validation/code-review/SKILL.md +29 -0
- package/skills/04-validation/code-review/assets/golden-prompt-suite.current.js +22 -0
- package/skills/04-validation/code-review/references/README.md +17 -0
- package/skills/04-validation/code-review/references/cases.md +26 -0
- package/skills/04-validation/code-review/references/prompt-template.md +18 -0
- package/skills/04-validation/code-review/skill-spec.json +25 -0
- package/skills/04-validation/performance-review/SKILL.md +29 -0
- package/skills/04-validation/performance-review/assets/golden-prompt-suite.current.js +22 -0
- package/skills/04-validation/performance-review/references/README.md +17 -0
- package/skills/04-validation/performance-review/references/cases.md +26 -0
- package/skills/04-validation/performance-review/references/prompt-template.md +18 -0
- package/skills/04-validation/performance-review/skill-spec.json +25 -0
- package/skills/04-validation/regression-check/SKILL.md +29 -0
- package/skills/04-validation/regression-check/assets/golden-prompt-suite.current.js +22 -0
- package/skills/04-validation/regression-check/references/README.md +17 -0
- package/skills/04-validation/regression-check/references/cases.md +26 -0
- package/skills/04-validation/regression-check/references/prompt-template.md +18 -0
- package/skills/04-validation/regression-check/skill-spec.json +25 -0
- package/skills/04-validation/security-review/SKILL.md +29 -0
- package/skills/04-validation/security-review/assets/golden-prompt-suite.current.js +22 -0
- package/skills/04-validation/security-review/references/README.md +17 -0
- package/skills/04-validation/security-review/references/cases.md +26 -0
- package/skills/04-validation/security-review/references/prompt-template.md +18 -0
- package/skills/04-validation/security-review/skill-spec.json +25 -0
- package/skills/04-validation/unit-test/SKILL.md +29 -0
- package/skills/04-validation/unit-test/assets/golden-prompt-suite.current.js +22 -0
- package/skills/04-validation/unit-test/references/README.md +17 -0
- package/skills/04-validation/unit-test/references/cases.md +26 -0
- package/skills/04-validation/unit-test/references/prompt-template.md +18 -0
- package/skills/04-validation/unit-test/skill-spec.json +25 -0
- package/skills/05-delivery/change-log/SKILL.md +29 -0
- package/skills/05-delivery/change-log/assets/golden-prompt-suite.current.js +22 -0
- package/skills/05-delivery/change-log/references/README.md +17 -0
- package/skills/05-delivery/change-log/references/cases.md +26 -0
- package/skills/05-delivery/change-log/references/prompt-template.md +18 -0
- package/skills/05-delivery/change-log/skill-spec.json +25 -0
- package/skills/05-delivery/deployment-guide/SKILL.md +29 -0
- package/skills/05-delivery/deployment-guide/assets/golden-prompt-suite.current.js +22 -0
- package/skills/05-delivery/deployment-guide/references/README.md +17 -0
- package/skills/05-delivery/deployment-guide/references/cases.md +26 -0
- package/skills/05-delivery/deployment-guide/references/prompt-template.md +18 -0
- package/skills/05-delivery/deployment-guide/skill-spec.json +25 -0
- package/skills/05-delivery/release-check/SKILL.md +29 -0
- package/skills/05-delivery/release-check/assets/golden-prompt-suite.current.js +22 -0
- package/skills/05-delivery/release-check/references/README.md +17 -0
- package/skills/05-delivery/release-check/references/cases.md +26 -0
- package/skills/05-delivery/release-check/references/prompt-template.md +18 -0
- package/skills/05-delivery/release-check/skill-spec.json +25 -0
- package/skills/05-delivery/release-validation/SKILL.md +29 -0
- package/skills/05-delivery/release-validation/assets/golden-prompt-suite.current.js +22 -0
- package/skills/05-delivery/release-validation/references/README.md +17 -0
- package/skills/05-delivery/release-validation/references/cases.md +26 -0
- package/skills/05-delivery/release-validation/references/prompt-template.md +18 -0
- package/skills/05-delivery/release-validation/skill-spec.json +25 -0
- package/skills/shared/codebase-learning/SKILL.md +29 -0
- package/skills/shared/codebase-learning/assets/golden-prompt-suite.current.js +22 -0
- package/skills/shared/codebase-learning/references/README.md +17 -0
- package/skills/shared/codebase-learning/references/cases.md +26 -0
- package/skills/shared/codebase-learning/references/prompt-template.md +18 -0
- package/skills/shared/codebase-learning/skill-spec.json +25 -0
- package/skills/shared/evidence-collector/SKILL.md +29 -0
- package/skills/shared/evidence-collector/assets/golden-prompt-suite.current.js +22 -0
- package/skills/shared/evidence-collector/references/README.md +17 -0
- package/skills/shared/evidence-collector/references/cases.md +26 -0
- package/skills/shared/evidence-collector/references/prompt-template.md +18 -0
- package/skills/shared/evidence-collector/skill-spec.json +25 -0
- package/skills/shared/framework-guide/SKILL.md +28 -0
- package/skills/shared/framework-guide/assets/golden-prompt-suite.current.js +22 -0
- package/skills/shared/framework-guide/references/README.md +17 -0
- package/skills/shared/framework-guide/references/cases.md +26 -0
- package/skills/shared/framework-guide/references/prompt-template.md +18 -0
- package/skills/shared/framework-guide/skill-spec.json +24 -0
- package/rules/bundles.json +0 -358
- package/rules/coding/analysis.md +0 -27
- package/rules/coding/backend/cache-invalidation.md +0 -30
- package/rules/coding/backend/cache-keying.md +0 -30
- package/rules/coding/backend/cache.md +0 -37
- package/rules/coding/backend/database.md +0 -32
- package/rules/coding/backend/feign.md +0 -30
- package/rules/coding/backend/index.md +0 -42
- package/rules/coding/backend/query.md +0 -32
- package/rules/coding/backend/remote.md +0 -33
- package/rules/coding/backend/transaction-boundary.md +0 -30
- package/rules/coding/backend/transaction-rollback.md +0 -30
- package/rules/coding/backend/transaction.md +0 -38
- package/rules/coding/boundary.md +0 -25
- package/rules/coding/implementation.md +0 -26
- package/rules/coding/index.md +0 -38
- package/rules/coding/scaffold.md +0 -28
- package/rules/coding/testing.md +0 -29
- package/rules/coding/validation.md +0 -29
- package/rules/core/code-quality.md +0 -30
- package/rules/core/evidence.md +0 -26
- package/rules/core/interface.md +0 -26
- package/rules/core/iteration.md +0 -26
- package/rules/core/layer-boundary.md +0 -25
- package/rules/core/logging.md +0 -26
- package/rules/core/security.md +0 -26
- package/rules/core/task-boundary.md +0 -27
- package/rules/docs/api.md +0 -34
- package/rules/docs/capture-summary.md +0 -29
- package/rules/docs/capture.md +0 -34
- package/rules/docs/contract.md +0 -30
- package/rules/docs/decision-log.md +0 -32
- package/rules/docs/examples.md +0 -28
- package/rules/docs/index.md +0 -49
- package/rules/docs/reference.md +0 -32
- package/rules/overlays/pig-cloud/controller.md +0 -33
- package/rules/overlays/pig-cloud/dto-vo.md +0 -33
- package/rules/overlays/pig-cloud/entity.md +0 -32
- package/rules/overlays/pig-cloud/exception.md +0 -32
- package/rules/overlays/pig-cloud/layering.md +0 -31
- package/rules/overlays/pig-cloud/mapper.md +0 -32
- package/rules/overlays/pig-cloud/query-style.md +0 -32
- package/rules/overlays/pig-cloud/rest-response.md +0 -33
- package/rules/overlays/pig-cloud/service.md +0 -33
- package/rules/overlays/pig-cloud/transactions.md +0 -32
- package/rules/overlays/pig-cloud/validation.md +0 -33
- package/rules/product/acceptance.md +0 -25
- package/rules/product/briefing.md +0 -27
- package/rules/product/index.md +0 -36
- package/rules/product/intake.md +0 -27
- package/rules/product/modeling.md +0 -25
- package/rules/product/project-context.md +0 -29
- package/rules/review/code.md +0 -35
- package/rules/review/evidence.md +0 -31
- package/rules/review/index.md +0 -50
- package/rules/review/java.md +0 -42
- package/rules/review/performance.md +0 -38
- package/rules/review/rubric.md +0 -28
- package/rules/review/security.md +0 -38
- package/rules/review/ts.md +0 -33
- package/rules/review/vue.md +0 -33
- package/rules/skill-profile-map.json +0 -59
- package/rules/skill-profile-map.md +0 -29
- package/rules/workflow/handoff.md +0 -25
- package/rules/workflow/index.md +0 -37
- package/rules/workflow/refinement.md +0 -29
- package/rules/workflow/router.md +0 -25
- package/rules/workflow/selection.md +0 -25
- package/rules/workflow/stop.md +0 -25
- package/skills/api-contract-docs/SKILL.md +0 -77
- package/skills/business-fact-extraction/SKILL.md +0 -337
- package/skills/business-fact-extraction/scripts/write-knowledge-base.js +0 -228
- package/skills/code-review/SKILL.md +0 -136
- package/skills/code-review/references/findings-template.md +0 -51
- package/skills/code-review/references/performance-checklist.md +0 -213
- package/skills/code-review/references/rubric.md +0 -232
- package/skills/code-review/references/rules.md +0 -32
- package/skills/code-review/references/security-checklist.md +0 -178
- package/skills/code-review/references/stack-notes.md +0 -25
- package/skills/code-review/references/template-review.md +0 -39
- package/skills/code-review/scripts/lint-code-review.mjs +0 -431
- package/skills/domain-modeling/SKILL.md +0 -81
- package/skills/domain-modeling/references/README.md +0 -134
- package/skills/domain-modeling/references/distillation-checklist.md +0 -44
- package/skills/domain-modeling/references/test-cases-template.md +0 -128
- package/skills/environment-deploy/SKILL.md +0 -81
- package/skills/feature-build/SKILL.md +0 -122
- package/skills/feature-build/references/coding-checklist.md +0 -97
- package/skills/feature-build/references/comment-specification.md +0 -89
- package/skills/knowledge-capture/SKILL.md +0 -93
- package/skills/performance-audit/SKILL.md +0 -118
- package/skills/project-bootstrap/SKILL.md +0 -81
- package/skills/references/anti-rationalization.md +0 -144
- package/skills/references/business-fact-extraction.md +0 -415
- package/skills/references/engineering-delivery-method.md +0 -64
- package/skills/references/engineering-delivery-template.md +0 -81
- package/skills/references/golden-prompt-suite.js +0 -436
- package/skills/references/golden-prompt-suite.md +0 -33
- package/skills/references/project-requirement-alignment.md +0 -42
- package/skills/references/rule-loading-map.md +0 -117
- package/skills/references/skill-authoring-standard.md +0 -74
- package/skills/references/skill-boundary-template.md +0 -71
- package/skills/references/skill-enhanced-template.md +0 -103
- package/skills/references/skill-reference-matrix.md +0 -62
- package/skills/security-audit/SKILL.md +0 -119
- package/skills/spec-refinement/SKILL.md +0 -149
- package/skills/technical-design/SKILL.md +0 -106
- package/skills/technical-design/references/solid-checklist.md +0 -199
- package/skills/test-design/SKILL.md +0 -92
- package/skills/workflow-router/SKILL.md +0 -86
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# Code Review Findings Template
|
|
2
|
-
|
|
3
|
-
## Shared Shape
|
|
4
|
-
|
|
5
|
-
Use the same top-level fields for every finding:
|
|
6
|
-
|
|
7
|
-
- `location`
|
|
8
|
-
- `severity`
|
|
9
|
-
- `evidence`
|
|
10
|
-
- `why it matters`
|
|
11
|
-
- `fix recommendation`
|
|
12
|
-
|
|
13
|
-
## Rules
|
|
14
|
-
|
|
15
|
-
- One finding should describe one issue.
|
|
16
|
-
- Keep the location as small as possible.
|
|
17
|
-
- Make the evidence concrete enough to verify.
|
|
18
|
-
- Keep the fix recommendation specific enough to act on.
|
|
19
|
-
- If there are no findings, explain what was checked and why the change is acceptable.
|
|
20
|
-
|
|
21
|
-
## Section Hints
|
|
22
|
-
|
|
23
|
-
### Java
|
|
24
|
-
|
|
25
|
-
- Prefer controller, service, entity, mapper, DTO / VO, or MyBatis XML anchors.
|
|
26
|
-
- Name the violated framework contract.
|
|
27
|
-
- If the issue spans layers, name the first layer where the fix should land.
|
|
28
|
-
|
|
29
|
-
### Vue
|
|
30
|
-
|
|
31
|
-
- Prefer component, composable, state module, template, or build-file anchors.
|
|
32
|
-
- State whether the issue is rendering, state flow, reactivity, or build configuration.
|
|
33
|
-
- If the issue crosses files, name the owning frontend surface.
|
|
34
|
-
|
|
35
|
-
### TypeScript
|
|
36
|
-
|
|
37
|
-
- Prefer typed utility, module boundary, state module, or TS config anchors.
|
|
38
|
-
- State whether the issue is type safety, module shape, async control flow, or shared utility determinism.
|
|
39
|
-
- If the issue is config-related, name the entrypoint or build target that drifts.
|
|
40
|
-
|
|
41
|
-
### Security
|
|
42
|
-
|
|
43
|
-
- Prefer endpoint, auth flow, permission boundary, secret path, or exposure path anchors.
|
|
44
|
-
- Call out the violated trust boundary.
|
|
45
|
-
- State the attack path and impacted asset.
|
|
46
|
-
|
|
47
|
-
### Performance
|
|
48
|
-
|
|
49
|
-
- Prefer query, cache path, allocation path, concurrency path, or hot loop anchors.
|
|
50
|
-
- State whether the pressure is CPU, memory, network, database, or allocation-related.
|
|
51
|
-
- Name the slower path and the observable impact.
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
# 性能检查清单
|
|
2
|
-
|
|
3
|
-
> 基于当前规则基线的性能审查检查项
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Database Operations (数据库操作)
|
|
8
|
-
|
|
9
|
-
### N+1 Query
|
|
10
|
-
|
|
11
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
12
|
-
|--------|----------|----------|
|
|
13
|
-
| 循环中查询 | for 循环中调用 mapper.select | 批量查询 |
|
|
14
|
-
| 关联数据逐条获取 | 逐条获取关联数据 | JOIN 或 IN 查询 |
|
|
15
|
-
| 分页后逐条处理 | 分页查询后循环处理 | 批量处理 |
|
|
16
|
-
|
|
17
|
-
**示例**:
|
|
18
|
-
```java
|
|
19
|
-
// ❌ N+1 查询
|
|
20
|
-
List<Order> orders = orderMapper.selectList(null);
|
|
21
|
-
for (Order order : orders) {
|
|
22
|
-
User user = userMapper.selectById(order.getUserId()); // N 次查询
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// ✅ 批量查询
|
|
26
|
-
List<Order> orders = orderMapper.selectList(null);
|
|
27
|
-
Set<Long> userIds = orders.stream().map(Order::getUserId).collect(Collectors.toSet());
|
|
28
|
-
List<User> users = userMapper.selectBatchIds(userIds); // 1 次查询
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Full Table Scan
|
|
32
|
-
|
|
33
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
34
|
-
|--------|----------|----------|
|
|
35
|
-
| 无条件查询 | selectList(null) | 添加条件/分页 |
|
|
36
|
-
| 无索引字段查询 | 非索引字段查询 | 添加索引 |
|
|
37
|
-
| 大表全量查询 | 大表无分页 | 强制分页 |
|
|
38
|
-
|
|
39
|
-
### Index Missing
|
|
40
|
-
|
|
41
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
42
|
-
|--------|----------|----------|
|
|
43
|
-
| 高频查询字段 | 无索引 | 添加索引 |
|
|
44
|
-
| 关联字段 | 外键无索引 | 添加索引 |
|
|
45
|
-
| 排序字段 | ORDER BY 无索引 | 添加索引 |
|
|
46
|
-
|
|
47
|
-
### Large Data Query
|
|
48
|
-
|
|
49
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
50
|
-
|--------|----------|----------|
|
|
51
|
-
| 无分页查询 | selectList 无 limit | 强制分页 |
|
|
52
|
-
| 大批量查询 | 批量查询无限制 | 分批查询 |
|
|
53
|
-
| 全字段查询 | SELECT * | 指定必要字段 |
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## Cache Usage (缓存使用)
|
|
58
|
-
|
|
59
|
-
### Cache Penetration (缓存穿透)
|
|
60
|
-
|
|
61
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
62
|
-
|--------|----------|----------|
|
|
63
|
-
| 空值不缓存 | 查询空值不缓存 | 缓存空值(短过期) |
|
|
64
|
-
| 持续查询不存在数据 | 反复查询不存在数据 | 布隆过滤器 |
|
|
65
|
-
|
|
66
|
-
**示例**:
|
|
67
|
-
```java
|
|
68
|
-
// ❌ 缓存穿透
|
|
69
|
-
public User getUser(Long id) {
|
|
70
|
-
User user = cache.get(id);
|
|
71
|
-
if (user == null) {
|
|
72
|
-
user = mapper.selectById(id); // 空值不缓存,反复查询
|
|
73
|
-
}
|
|
74
|
-
return user;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// ✅ 缓存空值
|
|
78
|
-
public User getUser(Long id) {
|
|
79
|
-
User user = cache.get(id);
|
|
80
|
-
if (user == null) {
|
|
81
|
-
user = mapper.selectById(id);
|
|
82
|
-
cache.set(id, user != null ? user : NULL_PLACEHOLDER, 60); // 缓存空值
|
|
83
|
-
}
|
|
84
|
-
return user;
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
### Cache Avalanche (缓存雪崩)
|
|
89
|
-
|
|
90
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
91
|
-
|--------|----------|----------|
|
|
92
|
-
| 过期时间相同 | 所有缓存过期时间相同 | 过期时间分散 |
|
|
93
|
-
| 大量缓存同时过期 | 批量缓存同时失效 | 过期时间随机化 |
|
|
94
|
-
|
|
95
|
-
### Cache Stampede (缓存击穿)
|
|
96
|
-
|
|
97
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
98
|
-
|--------|----------|----------|
|
|
99
|
-
| 热点数据无锁 | 热点数据并发查询 | 分布式锁 |
|
|
100
|
-
| 缓存重建耗时 | 缓存重建时间长 | 异步重建 |
|
|
101
|
-
|
|
102
|
-
### Cache Consistency (缓存一致性)
|
|
103
|
-
|
|
104
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
105
|
-
|--------|----------|----------|
|
|
106
|
-
| 更新策略不一致 | 先删缓存后更新数据库 | 先更新数据库后删缓存 |
|
|
107
|
-
| 双写不一致 | 并发双写 | 分布式锁/延迟双删 |
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## Memory & Concurrency (内存与并发)
|
|
112
|
-
|
|
113
|
-
### Memory Leak
|
|
114
|
-
|
|
115
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
116
|
-
|--------|----------|----------|
|
|
117
|
-
| 静态集合增长 | static Map/List 持续增长 | 使用缓存/定期清理 |
|
|
118
|
-
| 未关闭资源 | Connection/Stream 未关闭 | 使用 try-with-resources |
|
|
119
|
-
| ThreadLocal 未清理 | ThreadLocal 未 remove | 及时清理 |
|
|
120
|
-
|
|
121
|
-
**示例**:
|
|
122
|
-
```java
|
|
123
|
-
// ❌ 内存泄漏
|
|
124
|
-
public class Cache {
|
|
125
|
-
private static Map<String, Object> cache = new HashMap<>(); // 无限增长
|
|
126
|
-
|
|
127
|
-
public void put(String key, Object value) {
|
|
128
|
-
cache.put(key, value);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// ✅ 使用 Caffeine 缓存
|
|
133
|
-
public class Cache {
|
|
134
|
-
private static Cache<String, Object> cache = Caffeine.newBuilder()
|
|
135
|
-
.maximumSize(1000)
|
|
136
|
-
.expireAfterWrite(10, TimeUnit.MINUTES)
|
|
137
|
-
.build();
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
### Thread Safety
|
|
142
|
-
|
|
143
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
144
|
-
|--------|----------|----------|
|
|
145
|
-
| 共享变量 | 多线程访问共享变量 | 使用同步/并发容器 |
|
|
146
|
-
| 非线程安全容器 | HashMap 多线程使用 | ConcurrentHashMap |
|
|
147
|
-
| 计数器竞争 | 多线程计数 | AtomicLong |
|
|
148
|
-
|
|
149
|
-
### Connection Leak
|
|
150
|
-
|
|
151
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
152
|
-
|--------|----------|----------|
|
|
153
|
-
| 数据库连接未关闭 | Connection 未 close | 连接池自动管理 |
|
|
154
|
-
| Redis 连接未关闭 | Redis 连接未释放 | 连接池自动管理 |
|
|
155
|
-
| HTTP 连接未关闭 | HttpClient 未 close | 连接池自动管理 |
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## Response Time (响应时间)
|
|
160
|
-
|
|
161
|
-
### Slow API
|
|
162
|
-
|
|
163
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
164
|
-
|--------|----------|----------|
|
|
165
|
-
| 响应时间 > 500ms | 接口响应慢 | 分析瓶颈 |
|
|
166
|
-
| 响应时间 > 1s | 接口超慢 | 紧急优化 |
|
|
167
|
-
| 响应时间波动 | 响应时间不稳定 | 分析原因 |
|
|
168
|
-
|
|
169
|
-
### Batch Operations
|
|
170
|
-
|
|
171
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
172
|
-
|--------|----------|----------|
|
|
173
|
-
| 批量插入逐条 | for 循环 insert | saveBatch |
|
|
174
|
-
| 批量更新逐条 | for 循环 update | updateBatchById |
|
|
175
|
-
| 批量删除逐条 | for 循环 delete | removeByIds |
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
|
|
179
|
-
## Severity Classification
|
|
180
|
-
|
|
181
|
-
| 等级 | 描述 | 处理要求 |
|
|
182
|
-
|------|------|---------|
|
|
183
|
-
| 🔴 Critical | 响应时间 > 5s 或内存泄漏 | 立即修复 |
|
|
184
|
-
| 🟠 High | N+1 查询或响应时间 > 1s | 本次发布前修复 |
|
|
185
|
-
| 🟡 Medium | 缓存使用不当或响应时间 > 500ms | 计划修复 |
|
|
186
|
-
| 🟢 Low | 小优化建议 | 可接受 |
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## Anti-rationalization Table (Performance)
|
|
191
|
-
|
|
192
|
-
| 常见借口 | 反驳理由 | 正确做法 |
|
|
193
|
-
|---------|---------|---------|
|
|
194
|
-
| "性能问题用户不会感知" | 用户感知是累积的 | 优化性能 |
|
|
195
|
-
| "这个查询很快" | 快查询也会累积 | 批量优化 |
|
|
196
|
-
| "缓存以后再加" | 无缓存的系统不可用 | 设计时考虑缓存 |
|
|
197
|
-
| "这个数据量很小" | 数据量会增长 | 设计时考虑增长 |
|
|
198
|
-
| "这个接口不常用" | 不常用接口也可能被频繁调用 | 所有接口优化 |
|
|
199
|
-
| "性能优化太耗时" | 性能问题修复成本更高 | 设计时考虑性能 |
|
|
200
|
-
| "这是数据库的问题" | 应用层也能优化 | 应用层优化 |
|
|
201
|
-
| "测试环境性能够用" | 生产环境数据量更大 | 生产环境验证 |
|
|
202
|
-
|
|
203
|
-
---
|
|
204
|
-
|
|
205
|
-
## Verification Gates
|
|
206
|
-
|
|
207
|
-
| 门禁 | 检查方法 | 通过条件 | 失败处理 |
|
|
208
|
-
|------|---------|---------|---------|
|
|
209
|
-
| N+1 检查 | 循环查询扫描 | 无循环查询 | 批量查询 |
|
|
210
|
-
| 分页检查 | 无分页查询扫描 | 大表强制分页 | 添加分页 |
|
|
211
|
-
| 缓存检查 | 热点数据扫描 | 热点数据有缓存 | 添加缓存 |
|
|
212
|
-
| 响应时间检查 | API 监控 | 响应时间 < 500ms | 分析优化 |
|
|
213
|
-
| 内存检查 | 内存分析 | 无内存泄漏 | 修复泄漏 |
|
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
# Code Review Rubric 体系
|
|
2
|
-
|
|
3
|
-
> 10 条可检测工程规范,用于评估 code-review Skill 质量
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Rubric 定义
|
|
8
|
-
|
|
9
|
-
| 规则 | 检查内容 | 标准 | 检测方式 |
|
|
10
|
-
|------|----------|------|----------|
|
|
11
|
-
| **R1** | 渐进式加载 | 每个 Bundle <= 10 文件 | 文件计数 |
|
|
12
|
-
| **R2** | 规则覆盖率 | 覆盖 >= 90% MUST/NEVER | 规则计数 |
|
|
13
|
-
| **R3** | 位置准确性 | 行号偏差 <= 3 行 | 位置比对 |
|
|
14
|
-
| **R4** | 可解释性 | 100% 问题可追溯规则 | 规则ID检查 |
|
|
15
|
-
| **R5** | 问题分级 | P0 必须修复 | 分级检查 |
|
|
16
|
-
| **R6** | 跨模块影响 | 涉及跨模块时必须检查 | import分析 |
|
|
17
|
-
| **R7** | 输出格式 | 符合 REVIEW.md 规范 | 格式验证 |
|
|
18
|
-
| **R8** | 确认节点 | P0 问题修复前确认 | 流程检查 |
|
|
19
|
-
| **R9** | Pre-Delivery | 无位置漂移、无遗漏 | 自检验证 |
|
|
20
|
-
| **R10** | 反 Slop | 问题描述 <= 100 字 | 字数统计 |
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 详细说明
|
|
25
|
-
|
|
26
|
-
### R1: 渐进式加载
|
|
27
|
-
|
|
28
|
-
**目的**:避免一次性加载过多文件导致 Token 超限
|
|
29
|
-
|
|
30
|
-
**检查方式**:
|
|
31
|
-
```javascript
|
|
32
|
-
function checkR1(bundles) {
|
|
33
|
-
for (const bundle of bundles) {
|
|
34
|
-
if (bundle.files.length > 10) {
|
|
35
|
-
return { pass: false, message: `Bundle ${bundle.name} 超过 10 文件` };
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return { pass: true };
|
|
39
|
-
}
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
### R2: 规则覆盖率
|
|
45
|
-
|
|
46
|
-
**目的**:确保所有 MUST/NEVER 规则都被检查
|
|
47
|
-
|
|
48
|
-
**检查方式**:
|
|
49
|
-
```javascript
|
|
50
|
-
function checkR2(checkedRules, allRules) {
|
|
51
|
-
const coverage = checkedRules.length / allRules.length * 100;
|
|
52
|
-
if (coverage < 90) {
|
|
53
|
-
return { pass: false, coverage, missing: allRules.filter(r => !checkedRules.includes(r)) };
|
|
54
|
-
}
|
|
55
|
-
return { pass: true, coverage };
|
|
56
|
-
}
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
### R3: 位置准确性
|
|
62
|
-
|
|
63
|
-
**目的**:确保问题定位精确到行号
|
|
64
|
-
|
|
65
|
-
**检查方式**:
|
|
66
|
-
```javascript
|
|
67
|
-
function checkR3(issues, actualLines) {
|
|
68
|
-
for (const issue of issues) {
|
|
69
|
-
const diff = Math.abs(issue.line - actualLines[issue.file][issue.ruleId]);
|
|
70
|
-
if (diff > 3) {
|
|
71
|
-
return { pass: false, issue, diff };
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return { pass: true };
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
### R4: 可解释性
|
|
81
|
-
|
|
82
|
-
**目的**:每个问题必须有明确的规则依据
|
|
83
|
-
|
|
84
|
-
**检查方式**:
|
|
85
|
-
```javascript
|
|
86
|
-
function checkR4(issues) {
|
|
87
|
-
for (const issue of issues) {
|
|
88
|
-
if (!issue.ruleId || !issue.ruleName) {
|
|
89
|
-
return { pass: false, issue, message: '缺少规则依据' };
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return { pass: true };
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
### R5: 问题分级
|
|
99
|
-
|
|
100
|
-
**目的**:P0 问题必须修复,不能忽略
|
|
101
|
-
|
|
102
|
-
**检查方式**:
|
|
103
|
-
```javascript
|
|
104
|
-
function checkR5(issues, fixedIssues) {
|
|
105
|
-
const p0Issues = issues.filter(i => i.level === 'P0');
|
|
106
|
-
const unfixedP0 = p0Issues.filter(i => !fixedIssues.includes(i.id));
|
|
107
|
-
if (unfixedP0.length > 0) {
|
|
108
|
-
return { pass: false, unfixed: unfixedP0 };
|
|
109
|
-
}
|
|
110
|
-
return { pass: true };
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
### R6: 跨模块影响
|
|
117
|
-
|
|
118
|
-
**目的**:涉及跨模块调用时必须检查影响
|
|
119
|
-
|
|
120
|
-
**检查方式**:
|
|
121
|
-
```javascript
|
|
122
|
-
function checkR6(content, crossModuleImports) {
|
|
123
|
-
if (crossModuleImports.length > 0) {
|
|
124
|
-
// 必须有跨模块影响分析
|
|
125
|
-
return { pass: true, imports: crossModuleImports };
|
|
126
|
-
}
|
|
127
|
-
return { pass: true };
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
### R7: 输出格式
|
|
134
|
-
|
|
135
|
-
**目的**:报告格式符合规范,便于团队协作
|
|
136
|
-
|
|
137
|
-
**检查方式**:
|
|
138
|
-
```javascript
|
|
139
|
-
function checkR7(report) {
|
|
140
|
-
const requiredSections = ['评审概要', '问题列表', '跨模块影响分析', '评审结论'];
|
|
141
|
-
for (const section of requiredSections) {
|
|
142
|
-
if (!report.includes(section)) {
|
|
143
|
-
return { pass: false, missing: section };
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
return { pass: true };
|
|
147
|
-
}
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
### R8: 确认节点
|
|
153
|
-
|
|
154
|
-
**目的**:P0 问题修复前必须请求用户确认
|
|
155
|
-
|
|
156
|
-
**检查方式**:
|
|
157
|
-
```javascript
|
|
158
|
-
function checkR8(workflow) {
|
|
159
|
-
const p0Issues = workflow.issues.filter(i => i.level === 'P0');
|
|
160
|
-
if (p0Issues.length > 0 && !workflow.confirmationRequested) {
|
|
161
|
-
return { pass: false, message: 'P0 问题修复前未请求确认' };
|
|
162
|
-
}
|
|
163
|
-
return { pass: true };
|
|
164
|
-
}
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
### R9: Pre-Delivery 自检
|
|
170
|
-
|
|
171
|
-
**目的**:报告生成前自检,确保质量
|
|
172
|
-
|
|
173
|
-
**检查方式**:
|
|
174
|
-
```javascript
|
|
175
|
-
function checkR9(report, sourceFiles) {
|
|
176
|
-
// 检查位置漂移
|
|
177
|
-
// 检查遗漏文件
|
|
178
|
-
const coveredFiles = report.issues.map(i => i.file);
|
|
179
|
-
const missingFiles = sourceFiles.filter(f => !coveredFiles.includes(f));
|
|
180
|
-
if (missingFiles.length > 0) {
|
|
181
|
-
return { pass: false, missing: missingFiles };
|
|
182
|
-
}
|
|
183
|
-
return { pass: true };
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
### R10: 反 Slop
|
|
190
|
-
|
|
191
|
-
**目的**:问题描述简洁,避免冗余
|
|
192
|
-
|
|
193
|
-
**检查方式**:
|
|
194
|
-
```javascript
|
|
195
|
-
function checkR10(issues) {
|
|
196
|
-
for (const issue of issues) {
|
|
197
|
-
if (issue.message.length > 100) {
|
|
198
|
-
return { pass: false, issue, length: issue.message.length };
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
return { pass: true };
|
|
202
|
-
}
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
|
-
## Rubric 评分
|
|
208
|
-
|
|
209
|
-
| 评分 | 说明 |
|
|
210
|
-
|------|------|
|
|
211
|
-
| **10/10** | 所有规则通过 |
|
|
212
|
-
| **8-9/10** | 1-2 条规则轻微偏离 |
|
|
213
|
-
| **6-7/10** | 3-4 条规则偏离,需改进 |
|
|
214
|
-
| **<6/10** | 多条规则失败,需重构 |
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## CI 集成
|
|
219
|
-
|
|
220
|
-
```yaml
|
|
221
|
-
# .github/workflows/rubric-check.yml
|
|
222
|
-
name: Rubric Check
|
|
223
|
-
on: [push]
|
|
224
|
-
jobs:
|
|
225
|
-
check:
|
|
226
|
-
runs-on: ubuntu-latest
|
|
227
|
-
steps:
|
|
228
|
-
- uses: actions/checkout@v4
|
|
229
|
-
- name: Run Rubric Check
|
|
230
|
-
run: |
|
|
231
|
-
node scripts/check-rubric.mjs --skill code-review
|
|
232
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Code Review Rules
|
|
2
|
-
|
|
3
|
-
> This file keeps the shared rule IDs for `code-review`.
|
|
4
|
-
> Finding templates live in `findings-template.md`.
|
|
5
|
-
> Stack-specific notes live in `stack-notes.md`.
|
|
6
|
-
> Generic review rules live in `rules/review/code.md`.
|
|
7
|
-
> Stack overlays live in `rules/review/java.md`, `rules/review/vue.md`, and `rules/review/ts.md`.
|
|
8
|
-
|
|
9
|
-
## MUST Rules
|
|
10
|
-
|
|
11
|
-
- `MUST-001` Entity must extend the project delete base class.
|
|
12
|
-
- `MUST-002` Primary key must use the project-assigned ID strategy.
|
|
13
|
-
- `MUST-003` State fields must use the agreed enum code pattern.
|
|
14
|
-
- `MUST-004` Controller must call Service, not Mapper.
|
|
15
|
-
- `MUST-005` REST endpoints must return the unified response wrapper.
|
|
16
|
-
- `MUST-006` Cross-table Service operations must use a transaction boundary.
|
|
17
|
-
- `MUST-007` DTO / VO must use the shared conversion approach.
|
|
18
|
-
- `MUST-008` Write endpoints must use the shared validation approach.
|
|
19
|
-
|
|
20
|
-
## NEVER Rules
|
|
21
|
-
|
|
22
|
-
- `NEVER-001` Controller must not access Mapper directly.
|
|
23
|
-
- `NEVER-002` Transactional methods must not make remote calls.
|
|
24
|
-
- `NEVER-003` Mapper must not contain business logic.
|
|
25
|
-
- `NEVER-004` Do not query by raw string column names.
|
|
26
|
-
- `NEVER-005` Do not use left-fuzzy LIKE.
|
|
27
|
-
- `NEVER-006` Do not compare status with magic values.
|
|
28
|
-
|
|
29
|
-
## Security Rules
|
|
30
|
-
|
|
31
|
-
- `SEC-001` Do not hardcode sensitive values.
|
|
32
|
-
- `SEC-002` Do not introduce SQL injection risk.
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
# 安全检查清单
|
|
2
|
-
|
|
3
|
-
> 基于 OWASP Top 10 的安全审查检查项
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Injection Vulnerabilities (注入漏洞)
|
|
8
|
-
|
|
9
|
-
### SQL Injection
|
|
10
|
-
|
|
11
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
12
|
-
|--------|----------|----------|
|
|
13
|
-
| ${} 参数 | Mapper XML 使用 ${} | 使用 #{} 或 Lambda |
|
|
14
|
-
| 动态 SQL 拼接 | 字符串拼接 SQL | 使用 MyBatis 动态 SQL |
|
|
15
|
-
| ORDER BY 白名单 | ORDER BY 使用 ${} | 白名单验证字段名 |
|
|
16
|
-
|
|
17
|
-
**示例**:
|
|
18
|
-
```java
|
|
19
|
-
// ❌ SQL 注入风险
|
|
20
|
-
@Select("SELECT * FROM t_user WHERE name = '${name}'")
|
|
21
|
-
List<User> findByName(String name);
|
|
22
|
-
|
|
23
|
-
// ✅ 安全做法
|
|
24
|
-
@Select("SELECT * FROM t_user WHERE name = #{name}")
|
|
25
|
-
List<User> findByName(String name);
|
|
26
|
-
|
|
27
|
-
// ✅ Lambda 查询
|
|
28
|
-
lambdaQuery().eq(UserEntity::getName, name);
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Command Injection
|
|
32
|
-
|
|
33
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
34
|
-
|--------|----------|----------|
|
|
35
|
-
| Runtime.exec() | 直接执行用户输入 | 白名单验证命令 |
|
|
36
|
-
| ProcessBuilder | 用户输入作为参数 | 参数校验 |
|
|
37
|
-
|
|
38
|
-
### XSS (Cross-Site Scripting)
|
|
39
|
-
|
|
40
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
41
|
-
|--------|----------|----------|
|
|
42
|
-
| 用户输入直接输出 | 无转义输出 | HTML 转义 |
|
|
43
|
-
| 富文本存储 | 存储原始 HTML | 过滤危险标签 |
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## Sensitive Data (敏感数据)
|
|
48
|
-
|
|
49
|
-
### Hardcoded Secrets
|
|
50
|
-
|
|
51
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
52
|
-
|--------|----------|----------|
|
|
53
|
-
| 密码硬编码 | 源码中的密码 | 使用环境变量/配置中心 |
|
|
54
|
-
| 密钥硬编码 | API Key 在代码中 | 使用密钥管理服务 |
|
|
55
|
-
| Token 硬编码 | JWT Token 在代码中 | 动态获取 |
|
|
56
|
-
|
|
57
|
-
**示例**:
|
|
58
|
-
```java
|
|
59
|
-
// ❌ 硬编码密码
|
|
60
|
-
private String password = "123456";
|
|
61
|
-
|
|
62
|
-
// ✅ 安全做法
|
|
63
|
-
@Value("${app.password}")
|
|
64
|
-
private String password;
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### Logging Sensitive Data
|
|
68
|
-
|
|
69
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
70
|
-
|--------|----------|----------|
|
|
71
|
-
| 密码日志 | log.info(password) | 不打印敏感数据 |
|
|
72
|
-
| Token 日志 | log.debug(token) | 脱敏或移除 |
|
|
73
|
-
| 身份证日志 | log.info(idCard) | 脱敏打印 |
|
|
74
|
-
|
|
75
|
-
### Exception Information Leakage
|
|
76
|
-
|
|
77
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
78
|
-
|--------|----------|----------|
|
|
79
|
-
| 异常堆栈暴露 | 返回完整堆栈 | 返回友好错误消息 |
|
|
80
|
-
| 数据库错误暴露 | 返回 SQL 错误 | 返回通用错误 |
|
|
81
|
-
| 内部路径暴露 | 返回文件路径 | 返回通用错误 |
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Authentication & Authorization (认证授权)
|
|
86
|
-
|
|
87
|
-
### Authentication Bypass
|
|
88
|
-
|
|
89
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
90
|
-
|--------|----------|----------|
|
|
91
|
-
| 公开接口 | 无认证的敏感接口 | 添加认证 |
|
|
92
|
-
| 默认密码 | 系统默认密码 | 强制修改 |
|
|
93
|
-
| 弱密码 | 无密码复杂度要求 | 密码策略 |
|
|
94
|
-
|
|
95
|
-
### Authorization Missing
|
|
96
|
-
|
|
97
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
98
|
-
|--------|----------|----------|
|
|
99
|
-
| 无权限注解 | 缺少 @PreAuthorize | 添加权限控制 |
|
|
100
|
-
| 权限绕过 | 接口权限不一致 | 统一权限配置 |
|
|
101
|
-
| 越权访问 | 用户可访问他人数据 | 数据归属检查 |
|
|
102
|
-
|
|
103
|
-
**示例**:
|
|
104
|
-
```java
|
|
105
|
-
// ❌ 无权限控制
|
|
106
|
-
@GetMapping("/order/{id}")
|
|
107
|
-
public Result<OrderVO> getOrder(@PathVariable Long id) {
|
|
108
|
-
return service.getById(id); // 用户可访问任何订单
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// ✅ 数据归属检查
|
|
112
|
-
@GetMapping("/order/{id}")
|
|
113
|
-
public Result<OrderVO> getOrder(@PathVariable Long id) {
|
|
114
|
-
OrderVO order = service.getById(id);
|
|
115
|
-
if (!order.getUserId().equals(SecurityUtils.getUserId())) {
|
|
116
|
-
throw new BusinessException("无权访问");
|
|
117
|
-
}
|
|
118
|
-
return Result.ok(order);
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
## Data Protection (数据保护)
|
|
125
|
-
|
|
126
|
-
### Data Masking
|
|
127
|
-
|
|
128
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
129
|
-
|--------|----------|----------|
|
|
130
|
-
| 手机号脱敏 | 返回完整手机号 | @Sensitive(SensitiveType.PHONE) |
|
|
131
|
-
| 身份证脱敏 | 返回完整身份证 | @Sensitive(SensitiveType.ID_CARD) |
|
|
132
|
-
| 银行卡脱敏 | 返回完整银行卡 | @Sensitive(SensitiveType.BANK_CARD) |
|
|
133
|
-
|
|
134
|
-
### Encryption
|
|
135
|
-
|
|
136
|
-
| 检查项 | 问题信号 | 修复方案 |
|
|
137
|
-
|--------|----------|----------|
|
|
138
|
-
| 密码存储 | 明文存储密码 | BCrypt 加密 |
|
|
139
|
-
| 敏感数据存储 | 明文存储敏感数据 | AES 加密 |
|
|
140
|
-
| 传输加密 | HTTP 传输 | HTTPS |
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## Severity Classification
|
|
145
|
-
|
|
146
|
-
| 等级 | 描述 | 处理要求 |
|
|
147
|
-
|------|------|---------|
|
|
148
|
-
| 🔴 Critical | 可被利用的漏洞 | 立即修复 |
|
|
149
|
-
| 🟠 High | 高风险问题 | 本次发布前修复 |
|
|
150
|
-
| 🟡 Medium | 中等风险 | 计划修复 |
|
|
151
|
-
| 🟢 Low | 低风险/建议 | 可接受 |
|
|
152
|
-
|
|
153
|
-
---
|
|
154
|
-
|
|
155
|
-
## Anti-rationalization Table (Security)
|
|
156
|
-
|
|
157
|
-
| 常见借口 | 反驳理由 | 正确做法 |
|
|
158
|
-
|---------|---------|---------|
|
|
159
|
-
| "这个问题不会发生" | 所有可能的问题都会发生 | 处理问题 |
|
|
160
|
-
| "这个漏洞很难利用" | 难利用不代表不会被利用 | 修复漏洞 |
|
|
161
|
-
| "用户不会这样操作" | 用户总会找到边界情况 | 处理所有边界 |
|
|
162
|
-
| "这只是内部系统" | 内部系统也可能被攻击 | 同样严格检查 |
|
|
163
|
-
| "这个数据不重要" | 不重要数据也可能泄露 | 保护所有数据 |
|
|
164
|
-
| "以后再修复" | 安全问题修复成本更高 | 立即修复 |
|
|
165
|
-
| "这是框架的问题" | 使用框架也要遵守规范 | 检查框架使用 |
|
|
166
|
-
| "测试环境不需要" | 测试环境也可能泄露 | 全环境检查 |
|
|
167
|
-
|
|
168
|
-
---
|
|
169
|
-
|
|
170
|
-
## Verification Gates
|
|
171
|
-
|
|
172
|
-
| 门禁 | 检查方法 | 通过条件 | 失败处理 |
|
|
173
|
-
|------|---------|---------|---------|
|
|
174
|
-
| SQL注入检查 | ${} 扫描 | 无 ${} 使用 | 替换为 #{} |
|
|
175
|
-
| 硬编码检查 | 密码扫描 | 无密码硬编码 | 移除硬编码 |
|
|
176
|
-
| 日志检查 | 日志扫描 | 无敏感数据日志 | 移除敏感日志 |
|
|
177
|
-
| 权限检查 | 接口扫描 | 敏感接口有权限 | 添加权限 |
|
|
178
|
-
| 脱敏检查 | VO扫描 | 敏感字段有 @Sensitive | 添加脱敏 |
|