概览
dsh-modes
README / ZH
插件文档
目录摘要
dsh.pub 核对固定版本的组合包契约、运行时事实与分发语义;完整 README 请查看源仓库。
在 GitHub 阅读完整 READMELIMITATIONS
已知限制
- **同步依赖记录**:同步内置更新依赖上次保存时记下的内置插件列表。用 0.5.0 之前的版本改过的模式没有这份记录,第一次同步时,和官方不一致的地方都会按你的修改保留;之后每次保存都会补上记录。 - **为其他工具写的技能**:DSH 只读取 `name`、`description`、`whenToUse`、`metadata`、`disable-model-invocation` 和 `user-invocable`;其他字段(比如 Claude Code 的 `allowed-tools`、`model`)不起作用。依赖其他工具自带功能的技能(比如 Codex 的生图)可以导入,但在 DSH 里可能用不了。 - **导入扫描的位置**:`$CODEX_HOME/skills`(默认 `~/.codex/skills`)、`$CLAUDE_CONFIG_DIR/skills`(默认 `~/.claude/skills`),以及 `~/.claude/plugins` 往下六层以内的 `skills/<名字>/SKILL.md`;同一个插件缓存了多个版本时,只列最近改动的那份。项目里的技能(比如 `<项目>/.claude/skills`)请用「文件夹」导入。单文件形式的 `<名字>.md` 技能不会列出。 - **Windows 上覆盖**:文件是逐个覆盖的,中途出错会留下新旧混合的文件。可以在这个技能的版本列表里恢复导入前自动保存的版本。 - **刚写入的技能**:页面会等 0.8 秒让 DSH 的文件监听发现它,再读取列表。如果新技能仍显示「这个模式找不到它」,点「刷新」。 - **即时生效的范围**:只作用于提示词的开头和结尾两段文字;「完整提示词」「运行时上下文」两项仍然只对新会话生效。 - **对话改提示词的范围**:`mode_prompt` 只读写提示词的开头这段。 - **列出的技能**:页面列出的是不指定工作区时各模式能找到的技能:用户级、自定义目录和包里自带的技能。项目里的技能(`<项目>/.dsh/skills`、`<项目>/.agents/skills`)取决于会话的工作区,不会列出。 - **在所有模式里关闭的技能**:这需要每个模式里都有本插件的一行,所以每个内置模式都会被写入一份 profile 覆盖。 - **和其他技能插件的先后**:这一行的条目排序值是 -1000。如果别的插件在同一作用域里注册了排序值更小的条目,它会胜过本插件。 - **被隐藏技能的信息**:一个技能在所有模式里都被隐藏后,页面显示的是它最后一次可见时的描述和文件位置。 - **更新检查**:需要能连上仓库。连不上时页脚会显示检查失败。镜像可能比 npm 慢,最新版本可能晚一点才出现。 - **升级后的版本记录**:在页面里升级后,依赖在 `package.json` 里记成压缩包地址,而不是版本号。这不影响使用和以后的升级。 - **新版本启动失败**:DSH 不会继续运行旧版本。请在终端运行横幅里给出的退回命令。 - **代码模式(PTC)**:暂不支持工具描述。代码模式里,模型读到的工具描述是生成出来的 SDK 文本里的注释,修改不会改写它。 - **会话启动时才注册的工具**:列表来自每个模式注册的工具。只在会话启动时才注册的工具(例如 `subagent`),要等这个模式的会话发出第一次请求后才会出现。 - **会复述工具描述的插件**:把描述抄进提示词的插件(例如 tool-activator 的 `<available_tools>` 列表)仍然显示内置原文;发给模型的工具定义带的是你的修改。 - **手工修改文件**:插件读取 `tool-descriptions.json` 后会缓存,只有在页面保存后才会重新读取。手工改过这个文件后请重启 dsh。文件损坏时会报错,不会被覆盖。 - **会话统计**:删除前统计已保存的会话要读取每个会话的记录,会话很多时最多统计 8 秒,没统计完会显示「至少 N 个」。 - **权限**:写操作只依赖 dsh 自带的登录校验。 <details> <summary><b>开发者参考:工作原理</b></summary> ### 组成 | 文件 | 作用 | |---|---| | `index.js` | 宿主端插件。提供 `POST /api/dsh-modes`,以及给另外两个模块用的 `dshModes` 服务。修改内置模式时,用 `configEditor.edit()` 在 profile 里写入该模式行的覆盖;插件的显示信息来自 `pluginInventory.list()` | | `container.js` | 自定义模式容器:配置里保存 `presets` 列表,并对每一项调用 `agentPresets.register()` | | `rebase.js` | 同步内置更新用的三方合并:以上次保存时的内置插件列表为基准,把你的修改合并到最新的内置列表上。冲突时保留你的值 | | `tool-descriptions.js` | 应用工具描述修改的行:放进模式里,在 `system-prompt/assemble` 的监听链最前面,替换每次请求的工具列表里被修改工具的 `description` | | `tool-edit.js` | 工具描述修改的纯计划逻辑:校验、带冲突检查的批量修改、恢复、历史,以及每个模式的工具列表 | | `skill-policy.js` | 技能设置行:放进模式里,在模式的作用域注册一个技能来源;对每个被关闭的技能返回一个谁都不能调用的条目,对每个固定版本的技能返回保存的版本,排序值 -1000 | | `skill-store.js` | 技能设置的纯函数:把「所有模式」的设置并入单个模式、批量修改、版本编号、哪些模式需要这一行、读取 SKILL.md 的 frontmatter | | `skill-files.js` | 把技能复制成一个版本、把版本恢复到当前文件,以及透过链接写文件 | | `skill-import.js` | 在 Codex、Claude Code 和指定文件夹里找技能文件夹;读取候选技能的 frontmatter;给技能文件夹算指纹、复制、替换;生成新技能的 `SKILL.md` | | `update.js` | 不依赖 DSH 服务的版本检查和升级辅助函数:版本比较、profile 怎样依赖这个包、要询问的仓库,以及对仓库返回的压缩包地址的校验 | | `state.js` | profile 目录下的 `.dsh-modes/state.json`(同步基准,以及自定义模式基于哪个内置模式、用了哪个模板)、`history.json`(提示词历史)、`tool-descriptions.json`(工具描述修改及其历史)、`settings.json`(更新检查的开关,以及升级给新版本留下的记录)和 `skills.json`(技能设置、每个技能最后一次可见时的信息、版本索引;版本的文件在 `skill-versions/<技能>/<版本>/`)。写入时先写临时文件再替换 | | `install-guard.js` | 让改过的内置模式在卸载后仍能加载:本插件模块的每一行保存时都带一个 `!!js` 的 `disabled` 条件,找不到 `dsh-modes` 包时为真;即时生效的身份行后面再放一行同样提示词的官方身份行,条件相反。自建模式不加条件,因为它们会随插件一起消失 | | `live-persona.js` | 即时生效用的身份行:替换模式里的 `@deepseek-ai/dsh-persona` 行,注册同样的两个提示词分段,每次组装提示词时读取最新保存的文字 | | `prompt-tool.js` | `mode_prompt` 工具:作为一行插件放进模式里,所以只有这个模式的会话能看到它;写入前通过 `tools/pre-execute` 要求用户审批 | | `client.js` | Web 设置页(中英文) | | `cordis.patch.yml` | 插入 `index.js` 和 `container.js` 两个宿主端插件行 | `/api/dsh-modes` 的动作: - **读取**:`list`、`read`、`prompt`、`history`、`usage`、`tools`、`updateStatus`、`upgradeStatus`、`skills`、`readSkillFile`、`readSkillVersion`; - **技能**:`setSkillModes`(一批 `{ preset, skill, enabled?, pin? }`)、`setSkillGlobal`、`saveSkillVersion`、`restoreSkillVersion`、`deleteSkillVersion`、`writeSkillFile`; - **插件行**:`toggle`、`followPlatform`、`applyRows`、`resetRow`; - **整个模式**:`reset`、`sync`、`repair`、`create`、`update`、`remove`、`setDefault`; - **提示词**:`setPrompt`、`setLive`、`setPromptTool`; - **更新**:`setUpd
