pdd-skills 3.0.1 → 3.0.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.
Files changed (94) hide show
  1. package/README.md +186 -25
  2. package/bin/pdd.js +3 -1
  3. package/lib/vm/dashboard/api-routes.js +66 -9
  4. package/lib/vm/dashboard/server.js +1 -1
  5. package/lib/vm/dashboard/static/index.html +6 -6
  6. package/lib/vm/dashboard/static/js/app.js +7 -2
  7. package/lib/vm/dashboard/static/js/charts.js +1 -1
  8. package/lib/vm/data-provider.js +3 -2
  9. package/lib/vm/event-bus.js +1 -1
  10. package/package.json +2 -1
  11. package/scaffolds/README.md +26 -0
  12. package/scaffolds/python-fullstack/.github/workflows/ci.yml +43 -0
  13. package/scaffolds/python-fullstack/Dockerfile +12 -0
  14. package/scaffolds/python-fullstack/README.md +95 -0
  15. package/scaffolds/python-fullstack/backend/app/__init__.py +4 -0
  16. package/scaffolds/python-fullstack/backend/app/api/v1/__init__.py +6 -0
  17. package/scaffolds/python-fullstack/backend/app/api/v1/auth.py +179 -0
  18. package/scaffolds/python-fullstack/backend/app/api/v1/deps.py +14 -0
  19. package/scaffolds/python-fullstack/backend/app/api/v1/router.py +11 -0
  20. package/scaffolds/python-fullstack/backend/app/api/v1/users.py +143 -0
  21. package/scaffolds/python-fullstack/backend/app/config.py +69 -0
  22. package/scaffolds/python-fullstack/backend/app/core/auth/__init__.py +13 -0
  23. package/scaffolds/python-fullstack/backend/app/core/auth/dependencies.py +91 -0
  24. package/scaffolds/python-fullstack/backend/app/core/auth/jwt.py +84 -0
  25. package/scaffolds/python-fullstack/backend/app/core/auth/security.py +17 -0
  26. package/scaffolds/python-fullstack/backend/app/core/data_permission/__init__.py +27 -0
  27. package/scaffolds/python-fullstack/backend/app/core/data_permission/config.py +21 -0
  28. package/scaffolds/python-fullstack/backend/app/core/data_permission/context.py +67 -0
  29. package/scaffolds/python-fullstack/backend/app/core/data_permission/decorator.py +60 -0
  30. package/scaffolds/python-fullstack/backend/app/core/data_permission/engine.py +121 -0
  31. package/scaffolds/python-fullstack/backend/app/core/data_permission/enums.py +30 -0
  32. package/scaffolds/python-fullstack/backend/app/core/data_permission/events.py +71 -0
  33. package/scaffolds/python-fullstack/backend/app/core/data_permission/scope_resolver.py +139 -0
  34. package/scaffolds/python-fullstack/backend/app/core/oauth/__init__.py +31 -0
  35. package/scaffolds/python-fullstack/backend/app/core/oauth/base.py +118 -0
  36. package/scaffolds/python-fullstack/backend/app/core/oauth/exceptions.py +33 -0
  37. package/scaffolds/python-fullstack/backend/app/core/oauth/providers/__init__.py +18 -0
  38. package/scaffolds/python-fullstack/backend/app/core/oauth/providers/dingtalk.py +68 -0
  39. package/scaffolds/python-fullstack/backend/app/core/oauth/providers/feishu.py +71 -0
  40. package/scaffolds/python-fullstack/backend/app/core/oauth/providers/oidc.py +164 -0
  41. package/scaffolds/python-fullstack/backend/app/core/oauth/providers/wechat_mini.py +55 -0
  42. package/scaffolds/python-fullstack/backend/app/core/oauth/providers/wechat_open.py +86 -0
  43. package/scaffolds/python-fullstack/backend/app/core/oauth/providers/wecom.py +105 -0
  44. package/scaffolds/python-fullstack/backend/app/core/oauth/registry.py +43 -0
  45. package/scaffolds/python-fullstack/backend/app/core/oauth/services/user_binding_service.py +111 -0
  46. package/scaffolds/python-fullstack/backend/app/core/workflow/__init__.py +40 -0
  47. package/scaffolds/python-fullstack/backend/app/core/workflow/conditions.py +38 -0
  48. package/scaffolds/python-fullstack/backend/app/core/workflow/engine.py +448 -0
  49. package/scaffolds/python-fullstack/backend/app/core/workflow/enums.py +62 -0
  50. package/scaffolds/python-fullstack/backend/app/core/workflow/exceptions.py +54 -0
  51. package/scaffolds/python-fullstack/backend/app/core/workflow/models.py +134 -0
  52. package/scaffolds/python-fullstack/backend/app/core/workflow/transition_rule.py +27 -0
  53. package/scaffolds/python-fullstack/backend/app/database/database.py +53 -0
  54. package/scaffolds/python-fullstack/backend/app/exceptions.py +76 -0
  55. package/scaffolds/python-fullstack/backend/app/main.py +77 -0
  56. package/scaffolds/python-fullstack/backend/app/models/__init__.py +6 -0
  57. package/scaffolds/python-fullstack/backend/app/models/delegation.py +87 -0
  58. package/scaffolds/python-fullstack/backend/app/models/oauth_binding.py +35 -0
  59. package/scaffolds/python-fullstack/backend/app/models/org.py +41 -0
  60. package/scaffolds/python-fullstack/backend/app/models/role.py +65 -0
  61. package/scaffolds/python-fullstack/backend/app/models/user.py +48 -0
  62. package/scaffolds/python-fullstack/backend/app/schemas/__init__.py +11 -0
  63. package/scaffolds/python-fullstack/backend/app/schemas/auth.py +54 -0
  64. package/scaffolds/python-fullstack/backend/app/schemas/common.py +44 -0
  65. package/scaffolds/python-fullstack/backend/app/schemas/user.py +78 -0
  66. package/scaffolds/python-fullstack/backend/pyproject.toml +17 -0
  67. package/scaffolds/python-fullstack/backend/requirements-dev.txt +5 -0
  68. package/scaffolds/python-fullstack/backend/requirements.txt +11 -0
  69. package/scaffolds/python-fullstack/docker-compose.yml +52 -0
  70. package/scaffolds/python-fullstack/docs/01-architecture.md +1280 -0
  71. package/scaffolds/python-fullstack/docs/02-data-permission.md +1538 -0
  72. package/scaffolds/python-fullstack/docs/03-workflow-engine.md +1079 -0
  73. package/scaffolds/python-fullstack/docs/04-mobile-oauth.md +1182 -0
  74. package/scaffolds/python-fullstack/frontend/Dockerfile +12 -0
  75. package/scaffolds/python-fullstack/frontend/index.html +14 -0
  76. package/scaffolds/python-fullstack/frontend/nginx.conf +19 -0
  77. package/scaffolds/python-fullstack/frontend/package.json +1 -0
  78. package/scaffolds/python-fullstack/frontend/postcss.config.js +15 -0
  79. package/scaffolds/python-fullstack/frontend/src/App.vue +14 -0
  80. package/scaffolds/python-fullstack/frontend/src/api/client.ts +27 -0
  81. package/scaffolds/python-fullstack/frontend/src/composables/useResponsive.ts +53 -0
  82. package/scaffolds/python-fullstack/frontend/src/main.ts +10 -0
  83. package/scaffolds/python-fullstack/frontend/src/router/index.ts +36 -0
  84. package/scaffolds/python-fullstack/frontend/src/stores/user.ts +42 -0
  85. package/scaffolds/python-fullstack/frontend/src/styles/responsive.css +59 -0
  86. package/scaffolds/python-fullstack/frontend/src/styles/variables.css +31 -0
  87. package/scaffolds/python-fullstack/frontend/src/views/DashboardView.vue +66 -0
  88. package/scaffolds/python-fullstack/frontend/src/views/HomeView.vue +19 -0
  89. package/scaffolds/python-fullstack/frontend/src/views/LoginView.vue +71 -0
  90. package/scaffolds/python-fullstack/frontend/tailwind.config.js +17 -0
  91. package/scaffolds/python-fullstack/frontend/tsconfig.json +1 -0
  92. package/scaffolds/python-fullstack/frontend/tsconfig.node.json +1 -0
  93. package/scaffolds/python-fullstack/frontend/vite.config.ts +25 -0
  94. package/scaffolds/python-fullstack/template_config.yaml +138 -0
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # PDD-Skills v3.0
2
2
 
3
- [!\[Version\](https://img.shields.io/badge/version-3.0.0-blue.svg null)](https://github.com/pdd-skills/pdd-skills)
4
- [!\[Node\](https://img.shields.io/badge/node-%3E%3D18.0.0-green.svg null)](https://nodejs.org/)
5
- [!\[License\](https://img.shields.io/badge/license-MIT-orange.svg null)](LICENSE)
6
- [!\[Tasks\](https://img.shields.io/badge/tasks-153%2F153-brightgreen.svg null)](docs/tasks.md)
7
- [!\[Milestones\](https://img.shields.io/badge/milestones-29%2F29-success.svg null)](docs/tasks.md)
3
+ [![Version](https://img.shields.io/badge/version-3.0.1-blue.svg null)](https://github.com/pdd-skills/pdd-skills)
4
+ [![Node](https://img.shields.io/badge/node-%3E%3D18.0.0-green.svg null)](https://nodejs.org/)
5
+ [![License](https://img.shields.io/badge/license-MIT-orange.svg null)](LICENSE)
6
+ [![Tasks](https://img.shields.io/badge/tasks-153%2F153-brightgreen.svg null)](docs/tasks.md)
7
+ [![Milestones](https://img.shields.io/badge/milestones-29%2F29-success.svg null)](docs/tasks.md)
8
8
 
9
9
  > **PRD 驱动的 AI 原生软件开发工作流框架**
10
10
  >
@@ -88,7 +88,7 @@
88
88
  │ │ • npx安装 │ │ • 11核心 │ │ • 安全 │ │ • CLI │ │
89
89
  │ │ • Linter │ │ 技能 │ │ • 性能 │ │ • API │ │
90
90
  │ │ • Hook │ │ • i18n │ │ 专家 │ │ • MCP │ │
91
- │ │ • Evals │ │ • CSO │ │ │ │ • JS SDK │ │
91
+ │ │ • Evals │ │ • CSO │ │ │ │ • JS SDK │ │
92
92
  │ │ │ │ • Token │ │ │ │ • Python│ │
93
93
  │ └──────────┘ │ • Evals │ └──────────┘ │ • gRPC │ │
94
94
  │ └──────────┘ └──────────┘ │
@@ -107,11 +107,129 @@
107
107
  └─────────────────────────────────────────────────────────────────────────────────┘
108
108
  ```
109
109
 
110
+ ### 🏗️ 脚手架系统
111
+
112
+ > **PDD-Skills v3.0.1+ 新增内置脚手架系统**,提供生产级全栈项目模板,支持从零到一的快速项目初始化。
113
+
114
+ #### 可用模板
115
+
116
+ | 模板名称 | 技术栈 | 适用场景 | 状态 |
117
+ | --------------- | --------------------------------------- | ------------- | ----- |
118
+ | **python-fullstack** | FastAPI + Vue3 + TypeScript + TailwindCSS | 企业级全栈 Web 应用 | ✅ 稳定版 |
119
+
120
+ #### 核心能力矩阵
121
+
122
+ ```
123
+ ┌─────────────────────────────────────────────────────────────────────────────┐
124
+ │ python-fullstack 模板能力矩阵 │
125
+ ├─────────────────────────────────────────────────────────────────────────────┤
126
+ │ │
127
+ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
128
+ │ │ data_permission │ │ oauth_sso │ │ workflow_engine │ │
129
+ │ │ 数据权限引擎 │ │ OAuth2 六平台认证 │ │ 工作流状态机引擎 │ │
130
+ │ │ │ │ │ │ │ │
131
+ │ │ • 组织级数据隔离 │ │ • 企业微信 │ │ • 15种状态定义 │ │
132
+ │ │ • 借调合并机制 │ │ • 钉钉 │ │ • 会签/或签 │ │
133
+ │ │ • 行级权限控制 │ │ • 飞书 │ │ • 条件分支路由 │ │
134
+ │ │ │ │ • 微信公众号 │ │ • 回退/撤回 │ │
135
+ │ │ │ │ • OIDC 通用 │ │ • 定时任务触发 │ │
136
+ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
137
+ │ │
138
+ │ ┌─────────────────────────────────────────────────────────┐ │
139
+ │ │ responsive_ui │ │
140
+ │ │ 响应式前端系统 │ │
141
+ │ │ │ │
142
+ │ │ PC端 (≥1280px) → 平板 (768-1279px) → 大屏手机 (≤767px) │ │
143
+ │ │ 6档断点自适应 · 组件级响应式 · 暗色模式支持 │ │
144
+ │ └─────────────────────────────────────────────────────────┘ │
145
+ │ │
146
+ └─────────────────────────────────────────────────────────────────────────────┘
147
+ ```
148
+
149
+ #### 技术栈详情
150
+
151
+ | 层面 | 技术选型 | 版本要求 |
152
+ | ---------- | ---------------------------------------- | --------- |
153
+ | **后端框架** | Python FastAPI | 3.11+ |
154
+ | **ORM** | SQLAlchemy [asyncio] | 2.x+ |
155
+ | **数据库** | MySQL | 8.0+ |
156
+ | **前端框架** | Vue3 + Vite + TypeScript | 3.x+ |
157
+ | **UI 框架** | TailwindCSS | 3.x+ |
158
+ | **容器化** | Docker + docker-compose | 最新稳定版 |
159
+ | **CI/CD** | GitHub Actions / GitLab CI | - |
160
+
161
+ #### 快速使用
162
+
163
+ ```bash
164
+ # 1️⃣ 使用脚手架创建全栈项目
165
+ pdd scaffold init my-fullstack-app --template python-fullstack
166
+
167
+ # 2️⃣ 进入项目目录
168
+ cd my-fullstack-app
169
+
170
+ # 3️⃣ 查看模板配置
171
+ cat scaffolds/python-fullstack/template_config.yaml
172
+
173
+ # 4️⃣ 一键启动开发环境(含数据库)
174
+ docker-compose up -d
175
+
176
+ # 5️⃣ 启动后端服务
177
+ cd backend && uvicorn main:app --reload --port 8000
178
+
179
+ # 6️⃣ 启动前端服务
180
+ cd frontend && npm run dev
181
+ ```
182
+
183
+ #### 模板目录结构预览
184
+
185
+ ```
186
+ scaffolds/python-fullstack/
187
+ ├── template_config.yaml # 模板元数据 & Hooks 配置
188
+ ├── README.md # 模板使用指南
189
+ ├── docs/
190
+ │ ├── architecture-design.md # 架构设计文档
191
+ │ ├── database-design.md # 数据库设计文档
192
+ │ ├── api-design.md # API 设计文档
193
+ │ └── deployment-guide.md # 部署指南
194
+ ├── backend/
195
+ │ ├── app/
196
+ │ │ ├── core/ # 核心模块 (data_permission/oauth_sso/workflow_engine)
197
+ │ │ ├── api/ # API 路由层
198
+ │ │ ├── models/ # SQLAlchemy 数据模型
199
+ │ │ ├── schemas/ # Pydantic 请求/响应模型
200
+ │ │ └── services/ # 业务逻辑层
201
+ │ ├── alembic/ # 数据库迁移
202
+ │ ├── tests/ # 单元测试 & 集成测试
203
+ │ └── requirements.txt
204
+ ├── frontend/
205
+ │ ├── src/
206
+ │ │ ├── views/ # 页面组件 (响应式布局)
207
+ │ │ ├── components/ # UI 组件库
208
+ │ │ ├── stores/ # Pinia 状态管理
209
+ │ │ ├── api/ # API 请求封装
210
+ │ │ └── utils/ # 工具函数
211
+ │ ├── tailwind.config.js # 6档断点配置
212
+ │ └── vite.config.ts
213
+ ├── docker-compose.yml # 一键部署编排
214
+ ├── .github/workflows/ # CI 流水线
215
+ └── config/ # 环境配置文件
216
+ ```
217
+
218
+ #### 质量保证
219
+
220
+ ✅ 已通过 **4 项代码质量修复验证**:
221
+ - 数据库连接池配置优化
222
+ - 安全异常处理完善
223
+ - datetime 弃用 API 替换
224
+ - SQLAlchemy 异步 API 正确性校验
225
+
226
+ ---
227
+
110
228
  ### 📊 关键数据
111
229
 
112
230
  | 指标 | 数值 |
113
231
  | ----------- | --------------------------------------------- |
114
- | **版本** | v3.0.0 |
232
+ | **版本** | v3.0.2 |
115
233
  | **总任务数** | 153 (**100% 完成**) |
116
234
  | **里程碑数** | 29 (**100% 达成**) |
117
235
  | **核心技能** | 11 个(全双语 🇨🇳🇺🇸) |
@@ -122,6 +240,7 @@
122
240
  | **示例插件** | 3 个(hello-world / code-stats / custom-linter) |
123
241
  | **社区文档** | 5 套(\~10,700 行) |
124
242
  | **VM 新增代码** | \~6000 行(Phase 7) |
243
+ | **脚手架模板** | 1 个(python-fullstack 全栈模板) |
125
244
 
126
245
  ***
127
246
 
@@ -229,6 +348,19 @@ pdd vm features # 功能点列表
229
348
  pdd vm export --format csv # 导出数据
230
349
  ```
231
350
 
351
+ ### 🏗️ 脚手架命令(v3.0.1+)
352
+
353
+ ```bash
354
+ # 初始化脚手架项目
355
+ pdd scaffold init <project-name> --template <template-name>
356
+
357
+ # 查看可用模板列表
358
+ pdd scaffold list
359
+
360
+ # 查看模板详情
361
+ pdd scaffold info <template-name>
362
+ ```
363
+
232
364
  ### 服务端
233
365
 
234
366
  ```bash
@@ -480,11 +612,11 @@ PluginBase (抽象基类)
480
612
 
481
613
  | 文档 | 内容 | 行数 |
482
614
  | ---------------------------------------------------------- | ----------------- | ------ |
483
- | [user-guide](docs/user-guide/user-guide.md) | 快速开始 / 工作流 / FAQ | \~1480 |
484
- | [developer-guide](docs/developer-guide/developer-guide.md) | 架构 / 规范 / 贡献流程 | \~2960 |
485
- | [api-reference](docs/api-reference/api-reference.md) | 全模块 API / 错误码大全 | \~3948 |
486
- | [operations](docs/operations/operations-guide.md) | 部署 / 调优 / 监控 / 安全 | \~2018 |
487
- | [plugin-market](docs/plugin-market/README.md) | 发布流程 / 评分标准 / 审核 | \~400 |
615
+ | [user-guide](docs/user-guide/user-guide.md) | 快速开始 / 工作流 / FAQ | ~1480 |
616
+ | [developer-guide](docs/developer-guide/developer-guide.md) | 架构 / 规范 / 贡献流程 | ~2960 |
617
+ | [api-reference](docs/api-reference/api-reference.md) | 全模块 API / 错误码大全 | ~3948 |
618
+ | [operations](docs/operations/operations-guide.md) | 部署 / 调优 / 监控 / 安全 | ~2018 |
619
+ | [plugin-market](docs/plugin-market/README.md) | 发布流程 / 评分标准 / 审核 | ~400 |
488
620
 
489
621
  ***
490
622
 
@@ -540,18 +672,18 @@ PDD Visual Manager (PDD-VM) 是 Phase 7 的核心交付物,提供 **双形态
540
672
  │ │ │ ├─────────────────┤ │ │ │ │ ├───────────────────────┤ │ │ │
541
673
  │ │ │ │ app.js (SPA框架)│ │ │ │ │ │ input.js (键盘输入) │ │ │ │
542
674
  │ │ │ └─────────────────┘ │ │ │ │ └───────────────────────┘ │ │ │
543
- │ │ │ │ │ │ │ 5 组件: │ │ │
544
- │ │ │ 4 视图面板: │ │ │ │ progress-bar / table / │ │ │
545
- │ │ │ • Pipeline (流水线) │ │ │ │ sparkline / status-light │ │ │
546
- │ │ │ • Kanban (看板) │ │ │ │ / card │ │ │
547
- │ │ │ • Quality (质量) │ │ │ │ │ │ │
548
- │ │ │ • System (系统) │ │ │ │ 4 屏幕 + 详情overlay: │ │ │
549
- │ │ │ │ │ │ │ overview / kanban / │ │ │
550
- │ │ │ Canvas 图表引擎: │ │ │ │ quality / system │ │ │
551
- │ │ │ radar/histogram/ │ │ │ │ │ │ │
552
- │ │ │ gauge/lineChart/ │ │ │ └─────────────────────────────┘ │ │
553
- │ │ │ horizontalBar │ │ │ │ │
554
- │ │ └───────────────────────┘ │ └─────────────────────────────────────┘
675
+ │ │ │ │ │ │ │ │ │ │
676
+ │ │ │ 4 视图面板: │ │ │ │ 5 组件: │ │ │
677
+ │ │ │ • Pipeline (流水线) │ │ │ │ progress-bar / table / │ │ │
678
+ │ │ │ • Kanban (看板) │ │ │ │ sparkline / status-light │ │ │
679
+ │ │ │ • Quality (质量) │ │ │ │ / card │ │ │
680
+ │ │ │ • System (系统) │ │ │ │ │ │ │
681
+ │ │ │ │ │ │ │ 4 屏幕 + 详情overlay: │ │ │
682
+ │ │ │ Canvas 图表引擎: │ │ │ │ overview / kanban / │ │ │
683
+ │ │ │ radar/histogram/ │ │ │ │ quality / system │ │ │
684
+ │ │ │ gauge/lineChart/ │ │ │ │ │ │ │
685
+ │ │ │ horizontalBar │ │ │ └─────────────────────────────┘ │ │
686
+ │ │ └───────────────────────┘ │ │ │
555
687
  │ └─────────────────────────────┘ │
556
688
  │ │
557
689
  └─────────────────────────────────────────────────────────────────────────────────┘
@@ -1347,6 +1479,32 @@ pdd-skills-v3/
1347
1479
  │ ├── on-phase-change.js
1348
1480
  │ └── on-quality-alert.js
1349
1481
 
1482
+ ├── scaffolds/ # ★ 脚手架模板系统 (v3.0.1+ 新增)
1483
+ │ └── python-fullstack/ # Python 全栈模板 (FastAPI + Vue3)
1484
+ │ ├── template_config.yaml # 模板元数据 & Hooks & 变量配置
1485
+ │ ├── README.md # 模板使用指南
1486
+ │ ├── docs/ # 4份架构设计文档
1487
+ │ │ ├── architecture-design.md
1488
+ │ │ ├── database-design.md
1489
+ │ │ ├── api-design.md
1490
+ │ │ └── deployment-guide.md
1491
+ │ ├── backend/ # 后端代码 (FastAPI + SQLAlchemy)
1492
+ │ │ ├── app/core/ # 核心模块 (权限/OAuth/工作流)
1493
+ │ │ ├── app/api/ # API 路由层
1494
+ │ │ ├── app/models/ # 数据模型
1495
+ │ │ ├── app/schemas/ # 请求/响应模型
1496
+ │ │ ├── app/services/ # 业务逻辑层
1497
+ │ │ ├── alembic/ # 数据库迁移
1498
+ │ │ └── tests/ # 单元 & 集成测试
1499
+ │ ├── frontend/ # 前端代码 (Vue3 + Vite + TS)
1500
+ │ │ ├── src/views/ # 页面组件 (响应式布局)
1501
+ │ │ ├── src/components/ # UI 组件库
1502
+ │ │ ├── src/stores/ # Pinia 状态管理
1503
+ │ │ ├── src/api/ # API 请求封装
1504
+ │ │ └── tailwind.config.js # 6档断点配置
1505
+ │ ├── docker-compose.yml # 一键部署编排
1506
+ │ └── .github/workflows/ # CI 流水线
1507
+
1350
1508
  ├── skills/ # 技能文件
1351
1509
  │ ├── core/ # 11 个核心技能
1352
1510
  │ ├── expert/ # 2 个专家技能
@@ -1370,7 +1528,7 @@ pdd-skills-v3/
1370
1528
  ├── templates/ # 项目模板
1371
1529
  ├── config/ # 配置文件
1372
1530
  ├── hooks/ # Hook 配置
1373
- └── package.json # v3.0.0
1531
+ └── package.json # v3.0.1
1374
1532
  ```
1375
1533
 
1376
1534
  ***
@@ -1421,6 +1579,8 @@ CLI 参数 > 环境变量 > .pddrc.local > .pddrc > defaults
1421
1579
  | <br /> | vm.autoOpen | true | 自动打开浏览器 |
1422
1580
  | <br /> | vm.maxSSEConnections | 100 | 最大SSE连接数 |
1423
1581
  | <br /> | vm.tuiRefreshInterval | 5 | TUI 刷新间隔(秒) |
1582
+ | **★ 脚手架** | scaffold.defaultTemplate | python-fullstack | 默认模板名称 |
1583
+ | <br /> | scaffold.outputDir | ./output | 输出目录 |
1424
1584
 
1425
1585
  ***
1426
1586
 
@@ -1453,6 +1613,7 @@ CLI 参数 > 环境变量 > .pddrc.local > .pddrc > defaults
1453
1613
 
1454
1614
  | 版本 | 日期 | 重要变更 |
1455
1615
  | ---------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
1616
+ | **v3.0.2** | 2026-04-12 | **脚手架系统发布**: python-fullstack 全栈模板(FastAPI+Vue3), 数据权限引擎, OAuth2六平台认证, 工作流状态机引擎, 响应式前端, 4份架构设计文档, Docker一键部署, CI流水线 |
1456
1617
  | **v3.0.1** | 2026-04-07 | **PDD Visual Manager 发布**: Web Dashboard + Terminal TUI 双形态可视化监控, 11个REST API端点, SSE实时推送, Canvas图表引擎, ANSI TUI组件库 (59/59 任务 100%, 4/4 里程碑 100%) |
1457
1618
  | **v3.0.0** | 2026-04-05 | **正式发布版**: 6大Phase全部完成 + 插件系统 + OpenClaw + gRPC + Python SDK + 暂缓清零 (94/94 任务 100%) |
1458
1619
  | v2.x | 2026-03 | 内部迭代版本: MCP/SDK/缓存/Token/质量/迭代 |
package/bin/pdd.js CHANGED
@@ -252,7 +252,9 @@ program
252
252
  .option('-r, --refresh <sec>', '自动刷新间隔(秒)', '30')
253
253
  .action(async (options) => {
254
254
  const { DashboardServer } = await import('../lib/vm/dashboard/server.js');
255
- const server = new DashboardServer();
255
+ const { PDDDataProvider } = await import('../lib/vm/data-provider.js');
256
+ const dataProvider = new PDDDataProvider(process.cwd());
257
+ const server = new DashboardServer(dataProvider);
256
258
  await server.start(parseInt(options.port, 10), {
257
259
  open: !options.noBrowser && !options.noOpen,
258
260
  refreshInterval: parseInt(options.refresh, 10) * 1000
@@ -122,7 +122,15 @@ async function getProject(req, dataProvider) {
122
122
  }
123
123
  };
124
124
  } catch (err) {
125
- throw new Error(`获取项目信息失败: ${err.message}`);
125
+ return {
126
+ success: true,
127
+ data: {
128
+ summary: {},
129
+ schemaVersion: '1.0.0',
130
+ timestamp: new Date().toISOString(),
131
+ notice: '项目尚未初始化'
132
+ }
133
+ };
126
134
  }
127
135
  }
128
136
 
@@ -152,7 +160,15 @@ async function getFeatures(req, dataProvider) {
152
160
  }
153
161
  };
154
162
  } catch (err) {
155
- throw new Error(`获取功能点列表失败: ${err.message}`);
163
+ return {
164
+ success: true,
165
+ data: {
166
+ features: [],
167
+ total: 0,
168
+ timestamp: new Date().toISOString(),
169
+ notice: '项目尚未初始化'
170
+ }
171
+ };
156
172
  }
157
173
  }
158
174
 
@@ -213,7 +229,14 @@ async function getSummary(req, dataProvider) {
213
229
  }
214
230
  };
215
231
  } catch (err) {
216
- throw new Error(`获取项目摘要失败: ${err.message}`);
232
+ return {
233
+ success: true,
234
+ data: {
235
+ summary: { totalFeatures: 0, doneCount: 0, avgScore: 0, tokensUsed: 0, tokensTotal: 0 },
236
+ timestamp: new Date().toISOString(),
237
+ notice: '项目尚未初始化'
238
+ }
239
+ };
217
240
  }
218
241
  }
219
242
 
@@ -234,7 +257,14 @@ async function getQualityMatrix(req, dataProvider) {
234
257
  }
235
258
  };
236
259
  } catch (err) {
237
- throw new Error(`获取质量矩阵失败: ${err.message}`);
260
+ return {
261
+ success: true,
262
+ data: {
263
+ matrix: {},
264
+ timestamp: new Date().toISOString(),
265
+ notice: '项目尚未初始化'
266
+ }
267
+ };
238
268
  }
239
269
  }
240
270
 
@@ -288,12 +318,11 @@ async function getCacheStats(req, dataProvider) {
288
318
  */
289
319
  async function getIterationList(req, dataProvider) {
290
320
  try {
291
- // 如果 dataProvider 支持迭代查询
292
321
  let iterations = [];
293
322
 
294
323
  if (typeof dataProvider.getIterations === 'function') {
295
324
  iterations = dataProvider.getIterations() || [];
296
- } else if (dataProvider.summary && provider.summary.iterations) {
325
+ } else if (dataProvider.summary && dataProvider.summary.iterations) {
297
326
  iterations = dataProvider.summary.iterations || [];
298
327
  }
299
328
 
@@ -306,7 +335,14 @@ async function getIterationList(req, dataProvider) {
306
335
  }
307
336
  };
308
337
  } catch (err) {
309
- throw new Error(`获取迭代列表失败: ${err.message}`);
338
+ return {
339
+ success: true,
340
+ data: {
341
+ iterations: [],
342
+ total: 0,
343
+ timestamp: new Date().toISOString()
344
+ }
345
+ };
310
346
  }
311
347
  }
312
348
 
@@ -335,7 +371,19 @@ async function getSystemHealth(req, dataProvider) {
335
371
  }
336
372
  };
337
373
  } catch (err) {
338
- throw new Error(`获取系统健康状态失败: ${err.message}`);
374
+ return {
375
+ success: true,
376
+ data: {
377
+ health: {
378
+ status: 'ok',
379
+ uptime: process.uptime(),
380
+ memory: process.memoryUsage(),
381
+ platform: process.platform,
382
+ nodeVersion: process.version
383
+ },
384
+ timestamp: new Date().toISOString()
385
+ }
386
+ };
339
387
  }
340
388
  }
341
389
 
@@ -496,6 +544,15 @@ function _generateMarkdownExport(dataProvider) {
496
544
  return md;
497
545
  }
498
546
 
547
+ function _escapeCSVField(str) {
548
+ if (!str) return '""';
549
+ if (str.includes(',') || str.includes('"') || str.includes('\n')) {
550
+ const escaped = str.replace(/"/g, '""');
551
+ return `"${escaped}"`;
552
+ }
553
+ return str;
554
+ }
555
+
499
556
  /**
500
557
  * 生成 CSV 格式导出数据
501
558
  * @param {Object} dataProvider
@@ -511,7 +568,7 @@ function _generateCSVExport(dataProvider) {
511
568
  for (const f of features) {
512
569
  csv += [
513
570
  f.id,
514
- `"${(f.name || '').replace(/"/g, '""')}"`,
571
+ _escapeCSVField(f.name),
515
572
  f.stage || '',
516
573
  f.status || '',
517
574
  f.priority || '',
@@ -277,7 +277,7 @@ class DashboardServer {
277
277
  res.writeHead(200, {
278
278
  'Content-Type': type,
279
279
  'Content-Length': data.length,
280
- 'Cache-Control': 'public, max-age=3600'
280
+ 'Cache-Control': 'no-store, no-cache, must-revalidate'
281
281
  });
282
282
  res.end(data);
283
283
  });
@@ -87,16 +87,16 @@
87
87
  ============================================================ -->
88
88
 
89
89
  <!-- 核心应用控制器 -->
90
- <script src="/js/app.js"></script>
90
+ <script src="/js/app.js?v=3.0.2"></script>
91
91
 
92
92
  <!-- 图表绘制工具 -->
93
- <script src="/js/charts.js"></script>
93
+ <script src="/js/charts.js?v=3.0.2"></script>
94
94
 
95
95
  <!-- 各视图模块 -->
96
- <script src="/js/pipeline-view.js"></script>
97
- <script src="/js/kanban-view.js"></script>
98
- <script src="/js/quality-view.js"></script>
99
- <script src="/js/system-view.js"></script>
96
+ <script src="/js/pipeline-view.js?v=3.0.2"></script>
97
+ <script src="/js/kanban-view.js?v=3.0.2"></script>
98
+ <script src="/js/quality-view.js?v=3.0.2"></script>
99
+ <script src="/js/system-view.js?v=3.0.2"></script>
100
100
 
101
101
  <!-- 无 JavaScript 时的降级提示 -->
102
102
  <noscript>
@@ -563,7 +563,12 @@ const App = {
563
563
  const viewInstance = this.state.viewInstances[tab];
564
564
 
565
565
  if (viewInstance?.render) {
566
- viewInstance.render(this.getSharedData());
566
+ const sharedData = this.getSharedData();
567
+ if (tab === 'pipeline' || tab === 'kanban') {
568
+ viewInstance.render(sharedData.features, sharedData.summary);
569
+ } else {
570
+ viewInstance.render(sharedData);
571
+ }
567
572
  }
568
573
  },
569
574
 
@@ -637,7 +642,7 @@ const App = {
637
642
 
638
643
  try {
639
644
  const res = await fetch('/api/refresh', { method: 'POST' });
640
- const data = await res.json());
645
+ const data = await res.json();
641
646
 
642
647
  if (data.success) {
643
648
  // 刷新本地数据
@@ -690,7 +690,7 @@ const Charts = {
690
690
  // 数据点
691
691
  if (showPoints) {
692
692
  for (let i = 0; i < animatedLength; i++) {
693
- const x =getX(i);
693
+ const x = getX(i);
694
694
  const y = getY(dataset.values[i]);
695
695
 
696
696
  ctx.beginPath();
@@ -900,7 +900,7 @@ class PDDDataProvider {
900
900
  md += '## Token 使用统计\n\n';
901
901
  md += `- **总配额**: ${tokenStats.total.toLocaleString()}\n`;
902
902
  md += `- **已使用**: ${tokenStats.used.toLocaleString()} (${tokenStats.percent}%)\n`;
903
- md += `- **剩余**: ${tokenStats.remaining.toLocaleString()}\n\n';
903
+ md += `- **剩余**: ${tokenStats.remaining.toLocaleString()}\n\n`;
904
904
 
905
905
  return md;
906
906
  }
@@ -929,7 +929,8 @@ class PDDDataProvider {
929
929
  const str = String(value);
930
930
  // 如果包含逗号、引号或换行,需要用引号包裹并转义内部引号
931
931
  if (str.includes(',') || str.includes('"') || str.includes('\n')) {
932
- return `"${str.replace(/"/g, '""')}"`;
932
+ const escaped = str.replace(/"/g, '""');
933
+ return `"${escaped}"`;
933
934
  }
934
935
  return str;
935
936
  };
@@ -26,7 +26,7 @@ export const VMEvents = Object.freeze({
26
26
  QUALITY_UPDATED: 'quality_updated',
27
27
  /** Token 使用阈值告警 */
28
28
  TOKEN_THRESHOLD: 'token_threshold',
29
- ** 缓存命中统计 */
29
+ /** 缓存命中统计 */
30
30
  CACHE_HIT: 'cache_hit',
31
31
  /** 迭代轮次完成 */
32
32
  ITERATION_ROUND_COMPLETE: 'iteration_round_complete',
package/package.json CHANGED
@@ -1 +1,2 @@
1
- {"name": "pdd-skills", "version": "3.0.1", "description": "PRD Driven Development Skills - AI原生软件开发工作流", "type": "module", "main": "index.js", "bin": {"pdd": "./bin/pdd.js", "pdd-skills": "./bin/pdd.js"}, "files": ["bin/", "lib/", "skills/", "templates/", "scripts/", "config/", "hooks/", "index.js"], "scripts": {"start": "node bin/pdd.js", "list": "node bin/pdd.js list", "lint": "node bin/pdd.js linter --type code prd sql activiti", "generate": "node bin/pdd.js generate", "verify": "node bin/pdd.js verify", "report": "node bin/pdd.js report", "config": "node bin/pdd.js config --list", "api": "node bin/pdd.js api", "api:dev": "node bin/pdd.js api -p 3000 --cors", "init": "node bin/pdd.js init", "update": "node bin/pdd.js update", "cso": "node bin/pdd.js cso", "eval": "node bin/pdd.js eval", "token": "node bin/pdd.js token", "i18n": "node bin/pdd.js i18n"}, "keywords": ["pdd", "prd-driven-development", "ai", "claude", "skills", "tdd", "code-generation", "linter", "api-server", "cli"], "author": "PDD Team", "license": "MIT", "engines": {"node": ">=18.0.0"}, "dependencies": {"commander": "^12.0.0", "chalk": "^5.3.0", "fs-extra": "^11.2.0", "yaml": "^2.3.0"}}
1
+ {"name": "pdd-skills",
2
+ "version": "3.0.3", "description": "PRD Driven Development Skills - AI原生软件开发工作流", "type": "module", "main": "index.js", "bin": {"pdd": "./bin/pdd.js", "pdd-skills": "./bin/pdd.js"}, "files": ["bin/", "lib/", "skills/", "templates/", "scaffolds/", "scripts/", "config/", "hooks/", "index.js"], "scripts": {"start": "node bin/pdd.js", "list": "node bin/pdd.js list", "lint": "node bin/pdd.js linter --type code prd sql activiti", "generate": "node bin/pdd.js generate", "verify": "node bin/pdd.js verify", "report": "node bin/pdd.js report", "config": "node bin/pdd.js config --list", "api": "node bin/pdd.js api", "api:dev": "node bin/pdd.js api -p 3000 --cors", "init": "node bin/pdd.js init", "update": "node bin/pdd.js update", "cso": "node bin/pdd.js cso", "eval": "node bin/pdd.js eval", "token": "node bin/pdd.js token", "i18n": "node bin/pdd.js i18n"}, "keywords": ["pdd", "prd-driven-development", "ai", "claude", "skills", "tdd", "code-generation", "linter", "api-server", "cli"], "author": "PDD Team", "license": "MIT", "engines": {"node": ">=18.0.0"}, "dependencies": {"commander": "^12.0.0", "chalk": "^5.3.0", "fs-extra": "^11.2.0", "yaml": "^2.3.0"}}
@@ -0,0 +1,26 @@
1
+ # PDD Scaffold Templates Registry
2
+
3
+ 本目录存放所有 PDD 驱动的脚手架模板。
4
+
5
+ ## 可用模板
6
+
7
+ | 模板 | 路径 | 技术栈 | 说明 |
8
+ |------|------|--------|------|
9
+ | python-fullstack | ./python-fullstack/ | FastAPI + Vue3 + MySQL | 全栈脚手架(含数据权限/OAuth/工作流) |
10
+
11
+ ## 使用方式
12
+
13
+ ```bash
14
+ # 通过 PDD CLI 初始化项目并选择模板
15
+ pdd init my-project --template python-fullstack
16
+
17
+ # 或在 .pdd/config.yaml 中指定默认模板
18
+ template: scaffolds/python-fullstack
19
+ ```
20
+
21
+ ## 添加新模板
22
+
23
+ 1. 在此目录下创建新文件夹:`scaffolds/<template-name>/`
24
+ 2. 添加 `template_config.yaml` 元数据文件
25
+ 3. 添加代码模板文件
26
+ 4. 更新此 README
@@ -0,0 +1,43 @@
1
+ name: CI Pipeline
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test-backend:
11
+ runs-on: ubuntu-latest
12
+ services:
13
+ mysql:
14
+ image: mysql:8.0
15
+ env:
16
+ MYSQL_ROOT_PASSWORD: test_root
17
+ MYSQL_DATABASE: pdd_test
18
+ MYSQL_USER: test_user
19
+ MYSQL_PASSWORD: test_pass
20
+ ports: ['3306:3306']
21
+ options: >-
22
+ --health-cmd='mysqladmin ping'
23
+ --health-interval=10s
24
+ --health-timeout=5s
25
+ --health-retries=5
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: actions/setup-python@v5
29
+ with:
30
+ python-version: '3.11'
31
+ - run: pip install -r backend/requirements-dev.txt
32
+ - run: cd backend && pytest tests/ -v --cov=app
33
+
34
+ test-frontend:
35
+ runs-on: ubuntu-latest
36
+ steps:
37
+ - uses: actions/checkout@v4
38
+ - uses: actions/setup-node@v4
39
+ with:
40
+ node-version: '20'
41
+ cache: 'npm'
42
+ cache-dependency-path: frontend/package-lock.json
43
+ - run: cd frontend && npm ci && npm run lint
@@ -0,0 +1,12 @@
1
+ FROM python:3.11-slim
2
+
3
+ WORKDIR /app
4
+
5
+ COPY backend/requirements.txt .
6
+ RUN pip install --no-cache-dir -r requirements.txt
7
+
8
+ COPY backend/ .
9
+
10
+ EXPOSE 8000
11
+
12
+ CMD ["uvicorn", "app.main:create_app", "--host", "0.0.0.0", "--port", "8000"]