Skip to content

docs(skills): 统一 git-branch / git-worktree 的 base 解析 (#335) - #340

Open
Casper-Mars wants to merge 1 commit into
Terry-Mao:mainfrom
Casper-Mars:task/w_01M6J6HY9W7DW3CYVWGG4HP6P3
Open

Casper-Mars wants to merge 1 commit into
Terry-Mao:mainfrom
Casper-Mars:task/w_01M6J6HY9W7DW3CYVWGG4HP6P3

Conversation

@Casper-Mars

Copy link
Copy Markdown

Fixes #335

Summary

git-worktree 把 base 硬编码为 main:默认分支是 master / trunk 的仓库要么选错(本地存在陈旧 main),要么直接选不到 base;两处 SKILL 各写一套 base 规则,也必然漂移。

  • .agents/skills/git-branch/SKILL.md 新增 ## Base 段,作为 base 解析的唯一事实源:documented base → origin/HEAD → 用户指定(--base)→ main 兜底,每级先用 ref_exists()(git rev-parse --verify --quiet "origin/$1" 优先,其次 refs/heads/$1)校验,不可用降级到下一级;并给出可执行的 ref_exists / resolve_base 片段(git symbolic-ref refs/remotes/origin/HEAD,取不到时回落 git remote show origin)。
  • .agents/skills/git-worktree/SKILL.md 的 base 段改为引用 git-branch 规则(片段逐字节复制,不再自带第二套表述);创建前解析 base,origin/<base> 优先、其次本地 <base>;解析失败列候选、提示 --base <branch>、非零退出,禁止静默按不存在的 main 继续。原「Default the base to main」硬编码删除。
  • 失败语义写进文档:无候选可解析时不得继续;origin/HEAD 优先于用户显式 --base 的顺序后果也在文中点名(评审若认为应改为用户优先,需先改 AC/方案)。
  • 未改:.github/skills 下无同源镜像;install.sh 不用改(其 sync_skills 整目录复制 .agents/skills);worktree 路径段不动(属 bug: 从仓库子目录调用 git-worktree 会把 worktree 创建到错误目录 #336)。

Testing

fixture 用真 git 仓库跑,并从 SKILL.md 的 ## Base 段现场抽取 bash 片段执行(证明文档片段本身可用)。被测内容与本地已验证提交逐字节一致(git diff <verified-sha> HEAD -- .agents/ 为空)。

=== 从 git-branch SKILL.md 抽取的片段行数:18

########## fixture A:默认分支 master、origin/HEAD→origin/master、无 main
origin/HEAD      -> origin/master
origin/main      : 无
resolve_base     -> master
创建命令: git worktree add --no-track -b feat/demo .worktrees/feat-demo origin/master
worktree HEAD    : d0160126f4b96d5ed740074ddc6a86f788f5e6f3
origin/master    : d0160126f4b96d5ed740074ddc6a86f788f5e6f3
PASS: 创建成功且 worktree HEAD == origin/master

########## fixture A2:存在陈旧 main 时不误选 main
本地 main(陈旧): 26e7e4f
origin/master    : d016012
resolve_base     -> master
PASS: 仍选 master,未误选陈旧 main

########## fixture A3:documented base 优先于 origin/HEAD
documented=develop + origin/HEAD=master → resolve_base: develop
PASS

########## fixture A4:无任何可用 base → 失败路径
  No usable base branch. Candidates:
  Pass --base <branch> to choose one.
失败路径退出码: 1
PASS: 非零退出并列出候选
resolve_base('' 'feat-x') 退出码: 1     # 用户指定的 ref 不存在时同样降级失败

########## git-worktree SKILL 中不再有硬编码 origin/main
无命中(grep exit 1)

########## 两份 SKILL 的 base 规则逐条对照
PASS: 两份 SKILL 的 resolve_base 片段逐字节一致(diff 为空)
结果:ALL FIXTURES PASS(脚本 exit 0)

仓库回归(python:3.12-slim,Python 3.12.16,与 CI 同版本):

$ python3 -m unittest discover -s .github/aicodingflow-tests   → exit 0,Ran 526 tests … OK
$ python3 -m unittest discover -s .github/tests                → exit 0,Ran 14 tests … OK (skipped=12)
$ python3 -m py_compile .github/scripts/*.py                   → exit 0

(本分支基于 feature/AICF-1,不含 #334 的 7 条新增用例,故为 526 而非 533。)

Risk

How to revert

Revert 本 PR 的 merge commit;无数据、配置或安装脚本迁移。


说明:项目分支 feature/AICF-1 只存在于本人 fork(对原仓库无 push 权限,无法在上游创建该分支),因此本 PR 的 base 取上游 main;Fixes #335 会在合并时关闭对应 issue;#336 会基于本 PR 的同一文件另开 PR。

原因:git-worktree 把 base 硬编码为 main,默认分支是 master/trunk 的仓库
要么选错(陈旧 main)要么选不到(无 main);两处各自表述也必然漂移。

改动:
- git-branch 新增 ## Base 段作为唯一事实源:documented base → origin/HEAD →
  用户指定 → main 兜底,每级先用 git rev-parse --verify --quiet 校验 ref
- 给出可执行片段 ref_exists / resolve_base
- git-worktree base 段改为引用 git-branch 规则,片段逐字节复制;
  创建时 origin/<base> 优先、其次本地 <base>;解析失败列候选、提示
  --base <branch>、非零退出,禁止静默按不存在的 main 继续

验证:fixture A(master 默认分支 + origin/HEAD + 无 main)worktree HEAD ==
origin/master;陈旧 main 不误选;无可用 base 非零退出;两文件片段 diff 为空;
.github 两个 unittest 目录 533 + 14 条全绿

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug: git-worktree 在默认分支不是 main 的目标仓库中会选错或选不到 base

1 participant