@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,25 +0,0 @@
|
|
|
1
|
-
# Code Review Stack Notes
|
|
2
|
-
|
|
3
|
-
## Profile Scope
|
|
4
|
-
|
|
5
|
-
- `code` is the generic review profile.
|
|
6
|
-
- `code-java` is the Java / Spring / MyBatis / Pig Cloud overlay.
|
|
7
|
-
- `code-vue` is the Vue 3 / frontend overlay.
|
|
8
|
-
- `code-ts` is the TypeScript / frontend utility overlay.
|
|
9
|
-
- Future stacks should add a new overlay instead of stretching `code`.
|
|
10
|
-
|
|
11
|
-
## Mapping Hints
|
|
12
|
-
|
|
13
|
-
- `*Entity.java` mainly covers entity and key conventions.
|
|
14
|
-
- `*Controller.java` mainly covers controller, validation, and response contracts.
|
|
15
|
-
- `*Service*.java` mainly covers service boundaries and transaction rules.
|
|
16
|
-
- `*Mapper.java` mainly covers mapper logic and query shape.
|
|
17
|
-
- `*DTO.java` / `*VO.java` mainly cover conversion boundaries.
|
|
18
|
-
- `*.vue` mainly covers component boundaries and reactive flow.
|
|
19
|
-
- `*.ts` / `*.tsx` mainly cover typed utilities, state modules, and config boundaries.
|
|
20
|
-
|
|
21
|
-
## Review Rule
|
|
22
|
-
|
|
23
|
-
- When a stack overlay applies, anchor the finding to the smallest stack-specific surface.
|
|
24
|
-
- If the issue is generic, keep it in `code`.
|
|
25
|
-
- If the issue is stack-specific, let the overlay own the first fix path.
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# 代码审查报告模板
|
|
2
|
-
|
|
3
|
-
> 代码审查结果的标准输出格式,用于保持结论清晰、可复核、可归档。
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 基本信息
|
|
8
|
-
|
|
9
|
-
| 字段 | 说明 |
|
|
10
|
-
|------|------|
|
|
11
|
-
| 审查时间 | {datetime} |
|
|
12
|
-
| 审查对象 | {repo / branch / pr} |
|
|
13
|
-
| 审查人 | {reviewer} |
|
|
14
|
-
| 审查范围 | {diff / files / modules} |
|
|
15
|
-
|
|
16
|
-
## 结论摘要
|
|
17
|
-
|
|
18
|
-
- 总体结论:{pass / pass with comments / fail}
|
|
19
|
-
- 风险等级:{low / medium / high}
|
|
20
|
-
- 是否建议合并:{yes / no}
|
|
21
|
-
|
|
22
|
-
## 发现项
|
|
23
|
-
|
|
24
|
-
| 等级 | 文件 | 问题 | 建议 |
|
|
25
|
-
|------|------|------|------|
|
|
26
|
-
| P0 | {file} | {issue} | {fix} |
|
|
27
|
-
| P1 | {file} | {issue} | {fix} |
|
|
28
|
-
| P2 | {file} | {issue} | {fix} |
|
|
29
|
-
|
|
30
|
-
## 验证信息
|
|
31
|
-
|
|
32
|
-
- 已运行的检查:{lint / test / manual check}
|
|
33
|
-
- 未覆盖的风险:{gaps}
|
|
34
|
-
- 需要补充的证据:{evidence}
|
|
35
|
-
|
|
36
|
-
## 备注
|
|
37
|
-
|
|
38
|
-
- 如果没有发现问题,也要明确说明“未发现阻断项”。
|
|
39
|
-
- 如果有假设,要明确标注假设来源。
|
|
@@ -1,431 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* lint-code-review.mjs - 零依赖代码审查 Lint 脚本
|
|
5
|
-
*
|
|
6
|
-
* 用法:
|
|
7
|
-
* node lint-code-review.mjs --files <file-list>
|
|
8
|
-
* node lint-code-review.mjs --files <file-list> --json
|
|
9
|
-
* node lint-code-review.mjs --files <file-list> --quick
|
|
10
|
-
*
|
|
11
|
-
* 输出:
|
|
12
|
-
* P0-P3 分级问题列表
|
|
13
|
-
* JSON 格式支持 CI 集成
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { readFileSync, existsSync, statSync } from 'fs';
|
|
17
|
-
import { join, basename } from 'path';
|
|
18
|
-
|
|
19
|
-
// 命令行参数解析
|
|
20
|
-
const args = process.argv.slice(2);
|
|
21
|
-
const options = {
|
|
22
|
-
files: [],
|
|
23
|
-
json: false,
|
|
24
|
-
quick: false
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
for (let i = 0; i < args.length; i++) {
|
|
28
|
-
if (args[i] === '--files') {
|
|
29
|
-
options.files = args[i + 1]?.split(',').filter(f => f) || [];
|
|
30
|
-
i++;
|
|
31
|
-
} else if (args[i] === '--json') {
|
|
32
|
-
options.json = true;
|
|
33
|
-
} else if (args[i] === '--quick') {
|
|
34
|
-
options.quick = true;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// 规则定义
|
|
39
|
-
const RULES = {
|
|
40
|
-
// MUST 规则
|
|
41
|
-
'MUST-001': {
|
|
42
|
-
level: 'P1',
|
|
43
|
-
name: 'Entity 基类',
|
|
44
|
-
pattern: /class\s+\w+Entity\s+extends\s+/,
|
|
45
|
-
check: (content, filePath) => {
|
|
46
|
-
if (!filePath.includes('Entity')) return null;
|
|
47
|
-
if (!content.includes('MpRealDelEntity') && !content.includes('MpLogicDelEntity')) {
|
|
48
|
-
return {
|
|
49
|
-
message: 'Entity 未继承 MpRealDelEntity 或 MpLogicDelEntity',
|
|
50
|
-
fix: 'extends MpRealDelEntity<Entity>'
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
'MUST-002': {
|
|
57
|
-
level: 'P1',
|
|
58
|
-
name: '主键注解',
|
|
59
|
-
pattern: /@TableId/,
|
|
60
|
-
check: (content, filePath) => {
|
|
61
|
-
if (!filePath.includes('Entity')) return null;
|
|
62
|
-
if (content.includes('@TableId') && !content.includes('IdType.ASSIGN_ID')) {
|
|
63
|
-
return {
|
|
64
|
-
message: '主键未使用雪花算法',
|
|
65
|
-
fix: '@TableId(type = IdType.ASSIGN_ID)'
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
'MUST-004': {
|
|
72
|
-
level: 'P0',
|
|
73
|
-
name: '分层规范',
|
|
74
|
-
pattern: /@Autowired|@Resource/,
|
|
75
|
-
check: (content, filePath) => {
|
|
76
|
-
if (!filePath.includes('Controller')) return null;
|
|
77
|
-
// Controller 直接注入 Mapper
|
|
78
|
-
const mapperInject = content.match(/@(Autowired|Resource)\s*(private\s+)?(\w+Mapper)/);
|
|
79
|
-
if (mapperInject) {
|
|
80
|
-
const lineNum = getLineNumber(content, mapperInject[0]);
|
|
81
|
-
return {
|
|
82
|
-
line: lineNum,
|
|
83
|
-
message: 'Controller 直接注入 Mapper,违反分层规范',
|
|
84
|
-
code: mapperInject[0],
|
|
85
|
-
fix: '通过 Service 层访问数据'
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
},
|
|
91
|
-
'MUST-005': {
|
|
92
|
-
level: 'P1',
|
|
93
|
-
name: '返回规范',
|
|
94
|
-
pattern: /public\s+\w+\s+\w+\s*\(/,
|
|
95
|
-
check: (content, filePath) => {
|
|
96
|
-
if (!filePath.includes('Controller')) return null;
|
|
97
|
-
// 检查 REST 方法返回类型
|
|
98
|
-
const methods = content.matchAll(/@(GetMapping|PostMapping|PutMapping|DeleteMapping|RequestMapping)[\s\S]*?public\s+(\w+(?:<[^>]+>)?)\s+\w+\s*\(/g);
|
|
99
|
-
for (const method of methods) {
|
|
100
|
-
const returnType = method[2];
|
|
101
|
-
if (!returnType.includes('Result') && returnType !== 'void') {
|
|
102
|
-
const lineNum = getLineNumber(content, method[0]);
|
|
103
|
-
return {
|
|
104
|
-
line: lineNum,
|
|
105
|
-
message: `REST 方法返回类型应为 Result<T>,当前为 ${returnType}`,
|
|
106
|
-
fix: '返回 Result<T>'
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
},
|
|
113
|
-
'MUST-006': {
|
|
114
|
-
level: 'P1',
|
|
115
|
-
name: '事务注解',
|
|
116
|
-
pattern: /@Transactional/,
|
|
117
|
-
check: (content, filePath) => {
|
|
118
|
-
if (!filePath.includes('Service')) return null;
|
|
119
|
-
// 检查是否有跨表操作但无事务
|
|
120
|
-
const hasMultiTableOp = content.includes('insert') && content.includes('update') ||
|
|
121
|
-
content.includes('insert') && content.includes('delete') ||
|
|
122
|
-
content.includes('mapper') && content.includes('mapper');
|
|
123
|
-
if (hasMultiTableOp && !content.includes('@Transactional')) {
|
|
124
|
-
return {
|
|
125
|
-
message: '跨表操作未添加事务注解',
|
|
126
|
-
fix: '@Transactional(rollbackFor = Exception.class)'
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
|
|
133
|
-
// NEVER 规则
|
|
134
|
-
'NEVER-001': {
|
|
135
|
-
level: 'P0',
|
|
136
|
-
name: 'Controller 直接访问 Mapper',
|
|
137
|
-
pattern: /Mapper\s+mapper/,
|
|
138
|
-
check: (content, filePath) => {
|
|
139
|
-
if (!filePath.includes('Controller')) return null;
|
|
140
|
-
const mapperRef = content.match(/(\w+Mapper)\s+\w+;/);
|
|
141
|
-
if (mapperRef) {
|
|
142
|
-
const lineNum = getLineNumber(content, mapperRef[0]);
|
|
143
|
-
return {
|
|
144
|
-
line: lineNum,
|
|
145
|
-
message: 'Controller 直接访问 Mapper',
|
|
146
|
-
code: mapperRef[0],
|
|
147
|
-
fix: '通过 Service 层访问'
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
return null;
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
'NEVER-002': {
|
|
154
|
-
level: 'P0',
|
|
155
|
-
name: '事务中远程调用',
|
|
156
|
-
pattern: /@Transactional[\s\S]*?(FeignClient|RestTemplate|HttpClient|WebClient)/,
|
|
157
|
-
check: (content, filePath) => {
|
|
158
|
-
if (!filePath.includes('Service')) return null;
|
|
159
|
-
// 检查事务方法中是否有远程调用
|
|
160
|
-
const transactionalBlock = content.match(/@Transactional[\s\S]{0,500}(?:@FeignClient|restTemplate|httpClient|webClient|\.api\()/);
|
|
161
|
-
if (transactionalBlock) {
|
|
162
|
-
const lineNum = getLineNumber(content, transactionalBlock[0]);
|
|
163
|
-
return {
|
|
164
|
-
line: lineNum,
|
|
165
|
-
message: '事务方法中执行远程调用',
|
|
166
|
-
fix: '将远程调用移到事务方法外部'
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
},
|
|
172
|
-
'NEVER-003': {
|
|
173
|
-
level: 'P1',
|
|
174
|
-
name: 'Mapper 业务逻辑',
|
|
175
|
-
pattern: /default\s+(void|Result|boolean)/,
|
|
176
|
-
check: (content, filePath) => {
|
|
177
|
-
if (!filePath.includes('Mapper')) return null;
|
|
178
|
-
// Mapper 中有 default 方法实现业务逻辑
|
|
179
|
-
const defaultMethod = content.match(/default\s+(?!class|interface)\w+\s+\w+\s*\([^)]*\)\s*\{[\s\S]{50,}/);
|
|
180
|
-
if (defaultMethod && !defaultMethod[0].includes('selectById') && !defaultMethod[0].includes('insert')) {
|
|
181
|
-
const lineNum = getLineNumber(content, defaultMethod[0]);
|
|
182
|
-
return {
|
|
183
|
-
line: lineNum,
|
|
184
|
-
message: 'Mapper 中放置业务逻辑',
|
|
185
|
-
fix: '将业务逻辑移到 Service 层'
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
return null;
|
|
189
|
-
}
|
|
190
|
-
},
|
|
191
|
-
'NEVER-004': {
|
|
192
|
-
level: 'P1',
|
|
193
|
-
name: 'String column names',
|
|
194
|
-
pattern: /\.eq\("|\.\s*like\("|\.\s*ne\("|\.\s*gt\("|\.\s*lt\("|\.\s*ge\("|\.\s*le\("/,
|
|
195
|
-
check: (content, filePath) => {
|
|
196
|
-
const stringColumn = content.match(/queryWrapper\.(?:eq|ne|gt|lt|ge|le|like)\s*\(\s*"/);
|
|
197
|
-
if (stringColumn) {
|
|
198
|
-
const lineNum = getLineNumber(content, stringColumn[0]);
|
|
199
|
-
return {
|
|
200
|
-
line: lineNum,
|
|
201
|
-
message: '使用 string column names 查询',
|
|
202
|
-
code: stringColumn[0],
|
|
203
|
-
fix: '使用 lambdaQuery().eq(Entity::getField, value)'
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
return null;
|
|
207
|
-
}
|
|
208
|
-
},
|
|
209
|
-
'NEVER-005': {
|
|
210
|
-
level: 'P2',
|
|
211
|
-
name: 'Left-fuzzy LIKE',
|
|
212
|
-
pattern: /\.like\("%|\.likeLeft\(/,
|
|
213
|
-
check: (content) => {
|
|
214
|
-
const leftFuzzy = content.match(/\.like\s*\(\s*["']%/);
|
|
215
|
-
if (leftFuzzy) {
|
|
216
|
-
const lineNum = getLineNumber(content, leftFuzzy[0]);
|
|
217
|
-
return {
|
|
218
|
-
line: lineNum,
|
|
219
|
-
message: '使用 left-fuzzy LIKE,性能较差',
|
|
220
|
-
fix: '使用 likeRight 或避免左模糊查询'
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
return null;
|
|
224
|
-
}
|
|
225
|
-
},
|
|
226
|
-
'NEVER-006': {
|
|
227
|
-
level: 'P2',
|
|
228
|
-
name: 'Magic values',
|
|
229
|
-
pattern: /==\s*[0-9]+\s*\)|==\s*"[^"]+"\s*\)/,
|
|
230
|
-
check: (content) => {
|
|
231
|
-
const magicValue = content.match(/(?:status|type|state|level)\s*==\s*(?:[0-9]+|"[^"]+")\s*\)/);
|
|
232
|
-
if (magicValue) {
|
|
233
|
-
const lineNum = getLineNumber(content, magicValue[0]);
|
|
234
|
-
return {
|
|
235
|
-
line: lineNum,
|
|
236
|
-
message: '使用 magic values 状态比较',
|
|
237
|
-
code: magicValue[0],
|
|
238
|
-
fix: '使用 @EnumValue + CodeMessageEnumable'
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
return null;
|
|
242
|
-
}
|
|
243
|
-
},
|
|
244
|
-
|
|
245
|
-
// 安全检查
|
|
246
|
-
'SEC-001': {
|
|
247
|
-
level: 'P0',
|
|
248
|
-
name: '硬编码密码',
|
|
249
|
-
pattern: /password\s*=\s*"[^"]+"/,
|
|
250
|
-
check: (content) => {
|
|
251
|
-
const hardcoded = content.match(/(?:password|passwd|pwd|secret|token|key)\s*=\s*"[^"]{8,}"/);
|
|
252
|
-
if (hardcoded && !hardcoded[0].includes('${') && !hardcoded[0].includes('placeholder')) {
|
|
253
|
-
const lineNum = getLineNumber(content, hardcoded[0]);
|
|
254
|
-
return {
|
|
255
|
-
line: lineNum,
|
|
256
|
-
message: '硬编码敏感信息',
|
|
257
|
-
fix: '使用配置文件或环境变量'
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
return null;
|
|
261
|
-
}
|
|
262
|
-
},
|
|
263
|
-
'SEC-002': {
|
|
264
|
-
level: 'P0',
|
|
265
|
-
name: 'SQL 注入',
|
|
266
|
-
pattern: /\$\{[^}]+\}/,
|
|
267
|
-
check: (content) => {
|
|
268
|
-
// 检查 Mapper XML 中的 ${} 参数
|
|
269
|
-
if (content.includes('${') && !content.includes('${orderBy')) {
|
|
270
|
-
const sqlInjection = content.match(/\$\{[^}]+\}/);
|
|
271
|
-
if (sqlInjection) {
|
|
272
|
-
const lineNum = getLineNumber(content, sqlInjection[0]);
|
|
273
|
-
return {
|
|
274
|
-
line: lineNum,
|
|
275
|
-
message: 'SQL 注入风险:使用 ${} 参数',
|
|
276
|
-
fix: '使用 #{} 参数替代'
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
return null;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
};
|
|
284
|
-
|
|
285
|
-
// 获取行号
|
|
286
|
-
function getLineNumber(content, searchStr) {
|
|
287
|
-
const lines = content.split('\n');
|
|
288
|
-
for (let i = 0; i < lines.length; i++) {
|
|
289
|
-
if (lines[i].includes(searchStr.substring(0, 50))) {
|
|
290
|
-
return i + 1;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
return 1;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
// 检查单个文件
|
|
297
|
-
function checkFile(filePath) {
|
|
298
|
-
const issues = [];
|
|
299
|
-
|
|
300
|
-
if (!existsSync(filePath)) {
|
|
301
|
-
return issues;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
const content = readFileSync(filePath, 'utf-8');
|
|
305
|
-
|
|
306
|
-
for (const [ruleId, rule] of Object.entries(RULES)) {
|
|
307
|
-
// Quick 模式只检查 P0 规则
|
|
308
|
-
if (options.quick && rule.level !== 'P0') {
|
|
309
|
-
continue;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
try {
|
|
313
|
-
const result = rule.check(content, filePath);
|
|
314
|
-
if (result) {
|
|
315
|
-
issues.push({
|
|
316
|
-
ruleId,
|
|
317
|
-
ruleName: rule.name,
|
|
318
|
-
level: rule.level,
|
|
319
|
-
file: filePath,
|
|
320
|
-
line: result.line || 1,
|
|
321
|
-
message: result.message,
|
|
322
|
-
code: result.code || '',
|
|
323
|
-
fix: result.fix || ''
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
} catch (e) {
|
|
327
|
-
// 规则检查失败,跳过
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
return issues;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// 主函数
|
|
335
|
-
function lint() {
|
|
336
|
-
const results = {
|
|
337
|
-
p0Count: 0,
|
|
338
|
-
p1Count: 0,
|
|
339
|
-
p2Count: 0,
|
|
340
|
-
p3Count: 0,
|
|
341
|
-
issues: [],
|
|
342
|
-
filesChecked: options.files.length,
|
|
343
|
-
timestamp: new Date().toISOString()
|
|
344
|
-
};
|
|
345
|
-
|
|
346
|
-
for (const filePath of options.files) {
|
|
347
|
-
const fileIssues = checkFile(filePath);
|
|
348
|
-
results.issues.push(...fileIssues);
|
|
349
|
-
|
|
350
|
-
for (const issue of fileIssues) {
|
|
351
|
-
if (issue.level === 'P0') results.p0Count++;
|
|
352
|
-
else if (issue.level === 'P1') results.p1Count++;
|
|
353
|
-
else if (issue.level === 'P2') results.p2Count++;
|
|
354
|
-
else results.p3Count++;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
return results;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// 输出结果
|
|
362
|
-
function output(results) {
|
|
363
|
-
if (options.json) {
|
|
364
|
-
console.log(JSON.stringify(results, null, 2));
|
|
365
|
-
} else {
|
|
366
|
-
console.log('\n=== Code Review Lint ===\n');
|
|
367
|
-
console.log(`检查文件数: ${results.filesChecked}`);
|
|
368
|
-
console.log(`P0 问题: ${results.p0Count}`);
|
|
369
|
-
console.log(`P1 问题: ${results.p1Count}`);
|
|
370
|
-
console.log(`P2 问题: ${results.p2Count}`);
|
|
371
|
-
console.log(`P3 问题: ${results.p3Count}`);
|
|
372
|
-
|
|
373
|
-
if (results.issues.length > 0) {
|
|
374
|
-
console.log('\n--- 问题列表 ---\n');
|
|
375
|
-
|
|
376
|
-
const p0Issues = results.issues.filter(i => i.level === 'P0');
|
|
377
|
-
const p1Issues = results.issues.filter(i => i.level === 'P1');
|
|
378
|
-
const p2Issues = results.issues.filter(i => i.level === 'P2');
|
|
379
|
-
|
|
380
|
-
if (p0Issues.length > 0) {
|
|
381
|
-
console.log('### P0 问题(阻断性 - 必须修复)\n');
|
|
382
|
-
for (const issue of p0Issues) {
|
|
383
|
-
console.log(`[${issue.ruleId}] ${issue.file}:${issue.line}`);
|
|
384
|
-
console.log(` 问题: ${issue.message}`);
|
|
385
|
-
console.log(` 修复: ${issue.fix}\n`);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
if (p1Issues.length > 0) {
|
|
390
|
-
console.log('### P1 问题(严重 - 必须修复)\n');
|
|
391
|
-
for (const issue of p1Issues) {
|
|
392
|
-
console.log(`[${issue.ruleId}] ${issue.file}:${issue.line}`);
|
|
393
|
-
console.log(` 问题: ${issue.message}`);
|
|
394
|
-
console.log(` 修复: ${issue.fix}\n`);
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
if (p2Issues.length > 0 && !options.quick) {
|
|
399
|
-
console.log('### P2 问题(最佳实践 - 建议修复)\n');
|
|
400
|
-
for (const issue of p2Issues) {
|
|
401
|
-
console.log(`[${issue.ruleId}] ${issue.file}:${issue.line}`);
|
|
402
|
-
console.log(` 问题: ${issue.message}`);
|
|
403
|
-
console.log(` 修复: ${issue.fix}\n`);
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
console.log('--- 结论 ---');
|
|
409
|
-
if (results.p0Count + results.p1Count === 0) {
|
|
410
|
-
console.log('✅ 通过');
|
|
411
|
-
} else {
|
|
412
|
-
console.log(`⚠️ 需修复 ${results.p0Count + results.p1Count} 个 P0/P1 问题后重新评审`);
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
// 执行
|
|
418
|
-
if (options.files.length === 0) {
|
|
419
|
-
console.error('用法: node lint-code-review.mjs --files <file-list> [--json] [--quick]');
|
|
420
|
-
process.exit(1);
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
const results = lint();
|
|
424
|
-
output(results);
|
|
425
|
-
|
|
426
|
-
// CI 退出码
|
|
427
|
-
if (results.p0Count + results.p1Count > 0) {
|
|
428
|
-
process.exit(1);
|
|
429
|
-
} else {
|
|
430
|
-
process.exit(0);
|
|
431
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: domain-modeling
|
|
3
|
-
description: 当领域模型不清晰时,从代码或业务语言中提炼领域边界和核心概念
|
|
4
|
-
lifecycle_stage: design
|
|
5
|
-
rule_profile: modeling
|
|
6
|
-
dependencies: []
|
|
7
|
-
triggers:
|
|
8
|
-
- domain
|
|
9
|
-
- boundary
|
|
10
|
-
- reverse engineering
|
|
11
|
-
- ubiquitous language
|
|
12
|
-
- module split
|
|
13
|
-
- model
|
|
14
|
-
inputs:
|
|
15
|
-
- existing business language
|
|
16
|
-
- product context
|
|
17
|
-
- code or documents
|
|
18
|
-
outputs:
|
|
19
|
-
- domain map
|
|
20
|
-
- core concepts
|
|
21
|
-
- boundary notes
|
|
22
|
-
workflow:
|
|
23
|
-
- extract the core domain terms
|
|
24
|
-
- group concepts by boundary
|
|
25
|
-
- identify aggregates and dependencies
|
|
26
|
-
- hand off to technical-design or spec-refinement
|
|
27
|
-
gates:
|
|
28
|
-
- stop at domain boundaries
|
|
29
|
-
- do not implement code
|
|
30
|
-
- do not write PRD text
|
|
31
|
-
refs:
|
|
32
|
-
- skills/references/skill-reference-matrix.md
|
|
33
|
-
- skills/references/rule-loading-map.md
|
|
34
|
-
- skills/references/prompt-replay-checklist.md
|
|
35
|
-
- skills/references/full-chain-replay-scenarios.md
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
# Domain Modeling
|
|
39
|
-
|
|
40
|
-
## Purpose
|
|
41
|
-
|
|
42
|
-
Extract domain boundaries and core concepts from messy input.
|
|
43
|
-
|
|
44
|
-
## Suitable / Unsuitable
|
|
45
|
-
|
|
46
|
-
- Suitable: domain split, reverse engineering, ubiquitous language, boundary discovery
|
|
47
|
-
- Unsuitable: implementation, PRD drafting, detailed test authoring
|
|
48
|
-
|
|
49
|
-
## Workflow
|
|
50
|
-
|
|
51
|
-
1. Extract the core domain terms.
|
|
52
|
-
2. Group concepts by boundary.
|
|
53
|
-
3. Identify aggregates and dependencies.
|
|
54
|
-
4. Hand off to `technical-design` or `spec-refinement`.
|
|
55
|
-
|
|
56
|
-
## Replay Signals
|
|
57
|
-
|
|
58
|
-
- Input signal: existing business language, product context, code, or documents.
|
|
59
|
-
- Output to verify: domain map, core concepts, boundary notes.
|
|
60
|
-
- Stop signal: implementation code or PRD drafting.
|
|
61
|
-
- Handoff signal: the boundary map is ready for `technical-design` or `spec-refinement`.
|
|
62
|
-
|
|
63
|
-
## Examples
|
|
64
|
-
|
|
65
|
-
- Input: "Reverse engineer the customer order domain from this codebase and docs."
|
|
66
|
-
- Output: domain map, core concepts, boundary notes
|
|
67
|
-
- Stop: do not write implementation code or PRD text
|
|
68
|
-
|
|
69
|
-
## Stop Rules
|
|
70
|
-
|
|
71
|
-
- Stop at domain boundaries.
|
|
72
|
-
- Do not implement code.
|
|
73
|
-
- Do not write PRD text.
|
|
74
|
-
|
|
75
|
-
## References
|
|
76
|
-
|
|
77
|
-
- `skills/references/skill-reference-matrix.md`
|
|
78
|
-
- `skills/references/rule-loading-map.md`
|
|
79
|
-
- `skills/references/prompt-replay-checklist.md`
|
|
80
|
-
- `skills/references/full-chain-replay-scenarios.md`
|
|
81
|
-
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
# 蒸馏产物使用说明
|
|
2
|
-
|
|
3
|
-
> 如何将 `distilled/` 目录产物用于 AI 应用开发
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 作为 AI 应用开发者,如何把产物用起来
|
|
8
|
-
|
|
9
|
-
### 1. 常驻上下文(语义层)
|
|
10
|
-
|
|
11
|
-
把语义层注入系统提示或检索的高优先级片段:
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
- 00-overview.md — 系统全景与给 AI 的约定
|
|
15
|
-
- 01-glossary.md — 业务术语
|
|
16
|
-
- domain/_index.md — 对象关系总览
|
|
17
|
-
- api/_index.md — API 能力清单与典型编排
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
**加载策略**:
|
|
21
|
-
- 作为 System Prompt 的一部分
|
|
22
|
-
- 或作为 RAG 检索的高优先级片段(权重 > 0.8)
|
|
23
|
-
|
|
24
|
-
### 2. 按需检索(明细层)
|
|
25
|
-
|
|
26
|
-
把明细层做成可被 AI 检索的知识库:
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
- api/<域>/<用例>.md — 各业务用例接口详情
|
|
30
|
-
- reference/schema/*.md — 字段级 Schema
|
|
31
|
-
- reference/enums.md — 枚举/字典值
|
|
32
|
-
- reference/error-codes.md — 错误码
|
|
33
|
-
- reference/model-code-conflicts.md — 模型与代码差异
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
**检索策略**:
|
|
37
|
-
- 使用向量数据库(如 Milvus、Pinecone)
|
|
38
|
-
- 按 `[[slug]]` 交叉引用定位
|
|
39
|
-
- AI 需要时再取,不常驻上下文
|
|
40
|
-
|
|
41
|
-
### 3. 接口对接
|
|
42
|
-
|
|
43
|
-
按 `api/` 文档把真实 API 注册为 AI 可调用的工具:
|
|
44
|
-
|
|
45
|
-
```json
|
|
46
|
-
{
|
|
47
|
-
"tools": [
|
|
48
|
-
{
|
|
49
|
-
"name": "create_contract",
|
|
50
|
-
"description": "录入销售合同",
|
|
51
|
-
"parameters": {
|
|
52
|
-
"type": "object",
|
|
53
|
-
"properties": {
|
|
54
|
-
"contractNo": { "type": "string", "description": "合同编号" },
|
|
55
|
-
"contractName": { "type": "string", "description": "合同名称" },
|
|
56
|
-
...
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
]
|
|
61
|
-
}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### 4. 运行时护栏
|
|
65
|
-
|
|
66
|
-
把 `00-overview.md` 的"给 AI 的关键约定"写进系统提示:
|
|
67
|
-
|
|
68
|
-
```
|
|
69
|
-
## 给 AI 的关键约定
|
|
70
|
-
1. 永远通过 API 操作,不直接读写数据库。
|
|
71
|
-
2. 引用类字段是 ID 不是名称——先调主数据接口解析。
|
|
72
|
-
3. 金额/状态等由服务端计算或裁决。
|
|
73
|
-
4. 写操作权限分级:前期只读,写需确认。
|
|
74
|
-
5. 规则标注 【服务端强制】/【调用方需预判】 的含义。
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## 写权限控制的落地建议
|
|
80
|
-
|
|
81
|
-
### 前期阶段
|
|
82
|
-
|
|
83
|
-
- 只把**查询类**接口注册为 AI 工具
|
|
84
|
-
- 写接口不注册或需人工确认
|
|
85
|
-
|
|
86
|
-
### 进阶阶段
|
|
87
|
-
|
|
88
|
-
加一层**调用网关**:
|
|
89
|
-
|
|
90
|
-
```
|
|
91
|
-
GET/查询类 → 直接放行
|
|
92
|
-
写操作 → dry-run 校验 → 回显 → 用户确认 → 提交
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### 不可逆操作
|
|
96
|
-
|
|
97
|
-
- 如确认收款无撤销
|
|
98
|
-
- 必须强制二次确认
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## 典型对话流程
|
|
103
|
-
|
|
104
|
-
```
|
|
105
|
-
用户: "给华东能源录个合同,软件平台产品,销售一部张敏负责,48 万"
|
|
106
|
-
|
|
107
|
-
AI:
|
|
108
|
-
1. 解析名称 → 调用 reference-data 接口获取 ID
|
|
109
|
-
2. 回显解析结果给用户确认
|
|
110
|
-
3. 用户确认后调用 create-contract 接口
|
|
111
|
-
4. 返回创建结果
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
## 错误处理
|
|
117
|
-
|
|
118
|
-
当接口返回错误时,AI 根据 `error-codes.md` 解释:
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
错误: "付款比例合计必须等于 1"
|
|
122
|
-
AI 解释: "您输入的付款比例合计不等于 100%,请调整各阶段比例"
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## 质量验证
|
|
128
|
-
|
|
129
|
-
定期执行实跑验证:
|
|
130
|
-
|
|
131
|
-
1. 准备测试集(读/写/统计/规则反例)
|
|
132
|
-
2. 让 AI 仅凭蒸馏文档推导调用
|
|
133
|
-
3. 真打到接口验证结果
|
|
134
|
-
4. 修复发现的文档缺口
|