dsh-stack

中文文档
0.1.0发布于 2026/11/03MITES Module零依赖

DeepSeek Stack 模式 agent 预设:aicodeking/deepseek-stack 的 29 个 ds-* 循环技能、常驻 ds-mode 人格,以及轮次收尾时把「改完没验证」「同一修法连错两次」打回继续的守卫。

原始使用文档
文档目录9 节
  1. 上游 → 本预设
  2. 组成
  3. 安装
  4. 用法
  5. 两个守卫(ds-loop)
  6. 边界与注意
  7. 自检
  8. 装在这里的意义
  9. 维护

dsh-stack

DeepSeek Stack 模式(ds-stack)agent 预设,以可装卸 bundle 的形式分发。

仓库:58fly/dsh-stack · 技能来源:aicodeking/deepseek-stack(MIT,见 NOTICE.md)· 上游预设:TonyZiYuan/dsh-ds-stack-preset

aicodeking/deepseek-stack 是一套 SKILL.md 技能包:它不开新框架,只给廉价模型补上四个常见缺口——不先计划、没跑就说修好了、同一思路反复重试、长任务跑偏。这套东西在 DSH 里只缺两样:一个是常驻(技能只有被 skill 工具加载后才生效,而 ds-mode 自称 always-on),一个是硬边界(散文规则在长会话里会漂移)。本预设补的就是这两样,其余原样搬过来。

上游 → 本预设

上游提供本预设里变成位于
ds-mode(「始终生效」的工作风格)常驻人格 persona.prefix(规则压缩,非全文)preset/agent.cordis.yml
29 个 ds-* 技能原样随包分发的技能目录preset/skills/
「改完必须跑验证」轮次收尾检查:改了文件但之后没有成功检查 → 打回继续preset/ds-loop.mjs
「同一修法错两次就停」轮次收尾检查:连续 2 次失败 → 打回换前提preset/ds-loop.mjs
npx skills addDSH bundle(cordis.patch.yml + 预设声明)本目录

除上述三处,工具目录、沙箱、审批、压缩、子代理都与内置 standard 预设逐行一致——本预设不改变 Agent 能做什么,只改变它的工作方式。

组成

  • cordis.patch.yml — bundle 补丁:插入一条 @deepseek-ai/dsh-agent-preset 声明(preset-ds-stack,显示名「DeepSeek Stack 模式」,order 6)。
  • preset/agent.cordis.yml — 预设组合本体:人格、技能根、循环守卫、shell/文件/任务/目标/计划/压缩/委派等行。
  • preset/ds-loop.mjs — 两个轮次收尾守卫(见下)。
  • preset/skills/ — 上游 29 个技能,逐字节保留。

安装

首选 npm 源(版本号可追溯,插件页的更新提示显示 0.1.0 这样的版本号):

plugin_manager({ action: "install_bundle", target: "dsh-stack" })

或用 npm 直接装进 profile:

npm install dsh-stack

再把 dsh-stack 加进 profile package.json 的 dsh.profile.bundles。

备选 Git 源(跟随 main 分支最新提交,适合要试未发布改动时):

plugin_manager({ action: "install_bundle", target: "https://github.com/58fly/dsh-stack" })

差异:宿主对 Git 源安装的更新检查走 git ls-remote -- <repo> HEAD,commit 就是它的版本标识,所以插件页的「有新版本」会显示 commit SHA(如 afaa2ac)而不是版本号。要能看出「装的是哪个版本」,用 npm 源。

安装即注册 preset-ds-stack。预设只在新会话且会话仍为空白时可选;已在跑的会话保留它启动时的组合。

用法

  • 新建会话时选「DeepSeek Stack 模式」,人格立刻生效。
  • 首轮会带上一份 29 条技能的目录(每条摘要上限 400 字符,整份约 6.8k 字符 ≈ 1.7k token 的固定前缀);模型按任务自行 skill 加载,你也可以直接发 /ds-plan-loop、/ds-verify-loop、/ds-unstick 这类手势。
  • /ds-help 让模型自己挑技能。

两个守卫(ds-loop)

在 agent/turn-stopping(轮次即将关闭、尚未提交)时读取本轮的持久事件日志,命中规则就 steer 一条短消息,让这一轮再跑一步:

  1. 改完没验证:本轮出现过成功的文件改动(write / edit),但之后没有任何成功的 shell 检查(bash / pwsh)。提示语会带上仍未被证明的文件路径(已经被更早的检查覆盖的不列),要求跑最小可证明的命令,或一行说明为什么跑不了。
  2. 两次失败:本轮末尾连续 ≥2 次工具结果失败。提示语要求停止试第三个变体,改为验证失败尝试共同的前提。

设计边界:

  • 每个轮次最多打回 2 次(maxSteersPerTurn);第二次措辞更硬,明确指出「你已经第二次在没证据的情况下结束」,因为第一次的礼貌版显然没被采纳。限次仍在,守卫不会形成循环。
  • shell 结果只算「验证」,不算「改动」——sed -i … && npm test 这种一条命令里改加验不会被误判。
  • 纯文档改动(.md / .txt 等)豁免第一条:没有命令能证明 README 改对了。改代码 + 改文档混在一起时不豁免。
  • 纯问答轮次、计划模式轮次没有文件改动,不会触发。
  • 守卫内部异常只记一次日志,绝不阻断轮次收尾。

可调字段(preset/agent.cordis.yml 里 ds-loop 行):

字段默认含义
evidencetrue启用「改完没验证」检查
unsticktrue启用「连续失败」检查
failStreak2连续失败阈值
maxSteersPerTurn2单轮最多打回次数(第二次措辞更硬)
includeSubagentstrue子代理是否同样受检
mutationTools[write, edit]算作「改动」的工具名,只含宿主真实注册的
checkTools[bash, pwsh]算作「验证」的工具名,只含宿主真实注册的
documentationSuffixes[.md, .mdx, .txt, .rst, .adoc]改动文件全部是这些后缀时豁免「改完没验证」

边界与注意

  • 技能根用 customSkillDirs(rank 300),不是 bundledSkillDir:前者是追加,项目级(100/200)仍优先、用户自己的技能(400/500)仍加载、部署自带的 bundled 根不被顶掉;后者会整体替换部署默认值。代价是:若你在 ~/.dsh/skills 里放了同名 ds-*,本包的版本会赢(内容相同,通常无感)。
  • 不自动跟随上游更新:升级技能的办法是重新镜像上游 skills/ 覆盖 preset/skills/,本包不改写技能内容,因此不会有合并冲突。
  • 技能目录会造成每轮固定成本:摘要计 29 条、合计 6830 字符(≈1708 token),作为持久前缀每轮都会重发。想更省,删掉不用的技能目录即可(目录是唯一事实来源,删了就不会出现在目录里),或把 catalogDescriptionMaxLength 调小——但上游把「Use when …」放在每条描述末尾,截断会先丢掉最关键的触发条件。
  • 守卫没有平台分支:Windows 上 shell 工具名是 pwsh,已在 checkTools 默认值里;如果你关掉 tool-pwsh 换成别的执行器,记得同步这个列表,否则守卫静默失效。
  • bash 可以绕过第一条守卫:一条 bash 同时写文件并跑命令时,它只被算作「验证」。这是有意的取舍(否则 sed -i && npm test 会误报),代价是「全程用 bash 改文件」的工作方式不受约束。

自检

全部检查零依赖,Node ≥ 22 即可:

npm test
命令检查什么
node test/ds-loop.test.mjs守卫行为,17 条断言
node test/preset.test.mjs装配静态断言,12 条(人格在、守卫配置与模块默认值一致、禁用行没被改)
node scripts/verify-preset.mjs装配完整性:include 路径 = 包名 + 目录、技能根走 baseUrl、目录上限容得下最长描述
node scripts/verify-skills.mjs技能合法性:frontmatter、目录名 ↔ name、描述长度、29 个 /ds-* 交叉引用无死链
node scripts/verify-manifest.mjsmanifest 与发包产物:白名单、engines、npm pack 实际内容
node scripts/verify-host-api.mjs宿主私有契约:agent/turn-stopping、agent.steer、session.snapshotEvents、工具名注册表(没装 DSH 时 SKIP)

发布前另有 scripts/verify-release.mjs:工作区干净、tag 与版本对齐、CHANGELOG 有当前版本小节。

装在这里的意义

若 profile 以 link:(junction / symlink)方式安装本 bundle,那么改本目录的文件即改预设:下一次新建会话就取到新内容,不必重装;已存在的会话保留它启动时的组合。

维护

本仓库自行维护,不跟随上游自动更新。发布流程与目录规范见 AGENTS.md,版本变化见 CHANGELOG.md。

版本与发布记录

dsh-stack 共发布 2 个版本,首次发布于 2026/11/03;过去 12 个月发布了 2 个版本。

版本发布日期距今
0.1.0latest2026/11/03今天
0.0.0-stage2026/11/03今天

关于 dsh-stack 的常见问题

dsh-stack 是什么?

DeepSeek Stack 模式 agent 预设:aicodeking/deepseek-stack 的 29 个 ds-* 循环技能、常驻 ds-mode 人格,以及轮次收尾时把「改完没验证」「同一修法连错两次」打回继续的守卫。

如何安装 dsh-stack?

在项目目录运行 npm install dsh-stack,或使用 pnpm add / yarn add / bun add。

dsh-stack 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/dsh-stack 是否存在。

dsh-stack 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

dsh-stack 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^22.19.0 || >=24.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

dsh-stack 可以商用吗?

dsh-stack 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

dsh-stack 还在维护吗?

最新版本 0.1.0 发布于 2026/11/03(今天);至今共发布 2 个版本,其中过去 12 个月发布了 2 个;首次发布于 2026/11/03。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。