dsh-grill-first
DSH(DeepSeek Harness)插件:开工前先刨根问底——把模糊需求问成明确需求,你在对话里点头之后,主任务才开工。
它解决什么问题
AI 助手最常见的失败不是"不会做",而是"做完了才发现做的不是你要的"。这个插件在任何新任务开工前插入一道需求澄清环节:
- 模型先把你的任务原文交给
grill_start判定; - 任务模糊(缺目标 / 范围 / 约束 / 验收标准)→ 它按轮追问你,每轮 3 个问题,最多 3 轮,每轮都基于你上一轮的回答继续深挖;
- 问清后整理成中文四段清单(目标 / 范围 / 约束 / 验收标准),用
grill_confirm请你确认; - 你点"确认,按此开工"→ 本次任务放行;你点"要改"→ 它按你的反馈修订后再来一次;
- 一句话就能说清的小任务、以及带「直接做 / 跳过提问 / 不用问 / skip」字样的消息,不会被打扰。
严格档位(gateMode: "strict")下,需求没确认前模型无法执行写文件、跑命令这类变更类操作——从机制上保证"没问清就不许动手"。
安装
装插件前请先退出正在跑的任务。三种方式任选:
方式一:DSH 插件市场(推荐)
在 DSH 设置 → 插件里搜索 dsh-grill-first 一键安装。
方式二:npm 命令行
dsh plugin --profile <你的 profile 名> add dsh-grill-first
方式三:本地包 / GitHub 仓库
dsh plugin --profile <你的 profile 名> add /绝对路径/dsh-grill-first-0.1.1.tgz
dsh plugin --profile <你的 profile 名> add github:InoriMutsumi/dsh-grill-first
装完即生效:本机实测 DSH 的 live profile 会热加载新插件,不需要重启(若你的 profile 是启动式、或列表里没出现,再完全退出 DSH 重开一次)。
使用
装好之后不需要你做什么:它靠两件事自动工作。
- 协议提示段:插件往系统提示里注入一小段中文协议(约 600 字),告诉模型"接到新任务先调
grill_start"。你在系统提示里能看到【开工前提问协议(grill-first)】就说明装好了。 - 工具:模型会用这两个工具推进澄清流程。
| 工具 | 作用 |
|---|---|
grill_start |
判定任务是否需要澄清;返回 verdict、focus_hints(该问什么)、memory_context(已知偏好,避免重复问) |
grill_confirm |
把四段式需求清单交给你确认;确认后放行任务,并把确认过的内容写进记忆 |
想跳过提问时
- 消息里带上「直接做」「跳过提问」「不用问」「skip」中任意一个 → 立刻开工;
- 或者在设置里把
enabled关掉 / 把gateMode调成off→ 整个插件静默。
配置项
DSH 设置界面 → 插件 → dsh-grill-first,共 7 项:
| 配置 | 类型 | 默认 | 说明 |
|---|---|---|---|
enabled |
布尔 | true |
总开关。关闭后既不追问也不拦截工具 |
gateMode |
off / warn / strict |
warn |
off 不拦截;warn 只在日志里记录"需求未确认";strict 未确认前拦截变更类工具 |
maxQuestionsPerRound |
1-6 | 3 |
每轮最多问几个问题 |
maxRounds |
1-10 | 3 |
最多追问几轮 |
intensity |
gentle / standard / grill |
standard |
追问力度:只问关键点 / 标准 / 刨根问底 |
bypassKeywords |
字符串数组 | ["直接做","跳过提问","不用问","skip"] |
命中即跳过提问 |
memoryEnabled |
布尔 | true |
是否启用两层记忆 |
默认是
warn而不是strict:默认档位保证升级插件不会突然卡住你已有的工作流。想要硬门禁请手动切strict。
怎么改配置
DSH 设置页里的插件条目目前只提供「启用 / 停用」开关(客户端的插件页不渲染第三方插件的配置表单),要改上面 7 项请编辑 profile 的补丁层 cordis.patch.yml:
# <profile 目录>/cordis.patch.yml
- id: dsh-grill-first
name: dsh-grill-first
config:
gateMode: strict # off | warn | strict
maxQuestionsPerRound: 3 # 1-6
maxRounds: 3 # 1-10
intensity: standard # gentle | standard | grill
memoryEnabled: true
bypassKeywords: [直接做, 跳过提问, 不用问, skip]
改完重启 DSH 生效。只写想改的项也可以,其余项用默认值。
两层记忆
只记录你确认过的内容,不记录对话原文,也不会把需求清单写成文件。
| 层 | 位置 | 内容 |
|---|---|---|
| 全局层 | <profile 目录>/grill-first/global.json(不可写时退化到 ~/.dsh-grill-first/global.json) |
通用偏好,如"注释一律用中文" |
| 项目层 | <工作区>/.dsh/grill-first/memory.json |
项目背景、任务历史(任务名 + 需求摘要 + 日期) |
下次追问时,grill_start 会把这些内容作为 memory_context 返回,模型就不会重复问你同一件事。
开发
npm install # 装开发依赖(schemastery 由宿主提供,仅开发期需要)
npm run build # TypeScript → dist/
npm test # 构建 + 91 个单测 / 端到端场景测试
node scripts/selfcheck.mjs # 静态自检:中文 JSDoc、any 用量、需求→代码位置
推送到 GitHub 后 .github/workflows/ci.yml 会自动跑上面那两条(npm ci + npm test)。dist/ 是故意提交的:这样 dsh plugin add github:… 装完即可用,不需要在你的机器上编译。
代码结构:
src/
index.ts 插件装配入口(工具 + 协议段 + 门禁)
config.ts 配置归一化(不依赖宿主,可单测)
configSchema.ts Schemastery 配置声明(设置界面用,7 项)
version.ts 从 package.json 读版本号,供 grill_start 返回
judge/heuristics.ts 任务模糊度判定(纯函数)
prompt/protocol.ts 注入系统提示的中文协议文本
tools/grillStart.ts grill_start 工具
tools/grillConfirm.ts grill_confirm 工具
gate/preExecute.ts 变更类工具门禁(tools/pre-execute + 新消息重置)
memory/store.ts 两层记忆的读写
已知限制
- 门禁只对根 agent(能直接跟你对话的那个)生效;子 agent / 团队成员不拦,否则正常的委派工作流会被卡死。因此委派类工具本身(
subagent、workflow、spawn_teammate…)在未确认前也会被拦,防止"派个子代理替自己动手"绕过门禁。 warn档位只能"记录不拦截":DSH 的tools/pre-execute事件没有"放行但同时给模型提示"这种返回形态。- 记忆是本地文件,不含加密;删掉对应 json 即清空。
grill_confirm优先走 DSH 的结构化提问通道;该通道不可用时(例如子 agent 内部)会返回needs_user_confirmation: true,由模型改用内置提问工具兜底。- 改代码后必须重启 DSH:DSH 加载的是 profile 里那份安装拷贝,而且插件代码改动不会热生效(实测:
cordis.patch.yml里的配置改动是热生效的,包代码不是)。判断运行中的是哪一版:调一次grill_start,返回里的version字段就是当前在跑的版本;看不到version说明跑的是 0.1.0 之前的旧代码。 - 跳过关键词里英文按词边界匹配(
skip能命中skip、Skip this、(skip),但不会命中skipList、skip_list、bypass-keyword这类标识符);中文关键词按子串匹配(直接做命中那你直接做好了)。
许可
MIT,见 LICENSE。
No comments yet. Be the first to write one.