1. 为什么会有 dsh-cc-ecosystem 这个插件集
1.1 一个真实存在的迁移痛点
用 Claude Code 写过项目的人,手里多少都攒了点东西:.claude/目录下的自定义命令、CLAUDE.md里沉淀的项目上下文、settings.json里调好的权限白名单、还有一堆自己写的 hooks 脚本。这些东西不是随手能重建的,它们是几个月甚至一年里一点点磨出来的工作流资产。
然后 DeepSeek Harness(后面统一简称 DSH)出现了。它的定位和 Claude Code 高度重叠——都是终端里的 AI 编程代理,都支持工具调用、文件读写、命令执行,都有插件机制。很多人想切过去试试,或者干脆两个都用,结果第一步就卡住了:资产怎么搬?
Claude Code 的配置格式和 DSH 的不一样。命令定义的文件结构不同,权限配置的字段名不同,hooks 的触发时机和参数传递方式也不同。手动一个个改,改到第三个文件就想放弃了。dsh-cc-ecosystem这个插件集就是冲着这个场景来的——它的目标很明确:让 DSH 无损继承你在 Claude Code 里积累的资产。
“无损”这两个字是核心。不是“能跑就行”,而是命令名不变、参数语义不变、权限行为不变、hooks 触发逻辑不变。你原来敲/review是干什么的,迁移后还是干什么的。
1.2 这个插件集到底包含什么
从命名dsh-cc-ecosystem能看出来,它不是单个插件,是一组。按常见实践,这类插件集通常覆盖以下几个方向:
- 配置迁移类:读取 Claude Code 的
settings.json、.claude/commands/、CLAUDE.md,转换成 DSH 能识别的格式。 - 命令兼容类:把 Claude Code 的自定义 slash 命令映射成 DSH 的插件命令,保持调用方式一致。
- Hooks 桥接类:Claude Code 的 hooks 是在特定事件(如工具调用前后)触发的 shell 脚本,DSH 的插件生命周期不同,需要一层适配。
- 上下文继承类:把
CLAUDE.md里的项目说明、编码规范、架构约定注入到 DSH 的会话上下文中。
注意:具体插件清单以你实际安装的版本为准,不同版本的 DSH 插件 API 可能有差异。下面讲的是通用思路和典型实现方式,你对照自己的版本调整。
1.3 适合谁来用
三类人最需要这个:
第一类,Claude Code 重度用户想试 DSH。你不想从零开始配环境,希望切过去当天就能干活。
第二类,两个工具并行使用的人。白天在公司用 Claude Code,晚上在家用 DSH,希望配置能同步,不用维护两套。
第三类,团队里要统一工具链的人。团队原来用 Claude Code,现在要评估 DSH,需要一套可复现的迁移方案,而不是每个人自己瞎折腾。
如果你只是偶尔用用 AI 编程工具,没积累什么自定义配置,那这个插件集对你的价值有限。但如果你手里有几十个自定义命令和一堆调好的 hooks,那它省下的时间是以天计算的。
2. 迁移前必须搞清楚的几个核心概念
2.1 Claude Code 的资产到底存在哪
在动手迁移之前,你得先知道自己要搬什么。Claude Code 的配置分散在几个位置,很多人用了半年都没完整看过一遍。
项目级配置(跟着项目走,通常在项目根目录):
CLAUDE.md:项目上下文文件,里面写的是给 AI 看的项目说明——技术栈、目录结构、编码规范、常用命令。这个文件的内容会作为系统提示的一部分注入会话。.claude/commands/:自定义 slash 命令,每个.md文件对应一个命令。文件名就是命令名,文件内容是提示词模板。.claude/settings.json:项目级设置,包括权限白名单、环境变量、hooks 配置。.claude/settings.local.json:本地覆盖设置,通常不进版本控制。
用户级配置(跟着人走,在用户主目录):
~/.claude/CLAUDE.md:全局上下文,所有项目共享。~/.claude/commands/:全局自定义命令。~/.claude/settings.json:全局设置。
其他资产:
.claude/hooks/或 settings 里内联的 hooks 脚本。.mcp.json:MCP 服务器配置。- 各种
.claudeignore之类的忽略规则。
迁移的完整性取决于你有没有把这些都盘清楚。我见过有人只搬了CLAUDE.md,结果发现自定义命令全没了,又回头找。
2.2 DSH 的插件机制和 Claude Code 有什么不同
这是整个迁移的技术核心,搞不懂这个,后面全是坑。
Claude Code 的扩展方式相对“轻”:自定义命令就是 markdown 文件,hooks 就是 shell 脚本,配置就是 JSON。它更像是一个“约定大于配置”的系统,你按目录结构放文件,它就认。
DSH 的插件机制更“重”一些,它有一套正式的插件 API。插件需要声明自己的元信息(名称、版本、依赖),需要实现特定的接口(比如命令注册、事件监听),生命周期管理也更严格。好处是能力强、可控性好,代价是迁移时不能直接复制文件,得做一层转换。
具体差异体现在几个地方:
| 维度 | Claude Code | DSH |
|---|---|---|
| 自定义命令 | markdown 文件,文件名即命令名 | 插件注册,需声明命令元信息 |
| Hooks | shell 脚本,事件触发 | 插件生命周期钩子,API 调用 |
| 权限配置 | settings.json 字段 | 插件配置或全局配置 |
| 上下文注入 | CLAUDE.md 自动读取 | 需通过插件或配置显式注入 |
| MCP 支持 | .mcp.json | 插件形式或独立配置 |
dsh-cc-ecosystem干的就是把左边这列翻译成右边这列。翻译得好不好,决定了你迁移后能不能“无损”。
2.3 “无损”的技术定义
我在实际迁移中把“无损”拆成四个可验证的标准,你可以拿这个清单自查:
- 命令可调用性:原来敲
/xxx能触发的,迁移后敲同样的名字还能触发,参数传递方式一致。 - 行为一致性:命令执行后的效果和原来一样,比如原来是“读取当前 git diff 并生成 commit message”,迁移后还是这个行为。
- 权限不降级:原来允许的操作迁移后仍然允许,不会因为配置转换丢失而频繁弹权限确认。
- 上下文不丢失:
CLAUDE.md里的项目约定仍然生效,AI 仍然知道你的技术栈和编码规范。
任何一条不满足,就不叫无损。实际迁移中,第 3 条和第 4 条最容易出问题,因为它们是“隐式”的,不像命令那样一眼能看出来。
3. 实操:从零完成一次完整迁移
3.1 环境准备与前置检查
先确认你的 DSH 装好了,并且版本支持插件机制。DSH 的安装方式在不同系统上不一样,Linux 和 macOS 通常走包管理器或官方脚本,Windows 建议用 WSL 或者桌面端。装完之后跑一下版本命令确认:
dsh --version然后确认插件目录位置。DSH 的插件通常放在用户配置目录下,具体路径看你的安装方式。常见的位置是~/.dsh/plugins/或~/.config/dsh/plugins/。你可以用dsh plugin list看看当前装了哪些插件,顺便确认插件命令可用。
Claude Code 这边,先做一次资产盘点。我习惯用一条命令把所有相关文件列出来:
# 在项目根目录执行 find . -maxdepth 3 -name "CLAUDE.md" -o -name ".claude" -type d 2>/dev/null ls -la ~/.claude/ 2>/dev/null把输出记下来,这就是你的迁移清单。别嫌麻烦,这一步省了后面会加倍还回来。
提示:迁移前先备份。把
.claude/整个目录和~/.claude/复制一份到安全位置。我踩过的坑是迁移过程中改坏了原配置,结果 Claude Code 也用不了了,两边都瘫。
3.2 安装 dsh-cc-ecosystem 插件集
安装方式取决于插件集的发布形式。如果是通过 DSH 的插件市场或包管理器发布,直接:
dsh plugin install dsh-cc-ecosystem如果是本地包或者 git 仓库,可能需要指定路径或仓库地址:
dsh plugin install ./dsh-cc-ecosystem # 或 dsh plugin install <仓库地址>装完之后验证:
dsh plugin list你应该能在列表里看到dsh-cc-ecosystem相关的条目。有些插件集是拆成多个子插件的,比如dsh-cc-commands、dsh-cc-hooks、dsh-cc-context,那就都要装上。
装完别忘了看插件的帮助信息,通常会告诉你它支持哪些命令和配置项:
dsh plugin info dsh-cc-ecosystem这一步很多人跳过,结果后面配置全靠猜。花两分钟看帮助,能省半小时试错。
3.3 执行配置迁移
这是核心步骤。dsh-cc-ecosystem通常会提供一个迁移命令,类似:
dsh cc-migrate --source ~/.claude --target ~/.dsh或者带项目级参数:
dsh cc-migrate --project /path/to/your/project具体命令名和参数以插件文档为准。执行时注意几个点:
第一,先 dry-run。如果插件支持--dry-run或--preview,一定要先跑一遍看它打算改什么。我见过迁移工具直接把原有 DSH 配置覆盖的情况,没预览就执行,哭都来不及。
第二,分步迁移。如果插件支持按类别迁移(命令、hooks、上下文分开),建议分步来。先迁命令,验证没问题再迁 hooks,最后迁上下文。一次性全迁,出问题不好定位。
第三,注意路径转换。Claude Code 配置里如果有绝对路径(比如 hooks 脚本的路径),迁移后可能失效。检查一下转换后的配置,把路径改成 DSH 环境下的正确路径。
迁移完成后,检查目标目录:
ls -la ~/.dsh/plugins/ ls -la ~/.dsh/commands/ 2>/dev/null确认文件都到位了。
3.4 验证迁移结果
迁移完不验证,等于没迁。我一般按这个顺序验:
命令验证:随便挑几个你常用的自定义命令,在 DSH 里敲一下,看能不能触发,行为对不对。比如你原来有个/commit命令,迁移后敲/commit,看它是不是还是生成 commit message。
权限验证:跑一个原来需要权限的操作,看 DSH 是不是直接放行,而不是弹确认。如果频繁弹确认,说明权限配置没迁过来。
上下文验证:问 DSH 一个关于你项目的问题,比如“这个项目的测试命令是什么”,看它能不能从CLAUDE.md里答出来。答不出来说明上下文注入没生效。
Hooks 验证:如果你有 hooks,触发一下对应事件,看脚本有没有执行。可以在 hooks 脚本里加一行echo "hook triggered" >> /tmp/hook.log,跑完看日志。
验证清单可以整理成表格,逐项打勾:
| 验证项 | 方法 | 预期结果 |
|---|---|---|
| 自定义命令 | 敲命令名 | 正常触发,行为一致 |
| 权限配置 | 执行受限操作 | 直接放行,不弹确认 |
| 项目上下文 | 问项目相关问题 | 能正确回答 |
| Hooks | 触发事件 | 脚本执行,日志有记录 |
| MCP 服务器 | 调用 MCP 工具 | 工具可用 |
4. 迁移过程中的常见坑与排查
4.1 命令迁移后不生效
最常见的原因有三个。
原因一:命令名冲突。DSH 内置命令可能和你的自定义命令重名。比如你有个/help,DSH 自己也有/help,那你的就被覆盖了。解决办法是给自定义命令加前缀,比如/my-help,或者在插件配置里指定优先级。
原因二:文件格式不对。Claude Code 的命令是 markdown,DSH 插件可能要求特定格式(比如带 frontmatter 的 markdown,或者 JSON)。迁移工具如果没正确转换,命令就注册不上。检查迁移后的文件,对照 DSH 插件文档的格式要求。
原因三:插件没启用。有些 DSH 插件装完默认是禁用状态,需要手动启用。跑dsh plugin list看状态,如果是 disabled,用dsh plugin enable <name>启用。
排查顺序:先看插件状态,再看文件格式,最后看命名冲突。
4.2 权限配置丢失导致频繁确认
这个坑很烦,因为它的表现是“能用但很难用”。每次执行命令都弹权限确认,效率直接砍半。
根因通常是权限配置的字段映射没做对。Claude Code 的权限配置长这样(简化):
{ "permissions": { "allow": ["Bash(git:*)", "Read", "Write"], "deny": ["Bash(rm:*)"] } }DSH 的权限模型可能不同,比如它可能用tools.allow而不是permissions.allow,或者权限粒度的表达方式不一样。迁移工具如果没做字段映射,配置就丢了。
解决办法:手动检查迁移后的 DSH 配置文件,对照 DSH 的权限文档,把 allow/deny 规则补上。如果规则多,写个脚本批量转换。
提示:权限配置建议从宽到严逐步收紧。先全部 allow,确认功能正常,再一条条加 deny。反过来做,你会被确认弹窗烦死。
4.3 Hooks 触发时机不对
Claude Code 的 hooks 和 DSH 的插件生命周期不是一一对应的。比如 Claude Code 有PreToolUse和PostToolUse,DSH 可能叫beforeToolCall和afterToolCall,触发时机和参数传递方式都可能不同。
如果你的 hook 逻辑依赖特定的输入参数(比如工具名、参数内容),迁移后参数名变了,脚本就读不到,行为就错了。
排查方法:在 hook 脚本开头把接收到的参数全部打印出来:
#!/bin/bash echo "ARGS: $@" >> /tmp/hook-debug.log echo "STDIN: $(cat)" >> /tmp/hook-debug.log跑一次触发事件,看日志里实际收到了什么,再对照 DSH 的文档调整脚本。
4.4 上下文注入不完整
CLAUDE.md迁移后,DSH 可能不会自动读取,需要显式配置。有些插件会把它转成 DSH 的上下文文件,有些需要你在 DSH 配置里指定路径。
如果发现 DSH 对你的项目一无所知,先确认上下文文件的位置和格式。DSH 可能要求特定文件名(比如DSH.md)或特定目录。检查插件文档,把CLAUDE.md的内容放到正确位置。
另一个常见问题是内容太长被截断。CLAUDE.md如果写了几千行,注入时可能超出上下文窗口。建议精简,只保留真正重要的项目约定,细节放到单独文档里按需读取。
4.5 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决 |
|---|---|---|---|
| 命令不触发 | 插件未启用 | dsh plugin list | 启用插件 |
| 命令不触发 | 命名冲突 | 对比内置命令 | 加前缀 |
| 命令不触发 | 格式错误 | 检查文件格式 | 按文档转换 |
| 频繁弹权限 | 权限配置丢失 | 检查配置文件 | 补 allow 规则 |
| Hook 不执行 | 事件名不匹配 | 打印参数日志 | 改事件名 |
| Hook 行为错 | 参数名变化 | 打印参数日志 | 改参数引用 |
| 上下文不生效 | 未显式配置 | 检查上下文文件 | 指定路径 |
| 上下文被截断 | 内容过长 | 看文件行数 | 精简内容 |
5. 迁移后的优化与长期维护
5.1 建立双工具同步机制
如果你打算 Claude Code 和 DSH 并行使用,那配置同步是个长期问题。今天在 Claude Code 里加了个命令,明天在 DSH 里改了权限,两边慢慢就不一致了。
我的做法是单一数据源:把自定义命令、上下文文件、hooks 脚本放在一个中立目录(比如~/ai-config/),然后用软链接分别链到 Claude Code 和 DSH 的配置目录。这样改一处,两边都生效。
# 示例:中立目录 mkdir -p ~/ai-config/commands # 链接到 Claude Code ln -s ~/ai-config/commands ~/.claude/commands # 链接到 DSH(路径以实际为准) ln -s ~/ai-config/commands ~/.dsh/commands权限配置这种格式不同的,没法直接软链,就写个转换脚本,改完源文件跑一下脚本生成两边格式。
5.2 定期审计迁移完整性
工具在更新,插件在更新,你的配置也在变。建议每个月做一次审计:列出 Claude Code 的所有资产,对照 DSH 里实际生效的,看有没有遗漏。
可以写个简单的检查脚本:
#!/bin/bash # 对比两边命令数量 cc_count=$(ls ~/.claude/commands/*.md 2>/dev/null | wc -l) dsh_count=$(ls ~/.dsh/commands/*.md 2>/dev/null | wc -l) echo "Claude Code commands: $cc_count" echo "DSH commands: $dsh_count" if [ "$cc_count" != "$dsh_count" ]; then echo "WARNING: command count mismatch" fi数量对不上就说明有遗漏,手动查一下差在哪。
5.3 插件版本升级的注意事项
dsh-cc-ecosystem本身也会更新。升级前先看 changelog,重点看有没有破坏性变更(breaking changes)。升级后重新跑一遍验证清单,确认迁移的功能没退化。
我踩过的坑是插件升级后改了配置格式,旧配置不兼容,结果权限全丢了。所以升级前备份配置,升级后立即验证,出问题能快速回滚。
提示:如果插件支持锁定版本,生产环境建议锁版本,别自动升级。等新版本稳定了再手动升。
5.4 什么情况下不建议迁移
不是所有资产都值得迁。以下几种情况,我建议直接在 DSH 里重建,而不是迁移:
- 高度依赖 Claude Code 特有 API 的 hooks:如果 hook 脚本调用了 Claude Code 独有的环境变量或接口,迁移成本可能高于重写。
- 已经废弃的命令:迁移前先清理,别把垃圾也搬过去。
- 项目特定的临时配置:这种本来就不该进全局配置,迁移过去反而污染 DSH 环境。
迁移的目的是继承有价值的资产,不是搬运所有文件。做减法有时候比做加法更重要。
6. 我实际用下来的一些体会
这套插件集解决的是真问题,但它不是魔法。迁移的顺利程度,很大程度上取决于你原来 Claude Code 配置的规范程度。如果你原来就是随手改改,文件命名混乱、hooks 脚本里全是硬编码路径,那迁移工具也救不了你,该手动整理还得手动整理。
我自己的做法是,借这次迁移的机会,把积累的配置做了一次彻底梳理。删掉了三分之一已经没用的命令,把 hooks 脚本里的硬编码路径全改成相对路径或环境变量,CLAUDE.md从八百行精简到两百行。整理完之后,不光 DSH 迁移顺利,Claude Code 那边用起来也清爽多了。
另外一个体会是,别追求一次性完美迁移。先迁核心的、高频使用的资产,跑起来,用一两周,再逐步迁边缘的。一次性全迁,出了问题排查范围太大,容易劝退。
最后分享一个小技巧:迁移完成后,在 DSH 里跑一个你熟悉的复杂任务,比如“读取当前分支的 diff,按项目规范生成 commit message 并提交”。这个任务会同时用到上下文注入、自定义命令、权限配置和可能的 hooks。如果它能顺利完成,说明你的迁移基本到位了。这比逐项验证更接近真实使用场景,也更能暴露隐藏问题。