Skip to content

[Grok/dsh 59] 远程克隆与工作树能力 #191

Description

@Blackman99

Parent

#132

Ticket: 59

Status: ready-for-agent

User Stories: 44, 61(见父规格)

What to build

用户通过配置的替代后端使用参考暴露的远程克隆/工作树体验,看到进度并能继续在正确目录工作。

Acceptance criteria

  • 将 Grove 等服务相关客户端行为逐项对应到真实替代方案,公开标注协议/性能差异而非宣称复制私有服务。
  • 克隆深度、凭据来源、目录冲突、失败清理、worktree 类型与功能开关按清单可验证。
  • 取消或重连不破坏已有仓库,远端结果与本地显示及运行工作目录一致。
  • 对实际替代后端完成从克隆到 dsh 文件工具操作的演示;没有可用后端时最终完整交付保持阻塞。

Blocked by

Delivery contract

用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。

Activity

  1. Blackman99 commented on Sep 25, 2026

    @Blackman99
    OwnerAuthor

    已实现并快进推送到 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 做性能对比。
    • 凭据:只用 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_sandbox 2 个、voice::substitute_route…(时序偶发)。privacy::drafts_stay_local… 这次通过。
    • pnpm test(带 CODSH_TEST_OPENSSH):98 个文件,2521 通过、1 跳过、3 失败。失败的是 reference-evidence 2 个(负载下 5 秒超时)和 rust-plan 1 个(负载下等待超时),用 --testTimeout=60000 单独重跑 24/24 通过。新增的 scripts/rust-clone.spec.mjs 10/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 就是集成分支,会随推送自动更新)。

    #191 阻塞的只有 #211,它仍被其他 13 个未关闭的票阻塞,所以本票关闭后没有新解锁的后续票。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions