airail 0.1.6 → 0.1.7
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/dist/cli/add.js +31 -8
- package/dist/cli/config.js +27 -1
- package/dist/cli/init.js +1 -1
- package/dist/utils.js +11 -12
- package/package.json +1 -1
- package/src/templates/agents/bugfix-verify.md +1 -1
- package/src/templates/agents/bugfix.md +1 -1
- package/src/templates/agents/code-reviewer.md +9 -3
- package/src/templates/agents/debug.md +1 -1
- package/src/templates/agents/optimize.md +1 -1
- package/src/templates/agents/refactor.md +1 -1
- package/src/templates/commands/bugfix.md +10 -8
- package/src/templates/commands/debug.md +10 -1
- package/src/templates/commands/dev-frontend.md +12 -1
- package/src/templates/commands/dev.md +12 -1
- package/src/templates/commands/gen-pytest.md +147 -0
- package/src/templates/commands/gen-testcase.md +128 -0
- package/src/templates/commands/optimize.md +5 -4
- package/src/templates/commands/refactor.md +5 -5
- package/src/templates/skills/skill-add/SKILL.md +1 -1
- package/src/templates/agents/project-manager.md +0 -45
- package/src/templates/skills/code-quality/SKILL.md +0 -39
- package/src/templates/skills/code-review/SKILL.md +0 -30
- package/src/templates/skills/development-workflow/SKILL.md +0 -307
- package/src/templates/skills/error-handling/SKILL.md +0 -43
- package/src/templates/skills/performance/SKILL.md +0 -24
- package/src/templates/skills/testing/SKILL.md +0 -32
package/dist/cli/add.js
CHANGED
|
@@ -75,13 +75,6 @@ async function cmdAdd(arg) {
|
|
|
75
75
|
(0, utils_1.writeAirailJson)(claudeDir, config);
|
|
76
76
|
}
|
|
77
77
|
function readPackName(dir) {
|
|
78
|
-
const p = path.join(dir, 'pack.json');
|
|
79
|
-
if (fs.existsSync(p)) {
|
|
80
|
-
try {
|
|
81
|
-
return JSON.parse(fs.readFileSync(p, 'utf-8')).name || path.basename(dir);
|
|
82
|
-
}
|
|
83
|
-
catch { }
|
|
84
|
-
}
|
|
85
78
|
return path.basename(dir);
|
|
86
79
|
}
|
|
87
80
|
async function installGitPack(url, claudeDir, config) {
|
|
@@ -121,7 +114,14 @@ async function installPackFromConfigCenter(packNameWithVersion, claudeDir, confi
|
|
|
121
114
|
console.log((0, colors_1.info)(`可用规范包: ${packs.map(p => p.name).join(', ')}`));
|
|
122
115
|
throw new Error('');
|
|
123
116
|
}
|
|
124
|
-
//
|
|
117
|
+
// 本地规范包(gitUrl 为空)
|
|
118
|
+
if (!pack.gitUrl) {
|
|
119
|
+
console.log((0, colors_1.ok)(`找到本地规范包: ${pack.name} v${pack.version}`));
|
|
120
|
+
console.log((0, colors_1.info)(`${pack.description}`));
|
|
121
|
+
await installLocalPackFromConfigRepo(packName, claudeDir, config, rc);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// 第三方规范包
|
|
125
125
|
const gitRef = userVersion || pack.gitRef;
|
|
126
126
|
const gitUrl = gitRef ? `${pack.gitUrl}#${gitRef}` : pack.gitUrl;
|
|
127
127
|
const versionInfo = userVersion
|
|
@@ -134,3 +134,26 @@ async function installPackFromConfigCenter(packNameWithVersion, claudeDir, confi
|
|
|
134
134
|
console.log((0, colors_1.info)(`正在从 Git 仓库安装...`));
|
|
135
135
|
await installGitPack(gitUrl, claudeDir, config);
|
|
136
136
|
}
|
|
137
|
+
async function installLocalPackFromConfigRepo(packName, claudeDir, config, rc) {
|
|
138
|
+
const configRepoDir = path.join(os.homedir(), '.airail', 'config-repo');
|
|
139
|
+
// 确保配置仓库已克隆
|
|
140
|
+
if (!fs.existsSync(configRepoDir)) {
|
|
141
|
+
console.log((0, colors_1.info)('正在克隆配置仓库...'));
|
|
142
|
+
const cloneCmd = rc.configToken
|
|
143
|
+
? `git clone https://oauth2:${rc.configToken}@${rc.configServer.replace(/^https?:\/\//, '')} ${configRepoDir}`
|
|
144
|
+
: `git clone ${rc.configServer} ${configRepoDir}`;
|
|
145
|
+
(0, child_process_1.execSync)(cloneCmd, { stdio: 'pipe' });
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
console.log((0, colors_1.info)('正在更新配置仓库...'));
|
|
149
|
+
(0, child_process_1.execSync)('git pull', { cwd: configRepoDir, stdio: 'pipe' });
|
|
150
|
+
}
|
|
151
|
+
const packDir = path.join(configRepoDir, 'packs', packName);
|
|
152
|
+
if (!fs.existsSync(packDir)) {
|
|
153
|
+
console.error((0, colors_1.err)(`配置仓库中不存在本地规范包: packs/${packName}/`));
|
|
154
|
+
throw new Error('');
|
|
155
|
+
}
|
|
156
|
+
(0, utils_1.installPackFromDir)(packDir, packName, claudeDir);
|
|
157
|
+
config.pack = packName;
|
|
158
|
+
console.log((0, colors_1.ok)(`已安装本地规范包: ${packName} (来自配置仓库)`));
|
|
159
|
+
}
|
package/dist/cli/config.js
CHANGED
|
@@ -203,7 +203,33 @@ async function useConfig(name) {
|
|
|
203
203
|
if (!fs.existsSync(globalClaudeDir)) {
|
|
204
204
|
fs.mkdirSync(globalClaudeDir, { recursive: true });
|
|
205
205
|
}
|
|
206
|
-
|
|
206
|
+
const settingsFilePath = path.join(globalClaudeDir, 'settings.json');
|
|
207
|
+
const settings = JSON.parse(content);
|
|
208
|
+
// 检查 ANTHROPIC_AUTH_TOKEN,为空时强制输入,有值时可选修改
|
|
209
|
+
if (settings?.env?.ANTHROPIC_AUTH_TOKEN !== undefined) {
|
|
210
|
+
const currentToken = settings.env.ANTHROPIC_AUTH_TOKEN;
|
|
211
|
+
if (!currentToken) {
|
|
212
|
+
console.log((0, colors_1.warn)('配置中 ANTHROPIC_AUTH_TOKEN 为空,需要设置 API Key 才能正常使用。'));
|
|
213
|
+
const apiKey = await (0, prompts_1.input)({
|
|
214
|
+
message: '请输入 API Key:',
|
|
215
|
+
validate: (v) => v.trim().length > 0 || '不能为空',
|
|
216
|
+
});
|
|
217
|
+
settings.env.ANTHROPIC_AUTH_TOKEN = apiKey.trim();
|
|
218
|
+
content = JSON.stringify(settings, null, 2);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
const masked = currentToken.slice(0, 8) + '****' + currentToken.slice(-4);
|
|
222
|
+
const newKey = await (0, prompts_1.input)({
|
|
223
|
+
message: `API Key (当前: ${masked},直接回车保留,输入新值则替换):`,
|
|
224
|
+
});
|
|
225
|
+
if (newKey.trim()) {
|
|
226
|
+
settings.env.ANTHROPIC_AUTH_TOKEN = newKey.trim();
|
|
227
|
+
content = JSON.stringify(settings, null, 2);
|
|
228
|
+
console.log((0, colors_1.ok)('API Key 已更新'));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
fs.writeFileSync(settingsFilePath, content);
|
|
207
233
|
console.log((0, colors_1.ok)(`已应用配置 "${chosen}" → ~/.claude/settings.json`));
|
|
208
234
|
// 检查并处理 config.json
|
|
209
235
|
const configPath = path.join(globalClaudeDir, 'config.json');
|
package/dist/cli/init.js
CHANGED
|
@@ -52,7 +52,7 @@ async function cmdInit() {
|
|
|
52
52
|
fs.mkdirSync(path.join(claudeDir, 'hooks'), { recursive: true });
|
|
53
53
|
fs.mkdirSync(path.join(claudeDir, 'skills'), { recursive: true });
|
|
54
54
|
(0, utils_1.copyHooks)(claudeDir);
|
|
55
|
-
(0, utils_1.copyBuiltinSkills)(
|
|
55
|
+
(0, utils_1.copyBuiltinSkills)(claudeDir);
|
|
56
56
|
(0, utils_1.copyTemplateDir)('commands', claudeDir);
|
|
57
57
|
(0, utils_1.copyTemplateDir)('agents', claudeDir);
|
|
58
58
|
(0, utils_1.copyTemplateDir)('templates', claudeDir);
|
package/dist/utils.js
CHANGED
|
@@ -43,7 +43,7 @@ exports.writeRc = writeRc;
|
|
|
43
43
|
exports.installPackFromDir = installPackFromDir;
|
|
44
44
|
exports.installSkillsFromDir = installSkillsFromDir;
|
|
45
45
|
exports.copyBuiltinSkills = copyBuiltinSkills;
|
|
46
|
-
exports.
|
|
46
|
+
exports.removePackSkills = removePackSkills;
|
|
47
47
|
exports.copyDir = copyDir;
|
|
48
48
|
exports.copyHooks = copyHooks;
|
|
49
49
|
exports.copyTemplateDir = copyTemplateDir;
|
|
@@ -121,7 +121,7 @@ function writeRc(patch) {
|
|
|
121
121
|
*/
|
|
122
122
|
function installPackFromDir(packDir, packName, claudeDir) {
|
|
123
123
|
// 删除旧 pack 的 skills
|
|
124
|
-
|
|
124
|
+
removePackSkills(claudeDir);
|
|
125
125
|
// 安装新 pack 的 skills
|
|
126
126
|
installSkillsFromDir(packDir, packName, claudeDir);
|
|
127
127
|
// 覆盖 commands / agents / hooks / templates
|
|
@@ -135,7 +135,7 @@ function installPackFromDir(packDir, packName, claudeDir) {
|
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
137
|
// ─── skills ───────────────────────────────────────────────────────────────────
|
|
138
|
-
/** 将 pack/skills/ 平铺复制到 .claude/skills
|
|
138
|
+
/** 将 pack/skills/ 平铺复制到 .claude/skills/(带 packName 前缀) */
|
|
139
139
|
function installSkillsFromDir(packDir, packName, claudeDir) {
|
|
140
140
|
const skillsSrc = path.join(packDir, 'skills');
|
|
141
141
|
if (!fs.existsSync(skillsSrc)) {
|
|
@@ -147,14 +147,14 @@ function installSkillsFromDir(packDir, packName, claudeDir) {
|
|
|
147
147
|
for (const entry of fs.readdirSync(skillsSrc, { withFileTypes: true })) {
|
|
148
148
|
if (!entry.isDirectory())
|
|
149
149
|
continue;
|
|
150
|
-
|
|
151
|
-
copyDir(path.join(skillsSrc, entry.name), path.join(skillsDest, destName));
|
|
150
|
+
copyDir(path.join(skillsSrc, entry.name), path.join(skillsDest, `${packName}-${entry.name}`));
|
|
152
151
|
}
|
|
153
152
|
}
|
|
154
|
-
|
|
155
|
-
|
|
153
|
+
/** 复制内置 skills(templates/skills/ 下的所有子目录)到 .claude/skills/ */
|
|
154
|
+
function copyBuiltinSkills(claudeDir) {
|
|
155
|
+
const src = path.join(exports.PKG_ROOT, 'src/templates/skills');
|
|
156
156
|
if (!fs.existsSync(src)) {
|
|
157
|
-
console.warn(
|
|
157
|
+
console.warn('内置技能目录不存在。');
|
|
158
158
|
return;
|
|
159
159
|
}
|
|
160
160
|
const skillsDest = path.join(claudeDir, 'skills');
|
|
@@ -162,12 +162,11 @@ function copyBuiltinSkills(packName, claudeDir) {
|
|
|
162
162
|
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
163
163
|
if (!entry.isDirectory())
|
|
164
164
|
continue;
|
|
165
|
-
|
|
166
|
-
copyDir(path.join(src, entry.name), path.join(skillsDest, destName));
|
|
165
|
+
copyDir(path.join(src, entry.name), path.join(skillsDest, entry.name));
|
|
167
166
|
}
|
|
168
167
|
}
|
|
169
|
-
/**
|
|
170
|
-
function
|
|
168
|
+
/** 删除所有 pack 安装的 skills(即带 - 前缀的) */
|
|
169
|
+
function removePackSkills(claudeDir) {
|
|
171
170
|
const skillsDir = path.join(claudeDir, 'skills');
|
|
172
171
|
if (!fs.existsSync(skillsDir))
|
|
173
172
|
return;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bugfix-verify
|
|
3
|
-
description:
|
|
3
|
+
description: Read-only bug fix quality verifier. Use proactively after bugfix agent completes a fix to independently evaluate fix quality. Also use when user says "验证修复", "检查修复质量".
|
|
4
4
|
tools: Read, Grep, Glob
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bugfix
|
|
3
|
-
description: Bug
|
|
3
|
+
description: Bug fix specialist that analyzes root causes and implements fixes. Use when encountering bugs, errors, test failures, or when user says "修复bug", "fix bug", "修复问题".
|
|
4
4
|
tools: Read, Edit, Write, Bash, Grep, Glob
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: code-reviewer
|
|
3
|
-
description:
|
|
3
|
+
description: Expert code review specialist. Use proactively after writing or modifying code, especially after /dev completes. Also use when user says "审查代码", "检查代码", or "review".
|
|
4
4
|
model: opus
|
|
5
5
|
tools: Read, Grep, Glob
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# 代码审查专家
|
|
9
9
|
|
|
10
|
-
## 角色定位
|
|
11
|
-
|
|
12
10
|
你是一位严格的代码审查专家,熟悉本项目的所有规范。你的职责是在代码合并前发现问题,而不是帮助实现功能。
|
|
13
11
|
|
|
12
|
+
## 执行工作流
|
|
13
|
+
|
|
14
|
+
当被调用时,按以下步骤执行:
|
|
15
|
+
|
|
16
|
+
1. **查看最近变更** - 运行 `git diff` 查看最近修改的文件
|
|
17
|
+
2. **聚焦修改文件** - 只审查新增或修改的文件
|
|
18
|
+
3. **立即开始审查** - 不需要等待,直接分析代码
|
|
19
|
+
|
|
14
20
|
## 核心职责
|
|
15
21
|
|
|
16
22
|
在以下场景自动执行代码审查:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: debug
|
|
3
|
-
description:
|
|
3
|
+
description: Systematic debugging coordinator for multi-dimensional problem diagnosis and resolution. Use when encountering complex issues requiring structured analysis, or when user says "调试", "debug", "排查问题".
|
|
4
4
|
tools: Read, Edit, Write, Bash, Grep, Glob, WebFetch, TodoWrite
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: optimize
|
|
3
|
-
description:
|
|
3
|
+
description: Performance optimization coordinator for systematic performance improvement. Use when user says "性能优化", "优化性能", "optimize", or when performance bottlenecks are identified.
|
|
4
4
|
tools: Read, Edit, Write, Bash, Grep, Glob
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: refactor
|
|
3
|
-
description:
|
|
3
|
+
description: Refactoring coordinator for improving code quality and architecture. Use when user says "重构代码", "代码重构", "refactor", or when code smells and technical debt are identified.
|
|
4
4
|
tools: Read, Edit, Write, Bash, Grep, Glob
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -27,10 +27,11 @@
|
|
|
27
27
|
|
|
28
28
|
### 2️⃣ 修复执行(bugfix agent)
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
使用 Agent 工具委托 `bugfix` agent:
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
Agent(subagent_type="bugfix", prompt="修复以下 bug:<bug描述>。上下文信息:<收集到的信息>。[迭代时]上轮验证反馈:<反馈内容>")
|
|
34
|
+
```
|
|
34
35
|
|
|
35
36
|
期望输出:
|
|
36
37
|
- 根本原因分析
|
|
@@ -41,10 +42,11 @@
|
|
|
41
42
|
|
|
42
43
|
### 3️⃣ 质量验证(bugfix-verify agent)
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
- bugfix agent
|
|
45
|
+
使用 Agent 工具委托 `bugfix-verify` agent:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
Agent(subagent_type="bugfix-verify", prompt="验证以下 bug 修复的质量。原始 bug:<bug描述>。修复方案:<bugfix agent 输出>。修复后的代码:<变更文件列表>")
|
|
49
|
+
```
|
|
48
50
|
|
|
49
51
|
期望输出:
|
|
50
52
|
- 总体评估(通过/有条件通过/需要改进/失败)
|
|
@@ -16,11 +16,20 @@
|
|
|
16
16
|
- 记录关键假设和未知因素
|
|
17
17
|
- 生成 5-7 个可能的问题来源
|
|
18
18
|
|
|
19
|
-
2.
|
|
19
|
+
2. **多维度调研(debug agent)**:
|
|
20
|
+
|
|
21
|
+
使用 Agent 工具委托 `debug` agent:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
Agent(subagent_type="debug", prompt="调试以下问题:<问题描述>。复现步骤:<步骤>。相关日志:<日志信息>")
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
期望输出:
|
|
20
28
|
- 架构层面:分析系统设计和模块交互
|
|
21
29
|
- 代码层面:检查相关代码逻辑和数据流
|
|
22
30
|
- 环境层面:检查配置、依赖和运行环境
|
|
23
31
|
- 历史层面:查看相关代码变更历史
|
|
32
|
+
- 综合分析:精炼为 1-2 个最可能的原因
|
|
24
33
|
|
|
25
34
|
3. **假设验证**:
|
|
26
35
|
- 整合所有分析结果
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
- 支持格式:Swagger/OpenAPI、Apifox、手写文档、接口截图
|
|
20
20
|
4. **方案设计**:列出要创建/修改的文件清单(组件、页面、路由、状态),等待确认
|
|
21
21
|
5. **代码生成**:逐层实现(技能会根据开发内容自动激活)
|
|
22
|
-
6.
|
|
22
|
+
6. **代码审查**:代码生成完成后,使用 Agent 工具委托 `code-reviewer` agent 对所有变更文件进行审查
|
|
23
|
+
7. **完成报告**:列出所有变更文件,提示测试和联调事项
|
|
23
24
|
|
|
24
25
|
## AI 执行规则
|
|
25
26
|
|
|
@@ -33,6 +34,16 @@
|
|
|
33
34
|
- 遵循项目的状态管理方案(Vuex/Pinia/Redux 等)
|
|
34
35
|
- 禁止修改框架核心代码和公共组件库
|
|
35
36
|
|
|
37
|
+
## Agent 委托
|
|
38
|
+
|
|
39
|
+
代码生成完成后,**必须**调用 Agent 工具,按以下方式委托审查:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
Agent(subagent_type="code-reviewer", prompt="审查以下前端变更文件:<变更文件列表>。检查是否符合项目规范,是否有安全漏洞、代码重复、性能问题等。")
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
审查未通过的问题需在当前流程中修复后,再输出完成报告。
|
|
46
|
+
|
|
36
47
|
## 技能自动激活说明
|
|
37
48
|
|
|
38
49
|
开发过程中,AI 会根据触发词自动激活相关技能:
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
3. **数据库分析**:检查是否需要新建表或修改现有表
|
|
15
15
|
4. **方案设计**:列出要创建/修改的文件清单,等待确认
|
|
16
16
|
5. **代码生成**:逐层实现(技能会根据开发内容自动激活)
|
|
17
|
-
6.
|
|
17
|
+
6. **代码审查**:代码生成完成后,使用 Agent 工具委托 `code-reviewer` agent 对所有变更文件进行审查
|
|
18
|
+
7. **完成报告**:列出所有变更文件,提示下一步操作
|
|
18
19
|
|
|
19
20
|
## AI 执行规则
|
|
20
21
|
|
|
@@ -26,6 +27,16 @@
|
|
|
26
27
|
- 优先复用项目中已有的工具类和组件
|
|
27
28
|
- 禁止修改框架核心代码
|
|
28
29
|
|
|
30
|
+
## Agent 委托
|
|
31
|
+
|
|
32
|
+
代码生成完成后,**必须**调用 Agent 工具,按以下方式委托审查:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Agent(subagent_type="code-reviewer", prompt="审查以下变更文件:<变更文件列表>。检查是否符合项目规范,是否有安全漏洞、代码重复等问题。")
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
审查未通过的问题需在当前流程中修复后,再输出完成报告。
|
|
39
|
+
|
|
29
40
|
## 技能自动激活说明
|
|
30
41
|
|
|
31
42
|
开发过程中,AI 会根据触发词自动激活相关技能:
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# /gen-pytest - 根据测试用例文档生成 pytest 代码
|
|
2
|
+
|
|
3
|
+
根据测试用例文档(由 `/gen-testcase` 生成或手动编写)生成模块化的 pytest 测试代码,每个测试函数与用例编号一一对应。
|
|
4
|
+
|
|
5
|
+
## 使用方法
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
/gen-pytest <测试用例文档路径>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 执行流程
|
|
12
|
+
|
|
13
|
+
### 0. 读取测试用例文档
|
|
14
|
+
|
|
15
|
+
- 解析测试用例文档,提取所有用例(编号、步骤、预期结果、测试数据、pytest 编写提示)
|
|
16
|
+
- 定位关联代码,理解被测模块的接口和依赖
|
|
17
|
+
- 识别项目已有的测试基础设施(conftest.py、fixture、工具函数)
|
|
18
|
+
|
|
19
|
+
### 1. 规划测试结构
|
|
20
|
+
|
|
21
|
+
根据用例文档的模块和场景划分,规划 pytest 文件结构:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
tests/
|
|
25
|
+
└── test_<模块名>/
|
|
26
|
+
├── conftest.py # 模块级 fixture 和共享工具
|
|
27
|
+
├── test_<场景1>.py # 对应文档中的 "1. 场景名称"
|
|
28
|
+
├── test_<场景2>.py # 对应文档中的 "2. 场景名称"
|
|
29
|
+
└── ...
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
每个场景一个测试文件,文件内的测试函数与用例编号对应。列出文件清单,等待用户确认。
|
|
33
|
+
|
|
34
|
+
### 2. 生成 conftest.py
|
|
35
|
+
|
|
36
|
+
分析所有用例的前置条件和共享依赖,提取公共部分:
|
|
37
|
+
|
|
38
|
+
- 数据库连接、测试客户端等共享 fixture
|
|
39
|
+
- 测试数据工厂函数
|
|
40
|
+
- 通用的 mock 对象和辅助函数
|
|
41
|
+
- setup/teardown 逻辑(数据清理、状态重置)
|
|
42
|
+
|
|
43
|
+
### 3. 逐场景生成测试文件
|
|
44
|
+
|
|
45
|
+
对每个场景文件,按用例编号生成对应的测试函数:
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
"""
|
|
49
|
+
测试场景:[场景名称]
|
|
50
|
+
对应测试用例文档:[文档路径]
|
|
51
|
+
"""
|
|
52
|
+
import pytest
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class Test场景名称:
|
|
56
|
+
"""对应文档:1. [场景名称]"""
|
|
57
|
+
|
|
58
|
+
def test_tc_mod_001_用例描述(self, fixture1, fixture2):
|
|
59
|
+
"""
|
|
60
|
+
用例编号:TC-MOD-001
|
|
61
|
+
优先级:P0
|
|
62
|
+
验证:[预期结果概述]
|
|
63
|
+
"""
|
|
64
|
+
# Arrange - 准备测试数据
|
|
65
|
+
...
|
|
66
|
+
|
|
67
|
+
# Act - 执行被测操作
|
|
68
|
+
...
|
|
69
|
+
|
|
70
|
+
# Assert - 验证结果
|
|
71
|
+
...
|
|
72
|
+
|
|
73
|
+
@pytest.mark.parametrize("input_val,expected", [
|
|
74
|
+
("正常值", "预期结果"),
|
|
75
|
+
("边界值", "预期结果"),
|
|
76
|
+
("异常值", "预期结果"),
|
|
77
|
+
])
|
|
78
|
+
def test_tc_mod_002_多数据验证(self, input_val, expected):
|
|
79
|
+
"""
|
|
80
|
+
用例编号:TC-MOD-002
|
|
81
|
+
优先级:P1
|
|
82
|
+
验证:[预期结果概述]
|
|
83
|
+
"""
|
|
84
|
+
...
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 4. 标记与分组
|
|
88
|
+
|
|
89
|
+
根据用例优先级添加 pytest mark,方便按优先级运行:
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
@pytest.mark.p0
|
|
93
|
+
def test_tc_auth_001_核心登录流程(self):
|
|
94
|
+
...
|
|
95
|
+
|
|
96
|
+
@pytest.mark.p2
|
|
97
|
+
def test_tc_auth_010_特殊字符用户名(self):
|
|
98
|
+
...
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
在 `conftest.py` 或 `pyproject.toml` 中注册自定义 mark:
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
# conftest.py
|
|
105
|
+
def pytest_configure(config):
|
|
106
|
+
config.addinivalue_line("markers", "p0: 必测 - 核心业务流程")
|
|
107
|
+
config.addinivalue_line("markers", "p1: 重要 - 主要功能路径")
|
|
108
|
+
config.addinivalue_line("markers", "p2: 补充 - 边界条件和兼容性")
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 5. 验证与输出
|
|
112
|
+
|
|
113
|
+
- 检查生成的代码语法是否正确
|
|
114
|
+
- 确认每个用例编号都有对应的测试函数
|
|
115
|
+
- 输出用例覆盖对照表
|
|
116
|
+
|
|
117
|
+
## 用例对照表格式
|
|
118
|
+
|
|
119
|
+
生成完成后输出对照表,确认覆盖情况:
|
|
120
|
+
|
|
121
|
+
```markdown
|
|
122
|
+
| 用例编号 | 优先级 | 测试函数 | 所在文件 |
|
|
123
|
+
|---------|--------|---------|---------|
|
|
124
|
+
| TC-AUTH-001 | P0 | test_tc_auth_001_登录成功 | test_login.py |
|
|
125
|
+
| TC-AUTH-002 | P1 | test_tc_auth_002_密码错误 | test_login.py |
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## AI 执行规则
|
|
129
|
+
|
|
130
|
+
- 生成前必须先列出文件结构,等待用户确认
|
|
131
|
+
- 每个测试函数的 docstring 中标注用例编号和优先级,保持与文档的可追溯性
|
|
132
|
+
- 测试函数命名格式:`test_tc_模块_编号_简述`,编号与用例文档严格一致
|
|
133
|
+
- 测试数据来自用例文档中的"测试数据建议",用 parametrize 组织多组数据
|
|
134
|
+
- 公共逻辑提取到 conftest.py,测试文件之间不互相导入
|
|
135
|
+
- 使用 Arrange-Act-Assert 模式组织测试函数内部结构
|
|
136
|
+
- mock 外部依赖(数据库、第三方 API、文件系统),保证测试可独立运行
|
|
137
|
+
- 如果项目已有 conftest.py,追加内容而非覆盖
|
|
138
|
+
|
|
139
|
+
## 示例
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# 从 gen-testcase 生成的文档创建 pytest
|
|
143
|
+
/gen-pytest docs/testcases/用户认证模块测试用例.md
|
|
144
|
+
|
|
145
|
+
# 指定手写的测试用例文档
|
|
146
|
+
/gen-pytest requirements/test-cases/payment.md
|
|
147
|
+
```
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# /gen-testcase - 生成测试用例文档
|
|
2
|
+
|
|
3
|
+
为软件测试人员生成结构化的测试用例文档。根据需求文档和/或代码功能,自动分析并输出完整的测试用例,供 QA 测试人员参考编写 pytest 自动化测试脚本。
|
|
4
|
+
|
|
5
|
+
## 使用方法
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
/gen-testcase <模块名或文件路径>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 执行流程
|
|
12
|
+
|
|
13
|
+
### 0. 信息收集
|
|
14
|
+
|
|
15
|
+
- 定位用户指定的模块或文件,阅读代码理解功能
|
|
16
|
+
- 询问用户是否有相关的需求文档,如有则一并阅读
|
|
17
|
+
- 追踪调用链,理解上下游依赖
|
|
18
|
+
|
|
19
|
+
### 1. 需求与代码分析
|
|
20
|
+
|
|
21
|
+
**有需求文档时:**
|
|
22
|
+
- 从需求文档提取功能点、业务规则和验收标准
|
|
23
|
+
- 将需求描述和代码实现交叉比对,识别差异和遗漏
|
|
24
|
+
|
|
25
|
+
**只有代码时:**
|
|
26
|
+
- 分析函数签名、参数校验、返回值、异常处理
|
|
27
|
+
- 从代码注释、变量命名和业务逻辑中推断需求意图
|
|
28
|
+
|
|
29
|
+
### 2. 确定测试范围
|
|
30
|
+
|
|
31
|
+
根据代码特征判断需要的测试类型,只选择相关的类型:
|
|
32
|
+
|
|
33
|
+
| 代码特征 | 建议的测试类型 |
|
|
34
|
+
|---------|-------------|
|
|
35
|
+
| API 接口 / 路由 | 接口测试(参数、响应、状态码、鉴权) |
|
|
36
|
+
| 表单 / 用户输入 | 输入验证测试(边界值、非法输入、XSS) |
|
|
37
|
+
| 数据库操作 | 数据持久化测试(CRUD、事务、并发) |
|
|
38
|
+
| 业务流程 / 状态机 | 流程测试(正常流、异常流、状态转换) |
|
|
39
|
+
| 文件处理 | 文件测试(格式兼容、大文件、编码) |
|
|
40
|
+
| 权限控制 | 权限测试(越权访问、角色切换) |
|
|
41
|
+
| 第三方集成 | 集成测试(超时、重试、降级) |
|
|
42
|
+
| 纯计算逻辑 | 功能测试(正常值、边界值、异常值) |
|
|
43
|
+
|
|
44
|
+
列出测试范围,等待用户确认后再生成。
|
|
45
|
+
|
|
46
|
+
### 3. 生成测试用例文档
|
|
47
|
+
|
|
48
|
+
按以下结构输出:
|
|
49
|
+
|
|
50
|
+
```markdown
|
|
51
|
+
# [模块名] 测试用例文档
|
|
52
|
+
|
|
53
|
+
## 概述
|
|
54
|
+
- **测试目标**:要测试什么
|
|
55
|
+
- **关联代码**:涉及的关键文件/类/函数
|
|
56
|
+
- **关联需求**:(如有)需求文档名称或编号
|
|
57
|
+
- **测试类型**:本文档覆盖的测试类型
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 1. [功能场景名称]
|
|
62
|
+
|
|
63
|
+
### 1.1 [具体测试点]
|
|
64
|
+
|
|
65
|
+
**用例编号**:TC-模块缩写-001
|
|
66
|
+
**优先级**:P0 / P1 / P2
|
|
67
|
+
**前置条件**:
|
|
68
|
+
- 条件 1
|
|
69
|
+
- 条件 2
|
|
70
|
+
|
|
71
|
+
**测试步骤**:
|
|
72
|
+
1. 步骤描述
|
|
73
|
+
2. 步骤描述
|
|
74
|
+
|
|
75
|
+
**预期结果**:
|
|
76
|
+
- 结果 1
|
|
77
|
+
- 结果 2
|
|
78
|
+
|
|
79
|
+
**测试数据建议**:
|
|
80
|
+
- 正常值:`示例数据`
|
|
81
|
+
- 边界值:`示例数据`
|
|
82
|
+
- 异常值:`示例数据`
|
|
83
|
+
|
|
84
|
+
**pytest 编写提示**:
|
|
85
|
+
> 建议的 fixture、mock 对象、assert 断言点等。
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 4. 质量自检
|
|
89
|
+
|
|
90
|
+
- 正常流程和主要异常场景是否都有用例
|
|
91
|
+
- 测试步骤是否足够具体,能直接执行
|
|
92
|
+
- 预期结果是否明确,不会引起歧义
|
|
93
|
+
- 每个测试点是否有具体的测试数据
|
|
94
|
+
- P0 用例是否确实是最关键的场景
|
|
95
|
+
|
|
96
|
+
### 5. 输出文档
|
|
97
|
+
|
|
98
|
+
将测试用例文档保存到用户指定位置(默认为项目根目录下的 `docs/testcases/` 目录)。
|
|
99
|
+
|
|
100
|
+
## AI 执行规则
|
|
101
|
+
|
|
102
|
+
- 生成前必须先列出测试范围,等待用户确认
|
|
103
|
+
- 测试用例的目标读者是 QA 测试人员,语言要直白、步骤要可执行
|
|
104
|
+
- 不要把所有边界情况堆到一个用例里,拆分成独立用例
|
|
105
|
+
- 给出具体的测试数据示例,不要写"输入异常数据"这样模糊的描述
|
|
106
|
+
- 如果代码中发现潜在 bug 或设计问题,在文档中标注出来
|
|
107
|
+
- 同一功能的相关用例放在一起,方便按场景批量执行
|
|
108
|
+
|
|
109
|
+
## 优先级定义
|
|
110
|
+
|
|
111
|
+
- **P0(必测)**:核心业务流程、数据安全、资金相关
|
|
112
|
+
- **P1(重要)**:主要功能路径、常见异常场景
|
|
113
|
+
- **P2(补充)**:边界条件、兼容性、性能基准
|
|
114
|
+
|
|
115
|
+
## 用例编号规则
|
|
116
|
+
|
|
117
|
+
格式:`TC-{模块缩写}-{三位数字}`
|
|
118
|
+
示例:`TC-AUTH-001`(认证模块)、`TC-PAY-012`(支付模块)
|
|
119
|
+
|
|
120
|
+
## pytest 编写提示规范
|
|
121
|
+
|
|
122
|
+
每个用例附带给测试人员的实操建议:
|
|
123
|
+
- 建议使用的 pytest 特性(fixture、parametrize、mark 等)
|
|
124
|
+
- 需要 mock 的外部依赖
|
|
125
|
+
- 关键的 assert 断言点
|
|
126
|
+
- 测试隔离注意事项(数据库清理、状态重置)
|
|
127
|
+
|
|
128
|
+
保持简洁,提供方向而非完整代码。
|
|
@@ -28,10 +28,11 @@
|
|
|
28
28
|
|
|
29
29
|
### 2️⃣ 瓶颈分析(optimize agent)
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
使用 Agent 工具委托 `optimize` agent:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
Agent(subagent_type="optimize", prompt="分析以下性能问题:<性能目标>。当前性能数据:<收集到的性能数据>。相关代码文件:<文件列表>")
|
|
35
|
+
```
|
|
35
36
|
|
|
36
37
|
期望输出:
|
|
37
38
|
- 性能基线报告
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
|
|
30
30
|
### 2️⃣ 重构策略设计(refactor agent)
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
32
|
+
使用 Agent 工具委托 `refactor` agent:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Agent(subagent_type="refactor", prompt="分析以下代码的重构需求:<重构目标>。目标代码文件:<文件列表>。测试覆盖情况:<测试信息>。依赖关系:<依赖分析>")
|
|
36
|
+
```
|
|
37
37
|
|
|
38
38
|
期望输出:
|
|
39
39
|
- 当前状态分析(四位专家视角)
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: project-manager
|
|
3
|
-
description: 项目管理助手,负责跟踪项目进度、管理待办事项、生成进度报告。当用户需要了解项目状态、规划下一步工作时调用。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 项目管理助手
|
|
7
|
-
|
|
8
|
-
## 角色定位
|
|
9
|
-
|
|
10
|
-
你是项目管理助手,专注于跟踪进度和规划任务,不参与具体代码实现。
|
|
11
|
-
|
|
12
|
-
## 核心职责
|
|
13
|
-
|
|
14
|
-
1. **进度跟踪**:读取 `.claude/templates/项目状态.md`,分析当前完成情况
|
|
15
|
-
2. **任务规划**:根据待办清单和代码现状,给出优先级建议
|
|
16
|
-
3. **风险识别**:发现可能阻塞进度的问题,提前预警
|
|
17
|
-
|
|
18
|
-
## 常用操作
|
|
19
|
-
|
|
20
|
-
### 查看项目状态
|
|
21
|
-
|
|
22
|
-
读取以下文件综合分析:
|
|
23
|
-
- `.claude/templates/项目状态.md`
|
|
24
|
-
- `.claude/templates/待办清单.md`
|
|
25
|
-
- 项目目录结构(判断各模块完成度)
|
|
26
|
-
|
|
27
|
-
### 更新进度
|
|
28
|
-
|
|
29
|
-
当用户完成某个功能后:
|
|
30
|
-
1. 在待办清单中标记对应任务为完成
|
|
31
|
-
2. 更新项目状态文档的完成度
|
|
32
|
-
3. 追加变更记录
|
|
33
|
-
|
|
34
|
-
### 规划下一步
|
|
35
|
-
|
|
36
|
-
根据以下因素给出建议:
|
|
37
|
-
- 未完成的高优先级任务
|
|
38
|
-
- 当前阻塞项
|
|
39
|
-
- 模块间的依赖关系
|
|
40
|
-
|
|
41
|
-
## 输出风格
|
|
42
|
-
|
|
43
|
-
- 简洁直接,用数字和百分比量化进度
|
|
44
|
-
- 高优先级问题用 🔴 标注
|
|
45
|
-
- 已完成用 ✅,进行中用 🔄,待开始用 ⬜
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: code-quality
|
|
3
|
-
description: |
|
|
4
|
-
通用代码质量规范,DRY/KISS/命名规范。
|
|
5
|
-
|
|
6
|
-
触发场景:
|
|
7
|
-
- 代码质量检查和改进
|
|
8
|
-
- 代码重构和优化
|
|
9
|
-
- 命名规范检查
|
|
10
|
-
- DRY 原则应用
|
|
11
|
-
- 重复代码消除
|
|
12
|
-
|
|
13
|
-
触发词:代码质量、重构、命名、DRY、重复代码、KISS、YAGNI、代码规范、代码优化、命名规范
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# 代码质量规范
|
|
17
|
-
|
|
18
|
-
## 核心原则
|
|
19
|
-
|
|
20
|
-
**KISS**:能简单就不复杂,三行能解决的不写十行。
|
|
21
|
-
|
|
22
|
-
**DRY**:发现重复代码立即提取,零容忍 copy-paste。
|
|
23
|
-
|
|
24
|
-
**YAGNI**:不为假设的未来需求写代码,只解决当前问题。
|
|
25
|
-
|
|
26
|
-
## 命名规范
|
|
27
|
-
|
|
28
|
-
- 变量/函数:描述"做什么",不描述"怎么做"
|
|
29
|
-
- 布尔值:用 `is/has/can/should` 前缀
|
|
30
|
-
- 函数:动词开头(`getUser`, `createOrder`, `validateInput`)
|
|
31
|
-
- 常量:全大写下划线(`MAX_RETRY_COUNT`)
|
|
32
|
-
|
|
33
|
-
## 禁止事项
|
|
34
|
-
|
|
35
|
-
- 禁止魔法数字,提取为命名常量
|
|
36
|
-
- 禁止注释掉的废弃代码,直接删除
|
|
37
|
-
- 禁止无意义的注释(`// 循环遍历数组`)
|
|
38
|
-
- 禁止超过 3 层的嵌套,提前 return 或提取函数
|
|
39
|
-
- 函数超过 30 行考虑拆分
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: code-review
|
|
3
|
-
description: 代码审查清单。触发场景:代码审查和检查、功能正确性验证、代码质量评审、安全性检查、性能审查。触发词:code review、代码审查、检查代码、review、代码检查、审查、质量检查、代码评审、CR
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 代码审查清单
|
|
7
|
-
|
|
8
|
-
## 功能正确性
|
|
9
|
-
|
|
10
|
-
- [ ] 逻辑是否正确,边界条件是否处理
|
|
11
|
-
- [ ] 错误路径是否有处理
|
|
12
|
-
- [ ] 是否有遗漏的业务场景
|
|
13
|
-
|
|
14
|
-
## 代码质量
|
|
15
|
-
|
|
16
|
-
- [ ] 有无重复代码(DRY)
|
|
17
|
-
- [ ] 命名是否清晰
|
|
18
|
-
- [ ] 函数是否单一职责
|
|
19
|
-
- [ ] 是否有不必要的复杂度
|
|
20
|
-
|
|
21
|
-
## 安全
|
|
22
|
-
|
|
23
|
-
- [ ] 用户输入是否验证
|
|
24
|
-
- [ ] 是否有硬编码密钥
|
|
25
|
-
- [ ] 权限控制是否正确
|
|
26
|
-
|
|
27
|
-
## 性能
|
|
28
|
-
|
|
29
|
-
- [ ] 是否有 N+1 查询
|
|
30
|
-
- [ ] 大数据量是否有分页
|
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: development-workflow
|
|
3
|
-
description: |
|
|
4
|
-
项目开发工作流和最佳实践。包含开发流程建议、编码最佳实践、技术选型建议。
|
|
5
|
-
|
|
6
|
-
触发场景:
|
|
7
|
-
- 询问开发流程和工作流
|
|
8
|
-
- 询问最佳实践和开发规范
|
|
9
|
-
- 询问如何组织开发工作
|
|
10
|
-
- 询问技术选型建议
|
|
11
|
-
- 询问命令使用顺序
|
|
12
|
-
|
|
13
|
-
触发词:开发流程、工作流、最佳实践、开发规范、如何开发、开发建议、技术选型、命令使用、开发顺序、项目管理
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# 项目开发工作流和最佳实践
|
|
17
|
-
|
|
18
|
-
## 概述
|
|
19
|
-
|
|
20
|
-
本技能提供项目开发的工作流建议、编码最佳实践和技术选型指导,帮助开发者高效、规范地完成项目开发。
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 开发流程建议
|
|
25
|
-
|
|
26
|
-
### 标准开发流程(6步法)
|
|
27
|
-
|
|
28
|
-
1. **明确需求** → 使用 `/start` 快速了解项目
|
|
29
|
-
- 了解项目结构和技术栈
|
|
30
|
-
- 查看现有功能和代码组织
|
|
31
|
-
- 确认开发环境和依赖
|
|
32
|
-
|
|
33
|
-
2. **检查规范** → 使用 `/check` 检查代码质量
|
|
34
|
-
- 检查现有代码规范
|
|
35
|
-
- 发现潜在问题
|
|
36
|
-
- 了解项目编码标准
|
|
37
|
-
|
|
38
|
-
3. **分析进度** → 使用 `/progress` 了解完成情况
|
|
39
|
-
- 查看项目完成度
|
|
40
|
-
- 了解待办事项
|
|
41
|
-
- 评估工作量
|
|
42
|
-
|
|
43
|
-
4. **开始开发** → 使用 `/dev` 或 `/crud` 快速生成代码
|
|
44
|
-
- 表已存在:使用 `/crud` 快速生成
|
|
45
|
-
- 从零开始:使用 `/dev` 完整开发
|
|
46
|
-
- 遵循项目规范和架构
|
|
47
|
-
|
|
48
|
-
5. **添加待办** → 使用 `/add-todo` 跟踪任务
|
|
49
|
-
- 记录新发现的任务
|
|
50
|
-
- 标记优先级
|
|
51
|
-
- 设置截止日期
|
|
52
|
-
|
|
53
|
-
6. **获取建议** → 使用 `/next` 确定下一步方向
|
|
54
|
-
- 分析当前状态
|
|
55
|
-
- 获取优先级建议
|
|
56
|
-
- 规划下一步工作
|
|
57
|
-
|
|
58
|
-
### 定期维护流程
|
|
59
|
-
|
|
60
|
-
- **每日**:使用 `/add-todo` 记录新任务
|
|
61
|
-
- **每周**:使用 `/check` 检查代码质量
|
|
62
|
-
- **每周**:使用 `/progress` 查看进度
|
|
63
|
-
- **每周**:使用 `/sync` 生成综合报告
|
|
64
|
-
- **每月**:使用 `/next` 规划下一阶段工作
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## 编码最佳实践
|
|
69
|
-
|
|
70
|
-
### 1. 单一职责原则
|
|
71
|
-
|
|
72
|
-
**原则**:每个模块、类、方法只负责一件事
|
|
73
|
-
|
|
74
|
-
**实践**:
|
|
75
|
-
- 业务层负责业务逻辑
|
|
76
|
-
- 接口层负责请求处理和参数验证
|
|
77
|
-
- 数据层负责数据访问
|
|
78
|
-
- 工具类负责通用功能
|
|
79
|
-
|
|
80
|
-
**反例**:
|
|
81
|
-
```
|
|
82
|
-
❌ Controller 中包含复杂的业务逻辑
|
|
83
|
-
❌ Service 中直接操作 HTTP 请求
|
|
84
|
-
❌ 一个方法做多件不相关的事
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
**正例**:
|
|
88
|
-
```
|
|
89
|
-
✅ Controller 只做参数验证和调用 Service
|
|
90
|
-
✅ Service 专注业务逻辑
|
|
91
|
-
✅ 每个方法职责清晰
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
### 2. 查询优化
|
|
97
|
-
|
|
98
|
-
**原则**:规范构建查询条件,避免性能问题
|
|
99
|
-
|
|
100
|
-
**实践**:
|
|
101
|
-
- 使用规范的查询条件构建方式
|
|
102
|
-
- 避免 N+1 查询问题
|
|
103
|
-
- 合理使用索引
|
|
104
|
-
- 分页查询大数据量
|
|
105
|
-
|
|
106
|
-
**查询条件规范**:
|
|
107
|
-
- 精确匹配:ID、状态、类型等
|
|
108
|
-
- 模糊搜索:名称、标题、内容等
|
|
109
|
-
- 范围查询:日期、金额等
|
|
110
|
-
- 关联查询:使用 JOIN 而非多次查询
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
### 3. 权限管理
|
|
115
|
-
|
|
116
|
-
**原则**:所有公开接口必须有权限控制
|
|
117
|
-
|
|
118
|
-
**实践**:
|
|
119
|
-
- 所有接口添加权限注解
|
|
120
|
-
- 按模块划分权限
|
|
121
|
-
- 按操作类型划分权限(查看、新增、修改、删除)
|
|
122
|
-
- 敏感操作增加二次验证
|
|
123
|
-
|
|
124
|
-
**权限分类**:
|
|
125
|
-
- 查看权限:list、query
|
|
126
|
-
- 操作权限:add、edit、remove
|
|
127
|
-
- 特殊权限:export、import、approve
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
### 4. 注释完整
|
|
132
|
-
|
|
133
|
-
**原则**:关键方法必须有完整注释
|
|
134
|
-
|
|
135
|
-
**实践**:
|
|
136
|
-
- 公开接口必须有注释
|
|
137
|
-
- 复杂业务逻辑必须有注释
|
|
138
|
-
- 工具方法必须有注释
|
|
139
|
-
- 注释说明用途、参数、返回值
|
|
140
|
-
|
|
141
|
-
**注释内容**:
|
|
142
|
-
- 方法用途和功能
|
|
143
|
-
- 参数说明(类型、含义、约束)
|
|
144
|
-
- 返回值说明
|
|
145
|
-
- 异常说明
|
|
146
|
-
- 使用示例(如需要)
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
### 5. 定期检查
|
|
151
|
-
|
|
152
|
-
**原则**:每周至少一次运行代码检查和进度查看
|
|
153
|
-
|
|
154
|
-
**实践**:
|
|
155
|
-
- 每周运行 `/check` 检查代码质量
|
|
156
|
-
- 每周运行 `/progress` 查看进度
|
|
157
|
-
- 每周运行 `/sync` 生成综合报告
|
|
158
|
-
- 及时修复发现的问题
|
|
159
|
-
|
|
160
|
-
**检查内容**:
|
|
161
|
-
- 代码规范问题
|
|
162
|
-
- TODO/FIXME 标记
|
|
163
|
-
- 代码重复
|
|
164
|
-
- 性能问题
|
|
165
|
-
- 安全问题
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## 技术选型建议
|
|
170
|
-
|
|
171
|
-
### 场景 1:快速生成 CRUD
|
|
172
|
-
|
|
173
|
-
**推荐方案**:`/crud` 命令
|
|
174
|
-
|
|
175
|
-
**适用条件**:
|
|
176
|
-
- 数据库表已存在
|
|
177
|
-
- 只需标准 CRUD 功能
|
|
178
|
-
- 无复杂业务逻辑
|
|
179
|
-
|
|
180
|
-
**优势**:
|
|
181
|
-
- 生成速度快
|
|
182
|
-
- 代码规范统一
|
|
183
|
-
- 减少重复工作
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
### 场景 2:从零开发功能
|
|
188
|
-
|
|
189
|
-
**推荐方案**:`/dev` 命令
|
|
190
|
-
|
|
191
|
-
**适用条件**:
|
|
192
|
-
- 表结构尚未设计
|
|
193
|
-
- 需要完整的开发流程
|
|
194
|
-
- 包含业务逻辑设计
|
|
195
|
-
|
|
196
|
-
**优势**:
|
|
197
|
-
- 包含表设计指导
|
|
198
|
-
- 完整的开发流程
|
|
199
|
-
- 考虑业务逻辑
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
### 场景 3:代码规范检查
|
|
204
|
-
|
|
205
|
-
**推荐方案**:`/check` 命令
|
|
206
|
-
|
|
207
|
-
**适用条件**:
|
|
208
|
-
- 开发完成后
|
|
209
|
-
- 定期检查
|
|
210
|
-
- 发现代码问题
|
|
211
|
-
|
|
212
|
-
**优势**:
|
|
213
|
-
- 及时发现问题
|
|
214
|
-
- 统一代码规范
|
|
215
|
-
- 提升代码质量
|
|
216
|
-
|
|
217
|
-
---
|
|
218
|
-
|
|
219
|
-
### 场景 4:项目进度追踪
|
|
220
|
-
|
|
221
|
-
**推荐方案**:`/progress` 命令
|
|
222
|
-
|
|
223
|
-
**适用条件**:
|
|
224
|
-
- 定期了解完成情况
|
|
225
|
-
- 评估工作量
|
|
226
|
-
- 规划下一步工作
|
|
227
|
-
|
|
228
|
-
**优势**:
|
|
229
|
-
- 清晰的进度展示
|
|
230
|
-
- 待办事项统计
|
|
231
|
-
- 完成率分析
|
|
232
|
-
|
|
233
|
-
---
|
|
234
|
-
|
|
235
|
-
### 场景 5:全量同步
|
|
236
|
-
|
|
237
|
-
**推荐方案**:`/sync` 命令
|
|
238
|
-
|
|
239
|
-
**适用条件**:
|
|
240
|
-
- 每周整理
|
|
241
|
-
- 发现数据不一致
|
|
242
|
-
- 生成综合报告
|
|
243
|
-
|
|
244
|
-
**优势**:
|
|
245
|
-
- 全量扫描
|
|
246
|
-
- 综合分析
|
|
247
|
-
- 生成报告
|
|
248
|
-
|
|
249
|
-
---
|
|
250
|
-
|
|
251
|
-
## 常见问题
|
|
252
|
-
|
|
253
|
-
### Q1:什么时候使用 /crud,什么时候使用 /dev?
|
|
254
|
-
|
|
255
|
-
**A1**:
|
|
256
|
-
- 表已存在 → 使用 `/crud`
|
|
257
|
-
- 从零开始 → 使用 `/dev`
|
|
258
|
-
- 只需标准 CRUD → 使用 `/crud`
|
|
259
|
-
- 需要复杂业务逻辑 → 使用 `/dev`
|
|
260
|
-
|
|
261
|
-
---
|
|
262
|
-
|
|
263
|
-
### Q2:如何保证代码质量?
|
|
264
|
-
|
|
265
|
-
**A2**:
|
|
266
|
-
1. 开发前:使用 `/check` 了解项目规范
|
|
267
|
-
2. 开发中:遵循最佳实践
|
|
268
|
-
3. 开发后:使用 `/check` 检查代码
|
|
269
|
-
4. 定期:每周运行 `/check` 和 `/sync`
|
|
270
|
-
|
|
271
|
-
---
|
|
272
|
-
|
|
273
|
-
### Q3:如何管理待办事项?
|
|
274
|
-
|
|
275
|
-
**A3**:
|
|
276
|
-
1. 发现任务:使用 `/add-todo` 立即记录
|
|
277
|
-
2. 查看进度:使用 `/progress` 查看待办
|
|
278
|
-
3. 获取建议:使用 `/next` 确定优先级
|
|
279
|
-
4. 定期整理:每周清理已完成任务
|
|
280
|
-
|
|
281
|
-
---
|
|
282
|
-
|
|
283
|
-
### Q4:如何规划下一步工作?
|
|
284
|
-
|
|
285
|
-
**A4**:
|
|
286
|
-
1. 使用 `/next` 获取建议
|
|
287
|
-
2. 根据优先级排序
|
|
288
|
-
3. 先处理高优先级任务
|
|
289
|
-
4. 定期使用 `/progress` 查看进度
|
|
290
|
-
|
|
291
|
-
---
|
|
292
|
-
|
|
293
|
-
## 注意事项
|
|
294
|
-
|
|
295
|
-
1. **遵循项目规范**:每个项目可能有特定的规范,优先遵循项目规范
|
|
296
|
-
2. **保持代码一致性**:与现有代码保持一致的风格
|
|
297
|
-
3. **及时记录待办**:发现问题立即记录,避免遗忘
|
|
298
|
-
4. **定期检查代码**:每周至少一次代码检查
|
|
299
|
-
5. **持续学习改进**:根据项目经验不断优化工作流
|
|
300
|
-
|
|
301
|
-
---
|
|
302
|
-
|
|
303
|
-
## 相关技能
|
|
304
|
-
|
|
305
|
-
- 如果是后端开发规范 → 使用 backend-development 技能
|
|
306
|
-
- 如果是数据库设计规范 → 使用 database-design 技能
|
|
307
|
-
- 如果是 API 设计规范 → 使用 api-design 技能
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: error-handling
|
|
3
|
-
description: |
|
|
4
|
-
错误处理规范,异常捕获和错误传递。
|
|
5
|
-
|
|
6
|
-
触发场景:
|
|
7
|
-
- 错误处理和异常捕获
|
|
8
|
-
- Try-catch 块编写
|
|
9
|
-
- 错误信息传递
|
|
10
|
-
- 异常处理规范
|
|
11
|
-
- 错误恢复策略
|
|
12
|
-
|
|
13
|
-
触发词:错误处理、异常、try catch、error、异常捕获、错误传递、异常处理、错误恢复、throw、catch
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# 错误处理规范
|
|
17
|
-
|
|
18
|
-
## 核心原则
|
|
19
|
-
|
|
20
|
-
- 只在系统边界处理错误(HTTP 入口、外部 API 调用、文件 IO)
|
|
21
|
-
- 内部函数抛出错误,不要吞掉
|
|
22
|
-
- 错误信息要有上下文,不要只写 "error occurred"
|
|
23
|
-
|
|
24
|
-
## 模式
|
|
25
|
-
|
|
26
|
-
**不要吞掉错误:**
|
|
27
|
-
```js
|
|
28
|
-
// 错误
|
|
29
|
-
try { ... } catch (e) {}
|
|
30
|
-
|
|
31
|
-
// 正确
|
|
32
|
-
try { ... } catch (e) { throw new Error(`Failed to process order ${id}: ${e.message}`); }
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
**区分可恢复和不可恢复错误:**
|
|
36
|
-
- 可恢复(用户输入错误、网络超时):返回错误响应
|
|
37
|
-
- 不可恢复(数据库连接失败):让程序崩溃,由进程管理器重启
|
|
38
|
-
|
|
39
|
-
## 禁止事项
|
|
40
|
-
|
|
41
|
-
- 禁止空 catch 块
|
|
42
|
-
- 禁止对不可能发生的场景加错误处理(过度防御)
|
|
43
|
-
- 禁止在日志中打印完整堆栈到生产环境
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: performance
|
|
3
|
-
description: 性能优化原则。触发场景:性能优化和改进、慢查询问题解决、数据库查询优化、缓存策略设计、N+1 查询问题。触发词:性能、慢查询、优化、N+1、性能优化、缓存、数据库优化、查询优化、性能问题、性能调优
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 性能优化规范
|
|
7
|
-
|
|
8
|
-
## 数据库
|
|
9
|
-
|
|
10
|
-
- 查询必须走索引,避免全表扫描
|
|
11
|
-
- 禁止 N+1 查询,用 JOIN 或批量查询
|
|
12
|
-
- 分页查询必须有 LIMIT,禁止无限制查询
|
|
13
|
-
|
|
14
|
-
## 缓存
|
|
15
|
-
|
|
16
|
-
- 热点数据加缓存,设置合理 TTL
|
|
17
|
-
- 缓存 key 要有命名空间,避免冲突
|
|
18
|
-
- 写操作后主动失效相关缓存
|
|
19
|
-
|
|
20
|
-
## 代码层面
|
|
21
|
-
|
|
22
|
-
- 循环内禁止数据库查询
|
|
23
|
-
- 大数据量用流式处理,不要一次性加载到内存
|
|
24
|
-
- 先测量再优化,不要凭感觉优化
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: testing
|
|
3
|
-
description: 测试策略规范。触发场景:单元测试编写、测试策略设计、Mock 对象使用、测试用例设计、测试覆盖率提升。触发词:测试、单元测试、test、mock、测试用例、测试策略、TDD、测试覆盖、集成测试、测试框架
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 测试规范
|
|
7
|
-
|
|
8
|
-
## 测试原则
|
|
9
|
-
|
|
10
|
-
- 测试行为,不测实现细节
|
|
11
|
-
- 一个测试只验证一件事
|
|
12
|
-
- 测试名称描述场景:`should return 404 when user not found`
|
|
13
|
-
|
|
14
|
-
## 测试结构(AAA)
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
Arrange - 准备数据
|
|
18
|
-
Act - 执行操作
|
|
19
|
-
Assert - 验证结果
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## 什么值得测试
|
|
23
|
-
|
|
24
|
-
- 业务逻辑(核心价值)
|
|
25
|
-
- 边界条件(空值、最大值、负数)
|
|
26
|
-
- 错误路径
|
|
27
|
-
|
|
28
|
-
## 禁止事项
|
|
29
|
-
|
|
30
|
-
- 禁止测试框架本身的行为
|
|
31
|
-
- 禁止在测试中使用真实数据库/网络(用 mock)
|
|
32
|
-
- 禁止测试私有方法(通过公共接口测试)
|