dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness (dsh) 系统提示词与工具定制插件:屏蔽/替换/注入/排序提示词段、黑白名单隐藏工具、预设保存/应用/导出/导入,全部通过设置面板操作。
DeepSeek Harness 的能力台:提示词定制 + 技能集合管理 + MCP Server 接入。
按名称屏蔽 / 替换 / 注入 / 排序提示词段(按会话阶段与 agent 预设分层)、导入 / 分组 / 开关技能、接入 MCP 并做分层遮蔽与工具级启停 —— 全部在侧边栏的「能力」面板里完成。
English · 简体中文
安装 • 功能特性 • 使用说明 • 工作原理 • 已知限制
⭐ GitHub 仓库:DreamsTOF/dsh-prompt-customizer —— 觉得有用就点个 Star;问题与需求请提 Issue
本仓库被做成了可游玩的 WebGAL 视觉小说:138 个节拍、一次分支选择,由项目化身「dsh-prompt-customizer」与「JavaScript」带你走完 —— 这个插件是什么、核心功能怎么用、怎么安装、目录地图、工作原理和已知限制。
gh-pages 分支)gh-pages 单分支后在目录里起一个静态服务器,例如 python -m http.server 8000,再打开 http://localhost:8000一个 DeepSeek Harness (dsh) 插件,让你在侧边栏的独立面板里控制系统提示词和工具目录(仿宿主能力管理页:顶部 agent 预设 Tab、左栏勾选列表 + 底部三态过滤、右栏实时预览)。
其他插件注入的提示词段可能污染你的系统提示词。本插件让你按名称屏蔽、替换、注入、排序提示词段,并把工具从模型可见目录里隐藏 —— 全程实时生效,不需要改动任何其他插件。
两件事贯穿整个设计:
两轮清理,node --test 始终全绿:
scripts/test-mcp-layering.mjs、scripts/test-mcp-tool-disable.mjs(0.11.0 已废弃的 mcp-client 行挂载模型)、scripts/test-skill-toggles.mjs(旧 frontmatter 语义,与现有覆盖重复)、scripts/test-rc2-runtime.mjs(硬编码只认 0.2.0-rc.2,自述在 0.2.1-rc.2 上必然失败)、test/catalog-replace.test.mjs(mergeSighting 与 catalog.test.mjs 逐条重复)、test/live-preview.test.mjs(被 rc2-preview / apply-route 覆盖)。test() 合并为「数据表 + 循环」,每个表项执行原用例的全部断言,并给断言传场景 label(失败时能看出是哪一项)。涉及 sectionOps(27→24)、chaos-super(17→11)、catalog(11→2)、effective(8→2)、preview-phase(9→6)、rc2-preview(9→7)、schema(7→4)、trust-gate(3→1)、windows-titlebar(3→2)等 16 个文件。没有删除或弱化任何断言:合并处逐条 diff 核对过输入表(文件名净化仍覆盖 5 个原始输入、isTauriEnv 仍覆盖 6 个探针、trust-gate 三种拒绝各自仍校验「不得写盘」)。生产代码零改动。
保留的「看起来可疑但必要」:test/mcp-workspace-scope.test.mjs 测的是 0.11.4 的 src/mcp-workspace-scope.ts(不是已删的 mcp-workspace.ts),host.ts 至今仍在 import 它。
.mcp.jsonpatch.yml,改写项目根的 .mcp.json({ "mcpServers": { <name>: { command|url, … } } })—— Claude Desktop / Cursor / Cline 等直接就能读。
mcp-client 行挂载,读 .mcp.json 时把键名当 serverName 并加工作区哈希后缀(同名跨工作区不冲突),command/args/env/cwd/url/headers 原样透传。.mcp.json 里的键比,不再因为「全局已有 anysearch」把工作区的同名项误判为重复。test/workspace-mcp-json.test.mjs(新建 / 追加 / 同名不覆盖 / 保留其它顶层字段 / 坏 JSON / 读回转换);node --test 176/176。接口实测:连续两次添加落在同一 .mcp.json,内容为标准格式(无 serverName/transport 等内部字段);全局添加仍写 profile patch。~/.agents/skills;工作区写 <ws>/.agents/skills,目录不存在自动创建(全新工作区也能直接装)。<ws>/.dsh/mcp.patch.yml(新文件,同样自动建目录),由装配按该工作区会话挂载 —— 同一个 anysearch 可在两个工作区各配一份,互不覆盖。(0.11.5 起工作区落盘已改为项目根的标准 .mcp.json,见上节。)scope=workspace 但没给路径 → 400,不会悄悄退回全局。test/add-scope.test.mjs(默认全局 / 工作区自动建目录 / 工作区不污染全局 / 缺参数报错);node --test 174/174。接口实测:工作区装技能落到 <ws>/.agents/skills/zz-ui-ws/SKILL.md 且全局无残留;工作区加 MCP 落到 <ws>/.dsh/mcp.patch.yml 且 profile patch 无污染。workspaceRegistry.list()(侧边栏里用户登记的全部工作区)取,再补活动会话 cwd 与启动目录。没开过会话的工作区现在也能选(实测列出 5 个:PatientLifecycle / dsh-pulgn / bot / rea / 默认工作区)。skill-filesystem / skill-office 是挂在预设行里的 provider(apply(ctx) 注册进该行的层),只有「存在会话 + scope 命中预设层」时才读得到;面板要给任意工作区配置,因此改为
project-*/user-*/custom 来源)时以内核为准;<ws>/.dsh/skills → <ws>/.agents/skills → ~/.dsh/skills → ~/.agents/skills,再把内核独有的条目(bundled / office / 插件 provider)补在后面。node --test 172/172。source(project-* = 工作区专用,其余 = 全局);MCP 行都是组合行,标「全局」。同名时工作区优先,关全局不影响工作区专用条目。<agentsHome>/skills/.workspace-mcp.json({ 工作区: { serverName: false } }),由 system-prompt/assemble 按该次装配所属会话的 cwd 剔除 mcp__<server>__<tool>。
anysearch → 该工作区不再注入;换到别的工作区照常注入(工具集合随工作区变化),其它工作区不受影响。disabled)互不干扰:一个是所有人的默认,一个只针对某个工作区。rename 覆盖已存在的账本会 EPERM,导致同一工作区第二次调整失败。改为「先删旧文件再改名,失败退化为直接写」,并补了「关→开→再关」的回归测试。node --test 172/172(新增 test/mcp-workspace-scope.test.mjs 覆盖工作区隔离与连续写入);web 实例真浏览器实测:顶栏出现工作区下拉,技能卡片显示「全局」,MCP 卡片显示「全局」+「本工作区已关」,点「本工作区关闭」后账本落盘、status?cwd= 回报 closed:["anysearch"]、换工作区 closed:[]。[global 层, ...chainLayers(scope)](packages/skill/skill/src/index.ts:556)—— 不传 scope 就只读 global 层。技能绝大多数注册在预设/agent 层,于是面板只剩随安装的那个 bundled 技能。现在把该 agent 的 scope key(agent 对象本身,createScope(loopCtx, this))传给 list(),面板与 / 菜单、上下文里的「技能注入」条数一致。<agentsHome>/skills/.hidden-skills.json,由闸门 provider 在内核目录里遮掉。好处是所有来源(含 app.asar 内随安装技能、office 包、插件自带)都能关,且随时可逆、不动别人的文件。kernel-skills)自己也按隐藏账本过滤一次 —— 内核合并只按层/rank 去重,同名候选未必每次压过真实来源。方向调整:不再自搓扫描。内核已经有「聚合全部技能来源」的服务与「组合行」这一层配置模型,插件自扫只会在根顺序、去重、只读来源上不断与内核打架。
agent.ctx.skills.list({ cwd })(packages/skill/skill/src/index.ts)—— 文件系统各根(project-dsh / project-agents / custom / user-dsh / user-agents)+ bundled + runtime(office 包)+ 插件自注册 provider,全由内核按 scope 链与 cwd 聚合。面板显示的就是模型这一会话能用的那一份(与右侧「上下文 → 技能注入」条数一致)。
agents.roots() 按 session.header.createdAt 降序);客户端目前读不到渲染期的当前会话 id(uiSession 是 hook/selector 面),因此面板以「最新会话」为准。无会话时退回宿主全局 ctx.skills + 启动 cwd。mcps/ 四目录扫描、挂载、可见性过滤与面板分区。MCP Server 就是内核 Cordis 组合里的 mcp-client 行 —— 列表、启停、增删都走组合行(pluginManager.listPlugins() / setPluginEnabled() 与 configEditor),插件不再额外挂行。node --test 全绿;web 实例真浏览器实测(注入的 bsk 工具):MCP 页只有 3 个组合行、无「mcps 目录」分区、不闪退。app.asar 内,文件清单读不到(卡片显示「0 文件」);不同 profile/预设的组合不同,所以各处的技能数量天然不同(这不是漏扫)。.dsh 优先」IconFolderOutlineRegular,而宿主 @deepseek-ai/dsh-client-ui-primitives 并未导出这个名字 —— 该 JSX 组件是 undefined,React 抛 Element type is invalid,MCP 页被 ErrorBoundary 摘掉(面板 fallback null + 自动关闭 = 闪退回对话界面)。改用宿主确实导出、或插件自绘的图标。test/client-primitives.test.mjs 检查客户端从 ui-primitives 导入的每个名字都在 test/fixtures/client-ui-primitives.json 白名单里,并逐名核对宿主打包产物确实存在(标识符边界匹配,防止 IconFolderOpenOutline 蹭到 IconFolderOpenOutlineRegular 而误判)。scripts/verify-panel-browser.mjs —— 用真实 Chrome(CDP,无第三方依赖)打开 dsh Web UI,点「能力」→ MCP 页 → SKILL 页,断言没有未捕获异常、MCP 页真的渲染出来、四个目录里的条目都在 DOM 里,并截图留证。闪退这类问题只有真渲染才会暴露,单测全绿也拦不住。.dsh 优先于 .agents,工作区优先于用户级):
<工作区>/.dsh/skills → <工作区>/.agents/skills → ~/.dsh/skills → ~/.agents/skills<工作区>/.dsh/mcps → <工作区>/.agents/mcps → ~/.dsh/mcps → ~/.agents/mcpsdsh-skill-filesystem 扫 5 类根,本插件面板此前只认两个用户级根,于是 <工作区>/.dsh/skills 与 <工作区>/.agents/skills 里的技能内核看得见、面板看不见(无法归组 / 开关 / 查看文件)。现在面板、技能开关、技能健康三处共用同一份根集合,顺序与内核 rank 一致(工作区级先于用户级,同名先出现者胜出),项目根按内核规则取「最近的含 .git 的祖先,没有则会话 cwd」。mcp-client 行,没有「读某个目录下 mcp.json」的约定(全仓库 grep mcps 零命中),所以 ~/.agents/mcps/**、<工作区>/.dsh|.agents/mcps/** 里放着的配置一直是死文件。现在由本插件读出来挂成真正的 mcp-client 行:全局层所有会话可见,工作区层只在该工作区会话可见(装配时按会话 cwd 过滤),MCP 页单列一组展示。serverName 追加 8 位路径哈希后缀:不同工作区可以各配一台同名但参数不同的 Server,互不挤占(mcp-client 的 serverName 在同一作用域只能有一个实例)。配置里的 ${VAR} 按进程环境展开,cwd 的相对值按该配置文件所在目录解析。serverName ... is already in use。src/skill-roots.ts(根解析)与 src/mcp-workspace.ts(mcps 运行时),vendor/skill-manager/skills-host.js 增加额外根注入,路由 GET /api/triad/mcp-workspace/status;/api/triad/mcp-status 增加 workspaceServers 段。agentPresets.copy(),但该 API 在 DSH 任何版本都不存在(宿主只有 list / read / select),所以此前一保存就报 宿主未提供 agent 预设服务。现改为读来源预设的声明组成,作为一条 dsh-agent-preset 行写进 profile patch(HMR 热加载),并把当前定制写进 overrides[新名]。[a-z0-9][a-z0-9-]*(原先允许中文与空格,与宿主不符)。resolveDshHome / resolveAgentsHome:$DSH_HOME / $DSH_AGENTS_HOME 为空串或纯空白时按未设置处理(旧写法会落到进程 cwd),~ / ~/ 前缀现在展开。技能面板、技能开关账本、技能健康检查三处共用 src/home-paths.ts。ctx.skills、tools.restrict/schemas、configEditor、agentPresets、system-prompt 装配 waterfall 与段/变量 API、connection.requestRejection 全部保持。详见 docs/rc2-migration.md。agentPresets.acquireScope(),每次读取选中模式的当前修订;结束释放租约。不匹配已有对话,不创建伪 Agent,不切换对话的预设。{{model}}、{{cwd}} 等未绑定变量保留为模板引用,并显示非致命说明;目录和草稿编辑不因此失败。真正对话中的严格插值行为不变。contexts(user-role 运行时快照、只读)。纯预设作用域无法得到依赖真实会话状态的贡献;这不允许把另一个对话的数据当成当前模式定义。本地源码更新后执行 npm run build。链接安装无需复制;已启动宿主可能持有旧模块,保存工作后重启原来的 dsh web 并硬刷新,确认不再有「预览会话」,来源显示为「当前模式预设」。
目标版本冷启动测试(scripts/test-rc2-runtime.mjs)已随测试精简移除:它硬编码只认 0.2.0-rc.2,且在 0.2.1-rc.2 上 turn 段断言必然失败。rc.2 适配相关行为改由 test/rc2-preview.test.mjs 覆盖,完整校验以 npm run check 为准。
阶段不是固定三拍,而是由持久会话事件推导出来的:首个 durable 的 tool/call 或
assistant/message 触发晋级,一次 compaction/end 把晋级复位。面板上三个阶段部分
就分别对应这三种状态。
① 会话开始bootstrap引导期 | → | ② 首个 durable 信号tool/call · assistant/message常驻期 active | → | ③ 一次压缩compaction/end压缩受控期 compaction |
| ④ 压缩后再来一个 durable 信号 → 回到常驻期;只要再来一次压缩,又会落回压缩受控期 | ||||
完整的转移关系(引导期也能不经常驻期直接进压缩受控期):
| 当前阶段 | 事件 | 去向 |
|---|---|---|
| 引导期 | 首个 durable tool/call / assistant/message | 常驻期 |
| 引导期 | compaction/end | 压缩受控期 |
| 常驻期 | compaction/end(晋级复位) | 压缩受控期 |
| 压缩受控期 | 压缩之后新的 durable 信号 | 常驻期 |
| 任意 | 子代理会话(delegationDepth > 0) | 恒为常驻期 |
| 任意 | 无会话的读取(清单、预览) | 恒为常驻期 |
每个阶段各解析出什么 —— 面板的三个部分与配置字段一一对应:
| 面板里的部分 | 生效的段屏蔽 | 注入段的 phase | 生效的工具黑名单 |
|---|---|---|---|
| 引导期提示词 / 引导期工具 | sectionsBootstrap | bootstrap(+ always) | tools.bootstrap.exclude,未配置则回落静态 |
| 常驻期提示词 / 常驻期工具 | sections | active(+ always) | tools.exclude(静态) |
| 压缩受控期提示词 / 工具 | sectionsCompaction | compaction(+ always) | tools.compaction.exclude,未配置则回落引导期,再回落静态 |
两点容易踩:
always 注入段三个阶段都在,且各阶段的排序空间独立 —— 所以本插件产出的阶段条目排在 always 组之后(运行时按数组序后写覆盖前写,阶段序才压得住全局序)。侧边栏点 能力 打开独立面板,顶层三个 tab:SKILL(技能集合管理)、MCP(Server 接入与工具级启停)、提示词(本节其余内容)。会话里 / 取技能与技能调用的工具行由 DSH 内核的 @deepseek-ai/dsh-client-ui-skill 提供 —— 本插件不重复注册(skill 命名空间 / 同名槽位键 / 同名斜杠源三处都归内核,重复注册会让内核插件的 apply 抛错)。
下面两张图是提示词 tab(截图截于 0.6.0 之前:顶部预设行当时还是纯文字 Tab,功能一致;SKILL / MCP 两个 tab 的截图待补)。
以下为提示词 tab 的细节 —— 侧边栏点 能力 → 提示词 打开独立面板。第一行是 agent 预设 chips(0.9.0 起无「全部 Agent」),每枚带图标、名称与该预设的定制项数(橙色数字 = 这个预设单独改过东西),点一下即切换编辑目标,进入面板时默认选中第一个可用预设。第二行是定制头部:模式切换(提示词 / 工具 / 配置)+ 阶段 Tab(引导期 / 压缩受控期 / 常驻期,左右两栏联动)+ 三态同步与中文提示词开关 + 保存 / 刷新 / 关闭。
提示词模式:左栏当前阶段的勾选列表(屏蔽 / 替换 / 注入 / 排序,底部三态过滤),右栏实时预览装配后的最终系统提示词:

工具模式:左栏该阶段的工具目录勾选列表,「本系统全部工具」池可把注册表里仍有的工具加回该阶段;右栏是模型可见目录(含「模型可见 / 注册表总数」对照):

.bundles.json 记规范名与目录名两套写法,目录名不一致也能命中);包可以有分类(最多 8 个、每个 ≤24 字符),改名会同步 SKILL.md frontmatter 里的 name,删除按规范名走,成员悬空时如实上报。<技能根>/<名称>/SKILL.md,并立刻归组到目标技能包;重名给明确错误,不带路径分隔的名字一律拒绝(不越界读技能根外的文件)。/api/skill-health 给出技能根的可读性与成员一致性体检。ctx.skills.list({ cwd }) 的结果 —— 文件系统各根(<工作区>/.dsh/skills、<工作区>/.agents/skills、~/.dsh/skills、~/.agents/skills,工作区按「最近的含 .git 祖先」判定)+ bundled(随安装)+ runtime(office 包)+ 插件自注册 provider。顺序、去重、优先级全由内核按 scope 链与 cwd 决定,插件不再自扫、不再取「所有会话的并集」。/ 技能源与技能工具行由 DSH 内核的 @deepseek-ai/dsh-client-ui-skill 负责,本插件不重复注册(重复注册会让内核 apply 抛错并拖垮整条客户端插件加载链);本插件提供的是「能力」面板里的管理面(导入 / 归组 / 开关 / 体检)与它背后的宿主路由。mcpServers 形态)/ mcp-client 行片段,面板先给待写入预览,再写进预设组合或 profile patch —— 写前备份,重名 server 跳过,非法 serverName / 非布尔 enabled 直接拒绝。config.plugins,经 DSH 的 configEditor 落盘 profile patch)。my 与 my_server 各自成组),可整台 Server 关掉,也可只关其中几个工具;装配过滤、状态路由、原生目录三处同源。/api/mcp-recommended 给出常见 MCP Server 的配置模板,照抄即可接入。mcp.json」的约定(全仓库 grep mcps 零命中),所以 0.10.x 曾加过的 mcps/ 四目录层在 0.11.0 已移除 —— 面板的列表、启停、增删全部作用于组合行(mcp-client 行 / profile patch),不再由插件代读目录、代挂行。手动 徽标,随时可删除。sectionsBootstrap,压缩受控期写 sectionsCompaction,常驻期写 sections;三份名单互不继承、互不影响,排序空间也互不干扰,因此「引导期只留 5 段、常驻期全开」可以分别表达 —— 在一个阶段屏蔽 / 恢复某段,绝不会改变它在其它阶段的状态。从「本系统全部提示词」池把段拖入当前阶段即成为当前阶段的独立副本(带原文写入本阶段注入条目)—— 加入阶段只有拖拽这一条路径,池里的行不再挂按钮,界面因此干净一半。(勾选「三态同步」后三态共用同一份列表,见下。)forceSections,默认开):包装宿主的装配入口,最终提示词段直接从注册表原始段重建 —— 预设插件自身的阶段裁段(如 liangshen 引导期 20→1)与 persona 的 complete: true 整段接管都无法再改写本插件的屏蔽 / 替换 / 注入 / 排序结果;工具目录与动态上下文保持预设与宿主行为。设为 false 退回瀑布流内过滤(此时完整段接管仍会压制段级定制)。lib/zh/,25 条目)的段一次性覆盖为中文;关闭 = 清掉这些段的替换文本,回归英文原文。两个方向都写入编辑草稿,与手动编辑同一条保存路径;开关状态从配置探测,不新增字段。自定义段与对不上名字的段不受影响,段数与注入不增不减。{{...}} 提示词变量(如 persona 的 {{model}} / {{cwd}})、机器路径与代码块逐字保留;tools:sdk 只替换前导散文,TS 代码块取自原文。tools:sdk 与 context:file-reference 是函数译本:按该行原文决定译不译(原文为空 = 该段的守卫已把它抹掉,就放弃替换,绝不用译本把一段被守卫消掉的内容复活);开关开启时从「本系统全部提示词」池把段拖进某阶段,也优先取译本 —— 加入即中文,一步接管。exclude):取消勾选即在该阶段隐藏这个工具,勾回来就恢复,被隐藏的行半透明原位保留。没有白名单模式 —— 它会让 exclude 整体失效,一次勾选就能悄悄关掉该阶段其它所有工具,而表达能力并不比反选更多。add):被该阶段裁掉、但注册表里仍有的工具,可从「本系统全部工具」池加入该阶段 —— 装配时在过滤之后从注册表查回 schema 追加(exclude 优先:同一名字两边都在 = 隐藏)。注册表里根本没有的工具(别的预设独有)加不进来,界面会明确说明。预览常驻面板右栏:提示词模式看最终系统提示词,工具模式看模型可见目录(右栏可切提示词 / 工具子视图),随头部阶段 Tab 联动切换。它展示经过所有插件过滤后的最终装配结果,所见即模型所见。工具视图给出「模型可见 / 注册表总数」的对照 —— PTC、Code Mode 这类预设会把整套目录包装成单个 run_code,只看注册表会误判。
宿主只注册 provider / model / cwd 三个变量,段文本里引用别的 {{name}} 会直接让整次装配失败。本插件经官方扩展点追加两类变量:
date / time / datetime / weekday / hostname / platform / arch / username / home / shell / locale / node_version,每次装配现算。process.env 的每个键映射为 env_<小写,非法字符归并为 _>,如 PATH → {{env_path}}、USER.NAME → {{env_user_name}}。黑名单(envBlocklist):env 里常有密钥,进了提示词就会随请求发给模型,所以命中黑名单的键不注册。预填条目覆盖常见凭据类键(含 SECRET / TOKEN / PASSWORD / API_KEY / *_DSN 等),条目支持 * 通配、大小写不敏感;面板的环境变量黑名单卡片可随时增删,卡里的折叠列表给出当前实际注册的变量清单。黑名单变化在下次装配生效(面板改动或直接改 config.yaml 都一样)。
导出 / 导入随行:导出预设时当前黑名单随行写入文件;导入端按并集并入(只增不减),与快照库语义一致。
严格渲染的代价:段里引用了一个未注册的名字(如被黑名单挡下的键),整段装配失败而不是留空 —— 面板清单里没列出的名字不要用。
「本系统全部提示词 / 本系统全部工具」不随编辑目标切换:它是一个跨预设、只增不减的并集(同名后见到者赢,新名追加),存放在 catalog.yaml 这个派生缓存里,删掉会自行重建。
池子的内容来自三处,面板一打开就成立:
section() 的(例如 tool:subagent、context:file-reference),它们既不进全局层也不进任何预设 scope,只在真实会话装配里出现。它们是「每个 agent 都成立」的段、不是某个模式独有的,所以清单在请求时就按 agent 作用域现 merge 出来 —— 打开面板就能看到,不必先跑一轮会话;tools:ptc-only、raw-html-v2:vcp)随你切换编辑目标逐步并进来 —— 这部分按需增长,是本插件的取舍(逐个挂载预设 tree 慢到十几秒,不值得每次开面板都跑)。真实会话装配那次也会把看到的段 / 工具并进登记表,作为没有活 agent 时的兜底。
一次改动从面板到模型的完整链路:
| ① 侧边栏面板 左栏勾选列表 / 右栏预览 只改内存草稿 | → | ② 插件自有路由/config · /config/apply/preview · /inventory · /presets | → | ③ config.yaml 全局字段 + overrides[预设]mtime 懒加载,手改即时生效 | → | ④ 装配瀑布流system-prompt/assemble 钩子按会话推导阶段,解析出生效配置并过滤 | ||
④ 内部依次是:effectiveConfig(overrides[会话所属预设])(0.9.0 起无全局基底)→ 段:屏蔽 → 替换 → 注入 → 按 order 排序;工具:pickToolsFilter(压缩 > 引导 > 静态)→ applyToolFilter | ||||||||
⑤ 交卷前还有一手:宿主在瀑布流之后,若存在 complete: true 的段就把整份 sections 还原成那一条 —— 这就是面板会对这类预设亮黄标的原因(工具目录不受影响;forceSections 开启时本插件已在装配入口重建 sections,接管被绕过,不再亮黄标)
| ||||||||
| ⑥ 模型收到:最终系统提示词 + 可见工具目录;右栏预览读的就是这一份结果 | ||||||||
代码地图:
| 路径 | 作用 |
|---|---|
lib/index.js | 宿主端:装配钩子、五条 HTTP 路由、agent 预设 fork、遗留字段一次性清理 |
lib/effective.js | 纯函数:字段级 override 合并、阶段选取(注入段 / 工具目录)、黑名单过滤 |
lib/promotion.js | 由 durable 事件推导 {promoted, boundary},压缩复位、子代理恒已晋级 |
lib/vars.js | 提示词变量:内置系统事实 + env 全量映射 / 黑名单,装配入口按签名懒同步 |
lib/sectionOps.mjs | 面板与单测共用的阶段状态纯函数(名单写回目标、注入身份、重排、逐阶段持久化) |
lib/store.js / lib/catalog.js | 原子写 + last-good 回落的配置存储;跨预设段/工具累积登记表 |
src/client/ | 面板(React,无 JSX 语法糖依赖,h() 直写),构建进 client/client.js |
关键约定:阶段逻辑只有一份实现 —— lib/sectionOps.mjs 既被 tsdown 打进浏览器包,也被
node --test 直接 import 跑单测,所以「测试通过」和「界面行为」之间不存在第二套代码。
dsh plugin --profile web add dsh-prompt-customizer
也可从本地检出安装:
dsh plugin --profile web add /path/to/dsh-prompt-customizer
当前版本(0.9.3)对齐 DSH 0.2.1-rc.2(peerDependencies 为 ^0.2.1-rc.2)。
0.2.0-rc.2 → 0.2.1-rc.2 的适配记录见 docs/rc2-migration.md:三个功能面的服务契约
均无破坏,唯一代码改动是用户数据根解析对齐内核新的 resolveDshHome/resolveAgentsHome
(空串按未设置、支持 ~ 展开)。
0.9.0 行为变更:全局层停用。 提示词必须按具体 agent 预设修改——「全部 Agent」
编辑入口移除,/config/apply 无 target 一律 400,/config/set|unset 拒绝六个
提示词字段;运行时生效配置 = 该会话所属预设的 overrides[id],未定制的字段 =
官方默认。config.yaml 顶层的旧全局层数据保留不再生效(可手编回滚;0.8.x 及
以前的行为请用 0.8.1)。
0.1.7 起的图标代际(IconXxxOutlineRegular/Medium,尺寸由 size 属性给)在
0.2.0 沿用,本插件的宿主接触面(system-prompt 装配 waterfall、agentPresets、
`con