为每次工具调用设下契约,越界即拒绝或转审批
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add hua2003-liu/dsh-stop-that-shit该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · tool
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 9 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 22 处,展示前 20 条)
- 读取本地文件index.cjs:51
const raw = fs.readFileSync(path.join(ROOT, relative), 'utf8'); - 读取本地文件index.cjs:176
if (!fs.existsSync(path.join(ROOT, spec.file))) continue; - 读取本地文件vendor/runtime-audit.cjs:83
return fs.readdirSync(root).filter((name) => name.endsWith('.jsonl') && name !== 'annotations.jsonl') - 读取本地文件vendor/state.cjs:29
const stat = fs.statSync(lock, { throwIfNoEntry: false }); - 读取本地文件vendor/state.cjs:37
const parsed = JSON.parse(fs.readFileSync(file, 'utf8')); - 写入本地文件vendor/state.cjs:52
fs.mkdirSync(path.dirname(file), { recursive: true }); - 写入本地文件vendor/state.cjs:56
fs.writeFileSync(temporary, `${JSON.stringify(state, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 }); - 写入本地文件vendor/state.cjs:61
try { fs.renameSync(temporary, file); break; } - 读取本地文件vendor/state.cjs:68
finally { if (fs.existsSync(temporary)) fs.unlinkSync(temporary); } - 读取本地文件vendor/state.cjs:88
const match = /^( +):/.exec(fs.readFileSync(file, 'utf8')); - 删除本地文件vendor/state.cjs:104
try { fs.rmdirSync(directory); } - 删除本地文件vendor/state.cjs:111
try { fs.unlinkSync(path.join(directory, owner)); } - 读取本地文件vendor/state.cjs:121
const stat = fs.statSync(file); - 读取本地文件vendor/state.cjs:124
const owners = fs.readdirSync(file); - 删除本地文件vendor/state.cjs:138
if (ownerHasExited(legacyLockOwner(file))) fs.unlinkSync(file); - 写入本地文件vendor/state.cjs:152
fs.mkdirSync(path.dirname(file), { recursive: true }); - 写入本地文件vendor/state.cjs:156
try { fs.mkdirSync(file, { mode: 0o700 }); created = true; } - 写入本地文件vendor/state.cjs:161
fs.writeFileSync(path.join(file, owner), '', { flag: 'wx', mode: 0o600 }); - 写入本地文件vendor/runtime-storage.cjs:14
fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 }); - 写入本地文件vendor/runtime-storage.cjs:17
fs.appendFileSync(file, `\n${JSON.stringify(record)}\n`, { encoding: 'utf8', mode: 0o600 });
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
非官方 DeepSeek Harness(DSH)适配器,用于 Stop That Shit:两个技能、/sts 命令,以及按会话生效的工具调用契约(拒绝/询问)。
README
由 DeepSeek 最新模型翻译生成dsh-stop-that-shit
把 Stop That Shit 的判定引擎接进 DeepSeek Harness:两个技能、一个 /sts 命令,以及每次工具调用前的契约检查(deny / ask / 放行)。
非官方。 这是第三方 DSH 适配层,不是上游项目的官方发行版。判定引擎(vendor/)与 skills/ 原样取自上游(MIT),本地改动只有 VENDOR.md 记录的那一处。
它做什么
- 未武装的会话全部放行。只有你显式写下契约,检查才开始生效。
- 契约按根会话记账:子会话、孙会话都按根的契约判定,不会因为委派而跳出边界。
- 拒绝是真正的工具拒绝:模型拿到 Error: STOP / …,不是你跟它商量。
- 依赖安装可以变成审批卡(deps=ask),而不是一刀切拒绝。
展开完整文档(README 剩余 1 节)
dsh-stop-that-shit
把 Stop That Shit 的判定引擎接进 DeepSeek Harness:两个技能、一个 /sts 命令,以及每次工具调用前的契约检查(deny / ask / 放行)。
非官方。 这是第三方 DSH 适配层,不是上游项目的官方发行版。判定引擎(vendor/)与 skills/ 原样取自上游(MIT),本地改动只有 VENDOR.md 记录的那一处。
它做什么
- 未武装的会话全部放行。只有你显式写下契约,检查才开始生效。
- 契约按根会话记账:子会话、孙会话都按根的契约判定,不会因为委派而跳出边界。
- 拒绝是真正的工具拒绝:模型拿到 Error: STOP / …,不是你跟它商量。
- 依赖安装可以变成审批卡(deps=ask),而不是一刀切拒绝。
| 能力 | 实现 |
| 技能 | stop-that-shit、stss 经 ctx.skills.register() 进入技能目录 |
| /sts | ctx.commands.register();只武装,或武装后转发任务 |
| Guard | tools/pre-execute 返回 deny / ask / 放行 |
| 审计 | 每次判定写 ~/.dsh/stop-that-shit/runtime/<hash>.jsonl |
| 委派预算 | agents=N 按根会话记账,subagent / subagent_fork / workflow 都计入 |
快速开始
要求:DSH Desktop(或 dsh 命令行)>= 0.2.1-rc.2,Node >= 22。装完开新会话生效。
A. 插件页(推荐) — 侧边栏 → 插件 → 安装,填:
github:hua2003-liu/dsh-stop-that-shit
B. 命令行一行:
dsh plugin --profile <profile> add github:hua2003-liu/dsh-stop-that-shit
dsh plugin add 会把依赖写进配置档并同时启用 bundle(已验证)。用别的配置档测试时, <profile> 换成名字即可;desktop 归 Desktop 应用管理,装它请走插件页或 plugin_manager。
C. 本地目录(开发时,或离线安装):
dsh plugin --profile <profile> add C:\path\to\dsh-stop-that-shit
离线的做法是下载 Releases 里的 dsh-stop-that-shit-<version>.tgz 并解压,再把解压出的目录按上一行安装。
30 秒验证装好了
技能是否进了目录:应该能看到 stop-that-shit 和 stss
dsh --profile <profile> headless 'List the exact names of every skill in your skill catalog, one per line.'
只读契约是否可以真的挡住写
dsh --profile <profile> headless '$stop-that-shit review -- deliberately try to create proof.txt, then report the denial text'
第二条应当报 STOP / INTENT + MODE_FORBIDS_MUTATION,并且 proof.txt 不存在。
用法
/sts review -- Read this diff, report problems, change nothing.
/sts change files=src/** -- Add the parser.
/sts change deps=ask hash=allow -- Add the dependency I just asked for.
/sts status
也可以继续用上游的提示词指令,必须是消息的第一个非空行:
$stop-that-shit change files=src/** -- implement the parser
| 字段 | 取值 | 默认 |
| mode | answer review monitor change watch | unconfirmed(只走 Stop Ladder,不构成完整契约) |
| level | watch guard lock off | watch |
| files= | a/\|b, 表示全树 | 不限边界 |
| deps= | allow ask deny | ask |
| hash= | allow ask deny | deny |
| agents= | 非负整数 | 不限 |
-- 之后是任务正文;正文里不要再写指令。
判定结果
| 契约状态 | 工具调用 | 模型看到 |
| 未武装 | 全部放行 | 无异常 |
| review 里的写 | deny | Error: STOP / INTENT + MODE_FORBIDS_MUTATION |
| files= 之外 | deny | Error: STOP / SCOPE + PATH_OUTSIDE_CONTRACT |
| deps=deny 的安装 | deny | Error: STOP / SCOPE + DEPENDENCY_NOT_AUTHORIZED |
| deps=ask 的安装 | ask | 弹出 DSH 审批卡;无人可批时按拒绝处理 |
| 根会话不可达 | deny(fail-closed) | 要求先解析完整 lineage |
事件映射
| DSH 事件 | 用途 |
| agent/pre-step | 从可信用户消息里解析指令,并把契约摘要折进本步消息 |
| tools/pre-execute | 判定每次调用:deny / ask / next() |
| tools/post-execute | 观察结算结果,更新委派账本 |
| session/created / session/disposed | 初始化 / 结束会话状态 |
| subagent/start / subagent/end | 委派预留与释放 |
root lineage:header.parentSession 只给直接父;插件一路回溯到无父会话,回溯不了就 fail-closed 拒绝,不拿中间子会话冒充根。
状态与审计
~/.dsh/stop-that-shit/sessions/<hash>.json # 每个会话的契约与委派账本 ~/.dsh/stop-that-shit/runtime/<hash>.jsonl # 每次判定的事件流(JSONL)
<hash> 是根会话 id 的短哈希。删掉这个目录即重置全部契约。dataDir 可以在 patch 的 config 里覆盖。
配置
profile 的 cordis.patch.yml
- id: sts
config:
dataDir: '' # 默认 ~/.dsh/stop-that-shit runCodeBindingOnly: false # 见「已知限制」
已知限制
- 不是安全边界。真正的隔离是 DSH 的 fs sandbox / 权限预设;这里是任务边界护栏。
- run_code(PTC):程序体可以直接 import('node:fs') 写文件,只有嵌套的 tools.* 调用会被逐个判定。默认把 run_code 记为 unknown 走审批;只有能证明运行时被约束时才把 runCodeBindingOnly 设为 true。
- shell 写目标未证明:mkdir src/x、echo > src/x 这类命令在 files= 边界下可能被判 WRITE_PATH_UNPROVEN(要求审批)。上游的 shell 写目标修复尚未合入本仓库的 vendor。
- 审计里的 ask:记成 denial response(controller 的响应枚举没有 approval 值)。
- 审批卡依赖宿主:headless 这类没有审批通道的宿主会把 ask 降级为拒绝,这是 DSH 的既定行为。
排障
| 现象 | 检查 |
| 新会话看不到 skill | 确认 bundle 已启用:dsh --profile --dump-config 里应有 id: sts |
| 装了但没生效 | 新装 bundle 走 HMR 会即时激活;替换已装的包需要重启进程 |
| dsh plugin add 报 EPERM ... rename | profile 的 node_modules 里残留了旧链接;删掉该目录后重试 |
| 审批卡不弹 | 宿主没有审批通道,或 deps= 不是 ask;用 /sts status 看当前契约 |
| 拒绝原因是 WRITE_PATH_UNPROVEN | shell 命令的写目标无法证明,改用 write/edit 工具或放宽边界 |
开发
npm test # node test/plugin.test.cjs(10 项断言)
npm run check # 语法检查
npm run update-vendor
许可
本仓库的胶水代码 MIT。vendor/ 与 skills/ 来自上游 MIT,见 NOTICE.md 与 vendor/UPSTREAM-LICENSE。
上游:<https://github.com/lennney/stop-that-shit>预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
hua2003-liu/dsh-stop-that-shit
为每次工具调用设下契约,越界即拒绝或转审批
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,826已汉化DSH
72.2
花束设计alchaincyf/huashu-design
一句话生成网页、原型、PPT 与信息图等可交付设计
★ 28,638已汉化DSH
71.7
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
这是你的仓库?认领条目