dsh-kit
Verified@jjblau2021/dsh-kit · v0.33.20 · MIT · Web UI
Per-turn commits into the workspace's .kit repository, with a /kit command and a right-sidebar history panel
Install
dsh plugin add @jjblau2021/dsh-kit Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Readme
kit 记录器
@jjblau2021/dsh-kit 是一个 DSH 插件。每个 Agent 轮次结束时,它把工作区快照提交到独立的 .kit 仓库,并在右侧栏提供记录、diff 和回滚。人工维护的 .git 不会被改写。
安装
在 Plugins → Add plugin 中输入:
@jjblau2021/dsh-kit
或在桌面 App 完全退出后执行:
dsh plugin --profile desktop add @jjblau2021/dsh-kit
安装后点 Enable。已安装的插件不会自动升级:先移除旧版本,再安装新版本。Host 半的改动需要完全退出并重新打开 App;Client 半刷新页面即可。
也可以安装 Git 地址或 Release tarball:
dsh plugin --profile desktop add https://github.com/JJblau2021/dsh-kit.git
本地开发使用目录安装,插件以 link: 挂到本目录。移动或删除本目录会使插件失效。
dsh plugin --profile desktop add "$PWD"
如果以前装过 @local/dsh-kit 或 @jjblau/dsh-kit,先移除旧项,再安装 @jjblau2021/dsh-kit。
开始使用
- 在要记录的工作区里打开会话。
- 第一次使用时执行
/kit init,或在空面板里点 初始化 .kit。 - 让 Agent 跑完一轮,或先执行
/kit commit 人工基线。 - 打开右侧栏 + → kit 记录。
kit 记录的是工作区快照,不是 Agent 自己的 diff。轮次开始时,如果工作区相对 .kit 已经有未提交改动,插件会先自动提交一条未标记记录,标题是「未提交的改动」。之后这一轮的记录只包含本轮的变化。
git commit 和 git stash 不能代替 /kit commit。kit 只比较工作区内容和自己的 HEAD。
面板

顶部是标题栏(名称、工作区路径、刷新)和状态栏(当前活动、类别筛选)。路径后面的修改图标会打开系统的目录选择窗口。选中的目录会记在当前会话上:已有 .kit 就查看并在之后把这个会话的提交写到那里;还没有则留在该目录并显示初始化,初始化后的提交也使用它。HEAD 变化时列表会自动刷新。
记录类别
| 类别 | 来源 | 外观 |
|---|---|---|
| 人工打点 | /kit commit |
琥珀徽标和左侧色条 |
| agent 轮次 | 轮次结束时自动提交 | 蓝色徽标和左侧色条 |
| 未标记 | 没有 kit 元数据的旧提交或裸 git commit |
灰色虚线徽标和左侧色条 |
没有来源、但带有正数轮次的旧提交归为 agent。两者都没有的归为未标记。直接提交到 .kit 的记录没有来源信息,不会显示成人工打点。
状态
| 状态 | 含义 |
|---|---|
| 思考中 | Agent 在推理,或在工具与步骤之间等待模型 |
| 执行工具中 | 有工具调用正在执行 |
| 回复中 | Assistant 正在输出文本 |
| 等待确认 / 等待回答 / 计划审核 | 等待用户操作 |
| 已同步 | 当前没有进行中的轮次 |
| 加载中 / 无 .kit / git 不可用 / 读取失败 | 加载或异常 |
优先级是:等待交互 > Agent 活动 > 已同步。进行中的轮次如果已经改了文件,状态后面会附上文件数,例如 思考中 · 3 个文件。
状态带有文件数时,悬停状态会弹出尚未写入 .kit 的文件清单,点击其中的文件会打开 diff。没有未提交改动时不显示文件数。
记录操作
- 记录默认折叠,先列出最近 50 条。列表滚到底,或内容撑不满面板时,继续加载更早的记录。显示类别、commit 说明、文件数、
+N -M和时间。说明按本轮意图生成,不用固定标题,也不照搬对话里发出的消息。优先用助手说明这一轮要做什么的那一句;这句话如果只是复述用户消息就不用。没有这句时,才用图片说明或本轮用过的工具。展开后用短标签显示会话和轮次,例如abecf227 #12,悬停可以看到完整会话 id。 - 点击标题展开 hash、模型、推理等级、
git:<分支>@<短 hash>[+dirty]、完整描述和文件。 - 行尾的定位按钮只对当前会话里已加载的 agent 轮次可用。点击后把该轮用户消息滚到对话顶部,并短暂高亮气泡。其他记录会禁用并说明原因。
- 点击展开后的完整描述可以复制。结果用右上角 Toast 提示。
- 没有用户请求时,
Kit-Prompt仍是(no prompt)。注释优先用本轮 Assistant 的第一句;只有图片时显示「用户上传了 N 张图片(文件名)」;最后才用工具名。不再把上一条用户消息标成「续」。 - 旧记录如果所属会话还在,面板会按同样规则临时补摘要,不改
.kit历史。会话已经不在时仍显示(no prompt)。 - 悬停文件行会在上方或下方打开 diff 预览,交互与对话流里的文件对比一致。
- 点击文件优先打开内置的「第 N 轮改动」页;无法复用时打开插件自己的并排 diff 页。新增和删除的文件只用单栏。
右键菜单
记录菜单只出现在标题行。
| 动作 | 作用 |
|---|---|
| 定位到这一轮 | 跳到当前会话中对应的用户消息 |
| 查看详情 | 打开这条记录的文件 diff |
| 与另一条记录对比 | 再点另一条记录,打开两条快照的净差 |
| revert kit 记录 | 生成一条反向提交,并标为人工打点 |
| 将 kit 记录添加到对话 | 把记录整理成可删除的 .md 附件,不自动发送 |

revert 是 git revert,不是把工作区恢复成那条快照:
- 工作区必须干净。根提交不能 revert。
- 成功后新增一条人工记录,标题为
revert: <短 hash> <原标题>,并带有回滚标记。 - 冲突会中止 revert,不留下半成品提交。
- 结果挂在该记录下方。
unknown-endpoint表示 Host 还没加载新路由,重载插件后再试。
文件菜单只出现在展开后的文件行。
| 动作 | 作用 |
|---|---|
| 打开 diff | 打开完整 diff |
| 在文件管理器中显示 | 定位当前工作区里的这个文件 |
| 用默认应用打开 | 用系统默认应用打开当前文件 |
| 复制相对路径 | 复制相对工作区的路径 |
| 复制改动 patch | 复制这个文件在该记录中的 unified diff |
| 把这个文件 diff 添加到对话 | 添加可删除的 .patch 附件 |
| 查看这个文件的 kit 历史 | 只显示改过该文件的记录 |

复制、打开和添加附件的结果都用右上角 Toast 提示。文件筛选条可以清除,清除后恢复全部记录。
命令
命令结果只出现在命令面板,不会变成模型消息。
| 命令 | 作用 |
|---|---|
/kit |
帮助 |
/kit init |
在当前工作区初始化 .kit |
/kit log [n] |
最近 n 次提交,默认 10,最多 100 |
/kit status |
查看 kit 视角的改动 |
/kit show [rev] |
查看某次提交,默认 HEAD |
/kit commit [说明] |
立刻做一条人工打点。不写说明时标题和备注都是「人工打点」 |
配置
在 ~/.dsh/profiles/<profile>/cordis.patch.yml 里覆盖同名配置:
- id: kit-recorder
config:
enabled: true
commandName: kit
includeSubagents: false
timeoutMs: 30000
# 当前工作区没有 .kit 时,面板改看这个目录
panelRoot: /path/to/workspace
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
关闭后仍保留 /kit,但不再自动提交 |
commandName |
kit |
斜杠命令名 |
includeSubagents |
false |
是否也提交子代理轮次 |
timeoutMs |
30000 |
单条 git 命令的超时 |
panelRoot |
无 | 会话工作区没有 .kit 时的回退目录 |
提交里有什么
每次提交都是当时的工作区快照,并带有这些 trailer:
Kit-Session: session-...
Kit-Turn: 3
Kit-Prompt: 用户这一轮的第一条请求
Kit-Followup: 同轮里之后的补充
Kit-Intent: 没有用户请求时的自动摘要
Kit-Model: provider/model
Kit-Reasoning: high
Kit-Human: git:main@a1b2c3d+dirty
Kit-Origin: turn-end
Kit-End: completed
Kit-Files: 3 files +42/-7
Kit-Reasoning 只在有推理等级时出现。Kit-Human 是提交时人工仓库的 git:<分支>@<短 hash>[+dirty],读不到时为 git:none。Kit-Revert 只出现在回滚记录上。Kit-Intent 只在没有用户请求时出现。Kit-Followup 只在同轮有补充时出现,主请求仍留在 Kit-Prompt。不再写 Kit-Change。
自动提交只处理顶层 Agent 的 turn/end。子代理默认跳过。找不到 .kit、工作区没有变化,或 git 不可用时,都不会产生提交。同一工作区的提交按顺序执行。
限制
- 轮次结束时如果立刻退出 App,排队中的提交可能来不及完成。
.kit与人工仓库仍共用.gitignore。- 在 Agent 沙箱里用 CLI 安装可能因无法写
~/.dsh而失败。安装请用插件面板。 - 定位依赖对话 DOM,不是公开 API。其他会话和尚未加载的轮次无法定位。
- revert 要求工作区干净;根提交不能 revert;冲突需要处理后重试。
- 自动摘要描述的是本轮在做什么,不是图片内容本身。没有 Assistant 文本时,图片只记录数量和文件名。
开发
node --test test/*.test.mjs
发布时把 package.json 的 version 改成新版本并提交,然后创建 tag 为 v<version> 的 GitHub Release。publish.yml 会核对 tag、运行测试,并用 NPM_TOKEN 执行 npm publish。这个 secret 需要有发布权限;要无人值守发布时,使用允许跳过 2FA 的 token。已发布过的版本会被跳过。