Repository navigation
[Grok/dsh 59] 远程克隆与工作树能力 #191
Copy link
Copy link
Closed
Labels
ready-for-agentAgent-grabbable workAgent-grabbable work
Description
Activity
- added a commit that references this issue
on Sep 25, 2026 已实现并快进推送到
rewrite/grok-dsh-20260920:9bd0449491d2ff998be76e5a881cae8d7b9048ff(快进范围ab67660..9bd0449)。Rebase 说明:分支起点是
14edaca(#190)。开发期间 #176(ab67660)先合入,rebase 了一次。冲突只有两处:package.json的test:rust:pty链(保留 #176 的 monitor,在 remote 之后追加 clone)和packages/cli/bin/rust.mjs的启动器环境白名单(保留 #176 的CODSH_TEST_MONITOR_TIME_SCALE、CODSH_MOCK_MONITOR_TRACE,并追加本票的 7 个变量)。两边的新增都保留了。下列检查都在最终基线上重跑;#176 的 monitor PTY 也一起跑了,通过。实现内容
codsh --rust clone [-b BRANCH] [--cone PATH]... [--full-history] [--debug] [--debug-file FILE] <URL> [DIR]:用普通 git 代替参考实现的 Grove 懒克隆。开关顺序与参考一致:GROK_CLONE/GROVE_CLONE→GROK_GROVE或$GROK_HOME/config.toml的[cli] grove→ Grove 的~/.config/grove/config.toml中的[clone] enabled。都没设置时退出码 2,并说明用哪个设置打开。--leader-socket会被明确拒绝(没有 Grove 守护进程)。- Grove → 替身的映射,README 中英文都有公开表格,并逐行标出协议和性能差异:
- 深度 1 引导克隆:
--depth=1 --single-branch --no-tags。--full-history获取全部历史、分支和标签。git fetch --deepen/--unshallow只加深所选分支,与参考文档一致。本地路径会让 git 忽略深度,摘要会如实说明,并提示改用file://。 - 懒加载 blob:部分克隆
--filter=blob:none。服务器不支持过滤时,摘要会写明 blob 已全部获取。 --cone:真实的 sparse-checkout,不是投影。- 守护进程、FUSE/NFS:没有。克隆是磁盘上的真实检出,也没有和 Grove 做性能对比。
- 深度 1 引导克隆:
- 凭据:只用 git 自己的凭据(credential helper、SSH 密钥和 known_hosts、
GIT_SSH_COMMAND),或者GROVE_AUTH_TOKEN。令牌通过GIT_CONFIG_COUNT作为 https Authorization 头传给 git,只发给 https 和本机回环 http,不会写进.git/config,也不会传给 dsh 或远端。从不使用codsh --rust login。GROVE_TOKEN_ROTATION因为没有守护进程,报告为已忽略。凭据被拒报告为unavailable,退出码 4。 - 目录与清理:目标必须不存在或为空,非空目录、文件或符号链接退出码 3,且原样不动。git 先写入隐藏的同级暂存目录,成功后才重命名到目标。失败(退出码 1,消息里去掉 URL)、凭据被拒和 Ctrl-C(退出码 130)都不留任何东西,空目标保持为空。进程被 kill 后留下的暂存目录,由下一次克隆清除。对已完成、origin 相同的克隆再执行一次,只报告、不获取任何内容;
-b不同则退出码 3。 --remote ssh://…/base(codsh 扩展,基于 [Grok/dsh 58] 远程工作区连接与执行 #190 的 SSH 远端):在远端按远端自己的开关和 git 凭据执行同样的克隆。GROVE_AUTH_TOKEN不发送。连接关闭会取消远端克隆并删除未完成的目录。下一步提示是codsh --rust --remote <url>/<dir>,远端会话的 cwd 就是这个克隆。- 工作树开关按参考顺序:
GROK_WORKTREE_TYPE→[cli] grove_worktree/nfs_worktree/worktree_type→GROK_GROVE/[cli] grove。Grove 请求记录在工作树记录里(worktree show显示 strategy 和请求来源,子代理工作树也会记录),并回退为带完整检出的普通 git 工作树,与参考实现在 Grove 不可达时回退 copy 的行为一致。启动提示会如实说明这一点。
检查(干净环境、最终基线
9bd0449)cargo fmt --check通过;pnpm typecheck通过。- clippy
-D warnings:只有两处已存在的filesystem_sandbox(tail_marker、needless_return)报错;加-A dead_code -A clippy::needless_return后无告警。 cargo test --workspace --no-fail-fast:bin 623 通过、3 失败(含新增 7 个 clone 单元测试和更新后的 worktree 测试);其余 crate 498 + 42 + 61 + 2 + 379 + 61 全部通过,2 个 ignored。3 个失败都是已存在问题:filesystem_sandbox2 个、voice::substitute_route…(时序偶发)。privacy::drafts_stay_local…这次通过。pnpm test(带CODSH_TEST_OPENSSH):98 个文件,2521 通过、1 跳过、3 失败。失败的是reference-evidence2 个(负载下 5 秒超时)和rust-plan1 个(负载下等待超时),用--testTimeout=60000单独重跑 24/24 通过。新增的scripts/rust-clone.spec.mjs10/10 通过,其中 3 个用真实 sshd。- PTY(Linux,
pnpm run build:rust之后):新增的rust-clone-pty-test.py通过(终端上可见 git 进度和摘要;在克隆里启动 TUI,文件工具修改克隆内的文件;git 卡在传输时按 Ctrl-C,空目标保持为空、不留暂存目录、退出码 130;重复克隆不改变任何东西)。worktree、remote、monitor 的 PTY 也通过。 - 替身后端都在本机:临时裸仓库(file://)、带 Basic 令牌校验的本机回环
git http-backend,以及无特权运行的 OpenSSH 10.0 sshd。没有使用付费服务或官方设施。
未验证 / 限制
- 没有真实的 Grove(守护进程、内容存储、FUSE/NFS),也没有和 Grove 做性能对比。
- 没有对 GitHub 或任何真实、付费的托管服务克隆过。
- 只在 Linux 上验证,macOS 和 Windows 未验证(Windows 不会被拒,但没跑过)。
- Grove 守护进程的凭据类别
expired-static和carrier-stale不适用,只有unavailable。 - 没有远程设置(remote settings)层:参考中的远程开关和强制关闭在这里不存在。
- 没有修改 inventory。
- 没有改 main、npm 发布和默认版本;没有编辑 PR test(reference): pin Grok provenance and compatibility inventory #213(它的 head 就是集成分支,会随推送自动更新)。
Metadata
Metadata
Assignees
Labels
ready-for-agentAgent-grabbable workAgent-grabbable work
Parent
#132
Ticket: 59
Status: ready-for-agent
User Stories: 44, 61(见父规格)
What to build
用户通过配置的替代后端使用参考暴露的远程克隆/工作树体验,看到进度并能继续在正确目录工作。
Acceptance criteria
Blocked by
Delivery contract
用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。