Repository navigation
Releases
v0.3.0 —— 斜杠命令 + ↑/↓ 历史指令回填
把作者早期两个插件里最常用的两件事收进本插件 —— 都是同一作者、MIT,来源已在源码注释与 README 里标注。
斜杠快速命令(移植自 dsh-command-md)
~/.dsh/commands/<名字>.md 一个文件一条全局斜杠命令,命令名就是去掉 .md 的文件名(文法与官方注册表逐字一致:/^[a-z][a-z0-9_-]*$/)。
---
description: 审查当前工作区的代码改动
input-hint: 可选的补充说明
---
请审查当前工作区的代码改动,重点关注潜在 bug 和安全问题。
$ARGUMENTS| 行为 | 说明 |
|---|---|
| frontmatter | 读 description(发现界面里的说明)与 input-hint(输入提示),其余键忽略但容忍 |
$ARGUMENTS |
换成用户敲在命令名后面的原始参数;没有这个占位符时正文原样发出 |
| 改文件立即生效 | 正文是每次调用时重新读盘的,不用重启 |
| 新增 / 删除文件 | 需要重启 dsh web 才反映(注册是启动时扫一遍目录) |
| 执行结果 | 正文作为一条普通用户消息交给 agent,与用户自己把这段话敲进输入框等价,不是系统注入 |
走官方 ctx.commands.register(),所以发现、补全、command/run / command/done 生命周期事件全归官方。与 app 级命令(/goal 之类)重名时只跳过这一条并告警,不会把其余命令一起带走。
↑/↓ 快速切换历史指令(移植自 dsh-message-jump)
在输入框里按 ↑ 翻出本会话里自己敲过的指令,再按 ↑ 往更早走,↓ 往新的走。第一次 ↑ 时当前草稿会存起来,一路 ↓ 翻回最新一条之后再按 ↓(或按 Esc)就原样还回来。穿梭时输入框上方有一条 历史指令 … ↑↓ 3/12 · Esc 退出 的提示条。
| 键 | 接管条件 | 行为 |
|---|---|---|
↑ |
光标已贴在草稿最开头(或草稿为空) | 进入穿梭 / 往更早一条 |
↓ |
只在穿梭模式里 | 往新一条;已是最新时还回原草稿并退出 |
Esc |
只在穿梭模式里 | 还回原草稿并退出 |
| 任何真实输入 | 只在穿梭模式里 | 立即退出穿梭(打字 / 退格 / 粘贴 / 拖入 / 输入法) |
/、@ 候选菜单开着时 |
—— | 一律不抢键(那里 ↑/↓ 是选候选) |
数据不是从聊天视图里抠的(那里只有已加载的一窗),而是走新增的 host 端点 history:读 ctx.sessionQuery.readSession() 的完整事件日志,只挑 source.kind === 'user' 的真实用户指令 —— 所以「更早」那些也在,而 AGENTS.md、技能目录、定时提醒这类 agent.inject() 塞进去的系统上下文不在。
回填走官方 inputActions.setDraft() 整条替换草稿:不碰编辑器内部,不自己实现输入框。host 通道取不到历史时 ↑/↓ 完全不接管 —— 宁可这个功能静默失效,也不能让用户觉得键盘坏了。
dsh-message-jump另一半的悬浮指令导航条没有收进来。
其余变化
- 新增
lib/commands-md.js:命令文件的纯解析层(frontmatter /$ARGUMENTS/ 目录扫描),零依赖,可脱离 DSH 单测。 index.js新增 RPChistory与命令注册;lib/client.js新增conversation.input.dock占位。commands/sessionQuery刻意不写进inject:ctx.get()懒取,缺席只让对应功能降级或报错,不会把整个插件挡在门外。
验证
node scripts/selftest.mjs—— 47/47(上一版 35),新增命令文件解析、history端点过滤、handler 消息形状。node scripts/dom-probe.mjs—— 83/83(上一版 70),新增dock注册与↑/↓全套键位断言(接管条件、边界、stash、Esc、菜单让键、通道失败降级、发完消息后重拉)。- 拿真实会话日志核对过
source.kind过滤:38 条user/message里只有 11 条 kind 是user(正是人工输入),其余 27 条是time-context/runtime-context/skill-catalog/agent-instructions/compact-checkpoint/user-approval。 - 拿真实
~/.dsh/commands目录核对过扫描结果:4 条命令全部正确解析,$ARGUMENTS替换生效。
安装
dsh plugin --profile web add dsh-file-extras@0.3.0装完重启 dsh web(host 半区是进程内代码)并刷新页面(客户端 bundle 在插件激活时读入)。
v0.2.0
0.2.0 —— 右键「@ 到对话」
文件 / 文件夹的右键菜单新增 @ 到对话:把路径以官方引用芯片的形式插进当前对话的输入框。
只插入、不发送 —— 后面还要接着写字,替你按发送键是越权。
多选时一次插一批(@ 到对话(N 项))。
没有重新实现「对话里 @ 文件」
芯片交给官方会话自己的 Lexical 编辑器插:
ctx.conversation.input.for(actx).addFiles(references, [])和「把文件拖进输入框」是同一条路,所以序列化(模型看到的文本)、点击芯片在右侧栏预览、
草稿持久化、发送时展开,全部沿用官方行为。
本插件只做两件事:从文件树认出用户点了哪个路径、拼出和官方 @ 补全逐字一致的提及文本
(复刻 @deepseek-ai/dsh-file-reference 的 formatFileMention):
| 情况 | 提及文本 |
|---|---|
| 文件 | @src/index.ts |
| 目录 | @src/ |
| 含空格的文件 | @"my notes.txt" |
| 含空格的目录 | @"my docs/(引号故意不闭合,官方语法如此) |
路径按「相对会话工作区根 + 正斜杠」给(官方候选就是这个形式,模型也按这个解析);
会话工作区与树根不一致时退回绝对路径,不硬拼一个错的相对路径。
「当前对话」取 ctx.sidebarRight.mounted。conversation / sessions / sidebarRight
三个服务是点击那一刻 ctx.get() 的,没有写进 dsh.client.inject —— 缺一个只让这一项报错,
不会拖垮元数据 / 菜单 / 删除。拿不到会话、会话没被 retain、输入框正忙(正在提交)、
路径含无法表示的字符,都明确报错,不静默失败。
菜单全貌
| 位置 | 菜单项 |
|---|---|
| 文件 | 下载 / @ 到对话 / 复制路径 / 删除 |
| 文件夹 | 上传文件到此处… / @ 到对话 / 复制路径 / 删除 |
| 空白处 | 上传文件到此处… / 复制路径 / 刷新大小与日期 / 全选可见项(有选择时再加 清除选择 与 删除 N 项) |
验证
- host 半区
node scripts/selftest.mjs—— 35/35(真文件系统 + 三套回收站后端) - 浏览器半区
node scripts/dom-probe.mjs—— 70/70(headless Chrome 里跑真实lib/client.js,本次新增 12 条)
新增断言覆盖:文件 / 目录 / 多选三种菜单形态、引用字段逐字段比对、
for() 拿到的正是 sessions.scope 借出的那个 context、带空格的文件与目录、
以及四条失败路径(没有打开的对话 / 会话没被 retain / 输入框正忙 / 工作区不一致)。
顺带修掉的坑
scripts/dom-probe.mjs 里页面探针是一整个模板字面量,注释中写反引号会把它提前截断,
pageScript 静默变成 串 / 串 / 串 = NaN,表现成「探针没有返回值」,极难反查。
已清掉反引号并加了 typeof pageScript !== 'string' 的当场拦截。
安装 / 升级
dsh plugin --profile web add dsh-file-extras@0.2.0装完重启 dsh web(host 半区是进程内代码)。
0.1.0 以来的全部变化
- 删除(文件夹 / 单文件 / 多文件):二次确认框逐项列出「是什么、多大、文件夹含多少内容」,
默认移到回收站(可还原),「永久删除」藏在默认不勾的复选框后面。
回收站是三套真实后端:WindowsSHFileOperation、Linux freedesktop Trash 规范、macOS~/.Trash;
回收站不可用时报错,绝不静默降级成永久删除。 - 多选:
Ctrl/⌘切换、Shift区间、空白处「全选可见项」,Esc分层收(确认框 → 菜单 → 选择)。 - 大文件流式传输:下载改成
stat预检 +<a download>原生导航(不再fetch→blob,
内存零拷贝、无大小上限、立即开始);上传请求流直接落盘,先写.part-<uuid>再原子 rename。 - 修改日期统一为
YYYY-MM-DD HH:mm:ss。
v0.1.0
dsh-file-extras v0.1.0
DSH Web GUI 的工作区文件树增强插件(首发版)。
功能
- 文件/文件夹行尾显示大小与修改日期(
1.2 KB · 2026-03-04 13:06:07,宽 1024 进制自动选单位) - 文件右键:下载 / 复制路径
- 文件夹右键:上传文件到此处… / 复制路径
- 空白处右键:上传 / 复制路径 / 刷新大小与日期
- 树外右键一律不接管,浏览器默认菜单照旧
- 窄栏自动把元数据换行到名字下方,时间戳完整不截断
安装
dsh plugin --profile web add dsh-file-extras装完刷新页面生效。
自检
node scripts/selftest.mjs—— host 半区,18 个用例(真文件系统)node scripts/dom-probe.mjs—— 浏览器半区,headless Chrome,35 条断言