Skip to content

[BUG][P2] worktree 依赖链只对 @scope 命名的自有包回指 worktree —— 无 scope 的 packages/web/node_modules/opencode 仍解析到主 checkout #803

Description

@jinjunnn

大白话

scripts/worktree-link-deps.sh 保证「工作区自有包指回本 worktree」——否则 worktree 会拿
主 checkout 的源码在编译,而别的 session 在主 checkout 的未提交改动会变成本 worktree 的假红/假绿
(这正是该脚本抬头写的坑 ①)。

但这条保证今天只对 @opencode-ai/*@alpha-code/* 两个作用域生效 ——
判定写在 case "$name" in @opencode-ai|@alpha-code) 这一支里。
无 scope 命名的自有包走的是 *) 兜底分支,整条软链照抄主 checkout。

实测(2026-08-02,alpha@10daf61b)

全仓枚举(走 MAIN 目录树,不复用脚本任何输出;跳过 .git.worktrees),
无 scope 且 realpath 落在 $MAIN/packages/ 下的软链恰好一条:

packages/web/node_modules/opencode  =>  packages/opencode

为什么值得修(而不是"反正 packages/opencode 是上游、不会改")

north-star 确实禁止改 packages/opencode,所以日常两边字节相同,看不出问题。
但滚动 pin 模型下上游是会变的 —— re-vendor / pin bump 类的票(#738#759 等)
在 worktree 里改的正是 vendored 上游。那种时候:

  • worktree 里 packages/opencode的;
  • packages/web 解析到的 opencode 仍是主 checkout 的旧的;
  • 于是 packages/web 的 typecheck / 测试测的不是本分支那份上游

判据不会响 —— 又一个「观测手段自己有盲区」。

最小修法

把「自有包」的判定从按目录名匹配作用域改成按 realpath 前缀:
任何 realpath 落在 $MAIN/packages/ 下的软链都回指 $WT 的同一相对位置,
无论它叫什么、在不在 @scope 目录里。@scope 那一支的逐条处理保留(它还要建子目录)。

判据

  • 修完在新建 worktree 里 readlink packages/web/node_modules/opencode 必须指向
    本 worktreepackages/opencode;
  • 先证明判据能测出已知的坏:回退修复后同一条 readlink 必须指向主 checkout。
  • 脚本末尾已有的自检(#796 加的条目数 + 坏链判红)顺带覆盖。

出处

#796(PR #802)实现方在同类扫描里点名、未顺手改;编排者独立枚举确认只此一条。

Metadata

Metadata

Assignees

No one assigned

    Labels

    prio:P2Planned normal-priority work

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions