🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

操作约定门铃 HeliosTangDev/dsh-ops-conventions

DeepSeek Harness
HeliosTangDev3 天前有提交已提供中文文档扫描:含敏感能力

动手前自动注入你的操作约定清单,并可拦截违规写操作

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add HeliosTangDev/dsh-ops-conventions
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 3 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 77 处,展示前 47 条)
  • 读取本地文件
    index.mjs:44
    return existsSync(p);
  • 读取本地文件
    index.mjs:80
    const t = readFileSync(bellExtraFile, "utf8").trim();
  • 读取本地文件
    index.mjs:124
    const hit = readdirSync(projectionDir).find(
  • 读取本地文件
    index.mjs:141
    const st = statSync(path);
  • 读取本地文件
    index.mjs:144
    const stats = compactionStats(JSON.parse(readFileSync(path, "utf8")));
  • 读取本地文件
    index.mjs:170
    const prev = existsSync(file) ? readFileSync(file, "utf8").split("\n").filter(Boolean) : [];
  • 写入本地文件
    index.mjs:172
    writeFileSync(file, next.join("\n") + "\n", "utf8");
  • 写入本地文件
    index.mjs:180
    mkdirSync(dirname(logFile), { recursive: true });
  • 写入本地文件
    index.mjs:181
    appendFileSync(logFile, `${new Date().toISOString()} ${line}\n`, "utf8");
  • 读取本地文件
    rule.mjs:32
    if (existsSync(join(dir, "INDEX.md"))) return dir;
  • 读取本地文件
    rule.mjs:79
    const raw = readFileSync(f, "utf8").trim();
  • 读取本地文件
    rule.mjs:439
    const sha = createHash("sha256").update(readFileSync(ruleFile)).digest("hex").toUpperCase();
  • 读取本地文件
    rule.mjs:440
    if (!existsSync(stateFile)) return { ok: true, reason: "no-state" };
  • 读取本地文件
    rule.mjs:441
    const st = JSON.parse(readFileSync(stateFile, "utf8"));
  • 读取本地文件
    rule.mjs:490
    if (hf && existsSync(hf)) host = readFileSync(hf, "utf8").trim();
  • 读取本地文件
    install.mjs:34
    const readJson = (p) => JSON.parse(readFileSync(p, "utf8").replace(/^ FEFF/, ""));
  • 读取本地文件
    install.mjs:95
    const found = candidates.find((p) => existsSync(p));
  • 写入本地文件
    install.mjs:98
    mkdirSync(localDir, { recursive: true });
  • 写入本地文件
    install.mjs:100
    copyFileSync(found, dest);
  • 读取本地文件
    install.mjs:111
    if (!existsSync(profilePkgPath)) {
  • 写入本地文件
    install.mjs:125
    if (!existsSync(backupPath)) copyFileSync(profilePkgPath, backupPath);
  • 读取本地文件
    install.mjs:125
    if (!existsSync(backupPath)) copyFileSync(profilePkgPath, backupPath);
  • 写入本地文件
    install.mjs:126
    writeFileSync(profilePkgPath, JSON.stringify(value, null, 2) + "\n", "utf8");
  • 读取本地文件
    install.mjs:128
    const buf = readFileSync(profilePkgPath);
  • 写入本地文件
    install.mjs:139
    copyFileSync(backupPath, profilePkgPath);
  • 读取本地文件
    install.mjs:150
    if (existsSync(targetDir)) rmSync(targetDir, { recursive: true, force: true });
  • 删除本地文件递归
    install.mjs:150
    if (existsSync(targetDir)) rmSync(targetDir, { recursive: true, force: true });
  • 执行外部命令来自配置/变量
    release.mjs:25
    const r = spawnSync(cmd, cmdArgs, { encoding: "utf8", ...opts });
  • 执行外部命令固定命令
    release.mjs:35
    return spawnSync("git", ["push", "origin", ref], { encoding: "utf8", timeout: 120000 });
  • 读取本地文件
    release.mjs:42
    const raw = readFileSync(pkgPath, "utf8");
  • 执行外部命令固定命令
    release.mjs:58
    const hasTag = spawnSync("git", ["rev-parse", "-q", "--verify", `refs/tags/v${v}`], { encoding: "utf8" });
  • 执行外部命令固定命令
    release.mjs:60
    const made = spawnSync("git", ["tag", "-a", `v${v}`, "-m", `v${v}`], { encoding: "utf8" });
  • 执行外部命令固定命令
    release.mjs:91
    if (spawnSync("git", ["rev-parse", "-q", "--verify", `refs/tags/${curTag}`]).status === 0) {
  • 执行外部命令固定命令
    release.mjs:92
    const remote = spawnSync("git", ["ls-remote", "--tags", "origin", `refs/tags/${curTag}`], { encoding: "utf8", timeout: 30000 });
  • 读取本地文件
    release.mjs:109
    const cl = readFileSync("CHANGELOG.md", "utf8");
  • 读取本地文件
    release.mjs:145
    const b = readFileSync(file);
  • 写入本地文件
    release.mjs:159
    writeFileSync(pkgPath, JSON.stringify(pkg, null, indent.length) + "\n", "utf8");
  • 读取本地文件
    update-all.mjs:39
    return candidates.find((p) => existsSync(p)) || null;
  • 执行外部命令来自配置/变量
    update-all.mjs:43
    const r = spawnSync(process.execPath, [pnpm, "install", "--lockfile-only", "--ignore-scripts"], {
  • 读取本地文件
    update-all.mjs:52
    if (!existsSync(dir)) return [];
  • 读取本地文件
    update-all.mjs:53
    return readdirSync(dir, { withFileTypes: true })
  • 读取本地文件
    update-all.mjs:57
    .filter((p) => existsSync(join(p, "package.json")));
  • 读取本地文件
    update-all.mjs:62
    if (!existsSync(p)) return null;
  • 读取本地文件
    update-all.mjs:64
    return JSON.parse(readFileSync(p, "utf8").replace(/^ FEFF/, "")).version;
  • 执行外部命令固定命令
    update-all.mjs:90
    const g = spawnSync("git", ["-C", repo, "pull", "--ff-only"], { stdio: "inherit" });
  • 执行外部命令来自配置/变量
    update-all.mjs:100
    const r = spawnSync(process.execPath, [join(repo, "install.mjs"), profile], { stdio: "inherit" });
  • 删除本地文件
    update-all.mjs:139
    unlinkSync(join(dir, f));
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-llm
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

在动手前确定性注入操作约定(配合 OpenViking 技能使用),闲聊零成本

README

由 DeepSeek 最新模型翻译生成
dsh-ops-conventions(操作约定门铃) 在 AI 动手前把「你的操作约定清单」确定性地注入一次,并可选地硬拦截写操作,解决「约定记了,但干活时不提就不用」的问题。 插件本身不含任何个人约定:它只做「提醒 + 拦截 + 配置」。规则内容全部来自你自己的 INDEX.md(以及可选的补充文件)。 它做什么 - 注入门铃:每个会话、每个约定版本注入一次,内容 = read <你的 INDEX.md> 并执行清单 + 可选补充文本;约 1 行,不改 VERSION 不会重复刷屏。 - 版本变化再提醒:改约定目录里的 VERSION 文件后,下一轮(任何轮次)会重新注入。 - 可选硬拦截:本会话还没 read 过 INDEX.md 时,拒绝写类工具(write/edit/…,可加 pwsh/bash/cmd 等);读过后本会话放行。 - 可选待办门:配置 todoFile 后,还要求先跑一次 todoCheckCmd 校验器(防止报过时待办)。 - 可选维护报告摘要:配置 maintReport 后,报告里有 Issues 就注入一条摘要。 - 可选结构门:配置 structGates 后,写某个区域前必须先跑该区域的结构检查器。 - 注入日志:每次注入/拦截都写日志,生效与否可核对。
展开完整文档(README 剩余 1 节)
dsh-ops-conventions(操作约定门铃)

在 AI 动手前把「你的操作约定清单」确定性地注入一次,并可选地硬拦截写操作,解决「约定记了,但干活时不提就不用」的问题。

插件本身不含任何个人约定:它只做「提醒 + 拦截 + 配置」。规则内容全部来自你自己的 INDEX.md(以及可选的补充文件)。

它做什么

- 注入门铃:每个会话、每个约定版本注入一次,内容 = read <你的 INDEX.md> 并执行清单 + 可选补充文本;约 1 行,不改 VERSION 不会重复刷屏。
- 版本变化再提醒:改约定目录里的 VERSION 文件后,下一轮(任何轮次)会重新注入。
- 可选硬拦截:本会话还没 read 过 INDEX.md 时,拒绝写类工具(write/edit/…,可加 pwsh/bash/cmd 等);读过后本会话放行。
- 可选待办门:配置 todoFile 后,还要求先跑一次 todoCheckCmd 校验器(防止报过时待办)。
- 可选维护报告摘要:配置 maintReport 后,报告里有 Issues 就注入一条摘要。
- 可选结构门:配置 structGates 后,写某个区域前必须先跑该区域的结构检查器。
- 注入日志:每次注入/拦截都写日志,生效与否可核对。

安装

方式一:安装脚本(推荐)

git clone https://github.com/HeliosTangDev/dsh-ops-conventions.git
cd dsh-ops-conventions
node install.mjs # 默认装到 ~/.dsh/profiles/desktop
node install.mjs /path/to/profile # 指定 profile
node install.mjs /path/to/profile --uninstall # 卸载

方式二:自己加依赖

在 profile 的 package.json 里加:

"dsh-ops-conventions": "https://github.com/HeliosTangDev/dsh-ops-conventions/releases/latest/download/dsh-ops-conventions.tgz"

然后在该 profile 目录执行 pnpm install,重启 DSH。

方式三:市场

在 dsh-m 市场里搜索 dsh-ops-conventions 安装。

配置

在 profile 的 cordis.patch.yml 里追加(所有字段都可选,不配也能用):

- id: dsh-ops-conventions
name: "dsh-ops-conventions"
config:
skillsDir: "D:\\my-conventions" # 你的约定目录(里面放 INDEX.md + VERSION) bellExtra: "额外的提醒文本" # 直接追加一行文本 bellExtraFile: "D:\\my-conventions\\BELL.txt" # 或指向文件(每次注入现读,改文件不用重启) enforce: false # 只提醒、不拦截
blockedTools: ["write","edit","multi_edit","apply_patch","notebook_edit","pwsh","bash"]
todoFile: "D:\\my-work\\tasks\\OPEN.md"
todoCheckCmd: "powershell -NoProfile -ExecutionPolicy Bypass -File D:\\tools\\todo_check.ps1"
maintReport: "D:\\my-work\\tasks\\MAINT-LATEST.md"
structGates:
- id: docs
pathRe: "docs[/\\\\]" # 命中这些路径时……
checkRe: "docs_check\\.py" # 这条命令就是该门检查器 checker: "python D:\\tools\\docs_check.py" 可选:现场状态行(宿主版本 / 维护报告 / 待办条数),默认关闭 status: true statusTodoJson: "D:\\my-work\\todo.json" # 读条目数用 hostVersionFile: "D:\\tools\\host_version.txt" # 宿主版本缓存(由你自己的脚本写)
asarCandidates: ["C:/apps/DSH/resources/app.asar"]
可选:只读状态工具 ops_status(agent 可直接调用查看状态),默认关闭 statusTool: true memoryDir: "D:\\my-memory\\memories" # 统计记忆库 .md 数量与最近更新时间 todoLastFile: "D:\\my-work\\todo_last.txt" # 上次校验器输出(可选)可选:版本引用核对(上一条回复写了非现场版本时警告),默认关闭 versionWarning: true versionWarnFile: "D:\\my-work\\VERSION-WARN.md"
installedProfileDirs: ["C:/Users/me/.dsh/profiles/desktop"]
可选:回复合规扫描(在下一轮检查上一条回复,命中注入警告并落文件),默认关闭 replyWarnFile: "D:\\my-work\\VERSION-WARN.md" replyChecks:
- id: no-next-time
pattern: "下次注意" message: "不许用「下次注意」结案"yaml disabled: false

最小约定目录

D:\my-conventions\
INDEX.md # 你的清单入口(写清“做什么事读哪份清单”) VERSION # 一个数字;改它 = 让门铃重新注入

INDEX.md 示例: md

操作约定索引

| 要做的事 | 读这份 |
| 写/改脚本 | ops-scripts/SKILL.md |
| 改完验证 | ops-check/SKILL.md |

不配置会怎样

- 使用插件包自带的 skills/ 示例清单(会提示你去换成自己的目录);
- 只拦截 write/edit/multi_edit/apply_patch/notebook_edit;
- 其余可选功能(待办门/维护摘要/结构门)全部关闭。

验证生效 powershell Get-Content "$env:USERPROFILE\.dsh\ops-conventions\ops-conventions.log" -Tail 5

应看到 plugin loaded skillsDir=...、inject vN chars=...;被拦截时应看到 guard deny ...。

卸载 bash
node install.mjs --uninstall

或从配置档 package.json 删除依赖、node_modules/dsh-ops-conventions,并删掉 cordis.patch.yml 里对应条目,然后重启。

边界

- 这是「提醒执行器」,不是安全边界:它可以挡住误操作,但不能保证模型一定执行清单。
- 注入/拦截都在本机,不联网、不收集数据。
- 适配 DSH 0.2.x(Node 22 / 24),MIT 许可。
预览分享卡片长什么样 ↓HeliosTangDev/dsh-ops-conventions
分享 · DeepSeek Harness Hub
HeliosTangDev/dsh-ops-conventions

动手前自动注入你的操作约定清单,并可拦截违规写操作

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部