把一份应急演练脚本读成一张差异清单——哪一行、哪一栏、差什么、怎么补,逐条指认。
面向安全管理员与应急管理岗的 DeepSeek Harness 核对插件:读演练表头加每个环节一行,核对脚本自身的齐备与算术;只列材料内部能指认的差异,不判合规、不认定责任。
安装 · 配置 · FAQ · 简体中文 · English · Español · Português · हिन्दी
dsh plugin --profile <name> add dsh-drill-script-check
社区插件,与 DeepSeek 官方无关。唯一仓库:https://github.com/PerryLink/dsh-drill-script-check(Gitee 为镜像)。
dsh-drill-script-check 读取一份应急演练脚本——演练表头加每个环节一行——核对这份脚本自身的齐备与算术:每个环节是否填写演练阶段或脚本内容、是否明确指挥人、响应级别是否取自你配置的口径、有脚本动作的环节是否列明所需资源、各环节计划时长合计是否等于演练总时长、关键节点是否写明判定条件、环节序号是否重复、表头是否声明演练名称与组织单位。它返回一份「哪一行、哪一栏、差什么、怎么补」的清单:每条发现都带 ruleId、locator(行与字段)、found、expected、fix。空清单不等于「全部正确」——无法执行的规则会逐条写进 skipped 并说明原因。
一分钟试跑(用仓内样例,不需要先安装):
node samples/quickstart/run.mjs
drill_script_check: 1 issue(s) — error 0, warn 1, info 0
skipped: 2
这是对 samples/quickstart/input/DR-001-unsafe.json 的真实输出,期望值见 samples/quickstart/expected/result.json。
-
安装(三选一):
# git 通道(最新 main) dsh plugin --profile web add github:PerryLink/dsh-drill-script-check # npm 通道(已发布版本) dsh plugin --profile web add dsh-drill-script-check # tarball 通道:本仓库 pnpm pack 后 dsh plugin --profile web add ./dsh-drill-script-check-<version>.tgz
发布包自带构建产物
lib/,安装即用;从 git 通道安装时由prepare自动构建。 -
最小配置(bundle 形态自动插入一行,无需任何配置键):
- insert: - id: dsh-drill-script-check name: dsh-drill-script-check
package.json#dsh.bundle.patch指向的cordis.patch.yml就是这一行;任何可调项都可以在这行下面加config。 -
验证已生效:
dsh --profile web --dump-config | grep 'dsh-drill-script-check' node samples/quickstart/run.mjs --json
{ "tool": "drill_script_check", "issueCount": 1, "summary": { "error": 0, "warn": 1, "info": 0 }, "skippedCount": 2 }
卸载:dsh plugin --profile web remove dsh-drill-script-check(或从 profile patch 删掉该行)。
规则数据与代码分离:rules/drill-script-check.yaml 声明每条检查,替换该文件即可切换规则集版本,无需改 TypeScript。加载期逐条校验 document / number / clause / excerpt / kind / source,夸大依据的规则库会在加载期失败,而不是产出一份看起来很有底气的报告。
| 规则 | 核对什么 | 级别 | 依据类型 |
|---|---|---|---|
DR-001 |
演练阶段与脚本内容至少填写一项 | warn | 原则推导 |
DR-002 |
每个环节明确指挥人 | warn | 原则推导 |
DR-003 |
响应级别取自你配置的取值清单(默认不执行) | info | 本机构配置 |
DR-004 |
有脚本动作的环节列明所需资源 | warn | 原则推导 |
DR-005 |
各环节计划时长合计等于演练总时长 | warn | 原则推导 |
DR-006 |
关键节点写明判定条件 | warn | 原则推导 |
DR-007 |
环节序号在脚本内唯一 | warn | 原则推导 |
DR-008 |
表头声明演练名称与组织单位 | warn | 原则推导 |
接受 JSON 或 YAML。字段名匹配忽略大小写、空格、下划线与连字符;报告沿用脚本自己的列名,因此每条发现都指回你表里的那一栏。
drillName: 某某装置泄漏事故应急演练 drillType: 综合演练 organizer: 某某公司应急管理部 plannedAt: 2026-06-10 totalDurationMin: '15' rows: - { 序号: '1', 演练阶段: 预警与信息报告, 脚本内容: 值班员发现泄漏报警,电话报告应急指挥部, 指挥人: 张指挥, 参演人员: 值班员、调度员, 所需资源: 对讲机 4 台、气体检测仪 2 台, 计划时长: '15', 响应级别: Ⅲ级, 关键节点: 指挥部确认接报并启动响应(判定条件:指挥人下达启动指令) }
工具 drill_script_check
输入
{"rows":[{"序号":"1","演练阶段":"","脚本内容":"","指挥人":"张指挥", ...}]}输出
{
"id": "dsh-drill-script-check.DR-001.de09b5a6",
"ruleId": "DR-001",
"severity": "warn",
"locator": {
"row": 1,
"field": "phase"
},
"found": "第 1 行 phase、script 都为空",
"expected": "phase、script 至少应填写一项",
"fix": "补填演练阶段与脚本内容;本条只核对是否填写,不判断处置是否正确"
}Observed from dsh-drill-script-check/tests/fixtures/DR-001/DR-001-unsafe.json; dsh-drill-script-check/tests/fixtures/DR-001/cases.json; dsh-drill-script-check/rules/drill-script-check.yaml; dsh-drill-script-check/tests/index.test.ts
| 你会问 | 它怎么答 |
|---|---|
| 某个环节的演练阶段和脚本内容都没填,会被报出吗? | 会。DR-001 同时要求 phase 与 script 两栏,两栏都空才报出该行——填了其中一栏即通过。它只核对这一栏是否填写,不判断该处置动作是否正确、是否符合预案。 |
我填了响应级别,DR-003 却报告 skipped,为什么? |
DR-003 拿 level 栏与 values 里的取值清单比对,而 values 出厂为空,因此在你配置本单位的分级口径之前,本条报告 skipped(无法执行),而不是静默通过。它只核对所填值是否在册,绝不判断某一事件应当启动哪一级响应。 |
| 纯告知性的环节没有列装备物资,会被报出吗? | 不会。DR-004 只在环节的 script 内容已填写时才要求 resource 栏,因此纯告知性的环节不会被要求列资源。它只核对资源栏是否填写,不判断所列资源是否充足、是否与实际配备一致。 |
| 各环节计划时长加起来不等于演练总时长,能查出来吗? | 能。DR-005 把各环节的 durationMin 相加,再与 totalDurationMin 相比,后者取自材料表头(引擎会先在行内找,再回落到表头)。本条只做加法核对,不判断时间安排是否合理、是否够用。 |
| 环节的关键节点栏要写什么? | DR-006 要求该环节的 checkpoint 栏填写关键节点及其判定条件。它只核对这一栏是否写明,不判断该条件是否可观测、是否恰当。 |
| 同一阶段分了三个动作行,其中两行的环节序号相同。 | DR-007 会报出重复的 stepNo,因为序号重复会让时长合计与环节统计失真。同一阶段分多个动作各占一行是正常的——给每行各自的序号即可。 |
全部可调参数都在 src/config.ts 的 Schemastery schema 中,只改 cordis.yml 即可生效,无需改代码;逐条阈值在 rules/ 下的规则库文件里。
| 键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
rulesFile |
string | rules/drill-script-check.yaml |
规则库文件路径,相对插件包根目录 |
disabledRules |
string[] | [] |
要停用的规则 id 列表;每条都会出现在 skipped 中 |
onlyRules |
string[] | [] |
只执行这些规则 id;留空表示执行全部规则 |
skipNotes |
string | "" |
附加到每条 skipped 说明后的备注,例如标注本机构实施细则 |
timeoutMs |
number | 120000 |
工具协作式超时预算(毫秒) |
值得知道的规则级参数:
DR-003的values—— 本单位的响应级别清单,例如[Ⅰ级, Ⅱ级, Ⅲ级, Ⅳ级];为空表示不检查,本条报skipped。DR-005的field/headerField/tolerance—— 时长列、与它比对的总时长表头字段,以及容差(默认0.01)。DR-004的conditionField/requiredFields—— 什么条件下要求资源栏,以及要求哪几栏。DR-008的fields—— 表头必须声明的字段,默认[drillName, organizer]。
profile patch 覆盖示例:
- insert: - id: dsh-drill-script-check name: dsh-drill-script-check config: onlyRules: [DR-001, DR-004, DR-005, DR-007] skipNotes: 本机构实施细则 2026 版
材料会传到哪?插件读写什么?
只读你给的 file(或内联 material),不写文件、不联网、不调用模型;报告以 markdown 与 reportJson 返回给你。manifest 的 demo 声明 reads 只有「用户指定的材料文件」,writes 为空。
报告里一条问题都没有,是不是就代表脚本没问题?
不是。无法执行的规则会逐条写进 skipped 并说明原因;例如 DR-003 的 values 出厂为空,在配置本级响应级别之前它报 skipped,而不是静默通过。空清单只表示「已执行的规则没有发现差异」。
`DR-005` 说时长对不上,但我看着没问题?
它把各行 durationMin 相加,与表头 totalDurationMin 比较,容差 0.01。常见原因是漏了一行环节,或某个时长打错。它只做加法核对,不判断时间安排是否合理、是否够用。
会和其他插件抢工具名、服务键或事件吗?
不会。只注册一个带命名空间的工具 drill_script_check,不提供服务键、不注册客户端 slot、不注册 webServer 路由、不监听共享事件;bundle patch 只 insert 自己一行。逐条论证见「与其他 DSH 插件的互操作性」。
性能开销多大?
纯本地表格运算:没有网络请求、没有模型调用、没有原生依赖。timeoutMs 默认 120000 毫秒是工具协作式超时预算,不改变检查逻辑。
边界: 本插件核对一份 应急演练脚本 的齐备性与算术——每个环节是否写明演练阶段与脚本内容,是否明确指挥人,响应级别是否取自你配置的取值口径,有脚本动作的环节是否列明所需资源,各环节计划时长合计是否等于演练总时长,关键节点是否写明判定条件,环节序号是否唯一,以及脚本是否写明演练名称与组织单位。它不判定演练是否逼真、是否有效,响应级别是否正确,处置动作是否正确,也不判定演练是否达到目标。
- 不判合规、不认定责任。 只列材料内部能逐条指认的差异,结论性判断留给审核人。
- 引用原文本次未取得。 YJ/T 9007—2019 的逐字条文未取得;每条规则的
excerpt如实写明这一点,kind降为derived-from-principle(严重级封顶warn)或institutional-configuration(封顶info)。取得文本后应把excerpt换成真实条款,并把kind提升为direct。 - 不内置响应分级。
DR-003的values出厂为空,必须填本单位预案的分级口径;插件只核对所填值是否在册,绝不判断某一事件应当启动哪一级响应。 - 列名匹配是宽松的。 字段名忽略大小写、空格、下划线与连字符;报告沿用脚本自己的列名,因此差异指回原表头。
DR-005依赖表头总额。 表头没有totalDurationMin,或没有任何一步记录时长时,本条报skipped。check的manifest-peers可能误报。 静态检查器比对的是早于 0.2 世代的硬编码 peer 范围;安装期的 peer 校验以运行时为准,这是dsh-plugin-dev的已知上游问题。
- 插件装上了但工具不出现。 确认
main指向lib/index.mjs且pnpm run build已生成该文件;main写错会让加载器静默跳过该条目。 dsh plugin add报版本不兼容。 peer 范围覆盖0.1.x与0.2.x;若运行时在其之外,可显式豁免:dsh plugin --profile <name> allow-version [email protected] --dsh-version <runtime> --accept-risk。- 某条规则没有执行。 查看
skipped数组,其中写明了规则 id 与原因。 - 时间看起来偏移。 全部计算都是对输入字符串做墙上时钟运算,不做时区换算。
- 无工具名冲突。 只注册
drill_script_check一个工具,带插件命名空间,不占用内置工具或其他插件的裸名。 - 无服务键、slot、路由冲突。 不提供任何服务键,不注册客户端 slot,不注册
webServer前缀。 - 无共享事件监听。 不监听
agent/pre-step、tools/post-execute等顺序敏感事件,因此不参与任何链条,也不会短路别人的结果。 - 无 patch 层冲突。 bundle patch 只
insert自己一行,不覆写内置行的config。 - 无全局改写。 不改原型、不改写
process.env、不替换全局 fetch dispatcher。
| 文件 | 文号 | 引用它的规则 |
|---|---|---|
| 《生产安全事故应急演练基本规范》 | YJ/T 9007—2019(原 AQ/T 9007—2019,2025 年第 1 号公告调整代号;本次未取得条文) | DR-001, DR-002, DR-004, DR-005, DR-006, DR-007, DR-008 |
| 本单位应急预案体系(本机构配置) | 无统一标准(本条依据为本机构预案的分级口径) | DR-003 |
每条
excerpt的状态逐条不同,不是统一的。 有的规则引用逐字条文(kind: direct),有的按条文原则推导(kind: derived-from-principle,最高warn),有的阈值由本机构配置(kind: institutional-configuration,最高info)。规则包从不概括引文:取不到原文时,excerpt会如实写明,推理写在note里;并有测试断言没有任何规则声称拥有它并不拥有的引文。对仍标为「未取得原文」的规则,取得文本后必须把excerpt换成真实条款,并把kind提升为direct。结论性判断留给审核人:本插件只列出材料内部可以逐条指认的差异,不判断事实真伪,也不评价合规性。
规则数据在 rules/drill-script-check.yaml。规则包头部完整写明引用缺口,每条规则的 note 重复与该条相关的部分。加载期「摘录必须是真实引文且不少于八个字符」的守卫无法区分引文与描述,因此本包依赖头部说明、逐条 note,以及一条断言每条 excerpt 都承认缺口的测试。
| 维度 | 状态 |
|---|---|
| Harness | 对等范围 >=0.1.2-rc.1 <0.2.0 || >=0.2.0-0 <0.3.0 —— 已实测同时接受 0.2.0-rc.2 与 0.2.1-rc.2。engines.dsh 声明为 >=0.2.1-0 <0.3.0,0.2.1 起由宿主单独裁决 |
| Node | ^22.19.0 || >=24.0.0 |
| 平台 | 全平台(纯 ESM;无原生代码、无联网、不调用模型) |
| 工具模式 | native / ptc 均可;批量校验整个目录时建议 ptc,schema 成本只付一次 |
- Gitee 镜像(同步镜像,以 GitHub 为准)
- dshfind 插件页(安装量与排名)
- OpenSSF Scorecard 报告(由 .github/workflows/scorecard.yml 驱动)
- DSH Market(已上架)
- 生态实测知识库:插件开发指南 · 选型实测数据 · 维护取舍判据
pnpm install pnpm run typecheck # tsc --noEmit pnpm test # vitest,共享表格插件套件 + 成对夹具 pnpm run build # tsdown -> lib/index.mjs + lib/index.d.mts pnpm run verify:self-contained # 依赖 spec 均来自 registry pnpm run check:lockfile # lockfile 漂移 pnpm run check:readmes # 五语 README 一致性 pnpm run check:citations # 引用核验基线 pnpm pack # 发布 tarball
prepublishOnly 会重跑整条门禁,因此发布不会带上未构建或已漂移的树。
插件是数据驱动的:src/model.ts 声明表格形状与材料契约,共享件提供读取器与检查引擎,规则包声明每条检查;新增一条同类型的检查只是规则包编辑,不是代码改动。
| 路径 | 作用 |
|---|---|
src/index.ts |
函数插件契约(name / inject / Config / apply,无 default export);注册 drill_script_check 工具并解析规则包路径 |
src/config.ts |
Schemastery schema;全部可调项都在这里 |
src/model.ts |
表格形状与材料契约:声明可用列到规范字段名的映射,以及规范字段到表头字段的映射 |
src/view.ts |
报告面向模型的投影;output.schema 镜像它 |
src/shared/ |
共享件(读取器、表格检查引擎、规则加载、报告形状、YAML 子集、日历运算、措辞守卫、表格助手);复制进来而非依赖 |
rules/drill-script-check.yaml |
规则包,8 条规则 |
rules/evidence/ |
每条引文的条款核验记录(clause-verification-yj9007.md) |
tests/ |
vitest;每条规则一对合规/违规夹具,另有边界语义测试与共享表格套件 |
samples/quickstart/ |
一分钟试跑样例与期望输出 |
scripts/ |
门禁脚本与配图生成 |
配图复跑:docs/assets/dsh-drill-script-check-hero-{zh,en}-{light,dark}.webp 与 docs/assets/dsh-drill-script-check-flow-v5-{light,dark}.svg 均由 scripts/gen-readme-assets.py 程序化生成(Pillow 画按语言本地化的 hero,手写 SVG 画规则×字段矩阵);结构图只放命令面 token、规则/字段标识与简短英文注记,五语共用:
python scripts/gen-readme-assets.py
本仓没有 benchmark 数据,因此不生成 evidence 条形图。
本项目是 PerryLink 维护的 DeepSeek Harness 插件家族成员(全部 Apache-2.0)。如果这个插件帮到了你,给个 star——它不解锁任何功能,但会让下一个人更容易找到它。
- @PerryLink —— 创建者与维护者:规则包与核对引擎、五语文档。
展开全部插件
LICENSE(Apache License 2.0)© 2026 dsh-drill-script-check contributors
Apache-2.0 · 社区插件,与 DeepSeek 无关。