<!-- codsh-publication:grok-cli-dsh-rewrite:ticket-63 --> ## Parent https://github.com/Blackman99/codsh/issues/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 - #166 — Ticket 34: 插件内容启停与扩展视图 - #179 — Ticket 47: 计划、问答与待办状态 ## Delivery contract 用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。
Activity
feat(rust): optional Ship extension with the wayfinder phase through …
Blackman99 commentedon Sep 25, 2026
已集成到
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。ship-answers、ship-snapshot、plan模块。<spec>.ship.json(封存原始需求 / 主线)和<spec>.ship.answers.json(每张已回答的问题卡)仍是事实来源,和旧版codsh读的是同一批文件。wayfinder 写出 spec 之前的回答先暂存,封存后再写入。沿用旧版保护:想法冲突、原始需求被改、多个未完成 spec、答案损坏、快照缺失。/ship会恢复唯一未完成的 spec。plan 模式和子 agent 会话会被忽略,普通提示会结束本次运行。codsh/ship继续,不会假装已经迁移。不涉及 Goal(Goal-Id留空,与旧版降级路径一致),不涉及 Rhai、Ship 图,也没有阶段自动续跑。codsh的/ship代码没有改动。.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后通过。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,全部通过。e2e/pty-ship*.e2e.ts共 14/14 通过(在变基前的提交上跑;上游之后的提交没有改动旧版 Ship 代码)。未验证 / 不在本单范围
build:rust的开发检出上,bundled:ship能安装,但 Hook 脚本缺失。␞hook␞标记,长 Hook 消息在较长的对话记录里换行后可能被视口截掉。main、npm 发布、默认版本和 PR #213 都没有动。#196 和 #208 现在已解除阻塞。