deepseek harness 全局提示词/对话提示词,错误记录功能插件
32.8/100
综合分
4
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/22 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/1015677515/dsh-prompt-ErrorNotes-desk.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
生态插件
可安装,未声明 dsh 能力
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 12 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-prompt-ErrorNotes-desk(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/18 00:25:38
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 7 处,展示前 7 条)
- 读取本地文件index.js:383
return readFileSync(path, 'utf8'); - 写入本地文件index.js:399
mkdirSync(dirname(path), { recursive: true }); - 写入本地文件index.js:402
writeFileSync(tmp, text, 'utf8'); - 写入本地文件index.js:403
renameSync(tmp, path); - 发起网络请求client.js:303
const res = await fetch(STATE_URL, { headers: { accept: 'application/json' } }); - 发起网络请求client.js:310
const res = await fetch(STATE_URL, { - 发起网络请求client.js:363
fetch(PENDING_URL, { headers: { accept: 'application/json' } })
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成dsh-prompt-ErrorNotes-desk
本项目由 DeepSeek Harness 的 AI 智能体独立开发。
对话标题栏里的两个小面板:编辑提示词、维护错误经验库。
它做什么
| 面板 | 作用 |
| 提示词 | 编辑跨对话的全局提示词,以及本次对话的提示词(新对话会延续)。面板顶部显示哪一半当前正在生效。 |
| 错误库 | 按分类归纳反复犯的错误:每条一个简短类型 + 一句教训,归入三档分类之一。最近 10 条(条数可自己设)会被注入系统提示词,让后续对话以极低的 token 成本吸取教训。智能体按格式汇报「我犯了个错误:错误经过:… 教训:…」时会被自动捕获成待确认草稿。 |
第二个面板的意义:一个反复犯同类错误的智能体,会在自己的上下文里收到一份简短的、按分类归好的提醒,成本远低于重新踩一遍坑再发现。
点面板以外的空白处会自动关闭(按 Esc 也可以)。
界面预览
错误经验库 —— 按分类折叠,每条带下拉框可改类;顶部显示注入条数,底部是自动捕获的待确认草稿:
错误经验库面板
提示词 —— 顶部自检状态与「临时暂停注入」,中间是全局与本次对话提示词,底部是实际注入文本的预览(可拖拽调高,也可隐藏;三个框都能竖向拖动):
提示词面板
安装
本插件目前只发布在 GitHub(未发布到 npm)。
展开完整文档(README 剩余 1 节)
dsh-prompt-ErrorNotes-desk
本项目由 DeepSeek Harness 的 AI 智能体独立开发。
对话标题栏里的两个小面板:编辑提示词、维护错误经验库。
它做什么
| 面板 | 作用 |
| 提示词 | 编辑跨对话的全局提示词,以及本次对话的提示词(新对话会延续)。面板顶部显示哪一半当前正在生效。 |
| 错误库 | 按分类归纳反复犯的错误:每条一个简短类型 + 一句教训,归入三档分类之一。最近 10 条(条数可自己设)会被注入系统提示词,让后续对话以极低的 token 成本吸取教训。智能体按格式汇报「我犯了个错误:错误经过:… 教训:…」时会被自动捕获成待确认草稿。 |
第二个面板的意义:一个反复犯同类错误的智能体,会在自己的上下文里收到一份简短的、按分类归好的提醒,成本远低于重新踩一遍坑再发现。
点面板以外的空白处会自动关闭(按 Esc 也可以)。
界面预览
错误经验库 —— 按分类折叠,每条带下拉框可改类;顶部显示注入条数,底部是自动捕获的待确认草稿:
错误经验库面板
提示词 —— 顶部自检状态与「临时暂停注入」,中间是全局与本次对话提示词,底部是实际注入文本的预览(可拖拽调高,也可隐藏;三个框都能竖向拖动):
提示词面板
安装
本插件目前只发布在 GitHub(未发布到 npm)。
完整的安装步骤、验证方法与常见问题见 INSTALL.md。下面是最短路径。
方式一:应用内安装(推荐)
设置 → 插件 → 安装,在输入框里填 GitHub 短地址:
github:1015677515/dsh-prompt-ErrorNotes-desk
也可以填完整网址:
https://github.com/1015677515/dsh-prompt-ErrorNotes-desk
安装界面提示「输入插件的包名、GitHub 仓库地址或本地目录路径」,上面两种都是它接受的写法。
不需要自己写 commit SHA。 填不带版本后缀的短地址即可:市场会先把默认分支的 HEAD 解析成 40 位 commit SHA,再把 github:owner/repo#<sha> 这种已固定的形式交给 pnpm。这样 lockfile 里记录的是可追溯的提交,安装后版本号能正常显示。
⚠️ 反过来要注意:不要自己写 #HEAD,也不要让安装源停留在会移动的分支上。源码里写明,HEAD 形态的 tarball「installs perfectly and then reports no version forever」——能装上,但版本栏会一直是空的,之后也检测不到更新。
方式二:本地目录
已经克隆到本地时,直接填目录路径(安装界面会提示「本地目录」):
A:\大肥鱼工作区\dsh-prompt-ErrorNotes-desk
开发时这样最方便:local 安装默认以目录链接(Windows 上是 Junction)接入,改完源码刷新页面即可,不必重装。
方式三:手动写进配置档
cordis.patch.yml of your bundle
- insert:
- id: prompt-desk
name: dsh-prompt-ErrorNotes-desk
装好后需要重启 DSH:浏览器半边会热重载,但宿主半边(负责往系统提示词注入)要重启才会加载新的模块代次。
环境要求
| 依赖 | 要求 |
| DSH | >=0.2.0-rc.1 || >=0.3.0-rc.1 || >=0.4.0-rc.1 || >=0.5.0-rc.1 || >=1.0.0-rc.1 |
| Node | ^22.19.0 \|\| >=24.0.0 |
| HTTP 服务 | 必需。宿主半边注册 GET\|POST /prompt-desk/state,浏览器半边靠它读写。没有 HTTP 服务的配置档会加载插件但保持不活动,而不是报错 |
无第三方运行时依赖;浏览器半边只用页面已提供的 react,没有构建步骤。
它会动你的哪些文件
全局提示词就是 DSH 自己那个 $DSH_HOME/AGENTS.md —— 也就是官方 dsh-agent-instructions 插件本来就会读的同一个文件。本插件不另存副本:两个都自称「全局提示词」的文件必然会漂移,而且只有一个真正会送达模型。
| 数据 | 位置 |
| 全局提示词 | $DSH_HOME/AGENTS.md |
| 本次对话提示词、错误库、面板开关 | $DSH_HOME/prompt-desk/state.json |
写入是原子的(先写 .tmp 再改名),崩溃不会截断你的提示词。浏览器半边完全不碰文件系统——所有读写都在宿主半边,所以不会写到 $DSH_HOME 之外。
作者自用的提示词(仅供参考,不会被套用)
仓库根目录有一份 AGENTS.example.md,是插件作者自己正在用的全局提示词原文,公开出来纯粹当写法参考:你可以看看别人怎么分节组织、怎么把"先自检再交付""删除前报范围"这类要求写成一条能照着执行的话,然后照自己的习惯改。
它不会覆盖你的提示词,装插件也不会。 说清楚以免误会:
- 安装插件不会写入你的 AGENTS.md。代码里唯一会写这个文件的地方是你在面板里点「保存」的那一刻,写的是你自己输入框里的内容,不是这个样例。
- 这个文件叫 AGENTS.example.md,不是 AGENTS.md,也没有放在会被自动加载的位置。DSH 的项目指令加载器只认 AGENTS.md / CLAUDE.md / AGENTS.local.md / CLAUDE.local.md 这几个精确文件名,AGENTS.example.md 不在名单里——哪怕你把这个仓库当工作区打开,它也不会被当成指令读进去。
- 没有"一键导入"按钮,这是有意为之:任何"帮你应用这份提示词"的功能,都是在覆盖你。
想用的话自己动手,最稳的方式是先备份再合并:
DSH_HOME 没设置时插件用的是 ~/.dsh,这里跟着它走powershell $dsh = if ($env:DSH_HOME) { $env:DSH_HOME } else { Join-Path $HOME '.dsh' } Copy-Item "$dsh\AGENTS.md" "$dsh\AGENTS.md.bak"
然后打开 $DSH_HOME/AGENTS.md(也就是插件面板里的「全局提示词」框),挑你需要的那几条粘进去。直接整份覆盖也可以,但那会丢掉你原有的规则——你的提示词应该长成你自己的样子,别人的只能当参考。
注入是怎么工作的
本次对话提示词、以及最近 10 条错误经验,通过 ctx.systemPrompt.section() 注入,顺序值 10200(DEPLOYMENT_PERSONA_SUFFIX),即排在工具文档之后。
- text 传的是函数,所以改完下一轮对话就生效——不用重启,也不用重新注册。
- 只注入教训。detail 解释了事情经过,type 是这次的事故标题——两者描述的都是某一个瞬间,只有碰上长得像的下一次任务才有用;而教训是一条能迁移的规则。detail 同时是 token 最贵的一项,所以两者都只留在面板里。
- 没有教训的条目不注入,面板里会标出来让你补。它不占注入条数的额度——上限数的是「真正注入的条数」,所以先筛掉再取最近 N 条。
- 条数上限是为了不让经验库变成 token 黑洞:完整列表始终在面板里可读,提示词里也会说明当前只显示了其中一部分。
注入条数可以自己设
在错误库面板里直接填(最方便):面板里有一个「注入条数上限」输入框,填好点「保存」即可,下一轮对话生效。
| 字段 | 默认 | 含义 |
| injectLimit | 10 | 注入系统提示词的错误经验条数上限。0 = 一条都不注入(会话提示词不受影响);最大 200,填更大也会被夹到 200 |
优先级:面板里填的值优先;清空输入框并保存(或点「恢复默认」)就回到「跟随插件配置」。
下面两种改法改的是默认值(面板没填时用它):
1. 设置 → 插件 → 插件配置(宿主从本插件的 Config schema 生成这个表单)
2. 写进 profile 的 cordis.patch.yml: yaml
- id: prompt-desk
name: dsh-prompt-ErrorNotes-desk
config:
injectLimit: 20 # 只接受非负整数
只接受非负整数:负数、小数、非数字会被拒绝(面板里会提示;schema 会给出具体原因,例如 expected number >= 0 but got -5)。
个别精简宿主可能不提供 @deepseek-ai/schemastery(设置表单由它生成)。那种情况下功能不受影响:面板里的输入框和 patch 的 config 都照常工作,只是设置里不会出现这个字段。
错误经验库怎么分类
每一条都归到三个一级分类之一。面板按分类折叠展示,每条右侧的下拉框可以随时改类:
| 一级分类 | 含义 | 二级分类 |
| 判断与依据错误 | 想错了 | 验证缺位(没核实就下结论)、依据缺位(凭推测代替取证) |
| 生成与操作错误 | 做错了 | 语法生成(模板串、转义、拼接)、工具与编码(选错工具或破坏编码) |
| 其他 | 暂未归类 | —(本身就是终点,不再细分) |
分类是按补救手段分的,不是按症状:每个二级分类都对应一个「下次换个做法」的具体动作,这样它才是可执行的,而不是描述性的。
- 老条目(v1 没有分类字段)会统一落在其他,在面板里用下拉框手工归档即可。插件不会按文本猜分类——猜错比不猜更糟。
- 分类 slug 写入时校验:手改状态文件写进一个不存在的分类,会被归到其他,不会污染面板。
自动采集:agent 汇报「我犯了个错误」,它记下来
开启错误库导出时,插件会在系统提示词里附一段固定的认错引导(实际注入的全文,逐字):
自我认错
发现自身错误时,必须主动用下面这一行汇报:我犯了个错误:错误经过:<当时实际发生了什么> 教训:<以后怎么做,一句可执行的规则> 两个标签缺一不可、顺序固定,且必须写在同一行;缺任一标签或换行都不会被捕获。分类由用户在面板里选。
错误经过 20 字以内,只写这次发生了什么;教训 40 字以内,但要写成换任务、换文件也成立的规则,不提本次的文件名、路径、命令或具体数值。
宿主半边监听助手的输出流,发现这个句式就把一条草稿放进面板顶部的「待确认」区,并在错误库按钮上显示数字徽标。草稿不会自动进库——必须点「采纳」;采纳前可以改措辞、选分类,或者直接「丢弃」。
- 两个标记都认:我犯了个错误(引导里示范的那个)与 我发现了个错误。命中多个时,取最靠前的、能解析成功的那一个。
- 标记必须位于行首(前面只允许空白、列表符号 - * +、有序列表序号或 >)。这一条是为了挡住「在句子里提到标记」——讨论本功能、引用代码、摘录文档时,标记常常出现在句子中间,那不是认错。
- 不合法的那一处会被跳过,而不是放弃整条消息。这是很容易踩坑的一条:如果一条消息里先提到标记(引用它、演示格式、讨论本功能),再写出真正的认错,真正的认错仍然会被捕获——早先的实现只检查最靠前的那一个,一旦它在行中就整条放弃,结果是「边解释格式边认错」这种最常见的写法静默丢失。现在会继续往后找,直到找到合法的认错为止。
- 错误经过: 与 教训: 是硬边界,且顺序固定、必须在同一行。这是取代旧 | 分隔符的关键改动:分隔符太容易在散文里被引用(曾有一句话里写着「(忘了写 |)」,结果在错误的位置切开,产生了垃圾草稿),而两个标签很难被无意复现。
- 必须写在同一行:解析只看标记所在的那一行,所以「教训」换到下一行会静默丢弃——不会有任何报错,你也不会看到草稿。这是最容易踩的一条。
- 旧格式不再捕获:我犯了个错误:xxx|yyy(用 | 分隔、无标签)不会再产生草稿,请用双标签格式。
- 20 / 40 字都是建议,不是硬限制。代码只校验「错误经过」在 4~200 字之间;教训没有长度校验。写超了照样会被捕获,只是注入了 token 会多一些——面板里会把超过 40 字的教训标出来。
- 教训要写成可迁移的规则。引导里明确要求「换任务、换文件也成立,不提本次的文件名、路径、命令或具体数值」,因为注入的是教训而不是事情经过:带具体文件名、具体命令的句子,只有下一次恰好同名时才用得上,而下一次几乎总是不同的文件。
- 一条消息最多产生一条草稿(取最先解析成功的那一处);同一句话重复出现只算一次;队列上限 20 条,旧的先丢。
- 捕获到的内容若带尖括号(模型把模板本身回显出来)、以代码标点开头、或「错误经过」短于 4 字 / 长于 200 字,都会被直接丢弃——否则会记下「错误经过 = <当时实际发生了什么>」这类垃圾。
认错引导和错误经验列表由同一个开关控制:引导的存在就是为了喂这个库,库不注入时还留着引导,等于让智能体对着空气认错。
两个开关,位置刻意分开
有两个都会「停止注入错误经验」的开关。它们作用范围不同,所以放在提示词面板的上下两端,而不是挨在一起:
| 开关 | 位置 | 停什么 | 是否持久 |
| 临时暂停注入(等同 /lessons off) | 面板顶部 | 只停错误经验列表;本次对话提示词与「自我认错」引导照常生效 | 否,重载后自动恢复为开启 |
| 错误库导出到系统提示词 | 面板底部 | 停错误经验列表 + 自我认错引导 | 是,写进 state.json |
也可以在对话框里直接敲命令:
/lessons off 关闭(全局生效,跨对话) /lessons on 恢复 /lessons 不带参数则翻转当前状态
/lessons 是全局开关,且重载后复位——它的定位是「这一轮探索先别拿旧教训烦我」。要长期关掉,用面板底部的导出开关。参数写错会返回用法提示,不会静默翻转。
你随时能看见「模型到底看到了什么」
- 注入预览:提示词面板里常驻一段等宽文本,就是插件对系统提示词的完整贡献,逐字发给模型。它和真实注入走同一个构建函数,所以两者不会各自漂移——这正是它存在的意义(只给一个「N 条」的统计数字,用户无法判断措辞对不对)。
- 安装自检:提示词面板顶部一行状态,报告宿主半边是否加载、HTTP 路由是否可达、状态文件在哪、当前注入几条、有没有待确认、以及界面与宿主的版本是否一致。版本不一致时会提示刷新页面——界面 bundle 和宿主是从两个地方加载的,重建后其中一个常常领先一个版本。
设计取舍
- 面板刻意用不透明底。 用 --dsw-static-neutral-bluish- 而不是 --dsw-alias-bg-layer-:液态玻璃主题插件(例如 dsh-plugin-wallpaper-engine)会把后者重写成半透明膜,用它绘制的地方会透出壁纸,文字变得难读。
- 磁盘上的状态一律不信任。 每个字段读入时都校验,手改坏或写了一半的文件会退回默认值,而不是每次请求抛 TypeError。
- 样式与注册都是 effect,所以卸载插件(或 HMR 重载)会移除样式表与两个插槽注册。
已对安装的宿主逐条取证
以下都是读源码确认过的,不是假设:
- 插件的 inject 导出是字符串数组(如 ['tools']),没有 {optional: [...]} 对象写法。可选服务用 ctx.inject([...], cb) 获取,这样它不会拦住插件的激活。
- webServer.register({ kind, path, handler }) 返回一个 disposer。
- PromptSection.text 的类型是 string | ((context: AssembleContext) => string)。
- conversation.session.header.utilities 是 list 类型、session 作用域的插槽;其组件收到的 props 是 { sessionId, useSessions }。
- 暗色主题的属性名是 data-ds-dark-theme。
- AssembleContext 只有两个字段:{ scope?: ScopeKey; signal?: AbortSignal }——没有本轮用户消息,也没有激活工具集。所以本插件不做上下文匹配;text 每次 assembly 都会被求值。
- systemPrompt.section() 的 text 在每次 assembly 时求值:SystemPrompt.assemble 里是 typeof section.text === 'function' ? section.text(context) : section.text。
- ScopeKey 是 object(不透明类型),而命令回调拿到的是 invocation.agent.id(字符串)。两者之间没有取到可靠的映射,所以 /lessons 做成全局开关,而不是会话级。
- 事件 agent/assistant-stream 的载荷是 { agent, frame };frame.chunk 是 StreamChunk(text-delta 带 text 字段),frame.outcome.kind 为 'committed' | 'abandoned'。
- commands 服务提供 register(definition: CommandDefinition): () => void;CommandDefinition 形如 { name, description, input?, recordInput?, handler };CommandResult 是 { kind: 'success', text? } | { kind: 'error', text }。
- 运行时已验证(2026-10-15,desktop profile):注册在插件全局 ctx 上的监听器确实能收到 Scoped<Agent> 派发的 agent/assistant-stream。实测方式:在真实对话里输出一条认错句式,它被正确解析为待确认草稿并写入 state.json(source: "auto")。
运行时验证记录
上面那节是读源码得出的结论;下面这些是在真实 profile 里跑出来的,两者分开列,因为读源码不能替代跑一遍:
| 验证项 | 结果 |
| 宿主半边加载 | 插件成功激活,GET /prompt-desk/state 与 /prompt-desk/pending 均返回 200 |
| v1 → v3 状态迁移 | 真实状态文件被升到 version: 3,老条目获得稳定 id 与分类字段 |
| 自我认错自动采集 | 在真实对话里输出认错句式,被解析为待确认草稿(source: "auto"),独立复现两次 |
| 采纳草稿 + 改类 | 经面板采纳并改到「依据缺位」,正确落库、保留 source: "auto"、铸了新的唯一 id(未复用草稿 id) |
| 临时暂停(面板入口) | 生产 POST 实测:false 后错误列表归零、认错引导保留;另一个独立请求复读仍为 false(证明是进程级共享状态) |
| /lessons off / on | 会话日志出现 command/run → command/done,返回 kind: "success",回显文字与预期一致 |
已知的边界:/lessons 必须单独成行(parseCommand 的正则锚定在行首 ^/)。写在句子中间或末尾不会被当作命令,而是普通消息文本。
许可证
MIT
Developed independently by an AI agent running on DeepSeek Harness.
DeepSeek Harness 对话头部有两个小面板:编辑提示词,维护错误经验库。
功能
| 面板 | 作用 |
| Prompt | 编辑跨对话的全局提示词,以及会带入下一段对话的会话级提示词。显示当前哪一半真正送到了模型。 |
| 错误库 | 按分类归拢反复出现的错误——每条一个简短类型加一句教训,归入三个顶层分类之一。最近 10 条(数量可配置)注入系统提示词,后续轮次就能低成本吸收。消息里报告「我犯了个错误:错误经过:… 教训:…」会被自动采集为草稿,等待确认。 |
第二个面板的意义:老是重复同一类错误的智能体,能在自己的上下文里拿到一条简短、已分类的提醒,token 开销远低于重新发现这个错误。
点击已打开面板之外的任意位置即可关闭(按 Escape 也行)。
截图
错误库——可折叠的分类分组、每行一个下拉框用来重新归档条目、顶部的注入条数,以及自动采集、等待确认的草稿:
Error library panel
Prompt——顶部是自检行和临时暂停,中间是全局提示词与会话级提示词,底部预览实际注入的文本:
Prompt panel
安装
本插件只发布在 GitHub 上(不在 npm)。
完整步骤、验证与常见问题:INSTALL.md。下面是简版。
方式 1——在应用内安装(推荐)
Settings → Plugins → Install,然后粘贴 GitHub 简写:
github:1015677515/dsh-prompt-ErrorNotes-desk
完整 URL 也可以:
https://github.com/1015677515/dsh-prompt-ErrorNotes-desk
安装输入框接受包名、GitHub 地址或本地目录路径——上面两种写法都行。
你不需要自己写 commit SHA。 不带版本后缀的简写就够了:市场先把默认分支的 HEAD 解析成 40 位 commit SHA,再把固定好的 github:owner/repo#<sha> 形式交给 pnpm。这样 lockfile 里记录的是可追溯的 commit,安装后的版本号也能正确显示。
⚠️ 反过来同样重要:不要自己写 #HEAD,也不要让来源停在会移动的分支上。源码里说,HEAD tarball「装得上,然后永远报不出任何版本」——装是装上了,但版本列一直空着,更新也永远检测不到。
方案 2 —— 本地目录
已经 clone 好了,就直接指向目录(安装字段里叫「本地目录」):
A:\大肥鱼工作区\dsh-prompt-ErrorNotes-desk
开发时走这条路最方便:本地安装会接成目录链接(Windows 上是 Junction),改完源码刷新页面就生效,不用重装。
方案 3 —— 手写进配置档 yaml
cordis.patch.yml of your bundle
- insert:
- id: prompt-desk
name: dsh-prompt-ErrorNotes-desk
改完重启 DSH。 浏览器那一半会热重载,但宿主那一半——负责往系统提示词里注入的那部分——只有重启才会加载新的模块代。
环境要求
| 依赖 | 要求 |
| DSH | >=0.2.0-rc.1 || >=0.3.0-rc.1 || >=0.4.0-rc.1 || >=0.5.0-rc.1 || >=1.0.0-rc.1 |
| Node | ^22.19.0 \|\| >=24.0.0 |
| HTTP server | 必需。宿主那一半注册 GET\|POST /prompt-desk/state,浏览器那一半通过它读写。配置档里没有 HTTP server 时,插件照样加载,但会保持不活动,而不是报错 |
没有第三方运行时依赖;浏览器那一半只用页面已经提供的 react,也没有构建步骤。
它会怎么动你的文件
全局提示词就是 harness 自己的 $DSH_HOME/AGENTS.md——官方 dsh-agent-instructions 插件已经在加载的那个文件。本插件不留第二份副本:两个文件都自称「全局提示词」迟早会漂移,而且真正能送到模型面前的只有一个。
| 数据 | 位置 |
| 全局提示词 | $DSH_HOME/AGENTS.md |
| 会话提示词、错误库、面板可见性 | $DSH_HOME/prompt-desk/state.json |
写入是原子的(同目录 .tmp 文件 + rename),所以崩溃也不会把你的提示词截断。浏览器那一半从不碰文件系统——所有 I/O 都在宿主那一半,因此不会有任何东西写到 $DSH_HOME 之外。
作者自己的提示词(仅供参考——绝不会替你应用)仓库根目录放着 AGENTS.example.md,这是作者自己的全局提示词,原样收录,发布出来只作写提示词的参考:看看一份能用的提示词怎么把规则分组到各个小节,怎么把「交付前先自查」「删除前先报范围」写成一行能直接照做的规则,然后按你自己的风格重写。
它不会覆盖你的提示词,安装插件也不会。 说清楚一点:
- 安装插件永远不会写入你的 AGENTS.md。代码里唯一会写这个文件的地方,是你在面板里按下「保存」的那一刻,写进去的是你在框里敲的内容,不是这份示例。
- 文件名叫 AGENTS.example.md,不是 AGENTS.md,也不在任何会被自动加载的位置。harness 的项目指令加载器只匹配这几个确切文件名:AGENTS.md / CLAUDE.md / AGENTS.local.md / CLAUDE.local.md;AGENTS.example.md 不在其中——就算你把这个仓库当作工作区打开,它也永远不会被当成指令读取。
- 没有「一键导入」按钮,这是故意的:任何「帮你应用这份提示词」的东西,按定义就是在覆盖你的。
想采纳其中任何一条,手动来——先备份,再合并: powershell
This plugin falls back to ~/.dsh when DSH_HOME is unset, so mirror that here
$dsh = if ($env:DSH_HOME) { $env:DSH_HOME } else { Join-Path $HOME '.dsh' }
Copy-Item "$dsh\AGENTS.md" "$dsh\AGENTS.md.bak"
然后打开 $DSH_HOME/AGENTS.md(面板里的「全局提示词」框),把想要的规则粘进去。整份覆盖也行,但那样会丢掉你原有的规则——你的提示词应该像你自己的;别人的只是参考。
注入是怎么工作的
会话提示词和最近 10 条错误记录通过 ctx.systemPrompt.section() 注入,顺序为 10200(DEPLOYMENT_PERSONA_SUFFIX),也就是排在工具文档之后。
- text 是函数,所以改完下一轮就生效——不用重启,不用重新注册。
- 只注入教训。存下来的 detail 讲的是事件经过,type 是它的标题——两者描述的都是某一个时刻,只有教训才写出一条能迁移到下一个任务的规则。detail 也是最费 token 的字段,所以两者都留在面板里。
- 没有教训的记录会被跳过,面板会标出来,方便你补一条。它们不占上限:上限数的是真正注入的内容,所以先过滤再计数。
- 上限是为了防止这个库变成 token 黑洞:完整列表在面板里照样能看,提示词里会说明当前展示的是子集。
注入条数由你设定
直接在错误库面板里设(最省事):面板有个「注入条数上限」字段——填个数字,按保存,下一轮生效。
| 字段 | 默认值 | 含义 |
| injectLimit | 10 | 限制有多少条错误记录能进入系统提示词。0 表示一条都不注入(会话提示词不受影响);上限是 200,超过这个值会被压到上限 |
优先级:在面板里填的值优先。清空该字段并保存(或按 恢复默认),就回到「跟随插件配置」。
下面两种途径设置的是默认值(面板字段未设置时生效):
1. Settings → Plugins → plugin config(宿主根据本插件的 Config schema 生成该表单)
2. 配置档的 cordis.patch.yml: yaml
- id: prompt-desk
name: dsh-prompt-ErrorNotes-desk
config:
injectLimit: 20 # non-negative integers only
只接受非负整数:负数、小数、非数字值一律拒绝(面板会提示;schema 会给出具体原因,例如 expected number >= 0 but got -5)。
精简版宿主可能不提供 @deepseek-ai/schemastery —— 渲染设置表单的包。这种情况下不会出问题:面板字段和补丁里的 config 都照常生效,只是该字段不出现在 Settings 里。
错误库如何分类
每条记录都属于三个顶层分类之一。面板把它们显示为可折叠分组,每行带一个下拉框,随时可以改归档:
| 分类 | 含义 | 子分类 |
| 判断与依据错误 | thought it wrong | 验证缺位 (concluded without checking)、依据缺位 (substituted a guess for evidence) |
| 生成与操作错误 | did it wrong | 语法生成 (template strings, escaping, concatenation)、工具与编码 (wrong tool, or broke the encoding) |
| 其他 | not yet filed | —(本身就是归档目标,不是父级) |
划分依据是补救方式,不是症状:每个叶子分类都指明下次具体该换个什么做法,这样才可执行,而不只是描述现象。
- 早于分类功能的记录(v1 文件没有分类字段)会落到其他,用下拉框手动归档。插件绝不根据文本猜分类 —— 猜错比不猜更糟。
- 写入时会校验 slug:手动编辑的文件如果写了不存在的分类,会落到其他,不会污染面板。
自动捕获:「我犯了个错误」会被记录
开启导出后,插件会在系统提示词末尾追加一段固定的认错提示(注入原文如下):
自我认错
发现自身错误时,必须主动用下面这一行汇报:我犯了个错误:错误经过:<当时实际发生了什么> 教训:<以后怎么做,一句可执行的规则> 两个标签缺一不可、顺序固定,且必须写在同一行;缺任一标签或换行都不会被捕获。分类由用户在面板里选。
错误经过 20 字以内,只写这次发生了什么;教训 40 字以内,但要写成换任务、换文件也成立的规则,不提本次的文件名、路径、命令或具体数值。
宿主会监听助手的输出流;一旦看到这种写法,就往面板顶部的待确认队列里放一条草稿,并在错误库按钮上显示计数徽标。草稿不会自己进入错误库 —— 你按 采纳 才会进去,采纳前可以先改措辞、选分类,也可以直接丢弃。
- 两种标记都接受:我犯了个错误(提示词演示的那个)和 我发现了个错误。多处匹配时,能干净解析的最早一处胜出。
- 标记必须位于行首(前面只允许空白、列表符号 - * +、有序列表编号或 >)。这条规则是为了排除那些只是提到标记的句子——讨论这个功能的文字、代码示例、文档摘录,通常标记都出现在句子中间,那不算坦白。
- 被拒绝的出现会跳过,不会让整条消息作废。 这是最容易踩的坑:如果一条消息先提到标记(引用它、展示格式、讨论这个功能),然后才真的坦白,真正的坦白照样会被捕获。早先的版本只看最早那处出现,于是句子中间的一次提及就让整条消息被放弃——最常见的坦白写法(「先解释格式,再坦白」)就这样悄无声息地丢了。现在搜索会越过被拒绝的候选,直到有一处能解析。
- 错误经过: 和 教训: 是硬边界,顺序固定,且必须在同一行。这就是用来替代旧 | 分隔符的东西:分隔符字符会在行文里被引用(有句真实的话里就含「(忘了写 |)」,结果在错误的位置切开,产出两条垃圾草稿),而两个标签很难被意外复现。
- 整段坦白必须在同一行。 解析器只读标记所在的那一行,所以挪到下一行的教训会被悄无声息地丢掉——不报错,也没有草稿给你看。这是最容易踩的规则。
- 旧格式不再捕获:我犯了个错误:xxx|yyy(用分隔符、没有标签)不会产出草稿。请用双标签格式。
- 20 和 40 都是建议,不是强制。 代码只检查事件经过在 4–200 个字符之间;教训完全没有长度检查。写得更长照样会被捕获——只是注入时多花些 token,面板会给超过 40 的教训打上标记。
- 教训必须是一条能迁移的规则。 提示词要求措辞能「跨任务、跨文件成立,不点名本任务的文件、路径、命令或数字」,因为注入的是教训,不是事件经过:一句话里带着具体文件名或命令,只有下个任务恰好涉及同一个文件时才划算,而通常并不会。
- 没有教训的条目完全不会注入,面板会标出来让你补上。它也不占配额:上限统计的是真正被注入的条目,所以过滤发生在取最近 N 条之前。
- 一条消息最多产出一份草稿(第一处能解析的出现);同一句话重复只算一次;队列上限 20 条,最旧的丢弃。
- 捕获内容出现尖括号(模型把模板本身回显出来)、以代码标点开头,或 incident 字段短于 4 个字符、长于 200 个字符时,这条捕获会被丢弃——否则就会记下一条 incident 字面为 <当时实际发生了什么> 的记录。
提示和错误库由同一个开关控制:提示的存在就是为了给错误库喂料,所以只开提示、不注入错误库,等于让智能体对着空气忏悔。
两个开关,故意放在两端
两个控件都能拦住错误条目、不让它到达模型。区别在作用范围,所以它们分别放在提示词面板的顶部和底部,而不是并排:
| 开关 | 位置 | 拦截范围 | 是否持久化 |
| 临时暂停注入(等价于 /lessons off) | 面板顶部 | 只拦错误列表;会话提示词和忏悔提示照常生效 | 否——重新加载后恢复为开启 |
| 错误库导出到系统提示词 | 面板底部 | 错误列表和忏悔提示一起拦 | 是,写入 state.json |
在输入框里也能触发同样的暂停:
/lessons off pause (global — every conversation) /lessons on resume /lessons toggle
/lessons 是全局的,重新加载后重置——它的用途是「这次探索期间别再拿旧教训烦我」。想永久关掉这个功能,用面板底部的导出开关。参数打错会返回用法说明,而不是悄悄切换。
模型实际读到什么,你随时看得到
- 注入预览:提示词面板里的一段等宽文本块,展示插件贡献的全部内容,原样发送。它由装配器调用的同一个构建器生成,所以两者不会走偏——这正是关键所在(只写「N 条」这种计数,说明不了措辞)。
- 安装自检:提示词面板顶部的一行状态,报告 Host 半边是否加载、HTTP 路由是否可达、状态文件在哪、注入了多少条、是否有内容等待确认,以及面板和 Host 是否同一版本。版本不一致会提示你刷新——bundle 和 Host 由不同的机制加载,重新构建后总有一个先升版本。
设计说明
- 刻意使用不透明表面。 面板用的是 --dsw-static-neutral-bluish-,而不是 --dsw-alias-bg-layer-:液态玻璃主题插件(比如 dsh-plugin-wallpaper-engine)会把这些别名改写成半透明薄膜,用它们上色的地方会透出壁纸,文字就难读了。
- 磁盘上的状态一律不可信。 每个字段读取时都做校验,手改过或写了一半的文件会退化成默认值,而不是每次请求都抛 TypeError。
- 样式和注册都是副作用,所以卸载插件(或 HMR 重载)会移除样式表和两个插槽注册。
已对照安装的 harness 验证以下内容已在源码中核实,并非假设:
- 插件 inject 导出的是字符串数组(['tools']),不存在 {optional: [...]} 这种对象写法。可选服务用 ctx.inject([...], cb) 获取,因此不会影响插件激活。
- webServer.register({ kind, path, handler }) 返回一个清理函数。
- PromptSection.text 的类型是 string | ((context: AssembleContext) => string)。
- conversation.session.header.utilities 是 list 类型的会话级插槽;其组件接收 { sessionId, useSessions }。
- 深色主题属性是 data-ds-dark-theme。
- AssembleContext 只有两个字段:{ scope?: ScopeKey; signal?: AbortSignal } —— 没有当前用户消息,也没有活跃工具集。因此插件不做上下文匹配;每次组装都会求值 text。
- systemPrompt.section() 的 text 在每次组装时求值:SystemPrompt.assemble 执行 typeof section.text === 'function' ? section.text(context) : section.text。
- ScopeKey 是 object(不透明),而命令处理器收到的是 invocation.agent.id(字符串)。两者之间没有找到可靠的映射关系,所以 /lessons 是全局开关,而不是按会话切换。
- agent/assistant-stream 的载荷是 { agent, frame };frame.chunk 是 StreamChunk(text-delta 携带 text),frame.outcome.kind 为 'committed' | 'abandoned'。
- commands 服务暴露 register(definition: CommandDefinition): () => void;CommandDefinition 是 { name, description, input?, recordInput?, handler };CommandResult 是 { kind: 'success', text? } | { kind: 'error', text }。
- 运行时已验证(2026-10-15,desktop 配置档):注册在插件全局 ctx 上的监听器确实能收到 agent/assistant-stream,其分发类型是 Scoped<Agent>。在真实对话中发一条 confession 验证:它被解析成待处理草稿,并以 source: "auto" 写入 state.json。
运行时验证记录
上一节是读源码得出的结论;下面列出的是在真实配置档里实际跑过的项。两者分开记录,因为读源码不能替代实际运行:
| 检查项 | 结果 |
| 宿主侧加载 | 插件成功激活;GET /prompt-desk/state 和 /prompt-desk/pending 都返回 200 |
| v1 → v3 状态迁移 | 真实状态文件升级到 version: 3,旧条目获得稳定 id 和分类字段 |
| 自动捕获 | 真实对话中发出的 confession 被解析成待处理草稿(source: "auto")—— 独立复现两次 |
| 接受草稿并重新归档 | 通过面板接受并重新归档到「依据缺位」:持久化正确,保留 source: "auto",并生成新的唯一 id,而不是复用草稿的 id |
| 临时暂停(面板入口) | 在生产环境 POST 请求上实测:置为 false 后错误列表归零,而自白提示仍在;另发一次独立请求读到的仍是 false,说明这是进程级共享状态 |
| /lessons off 和 /on | 会话日志显示 command/run → command/done 返回 kind: "success",回复文本符合预期 |
一个已知边界:/lessons 必须单独占一行(parseCommand 的模式锚定在行首,即 ^/)。写在句子中间或长消息末尾时,它只是普通文本,不是命令。
许可
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
1015677515/dsh-prompt-ErrorNotes-desk
deepseek harness 全局提示词/对话提示词,错误记录功能插件
相关插件 · 技能 / 提示词
人设统管ZiChuanLan/agent-purge
一份系统提示词,喂给多个 coding…
★ 931已汉化DSH
73.8
人物画像蒸馏titanwings/distilly
Distilly — 把他们的思考方式提炼成可复用的技能,供任何智能体或机器人使用。原名 Colleague Skill(原同事 Skill)。
★ 25,659已汉化DSH
71.3
推理工作空间套件Tiger3807861189/J-Space-Cognition-Suite
J-Space 是面向复杂推理、大型仓库工程、子代理协作与授权安全分析的推理时工作空间和控制套件。
★ 2,957已汉化DSH
70.5
两阶段工具锚定预设xiaobright/dsh-anchored-standard
实验性 DeepSeek Harness agent preset…
★ 3,742已汉化DSH
70.1
智能体工作流编排nrslib/takt
不再日夜盯着 AI 编码智能体。
★ 1,402已汉化DSH
70
Agent 运行时手册Electricitysheep/dsh-handbook
DeepSeek Harness dsh 从 0 到 1 深度手册:安装/插件开发/性能调优/实测案例/同模型多…
★ 827已汉化DSH
68.7