-
dsh-purge-plus v1.4.1 Stable
released this
2026-10-19 12:29:24 +08:00 | 0 commits to main since this release1.4.1 — 修「装完就用不了」的 cwd 变量崩溃
症状
装完插件、还没点「应用」,每一轮对话都失败:
unknown prompt variable "{{cwd}}" in section "deployment:persona-suffix"; registered variables: provider, model根因
0.2.1 的
dsh-agent-loop只注册两个提示词变量:ctx.systemPrompt.variable("provider", …) ctx.systemPrompt.variable("model", …)cwd在 0.1.x 还有,0.2 拿掉了。而宿主的interpolate()遇到未注册变量不是留空,
是抛异常:if (!Object.hasOwn(variables, name)) { throw new Error(`unknown prompt variable "{{{name}}}" in ${kind} "${input.name}"; …`) }旧版
cordis.patch.yml给system-prompt配了:personaSuffix: Your working directory is {{cwd}}.deployment:persona-suffix是每轮都参与渲染的段,所以这个错在插件一装上就发生,
与是否点过「应用」无关——这就是「基本上下载安装后都有」的原因。修法(三层,逐层收窄)
层 文件 做法 1. 配置 cordis.patch.ymlpersonaSuffix改为""。persona 不再发任何变量;工作目录由宿主 runtime context 提供,persona 里重复一遍没有收益。2. 注册 lib/cwd-variable.js(新)插件在 systemPrompt全局层补一个cwdprovider,取值优先级agent.options.cwd→session.header.cwd→process.cwd()。这样用户自己 preset 里写的{{cwd}}也能解析。宿主已注册同名变量时抛already registered,按成功处理。3. 兜底 lib/identity.js① overlayOfficialIdentity写出的 persona-suffix 改成纯文本;② 旧的Working directory: {{cwd}}.剥离后不再留变量;③sanitizeAssemblySections把任何残留的{{cwd}}降级成{ {cwd} }——变量注册失败时也不会炸整轮。关键取舍:不依赖「宿主会留空未注册变量」。三层里任何一层单独生效都不会崩,
三层齐全时{{cwd}}正常解析出真实路径。验证
npm run test:cwd(test/cwd-variable.mjs,21 项)直接加载宿主真实的
dsh-system-prompt渲染器,逐条断言:- 旧配置在
provider/model两个变量下确实抛错,且报错文本与用户反馈一致(复现) - 当前
cordis.patch.yml的活动配置里没有{{cwd}} overlayOfficialIdentity的产物能渲染通过,输出里没有裸{{cwd}}registerCwdVariable注册后{{cwd}}解析出真实路径(含三条 fallback)- 重复注册不算失败
- 转义后的文本能被宿主渲染(证明兜底不是装饰)
找不到宿主模块时,依赖渲染器的断言会显式
skip,不会假装通过——上一版正是
这种「看起来没问题」的验证方式漏掉了这个 bug。
镜像说明 / Mirror note:
dsh-purge-plus是社区分支(JeffKeeping/dsh-purge-plus),不在已删除的YuJunZhiXue/dsh-purge仓库内,原仓库没有发布过 GitHub Release。本 Release 由镜像仓库wqmll/dsh-purge-plus依据 tag 生成,说明文字取自该分支的CHANGELOG.md。资产按上游 CI 相同方式生成:
dsh-purge-plus-1.4.1.zip是git archive源码包(可直接dsh plugin install离线安装);dsh-purge-plus-1.4.1.tgz是内容等价的 npm 包。Downloads
- 旧配置在