kit-zeason / dsh-simple-CLI

Listed

Minimal DeepSeek Harness extension tailored for contemporary CLI mobilization.

mainTool View source

Installation

npx -y @deepseek-ai/dsh plugin --profile web add github:kit-zeason/dsh-simple-CLI

This installation command is an unverified starting point generated from the GitHub repository address.

README

Maintainer-authored documentation snapshot.

View on GitHub ↗
Commit 493968cSynced Aug 18, 2026

dsh-simple-cli — Interactive Terminal Profile for DeepSeek Harness

v0.1.2 - Releases · Changelog

dsh-simple-cli turns DeepSeek Harness (dsh) into an interactive terminal chat, like Claude Code: type a message, watch the answer stream in, keep the conversation going. It is launched as the dsh-cli command (equivalent to dsh --profile cli).

English · 中文


What it is

dsh ships with web / headless profiles. This repo adds a cli profile that runs entirely in the terminal, Claude-Code style:

  • Streaming output with reasoning & tool calls — assistant text, model reasoning (▸ 推理, dim gray) and tool invocations (⛭ name: args + ✓/✗ result) stream in live, matching the TUI experience. Reasoning is collapsed to its latest line while thinking (web-style) and renders are coalesced to ~30fps, so fast thinking does not flicker the terminal
  • @ file picker — type @ in the input to browse the working directory (type to filter, ↑/↓ navigate, Enter enters a folder or picks a file, Esc closes); picking inserts @relative/path, and on submit each referenced text file is attached to the message (up to 64 KB each, truncated with a note; binary files stay as a path mention)
  • ── input area — a separator line frames the input box; Enter submits, Shift+Enter / Ctrl+Enter insert a newline (multi-line messages; requires the kitty keyboard protocol — Windows Terminal 1.19+, kitty, WezTerm, iTerm2, Konsole, foot — otherwise Ctrl+J or Alt+Enter work as a fallback), ↑/↓ navigate history or logical lines
  • Status bar — under the input: current model & permission, with the switching commands always in view
  • Continuous conversation — multi-turn context on a single Agent session
  • Tool-call approvals — inline y / n / Enter on the same input area under the "ask" policy
  • Commands/new fresh session · /model [provider/]<model> switch model (bare /model opens a filterable picker) · /preset [id] switch agent preset (bare /preset opens a filterable picker) · /permission ask|never switch approval policy · /clear · /exit; an optional first message can be passed as an argument
  • Default color scheme — every role has its own color (user green, reasoning gray, tools yellow/cyan…); override via the DSH_CLI_THEME env var (see below)

Requirements

  • Node.js ≥ 22 (tested on 24)
  • dsh ≥ 0.1.0-rc.6 on PATH: npm i -g @deepseek-ai/dsh
  • PowerShell 5.1+ / pwsh for install.ps1 (Windows & Unix)

Install

One-click (Windows & Unix, PowerShell)

git clone https://github.com/kit-zeason/dsh-simple-CLI.git
cd dsh-simple-CLI
.\install.ps1            # install into $DSH_HOME/profiles/cli, shim onto PATH, verify
.\install.ps1 -Force     # re-install / overwrite existing profile files

The installer:

  1. creates $DSH_HOME/profiles/cli (default ~/.dsh/profiles/cli)
  2. copies the dsh-simple-cli bundle into the profile's node_modules
  3. writes the profile manifest (package.json, cordis.patch.yml, pnpm-workspace.yaml)
  4. installs the global dsh-cli command shim
  5. verifies dsh --profile cli --help

No git clone needed — install a specific published release directly:

Invoke-WebRequest -Uri https://raw.githubusercontent.com/kit-zeason/dsh-simple-CLI/main/install.ps1 -OutFile install.ps1
.\install.ps1 -Version 0.1.0        # download release v0.1.0 and install it
.\install.ps1 -Version 0.1.0 -Force # re-install, overwriting existing profile files

-Version accepts 0.1.0 or v0.1.0; without it, the script installs the checkout it is part of (e.g. your clone of main).

Manual (any OS)

$profiles = Join-Path $env:USERPROFILE '.dsh\profiles'
New-Item -ItemType Directory -Force -Path "$profiles\cli\node_modules\dsh-simple-cli\lib"
Copy-Item package.json, cordis.patch.yml "$profiles\cli\node_modules\dsh-simple-cli\"
Copy-Item lib\index.js, lib\startup.js "$profiles\cli\node_modules\dsh-simple-cli\lib\"
Copy-Item profile\package.json, profile\cordis.patch.yml, profile\pnpm-workspace.yaml "$profiles\cli\"
# optional: put bin\dsh-cli(.cmd/.ps1) somewhere on PATH

Usage

dsh-cli                        # start interactive chat
dsh --profile cli              # same
dsh-cli "run the tests"        # send a first task, then keep chatting
┌───────────────────────────────────────────────┐
│ dsh-cli: DeepSeek Harness 交互模式(/help …)      │
│ ▸ 推理  let me check the repo layout…             │  ← dim gray, streaming
│ ⛭ pwsh: Get-ChildItem -Recurse .                │  ← yellow
│   ✓   Directory: …                              │  ← cyan
│ 这里是最新的文件清单:…                             │  ← streaming reply
│───────────────────────────────────────────────│
│ > 输入你的消息…  (Shift+Enter 换行, Enter 发送)     │  ← input area
│ 模型: deepseek/deepseek-v4-flash · 权限: ask   …  │  ← status bar
└───────────────────────────────────────────────┘

Commands (type them in the input area):

CommandEffect
/modelopen the model picker (browse or keyword-search, then pick)
/model <name>switch model (same provider), e.g. /model deepseek-v4-flash
/model <provider>/<name>switch provider + model
/presetopen the preset picker (标准 / PTC / 极简 / 创造 + your own)
/preset <id>switch preset (live on a blank session, else applies on /new)
/permission ask / neverswitch the approval policy (aliases: /perm)
/newstart a fresh session
/clearclear the scrollback
/help, /exithelp / quit (Ctrl+C also quits)

Presets: each session is composed from one DSH agent preset (the same mechanism as the web app — 标准/standard, PTC/code, 极简/minimal, 创造/cordis). The default is standard; set a persistent default in $DSH_HOME/settings.yaml under agent-presets.default, and author your own presets in $DSH_HOME/.agent-presets/ (a directory with agent.cordis.yml + optional preset.yml).

Tool approval prompt (inline on the same input area):

? [授权] pwsh: … — y 允许一次 / n 拒绝 / 回车 允许

Color scheme (override via env DSH_CLI_THEME=<path-to-json>; each value is an SGR parameter string):

{ "user": "1;92", "reasoning": "2;90", "toolCall": "33",
  "toolResult": "36", "toolError": "1;31", "system": "35", "status": "36" }

How it works

Three layers, all plain files:

LayerWhereWhat
bundlerepo root (npm package dsh-simple-cli)cordis.patch.yml + lib/ — the runner plugin
profile$DSH_HOME/profiles/climanifest listing bundles @deepseek-ai/dsh-base + dsh-simple-cli
shimnpm global bin dirdsh-clidsh --profile cli
  • Bundle resolution (resolveBundleDir) checks the dsh install directory first, then the profile's own node_modules — so dropping the bundle at profiles/cli/node_modules/dsh-simple-cli is enough.
  • Dependencies — every runtime import (@deepseek-ai/dsh-agent, dsh-llm, dsh-session, schemastery, commander, …) resolves up the directory tree into the shared profiles/node_modules that ships with dsh. No pnpm install needed.
  • Runnerlib/index.js creates one Agent through the core registry, then renders the session/event firehose live: assistant/chunk deltas stream reasoning / text / tool-call arguments, tool/call + tool/result draw the tool lines, and approval/request is answered inline on the same input area. Non-TTY stdin (pipes / CI) falls back to a plain readline loop.
  • UIlib/ui.js is a dependency-free raw-mode mini-TUI (ANSI only): scrollback + ── separator + multi-line editor + status bar; lib/theme.js holds the palette.
  • Notedsh rewrites the profile's cordis.yml to [] on every launch; keep your changes in cordis.patch.yml.

Repository layout

dsh-simple-cli/
├── README.md          # this file
├── LICENSE            # MIT
├── package.json       # the dsh-simple-cli bundle package
├── cordis.patch.yml   # bundle patch (loader patch list)
├── lib/
│   ├── index.js       # cli-runner plugin: agent loop, event renderer, /model /permission
│   ├── startup.js     # cli-startup plugin: command-line parsing
│   ├── ui.js          # raw-mode mini-TUI: input area, streaming view, status bar
│   ├── theme.js       # color palette + DSH_CLI_THEME override
│   └── refs.js        # @file references: find + attach referenced file contents
├── test/
│   ├── ui.test.mjs    # Tui unit tests (node test/ui.test.mjs)
│   └── refs.test.mjs  # @file reference unit tests (node test/refs.test.mjs)
├── profile/           # cli profile template
│   ├── package.json
│   ├── cordis.patch.yml
│   └── pnpm-workspace.yaml
├── bin/               # dsh-cli command shims
│   ├── dsh-cli.cmd    # Windows cmd
│   ├── dsh-cli.ps1    # PowerShell
│   └── dsh-cli        # POSIX sh
└── install.ps1        # one-click installer

Development

Edit the bundle sources in this repo, then sync the running copy:

Copy-Item -Recurse -Force .\lib, .\package.json, .\cordis.patch.yml "$HOME\.dsh\profiles\cli\node_modules\dsh-simple-cli\"

Troubleshooting

  • dsh --profile cli says the profile does not exist — the profile directory needs package.json; run .\install.ps1.
  • cordis.yml keeps coming back as [] — expected; dsh regenerates it. Edit cordis.patch.yml instead.
  • Renamed the bundle — keep name in package.json, the plugin names in cordis.patch.yml, and the profile bundle list in sync.

Roadmap

  • Cross-session ↑/↓ history persistence under $DSH_HOME
  • /sessions session list
  • Publish to npm (dsh-simple-cli) so others can dsh plugin --profile cli add dsh-simple-cli

License

MIT © godzeason


中文

这是什么

v0.1.2 - Releases · Changelog

dsh-simple-cliDeepSeek Harness(dsh)加了一个纯终端交互式 profile(启动命令为 dsh-cli):像 Claude Code 一样在终端里持续对话,流式输出、↑/↓ 历史、工具调用授权提示。

特性

  • 流式输出(含推理与工具调用):正文、模型推理(▸ 推理,暗灰)与工具调用(⛭ 名称: 参数 + ✓/✗ 结果)实时流入,与 TUI 体验一致。思考时推理折叠为单行、实时显示最新一行(网页端风格),渲染合并到约 30fps,快速思考不会导致终端闪屏
  • @ 文件选择器:输入 @ 即可浏览工作目录(继续输入过滤、↑/↓ 选择、Enter 进入目录或选中文件、Esc 关闭);选中后插入 @相对路径,提交时每个被引用的文本文件会作为附件注入消息(单个上限 64KB,超出截断并注明;二进制文件只保留路径引用)
  • ── 输入区:分隔线框住输入框;Enter 发送Shift+Enter / Ctrl+Enter 换行(支持多行消息;需要终端支持 kitty 键盘协议——Windows Terminal 1.19+、kitty、WezTerm、iTerm2、Konsole、foot 等——否则可用 Ctrl+JAlt+Enter 兜底换行),↑/↓ 翻历史或跨行移动
  • 状态栏:输入区下方实时显示当前模型与权限,并常驻切换命令提示
  • 多轮持续对话:同一 Agent 会话保持上下文连续
  • 工具授权:agent 请求调用工具时("ask" 策略)在同一输入区内联应答 y/n/回车
  • 命令/new 新会话 · /model [provider/]<model> 切换模型(裸 /model 弹出可过滤的模型选择框) · /preset [id] 切换预设(裸 /preset 弹出可过滤的预设选择框) · /permission ask|never 切换权限 · /clear · /exit;支持可选首条消息参数
  • 默认配色:各角色分色(用户绿、推理灰、工具黄/青…);可用 DSH_CLI_THEME 环境变量覆盖

安装

一键安装(Windows / Unix,PowerShell)

git clone https://github.com/kit-zeason/dsh-simple-CLI.git
cd dsh-simple-CLI
.\install.ps1            # 安装到 $DSH_HOME/profiles/cli,注册 dsh-cli 命令并自检
.\install.ps1 -Force     # 覆盖已有 profile 配置文件

脚本会:创建 profile 目录 → 复制 bundle → 写 profile 清单 → 安装全局 dsh-cli shim → 验证 dsh --profile cli --help

不想 clone?可直接下载安装脚本并指定版本安装:

Invoke-WebRequest -Uri https://raw.githubusercontent.com/kit-zeason/dsh-simple-CLI/main/install.ps1 -OutFile install.ps1
.\install.ps1 -Version 0.1.0         # 下载 release v0.1.0 并安装
.\install.ps1 -Version 0.1.0 -Force  # 重新安装,覆盖已有 profile 配置

-Version 接受 0.1.0v0.1.0;不带该参数时安装脚本所在目录的代码(如 clone 的 main)。

手动安装(任意平台)

$profiles = Join-Path $env:USERPROFILE '.dsh\profiles'
New-Item -ItemType Directory -Force -Path "$profiles\cli\node_modules\dsh-simple-cli\lib"
Copy-Item package.json, cordis.patch.yml "$profiles\cli\node_modules\dsh-simple-cli\"
Copy-Item lib\index.js, lib\startup.js "$profiles\cli\node_modules\dsh-simple-cli\lib\"
Copy-Item profile\package.json, profile\cordis.patch.yml, profile\pnpm-workspace.yaml "$profiles\cli\"

使用

dsh-cli                  # 开始交互对话
dsh --profile cli        # 等价
dsh-cli "run the tests"  # 先发一条任务,之后继续对话

界面示意:

┌──────────────────────────────────────────────┐
│ dsh-cli: DeepSeek Harness 交互模式(/help …)   │
│ ▸ 推理  let me check the repo layout…          │  ← 暗灰,流式
│ ⛭ pwsh: Get-ChildItem -Recurse .             │  ← 黄色
│   ✓   Directory: …                           │  ← 青色
│ 这里是最新的文件清单:…                           │  ← 流式正文
│──────────────────────────────────────────────│
│ > 输入你的消息…  (Shift+Enter 换行, Enter 发送)  │  ← 输入区
│ 模型: deepseek/deepseek-v4-flash · 权限: ask … │  ← 状态栏
└──────────────────────────────────────────────┘

命令一览:

命令作用
/model弹出模型选择框(浏览或输入关键字过滤后选中)
/model <name>切换模型(保持 provider),如 /model deepseek-v4-flash
/model <provider>/<name>同时切换 provider 与模型
/preset弹出预设选择框(标准 / PTC / 极简 / 创造 + 自定义)
/preset <id>切换预设(空白会话立即生效,否则 /new 后生效)
/permission ask / never切换权限策略(别名 /perm
/new开启新会话
/clear清空回滚区
/help/exit帮助 / 退出(Ctrl+C 也可退出)

预设:每个会话由一个 DSH agent preset(与网页端同一套机制——标准/standard、PTC/code、极简/minimal、创造/cordis)组装而成。默认是 standard;可在 $DSH_HOME/settings.yamlagent-presets.default 设置持久默认值,自定义 preset 放在 $DSH_HOME/.agent-presets/(一个含 agent.cordis.yml 与可选 preset.yml 的目录)。

工具授权提示(同一输入区内联):

? [授权] pwsh: … — y 允许一次 / n 拒绝 / 回车 允许

配色覆盖(DSH_CLI_THEME=<json文件路径>,值为 SGR 参数串):

{ "user": "1;92", "reasoning": "2;90", "toolCall": "33",
  "toolResult": "36", "toolError": "1;31", "system": "35", "status": "36" }

工作原理

三层结构,全是普通文件:

位置内容
bundle仓库根(npm 包 dsh-simple-clicordis.patch.yml + lib/ 运行器插件
profile$DSH_HOME/profiles/cli清单:@deepseek-ai/dsh-base + dsh-simple-cli
shimnpm 全局 bindsh-clidsh --profile cli
  • bundle 解析:先查 dsh 安装目录,再查 profile 自身 node_modules,因此把 bundle 放进 profiles/cli/node_modules/dsh-simple-cli 即可
  • 依赖:所有运行时 import 沿目录树上溯到 dsh 自带的共享 profiles/node_modules无需 pnpm install
  • 运行器lib/index.js 通过核心注册表建一个 Agent,把 session/event 事件流实时渲染:assistant/chunk 增量流式显示推理/正文/工具参数,tool/call + tool/result 绘制工具行,approval/request 在同一输入区内联应答;非 TTY(管道/CI)自动回退为普通 readline 循环
  • UIlib/ui.js 是无依赖的 raw 模式迷你 TUI(纯 ANSI):回滚区 + ── 分隔线 + 多行编辑器 + 状态栏;lib/theme.js 提供配色
  • 注意dsh 每次启动会把 profile 的 cordis.yml 重写为 [],改动请写在 cordis.patch.yml

仓库结构

dsh-simple-cli/
├── README.md          # 本文件(中英双语)
├── LICENSE            # MIT
├── package.json       # dsh-simple-cli bundle 包
├── cordis.patch.yml   # bundle patch(loader patch 列表)
├── lib/
│   ├── index.js       # cli-runner 插件:agent 循环 / 事件渲染 / /model /permission
│   ├── startup.js     # cli-startup 插件:命令行解析
│   ├── ui.js          # raw 模式迷你 TUI:输入区 / 流式视图 / 状态栏
│   ├── theme.js       # 配色 + DSH_CLI_THEME 覆盖
│   └── refs.js        # @file 引用:查找并附加引用文件内容
├── test/
│   ├── ui.test.mjs    # Tui 单元测试(node test/ui.test.mjs)
│   └── refs.test.mjs  # @file 引用单元测试(node test/refs.test.mjs)
├── profile/           # cli profile 模板
│   ├── package.json
│   ├── cordis.patch.yml
│   └── pnpm-workspace.yaml
├── bin/               # dsh-cli 命令 shim
│   ├── dsh-cli.cmd    # Windows cmd
│   ├── dsh-cli.ps1    # PowerShell
│   └── dsh-cli        # POSIX sh
└── install.ps1        # 一键安装脚本

开发

改完本仓库的 bundle 源码后,同步运行副本:

Copy-Item -Recurse -Force .\lib, .\package.json, .\cordis.patch.yml "$HOME\.dsh\profiles\cli\node_modules\dsh-simple-cli\"

已知的坑

  • dsh --profile cli 报 profile 不存在 → 需先建 profiles/cli/package.json,跑一遍 .\install.ps1
  • cordis.yml 总被重置为 [] → 正常现象,改 cordis.patch.yml
  • 改 bundle name → 同步 cordis.patch.yml 里的插件名和 profile 的 bundles 列表

路线图

  • 跨会话 ↑/↓ 历史持久化(存 $DSH_HOME
  • /sessions 历史会话列表
  • 发布 npm(dsh-simple-cli),他人可 dsh plugin --profile cli add dsh-simple-cli

License

MIT © godzeason

Project files and signals

Shown items are public repository signals detected in the directory snapshot.

TestsDetected

Repository information

Language
JavaScript
License
MIT
Latest release
v0.1.2
Last updated
Aug 15, 2026, 8:24 AM

Install deliberately

Review source code, permissions, lifecycle hooks, dependencies and network access. Test untrusted plugins in an isolated environment.