背景
app/shared 单包 112K LOC,其中 workbench/ 独占 54K、737 文件里的 159 个顶层文件。shared 本应是跨端原语层,却承载了端级 workbench 巨石,导致:
app/shared/src/index.ts 再导出 workbench(258-279/358/415-422 行)
- workbench 反向 import shared 的 ui/transcript/hub 达 72 个文件(双向耦合)
shared/ui/MessageSearchPanel.tsx、shared/ui/PageErrorBoundary.tsx 又 import workbench
mobile-rn 仅 1 处 import workbench,却被迫把整个巨石打进依赖图。
方案
- 先破环(前置,必须):把
shared/ui 里依赖 workbench 的 2 个组件迁到 workbench 侧,或抽成无依赖原语,消除 shared→workbench 反向边。
- 新建
app/workbench 包(第 6 个),依赖 shared(单向 workbench→shared)。
- 改 web/desktop 从
@agenthub/workbench 直接 import,移除 shared/index.ts 对 workbench 的再导出。
- mobile-rn 不再传递依赖 workbench,验证其 bundle 减小。
依赖 / 阻塞
- 无外部阻塞,但步骤 1 是硬前置;未破环直接搬目录会产生循环依赖,构建必挂。
- 建议在独立 worktree + 独立分支执行,逐包跑 typecheck。
风险
- 高:涉及 web+desktop+shared 三包 import 重写;re-export 面广,易漏。
- 缓解:先加一条"shared 不得 import workbench"的 lint/依赖规则固化方向,再搬迁。
验收
背景
app/shared单包 112K LOC,其中workbench/独占 54K、737 文件里的 159 个顶层文件。shared本应是跨端原语层,却承载了端级 workbench 巨石,导致:app/shared/src/index.ts再导出 workbench(258-279/358/415-422 行)shared/ui/MessageSearchPanel.tsx、shared/ui/PageErrorBoundary.tsx又 import workbenchmobile-rn 仅 1 处 import workbench,却被迫把整个巨石打进依赖图。
方案
shared/ui里依赖 workbench 的 2 个组件迁到 workbench 侧,或抽成无依赖原语,消除 shared→workbench 反向边。app/workbench包(第 6 个),依赖 shared(单向 workbench→shared)。@agenthub/workbench直接 import,移除shared/index.ts对 workbench 的再导出。依赖 / 阻塞
风险
验收
app/workbench成为独立 pnpm 包,shared 不再含 workbench/shared无任何 import 指向 workbench(加依赖方向 lint 固化)pnpm -r typecheck+ web/desktop build 全绿