Skip to content
dsh.fish
Bundle

dsh-user-prompt

DeepSeek Harness 插件:把一段自定义 Markdown 提示词注入每次模型请求(独立上下文注入行),可在设置页编辑,并支持从 Claude Code / Codex 一键导入规则。

Source
Sxuan-Coder
License
MIT
Updated
Updated 19 hours ago

Readme

# dsh-user-prompt

[![npm version](https://img.shields.io/npm/v/dsh-user-prompt?logo=npm&label=npm&color=cb3837)](https://www.npmjs.com/package/dsh-user-prompt)
[![npm downloads](https://img.shields.io/npm/dm/dsh-user-prompt?label=downloads&color=cb3837)](https://www.npmjs.com/package/dsh-user-prompt)
[![license](https://img.shields.io/github/license/Sxuan-Coder/dsh-user-prompt?label=license&color=blue)](https://github.com/Sxuan-Coder/dsh-user-prompt/blob/main/LICENSE)
[![DSH](https://img.shields.io/badge/DeepSeek%20Harness-plugin-4b6bfb)](https://github.com/deepseek-ai/deepseek-harness)

> ✍️ 给 DeepSeek Harness 加一段**你自己的提示词**:每次对话自动带上,设置页里能改,还能一键导入 Claude Code / Codex 的全局规则。
>
> 🧩 纯增量插件,不替换、不禁用任何官方插件。

## ✨ 是什么

- 📌 **一段常驻提示词** —— 写一次,之后每个会话、每次请求都自动带上,不用重复交代背景和规矩。
- 🖱️ **设置页里直接编辑** —— 注入 DSH 设置 →「插件 → 插件配置」,一张卡片里开关、写 Markdown、保存,**下一次提问就生效**,不用重启。
- 📥 **一键导入** —— 把 `~/.claude/CLAUDE.md`(Claude Code)或 `~/.codex/AGENTS.md`(Codex)读进来,三个工具共用一套规则;导入块有边界标记,重复导入只替换自己那一块,不会越堆越长。
- 👀 **独立一行显示** —— 注入走 DSH 的**上下文通道**,在对话流里单独一行「上下文注入」,可展开查看,能一眼确认规则注没注进去。
- 💾 **导出成文件** —— 一键写到 `~/.dsh/user-prompt.md`,随你用任何编辑器改,再读回来。
- 🌍 **不挑平台** —— Windows / macOS / Linux 同一份代码。

## 🚀 快速安装

```sh
dsh plugin --profile desktop add dsh-user-prompt
```

把 `desktop` 换成你实际在用的 profile 名(`~/.dsh/profiles/` 下有哪个目录就是哪个)。装完**重启 DSH**、刷新界面生效。

<details>
<summary>🌐 从 GitHub 装 / 改源码用</summary>

```sh
# 直接装仓库
dsh plugin --profile desktop add github:Sxuan-Coder/dsh-user-prompt

# 克隆后本地注册(改代码不用重装)
git clone https://github.com/Sxuan-Coder/dsh-user-prompt
dsh plugin --profile desktop add "link:<克隆路径>/dsh-user-prompt"
```

</details>

## 🎯 怎么用

1. 打开 **设置 → 插件 → 插件配置 → 自定义提示词**;
2. 勾上「启用注入」,把规则写进文本框(或点「📥 导入 Claude Code」/「导入 Codex」);
3. 点 **保存** —— 下一次提问即生效。

导入内容会先落到草稿,**确认后点保存才写进设置**;「合并方式」可选「保留手工内容」(默认)或「整段替换」。

💬 斜杠命令:`/user-prompt` 看状态,`/user-prompt path` 看导出文件路径。

## 💡 亮点

| 亮点 | 说明 |
| --- | --- |
| 🧭 与系统提示词分离 | 走上下文通道,注入内容在对话流里单列一行、可展开,与系统提示词互不混淆 |
| ⚡ 保存即生效 | 注入内容是每次组装时求值的,保存后下一次请求就是新内容,不需要重启 |
| 🔁 导入幂等 | 导入块被 `<!-- dsh-user-prompt:sync begin/end -->` 包住,你手写的内容不会被覆盖 |
| 🛡️ 坏内容进不去 | 提示词里的完整 `{{…}}` 会被 DSH 当模板变量导致请求失败,插件在保存时就拒绝 |
| 🪂 失败可降级 | 设置服务、连接服务缺失时自动退回组合配置或只读,不会卡在 pending,也不连累提示词注入 |
| 🎨 与官方界面同族 | 卡片复用官方 `PluginCard` 的语义 token 与骨架,深浅色主题一致 |

## 📦 生效范围

- `standard`(标准模式)、`ptc`、`cordis` 三种 agent preset 以及 plan mode 都会注入;
- `minimal` 模式用的是 `complete: true` 的固定极简提示词,它只覆盖"提示词段落"、不影响上下文通道,因此本插件**同样注入**(该模式本身没有 skill 目录,属它自身设计);
- 提示词作为会话历史保留,中途修改只影响之后的请求。

## ⚙️ 配置项

一般不用手改,设置页里都能调;想写进 profile 配置:

| 字段 | 默认值 | 说明 |
| --- | --- | --- |
| `enabled` | `true` | 总开关,关掉就不注入 |
| `prompt` | `''` | 提示词正文(Markdown) |
| `syncSources` | `[]` | 上次导入选的来源(仅记录) |
| `lastSync` | `''` | 上次导入时间(仅显示) |
| `maxSyncChars` | `200000` | 单次导入的字符上限,超出会截断 |

## 🧑💻 开发

```sh
node test/smoke.test.mjs           # 🧪 纯逻辑测试,10 项,不需要安装
node test/client-render.test.mjs   # 🖼️ 设置卡片渲染契约
node test/host-integration.mjs     # 🔌 用桩 ctx 跑真实 apply() + RPC(需已装进 profile)
```

代码结构:

```
lib/index.js      Host 半区:设置注册、上下文注入、RPC、斜杠命令
lib/prompt.js     纯逻辑:路径解析、文件扫描、导入块合并、模板校验
lib/client.js     浏览器半区:设置卡片(预构建 JS,无需构建步骤)
cordis.patch.yml  插件注册补丁
```

## 🙋 排障

**设置里看不到「自定义提示词」卡片** → 确认已**重启 DSH**(不是只刷新页面);再看 Host 日志 `%APPDATA%\DSH Desktop\logs\host\dsh-<日期>.log` 是否有这两行:

```
[I] [dsh-user-prompt] settings namespace "user-prompt" registered
[I] [dsh-user-prompt] RPC route /api/dsh-user-prompt registered
```

**规则没生效** → 卡片里「启用注入」是否勾上、有没有点保存(标题会标「未保存」);对话里展开「上下文注入」看规则在不在;老会话可能保留历史快照,开个**新会话**确认。

**导入按钮找不到文件** → 先确认 `~/.claude/CLAUDE.md` / `~/.codex/AGENTS.md` 存在,点「重新扫描」。

## 📄 License

MIT

Install

dsh plugin --profile web add github:Sxuan-Coder/dsh-user-prompt

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source