codsh▍
/ship 把一句话变成已验证的代码。
DeepSeek,或任何兼容端点。
$ npm install -g @deepseek-ai/dsh codsh-cli # 已有 dsh?只需 npm i -g codsh-cli $ codsh › /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。
一句话到落地。
两次确认。此后自主。
-
Wayfinder
在 grill 前明确目标、解决待决问题。大型任务保留可续跑的决策图。
-
Grill
设计树访谈。事实自己查;每轮问当前 frontier,并给出推荐答案。
-
Spec — 关口 1
自动合成。你确认。每条标准写明证明它的命令。
-
Tickets — 关口 2
自动切成可独立验证的垂直切片。你批准。写代码前先跑基线。
-
落地
在 spec 记下的 seam 上 TDD。每个变绿的 ticket 提交一次。
-
完成
每条标准重跑并汇报。
› /ship 让超长 diff 用分页器打开而不是刷屏滚过
裸 /ship 会续跑未完成的 wayfinder 或 spec 当前阶段。
下面每一个终端都是真的。
从打包后的二进制抓取。不是效果图。
█▄▄
█ ▀██
█▄█▀▀
▀██████▀
█▄██▄▄██▄██▄
▀▄▄ ██ ▄▄▀
▀█▄▄█▀
✻ 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 依然一次开合全部。
›
› 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 展开为完整清单。
› 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 是降级不是崩:行读取器,无组件、不绘制。
一条命令。
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_HOMEprofile 存放位置,默认 ~/.dsh;DSH_BIN 指定启动哪个 dsh。
CODSH_CLIPBOARDosc52、system 或 off——收窄选中内容进剪贴板的通道。
CODSH_UPDATE_CHECKoff 关掉自动检查——/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。