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
package/lib/sdk-js.js ADDED
@@ -0,0 +1,446 @@
1
+ // lib/sdk-js.js - JavaScript SDK
2
+ // 继承SDK基类,提供JavaScript/TypeScript友好的API和增强功能
3
+
4
+ import { PDDSDKBase } from './sdk-base.js';
5
+ import { log } from './utils/logger.js';
6
+
7
+ /**
8
+ * PDD JavaScript SDK
9
+ * 提供Promise-based API、事件系统、自动重试等增强功能
10
+ */
11
+ export class PDDJS extends PDDSDKBase {
12
+ /**
13
+ * 构造函数
14
+ * @param {Object} config - 配置对象
15
+ * @param {string} config.endpoint - API端点
16
+ * @param {string} config.apiKey - API密钥
17
+ * @param {number} config.maxRetries - 最大重试次数(默认3)
18
+ * @param {number} config.retryDelay - 重试延迟毫秒数(默认1000)
19
+ * @param {boolean} config.enableCache - 是否启用缓存(默认true)
20
+ */
21
+ constructor(config = {}) {
22
+ super(config);
23
+
24
+ // JS SDK特有配置
25
+ this.maxRetries = config.maxRetries || 3;
26
+ this.retryDelay = config.retryDelay || 1000;
27
+ this.enableCache = config.enableCache !== false;
28
+
29
+ // 事件监听器
30
+ this._eventListeners = new Map();
31
+
32
+ // 简单的内存缓存(生产环境应使用更完善的缓存方案)
33
+ this._cache = new Map();
34
+ this._cacheTTL = config.cacheTTL || 300000; // 默认5分钟
35
+
36
+ log('info', 'PDD JavaScript SDK initialized');
37
+ }
38
+
39
+ /**
40
+ * 发送带重试机制的请求
41
+ * @override
42
+ */
43
+ async _request(method, path, data = null) {
44
+ let lastError;
45
+
46
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
47
+ try {
48
+ // 触发请求前事件
49
+ this._emit('request', { method, path, attempt });
50
+
51
+ const result = await super._request(method, path, data);
52
+
53
+ // 触发成功事件
54
+ this._emit('success', { method, path, result });
55
+
56
+ return result;
57
+ } catch (error) {
58
+ lastError = error;
59
+
60
+ // 触发错误事件
61
+ this._emit('error', { method, path, error, attempt });
62
+
63
+ // 如果是最后一次尝试或错误不可重试,直接抛出
64
+ if (attempt === this.maxRetries || !this._isRetryable(error)) {
65
+ throw error;
66
+ }
67
+
68
+ // 指数退避等待
69
+ const delay = this.retryDelay * Math.pow(2, attempt);
70
+ log('warn', `[SDK] Retry ${attempt + 1}/${this.maxRetries} after ${delay}ms`);
71
+ await this._sleep(delay);
72
+ }
73
+ }
74
+
75
+ throw lastError;
76
+ }
77
+
78
+ /**
79
+ * 判断错误是否可重试
80
+ * @private
81
+ */
82
+ _isRetryable(error) {
83
+ // 网络错误、超时、5xx服务器错误可重试
84
+ const retryablePatterns = [
85
+ /network/i,
86
+ /timeout/i,
87
+ /ECONNREFUSED/,
88
+ /ECONNRESET/,
89
+ /5\d{2}/
90
+ ];
91
+
92
+ return retryablePatterns.some(pattern => pattern.test(error.message));
93
+ }
94
+
95
+ /**
96
+ * 延迟函数
97
+ * @private
98
+ */
99
+ _sleep(ms) {
100
+ return new Promise(resolve => setTimeout(resolve, ms));
101
+ }
102
+
103
+ /**
104
+ * 带缓存的规格生成
105
+ * @param {Object} featureMatrix - 功能点矩阵
106
+ * @param {Object} options - 选项
107
+ * @returns {Promise<Object>} 规格文档
108
+ */
109
+ async generateSpecCached(featureMatrix, options = {}) {
110
+ const cacheKey = `spec:${featureMatrix.id}:${JSON.stringify(options)}`;
111
+
112
+ if (this.enableCache) {
113
+ const cached = this._getFromCache(cacheKey);
114
+ if (cached) {
115
+ log('debug', `[SDK] Cache hit for spec: ${featureMatrix.id}`);
116
+ return cached;
117
+ }
118
+ }
119
+
120
+ const result = await this.generateSpec(featureMatrix, options);
121
+
122
+ if (this.enableCache) {
123
+ this._setCache(cacheKey, result);
124
+ }
125
+
126
+ return result;
127
+ }
128
+
129
+ /**
130
+ * 批量生成规格文档
131
+ * @param {Array<Object>} featureMatrices - 功能点矩阵数组
132
+ * @param {Object} options - 选项
133
+ * @returns {Promise<Array<Object>} 规格文档数组
134
+ */
135
+ async batchGenerateSpecs(featureMatrices, options = {}) {
136
+ if (!Array.isArray(featureMatrices)) {
137
+ throw new Error('featureMatrices must be an array');
138
+ }
139
+
140
+ log('info', `[SDK] Batch generating specs for ${featureMatrices.length} features`);
141
+
142
+ // 并发控制:最多同时处理5个
143
+ const concurrencyLimit = options.concurrency || 5;
144
+ const results = [];
145
+
146
+ for (let i = 0; i < featureMatrices.length; i += concurrencyLimit) {
147
+ const batch = featureMatrices.slice(i, i + concurrencyLimit);
148
+ const batchResults = await Promise.allSettled(
149
+ batch.map(fm => this.generateSpec(fm, options))
150
+ );
151
+
152
+ results.push(...batchResults.map((result, index) => ({
153
+ featureId: batch[index].id,
154
+ status: result.status,
155
+ value: result.status === 'fulfilled' ? result.value : null,
156
+ error: result.status === 'rejected' ? result.reason : null
157
+ })));
158
+ }
159
+
160
+ const successCount = results.filter(r => r.status === 'fulfilled').length;
161
+ log('success', `[SDK] Batch complete: ${successCount}/${results.length} successful`);
162
+
163
+ return results;
164
+ }
165
+
166
+ /**
167
+ * 流式代码生成(模拟,实际需要SSE/WebSocket支持)
168
+ * @param {string} specPath - 规格路径
169
+ * @param {Function} onChunk - 数据块回调
170
+ * @param {Object} options - 选项
171
+ * @returns {Promise<Object>} 最终结果
172
+ */
173
+ async generateCodeStream(specPath, onChunk, options = {}) {
174
+ if (!specPath || typeof onChunk !== 'function') {
175
+ throw new Error('specPath and onChunk callback are required');
176
+ }
177
+
178
+ log('info', `[SDK] Starting stream code generation for: ${specPath}`);
179
+
180
+ try {
181
+ // 模拟流式输出(实际实现需要后端支持SSE)
182
+ onChunk({ type: 'start', message: 'Starting code generation...' });
183
+
184
+ const result = await this.generateCode(specPath, options);
185
+
186
+ onChunk({ type: 'progress', data: result, percent: 100 });
187
+ onChunk({ type: 'complete', data: result });
188
+
189
+ return result;
190
+ } catch (error) {
191
+ onChunk({ type: 'error', error: error.message });
192
+ throw error;
193
+ }
194
+ }
195
+
196
+ /**
197
+ * 链式调用API
198
+ * 提供流畅的链式接口用于常见工作流
199
+ * @returns {PDDChain} 链式调用对象
200
+ */
201
+ chain() {
202
+ return new PDDChain(this);
203
+ }
204
+
205
+ /**
206
+ * 注册事件监听器
207
+ * @param {string} event - 事件名称
208
+ * @param {Function} listener - 监听函数
209
+ * @returns {PDDJS} this(支持链式调用)
210
+ */
211
+ on(event, listener) {
212
+ if (!this._eventListeners.has(event)) {
213
+ this._eventListeners.set(event, []);
214
+ }
215
+ this._eventListeners.get(event).push(listener);
216
+ return this;
217
+ }
218
+
219
+ /**
220
+ * 移除事件监听器
221
+ * @param {string} event - 事件名称
222
+ * @param {Function} listener - 监听函数
223
+ * @returns {PDDJS} this
224
+ */
225
+ off(event, listener) {
226
+ const listeners = this._eventListeners.get(event);
227
+ if (listeners) {
228
+ const index = listeners.indexOf(listener);
229
+ if (index > -1) {
230
+ listeners.splice(index, 1);
231
+ }
232
+ }
233
+ return this;
234
+ }
235
+
236
+ /**
237
+ * 触发事件
238
+ * @private
239
+ */
240
+ _emit(event, data) {
241
+ const listeners = this._eventListeners.get(event);
242
+ if (listeners) {
243
+ listeners.forEach(listener => {
244
+ try {
245
+ listener(data);
246
+ } catch (error) {
247
+ log('error', `[SDK] Event listener error for "${event}"`, error.message);
248
+ }
249
+ });
250
+ }
251
+ }
252
+
253
+ /**
254
+ * 从缓存获取数据
255
+ * @private
256
+ */
257
+ _getFromCache(key) {
258
+ const item = this._cache.get(key);
259
+ if (!item) return null;
260
+
261
+ if (Date.now() - item.timestamp > this._cacheTTL) {
262
+ this._cache.delete(key);
263
+ return null;
264
+ }
265
+
266
+ return item.data;
267
+ }
268
+
269
+ /**
270
+ * 设置缓存数据
271
+ * @private
272
+ */
273
+ _setCache(key, value) {
274
+ this._cache.set(key, {
275
+ data: value,
276
+ timestamp: Date.now()
277
+ });
278
+
279
+ // 限制缓存大小(最多100条)
280
+ if (this._cache.size > 100) {
281
+ const firstKey = this._cache.keys().next().value;
282
+ this._cache.delete(firstKey);
283
+ }
284
+ }
285
+
286
+ /**
287
+ * 清空缓存
288
+ */
289
+ clearCache() {
290
+ this._cache.clear();
291
+ log('info', '[SDK] Cache cleared');
292
+ }
293
+
294
+ /**
295
+ * 获取SDK信息
296
+ * @override
297
+ */
298
+ getVersion() {
299
+ return {
300
+ ...super.getVersion(),
301
+ name: 'pdd-sdk-js',
302
+ version: '3.0.0',
303
+ features: [
304
+ 'auto-retry',
305
+ 'event-system',
306
+ 'caching',
307
+ 'batch-operations',
308
+ 'streaming'
309
+ ]
310
+ };
311
+ }
312
+ }
313
+
314
+ /**
315
+ * 链式调用辅助类
316
+ * 提供流畅的API用于PDD工作流
317
+ */
318
+ class PDDChain {
319
+ /**
320
+ * @param {PDDJS} sdk - SDK实例
321
+ */
322
+ constructor(sdk) {
323
+ this.sdk = sdk;
324
+ this._context = {};
325
+ }
326
+
327
+ /**
328
+ * 设置PRD路径
329
+ * @param {string} prdPath - PRD文档路径
330
+ * @returns {PDDChain} this
331
+ */
332
+ fromPRD(prdPath) {
333
+ this._context.prdPath = prdPath;
334
+ return this;
335
+ }
336
+
337
+ /**
338
+ * 提取功能点
339
+ * @returns {Promise<PDDChain>} this
340
+ */
341
+ async extractFeatures() {
342
+ if (!this._context.prdPath) {
343
+ throw new Error('PRD path not set. Use fromPRD() first.');
344
+ }
345
+
346
+ this._context.features = await this.sdk.extractFeatures(this._context.prdPath);
347
+ return this;
348
+ }
349
+
350
+ /**
351
+ * 生成规格文档
352
+ * @param {string} featureId - 功能点ID(可选,不传则生成所有)
353
+ * @returns {Promise<PDDChain>} this
354
+ */
355
+ async generateSpecs(featureId) {
356
+ if (!this._context.features) {
357
+ throw new Error('Features not extracted. Call extractFeatures() first.');
358
+ }
359
+
360
+ const targetFeature = featureId
361
+ ? this._context.features.find(f => f.id === featureId)
362
+ : this._context.features[0];
363
+
364
+ if (!targetFeature) {
365
+ throw new Error(`Feature not found: ${featureId}`);
366
+ }
367
+
368
+ this._context.spec = await this.sdk.generateSpec(targetFeature);
369
+ return this;
370
+ }
371
+
372
+ /**
373
+ * 实现代码
374
+ * @param {string} targetDir - 目标目录
375
+ * @returns {Promise<PDDChain>} this
376
+ */
377
+ async implement(targetDir) {
378
+ if (!this._context.spec || !this._context.spec.path) {
379
+ throw new Error('Spec not generated. Call generateSpecs() first.');
380
+ }
381
+
382
+ this._context.implementation = await this.sdk.generateCode(
383
+ this._context.spec.path,
384
+ { targetDir }
385
+ );
386
+ return this;
387
+ }
388
+
389
+ /**
390
+ * 验证实现
391
+ * @returns {Promise<Object>} 验证结果
392
+ */
393
+ async verify() {
394
+ if (!this._context.spec || !this._context.implementation) {
395
+ throw new Error('Implementation not complete. Call implement() first.');
396
+ }
397
+
398
+ return this.sdk.verifyFeature({
399
+ specPath: this._context.spec.path,
400
+ targetPath: this._context.implementation.path
401
+ });
402
+ }
403
+
404
+ /**
405
+ * 获取完整上下文
406
+ * @returns {Object} 工作流上下文
407
+ */
408
+ getContext() {
409
+ return { ...this._context };
410
+ }
411
+ }
412
+
413
+ /**
414
+ * 创建JavaScript SDK实例的便捷函数
415
+ * @param {Object} config - 配置对象
416
+ * @returns {PDDJS} SDK实例
417
+ *
418
+ * @example
419
+ * ```javascript
420
+ * import { createPDDJS } from './lib/sdk-js.js';
421
+ *
422
+ * const pdd = createPDDJS({
423
+ * endpoint: 'http://localhost:3000',
424
+ * apiKey: 'your-api-key'
425
+ * });
426
+ *
427
+ * // 使用事件监听
428
+ * pdd.on('error', (data) => console.error('Request failed:', data));
429
+ *
430
+ * // 带重试的API调用
431
+ * const spec = await pdd.generateSpec(featureMatrix);
432
+ *
433
+ * // 链式调用
434
+ * const result = await pdd.chain()
435
+ * .fromPRD('./docs/prd.md')
436
+ * .extractFeatures()
437
+ * .generateSpecs('feat-001')
438
+ * .implement('./src')
439
+ * .verify();
440
+ * ```
441
+ */
442
+ export function createPDDJS(config = {}) {
443
+ return new PDDJS(config);
444
+ }
445
+
446
+ export default PDDJS;