
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.jsonMCP 服务器配置。各种.claudeignore之类的忽略规则。迁移的完整性取决于你有没有把这些都盘清楚。我见过有人只搬了CLAUDE.md结果发现自定义命令全没了又回头找。2.2 DSH 的插件机制和 Claude Code 有什么不同这是整个迁移的技术核心搞不懂这个后面全是坑。Claude Code 的扩展方式相对“轻”自定义命令就是 markdown 文件hooks 就是 shell 脚本配置就是 JSON。它更像是一个“约定大于配置”的系统你按目录结构放文件它就认。DSH 的插件机制更“重”一些它有一套正式的插件 API。插件需要声明自己的元信息名称、版本、依赖需要实现特定的接口比如命令注册、事件监听生命周期管理也更严格。好处是能力强、可控性好代价是迁移时不能直接复制文件得做一层转换。具体差异体现在几个地方维度Claude CodeDSH自定义命令markdown 文件文件名即命令名插件注册需声明命令元信息Hooksshell 脚本事件触发插件生命周期钩子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 内置命令可能和你的自定义命令重名。比如你有个/helpDSH 自己也有/help那你的就被覆盖了。解决办法是给自定义命令加前缀比如/my-help或者在插件配置里指定优先级。原因二文件格式不对。Claude Code 的命令是 markdownDSH 插件可能要求特定格式比如带 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和PostToolUseDSH 可能叫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。如果它能顺利完成说明你的迁移基本到位了。这比逐项验证更接近真实使用场景也更能暴露隐藏问题。