跨仓链接用完整地址
指向 ops 仓的相对链接,换到 worktree、GitHub 网页或云端 agent 就全断,而且不报错
跨仓引用一律写完整 URL,并让园丁定期检查失效链接
发生了什么
我的一个组织用独立的 ops 仓放决策、剧本和复盘。代码仓的文档里有 10 处链接指向 ops 仓,写的是相对路径,形如 ../../<ops 仓>/...,前提是两个仓放在同一个父目录下。
在我自己的电脑上,这些链接一直好好的。直到我开始用 claude --worktree 并行开发:worktree 建在代码仓内部的 .claude/worktrees/<name>/ 下,同样的相对路径从那里往上数,落到了一个根本不存在的目录,10 处全部失效。接着又发现,在 GitHub 网页上点这些链接是 404;云端跑的 agent 只克隆了代码仓,同样打不开。
为什么会这样
相对链接偷偷依赖了“我这台电脑的目录布局”:两个仓必须并排、目录名不能变、读的人必须在本机。这三个条件,在 worktree、GitHub 网页、CI 和云端会话里一个都不成立。GitHub 只能解析仓库内部的相对路径,跳出仓库根目录就找不到。
更麻烦的是,这种失效没有任何报错。人点开是 404 还会察觉,agent 读不到链接内容时只是少了一块上下文,然后照样往下做。
怎么做
跨仓引用写完整 URL,指向分支或固定的 commit:
详见 [ADR-007](https://github.com/your-org/ops/blob/main/decisions/ADR-007_auth.md)让 CI 拦住仓外的相对链接。CI 里只检出代码仓,lychee --offline 只检查本地文件链接,任何跳出仓库的相对链接都会因为目标不存在而报错:
# .github/workflows/links.yml 里的一个 step
- uses: lycheeverse/lychee-action@v2
with:
args: --offline --no-progress './**/*.md'完整 URL 交给园丁定期查。私有仓的链接匿名访问是 404,用带权限的 gh api 逐条确认,累计所有失败,最后统一用退出码报告:
#!/usr/bin/env bash
# 检查文档里所有指向 ops 仓的完整 URL
fail=0
while read -r url; do
url=${url%%#*} # 去掉页内锚点
rest=${url#https://github.com/} # your-org/ops/blob/main/decisions/ADR-007_auth.md
repo=${rest%%/blob/*} # your-org/ops
ref=${rest#*/blob/}; path=${ref#*/}; ref=${ref%%/*}
gh api "repos/$repo/contents/$path?ref=$ref" --silent \
|| { echo "失效:$url" >&2; fail=1; }
done < <(grep -rhoE 'https://github\.com/your-org/ops/blob/[^)[:space:]]+' docs/ | sort -u)
exit $fail我把这一步放进每周的园丁任务里,和过期 review 日期一起查。试用中
agent 要读 ops 仓,显式接进来。代码仓的 CLAUDE.md 只写一句指针(ops 仓的完整地址);本机会话需要读写 ops 仓时,用 permissions.additionalDirectories 把它加进来,而不是靠相对路径碰运气。