codsh
面向 DeepSeek 的终端编码 agent

codsh

/ship 把一句话变成已验证的代码。 DeepSeek,或任何兼容端点。

npm 上的 codsh-cli 零依赖启动器 MIT
安装
$ npm install -g @deepseek-ai/dsh codsh-cli
  # 已有 dsh?只需 npm i -g codsh-cli
$ codsh
 /ship <你的一句话需求>
/ship 全流程 演示动画
┃ › /ship 让超长 diff 用分页器打开 ✻ 正在通读仓库——pager.ts、screen.ts、三处调用点 ? frontier:全屏打开,还是在输入框下方分栏? · 推荐:全屏 ┃ › 全屏——按 q 回到 transcript Write docs/specs/pager.md + 6 条验收标准 · 每条写明证明它的命令 ? 确认这份 spec——关口 1 ┃ › 确认 tickets:3 条垂直切片 → 以复选框写进 spec ? 批准这些 tickets——关口 2 ┃ › 批准 ⠿ 基线:证明命令先跑一遍——两条红,符合预期 ✔ 1/3 长输出进分页器 · 测试绿 · 已提交 ✔ 2/3 按 q 返回 transcript · 测试绿 · 已提交 ✔ 3/3 缩放窗口状态不丢 · 测试绿 · 已提交 每条标准重跑自己的命令、读真实输出——全绿 标准 → 命令 → 实际输出 ╭─────────────────────────────────────────────────────────────────────────────────╮ Ask anything · / $ ! @ · ⇧Tab plan mode ╰─────────────────────────────────────────────────────────────────────────────────╯ todos 0/3 · 长输出进分页器 · Ctrl+T 展开todos 1/3 · 按 q 返回 transcripttodos 2/3 · 缩放窗口状态不丢todos 3/3 · 全部完成 ✔ deepseek-chat · ~/my-project (main) · ? shortcuts

完整流程循环播放。下方 /ship

01 — /ship

一句话到落地。

两次确认。此后自主。

  1. Wayfinder

    在 grill 前明确目标、解决待决问题。大型任务保留可续跑的决策图。

  2. Grill

    设计树访谈。事实自己查;每轮问当前 frontier,并给出推荐答案。

  3. Spec — 关口 1

    自动合成。你确认。每条标准写明证明它的命令。

  4. Tickets — 关口 2

    自动切成可独立验证的垂直切片。你批准。写代码前先跑基线。

  5. 落地

    在 spec 记下的 seam 上 TDD。每个变绿的 ticket 提交一次。

  6. 完成

    每条标准重跑并汇报。

在输入框里
 /ship 让超长 diff 用分页器打开而不是刷屏滚过

/ship 会续跑未完成的 wayfinder 或 spec 当前阶段。

01 — 看一眼

下面每一个终端都是真的。

从打包后的二进制抓取。不是效果图。

会话是自己的空间 真实抓取
█▄▄ ▀██ █▄█▀▀ ▀██████▀ █▄██▄▄██▄██▄ ▀▄▄ ██ ▄▄▀ ▀█▄▄█▀ Welcome to codsh · cli-mock · code-cli /help · /status · Tab · ⇧Tab plan · Ctrl-C · /exit ╭───────────────────────────────────────────────────────────────────────────────╮ Ask anything · / for commands · $ for skills · ! shell · @ for files · ⇧Ta… ╰───────────────────────────────────────────────────────────────────────────────╯ cli-mock · ~/.cache/codsh/showcase · ? shortcuts

备用屏幕、钉在底部从不移动的输入框,以及始终当前的状态行。

刚问出口的问题停在最上面 真实抓取
█▄▄ ▀██ █▄█▀▀ ▀██████▀ █▄██▄▄██▄██▄ ▀▄▄ ██ ▄▄▀ ▀█▄▄█▀ Welcome to codsh · cli-mock · code-cli /help · /status · Tab · ⇧Tab plan · Ctrl-C · /exit where does the retry live? thought for 0.1s · total 0.1s CODE_CLI_ANSWER after thinking (turn 2) 0.1s (thought 0.1s) · 14 tokens ╭───────────────────────────────────────────────────────────────────────────────╮ Ask anything · / for commands · $ for skills · ! shell · @ for files · ⇧Ta… ╰───────────────────────────────────────────────────────────────────────────────╯ working 0.0s · Ctrl-C to interrupt cli-mock · context 59/? · ~/.cache/codsh/showcase · ? shortcuts

刚提交的问题占住视口顶部,回复从下方填进空出来的位置。往回读历史再回到底部,回来的是同一帧——滚轮和 PgDn 都能落回去。

你正在读的这段,是谁问出来的 真实抓取
explain the render path ↑ · now the input path ↓ CODE_CLI_HEADING Prose with bold, em, inline_code, and a link (https://x.dev). An identifier like some_helper_name must survive intact. Gain: CODE_CLI_GAIN & held screen.ts: the viewport module second bullet third bullet keeps the answer long fourth bullet keeps the answer long fifth bullet keeps the answer long sixth bullet keeps the answer long seventh bullet keeps the answer long eighth bullet: past the fold threshold at any test width ╭────────┬──────────────────────────────────────────────────────────────────────╮ 维度 内容 ├────────┼──────────────────────────────────────────────────────────────────────┤ 一句话 一个很长的中文单元格内容,用来强制表格在任何终端宽度下都必须在单元格 内部换行。一个很长的中文单元格内容,用来强制表格在任何终端宽度下都必 须在单元格内部换行。一个很长的中文单元格内容,用来强制表格在任何终端 宽度下都必须在单元格内部换行。 ├────────┼──────────────────────────────────────────────────────────────────────┤ ↑ 12 rows above · click or PgDn returns to the latest ╭───────────────────────────────────────────────────────────────────────────────╮ Ask anything · / for commands · $ for skills · ! shell · @ for files · ⇧Ta… ╰───────────────────────────────────────────────────────────────────────────────╯ cli-mock · context 207/? · ~/.cache/codsh/showcase · ? shortcuts

往回滚过一次轮次边界,问出这几行的那条提问就钉在顶部;右侧一列时间线标出当前在哪一轮,底部那行说明退了多远——点它就回到最新。Shift+←/→ 在轮次之间跳。

工具调用只占一行 真实抓取
create the note Write note.txt +1 -0 CODE_CLI_CALL_OK via cli-mock ╭───────────────────────────────────────────────────────────────────────────────╮ Ask anything · / for commands · $ for skills · ! shell · @ for files · ⇧Ta… ╰───────────────────────────────────────────────────────────────────────────────╯ working 0.1s · 14 tokens · Ctrl-C to interrupt cli-mock · context 23/? · ~/.cache/codsh/showcase · ? shortcuts

每次调用都经由它的 presenter 渲染成一行——标题、+n -m、状态——左侧还有一道标出块边界的竖线;diff 本身点一下或按 Ctrl+O 就展开。

思考在你读的时候是展开的 真实抓取
think it over thought for 0.1s CODE_CLI_THINKING about the request weighing the options carefully CODE_CLI_ANSWER after thinking (turn 2) ╭───────────────────────────────────────────────────────────────────────────────╮ Ask anything · / for commands · $ for skills · ! shell · @ for files · ⇧Ta… ╰───────────────────────────────────────────────────────────────────────────────╯ working 0.1s · Ctrl-C to interrupt cli-mock · context 45/? · ~/.cache/codsh/showcase · ? shortcuts

思考直接流进对话,头上那行在结束时变成计时行,一直保持展开,直到下一条提问把它折起。现在点一下就折起,点计时行再展开;Ctrl+O 依然一次开合全部。

todo 常驻可见 真实抓取
plan the work Update todo list · 1 line todos 1/3 · 1 in progress · 1 open read the code write the fix run the tests CODE_CLI_CALL_OK via cli-mock 0.1s · 26 tokens ╭───────────────────────────────────────────────────────────────────────────────╮ Ask anything · / for commands · $ for skills · ! shell · @ for files · ⇧Ta… ╰───────────────────────────────────────────────────────────────────────────────╯ todos 1/3 · Ctrl+T closes read the code write the fix run the tests cli-mock · context 23/? · ~/.cache/codsh/showcase · ? shortcuts

一行常驻读数把 agent 的清单钉在状态行之上,不随那次写入滚走;Ctrl+T 展开为完整清单。

Markdown 是渲染,不是回显 真实抓取
explain it ───────────────────────────────────────────────────────────────────────────────── second bullet third bullet keeps the answer long fourth bullet keeps the answer long fifth bullet keeps the answer long sixth bullet keeps the answer long seventh bullet keeps the answer long eighth bullet: past the fold threshold at any test width ╭────────┬──────────────────────────────────────────────────────────────────────╮ 维度 内容 ├────────┼──────────────────────────────────────────────────────────────────────┤ 一句话 一个很长的中文单元格内容,用来强制表格在任何终端宽度下都必须在单元格 内部换行。一个很长的中文单元格内容,用来强制表格在任何终端宽度下都必 须在单元格内部换行。一个很长的中文单元格内容,用来强制表格在任何终端 宽度下都必须在单元格内部换行。 ├────────┼──────────────────────────────────────────────────────────────────────┤ 命令 codsh ╰────────┴──────────────────────────────────────────────────────────────────────╯ a quoted line ts const answer = "text" // a comment CODE_CLI_CALL_STREAM_DONE ╭───────────────────────────────────────────────────────────────────────────────╮ Ask anything · / for commands · $ for skills · ! shell · @ for files · ⇧Ta… ╰───────────────────────────────────────────────────────────────────────────────╯ working 0.0s · Ctrl-C to interrupt cli-mock · ~/.cache/codsh/showcase · ? shortcuts

表格排出真正的列,代码带高亮,强调标记被吃掉而不是打印出来。

把一条回答摊开成整屏 真实抓取
Answer 1 CODE_CLI_HEADING Prose with bold, em, inline_code, and a link (https://x.dev). An identifier like some_helper_name must survive intact. Gain: CODE_CLI_GAIN & held screen.ts: the viewport module second bullet third bullet keeps the answer long fourth bullet keeps the answer long fifth bullet keeps the answer long sixth bullet keeps the answer long seventh bullet keeps the answer long eighth bullet: past the fold threshold at any test width ╭────────┬──────────────────────────────────────────────────────────────────────╮ 维度 内容 ├────────┼──────────────────────────────────────────────────────────────────────┤ 一句话 一个很长的中文单元格内容,用来强制表格在任何终端宽度下都必须在单元格 内部换行。一个很长的中文单元格内容,用来强制表格在任何终端宽度下都必 须在单元格内部换行。一个很长的中文单元格内容,用来强制表格在任何终端 宽度下都必须在单元格内部换行。 ├────────┼──────────────────────────────────────────────────────────────────────┤ 命令 codsh ╰────────┴──────────────────────────────────────────────────────────────────────╯ a quoted line ts const answer = "text" // a comment Esc closes · c copies · ↑↓/wheel · PgUp/PgDn · Home/End · 1-32/33

/view 1 打开一条回答,/view 1:1 打开它的第一个代码块,改窗口大小也不会乱;Esc 原样还回会话。/copy 用的是同一套编号。

Shift+←/→

在真实轮次之间跳;/jump 预览一轮,Esc 原样还回。

/copy

/copy N 取一条回答的原始 Markdown,/copy N:C 取它的代码,不含围栏。

Ctrl+V

粘贴图片,屏幕中央浮出预览卡——能画图的终端直接显示原图,其余终端用彩色马赛克,Ctrl+O 打开原图。原生视觉,或由 DeepSeek 文本模型借用 Vision Exp 描述一次。

/ $ ! @

命令、skill、shell、文件——菜单在输入框上方开。⇧Tab 是 plan 模式。

拖选

选中即复制,走 OSC 52 或系统剪贴板。

管道

非 TTY 是降级不是崩:行读取器,无组件、不绘制。

02 — 安装与运行

一条命令。

npm i -g @deepseek-ai/dsh codsh-cli 然后 codsh。启动器就是 dsh --profile code

codsh --resume <id>

重开一个已记录的会话,历史以同样的折叠形态重放。

codsh --continue

接上当前工作区最近的那个会话。

codsh -p "任务"

一次性 print 模式,面向脚本与管道。

codsh --version

启动器版本、profile 里注册的运行时、以及这次找到的 dsh。

codsh update

在 shell 里升级这一对;/update 是会话里的同一件事,有新版本时会话自己会提示。

DEEPSEEK_API_KEY

模型密钥,从环境变量或 .env 读取。

DSH_HOME

profile 存放位置,默认 ~/.dshDSH_BIN 指定启动哪个 dsh。

CODSH_CLIPBOARD

osc52systemoff——收窄选中内容进剪贴板的通道。

CODSH_UPDATE_CHECK

off 关掉自动检查——/update 依然会问。CODSH_UPDATE_REGISTRY 把两者都指向别的 registry。

CODSH_VISION_*

_BASE_URL_MODEL_API_KEY:供纯文本模型识图的 OpenAI 兼容 sidecar。不配也行,DeepSeek 文本路由会自动借用 deepseek-v4-flash-vision-exp

完全不想要启动器?它包装的那两行可以直接用,profile 名任取:

不用启动器
$ dsh plugin --profile code add codsh-bundle
$ dsh --profile code
要动手改?pnpm install && pnpm run dev.dev-home 里维护一份仓库本地的 dsh home,改动几秒钟就能进到运行中的界面; MOCK=markdown pnpm run dev 不需要 key。pnpm run test:e2e 把整棵树打包装进真实 profile 去驱动已发布的二进制——上面每一屏都是这套装置抓的。 codsh 绝不 fork harness:上游的事去 deepseek-harness 提 PR, pnpm run sync:dsh 跟踪它的发布。细节见 README