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,180 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PDD-VM 集成测试脚本
4
+ * 测试 Dashboard 和 TUI 的基本启动和数据流
5
+ */
6
+
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import { fileURLToPath } from 'url';
10
+
11
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
12
+
13
+ let passed = 0;
14
+ let failed = 0;
15
+
16
+ function test(name, fn) {
17
+ try {
18
+ fn();
19
+ console.log(` ✅ ${name}`);
20
+ passed++;
21
+ } catch (e) {
22
+ console.log(` ❌ ${name}: ${e.message}`);
23
+ failed++;
24
+ }
25
+ }
26
+
27
+ function assert(condition, message) {
28
+ if (!condition) throw new Error(message || 'Assertion failed');
29
+ }
30
+
31
+ // 颜色支持
32
+ let chalk;
33
+ try { chalk = (await import('chalk')).default; } catch { chalk = { green:(s)=>s, red:(s)=>s, cyan:(s=>s), bold:(s)=>s }; }
34
+
35
+ console.log(chalk.bold.cyan('\n🧪 PDD-VM 集成测试\n'));
36
+
37
+ // Test 1: 模块导入测试
38
+ console.log(chalk.bold('1. 模块导入测试'));
39
+ test('models.js 可导入', async () => {
40
+ const m = await import('../lib/vm/models.js');
41
+ assert(m.StageEnum !== undefined, 'StageEnum 存在');
42
+ assert(m.Feature !== undefined, 'Feature 存在');
43
+ assert(m.ProjectSummary !== undefined, 'ProjectSummary 存在');
44
+ });
45
+
46
+ test('state-store.js 可导入', async () => {
47
+ const m = await import('../lib/vm/state-store.js');
48
+ assert(m.StateStore !== undefined, 'StateStore 存在');
49
+ });
50
+
51
+ test('data-provider.js 可导入', async () => {
52
+ const m = await import('../lib/vm/data-provider.js');
53
+ assert(m.PDDDataProvider !== undefined, 'PDDDataProvider 存在');
54
+ });
55
+
56
+ test('event-bus.js 可导入', async () => {
57
+ const m = await import('../lib/vm/event-bus.js');
58
+ assert(m.VMEvents !== undefined, 'VMEvents 存在');
59
+ assert(m.VMEventBus !== undefined, 'VMEventBus 存在');
60
+ });
61
+
62
+ test('dashboard/server.js 可导入', async () => {
63
+ const m = await import('../lib/vm/dashboard/server.js');
64
+ assert(m.DashboardServer !== undefined, 'DashboardServer 存在');
65
+ });
66
+
67
+ test('tui/tui.js 可导入', async () => {
68
+ const m = await import('../lib/vm/tui/tui.js');
69
+ assert(m.TUIApp !== undefined, 'TUIApp 存在');
70
+ });
71
+
72
+ // Test 2: Feature 模型测试
73
+ console.log(chalk.bold('\n2. Feature 数据模型测试'));
74
+ test('Feature 创建与序列化', async () => {
75
+ const { Feature, StageEnum, QualityMetrics, TokenUsage } = await import('../lib/vm/models.js');
76
+ const f = new Feature({
77
+ id: 'test-001',
78
+ name: 'Test Feature',
79
+ stage: StageEnum.IMPLEMENTING,
80
+ priority: 'P0'
81
+ });
82
+ assert(f.id === 'test-001', 'ID 正确');
83
+ assert(f.stage === 'implementing', 'Stage 正确');
84
+ const json = f.toJSON();
85
+ assert(json.id === 'test-001', 'JSON ID 正确');
86
+ const restored = Feature.fromJSON(json);
87
+ assert(restored.id === f.id, 'Roundtrip ID 匹配');
88
+ assert(restored.stage === f.stage, 'Roundtrip stage 匹配');
89
+ });
90
+
91
+ // Test 3: StageEnum 完整性
92
+ test('StageEnum 包含6个阶段', async () => {
93
+ const { StageEnum, STAGE_VALUES } = await import('../lib/vm/models.js');
94
+ assert(STAGE_VALUES.length === 6, `应有6个阶段, 实际${STAGE_VALUES.length}`);
95
+ assert(STAGE_VALUES.includes('prd'), '包含 prd');
96
+ assert(STAGE_VALUES.includes('done'), '包含 done');
97
+ });
98
+
99
+ // Test 4: QualityMetrics 等级映射
100
+ test('评分到等级映射正确', async () => {
101
+ const { getGradeFromScore } = await import('../lib/vm/models.js');
102
+ assert(getGradeFromScore(98) === 'S', '98 → S');
103
+ assert(getGradeFromScore(90) === 'A', '90 → A');
104
+ assert(getGradeFromScore(75) === 'B', '75 → B');
105
+ assert(getGradeFromScore(60) === 'C', '60 → C');
106
+ assert(getGradeFromScore(45) === 'D', '45 → D');
107
+ assert(getGradeFromScore(20) === 'F', '20 → F');
108
+ });
109
+
110
+ // Test 5: EventBus 事件发射
111
+ test('EventBus 事件发射与接收', async () => {
112
+ const { createEventBus, VMEvents } = await import('../lib/vm/event-bus.js');
113
+ const bus = createEventBus();
114
+ let received = false;
115
+ bus.on(VMEvents.FEATURE_STAGE_CHANGED, () => { received = true; });
116
+ bus.emitStageChange('f1', 'prd', 'spec', {});
117
+ assert(received, '事件被接收');
118
+
119
+ const evt = bus.getSSEEvent();
120
+ assert(evt !== null, 'SSE事件存在');
121
+ assert(evt.type === 'feature_stage_changed', 'SSE事件类型正确');
122
+ });
123
+
124
+ // Test 6: 文件结构完整性
125
+ console.log(chalk.bold('\n3. 文件结构完整性测试'));
126
+ const requiredFiles = [
127
+ 'lib/vm/models.js',
128
+ 'lib/vm/state-schema.js',
129
+ 'lib/vm/state-store.js',
130
+ 'lib/vm/scanner.js',
131
+ 'lib/vm/reconciler.js',
132
+ 'lib/vm/event-bus.js',
133
+ 'lib/vm/data-provider.js',
134
+ 'lib/vm/hooks/hook-interface.js',
135
+ 'lib/vm/hooks/generate-hook.js',
136
+ 'lib/vm/hooks/verify-hook.js',
137
+ 'lib/vm/hooks/extract-hook.js',
138
+ 'lib/vm/hooks/report-hook.js',
139
+ 'lib/vm/dashboard/server.js',
140
+ 'lib/vm/dashboard/sse.js',
141
+ 'lib/vm/dashboard/api-routes.js',
142
+ 'lib/vm/dashboard/static/index.html',
143
+ 'lib/vm/dashboard/static/css/dashboard.css',
144
+ 'lib/vm/dashboard/static/js/app.js',
145
+ 'lib/vm/dashboard/static/js/charts.js',
146
+ 'lib/vm/dashboard/static/js/pipeline-view.js',
147
+ 'lib/vm/dashboard/static/js/kanban-view.js',
148
+ 'lib/vm/dashboard/static/js/quality-view.js',
149
+ 'lib/vm/dashboard/static/js/system-view.js',
150
+ 'lib/vm/tui/tui.js',
151
+ 'lib/vm/tui/renderer.js',
152
+ 'lib/vm/tui/input.js',
153
+ 'lib/vm/tui/components/progress-bar.js',
154
+ 'lib/vm/tui/components/table.js',
155
+ 'lib/vm/tui/components/sparkline.js',
156
+ 'lib/vm/tui/components/status-light.js',
157
+ 'lib/vm/tui/components/card.js',
158
+ 'lib/vm/tui/screens/overview-screen.js',
159
+ 'lib/vm/tui/screens/kanban-screen.js',
160
+ 'lib/vm/tui/screens/quality-screen.js',
161
+ 'lib/vm/tui/screens/system-screen.js'
162
+ ];
163
+
164
+ for (const file of requiredFiles) {
165
+ test(`文件存在: ${file}`, () => {
166
+ const fullPath = path.join(__dirname, '..', file);
167
+ assert(fs.existsSync(fullPath), `文件不存在: ${fullPath}`);
168
+ });
169
+ }
170
+
171
+ // 结果汇总
172
+ console.log(chalk.bold('\n' + '='.repeat(40)));
173
+ console.log(chalk.bold('Result: ' + chalk.green(passed + ' passed') + ' / ' + chalk.red(failed + ' failed') + ' / ' + (passed + failed) + ' total'));
174
+ if (failed > 0) {
175
+ console.log(chalk.red('\n❌ 有测试失败!'));
176
+ process.exit(1);
177
+ } else {
178
+ console.log(chalk.green('\n✅ 所有测试通过!PDD-VM 集成就绪。'));
179
+ process.exit(0);
180
+ }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 wonderqi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,232 @@
1
+ # official-doc-writer
2
+
3
+ 党政机关公文生成技能,符合 GB/T 9704-2012《党政机关公文格式》国家标准。
4
+
5
+ ## 概述
6
+
7
+ 本技能用于生成符合《党政机关公文处理工作条例》和 GB/T 9704-2012《党政机关公文格式》国家标准的公文文档,支持多种公文类型,并可导出为标准格式的 Word 文档。
8
+
9
+ ## 功能特性
10
+
11
+ ### 支持的公文类型
12
+
13
+ | 公文类型 | 说明 | 适用场景 |
14
+ | ---- | --------------- | --------- |
15
+ | 通知 | 传达要求下级机关执行事项 | 部署工作、发布信息 |
16
+ | 报告 | 向上级机关汇报工作 | 工作汇报、情况报告 |
17
+ | 请示 | 向上级机关请求指示批准 | 申请审批、请求指示 |
18
+ | 函 | 平行机关或不相隶属机关商洽工作 | 业务沟通、协商函 |
19
+
20
+ ### 核心功能
21
+
22
+ 1. **智能对话交互** - 通过引导式对话收集公文要素
23
+ 2. **自动格式排版** - 符合 GB/T 9704-2012 标准格式
24
+ 3. **Word 文档导出** - 生成可直接使用的 .docx 文件
25
+ 4. **公文字体支持** - 内置所需字体文件
26
+
27
+ ### 对话交互要素
28
+
29
+ **核心要素(必填)**:
30
+
31
+ - 公文类型
32
+ - 发文机关
33
+ - 主送机关
34
+ - 公文标题
35
+ - 成文日期
36
+ - 正文内容
37
+
38
+ **可选要素**:
39
+
40
+ - 发文字号
41
+ - 密级
42
+ - 紧急程度
43
+ - 签发人
44
+ - 附件
45
+ - 抄送机关
46
+
47
+ ## 快速开始
48
+
49
+ ### 方式一:使用 Trae/Trae AI
50
+
51
+ 在 Trae 或 Claude 中直接调用本技能:
52
+
53
+ `
54
+ 帮我写一份关于安全生产的通知
55
+ `
56
+
57
+ ### 方式二:运行 Python 脚本
58
+
59
+ `bash
60
+
61
+ cd official-doc-writer
62
+
63
+ python scripts/generate_official_doc.py
64
+ `
65
+
66
+ ## 目录结构
67
+
68
+ `
69
+ official-doc-writer/
70
+ SKILL.md # 技能定义文件
71
+ LICENSE # MIT 许可证
72
+ README.md # 说明文档
73
+ document_generator.py # 文档生成核心类
74
+ examples.md # 使用示例
75
+ fonts/ # 字体资源目录
76
+ README.md # 字体安装说明
77
+ FONTS_LIST.md # 字体清单
78
+ SIMFANG.TTF # 仿宋_GB2312
79
+ SIMHEI.TTF # 黑体
80
+ SIMKAI.TTF # 楷体_GB2312
81
+ SIMSUN.TTC # 宋体
82
+ 方正小标宋GBK.TTF # 方正小标宋_GBK
83
+ references/ # 参考文档
84
+ GBT_9704-2012_党政机关公文格式.md # 国标文档
85
+ scripts/ # 可执行脚本
86
+ generate_official_doc.py # 公文生成脚本
87
+ install_fonts.py # 字体安装脚本
88
+ dialog_manager.py # 对话管理器
89
+ smart_prompts.py # 智能提示系统
90
+ `
91
+
92
+ ## 字体安装
93
+
94
+ ### 为什么需要安装字体?
95
+
96
+ GB/T 9704-2012 标准对公文字体有特殊要求,需要安装以下字体才能正确显示:
97
+
98
+ | 字体 | 用途 |
99
+ | --------- | ---------- |
100
+ | 方正小标宋_GBK | 发文机关标志、标题 |
101
+ | 仿宋_GB2312 | 正文、发文字号 |
102
+ | 黑体 | 一级标题、密级 |
103
+ | 楷体_GB2312 | 二级标题、签发人姓名 |
104
+ | 宋体 | 页码 |
105
+
106
+ ### 自动安装(推荐自己提前安装好字体)
107
+
108
+ `ash
109
+
110
+ # Windows 系统(以管理员身份运行)
111
+
112
+ python scripts/install_fonts.py
113
+
114
+ # macOS/Linux 系统
115
+
116
+ python scripts/install_fonts.py
117
+ `
118
+
119
+ 脚本会自动:
120
+
121
+ 1. 从系统字体目录复制字体到 fonts 目录
122
+ 2. 检测系统已安装的字体
123
+ 3. 安装缺失的字体
124
+
125
+ ### 手动安装
126
+
127
+ 1. 复制 fonts 目录中的字体文件到系统字体目录:
128
+
129
+ - Windows: C:\\Windows\\Fonts
130
+ - macOS: ~/Library/Fonts
131
+ - Linux: ~/.fonts
132
+
133
+ 2. 重启 WPS/Word 使字体生效
134
+
135
+ ## 使用示例
136
+
137
+ ### 示例 1:生成通知
138
+
139
+ **输入**:
140
+ `
141
+ 帮我写一份关于安全生产的通知,发文机关是XXX公司,主送机关是各部门。
142
+ `
143
+
144
+ **输出**:生成符合标准的通知文档,包含:
145
+
146
+ - 发文机关标志
147
+ - 标题:关于安全生产的通知
148
+ - 主送机关
149
+ - 正文内容
150
+ - 成文日期
151
+ - 落款
152
+
153
+ ### 示例 2:生成请示
154
+
155
+ **输入**:
156
+ `
157
+ 我需要一份关于采购办公设备的请示,向集团申请购买一批电脑。
158
+ `
159
+
160
+ **输出**:生成符合标准的请示文档,包含:
161
+
162
+ - 标题:关于采购办公设备的请示
163
+ - 主送机关
164
+ - 正文:采购原因、预算金额等
165
+ - 签发人
166
+ - 附件(如有)
167
+
168
+ ## 技术实现
169
+
170
+ ### 依赖库
171
+
172
+ - python-docx: Word 文档生成
173
+ - python-dateutil: 日期处理
174
+
175
+ ### 核心模块
176
+
177
+ #### document_generator.py
178
+
179
+ 文档生成核心类,负责:
180
+
181
+ - 创建 Word 文档
182
+ - 设置页面格式
183
+ - 插入公文要素
184
+ - 应用公文字体样式
185
+
186
+ #### dialog_manager.py
187
+
188
+ 对话状态管理器,负责:
189
+
190
+ - 跟踪对话进度
191
+ - 收集公文要素
192
+ - 生成下一步提示
193
+
194
+ #### smart_prompts.py
195
+
196
+ 智能提示系统,负责:
197
+
198
+ - 生成开头语建议
199
+ - 生成结尾语建议
200
+ - 提供格式参考
201
+
202
+ ## 许可证
203
+
204
+ 本项目采用 MIT 许可证,详见 LICENSE 文件。
205
+
206
+ ## 作者
207
+
208
+ - 作者: neuqik@hotmail.com
209
+ - 许可证: MIT
210
+
211
+ ## 相关标准
212
+
213
+ - GB/T 9704-2012《党政机关公文格式》
214
+ - 《党政机关公文处理工作条例》(中办发〔2012〕14号)
215
+
216
+ ## 常见问题
217
+
218
+ ### Q: 生成的 Word 文档字体显示不正常?
219
+
220
+ A: 请确保已正确安装所需字体,参考「字体安装」章节。
221
+
222
+ ### Q: 如何修改默认的发文机关?
223
+
224
+ A: 在对话中直接指定,如:发文机关是XXX公司。
225
+
226
+ ### Q: 支持哪些输出格式?
227
+
228
+ A: 目前支持 .docx 格式,可直接用 WPS 或 Word 打开。
229
+
230
+ ### Q: 如何添加附件说明?
231
+
232
+ A: 在对话中提及附件,如:附:采购清单一份,系统会自动添加附件说明。