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.
- package/README.md +1478 -0
- package/bin/pdd.js +354 -0
- package/config/bpmn-rules.yaml +166 -0
- package/config/checkstyle.xml +105 -0
- package/config/eslint.config.js +48 -0
- package/config/pmd.xml +91 -0
- package/config/prd-rules.yaml +113 -0
- package/config/ruff.toml +45 -0
- package/config/sqlfluff.cfg +82 -0
- package/hooks/hook-executor.js +332 -0
- package/index.js +43 -0
- package/lib/api-routes.js +750 -0
- package/lib/api-server.js +408 -0
- package/lib/cache/cache-config.js +209 -0
- package/lib/cache/system-cache.js +852 -0
- package/lib/config-manager.js +373 -0
- package/lib/generate.js +528 -0
- package/lib/grpc/grpc-routes.js +1134 -0
- package/lib/grpc/grpc-server.js +912 -0
- package/lib/grpc/proto-definitions.js +1033 -0
- package/lib/init.js +172 -0
- package/lib/iteration/auto-fixer.js +1025 -0
- package/lib/iteration/auto-reviewer.js +923 -0
- package/lib/iteration/controller.js +577 -0
- package/lib/list.js +130 -0
- package/lib/mcp-server.js +548 -0
- package/lib/openclaw/api-integration.js +535 -0
- package/lib/openclaw/cli-integration.js +567 -0
- package/lib/openclaw/data-sync.js +845 -0
- package/lib/openclaw/openclaw-adapter.js +783 -0
- package/lib/plugin/example-plugins/code-stats/index.js +332 -0
- package/lib/plugin/example-plugins/code-stats/plugin.json +1 -0
- package/lib/plugin/example-plugins/custom-linter/index.js +472 -0
- package/lib/plugin/example-plugins/custom-linter/plugin.json +1 -0
- package/lib/plugin/example-plugins/hello-world/index.js +86 -0
- package/lib/plugin/example-plugins/hello-world/plugin.json +1 -0
- package/lib/plugin/plugin-manager.js +655 -0
- package/lib/plugin/plugin-sdk.js +565 -0
- package/lib/plugin/sandbox.js +627 -0
- package/lib/quality/rules/maintainability.js +418 -0
- package/lib/quality/rules/performance.js +498 -0
- package/lib/quality/rules/readability.js +441 -0
- package/lib/quality/rules/robustness.js +504 -0
- package/lib/quality/rules/security.js +444 -0
- package/lib/quality/scorer.js +576 -0
- package/lib/report.js +669 -0
- package/lib/sdk-base.js +301 -0
- package/lib/sdk-js.js +446 -0
- package/lib/sdk-python/README.md +546 -0
- package/lib/sdk-python/examples/basic_usage.py +450 -0
- package/lib/sdk-python/pdd_sdk/__init__.py +180 -0
- package/lib/sdk-python/pdd_sdk/client.py +1170 -0
- package/lib/sdk-python/pdd_sdk/events.py +423 -0
- package/lib/sdk-python/pdd_sdk/exceptions.py +158 -0
- package/lib/sdk-python/pdd_sdk/models.py +518 -0
- package/lib/sdk-python/pdd_sdk/utils.py +759 -0
- package/lib/token/budget-alert.js +367 -0
- package/lib/token/budget-manager.js +485 -0
- package/lib/update.js +54 -0
- package/lib/utils/logger.js +88 -0
- package/lib/verify.js +741 -0
- package/lib/version.js +52 -0
- package/lib/vm/README.md +102 -0
- package/lib/vm/dashboard/api-routes.js +669 -0
- package/lib/vm/dashboard/server.js +391 -0
- package/lib/vm/dashboard/sse.js +358 -0
- package/lib/vm/dashboard/static/css/dashboard.css +1378 -0
- package/lib/vm/dashboard/static/index.html +118 -0
- package/lib/vm/dashboard/static/js/app.js +949 -0
- package/lib/vm/dashboard/static/js/charts.js +913 -0
- package/lib/vm/dashboard/static/js/kanban-view.js +1053 -0
- package/lib/vm/dashboard/static/js/pipeline-view.js +463 -0
- package/lib/vm/dashboard/static/js/quality-view.js +598 -0
- package/lib/vm/dashboard/static/js/system-view.js +1021 -0
- package/lib/vm/data-provider.js +1191 -0
- package/lib/vm/event-bus.js +402 -0
- package/lib/vm/hooks/extract-hook.js +307 -0
- package/lib/vm/hooks/generate-hook.js +374 -0
- package/lib/vm/hooks/hook-interface.js +458 -0
- package/lib/vm/hooks/report-hook.js +331 -0
- package/lib/vm/hooks/verify-hook.js +454 -0
- package/lib/vm/models.js +1003 -0
- package/lib/vm/reconciler.js +855 -0
- package/lib/vm/scanner.js +988 -0
- package/lib/vm/state-schema.js +955 -0
- package/lib/vm/state-store.js +733 -0
- package/lib/vm/tui/components/card.js +339 -0
- package/lib/vm/tui/components/progress-bar.js +368 -0
- package/lib/vm/tui/components/sparkline.js +327 -0
- package/lib/vm/tui/components/status-light.js +294 -0
- package/lib/vm/tui/components/table.js +370 -0
- package/lib/vm/tui/input.js +335 -0
- package/lib/vm/tui/renderer.js +548 -0
- package/lib/vm/tui/screens/kanban-screen.js +397 -0
- package/lib/vm/tui/screens/overview-screen.js +357 -0
- package/lib/vm/tui/screens/quality-screen.js +336 -0
- package/lib/vm/tui/screens/system-screen.js +379 -0
- package/lib/vm/tui/tui.js +805 -0
- package/package.json +1 -0
- package/scripts/cso-analyzer.js +198 -0
- package/scripts/eval-runner.js +359 -0
- package/scripts/i18n-checker.js +109 -0
- package/scripts/linter/activiti-linter.js +272 -0
- package/scripts/linter/prd-linter.js +162 -0
- package/scripts/linter/report-generator.js +207 -0
- package/scripts/linter/run-linters.js +285 -0
- package/scripts/linter/sql-linter.js +166 -0
- package/scripts/token-analyzer.js +162 -0
- package/scripts/vm-test.js +180 -0
- package/skills/core/official-doc-writer/LICENSE +21 -0
- package/skills/core/official-doc-writer/README.md +232 -0
- package/skills/core/official-doc-writer/SKILL.md +475 -0
- package/skills/core/official-doc-writer/_meta.json +1 -0
- package/skills/core/official-doc-writer/document_generator.py +580 -0
- package/skills/core/official-doc-writer/evals/default-evals.json +1 -0
- package/skills/core/official-doc-writer/examples.md +150 -0
- package/skills/core/official-doc-writer/fonts/FONTS_LIST.md +45 -0
- package/skills/core/official-doc-writer/fonts/README.md +141 -0
- package/skills/core/official-doc-writer/fonts/SIMFANG.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMHEI.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMKAI.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMSUN.TTC +0 -0
- 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
- 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
- package/skills/core/official-doc-writer/scripts/__pycache__/generate_official_doc.cpython-313.pyc +0 -0
- package/skills/core/official-doc-writer/scripts/dialog_manager.py +564 -0
- package/skills/core/official-doc-writer/scripts/generate_official_doc.py +252 -0
- package/skills/core/official-doc-writer/scripts/install_fonts.py +390 -0
- package/skills/core/official-doc-writer/scripts/smart_prompts.py +363 -0
- package/skills/core/pdd-ba/SKILL.md +305 -0
- package/skills/core/pdd-ba/_meta.json +1 -0
- package/skills/core/pdd-ba/evals/default-evals.json +1 -0
- package/skills/core/pdd-code-reviewer/SKILL.md +378 -0
- package/skills/core/pdd-code-reviewer/_meta.json +1 -0
- package/skills/core/pdd-code-reviewer/evals/default-evals.json +1 -0
- package/skills/core/pdd-doc-change/SKILL.md +350 -0
- package/skills/core/pdd-doc-change/_meta.json +1 -0
- package/skills/core/pdd-doc-change/evals/default-evals.json +1 -0
- package/skills/core/pdd-doc-gardener/SKILL.md +248 -0
- package/skills/core/pdd-doc-gardener/_meta.json +1 -0
- package/skills/core/pdd-doc-gardener/evals/default-evals.json +1 -0
- package/skills/core/pdd-entropy-reduction/SKILL.md +360 -0
- package/skills/core/pdd-entropy-reduction/_meta.json +1 -0
- package/skills/core/pdd-entropy-reduction/evals/default-evals.json +1 -0
- package/skills/core/pdd-entropy-reduction/references/entropy-report-template.md +287 -0
- package/skills/core/pdd-entropy-reduction/references/golden-principles.md +573 -0
- package/skills/core/pdd-entropy-reduction/scripts/entropy_scan.py +712 -0
- package/skills/core/pdd-extract-features/SKILL.md +320 -0
- package/skills/core/pdd-extract-features/_meta.json +1 -0
- package/skills/core/pdd-extract-features/evals/default-evals.json +1 -0
- package/skills/core/pdd-generate-spec/SKILL.md +418 -0
- package/skills/core/pdd-generate-spec/_meta.json +1 -0
- package/skills/core/pdd-generate-spec/evals/default-evals.json +1 -0
- package/skills/core/pdd-implement-feature/SKILL.md +332 -0
- package/skills/core/pdd-implement-feature/_meta.json +1 -0
- package/skills/core/pdd-implement-feature/evals/default-evals.json +1 -0
- package/skills/core/pdd-main/SKILL.md +540 -0
- package/skills/core/pdd-main/_meta.json +1 -0
- package/skills/core/pdd-main/evals/default-evals.json +1 -0
- package/skills/core/pdd-main/evals/evals.json +215 -0
- package/skills/core/pdd-verify-feature/SKILL.md +474 -0
- package/skills/core/pdd-verify-feature/_meta.json +1 -0
- package/skills/core/pdd-verify-feature/evals/default-evals.json +1 -0
- package/skills/core/pdd-vm/evals/default-evals.json +1 -0
- package/skills/core/traffic-accident-assessor/LICENSE +29 -0
- package/skills/core/traffic-accident-assessor/SKILL.md +439 -0
- package/skills/core/traffic-accident-assessor/evals/evals.json +1 -0
- package/skills/core/traffic-accident-assessor/references/accident-types.md +369 -0
- package/skills/core/traffic-accident-assessor/references/liability-rules.md +287 -0
- package/skills/core/traffic-accident-assessor/references/traffic-laws.md +226 -0
- 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
- package/skills/core/traffic-accident-assessor/scripts/generate_official_statement.py +588 -0
- package/skills/core/traffic-accident-assessor/scripts/generate_report.py +495 -0
- package/skills/core/traffic-accident-assessor/scripts/generate_statement.py +528 -0
- package/skills/core/traffic-accident-assessor.zip +0 -0
- package/skills/entropy/expert-arch-enforcer/SKILL.md +292 -0
- package/skills/entropy/expert-arch-enforcer/_meta.json +1 -0
- package/skills/entropy/expert-arch-enforcer/evals/default-evals.json +1 -0
- package/skills/entropy/expert-auto-refactor/SKILL.md +327 -0
- package/skills/entropy/expert-auto-refactor/_meta.json +1 -0
- package/skills/entropy/expert-auto-refactor/evals/default-evals.json +1 -0
- package/skills/entropy/expert-code-quality/SKILL.md +468 -0
- package/skills/entropy/expert-code-quality/_meta.json +1 -0
- package/skills/entropy/expert-code-quality/evals/default-evals.json +1 -0
- package/skills/entropy/expert-code-quality/evals/evals.json +109 -0
- package/skills/entropy/expert-code-quality/references/code-smells.md +605 -0
- package/skills/entropy/expert-code-quality/references/design-patterns.md +1111 -0
- package/skills/entropy/expert-code-quality/references/refactoring-catalog.md +1281 -0
- package/skills/entropy/expert-code-quality/references/solid-principles.md +524 -0
- package/skills/entropy/expert-entropy-auditor/SKILL.md +276 -0
- package/skills/entropy/expert-entropy-auditor/_meta.json +1 -0
- package/skills/entropy/expert-entropy-auditor/evals/default-evals.json +1 -0
- package/skills/expert/expert-activiti/SKILL.md +497 -0
- package/skills/expert/expert-activiti/_meta.json +1 -0
- package/skills/expert/expert-mysql/SKILL.md +832 -0
- package/skills/expert/expert-mysql/_meta.json +1 -0
- package/skills/expert/expert-performance/SKILL.md +379 -0
- package/skills/expert/expert-performance/_meta.json +1 -0
- package/skills/expert/expert-performance/evals/default-evals.json +1 -0
- package/skills/expert/expert-ruoyi/SKILL.md +472 -0
- package/skills/expert/expert-ruoyi/_meta.json +1 -0
- package/skills/expert/expert-security/SKILL.md +1341 -0
- package/skills/expert/expert-security/_meta.json +1 -0
- package/skills/expert/expert-security/evals/default-evals.json +1 -0
- package/skills/expert/software-architect/SKILL.md +350 -0
- package/skills/expert/software-architect/_meta.json +1 -0
- package/skills/expert/software-engineer/SKILL.md +437 -0
- package/skills/expert/software-engineer/_meta.json +1 -0
- package/skills/expert/software-engineer/architecture.md +130 -0
- package/skills/expert/software-engineer/patterns.md +151 -0
- package/skills/expert/software-engineer/testing.md +135 -0
- package/skills/expert/system-architect/SKILL.md +628 -0
- package/skills/expert/system-architect/_meta.json +1 -0
- package/skills/expert/system-architect/assets/templates/ARCHITECTURE.md +25 -0
- package/skills/expert/system-architect/assets/templates/README.md +44 -0
- package/skills/expert/system-architect/references/js-ts-standards.md +18 -0
- package/skills/expert/system-architect/references/python-standards.md +19 -0
- package/skills/expert/system-architect/references/scaffolding.md +61 -0
- package/skills/expert/system-architect/references/security-checklist.md +21 -0
- package/skills/openspec/openspec-apply-change/SKILL.md +156 -0
- package/skills/openspec/openspec-apply-change/_meta.json +1 -0
- package/skills/openspec/openspec-archive-change/SKILL.md +114 -0
- package/skills/openspec/openspec-archive-change/_meta.json +1 -0
- package/skills/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
- package/skills/openspec/openspec-bulk-archive-change/_meta.json +1 -0
- package/skills/openspec/openspec-continue-change/SKILL.md +118 -0
- package/skills/openspec/openspec-continue-change/_meta.json +1 -0
- package/skills/openspec/openspec-explore/SKILL.md +288 -0
- package/skills/openspec/openspec-explore/_meta.json +1 -0
- package/skills/openspec/openspec-ff-change/SKILL.md +101 -0
- package/skills/openspec/openspec-ff-change/_meta.json +1 -0
- package/skills/openspec/openspec-new-change/SKILL.md +74 -0
- package/skills/openspec/openspec-new-change/_meta.json +1 -0
- package/skills/openspec/openspec-onboard/SKILL.md +554 -0
- package/skills/openspec/openspec-onboard/_meta.json +1 -0
- package/skills/openspec/openspec-sync-specs/SKILL.md +138 -0
- package/skills/openspec/openspec-sync-specs/_meta.json +1 -0
- package/skills/openspec/openspec-verify-change/SKILL.md +168 -0
- package/skills/openspec/openspec-verify-change/_meta.json +1 -0
- package/skills/pr/pdd-multi-review/SKILL.md +534 -0
- package/skills/pr/pdd-multi-review/_meta.json +1 -0
- package/skills/pr/pdd-pr-batch/SKILL.md +303 -0
- package/skills/pr/pdd-pr-batch/_meta.json +1 -0
- package/skills/pr/pdd-pr-create/SKILL.md +344 -0
- package/skills/pr/pdd-pr-create/_meta.json +1 -0
- package/skills/pr/pdd-pr-merge/SKILL.md +286 -0
- package/skills/pr/pdd-pr-merge/_meta.json +1 -0
- package/skills/pr/pdd-pr-review/SKILL.md +217 -0
- package/skills/pr/pdd-pr-review/_meta.json +1 -0
- package/skills/pr/pdd-task-manager/SKILL.md +636 -0
- package/skills/pr/pdd-task-manager/_meta.json +1 -0
- package/skills/pr/pdd-template-engine/SKILL.md +306 -0
- package/skills/pr/pdd-template-engine/_meta.json +1 -0
- package/templates/behavior-shaping/iron-law-template.md +87 -0
- package/templates/behavior-shaping/rationalization-template.md +62 -0
- package/templates/behavior-shaping/red-flags-template.md +70 -0
- package/templates/bilingual-template.md +139 -0
- package/templates/config/default.yaml +47 -0
- package/templates/project/default/README.md +31 -0
- package/templates/project/frontend/README.md +46 -0
- package/templates/project/java/README.md +48 -0
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
"""
|
|
2
|
+
PDD Python SDK 基本用法示例
|
|
3
|
+
|
|
4
|
+
演示 SDK 的核心功能,包括:
|
|
5
|
+
- 客户端初始化与配置
|
|
6
|
+
- 事件监听
|
|
7
|
+
- 规格生成
|
|
8
|
+
- 代码生成
|
|
9
|
+
- 功能验证
|
|
10
|
+
- 错误处理
|
|
11
|
+
- 批量操作
|
|
12
|
+
|
|
13
|
+
运行方式:
|
|
14
|
+
python examples/basic_usage.py
|
|
15
|
+
|
|
16
|
+
注意: 需要先启动 PDD 服务端(默认 http://localhost:3000)
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import asyncio
|
|
20
|
+
import sys
|
|
21
|
+
import os
|
|
22
|
+
|
|
23
|
+
# 添加父目录到路径,以便导入 pdd_sdk
|
|
24
|
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
25
|
+
|
|
26
|
+
from pdd_sdk import (
|
|
27
|
+
PDDClient,
|
|
28
|
+
Events,
|
|
29
|
+
PDDError,
|
|
30
|
+
PDDConnectionError,
|
|
31
|
+
AuthError,
|
|
32
|
+
ValidationError,
|
|
33
|
+
format_table,
|
|
34
|
+
format_json,
|
|
35
|
+
format_duration,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def print_section(title: str) -> None:
|
|
40
|
+
"""打印分隔线"""
|
|
41
|
+
print(f"\n{'='*60}")
|
|
42
|
+
print(f" {title}")
|
|
43
|
+
print(f"{'='*60}\n")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
async def example_basic_client():
|
|
47
|
+
"""
|
|
48
|
+
示例 1: 基本客户端初始化和状态检查
|
|
49
|
+
"""
|
|
50
|
+
print_section("示例 1: 客户端初始化")
|
|
51
|
+
|
|
52
|
+
# 创建客户端实例
|
|
53
|
+
client = PDDClient(
|
|
54
|
+
endpoint="http://localhost:3000",
|
|
55
|
+
api_key="", # 如果服务端需要认证,填入 API Key
|
|
56
|
+
timeout=30,
|
|
57
|
+
debug=True, # 开启调试日志
|
|
58
|
+
max_retries=3,
|
|
59
|
+
retry_delay=1.0,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
print(f"客户端信息: {client}")
|
|
63
|
+
print(f"请求统计: {format_json(client.request_stats)}")
|
|
64
|
+
|
|
65
|
+
# 同步健康检查
|
|
66
|
+
is_healthy = client.health_check()
|
|
67
|
+
print(f"服务健康状态: {'正常' if is_healthy else '异常'}")
|
|
68
|
+
|
|
69
|
+
# 异步获取详细状态
|
|
70
|
+
try:
|
|
71
|
+
status = await client.get_status()
|
|
72
|
+
if status.healthy and status.server_info:
|
|
73
|
+
info = status.server_info
|
|
74
|
+
print(f"\n服务器信息:")
|
|
75
|
+
print(f" 版本: {info.version}")
|
|
76
|
+
print(f" 运行时间: {format_duration(int(info.uptime * 1000))}")
|
|
77
|
+
print(f" 可用技能数: {info.available_skills}")
|
|
78
|
+
print(f" 支持的 API: {', '.join(info.supported_apis[:5])}...")
|
|
79
|
+
except Exception as e:
|
|
80
|
+
print(f"获取状态失败(可能服务未启动): {e}")
|
|
81
|
+
|
|
82
|
+
await client.close()
|
|
83
|
+
return client
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
async def example_event_system(client: PDDClient):
|
|
87
|
+
"""
|
|
88
|
+
示例 2: 事件系统使用
|
|
89
|
+
"""
|
|
90
|
+
print_section("示例 2: 事件监听")
|
|
91
|
+
|
|
92
|
+
# 注册请求完成事件监听器
|
|
93
|
+
def on_request_end(event_data: dict):
|
|
94
|
+
method = event_data.get("method", "")
|
|
95
|
+
path = event_data.get("path", "")
|
|
96
|
+
duration = event_data.get("duration_ms", 0)
|
|
97
|
+
success = event_data.get("success", False)
|
|
98
|
+
status_icon = "OK" if success else "FAIL"
|
|
99
|
+
print(f" [事件] {method} {path} -> {status_icon} ({duration}ms)")
|
|
100
|
+
|
|
101
|
+
# 注册请求错误事件监听器
|
|
102
|
+
def on_request_error(event_data: dict):
|
|
103
|
+
error = event_data.get("error", "未知错误")
|
|
104
|
+
print(f" [事件] 请求失败: {error}")
|
|
105
|
+
|
|
106
|
+
# 注册重试事件监听器
|
|
107
|
+
def on_retry(event_data: dict):
|
|
108
|
+
attempt = event_data.get("attempt", 0)
|
|
109
|
+
print(f" [事件] 正在进行第 {attempt} 次重试...")
|
|
110
|
+
|
|
111
|
+
# 绑定事件处理器
|
|
112
|
+
client.on(Events.REQUEST_END, on_request_end)
|
|
113
|
+
client.on(Events.REQUEST_ERROR, on_request_error)
|
|
114
|
+
client.on(Events.RETRY, on_retry)
|
|
115
|
+
|
|
116
|
+
# 使用 once 监听一次性事件
|
|
117
|
+
client.once("request:end", lambda e: print(" [一次性事件] 首次请求完成!"))
|
|
118
|
+
|
|
119
|
+
print("已注册以下事件监听器:")
|
|
120
|
+
for event_name in client.events.event_names():
|
|
121
|
+
count = client.events.listener_count(event_name)
|
|
122
|
+
print(f" - {event_name}: {count} 个监听器")
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
async def example_generate_spec(client: PDDClient):
|
|
126
|
+
"""
|
|
127
|
+
示例 3: 从 PRD 生成开发规格
|
|
128
|
+
"""
|
|
129
|
+
print_section("示例 3: 规格生成")
|
|
130
|
+
|
|
131
|
+
# 注意: 此处需要实际的 PRD 文件路径
|
|
132
|
+
prd_path = "./docs/sample.prdx"
|
|
133
|
+
|
|
134
|
+
# 先检查文件是否存在(模拟,实际使用时需要真实文件)
|
|
135
|
+
if not os.path.exists(prd_path):
|
|
136
|
+
print(f"[提示] PRD 文件 '{prd_path' 不存在,跳过实际调用")
|
|
137
|
+
print("\n预期调用方式:")
|
|
138
|
+
print("""
|
|
139
|
+
result = await client.generate_spec(
|
|
140
|
+
prd_path="./docs/requirements.prdx",
|
|
141
|
+
template="standard",
|
|
142
|
+
output_dir="./specs"
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
if result.success:
|
|
146
|
+
print(f"规格 ID: {result.spec_id}")
|
|
147
|
+
print(f"规格路径: {result.spec_path}")
|
|
148
|
+
print(f"提取了 {result.feature_count} 个功能点:")
|
|
149
|
+
for feature in result.features[:5]:
|
|
150
|
+
print(f" - [{feature['id']}] {feature['name']}")
|
|
151
|
+
|
|
152
|
+
if result.warnings:
|
|
153
|
+
print(f"\n警告 ({len(result.warnings)} 条):")
|
|
154
|
+
for w in result.warnings:
|
|
155
|
+
print(f" ! {w}")
|
|
156
|
+
""")
|
|
157
|
+
return None
|
|
158
|
+
|
|
159
|
+
try:
|
|
160
|
+
result = await client.generate_spec(
|
|
161
|
+
prd_path=prd_path,
|
|
162
|
+
template="standard",
|
|
163
|
+
output_dir="./specs",
|
|
164
|
+
dry_run=False
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
print(f"生成结果: {'成功' if result.success else '失败'}")
|
|
168
|
+
print(f"规格 ID: {result.spec_id}")
|
|
169
|
+
print(f"规格路径: {result.spec_path}")
|
|
170
|
+
print(f"耗时: {format_duration(result.duration_ms)}")
|
|
171
|
+
print(f"\n功能点列表 (共 {result.feature_count} 个):")
|
|
172
|
+
|
|
173
|
+
# 格式化输出功能点表格
|
|
174
|
+
feature_rows = []
|
|
175
|
+
for f in result.features[:10]:
|
|
176
|
+
feature_rows.append({
|
|
177
|
+
"ID": f.get("id", ""),
|
|
178
|
+
"名称": f.get("name", ""),
|
|
179
|
+
"描述": f.get("description", "")[:40],
|
|
180
|
+
})
|
|
181
|
+
if feature_rows:
|
|
182
|
+
print(format_table(feature_rows))
|
|
183
|
+
|
|
184
|
+
return result
|
|
185
|
+
|
|
186
|
+
except ValidationError as e:
|
|
187
|
+
print(f"参数验证失败: {e}")
|
|
188
|
+
except PDDConnectionError as e:
|
|
189
|
+
print(f"连接失败: {e}")
|
|
190
|
+
except AuthError as e:
|
|
191
|
+
print(f"认证失败: {e}")
|
|
192
|
+
except PDDError as e:
|
|
193
|
+
print(f"PDD 错误: {e}")
|
|
194
|
+
|
|
195
|
+
return None
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
async def example_generate_code(client: PDDClient, spec_result=None):
|
|
199
|
+
"""
|
|
200
|
+
示例 4: 根据规格生成代码
|
|
201
|
+
"""
|
|
202
|
+
print_section("示例 4: 代码生成")
|
|
203
|
+
|
|
204
|
+
if not spec_result:
|
|
205
|
+
print("[提示] 跳过代码生成(无可用规格)")
|
|
206
|
+
print("\n预期调用方式:")
|
|
207
|
+
print("""
|
|
208
|
+
code_result = await client.generate_code(
|
|
209
|
+
spec_path="./specs/user-system.spec.json",
|
|
210
|
+
feature_id="F001", # 可选,不指定则生成全部
|
|
211
|
+
output_dir="./src"
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
if code_result.success:
|
|
215
|
+
print(f"功能点: {code_result.feature_id}")
|
|
216
|
+
print(f"生成文件数: {code_result.file_count}")
|
|
217
|
+
print(f"总代码行数: {code_result.lines_of_code}")
|
|
218
|
+
print(f"\n生成的文件:")
|
|
219
|
+
for f in code_result.files_generated:
|
|
220
|
+
size_str = format_bytes(f.size_bytes) if f.size_bytes else ""
|
|
221
|
+
print(f" - {f.path} ({f.lines_of_code} 行) {size_str}")
|
|
222
|
+
""")
|
|
223
|
+
return
|
|
224
|
+
|
|
225
|
+
# 对前 3 个功能点生成代码
|
|
226
|
+
features_to_generate = spec_result.features[:3]
|
|
227
|
+
|
|
228
|
+
for feature in features_to_generate:
|
|
229
|
+
feature_id = feature.get("id", "unknown")
|
|
230
|
+
feature_name = feature.get("name", "未知功能")
|
|
231
|
+
|
|
232
|
+
print(f"\n正在生成代码: [{feature_id}] {feature_name}")
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
code_result = await client.generate_code(
|
|
236
|
+
spec_path=spec_result.spec_path,
|
|
237
|
+
feature_id=feature_id,
|
|
238
|
+
output_dir=f"./src/{feature_id.lower()}",
|
|
239
|
+
dry_run=True # 仅预览模式
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
if code_result.success:
|
|
243
|
+
print(f" 状态: 成功")
|
|
244
|
+
print(f" 文件数: {code_result.file_count}")
|
|
245
|
+
print(f" 代码行数: {code_result.lines_of_code}")
|
|
246
|
+
if code_result.files_generated:
|
|
247
|
+
for f in code_result.files_generated[:5]:
|
|
248
|
+
print(f" - {f.path}")
|
|
249
|
+
else:
|
|
250
|
+
print(f" 状态: 失败")
|
|
251
|
+
if code_result.errors:
|
|
252
|
+
for err in code_result.errors:
|
|
253
|
+
print(f" 错误: {err}")
|
|
254
|
+
|
|
255
|
+
except PDDError as e:
|
|
256
|
+
print(f" 生成出错: {e}")
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
async def example_verify_feature(client: PDDClient, spec_result=None):
|
|
260
|
+
"""
|
|
261
|
+
示例 5: 功能验证
|
|
262
|
+
"""
|
|
263
|
+
print_section("示例 5: 功能验证")
|
|
264
|
+
|
|
265
|
+
if not spec_result:
|
|
266
|
+
print("[提示] 跳过验证(无可用规格)")
|
|
267
|
+
print("\n预期调用方式:")
|
|
268
|
+
print("""
|
|
269
|
+
verify_result = await client.verify_feature(
|
|
270
|
+
spec_path="./specs/user-system.spec.json",
|
|
271
|
+
source_dir="./src",
|
|
272
|
+
format="json"
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
print(f"验证结果: {'通过' if verify_result.success else '未通过'}")
|
|
276
|
+
print(f"覆盖率: {verify_result.coverage_percent:.1f}%")
|
|
277
|
+
print(f"通过标准: {len(verify_result.criteria_passed)} / {verify_result.total_criteria}")
|
|
278
|
+
|
|
279
|
+
if verify_result.issues:
|
|
280
|
+
print(f"\n发现的问题 ({len(verify_result.issues)} 个):")
|
|
281
|
+
for issue in verify_result.issues[:10]:
|
|
282
|
+
severity_icon = {"error": "[X]", "warn": "[!]", "info": "[i]"}
|
|
283
|
+
icon = severity_icon.get(issue.severity.value, "[?]")
|
|
284
|
+
print(f" {icon} {issue.file_path}:{issue.line_number or '?'} - {issue.message}")
|
|
285
|
+
""")
|
|
286
|
+
return
|
|
287
|
+
|
|
288
|
+
try:
|
|
289
|
+
verify_result = await client.verify_feature(
|
|
290
|
+
spec_path=spec_result.spec_path,
|
|
291
|
+
source_dir="./src",
|
|
292
|
+
format="json"
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
print(f"验证结果: {'通过' if verify_result.success else '未通过'}")
|
|
296
|
+
print(f"覆盖率: {verify_result.coverage_percent:.1f}%")
|
|
297
|
+
print(f"总验收标准: {verify_result.total_criteria}")
|
|
298
|
+
print(f" 通过: {len(verify_result.criteria_passed)}")
|
|
299
|
+
print(f" 未通过: {len(verify_result.criteria_failed)}")
|
|
300
|
+
|
|
301
|
+
if verify_result.summary:
|
|
302
|
+
print(f"\n摘要: {verify_result.summary}")
|
|
303
|
+
|
|
304
|
+
if verify_result.issues:
|
|
305
|
+
print(f"\n问题列表 (共 {verify_result.issue_count} 个, "
|
|
306
|
+
f"其中 {verify_result.error_count} 个严重):")
|
|
307
|
+
|
|
308
|
+
issue_rows = []
|
|
309
|
+
for issue in verify_result.issues[:15]:
|
|
310
|
+
issue_rows.append({
|
|
311
|
+
"文件": issue.file_path[-30:],
|
|
312
|
+
"行号": str(issue.line_number or "-"),
|
|
313
|
+
"级别": issue.severity.value,
|
|
314
|
+
"描述": issue.message[:50],
|
|
315
|
+
})
|
|
316
|
+
print(format_table(issue_rows))
|
|
317
|
+
|
|
318
|
+
except PDDError as e:
|
|
319
|
+
print(f"验证出错: {e}")
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
async def example_batch_operations(client: PDDClient):
|
|
323
|
+
"""
|
|
324
|
+
示例 6: 批量操作
|
|
325
|
+
"""
|
|
326
|
+
print_section("示例 6: 批量操作")
|
|
327
|
+
|
|
328
|
+
print("批量操作可以并发执行多个任务,显著提升效率。")
|
|
329
|
+
print("\n批量生成规格示例:")
|
|
330
|
+
|
|
331
|
+
batch_specs = [
|
|
332
|
+
{"prd_path": "./docs/module-a.prdx"},
|
|
333
|
+
{"prd_path": "./docs/module-b.prdx"},
|
|
334
|
+
{"prd_path": "./docs/module-c.prdx"},
|
|
335
|
+
]
|
|
336
|
+
|
|
337
|
+
print(f"""
|
|
338
|
+
# 定义批量任务列表
|
|
339
|
+
batch_specs = [
|
|
340
|
+
{{"prd_path": "./docs/module-a.prdx"}},
|
|
341
|
+
{{"prd_path": "./docs/module-b.prdx"}},
|
|
342
|
+
{{"prd_path": "./docs/module-c.prdx"}},
|
|
343
|
+
]
|
|
344
|
+
|
|
345
|
+
# 并发执行所有任务
|
|
346
|
+
results = await client.batch_generate_specs(batch_specs)
|
|
347
|
+
|
|
348
|
+
# 统计结果
|
|
349
|
+
success_count = sum(1 for r in results if r.success)
|
|
350
|
+
print(f"成功: {{success_count}}/{{len(results)}}")
|
|
351
|
+
|
|
352
|
+
for i, result in enumerate(results):
|
|
353
|
+
status = "OK" if result.success else "FAIL"
|
|
354
|
+
print(f" [{{i+1}}] {{status}} - {{result.feature_count}} 个功能点")
|
|
355
|
+
""")
|
|
356
|
+
|
|
357
|
+
print("\n批量验证示例:")
|
|
358
|
+
print("""
|
|
359
|
+
batch_features = [
|
|
360
|
+
{"spec_path": "./specs/a.spec.json", "source_dir": "./src/a"},
|
|
361
|
+
{"spec_path": "./specs/b.spec.json", "source_dir": "./src/b"},
|
|
362
|
+
]
|
|
363
|
+
|
|
364
|
+
verify_results = await client.batch_verify(batch_features)
|
|
365
|
+
""")
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
async def example_session_management(client: PDDClient):
|
|
369
|
+
"""
|
|
370
|
+
示例 7: 会话管理
|
|
371
|
+
"""
|
|
372
|
+
print_section("示例 7: 会话管理")
|
|
373
|
+
|
|
374
|
+
print("会话用于组织相关的开发任务。")
|
|
375
|
+
print("""
|
|
376
|
+
# 创建新会话
|
|
377
|
+
session = await client.create_session(name="用户模块 v2.0 开发")
|
|
378
|
+
print(f"会话 ID: {session.session_id}")
|
|
379
|
+
print(f"创建时间: {session.created_at}")
|
|
380
|
+
|
|
381
|
+
# 获取会话详情
|
|
382
|
+
session_detail = await client.get_session(session.session_id)
|
|
383
|
+
|
|
384
|
+
# 列出所有会话
|
|
385
|
+
sessions = await client.list_sessions()
|
|
386
|
+
for s in sessions:
|
|
387
|
+
print(f"- {s.name} ({s.status.value})")
|
|
388
|
+
""")
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
async def example_context_manager():
|
|
392
|
+
"""
|
|
393
|
+
示例 8: 异步上下文管理器使用
|
|
394
|
+
"""
|
|
395
|
+
print_section("示例 8: 异步上下文管理器")
|
|
396
|
+
|
|
397
|
+
print("推荐使用 async with 语法自动管理资源:")
|
|
398
|
+
print("""
|
|
399
|
+
async with PDDClient(endpoint="http://localhost:3000") as client:
|
|
400
|
+
# 在此块中使用 client
|
|
401
|
+
result = await client.generate_spec(prd_path="./docs/prd.prdx")
|
|
402
|
+
print(result.feature_count)
|
|
403
|
+
|
|
404
|
+
# 离开上下文时自动清理资源
|
|
405
|
+
""")
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
async def main():
|
|
409
|
+
"""
|
|
410
|
+
主函数:运行所有示例
|
|
411
|
+
"""
|
|
412
|
+
print("=" * 60)
|
|
413
|
+
print(" PDD Python SDK 基本用法示例")
|
|
414
|
+
print("=" * 60)
|
|
415
|
+
print()
|
|
416
|
+
print("本示例展示 SDK 的核心功能和典型用法。")
|
|
417
|
+
print("注意: 需要启动 PDD 服务端才能执行实际 API 调用。")
|
|
418
|
+
print()
|
|
419
|
+
|
|
420
|
+
# 示例 1: 客户端初始化
|
|
421
|
+
client = await example_basic_client()
|
|
422
|
+
|
|
423
|
+
# 示例 2: 事件系统
|
|
424
|
+
await example_event_system(client)
|
|
425
|
+
|
|
426
|
+
# 示例 3-5: 需要 PDD 服务端运行的核心功能
|
|
427
|
+
spec_result = await example_generate_spec(client)
|
|
428
|
+
await example_generate_code(client, spec_result)
|
|
429
|
+
await example_verify_feature(client, spec_result)
|
|
430
|
+
|
|
431
|
+
# 示例 6-8: 高级功能演示
|
|
432
|
+
await example_batch_operations(client)
|
|
433
|
+
await example_session_management(client)
|
|
434
|
+
await example_context_manager()
|
|
435
|
+
|
|
436
|
+
print_section("运行完成")
|
|
437
|
+
print("所有示例执行完毕。")
|
|
438
|
+
print()
|
|
439
|
+
print("提示:")
|
|
440
|
+
print(" - 启动 PDD 服务端后重新运行此脚本以查看完整输出")
|
|
441
|
+
print(" - 查看 README.md 了解更多高级用法")
|
|
442
|
+
print(" - 查看 client.py 了解完整的 API 文档")
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
if __name__ == "__main__":
|
|
446
|
+
# 运行主程序
|
|
447
|
+
try:
|
|
448
|
+
asyncio.run(main())
|
|
449
|
+
except KeyboardInterrupt:
|
|
450
|
+
print("\n\n用户中断,程序退出。")
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"""
|
|
2
|
+
PDD Python SDK - PRD 驱动开发工具包
|
|
3
|
+
|
|
4
|
+
一个纯标准库实现的 Python SDK,用于与 PDD (PRD-Driven Development) 服务端交互。
|
|
5
|
+
提供规格生成、代码生成、功能验证、代码审查等完整的开发工作流支持。
|
|
6
|
+
|
|
7
|
+
主要特性:
|
|
8
|
+
- 零依赖: 仅使用 Python 标准库,无需安装第三方包
|
|
9
|
+
- 异步优先: 所有核心 API 均为异步方法,基于 asyncio
|
|
10
|
+
- 类型安全: 完整的 PEP 484 类型注解
|
|
11
|
+
- 事件驱动: 内置事件系统,可监听请求生命周期
|
|
12
|
+
- 自动重试: 可配置的指数退避重试机制
|
|
13
|
+
- 内存缓存: 基于 TTL 的响应缓存
|
|
14
|
+
|
|
15
|
+
快速开始:
|
|
16
|
+
>>> import asyncio
|
|
17
|
+
>>> from pdd_sdk import PDDClient
|
|
18
|
+
>>>
|
|
19
|
+
>>> async def main():
|
|
20
|
+
... client = PDDClient(endpoint="http://localhost:3000", debug=True)
|
|
21
|
+
...
|
|
22
|
+
... # 从 PRD 生成开发规格
|
|
23
|
+
... spec = await client.generate_spec(prd_path="./docs/requirements.prdx")
|
|
24
|
+
... print(f"提取了 {spec.feature_count} 个功能点")
|
|
25
|
+
...
|
|
26
|
+
... # 根据规格生成代码
|
|
27
|
+
... for feature in spec.features[:3]:
|
|
28
|
+
... code = await client.generate_code(
|
|
29
|
+
... spec_path=spec.spec_path,
|
|
30
|
+
... feature_id=feature["id"]
|
|
31
|
+
... )
|
|
32
|
+
... print(f" 生成 {code.file_count} 个文件")
|
|
33
|
+
>>>
|
|
34
|
+
>>> asyncio.run(main())
|
|
35
|
+
|
|
36
|
+
版本: 1.0.0
|
|
37
|
+
作者: PDD Skills Team
|
|
38
|
+
许可: MIT License
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
__version__ = "1.0.0"
|
|
42
|
+
__author__ = "PDD Skills Team"
|
|
43
|
+
__license__ = "MIT"
|
|
44
|
+
|
|
45
|
+
# ==================== 主要导出 ====================
|
|
46
|
+
|
|
47
|
+
from .client import PDDClient
|
|
48
|
+
"""核心客户端类"""
|
|
49
|
+
|
|
50
|
+
from .models import (
|
|
51
|
+
# 规格相关
|
|
52
|
+
SpecResult,
|
|
53
|
+
FeatureInfo,
|
|
54
|
+
# 代码生成相关
|
|
55
|
+
CodeResult,
|
|
56
|
+
GeneratedFile,
|
|
57
|
+
# 验证相关
|
|
58
|
+
VerifyResult,
|
|
59
|
+
VerifyIssue,
|
|
60
|
+
VerifyCriterion,
|
|
61
|
+
Severity,
|
|
62
|
+
# 代码审查相关
|
|
63
|
+
ReviewResult,
|
|
64
|
+
ReviewFinding,
|
|
65
|
+
# 技能相关
|
|
66
|
+
SkillInfo,
|
|
67
|
+
# 会话相关
|
|
68
|
+
Session,
|
|
69
|
+
TaskStatus,
|
|
70
|
+
# 服务状态相关
|
|
71
|
+
StatusResult,
|
|
72
|
+
ServerInfo,
|
|
73
|
+
# 批量操作相关
|
|
74
|
+
BatchResult,
|
|
75
|
+
# 事件数据
|
|
76
|
+
EventData,
|
|
77
|
+
)
|
|
78
|
+
"""所有数据模型类"""
|
|
79
|
+
|
|
80
|
+
from .exceptions import (
|
|
81
|
+
PDDError,
|
|
82
|
+
ConnectionError as PDDConnectionError,
|
|
83
|
+
AuthError,
|
|
84
|
+
ValidationError,
|
|
85
|
+
ServerError,
|
|
86
|
+
TimeoutError as PDDTimeoutError,
|
|
87
|
+
RateLimitError,
|
|
88
|
+
)
|
|
89
|
+
"""异常类体系(注意: ConnectionError 和 TimeoutError 加了前缀避免与内置冲突)"""
|
|
90
|
+
|
|
91
|
+
from .events import (
|
|
92
|
+
EventEmitter,
|
|
93
|
+
Events,
|
|
94
|
+
EventHandler,
|
|
95
|
+
event_handler,
|
|
96
|
+
)
|
|
97
|
+
"""事件系统组件"""
|
|
98
|
+
|
|
99
|
+
from .utils import (
|
|
100
|
+
get_logger,
|
|
101
|
+
retry,
|
|
102
|
+
cache,
|
|
103
|
+
format_table,
|
|
104
|
+
format_json,
|
|
105
|
+
format_duration,
|
|
106
|
+
format_bytes,
|
|
107
|
+
MemoryCache,
|
|
108
|
+
validate_endpoint,
|
|
109
|
+
validate_api_key,
|
|
110
|
+
)
|
|
111
|
+
"""工具函数和装饰器"""
|
|
112
|
+
|
|
113
|
+
# ==================== 公共 API 列表 ====================
|
|
114
|
+
|
|
115
|
+
__all__ = [
|
|
116
|
+
# 核心客户端
|
|
117
|
+
"PDDClient",
|
|
118
|
+
|
|
119
|
+
# 数据模型 - 规格
|
|
120
|
+
"SpecResult",
|
|
121
|
+
"FeatureInfo",
|
|
122
|
+
|
|
123
|
+
# 数据模型 - 代码
|
|
124
|
+
"CodeResult",
|
|
125
|
+
"GeneratedFile",
|
|
126
|
+
|
|
127
|
+
# 数据模型 - 验证
|
|
128
|
+
"VerifyResult",
|
|
129
|
+
"VerifyIssue",
|
|
130
|
+
"VerifyCriterion",
|
|
131
|
+
"Severity",
|
|
132
|
+
|
|
133
|
+
# 数据模型 - 审查
|
|
134
|
+
"ReviewResult",
|
|
135
|
+
"ReviewFinding",
|
|
136
|
+
|
|
137
|
+
# 数据模型 - 技能
|
|
138
|
+
"SkillInfo",
|
|
139
|
+
|
|
140
|
+
# 数据模型 - 会话
|
|
141
|
+
"Session",
|
|
142
|
+
"TaskStatus",
|
|
143
|
+
|
|
144
|
+
# 数据模型 - 状态
|
|
145
|
+
"StatusResult",
|
|
146
|
+
"ServerInfo",
|
|
147
|
+
|
|
148
|
+
# 数据模型 - 批量
|
|
149
|
+
"BatchResult",
|
|
150
|
+
|
|
151
|
+
# 数据模型 - 事件
|
|
152
|
+
"EventData",
|
|
153
|
+
|
|
154
|
+
# 异常
|
|
155
|
+
"PDDError",
|
|
156
|
+
"PDDConnectionError",
|
|
157
|
+
"AuthError",
|
|
158
|
+
"ValidationError",
|
|
159
|
+
"ServerError",
|
|
160
|
+
"PDDTimeoutError",
|
|
161
|
+
"RateLimitError",
|
|
162
|
+
|
|
163
|
+
# 事件系统
|
|
164
|
+
"EventEmitter",
|
|
165
|
+
"Events",
|
|
166
|
+
"EventHandler",
|
|
167
|
+
"event_handler",
|
|
168
|
+
|
|
169
|
+
# 工具函数
|
|
170
|
+
"get_logger",
|
|
171
|
+
"retry",
|
|
172
|
+
"cache",
|
|
173
|
+
"format_table",
|
|
174
|
+
"format_json",
|
|
175
|
+
"format_duration",
|
|
176
|
+
"format_bytes",
|
|
177
|
+
"MemoryCache",
|
|
178
|
+
"validate_endpoint",
|
|
179
|
+
"validate_api_key",
|
|
180
|
+
]
|