dsh-plugin-ignore:用 .dshignore 控制 @ 文件补全候选

前言

在 DSH(DeepSeek Harness)里用 @ 触发文件补全时,候选列表往往会包含大量不需要的目录(比如 node_modules、dist)。这些目录即使不被索引,有时也会出现在候选里,让开发者需要手动过滤。dsh-plugin-ignore 的目的是在工作区根放一个 .dshignore 文件,用类似 gitignore 的规则把不需要的目录/文件从 @ 候选中剔除。

是什么

dsh-plugin-ignore 是一个 DSH 插件,由 YangtzeCoder 维护。它的唯一作用是:在输入 @ 时,命中规则的目录或文件不会出现在候选列表里,也无法通过 @目录名/ 钻进去。它不注册工具、不拦截读写,模型仍然可以通过完整路径 read/grep 这些文件。

核心功能

规则文件

在工作区根创建一个 .dshignore 文件,规则格式与 gitignore 类似:

# 注释以 # 开头,空行忽略;\# 和 \! 表示以这些字符开头的字面名字

node_modules          # 任意深度下名为 node_modules 的文件或目录
dist/                 # 尾斜杠:只匹配目录
/docs                 # 前导斜杠:锚定到工作区根,只忽略根下的 docs
*.log                 # 通配符不跨目录,任意深度的 .log 都命中
build/**              # 跨目录:build 下的所有内容(build 目录本身不算)
a/**/b                # 跨目录:a 与 b 之间隔任意层
secrets.env
!important.log        # 取反:重新包含

语义说明

  • 最后匹配的规则生效:同 gitignore,*.log 之后写 !important.log,后者胜出。
  • 父目录被排除时无法重新包含其中内容:写了 dist/,那么 !dist/keep.js 是无效的——dist/ 整棵子树都不可见。想让内容可见,取反要作用在目录本身:!packages/a/dist/。
  • 大小写敏感,与内置 provider 的 excludedDirectories 一致。
  • 路径基准是工作区根,/ 分隔;Windows 的反斜杠会先归一化。
  • 只读工作区根那一份 .dshignore,不递归读取子目录里的。

配置

插件通过 dsh.profile.bundles 的配置项生效:

- id: dsh-plugin-ignore
  name: 'dsh-plugin-ignore'
  config:
    ignoreFile: .dshignore     # 相对工作区根
    extraPatterns: []          # 额外规则,语法同上;排在文件规则之前,所以文件里的规则覆盖它
    extraDirectories: []       # 旧写法:一串纯目录名,等价于 extraPatterns 里的 `名字/`
    pruneIndex: true           # 是否把可安全全局剪枝的目录名交给内置索引,纯性能开关,关掉只影响速度
    debug: false               # 把生效规则条数 / 无法解析的行打到日志

安装与启用

它已经是一个 bundle(package.json 里 dsh.bundle.patch 指向 cordis.patch.yml)。

用 CLI 装进 desktop profile:

dsh plugin --profile desktop add dsh-plugin-ignore
  • dsh plugin --profile <name> <args> 就是把 <args> 转给 profile 目录里的 pnpm,所以 add/remove/install 都是 pnpm 语义;相对路径按执行命令时所在的目录解析。
  • desktop 是桌面客户端自己的 profile,比别的 profile 多两道限制:先启动一次桌面版 DSH(由它初始化 $DSH_HOME/profiles/desktop/),再完全退出客户端,然后才能跑上面的命令。客户端还在运行时它锁着 profile 的 package.json;而 profile 尚未初始化时,CLI 会直接报错让你先去打开一次桌面版。
  • 装完 pnpm 会把包写进 profile 的 package.json,并把 dsh-plugin-ignore 追加进 dsh.profile.bundles。
  • 新装的 bundle 默认选中。desktop 与 web 一样是实时重载的组合,装完通常无需重启;替换已装包的代码要重启 DSH,才能加载新的 JS 模块(只重载条目不够)。
  • name 换成其他 profile(web、headless、sdk、自定义名)就装到那边。

卸载:

dsh plugin --profile desktop remove dsh-plugin-ignore

或者用插件管理(Web 插件页 / plugin_manager:install_bundle target = dsh-plugin-ignore、remove_bundle target = dsh-plugin-ignore),两条路做的是同一件事。注意没有启用 HMR 的 profile 不能卸载正在被它自己使用的包,要先停掉进程再卸。

本地开发

克隆仓库后,也可以使用本地目录的绝对路径安装:

dsh plugin --profile desktop add D:\path\to\dsh-plugin-ignore

本地安装会记录为 link: 依赖;link: 路径按执行命令时所在的目录解析,建议使用绝对路径。插件管理页面 / plugin_manager install_bundle 的 target 也可以传本地绝对路径。修改代码后重启 DSH,以加载更新的 JS 模块。

运行测试:

npm test

已知限制

  • 内置默认排除不会被取反解除。provider 自己默认排除 .git、node_modules、dist、build、out、coverage、target、.next、.nuxt、.turbo、.venv、__pycache__、.pytest_cache、.mypy_cache、.gradle 这 15 个目录名,本插件只做加法、从不删减,所以 .dshignore 里写 !dist/ 不会让 dist 回来。要放开请改 provider 的配置(profile 的 cordis.patch.yml 里给 file-reference-local 重写 excludedDirectories)——注意那也会让索引重新遍历这些目录。
  • 只按工作区根一份规则文件生效,不支持子目录各自的 .dshignore。
  • 规则变化后递归索引在后台重建,重建完成前由候选过滤兜底(用户看不到差别)。

适用场景

  • 项目中有大量第三方依赖、构建产物或临时文件,希望 @ 候选更干净;
  • 需要按工作区根统一管理哪些目录/文件不应该出现在补全列表中;
  • 想在 DSH 里用 gitignore 习惯来控制文件补全的可见性。

插件以当前 dsh 进程权限运行,安装前应检查源码与许可证(MIT)。

小结

dsh-plugin-ignore 用一个 .dshignore 文件把不需要的目录从 @ 文件补全候选里剔除,不影响模型对文件的读写访问。适合希望在 DSH 里用 gitignore 习惯来控制补全可见性的开发者。

  • 目录页:https://www.skillhub.cn/plugins/YangtzeCoder/dsh-plugin-ignore
  • GitHub:https://github.com/YangtzeCoder/dsh-plugin-ignore
羽毛球分组比赛记分
小程序二维码

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

小夜