pdd-skills 3.0.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.
Files changed (261) hide show
  1. package/README.md +1478 -0
  2. package/bin/pdd.js +354 -0
  3. package/config/bpmn-rules.yaml +166 -0
  4. package/config/checkstyle.xml +105 -0
  5. package/config/eslint.config.js +48 -0
  6. package/config/pmd.xml +91 -0
  7. package/config/prd-rules.yaml +113 -0
  8. package/config/ruff.toml +45 -0
  9. package/config/sqlfluff.cfg +82 -0
  10. package/hooks/hook-executor.js +332 -0
  11. package/index.js +43 -0
  12. package/lib/api-routes.js +750 -0
  13. package/lib/api-server.js +408 -0
  14. package/lib/cache/cache-config.js +209 -0
  15. package/lib/cache/system-cache.js +852 -0
  16. package/lib/config-manager.js +373 -0
  17. package/lib/generate.js +528 -0
  18. package/lib/grpc/grpc-routes.js +1134 -0
  19. package/lib/grpc/grpc-server.js +912 -0
  20. package/lib/grpc/proto-definitions.js +1033 -0
  21. package/lib/init.js +172 -0
  22. package/lib/iteration/auto-fixer.js +1025 -0
  23. package/lib/iteration/auto-reviewer.js +923 -0
  24. package/lib/iteration/controller.js +577 -0
  25. package/lib/list.js +130 -0
  26. package/lib/mcp-server.js +548 -0
  27. package/lib/openclaw/api-integration.js +535 -0
  28. package/lib/openclaw/cli-integration.js +567 -0
  29. package/lib/openclaw/data-sync.js +845 -0
  30. package/lib/openclaw/openclaw-adapter.js +783 -0
  31. package/lib/plugin/example-plugins/code-stats/index.js +332 -0
  32. package/lib/plugin/example-plugins/code-stats/plugin.json +1 -0
  33. package/lib/plugin/example-plugins/custom-linter/index.js +472 -0
  34. package/lib/plugin/example-plugins/custom-linter/plugin.json +1 -0
  35. package/lib/plugin/example-plugins/hello-world/index.js +86 -0
  36. package/lib/plugin/example-plugins/hello-world/plugin.json +1 -0
  37. package/lib/plugin/plugin-manager.js +655 -0
  38. package/lib/plugin/plugin-sdk.js +565 -0
  39. package/lib/plugin/sandbox.js +627 -0
  40. package/lib/quality/rules/maintainability.js +418 -0
  41. package/lib/quality/rules/performance.js +498 -0
  42. package/lib/quality/rules/readability.js +441 -0
  43. package/lib/quality/rules/robustness.js +504 -0
  44. package/lib/quality/rules/security.js +444 -0
  45. package/lib/quality/scorer.js +576 -0
  46. package/lib/report.js +669 -0
  47. package/lib/sdk-base.js +301 -0
  48. package/lib/sdk-js.js +446 -0
  49. package/lib/sdk-python/README.md +546 -0
  50. package/lib/sdk-python/examples/basic_usage.py +450 -0
  51. package/lib/sdk-python/pdd_sdk/__init__.py +180 -0
  52. package/lib/sdk-python/pdd_sdk/client.py +1170 -0
  53. package/lib/sdk-python/pdd_sdk/events.py +423 -0
  54. package/lib/sdk-python/pdd_sdk/exceptions.py +158 -0
  55. package/lib/sdk-python/pdd_sdk/models.py +518 -0
  56. package/lib/sdk-python/pdd_sdk/utils.py +759 -0
  57. package/lib/token/budget-alert.js +367 -0
  58. package/lib/token/budget-manager.js +485 -0
  59. package/lib/update.js +54 -0
  60. package/lib/utils/logger.js +88 -0
  61. package/lib/verify.js +741 -0
  62. package/lib/version.js +52 -0
  63. package/lib/vm/README.md +102 -0
  64. package/lib/vm/dashboard/api-routes.js +669 -0
  65. package/lib/vm/dashboard/server.js +391 -0
  66. package/lib/vm/dashboard/sse.js +358 -0
  67. package/lib/vm/dashboard/static/css/dashboard.css +1378 -0
  68. package/lib/vm/dashboard/static/index.html +118 -0
  69. package/lib/vm/dashboard/static/js/app.js +949 -0
  70. package/lib/vm/dashboard/static/js/charts.js +913 -0
  71. package/lib/vm/dashboard/static/js/kanban-view.js +1053 -0
  72. package/lib/vm/dashboard/static/js/pipeline-view.js +463 -0
  73. package/lib/vm/dashboard/static/js/quality-view.js +598 -0
  74. package/lib/vm/dashboard/static/js/system-view.js +1021 -0
  75. package/lib/vm/data-provider.js +1191 -0
  76. package/lib/vm/event-bus.js +402 -0
  77. package/lib/vm/hooks/extract-hook.js +307 -0
  78. package/lib/vm/hooks/generate-hook.js +374 -0
  79. package/lib/vm/hooks/hook-interface.js +458 -0
  80. package/lib/vm/hooks/report-hook.js +331 -0
  81. package/lib/vm/hooks/verify-hook.js +454 -0
  82. package/lib/vm/models.js +1003 -0
  83. package/lib/vm/reconciler.js +855 -0
  84. package/lib/vm/scanner.js +988 -0
  85. package/lib/vm/state-schema.js +955 -0
  86. package/lib/vm/state-store.js +733 -0
  87. package/lib/vm/tui/components/card.js +339 -0
  88. package/lib/vm/tui/components/progress-bar.js +368 -0
  89. package/lib/vm/tui/components/sparkline.js +327 -0
  90. package/lib/vm/tui/components/status-light.js +294 -0
  91. package/lib/vm/tui/components/table.js +370 -0
  92. package/lib/vm/tui/input.js +335 -0
  93. package/lib/vm/tui/renderer.js +548 -0
  94. package/lib/vm/tui/screens/kanban-screen.js +397 -0
  95. package/lib/vm/tui/screens/overview-screen.js +357 -0
  96. package/lib/vm/tui/screens/quality-screen.js +336 -0
  97. package/lib/vm/tui/screens/system-screen.js +379 -0
  98. package/lib/vm/tui/tui.js +805 -0
  99. package/package.json +1 -0
  100. package/scripts/cso-analyzer.js +198 -0
  101. package/scripts/eval-runner.js +359 -0
  102. package/scripts/i18n-checker.js +109 -0
  103. package/scripts/linter/activiti-linter.js +272 -0
  104. package/scripts/linter/prd-linter.js +162 -0
  105. package/scripts/linter/report-generator.js +207 -0
  106. package/scripts/linter/run-linters.js +285 -0
  107. package/scripts/linter/sql-linter.js +166 -0
  108. package/scripts/token-analyzer.js +162 -0
  109. package/scripts/vm-test.js +180 -0
  110. package/skills/core/official-doc-writer/LICENSE +21 -0
  111. package/skills/core/official-doc-writer/README.md +232 -0
  112. package/skills/core/official-doc-writer/SKILL.md +475 -0
  113. package/skills/core/official-doc-writer/_meta.json +1 -0
  114. package/skills/core/official-doc-writer/document_generator.py +580 -0
  115. package/skills/core/official-doc-writer/evals/default-evals.json +1 -0
  116. package/skills/core/official-doc-writer/examples.md +150 -0
  117. package/skills/core/official-doc-writer/fonts/FONTS_LIST.md +45 -0
  118. package/skills/core/official-doc-writer/fonts/README.md +141 -0
  119. package/skills/core/official-doc-writer/fonts/SIMFANG.TTF +0 -0
  120. package/skills/core/official-doc-writer/fonts/SIMHEI.TTF +0 -0
  121. package/skills/core/official-doc-writer/fonts/SIMKAI.TTF +0 -0
  122. package/skills/core/official-doc-writer/fonts/SIMSUN.TTC +0 -0
  123. package/skills/core/official-doc-writer/fonts//346/226/271/346/255/243/345/260/217/346/240/207/345/256/213GBK.TTF +0 -0
  124. package/skills/core/official-doc-writer/references/GBT_9704-2012_/345/205/232/346/224/277/346/234/272/345/205/263/345/205/254/346/226/207/346/240/274/345/274/217.md +422 -0
  125. package/skills/core/official-doc-writer/scripts/__pycache__/generate_official_doc.cpython-313.pyc +0 -0
  126. package/skills/core/official-doc-writer/scripts/dialog_manager.py +564 -0
  127. package/skills/core/official-doc-writer/scripts/generate_official_doc.py +252 -0
  128. package/skills/core/official-doc-writer/scripts/install_fonts.py +390 -0
  129. package/skills/core/official-doc-writer/scripts/smart_prompts.py +363 -0
  130. package/skills/core/pdd-ba/SKILL.md +305 -0
  131. package/skills/core/pdd-ba/_meta.json +1 -0
  132. package/skills/core/pdd-ba/evals/default-evals.json +1 -0
  133. package/skills/core/pdd-code-reviewer/SKILL.md +378 -0
  134. package/skills/core/pdd-code-reviewer/_meta.json +1 -0
  135. package/skills/core/pdd-code-reviewer/evals/default-evals.json +1 -0
  136. package/skills/core/pdd-doc-change/SKILL.md +350 -0
  137. package/skills/core/pdd-doc-change/_meta.json +1 -0
  138. package/skills/core/pdd-doc-change/evals/default-evals.json +1 -0
  139. package/skills/core/pdd-doc-gardener/SKILL.md +248 -0
  140. package/skills/core/pdd-doc-gardener/_meta.json +1 -0
  141. package/skills/core/pdd-doc-gardener/evals/default-evals.json +1 -0
  142. package/skills/core/pdd-entropy-reduction/SKILL.md +360 -0
  143. package/skills/core/pdd-entropy-reduction/_meta.json +1 -0
  144. package/skills/core/pdd-entropy-reduction/evals/default-evals.json +1 -0
  145. package/skills/core/pdd-entropy-reduction/references/entropy-report-template.md +287 -0
  146. package/skills/core/pdd-entropy-reduction/references/golden-principles.md +573 -0
  147. package/skills/core/pdd-entropy-reduction/scripts/entropy_scan.py +712 -0
  148. package/skills/core/pdd-extract-features/SKILL.md +320 -0
  149. package/skills/core/pdd-extract-features/_meta.json +1 -0
  150. package/skills/core/pdd-extract-features/evals/default-evals.json +1 -0
  151. package/skills/core/pdd-generate-spec/SKILL.md +418 -0
  152. package/skills/core/pdd-generate-spec/_meta.json +1 -0
  153. package/skills/core/pdd-generate-spec/evals/default-evals.json +1 -0
  154. package/skills/core/pdd-implement-feature/SKILL.md +332 -0
  155. package/skills/core/pdd-implement-feature/_meta.json +1 -0
  156. package/skills/core/pdd-implement-feature/evals/default-evals.json +1 -0
  157. package/skills/core/pdd-main/SKILL.md +540 -0
  158. package/skills/core/pdd-main/_meta.json +1 -0
  159. package/skills/core/pdd-main/evals/default-evals.json +1 -0
  160. package/skills/core/pdd-main/evals/evals.json +215 -0
  161. package/skills/core/pdd-verify-feature/SKILL.md +474 -0
  162. package/skills/core/pdd-verify-feature/_meta.json +1 -0
  163. package/skills/core/pdd-verify-feature/evals/default-evals.json +1 -0
  164. package/skills/core/pdd-vm/evals/default-evals.json +1 -0
  165. package/skills/core/traffic-accident-assessor/LICENSE +29 -0
  166. package/skills/core/traffic-accident-assessor/SKILL.md +439 -0
  167. package/skills/core/traffic-accident-assessor/evals/evals.json +1 -0
  168. package/skills/core/traffic-accident-assessor/references/accident-types.md +369 -0
  169. package/skills/core/traffic-accident-assessor/references/liability-rules.md +287 -0
  170. package/skills/core/traffic-accident-assessor/references/traffic-laws.md +226 -0
  171. package/skills/core/traffic-accident-assessor/references//351/253/230/345/260/224/345/244/253/350/257/264/346/230/216/344/271/246.pdf +32576 -106
  172. package/skills/core/traffic-accident-assessor/scripts/generate_official_statement.py +588 -0
  173. package/skills/core/traffic-accident-assessor/scripts/generate_report.py +495 -0
  174. package/skills/core/traffic-accident-assessor/scripts/generate_statement.py +528 -0
  175. package/skills/core/traffic-accident-assessor.zip +0 -0
  176. package/skills/entropy/expert-arch-enforcer/SKILL.md +292 -0
  177. package/skills/entropy/expert-arch-enforcer/_meta.json +1 -0
  178. package/skills/entropy/expert-arch-enforcer/evals/default-evals.json +1 -0
  179. package/skills/entropy/expert-auto-refactor/SKILL.md +327 -0
  180. package/skills/entropy/expert-auto-refactor/_meta.json +1 -0
  181. package/skills/entropy/expert-auto-refactor/evals/default-evals.json +1 -0
  182. package/skills/entropy/expert-code-quality/SKILL.md +468 -0
  183. package/skills/entropy/expert-code-quality/_meta.json +1 -0
  184. package/skills/entropy/expert-code-quality/evals/default-evals.json +1 -0
  185. package/skills/entropy/expert-code-quality/evals/evals.json +109 -0
  186. package/skills/entropy/expert-code-quality/references/code-smells.md +605 -0
  187. package/skills/entropy/expert-code-quality/references/design-patterns.md +1111 -0
  188. package/skills/entropy/expert-code-quality/references/refactoring-catalog.md +1281 -0
  189. package/skills/entropy/expert-code-quality/references/solid-principles.md +524 -0
  190. package/skills/entropy/expert-entropy-auditor/SKILL.md +276 -0
  191. package/skills/entropy/expert-entropy-auditor/_meta.json +1 -0
  192. package/skills/entropy/expert-entropy-auditor/evals/default-evals.json +1 -0
  193. package/skills/expert/expert-activiti/SKILL.md +497 -0
  194. package/skills/expert/expert-activiti/_meta.json +1 -0
  195. package/skills/expert/expert-mysql/SKILL.md +832 -0
  196. package/skills/expert/expert-mysql/_meta.json +1 -0
  197. package/skills/expert/expert-performance/SKILL.md +379 -0
  198. package/skills/expert/expert-performance/_meta.json +1 -0
  199. package/skills/expert/expert-performance/evals/default-evals.json +1 -0
  200. package/skills/expert/expert-ruoyi/SKILL.md +472 -0
  201. package/skills/expert/expert-ruoyi/_meta.json +1 -0
  202. package/skills/expert/expert-security/SKILL.md +1341 -0
  203. package/skills/expert/expert-security/_meta.json +1 -0
  204. package/skills/expert/expert-security/evals/default-evals.json +1 -0
  205. package/skills/expert/software-architect/SKILL.md +350 -0
  206. package/skills/expert/software-architect/_meta.json +1 -0
  207. package/skills/expert/software-engineer/SKILL.md +437 -0
  208. package/skills/expert/software-engineer/_meta.json +1 -0
  209. package/skills/expert/software-engineer/architecture.md +130 -0
  210. package/skills/expert/software-engineer/patterns.md +151 -0
  211. package/skills/expert/software-engineer/testing.md +135 -0
  212. package/skills/expert/system-architect/SKILL.md +628 -0
  213. package/skills/expert/system-architect/_meta.json +1 -0
  214. package/skills/expert/system-architect/assets/templates/ARCHITECTURE.md +25 -0
  215. package/skills/expert/system-architect/assets/templates/README.md +44 -0
  216. package/skills/expert/system-architect/references/js-ts-standards.md +18 -0
  217. package/skills/expert/system-architect/references/python-standards.md +19 -0
  218. package/skills/expert/system-architect/references/scaffolding.md +61 -0
  219. package/skills/expert/system-architect/references/security-checklist.md +21 -0
  220. package/skills/openspec/openspec-apply-change/SKILL.md +156 -0
  221. package/skills/openspec/openspec-apply-change/_meta.json +1 -0
  222. package/skills/openspec/openspec-archive-change/SKILL.md +114 -0
  223. package/skills/openspec/openspec-archive-change/_meta.json +1 -0
  224. package/skills/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
  225. package/skills/openspec/openspec-bulk-archive-change/_meta.json +1 -0
  226. package/skills/openspec/openspec-continue-change/SKILL.md +118 -0
  227. package/skills/openspec/openspec-continue-change/_meta.json +1 -0
  228. package/skills/openspec/openspec-explore/SKILL.md +288 -0
  229. package/skills/openspec/openspec-explore/_meta.json +1 -0
  230. package/skills/openspec/openspec-ff-change/SKILL.md +101 -0
  231. package/skills/openspec/openspec-ff-change/_meta.json +1 -0
  232. package/skills/openspec/openspec-new-change/SKILL.md +74 -0
  233. package/skills/openspec/openspec-new-change/_meta.json +1 -0
  234. package/skills/openspec/openspec-onboard/SKILL.md +554 -0
  235. package/skills/openspec/openspec-onboard/_meta.json +1 -0
  236. package/skills/openspec/openspec-sync-specs/SKILL.md +138 -0
  237. package/skills/openspec/openspec-sync-specs/_meta.json +1 -0
  238. package/skills/openspec/openspec-verify-change/SKILL.md +168 -0
  239. package/skills/openspec/openspec-verify-change/_meta.json +1 -0
  240. package/skills/pr/pdd-multi-review/SKILL.md +534 -0
  241. package/skills/pr/pdd-multi-review/_meta.json +1 -0
  242. package/skills/pr/pdd-pr-batch/SKILL.md +303 -0
  243. package/skills/pr/pdd-pr-batch/_meta.json +1 -0
  244. package/skills/pr/pdd-pr-create/SKILL.md +344 -0
  245. package/skills/pr/pdd-pr-create/_meta.json +1 -0
  246. package/skills/pr/pdd-pr-merge/SKILL.md +286 -0
  247. package/skills/pr/pdd-pr-merge/_meta.json +1 -0
  248. package/skills/pr/pdd-pr-review/SKILL.md +217 -0
  249. package/skills/pr/pdd-pr-review/_meta.json +1 -0
  250. package/skills/pr/pdd-task-manager/SKILL.md +636 -0
  251. package/skills/pr/pdd-task-manager/_meta.json +1 -0
  252. package/skills/pr/pdd-template-engine/SKILL.md +306 -0
  253. package/skills/pr/pdd-template-engine/_meta.json +1 -0
  254. package/templates/behavior-shaping/iron-law-template.md +87 -0
  255. package/templates/behavior-shaping/rationalization-template.md +62 -0
  256. package/templates/behavior-shaping/red-flags-template.md +70 -0
  257. package/templates/bilingual-template.md +139 -0
  258. package/templates/config/default.yaml +47 -0
  259. package/templates/project/default/README.md +31 -0
  260. package/templates/project/frontend/README.md +46 -0
  261. package/templates/project/java/README.md +48 -0
@@ -0,0 +1,546 @@
1
+ # PDD Python SDK
2
+
3
+ [![Version](https://img.shields.io/badge/version-1.0.0-blue.svg)](https://github.com/pdd-skills/pdd-python-sdk)
4
+ [![Python](https://img.shields.io/badge/python-3.8%2B-green.svg)](https://www.python.org/)
5
+ [![License](https://img.shields.io/badge/license-MIT-orange.svg)](LICENSE)
6
+
7
+ **PRD 驱动开发 (PDD) 的 Python 工具包** - 纯标准库实现,零第三方依赖。
8
+
9
+ 提供与 PDD 服务端交互的完整能力:规格生成、代码生成、功能验证、代码审查等。
10
+
11
+ ## 特性
12
+
13
+ - **零依赖**: 仅使用 Python 标准库 (stdlib),无需 `pip install`
14
+ - **异步优先**: 基于 `asyncio` 的原生异步 API
15
+ - **类型安全**: 完整的 PEP 484 类型注解
16
+ - **事件驱动**: 内置事件系统,可监听请求生命周期
17
+ - **自动重试**: 可配置的指数退避重试机制
18
+ - **内存缓存**: 基于 TTL 的响应缓存
19
+ - **中文文档**: 完整的中文 docstring 和注释
20
+
21
+ ## 安装
22
+
23
+ ### 无需安装
24
+
25
+ 本 SDK 纯基于标准库,**无需安装任何依赖**。
26
+
27
+ 只需将 `sdk-python/` 目录添加到你的 Python 路径即可:
28
+
29
+ ```python
30
+ import sys
31
+ sys.path.append("./lib/sdk-python")
32
+
33
+ from pdd_sdk import PDDClient
34
+ ```
35
+
36
+ ### 或者直接使用
37
+
38
+ ```bash
39
+ # 将 SDK 目录复制到项目中
40
+ cp -r lib/sdk-python/pdd_sdk ./your_project/
41
+
42
+ # 在你的代码中导入
43
+ from pdd_sdk import PDDClient
44
+ ```
45
+
46
+ ## 快速开始
47
+
48
+ ### 5 分钟上手
49
+
50
+ ```python
51
+ import asyncio
52
+ from pdd_sdk import PDDClient, Events
53
+
54
+ async def main():
55
+ # 1. 创建客户端
56
+ client = PDDClient(
57
+ endpoint="http://localhost:3000", # PDD 服务端地址
58
+ debug=True # 开启调试日志
59
+ )
60
+
61
+ # 2. 监听事件(可选)
62
+ client.on(Events.REQUEST_END, lambda e: print(
63
+ f"完成: {e['method']} {e['path']} ({e['duration_ms']}ms)"
64
+ ))
65
+
66
+ # 3. 从 PRD 生成开发规格
67
+ spec = await client.generate_spec(
68
+ prd_path="./docs/requirements.prdx",
69
+ output_dir="./specs"
70
+ )
71
+ print(f"提取了 {spec.feature_count} 个功能点")
72
+
73
+ # 4. 根据规格生成代码
74
+ for feature in spec.features[:3]:
75
+ code = await client.generate_code(
76
+ spec_path=spec.spec_path,
77
+ feature_id=feature["id"],
78
+ output_dir="./src"
79
+ )
80
+ print(f" -> 生成了 {code.file_count} 个文件")
81
+
82
+ # 5. 验证功能实现
83
+ verify = await client.verify_feature(
84
+ spec_path=spec.spec_path,
85
+ source_dir="./src"
86
+ )
87
+ print(f"覆盖率: {verify.coverage_percent}%")
88
+
89
+ # 运行
90
+ asyncio.run(main())
91
+ ```
92
+
93
+ ### 使用上下文管理器(推荐)
94
+
95
+ ```python
96
+ async with PDDClient(endpoint="http://localhost:3000") as client:
97
+ result = await client.generate_spec(prd_path="./docs/prd.prdx")
98
+ # ... 使用客户端 ...
99
+ # 自动清理资源
100
+ ```
101
+
102
+ ## API 参考
103
+
104
+ ### 核心类: PDDClient
105
+
106
+ #### 构造函数
107
+
108
+ ```python
109
+ client = PDDClient(
110
+ endpoint="http://localhost:3000", # API 端点(必需)
111
+ api_key="", # API 密钥(可选)
112
+ timeout=30, # 超时时间(秒)
113
+ debug=False, # 调试模式
114
+ max_retries=3, # 最大重试次数
115
+ retry_delay=1.0, # 重试初始延迟(秒)
116
+ enable_cache=True, # 启用缓存
117
+ cache_ttl=300 # 缓存有效期(秒)
118
+ )
119
+ ```
120
+
121
+ #### 核心 API 方法
122
+
123
+ | 方法 | 说明 | 返回类型 |
124
+ |------|------|----------|
125
+ | `generate_spec()` | 从 PRD 生成开发规格 | `SpecResult` |
126
+ | `generate_code()` | 根据规格生成代码 | `CodeResult` |
127
+ | `verify_feature()` | 验证功能实现 | `VerifyResult` |
128
+ | `code_review()` | 执行代码审查 | `ReviewResult` |
129
+ | `list_skills()` | 获取可用技能列表 | `List[SkillInfo]` |
130
+ | `get_status()` | 获取服务状态 | `StatusResult` |
131
+
132
+ #### 批量操作方法
133
+
134
+ | 方法 | 说明 | 返回类型 |
135
+ |------|------|----------|
136
+ | `batch_generate_specs()` | 批量生成规格 | `List[SpecResult]` |
137
+ | `batch_verify()` | 批量验证功能 | `List[VerifyResult]` |
138
+
139
+ #### 会话管理方法
140
+
141
+ | 方法 | 说明 | 返回类型 |
142
+ |------|------|----------|
143
+ | `create_session()` | 创建开发会话 | `Session` |
144
+ | `get_session()` | 获取会话详情 | `Session` |
145
+ | `list_sessions()` | 列出所有会话 | `List[Session]` |
146
+
147
+ #### 工具方法
148
+
149
+ | 方法 | 说明 | 返回类型 |
150
+ |------|------|----------|
151
+ | `health_check()` | 同步健康检查 | `bool` |
152
+ | `get_server_info()` | 获取服务器信息 | `ServerInfo` 或 `None` |
153
+ | `close()` | 关闭客户端释放资源 | `None` |
154
+
155
+ ### 详细 API 文档
156
+
157
+ #### generate_spec()
158
+
159
+ 从 PRD 文档生成开发规格。
160
+
161
+ ```python
162
+ result = await client.generate_spec(
163
+ prd_path="./docs/requirements.prdx", # PRD 文件路径
164
+ template="standard", # 可选模板
165
+ output_dir="./specs", # 输出目录
166
+ dry_run=False # 是否仅预览
167
+ )
168
+
169
+ # 结果属性
170
+ result.success # 是否成功 (bool)
171
+ result.spec_id # 规格 ID (str)
172
+ result.spec_path # 规格文件路径 (str)
173
+ result.features # 功能点列表 (List[Dict])
174
+ result.warnings # 警告列表 (List[str])
175
+ result.errors # 错误列表 (List[str])
176
+ result.duration_ms # 执行耗时 (int)
177
+ result.feature_count # 功能点数量 (property)
178
+ ```
179
+
180
+ #### generate_code()
181
+
182
+ 根据开发规格生成代码。
183
+
184
+ ```python
185
+ result = await client.generate_code(
186
+ spec_path="./specs/user.spec.json", # 规格文件路径
187
+ feature_id="F001", # 功能点 ID(可选)
188
+ output_dir="./src", # 输出目录
189
+ dry_run=False # 是否仅预览
190
+ )
191
+
192
+ # 结果属性
193
+ result.success # 是否成功
194
+ result.feature_id # 功能点 ID
195
+ result.files_generated # 生成的文件列表 (List[GeneratedFile])
196
+ result.lines_of_code # 总代码行数
197
+ result.file_count # 文件数量 (property)
198
+ result.file_paths # 文件路径列表 (property)
199
+ ```
200
+
201
+ #### verify_feature()
202
+
203
+ 验证功能实现是否符合验收标准。
204
+
205
+ ```python
206
+ result = await client.verify_feature(
207
+ spec_path="./specs/user.spec.json", # 规格文件路径
208
+ source_dir="./src", # 源代码目录
209
+ format="json" # 输出格式: json/table/markdown
210
+ )
211
+
212
+ # 结果属性
213
+ result.success # 是否通过验证
214
+ result.coverage_percent # 覆盖率百分比 (float)
215
+ result.criteria_passed # 通过的标准列表
216
+ result.criteria_failed # 未通过的标准列表
217
+ result.issues # 问题列表 (List[VerifyIssue])
218
+ result.total_criteria # 总标准数 (property)
219
+ result.issue_count # 问题总数 (property)
220
+ result.error_count # 严重问题数 (property)
221
+ ```
222
+
223
+ #### code_review()
224
+
225
+ 执行静态代码审查。
226
+
227
+ ```python
228
+ result = await client.code_review(
229
+ source_dir="./src", # 源代码目录
230
+ rules=["complexity", "security"], # 应用规则集(可选)
231
+ format="table" # 输出格式
232
+ )
233
+
234
+ # 结果属性
235
+ result.score # 综合评分 (0-100)
236
+ result.grade # 等级 (A/B/C/D/F)
237
+ result.findings # 发现的问题列表 (List[ReviewFinding])
238
+ result.finding_count # 问题总数
239
+ result.critical_count # 严重问题数
240
+ ```
241
+
242
+ ### 事件系统
243
+
244
+ SDK 内置事件发射器,可监听请求生命周期:
245
+
246
+ ```python
247
+ from pdd_sdk import Events
248
+
249
+ # 注册监听器
250
+ client.on(Events.REQUEST_START, lambda e: print("请求开始..."))
251
+ client.on(Events.REQUEST_END, lambda e: print(f"完成 ({e['duration_ms']}ms)"))
252
+ client.on(Events.REQUEST_ERROR, lambda e: print(f"错误: {e['error']}"))
253
+ client.on(Events.RETRY, lambda e: print(f"正在重试第 {e['attempt']} 次"))
254
+
255
+ # 一次性监听
256
+ client.once(Events.SESSION_CREATED, lambda e: print("新会话已创建!"))
257
+
258
+ # 移除监听器
259
+ client.off(Events.REQUEST_END, my_handler) # 移除特定处理器
260
+ client.off(Events.REQUEST_END) # 移除所有处理器
261
+ ```
262
+
263
+ #### 预定义事件常量
264
+
265
+ | 常量 | 说明 | 数据 |
266
+ |------|------|------|
267
+ | `Events.REQUEST_START` | 请求开始 | method, path, payload |
268
+ | `Events.REQUEST_END` | 请求成功 | method, path, duration_ms, success |
269
+ | `Events.REQUEST_ERROR` | 请求错误 | method, path, error, duration_ms |
270
+ | `Events.RETRY` | 正在重试 | attempt, error |
271
+ | `Events.CACHE_HIT` | 缓存命中 | key |
272
+ | `Events.CACHE_MISS` | 缓存未命中 | key |
273
+ | `Events.BATCH_START` | 批量操作开始 | total, type |
274
+ | `Events.BATCH_PROGRESS` | 批量进度更新 | current, total |
275
+ | `Events.BATCH_COMPLETE` | 批量操作完成 | total, duration_ms |
276
+ | `Events.SESSION_CREATED` | 会话创建 | session_id, name |
277
+
278
+ ### 异常处理
279
+
280
+ SDK 提供层次化的异常体系:
281
+
282
+ ```python
283
+ from pdd_sdk import (
284
+ PDDError,
285
+ PDDConnectionError,
286
+ AuthError,
287
+ ValidationError,
288
+ ServerError,
289
+ PDDTimeoutError,
290
+ RateLimitError
291
+ )
292
+
293
+ try:
294
+ result = await client.generate_spec(prd_path="./invalid.prdx")
295
+ except ValidationError as e:
296
+ print(f"参数错误: {e}")
297
+ print(f"详情: {e.details}")
298
+ except AuthError as e:
299
+ print(f"认证失败: {e.code}")
300
+ except PDDConnectionError as e:
301
+ print(f"连接失败: {e.message}")
302
+ except ServerError as e:
303
+ print(f"服务端错误: {e.to_dict()}")
304
+ except PDDTimeoutError as e:
305
+ print(f"请求超时")
306
+ except RateLimitError as e:
307
+ print(f"限流: 请稍后重试")
308
+ except PDDError as e:
309
+ print(f"PDD 错误: {e}")
310
+ ```
311
+
312
+ ### 异常类层次
313
+
314
+ ```
315
+ PDDError (基类)
316
+ ├── ConnectionError - 连接失败
317
+ ├── AuthError - 认证失败 (401)
318
+ ├── ValidationError - 参数验证失败 (400)
319
+ ├── ServerError - 服务端错误 (5xx)
320
+ ├── TimeoutError - 超时
321
+ └── RateLimitError - 限流 (429)
322
+ ```
323
+
324
+ ## 配置选项表
325
+
326
+ | 参数 | 类型 | 默认值 | 说明 |
327
+ |------|------|--------|------|
328
+ | `endpoint` | str | `"http://localhost:3000"` | PDD 服务端 URL |
329
+ | `api_key` | str | `""` | API 认证密钥 |
330
+ | `timeout` | int | `30` | HTTP 超时时间(秒) |
331
+ | `debug` | bool | `False` | 是否输出详细日志 |
332
+ | `max_retries` | int | `3` | 失败时最大重试次数 |
333
+ | `retry_delay` | float | `1.0` | 重试初始延迟(秒) |
334
+ | `enable_cache` | bool | `True` | 是否启用内存缓存 |
335
+ | `cache_ttl` | int | `300` | 缓存有效期(秒) |
336
+
337
+ ## 与 JS SDK 对比
338
+
339
+ | 特性 | Python SDK | JS SDK |
340
+ |------|------------|--------|
341
+ | 语言 | Python 3.8+ | Node.js 14+ |
342
+ | 依赖 | 零依赖 | 零依赖 |
343
+ | 编程范式 | async/await | Promise/then |
344
+ | 类型注解 | PEP 484 (dataclass) | JSDoc / TypeScript |
345
+ | 事件系统 | EventEmitter 类 | on/off/emit 方法 |
346
+ | 重试机制 | @retry 装饰器 | 内置配置 |
347
+ | 缓存 | MemoryCache + @cache | cacheTTL 配置 |
348
+ | 批量操作 | batch_* 方法 | batchGenerate 等 |
349
+ | 上下文管理 | async with | N/A |
350
+
351
+ ## 异步编程最佳实践
352
+
353
+ ### 1. 并发执行多个独立任务
354
+
355
+ ```python
356
+ import asyncio
357
+
358
+ # 方式一: asyncio.gather 并发
359
+ spec_task = client.generate_spec(prd_path="./prd1.prdx")
360
+ status_task = client.get_status()
361
+
362
+ results = await asyncio.gather(spec_task, status_task)
363
+ spec_result, status_result = results
364
+
365
+ # 方式二: asyncio.create_task 显式创建任务
366
+ task1 = asyncio.create_task(client.generate_spec(prd_path="./prd1.prdx"))
367
+ task2 = asyncio.create_task(client.generate_spec(prd_path="./prd2.prdx"))
368
+
369
+ # 继续其他工作...
370
+ await some_other_work()
371
+
372
+ # 等待两个任务完成
373
+ result1, result2 = await asyncio.gather(task1, task2)
374
+ ```
375
+
376
+ ### 2. 限制并发数量
377
+
378
+ ```python
379
+ import asyncio
380
+
381
+ async def process_many_features(features, max_concurrent=5):
382
+ """限制并发数量的批量处理"""
383
+ semaphore = asyncio.Semaphore(max_concurrent)
384
+
385
+ async def process_one(feature):
386
+ async with semaphore:
387
+ return await client.generate_code(
388
+ spec_path="./specs/main.spec.json",
389
+ feature_id=feature["id"]
390
+ )
391
+
392
+ tasks = [process_one(f) for f in features]
393
+ return await asyncio.gather(*tasks)
394
+ ```
395
+
396
+ ### 3. 设置超时
397
+
398
+ ```python
399
+ import asyncio
400
+
401
+ try:
402
+ # 为单个操作设置超时
403
+ result = await asyncio.wait_for(
404
+ client.generate_spec(prd_path="./large-prd.prdx"),
405
+ timeout=120.0 # 120 秒超时
406
+ )
407
+ except asyncio.TimeoutError:
408
+ print("操作超时!")
409
+ ```
410
+
411
+ ### 4. 错误处理和重试
412
+
413
+ ```python
414
+ import asyncio
415
+ from pdd_sdk import PDDError
416
+
417
+ async def robust_generate(prd_path, max_attempts=5):
418
+ """带指数退避的重试逻辑"""
419
+ delay = 1.0
420
+ for attempt in range(max_attempts):
421
+ try:
422
+ return await client.generate_spec(prd_path=prd_path)
423
+ except PDDConnectionError as e:
424
+ if attempt == max_attempts - 1:
425
+ raise
426
+ print(f"连接失败,{delay:.1f}秒后重试...")
427
+ await asyncio.sleep(delay)
428
+ delay *= 2 # 指数退避
429
+ ```
430
+
431
+ ### 5. 资源清理
432
+
433
+ ```python
434
+ # 推荐: 使用上下文管理器
435
+ async with PDDClient(endpoint="http://localhost:3000") as client:
436
+ # 所有操作...
437
+ pass
438
+ # 自动调用 client.close()
439
+
440
+ # 手动管理
441
+ client = PDDClient(endpoint="http://localhost:3000")
442
+ try:
443
+ result = await client.generate_spec(prd_path="./prd.prdx")
444
+ finally:
445
+ await client.close() # 确保资源释放
446
+ ```
447
+
448
+ ## 项目结构
449
+
450
+ ```
451
+ sdk-python/
452
+ ├── pdd_sdk/
453
+ │ ├── __init__.py # 包初始化和公共导出
454
+ │ ├── client.py # 核心客户端类 (~350 行)
455
+ │ ├── models.py # 数据模型定义 (~200 行)
456
+ │ ├── exceptions.py # 异常体系 (~50 行)
457
+ │ ├── events.py # 事件系统 (~80 行)
458
+ │ └── utils.py # 工具函数 (~100 行)
459
+ ├── examples/
460
+ │ └── basic_usage.py # 基本用法示例 (~60 行)
461
+ └── README.md # 本文档
462
+ ```
463
+
464
+ ## 示例脚本
465
+
466
+ 运行基本用法示例:
467
+
468
+ ```bash
469
+ cd sdk-python
470
+ python examples/basic_usage.py
471
+ ```
472
+
473
+ 示例包含以下演示:
474
+ 1. 客户端初始化和状态检查
475
+ 2. 事件系统注册和监听
476
+ 3. PRD 规格生成
477
+ 4. 代码生成
478
+ 5. 功能验证
479
+ 6. 批量操作
480
+ 7. 会话管理
481
+ 8. 异步上下文管理器用法
482
+
483
+ ## 常见问题
484
+
485
+ ### Q: 如何在没有服务端的情况下测试?
486
+
487
+ SDK 包含完整的类型定义和数据模型,可以用于构建 mock 测试:
488
+
489
+ ```python
490
+ from pdd_sdk import SpecResult, CodeResult, VerifyResult
491
+
492
+ # 创建模拟结果
493
+ mock_spec = SpecResult(
494
+ success=True,
495
+ spec_id="test-spec-001",
496
+ spec_path="./mock/spec.json",
497
+ features=[
498
+ {"id": "F001", "name": "用户登录"},
499
+ {"id": "F002", "name": "用户注册"},
500
+ ]
501
+ )
502
+ print(mock_spec.feature_count) # 输出: 2
503
+ ```
504
+
505
+ ### Q: 如何自定义日志格式?
506
+
507
+ ```python
508
+ from pdd_sdk.utils import get_logger
509
+
510
+ logger = get_logger("my_app", level=10) # DEBUG 级别
511
+ logger.info("自定义日志消息")
512
+ ```
513
+
514
+ ### Q: 支持哪些 Python 版本?
515
+
516
+ Python 3.8 及以上版本。主要使用了:
517
+ - `dataclasses` (3.7+)
518
+ - `typing` 模块的完整支持 (3.8+ 最佳体验)
519
+ - `asyncio` (3.5+, 3.8+ 有显著改进)
520
+
521
+ ## 版本历史
522
+
523
+ ### v1.0.0 (当前版本)
524
+
525
+ - 初始版本发布
526
+ - 核心功能: 规格/代码/验证/审查
527
+ - 事件系统
528
+ - 重试机制
529
+ - 内存缓存
530
+ - 批量操作
531
+ - 会话管理
532
+ - 完整的类型注解和中文文档
533
+
534
+ ## 许可证
535
+
536
+ MIT License
537
+
538
+ ## 贡献指南
539
+
540
+ 欢迎提交 Issue 和 Pull Request!
541
+
542
+ 请确保:
543
+ 1. 代码符合 PEP 8 规范
544
+ 2. 添加适当的类型注解
545
+ 3. 更新相关文档
546
+ 4. 保持零第三方依赖的原则