メインコンテンツへスキップ
A

dsh-temptask

aeroscis/dsh-temptask

DeepSeek Harness のワンクリック一時タスク:各タスクはタイムスタンプ付きの使い捨て workspace と専用 session で、ネイティブのサイドバー workspace node として表示されます。

インストール

dsh plugin --profile web add github:aeroscis/dsh-temptask

README

dsh-temptask — DSH 临时任务

给 DeepSeek Harness 加一个「临时任务」入口:一键开一个隔离的临时工作目录,在里面聊。 实验、临时调试、一次性问题——即开即用、用完就清。

  • 一个任务 = 一个目录 = 一个工作区(侧边栏里的那一项):<DSH_HOME>/dsh-temptask/<时间戳>/。所以侧边栏长成 DSH 原生的样子:任务工作区 → 它的会话,展开、归档、搜索、拖拽都是官方能力。
  • 不用起名:工作区名就是那个时间戳目录;会话标题由 DSH 按首条消息自动总结,显示在会话行上。
  • 聊出成果了就转正:改名、搬到你要的正式目录、连这段对话一起带过去,从此不再被自动清理。
  • 侧边栏一行:主区点击 = 新建,右边五个按钮(清理 / 转正 / 打开根目录 / 说明 / 设置);也有 /temptask 命令。
  • 清理有二次确认,只删任务根目录下的子目录,根目录里你自己放的东西不会被碰。

1. 安装与卸载

# 安装(默认 profile)
dsh plugin add @aeroscis/dsh-temptask

# 指定 profile / 从本地目录安装
dsh plugin --profile <profile> add @aeroscis/dsh-temptask
dsh plugin --profile <profile> add /path/to/dsh-temptask

装完重启 DSH。侧边栏顶部(「新建会话」下方)会多出一行:

+ 临时任务  │  🗑  ♥  ⧉  ?  ⚙

主区整块可点 = 新建;右边五个按钮依次是 清理 / 转正 / 打开(或复制)任务根目录 / 说明 / 设置。 窄栏折叠时它就收成一个 + 图标。

desktop 是 Electron 保留的 profile 名,终端里的 dsh plugin 会拒绝管理它。 桌面版请在应用内的插件管理界面装卸;想在终端操作就换一个自建 profile。

卸载:dsh plugin --profile <profile> remove @aeroscis/dsh-temptask。 卸载不会删除任务目录与 tasks.json——要清就先用「清理临时任务」或手动删。

支持的 DSH 版本

DSH 版本能不能用和别的版本有什么不同
0.1.5-rc.2✅能用。配置项存在 DSH 自己的设置里,改完要重启 DSH。这版官方只有「归档」,没有「取消归档」
0.1.7-rc.2✅同上;从这一版起才有「取消归档」(unarchiveSession)
0.2.0-rc.1 / 0.2.0-rc.2✅能用。配置项改由本插件提供,改完不用重启
0.2.1-rc.2 / 0.2.1-rc.3✅能用。「浏览…」选文件夹在这条线上是通的
0.2.2-rc.1✅ 本版本实测过能用。桌面版 DSH NEXT 2.0.22-next 内置的就是这条线

上表之外的版本,宿主会直接跳过本插件——界面上那一行不会出现,DSH 日志里会写 skipping profile bundle "@aeroscis/dsh-temptask"。遇到这种情况,升级插件或升级 DSH 即可。

2. 怎么用

新建

点 +(或 /temptask new)→ 创建 <DSH_HOME>/dsh-temptask/<时间戳>/ 并在这里开一条会话。 之后它就是一个普通的侧边栏工作区:展开能看到这次任务下的所有会话。

转正(♥)

临时任务聊出了成果、想长期留着时用。三种入口,都打开同一个面板:

  • 侧边栏那一行的 ♥;
  • 会话行右键菜单里的「转正此任务」;
  • 会话行悬停时出现的 ♥ 按钮(会自动预选这条会话所属的任务)。

面板里依次是三个区块:

  1. 要转正的任务——每行大字是工作区名(就是那个时间戳),下面小字是这段对话聊了什么 (会话标题 → 首条消息摘要),所以不用猜是哪一个。默认只列侧边栏还有工作区的任务; 右上角「显示全部(N)」把只剩文件夹的(工作区被删过)也列出来。
  2. 新目录名——默认取上面那段内容(例如「修复登录页的 500 错误」→ 修复登录页的-500-错误), 可以改成你要的名字;它同时是新工作区的名字。
  3. 目标父目录——必须是已存在的目录("少写一层"是最常见的手误,所以插件不替你造)。 能用系统目录选择器就点「浏览…」,否则手输绝对路径。

再加两个勾选:把对话带过去(默认勾,强烈建议)与完成后打开新会话。

点「转正」会先给你一个确认页(原路径 → 新路径、带不带历史、旧会话怎么处理),确认后才动手。 成功后给一张结果卡:原路径 / 新路径 / 新工作区 / 历史是否带上(没带上会说明原因)/ 归档了几条旧会话。

它会做什么:搬目录 → 在新位置建工作区 → 在新位置重建一条带完整历史的会话 → 旧会话按策略归档 → 删掉旧工作区与任务记录。旧的那条会话原样留在磁盘上(默认只是从侧边栏隐藏),新家得到的是新会话。

卡住时:如果那个目录正被占用(还有会话在跑、终端停在里面),会得到「目录被占用」的提示, 此时什么都没有改动——关掉那个任务的会话/终端再试。

清理(🗑)

勾选要删的任务(默认勾上已关闭的),二次确认后:删目录 → 删侧边栏那一项 → 删记录,再按设置处理它的会话 (默认归档,见 §3《删除任务时它的对话去哪了》)。运行中的任务会标「运行中」, 清理前会先中止当轮。

齿轮(⚙)

只放一件事:删除任务时怎么处理它的会话 —— 归档会话(推荐) 或 留在未分组。 另有「复制根目录」与清理入口。

说明(?)

鼠标移开就收起。里面是:有几个任务、根目录在哪、会话在哪儿、设置去哪改。 两半版本不一致时会多出一句「重启 DSH」——那是唯一需要你知道版本的场合。

3. 数据在哪

<DSH_HOME>/dsh-temptask/            ← 任务根目录(不存在时启动重建;删除操作永不碰它本身)
├── 2026-09-27-14-30-00/            ← 一个任务 = 一个目录
└── 2026-09-27-14-31-12/

<DSH_HOME>/plugin-data/dsh-temptask/
├── tasks.json                      ← 任务记录(原子写)
├── tasks.json.bak                  ← 仅当记录损坏时生成
└── config.json                     ← 仅在宿主没有设置服务时使用
  • 目录名是本地时间戳;同一秒内重复创建会加 -2,绝不覆盖。
  • 任务目录被手工删掉 → 下次启动会发现记录指着不存在的目录,于是丢掉这条记录并提示(目录才是任务本身)
  • 侧边栏那一项被手工删掉 → 下次「打开」该任务会按路径把它建回来。

删除任务时它的对话去哪了

一个任务可能先后开过好几条会话。删除任务时按设置处理:

设置会发生什么
归档会话(推荐)会话从侧边栏隐藏,日志仍留在磁盘上。要放回来:侧栏「视图选项 → 全部对话(显示已归档)」,在会话上右键「取消归档」(DSH 0.1.7-rc.2 起;0.1.5-rc.2 没有这个入口)。它会回到「未分组」——工作目录已经没了
留在未分组会话留在官方「未分组」里,仍然可见、能打开,但它的工作目录已经没了(工具/终端指不到地方)

为什么插件不删:DSH 没有删除会话的能力——会话日志只允许追加,存储层也明确没有删除或保留接口 (dsh-session-persistence 的原话:"No deletion or retention API — pruning stored sessions is out-of-band backend maintenance")。所谓「带外维护」就是:DSH 关掉后你自己去删磁盘上的会话日志。 本插件不做这一步,也不会去动那些文件。

想连痕迹一起清掉

「归档」「删除工作区」「删会话日志」是三件不同的事,各删各的:

动作谁提供实际删掉了什么
归档会话官方,可取消只改可见性:日志、缓存、workspace.json 里的归档登记都留着
删除工作区官方侧栏右键只删 workspace.json 里那条记录:文件夹与该工作区名下的会话都留着(转为「未分组」)
删会话日志没人提供(DSH 把这件事划给"带外维护")只能关掉 DSH 手工做,见下

「清理临时任务」落在哪一层:删任务目录 → 删侧边栏记录 → 删 tasks.json 记录,会话按设置归档。 所以会话日志、投影缓存、workspace.json 里的归档登记都还在。

删除工作区之后仍然存在的四处:

位置内容
<DSH_HOME>/sessions/--<目录名编码>--/session-<会话ID>/session.v4.jsonl.zstd整段对话。日志第一行就是 {"type":"session",…,"cwd":"…"},路径是明文
<DSH_HOME>/storages/session_projcache/sessions/session-<会话ID>.json会话投影缓存,同样带明文 cwd
<DSH_HOME>/storages/workspace.jsonglobal.archivedSessionIds / global.pinnedSessionIds 按会话 ID 记着,删工作区时不清
<DSH_HOME>/logs/*.jsonl不保证记,但确实会记到路径与会话 ID

目录名编码规则(存储层的 projectKey):连续的分隔符(/、\、:)合并成一个 -;字母、数字、.、_、- 原样保留;其余字符(空格、中文、~ 等)变成 ~ + 4 位大写十六进制(UTF-16 码元),最后套成 --…--。例:

C:\Users\Aeroscis\.dsh\dsh-temptask\2026-11-01-00-00-24
→ --C-Users-Aeroscis-.dsh-dsh-temptask-2026-11-01-00-00-24--

超过 251 字符会截断(这一步有损),超长路径就按前缀去 sessions 下找。日志文件名里的 v4 是当前格式号, 格式升级后会跟着变;不开压缩时没有 .zstd 后缀。

要彻底抹掉,按这个顺序来(DSH 必须全程关闭):

  1. 复制一份 workspace.json 留底;
  2. 删掉 <DSH_HOME>/sessions/ 下那个 --…-- 目录(该工作区名下所有会话);
  3. 删掉这些会话对应的 <DSH_HOME>/storages/session_projcache/sessions/session-<会话ID>.json;
  4. 编辑 workspace.json:把这些会话 ID 从 global.archivedSessionIds 与 global.pinnedSessionIds 去掉, 并确认 global.pendingMutation 是 null(不是的话,说明上次删除中途崩过);
  5. 删掉工作区目录本身(Shift+Delete;本插件删目录走 fs.rm,不进回收站);
  6. 需要的话再清 <DSH_HOME>/logs/。

做完再启动 DSH,侧边栏、搜索、会话列表都不会再出现它。如果只删了日志、没做第 4 步,workspace.json 里会留下指向已不存在会话的 ID:界面上看不到,但记录还在。

清不掉的部分:DSH 之外还有文件系统日志(NTFS USN)、卷影副本与系统还原点、备份软件、同步盘、 杀毒软件的隔离区。这些不归 DSH 管,要不要处理得自己评估。

想把对话接回某个项目

/temptask repair <工作区绝对路径> [来源会话ID]:把某条孤儿会话(它记录的目录已经不存在了) 的历史,复刻进一个正常的工作区,成为一条能继续聊的新会话。它只读旧日志、不删不改任何东西。

适用两种情形:转正时没勾「把对话带过去」事后又想要;以及临时目录被删/被清理之后。 如果原会话只是被归档,取消归档只能让它回到「未分组」(目录已失效)——这条命令才能让它继续工作。

4. 命令

/temptask list                       列出全部任务(ID / 目录 / 工作区 / 状态 / 时间)
/temptask new                        新建任务并打开会话
/temptask open <ID|目录名|标题>      打开任务(支持片段匹配,多个匹配会列候选)
/temptask promote <ID|目录名|标题> --dir <父目录> [--name <新名>] [--no-history] [--yes]
                                     转正:搬目录 + 建正式工作区 + 把对话复刻进新会话
/temptask repair <工作区路径> [来源会话ID]
                                     把已存在的工作区与它的孤儿会话接上(补回历史)
/temptask clean <ID|目录名|标题>     删除任务(先预览,加 --yes 才执行)
/temptask clean --all --yes          删除全部任务
/temptask help                       帮助
  • 标题含空格要加引号:/temptask open "修复登录 bug"。
  • clean / promote 都是"先打印将要做什么,加 --yes 才动手"。
  • promote 不带 --name 时沿用原目录名;--no-history = 不把对话带过去(仍会在新家开一条空会话)。
  • 例:/temptask promote "修复登录 bug" --dir "D:\Flora\ProgramProjects" --name login-fix --yes

5. 配置

在「设置 → 插件 → 临时任务」里改(DSH 0.1.x 上这一节的位置与写法略不同,效果一样):

键默认说明
rootDir<DSH_HOME>/dsh-temptask任务根目录。留空 = 默认
autoCleanDays0>0 时,启动清理「已关闭且最后打开超过 N 天」的任务
onDeleteSessionsarchive删除任务时怎么处理会话:archive 归档 / keep 留在未分组
dataDir<DSH_HOME>/plugin-data/dsh-temptask插件数据目录(改它要重启 DSH)

改 rootDir 与 autoCleanDays 不用重启,下一次操作就生效。

6. 排错

现象处理
侧边栏没有「临时任务」这一行确认插件装在这个 profile 上;看 DSH 日志有没有 [dsh-temptask];窄栏折叠时它只剩一个图标。若日志里有 skipping profile bundle,说明 DSH 版本不在支持范围内(见 §1)
在 desktop profile 上 dsh plugin 被拒预期行为:desktop 是 Electron 保留名,请在应用内的插件管理界面操作
设置里看不到「临时任务」这一节该宿主没挂设置表单;改配置的点 ⚙(写入 <dataDir>/config.json),功能不受影响
改了插件,行为还是旧的插件分两半:后端只在 DSH 启动时加载 → 必须重启 DSH;界面刷新页面就更新。设置卡片页脚写着两半版本,不一致时会提示「重启 DSH」
工作区名一直是时间戳预期行为:工作区名 = 目录名(DSH 的默认语义),插件不改写它。DSH 总结的会话标题显示在会话行上。想改名字就在工作区上右键重命名
建任务报「无法创建任务根目录」改 rootDir,或检查 <DSH_HOME> 的写权限
设置卡片出现「记录损坏…已备份重建」看 <dataDir>/tasks.json.bak 找回旧记录
/temptask open 说「任务目录不存在」目录被手工删了:清理掉这条记录后重新新建
打开了任务但页面没跳直接点侧边栏对应的工作区即可(自动跳转有约 2.5 秒的轮询延迟)
转正后新工作区里只有空会话当时没勾「把对话带过去」,或那条会话没有已完成的一轮 → 用 /temptask repair <新工作区路径> 把历史接回来
临时目录被删后对话打不开同上:/temptask repair <某个正常的工作区路径>
转正报「目录被占用」关掉那个任务的会话/终端(Windows 上只要还有程序待在那个目录里就搬不动);此时不会有任何改动

7. 已知限制

  • 插件不删会话:DSH 没有删除接口(日志只追加),本插件只归档。归档可以取消,但日志会一直留在磁盘上; 要彻底抹掉得在 DSH 关闭时手工删文件(见 §3)。
  • 删除工作区也不等于删干净:官方只删 workspace.json 里那条记录,文件夹与该工作区的会话都留着, 而会话日志头部存着明文 cwd。要连痕迹一起清掉得手工做,步骤见 §3《想连痕迹一起清掉》。
  • 转正只复刻"已完成的一轮":最后一个回合还没收尾的内容不会被带过去;一个已完成回合都没有时 会退化成空会话并如实说明。
  • 转正的目标不能落在任务根目录内部:那会被自动登记成新的临时任务,等于原地打转。
  • 侧边栏那一行内部的按钮屏幕阅读器读不到(这一行是官方按"导航按钮"渲染的,内部内容被标成 装饰性内容);同样的动作在「设置 → 插件 → 临时任务」与 /temptask 命令里都能用键盘完成。
  • 多个 profile 同时运行时共用一份 tasks.json:写入前会在锁内重读磁盘、按 id 合并, 极端情况下仍有亚毫秒级的覆盖窗口。

8. 给维护者

实现细节、为什么这样设计、逐条核对过哪些官方语义、被否掉的方案、测试与发版流程,都在 docs/DESIGN.md。

License

MIT

関連プラグイン