Skip to content

Commit 5fe4e6c

Browse files
authored
Add switch-main command and improve pr and cr command workflows. (#3211)
1 parent a21f3b7 commit 5fe4e6c

File tree

12 files changed

+146
-67
lines changed

12 files changed

+146
-67
lines changed

.codebuddy/commands/cr.md

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ gh auth status
3030
ls -d /tmp/pr-review-* 2>/dev/null
3131
```
3232

33-
仅当上述命令输出了目录列表时,才执行清理:
33+
仅当上述命令输出了目录列表时,才执行清理(无输出则跳过,不打印任何信息)
3434

3535
```bash
3636
for dir in /tmp/pr-review-*; do
@@ -116,17 +116,17 @@ gh pr view {pr_number} --comments
116116
- 问题列表:按序号列出真正存在的问题,每个问题包含位置、描述、修复建议
117117
- 若无问题则输出"无问题"
118118

119-
**输出禁令**(严格遵守)
120-
- **禁止输出任何已排除的问题**,包括禁止以"排除"、"不是问题"、"二次验证后确认正确"等形式提及
121-
- **禁止输出分析推理过程**,只输出最终结论
119+
**!! IMPORTANT - 输出禁令**
120+
- 禁止输出任何已排除的问题,包括禁止以"排除"、"不是问题"、"二次验证后确认正确"等形式提及
121+
- 禁止输出分析推理过程,只输出最终结论
122122

123123
---
124124

125125
## 第三步:处理问题
126126

127127
**若无问题**
128128
- 本地模式 / 在线模式:流程结束
129-
- Worktree 模式:执行清理后流程结束
129+
- Worktree 模式:跳至第四步清理
130130

131131
**若有问题**:按以下流程处理。
132132

@@ -135,16 +135,20 @@ gh pr view {pr_number} --comments
135135
| 模式 | 自己的代码 | 别人的代码 |
136136
|------|----------|----------|
137137
| 本地模式 | 询问修复 | - |
138-
| Worktree 模式 | 优化标题 + 询问修复 + 推送 + 清理 | 优化标题 + 询问评论 + 清理 |
138+
| Worktree 模式 | 优化标题 + 询问修复 + 推送 | 优化标题 + 询问评论 + 提交评论 |
139139
| 在线模式 | 优化标题 + 询问评论 | 优化标题 + 询问评论 |
140140

141+
> **!! CRITICAL - 别人的代码处理规则**
142+
> - **NEVER** 自动修复并推送,只能通过 PR 评论提建议
143+
> - 用户回复问题序号时默认提交评论,除非明确要求"修复并推送"
144+
141145
### 优化标题
142146

143147
如有必要,用 `gh pr edit {pr_number} --title "新标题"` 更新,并输出优化后的标题。
144148

145149
格式:根据变更内容总结 120 字符内的英语概括,以英文句号结尾,中间无其他标点,侧重描述用户可感知的变化。
146150

147-
### 询问修复
151+
### 询问修复(仅限自己的代码)
148152

149153
询问用户需要修复哪些序号的问题,然后逐一修复。
150154

@@ -156,9 +160,9 @@ git add . && git commit -m "{根据修复内容生成}"
156160
git push origin HEAD:$(gh pr view {pr_number} --json headRefName -q '.headRefName')
157161
```
158162

159-
### 询问评论
163+
### 询问评论(别人的代码必须走此流程)
160164

161-
询问用户是否需要将问题作为 PR 行级评论提交。
165+
询问用户是否需要将问题作为 PR 行级评论提交,以及需要提交哪些序号的问题。用户确认后执行评论提交
162166

163167
- 使用简洁的中文描述问题和建议
164168
- **必须**使用 `gh api` + heredoc,**禁止**使用 `gh pr comment``gh pr review` 等或任何非行级评论命令
@@ -169,11 +173,13 @@ gh api repos/{owner}/{repo}/pulls/{pr_number}/reviews --input - <<'EOF'
169173
EOF
170174
```
171175

172-
### 清理(仅 Worktree 模式)
176+
---
177+
178+
## 第四步:清理(仅 Worktree 模式)
173179

174-
若当前分支就是 PR 分支(未创建 worktree),则跳过清理步骤
180+
若当前分支就是 PR 分支(未创建 worktree),则跳过此步骤
175181

176-
若创建了 worktree,自动清理临时环境并输出提示
182+
若创建了 worktree,在第三步所有操作完成后,**直接执行清理,无需确认**
177183

178184
```bash
179185
cd - # 返回原目录

.codebuddy/commands/pr.md

Lines changed: 74 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,119 @@
11
---
2-
description: 发起 PR - 格式化代码并提交 PR
2+
description: 提交 PR - 自动识别新建或追加提交
33
---
44

5-
# 发起 PR 流程
5+
# 提交 PR
66

7-
严格按以下步骤顺序执行
7+
严格按以下步骤顺序执行
88

99
---
1010

11-
## 步骤 1:确定提交范围
11+
## 前置检查
12+
13+
### 检查是否已有开启的 PR
1214

1315
```bash
14-
git diff --cached --stat
15-
git diff --stat
16+
git branch --show-current
17+
gh pr list --head "$(git branch --show-current)" --state open --json number,url
1618
```
1719

18-
根据暂存区和工作区状态判断:
20+
根据结果选择模式:
21+
22+
| 当前分支 | 已有开启的 PR | 模式 |
23+
|----------|---------------|------|
24+
| main | - | **新建模式** |
25+
| 非 main || **追加模式** |
26+
| 非 main || **新建模式** |
27+
28+
---
1929

20-
| 暂存区 | 工作区 | 处理方式 | 是否需要确认 |
21-
|--------|--------|----------|--------------|
22-
| 有内容 | 有内容 | 询问用户:只提交暂存区内容,还是提交全部变更 | **需要确认** |
23-
| 有内容 | 无内容 | 直接使用暂存区内容 | 无需确认 |
24-
| 无内容 | 有内容 | 使用 `git add .` 添加全部变更 | 无需确认 |
25-
| 无内容 | 无内容 | 提示无变更可提交,终止流程 | - |
30+
## 第一步:确定提交范围
2631

27-
记录本步骤确定的提交范围(全部变更 / 仅暂存区)和暂存区涉及的文件列表。
32+
运行 `git status --porcelain`
33+
- 若无输出:提示无变更,终止流程
34+
- 若暂存区有内容,且工作区也有内容(含未跟踪文件):询问用户选择局部提交或全部提交
35+
- 否则:全部提交(执行 `git add .`
36+
37+
**判断方法**:第一列非空格为暂存区有内容;第二列非空格或以 `??` 开头为工作区有内容。
38+
39+
若为**局部提交**,记录**暂存区文件列表**供后续步骤使用。
2840

2941
---
3042

31-
## 步骤 2:格式化代码
43+
## 第二步:格式化代码
3244

3345
```bash
3446
./codeformat.sh
3547
```
3648

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

39-
格式化后处理:
40-
- 如果步骤 1 确定提交**全部变更**:执行 `git add .`
41-
- 如果步骤 1 确定只提交**暂存区内容**:检查格式化产生的变更,将步骤 1 记录的暂存区文件相关的格式化修改加入暂存区(`git add {文件}`
51+
格式化后根据第一步确定的提交范围处理:
52+
53+
| 提交范围 | 处理方式 |
54+
|----------|----------|
55+
| 全部提交 | 执行 `git add .` 将所有变更(包括格式化修改)加入暂存区 |
56+
| 局部提交 | 检查第一步记录的暂存区文件是否被格式化修改,如有则重新加入暂存区(`git add {文件}`),忽略其他文件的格式化修改 |
4257

4358
---
4459

45-
## 步骤 3:生成 PR 信息并创建 PR
60+
## 第三步:生成提交信息
61+
62+
查看将要提交的内容:
63+
64+
```bash
65+
git diff --cached
66+
```
67+
68+
根据变更内容生成**Commit 信息**(英语,120 字符内,以句号结尾,侧重描述用户可感知的变化)。
69+
70+
---
4671

47-
`git status``git diff --cached` 查看将要提交的内容,生成以下信息:
72+
## 第四步:提交并推送
73+
74+
**直接执行,无需确认。**
75+
76+
### 追加模式
77+
78+
```bash
79+
git commit -m "{Commit 信息}"
80+
git push
81+
```
82+
83+
输出:
84+
85+
```
86+
**Commit**:{Commit 信息}
87+
88+
**PR 链接**:{PR 链接}(已追加提交)
89+
```
90+
91+
### 新建模式
92+
93+
生成以下信息:
4894

4995
- **分支名称**`feature/{username}_模块名``bugfix/{username}_模块名``{username}` 为 GitHub 用户 ID 全小写,模块名用下划线连接,最多两个单词)
50-
- **PR 标题**:英语,120 字符内,以句号结尾,侧重描述用户可感知的变化
5196
- **PR 描述**:中文,简要说明变更内容和目的
5297

53-
**直接执行以下命令创建 PR,无需等待用户确认:**
54-
5598
```bash
5699
git checkout -b {分支名称}
57-
git commit -m "{PR标题}"
100+
git commit -m "{Commit 信息}"
58101
git push -u origin {分支名称}
59-
gh pr create --title "{PR标题}" --body "{PR描述}"
102+
gh pr create --title "{Commit 信息}" --body "{PR 描述}"
60103
```
61104

62-
完成后输出以下信息
105+
输出
63106

64107
```
65-
**PR 标题**:{PR标题}
108+
**PR 标题**:{Commit 信息}
66109
67-
**PR 描述**:{PR描述}
110+
**PR 描述**:{PR 描述}
68111
69-
**PR 链接**:{PR链接}
112+
**PR 链接**:{PR 链接}(新建)
70113
```
71114

72115
---
73116

74-
## 重要限制
117+
## **!! IMPORTANT - 重要限制**
75118

76-
- **禁止**在 main 分支直接提交推送代码
77-
- **禁止** force push
119+
- **NEVER** 执行 force push

.codebuddy/commands/switch-main.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
---
2+
description: 切换到主分支 - 将本地未提交的变更转移到更新后的 main 分支,并清理已合并的旧分支
3+
---
4+
5+
# 切换到主分支
6+
7+
将本地未提交的变更转移到更新后的 main 分支,并清理已合并的旧分支。
8+
9+
## 执行流程
10+
11+
1. 记录当前分支名称,检查是否有本地变更
12+
2. 如有变更,执行 `git stash push --include-untracked -m "switch-main"`
13+
3. 切换到 main 并更新:`git checkout main && git pull --rebase origin main`
14+
4. 如有 stash,执行 `git stash pop --index` 还原变更
15+
5. 如原分支有已合并的 PR(`gh pr list --head "{分支}" --state merged`),删除本地分支
16+
17+
## 冲突处理
18+
19+
如果 `git stash pop` 遇到冲突:
20+
21+
1. 列出冲突文件
22+
2. 阅读每个冲突文件的代码,分析冲突原因
23+
3. 提供自动修复方案(说明如何解决每个冲突)
24+
4. 询问用户是否执行自动修复
25+
5. 用户确认后执行修复,然后 `git stash drop`
26+
27+
**注意**:解决后不修改暂存区状态,保持还原后的原始状态。

.codebuddy/rules/Git.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@ description: Git 操作规范
33
alwaysApply: true
44
---
55

6-
## 操作限制
6+
## **!! IMPORTANT - 操作限制**
77

8-
- 禁止自动执行 `git stash``git reset``git checkout` 等改变暂存区或工作区状态的命令,除非用户明确要求提交代码
8+
- **NEVER** 自动执行 `git stash``git reset``git checkout` 等改变暂存区或工作区状态的命令,除非用户明确要求提交代码
99
- 必须 stash 时需用户确认,完成后用 `git stash pop --index` 完全还原原始的暂存区和工作区状态
10-
- 禁止在 main 分支直接提交推送代码,必须通过 PR 流程
11-
- 禁止 force push,补充 PR 的提交使用正常追加
10+
- **NEVER** 在 main 分支直接提交推送代码,必须通过 PR 流程
1211

1312
## 分支命名
1413

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,7 @@ cmake --build cmake-build-debug --target PAGFullTest
2525
- 使用 `Baseline::Compare(pixels, key)` 比较截图,key 格式为 `{folder}/{name}`,例如 `PAGSurfaceTest/Mask`
2626
- 截图输出到 `test/out/{folder}/{name}.webp`,基准图为同目录下 `{name}_base.webp`
2727
- 比较机制:对比 `test/baseline/version.json`(仓库)与 `test/baseline/.cache/version.json`(本地)中同一 key 的版本号,一致时才进行基准图对比,不一致则跳过返回成功,以此接受截图变更
28-
- **禁止任何形式的自动接受截图基准变更**,包括禁止自动运行 `UpdateBaseline` target、禁止修改或覆盖 `version.json` 文件,必须经过用户确认后运行 `accept_baseline.sh` 脚本来接受变更
28+
29+
**!! IMPORTANT - 截图基准变更限制**
30+
- **NEVER** 自动接受截图基准变更,包括禁止自动运行 `UpdateBaseline` target、禁止修改或覆盖 `version.json` 文件
31+
- 必须经过用户确认后运行 `accept_baseline.sh` 脚本来接受变更

src/rendering/filters/BrightnessContrastFilter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ static const char FRAGMENT_SHADER[] = R"(
7272

7373
std::shared_ptr<tgfx::Image> BrightnessContrastFilter::Apply(std::shared_ptr<tgfx::Image> input,
7474
RenderCache* cache, Effect* effect,
75-
Frame layerFrame, tgfx::Point* offset) {
75+
Frame layerFrame,
76+
tgfx::Point* offset) {
7677
auto* brightnessContrastEffect = static_cast<const BrightnessContrastEffect*>(effect);
7778
auto brightness = brightnessContrastEffect->brightness->getValueAt(layerFrame);
7879
auto contrast = brightnessContrastEffect->contrast->getValueAt(layerFrame);

src/rendering/filters/DisplacementMapFilter.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,9 @@ static void Matrix3x3ToMat4(const std::array<float, 9>& m3, float* m4) {
253253
m4[15] = 1.0f;
254254
}
255255

256-
void DisplacementMapFilter::onUpdateUniforms(
257-
tgfx::RenderPass* renderPass, tgfx::GPU* gpu, const std::vector<std::shared_ptr<tgfx::Texture>>&,
258-
const tgfx::Point&) const {
256+
void DisplacementMapFilter::onUpdateUniforms(tgfx::RenderPass* renderPass, tgfx::GPU* gpu,
257+
const std::vector<std::shared_ptr<tgfx::Texture>>&,
258+
const tgfx::Point&) const {
259259

260260
DisplacementMapUniforms uniforms = {};
261261

@@ -354,7 +354,6 @@ void DisplacementMapFilter::onUpdateUniforms(
354354
renderPass->setUniformBuffer(0, uniformBuffer, 0, sizeof(DisplacementMapUniforms));
355355
}
356356
}
357-
358357
}
359358

360359
tgfx::Rect DisplacementMapFilter::filterBounds(const tgfx::Rect& srcRect) const {

src/rendering/filters/HueSaturationFilter.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ std::shared_ptr<tgfx::Image> HueSaturationFilter::Apply(std::shared_ptr<tgfx::Im
9595
auto colorizeHue = hueSaturationEffect->colorizeHue->getValueAt(layerFrame);
9696
auto colorizeSaturation = hueSaturationEffect->colorizeSaturation->getValueAt(layerFrame);
9797
auto colorizeLightness = hueSaturationEffect->colorizeLightness->getValueAt(layerFrame);
98-
auto filter = std::make_shared<HueSaturationFilter>(cache, hue, saturation, lightness, colorize,
99-
colorizeHue, colorizeSaturation,
100-
colorizeLightness);
98+
auto filter =
99+
std::make_shared<HueSaturationFilter>(cache, hue, saturation, lightness, colorize,
100+
colorizeHue, colorizeSaturation, colorizeLightness);
101101
return input->makeWithFilter(tgfx::ImageFilter::Runtime(filter), offset);
102102
}
103103

src/rendering/filters/MosaicFilter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ std::shared_ptr<tgfx::Image> MosaicFilter::Apply(std::shared_ptr<tgfx::Image> in
4848
auto horizontalBlocks = 1.0f / mosaicEffect->horizontalBlocks->getValueAt(layerFrame);
4949
auto verticalBlocks = 1.0f / mosaicEffect->verticalBlocks->getValueAt(layerFrame);
5050

51-
auto filter = std::make_shared<MosaicFilter>(cache, horizontalBlocks, verticalBlocks, sharpColors);
51+
auto filter =
52+
std::make_shared<MosaicFilter>(cache, horizontalBlocks, verticalBlocks, sharpColors);
5253

5354
return input->makeWithFilter(tgfx::ImageFilter::Runtime(filter), offset);
5455
}

src/rendering/filters/glow/GlowFilter.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
namespace pag {
2727

2828
std::shared_ptr<tgfx::Image> GlowFilter::Apply(std::shared_ptr<tgfx::Image> input,
29-
RenderCache* cache, Effect* effect,
30-
Frame layerFrame, tgfx::Point* offset) {
29+
RenderCache* cache, Effect* effect, Frame layerFrame,
30+
tgfx::Point* offset) {
3131
auto glowEffect = static_cast<GlowEffect*>(effect);
3232
auto glowRadius = glowEffect->glowRadius->getValueAt(layerFrame);
3333
auto resizeRatio = 1.0f - glowRadius / 1500.f;
@@ -37,13 +37,13 @@ std::shared_ptr<tgfx::Image> GlowFilter::Apply(std::shared_ptr<tgfx::Image> inpu
3737
auto blurFilterH = std::make_shared<GlowBlurRuntimeFilter>(cache, BlurDirection::Horizontal,
3838
1.0f / blurWidth, resizeRatio);
3939
auto imageFilterH = tgfx::ImageFilter::Runtime(blurFilterH);
40-
auto blurFilterV =
41-
std::make_shared<GlowBlurRuntimeFilter>(cache, BlurDirection::Vertical, 1.0f / blurHeight, 1.0f);
40+
auto blurFilterV = std::make_shared<GlowBlurRuntimeFilter>(cache, BlurDirection::Vertical,
41+
1.0f / blurHeight, 1.0f);
4242
auto imageFilterV = tgfx::ImageFilter::Runtime(blurFilterV);
4343
auto blurFilter = tgfx::ImageFilter::Compose(imageFilterH, imageFilterV);
4444
auto blurImage = input->makeWithFilter(std::move(blurFilter));
45-
auto mergeFilter =
46-
tgfx::ImageFilter::Runtime(std::make_shared<GlowMergeRuntimeFilter>(cache, progress, blurImage));
45+
auto mergeFilter = tgfx::ImageFilter::Runtime(
46+
std::make_shared<GlowMergeRuntimeFilter>(cache, progress, blurImage));
4747
return input->makeWithFilter(std::move(mergeFilter), offset);
4848
}
4949
} // namespace pag

0 commit comments

Comments
 (0)