dsh-claude-in
English | 简体中文
  
在 DeepSeek Harness 中直接复用已有的 Claude Code 工作区,无需维护第二份配置。
dsh-claude-in 在运行时从 .claude 读取 Rules、Skills、command Hooks 和 Agent 定义。源文件始终保持不变,使 .claude 成为 Claude Code 与 DSH 共享的唯一真源。
主要特性
- 无需迁移:运行时读取 Claude 资产,不复制到 DSH 专用文件。
- 项目级与用户级配置:同时加载当前工作区
.claude和~/.claude。 - 原生 DSH 集成:Skills 接入 DSH skill service,Rules 注入会话,command Hooks 映射到 DSH 事件。
- 保留显式引用:Skill 软链与 Rule imports 可以继续指向发现入口之外的目标。
- 独立适配层:DSH 专属调整放在
.dsn,不修改 Claude 资产。
支持的资产
| Claude Code 资产 | 来源 | DSH 中的行为 |
|---|---|---|
| Rules | .claude/rules/**/*.md、~/.claude/rules/**/*.md | 基线指令与路径规则注入 |
| Skills | .claude/skills//SKILL.md、~/.claude/skills//SKILL.md | 原生 DSH Skills,调用时读取源文件 |
| Command Hooks | hooks.json、settings.json、settings.local.json | 映射到 DSH 生命周期事件 |
| Agents | .claude/agents/**/*.md、~/.claude/agents/**/*.md | Agent 目录与 claude-agent-* Skills |
会话历史、MCP 配置、Claude Plugins、Commands、Memory 以及直接注入 CLAUDE.md 不在本插件范围内。
安装
从 GitHub 源码安装
dsh plugin --profile web add github:ShinewineW/dsh-claude-in#v0.1.0Git 安装通过 prepare 脚本从源码构建。pnpm 10 及以上版本可能要求在目标 profile 中显式允许构建:
# $DSH_HOME/profiles/web/pnpm-workspace.yaml
allowBuilds:
dsh-claude-in: true加入配置后重新执行安装命令即可。
从预构建 Release 安装
预构建包不需要安装时构建权限:
curl -LO https://github.com/ShinewineW/dsh-claude-in/releases/download/v0.1.0/dsh-claude-in-0.1.0.tgz
dsh plugin --profile web add ./dsh-claude-in-0.1.0.tgz发现模型
插件只使用两个发现入口:
1. 当前 DSH 工作区直属的 .claude 2. ~/.claude
插件不会扫描父目录或其他文件系统位置。从项目子目录启动的会话不会继承上级目录中的 .claude。
发现目录内的显式引用仍然有效。Skill 与 Agent 目录中的符号链接会被跟随,Rule @import 也可以解析发现入口之外的文件或目录。这些引用属于资产的显式声明,不会扩大自动发现范围。
运行机制
Rules
默认情况下,不包含 paths 或 globs 的 Rules 会进入会话基线;alwaysApply: true 可以显式声明同样的行为。路径规则在 DSH 的 read、write 或 edit 工具触达匹配文件后注入,每个会话只注入一次。
项目 Rules 与用户 Rules 会合并加载。项目 Rules 排在前面,并在上下文预算不足时优先保留。
Skills
每个合法的 SKILL.md 都会注册到 DSH skill service。Skill 被调用时读取原始文件,因此所有更新仍保留在 .claude 中,不会产生受插件管理的副本。
同名 Skill 的优先级从高到低为:
1. 项目 .dsn/skills 2. 用户 ~/.claude/skills 3. 项目 .claude/skills
Hooks
当前支持以下 Claude command Hook 事件:
SessionStartUserPromptSubmitPreToolUsePostToolUseStopSubagentStartSubagentStop
hooks.json、settings.json、settings.local.json 中的 Hook 组按此顺序追加。项目 Hooks 先于用户 Hooks 执行。命令执行前会根据当前工作区解析 ${CLAUDE_PROJECT_DIR} 和 ${CLAUDE_PLUGIN_ROOT}。
插件支持阻塞退出码 2、permissionDecision 和 additionalContext。非 command 类型 Hook 会被跳过并记录警告。
Agents
Agent 定义会进入轻量会话目录,同时注册为 claude-agent-<name> Skills。调用对应 Skill 时,插件从原始 Markdown 文件读取 Agent 定义和 system prompt,并交给 DSH subagent 工作流使用。
项目级 Agent 与用户级 Agent 同名时,项目级定义优先。
.dsn 项目适配
DSH 专属行为可以在不修改 Claude 资产的情况下单独配置:
# .dsn/dsh-claude-in.yml
enabled: true
loadRules: true
loadSkills: true
loadAgents: true
loadHooks: true
hooks:
PreToolUse:
- from: "npx tsc --noEmit"
to: "/opt/dsh/tsc-check.sh"Hook 适配采用命令文本精确匹配,只替换命令本身,不改变事件、matcher、timeout 或执行语义。
DSH 专属 Skills 可以放在 .dsn/skills/<name>/SKILL.md。插件不会创建或修改 .dsn 文件。
配置
默认配置等价于:
enabled: true
claudeDir: ".claude"
adaptDir: ".dsn"
loadRules: true
rulesMaxBytes: 131072
ruleMaxSourceBytes: 65536
ruleImportMaxDepth: 8
defaultAlwaysApply: true
loadSkills: true
loadAgents: true
loadHooks: true
hookTimeoutMs: 600000
stderrSummaryMaxChars: 500claudeDir 和 adaptDir 只接受一个相对目录名,不接受绝对路径或目录穿越。
安全模型
Claude 资产以只读方式加载,但 command Hooks 会执行项目级和用户级配置中的 shell 命令。项目 Hook 的信任边界与 Claude Code 中信任该工作区后的行为一致。
项目级 Hooks 可以单独关闭:
# .dsn/dsh-claude-in.yml
loadHooks: false显式 Skill 软链和 Rule imports 可以引用 .claude 之外的内容,相应目标也属于配置的信任范围。
已知限制
- 仅支持 command Hooks 和文档列出的生命周期事件。
updatedInput、systemMessage、updatedToolOutput等 Hook 输出不会生效。- Agent 的
model与tools字段会包含在桥接定义中,但不会成为 DSH 原生运行时强制限制。 - 路径规则在匹配的
read、write或edit返回后注入,无法追溯约束第一次已经完成的写入或编辑。 - Shell 命令内部发生的文件访问无法参与路径规则匹配。
- Rule 与 Agent 基线使用短期元数据缓存,而不是文件级 watcher。
开发
npm ci
npm test
npm run build
npm pack --dry-run构建过程完全自包含,不依赖 DeepSeek Harness 源码 checkout。
License
[BSD-3-Clause](LICENSE)。Hook 执行语义改写自同样采用 BSD-3-Clause 的 @deepseek-ai/dsh-hooks-claude-code。