Skip to content

Commit 9bee332

Browse files
authored
Update CodeBuddy commands and rules for better workflow. (#3213)
1 parent 2f92aef commit 9bee332

File tree

7 files changed

+230
-63
lines changed

7 files changed

+230
-63
lines changed

.codebuddy/commands/cr.md

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,17 @@ done
6161

6262
### 本地模式
6363

64+
获取当前分支相对 main 的完整变更:
65+
6466
```bash
67+
# 拉取最新的 main 分支
68+
git fetch origin main
69+
70+
# 当前分支相对 origin/main 的完整变更(已提交 + 暂存区 + 工作区的最终结果)
71+
git diff origin/main
72+
73+
# 查看文件状态(用于识别未跟踪文件)
6574
git status
66-
git diff
67-
git diff --cached
6875
```
6976

7077
对于未跟踪的新增文件(`git status` 中以 `??` 开头的文件),使用 Read 工具读取文件内容进行审查。
@@ -73,9 +80,8 @@ git diff --cached
7380

7481
先获取 PR 信息(一次调用获取所有需要的字段):
7582
```bash
76-
PR_INFO=$(gh pr view {pr_number} --json headRefName,baseRefName,author)
83+
PR_INFO=$(gh pr view {pr_number} --json headRefName,author)
7784
PR_BRANCH=$(echo "$PR_INFO" | jq -r '.headRefName')
78-
BASE_BRANCH=$(echo "$PR_INFO" | jq -r '.baseRefName')
7985
PR_AUTHOR=$(echo "$PR_INFO" | jq -r '.author.login')
8086
```
8187

@@ -94,9 +100,14 @@ git worktree add /tmp/pr-review-{pr_number} pr-{pr_number}
94100
cd /tmp/pr-review-{pr_number}
95101
```
96102

97-
获取变更内容和评论:
103+
获取变更内容和评论(两种情况通用)
98104
```bash
99-
git diff origin/${BASE_BRANCH}...HEAD
105+
# 拉取最新的 main 分支
106+
git fetch origin main
107+
108+
# 当前分支相对 origin/main 的完整变更
109+
git diff origin/main
110+
100111
gh pr view {pr_number} --comments
101112
```
102113

.codebuddy/commands/pr.md

Lines changed: 70 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@ description: 提交 PR - 自动识别新建或追加提交
1010

1111
## 前置检查
1212

13-
### 检查是否已有开启的 PR
14-
1513
```bash
16-
CURRENT_BRANCH=$(git branch --show-current)
17-
gh pr list --head "$CURRENT_BRANCH" --state open --json number,url
14+
git fetch origin main && \
15+
CURRENT_BRANCH=$(git branch --show-current) && \
16+
echo "CURRENT_BRANCH:$CURRENT_BRANCH" && \
17+
gh pr list --head "$CURRENT_BRANCH" --state open --json number,url && \
18+
gh api user --jq '.login'
1819
```
1920

21+
记录:当前分支、是否有开启的 PR、GitHub username(供新建模式使用)。
22+
2023
根据结果选择模式:
2124

2225
| 当前分支 | 已有开启的 PR | 模式 |
@@ -30,82 +33,123 @@ gh pr list --head "$CURRENT_BRANCH" --state open --json number,url
3033
## 第一步:确定提交范围
3134

3235
运行 `git status --porcelain`
33-
- 若无输出:提示无变更,终止流程
34-
- 若暂存区有内容,且工作区也有内容(含未跟踪文件):询问用户选择局部提交或全部提交
35-
- 否则:全部提交(执行 `git add .`
36+
- 若有输出:
37+
- 若暂存区有内容,且工作区也有内容(含未跟踪文件):询问用户选择局部提交或全部提交
38+
- 否则:全部提交
39+
- 若无输出:记录为**无本地变更**,跳过第二、三步
3640

3741
**判断方法**:第一列非空格为暂存区有内容;第二列非空格或以 `??` 开头为工作区有内容。
3842

39-
若为**局部提交**,记录**暂存区文件列表**供后续步骤使用。
43+
若为**局部提交**使用 `git diff --cached --name-only` 记录**暂存区文件列表**供后续步骤使用。
4044

4145
---
4246

4347
## 第二步:格式化代码
4448

49+
`./codeformat.sh` 存在,执行:
50+
4551
```bash
4652
./codeformat.sh
4753
```
4854

4955
忽略输出的报错信息,只要运行就会完成格式化。
5056

51-
格式化后根据第一步确定的提交范围处理
57+
格式化后根据第一步结果处理暂存区
5258

53-
| 提交范围 | 处理方式 |
54-
|----------|----------|
55-
| 全部提交 | 执行 `git add .` 将所有变更(包括格式化修改)加入暂存区 |
56-
| 局部提交 | 检查第一步记录的暂存区文件是否被格式化修改,如有则重新加入暂存区`git add {文件}`,忽略其他文件的格式化修改 |
59+
| 第一步结果 | 处理方式 |
60+
|------------|----------|
61+
| 全部提交 | 执行 `git add .` 将所有变更加入暂存区 |
62+
| 局部提交 | 仅将第一步记录的文件重新加入暂存区`git add {文件}`|
5763

5864
---
5965

60-
## 第三步:生成提交信息
61-
62-
查看将要提交的内容:
66+
## 第三步:生成 Commit 信息
6367

6468
```bash
6569
git diff --cached
6670
```
6771

68-
根据变更内容生成**Commit 信息**英语,120 字符内,以句号结尾,侧重描述用户可感知的变化
72+
根据暂存区变更生成 **Commit 信息**英语,120 字符内,以句号结尾,侧重描述用户可感知的变化。
6973

7074
---
7175

7276
## 第四步:提交并推送
7377

74-
**直接执行,无需确认。**
75-
7678
### 追加模式
7779

80+
检查未推送的 commit:
81+
7882
```bash
79-
git commit -m "{Commit 信息}"
83+
git log origin/{当前分支}..HEAD --oneline
84+
```
85+
86+
| 暂存区 | 未推送 commit | 操作 |
87+
|--------|---------------|------|
88+
| 有内容 | - | 提交并推送 |
89+
| 无内容 || 仅推送 |
90+
| 无内容 || 提示"无新变更需要提交",流程结束 |
91+
92+
```bash
93+
# 若暂存区有内容,提交并推送
94+
git commit -m "{Commit 信息}" && git push
95+
96+
# 若暂存区无内容但有未推送 commit,仅推送
8097
git push
8198
```
8299

83100
输出:
84101

85102
```
86-
**Commit**:{Commit 信息}
103+
**Commit**:{Commit 信息}(若有新提交)
87104
88105
**PR 链接**(已追加提交):{PR 链接}
89106
```
90107

91108
### 新建模式
92109

93-
生成以下信息:
110+
#### 1. 分析完整变更
94111

95-
- **分支名称**`feature/{username}_模块名``bugfix/{username}_模块名``{username}` 为 GitHub 用户 ID 全小写,模块名用下划线连接,最多两个单词)
112+
分析 PR 包含的所有变更:
113+
114+
```bash
115+
git log origin/main..HEAD --oneline # 已有 commit
116+
git diff --cached # 本次暂存区变更(若第三步已获取则复用)
117+
```
118+
119+
若已有 commit 为空且暂存区无内容,提示无变更,终止流程。
120+
121+
#### 2. 生成 PR 信息
122+
123+
根据上述完整变更(已有 commit + 暂存区变更)生成:
124+
125+
- **分支名称**`feature/{username}_模块名``bugfix/{username}_模块名``{username}` 为前置检查获取的 GitHub 用户 ID 全小写,模块名用下划线连接,最多两个单词)
126+
- **PR 标题**:英语,120 字符内,以句号结尾,侧重描述用户可感知的变化
96127
- **PR 描述**:中文,简要说明变更内容和目的
97128

129+
#### 3. 处理分支并提交推送
130+
131+
切换到新分支:
132+
133+
| 当前分支 | 操作 |
134+
|----------|------|
135+
| main | `git checkout -b {分支名称}` |
136+
| 非 main | `git branch -m {分支名称}` |
137+
138+
提交并推送:
139+
98140
```bash
99-
git checkout -b {分支名称}
141+
# 若暂存区有内容,先提交
100142
git commit -m "{Commit 信息}"
143+
144+
# 推送并创建 PR
101145
git push -u origin {分支名称}
102-
gh pr create --title "{Commit 信息}" --body "{PR 描述}"
146+
gh pr create --title "{PR 标题}" --body "{PR 描述}"
103147
```
104148

105149
输出:
106150

107151
```
108-
**PR 标题**:{Commit 信息}
152+
**PR 标题**:{PR 标题}
109153
110154
**PR 描述**:{PR 描述}
111155

.codebuddy/commands/switch-main.md

Lines changed: 0 additions & 27 deletions
This file was deleted.

.codebuddy/commands/worktree.md

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
---
2+
description: 管理 Git Worktree - 创建、切换或清理 worktree,自动同步测试缓存
3+
---
4+
5+
# Git Worktree 管理
6+
7+
管理 git worktree,支持创建、切换和清理操作,切换时自动同步测试缓存目录。
8+
9+
---
10+
11+
## 公共步骤:获取主仓库信息
12+
13+
```bash
14+
MAIN_REPO=$(git worktree list --porcelain | head -1 | sed 's/worktree //')
15+
REPO_NAME=$(basename "$MAIN_REPO")
16+
```
17+
18+
---
19+
20+
## 参数解析
21+
22+
| $ARGUMENTS | 操作 |
23+
|------------|------|
24+
|| 列出现有 worktree,询问用户进入或删除 |
25+
| `{name}` | 进入该 worktree(不存在则创建) |
26+
27+
Worktree 路径命名规范:`{项目名称}-{name}`,与主仓库同级目录。
28+
29+
---
30+
31+
## 无参数模式
32+
33+
```bash
34+
git worktree list
35+
```
36+
37+
若只有主仓库,提示用户使用 `/worktree {name}` 创建新的 worktree,**终止流程**
38+
39+
若有其他 worktree,展示列表并询问用户要执行的操作:
40+
- 进入某个 worktree(执行「同步缓存并切换」,`WT_PATH` 为用户选择的路径)
41+
- 删除某个 worktree(执行「删除 worktree」流程)
42+
43+
---
44+
45+
## 进入 worktree
46+
47+
### 1. 计算路径并检查是否存在
48+
49+
```bash
50+
WT_PATH="$MAIN_REPO/../$REPO_NAME-{name}"
51+
test -d "$WT_PATH" && echo "exists" || echo "not found"
52+
```
53+
54+
### 2. 若不存在则创建
55+
56+
```bash
57+
git fetch origin main
58+
git worktree add -b {name} "$WT_PATH" origin/main
59+
```
60+
61+
### 3. 同步缓存并切换
62+
63+
从主仓库拷贝测试缓存(若存在):
64+
65+
```bash
66+
if [ -d "$MAIN_REPO/test/baseline/.cache" ]; then
67+
mkdir -p "$WT_PATH/test/baseline"
68+
cp -r "$MAIN_REPO/test/baseline/.cache" "$WT_PATH/test/baseline/"
69+
echo "已同步 test/baseline/.cache"
70+
fi
71+
72+
if [ -d "$MAIN_REPO/test/out" ]; then
73+
mkdir -p "$WT_PATH/test"
74+
cp -r "$MAIN_REPO/test/out" "$WT_PATH/test/"
75+
echo "已同步 test/out"
76+
fi
77+
```
78+
79+
切换到 worktree:
80+
81+
```bash
82+
cd "$WT_PATH"
83+
```
84+
85+
输出(新建时):
86+
87+
```
88+
**Worktree 已创建**:{WT_PATH}
89+
**分支**:{name}
90+
**已同步缓存**:{同步的目录列表}
91+
```
92+
93+
输出(已存在时):
94+
95+
```
96+
**已切换到 worktree**:{WT_PATH}
97+
**已同步缓存**:{同步的目录列表}
98+
```
99+
100+
---
101+
102+
## 删除 worktree
103+
104+
### 1. 检查未提交变更
105+
106+
```bash
107+
git -C "{worktree 路径}" status --porcelain
108+
```
109+
110+
若有未提交变更,提示用户并询问是否继续删除。用户取消则**终止流程**
111+
112+
### 2. 切换工作目录(如需要)
113+
114+
若当前工作目录在待删除的 worktree 内,先切换到主仓库:
115+
116+
```bash
117+
cd "$MAIN_REPO"
118+
```
119+
120+
### 3. 移除 worktree
121+
122+
```bash
123+
git worktree remove "{worktree 路径}" --force
124+
```
125+
126+
输出:
127+
128+
```
129+
**已删除 worktree**:{worktree 路径}
130+
```
131+
132+
---
133+
134+
## 重要限制
135+
136+
- **NEVER** 删除主仓库
137+
- 创建 worktree 时始终基于 `origin/main`

.codebuddy/rules/Code.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ alwaysApply: true
66
## 编码规范
77

88
- 对话用中文,代码和注释用英语
9-
- 新需求的编码任务禁止直接编码,先输出关键接口和伪代码,穷尽所有疑问向用户提问,方案确认后才可编码
10-
- 不生成说明文件,除非明确要求
9+
- 所有说明文件、方案设计文件统一放在 `.codebuddy/designs/` 目录(已加入 .gitignore,不参与提交)
10+
- 新需求禁止直接编码,先输出详细方案设计文件,穷尽疑问向用户提问,用户明确确认后再按方案编码
1111
- 复用项目已有功能,保持变更简洁,避免重复代码
1212
- 重构时审查关联代码合理性,顺带清理冗余,不考虑向后兼容
1313
- 版权声明里的年份对新增的文件要使用当前年份(如 `Copyright (C) 2026 Tencent`),已有文件保持原年份不变

0 commit comments

Comments
 (0)