1
0
Files
nex/docs/prompts/prompt-smart-merge.md
lanyuanxiaoyao 086dd1fed7 refactor: 重构智能合并提示词,优化交互体验并增加语义审查能力
- 三阶段模型:计划审批(1次) → 自动合并(仅异常中断) → 汇总收尾(1次),减少冗余介入
- 新增语义审查:合并后自动分析代码冗余/过时模式/未集成基础设施/风格不一致
- 完善安全锚点体系:全局锚点+分支级锚点,分级回退机制
- 修复多个逻辑缺陷:stash含未跟踪文件、分支匹配过宽、远端分支拉取重名、语义修复交叉污染等
- 明确提问工具选项和交互方式,消除歧义引导
2026-04-23 22:35:24 +08:00

220 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
将所有 `dev*` 分支智能合并到目标分支(默认 main三阶段执行计划审批步骤1-3→ 自动合并步骤4→ 汇总收尾步骤5
## 约束
- 全程仅使用 `git merge`,禁止 rebase
- `git add` 仅指定明确的文件路径,禁止 `git add .`/`git add -A`
- `git reset --hard` 仅配合安全锚点 tag 使用,禁止裸用
- 冲突文件禁止 AI 自主决定写入内容用户在冲突面板中选择方案后AI 按选定方案执行写入,属于授权行为
- 禁止自动 `git push`
- 合并提交的确认在步骤 3 一次性完成,分支删除的确认在步骤 5 一次性完成;阶段二仅在冲突/异常时中断
- 语义审查的修复提交独立于合并提交,必要时可单独 revert
- 禁止使用 npm/npx/pnpm前端命令统一使用 bun
## 安全锚点体系
| 锚点 | 创建时机 | 用途 |
| ---- | -------- | ---- |
| `pre-merge-backup-{timestamp}` | 步骤 1合并前目标分支 HEAD | 全局回退点,可撤销所有合并恢复到初始状态 |
| `merge-before-{分支名}-{timestamp}` | 步骤 4 每个分支合并前 | 分支级回退点,撤销单个分支的合并和修复 |
全局锚点在步骤 4 中不主动使用,仅在用户需要"全部重来"时手动使用:`git reset --hard pre-merge-backup-{timestamp}`
## 1. 准备(自动)
- `git status` 检查工作区
- 不干净:`git stash push --include-untracked -m merge-auto-stash-{timestamp}`,记录 stash 引用,步骤 5 末尾恢复
- 默认目标分支 main用提问工具让用户确认或指定其他分支选项`main` / `develop` / 用户自定义,用户自定义时等待输入分支名)
- `git checkout {target}`
- 失败(分支不存在):用提问工具让用户选择其他分支或终止
- `git pull`
- 失败:报告错误,用提问工具让用户选择:强制拉取(`git pull --rebase` 不允许,仅 `git fetch` + 手动合并)/ 终止
- `git fetch --all` 拉取远端引用
- 列出 dev 分支(本地 + 远端分开):
- 本地:`git branch --list 'dev*'`
- 远端仅存在:`git branch -r --list 'origin/dev*'`,对远端独有的分支执行 `git checkout -b {分支名} origin/{分支名}` 拉取到本地
- 若本地已存在同名分支:报告冲突,用提问工具让用户选择:使用本地版本 / 重命名后拉取 / 跳过
- 无任何 dev 分支则结束
- 创建全局安全锚点:`git tag pre-merge-backup-{timestamp}`
## 2. 分析
### 2.1 信息收集(并行)
对每个 dev 分支并行收集:
| 维度 | 命令/方式 |
| ---- | --------- |
| 基础 | 分支名、`git rev-parse {branch}` 记录 HEAD commit hash、commit 数/消息、`git branch --merged` 判断是否已合并 |
| 变更 | `git diff --name-status {target}...{branch}`、按文件路径推断所属模块(如 `backend/api/` → API、行数统计 |
| 依赖 | 收集各分支变更文件列表,求交集判断文件重叠;重叠文件涉及公共模块(共享类型、工具函数、配置)的标记为有依赖关系 |
| 公共文件清单 | 基于依赖分析,标记出主分支上的公共文件路径列表,供步骤 4 语义审查使用 |
### 2.2 冲突预测(串行)
`git merge --no-commit --no-ff` 会修改工作区和索引,禁止并行,逐个分支串行执行:
`git merge --no-commit --no-ff {branch}``git diff --name-only --diff-filter=U` 收集冲突文件 → `git merge --abort`
`git merge --abort` 失败,执行 `git reset --hard pre-merge-backup-{timestamp}` 恢复到全局安全锚点后继续。若 hard reset 也失败,报告严重错误,终止流程,提示用户手动处理。
### 2.3 分析结果汇总
汇总 2.1 和 2.2 的结果,产出每个分支的:基础信息(含 HEAD hash、变更范围、依赖关系、冲突预测。供步骤 3 和步骤 4 使用。
## 3. 计划(用户确认 — 阶段一唯一介入)
按优先级排序:已合并(跳过) → 公共/基础设施变更(变更文件仅涉及 2.1 标记的公共文件清单中的文件) → 独立模块 → 有依赖的 → 高冲突/跨模块。
风险评级:
- 低:无冲突且无依赖
- 中:有冲突或跨模块依赖
- 高:(冲突文件 ≥ 3 或冲突占比 ≥ 30%) 且 有跨模块依赖
输出合并计划表(列:分支、状态、模块、文件数、依赖、预估冲突、风险、语义审查),用提问工具让用户确认,选项:
- **确认执行**:按当前计划顺序合并,语义审查设置不变
- **调整顺序**:用户指定新的分支顺序
- **排除分支**:用户指定不参与合并的分支名(支持多个)
- **调整语义审查**:用户指定关闭某些分支的审查(等待用户输入分支名)
- **终止**:取消整个流程
用户选择"调整顺序""排除分支""调整语义审查"后,重新展示更新后的计划表,再次确认。可多次调整,直到用户选择"确认执行"或"终止"。
计划表中"语义审查"列默认全部开启。确认后进入步骤 4不再逐分支确认。
## 4. 执行(自动,仅冲突/异常时中断)
对计划表中待合并分支依次执行。若全部已合并(无可合并分支),直接跳到步骤 5。
### 合并前检查(自动)
- `git status` 确认在目标分支且工作区干净
- 不在目标分支:`git checkout {target}`
- 工作区不干净(非预期状态):报告异常,用提问工具让用户选择:`git stash` 后继续 / 终止
- `git tag merge-before-{分支名}-{timestamp}` 创建分支级安全锚点(加时间戳防止重复)
- 检查分支 HEAD commit hash 是否与步骤 2.1 记录的一致
- 不一致:报告分支有新提交,用提问工具让用户选择:重新分析该分支(回到 2.1+2.2 单分支分析,更新分析结果) / 按当前状态继续 / 跳过
### 合并
`git merge {分支} --no-ff -m "merge: {分支名} → {target}"`
合并可能出现三种结果:
- **无冲突** → 跳到语义审查
- **有冲突** → 进入冲突处理
- **合并失败**(分支不存在、工作区锁定等非冲突错误)→ 报告错误,用提问工具让用户选择:跳过继续下一个 / 终止并输出进度
### 冲突处理(中断点)
`git diff --name-only --diff-filter=U` 列出冲突文件,展示冲突决策面板:
| # | 文件 | 冲突类型 | HEAD 改动 | 分支改动 | 推荐方案 |
| - | ---- | -------- | --------- | -------- | -------- |
用提问工具让用户选择:
- **按推荐方案全部处理**:所有文件执行推荐方案
- **审查部分文件**:用户输入要审查的文件编号,未审查文件按推荐方案处理;对审查文件一次性展示上下文 diff + `<<<<<<<`/`=======`/`>>>>>>>` 原始标记,逐文件用提问工具选择方案(选项:双保留 / 保留目标(--ours) / 保留分支(--theirs) / 用户编辑)
- **放弃合并**`git merge --abort`,跳过当前分支,继续下一个
方案确定后执行:
- 双保留AI 综合两侧变更生成合并后的文件内容,展示变更摘要(改了哪些函数、新增了哪些逻辑),用户确认后写入
- --ours/--theirs`git checkout --ours/--theirs {file}`
- 用户编辑:告知用户文件路径,等待用户回复"完成"后 `git add {file}`
- 逐文件 `git add {file}`
- `git commit --no-edit` 完成合并提交(使用合并时指定的 commit message
### 语义审查(自动,计划中开启时执行)
合并提交后,分析 `git diff merge-before-{branch}-{timestamp}..HEAD` 的语义质量。
辅助数据源:
| 数据 | 获取方式 | 用途 |
| ---- | -------- | ---- |
| 合并 diff | `git diff merge-before-{branch}-{timestamp}..HEAD` | 本次合入的所有变更 |
| 主分支趋势 | `git log merge-before-{branch}-{timestamp} --oneline -20` + 对应 diff | 主分支的规范和架构方向 |
| 分支意图 | 步骤 2.1 已收集的 commit 消息 | 推断开发分支的业务目的 |
| 公共文件现状 | 步骤 2.1 标记的公共文件清单,读取这些文件在主分支上的当前内容 | 判断冗余实现 |
审查维度:
| 维度 | 检测方法 |
| ---- | -------- |
| 代码冗余 | 提取合并 diff 中新增的函数签名和 import与公共文件清单中的已有实现做语义匹配 |
| 过时模式 | 从主分支近期 commit message 中筛选含 refactor/deprecate/remove/migrate 的提交,对比这些提交的 diff 提取被替换的 API检查合并 diff 中是否仍在使用 |
| 未集成基础设施 | 从主分支近期 diff 中识别新增的中间件/工具/配置项,检查合并 diff 新增的代码是否缺少对应引用 |
| 风格不一致 | 对比主分支近期代码的命名惯例、文件组织、注释风格与合并 diff 中的新增代码 |
输出审查结果表:
| # | 类别 | 严重程度 | 文件 | 描述 | 建议修复方式 |
| - | ---- | -------- | ---- | ---- | ------------ |
严重程度:问题(运行时风险或维护负担)/ 建议(不影响功能,影响一致性)。
无问题 → 跳到验证。有问题 → 用提问工具让用户选择:
- **全部修复**:按编号顺序逐个执行
- **选择修复**:用户输入要修复的编号
- **跳过**:不处理,进入验证
修复执行流程:
1. 按编号顺序逐个修复,记录每个问题的修改内容(文件路径 + 变更范围)
2. 全部修复完成后,统一执行语法检查:`cd backend && go vet ./...` + `cd frontend && bunx tsc --noEmit`
3. 语法检查通过 → 独立提交:`refactor: 语义审查修复 - {分支名}`
4. 语法检查失败 → 逐个回退修改(按倒序,从最后一个修复开始 `git checkout -- {file}`),每回退一个重新检查,直到检查通过或全部回退
5. 记录哪些修复成功、哪些被回退,在提交 message 中标注
### 验证(自动)
- `cd backend && go build ./...`
- `cd frontend && bun run build`
- 成功 → 继续下一个分支
- 失败(中断点),分级回退:
1. 若有语义审查修复提交,先尝试 `git revert` 该提交revert 成功则再次构建验证
2. revert 冲突或再次构建仍失败:`git reset --hard merge-before-{分支名}-{timestamp}`(合并提交和修复提交一并回退)
3. 报告错误信息和当前 HEAD 位置,用提问工具让用户选择:
- **跳过**:放弃当前分支,继续下一个
- **终止**:停止整个流程,输出当前进度摘要(见下方"终止处理"
终止处理:输出当前进度摘要(已成功合并的分支、已跳过的分支及原因、未处理的分支、当前 HEAD 位置、全局锚点标签名),提示用户可用 `git reset --hard pre-merge-backup-{timestamp}` 全部回退。
### 断点(无)
分支间不暂停,自动继续下一个分支。
## 5. 清理(用户确认 — 阶段三唯一介入)
输出合并汇总,用提问工具一次性确认所有清理操作:
| 项目 | 内容 |
| ---- | ---- |
| 合并结果 | 成功 / 失败(跳过) / 已合并(跳过) 数量 |
| 冲突统计 | 涉及冲突的文件数(含按推荐方案处理和用户审查处理的) |
| 语义审查 | 各分支发现的问题数和修复数(含修复失败数) |
| 删除本地分支 | 成功合并的分支列表,勾选确认 |
| 删除远端分支 | 有远端对应的分支列表,勾选确认 |
| 安全锚点 | 保留 / 删除 |
选项:**确认清理**(按勾选执行)/ **调整**(用户指定保留的分支或锚点)/ **跳过清理**(仅保留汇总,不删除任何内容)
确认后执行清理:
- 本地分支删除:`git branch -d {分支}`git 安全机制:未完全合并的分支会拒绝删除)
- 远端分支删除:`git push origin --delete {分支}`,失败则报告错误,跳过该远端分支,继续处理其余
- 锚点处理:按用户选择保留或删除
输出最终总结:目标分支、全局锚点标签、各分支最终状态(已合并+已删除 / 已合并+保留 / 跳过+原因)、冲突和语义审查统计。
### 工作区恢复
若步骤 1 有 stash`git stash pop`
- 无冲突 → 结束
- 有冲突 → 展示冲突决策面板(同步骤 4 冲突处理流程),用提问工具逐文件选择(选项:保留 stash 内容 / 保留当前内容 / 双保留 / 用户编辑 / 放弃恢复 `git stash drop`