sdd-full 3.2.0 → 4.2.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/bin.js +63 -31
- package/package.json +1 -1
- package/skills/brainstorming/SKILL.md +164 -0
- package/skills/brainstorming/scripts/frame-template.html +214 -0
- package/skills/brainstorming/scripts/helper.js +88 -0
- package/skills/brainstorming/scripts/server.cjs +338 -0
- package/skills/brainstorming/scripts/start-server.sh +153 -0
- package/skills/brainstorming/scripts/stop-server.sh +55 -0
- package/skills/brainstorming/spec-document-reviewer-prompt.md +48 -0
- package/skills/brainstorming/visual-companion.md +286 -0
- package/skills/chinese-code-review/SKILL.md +277 -0
- package/skills/chinese-commit-conventions/SKILL.md +364 -0
- package/skills/chinese-documentation/SKILL.md +448 -0
- package/skills/chinese-git-workflow/SKILL.md +510 -0
- package/skills/design-planning/enterprise-spec/SKILL.md +3 -52
- package/skills/design-planning/flutter-av/SKILL.md +34 -44
- package/skills/design-planning/flutter-map/SKILL.md +31 -41
- package/skills/design-planning/ui-sdd-specialized/SKILL.md +40 -46
- package/skills/development-execution/flutter-errors/SKILL.md +34 -44
- package/skills/dispatching-parallel-agents/SKILL.md +182 -0
- package/skills/executing-plans/SKILL.md +175 -0
- package/skills/finishing-a-development-branch/SKILL.md +200 -0
- package/skills/mcp-builder/SKILL.md +255 -0
- package/skills/quality-assurance/bdd-acceptance/SKILL.md +37 -44
- package/skills/receiving-code-review/SKILL.md +213 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +146 -0
- package/skills/requirement-analysis/sdd-full/SKILL.md +36 -717
- package/skills/requirement-analysis/unified-flow/SKILL.md +26 -128
- package/skills/rules/skill-map.md +97 -0
- package/skills/rules/user_rules.md +69 -223
- package/skills/special-tools/env-check/SKILL.md +34 -40
- package/skills/subagent-driven-development/SKILL.md +277 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +113 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/skills/systematic-debugging/SKILL.md +296 -0
- package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/skills/systematic-debugging/find-polluter.sh +63 -0
- package/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/skills/systematic-debugging/test-academic.md +14 -0
- package/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/skills/test-driven-development/SKILL.md +371 -0
- package/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/using-git-worktrees/SKILL.md +218 -0
- package/skills/using-superpowers/SKILL.md +134 -0
- package/skills/using-superpowers/references/codex-tools.md +25 -0
- package/skills/using-superpowers/references/gemini-tools.md +33 -0
- package/skills/verification-before-completion/SKILL.md +139 -0
- package/skills/workflow-runner/SKILL.md +172 -0
- package/skills/writing-plans/SKILL.md +152 -0
- package/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/skills/writing-skills/SKILL.md +654 -0
- package/skills/writing-skills/anthropic-best-practices.md +1149 -0
- package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/writing-skills/persuasion-principles.md +187 -0
- package/skills/writing-skills/render-graphs.js +168 -0
- package/skills/writing-skills/testing-skills-with-subagents.md +384 -0
- package/skills/README.md +0 -97
- package/skills/call-adaptation/SKILL.md +0 -23
- package/skills/call-adaptation/call-adaptation-guide.md +0 -136
- package/skills/call-adaptation/claude-code-call-spec.md +0 -50
- package/skills/call-adaptation/trae-call-spec.md +0 -56
- package/skills/checklist.md +0 -154
- package/skills/design-planning/ai-coding-rules/SKILL.md +0 -52
- package/skills/design-planning/design-to-code/SKILL.md +0 -53
- package/skills/design-planning/function-sdd/SKILL.md +0 -54
- package/skills/design-planning/sdd-code/SKILL.md +0 -347
- package/skills/design-planning/sdd-deploy/SKILL.md +0 -501
- package/skills/design-planning/sdd-ops/SKILL.md +0 -306
- package/skills/design-planning/sdd-test/SKILL.md +0 -383
- package/skills/design-planning/ui-sdd/SKILL.md +0 -291
- package/skills/design-planning/writing-plans/SKILL.md +0 -144
- package/skills/development-execution/sdd-add/SKILL.md +0 -540
- package/skills/development-execution/systematic-debugging/SKILL.md +0 -298
- package/skills/development-execution/test-driven-development/SKILL.md +0 -373
- package/skills/development-execution/verification-before-completion/SKILL.md +0 -141
- package/skills/knowledge-precipitation/claudeception/SKILL.md +0 -96
- package/skills/knowledge-precipitation/mempalace-auto-saver/SKILL.md +0 -302
- package/skills/quality-assurance/flutter-test/SKILL.md +0 -56
- package/skills/quality-assurance/quality-gate/SKILL.md +0 -350
- package/skills/quality-assurance/security-audit/SKILL.md +0 -386
- package/skills/release-ops/finishing-a-development-branch/SKILL.md +0 -202
- package/skills/release-ops/release-flow/SKILL.md +0 -404
- package/skills/requirement-analysis/brainstorming/SKILL.md +0 -166
- package/skills/requirement-analysis/competitive-brief/SKILL.md +0 -121
- package/skills/requirement-analysis/market-research/SKILL.md +0 -143
- package/skills/requirement-analysis/prd-write/SKILL.md +0 -111
- package/skills/requirement-analysis/requirement-completion-officer/SKILL.md +0 -124
- package/skills/requirement-analysis/sdd/SKILL.md +0 -1044
- package/skills/rules/project_rules.md +0 -167
- package/skills/sdd-framework/SKILL.md +0 -90
- package/skills/special-tools/receiving-code-review/SKILL.md +0 -215
- package/skills/special-tools/requesting-code-review/SKILL.md +0 -107
- package/skills/special-tools/using-superpowers/SKILL.md +0 -117
- package/skills/templates/API-SDD.md +0 -31
- package/skills/templates/Andrej Karpathy AI/347/274/226/347/240/201/350/247/204/345/210/231/350/220/275/345/234/260SDD.md" +0 -117
- package/skills/templates/BDD/351/243/216/346/240/274/351/252/214/346/224/266/346/240/207/345/207/206SDD.md +0 -147
- package/skills/templates/Base-SDD.md +0 -38
- package/skills/templates/Brain-SDD.md +0 -36
- package/skills/templates/Code-SDD.md +0 -41
- package/skills/templates/Competitor-SDD.md +0 -34
- package/skills/templates/Env-SDD.md +0 -37
- package/skills/templates/Flutter/345/205/250/347/261/273/345/236/213/346/265/213/350/257/225/347/255/226/347/225/245SDD.md +0 -162
- package/skills/templates/Flutter/345/234/260/345/233/276/345/257/274/350/210/252/344/270/232/345/212/241SDD.md +0 -136
- package/skills/templates/Flutter/345/270/270/350/247/201/345/274/202/345/270/270/344/270/223/351/241/271SDD.md +0 -159
- package/skills/templates/Flutter/351/237/263/350/247/206/351/242/221/345/205/250/346/240/210SDD.md +0 -121
- package/skills/templates/PRD-SDD.md +0 -45
- package/skills/templates/SKILL.md +0 -29
- package/skills/templates/Test-SDD.md +0 -34
- package/skills/templates/UI-SDD.md +0 -38
- package/skills/templates/UI-SDD/344/270/223/347/224/250/346/250/241/346/235/277.md +0 -141
- package/skills/templates/UI/350/265/204/346/272/220/346/217/220/347/244/272/350/257/215/347/224/237/346/210/220SDD.md +0 -67
- package/skills/templates//344/274/201/344/270/232/347/272/247/345/205/250/346/240/210/345/267/245/347/250/213/350/247/204/350/214/203SDD.md +0 -152
- package/skills/templates//345/212/237/350/203/275SDD/344/270/223/347/224/250/346/250/241/346/235/277.md +0 -132
- package/skills/templates//347/216/257/345/242/203/351/242/204/346/243/200/346/240/207/345/207/206/345/214/226SDD.md +0 -153
- package/skills/templates//351/253/230/344/277/235/347/234/237/350/256/276/350/256/241/350/275/254/344/273/243/347/240/201SDD.md +0 -119
- package/skills//345/256/214/346/225/264/345/274/200/345/217/221/346/265/201/347/250/213/346/211/213/345/206/214.md +0 -408
- package/skills//346/212/200/350/203/275/344/275/223/347/263/273/345/256/214/345/226/204/345/273/272/350/256/256.md +0 -305
- package/skills//346/212/200/350/203/275/344/275/277/347/224/250/346/214/207/345/215/227.md +0 -265
- package/skills//346/212/200/350/203/275/345/206/263/347/255/226/346/240/221.md +0 -294
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: finishing-a-development-branch
|
|
3
|
+
description: 当实现完成、所有测试通过、需要决定如何集成工作时使用——通过提供合并、PR 或清理等结构化选项来引导开发工作的收尾
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 完成开发分支
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
|
|
10
|
+
通过提供清晰的选项并执行所选工作流来引导开发工作的收尾。
|
|
11
|
+
|
|
12
|
+
**核心原则:** 验证测试 → 展示选项 → 执行选择 → 清理。
|
|
13
|
+
|
|
14
|
+
**开始时宣布:** "我正在使用 finishing-a-development-branch 技能来完成这项工作。"
|
|
15
|
+
|
|
16
|
+
## 流程
|
|
17
|
+
|
|
18
|
+
### 步骤 1:验证测试
|
|
19
|
+
|
|
20
|
+
**在展示选项之前,验证测试通过:**
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# 运行项目的测试套件
|
|
24
|
+
npm test / cargo test / pytest / go test ./...
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**如果测试失败:**
|
|
28
|
+
```
|
|
29
|
+
测试失败(<N> 个失败)。必须先修复才能继续:
|
|
30
|
+
|
|
31
|
+
[显示失败信息]
|
|
32
|
+
|
|
33
|
+
在测试通过之前无法进行合并/PR。
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
停止。不要继续到步骤 2。
|
|
37
|
+
|
|
38
|
+
**如果测试通过:** 继续步骤 2。
|
|
39
|
+
|
|
40
|
+
### 步骤 2:确定基础分支
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# 尝试常见的基础分支
|
|
44
|
+
git merge-base HEAD main 2>/dev/null || git merge-base HEAD master 2>/dev/null
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
或者询问:"这个分支是从 main 分出来的——对吗?"
|
|
48
|
+
|
|
49
|
+
### 步骤 3:展示选项
|
|
50
|
+
|
|
51
|
+
展示以下 4 个选项:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
实现已完成。你想怎么做?
|
|
55
|
+
|
|
56
|
+
1. 在本地合并回 <base-branch>
|
|
57
|
+
2. 推送并创建 Pull Request
|
|
58
|
+
3. 保持分支现状(我稍后处理)
|
|
59
|
+
4. 丢弃这项工作
|
|
60
|
+
|
|
61
|
+
选哪个?
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**不要添加解释** - 保持选项简洁。
|
|
65
|
+
|
|
66
|
+
### 步骤 4:执行选择
|
|
67
|
+
|
|
68
|
+
#### 选项 1:本地合并
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# 切换到基础分支
|
|
72
|
+
git checkout <base-branch>
|
|
73
|
+
|
|
74
|
+
# 拉取最新代码
|
|
75
|
+
git pull
|
|
76
|
+
|
|
77
|
+
# 合并功能分支
|
|
78
|
+
git merge <feature-branch>
|
|
79
|
+
|
|
80
|
+
# 在合并结果上验证测试
|
|
81
|
+
<test command>
|
|
82
|
+
|
|
83
|
+
# 如果测试通过
|
|
84
|
+
git branch -d <feature-branch>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
然后:清理工作树(步骤 5)
|
|
88
|
+
|
|
89
|
+
#### 选项 2:推送并创建 PR
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# 推送分支
|
|
93
|
+
git push -u origin <feature-branch>
|
|
94
|
+
|
|
95
|
+
# 创建 PR
|
|
96
|
+
gh pr create --title "<title>" --body "$(cat <<'EOF'
|
|
97
|
+
## 摘要
|
|
98
|
+
<2-3 条变更要点>
|
|
99
|
+
|
|
100
|
+
## 测试计划
|
|
101
|
+
- [ ] <验证步骤>
|
|
102
|
+
EOF
|
|
103
|
+
)"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
然后:清理工作树(步骤 5)
|
|
107
|
+
|
|
108
|
+
#### 选项 3:保持现状
|
|
109
|
+
|
|
110
|
+
报告:"保留分支 <name>。工作树保留在 <path>。"
|
|
111
|
+
|
|
112
|
+
**不要清理工作树。**
|
|
113
|
+
|
|
114
|
+
#### 选项 4:丢弃
|
|
115
|
+
|
|
116
|
+
**先确认:**
|
|
117
|
+
```
|
|
118
|
+
这将永久删除:
|
|
119
|
+
- 分支 <name>
|
|
120
|
+
- 所有提交:<commit-list>
|
|
121
|
+
- 工作树 <path>
|
|
122
|
+
|
|
123
|
+
输入 'discard' 确认。
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
等待精确的确认。
|
|
127
|
+
|
|
128
|
+
确认后:
|
|
129
|
+
```bash
|
|
130
|
+
git checkout <base-branch>
|
|
131
|
+
git branch -D <feature-branch>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
然后:清理工作树(步骤 5)
|
|
135
|
+
|
|
136
|
+
### 步骤 5:清理工作树
|
|
137
|
+
|
|
138
|
+
**对于选项 1、2、4:**
|
|
139
|
+
|
|
140
|
+
检查是否在工作树中:
|
|
141
|
+
```bash
|
|
142
|
+
git worktree list | grep $(git branch --show-current)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
如果是:
|
|
146
|
+
```bash
|
|
147
|
+
git worktree remove <worktree-path>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**对于选项 3:** 保留工作树。
|
|
151
|
+
|
|
152
|
+
## 快速参考
|
|
153
|
+
|
|
154
|
+
| 选项 | 合并 | 推送 | 保留工作树 | 清理分支 |
|
|
155
|
+
|------|------|------|-----------|---------|
|
|
156
|
+
| 1. 本地合并 | ✓ | - | - | ✓ |
|
|
157
|
+
| 2. 创建 PR | - | ✓ | ✓ | - |
|
|
158
|
+
| 3. 保持现状 | - | - | ✓ | - |
|
|
159
|
+
| 4. 丢弃 | - | - | - | ✓(强制) |
|
|
160
|
+
|
|
161
|
+
## 常见错误
|
|
162
|
+
|
|
163
|
+
**跳过测试验证**
|
|
164
|
+
- **问题:** 合并损坏的代码、创建失败的 PR
|
|
165
|
+
- **修复:** 在提供选项前始终验证测试
|
|
166
|
+
|
|
167
|
+
**开放式问题**
|
|
168
|
+
- **问题:** "接下来该做什么?" → 含糊不清
|
|
169
|
+
- **修复:** 准确展示 4 个结构化选项
|
|
170
|
+
|
|
171
|
+
**自动清理工作树**
|
|
172
|
+
- **问题:** 在可能还需要工作树时就删除了(选项 2、3)
|
|
173
|
+
- **修复:** 只在选项 1 和 4 时清理
|
|
174
|
+
|
|
175
|
+
**丢弃时不确认**
|
|
176
|
+
- **问题:** 意外删除工作成果
|
|
177
|
+
- **修复:** 要求输入 "discard" 确认
|
|
178
|
+
|
|
179
|
+
## 红线
|
|
180
|
+
|
|
181
|
+
**绝不:**
|
|
182
|
+
- 在测试失败时继续
|
|
183
|
+
- 合并前不验证测试结果
|
|
184
|
+
- 不确认就删除工作成果
|
|
185
|
+
- 未经明确请求就强制推送
|
|
186
|
+
|
|
187
|
+
**始终:**
|
|
188
|
+
- 在提供选项前验证测试
|
|
189
|
+
- 准确展示 4 个选项
|
|
190
|
+
- 选项 4 要求输入确认
|
|
191
|
+
- 只在选项 1 和 4 时清理工作树
|
|
192
|
+
|
|
193
|
+
## 集成
|
|
194
|
+
|
|
195
|
+
**被以下技能调用:**
|
|
196
|
+
- **subagent-driven-development**(步骤 7)- 所有任务完成后
|
|
197
|
+
- **executing-plans**(步骤 5)- 所有批次完成后
|
|
198
|
+
|
|
199
|
+
**配合使用:**
|
|
200
|
+
- **using-git-worktrees** - 清理由该技能创建的工作树
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mcp-builder
|
|
3
|
+
description: MCP 服务器构建方法论 — 系统化构建生产级 MCP 工具,让 AI 助手连接外部能力
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# MCP 服务器构建
|
|
7
|
+
|
|
8
|
+
系统化设计、实现、测试和部署 Model Context Protocol 服务器的方法论。
|
|
9
|
+
|
|
10
|
+
## 1. 协议核心概念
|
|
11
|
+
|
|
12
|
+
MCP 定义三种原语:
|
|
13
|
+
|
|
14
|
+
- **Tools(工具)**:AI 助手主动调用的函数,有副作用。如搜索、创建、删除操作。
|
|
15
|
+
- **Resources(资源)**:AI 助手只读访问的数据源,用 URI 标识。如 `users://{id}/profile`。
|
|
16
|
+
- **Prompts(提示词模板)**:预定义交互模板,引导用户触发工作流。
|
|
17
|
+
|
|
18
|
+
**选择原则:** 执行操作 → Tool | 读取数据 → Resource | 引导交互 → Prompt
|
|
19
|
+
|
|
20
|
+
## 2. 项目结构规范
|
|
21
|
+
|
|
22
|
+
### TypeScript
|
|
23
|
+
```
|
|
24
|
+
my-mcp-server/
|
|
25
|
+
├── src/
|
|
26
|
+
│ ├── index.ts # 入口,注册 tools/resources
|
|
27
|
+
│ ├── tools/ # 按功能拆分
|
|
28
|
+
│ ├── resources/
|
|
29
|
+
│ └── lib/ # 客户端封装、校验逻辑
|
|
30
|
+
├── tests/
|
|
31
|
+
├── package.json
|
|
32
|
+
└── tsconfig.json
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
关键依赖:`@modelcontextprotocol/sdk` + `zod`
|
|
36
|
+
|
|
37
|
+
### Python
|
|
38
|
+
```
|
|
39
|
+
my-mcp-server/
|
|
40
|
+
├── src/my_mcp_server/
|
|
41
|
+
│ ├── server.py
|
|
42
|
+
│ ├── tools/
|
|
43
|
+
│ └── lib/
|
|
44
|
+
├── tests/
|
|
45
|
+
└── pyproject.toml
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
关键依赖:`mcp` + `pydantic`
|
|
49
|
+
|
|
50
|
+
## 3. Tool 设计原则
|
|
51
|
+
|
|
52
|
+
### 命名
|
|
53
|
+
- `snake_case` 格式,动词开头:`search_users`、`create_issue`、`delete_file`
|
|
54
|
+
- 名称自解释,AI 助手靠名称选工具,模糊命名导致误调用
|
|
55
|
+
|
|
56
|
+
### 参数
|
|
57
|
+
- 每个参数有类型约束和 `.describe()` 描述
|
|
58
|
+
- 可选参数给默认值,减少 AI 决策负担
|
|
59
|
+
- 用枚举代替布尔开关
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
server.tool("search_issues", {
|
|
63
|
+
query: z.string().describe("搜索关键词"),
|
|
64
|
+
status: z.enum(["open", "closed", "all"]).default("open").describe("状态筛选"),
|
|
65
|
+
limit: z.number().min(1).max(100).default(20).describe("返回上限"),
|
|
66
|
+
}, async ({ query, status, limit }) => { /* ... */ });
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 描述
|
|
70
|
+
说明**用途 + 返回内容 + 限制**,这是 AI 选择工具的关键依据:
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
server.tool("search_users",
|
|
74
|
+
"根据姓名或邮箱搜索用户。返回 ID、姓名、邮箱列表。模糊匹配,最多 50 条。",
|
|
75
|
+
schema, handler);
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 输出
|
|
79
|
+
- 结构化数据 → JSON,人类可读内容 → Markdown
|
|
80
|
+
- 始终用 `content: [{ type: "text", text: "..." }]` 格式返回
|
|
81
|
+
|
|
82
|
+
## 4. 输入验证和错误处理
|
|
83
|
+
|
|
84
|
+
用 Zod/Pydantic 做 Schema 级校验,业务级校验放 handler 开头:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
server.tool("get_user", { id: z.string() }, async ({ id }) => {
|
|
88
|
+
try {
|
|
89
|
+
const user = await db.getUser(id);
|
|
90
|
+
if (!user) {
|
|
91
|
+
return {
|
|
92
|
+
content: [{ type: "text", text: `用户 ${id} 不存在,请检查 ID。` }],
|
|
93
|
+
isError: true,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return { content: [{ type: "text", text: JSON.stringify(user, null, 2) }] };
|
|
97
|
+
} catch (err) {
|
|
98
|
+
return {
|
|
99
|
+
content: [{ type: "text", text: `查询失败:${err.message}` }],
|
|
100
|
+
isError: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**错误处理四原则:**
|
|
107
|
+
1. 永远不让服务器崩溃 — try/catch 包裹所有外部调用
|
|
108
|
+
2. 返回可操作的错误信息 — 告诉 AI 问题是什么、能做什么
|
|
109
|
+
3. 使用 `isError: true` — 让 AI 知道调用失败
|
|
110
|
+
4. 区分错误类型 — 参数错误、权限不足、资源不存在、服务不可用
|
|
111
|
+
|
|
112
|
+
## 5. 资源管理和生命周期
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// 资源注册
|
|
116
|
+
server.resource("user-profile", "users://{userId}/profile", async (uri) => {
|
|
117
|
+
const profile = await db.getProfile(extractId(uri));
|
|
118
|
+
return { contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(profile) }] };
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// 生命周期:先初始化 → 再 connect → 监听关闭信号
|
|
122
|
+
const db = await Database.connect(config.dbUrl);
|
|
123
|
+
await server.connect(new StdioServerTransport());
|
|
124
|
+
process.on("SIGINT", async () => { await db.disconnect(); await server.close(); process.exit(0); });
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
关键点:使用连接池、所有外部调用设超时、优雅关闭清理资源。
|
|
128
|
+
|
|
129
|
+
## 6. 测试策略
|
|
130
|
+
|
|
131
|
+
### 单元测试 — 业务逻辑与 MCP 注册分离
|
|
132
|
+
```typescript
|
|
133
|
+
// tools/search.ts 导出纯函数
|
|
134
|
+
export async function searchUsers(query: string, limit: number) { /* ... */ }
|
|
135
|
+
|
|
136
|
+
// search.test.ts 独立测试
|
|
137
|
+
test("返回匹配结果", async () => {
|
|
138
|
+
const results = await searchUsers("alice", 10);
|
|
139
|
+
expect(results[0].name).toContain("Alice");
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 集成测试 — 用 SDK Client 做端到端验证
|
|
144
|
+
```typescript
|
|
145
|
+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
146
|
+
await server.connect(serverTransport);
|
|
147
|
+
const client = new Client({ name: "test", version: "1.0.0" });
|
|
148
|
+
await client.connect(clientTransport);
|
|
149
|
+
const result = await client.callTool("search_users", { query: "test" });
|
|
150
|
+
expect(result.isError).toBeFalsy();
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### MCP Inspector — 交互式调试
|
|
154
|
+
```bash
|
|
155
|
+
npx @modelcontextprotocol/inspector node dist/index.js
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
在浏览器中查看所有 tools/resources,手动调用并查看结果。
|
|
159
|
+
|
|
160
|
+
**测试要点:** 每个 Tool 覆盖正常 + 异常路径、边界值、外部服务失败模拟。
|
|
161
|
+
|
|
162
|
+
## 7. 安全考虑
|
|
163
|
+
|
|
164
|
+
**权限控制:**
|
|
165
|
+
- 最小权限原则,读写 Tool 分离
|
|
166
|
+
- 危险操作要求确认参数(如 `confirm: true`)
|
|
167
|
+
|
|
168
|
+
**输入安全:**
|
|
169
|
+
- SQL 注入 → 参数化查询,绝不拼接
|
|
170
|
+
- 路径遍历 → 校验路径,禁止 `../`
|
|
171
|
+
- 命令注入 → 用 `execFile` 而非 `exec`
|
|
172
|
+
|
|
173
|
+
**敏感数据:**
|
|
174
|
+
- 密钥通过环境变量传入,不硬编码
|
|
175
|
+
- 日志不打印完整敏感信息
|
|
176
|
+
- 返回数据做脱敏处理
|
|
177
|
+
|
|
178
|
+
**沙箱:** 文件操作限制目录、网络请求限制白名单、设置资源配额。
|
|
179
|
+
|
|
180
|
+
## 8. 部署和分发
|
|
181
|
+
|
|
182
|
+
### npm 发布
|
|
183
|
+
```json
|
|
184
|
+
{ "bin": { "mcp-server-myservice": "dist/index.js" }, "files": ["dist"] }
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
用户配置:
|
|
188
|
+
```json
|
|
189
|
+
{ "mcpServers": { "myservice": { "command": "npx", "args": ["@yourorg/mcp-server-myservice"], "env": { "API_KEY": "xxx" } } } }
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### pip 发布
|
|
193
|
+
```toml
|
|
194
|
+
[project.scripts]
|
|
195
|
+
mcp-server-myservice = "my_mcp_server.server:main"
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Docker — 适用于复杂依赖或隔离场景
|
|
199
|
+
```dockerfile
|
|
200
|
+
FROM node:20-slim
|
|
201
|
+
WORKDIR /app
|
|
202
|
+
COPY package*.json ./ && RUN npm ci --production
|
|
203
|
+
COPY dist ./dist
|
|
204
|
+
ENTRYPOINT ["node", "dist/index.js"]
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## 9. 调试技巧
|
|
208
|
+
|
|
209
|
+
**关键:MCP 用 stdio 通信,不能用 `console.log`,会破坏协议流。**
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
// 错误
|
|
213
|
+
console.log("debug");
|
|
214
|
+
// 正确
|
|
215
|
+
console.error("[DEBUG]", info);
|
|
216
|
+
// 更好
|
|
217
|
+
server.sendLoggingMessage({ level: "info", data: "处理中" });
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**常见问题:**
|
|
221
|
+
|
|
222
|
+
| 症状 | 原因 | 解决 |
|
|
223
|
+
|------|------|------|
|
|
224
|
+
| 启动无响应 | transport 未连接 | 检查 `server.connect()` |
|
|
225
|
+
| Tool 不出现 | 注册在 connect 之后 | 先注册再 connect |
|
|
226
|
+
| AI 不调用 Tool | 描述不清晰 | 改善名称和描述 |
|
|
227
|
+
| 参数总错 | Schema 不明确 | 添加 `.describe()` |
|
|
228
|
+
| 调用超时 | 外部服务慢 | 加超时和缓存 |
|
|
229
|
+
|
|
230
|
+
**调试流程:** Inspector 验证基本功能 → 手动调用确认输入输出 → 连接真实 AI 客户端观察调用模式 → 根据实际行为调整设计。
|
|
231
|
+
|
|
232
|
+
## 10. 构建检查清单
|
|
233
|
+
|
|
234
|
+
### 设计
|
|
235
|
+
- [ ] 明确 Tools vs Resources vs Prompts 分工
|
|
236
|
+
- [ ] Tool 命名 `动词_名词`,描述说明用途和返回内容
|
|
237
|
+
- [ ] 参数简洁,可选参数有合理默认值
|
|
238
|
+
|
|
239
|
+
### 实现
|
|
240
|
+
- [ ] 输入用 Zod/Pydantic 校验
|
|
241
|
+
- [ ] 外部调用有 try/catch 和超时
|
|
242
|
+
- [ ] 错误返回 `isError: true` 并附可操作信息
|
|
243
|
+
- [ ] 不用 `console.log`(用 stderr 或 SDK 日志)
|
|
244
|
+
- [ ] 敏感数据走环境变量
|
|
245
|
+
|
|
246
|
+
### 测试
|
|
247
|
+
- [ ] 核心逻辑有单元测试
|
|
248
|
+
- [ ] 有集成测试验证 MCP 协议交互
|
|
249
|
+
- [ ] 用 MCP Inspector 手动验证过
|
|
250
|
+
- [ ] 用真实 AI 客户端测试过
|
|
251
|
+
|
|
252
|
+
### 部署
|
|
253
|
+
- [ ] README 含安装和配置说明
|
|
254
|
+
- [ ] 提供客户端配置 JSON 示例
|
|
255
|
+
- [ ] 遵循 semver,无硬编码密钥
|
|
@@ -1,56 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
description: BDD验收句式、场景写法、准入/准出标准
|
|
3
|
-
author:
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
trigger:
|
|
6
|
-
- BDD验收标准
|
|
7
|
-
- BDD测试
|
|
8
|
-
- 验收规范
|
|
9
|
-
tags:
|
|
10
|
-
- BDD
|
|
11
|
-
- 测试
|
|
12
|
-
- 验收标准
|
|
13
|
-
- SDD模板
|
|
1
|
+
# bdd-acceptance - BDD风格验收标准
|
|
14
2
|
|
|
15
|
-
|
|
3
|
+
## 功能说明
|
|
16
4
|
|
|
17
|
-
|
|
5
|
+
所有需求配套BDD验收句式、场景写法、准入/准出标准的专用技能。
|
|
18
6
|
|
|
19
|
-
|
|
7
|
+
## 触发词
|
|
20
8
|
|
|
21
|
-
|
|
9
|
+
`BDD`、`验收标准`、`行为驱动`、`测试用例`
|
|
10
|
+
|
|
11
|
+
## 参数说明
|
|
12
|
+
|
|
13
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
14
|
+
|--------|------|------|------|
|
|
15
|
+
| requirement_name | string | 是 | 需求名称 |
|
|
16
|
+
| module | string | 否 | 所属模块 |
|
|
17
|
+
|
|
18
|
+
## BDD句式结构
|
|
19
|
+
|
|
20
|
+
### Given-When-Then 格式
|
|
22
21
|
|
|
23
|
-
### Claude Code调用
|
|
24
22
|
```
|
|
25
|
-
|
|
23
|
+
场景: [场景名称]
|
|
24
|
+
Given [前置条件]
|
|
25
|
+
And [额外条件]
|
|
26
|
+
When [用户操作]
|
|
27
|
+
And [后续操作]
|
|
28
|
+
Then [预期结果]
|
|
29
|
+
And [额外验证]
|
|
26
30
|
```
|
|
27
31
|
|
|
28
|
-
###
|
|
32
|
+
### 验收标准
|
|
33
|
+
|
|
34
|
+
| 阶段 | 准入条件 | 准出条件 |
|
|
35
|
+
|------|----------|----------|
|
|
36
|
+
| 开发 | 需求明确、设计完成 | 代码提交、单元测试通过 |
|
|
37
|
+
| 测试 | 开发完成、代码审查通过 | 功能测试通过、无阻塞Bug |
|
|
38
|
+
| 上线 | 测试通过、文档齐全 | 灰度发布成功、监控正常 |
|
|
39
|
+
|
|
40
|
+
## 使用示例
|
|
41
|
+
|
|
29
42
|
```
|
|
30
|
-
trae调用 BDD风格验收标准SDD 需求名称=用户登录
|
|
43
|
+
trae调用 BDD风格验收标准SDD 需求名称=用户登录
|
|
44
|
+
trae调用 BDD风格验收标准SDD 需求名称=订单支付 模块=支付系统
|
|
31
45
|
```
|
|
32
46
|
|
|
33
|
-
##
|
|
47
|
+
## 版本
|
|
34
48
|
|
|
35
|
-
|
|
36
|
-
|--------|------|------|------|
|
|
37
|
-
| 需求名称 | string | 是 | 需求名称 |
|
|
38
|
-
| Jira编号 | string | 否 | 工单编号 |
|
|
39
|
-
| 优先级 | string | 否 | P0/P1/P2 |
|
|
40
|
-
| 提出人 | string | 否 | 需求提出人 |
|
|
41
|
-
|
|
42
|
-
## 输出内容
|
|
43
|
-
|
|
44
|
-
1. 需求概述(描述、来源、优先级)
|
|
45
|
-
2. 场景定义(正常场景、异常场景、边界场景)
|
|
46
|
-
3. 验收句式(Given-When-Then格式)
|
|
47
|
-
4. 准入标准(需求澄清、设计稿、依赖确认)
|
|
48
|
-
5. 准出标准(功能验证、测试覆盖、文档完整)
|
|
49
|
-
6. 测试用例(单元、集成、E2E测试)
|
|
50
|
-
|
|
51
|
-
## 适用场景
|
|
52
|
-
|
|
53
|
-
- 需求验收
|
|
54
|
-
- 测试用例设计
|
|
55
|
-
- 质量把关
|
|
56
|
-
- Bug修复验证
|
|
49
|
+
v4.1.0
|