DeepSeek Harness 插件:dsh-project-prompt

前言

DeepSeek Harness(DSH)通过插件机制扩展功能。在智能体开发场景中,存在一类属于本地机器而非代码仓库的指令。这些指令通常包括环境特定的 E2E 流程、仅内部访问的端点,或者个人的工作流偏好。由于 AGENTS.md 是提交到仓库的共享文件,它不适合存储此类私密信息。dsh-project-prompt 插件旨在解决这一问题,它将这类规则保存在 $DSH_HOME 目录中,永远不会被提交到仓库。

这是什么

dsh-project-prompt 是一个 DeepSeek Harness 插件,用于管理私有的、按项目区分的提示词规则。它由 imroc 维护,采用 MIT 许可证。该插件通过匹配 Git 远程地址、本地仓库路径或当前工作目录前缀,将配置的规则注入到对应的会话中,覆盖主代理和子代理,且具备 Worktree(工作树)感知能力。

核心功能

  • 三种匹配器:支持通过 Git 远程 URL、本地主仓库路径或纯目录前缀进行匹配。
  • Worktree 感知:能识别 Git 链接工作树,通过 .git 文件的指针回溯到主仓库,一次配置覆盖所有工作树及其子目录。
  • 两种注入模式:
    • section:稳定系统提示词片段,支持 KV 缓存,支持 {{cwd}} 和 {{model}} 变量插值。
    • inject:注入到第一条上下文消息中,不进行模板插值,适合包含字面量 {{...}} 的文本(如 Helm/Go 模板)。
  • 覆盖子代理:子代理继承会话的当前工作目录,因此遵循相同的规则。
  • 加载时校验:规则格式错误或未知的模板变量会在插件加载时抛出错误,而不是在每次请求时失败。
  • 零依赖:单文件 ESM,仅引入 Node.js 内置模块,无需构建步骤。

安装与启用

安装前需确保 DeepSeek Harness 版本 >= 0.1.1-rc.2,且环境包含 Node.js >= 18。

通过 DSH 的插件命令安装到指定 profile:

dsh plugin --profile web add dsh-project-prompt

安装完成后需要重启 DSH,因为插件包在启动时进行组合。

卸载命令:

dsh plugin --profile web remove dsh-project-prompt

配置规则

规则配置文件位于 $DSH_HOME/cordis.patch.yml(默认为 ~/.dsh/cordis.patch.yml)。该文件是机器本地层,应用于机器上的所有 profile。插件会监听该文件的变化,保存后自动重载。

基本配置示例

以下是一个配置文件片段,展示了三种匹配方式和两种模式:

- id: project-prompt
  config:
    rules:
      # 1. 通过 Git remote 匹配(支持任意克隆位置和工作树)
      - remote: github.com/my-org/my-project
        text: |
          ## E2E testing for this project (environment-specific, private)

          1. Test entry point: http://e2e.internal.example.net (internal only)
          2. Run `make e2e-prepare` before the first E2E run.
          3. On failures, check ... first.

      # 2. 通过本地主仓库路径匹配,使用 inject 模式以避免字面量 {{...}} 被解析
      - repo: /home/me/dev/another-project
        mode: inject
        text: |
          Render values like {{ .Values.replicas }} are literal here.

      # 3. 通过目录前缀匹配
      - path: /home/me/dev
        text: |
          ...

规则字段说明

字段 类型 默认值 描述
remote string — Git 远程 URL。比较时会忽略协议、user@、: 分隔符、.git 后缀、尾部斜杠及大小写。
repo string — 本地主仓库的绝对路径。会自动匹配该仓库的所有工作树和子目录。
path string — 当前工作目录前缀。会匹配该目录或其下的子目录。
text string required 需注入的提示词文本。
mode section | inject section 注入模式,见下文。
sectionName string project-prompt (自动递增) 系统提示词片段的名称。
order number 50 系统提示词片段的排序,DSH 规范中 0 为 persona,100-199 为工具指导。

注入模式详解

特性 section (默认) inject
位置 系统提示词 (systemPrompt) 用户侧第一条上下文消息
可见性 每次请求 每次请求
模板插值 支持 {{cwd}} 和 {{model}},其他完整 {{...}} 报错 不支持,{{...}} 为字面量
适用场景 稳定指令、KV 缓存友好 包含字面量 {{...}} 的模板

验证安装

安装完成后,可通过以下步骤验证配置是否生效。

  1. 检查插件是否正确加载:
    dsh --profile web --dump-config | grep -A3 project-prompt
  1. 在匹配的目录中启动会话并提问,检查模型是否接收到了规则文本。

  2. 查看会话日志。注入的文本会出现在记录的请求头中,位于 $DSH_HOME/sessions/.../session.jsonl.zstd 文件里。

注意事项

  • 静态配置:规则是静态配置,插件不会读取仓库内部文件(这会引入共享状态)。仓库内的文件加载请使用 DSH 内置的 AGENTS.md/CLAUDE.md。
  • 子模块:Git 子模块目录(.git 指向 .git/modules/...)不被追踪。如需匹配子模块,请使用 path 规则。
  • 失败策略:配置错误(如 text 缺失或 section 模式下存在未知的 {{var}})会在插件加载时报错,而不是静默失败。
  • 许可证:MIT License。
羽毛球分组比赛记分
小程序二维码

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

小夜