前言¶
在 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
package.json里的packageManager字段优先。- 否则看单一 lockfile:
pnpm-lock.yaml、yarn.lock、bun.lock/bun.lockb、package-lock.json。 - 若同时存在两种不同管理器的 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
典型用法¶
- 在对应 profile 执行上面的
add命令。 - 在已是 pnpm(或 uv 等)的项目里,让智能体「安装某个依赖」;若它仍发出
npm install/pip install,应看到拦截说明与Run this instead:下的命令。 - 需要人工把关时,将
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