面向偏好 TUI 工作流开发者的 DeepSeek Harness 终端编程 Agent。
39.7/100
综合分
5
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/9 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add guoxiucai/dsh-code该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · market
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 26 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-code @ 2.1.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖要求 workspace:^ · 最新 0.2.1-rc.5 兼容
✓入口文件main/exports/bin 已声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/2 17:42:15
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量写入剪贴板(不计风险)
查看扫描证据(共 78 处,展示前 75 条)
- 读取本地文件src/bin.ts:38
const manifest = JSON.parse(readFileSync(fileURLToPath(new URL('../package.json', import.meta.url)), 'utf8')) as { version?: unknown } - 读取本地文件src/bin.ts:113
return existsSync(patch) ? ['--patch', patch] : [] - 读取本地文件src/bootstrap/credentials.ts:24
const document = mapping(load(readFileSync(join(home, '.credentials.yaml'), 'utf8'))) - 读取本地文件src/bootstrap/profile.ts:64
const manifest = JSON.parse(readFileSync(path, 'utf8')) as { dsh?: { profile?: { bundles?: unknown } } } - 读取本地文件src/bootstrap/profile.ts:104
if (existsSync(join(current, '.git'))) return current - 读取本地文件src/bootstrap/profile.ts:142
${['standard', 'ptc'].map(id => readFileSync(createRequire(import.meta.url).resolve(`@deepseek-ai/dsh-web-app/presets/${id}.patch.yml`), 'utf8')).join - 读取本地文件src/bootstrap/profile.ts:158
if (!existsSync(path)) return '' - 读取本地文件src/bootstrap/profile.ts:159
const rows: unknown = load(readFileSync(path, 'utf8'), { schema: PATCH_SCHEMA }) - 写入本地文件src/bootstrap/profile.ts:195
mkdirSync(dir, { recursive: true }) - 读取本地文件src/bootstrap/profile.ts:197
if (!existsSync(manifestPath)) writeFileSync(manifestPath, profileManifest()) - 写入本地文件src/bootstrap/profile.ts:197
if (!existsSync(manifestPath)) writeFileSync(manifestPath, profileManifest()) - 写入本地文件src/bootstrap/profile.ts:200
writeFileSync(patchPath, profilePatch(tuiPluginUrl, projectRoot) + overrides, { mode: 0o600 }) - 写入本地文件src/bootstrap/profile.ts:202
if (!existsSync(workspacePath)) writeFileSync(workspacePath, PROFILE_PNPM_WORKSPACE) - 读取本地文件src/bootstrap/sessions.ts:147
try { names = readdirSync(sessionDir) } catch { return empty } - 读取本地文件src/bootstrap/sessions.ts:156
if (!existsSync(path)) continue - 读取本地文件src/bootstrap/sessions.ts:159
const raw = readFileSync(path) - 读取本地文件src/bootstrap/sessions.ts:232
return readdirSync(base, { withFileTypes: true }) - 删除本地文件递归src/bootstrap/sessions.ts:346
rmSync(dir, { recursive: true, force: true }) - 读取本地文件src/bootstrap/trust.ts:54
if (!existsSync(path)) return undefined - 读取本地文件src/bootstrap/trust.ts:57
parsed = JSON.parse(readFileSync(path, 'utf8')) - 写入本地文件src/bootstrap/trust.ts:89
mkdirSync(join(home, 'projects'), { recursive: true }) - 写入本地文件src/bootstrap/trust.ts:90
writeFileSync(path, JSON.stringify(record, null, 2) + '\n') - 执行外部命令来自配置/变量src/cli/delegate.ts:46
const child = spawn(process.execPath, [bin, ...dshArgs], { stdio: 'inherit', env }) - 执行外部命令来自配置/变量src/cli/delegate.ts:163
child = spawn(process.execPath, [bin, ...dshArgs], { - 执行外部命令来自配置/变量src/cli/delegate.ts:230
const child = spawn(process.execPath, [bin, ...dshArgs], { - 执行外部命令来自配置/变量src/cli/update.ts:30
const child = spawn(invocation.command, invocation.args, { shell: false, stdio }) - 读取本地文件src/cli/update.ts:41
const value = JSON.parse(readFileSync(path, 'utf8')) as ProductManifest - 执行外部命令来自配置/变量src/cli/update.ts:50
const result = spawnSync(invocation.command, invocation.args, { encoding: 'utf8', shell: false }) - 读取本地文件src/cli/update.ts:57
if (expected === undefined || !existsSync(expected)) return false - 执行外部命令来自配置/变量src/cli/update.ts:67
const result = spawnSync(invocation.command, invocation.args, { - 读取本地文件src/tui/autocomplete.ts:87
children = await readdir(directory, { withFileTypes: true }) - 读取本地文件src/tui/clipboard.ts:46
accessSync(join(dir, name), constants.X_OK) - 写入剪贴板src/tui/clipboard.ts:84
export function writeClipboard( - 执行外部命令来自配置/变量src/tui/clipboard.ts:100
child = spawn(invocation.command, invocation.args, { - 读取剪贴板src/tui/clipboard.ts:139
export function readClipboard( - 执行外部命令来自配置/变量src/tui/clipboard.ts:155
child = spawn(invocation.command, invocation.args, { - 读取本地文件src/tui/external-mcp.ts:91
if (!existsSync(path)) return undefined - 读取本地文件src/tui/external-mcp.ts:92
try { return record(JSON.parse(readFileSync(path, 'utf8'))) } catch { return undefined } - 读取本地文件src/tui/external-mcp.ts:127
if (!existsSync(path)) continue - 读取本地文件src/tui/external-mcp.ts:129
try { parsed = record(parseToml(readFileSync(path, 'utf8'))) } catch { continue } - 读取本地文件src/tui/external-mcp.ts:194
if (existsSync(profiles)) { - 读取本地文件src/tui/external-mcp.ts:195
for (const entry of readdirSync(profiles, { withFileTypes: true })) { - 读取剪贴板src/tui/host.ts:1122
void readClipboard().then((text) => { - 读取本地文件src/tui/mcp-config.ts:97
if (!existsSync(path)) return [] - 读取本地文件src/tui/mcp-config.ts:99
const parsed = record(JSON.parse(readFileSync(path, 'utf8'))) - 写入本地文件src/tui/mcp-config.ts:112
mkdirSync(dirname(path), { recursive: true, mode: 0o700 }) - 写入本地文件src/tui/mcp-config.ts:118
writeFileSync(temporary, `${JSON.stringify(document, null, 2)}\n`, { mode: 0o600 }) - 写入本地文件src/tui/mcp-config.ts:119
renameSync(temporary, path) - 写入本地文件src/tui/mcp-config.ts:194
mkdirSync(runtimeRoot, { recursive: true, mode: 0o700 }) - 写入本地文件src/tui/mcp-config.ts:210
writeFileSync(path, dump([{ insert: rows }], { lineWidth: -1 }), { mode: 0o600 }) - 删除本地文件递归src/tui/mcp-config.ts:211
return { path, dispose: () => { rmSync(dir, { recursive: true, force: true }) } } - 读取本地文件src/tui/mcp-runtime.ts:50
return existsSync(built) ? built : fileURLToPath(new URL('./mcp-stdio-proxy.ts', import.meta.url)) - 写入本地文件src/tui/mcp-stdio-proxy.ts:21
mkdirSync(dirname(path), { recursive: true, mode: 0o700 }) - 读取本地文件src/tui/mcp-stdio-proxy.ts:22
if (existsSync(path) && statSync(path).size >= MAX_LOG_BYTES) { - 读取本地文件src/tui/mcp-stdio-proxy.ts:22
if (existsSync(path) && statSync(path).size >= MAX_LOG_BYTES) { - 读取本地文件src/tui/mcp-stdio-proxy.ts:24
if (existsSync(previous)) unlinkSync(previous) - 删除本地文件src/tui/mcp-stdio-proxy.ts:24
if (existsSync(previous)) unlinkSync(previous) - 写入本地文件src/tui/mcp-stdio-proxy.ts:25
renameSync(path, previous) - 写入本地文件src/tui/mcp-stdio-proxy.ts:36
try { appendFileSync(path, `[dsh-code proxy] ${error instanceof Error ? error.message : String(error)}\n`, { mode: 0o600 }) } catch {} - 读取本地文件src/tui/plugin.ts:169
const stat = statSync(dotGit) - 读取本地文件src/tui/plugin.ts:173
const content = readFileSync(dotGit, 'utf8') - 读取本地文件src/tui/plugin.ts:180
return readFileSync(headPath, 'utf8').match(/^ref: refs heads (.+)$/m)?.[1]?.trim() - 读取本地文件src/tui/plugin.ts:189
const manifest = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')) as { version?: unknown } - 读取本地文件src/tui/plugin.ts:875
if (statSync(candidate).isFile()) return candidate - 读取本地文件src/tui/project-config.ts:52
if (!existsSync(path)) return [] - 读取本地文件src/tui/project-config.ts:53
const parsed = load(readFileSync(path, 'utf8')) - 写入本地文件src/tui/project-config.ts:108
mkdirSync(dirname(path), { recursive: true, mode: 0o700 }) - 写入本地文件src/tui/project-config.ts:109
writeFileSync(path, dump(entries, { lineWidth: -1 }), { mode: 0o600 }) - 写入本地文件src/tui/session-export.ts:119
mkdirSync(dirname(absolute), { recursive: true }) - 写入本地文件src/tui/session-export.ts:121
writeFileSync(absolute, content, { encoding: 'utf8', flag: 'wx', mode: 0o600 }) - 读取本地文件src/tui/skill-preferences.ts:46
if (!existsSync(path)) return new Map() - 读取本地文件src/tui/skill-preferences.ts:48
const parsed = JSON.parse(readFileSync(path, 'utf8')) as Partial<SkillPreferencesDocument> - 写入本地文件src/tui/skill-preferences.ts:58
mkdirSync(dirname(path), { recursive: true }) - 写入本地文件src/tui/skill-preferences.ts:63
writeFileSync(temporary, `${JSON.stringify(document, null, 2)}\n`, { mode: 0o600 }) - 写入本地文件src/tui/skill-preferences.ts:64
renameSync(temporary, path)
扫描于 2026/11/3(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-preset-registry@deepseek-ai/dsh-base@deepseek-ai/dsh-ptc-runtime-node@deepseek-ai/dsh-credentials@deepseek-ai/dsh-llm@deepseek-ai/dsh-mcp-client@deepseek-ai/dsh-session@deepseek-ai/dsh-session-persistence@deepseek-ai/dsh-settings@deepseek-ai/dsh-skill-filesystem给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
界面预览
1 张 · 点击查看大图功能亮点
- 终端界面代码智能体
基于 DeepSeek Harness 的终端界面风格代码智能体
README
由 DeepSeek 最新模型翻译生成dsh-code
面向偏好 TUI 工作流开发者的 DeepSeek Harness 终端编程 Agent。
English · 简体中文
[!IMPORTANT]
dsh-code 是独立的社区项目,并非 DeepSeek 官方发行版。DeepSeek Harness 本身也处于开发者预览阶段,在升级固定基线时可能出现不兼容变更。
为什么有 dsh-code?
DeepSeek Harness 已提供官方 Web UI 和插件优先的 Agent Runtime。dsh-code 面向更习惯留在终端中的开发者:它将同一套 DSH Agent 语义封装成紧凑的键盘驱动界面,适合与 Shell、编辑器、 Git 和远程开发环境配合使用。
产品借鉴了 Pi 的终端交互思想,并使用 @earendil-works/pi-tui 完成终端渲染,但没有复制或替换 Agent 核心。Agent Loop、会话、模型适配器、工具、沙箱、权限、MCP、Skills、Plan/Todo 和 Sub-Agent 仍由固定版本的 DSH Runtime 负责。
展开完整文档(README 剩余 1 节)
dsh-code 面向偏好 TUI 工作流开发者的 DeepSeek Harness 终端编程 Agent。 English · 简体中文 [!IMPORTANT] dsh-code 是独立的社区项目,并非 DeepSeek 官方发行版。DeepSeek Harness 本身也处于开发者预览阶段,在升级固定基线时可能出现不兼容变更。 为什么有 dsh-code? DeepSeek Harness 已提供官方 Web UI 和插件优先的 Agent Runtime。dsh-code 面向更习惯留在终端中的开发者:它将同一套 DSH Agent 语义封装成紧凑的键盘驱动界面,适合与 Shell、编辑器、 Git 和远程开发环境配合使用。 产品借鉴了 Pi 的终端交互思想,并使用 @earendil-works/pi-tui 完成终端渲染,但没有复制或替换 Agent 核心。Agent Loop、会话、模型适配器、工具、沙箱、权限、MCP、Skills、Plan/Todo 和 Sub-Agent 仍由固定版本的 DSH Runtime 负责。 简而言之: DeepSeek Harness Agent Runtime + Pi 风格终端交互 + pi-tui 渲染器 环境要求 | 组件 | 支持范围(0.1.6 起) | | macOS | macOS 14 或更高,Apple Silicon (arm64) | | Windows | Windows 10 或更高,x64 | | Linux | x64,Ubuntu 22.04 真机验证;Ubuntu 24.04 安装 CI | | Node.js | 22.19+(不含 Node 23)或 24+ | | 包管理器 | 普通安装只需要 npm | 0.1.6 起支持 macOS、Windows、Linux 三平台,Ubuntu 真机验收记录见 Linux 验证记录。Linux 剪贴板需要安装 wl-copy/wl-paste(Wayland)或 xclip/xsel(X11);/web 自动打开需要桌面浏览器。 暂不支持 Linux ARM64/Alpine(musl)、macOS Intel/Rosetta、Windows ARM,以及不安装 Node.js 的独立可执行文件分发方式;其他 Linux 发行版尚未验证。 安装 npm 安装 npm install -g @tsingwill/dsh-code 如需安装当前候选版本而不是稳定通道: npm install -g @tsingwill/dsh-code@next 验证安装结果: dsh-code --version dsh-code --help npm 包名是 @tsingwill/dsh-code,安装后的终端命令仍是简短的 dsh-code。 从源码构建 git clone --recurse-submodules https://github.com/guoxiucai/dsh-code.git cd dsh-code corepack enable corepack prepare pnpm@11.7.0 --activate pnpm install --frozen-lockfile pnpm run build:lib pnpm run build node lib/bin.js 功能展示 功能亮点 - 终端原生工作流:流式 Markdown、默认五行折叠的思考与长工具正文、始终完整展示的带行号文件 Diff、可选中复制的结果、主题色粘贴标记、Shell 结果块和底部固定输入区。 - Standard / PTC 双模式:默认 Standard 直接调用工具;PTC 用一个 TypeScript 程序编排多步工具操作。PTC 子调用按原生工具行展示,长正文默认折叠,文件 Diff 始终完整。 - 复用 DeepSeek Harness 语义:只使用 DSH 的公共 Session/Event 和服务接口,不维护第二套 Agent Loop、会话存储、权限引擎或工具注册表。 - TUI 内完成模型配置:通过可回退的内联向导配置 DeepSeek、OpenAI 或 OpenAI-compatible 服务。 - 安全的项目启动流程:按规范化绝对路径记录信任状态,支持 read-only、 workspace-write、danger-full-access 三种权限预设。 - 持久化会话:新建、恢复、搜索和删除历史会话,从历史请求前 Fork,克隆当前快照,查看会话统计,以及压缩上下文。 - 清晰的 Agent 状态与决策交互:独立的 Plan/Todo 状态、用户消息排队提示、工具进度、重试与压缩提示、一次性审批条、结构化问题、计划评审,以及可点击并支持取消/移除的 Sub-Agent 运行状态。 - 高效终端操作:/ 命令补全、@ 文件与文件夹模糊联想、! Shell 模式、内联选择器和键盘导航。 - 独立安装与数据目录:数据保存在 ~/.dsh-code,不会覆盖单独安装的 dsh,并提供显式更新命令。 - 自适应视觉主题:DeepSeek 蓝主题分别针对暗色和亮色终端背景优化。 架构说明 dsh-code 有意保持为固定 DSH 基线之上的轻量终端宿主: flowchart TB User["终端用户"] --> CLI["dsh-code 启动器"] CLI --> TUI["终端宿主Pi 风格交互 + pi-tui"] TUI --> API["DSH 公共服务session/event + AgentHandle"] API --> DSH["@deepseek-ai/dsh-baseStandard / PTC Agent Preset"] DSH --> Runtime["Agent Loop · 会话 · 模型 · 工具沙箱 · 权限 · MCP · SkillsPlan/Todo · Sub-Agent"] 启动器只负责产品层能力:命令解析、~/.dsh-code 数据隔离、项目信任、会话选择、 Profile 初始化、产品更新,以及委托上游 DSH 启动。TUI 只渲染结构化事件,并通过公共 AgentHandle API 把用户输入送回 Agent。 TUI 只开放上游 standard(Standard)与 ptc(PTC)两个 Agent Preset。新会话默认 Standard,可通过启动参数或首轮前的 /mode 选择 PTC;首轮开始后模式锁定,恢复会话始终按事件日志中记录的模式重建,避免在已有工具历史中途更换 schema。 架构约束见 docs/adr/,固定的上游版本见 UPSTREAM_BASELINE.md。 快速开始 cd /path/to/your/project dsh-code 首次在某个项目中启动时: 1. 核对规范化后的项目路径并选择权限预设; 2. 如果 ~/.dsh-code/.credentials.yaml 尚未保存任何 API Credential,dsh-code 会自动打开内联 Provider 配置向导; 3. 选择服务商,保存第一个 API Token 和默认模型,然后在输入框中发送任务。后续可使用 /config 添加或修改服务商。 选择 DeepSeek 官方 API 时,/config 会要求填写 API Key 并选择默认模型。 选择 OpenAI-compatible 服务时,向导会明确配置五项内容: 1. Provider Route ID; 2. Base URL; 3. Credential 环境变量名(根据 Route ID 自动预填); 4. API Key; 5. Model ID。 向导中的示例以 DeepSeek-compatible 服务为准;按 Esc 可以回到上一步,只有最后一步成功后才会写入配置。Credential 以仅当前用户可读的权限保存在 ~/.dsh-code/.credentials.yaml。 使用说明 命令行 | 命令 | 说明 | | dsh-code | 启动新的交互式 TUI 会话 | | dsh-code --mode standard\|ptc | 以 Standard 或 PTC 模式启动新会话 | | dsh-code -c、--continue | 继续当前项目最近一次会话 | | dsh-code -r、--resume | 打开可搜索的会话选择器 | | dsh-code resume [session-id] | 选择或指定会话进行恢复 | | dsh-code -p "<任务>" | 以 Headless 模式执行一次任务并输出最终答案 | | dsh-code -p "<任务>" --approve | 非交互信任项目,使用 workspace-write 权限 | | dsh-code plugin <命令> | 委托 DSH 管理 Profile 插件(需要 pnpm) | | dsh-code update --check | 检查 npm stable 渠道是否有更新 | | dsh-code update | 确认并安装可用更新 | | dsh-code update --channel next | 切换到 RC 更新渠道 | TUI 内置命令 | 命令 | 说明 | | /config | 配置 DeepSeek、OpenAI 或 OpenAI-compatible 服务 | | /model | 使用内联选择器切换当前模型 | | /mode [standard\|ptc] | 选择当前空白会话的模式;首轮开始后不可切换 | | /permission | 选择当前权限预设 | | /goal | 内联查看和管理上游 DSH 长期目标 | | /skills [搜索词] | 发现 Skill;Space 仅对 dsh-code 启停,Enter 直接调用选中项 | | /agents | 查看当前活跃 Sub-Agent,并在内联列表中取消或移除任务 | | /mcp | 管理 dsh-code 用户级/项目级 MCP 及实时状态;按需从 DSH/Codex/Claude 导入独立副本 | | /plugins [搜索词] | 管理当前 Profile 的插件:安装、启停、更新、卸载、组件诊断及会话重载 | | /rename [标题] | 重命名并固定当前会话标题 | | /jobs | 查看输出或停止当前会话的后台任务 | | /export [路径] | 将当前会话导出为 Markdown 或 JSONL | | /session | 查看会话、消息、工具、模型与 Token 统计 | | /new | 切换到新的空 Standard 会话 | | /resume | 打开带父子层级的全屏会话选择器并切换到所选会话 | | /fork | 从选中的历史用户请求之前创建分支,并自动切换到新会话 | | /clone | 克隆当前会话快照并自动切换到克隆会话 | | /web | 挂起 TUI,打开 dsh-code 随包上游 DSH Web;Web 停止后重新加载当前会话 | | /compact | 通过 DSH 压缩当前上下文 | | /quit、/exit | Agent 空闲时退出 | | !<命令> | 直接执行 Shell/PowerShell;结果保存到会话,并进入后续模型上下文 | | !!<命令> | 仅在本次终端显示 Shell/PowerShell 结果,不保存结果、不进入模型上下文 | 固定 DSH Profile 提供的其他命令可以通过 / 自动补全发现。 /web 运行期间,终端只显示生命周期状态,不再接受对话输入。关闭浏览器标签不会停止本地 Web 进程;在终端按 Esc 可安全停止 Web 并返回重新加载后的 TUI,按 Ctrl+D 则停止 Web 并退出 dsh-code。 常用按键 | 按键 | 操作 | | Enter | 发送内容或确认内联选择 | | Esc | 返回/取消当前内联步骤;首个输出前也可中断当前轮次,或取消用户 Shell 命令 | | Ctrl+C / Command+C | 复制结果区域中选中的文本,不再中断当前轮次 | | Ctrl+O | 展开/折叠思考与长工具正文(默认 5 个视觉行);文件 Diff 始终展开 | | Ctrl+D | Agent 空闲时退出 | | / | 打开命令补全 | | @ | 模糊联想项目文件和文件夹;安装 fd 后可获得更快查找 | 审批与结构化问题 工具请求沙箱升级或 Hook 返回 ask 时,dsh-code 会在输入区域上方固定显示一次性的 Allow once / Reject 审批条。选择只作用于本次请求,不会写入长期授权;按 Esc 取消本次审批。 DSH 的 ask_user_question 工具与 Plan 模式评审共用同一块底部固定交互区。单选题选择后直接提交;多选题使用 Space 勾选,移动到 Continue 后按 Enter 提交。选择 Type an answer… 后按 Enter,会直接在占位行原位输入,面板内容不会跳动;输入状态下按 Esc 返回上一步菜单。较长的计划 Markdown 固定显示最多 6 行,可用 PgUp / PgDn 滚动。并发交互请求会串行排队,避免后来的问题覆盖正在回答的问题。 会话、配置与数据隔离 默认情况下,dsh-code 的全部状态都保存在 ~/.dsh-code: ~/.dsh-code/ ├── .credentials.yaml # 仅当前用户可读的服务商 Credential ├── profiles/dsh-code/ # 固定 DSH Profile 与终端宿主 Patch ├── projects/ # 按规范化路径保存的项目信任记录 └── sessions/ # 按项目分组的持久化会话 通过 DSH_CODE_HOME 可以修改根目录。启动时 dsh-code 会把委托进程的 DSH_HOME 指向这个独立目录,并禁用 DSH Telemetry。它不会导入或覆盖独立 DSH 的设置、凭据、会话、插件和 MCP 配置,因此全局安装的上游 dsh 命令仍保持独立。作为唯一例外,内置 DSH Skill Registry 会只读发现兼容目录:项目的 .dsh/.agents/.codex/.claude、 dsh-code 用户目录 ~/.dsh-code/skills,以及用户目录下 ~/.dsh/.agents/.codex/.claude 的 Skills。dsh-code 不安装、删除、复制或更新这些 Skill; /skills 使用单层列表展示上游 Registry 选出的生效项及其来源;Space 切换启停,Enter 把已启用且允许用户调用的 Skill 放入输入框。启停状态是 dsh-code 专属覆盖,保存在 ~/.dsh-code/skill-preferences.json,不会修改来源 SKILL.md,也不会改变其他产品中的 Skill 状态;禁用后,该 Skill 在 dsh-code 的模型目录和用户斜杠调用中均不可见。 /plugins 打开 dsh-code Profile 的内联插件管理面板:Enter 查看详情,Space 启停。 支持 npm 包、绝对路径本地目录、Git URL 和 tarball 安装,显示进度、取消结果、构建脚本审批、精确版本更新与诊断。修改要求 Agent 空闲,且没有排队消息、活跃子代理或运行中的后台任务;需要重载时恢复同一会话并保留历史。已安装、配置启用和运行时可用分别显示。 web、headless Profile 独立;Web 专属界面和自定义 preset 不会自动获得 TUI 支持。 详见插件管理说明。 dsh-code 的 MCP 配置分别保存在 ~/.dsh-code/mcp.json(用户级)和可信项目的 .dsh-code/mcp.json(项目级)。/mcp 默认只展示这些归 dsh-code 所有的配置;只有选择 Import from other agents… 时才只读扫描独立 DSH、OpenAI Codex 和 Claude Code。 导入的是独立快照,之后不会跟随或修改来源。Space 就地启停,项目级同名配置覆盖用户级;新增、导入、启停和删除都会在当前进程内通过上游公开 MCP Client 热更新,无需退出 dsh-code。 绿色 ● connected 表示至少注册了一个工具,并分别显示 connecting、disabled、overridden、 error 和 not-connected 状态。导入的环境变量或 HTTP Header 可能包含凭据,因此配置在支持的平台使用 0600,项目文件也已加入 Git 忽略。旧版 .dsh-code/cordis.patch.yml 中的 MCP row 会一次性迁移,其他项目插件 row 保持不变。 stdio Server 的 stderr 不会再直接写入备用屏幕;诊断输出保存在私有轮转日志 ~/.dsh-code/logs/mcp/<server>.stderr.log。 更新 dsh-code 只执行用户明确发起的更新,不会静默升级: dsh-code update --check dsh-code update dsh-code update --channel next dsh-code update --version 0.1.2 更新命令仅适用于 npm 全局安装。源码检出版本应继续通过 Git 和原构建工具升级。 开发与验证 pnpm run typecheck pnpm test pnpm run build 仓库通过 deepseek-harness/ Git Submodule 固定 DeepSeek Harness 版本。产品代码位于仓库根目录;上游变更应单独升级固定基线,或者优先贡献给 DSH。 发布设计、macOS/Windows 编译、候选包验证和更新方案见 docs/NPM_RELEASE.md。 贡献与安全 - 提交 Pull Request 前请阅读 CONTRIBUTING.md; - 使用 GitHub Issues 公开反馈问题和建议; - 安全漏洞请按照 SECURITY.md 私密报告; - 不要上传未脱敏的 API Key、会话日志、Credential 或 Crash Log。 项目关系与致谢 dsh-code 是独立的下游社区项目,与 DeepSeek AI 或 Pi 维护者不存在隶属或官方背书关系。 - Agent Runtime:DeepSeek Harness - TUI 渲染与交互思想:Pi - 产品封装、分发和终端宿主:本仓库 dsh-code 终端小鲸鱼 Logo 将 DeepSeek 官方鲸鱼轮廓与终端窗口、提示符组合在一起。 DeepSeek 名称和官方鲸鱼图形归其各自权利人所有,完整归属说明见 NOTICE。 许可证 MIT © 2026 guoxiucai。第三方许可证说明见 THIRD_PARTY_NOTICES.md。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
guoxiucai/dsh-code
面向偏好 TUI 工作流开发者的 DeepSeek Harness 终端编程 Agent。
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 22,025未汉化DSH
73.6
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 2,049已汉化MCP
72.8
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,358已汉化DSH
71.9
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13938 个插件含 PR 收录与…
★ 350已汉化DSH
71.8
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7
这是你的仓库?认领条目