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. 完成

    每条标准重跑并汇报。

全景图

自带即时任务流程全景图,贯穿整个落地过程:状态行上方常驻一行全景 teaser,实时显示票据计数(待认领 / 已认领 / 已关闭)、并行中任务数与本地 Web 流程图 URL;按 Ctrl+G 或点击 teaser 即可在终端内展开全屏双环全景图浮层;在浏览器中打开本地回环 URL,还能浏览交互式分层流程图,查看决策背景、问答历史与并行落地进度——/ship 默认不强行弹窗。

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

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

01 — 看一眼

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

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

会话是自己的空间 真实抓取
╭───────────────────────────────────────────────────────────────────────────────╮ │ › Ask anything · / for commands · $ for skills · ! shell · @ for files · ⇧Ta… │ ╰───────────────────────────────────────────────────────────────────────────────╯ cli-mock · ~/.cache/codsh/showcase · ? shortcuts

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

刚问出口的问题停在最上面 真实抓取
╭───────────────────────────────────────────────────────────────────────────────╮ │ › 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 都能落回去。

你正在读的这段,是谁问出来的 真实抓取
↑ │ now the input path · ● ─────────────────────────────────────────────────────────────────────────────────↓ │ • 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 │ │ ↑ 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.0s │ CODE_CLI_ANSWER after thinking (turn 2) │ ╭───────────────────────────────────────────────────────────────────────────────╮ │ › Ask anything · / for commands · $ for skills · ! shell · @ for files · ⇧Ta… │ ╰───────────────────────────────────────────────────────────────────────────────╯ ⠋ working 0.0s · 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 ───────────────────────────────────────────────────────────────────────────────── │ │ 维度 │ 内容 │ │ │ ├────────┼───────────────────────────────────────────────────────────────────── │ ─┤ │ │ 一句话 │ 一个很长的中文单元格内容,用来强制表格在任何终端宽度下都必须在单元格 │ │ │ │ │ 内部换行。一个很长的中文单元格内容,用来强制表格在任何终端宽度下都必 │ │ │ │ │ 须在单元格内部换行。一个很长的中文单元格内容,用来强制表格在任何终端 │ │ │ │ │ 宽度下都必须在单元格内部换行。 │ │ │ ├────────┼───────────────────────────────────────────────────────────────────── │ ─┤ │ │ 命令 │ 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 用的是同一套编号。

Ctrl+G

切换终端双环即时任务全景图浮层。状态行上方常驻一行全景 teaser,显示实时票据计数与本地 Web 流程图 URL。

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 是会话里的同一件事,有新版本时会话自己会提示。code profile 的 node_modules 若是另一套 pnpm store 链过来的,启动器会清掉再重试注册。

DEEPSEEK_API_KEY

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

DSH_HOME

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

CODSH_CLIPBOARD

osc52、system 或 off——收窄选中内容进剪贴板的通道。

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。