概览
dsh-worktree-bar
README / ZH
插件文档
目录摘要
dsh.pub 核对固定版本的组合包契约、运行时事实与分发语义;完整 README 请查看源仓库。
在 GitHub 阅读完整 READMELIMITATIONS
已知限制
<a id="known-limitations-and-deferred-work"></a> - **复选框只能开启会话,不能搬移会话**——会话工作目录在 Harness 里是创建期数据,所以开始界面上的「在 worktree 里工作」意味着「先建 worktree,再把会话开进去」。进行中的对话无法迁移,本包也不假装可以。 - **worktree 是某个提交的全新检出**——`baseRef` 默认 `HEAD`,未提交的改动留在主检出。未跟踪的初始化内容只按项目约定的范围共享或复制。 - **`link` 是双向的**——连接一个目录意味着 worktree 与主检出在该路径上是同一个目录。对虚拟环境或本地数据库这正是目的,也正因此才需要 `copy` 来处理不能共享的东西。 - **没有自动清理**——创建的 worktree 一直存在,直到从它自己的菜单或复选框移除;既没有按时间的清扫,也不在 git 元数据里打标记。 - **行数统计不含未跟踪文件**——`+N`/`−M` 来自 `git diff HEAD --numstat`;未跟踪文件只出现在悬停提示的文件计数里,因为统计它们的行数意味着每次轮询都要读一遍文件。 - **Host 改动需要重启**——被替换的包每个进程只加载一次 JavaScript,只有 Client 半边能靠页面加载热更新。 - **子代理共享会话目录**——没有按子代理的 worktree;隔离会话的每个子代理都在同一检出中运行,而该检出本身已与主检出隔离。 - **不支持非 git 版本控制**——非 git 仓库下该行不出现。 <a id="dev-note"></a> ### 维护者备注 <details> <summary>维护者工作上下文——点击展开</summary> `npm test` 不依赖测试框架或外部依赖,依次跑四套用例: - `test/git.test.mjs`——在一次性仓库上验证 Git 层:解析、realpath 同一性、从子目录与从 worktree 内部的布局锚定、脏/锁定/主检出的移除拒绝,以及创建后主检出的 porcelain 输出。 - `test/seed.test.mjs`——在一个形态贴近真实项目的仓库上验证项目约定:约定的解析与坏约定拒绝、link/copy/linkIgnored 的落实、被跟踪文件仍来自 git、setup 命令,以及「移除会清掉链接且不碰任何被共享内容」这一保证。 - `test/host.test.mjs`——在假的 Cordis 上下文上验证路由表:准入分支、回退围栏、请求形状错误、会话目录解析,以及 create → info → remove 的完整来回。 - `test/client.test.mjs`——用 `test/react-shim.mjs`(最小 React 与 DOM 替身)渲染浏览器半边,断言两种形态、每个菜单,以及各控件产生的端点调用顺序。 写替身是因为部署环境不向插件提供 React 或 DOM,Host 侧工具也无法驱动页面;它刻意保持很小(函数组件、按依赖跳过的 hooks、不做 reconciliation),不是通用 React。 改动行为前值得复核的三条 Harness 事实:会话工作目录是创建期元数据(`@deepseek-ai/dsh-session`);插件路由的规范准入是 `ctx.connection.admit`(`@deepseek-ai/dsh-client-connection`);被替换包的 Host 代码只在重启时加载(本 profile 中 HMR 行的模块监听根为空)。 本项目的 README 配对没有 `README.i18n.yaml`:那是 Harness monorepo 的翻译配对记录,由它自己的工具生成,本独立项目不运行该工具。 </details> **运行时不变式:** 未发布。本包只拥有一张路由表,在 `ctx.effect` 中注册、随行一起被 Loader 释放;不写持久状态,也不持有跨插件状态。
