dsh-prompt-stash · 提示词稿箱
右边栏里的简易 Markdown 提示词编辑器,外加一个全局存档库(时间 / 会话 / 工作区 / 颜色 / 标签分组,平铺卡片,多模板)。存档落在全局 DSH 目录:<dsh home>/prompt-stash(默认 ~/.dsh/prompt-stash)。
入口
| 入口 | 位置 | 行为 |
|---|---|---|
/prompt |
对话输入框的斜杠命令 | 在右边栏打开(或切到)提示词编辑器标签页 |
| 左栏图标「稿箱」 | 左侧栏全局面板区 | 打开存档管理页(主面板) |
| 编辑器右上角 ▤ | 编辑器标签页 | 切到存档管理页 |
右边栏编辑器是一个原生右侧栏标签页(kind prompt-stash):能和其他侧栏标签并列、拖动、关闭、随会话恢复,不是浮层也不是自绘抽屉。
编辑器
- 标题、正文(纯文本 Markdown,等宽字体)、颜色(7 个预设 + 系统取色器)、标签(最多 8 个)。
- 保存
Ctrl+S:写进全局存档。新稿首次保存后 id 固定,之后原地更新。 - 注入
Ctrl+Enter:用编辑器全文替换对话输入框里的内容,且不聚焦输入框——焦点留在编辑器里,接着写。 - 发送:只有按钮,没有快捷键(避免误触)。行为是把全文放进输入框并直接提交。
- 自动记录当前会话与工作区(会话标题、cwd 作为工作区标识)。
- 未保存内容按会话自动兜底(localStorage,被自定义协议页禁用时退化为内存),切标签页/关标签不丢;存档页要点开别的稿子时,脏稿会先弹一行「继续写 / 在编辑器中打开」,不会被直接顶掉。
- 「预览」按钮在编辑/预览间切换;预览是自带的小渲染器,只渲染受控元素,绝不注入原始 HTML。
存档管理
- 平铺卡片网格(
auto-fill, minmax(238px, 1fr)),没有树形视图。 - 分组:时间(今天/昨天/本周/本月/更早)、会话、工作区、颜色、标签、不分组。
- 排序:最近保存 / 创建时间 / 标题。
- 筛选:全部/草稿/模板、关键词(标题+摘要+标签+会话+工作区)、颜色圆点、标签。
- 卡片:颜色竖条、草稿/模板徽章、标题、三行摘要、标签、会话/工作区、时间。
- 「新建草稿」「新建模板」「打开存档文件夹」。模板卡片上的「用模板新建」会新建一份草稿并把模板原样留着,不会改到模板本身。
- 不做删除:卡片、菜单、接口里都没有删除动作;页面底部明说「不做删除,文件都在磁盘上」。
存档格式
~/.dsh/prompt-stash/
library.json 所有条目的元数据 + 归档页的视图设置
notes/<id>.md 每条草稿的 markdown 正文
templates/<id>.md 每个模板的 markdown 正文
diagnostics.json 浏览器端注册结果回执(最近 20 条)
diagnostics.log report 请求的到达记录
mount.json 当前挂载的 Host 构建与时间
library.json 里的条目:id / title / color / tags / createdAt / updatedAt / chars / lines / excerpt / session / workspace / templateId。正文永远在独立 .md 文件里,所以存档文件夹本身就是可读、可拷、可用任何编辑器打开的一堆 markdown。
写入走「临时文件 → rename」,并对 Windows 的 EACCES/EBUSY/EPERM 做有界重试;同一个 DSH 进程内由一个写者串行化(进程内的内存锁,不是跨进程文件锁——两个 DSH 实例指向同一个存档目录时没有互斥保护)。
可选:附件式注入
现版本注入是替换输入框(inputActions.setDraft),这是需求里的默认语义。DSH 确实支持附件(inputActions.addAttachments(ids) + 宿主 fileUploads.upload → attachments),但从浏览器端把一段字符串变成附件需要一次「上传 → 得到 attachmentId → 挂载」的会话往返,草稿语义变成附件后模型读到的也是文件而非提示词正文。所以这里没有做默认切换;如果以后要,正确做法是加一个「注入方式」设置项,而不是替换现有行为。
安装
这是一个本地插件包:package.json 同时声明了 dsh.bundle.patch 与 dsh.client,所以装进某个 profile 就会带上 Host 行、客户端模块与 patch。
- 已验证的方式:让 agent 调
plugin_manager的install_bundle,target填本目录的绝对路径(会以link:依赖装进 profile); - CLI 侧对应
dsh plugin --profile <profile> add <本目录>,本会话没有用它验证过。
装完 application 为 applied,刷新一次页面即可;/prompt 和左栏「稿箱」随后可用。改动 src/client/*.js 后要 node build.mjs 并重挂一次 bundle(本包会提交构建产物 client.js,安装时不需要构建)。
开发
node build.mjs # src/client/*.js -> client.js(三个 IIFE 顺序拼接,无打包器)
node --test tests/ # 66 个用例:归档整形 + Host 存储/路由 + 服务端渲染 + jsdom 交互 + 入口接线
测试用到的 React/ReactDOM 来自已安装的 DSH profile,不在本包依赖里;解析顺序见 tests/env.mjs(DSH_PROFILE_DIR → DSH_HOME + DSH_PROFILE → ~/.dsh/profiles/desktop,也可用 DSH_PROMPT_STASH_PROFILE_MODULES 直接指定)。DOM 那组需要 jsdom:npm install 后会自动找到本目录的 node_modules,或用 DSH_PROMPT_STASH_JSDOM 指一个装好 jsdom 的 node_modules。缺依赖时那组测试会显式跳过并说明原因,不会假装通过。
源码组织:index.js(Host:存储规则 + 一条 JSON 路由 + 开文件夹)、src/client/model.js(i18n、调色板、分组/排序/筛选、store、HTTP)、src/client/ui.js(编辑器、存档页、Markdown 渲染、样式)、src/client/entry.js(四个注册:标签页类型 / 斜杠命令 / 左栏入口 / 主面板页)。
已知边界
- 只在**桌面端(
dsh-app://app/)**实测过:注入、发送依赖右侧栏标签页拿到的inputActions,而右侧栏只在有会话时挂载。没有挂载时会先展开右边栏并重试一次,仍失败则提示「先在任意会话里按/prompt」。 - 右边栏宽度很窄(约 300–460px),编辑器按单列排布,不提供双栏预览。
- 颜色是「预设 + 任意 hex」,不是颜色管理;同一个 hex 的不同写法会归到同一组。
No comments yet. Be the first to write one.