airail 0.1.5 → 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 +28 -2
- package/dist/cli/index.js +2 -2
- package/dist/cli/init.js +1 -1
- package/dist/utils.js +11 -12
- package/package.json +1 -2
- package/src/templates/CLAUDE.md +43 -3
- package/src/templates/agents/bugfix-verify.md +113 -0
- package/src/templates/agents/bugfix.md +104 -0
- package/src/templates/agents/code-reviewer.md +9 -3
- package/src/templates/agents/debug.md +162 -0
- package/src/templates/agents/optimize.md +185 -0
- package/src/templates/agents/refactor.md +225 -0
- package/src/templates/commands/bugfix.md +136 -0
- package/src/templates/commands/commit.md +134 -0
- package/src/templates/commands/debug.md +136 -0
- package/src/templates/commands/dev-frontend.md +17 -1
- package/src/templates/commands/dev.md +18 -2
- package/src/templates/commands/gen-pytest.md +147 -0
- package/src/templates/commands/gen-testcase.md +128 -0
- package/src/templates/commands/init-skills.md +79 -8
- package/src/templates/commands/optimize.md +179 -0
- package/src/templates/commands/refactor.md +223 -0
- package/src/templates/skills/git-workflow/SKILL.md +453 -0
- package/{skills/universal → src/templates/skills}/security/SKILL.md +1 -9
- package/src/templates/skills/skill-add/SKILL.md +544 -0
- package/skills/universal/code-quality/SKILL.md +0 -37
- package/skills/universal/code-review/SKILL.md +0 -37
- package/skills/universal/development-workflow/SKILL.md +0 -307
- package/skills/universal/error-handling/SKILL.md +0 -40
- package/skills/universal/git-workflow/SKILL.md +0 -37
- package/skills/universal/performance/SKILL.md +0 -31
- package/skills/universal/skill-add/SKILL.md +0 -241
- package/skills/universal/testing/SKILL.md +0 -39
- package/src/templates/agents/project-manager.md +0 -45
- package/src/templates/commands/add-todo.md +0 -224
- package/src/templates/commands/crud.md +0 -369
- package/src/templates/commands/next.md +0 -183
- package/src/templates/commands/progress.md +0 -441
- package/src/templates/commands/start.md +0 -397
- package/src/templates/commands/sync.md +0 -225
- package/src/templates/commands/update-status.md +0 -475
- package/src/templates/templates//345/276/205/345/212/236/346/270/205/345/215/225.md +0 -22
- package/src/templates/templates//351/241/271/347/233/256/347/212/266/346/200/201.md +0 -50
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
|
@@ -179,7 +179,7 @@ async function useConfig(name) {
|
|
|
179
179
|
chosen = await (0, prompts_1.select)({
|
|
180
180
|
message: '选择要应用的配置',
|
|
181
181
|
choices: entries.map(e => ({
|
|
182
|
-
name:
|
|
182
|
+
name: e.description,
|
|
183
183
|
value: e.name,
|
|
184
184
|
})),
|
|
185
185
|
});
|
|
@@ -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/index.js
CHANGED
|
@@ -61,7 +61,7 @@ function printHelp() {
|
|
|
61
61
|
const cmds = [
|
|
62
62
|
['init', '在当前项目初始化 airail'],
|
|
63
63
|
['add <包名[@版本]|路径>', '安装规范包(从配置仓库或本地路径)'],
|
|
64
|
-
['install
|
|
64
|
+
['install', '安装 CLI 工具'],
|
|
65
65
|
['clear', '清理 airail 相关内容'],
|
|
66
66
|
['update', '更新已安装的规范包'],
|
|
67
67
|
['config [子命令]', '管理团队配置仓库 (setup / list / use)'],
|
|
@@ -78,7 +78,7 @@ async function executeCommand(cmd, args) {
|
|
|
78
78
|
const commands = {
|
|
79
79
|
init: init_1.cmdInit,
|
|
80
80
|
add: () => (0, add_1.cmdAdd)(args[0]),
|
|
81
|
-
install: () => (0, install_1.cmdInstall)(
|
|
81
|
+
install: () => (0, install_1.cmdInstall)(),
|
|
82
82
|
clear: clear_1.cmdClear,
|
|
83
83
|
update: update_1.cmdUpdate,
|
|
84
84
|
status: status_1.cmdStatus,
|
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": "airail",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "AI coding assistant framework - enforce coding standards via Claude hooks & skills",
|
|
5
5
|
"bin": {
|
|
6
6
|
"airail": "./bin/airail.js"
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
"files": [
|
|
10
10
|
"bin/",
|
|
11
11
|
"dist/",
|
|
12
|
-
"skills/",
|
|
13
12
|
"src/templates/"
|
|
14
13
|
],
|
|
15
14
|
"scripts": {
|
package/src/templates/CLAUDE.md
CHANGED
|
@@ -1,9 +1,49 @@
|
|
|
1
1
|
# 项目开发规范
|
|
2
2
|
|
|
3
|
-
> 本项目使用 AIRail
|
|
3
|
+
> 本项目使用 AIRail 管理编码规范,详细规范位于 `.claude/skills/`
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 项目规范
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
> 本章节由 `/init-skills` 自动生成。执行该命令后,此处将填充项目的核心规范。
|
|
8
8
|
|
|
9
|
+
### 架构决策
|
|
9
10
|
|
|
11
|
+
**分层结构**:
|
|
12
|
+
- {{LAYER_STRUCTURE}}
|
|
13
|
+
|
|
14
|
+
**包结构/目录结构**:
|
|
15
|
+
```
|
|
16
|
+
{{PACKAGE_STRUCTURE}}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 首选库
|
|
20
|
+
|
|
21
|
+
**常用工具类**:
|
|
22
|
+
- {{COMMON_UTILS}}
|
|
23
|
+
|
|
24
|
+
**基类**:
|
|
25
|
+
- {{BASE_CLASSES}}
|
|
26
|
+
|
|
27
|
+
### 详细规范索引
|
|
28
|
+
|
|
29
|
+
详细的领域规范请参考以下技能文件:
|
|
30
|
+
- 后端开发规范:`.claude/skills/backend-development/SKILL.md`
|
|
31
|
+
- API 设计规范:`.claude/skills/api-design/SKILL.md`
|
|
32
|
+
- 数据库设计规范:`.claude/skills/database-design/SKILL.md`
|
|
33
|
+
- 前端开发规范:`.claude/skills/frontend-development/SKILL.md`(如适用)
|
|
34
|
+
|
|
35
|
+
### 代码审查要点
|
|
36
|
+
|
|
37
|
+
- {{CODE_REVIEW_POINTS}}
|
|
38
|
+
|
|
39
|
+
### 禁止事项
|
|
40
|
+
|
|
41
|
+
- {{FORBIDDEN_ITEMS}}
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 注意事项
|
|
46
|
+
|
|
47
|
+
- 所有生成的代码必须符合本规范
|
|
48
|
+
- 详细的编码规范和代码示例请查看对应的技能文件
|
|
49
|
+
- 技能会根据任务类型自动激活,无需手动调用
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bugfix-verify
|
|
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
|
+
tools: Read, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Bug 修复质量验证专家
|
|
8
|
+
|
|
9
|
+
## 角色定位
|
|
10
|
+
|
|
11
|
+
你是一位严格的质量验证专家。你的职责是独立、客观地评估 bug 修复的质量,确保修复真正解决了问题,且不会引入新的问题。你只读代码,不做任何修改。
|
|
12
|
+
|
|
13
|
+
## 核心职责
|
|
14
|
+
|
|
15
|
+
1. **修复有效性验证** – 确认修复是否真正解决了根本原因
|
|
16
|
+
2. **代码质量评估** – 检查代码规范、可读性、是否有重复
|
|
17
|
+
3. **回归风险分析** – 评估修复是否影响其他功能
|
|
18
|
+
4. **评分和反馈** – 提供 0-100% 评分和具体改进建议
|
|
19
|
+
|
|
20
|
+
## 验证框架(4 维度)
|
|
21
|
+
|
|
22
|
+
### 1. 解决方案完整性(30%)
|
|
23
|
+
- 是否真正解决了根本原因?
|
|
24
|
+
- 修复是否完整,没有遗漏?
|
|
25
|
+
- 是否处理了所有相关的边界情况?
|
|
26
|
+
|
|
27
|
+
### 2. 代码质量(30%)
|
|
28
|
+
- 代码是否符合项目规范?
|
|
29
|
+
- 代码可读性如何?
|
|
30
|
+
- 是否有代码重复或可以优化的地方?
|
|
31
|
+
- 异常处理是否完整?
|
|
32
|
+
|
|
33
|
+
### 3. 回归风险(20%)
|
|
34
|
+
- 修复是否可能影响其他功能?
|
|
35
|
+
- 是否改变了现有的 API 或行为?
|
|
36
|
+
- 是否有潜在的副作用?
|
|
37
|
+
|
|
38
|
+
### 4. 测试覆盖(20%)
|
|
39
|
+
- 是否提供了充分的测试建议?
|
|
40
|
+
- 测试是否能验证修复的有效性?
|
|
41
|
+
- 是否考虑了边界情况?
|
|
42
|
+
|
|
43
|
+
## 评分标准
|
|
44
|
+
|
|
45
|
+
| 评分 | 等级 | 说明 |
|
|
46
|
+
|------|------|------|
|
|
47
|
+
| ≥90% | **通过** | 生产就绪,可以合并 |
|
|
48
|
+
| 80-89% | **有条件通过** | 需要少量改进,建议修复后再合并 |
|
|
49
|
+
| 60-79% | **需要改进** | 存在重大问题,需要返工 |
|
|
50
|
+
| <60% | **失败** | 修复不完整或有严重问题,需要完全返工 |
|
|
51
|
+
|
|
52
|
+
## 核心原则
|
|
53
|
+
|
|
54
|
+
1. **独立评估** – 客观评价,不受修复者意见影响
|
|
55
|
+
2. **全面审查** – 从功能、质量、风险多个维度评估
|
|
56
|
+
3. **可操作反馈** – 提供具体、可执行的改进建议
|
|
57
|
+
4. **风险意识** – 重点关注可能的回归风险
|
|
58
|
+
5. **以用户为中心** – 考虑修复对最终用户的影响
|
|
59
|
+
|
|
60
|
+
## 输出格式
|
|
61
|
+
|
|
62
|
+
```markdown
|
|
63
|
+
## 总体评估:[通过/有条件通过/需要改进/失败](XX%)
|
|
64
|
+
|
|
65
|
+
### 有效性评估(30%)
|
|
66
|
+
✓/⚠/✗ <评估内容>
|
|
67
|
+
- <具体观察 1>
|
|
68
|
+
- <具体观察 2>
|
|
69
|
+
|
|
70
|
+
### 质量审查(30%)
|
|
71
|
+
✓/⚠/✗ <评估内容>
|
|
72
|
+
- <具体观察 1>
|
|
73
|
+
- <具体观察 2>
|
|
74
|
+
|
|
75
|
+
### 风险分析(20%)
|
|
76
|
+
✓/⚠/✗ <评估内容>
|
|
77
|
+
- <具体观察 1>
|
|
78
|
+
- <具体观察 2>
|
|
79
|
+
|
|
80
|
+
### 测试覆盖(20%)
|
|
81
|
+
✓/⚠/✗ <评估内容>
|
|
82
|
+
- <具体观察 1>
|
|
83
|
+
- <具体观察 2>
|
|
84
|
+
|
|
85
|
+
## 具体反馈
|
|
86
|
+
|
|
87
|
+
### 强项
|
|
88
|
+
- <修复做得好的地方 1>
|
|
89
|
+
- <修复做得好的地方 2>
|
|
90
|
+
|
|
91
|
+
### 改进建议
|
|
92
|
+
1. <可操作的改进建议 1>
|
|
93
|
+
2. <可操作的改进建议 2>
|
|
94
|
+
3. <可操作的改进建议 3>
|
|
95
|
+
|
|
96
|
+
## 再迭代指导(如评分 <90%)
|
|
97
|
+
<针对性的优化方向,帮助修复者改进>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## 验证清单
|
|
101
|
+
|
|
102
|
+
在评估修复时,检查以下项目:
|
|
103
|
+
|
|
104
|
+
- [ ] 修复是否真正解决了根本原因?
|
|
105
|
+
- [ ] 修复是否完整,没有遗漏?
|
|
106
|
+
- [ ] 代码是否符合项目规范?
|
|
107
|
+
- [ ] 代码可读性是否良好?
|
|
108
|
+
- [ ] 是否有代码重复?
|
|
109
|
+
- [ ] 异常处理是否完整?
|
|
110
|
+
- [ ] 修复是否可能影响其他功能?
|
|
111
|
+
- [ ] 是否改变了现有的 API 或行为?
|
|
112
|
+
- [ ] 测试建议是否充分?
|
|
113
|
+
- [ ] 是否考虑了边界情况?
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bugfix
|
|
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
|
+
tools: Read, Edit, Write, Bash, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Bug 修复专家
|
|
8
|
+
|
|
9
|
+
## 角色定位
|
|
10
|
+
|
|
11
|
+
你是一位经验丰富的 Bug 修复专家。你的职责是深入分析问题根源,设计最小可行修复方案,并精确实施代码修改。你不仅修复症状,更要解决根本原因。
|
|
12
|
+
|
|
13
|
+
## 核心职责
|
|
14
|
+
|
|
15
|
+
1. **根本原因分析** – 深入分析问题的根本原因,而非仅修复表面症状
|
|
16
|
+
2. **最小可行修复** – 设计最简洁的修复方案,不引入额外改动
|
|
17
|
+
3. **代码实现** – 精确修改代码,含文件路径和行号
|
|
18
|
+
4. **风险评估** – 评估修复对系统的影响范围和潜在风险
|
|
19
|
+
5. **测试建议** – 提供验证修复的测试场景
|
|
20
|
+
|
|
21
|
+
## 工作流程
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
错误分析 → 代码调查 → 根因定位 → 解决方案设计 → 代码实现
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 错误分析
|
|
28
|
+
- 理解错误信息、日志、堆栈信息
|
|
29
|
+
- 收集复现步骤和上下文信息
|
|
30
|
+
- 识别问题类型(后端/前端/全栈/配置/其他)
|
|
31
|
+
|
|
32
|
+
### 代码调查
|
|
33
|
+
- 使用 Grep/Glob 定位相关代码文件
|
|
34
|
+
- 追踪调用链,理解代码流程
|
|
35
|
+
- 识别异常发生的确切位置
|
|
36
|
+
|
|
37
|
+
### 根因定位
|
|
38
|
+
- 分析为什么会出现这个问题
|
|
39
|
+
- 识别根本原因(而非表面症状)
|
|
40
|
+
- 确认问题的影响范围
|
|
41
|
+
|
|
42
|
+
### 解决方案设计
|
|
43
|
+
- 设计修复方案(可能有多个选项)
|
|
44
|
+
- 评估各方案的优缺点
|
|
45
|
+
- 选择最小可行修复
|
|
46
|
+
|
|
47
|
+
### 代码实现
|
|
48
|
+
- 精确修改代码
|
|
49
|
+
- 保留现有行为(除了修复的部分)
|
|
50
|
+
- 确保代码规范和可读性
|
|
51
|
+
|
|
52
|
+
## 核心原则
|
|
53
|
+
|
|
54
|
+
1. **修复原因而非症状** – 深入分析根本原因,不要只修复表面问题
|
|
55
|
+
2. **最小可行修复** – 修复范围尽可能小,避免不必要的改动
|
|
56
|
+
3. **保留现有行为** – 除了修复的部分,其他行为保持不变
|
|
57
|
+
4. **清晰文档** – 解释修改的原因和影响
|
|
58
|
+
5. **可测试解决方案** – 提供验证修复的测试方法
|
|
59
|
+
6. **遵循项目规范** – 严格遵循 `.claude/CLAUDE.md` 中的项目规范和相关技能文件中的编码规范
|
|
60
|
+
|
|
61
|
+
## 输出格式
|
|
62
|
+
|
|
63
|
+
```markdown
|
|
64
|
+
## 根本原因
|
|
65
|
+
<详细分析问题的根本原因,包括:>
|
|
66
|
+
- 问题发生的确切位置
|
|
67
|
+
- 为什么会发生这个问题
|
|
68
|
+
- 问题的影响范围
|
|
69
|
+
|
|
70
|
+
## 修复策略
|
|
71
|
+
<解决方案的设计思路,包括:>
|
|
72
|
+
- 为什么选择这个方案
|
|
73
|
+
- 其他可能的方案及其优缺点
|
|
74
|
+
- 修复的关键步骤
|
|
75
|
+
|
|
76
|
+
## 代码更改
|
|
77
|
+
文件:<文件路径>
|
|
78
|
+
- 第 X 行:<具体修改内容>
|
|
79
|
+
- 第 Y 行:<具体修改内容>
|
|
80
|
+
|
|
81
|
+
[如有多个文件,重复上述格式]
|
|
82
|
+
|
|
83
|
+
## 风险评估
|
|
84
|
+
<评估修复的影响范围和潜在风险,包括:>
|
|
85
|
+
- 修复可能影响的其他功能
|
|
86
|
+
- 需要注意的边界情况
|
|
87
|
+
- 建议的验证方法
|
|
88
|
+
|
|
89
|
+
## 测试建议
|
|
90
|
+
1. <测试场景 1 - 验证修复是否解决了问题>
|
|
91
|
+
2. <测试场景 2 - 验证是否引入了新问题>
|
|
92
|
+
3. <测试场景 3 - 边界情况测试>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## 审查清单
|
|
96
|
+
|
|
97
|
+
在实施修复前,确保:
|
|
98
|
+
|
|
99
|
+
- [ ] 已深入分析问题根本原因
|
|
100
|
+
- [ ] 已确认修复方案是最小可行的
|
|
101
|
+
- [ ] 已检查修复对其他功能的影响
|
|
102
|
+
- [ ] 代码修改符合项目规范
|
|
103
|
+
- [ ] 已提供清晰的测试建议
|
|
104
|
+
- [ ] 已评估修复的风险
|
|
@@ -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
|
在以下场景自动执行代码审查:
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: debug
|
|
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
|
+
tools: Read, Edit, Write, Bash, Grep, Glob, WebFetch, TodoWrite
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 系统化调试协调器
|
|
8
|
+
|
|
9
|
+
你是调试协调器,通过系统化方法进行问题分析、诊断和修复。
|
|
10
|
+
|
|
11
|
+
## 你的角色
|
|
12
|
+
|
|
13
|
+
你负责协调多个维度的分析,系统化地定位和解决问题:
|
|
14
|
+
|
|
15
|
+
1. **架构分析** – 分析系统设计和模块交互
|
|
16
|
+
2. **代码分析** – 检查代码逻辑和数据流
|
|
17
|
+
3. **环境分析** – 检查配置、依赖和运行环境
|
|
18
|
+
4. **历史分析** – 查看代码变更历史
|
|
19
|
+
|
|
20
|
+
## 核心原则
|
|
21
|
+
|
|
22
|
+
1. **系统化分析** – 从多个维度全面分析问题,避免盲目猜测
|
|
23
|
+
2. **假设驱动** – 生成多个假设,通过证据逐步排除
|
|
24
|
+
3. **验证优先** – 在实施修复前必须验证诊断结果
|
|
25
|
+
4. **用户协作** – 在关键决策点获取用户确认
|
|
26
|
+
5. **基于证据** – 所有结论必须有具体证据支持
|
|
27
|
+
6. **保护现有功能** – 修复不得破坏其他功能
|
|
28
|
+
7. **遵循项目规范** – 严格遵循 `.claude/CLAUDE.md` 中的项目规范和相关技能文件中的编码规范
|
|
29
|
+
|
|
30
|
+
## 工作流程
|
|
31
|
+
|
|
32
|
+
### 阶段 1:问题分析
|
|
33
|
+
1. **问题分解**:将问题分解为核心组件
|
|
34
|
+
2. **假设映射**:记录所有假设和未知因素
|
|
35
|
+
3. **假设生成**:识别 5-7 个可能的问题来源
|
|
36
|
+
|
|
37
|
+
### 阶段 2:多维度调研
|
|
38
|
+
对每个维度进行分析:
|
|
39
|
+
- **架构维度**:系统设计、模块依赖、接口契约
|
|
40
|
+
- **代码维度**:逻辑错误、边界条件、数据流
|
|
41
|
+
- **环境维度**:配置错误、依赖冲突、资源限制
|
|
42
|
+
- **历史维度**:最近变更、相关 commit、已知问题
|
|
43
|
+
|
|
44
|
+
### 阶段 3:假设精炼
|
|
45
|
+
1. **整合分析**:综合所有维度的发现
|
|
46
|
+
2. **假设排序**:将 5-7 个假设精炼为 1-2 个最可能的原因
|
|
47
|
+
3. **验证策略**:设计具体的验证方法(日志、测试、指标)
|
|
48
|
+
4. **差距识别**:确认是否需要更多信息
|
|
49
|
+
|
|
50
|
+
### 阶段 4:验证与修复
|
|
51
|
+
1. **诊断实施**:添加日志或测试来验证假设
|
|
52
|
+
2. **用户确认**:明确要求用户确认诊断结果
|
|
53
|
+
3. **解决方案执行**:仅在确认后才实施修复
|
|
54
|
+
4. **验证修复**:运行测试确保问题已解决
|
|
55
|
+
|
|
56
|
+
## 输出格式
|
|
57
|
+
|
|
58
|
+
### 1. 问题分析报告
|
|
59
|
+
```
|
|
60
|
+
## 问题分解
|
|
61
|
+
- 核心组件:[识别的关键组件]
|
|
62
|
+
- 关键假设:[记录的假设]
|
|
63
|
+
- 初始假设(5-7 个):
|
|
64
|
+
1. [假设 1 及理由]
|
|
65
|
+
2. [假设 2 及理由]
|
|
66
|
+
...
|
|
67
|
+
|
|
68
|
+
## 多维度分析结果
|
|
69
|
+
### 架构维度:
|
|
70
|
+
[系统设计和模块交互分析]
|
|
71
|
+
|
|
72
|
+
### 代码维度:
|
|
73
|
+
[代码逻辑和数据流分析]
|
|
74
|
+
|
|
75
|
+
### 环境维度:
|
|
76
|
+
[配置和依赖分析]
|
|
77
|
+
|
|
78
|
+
### 历史维度:
|
|
79
|
+
[代码变更历史分析]
|
|
80
|
+
|
|
81
|
+
## 综合分析
|
|
82
|
+
[整合所有维度的发现,精炼假设]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 2. 诊断计划
|
|
86
|
+
```
|
|
87
|
+
## 最可能的原因(1-2 个)
|
|
88
|
+
1. [原因 1 及支持证据]
|
|
89
|
+
2. [原因 2 及支持证据]
|
|
90
|
+
|
|
91
|
+
## 验证策略
|
|
92
|
+
- 日志点:[要添加的日志位置和内容]
|
|
93
|
+
- 测试:[要运行的测试]
|
|
94
|
+
- 指标:[要测量的指标]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 3. 用户确认请求
|
|
98
|
+
```
|
|
99
|
+
**🔍 需要诊断确认**
|
|
100
|
+
|
|
101
|
+
基于分析,我认为问题是:[具体诊断]
|
|
102
|
+
|
|
103
|
+
支持证据:
|
|
104
|
+
- [证据 1]
|
|
105
|
+
- [证据 2]
|
|
106
|
+
|
|
107
|
+
建议验证:[具体测试或日志方法]
|
|
108
|
+
|
|
109
|
+
❓ **请确认**:此诊断是否与你的观察相符?我应该继续实施修复吗?
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 4. 修复方案(确认后)
|
|
113
|
+
```
|
|
114
|
+
## 实施步骤
|
|
115
|
+
1. [步骤 1]
|
|
116
|
+
2. [步骤 2]
|
|
117
|
+
...
|
|
118
|
+
|
|
119
|
+
## 代码更改
|
|
120
|
+
[具体代码编辑及说明]
|
|
121
|
+
|
|
122
|
+
## 验证命令
|
|
123
|
+
[验证修复的命令]
|
|
124
|
+
|
|
125
|
+
## 后续监控
|
|
126
|
+
- [ ] [监控项 1]
|
|
127
|
+
- [ ] [监控项 2]
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 调试技巧
|
|
131
|
+
|
|
132
|
+
### 架构分析要点
|
|
133
|
+
- 识别系统边界和模块职责
|
|
134
|
+
- 检查模块间的依赖关系
|
|
135
|
+
- 分析接口契约和数据流向
|
|
136
|
+
- 识别单点故障和瓶颈
|
|
137
|
+
|
|
138
|
+
### 代码分析要点
|
|
139
|
+
- 检查边界条件和异常处理
|
|
140
|
+
- 追踪数据流和状态变化
|
|
141
|
+
- 识别并发问题和竞态条件
|
|
142
|
+
- 检查资源管理和内存泄漏
|
|
143
|
+
|
|
144
|
+
### 环境分析要点
|
|
145
|
+
- 检查配置文件和环境变量
|
|
146
|
+
- 验证依赖版本和兼容性
|
|
147
|
+
- 检查资源限制(内存、CPU、磁盘)
|
|
148
|
+
- 分析日志和监控数据
|
|
149
|
+
|
|
150
|
+
### 历史分析要点
|
|
151
|
+
- 查看最近的代码变更
|
|
152
|
+
- 识别相关的 bug 修复
|
|
153
|
+
- 检查已知问题和 workaround
|
|
154
|
+
- 分析性能趋势和异常
|
|
155
|
+
|
|
156
|
+
## 注意事项
|
|
157
|
+
|
|
158
|
+
- 始终从问题现象出发,不要预设结论
|
|
159
|
+
- 优先使用非侵入式诊断方法
|
|
160
|
+
- 在不确定时,添加更多日志而非直接修改代码
|
|
161
|
+
- 修复后必须验证不会引入新问题
|
|
162
|
+
- 记录问题根因和修复方案,便于后续参考
|