pdd-skills 3.0.5 → 3.1.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/README.md +144 -26
- package/config/bug-patterns.yaml +293 -0
- package/config/gate-config.yaml +73 -0
- package/config/prd-rules.yaml +112 -0
- package/docs/i18n-spec.md +120 -0
- package/docs/lessons.md +201 -0
- package/docs/plans/00-beginner-guide.md +3164 -0
- package/docs/tasks.md +91 -0
- package/docs/token-checklist.md +72 -0
- package/docs/vm-tasks.md +497 -0
- package/package.json +2 -2
- package/scaffolds/python-fullstack/backend/app/api/v1/departments.py +90 -0
- package/scaffolds/python-fullstack/backend/app/api/v1/dict_items.py +72 -0
- package/scaffolds/python-fullstack/backend/app/api/v1/router.py +3 -1
- package/scaffolds/python-fullstack/backend/app/models/__init__.py +5 -1
- package/scaffolds/python-fullstack/backend/app/models/dict_item.py +45 -0
- package/scaffolds/python-fullstack/backend/app/schemas/common.py +38 -1
- package/scaffolds/python-fullstack/backend/app/schemas/department.py +32 -0
- package/scaffolds/python-fullstack/backend/app/schemas/dict_item.py +61 -0
- package/scaffolds/python-fullstack/backend/scripts/seed_base_data.py +173 -0
- package/scaffolds/python-fullstack/frontend/src/api/departments.ts +32 -0
- package/scaffolds/python-fullstack/frontend/src/api/dict_items.ts +31 -0
- package/scaffolds/python-fullstack/frontend/src/main.ts +3 -0
- package/scaffolds/python-fullstack/frontend/src/styles/global-reset.css +71 -0
- package/scaffolds/python-fullstack/frontend/src/utils/safeAlert.ts +36 -0
- package/scaffolds/ruoyi/README.md +32 -0
- package/scaffolds/ruoyi/sql/seed_base_data.sql +90 -0
- package/scripts/linter/gate-engine.js +292 -0
- package/scripts/linter/run-linters.js +10 -1
- package/scripts/openapi-contract-sync.js +270 -0
- package/skills/core/pdd-ba/SKILL.md +8 -4
- package/skills/core/pdd-code-reviewer/SKILL.md +108 -2
- package/skills/core/pdd-extract-features/SKILL.md +40 -10
- package/skills/core/pdd-generate-spec/SKILL.md +142 -4
- package/skills/core/pdd-implement-feature/SKILL.md +82 -10
- package/skills/core/pdd-main/SKILL.md +73 -1
- package/skills/core/pdd-verify-feature/SKILL.md +60 -0
- package/skills/expert/expert-ruoyi/SKILL.md +75 -0
- package/skills/pr/pdd-template-engine/SKILL.md +80 -0
- package/templates/prd-template.prdx +149 -10
package/README.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# PDD-Skills v3.0
|
|
2
2
|
|
|
3
|
-
[](https://github.com/pdd-skills/pdd-skills)
|
|
4
4
|
[](https://nodejs.org/)
|
|
5
5
|
[](LICENSE)
|
|
6
|
-
[](config/bug-patterns.yaml)
|
|
7
|
+
[](config/prd-rules.yaml)
|
|
8
8
|
|
|
9
9
|
> **PRD 驱动的 AI 原生软件开发工作流框架**
|
|
10
10
|
>
|
|
11
|
-
> 从需求文档到代码交付的全链路自动化平台 — **7 大 Phase
|
|
11
|
+
> 从需求文档到代码交付的全链路自动化平台 — **7 大 Phase**、**双脚手架**、**14 个 Bug 模式**、**30 条 PRD 规则**、**4 级质量门控**
|
|
12
12
|
|
|
13
13
|
***
|
|
14
14
|
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
- [Phase 6: 生态建设](#phase-6-生态建设)
|
|
28
28
|
- [📊 Phase 7: PDD Visual Manager](#-phase-7-pdd-visual-manager)
|
|
29
29
|
- [技能系统](#技能系统)
|
|
30
|
+
- [配置中心](#配置中心)
|
|
30
31
|
- [API 层](#api-层)
|
|
31
32
|
- [MCP 协议集成](#mcp-协议集成)
|
|
32
33
|
- [SDK 使用指南](#sdk-使用指南)
|
|
@@ -229,18 +230,16 @@ scaffolds/python-fullstack/
|
|
|
229
230
|
|
|
230
231
|
| 指标 | 数值 |
|
|
231
232
|
| ----------- | --------------------------------------------- |
|
|
232
|
-
| **版本** | v3.0
|
|
233
|
-
| **总任务数** | 153 (**100% 完成**) |
|
|
234
|
-
| **里程碑数** | 29 (**100% 达成**) |
|
|
233
|
+
| **版本** | v3.1.0 |
|
|
235
234
|
| **核心技能** | 11 个(全双语 🇨🇳🇺🇸) |
|
|
236
|
-
| **专家技能** |
|
|
237
|
-
|
|
|
235
|
+
| **专家技能** | 4 个(安全 + 性能 + 若依 + Activiti) |
|
|
236
|
+
| **PR技能** | 5 个(模板引擎 + 多轮审查 + PR创建/审查/合并) |
|
|
237
|
+
| **Bug模式库** | 14 个(7通用 + 7若依专用),集中式管理 `config/bug-patterns.yaml` |
|
|
238
|
+
| **PRD规则** | 30 条(6大类),集中式管理 `config/prd-rules.yaml` |
|
|
239
|
+
| **质量门控** | 4级(Blocker/Critical/Warning/Info)+ 0-100评分 |
|
|
240
|
+
| **脚手架模板** | 2 个(Python Fullstack + 若依RuoYi) |
|
|
238
241
|
| **协议支持** | RESTful + MCP + gRPC + SSE |
|
|
239
242
|
| **SDK 语言** | JavaScript + Python |
|
|
240
|
-
| **示例插件** | 3 个(hello-world / code-stats / custom-linter) |
|
|
241
|
-
| **社区文档** | 5 套(\~10,700 行) |
|
|
242
|
-
| **VM 新增代码** | \~6000 行(Phase 7) |
|
|
243
|
-
| **脚手架模板** | 1 个(python-fullstack 全栈模板) |
|
|
244
243
|
|
|
245
244
|
***
|
|
246
245
|
|
|
@@ -445,6 +444,8 @@ pdd config --get key # 读取配置项
|
|
|
445
444
|
| ---------------------- | --------------------------------------- | -------------------------------------- |
|
|
446
445
|
| **expert-security** | SQL注入 / XSS / CSRF / 命令注入 / 路径遍历 / SSRF | OWASP Top 10 2021 完整覆盖,8 条安全铁律 |
|
|
447
446
|
| **expert-performance** | CPU / 内存 / I/O / 网络 / 锁竞争诊断 | HikariCP / Redis多级缓存 / G1 GC调优 / P99指标 |
|
|
447
|
+
| **expert-ruoyi** | 若依框架全流程开发 / 代码生成 / 权限配置 / 菜单管理 | 7个若依Bug模式(PATTERN-R001~R007) + Spec模板参考 |
|
|
448
|
+
| **expert-activiti** | Activiti 7工作流引擎 / BPMN 2.0 / 流程部署管理 | 流程设计规范 + BPMN校验规则 |
|
|
448
449
|
|
|
449
450
|
### Phase 4: 平台化建设
|
|
450
451
|
|
|
@@ -1014,9 +1015,9 @@ skills/
|
|
|
1014
1015
|
│ ├── pdd-ba/ # 业务分析
|
|
1015
1016
|
│ ├── pdd-extract-features/
|
|
1016
1017
|
│ ├── pdd-generate-spec/
|
|
1017
|
-
│ ├── pdd-implement-feature/
|
|
1018
|
-
│ ├── pdd-verify-feature/
|
|
1019
|
-
│ ├── pdd-code-reviewer/
|
|
1018
|
+
│ ├── pdd-implement-feature/ # 含上下文注入 + 微验证
|
|
1019
|
+
│ ├── pdd-verify-feature/ # 含契约一致性验证
|
|
1020
|
+
│ ├── pdd-code-reviewer/ # 含Bug模式库匹配 + UX一致性
|
|
1020
1021
|
│ ├── pdd-doc-change/
|
|
1021
1022
|
│ ├── pdd-doc-gardener/
|
|
1022
1023
|
│ ├── pdd-entropy-reduction/
|
|
@@ -1024,7 +1025,16 @@ skills/
|
|
|
1024
1025
|
│
|
|
1025
1026
|
├── expert/ # 专家技能 (按需加载)
|
|
1026
1027
|
│ ├── expert-security/ # 安全审计专家
|
|
1027
|
-
│
|
|
1028
|
+
│ ├── expert-performance/ # 性能优化专家
|
|
1029
|
+
│ ├── expert-ruoyi/ # 若依框架专家 (含Bug模式库R001~R007)
|
|
1030
|
+
│ └── expert-activiti/ # Activiti工作流专家
|
|
1031
|
+
│
|
|
1032
|
+
├── pr/ # PR与交付技能
|
|
1033
|
+
│ ├── pdd-template-engine/ # PRD感知动态模板引擎
|
|
1034
|
+
│ ├── pdd-multi-review/ # 三轮代码审查
|
|
1035
|
+
│ ├── pdd-pr-create/ # PR创建
|
|
1036
|
+
│ ├── pdd-pr-review/ # PR审查
|
|
1037
|
+
│ └── pdd-pr-merge/ # PR合并
|
|
1028
1038
|
│
|
|
1029
1039
|
├── openspec/ # OpenSpec 协作技能
|
|
1030
1040
|
│ ├── openspec-explore/
|
|
@@ -1040,6 +1050,99 @@ skills/
|
|
|
1040
1050
|
|
|
1041
1051
|
***
|
|
1042
1052
|
|
|
1053
|
+
## 配置中心
|
|
1054
|
+
|
|
1055
|
+
> **Single Source of Truth 原则**:所有配置集中管理,技能和脚本通过引用获取,避免散落和不一致。
|
|
1056
|
+
|
|
1057
|
+
### 配置文件一览
|
|
1058
|
+
|
|
1059
|
+
| 配置文件 | 用途 | 消费方 |
|
|
1060
|
+
|---------|------|--------|
|
|
1061
|
+
| `config/bug-patterns.yaml` | Bug模式库(14个模式) | pdd-code-reviewer, pdd-verify-feature, pdd-implement-feature, pdd-template-engine, expert-ruoyi |
|
|
1062
|
+
| `config/prd-rules.yaml` | PRD检测规则(30条,6大类) | pdd-linter, run-linters.js |
|
|
1063
|
+
| `config/gate-config.yaml` | 质量门控配置(4级阻断+评分权重) | gate-engine.js |
|
|
1064
|
+
|
|
1065
|
+
### Bug模式库架构
|
|
1066
|
+
|
|
1067
|
+
```
|
|
1068
|
+
config/bug-patterns.yaml ← 唯一真相源
|
|
1069
|
+
├── categories.general # 通用模式 PATTERN-001~007
|
|
1070
|
+
│ ├── PATTERN-001 datetime字段类型陷阱
|
|
1071
|
+
│ ├── PATTERN-002 静态路由注册顺序错误
|
|
1072
|
+
│ ├── PATTERN-003 枚举硬编码/编码不一致
|
|
1073
|
+
│ ├── PATTERN-004 alert()未用safeAlert()包装
|
|
1074
|
+
│ ├── PATTERN-005 my-tasks查询条件不完整
|
|
1075
|
+
│ ├── PATTERN-006 Options接口路由顺序(同002)
|
|
1076
|
+
│ └── PATTERN-007 编号生成未检查已存在记录
|
|
1077
|
+
└── categories.ruoyi # 若依专用 PATTERN-R001~R007
|
|
1078
|
+
├── PATTERN-R001 权限注解缺失
|
|
1079
|
+
├── PATTERN-R002 菜单配置不完整
|
|
1080
|
+
├── PATTERN-R003 数据权限未配置
|
|
1081
|
+
├── PATTERN-R004 Redis缓存未清除
|
|
1082
|
+
├── PATTERN-R005 参数校验缺失
|
|
1083
|
+
├── PATTERN-R006 XSS防护缺失
|
|
1084
|
+
└── PATTERN-R007 操作日志缺失
|
|
1085
|
+
```
|
|
1086
|
+
|
|
1087
|
+
### PRD检测规则架构
|
|
1088
|
+
|
|
1089
|
+
```
|
|
1090
|
+
config/prd-rules.yaml ← 唯一真相源 (30条规则)
|
|
1091
|
+
├── structure (7条) # PRD结构完整性
|
|
1092
|
+
├── content (8条) # 内容质量
|
|
1093
|
+
├── uiux (6条) # UI/UX规范
|
|
1094
|
+
│ ├── uiux-form-mapping-exists # 表单控件映射表 (BLOCKER)
|
|
1095
|
+
│ ├── uiux-no-uuid-input # 禁止UUID输入 (BLOCKER)
|
|
1096
|
+
│ ├── uiux-options-api-listed # Options API声明 (BLOCKER)
|
|
1097
|
+
│ ├── uiux-page-list # 页面清单
|
|
1098
|
+
│ ├── uiux-seed-data-declared # 种子数据声明
|
|
1099
|
+
│ └── uiux-wireframe-exists # 线框图
|
|
1100
|
+
├── data_model (4条) # 数据模型规范
|
|
1101
|
+
│ ├── dm-enum-convention # 枚举编码约定 (BLOCKER)
|
|
1102
|
+
│ ├── dm-permission-matrix # 权限矩阵 (BLOCKER)
|
|
1103
|
+
│ ├── dm-type-explicit # 类型显式声明
|
|
1104
|
+
│ └── dm-audit-fields # 审计字段
|
|
1105
|
+
└── api_design (3条) # API设计规范
|
|
1106
|
+
├── api-options-endpoint # Options端点 (BLOCKER)
|
|
1107
|
+
├── api-param-location # 参数位置
|
|
1108
|
+
└── api-error-format # 错误格式
|
|
1109
|
+
```
|
|
1110
|
+
|
|
1111
|
+
### 质量门控流程
|
|
1112
|
+
|
|
1113
|
+
```
|
|
1114
|
+
PRD文档 → prd-linter (30条规则) → gate-engine (4级门控) → 评分卡
|
|
1115
|
+
│
|
|
1116
|
+
┌─────────────┼─────────────┐
|
|
1117
|
+
▼ ▼ ▼
|
|
1118
|
+
BLOCKER CRITICAL WARNING/INFO
|
|
1119
|
+
(阻断) (必须修复) (建议修复)
|
|
1120
|
+
│ │
|
|
1121
|
+
▼ ▼
|
|
1122
|
+
Score = 0 Score -= 15/5/1
|
|
1123
|
+
│ │
|
|
1124
|
+
▼ ▼
|
|
1125
|
+
Grade: F Grade: A~D
|
|
1126
|
+
│ │
|
|
1127
|
+
▼ ▼
|
|
1128
|
+
❌ FAIL ✅ PASS
|
|
1129
|
+
```
|
|
1130
|
+
|
|
1131
|
+
### 更新流程
|
|
1132
|
+
|
|
1133
|
+
```bash
|
|
1134
|
+
# 新增Bug模式 → 只需编辑一个文件
|
|
1135
|
+
vim config/bug-patterns.yaml # 各skill自动通过引用获取
|
|
1136
|
+
|
|
1137
|
+
# 修改BLOCKER规则 → 只需编辑一个文件
|
|
1138
|
+
vim config/gate-config.yaml # gate-engine.js自动读取
|
|
1139
|
+
|
|
1140
|
+
# 修改PRD检测规则 → 只需编辑一个文件
|
|
1141
|
+
vim config/prd-rules.yaml # run-linters.js自动读取
|
|
1142
|
+
```
|
|
1143
|
+
|
|
1144
|
+
***
|
|
1145
|
+
|
|
1043
1146
|
## API 层
|
|
1044
1147
|
|
|
1045
1148
|
### 启动 API 服务器
|
|
@@ -1511,11 +1614,16 @@ pdd-skills-v3/
|
|
|
1511
1614
|
│ └── openspec/ # 10 个 OpenSpec 技能
|
|
1512
1615
|
│
|
|
1513
1616
|
├── scripts/ # 工具脚本
|
|
1617
|
+
│ ├── linter/ # PRD Linter 工具链
|
|
1618
|
+
│ │ ├── prd-linter.js # PRD Linter 引擎
|
|
1619
|
+
│ │ ├── prd-rules.yaml # (符号链接→config/)
|
|
1620
|
+
│ │ ├── gate-engine.js # 4级门控引擎 (读取config/gate-config.yaml)
|
|
1621
|
+
│ │ ├── report-generator.js# 报告生成器
|
|
1622
|
+
│ │ └── run-linters.js # Linter运行器 (集成Gate Engine)
|
|
1623
|
+
│ ├── openapi-contract-sync.js # OpenAPI契约同步工具
|
|
1514
1624
|
│ ├── skill-linter.py # Skill 文件检查器
|
|
1515
|
-
│ ├── skill-rules.yaml # Linter 规则配置
|
|
1516
1625
|
│ ├── i18n-checker.js # 双语合规检查
|
|
1517
|
-
│
|
|
1518
|
-
│ └── ...
|
|
1626
|
+
│ └── token-analyzer.js # Token 分析
|
|
1519
1627
|
│
|
|
1520
1628
|
├── docs/ # 社区文档 (~10,700 行)
|
|
1521
1629
|
│ ├── user-guide/
|
|
@@ -1526,9 +1634,18 @@ pdd-skills-v3/
|
|
|
1526
1634
|
│ └── tasks.md # 任务跟踪 (153/100%)
|
|
1527
1635
|
│
|
|
1528
1636
|
├── templates/ # 项目模板
|
|
1529
|
-
├── config/ #
|
|
1637
|
+
├── config/ # 配置中心 (Single Source of Truth)
|
|
1638
|
+
│ ├── bug-patterns.yaml # Bug模式库 (14个模式, 唯一真相源)
|
|
1639
|
+
│ ├── prd-rules.yaml # PRD检测规则 (30条, 6大类)
|
|
1640
|
+
│ ├── gate-config.yaml # 质量门控配置 (4级阻断+评分权重)
|
|
1641
|
+
│ ├── bpmn-rules.yaml # BPMN校验规则
|
|
1642
|
+
│ ├── checkstyle.xml # Java Checkstyle配置
|
|
1643
|
+
│ ├── eslint.config.js # ESLint配置
|
|
1644
|
+
│ ├── pmd.xml # PMD配置
|
|
1645
|
+
│ ├── ruff.toml # Python Ruff配置
|
|
1646
|
+
│ └── sqlfluff.cfg # SQL SQLFluff配置
|
|
1530
1647
|
├── hooks/ # Hook 配置
|
|
1531
|
-
└── package.json # v3.0
|
|
1648
|
+
└── package.json # v3.1.0
|
|
1532
1649
|
```
|
|
1533
1650
|
|
|
1534
1651
|
***
|
|
@@ -1613,9 +1730,10 @@ CLI 参数 > 环境变量 > .pddrc.local > .pddrc > defaults
|
|
|
1613
1730
|
|
|
1614
1731
|
| 版本 | 日期 | 重要变更 |
|
|
1615
1732
|
| ---------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
1733
|
+
| **v3.1.0** | 2026-04-15 | **智能能力+生态集成**: Bug模式库集中化(14模式), PRD Linter扩展(30规则6大类), 4级门控引擎(Blocker/Critical/Warning/Info), OpenAPI契约同步, PRD感知动态模板, MVP分层交付策略, 上下文注入+微验证, expert-ruoyi+expert-activiti专家技能, 若依RuoYi脚手架支持, 种子数据分层设计 |
|
|
1616
1734
|
| **v3.0.2** | 2026-04-12 | **脚手架系统发布**: python-fullstack 全栈模板(FastAPI+Vue3), 数据权限引擎, OAuth2六平台认证, 工作流状态机引擎, 响应式前端, 4份架构设计文档, Docker一键部署, CI流水线 |
|
|
1617
|
-
| **v3.0.1** | 2026-04-07 | **PDD Visual Manager 发布**: Web Dashboard + Terminal TUI 双形态可视化监控, 11个REST API端点, SSE实时推送, Canvas图表引擎, ANSI TUI组件库
|
|
1618
|
-
| **v3.0.0** | 2026-04-05 | **正式发布版**: 6大Phase全部完成 + 插件系统 + OpenClaw + gRPC + Python SDK + 暂缓清零
|
|
1735
|
+
| **v3.0.1** | 2026-04-07 | **PDD Visual Manager 发布**: Web Dashboard + Terminal TUI 双形态可视化监控, 11个REST API端点, SSE实时推送, Canvas图表引擎, ANSI TUI组件库 |
|
|
1736
|
+
| **v3.0.0** | 2026-04-05 | **正式发布版**: 6大Phase全部完成 + 插件系统 + OpenClaw + gRPC + Python SDK + 暂缓清零 |
|
|
1619
1737
|
| v2.x | 2026-03 | 内部迭代版本: MCP/SDK/缓存/Token/质量/迭代 |
|
|
1620
1738
|
| v1.x | 2025-12 | 初始版本: 基础设施 + 核心技能 + Linter |
|
|
1621
1739
|
|
|
@@ -1636,9 +1754,9 @@ CLI 参数 > 环境变量 > .pddrc.local > .pddrc > defaults
|
|
|
1636
1754
|
***
|
|
1637
1755
|
|
|
1638
1756
|
<p align="center">
|
|
1639
|
-
<b>PDD-Skills v3.
|
|
1757
|
+
<b>PDD-Skills v3.1 — 让 AI 成为你的全职结对编程伙伴 🤖</b>
|
|
1640
1758
|
</p>
|
|
1641
1759
|
|
|
1642
1760
|
<p align="center">
|
|
1643
|
-
<sub>
|
|
1761
|
+
<sub>14 Bug Patterns ✅ · 30 PRD Rules ✅ · 4-Level Gate ✅ · Dual Scaffold ✅</sub>
|
|
1644
1762
|
</p>
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
# Bug Pattern Library / Bug模式库
|
|
2
|
+
#
|
|
3
|
+
# 唯一真相源 (Single Source of Truth)
|
|
4
|
+
# 所有SKILL.md和脚本必须引用此文件,不得内联副本
|
|
5
|
+
#
|
|
6
|
+
# 更新流程:
|
|
7
|
+
# 1. 在此文件中添加/修改模式
|
|
8
|
+
# 2. 运行 scripts/linter/validate-patterns.js 验证格式
|
|
9
|
+
# 3. 各skill自动通过引用获取最新模式
|
|
10
|
+
#
|
|
11
|
+
# 模式ID命名规范:
|
|
12
|
+
# - 通用模式: PATTERN-NNN (如 PATTERN-001)
|
|
13
|
+
# - 若依专用: PATTERN-RNNN (如 PATTERN-R001)
|
|
14
|
+
# - 未来脚手架: PATTERN-JNNN (Java/Spring), PATTERN-GNNN (Go) 等
|
|
15
|
+
|
|
16
|
+
meta:
|
|
17
|
+
version: "1.0.0"
|
|
18
|
+
last_updated: "2026-04-15"
|
|
19
|
+
source: "资产评估处置管理系统首次项目实践复盘"
|
|
20
|
+
maintainers: ["pdd-skills-v3"]
|
|
21
|
+
|
|
22
|
+
categories:
|
|
23
|
+
general:
|
|
24
|
+
name: "通用模式 (Python Fullstack)"
|
|
25
|
+
description: "适用于所有Python Fullstack项目的常见Bug模式"
|
|
26
|
+
patterns:
|
|
27
|
+
- id: PATTERN-001
|
|
28
|
+
name: "datetime字段类型陷阱"
|
|
29
|
+
name_en: "datetime field type trap"
|
|
30
|
+
description: "datetime字段必须用field_validator或field_serializer处理,不能声明为str"
|
|
31
|
+
trigger: "Pydantic Schema包含datetime字段"
|
|
32
|
+
prevention: "使用 @field_serializer 或 model_config=json_encoders"
|
|
33
|
+
severity: critical
|
|
34
|
+
detection:
|
|
35
|
+
- "Schema中 created_at/updated_at 字段类型为 str"
|
|
36
|
+
- "datetime字段缺少序列化配置"
|
|
37
|
+
fix_example: |
|
|
38
|
+
# ❌ 错误
|
|
39
|
+
created_at: str
|
|
40
|
+
# ✅ 正确
|
|
41
|
+
created_at: datetime
|
|
42
|
+
# 并在Schema中添加:
|
|
43
|
+
@field_serializer('created_at')
|
|
44
|
+
def serialize_datetime(self, dt): return dt.isoformat() if dt else None
|
|
45
|
+
related_rules: ["dm-type-explicit"]
|
|
46
|
+
tags: ["schema", "datetime", "serialization"]
|
|
47
|
+
|
|
48
|
+
- id: PATTERN-002
|
|
49
|
+
name: "静态路由注册顺序错误"
|
|
50
|
+
name_en: "Static route registration order error"
|
|
51
|
+
description: "静态路由(/options, /me等)必须在动态路由(/{id})之前注册,否则被动态路由拦截"
|
|
52
|
+
trigger: "FastAPI路由文件同时包含/options和/{id}"
|
|
53
|
+
prevention: "路由注册顺序: /me → / → /options → /{id}"
|
|
54
|
+
severity: critical
|
|
55
|
+
detection:
|
|
56
|
+
- "router.py中 /options 定义在 /{id} 之后"
|
|
57
|
+
- "访问/options返回404或数据异常"
|
|
58
|
+
fix_example: |
|
|
59
|
+
# ❌ 错误
|
|
60
|
+
@router.get("/{id}")
|
|
61
|
+
@router.get("/options")
|
|
62
|
+
# ✅ 正确
|
|
63
|
+
@router.get("/options")
|
|
64
|
+
@router.get("/{id}")
|
|
65
|
+
related_rules: ["api-options-endpoint", "uiux-options-api-listed"]
|
|
66
|
+
tags: ["routing", "fastapi", "options-api"]
|
|
67
|
+
|
|
68
|
+
- id: PATTERN-003
|
|
69
|
+
name: "枚举硬编码/编码不一致"
|
|
70
|
+
name_en: "Enum hardcoding / inconsistent coding"
|
|
71
|
+
description: "枚举值散落硬编码在前端代码中,且编码风格不统一(大小写混用/中英混用)"
|
|
72
|
+
trigger: "定义Enum或状态字段"
|
|
73
|
+
prevention: "编码值统一用snake_case小写英文,显示名用中文映射,通过字典表/Options API管理"
|
|
74
|
+
severity: warning
|
|
75
|
+
detection:
|
|
76
|
+
- "前端 if status === '1' 散落各处"
|
|
77
|
+
- "枚举值大小写不统一(ACTIVE vs active vs Active)"
|
|
78
|
+
fix_example: |
|
|
79
|
+
# ❌ 错误
|
|
80
|
+
if (row.status === '1') { ... }
|
|
81
|
+
# ✅ 正确
|
|
82
|
+
const STATUS_MAP = { draft: '草稿', pending: '待审批', approved: '已通过' }
|
|
83
|
+
related_rules: ["dm-enum-convention"]
|
|
84
|
+
tags: ["enum", "coding-convention", "frontend"]
|
|
85
|
+
|
|
86
|
+
- id: PATTERN-004
|
|
87
|
+
name: "alert()未用safeAlert()包装"
|
|
88
|
+
name_en: "alert() not wrapped with safeAlert()"
|
|
89
|
+
description: "前端使用原生alert()可能导致非string参数报错"
|
|
90
|
+
trigger: "前端代码使用alert()"
|
|
91
|
+
prevention: "safeAlert确保参数为string类型"
|
|
92
|
+
severity: warning
|
|
93
|
+
detection:
|
|
94
|
+
- "Vue组件中使用 alert(...) 而非 safeAlert(...)"
|
|
95
|
+
fix_example: |
|
|
96
|
+
# ❌ 错误
|
|
97
|
+
alert(res.message)
|
|
98
|
+
# ✅ 正确
|
|
99
|
+
safeAlert(res.message)
|
|
100
|
+
related_rules: []
|
|
101
|
+
tags: ["frontend", "vue", "safety"]
|
|
102
|
+
|
|
103
|
+
- id: PATTERN-005
|
|
104
|
+
name: "my-tasks查询条件不完整"
|
|
105
|
+
name_en: "Incomplete my-tasks query conditions"
|
|
106
|
+
description: "我的任务查询必须同时匹配evaluator_id和created_by,否则遗漏任务"
|
|
107
|
+
trigger: "实现'我的任务'列表接口"
|
|
108
|
+
prevention: "OR(evaluator_id==user_id, created_by==user_id)"
|
|
109
|
+
severity: critical
|
|
110
|
+
detection:
|
|
111
|
+
- "我的任务接口只查 evaluator_id 或只查 created_by"
|
|
112
|
+
fix_example: |
|
|
113
|
+
# ❌ 错误
|
|
114
|
+
query = query.filter(Evaluation.evaluator_id == user_id)
|
|
115
|
+
# ✅ 正确
|
|
116
|
+
query = query.filter(
|
|
117
|
+
or_(Evaluation.evaluator_id == user_id, Evaluation.created_by == user_id)
|
|
118
|
+
)
|
|
119
|
+
related_rules: []
|
|
120
|
+
tags: ["query", "business-logic"]
|
|
121
|
+
|
|
122
|
+
- id: PATTERN-006
|
|
123
|
+
name: "Options接口路由顺序(同PATTERN-002)"
|
|
124
|
+
name_en: "Options API route order (same as PATTERN-002)"
|
|
125
|
+
description: "PATTERN-002的特化版本,专指/options端点的路由注册顺序问题"
|
|
126
|
+
trigger: "实现下拉选项API"
|
|
127
|
+
prevention: "参见PATTERN-002"
|
|
128
|
+
severity: critical
|
|
129
|
+
detection:
|
|
130
|
+
- "同PATTERN-002"
|
|
131
|
+
fix_example: "参见PATTERN-002"
|
|
132
|
+
related_rules: ["api-options-endpoint"]
|
|
133
|
+
tags: ["routing", "options-api"]
|
|
134
|
+
alias_of: "PATTERN-002"
|
|
135
|
+
|
|
136
|
+
- id: PATTERN-007
|
|
137
|
+
name: "编号生成未检查已存在记录"
|
|
138
|
+
name_en: "ID generation without checking existing records"
|
|
139
|
+
description: "自动编号生成时未检查数据库中已存在的最大编号,可能导致编号冲突"
|
|
140
|
+
trigger: "实现task_no等自动编号"
|
|
141
|
+
prevention: "SELECT MAX(task_no) WHERE task_no LIKE prefix%"
|
|
142
|
+
severity: critical
|
|
143
|
+
detection:
|
|
144
|
+
- "编号生成逻辑直接使用计数而非MAX查询"
|
|
145
|
+
- "并发场景下出现重复编号"
|
|
146
|
+
fix_example: |
|
|
147
|
+
# ❌ 错误
|
|
148
|
+
new_no = f"TASK-{count + 1:04d}"
|
|
149
|
+
# ✅ 正确
|
|
150
|
+
max_no = db.query(func.max(Task.task_no)).filter(
|
|
151
|
+
Task.task_no.like(f"TASK-{prefix}%")
|
|
152
|
+
).scalar()
|
|
153
|
+
next_seq = int(max_no.split("-")[-1]) + 1 if max_no else 1
|
|
154
|
+
related_rules: []
|
|
155
|
+
tags: ["business-logic", "concurrency"]
|
|
156
|
+
|
|
157
|
+
ruoyi:
|
|
158
|
+
name: "若依专用模式 (RuoYi Framework)"
|
|
159
|
+
description: "若依框架特有的常见Bug模式"
|
|
160
|
+
patterns:
|
|
161
|
+
- id: PATTERN-R001
|
|
162
|
+
name: "权限注解缺失"
|
|
163
|
+
name_en: "Missing permission annotation"
|
|
164
|
+
description: "Controller方法缺少@PreAuthorize注解,导致接口无权限控制"
|
|
165
|
+
trigger: "新增Controller方法"
|
|
166
|
+
prevention: "每个接口方法必须配置@PreAuthorize注解"
|
|
167
|
+
severity: critical
|
|
168
|
+
detection:
|
|
169
|
+
- "Controller方法无@PreAuthorize注解"
|
|
170
|
+
- "接口可被任意角色访问"
|
|
171
|
+
fix_example: |
|
|
172
|
+
# ❌ 错误
|
|
173
|
+
@GetMapping("/list")
|
|
174
|
+
public TableDataInfo list(Evaluation evaluation) { ... }
|
|
175
|
+
# ✅ 正确
|
|
176
|
+
@PreAuthorize("@ss.hasPermi('eval:evaluation:list')")
|
|
177
|
+
@GetMapping("/list")
|
|
178
|
+
public TableDataInfo list(Evaluation evaluation) { ... }
|
|
179
|
+
related_rules: ["dm-permission-matrix"]
|
|
180
|
+
tags: ["ruoyi", "permission", "security"]
|
|
181
|
+
|
|
182
|
+
- id: PATTERN-R002
|
|
183
|
+
name: "菜单配置不完整"
|
|
184
|
+
name_en: "Incomplete menu configuration"
|
|
185
|
+
description: "新增页面未配置sys_menu记录,导致页面404或按钮不显示"
|
|
186
|
+
trigger: "新增功能页面"
|
|
187
|
+
prevention: "所有页面(含隐藏页)必须配置sys_menu INSERT语句"
|
|
188
|
+
severity: critical
|
|
189
|
+
detection:
|
|
190
|
+
- "新页面通过菜单访问返回404"
|
|
191
|
+
- "按钮权限不显示"
|
|
192
|
+
fix_example: |
|
|
193
|
+
-- 必须提供的菜单SQL
|
|
194
|
+
INSERT INTO sys_menu VALUES(2000, '评估管理', 0, 1, 'evaluation', NULL, '', 1, 0, 'M', '0', '0', '', 'eval', 'admin', sysdate(), '', NULL, '');
|
|
195
|
+
related_rules: []
|
|
196
|
+
tags: ["ruoyi", "menu", "configuration"]
|
|
197
|
+
|
|
198
|
+
- id: PATTERN-R003
|
|
199
|
+
name: "数据权限未配置"
|
|
200
|
+
name_en: "Data scope not configured"
|
|
201
|
+
description: "Service方法缺少@DataScope注解,用户可看到跨部门数据"
|
|
202
|
+
trigger: "实现列表查询接口"
|
|
203
|
+
prevention: "Service方法添加@DataScope注解"
|
|
204
|
+
severity: critical
|
|
205
|
+
detection:
|
|
206
|
+
- "普通用户能看到其他部门的数据"
|
|
207
|
+
- "Service查询方法无@DataScope"
|
|
208
|
+
fix_example: |
|
|
209
|
+
# ❌ 错误
|
|
210
|
+
public List<Evaluation> selectEvaluationList(Evaluation evaluation) { ... }
|
|
211
|
+
# ✅ 正确
|
|
212
|
+
@DataScope(deptAlias = "d")
|
|
213
|
+
public List<Evaluation> selectEvaluationList(Evaluation evaluation) { ... }
|
|
214
|
+
related_rules: ["dm-permission-matrix"]
|
|
215
|
+
tags: ["ruoyi", "data-scope", "security"]
|
|
216
|
+
|
|
217
|
+
- id: PATTERN-R004
|
|
218
|
+
name: "Redis缓存未清除"
|
|
219
|
+
name_en: "Redis cache not cleared"
|
|
220
|
+
description: "修改权限/菜单后未清除Redis缓存,导致修改不生效"
|
|
221
|
+
trigger: "修改权限或菜单配置"
|
|
222
|
+
prevention: "修改权限/菜单后必须清除Redis缓存"
|
|
223
|
+
severity: warning
|
|
224
|
+
detection:
|
|
225
|
+
- "权限修改后用户仍可访问旧权限的接口"
|
|
226
|
+
- "菜单修改后页面不更新"
|
|
227
|
+
fix_example: |
|
|
228
|
+
// 修改权限后执行
|
|
229
|
+
redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + userId);
|
|
230
|
+
related_rules: []
|
|
231
|
+
tags: ["ruoyi", "redis", "cache"]
|
|
232
|
+
|
|
233
|
+
- id: PATTERN-R005
|
|
234
|
+
name: "参数校验缺失"
|
|
235
|
+
name_en: "Missing parameter validation"
|
|
236
|
+
description: "@RequestBody参数未添加@Validated注解,校验注解不生效"
|
|
237
|
+
trigger: "新增POST/PUT接口"
|
|
238
|
+
prevention: "所有@RequestBody参数添加@Validated"
|
|
239
|
+
severity: warning
|
|
240
|
+
detection:
|
|
241
|
+
- "提交空字段无校验提示"
|
|
242
|
+
- "@RequestBody参数缺少@Validated"
|
|
243
|
+
fix_example: |
|
|
244
|
+
# ❌ 错误
|
|
245
|
+
@PostMapping
|
|
246
|
+
public AjaxResult add(@RequestBody Evaluation evaluation) { ... }
|
|
247
|
+
# ✅ 正确
|
|
248
|
+
@PostMapping
|
|
249
|
+
public AjaxResult add(@Validated @RequestBody Evaluation evaluation) { ... }
|
|
250
|
+
related_rules: []
|
|
251
|
+
tags: ["ruoyi", "validation"]
|
|
252
|
+
|
|
253
|
+
- id: PATTERN-R006
|
|
254
|
+
name: "XSS防护缺失"
|
|
255
|
+
name_en: "Missing XSS protection"
|
|
256
|
+
description: "文本字段未添加@Xss注解,存在XSS攻击风险"
|
|
257
|
+
trigger: "新增文本输入字段"
|
|
258
|
+
prevention: "所有String类型文本字段添加@Xss"
|
|
259
|
+
severity: warning
|
|
260
|
+
detection:
|
|
261
|
+
- "文本字段可输入<script>标签"
|
|
262
|
+
- "Bo实体类String字段无@Xss注解"
|
|
263
|
+
fix_example: |
|
|
264
|
+
# ❌ 错误
|
|
265
|
+
@NotBlank(message = "名称不能为空")
|
|
266
|
+
private String evalName;
|
|
267
|
+
# ✅ 正确
|
|
268
|
+
@Xss
|
|
269
|
+
@NotBlank(message = "名称不能为空")
|
|
270
|
+
private String evalName;
|
|
271
|
+
related_rules: []
|
|
272
|
+
tags: ["ruoyi", "xss", "security"]
|
|
273
|
+
|
|
274
|
+
- id: PATTERN-R007
|
|
275
|
+
name: "操作日志缺失"
|
|
276
|
+
name_en: "Missing operation log"
|
|
277
|
+
description: "增删改操作未添加@Log注解,无法追溯操作记录"
|
|
278
|
+
trigger: "新增CUD操作接口"
|
|
279
|
+
prevention: "所有CUD操作添加@Log注解"
|
|
280
|
+
severity: info
|
|
281
|
+
detection:
|
|
282
|
+
- "操作后sys_oper_log表中无记录"
|
|
283
|
+
- "CUD方法无@Log注解"
|
|
284
|
+
fix_example: |
|
|
285
|
+
# ❌ 错误
|
|
286
|
+
@DeleteMapping("/{ids}")
|
|
287
|
+
public AjaxResult remove(@PathVariable Long[] ids) { ... }
|
|
288
|
+
# ✅ 正确
|
|
289
|
+
@Log(title = "评估管理", businessType = BusinessType.DELETE)
|
|
290
|
+
@DeleteMapping("/{ids}")
|
|
291
|
+
public AjaxResult remove(@PathVariable Long[] ids) { ... }
|
|
292
|
+
related_rules: []
|
|
293
|
+
tags: ["ruoyi", "audit", "logging"]
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Gate Engine Configuration / 门控引擎配置
|
|
2
|
+
#
|
|
3
|
+
# 唯一真相源 (Single Source of Truth)
|
|
4
|
+
# gate-engine.js 必须从此文件读取配置,不得硬编码
|
|
5
|
+
#
|
|
6
|
+
# 修改流程:
|
|
7
|
+
# 1. 在此文件中修改BLOCKER规则列表或评分权重
|
|
8
|
+
# 2. gate-engine.js 自动读取最新配置
|
|
9
|
+
# 3. 无需修改JS代码
|
|
10
|
+
|
|
11
|
+
meta:
|
|
12
|
+
version: "1.0.0"
|
|
13
|
+
last_updated: "2026-04-15"
|
|
14
|
+
|
|
15
|
+
gate_levels:
|
|
16
|
+
- id: blocker
|
|
17
|
+
exit_code: 1
|
|
18
|
+
message: "🚫 BLOCKER: 流程被阻断,必须修复后才能继续"
|
|
19
|
+
color: "red"
|
|
20
|
+
|
|
21
|
+
- id: critical
|
|
22
|
+
exit_code: 1
|
|
23
|
+
message: "🔴 CRITICAL: 严重问题,必须修复"
|
|
24
|
+
color: "red"
|
|
25
|
+
|
|
26
|
+
- id: warning
|
|
27
|
+
exit_code: 0
|
|
28
|
+
message: "🟡 WARNING: 建议修复,非阻塞"
|
|
29
|
+
color: "yellow"
|
|
30
|
+
|
|
31
|
+
- id: info
|
|
32
|
+
exit_code: 0
|
|
33
|
+
message: "🔵 INFO: 可选优化"
|
|
34
|
+
color: "blue"
|
|
35
|
+
|
|
36
|
+
severity_mapping:
|
|
37
|
+
error: critical
|
|
38
|
+
warn: warning
|
|
39
|
+
info: info
|
|
40
|
+
|
|
41
|
+
blocker_rule_ids:
|
|
42
|
+
- uiux-no-uuid-input
|
|
43
|
+
- dm-enum-convention
|
|
44
|
+
- dm-permission-matrix
|
|
45
|
+
- uiux-form-mapping-exists
|
|
46
|
+
- uiux-options-api-listed
|
|
47
|
+
- api-options-endpoint
|
|
48
|
+
- prd-has-out-of-scope
|
|
49
|
+
|
|
50
|
+
blocker_fix_suggestions:
|
|
51
|
+
uiux-no-uuid-input: "外键字段使用Select组件而非手动输入"
|
|
52
|
+
dm-enum-convention: "在PRD中添加枚举编码约定章节"
|
|
53
|
+
dm-permission-matrix: "在PRD中添加角色×状态×操作权限矩阵"
|
|
54
|
+
uiux-form-mapping-exists: "在PRD中添加表单字段组件映射表"
|
|
55
|
+
uiux-options-api-listed: "在PRD中列出所有Options API数据源"
|
|
56
|
+
api-options-endpoint: "在PRD接口设计中声明/options端点"
|
|
57
|
+
prd-has-out-of-scope: "在PRD中明确声明超出范围的功能"
|
|
58
|
+
|
|
59
|
+
score_weights:
|
|
60
|
+
blocker_base: 0
|
|
61
|
+
critical_max_issues_for_nonzero: 5
|
|
62
|
+
critical_floor_score: 20
|
|
63
|
+
base_score: 100
|
|
64
|
+
critical_penalty: 15
|
|
65
|
+
warning_penalty: 5
|
|
66
|
+
info_penalty: 1
|
|
67
|
+
|
|
68
|
+
grade_thresholds:
|
|
69
|
+
A: 90
|
|
70
|
+
B: 80
|
|
71
|
+
C: 70
|
|
72
|
+
D: 60
|
|
73
|
+
F: 0
|