dsh-enforce-package-manager:在 DSH 里拦住错误的包管理器命令

前言

在 DeepSeek Harness(DSH)里让智能体改依赖时,模型常会按「习惯」敲 npm install 或 pip install,而仓库实际用的是 pnpm、uv 等。结果是多出一套 lockfile、依赖没写进项目清单,下次 sync 又丢。人工在对话里纠正可以,但每次都要盯 shell 成本很高。

下面介绍社区插件 dsh-enforce-package-manager(维护者 acus9345):在工具调用层识别项目真实使用的包管理器,若命令不匹配则拦截,并把等价、可执行的正确命令回给模型。分类为工作流;在 SkillHub 目录 与 GitHub 可查阅源码与说明(社区目录与 DeepSeek / 幻方无官方从属关系)。

这是什么

一句话:DeepSeek Harness 插件,阻止智能体用错包管理器(例如 pnpm 项目里跑 npm、uv 项目里跑 pip),并给出已翻译好的正确命令。

典型拦截反馈形如:

dsh-enforce-package-manager blocked `npm install zod --save-dev`: this project uses pnpm,
not npm ("packageManager": "pnpm@…" in /work/app/package.json). Mixing package managers
creates a second lockfile, ignores the existing one, and can install different versions.
Run this instead:
  pnpm add -D zod

模型多数情况下会直接执行建议里的那一行。

核心功能

如何判断项目用的管理器

从命令将要执行的目录起算(同一行里前面的 cd 会生效),向上遍历,在第一个能回答「用谁」的目录停下。不会越过 git 根目录;若无 git 仓库,则不会越过你启动 DSH 时的目录,避免家目录里的 stray lockfile 误判。

JavaScript

  1. package.json 里的 packageManager 字段优先。
  2. 否则看单一 lockfile:pnpm-lock.yaml、yarn.lock、bun.lock / bun.lockb、package-lock.json。
  3. 若同时存在两种不同管理器的 lockfile,插件不猜测,不介入。

Python

查找 uv.lock、poetry.lock、pdm.lock、Pipfile,或 pyproject.toml 中的 [tool.poetry] / [tool.uv] / [tool.pdm]。仅有 requirements.txt 时不强制,pip 可照常使用。

会翻译哪些命令

只关心会改动项目依赖的命令;npm run build、npm test、npx vitest、全局安装(npm i -g ...)等不拦截。Python 侧对 pip install --user ...、升级安装器本身(如 pip install -U pip)同样放行。

部分对照(完整矩阵见 README):

智能体执行 pnpm 项目 uv 项目
npm install pnpm install
npm ci pnpm install --frozen-lockfile
npm i -D vitest pnpm add -D vitest
pip install httpx uv add httpx
python -m pip install -e . uv sync

yarn、bun、npm 项目之间,以及 poetry(poetry add)、pipenv(pipenv install)、pdm(pdm add)等也按同一思路翻译。workspace / 目录参数会保留,例如 npm i -w web react → pnpm --filter web add react,npm install --prefix api → pnpm -C api install。

在 Windows 上,DSH 经 PowerShell 执行时,对 npm.cmd、pip.exe、完整程序路径和 Set-Location 做相同检查。

配置

可在 DSH 侧边栏 Plugins 中打开 dsh-enforce-package-manager,修改后 Save,下一次工具调用生效,无需重启。

或在 ~/.dsh/profiles/<profile>/cordis.patch.yml(仅当前 profile)或 ~/.dsh/cordis.patch.yml(全部 profile)增加:

- id: enforce-package-manager
  config:
    mode: deny          # 或 ask:不匹配时由你确认
    javascript: true    # false 则不约束 npm/pnpm/yarn/bun
    python: true        # false 则不约束 pip
    shellTools: [bash, pwsh]   # Windows 上 DSH 使用 pwsh

未写的键保持默认。

安装与启用

官方安装命令(示例为 web profile,即 dsh web 使用的浏览器界面):

dsh plugin --profile web add dsh-enforce-package-manager

若用脚本 / CI 跑 DSH,把 web 换成 headless;编辑器集成用 acp。每个 profile 维护独立插件列表,你实际用到的 profile 都要单独添加。无需额外配置即可工作。

卸载:

dsh plugin --profile web remove dsh-enforce-package-manager

典型用法

  1. 在对应 profile 执行上面的 add 命令。
  2. 在已是 pnpm(或 uv 等)的项目里,让智能体「安装某个依赖」;若它仍发出 npm install / pip install,应看到拦截说明与 Run this instead: 下的命令。
  3. 需要人工把关时,将 mode 设为 ask;只约束某一语言栈时,将 javascript 或 python 设为 false。

适用场景与注意

适合:多包管理器混用的 monorepo、团队统一 pnpm / uv,但模型仍常默认 npm / pip 的场景;希望减少 lockfile 污染和「装上了却未进清单」的运维成本。

注意:

  • 插件以当前 DSH 进程的权限拦截与改写 shell 工具调用;安装前请阅读 仓库源码 与 MIT 许可证,确认符合你的安全与合规要求。
  • 双 lockfile 等歧义时插件故意不猜测,仍需人工整理项目约定。
  • DSH 生态强调「一切皆插件」;本插件是社区贡献,星标与演进节奏以 GitHub 为准。

结尾

dsh-enforce-package-manager 把「用错包管理器」从对话里的反复纠错,变成工具层的确定性拦截加命令翻译,对长期用 DSH 驱动改依赖的工作流更省心。

  • 目录页:https://www.skillhub.cn/plugins/acus9345/dsh-enforce-package-manager
  • 源码与 README:https://github.com/acus9345/dsh-enforce-package-manager
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye