Skip to content

[Grok/dsh 63] Ship 可选安装与首阶段接入 #195

Closed

Description

@Blackman99

Parent

#132

Ticket: 63

Status: ready-for-agent

User Stories: 41, 67(见父规格)

What to build

用户显式安装启用 Ship,完成一个真实规划阶段;未启用时新客户端默认界面和按键不受影响。

Acceptance criteria

  • 完成可选安装、启停和命令注册,通过 dsh 执行一个既有规划/问答阶段,不重新设计 Ship。
  • 命令/按键不覆盖官方默认;没有扩展时不存在隐式 Ship 状态或启动依赖。
  • 既有阶段记录与用户回答保持真实来源,阶段取消后可恢复;不无故耦合新 Goal 或 Rhai。
  • 用既有受控场景验证首阶段,保持旧版测试;完整开发、worktree 冲突和恢复另票验证,尚不宣称 Ship 整体迁移完成。

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:d61436c32377674844ba26bfb886c5d48549810a(快进推送 ede08cc..d61436c)。

    变基 / 冲突:基于 5866e2a(#166)开发。第一次变基到 16aa77a(Rhai workflow、后台命令)时,package.json 的 test:rust:pty 链有冲突,处理方式是保留上游的整行,再把 rust-ship-pty-test.py 加在 plugin-content 之后。文档、mock LLM、rust.mjs、acp.rs 都自动合并。推送时被 #182(ede08cc)抢先,于是再次变基(无冲突),并在最终提交上重跑了全部检查。

    实现(Ship 作为可选的一方插件,Rust 核心里没有 Ship 逻辑)

    • packages/cli/extensions/ship:清单、hooks/hooks.json 和 README 已提交;scripts/build-ship-extension.mjs(由 pnpm run build:rust 调用)从 packages/bundle/src/ship-extension*.ts 生成 hooks/ship-hook.mjs(只依赖 node 内置模块)和 commands/ship.md,两个生成文件都在 gitignore 里。npm 包的 files 加入了 extensions。
    • 安装:codsh --rust plugin install bundled:ship --trust。bundled:<名称> 是新的安装来源,只读取启动器通过 CODSH_BUNDLED_EXTENSIONS 传入的自带 extensions/ 目录,名称会做校验,仍然必须带 --trust。安装后是停用状态,需要 plugin enable ship 才启用;disable / uninstall 会撤回。整个流程复用 [Grok/dsh 34] 插件内容启停与扩展视图 #166 的插件发现和 Hook 执行器。
    • 默认界面:不会自动安装或启用,不绑定快捷键,不覆盖内置命令(/ship 只有在没有原生命令占用时才作为插件裸名出现,也可以用 /ship:ship)。未安装时没有 /ship、没有 Ship Hook,也不写任何 Ship 状态或启动依赖。
    • 首阶段:命令正文就是旧版首轮约定 shipPromptFor(undefined)($ARGUMENTS 改为指向命令展开里的 Arguments: 行),经 dsh 原样执行预检和 wayfinder,没有重新设计 Ship。
    • 记录:UserPromptSubmit / PostToolUse Hook 复用旧版的 ship-answers、ship-snapshot、plan 模块。<spec>.ship.json(封存原始需求 / 主线)和 <spec>.ship.answers.json(每张已回答的问题卡)仍是事实来源,和旧版 codsh 读的是同一批文件。wayfinder 写出 spec 之前的回答先暂存,封存后再写入。沿用旧版保护:想法冲突、原始需求被改、多个未完成 spec、答案损坏、快照缺失。
    • 取消 / 恢复:问题卡被关闭、取消或超时都不会留下记录;裸 /ship 会恢复唯一未完成的 spec。plan 模式和子 agent 会话会被忽略,普通提示会结束本次运行。
    • 越过 wayfinding 的 spec 会被明确拒绝,并提示用旧版 codsh /ship 继续,不会假装已经迁移。不涉及 Goal(Goal-Id 留空,与旧版降级路径一致),不涉及 Rhai、Ship 图,也没有阶段自动续跑。
    • 旧版 codsh 的 /ship 代码没有改动。
    • 文档:README.md、README.zh.md、CONTEXT.md、CONTRIBUTING.md、packages/cli/README.md;changeset .changeset/rust-ship-extension.md。

    检查(在最终提交 d61436c 上,干净环境,Linux)

    • pnpm typecheck:通过。
    • pnpm test:93 个文件,2419 通过,1 失败(已知的 reference-evidence.spec.mjs "drives interactive help" 在负载下 5s 超时;单独用 --testTimeout=60000 跑是 11/11 通过)。新增 packages/bundle/tests/ship-extension.spec.ts(9 项)和 scripts/rust-ship-extension.spec.mjs(2 项)。
    • cargo test --locked --workspace --no-fail-fast:570+498+42+61+2+379+61 通过,2 ignored,4 个已有失败(filesystem_sandbox::strict_requests_network_isolation…、filesystem_sandbox::trusted_project_custom_applies…,以及不稳定的 privacy::drafts_stay_local…、voice::substitute_route…)。新增 plugin::tests::bundled_ship_installs_only_on_request_and_stays_off_until_enabled。
    • cargo fmt --check:通过。
    • cargo clippy … -D warnings:只有已有的 2 个错误(filesystem_sandbox.rs 里未使用的 tail_marker,以及一个多余的 return);加上 -A dead_code -A clippy::needless_return 后通过。
    • PTY(pnpm run build:rust 之后):新增的 scripts/rust-ship-pty-test.py 通过,覆盖以下步骤:默认没有 /ship 且无状态 → 安装后仍是停用 → 启用 → wayfinder 问题卡回答后写出快照和答案记录 → Ctrl+C 取消不记录 → 裸 /ship 恢复 → 想法冲突被拒 → 越过 wayfinding 被拒 → Stop 不写文件 → disable 后 /ship 消失。rust-plugin-content、rust-workflow 也通过;变基前另外跑过 rust-plan、rust-subagent、rust-queue、rust-background,全部通过。
    • 旧版 Ship 回归:e2e/pty-ship*.e2e.ts 共 14/14 通过(在变基前的提交上跑;上游之后的提交没有改动旧版 Ship 代码)。

    未验证 / 不在本单范围

    • 只在 macOS 上运行的 PTY 脚本(plugin、hook、permission、assets、turn、resume、rust-pty-test)以及安装产物脚本没有在 Linux 上运行。
    • PostToolUse 阶段的保护是通过 Hook 的 block 反馈交给模型的,不能强制中断整轮对话。
    • 在没有运行 build:rust 的开发检出上,bundled:ship 能安装,但 Hook 脚本缺失。
    • 已有的界面问题:Hook 消息会原样显示 ␞hook␞ 标记,长 Hook 消息在较长的对话记录里换行后可能被视口截掉。
    • Ship 浏览器图属于 [Grok/dsh 64] Ship 浏览器图与终端一致性 #196;完整流程、阶段自动续跑、冲突和 worktree 属于 [Grok/dsh 76] Ship 完整流程与恢复验证 #208。本单没有宣称 Ship 已完整迁移。

    main、npm 发布、默认版本和 PR #213 都没有动。#196 和 #208 现在已解除阻塞。

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