用 dsh-chat-import 把 Claude Code、Codex 等历史会话迁进 DeepSeek Harness

前言

DeepSeek Harness(dsh)把模型、工具、会话、沙箱和界面都做成插件,官方仓库的口号就是「Everything is a Plugin / 一切皆插件」。换到这套运行时之后,真正卡住的往往不是装插件,而是历史对话还散落在别处:Claude Code 的 JSONL、Codex 的 rollout、Cursor 的 agent-transcripts、Reasonix 的会话目录,再算上 ChatGPT 网页导出、opencode / ZCode 的 SQLite。

这些文件各自能打开,但不能直接当成 dsh 会话继续聊。工具调用、思考块、工作区路径对不上,侧边栏里也看不到它们。dsh-chat-import 做的就是这件事:把外部 Agent 的聊天记录读进来,写成可 resume 的 DeepSeek Harness 会话,必要时还能按目标格式导回去。

本文按社区插件目录页、GitHub 仓库 README(中英文)、package.json、CHANGELOG 和 npm 页面交叉核对后整理。社区目录 deepseek-harness-plugin.com 是独立站点,和 DeepSeek / 幻方没有官方从属关系,不要把它理解成官方应用商店。

这是什么

dsh-chat-import 是一款「会话与消息」类 DeepSeek Harness 插件,由 Nwflower 维护,GitHub 仓库为 Nwflower/dsh-chat-import。许可证为 MIT(Copyright 2026 Nwflower、Scarlett)。npm 包名同为 dsh-chat-import,当前版本 0.5.1(2026-08-16 发布)。主要语言是 JavaScript,运行要求 Node.js >= 22.13(仓库说明这是 node:sqlite 免 flag 的首个版本)。面向 dsh 0.1.x 线,peer 依赖 @deepseek-ai/dsh-tools ^0.1.0-rc.6,README 写明在 dsh 0.1.0-rc.6 上测过。

它解决的问题很具体:把 Claude Code、Codex、ChatGPT、Cursor、Gemini、Reasonix、opencode、ZCode、Grok Build、OpenClaw、Pi Coding Agent、Hermes、Kimi CLI / Kimi Code 以及 DSH 自己的会话日志,导入成全保真、可继续的 dsh 会话。源文件只读,不改写;不碰 dsh 引擎。导入后的会话按源 cwd 归入对应工作区,打开即可从源记录停下的地方接着聊。

GitHub 仓库页面在笔者查阅时显示 49 颗星;社区目录页当时标注 30 颗星。星标以仓库页面为准,目录数字可能滞后。

核心功能

仓库把能力分成导入、续聊、互转、备份几类。下面只写 README 里已经写明、可以按文档复现的部分。

14 种来源加本地 JSONL

每种来源对应一条导入工具,目录或单文件都能喂进去。存储位置以仓库文档为准:

来源 默认位置 工具
Claude Code ~/.claude/projects/ 下的 .jsonl import_claude
Claude-3p(新端) Windows %LOCALAPPDATA%\Claude-3p\claude-code-sessions import_claude
Codex / ChatGPT CLI ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl import_codex
ChatGPT 网页导出 任意路径下的 conversations.json import_chatgpt
Cursor ~/.cursor/projects/ 下的 agent-transcripts import_cursor
Gemini CLI ~/.gemini/history/ 下的 session-*.json import_gemini
Reasonix(CLI + 桌面) ~/.reasonix/sessions/,Windows 另有 %APPDATA%\reasonix\projects\ import_reasonix
opencode ~/.local/share/opencode/opencode.db import_opencode
ZCode ~/.zcode/cli/db/db.sqlite import_zcode
Grok Build ~/.grok/sessions/ import_grokbuild
OpenClaw ~/.openclaw/agents/ 下的 sessions/*.jsonl import_openclaw
Pi Coding Agent ~/.pi/agent/sessions/ import_pi
Hermes ~/.hermes/(Windows 为 %LOCALAPPDATA%\hermes import_hermes
Kimi CLI / Kimi Code ~/.kimi/sessions/~/.kimi-code/sessions/ 下的 wire.jsonl import_kimi
DSH 会话日志 ~/.dsh/sessions/ 下的 session.jsonl(可带 .zstd import_dsh
任意本地 JSONL 任意 .jsonl 文件或目录 import_local_jsonl

源里有什么就保留什么:session id、cwd、标题、模型、时间戳、工具调用与结果、思考块。格式本身记不下的内容,会在导入报告里标明,而不是悄悄丢掉。import_local_jsonl 会自动识别 dsh / claude / codex / cursor / reasonix / pi / openclaw / hermes,识别不准时用 format 强制指定。

全保真导入和可续聊

导入不是把文本粘进当前对话框,而是新建一条 dsh 会话。仓库说明:会话创建优先走 host 的 agents.create,挂上默认 preset scope、绑定默认模型,因此导入会话的工具面和原生会话一致。打开它就可以继续对话。

工作区归组按源 cwd 走:Claude 侧会查 ~/.claude.json 的项目映射,Reasonix 会对项目 slug 做磁盘存在性解码,并带主目录沙箱防护(cwd 等于用户主目录时不当工作区)。本机没有这条路径时,回退到源文件所在目录,避免全部堆进「未分组」。

幂等、增量、预览

同一源再导一次,未变化的文件会标 already-imported 并跳过;增长的文件只把新轮次 append 进同一会话(appended);源被截断会报 sourceShrunk。需要完整新副本时用 force: true,旧会话不会被改写。

preview: true(别名 dryRun: true)走完整解析和转换,但不落盘。适合先看会导入什么,再去掉该参数正式导入。

超长会话会按上下文预算裁剪(可用环境变量 DSH_IMPORT_CONTEXT_BUDGET),裁剪结果会写进返回值。Claude 长会话还可以 compacted: true,只导最后一次压缩摘要加尾部。

反向导出和便携备份

导入只是一条边。README 还提供:

  • export_claude / export_codex / export_kimi:把任意 dsh 会话(导入的或原生的)序列化成目标格式。Claude 侧默认写到 ~/.claude/projects,文件名是新的 UUID v4,不覆盖已有文件;Codex / Kimi 默认写到 ~/.dsh/exports
  • sync_to_claude:把会话里新增的完整轮次追加回 Claude Code 文件,带守卫,文件被外部改过或缩小时不会静默覆盖。
  • export_bundle / restore_bundle:写出带双重 SHA-256 指纹的 .dshbundle.json,可拷到另一台机器还原。目标机没有原 cwd 时会回退并在结果里报告,不会静默丢分组信息。
  • 每次导出都会列出有损项(degradations:孤儿工具结果、跳过的注入、跳过的附件)。

侧边栏「导入会话」面板还有同步页:外部 → DSH、DSH → 外部两个方向默认关闭,要在面板里打开或点「立即同步」。配置文件在 $DSH_HOME/dsh-chat-import/sync.json

发现、校验、交接

  • scan_discover():只读扫描各格式默认数据根,返回标题、项目、cwd、路径、导入状态;零副作用。
  • 浏览器侧边栏底部有「导入会话」入口(dsh web),按工作区分组,可筛选来源、搜索、分页多选导入。
  • /import/import-all:在挂载了 dsh commands 服务的环境里直接导入,不占模型轮次。
  • /resume-claude/resume-codex:把外部 transcript 当不可信静态历史,生成交接摘要(目标、文件、停止点、下一步)注入当前会话;多条匹配时列候选,不擅自猜。
  • verify_session:只读结构审计(seq、事件白名单、工具配对等),并给出按 kind 的修复提示。
  • list_imported_sessions / retract_import:列出本插件导入过的会话;撤回只清 registry 并给出手动删除指引,插件不会自动删任何会话数据

另外还有 import_agents(把 pi / opencode / Claude 的 agent、prompt、skills 落成持久化 DSH skill)和可选的 Claude 上下文桥(环境变量 DSH_IMPORT_CONTEXT_BRIDGE=1,默认关)。这两项不是主路径,需要时再看仓库文档。

安装与启用

社区目录页给出的安装命令如下,在 DeepSeek Harness 终端里运行:

dsh plugin add github:Nwflower/dsh-chat-import

如需可复现安装,按目录页说明固定 commit 哈希:

dsh plugin add github:Nwflower/dsh-chat-import#<commit>

仓库 README 还提供 npm 包和本地源码两种写法,针对 web profile:

dsh plugin --profile web add dsh-chat-import
dsh plugin --profile web add -w link:/path/to/dsh-chat-import

package.json 里客户端注入声明了 "platform": "web",侧边栏面板是给 dsh web 用的。dsh plugin 会把插件的 bundle 声明收进当前 profile,重启 dsh 之后插件才生效。卸载时从 profile 的 bundles 里去掉对应 insert 行并重启;已导入的会话仍留在 dsh 数据目录里。

目录页和仓库都提醒:插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前应检查源代码仓库和许可证。

典型用法

导入会即时落盘,但 dsh 的会话列表不会自动刷新。导入后要刷新页面或会话列表,才能看到新会话。读取工作区之外的源文件、写出工作区之外的导出文件,都需要会话沙箱放行对应路径。

1. 先发现,再导入

只读预览本机有哪些可导入会话:

scan_discover()
scan_discover({ path: "~/.codex/sessions", format: "codex" })

也可以在 dsh web 侧边栏打开「导入会话」面板,按来源过滤后单条或批量导入。面板和 import_* 工具走同一套管线,幂等跳过、增量续写、force、上下文预算的语义一致。

2. 按来源导入文件或目录

每个 import_* 都接受 path。目录会递归扫描,每个文件或每段对话变成独立会话:

import_claude({ path: "~/.claude/projects" })
import_codex({ path: "~/.codex/sessions" })
import_chatgpt({ path: "~/Downloads/chatgpt-export/conversations.json" })
import_opencode({ path: "~/.local/share/opencode/opencode.db" })
import_local_jsonl({ path: "~/downloads/session.jsonl" })

先预览、不落盘:

import_claude({ path: "~/.claude/projects", preview: true })

ChatGPT 导出若要还原全部分支,用 import_chatgpt({ path: "...", branch: "all" }),每条 root→leaf 分支会变成独立会话。

斜杠命令等价写法(短名、来源 id 或完整工具名都可以):

/import claude ~/.claude/projects
/import-all

3. 打开导入的会话继续聊

刷新会话列表,找到新会话(默认 id 形如 import-<源sessionId>),打开后从源记录停下的地方继续。需要交接而不是整段导入时:

/resume-claude id:282095ab-1111-4222-8333-444455556666
/resume-codex 修复登录

空参数取最近一条;多条匹配时会列出候选。仓库明确把外部 transcript 当不可信历史:不复述 system / developer / thinking,旧工具输出视为过期证据。

4. 导出、备份、校验

export_claude({ sessionId: "import-019f5f27-…" })
export_codex({ sessionId: "…", dryRun: true })
export_bundle({ sessionId: "import-019f5f27-…" })
restore_bundle({ path: "~/backup/sess.dshbundle.json", preview: true })
verify_session({ sessionId: "import-019f5f27-…" })
sync_to_claude({ sessionId: "import-019f5f27-…", dryRun: true })

export_bundle 默认写到 ~/.dsh/exports/<id>.dshbundle.json。跨机器还原前建议先 preview: true

适用场景与注意事项

比较适合这几类用法:

  • 已经在 Claude Code、Codex、Cursor、Reasonix 等工具里积累了项目会话,希望把工作区迁到 DeepSeek Harness,还想保留工具调用和思考过程。
  • 需要在 DSH、Claude Code、Codex、Kimi 之间做格式互转,或用 .dshbundle.json 做跨机器备份。
  • 批量搬迁前想先 scan_discoverpreview: true 看清楚,再正式导入。

使用前要注意:

  1. 权限与沙箱。插件以当前 dsh 进程权限运行;读工作区外的历史文件、写导出目录,都要沙箱放行。安装前阅读 仓库源码 和 MIT 许可证。
  2. 只读源、不自动删。导入不改写源 JSONL / 数据库;卸载插件也不删除已导入会话。retract_import 只清登记记录并提示你手动删。
  3. 双向同步默认关。面板里的 External → DSH 和 DSH → External 不会在安装后自动开。写回 Claude Code 时优先用 dryRun 看守卫结果。
  4. 运行时版本。需要 Node.js >= 22.13,以及 dsh 0.1.x(文档实测 rc.6)。客户端面板面向 web profile。
  5. 失败会上报,不会静默吞。畸形行、疑似敏感信息按位置计数(只报行号和 kind,不输出内容);格式保不住的字段和导出有损项都会出现在结果里。
  6. 路线图未完成项。README 仍把「Codex 官方 App Server API 源」标为未完成(REQ-52),当前 Codex 导入走的是 rollout JSONL 路线。

小结

dsh-chat-import 把外部 Agent 的会话文件变成 DeepSeek Harness 里可 resume 的会话,并补上导出、bundle 备份和交接摘要。它是社区 MIT 插件,不是 DeepSeek 官方组件;目录页只负责收录和给出安装命令。

安装入口以目录页为准:

dsh plugin add github:Nwflower/dsh-chat-import

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-chat-import/

GitHub:https://github.com/Nwflower/dsh-chat-import

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜