dsh-claude-move 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.zh.md CHANGED
@@ -1,311 +1,285 @@
1
- # dsh-claude-move
2
-
3
- **迁移到 DeepSeek Harness,不丢 Claude Code 历史。** 一次安装,把 Claude 的全部会话、记忆、技能与 `CLAUDE.md` **复制**进 DSH,生成可续聊的会话——并归入专用 `claudecode` 工作区(按项目各建工作区为可选配置)。
4
-
5
- `复制式迁移` · `无缝续聊` · `按项目划分工作区` · `与 Claude Code 实时同步`
6
-
7
- [![Test](https://github.com/PerryLink/dsh-claude-move/actions/workflows/test.yml/badge.svg)](https://github.com/PerryLink/dsh-claude-move/actions/workflows/test.yml)
8
- [![npm version](https://img.shields.io/npm/v/dsh-claude-move)](https://www.npmjs.com/package/dsh-claude-move)
9
- [![npm downloads](https://img.shields.io/npm/dm/dsh-claude-move)](https://www.npmjs.com/package/dsh-claude-move)
10
- [![Node ^22.19 || >=24](https://img.shields.io/static/v1?label=node&message=%5E22.19%20%7C%7C%20%3E%3D24&color=2f7d4f)](https://nodejs.org)
11
- [![License: Apache-2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
12
- [![Topic: dsh](https://img.shields.io/badge/topic-dsh-3fb950)](https://github.com/topics/dsh)
13
- [![Topic: dsh-plugin](https://img.shields.io/badge/topic-dsh--plugin-3fb950)](https://github.com/topics/dsh-plugin)
14
- [![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/PerryLink/dsh-claude-move/issues)
15
-
16
- ![dsh-claude-move 社交分享卡](assets/social-card.png)
17
-
18
- [English](README.md) | 中文 | [Español](README.es.md) | [Português](README.pt.md) | [हिन्दी](README.hi.md)
19
-
20
- > 开发者预览版(0.1.0)。路线图与设计:[PLAN.md](PLAN.md) · 变更记录:[CHANGELOG.md](CHANGELOG.md)。
21
-
22
- ## ✨ 特性
23
-
24
- - 🔍 **自动发现** —— 定位 Claude 数据根目录(`$CLAUDE_CONFIG_DIR`,缺省 `~/.claude`),索引全部项目/会话(标题、起止时间、消息与工具调用数)、目录与 git 状态、记忆、技能、全局 `CLAUDE.md` 与 `settings.json`;增量缓存只重读变化文件。
25
- - 📥 **全保真历史导入** —— 平衡、可继续(resume)的 DSH 会话(`turn/start step/start → user/message → assistant/message → tool/call → tool/result → step/end → turn/end`),畸形行带行号;中断的工具调用会被修复,保证每个 `tool_use` 恰好对应一个结果(续聊不再永久 400)。
26
- - 🗂 **单个 `claudecode` 工作区(默认)** —— 每个导入会话都落到专用 "claudecode" 工作区,根目录是新建文件夹(默认 `$DSH_HOME/claudecode`;这是插件唯一会创建的东西)。`workspaceMode: 'per-project'` 可恢复按项目各建工作区的分组方式。
27
- - 🔁 **复制式 + 增量** —— 两边都不移动、不改写、不删除任何内容;重跑导入只把新增轮次续写进同一 DSH 会话;`force: true` 以新 id 另存一份完整副本。
28
- - 🧠 **个人上下文持续生效** —— 记忆注入为动态提示词段、Claude 技能注册为真正的 DSH 技能(技能发现会跳过 `README.md` 等非技能文档)、全局 + 项目级 `CLAUDE.md` 前置注入。即便在 `claudecode` 工作区内,也会记住原始项目目录用于记忆/`CLAUDE.md` 解析。
29
- - ⚡ **与运行中的 Claude Code 实时同步** —— 两个工具并行使用,每次重跑只同步变化部分。
30
- - 🖥 **Web 面板与一键命令** —— `/claude-import-all`、`/resume-claude` 与带进度的悬浮迁移面板。
31
- - 🪄 **四合一迁移向导(0.2.1)** —— 一条 `/move` 向导加 `move_detect` / `move_preview` / `move_run` 三个工具,迁移 Claude Code、Codex、OpenCode 与 Hermes:记忆/指令变成带标记的 `AGENTS.md` 管理段,技能变成真正的 DSH 技能,斜杠命令变成 DSH 命令,会话变成可续聊的 DSH 会话——审批门 + 幂等(`move.json`)+ 冲突出 diff 不猜。
32
- - 🛡 **安全优先** —— 源文件严格只读、DSH 日志 append-only、疑似凭据只报位置、权限类记录只统计不导入。
33
-
34
- ## 🚀 快速开始
35
-
36
- ```sh
37
- # 1. 安装
38
- dsh plugin --profile web add -w github:PerryLink/dsh-claude-move
39
- ```
40
-
41
- 2. 在任意 DSH 会话里跑一条命令:
42
-
43
- ```
44
- /claude-import-all # 扫描 复制全部 Claude 会话 报告
45
- ```
46
-
47
- 3. 把已打开的 Web 页面刷新一次(面板自带「刷新会话列表」按钮),点开任意已导入会话即可继续。**全程无需重启 DSH**——见[导入之后](#-导入之后)。
48
-
49
- 想要精细控制?
50
-
51
- ```
52
- claude_scan # 全部项目/会话的结构化索引
53
- import_claude { path: "~/.claude/projects" } # 单个项目目录(递归)
54
- import_claude { path: "all" } # 全量
55
- ```
56
-
57
- ## 🪄 四合一迁移向导
58
-
59
- ```text
60
- /move # 一键向导:检测 预览 执行 → 报告(四源全部)
61
- move_detect # 扫描 Claude Code / Codex / OpenCode / Hermes
62
- move_preview # 逐项计划:new | unchanged | changed | conflict(带 diff)| unsupported
63
- move_run # 审批门后执行;冲突解法:skip | overwrite | rename | merge(默认 skip,绝不猜测)
64
- ```
65
-
66
- - **四源** —— Claude Code(`~/.claude`)、Codex(`~/.codex`)、OpenCode(数据 + 配置根)、Hermes(技能/记忆根);每源独立解析器 + 映射器。
67
- - **映射** —— 记忆/指令 → DSH 全局 `AGENTS.md` 的只追加管理段(每条一个带标记段);技能 → 真正的 DSH 技能(`SKILL.md` 目录束原样复制,其他格式转换);斜杠命令 → 注册为 DSH 命令(重启后按 `move.json` 重建提示词);会话 → 可续聊 DSH 会话(复用一期导入器)。
68
- - **幂等** —— 每项已执行计划记录在 `$DSH_HOME/claude-move/move.json`(`digest` / `targetDigest` / `appliedAt`);重跑跳过未变项,`force` 重新应用。
69
- - **审批门** —— 任何将产生写入的执行先问 `ctx.approval`;非 `allowed-once` 一律零写入。
70
-
71
- ## 🗂 迁移内容对照
72
-
73
- ```
74
- ~/.claude(只读)
75
- ├─ projects/*/*.jsonl ──→ 可续聊的 DSH 会话,归入同一个 "claudecode" 工作区(默认)
76
- ├─ projects/*/memory/ ──→ 动态系统提示词记忆段(每次请求重读)
77
- ├─ skills/** ──→ 真正的 DSH 技能
78
- └─ CLAUDE.md + settings ──→ 前置提示词段 + 配置建议(绝不代写)
79
- ```
80
-
81
- | Claude Code | 落到 DSH 成为 |
82
- | --- | --- |
83
- | 会话 transcript(`projects/*/*.jsonl`) | 平衡、可继续(resume)的 DSH 会话——user/assistant/tool/thinking 全保真映射,含中断工具调用修复——归入同一个 **`claudecode` 工作区**(默认 `$DSH_HOME/claudecode`)或按项目各建工作区(`workspaceMode: 'per-project'`) |
84
- | 记忆文件(`projects/*/memory/*.md`) | 动态系统提示词上下文段,每次请求重读(`feedback > project > reference > user`)——即便在 `claudecode` 工作区内也记住原始项目目录 |
85
- | 技能(`~/.claude/skills/**`) | 真正的 DSH 技能(kebab 命名、冲突加后缀、默认上限 30;`README.md`/`MEMORY.md` 与无描述的文件会被跳过) |
86
- | `CLAUDE.md`(全局 + 项目级) | 前置提示词段;项目级优先 |
87
- | `settings.json` | DSH 配置建议 + 显式的无法映射键清单 |
88
- | 项目状态(目录、git 分支与脏行数) | 展示在扫描索引、Web 面板徽标与 `/resume-claude` 交接摘要里 |
89
-
90
- ## 📦 安装
91
-
92
- ```sh
93
- # 从 GitHub
94
- dsh plugin --profile web add -w github:PerryLink/dsh-claude-move
95
-
96
- # 本地源码(开发推荐)
97
- dsh plugin --profile web add -w link:/path/to/dsh-claude-move
98
-
99
- # 打包 tarball
100
- dsh plugin --profile web add -w ./dsh-claude-move-0.1.0.tgz
101
- ```
102
-
103
- ESM、无构建步骤:git 安装无需 `prepare` 脚本与 `allowBuilds` 白名单。官方打包安装指南见[这里](https://deepseek-harness.github.io/deepseek-harness/develop/basic/publish)。
104
-
105
- ## 🛠 使用
106
-
107
- 在挂载本插件的会话里调用工具:
108
-
109
- ```
110
- claude_scan # 全量扫描(增量缓存)
111
- claude_scan { path: "~/.claude/projects/<slug>" } # 局部扫描
112
- claude_scan { refresh: true } # 忽略缓存全量重扫
113
-
114
- import_claude { path: "~/.claude/projects/<slug>/<sessionId>.jsonl" } # 单个会话
115
- import_claude { path: "~/.claude/projects" } # 目录批量(递归)
116
- import_claude { path: "all" } # 全量批量
117
- # 可随时重复运行:未变化跳过;源文件增长则只把新轮次续写到同一会话。
118
- import_claude { path: "...", force: true } # 以 import-<src>-<n> 另存一份完整副本(旧副本保留)
119
- ```
120
-
121
- 命令(用户直接触发,不经模型回合):
122
-
123
- ```
124
- /claude-import-all # 一键全量:扫描 导入 报告 注入当前会话
125
- /resume-claude latest # 继续最近的 Claude 会话
126
- /resume-claude <会话ID> # 按源会话 id 或 import-<src> id
127
- /resume-claude <关键词> # 匹配标题;多个命中列出候选,绝不猜测
128
- ```
129
-
130
- Web 面板:右下角悬浮「🐳 Claude 迁移」按钮打开面板——项目/会话树(状态徽标:未导入/已导入/源缺失/目录不存在/git 脏)、关键词过滤、单会话「导入并继续」与「刷新会话列表」、批量导入实时进度条。数据走插件自注册的 `/api/claude-move/*` JSON 路由(公开 `ctx.webServer` seam)。
131
-
132
- - **扫描**返回结构化 JSON 索引:项目(slug/cwd/目录存在性/git 分支与脏行数)、会话(标题/起止时间/消息与工具调用数/畸形行数)、记忆、技能、全局 CLAUDE.md 与 settings.json;每个会话带 `import.status`(`none`/`imported`/`source-missing`);`settingsSuggestions` 是 settings.json 的 DSH 翻译建议与无法映射项(见 [COMPLIANCE.md](COMPLIANCE.md))。
133
- - **导入**全保真映射 user/assistant/tool/thinking,中断的工具调用会被修复(每个 `tool_use` 恰好一个结果),产物是可继续的平衡会话,默认挂接到 `claudecode` 工作区(或按项目各建工作区);批量逐文件汇总(`imported`/`appended`/`already-imported`/`skipped`/`failed`),畸形行带行号、疑似凭据只报位置(文件:行:类型)、权限类记录只统计不导入。导入绝不删除/改写任何东西:DSH 既有会话原样不动、旧导入副本保留、Claude 源文件从不写入。
134
- - **个人上下文自动生效(无需导入动作)**:
135
- - 记忆:全部 `projects/*/memory/*.md` 注入动态上下文段,每次请求按 mtime 重读(新记忆即时生效),`feedback > project > reference > user` 排序,默认 8KB 上限;在 `claudecode` 工作区内,插件会从记录的 `sourceCwd` 解析出原始项目。
136
- - 技能:`~/.claude/skills/**/SKILL.md`(+ 扁平 `*.md`)注册为 DSH 技能(kebab 归一化、冲突加后缀、上限 30;`README.md`/`MEMORY.md` 与无描述的文件会被跳过,绝不破坏技能加载),catalog 注入与 `skill` 工具由 DSH 负责;
137
- - 指令:全局 `~/.claude/CLAUDE.md` + 当前会话 cwd `.claude/CLAUDE.md` 注入前置段(项目优先;在 `claudecode` 工作区内经 `sourceCwd` 解析)。
138
-
139
- ## 导入之后
140
-
141
- **不需要重启 DSH。** 导入经公开 `sessionPersistence` 服务即时落盘:
142
-
143
- - 服务端列表(`session.list` / `workspace.list` RPC、CLI、任何新打开的页面)立即可见已导入会话,归入 **`claudecode` 工作区**(`workspaceMode: 'per-project'` 时按项目各建工作区)。
144
- - 面板会经 shell 官方客户端服务(`sessions.refresh`/`workspaces.refresh`,特性探测)自动刷新已打开页面的会话列表,并为每个会话提供「打开会话」按钮;老 shell 无这些服务时回退「刷新会话列表」按钮 / 整页刷新——导入直接写入持久化服务的 cold 会话,不会发 UI 的 `host/session-added` 实时帧;工作区分组则会实时更新(`host/workspace-changed`)。
145
- - 导入的会话可立即打开、阅读与续聊——`/resume-claude`,或直接在会话列表中点开。交接摘要会标明原始项目目录。之后随时重跑导入,只会把新增轮次增量续写进同一会话。
146
-
147
- ## ⚙️ 配置(全部可选,可在 cordis.yml 覆盖)
148
-
149
- ```yaml
150
- - id: claude-move
151
- name: dsh-claude-move
152
- config:
153
- claudeHome: null # 缺省自动定位 $CLAUDE_CONFIG_DIR / ~/.claude
154
- workspaceMode: claudecode # 'claudecode'(默认:全部导入挂到一个专用工作区)| 'per-project'(按源 cwd 各建工作区)
155
- claudecodeDir: null # claudecode 工作区目录;默认 $DSH_HOME/claudecode(插件唯一会创建的文件夹)
156
- scanGit: true # git 探测级别:true 全量 | 'branch' git 子进程 | false 关闭
157
- gitTimeoutMs: 5000 # git 子进程超时(毫秒)
158
- scanConcurrency: 8 # 全量扫描的项目并发上限
159
- maxTranscriptBytes: 67108864
160
- excludeProjects: [] # slug 子串排除,如 ['demo-']
161
- enableMemory: true
162
- memoryMaxBytes: 8192
163
- memoryScope: current-project # 'current-project' 只注入当前项目 | 'all' 全部、当前项目优先
164
- enableSkills: true
165
- maxSkills: 30
166
- extraSkillDirs: []
167
- enableInstructions: true
168
- resumeMaxChars: 2048 # 交接摘要字符上限
169
- resumeMode: inject # 'inject' 注入交接摘要 | 'agents' 经 ctx.agents.resume 打开会话
170
- enableWebPanel: true # 注册 /api/claude-move/* 面板路由
171
- importConcurrency: 4 # 批量导入「读取+转换」并发上限(落盘保持串行)
172
- # 四合一迁移向导(0.2.1+):
173
- requireApproval: true # 向导写入先问 ctx.approval(仅 allowed-once)
174
- codexHome: null # 缺省:$CODEX_HOME ~/.codex
175
- opencodeDataHome: null # 缺省:平台 XDG 数据目录/opencode
176
- opencodeConfigHome: null # 缺省:平台 XDG 配置目录/opencode
177
- hermesHome: null # 缺省:$HERMES_HOME ~/.hermes
178
- skillsDir: null # 向导技能落点;缺省 $DSH_HOME/skills
179
- agentsMdPath: null # 向导记忆/指令落点;缺省 $DSH_HOME/AGENTS.md
180
- moveWorkspaceMode: per-source # 'per-source' | 'single' 向导导入工作区分组
181
- ```
182
-
183
- ## 🗑 卸载
184
-
185
- profile 的 bundles 移除 `claude-move` 行并重启 dsh。已导入会话保留在 DSH 数据目录;本插件只在 `$DSH_HOME/claude-move/` 写索引缓存与导入映射、还会写 `claudecode` 工作区文件夹,绝不触碰 Claude 源数据。
186
-
187
- ## 🧭 兼容性
188
-
189
- - 目标 `dsh 0.1.0-rc.6`(web profile);peer 依赖锁定 rc.6;Node `^22.19 || >=24`。
190
- - 最后验证 **2026-08-13**(Windows / Node 22,针对 `@deepseek-ai/dsh@0.1.0-rc.6`):tarball 从零安装、真实扫描(40 项目 / 2387 会话)、真实批量导入 13/13 + 幂等重导入 13/13、工作区挂接与持久化产物确认。macOS/Linux 现由 CI 矩阵(linux/macos/windows × Node 22)自动验证。
191
- - 验证 **2026-08-14**(当前 `deepseek-harness` checkout,web profile / JSONL+zstd 会话后端 / 真实工作区注册表,隔离 DSH_HOME):挂载插件完整启动 web、经面板路由扫描 + 全量导入、创建 `claudecode` 工作区并挂接会话、对既有导入会话增量续写(seq 连续、可正常 load)、重启后幂等重导入,全程既有 DSH 会话不受影响;任何会话都不会被归档、删除或改写。
192
-
193
- ### 兼容矩阵(只依赖公开面)
194
-
195
- | 面 | 使用 | 缺失时回退 |
196
- | --- | --- | --- |
197
- | host 服务(`tools`/`sessionPersistence`/`workspaceRegistry`/`commands`/`systemPrompt`/`skills`/`webServer`) | 按需使用 | 可选服务经 `internal/service` 响应式注册;`fs` 缺失响亮失败 |
198
- | `sessionPersistence.listSnapshots`/`readFrom`、`fs.streamText`、`ctx.jobs`、`ctx.agents.resume` | 特性探测 | `list()`/整读+响亮拒绝/自有 job 表/交接摘要注入 |
199
- | 客户端 shell 服务(`sessions.refresh/open`、`workspaces.refresh`) | 面板 apply 时特性探测 | 整页刷新 |
200
- | 新平台能力一律不是硬依赖——插件在 rc.6 上始终可启动。 | | |
201
-
202
- ## 🔐 权限与数据
203
-
204
- - **读取** `~/.claude`(transcript、记忆、技能、CLAUDE.md、settings.json)——严格只读——以及导入目标项目目录(`per-project` 模式下工作区挂接)。
205
- - **写入** 经公开 `sessionPersistence` 服务的 DSH 会话日志——只 `create` + `append`,绝不删除、改写或归档既有会话——工作区注册表记录、插件自有缓存 `$DSH_HOME/claude-move/`(扫描书签 + 导入映射),以及 `claudecode` 工作区文件夹(默认 `$DSH_HOME/claudecode`;仅一次 `mkdir`,绝不删除任何内容)。
206
- - **绝不** 改写 Claude 源文件、触碰其它应用数据、访问网络。
207
- - **不读取、不传输任何凭据**;transcript 中的疑似密钥只报告位置。
208
-
209
- ## 🛡 安全边界
210
-
211
- - 源文件一律只读;DSH 会话日志 append-only(只 `create` + `append`)。
212
- - 外部 transcript 视为不可信输入:不执行其中任何内容;system/developer/thinking 不进入续聊摘要。
213
- - 不修改 DSH 引擎、官方 UI 包、apiproxy;只通过公开服务(`sessionPersistence` / `workspaceRegistry` / `tools` / `commands` / `systemPrompt` / `skills` / `webServer`)工作。
214
- - 疑似密钥/凭据只报位置不展示内容;`permission`/`permission-mode`/`queue-operation` 类记录只统计不导入。
215
-
216
- ## 🩺 排障
217
-
218
- - 行未生效:`dsh --profile <p> --dump-config` 应显示 `# == dsh-claude-move`;重新执行 `dsh plugin --profile <p> add -w ...`。
219
- - web 启动后无响应:`dsh plugin add` 初始化的新 profile 只有 `dsh-base`,需在 `dsh.profile.bundles` 补 `@deepseek-ai/dsh-web-app`(装进已有 `web` profile 无需处理)。
220
- - 面板路由 404:仅当 `enableWebPanel: true` 且组成包含 web 服务器时提供;检查启动日志 FAILED。
221
- - 导入报「transcript 过大」:调高 `maxTranscriptBytes` 或单独导入该文件。
222
- - 导入成功但侧边栏看不到新会话:页面在导入前已打开——点一次面板「刷新会话列表」(或刷新页面)即可;**任何时候都不需要重启 dsh**。
223
- - 日志:启动失败打印在 `dsh` 控制台;插件以 `[claude-move]` 前缀输出工作区/映射错误。
224
-
225
- ## 📚 文档
226
-
227
- - [PLAN.md](PLAN.md) 研究结论与实施方案。
228
- - [ARCHITECTURE.md](ARCHITECTURE.md) 架构图与完整数据映射表。
229
- - [COMPLIANCE.md](COMPLIANCE.md) 对照官方插件约束的逐条审计(deepseek-harness 仓库与文档、[deepseek.com/harness](https://www.deepseek.com/harness/)、[开发者文档](https://deepseek-harness.github.io/deepseek-harness/develop/basic/)、[Cordis](https://github.com/cordiverse/cordis) [Cordis 论文](https://github.com/cordiverse/paper))。
230
- - [OPTIMIZATION.md](OPTIMIZATION.md) 实测基线 + 分优先级的优化候选。
231
- - [RELEASE.md](RELEASE.md) 发布清单与验收证据。
232
- - [CHANGELOG.md](CHANGELOG.md) — 各版本变更记录。
233
-
234
- ## 🙏 复用与出处(开源组件)
235
-
236
- 本仓库按 Apache License 2.0 许可;下列 MIT 许可组件保留各自许可证(全文见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)):
237
-
238
- - 转换核心 vendored 自 [Nwflower/dsh-chat-import](https://github.com/Nwflower/dsh-chat-import)(MIT)。
239
- - 发现约定与安全模型沿用 [Demogorgon314/dsh-resume-plugin](https://github.com/Demogorgon314/dsh-resume-plugin)(MIT;其 session_reader.py 另有 Apache-2.0 上游出处,见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md))。
240
- - memory/skills 注入与 frontmatter 解析沿用 [YYTbit/dsh-plugin-claude-bridge](https://github.com/YYTbit/dsh-plugin-claude-bridge)(MIT)。
241
-
242
- ## 🧑‍💻 开发
243
-
244
- ```sh
245
- npm install # peer 依赖:@deepseek-ai/cordis、@deepseek-ai/dsh-tools@0.1.0-rc.6、@deepseek-ai/schemastery
246
- npm test # node --test:convert(vendored + 扩展)、discovery、import/report、context、settings
247
- ```
248
-
249
- CI GitHub Actions([test.yml](.github/workflows/test.yml))在 Node 22 上跑完整套件。
250
-
251
- ## 🧠 Model Experience
252
-
253
- - 模型可见面 = 两个工具的 description/schema 与输出:`claude_scan` 返回结构化索引,`import_claude` 返回逐文件汇总与告警位置;工具结果本身即落盘的 `tool/result`,全部可重建。
254
- - 无隐藏模型文本;memory/CLAUDE.md 段注册于 `ctx.systemPrompt`(提示词组装,可随会话日志重建)。
255
-
256
- ## ⚠️ 已知局限
257
-
258
- - 标题只取 `custom-title`/`ai-title`/首问;Claude `summary` 记录不作为标题。
259
- - `thinking` 块保留在导入日志的 `reasoning` 内容块中,但不进入续聊摘要。
260
- - 中断的工具调用会被修复为合成的错误结果(绝不丢弃),因此中途中断的会话仍可续聊——修复会报告为 `repaired.synthesized`。
261
- - 权限类记录只统计不导入;DSH 权限预设建议随报告生成。
262
- - Claude `summary` 记录(上下文压缩摘要)只报告、不映射为 DSH compaction 节点——合成压缩事务需伪造 seq 范围与检查点消息,风险大于收益(见 OPTIMIZATION.md);完整历史按原始轮次导入。
263
- - host 无 `fs.streamText` 流式面时,超过 `maxTranscriptBytes` transcript 响亮失败而非部分导入;有流式面的环境自动走分块流式导入。
264
- - 在 `workspaceMode: 'per-project'` 下,源目录已删除的会话仍可导入,但工作区挂接失败(留在「未分组」,报告 `workspace.attached: false` 并附 `reason`);默认的 `claudecode` 工作区不依赖源目录,因此此类会话在其中正常挂接。
265
- - 批量导入中断可安全重跑(幂等、append-only):已完成文件跳过、已增长文件只续写新轮次。
266
- - 若源文件被原地重置/截断(轮次少于已导入记录),重导跳过并报 `sourceShrunk`;需要完整副本用 `force: true`。
267
- - Web 面板为零构建悬浮面板,走插件自注册 JSON 路由;不使用 shell 内部 UI slot(刻意不依赖 rc.6 未文档化内部面)。
268
- - 流式增量续写时,单次结果的 `messages`/`toolCalls` 只统计本次新增事件(已存储前缀不重读);`turns` 仍为全量轮次。
269
-
270
- ## 🤝 参与贡献与反馈
271
-
272
- 欢迎提 Issue 与 PR——请使用对应模板([缺陷报告](.github/ISSUE_TEMPLATE/bug-report.yml)、[功能请求](.github/ISSUE_TEMPLATE/feature-request.yml))。问题与讨论在仓库的 [GitHub Discussions](https://github.com/PerryLink/dsh-claude-move/discussions)。安全问题请通过 GitHub Security Advisories(仓库 Settings Security)私下报告,详见 [SECURITY.md](SECURITY.md)。
273
-
274
- ## 💛 贡献者致谢
275
-
276
- 感谢每一位让这个插件变得更好的人:
277
-
278
- - [OLDnana1](https://github.com/OLDnana1) —— 定位了「中断工具调用」导致导入会话续聊永久 400 的根因([#1](https://github.com/PerryLink/dsh-claude-move/issues/1)),已于 v0.2.0 修复。
279
- - [GooodWei](https://github.com/GooodWei) —— 发现 `README.md`(及任何无描述的 `.md`)被误注册为技能、导致 DSH 技能加载整体失败([#1](https://github.com/PerryLink/dsh-claude-move/issues/1)),已于 v0.2.0 修复。
280
- - 本插件所复用的 MIT 上游项目在[署名](#-attribution-open-source-components)与 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) 中致谢。
281
-
282
- ## 🔗 相关链接
283
-
284
- - DeepSeek Harness:[仓库](https://github.com/deepseek-ai/deepseek-harness) · [官网](https://www.deepseek.com/harness/) · [开发者文档](https://deepseek-harness.github.io/deepseek-harness/develop/basic/)
285
- - 插件生态:[`dsh` topic](https://github.com/topics/dsh) · [`dsh-plugin` topic](https://github.com/topics/dsh-plugin) · [Discord](https://discord.gg/Ycq5dCaS4)
286
-
287
- ## 📄 License
288
-
289
- Apache License 2.0 — 见 [LICENSE](LICENSE) 与 [NOTICE](NOTICE)。第三方声明(含 MIT 组件的 MIT 原文)见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。
290
-
291
- ## PerryLink DSH 插件家族
292
-
293
- 本项目是 [PerryLink](https://github.com/PerryLink) 维护的 [15 个 DeepSeek Harness 插件](https://github.com/PerryLink)之一。如果你觉得这个插件有用,其余的很可能同样有用:
294
-
295
- | 插件 | 一句话说明 |
296
- |---|---|
297
- | [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | 只读 MCP 运行时面板:/mcp 命令 + 设置页,状态/工具/错误一览 |
298
- | [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | 工程纪律守门:需求审讯、测试证据门、对抗评审 |
299
- | [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | 持久化后台子代理:Web 侧边栏进度、随时留言与打断 |
300
- | [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | 基于语言服务器的诊断/格式化/补全/代码动作/重命名 |
301
- | [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | 对标 Claude Code outputStyles 的运行时风格切换 |
302
- | [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | 对标 Claude Code /rewind:快照、会话 fork、一键回退 |
303
- | [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Claude Code 风格声明式 allow/deny/ask 权限规则,带审计 |
304
- | [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | 审批链上的第二模型自动审查,默认 fail-closed |
305
- | [dsh-memento](https://github.com/PerryLink/dsh-memento) | 带审批门的跨会话记忆:ctx.memory + SQLite + memory 工具 |
306
- | [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | 安全审计技能包:密钥扫描、依赖与供应链审查 |
307
- | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | 在 Web 侧边栏置顶会话,持久排序 |
308
- | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Web 作曲器终端式输入历史:方向键、Ctrl+R 搜索 |
309
- | [dsh-github](https://github.com/PerryLink/dsh-github) | DSH 的 GitHub PR/issue 集成,所有写操作经审批门 |
310
- | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | 插件开发知识库,随 bundle 安装的按需 agent 技能 |
311
- | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 把 Claude Code 会话、记忆、技能和 CLAUDE.md 迁入 DSH |
1
+ <div align="center">
2
+
3
+ # 🚚 dsh-claude-move
4
+
5
+ **将 Claude Code、Codex、OpenCode Hermes 迁移到 DeepSeek Harness —— 将会话、记忆、技能、指令和斜杠命令复制为可续聊的 DSH 会话,只复制、审批门控。**
6
+
7
+ *迁移时保留你的 Claude Code 历史:一次安装、可续聊会话、与运行中的 Claude Code 实时同步,以及一个四来源迁移向导。*
8
+
9
+ [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
10
+ [![DSH plugin](https://img.shields.io/badge/dsh-plugin-✅-green)](https://github.com/topics/dsh-plugin)
11
+ [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
12
+ [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-claude-move/test.yml?branch=master&label=CI)](https://github.com/PerryLink/dsh-claude-move/actions)
13
+ [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-claude-move?label=version)](https://github.com/PerryLink/dsh-claude-move/releases)
14
+ [![npm version](https://img.shields.io/npm/v/dsh-claude-move)](https://www.npmjs.com/package/dsh-claude-move)
15
+ [![npm downloads](https://img.shields.io/npm/dm/dsh-claude-move)](https://www.npmjs.com/package/dsh-claude-move)
16
+
17
+ [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
18
+
19
+ </div>
20
+
21
+ ---
22
+
23
+ ## 兼容性
24
+
25
+ - 面向 `dsh 0.1.0-rc.6`(web profile);peer 依赖锁定在 `0.1.0-rc.6`。Node `^22.19 || >=24`。
26
+ - 最近针对全新 tarball 安装验证:真实扫描、真实批量导入(幂等重导入)、工作区挂载与持久化产物均已确认;macOS/Linux CI 矩阵覆盖。
27
+
28
+ ### 兼容性矩阵(仅公开接缝)
29
+
30
+ | 接缝 | 使用 | 缺失时的回退 |
31
+ |---|---|---|
32
+ | Host 服务(`tools` / `sessionPersistence` / `workspaceRegistry` / `commands` / `systemPrompt` / `skills` / `webServer`) | 所列之处必需 | 可选服务响应式注册;缺失 `fs` 大声失败 |
33
+ | `sessionPersistence.listSnapshots` / `readFrom` / 支持 `streamText` 的 `fs` / `ctx.jobs` / `ctx.agents.resume` | 特性探测 | `list()` / 整文件读取并大声拒绝 / 自有 job map / 交接注入 |
34
+ | Client shell 服务(`sessions.refresh/open`、`workspaces.refresh`) | 面板 apply 时特性探测 | 整页刷新 |
35
+ | 较新的平台能力从不是硬性要求 —— 插件在 rc.6 上始终保持可启动。 | | |
36
+
37
+ ## 你能获得什么
38
+
39
+ 1. **自动发现** —— `claude_scan` 定位 Claude 数据根(`$CLAUDE_CONFIG_DIR`,回退 `~/.claude`)并索引每个项目/会话、记忆、技能、全局 `CLAUDE.md` 和 `settings.json`,带增量缓存和并行扫描(`scanConcurrency`)。
40
+ 2. **全保真导入** —— `import_claude` 将 transcript 转换为均衡、可续聊的 DSH 会话(`turn/start → step/start → user/message → assistant/message → tool/call → tool/result → step/end → turn/end`),修复被中断的工具调用,并以分块流式导入超过 `maxTranscriptBytes` 的 transcript。
41
+ 3. **一个 `claudecode` 工作区** —— 每个导入的会话都落到一个专用工作区(默认 `$DSH_HOME/claudecode`);`workspaceMode: 'per-project'` 恢复每个项目一个工作区的分组方式。
42
+ 4. **只复制且增量** —— 两侧都不会被移动、改写或删除;重新运行只追加新的轮次(`force: true` 以新 id 额外保存一份完整副本)。
43
+ 5. **个人上下文,始终新鲜** —— 记忆作为实时提示词段落注入,Claude 技能注册为真正的 DSH 技能(全局 + 项目级),全局 + 项目 `CLAUDE.md` 提前注入。
44
+ 6. **四来源迁移向导** —— `/move` 加上 `move_detect` / `move_preview` / `move_run` 迁移 Claude Code、Codex、OpenCode Hermes,审批门控且幂等(`move.json`)。
45
+ 7. **Web 面板与命令** —— `/claude-import-all`、`/resume-claude`、`/claude-move-reset`,以及一个浮动迁移面板。
46
+
47
+ ## 四来源迁移向导
48
+
49
+ ```text
50
+ /move # 一次性向导:检测 → 预览 → 执行 → 报告(全部四个来源)
51
+ move_detect # 扫描 Claude Code / Codex / OpenCode / Hermes
52
+ move_preview # 逐项计划:new | unchanged | changed | conflict(含 diff)| unsupported
53
+ move_run # 在审批门控之后执行;冲突解决:
54
+ # skip | overwrite | rename | merge (默认 skip —— 绝不猜测)
55
+ ```
56
+
57
+ - **来源** —— Claude Code(`~/.claude`)、Codex(`~/.codex`)、OpenCode(数据 + 配置根)、Hermes(技能/记忆根);每个来源都有自己的 parser + mapper。
58
+ - **映射** —— 记忆/指令 → 追加到 DSH 全局 `AGENTS.md` 的仅追加受管段落(每项一个标记段落);技能 → 真正的 DSH 技能(`SKILL.md` 包原样复制,其他格式转换);斜杠命令 → 已注册的 DSH 命令(重启后从 `move.json` 重建);会话 → 可续聊的 DSH 会话(与阶段 1 相同的导入器)。
59
+ - **幂等** —— 每个已应用的计划都记录在 `$DSH_HOME/claude-move/move.json`(`digest` / `targetDigest` / `appliedAt`);重新运行跳过未变更项,`force` 重新应用它们。
60
+ - **审批门控** —— 任何会写入内容的运行都先询问 `ctx.approval`;除 `allowed-once` 之外的任何结果都意味着零写入。
61
+
62
+ ## 快速开始
63
+
64
+ ```sh
65
+ # 1. 将 bundle 安装到你的 profile
66
+ dsh plugin --profile web add "github:PerryLink/dsh-claude-move#master"
67
+
68
+ # 或从 npm 安装(已发布版本)
69
+ dsh plugin --profile web add dsh-claude-move
70
+
71
+ # 2. 重启并验证该行
72
+ dsh --profile web --dump-config | grep -A4 'id: claude-move'
73
+ ```
74
+
75
+ 然后,在任意 DSH 会话中运行一条命令:
76
+
77
+ ```sh
78
+ /claude-import-all # 扫描 复制每个 Claude 会话 报告
79
+ ```
80
+
81
+ 导入后无需重启 DSH —— 刷新一次已打开的 Web 页面,点击任意导入会话即可继续。
82
+
83
+ ## 安装与卸载
84
+
85
+ - **git 渠道**(最新 `master`):`dsh plugin --profile web add "github:PerryLink/dsh-claude-move#master"` —— ESM,无需 `prepare` `allowBuilds` 步骤。
86
+ - **npm 渠道**(已发布版本):`dsh plugin --profile web add dsh-claude-move`。
87
+ - **tarball 渠道**:在本仓库执行 `npm pack`,然后 `dsh plugin --profile web add ./dsh-claude-move-<version>.tgz`。
88
+ - **卸载**:从 profile bundles 中删除 `claude-move` 行并重启 `dsh`。导入的会话保留在 DSH 的数据目录中;插件只写自己的缓存(`$DSH_HOME/claude-move/`)和 `claudecode` 工作区文件夹,绝不触碰 Claude 源数据。
89
+
90
+ ## 迁移了什么
91
+
92
+ ```
93
+ ~/.claude(只读)
94
+ ├─ projects/*/*.jsonl ──→ 可续聊的 DSH 会话,默认分组到一个 "claudecode" 工作区
95
+ ├─ projects/*/memory/ ──→ 实时 system-prompt 记忆段落(每次请求重新读取)
96
+ ├─ skills/** ──→ 真正的 DSH 技能
97
+ └─ CLAUDE.md + settings ──→ 早期提示词段落 + 配置建议(绝不自动应用)
98
+ ```
99
+
100
+ | Claude Code | 在 DSH 中变为 |
101
+ |---|---|
102
+ | 会话 transcript(`projects/*/*.jsonl`) | 均衡、可续聊的 DSH 会话 —— `user`/`assistant`/`tool`/`thinking` 全保真映射并修复被中断的工具调用 —— 分组到一个 **`claudecode`** 工作区或每个项目一个 |
103
+ | 记忆文件(`projects/*/memory/*.md`) | 一个实时 system-prompt 上下文段落,每次请求重新读取(`feedback > project > reference > user`) |
104
+ | 技能(`~/.claude/skills/**`) | 真正的 DSH 技能(kebab-case 命名、冲突后缀、默认最多 30 个;`README.md`/`MEMORY.md` 及无描述的文件被跳过) |
105
+ | `CLAUDE.md`(全局 + 每个项目) | 一个早期提示词段落;项目文件优先 |
106
+ | `settings.json` | DSH 配置建议,附带明确的无法映射键列表 |
107
+ | 项目状态(目录、git 分支和脏计数) | 显示在扫描索引、Web 面板徽章和 `/resume-claude` 交接中 |
108
+
109
+ ## 用法
110
+
111
+ 在挂载了插件的任意会话中调用这些工具:
112
+
113
+ ```
114
+ claude_scan # 完整扫描(增量缓存)
115
+ claude_scan { path: "~/.claude/projects/<slug>" } # 部分扫描
116
+ claude_scan { refresh: true } # 跳过缓存,重新扫描全部
117
+ claude_scan { projectsLimit: 10, sessionsLimit: 5, fields: "brief" } # 精简输出
118
+
119
+ import_claude { path: "~/.claude/projects/<slug>/<sessionId>.jsonl" } # 单个会话
120
+ import_claude { path: "~/.claude/projects" } # 目录(递归)
121
+ import_claude { path: "all" } # 全部
122
+ # 随时重新运行:未变更的文件被跳过,增长的 transcript 只追加新的轮次。
123
+ # 超过 maxTranscriptBytes 的文件以分块流式导入(无内存上限)。
124
+ import_claude { path: "...", force: true } # 全新的完整副本(保留之前的副本)
125
+ ```
126
+
127
+ 命令(用户触发,不占模型轮次):
128
+
129
+ ```
130
+ /claude-import-all # 一次性:扫描 导入全部 报告 注入当前会话
131
+ /resume-claude latest # 继续最近的 Claude 会话
132
+ /resume-claude <sessionId> # 按源会话 id import-<src> id
133
+ /resume-claude <keyword> # 匹配标题;多个匹配会列出,绝不猜测
134
+ /claude-move-reset # 重置插件缓存(书签 + 导入映射);导入的会话保留
135
+ ```
136
+
137
+ Web 面板:一个浮动迁移面板,包含项目/会话树、状态徽章(未导入 / 已导入 / 已导入并有新轮次 / 源缺失 / 目录缺失 / git 脏)、关键字过滤、分页渲染、每个会话的「导入并继续」+「打开会话」+「刷新会话列表」、带实时进度条和取消的批量导入,以及一个缓存重置按钮。文本跟随浏览器语言(zh/en)。通过插件自身的 `/api/claude-move/*` JSON 路由在公开 `ctx.webServer` 接缝上提供。
138
+
139
+ ## 导入之后
140
+
141
+ **你无需重启 DSH。** 导入在完成的那一刻即通过公开的 `sessionPersistence` 服务持久化落地:
142
+
143
+ - 服务器端列表(`session.list` / `workspace.list` RPC、CLI、任何新的页面加载)会立即在 **`claudecode` 工作区**下显示导入的会话。
144
+ - 面板会自行刷新已打开页面的会话列表,并为每个导入的会话提供 **打开会话** 按钮。
145
+ - 导入的会话可以立即打开、读取和继续 —— `/resume-claude`,或点击列表中的会话。随时重新运行导入只会把新轮次同步到相同的会话中。
146
+
147
+ ## 配置
148
+
149
+ 全部可选,可在 cordis.yml 中覆盖。
150
+
151
+ | 键 | 默认值 | 含义 |
152
+ |---|---|---|
153
+ | `claudeHome` | `$CLAUDE_CONFIG_DIR` `~/.claude` | Claude 数据根 |
154
+ | `workspaceMode` | `claudecode` | `claudecode`(一个专用工作区)· `per-project`(每个源 cwd 一个工作区) |
155
+ | `claudecodeDir` | `$DSH_HOME/claudecode` | `claudecode` 工作区文件夹(插件唯一会创建的文件夹) |
156
+ | `scanGit` | `true` | Git 探测级别:`true`(完整)· `'branch'`(零 git 调用)· `false` |
157
+ | `gitTimeoutMs` | `5000` | Git 子进程超时 |
158
+ | `scanConcurrency` | `8` | 并行项目扫描上限 |
159
+ | `maxTranscriptBytes` | `67108864` | 流式导入阈值(超过则分块) |
160
+ | `excludeProjects` | `[]` | 要跳过的 slug 子串 |
161
+ | `enableMemory` | `true` | 将记忆作为实时提示词段落注入 |
162
+ | `memoryMaxBytes` | `8192` | 记忆段落上限 |
163
+ | `memoryScope` | `current-project` | `current-project` · `all`(当前项目优先) |
164
+ | `enableSkills` | `true` | 将 Claude 技能注册为 DSH 技能 |
165
+ | `maxSkills` | `30` | 技能数量上限 |
166
+ | `extraSkillDirs` | `[]` | 额外的技能目录 |
167
+ | `enableInstructions` | `true` | 注入全局 + 项目 `CLAUDE.md` |
168
+ | `resumeMaxChars` | `2048` | 交接摘要字符上限 |
169
+ | `resumeMode` | `inject` | `inject`(交接摘要)· `agents`(ctx.agents.resume |
170
+ | `enableWebPanel` | `true` | 注册 `/api/claude-move/*` 面板路由 |
171
+ | `importConcurrency` | `4` | 每批并行读取 + 转换 |
172
+ | `requireApproval` | `true` | 向导写入询问 `ctx.approval`(仅 allowed-once) |
173
+ | `codexHome` | `$CODEX_HOME` 或 `~/.codex` | Codex 数据根 |
174
+ | `opencodeDataHome` | 平台 XDG 数据目录/opencode | OpenCode 数据根 |
175
+ | `opencodeConfigHome` | 平台 XDG 配置目录/opencode | OpenCode 配置根 |
176
+ | `hermesHome` | `$HERMES_HOME` 或 `~/.hermes` | Hermes 数据根 |
177
+ | `skillsDir` | `$DSH_HOME/skills` | 向导技能目标 |
178
+ | `agentsMdPath` | `$DSH_HOME/AGENTS.md` | 向导记忆/指令目标 |
179
+ | `moveWorkspaceMode` | `per-source` | 向导导入的工作区分组:`per-source` · `single` |
180
+
181
+ ## 工具与界面
182
+
183
+ | 界面 | 类型 | 说明 |
184
+ |---|---|---|
185
+ | `claude_scan` | 工具 | 项目/会话/记忆/技能/设置的结构化索引 |
186
+ | `import_claude` | 工具 | 导入单个会话、一个目录或 `all`(增量;`force` 生成全新副本) |
187
+ | `move_detect` / `move_preview` / `move_run` | 工具 | 四来源向导:扫描、带 diff 的逐项计划、在审批之后执行 |
188
+ | `/claude-import-all` | 命令 | 扫描 → 导入全部 → 报告 |
189
+ | `/resume-claude` | 命令 | 继续一个 Claude 会话(latest、id 或关键字) |
190
+ | `/claude-move-reset` | 命令 | 重置插件缓存(导入的会话保留) |
191
+ | `/move` | 命令 | 一次性四来源向导 |
192
+ | Web 迁移面板 | 客户端 | 带进度、取消、分页、打开会话的浮动面板 |
193
+
194
+ ## 权限与数据
195
+
196
+ - **权限**:workshop 清单声明 `filesystem:read` `filesystem:write`。
197
+ - **读取** `~/.claude`(transcript、记忆、技能、`CLAUDE.md`、`settings.json`)—— 严格只读 —— 以及它导入到的项目目录。
198
+ - **写入** 通过公开 `sessionPersistence` 服务写 DSH 会话日志(仅 create + append,绝不删除/改写/归档)、工作区注册表记录、`$DSH_HOME/claude-move/` 下的缓存,以及 `claudecode` 工作区文件夹。
199
+ - **绝不** 修改 Claude 源文件、触碰其他应用的数据或访问网络。**不读取或传输任何凭据**。
200
+
201
+ ## 安全边界
202
+
203
+ - **源文件只读;DSH 日志只追加**(仅 `create` + `append`)。
204
+ - **外部 transcript 是不可信输入** —— 其中的任何内容都不会被执行;system/developer/thinking 内容绝不进入续聊交接。
205
+ - **仅公开服务** —— `sessionPersistence` / `workspaceRegistry` / `tools` / `commands` / `systemPrompt` / `skills` / `webServer`;不改引擎或 UI。
206
+ - **密钥仅按位置报告**(file:line:kind);`permission`/`permission-mode`/`queue-operation` 记录只计数、不导入。
207
+ - **向导写入审批门控** —— 除 `allowed-once` 之外的任何结果都意味着零写入。
208
+
209
+ ## 已知限制
210
+
211
+ - 标题来自 `custom-title`/`ai-title`/首条提示;Claude `summary` 记录会被报告,但不映射为 DSH 压缩节点(合成一个有效的压缩事务会伪造其 seq 范围和检查点消息)。
212
+ - `thinking` 块作为 `reasoning` 内容保留,但绝不进入续聊交接。
213
+ - 被中断的工具调用会以合成的错误结果修复(绝不丢弃),报告为 `repaired.synthesized`。
214
+ - 权限类记录只计数、不导入;DSH 权限预设建议在报告中生成。
215
+ - 在没有流式 `fs.streamText` 接口的宿主上,超过 `maxTranscriptBytes` 的 transcript 会大声失败,而不是部分导入。
216
+ - `workspaceMode: 'per-project'` 下,源目录已删除的会话仍会导入,但工作区挂载失败(保持未分组;`workspace.attached: false` 加上一个 `reason`)。默认的 `claudecode` 工作区不依赖源目录。
217
+ - 如果 transcript 被就地截断或重置(轮次少于记录的导入),重新导入会跳过它并报告 `sourceShrunk`;用 `force: true` 生成全新的完整副本。
218
+ - Web 面板是由插件自身 JSON 路由驱动的零构建浮动面板;它不使用 shell 内部的 UI 插槽系统。
219
+
220
+ ## 模型体验
221
+
222
+ - 面向模型的面是两个工具的描述/schema 及其输出:`claude_scan` 返回结构化索引,`import_claude` 返回逐文件摘要以及警告的位置。工具结果本身被记录为 `tool/result` 事件,因此一切都可以重建。
223
+ - 没有隐藏的面向模型的文本;记忆/`CLAUDE.md` 段落注册在 `ctx.systemPrompt` 上(提示词组装,可从会话日志重建)。
224
+
225
+ ## 故障排查
226
+
227
+ - 该行未生效:`dsh --profile <p> --dump-config` 应打印 `# == dsh-claude-move`;重新运行 `dsh plugin --profile <p> add ...`。
228
+ - Web 能启动但静默挂起:由 `dsh plugin add` 初始化的新 profile 只包含 `dsh-base` —— 将 `@deepseek-ai/dsh-web-app` 添加到 `dsh.profile.bundles`。安装到已有的 `web` profile 则无需任何操作。
229
+ - 面板路由 404:只有当 `enableWebPanel: true` 且组合了 web 服务器时才会提供这些路由;检查启动日志中的 FAILED fiber。
230
+ - 导入失败并提示 "transcript 过大":提高 `maxTranscriptBytes` 或单独导入该文件。
231
+ - 导入成功但侧边栏没有显示新会话:页面已经打开 —— 点击一次面板的刷新按钮(或重新加载页面)即可。永远不需要重启 DSH。
232
+ - 日志:启动失败会打印到 `dsh` 控制台;插件会为工作区/导入映射问题记录以 `[claude-move]` 为前缀的错误。
233
+
234
+ ## 致谢(开源组件)
235
+
236
+ 本项目采用 Apache License 2.0 许可;以下 MIT 许可组件保留其自身许可(全文见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)):
237
+
238
+ - 转换核心 vendored 自 [Nwflower/dsh-chat-import](https://github.com/Nwflower/dsh-chat-import)(MIT)。
239
+ - 发现约定与安全模型来自 [Demogorgon314/dsh-resume-plugin](https://github.com/Demogorgon314/dsh-resume-plugin)(MIT)。
240
+ - 记忆/技能注入与 frontmatter 解析模式来自 [YYTbit/dsh-plugin-claude-bridge](https://github.com/YYTbit/dsh-plugin-claude-bridge)(MIT)。
241
+
242
+ ## 开发
243
+
244
+ ```sh
245
+ npm install # peer 依赖:@deepseek-ai/dsh-tools@0.1.0-rc.6、@deepseek-ai/cordis、schemastery
246
+ npm test # node --test test/*.test.mjs
247
+ ```
248
+
249
+ CI 通过 GitHub Actions([test.yml](.github/workflows/test.yml))在 Linux/macOS/Windows 上以 Node 22 运行完整套件。
250
+
251
+ ## 主题
252
+
253
+ `deepseek-harness`, `dsh-plugin`, `claude-code`, `migration`, `session-import`, `resume`
254
+
255
+ ## 贡献者
256
+
257
+ - [@PerryLink](https://github.com/PerryLink) —— 创建者与维护者:导入管线、四来源迁移向导、Web 面板、文档、CI/CD 与发布。
258
+ - [@OLDnana1](https://github.com/OLDnana1) —— 对被中断工具调用损坏的根因分析,该损坏曾使导入会话在续聊时永久返回 HTTP 400。
259
+ - [@GooodWei](https://github.com/GooodWei) —— 发现 `README.md`(以及任何无描述的 `.md`)被误注册为技能,从而破坏 DSH 的技能加载。
260
+
261
+ ## PerryLink DSH 插件家族
262
+
263
+ 本项目是 [PerryLink](https://github.com/PerryLink) 维护的 DeepSeek Harness 插件之一。如果这个对你有帮助,其他的很可能也有用:
264
+
265
+ | 插件 | 一句话介绍 |
266
+ |---|---|
267
+ | [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | 只读 MCP 运行时面板:/mcp 命令 + 带状态、工具和错误的设置标签页 |
268
+ | [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | 工程纪律守卫:需求盘问、测试门、对手审查 |
269
+ | [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | 带 Web UI 侧边栏、消息和中断的持久后台子代理 |
270
+ | [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | 通过语言服务器提供 LSP 诊断、格式化、补全、代码操作与重命名 |
271
+ | [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Claude Code outputStyles 等价的运行时样式切换 |
272
+ | [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Claude Code /rewind 等价物:快照、会话分叉、一次性恢复 |
273
+ | [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Claude Code 风格的声明式 allow/deny/ask 权限规则,带审计 |
274
+ | [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | 在审批链上的第二模型自动审查,默认 fail-closed |
275
+ | [dsh-memento](https://github.com/PerryLink/dsh-memento) | 审批门控的跨会话记忆:ctx.memory 接缝 + SQLite + 记忆工具 |
276
+ | [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | 安全审计技能包:密钥扫描、依赖与供应链审查 |
277
+ | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | 在 Web 侧边栏固定会话,带持久排序 |
278
+ | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Web 编辑器终端风格输入历史:方向键、Ctrl+R 搜索 |
279
+ | [dsh-github](https://github.com/PerryLink/dsh-github) | DSH GitHub PR/issues 集成,每次写入都经审批门控 |
280
+ | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | 作为按需代理技能的插件开发知识库 |
281
+ | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 将 Claude Code 会话、记忆、技能和 CLAUDE.md 迁移到 DSH |
282
+
283
+ ## 许可证
284
+
285
+ [Apache License 2.0](LICENSE) © 2026 dsh-claude-move contributors