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

行为纪律管家 Zoria-Lind/dsh-behavior-enhancer

DeepSeek 客户端v1.3.1
Zoria-Lind6 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

DeepSeek Harness 行为管理插件:改变模型怎么调用工具,让复杂任务更稳定,不干预内容本身。

36/100
综合分
9
GitHub 星标
477
npm 周下载
—/5
用户评分

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

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/Zoria-Lind/dsh-behavior-enhancer.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
生态插件
可安装,未声明 dsh 能力
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/10/23·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 6 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包@zoria-lind/dsh-behavior-enhancer @ 1.3.1
✓Node 引擎要求 >=18.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 22:52:32

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

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 41 处,展示前 41 条)
  • 写入本地文件
    src/index.js:51
    mkdirSync(bootDir, { recursive: true })
  • 写入本地文件
    src/index.js:52
    writeFileSync(bootFile, JSON.stringify(payload, null, 2) + '\n', 'utf8')
  • 读取本地文件
    src/modules/parallelConvergence.js:28
    try { return JSON.parse(readFileSync(stateFile, 'utf8')) } catch { return null }
  • 写入本地文件
    src/modules/parallelConvergence.js:32
    mkdirSync(dirname(stateFile), { recursive: true })
  • 写入本地文件
    src/modules/parallelConvergence.js:33
    writeFileSync(stateFile, JSON.stringify(state), 'utf8')
  • 删除本地文件
    src/modules/parallelConvergence.js:37
    try { unlinkSync(stateFile) } catch { }
  • 写入本地文件
    src/modules/postWriteCheck.js:35
    try { appendFileSync(DEBUG_LOG, `[${new Date().toISOString()}] ${msg}\n`, 'utf8') } catch {}
  • 读取本地文件
    src/modules/postWriteCheck.js:214
    const existed = existsSync(absPath)
  • 读取本地文件
    src/modules/postWriteCheck.js:217
    const size = (readFileSync(absPath).length ?? 0)
  • 写入本地文件
    src/modules/postWriteCheck.js:219
    mkdirSync(dirname(bakPath), { recursive: true })
  • 写入本地文件
    src/modules/postWriteCheck.js:220
    copyFileSync(absPath, bakPath)
  • 写入本地文件
    src/modules/postWriteCheck.js:222
    mkdirSync(dirname(bakPath), { recursive: true })
  • 写入本地文件
    src/modules/postWriteCheck.js:223
    writeFileSync(bakPath, '', 'utf8')
  • 读取本地文件
    src/modules/postWriteCheck.js:234
    const siblings = readdirSync(dirname(bakPath))
  • 删除本地文件
    src/modules/postWriteCheck.js:238
    try { unlinkSync(join(dirname(bakPath), siblings.shift())) } catch { }
  • 写入本地文件
    src/modules/postWriteCheck.js:246
    if (snap.existed) copyFileSync(snap.bakPath, absPath)
  • 删除本地文件
    src/modules/postWriteCheck.js:248
    rmSync(absPath, { force: true })
  • 删除本地文件
    src/modules/postWriteCheck.js:249
    try { unlinkSync(snap.bakPath) } catch { }
  • 删除本地文件
    src/modules/postWriteCheck.js:325
    try { unlinkSync(snap.bakPath) } catch { }
  • 读取本地文件
    src/modules/postWriteCheck.js:331
    content = readFileSync(absPath, 'utf8')
  • 删除本地文件
    src/modules/postWriteCheck.js:338
    if (!snap.existed) { try { unlinkSync(snap.bakPath) } catch { } }
  • 读取本地文件
    src/modules/projectMemory.js:183
    try { prevSize = statSync(absPath).size } catch { }
  • 读取本地文件
    src/modules/projectMemory.js:203
    try { content = readFileSync(absPath, 'utf8') } catch { return decision }
  • 读取本地文件
    src/modules/disciplineInject.js:56
    try { if (statSync(p).isFile()) return p } catch { }
  • 读取本地文件
    src/modules/disciplineInject.js:71
    const data = JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    src/modules/disciplineInject.js:160
    mkdirSync(dirname(stateFile), { recursive: true })
  • 写入本地文件
    src/modules/disciplineInject.js:163
    writeFileSync(tmp, JSON.stringify(state, null, 2) + '\n', 'utf8')
  • 写入本地文件
    src/modules/disciplineInject.js:164
    renameSync(tmp, stateFile)
  • 删除本地文件
    src/modules/disciplineInject.js:166
    try { unlinkSync(tmp) } catch { }
  • 读取本地文件
    src/modules/disciplineInject.js:219
    try { section = extractSection(readFileSync(file, 'utf8'), headingNow) } catch { section = null }
  • 执行外部命令固定命令
    src/modules/writeDiffVerify.js:24
    (() => { try { const out = String(execFileSync('where', ['git'], { windowsHide: true, timeout: 2000 })); const hit = out.split(/ ? /)[0]?.trim(); re
  • 读取本地文件
    src/modules/writeDiffVerify.js:27
    const GIT_BIN = GIT_CANDIDATES.find((p) => p && existsSync(p)) ?? 'git'
  • 写入本地文件
    src/modules/writeDiffVerify.js:35
    try { appendFileSync(DEBUG_LOG, `${new Date().toISOString()} ${msg}\n`, 'utf8') } catch { }
  • 执行外部命令来自配置/变量
    src/modules/writeDiffVerify.js:53
    execFile(GIT_BIN, ['status', '--porcelain'], { cwd, timeout: timeoutMs, windowsHide: true },
  • 读取本地文件
    src/modules/writeDiffVerify.js:72
    if (existsSync(join(cur, '.git'))) {
  • 读取本地文件
    src/modules/compliance.js:30
    if (!existsSync(file)) return {}
  • 读取本地文件
    src/modules/compliance.js:31
    const data = JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    src/modules/compliance.js:46
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    src/modules/compliance.js:47
    writeFileSync(tmp, JSON.stringify(payload, null, 2), 'utf8')
  • 写入本地文件
    src/modules/compliance.js:48
    renameSync(tmp, file)
  • 删除本地文件
    src/modules/compliance.js:51
    try { unlinkSync(tmp) } catch { }
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

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

功能亮点

  • 工具调用纪律提示词
  • 失败触发并行收敛
  • 连续失败用户介入

DeepSeek Harness 行为管理插件:工具调用纪律提示词段落、失败触发的并行收敛(并发池降到 1,自动恢复)、连续失败时用户介入。与 dsh-token-optimizer 互补,也可单独使用。

README

由 DeepSeek 最新模型翻译生成
dsh-behavior-enhancer DeepSeek Harness 行为管理插件:改变模型怎么调用工具,让复杂任务更稳定,不干预内容本身。 与 dsh-token-optimizer 职责互补—— token-optimizer 管内容(压缩/裁剪/采样),本插件管行为(调用纪律/失败收敛/连续失败介入)。两者互不依赖,可独立安装。 它做什么(30 秒版) | 模块 | 机制 | 说明 | | behaviorPrompt | ctx.inject(['systemPrompt']) + systemPrompt.section() | 注册静态行为约束段(先读后写、批量前先验证、失败即收敛、同类修改串行)。软约束,强制靠下面模块 | | parallelConvergence | tools/result + settings.update('agent-loop', {maxParallelToolCalls}) | 任何工具失败(含命令级失败)→ 并行池上限压到 1;连续 3 次成功 → 恢复用户原值;上下文压力 ≥60%(idle 测量)→ 降档,回落 <54% 滞回恢复。
展开完整文档(README 剩余 1 节)
dsh-behavior-enhancer

DeepSeek Harness 行为管理插件:改变模型怎么调用工具,让复杂任务更稳定,不干预内容本身。
与 dsh-token-optimizer 职责互补—— token-optimizer 管内容(压缩/裁剪/采样),本插件管行为(调用纪律/失败收敛/连续失败介入)。两者互不依赖,可独立安装。

它做什么(30 秒版)

| 模块 | 机制 | 说明 |
| behaviorPrompt | ctx.inject(['systemPrompt']) + systemPrompt.section() | 注册静态行为约束段(先读后写、批量前先验证、失败即收敛、同类修改串行)。软约束,强制靠下面模块 |
| parallelConvergence | tools/result + settings.update('agent-loop', {maxParallelToolCalls}) | 任何工具失败(含命令级失败)→ 并行池上限压到 1;连续 3 次成功 → 恢复用户原值;上下文压力 ≥60%(idle 测量)→ 降档,回落 <54% 滞回恢复。串行状态跨进程持久化,重启自动接管还原 |
| failureGuard | tools/result + agent.followup() | 同工具连续失败 ≥2 次 → 向模型注入提示,引导它向用户确认而不是继续重试 |
| postWriteCheck | tools/execute(写前快照)+ tools/post-execute(写后检查) | write/edit 写入后做轻量语法解析(JSON 用 JSON.parse;YAML/代码做字符串与注释感知的括号配对 + YAML tab 缩进检查)。失败自动从 .bak 快照回滚并改写工具结果报告模型;≥3 个问题弹窗三选一(仅本次校验 / 本次+后续自动升级 / 不校验)。快照存 ~/.dsh-memory/files/(独立于记忆池),每文件保留最近 5 份 |
| projectMemory | tools/execute(记录写前大小)+ tools/post-execute(写后校验) | 模型写入 AGENTS.md / CLAUDE.md / AGENTS.local.md / CLAUDE.local.md 后做建议性校验:重复行、单文件超出 65,536 B、超长行(默认 200 字符)、主目录/用户名/盘符绝对路径泄漏、同进程内异常缩水(< 写前 30%)。只把提示追加到该次工具结果,绝不回滚、不新增存储、不注入提示词 |
| disciplineInject | agent/turn-stopping(惰性判定)+ agent.steer() | 每 N 小时 / N 轮,把 AGENTS.md 的 ## 项目纪律 节重述一次(默认 3 小时、内容未变且未压缩则跳过、压缩后必补)。走历史消息而不是 systemPrompt —— 动态内容进系统段会废掉整段前缀缓存。缺节/超限只 warn,不猜内容 |

失败识别两档:工具级 isError + 命令级签名(stderrAsFailure,默认开)——DSH 的 pwsh 工具只有基础设施错误才标 isError,命令失败(非零退出/stderr 错误)作为普通结果返回;本插件按 [exit code: N] 与 stderr 错误关键词补识别,普通 warning 不误判。

设计依据(DSH 核心源码核实)

- 核心已内置写操作排他:isConcurrencySafe 分类(read/read_image 并行,edit/write/pwsh 等 exclusive 屏障),插件不需要做 per-tool 串行规则;
- 插件唯一动态并行杠杆是池上限 maxParallelToolCalls(settings 活 getter,运行时 update 即生效);
- "暂停其他进行中的调用"无 API,不支持;工具失败无核心重试,改为"降并行让模型逐步修正";
- 行为约束段是静态文本,保护 DeepSeek 前缀缓存(实测命中率 99.75%,动态内容会杀缓存)。

安装 / 卸载

推荐:DSH 插件命令(在 profile 内用 pnpm 安装,并自动把包名加入 dsh.profile.bundles;卸载时一并移出,无需手改配置):

dsh plugin --profile web add @zoria-lind/dsh-behavior-enhancer
dsh plugin --profile web remove @zoria-lind/dsh-behavior-enhancer # 卸载

或手动安装(在 profile 目录执行;装完需确认 dsh.profile.bundles
包含 @zoria-lind/dsh-behavior-enhancer,卸载时同步删除):

cd ~/.dsh/profiles/web
pnpm add @zoria-lind/dsh-behavior-enhancer

或本地路径(git 克隆开发方式;add 换成目录路径,其余同上):

dsh plugin --profile web add ./dsh-behavior-enhancer

为什么 cordis.patch.yml 里的 name 是带 scope 的全名:patch 条目的 name 是 loader 解析已安装包名用的(与 package.json 的 name 一一对应),id: behavior-enhancer 才是配置树里的逻辑标识。npm/marketplace 安装的包名带 scope,所以 name 必须与之一致;不一致时 loader 会报 cannot resolve package。用上面的 dsh plugin add 安装即自动一致。

配置

- id: behavior-enhancer
name: '@zoria-lind/dsh-behavior-enhancer'
config:
behaviorPrompt:
enabled: true
order: -98
text: | # 可整体替换;必须保持静态(禁时间戳/动态值)工具调用行为纪律(本会话)
- 先读后写
- 批量操作前先验证
- 失败立即收敛
- 同类修改串行
- 证据与诚实
- 上下文已压缩时先查日志再回答 parallelConvergence: enabled: true recoveryThreshold: 3 # 连续成功次数达到后恢复原并行度 complexRatio: 0.6 # 上下文压力比(idle 测量),超阈值降档 minParallel: 1 defaultParallel: 10 # 读不到当前值时的 fallback(核心默认 10) contextWindowFallback: 1000000 failureGuard: enabled: true maxFailures: 2 followupMessage: '工具 {tool} 已连续失败 {count} 次。请停止重试,向用户说明失败原因并询问下一步。'
blockFeedback: false # 慎用:拦截错误结果正文,模型会看不到失败细节 feedbackText: '该工具调用失败。请先分析失败原因并修正调用参数后再重试,不要原样重复。'
postWriteCheck: # v1.1 写后检查(默认开启) enabled: true
writeTools: ['write', 'edit']
checkExtensions: ['json', 'yaml', 'yml', 'js', 'mjs', 'cjs', 'ts', 'tsx', 'jsx', 'py', 'ps1', 'sh', 'toml', 'xml']
maxFileBytes: 500000 # 超过该大小跳过检查(也跳过快照) keepBackups: 5 # 每文件保留的 .bak 快照份数 askThreshold: 3 # ≥3 个问题才弹窗询问(1~2 个自动回滚) askTimeoutMs: 120000 # 询问超时,超时按 autoRollback 降级 snapshotDir: '~/.dsh-memory/files' autoRollback: true # 询问不可用/超时时自动回滚(fail-safe) projectMemory: # v1.3 项目记忆写后校验(建议性,绝不回滚) enabled: true
writeTools: ['write', 'edit']
fileNames: ['AGENTS.md', 'CLAUDE.md', 'AGENTS.local.md', 'CLAUDE.local.md']
maxBytes: 65536 # 与内核 maxBytes 对齐(按单文件计;内核按整批渲染计) maxLineLength: 200 # 超长行提示(长表格可调大) duplicateMinLength: 8 # 短行(如表格分隔线)不计重复 shrinkRatio: 0.3 # 写后大小 < 写前 30% 告警 shrinkMinBytes: 2048 # 写前小于该值不判缩水 checkPathLeak: true # 主目录/用户名/盘符绝对路径泄漏 disciplineInject: # v1.3 项目纪律周期重述(走历史消息,不碰 systemPrompt) enabled: true heading: '## 项目纪律' # 只重述 AGENTS.md 里的这一节
candidates: ['AGENTS.md', 'CLAUDE.md'] # 从会话 cwd 向上找最近一份
everyHours: 3 # 0 = 关(只按轮次);两键都 0 = 完全静默 everyTurns: 0 # 0 = 关(只按时间) maxDigestBytes: 1600 # 节体超过即不重述并提示精简 skipUnchanged: true # 内容没变且未压缩过 → 跳过,只推进周期 compactReinject: true # 压缩后必补一次(内核基线是历史消息,会被摘要掉) pointer: '' # 非空:每次重述末尾追加一行(如进度索引路径) stateFile: '~/.dsh/behavior-enhancer/discipline-state.json' memory_bridge: # dsh-memory-bridge 联动占位节(阶段 3b 完成后开开关) enabled: false sync_on_check: true rollback_from_memory: true post_write_check: true

怎么改「每 N 小时」(v1.3.0)

两条通道,都不必重启:

- 通用设置:设置 → 通用 →「项目记忆」一行,改数字后失焦即生效,并落盘到 profile 的 cordis.patch.yml。
- 会话命令:/pm status(查看当前值)· /pm 3h(设为 3 小时)· /pm off(关闭)。

原理:disciplineInject 在 Config schema 里声明为 volatile 字段,宿主会把它们解析成引用对象({ get(), [Symbol.for('cosmokit.volatile.write')] })交给插件;本插件每轮判定时 .get() 取活值,所以设置面板与命令的修改立即生效。schema 导入失败时 Config 为 undefined,只是一行 UI 不出现,其余功能照常。

遵守度统计

/behavior-status 显示两列:本次运行是当前插件实例启动以来的实时计数(同一实例内多个会话共用),历史累计是最近成功写入 stats.json 的总量。未触发 session/flush 的新增事件只出现在本次运行列。

每次 session/flush 只保存上次成功落盘后的增量;无新增事件时重复保存不会重复累计。创建目录、写临时文件或替换目标文件失败时只记录警告,不阻断会话持久化,也不推进总量和检查点;后续 flush 会重试尚未保存的增量。

保持原有 version: 1 文件格式,重启后从旧文件续算。旧版本已经重复累计的历史数字无法从现有总量还原,本修复保留原值,不自动清零或重写历史。

权限与边界(上架声明)

| 类别 | 实际行为 | 边界 |
| 文件 files | 在 ~/.dsh/behavior-enhancer/ 下维护 state.json(并行收敛状态)、discipline-state.json(重述周期与内容 hash)、stats.json(遵守度计数)、boot.json(每次启动写一条加载记录);postWriteCheck 在 write/edit 执行前把目标文件快照到 ~/.dsh-memory/files/(.bak-<时间戳>,每文件留 5 份),写后检查失败时把快照回滚写回目标文件 | 不写 Profile 配置、不改 DSH 核心/官方包;用户工作区的读写仅限模型主动调用的 write/edit 目标文件,快照目录固定为 ~/.dsh-memory/files/ |
| 网络 network | 无 | 不发起任何网络请求 |
| 命令 commands | 无 | 不执行任何子进程 |
| 凭据 credentials | 无 | 不读取任何环境变量或凭据 |

- 运行时依赖:核心路径零依赖、无外部服务;@deepseek-ai/schemastery 只用于设置面板的 Config 声明(导入失败即视为无 schema,仅少一行 UI,其余功能照常)。
- 失败边界:所有模块 fail-open——状态文件损坏即丢弃重来;约束段是软约束(行为提示),强制收敛由并行池与 followup 两条独立路径保证,任何一条失效不影响 DSH 核心流程。
- 已知风险:failureGuard 通过 agent.followup() 注入提示,模型是否服从取决于模型本身;behaviorPrompt.text 若被改成动态内容会破坏 DeepSeek 前缀缓存(默认静态)。postWriteCheck 的轻量解析是启发式(非编译器),回滚恢复的是整个文件的写入前版本(文件写入前已存在的问题会一并带回);检查范围仅 write/edit 工具,经 pwsh/bash 等命令写入的文件不检查。不要把 md 加进 postWriteCheck.checkExtensions——括号配对会在含 JSON/代码片段的记忆文件上误判,进而回滚整个记忆文件;记忆文件交给 projectMemory(只提示、永不回滚)。
- 兼容范围:支持基线 DSH 0.1.5-rc.x(Node ≥ 18):0.1.5-rc.1 已按核心源码静态核验全部依赖 API、0.1.5-rc.2 经真实环境运行验证(Issue #2 报告),0.2.0-rc.2 与 0.2.1-rc.2(官方桌面端内核)已在实际运行中验证(含纪律重述注入、设置面板写入、/pm 命令),并在 package.json 的 dsh.compatibility.dshReleases 中标为 compatible;≤0.1.4 旧版不再跟踪支持。

项目记忆边界

- 注入归内核:@deepseek-ai/dsh-agent-instructions 在首个请求读取 $DSH_HOME/AGENTS.md、项目根(.git 标记)到会话 cwd 的 AGENTS.md/CLAUDE.md 及 .local 叠加层(maxBytes: 65536,按 trim 内容去重)。本插件不注入、不缓存、不新增存储,只在 write/edit 之后校验文件内容。
- 跨项目/用户级记忆池归 dsh-ecolink:本插件不读、不写、不感知其池与格式;同一条事实不要两处都写。
- 本模块永不回滚记忆文件,也不会把记忆内容重新写进系统提示词;校验文本只追加到该次工具结果。
- 周期重述需要你写一节:在 AGENTS.md 里加 ## 项目纪律(当前主题 / 工作流程规定 / 要避开的坑,一行一条)。disciplineInject 只重述这一节;没有这一节就什么都不做(只计数 + warn)。重述走 agent.steer 进历史消息,不改 systemPrompt,因此不伤前缀缓存。

开发

node test/smoke.mjs # 单进程全量自检(无需 API),npm test 同

路线图

- 实验分支:给 grep/glob 补 isConcurrencySafe(需 agent 作用域 shadow 包装器,复杂度高,主线不依赖)
- dsh-memory-bridge 联动(配置节已占位;~/.dsh-memory/files/ 文件快照已就绪,等 bridge 服务上线后支持"从快照找回文件正确版本")

许可 / License

MIT © 2026 Zoria Lind
预览分享卡片长什么样 ↓Zoria-Lind/dsh-behavior-enhancer
分享 · DeepSeek Harness Hub
Zoria-Lind/dsh-behavior-enhancer

DeepSeek Harness 行为管理插件:改变模型怎么调用工具,让复杂任务更稳定,不干预内容本身。

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