pdd-skills 3.1.1 → 3.1.3
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 +87 -62
- package/bin/pdd.js +106 -0
- package/config/bug-patterns.yaml +135 -3
- package/docs/pdd-skills-v3-/346/225/264/344/275/223/345/210/206/346/236/220/346/212/245/345/221/212.md +367 -0
- package/docs/plans/2026-04-26-pdd-quality-improvement-design.md +574 -0
- package/lib/contract-discovery/index.js +472 -0
- package/lib/dependency-chain/api-scanner.js +140 -0
- package/lib/dependency-chain/controller-scanner.js +174 -0
- package/lib/dependency-chain/index.js +287 -0
- package/lib/dependency-chain/status-scanner.js +175 -0
- package/package.json +1 -1
- package/skills/core/pdd-code-reviewer/SKILL.md +20 -0
- package/skills/core/pdd-implement-feature/SKILL.md +8 -0
- package/skills/core/pdd-main/SKILL.md +68 -3
- package/skills/core/pdd-vm/SKILL.md +111 -0
- package/skills/core/pdd-vm/_meta.json +1 -0
- package/skills/core/traffic-accident-assessor/_meta.json +1 -0
- package/skills/expert/expert-bug-fixer/SKILL.md +350 -0
- package/skills/expert/expert-bug-fixer/_meta.json +1 -0
- package/skills/expert/expert-ruoyi/SKILL.md +128 -1
- package/skills/expert/expert-ruoyi-permission/SKILL.md +302 -0
- package/skills/expert/expert-ruoyi-permission/_meta.json +1 -0
- package/skills/expert/expert-ruoyi-permission/references/permission-guide.md +316 -0
- package/skills/expert/expert-springcloud/SKILL.md +134 -0
- package/skills/expert/expert-springcloud/_meta.json +1 -0
- package/skills/expert/expert-testcases/LICENSE +21 -0
- package/skills/expert/expert-testcases/SKILL.md +298 -0
- package/skills/expert/expert-testcases/_meta.json +1 -0
- package/skills/expert/expert-testcases/evals/coverage_targets.md +158 -0
- package/skills/expert/expert-testcases/evals/quality_rubric.md +128 -0
- package/skills/expert/expert-testcases/examples/zccz-1-equity-transfer/snapshot-input.md +91 -0
- package/skills/expert/expert-testcases/examples/zccz-1-equity-transfer/snapshot-output.md +165 -0
- package/skills/expert/expert-testcases/references/api-testing-patterns.md +80 -0
- package/skills/expert/expert-testcases/references/coverage-best-practices.md +66 -0
- package/skills/expert/expert-testcases/references/methodology.md +111 -0
- package/skills/expert/expert-testcases/references/ruoyi-testing-guide.md +101 -0
- package/skills/expert/expert-testcases/references/workflow-testing-patterns.md +95 -0
- package/skills/expert/expert-testcases/scripts/analyze_source.py +178 -0
- package/skills/expert/expert-testcases/scripts/build_matrix.py +192 -0
- package/skills/expert/expert-testcases/scripts/extract_api.py +197 -0
- package/skills/expert/expert-testcases/scripts/validate_output.py +225 -0
- package/skills/expert/expert-testcases/templates/code/python/api_helper.py.j2 +109 -0
- package/skills/expert/expert-testcases/templates/code/python/config.py.j2 +24 -0
- package/skills/expert/expert-testcases/templates/code/python/conftest.py.j2 +151 -0
- package/skills/expert/expert-testcases/templates/code/python/pytest.ini.j2 +19 -0
- package/skills/expert/expert-testcases/templates/code/python/requirements.txt.j2 +10 -0
- package/skills/expert/expert-testcases/templates/code/python/test_approval.py.j2 +80 -0
- package/skills/expert/expert-testcases/templates/code/python/test_boundary.py.j2 +152 -0
- package/skills/expert/expert-testcases/templates/code/python/test_crud.py.j2 +48 -0
- package/skills/expert/expert-testcases/templates/code/python/test_e2e.py.j2 +110 -0
- package/skills/expert/expert-testcases/templates/code/python/test_integration.py.j2 +90 -0
- package/skills/expert/expert-testcases/templates/code/python/test_performance.py.j2 +107 -0
- package/skills/expert/expert-testcases/templates/data/test-data.yaml.j2 +105 -0
- package/skills/expert/expert-testcases/templates/data/users.yaml.j2 +43 -0
- package/skills/expert/expert-testcases/templates/docs/api-testcase.md.j2 +72 -0
- package/skills/expert/expert-testcases/templates/docs/boundary-testcase.md.j2 +52 -0
- package/skills/expert/expert-testcases/templates/docs/e2e-testcase.md.j2 +56 -0
- package/skills/expert/expert-testcases/templates/docs/integration-testcase.md.j2 +56 -0
- package/skills/expert/expert-testcases/templates/docs/performance-testcase.md.j2 +61 -0
- package/skills/expert/expert-testcases/templates/docs/readme.md.j2 +110 -0
- package/skills/expert/expert-testcases/templates/docs/ui-testcase.md.j2 +59 -0
- package/skills/expert/expert-vue3/SKILL.md +184 -0
- package/skills/expert/expert-vue3/_meta.json +1 -0
- package/skills/pr/pdd-multi-review/evals/default-evals.json +1 -0
- package/skills/pr/pdd-pr-batch/evals/default-evals.json +1 -0
- package/skills/pr/pdd-pr-create/evals/default-evals.json +1 -0
- package/skills/pr/pdd-pr-merge/evals/default-evals.json +1 -0
- package/skills/pr/pdd-pr-review/evals/default-evals.json +1 -0
- package/skills/pr/pdd-task-manager/evals/default-evals.json +1 -0
- package/skills/pr/pdd-template-engine/evals/default-evals.json +1 -0
- package/templates/release-patch-template.md +76 -0
package/README.md
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
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
6
|
[](config/bug-patterns.yaml)
|
|
7
7
|
[](config/prd-rules.yaml)
|
|
8
|
+
[](skills/)
|
|
8
9
|
|
|
9
10
|
> **PRD 驱动的 AI 原生软件开发工作流框架**
|
|
10
11
|
>
|
|
11
|
-
> 从需求文档到代码交付的全链路自动化平台 — **7 大 Phase
|
|
12
|
+
> 从需求文档到代码交付的全链路自动化平台 — **7 大 Phase**、**41+ 技能**、**14 个 Bug 模式**、**30 条 PRD 规则**、**4 级质量门控**
|
|
12
13
|
|
|
13
14
|
***
|
|
14
15
|
|
|
@@ -230,14 +231,15 @@ scaffolds/python-fullstack/
|
|
|
230
231
|
|
|
231
232
|
| 指标 | 数值 |
|
|
232
233
|
| ----------- | --------------------------------------------- |
|
|
233
|
-
| **版本** | v3.1.
|
|
234
|
-
| **核心技能** |
|
|
235
|
-
| **专家技能** |
|
|
236
|
-
|
|
|
234
|
+
| **版本** | v3.1.2 |
|
|
235
|
+
| **核心技能** | 12 个(全双语 🇨🇳🇺🇸) |
|
|
236
|
+
| **专家技能** | 12 个(安全/性能/MySQL/若依/若依权限/Activiti/Vue3/微服务/Bug修复/测试/架构) |
|
|
237
|
+
| **熵减技能** | 4 个(审计 + 架构约束 + 代码质量 + 自动重构) |
|
|
238
|
+
| **OpenSpec技能**| 10 个(变更管理全生命周期) |
|
|
239
|
+
| **PR技能** | 7 个(模板引擎 + 多轮审查 + PR创建/审查/合并/批量/任务管理) |
|
|
237
240
|
| **Bug模式库** | 14 个(7通用 + 7若依专用),集中式管理 `config/bug-patterns.yaml` |
|
|
238
241
|
| **PRD规则** | 30 条(6大类),集中式管理 `config/prd-rules.yaml` |
|
|
239
242
|
| **质量门控** | 4级(Blocker/Critical/Warning/Info)+ 0-100评分 |
|
|
240
|
-
| **脚手架模板** | 2 个(Python Fullstack + 若依RuoYi) |
|
|
241
243
|
| **协议支持** | RESTful + MCP + gRPC + SSE |
|
|
242
244
|
| **SDK 语言** | JavaScript + Python |
|
|
243
245
|
|
|
@@ -399,7 +401,7 @@ pdd config --get key # 读取配置项
|
|
|
399
401
|
|
|
400
402
|
### Phase 2: 核心能力增强
|
|
401
403
|
|
|
402
|
-
|
|
404
|
+
12 个核心技能 + 五大行为塑造机制。
|
|
403
405
|
|
|
404
406
|
#### 核心技能列表
|
|
405
407
|
|
|
@@ -416,6 +418,7 @@ pdd config --get key # 读取配置项
|
|
|
416
418
|
| `pdd-doc-gardener` | 文档清理与维护 | ✅ |
|
|
417
419
|
| `pdd-entropy-reduction` | 技术债务治理 | ✅ |
|
|
418
420
|
| `official-doc-writer` | 党政机关公文生成 | ✅ |
|
|
421
|
+
| `pdd-vm` | PDD Visual Manager 可视化监控 | ✅ |
|
|
419
422
|
|
|
420
423
|
#### 行为塑造三层防御
|
|
421
424
|
|
|
@@ -444,9 +447,39 @@ pdd config --get key # 读取配置项
|
|
|
444
447
|
| ---------------------- | --------------------------------------- | -------------------------------------- |
|
|
445
448
|
| **expert-security** | SQL注入 / XSS / CSRF / 命令注入 / 路径遍历 / SSRF | OWASP Top 10 2021 完整覆盖,8 条安全铁律 |
|
|
446
449
|
| **expert-performance** | CPU / 内存 / I/O / 网络 / 锁竞争诊断 | HikariCP / Redis多级缓存 / G1 GC调优 / P99指标 |
|
|
450
|
+
| **expert-mysql** | SQL优化 / 索引设计 / 表结构分析 / 慢查询诊断 | MySQL官方文档参考,执行计划分析,索引优化建议 |
|
|
447
451
|
| **expert-ruoyi** | 若依框架全流程开发 / 代码生成 / 权限配置 / 菜单管理 | 7个若依Bug模式(PATTERN-R001~R007) + Spec模板参考 |
|
|
452
|
+
| **expert-ruoyi-permission** | 若依框架权限配置 / 权限校验失败诊断 / 菜单按钮权限 | 四端一致原则 + @PreAuthorize + v-hasPermi |
|
|
448
453
|
| **expert-activiti** | Activiti 7工作流引擎 / BPMN 2.0 / 流程部署管理 | 流程设计规范 + BPMN校验规则 |
|
|
454
|
+
| **expert-vue3** | Vue3 组件开发 / 状态管理 / 性能优化 / 组合式 API | Vue3 生态最佳实践,响应式系统深度解析 |
|
|
455
|
+
| **expert-springcloud** | 微服务架构 / 服务治理 / 配置中心 / 网关路由 | Spring Cloud Alibaba 全栈解决方案 |
|
|
456
|
+
| **expert-bug-fixer** | Bug 根因分析 / 修复方案生成 / 回归测试建议 | 智能诊断 + 修复策略推荐 |
|
|
457
|
+
| **expert-testcases** | 测试用例设计 / 边界值分析 / 覆盖率优化 | 多维度测试策略,自动化测试生成 |
|
|
458
|
+
| **software-architect** | 架构模式设计 / 技术选型 / 性能权衡 / 可扩展性规划 | 生产级架构设计,60+ 界面组件模式参考 |
|
|
459
|
+
| **software-engineer** | 代码实现 / 重构优化 / 设计模式应用 / 测试驱动开发 | 生产级代码,清洁架构,错误处理完善 |
|
|
460
|
+
| **system-architect** | 系统架构设计 / 模块化设计 / 安全最佳实践 / 代码规范 | PEP8/ESLint 标准,项目初始化,技术栈选择 |
|
|
449
461
|
|
|
462
|
+
### Phase 3.5: 熵减治理系统
|
|
463
|
+
|
|
464
|
+
> **对抗系统腐化,持续偿还技术债务**
|
|
465
|
+
|
|
466
|
+
PDD 熵减体系通过 4 个协同技能,实现从审计到重构的闭环治理:
|
|
467
|
+
|
|
468
|
+
| 熵减技能 | 职责 | 触发场景 |
|
|
469
|
+
|---------|------|---------|
|
|
470
|
+
| **expert-entropy-auditor** | 技术债务审计 / PRD一致性检查 / AI残渣检测 | 每周定时审计、PR合并后、代码提交后 |
|
|
471
|
+
| **expert-arch-enforcer** | 架构约束检查 / 依赖方向验证 / 模块边界监控 | 代码提交后自动触发、架构检查请求 |
|
|
472
|
+
| **expert-code-quality** | 代码审查 / 重构建议 / 设计模式应用 / SOLID原则 | 代码审查请求、质量改进需求 |
|
|
473
|
+
| **expert-auto-refactor** | 自动化重构 / 消除重复 / 简化复杂度 / 模式归集 | 熵减审计后、重构任务分配 |
|
|
474
|
+
|
|
475
|
+
**治理流程**:
|
|
476
|
+
|
|
477
|
+
```
|
|
478
|
+
entropy-auditor (审计发现) → arch-enforcer (约束检查) → code-quality (质量评估) → auto-refactor (自动修复)
|
|
479
|
+
↑ |
|
|
480
|
+
└──────────────────────── 持续监控循环 ←──────────────────────────────────────┘
|
|
481
|
+
```
|
|
482
|
+
|
|
450
483
|
### Phase 4: 平台化建设
|
|
451
484
|
|
|
452
485
|
将核心能力暴露为标准化接口,支持远程调用和多语言接入。
|
|
@@ -1023,18 +1056,35 @@ skills/
|
|
|
1023
1056
|
│ ├── pdd-entropy-reduction/
|
|
1024
1057
|
│ └── official-doc-writer/
|
|
1025
1058
|
│
|
|
1026
|
-
├── expert/ # 专家技能 (
|
|
1059
|
+
├── expert/ # 专家技能 (12个,按需加载)
|
|
1027
1060
|
│ ├── expert-security/ # 安全审计专家
|
|
1028
1061
|
│ ├── expert-performance/ # 性能优化专家
|
|
1062
|
+
│ ├── expert-mysql/ # MySQL数据库专家
|
|
1029
1063
|
│ ├── expert-ruoyi/ # 若依框架专家 (含Bug模式库R001~R007)
|
|
1030
|
-
│
|
|
1064
|
+
│ ├── expert-ruoyi-permission/ # 若依权限配置专家
|
|
1065
|
+
│ ├── expert-activiti/ # Activiti工作流专家
|
|
1066
|
+
│ ├── expert-vue3/ # Vue3前端专家
|
|
1067
|
+
│ ├── expert-springcloud/ # SpringCloud微服务专家
|
|
1068
|
+
│ ├── expert-bug-fixer/ # Bug修复专家
|
|
1069
|
+
│ ├── expert-testcases/ # 测试用例专家
|
|
1070
|
+
│ ├── software-architect/ # 软件架构师
|
|
1071
|
+
│ ├── software-engineer/ # 软件工程师
|
|
1072
|
+
│ └── system-architect/ # 系统架构师
|
|
1031
1073
|
│
|
|
1032
|
-
├──
|
|
1074
|
+
├── entropy/ # 熵减治理技能 (4个)
|
|
1075
|
+
│ ├── expert-entropy-auditor/ # 技术债务审计
|
|
1076
|
+
│ ├── expert-arch-enforcer/ # 架构约束强制
|
|
1077
|
+
│ ├── expert-code-quality/ # 代码质量专家
|
|
1078
|
+
│ └── expert-auto-refactor/ # 自动重构专家
|
|
1079
|
+
│
|
|
1080
|
+
├── pr/ # PR与交付技能 (7个)
|
|
1033
1081
|
│ ├── pdd-template-engine/ # PRD感知动态模板引擎
|
|
1034
|
-
│ ├── pdd-multi-review/ #
|
|
1082
|
+
│ ├── pdd-multi-review/ # 多轮代码审查
|
|
1035
1083
|
│ ├── pdd-pr-create/ # PR创建
|
|
1036
1084
|
│ ├── pdd-pr-review/ # PR审查
|
|
1037
|
-
│
|
|
1085
|
+
│ ├── pdd-pr-merge/ # PR合并
|
|
1086
|
+
│ ├── pdd-pr-batch/ # 批量PR处理
|
|
1087
|
+
│ └── pdd-task-manager/ # 任务管理
|
|
1038
1088
|
│
|
|
1039
1089
|
├── openspec/ # OpenSpec 协作技能
|
|
1040
1090
|
│ ├── openspec-explore/
|
|
@@ -1582,56 +1632,30 @@ pdd-skills-v3/
|
|
|
1582
1632
|
│ ├── on-phase-change.js
|
|
1583
1633
|
│ └── on-quality-alert.js
|
|
1584
1634
|
│
|
|
1585
|
-
├──
|
|
1586
|
-
│
|
|
1587
|
-
│
|
|
1588
|
-
│
|
|
1589
|
-
│
|
|
1590
|
-
│
|
|
1591
|
-
│ │ ├── database-design.md
|
|
1592
|
-
│ │ ├── api-design.md
|
|
1593
|
-
│ │ └── deployment-guide.md
|
|
1594
|
-
│ ├── backend/ # 后端代码 (FastAPI + SQLAlchemy)
|
|
1595
|
-
│ │ ├── app/core/ # 核心模块 (权限/OAuth/工作流)
|
|
1596
|
-
│ │ ├── app/api/ # API 路由层
|
|
1597
|
-
│ │ ├── app/models/ # 数据模型
|
|
1598
|
-
│ │ ├── app/schemas/ # 请求/响应模型
|
|
1599
|
-
│ │ ├── app/services/ # 业务逻辑层
|
|
1600
|
-
│ │ ├── alembic/ # 数据库迁移
|
|
1601
|
-
│ │ └── tests/ # 单元 & 集成测试
|
|
1602
|
-
│ ├── frontend/ # 前端代码 (Vue3 + Vite + TS)
|
|
1603
|
-
│ │ ├── src/views/ # 页面组件 (响应式布局)
|
|
1604
|
-
│ │ ├── src/components/ # UI 组件库
|
|
1605
|
-
│ │ ├── src/stores/ # Pinia 状态管理
|
|
1606
|
-
│ │ ├── src/api/ # API 请求封装
|
|
1607
|
-
│ │ └── tailwind.config.js # 6档断点配置
|
|
1608
|
-
│ ├── docker-compose.yml # 一键部署编排
|
|
1609
|
-
│ └── .github/workflows/ # CI 流水线
|
|
1610
|
-
│
|
|
1611
|
-
├── skills/ # 技能文件
|
|
1612
|
-
│ ├── core/ # 11 个核心技能
|
|
1613
|
-
│ ├── expert/ # 2 个专家技能
|
|
1614
|
-
│ └── openspec/ # 10 个 OpenSpec 技能
|
|
1635
|
+
├── skills/ # 技能文件 (41+ 个)
|
|
1636
|
+
│ ├── core/ # 12 个核心技能
|
|
1637
|
+
│ ├── expert/ # 11 个专家技能
|
|
1638
|
+
│ ├── entropy/ # 4 个熵减技能
|
|
1639
|
+
│ ├── openspec/ # 10 个 OpenSpec 技能
|
|
1640
|
+
│ └── pr/ # 7 个 PR 技能
|
|
1615
1641
|
│
|
|
1616
1642
|
├── scripts/ # 工具脚本
|
|
1617
1643
|
│ ├── linter/ # PRD Linter 工具链
|
|
1618
1644
|
│ │ ├── prd-linter.js # PRD Linter 引擎
|
|
1619
|
-
│ │ ├── prd-rules.yaml # (符号链接→config/)
|
|
1620
|
-
│ │ ├── gate-engine.js # 4级门控引擎 (读取config/gate-config.yaml)
|
|
1621
1645
|
│ │ ├── report-generator.js# 报告生成器
|
|
1622
|
-
│ │ └── run-linters.js # Linter运行器
|
|
1623
|
-
│ ├──
|
|
1624
|
-
│ ├──
|
|
1625
|
-
│ ├── i18n-checker.js
|
|
1626
|
-
│
|
|
1646
|
+
│ │ └── run-linters.js # Linter运行器
|
|
1647
|
+
│ ├── cso-analyzer.js # CSO 触发准确率分析
|
|
1648
|
+
│ ├── eval-runner.js # Evals 测试运行器
|
|
1649
|
+
│ ├── i18n-checker.js # 双语合规检查
|
|
1650
|
+
│ ├── token-analyzer.js # Token 分析
|
|
1651
|
+
│ └── windows-compat-check.js # Windows 兼容性检查
|
|
1627
1652
|
│
|
|
1628
|
-
├── docs/ #
|
|
1629
|
-
│ ├──
|
|
1630
|
-
│ ├──
|
|
1631
|
-
│ ├──
|
|
1632
|
-
│ ├──
|
|
1633
|
-
│
|
|
1634
|
-
│ └── tasks.md # 任务跟踪 (153/100%)
|
|
1653
|
+
├── docs/ # 项目文档
|
|
1654
|
+
│ ├── i18n-spec.md # i18n 规范
|
|
1655
|
+
│ ├── lessons.md # 经验教训
|
|
1656
|
+
│ ├── tasks.md # 任务跟踪
|
|
1657
|
+
│ ├── token-checklist.md # Token 检查清单
|
|
1658
|
+
│ └── vm-tasks.md # VM 任务清单
|
|
1635
1659
|
│
|
|
1636
1660
|
├── templates/ # 项目模板
|
|
1637
1661
|
├── config/ # 配置中心 (Single Source of Truth)
|
|
@@ -1645,7 +1669,7 @@ pdd-skills-v3/
|
|
|
1645
1669
|
│ ├── ruff.toml # Python Ruff配置
|
|
1646
1670
|
│ └── sqlfluff.cfg # SQL SQLFluff配置
|
|
1647
1671
|
├── hooks/ # Hook 配置
|
|
1648
|
-
└── package.json # v3.1.
|
|
1672
|
+
└── package.json # v3.1.2
|
|
1649
1673
|
```
|
|
1650
1674
|
|
|
1651
1675
|
***
|
|
@@ -1730,8 +1754,9 @@ CLI 参数 > 环境变量 > .pddrc.local > .pddrc > defaults
|
|
|
1730
1754
|
|
|
1731
1755
|
| 版本 | 日期 | 重要变更 |
|
|
1732
1756
|
| ---------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
1733
|
-
| **v3.1.
|
|
1734
|
-
| **v3.
|
|
1757
|
+
| **v3.1.2** | 2026-04-10 | **技能生态大扩展**: 新增 7 个专家技能(expert-mysql/expert-vue3/expert-springcloud/expert-bug-fixer/expert-testcases/software-architect/software-engineer/system-architect), 新增 4 个熵减技能(entropy-auditor/arch-enforcer/code-quality/auto-refactor), PR技能扩展至7个(新增pdd-pr-batch/pdd-task-manager), 核心技能增至12个(pdd-vm), 总计41+技能 |
|
|
1758
|
+
| **v3.1.1** | 2026-04-08 | **Windows兼容性+项目结构优化**: 添加 Windows 终端兼容支持, 优化项目初始化流程, 更新目录结构规范, 完善 .npmignore 配置 |
|
|
1759
|
+
| **v3.1.0** | 2026-04-05 | **智能能力+生态集成**: Bug模式库集中化(14模式), PRD Linter扩展(30规则6大类), 4级门控引擎(Blocker/Critical/Warning/Info), OpenAPI契约同步, PRD感知动态模板, MVP分层交付策略, 上下文注入+微验证, expert-ruoyi+expert-activiti专家技能, 若依RuoYi脚手架支持, 种子数据分层设计 |
|
|
1735
1760
|
| **v3.0.1** | 2026-04-07 | **PDD Visual Manager 发布**: Web Dashboard + Terminal TUI 双形态可视化监控, 11个REST API端点, SSE实时推送, Canvas图表引擎, ANSI TUI组件库 |
|
|
1736
1761
|
| **v3.0.0** | 2026-04-05 | **正式发布版**: 6大Phase全部完成 + 插件系统 + OpenClaw + gRPC + Python SDK + 暂缓清零 |
|
|
1737
1762
|
| v2.x | 2026-03 | 内部迭代版本: MCP/SDK/缓存/Token/质量/迭代 |
|
|
@@ -1754,9 +1779,9 @@ CLI 参数 > 环境变量 > .pddrc.local > .pddrc > defaults
|
|
|
1754
1779
|
***
|
|
1755
1780
|
|
|
1756
1781
|
<p align="center">
|
|
1757
|
-
<b>PDD-Skills v3.1 — 让 AI 成为你的全职结对编程伙伴 🤖</b>
|
|
1782
|
+
<b>PDD-Skills v3.1.2 — 让 AI 成为你的全职结对编程伙伴 🤖</b>
|
|
1758
1783
|
</p>
|
|
1759
1784
|
|
|
1760
1785
|
<p align="center">
|
|
1761
|
-
<sub>14 Bug Patterns ✅ · 30 PRD Rules ✅ · 4-Level Gate ✅ ·
|
|
1786
|
+
<sub>41+ Skills ✅ · 14 Bug Patterns ✅ · 30 PRD Rules ✅ · 4-Level Gate ✅ · 4 Entropy Skills ✅</sub>
|
|
1762
1787
|
</p>
|
package/bin/pdd.js
CHANGED
|
@@ -371,4 +371,110 @@ vmCmd
|
|
|
371
371
|
|
|
372
372
|
program.addCommand(vmCmd);
|
|
373
373
|
|
|
374
|
+
// === deps 子命令组 (依赖链感知引擎) ===
|
|
375
|
+
const depsCmd = new Command()
|
|
376
|
+
.name('deps')
|
|
377
|
+
.description('依赖链感知引擎 - 分析前后端依赖关系 / Dependency Chain Engine');
|
|
378
|
+
|
|
379
|
+
depsCmd
|
|
380
|
+
.command('scan')
|
|
381
|
+
.description('扫描项目文件关系 / Scan project file relationships')
|
|
382
|
+
.option('-d, --dir <path>', '项目目录', '.')
|
|
383
|
+
.option('--backend-dir <path>', '后端源码目录', 'src/main/java')
|
|
384
|
+
.option('--frontend-api-dir <path>', '前端API目录', 'src/api')
|
|
385
|
+
.option('--json', 'JSON格式输出')
|
|
386
|
+
.action(async (options) => {
|
|
387
|
+
const { DependencyChainEngine } = await import('../lib/dependency-chain/index.js');
|
|
388
|
+
const engine = new DependencyChainEngine(options.dir, {
|
|
389
|
+
backendDir: options.backendDir,
|
|
390
|
+
frontendApiDir: options.frontendApiDir
|
|
391
|
+
});
|
|
392
|
+
const graph = await engine.scan();
|
|
393
|
+
if (options.json) {
|
|
394
|
+
console.log(engine.toJSON());
|
|
395
|
+
} else {
|
|
396
|
+
console.log(chalk.bold('\n🔗 依赖链扫描结果\n'));
|
|
397
|
+
console.log(` 后端端点: ${graph.controllers.length}`);
|
|
398
|
+
console.log(` 前端API调用: ${graph.frontendApis.length}`);
|
|
399
|
+
console.log(` 状态映射: ${graph.statusMaps.length}`);
|
|
400
|
+
console.log(` 依赖边: ${graph.edges.length}`);
|
|
401
|
+
console.log(`\n 孤立API: ${engine.findOrphanedApis().length} (可能的PATTERN-R008)`);
|
|
402
|
+
console.log(` 不完整状态映射: ${engine.findIncompleteStatusMaps().length} (可能的PATTERN-R011)`);
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
depsCmd
|
|
407
|
+
.command('impact <file>')
|
|
408
|
+
.description('分析修改某文件的影响范围 / Analyze impact of modifying a file')
|
|
409
|
+
.option('-d, --dir <path>', '项目目录', '.')
|
|
410
|
+
.action(async (file, options) => {
|
|
411
|
+
const { DependencyChainEngine } = await import('../lib/dependency-chain/index.js');
|
|
412
|
+
const engine = new DependencyChainEngine(options.dir);
|
|
413
|
+
await engine.scan();
|
|
414
|
+
const result = engine.analyzeImpact(file);
|
|
415
|
+
console.log(chalk.bold(`\n📊 修改 ${file} 的影响分析\n`));
|
|
416
|
+
if (result.impactedFiles.length === 0) {
|
|
417
|
+
console.log(chalk.yellow(' 未发现直接依赖关系'));
|
|
418
|
+
} else {
|
|
419
|
+
result.impactedFiles.forEach((item, i) => {
|
|
420
|
+
console.log(` ${i + 1}. ${chalk.cyan(item.file)}`);
|
|
421
|
+
item.reasons.forEach(r => console.log(` └── ${r}`));
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
console.log(`\n 总影响文件数: ${result.totalImpacted}`);
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
depsCmd
|
|
428
|
+
.command('orphans')
|
|
429
|
+
.description('查找孤立的前端API调用 / Find orphaned frontend API calls')
|
|
430
|
+
.option('-d, --dir <path>', '项目目录', '.')
|
|
431
|
+
.action(async (options) => {
|
|
432
|
+
const { DependencyChainEngine } = await import('../lib/dependency-chain/index.js');
|
|
433
|
+
const engine = new DependencyChainEngine(options.dir);
|
|
434
|
+
await engine.scan();
|
|
435
|
+
const orphans = engine.findOrphanedApis();
|
|
436
|
+
console.log(chalk.bold(`\n⚠️ 孤立API调用 (可能的PATTERN-R008)\n`));
|
|
437
|
+
if (orphans.length === 0) {
|
|
438
|
+
console.log(chalk.green(' 无孤立API,所有前端调用都有对应后端端点'));
|
|
439
|
+
} else {
|
|
440
|
+
orphans.forEach((api, i) => {
|
|
441
|
+
console.log(` ${i + 1}. ${chalk.red(api.url)} (${api.method})`);
|
|
442
|
+
console.log(` 文件: ${api.file}:${api.line}`);
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
program.addCommand(depsCmd);
|
|
448
|
+
|
|
449
|
+
// === contract 子命令 (契约自动发现引擎) ===
|
|
450
|
+
program
|
|
451
|
+
.command('contract')
|
|
452
|
+
.description('契约自动发现 - AST级前后端契约分析 / Contract Discovery - AST-level analysis')
|
|
453
|
+
.option('-d, --dir <path>', '项目目录', '.')
|
|
454
|
+
.option('--backend-dir <path>', '后端源码目录', 'src/main/java')
|
|
455
|
+
.option('--frontend-api-dir <path>', '前端API目录', 'src/api')
|
|
456
|
+
.option('-o, --output <path>', '输出报告路径')
|
|
457
|
+
.option('--json', 'JSON格式输出')
|
|
458
|
+
.action(async (options) => {
|
|
459
|
+
const { ContractDiscovery } = await import('../lib/contract-discovery/index.js');
|
|
460
|
+
const discovery = new ContractDiscovery(options.dir, {
|
|
461
|
+
backendDir: options.backendDir,
|
|
462
|
+
frontendApiDir: options.frontendApiDir
|
|
463
|
+
});
|
|
464
|
+
const result = await discovery.analyze();
|
|
465
|
+
|
|
466
|
+
if (options.json) {
|
|
467
|
+
console.log(JSON.stringify(result, null, 2));
|
|
468
|
+
} else {
|
|
469
|
+
const report = discovery.generateContractReport();
|
|
470
|
+
if (options.output) {
|
|
471
|
+
const fs = await import('fs');
|
|
472
|
+
fs.writeFileSync(options.output, report, 'utf-8');
|
|
473
|
+
console.log(chalk.green(`\n✅ 契约报告已生成: ${options.output}`));
|
|
474
|
+
} else {
|
|
475
|
+
console.log(report);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
|
|
374
480
|
program.parse();
|
package/config/bug-patterns.yaml
CHANGED
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
# - 未来脚手架: PATTERN-JNNN (Java/Spring), PATTERN-GNNN (Go) 等
|
|
15
15
|
|
|
16
16
|
meta:
|
|
17
|
-
version: "1.
|
|
18
|
-
last_updated: "2026-04-
|
|
19
|
-
source: "资产评估处置管理系统首次项目实践复盘"
|
|
17
|
+
version: "1.1.0"
|
|
18
|
+
last_updated: "2026-04-28"
|
|
19
|
+
source: "资产评估处置管理系统首次项目实践复盘 + 共识Bug分析报告"
|
|
20
20
|
maintainers: ["pdd-skills-v3"]
|
|
21
21
|
|
|
22
22
|
categories:
|
|
@@ -291,3 +291,135 @@ categories:
|
|
|
291
291
|
public AjaxResult remove(@PathVariable Long[] ids) { ... }
|
|
292
292
|
related_rules: []
|
|
293
293
|
tags: ["ruoyi", "audit", "logging"]
|
|
294
|
+
|
|
295
|
+
- id: PATTERN-R013
|
|
296
|
+
name: @DataScope注解缺失
|
|
297
|
+
description: 导致跨部门数据泄露
|
|
298
|
+
trigger: 实现select*List() Mapper方法
|
|
299
|
+
prevention: 所有列表查询必须添加注解
|
|
300
|
+
severity: critical
|
|
301
|
+
detection: [3种检测方式]
|
|
302
|
+
fix_example: [❌错误 vs ✅正确 代码示例]
|
|
303
|
+
related_rules: ["dm-permission-matrix"]
|
|
304
|
+
tags: ["ruoyi", "data-scope", "security"]
|
|
305
|
+
|
|
306
|
+
- id: PATTERN-R008
|
|
307
|
+
name: "API路径拼接断层"
|
|
308
|
+
name_en: "API path concatenation mismatch"
|
|
309
|
+
description: "前端API路径遗漏了Controller类级别的@RequestMapping路径段,导致请求404"
|
|
310
|
+
trigger: "新增前端API调用或修改后端Controller路径"
|
|
311
|
+
prevention: "前端API路径 = Controller类@RequestMapping + 方法@XXXMapping,编写前必须完整拼接"
|
|
312
|
+
severity: critical
|
|
313
|
+
detection:
|
|
314
|
+
- "前端请求返回404 Not Found"
|
|
315
|
+
- "前端API路径与后端Controller完整路径不一致"
|
|
316
|
+
- "Controller类有多级@RequestMapping但前端只取了方法级路径"
|
|
317
|
+
fix_example: |
|
|
318
|
+
# ❌ 错误: 遗漏了类级别路径 /evaluation/approval
|
|
319
|
+
request({ url: '/review/manage/detail/' + id })
|
|
320
|
+
# ✅ 正确: 完整拼接类级别 + 方法级别
|
|
321
|
+
request({ url: '/evaluation/approval/review/manage/detail/' + id })
|
|
322
|
+
related_rules: []
|
|
323
|
+
tags: ["ruoyi", "api", "frontend-backend", "404"]
|
|
324
|
+
|
|
325
|
+
- id: PATTERN-R009
|
|
326
|
+
name: "附件入参类型错误"
|
|
327
|
+
name_en: "File upload parameter type mismatch"
|
|
328
|
+
description: "前端已通过通用上传接口获取文件URL,但后端业务接口仍使用MultipartFile接收,导致参数解析异常"
|
|
329
|
+
trigger: "实现包含文件附件的业务接口"
|
|
330
|
+
prevention: "若前端使用了通用上传(/common/upload),后端业务接口必须使用List<String>接收URL列表,不要用MultipartFile"
|
|
331
|
+
severity: critical
|
|
332
|
+
detection:
|
|
333
|
+
- "后端报Content-Type不支持或参数解析异常"
|
|
334
|
+
- "前端已调用/common/upload但业务接口仍声明MultipartFile参数"
|
|
335
|
+
- "前端传递的是文件URL字符串但后端期望的是文件流"
|
|
336
|
+
fix_example: |
|
|
337
|
+
// ❌ 错误: 前端已通过通用上传获取URL,不应再用MultipartFile
|
|
338
|
+
@PostMapping
|
|
339
|
+
public AjaxResult add(@RequestParam("files") MultipartFile[] files, EvalProject project) { ... }
|
|
340
|
+
// ✅ 正确: 接收URL列表
|
|
341
|
+
@PostMapping
|
|
342
|
+
public AjaxResult add(@Validated @RequestBody EvalProjectBo bo) {
|
|
343
|
+
// bo.getAttachments() 返回 List<String>,每项为文件URL
|
|
344
|
+
}
|
|
345
|
+
related_rules: []
|
|
346
|
+
tags: ["ruoyi", "file-upload", "parameter", "frontend-backend"]
|
|
347
|
+
|
|
348
|
+
- id: PATTERN-R010
|
|
349
|
+
name: "状态流转审批日志遗漏"
|
|
350
|
+
name_en: "Missing approval log during state transition"
|
|
351
|
+
description: "状态变更操作未在同一事务中记录审批日志,导致审批历史中缺少某个节点的记录"
|
|
352
|
+
trigger: "实现涉及status字段变更的业务方法"
|
|
353
|
+
prevention: "涉及状态流转的方法必须添加@Transactional,并在同方法内插入审批记录"
|
|
354
|
+
severity: critical
|
|
355
|
+
detection:
|
|
356
|
+
- "审批历史页面中缺少某个节点的审批记录"
|
|
357
|
+
- "状态变更方法中无审批日志插入语句"
|
|
358
|
+
- "状态变更和日志记录不在同一个@Transactional事务中"
|
|
359
|
+
fix_example: |
|
|
360
|
+
// ❌ 错误: 只改状态未记录审批日志
|
|
361
|
+
public void approve(Long id) {
|
|
362
|
+
project.setStatus("approved");
|
|
363
|
+
projectMapper.updateById(project);
|
|
364
|
+
}
|
|
365
|
+
// ✅ 正确: 同一事务中记录审批日志
|
|
366
|
+
@Transactional
|
|
367
|
+
public void approve(Long id) {
|
|
368
|
+
project.setStatus("approved");
|
|
369
|
+
projectMapper.updateById(project);
|
|
370
|
+
// 记录审批日志
|
|
371
|
+
EvalApprovalRecord record = new EvalApprovalRecord();
|
|
372
|
+
record.setProjectId(id);
|
|
373
|
+
record.setAction("approve");
|
|
374
|
+
record.setOperator(SecurityUtils.getUsername());
|
|
375
|
+
approvalRecordMapper.insert(record);
|
|
376
|
+
}
|
|
377
|
+
related_rules: []
|
|
378
|
+
tags: ["ruoyi", "approval", "transaction", "audit"]
|
|
379
|
+
|
|
380
|
+
- id: PATTERN-R011
|
|
381
|
+
name: "状态字典映射不完整"
|
|
382
|
+
name_en: "Incomplete status dictionary mapping"
|
|
383
|
+
description: "新增状态值后,未在所有包含状态映射的文件中同步添加,导致状态显示为英文原文或标签颜色异常"
|
|
384
|
+
trigger: "新增或修改业务状态值"
|
|
385
|
+
prevention: "新增状态值时,必须全局搜索所有getStatusLabel/getNodeLabel/getStatusTagType方法并同步更新"
|
|
386
|
+
severity: warning
|
|
387
|
+
detection:
|
|
388
|
+
- "状态值在页面上显示为英文原文(如'approved'而非'已通过')"
|
|
389
|
+
- "状态标签颜色异常(如显示为默认灰色或红色)"
|
|
390
|
+
- "部分页面状态翻译正确但另一些页面不正确"
|
|
391
|
+
fix_example: |
|
|
392
|
+
// ❌ 错误: 在A页面加了新状态映射但B页面没加
|
|
393
|
+
// fileA.vue
|
|
394
|
+
getStatusLabel(status) {
|
|
395
|
+
const map = { draft: '草稿', pending: '待审批', approved: '已通过', rejected: '已驳回' }
|
|
396
|
+
return map[status] || status
|
|
397
|
+
}
|
|
398
|
+
// fileB.vue - 缺少 rejected 状态
|
|
399
|
+
getStatusLabel(status) {
|
|
400
|
+
const map = { draft: '草稿', pending: '待审批', approved: '已通过' }
|
|
401
|
+
return map[status] || status // rejected 会显示英文原文
|
|
402
|
+
}
|
|
403
|
+
// ✅ 正确: 抽离到统一的 constants.js
|
|
404
|
+
// src/utils/constants.js
|
|
405
|
+
export const STATUS_MAP = { draft: '草稿', pending: '待审批', approved: '已通过', rejected: '已驳回' }
|
|
406
|
+
// 所有页面引用同一份映射
|
|
407
|
+
related_rules: ["dm-enum-convention"]
|
|
408
|
+
tags: ["ruoyi", "status", "dictionary", "frontend"]
|
|
409
|
+
|
|
410
|
+
- id: PATTERN-R012
|
|
411
|
+
name: "MyBatis多参数@Param缺失"
|
|
412
|
+
name_en: "Missing @Param annotation for MyBatis multi-parameter methods"
|
|
413
|
+
description: "Mapper方法有多个参数但未使用@Param注解,导致MyBatis参数绑定异常"
|
|
414
|
+
trigger: "Mapper接口方法有2个以上参数"
|
|
415
|
+
prevention: "Mapper方法有2个以上参数时,每个参数必须添加@Param注解"
|
|
416
|
+
severity: critical
|
|
417
|
+
detection:
|
|
418
|
+
- "运行时报MyBatis参数绑定异常(BindingException)"
|
|
419
|
+
- "Mapper方法有多个参数但无@Param注解"
|
|
420
|
+
- "XML中的#{param}无法匹配到方法参数"
|
|
421
|
+
fix_example: |
|
|
422
|
+
// ❌ 错误: 多参数未加@Param
|
|
423
|
+
List<EvalProject> selectByStatusAndDept(String status, Long deptId);
|
|
424
|
+
// ✅ 正确: 每个参数加@Param
|
|
425
|
+
List<EvalProject> selectByStatusAndDept(@Param("status") String status, @Param("deptId") Long deptId);
|