# rev-skills 的 DSH bundle 补丁:本仓库根包(rev-skills)自身即 bundle,根 package.json # 用 dsh.bundle.patch 指向本文件(值为 ./dsh.patch.yml,且该文件已列进 files)。 # 顶层一条 `- insert:` 行声明独立 agent preset `rev-skills`,其子条目对齐官方 # `cordis` 预设(去掉 Cordis 编写相关的行与 plan mode)。 # `skill-filesystem` 行设置 `includeDefaultRoots: false`,该 preset 贡献的是 rev-skills # 技能根这一层,不继承项目与用户技能根;技能目录解析仍会把该层与查看作用域的项目/ # 用户根合并:同名条目以本 preset 层为准,其他 preset 不受影响。 # 技能根部进包内副本:`customSkillDirs` 表达式按顺序探测 `REV_SKILLS_DIR`(指向仓库根 # 或直接指向技能目录)、DSH 用户技能根(`$DSH_HOME/skills`,默认 `~/.dsh/skills`)、 # 本包目录(`rev-skills/package.json` 反解),取第一个存在且至少含一个 `re-*` 条目的候选。 - insert: - id: preset-rev-skills name: '@deepseek-ai/dsh-agent-preset' config: id: rev-skills name: 逆向工程(rev-skills) description: 逆向工程技能目录:为 rev-skills 增加独立技能层,其他 preset 不受影响。 order: 40 plugins: - id: persona name: '@deepseek-ai/dsh-persona' config: suffix: Your working directory is {{cwd}}. prefix: >- You are a reverse-engineering agent powered by the {{model}} model. The skill catalog carries the operating detail. - id: agent-instructions name: '@deepseek-ai/dsh-agent-instructions' config: maxBytes: 65536 - id: tool-bash name: '@deepseek-ai/dsh-tool-bash' disabled: !!js process.platform === 'win32' - id: tool-pwsh name: '@deepseek-ai/dsh-tool-pwsh' disabled: !!js process.platform !== 'win32' - id: tool-fs name: '@deepseek-ai/dsh-tool-fs' - id: tool-fs-search name: '@deepseek-ai/dsh-tool-fs-search' config: sampleOverCapGlobResults: false - id: tool-jobs name: '@deepseek-ai/dsh-tool-jobs' - id: command-goal name: '@deepseek-ai/dsh-command-goal' - id: tool-goal name: '@deepseek-ai/dsh-tool-goal' - id: compaction name: cordis:group group: true isolate: compaction: true toolResultPruner: true config: - id: compaction-basic name: '@deepseek-ai/dsh-compaction-basic' - id: command-compact name: '@deepseek-ai/dsh-command-compact' - id: tool-result-pruner name: '@deepseek-ai/dsh-compaction-tool-result-pruner' config: thresholdChars: 8192 headChars: 4096 tailChars: 1024 - id: delegation name: cordis:group group: true isolate: workflowEngine: true config: - id: tool-subagent-control name: '@deepseek-ai/dsh-tool-subagent-control' - id: tool-subagent-list-agents name: '@deepseek-ai/dsh-tool-subagent-control/list-agents' - id: tool-subagent name: '@deepseek-ai/dsh-tool-subagent' config: provider: spawn toolName: subagent modelSelectionSettings: true backgroundMode: continuable - id: tool-subagent-fork name: '@deepseek-ai/dsh-tool-subagent' config: provider: fork toolName: subagent_fork backgroundMode: continuable - id: workflow-ptc name: '@deepseek-ai/dsh-workflow-ptc' config: provider: spawn - id: tool-workflow name: '@deepseek-ai/dsh-tool-workflow' - id: tool-ask-user name: '@deepseek-ai/dsh-tool-ask-user' - id: tool-todo name: '@deepseek-ai/dsh-tool-todo' config: allowParallelInProgress: true - id: tool-web name: '@deepseek-ai/dsh-tool-web' config: fetch: true searchTimeoutMs: 60000 - id: skill-filesystem name: '@deepseek-ai/dsh-skill-filesystem' config: includeDefaultRoots: false customSkillDirs: - !!js "(() => { const f = process.getBuiltinModule('node:fs'); const pt = process.getBuiltinModule('node:path'); const os = process.getBuiltinModule('node:os'); const r = process.getBuiltinModule('node:module').createRequire(baseUrl); const pj = (n) => { try { return pt.dirname(r.resolve(n)) } catch (e) { return '' } }; const sk = (d) => { try { return pt.isAbsolute(d) && f.existsSync(d) && f.readdirSync(d).some((e) => e.startsWith('re-')) } catch (e) { return false } }; const tj = (b) => { try { return pt.join(b, '.claude', 'skills') } catch (e) { return '' } }; const hd = () => { try { return pt.join(process.env.DSH_HOME || pt.join(os.homedir(), '.dsh'), 'skills') } catch (e) { return '' } }; const c = [tj(process.env.REV_SKILLS_DIR), process.env.REV_SKILLS_DIR, hd(), tj(pj('rev-skills/package.json'))].filter((d) => d); return c.find(sk) || hd() })()" - id: tool-skill name: '@deepseek-ai/dsh-tool-skill' - id: present name: '@deepseek-ai/dsh-tool-present' - id: tool-plugin-manager name: '@deepseek-ai/dsh-plugin-manager/tools' disabled: !!js "!ctx.get('profileContext')"