oh-my-dsh (omd)
DeepSeek Harness 的多智能体编排层 —— OMC / OMX 编排理念的 dsh 宿主适配实现。 Multi-agent orchestration layer for DeepSeek Harness, adapted from:
- oh-my-claudecode (OMC) — Claude Code 编排层
- oh-my-codex (OMX) — Codex 编排层
omd 以单个 dsh 插件交付:注入编排协议到系统提示词、注册 49 个 skill 目录 + 33 个 omd-agent-* 角色卡(66 个双语文件,会话技能目录共 82 条)与 3 个斜杠命令、挂载内置 MCP server 提供 58 个状态/记忆/协调/代码智能/graph 运行时工具。三种执行模式(autopilot / ralph / team):autopilot 与 ralph 由 dsh 原生 goal / ralph 工具驱动前台循环;team 由 lib/team.js 领队运行时驱动(阶段状态机 + 队员 UUID 生命周期 + mailbox + heartbeat + merge 计划,无 tmux——dsh 无承载面)。
安装 / Install
# 发布后(npm 包名 @sakura12/oh-my-deepseekharness——注意裸 oh-my-dsh 是 npm 上另一个已停更的包)
dsh plugin --profile <profile> add @sakura12/oh-my-deepseekharness
# 本地开发(指向本仓库路径;以你的检出路径替换)
dsh plugin --profile <profile> add /path/to/oh-my-deepseekharness
<profile>是 dsh 的隔离配置/插件组合单元(本机如web);dsh plugin实为转发 pnpm 到该 profile 目录,add/remove 均用 npm 包名。装完必须重启或重载 profile(重开dsh web)再开新会话,插件树才会重载生效——然后在会话里输入「setup omd」走安装向导,或直接/omd-doctor验装。
要求:Node.js ≥ 22.19;dsh 宿主兼容范围以 package.json 的 peerDependencies 为权威(0.1.2 / 0.1.5 / 0.1.7 三条 0.1.x 线与 ≥0.2.0-rc 线;0.2.0-rc.2 与 0.2.1-rc.5 实测全绿——0.2.1 删除了 subagents 服务级 start(改 startActivation),0.7.1 起 omd_delegate 经双形态 feature-detect 自适应新旧两线)。兼容性质证的逐条证据台账是仓内审计产物(.omd/plans/,gitignored),不随 npm 包发布。所有 @deepseek-ai/* 依赖均为宿主义务(peerDependencies,缺失自动降级,见下文「依赖边界」)。可选能力依赖(optionalDependencies,缺席显式降级不阻断):@ast-grep/napi(ast_grep_* 工具)、vscode-jsonrpc / vscode-languageserver-protocol / vscode-uri(lsp_* 工具)。
验装:安装后在会话中输入 /omd-doctor(不确定可用入口时先 /omd 看速查)。
开发改动 → GUI 生效(install-local):profile 依赖若从 npm 解析(如 ^0.4.9),仓库里的改动不会到达运行中的 GUI(2026-10-26 审查实证:实装 0.4.9 vs 仓库 0.5.1 漂移)。闭合链路:
pwsh scripts/install-local.ps1 # npm pack → 装进 profile → 按提示重启 dsh web
注意:该脚本是直接覆盖 profile
node_modules的快装路径;下次在 profile 里跑 pnpm install/add 会被冲掉。长期方案是把 profile 依赖改为本地路径(dsh plugin add <仓库路径>)或发布新版。
快速上手 / Quick Start
三种执行模式,一句话启动:
| 模式 | 一句话示例 | 说明 |
|---|---|---|
| autopilot | autopilot 帮我做一个 CLI 字数统计工具 | 自然语言触发,goal 驱动的全流程自动编排(访谈→规划→执行→双评审门→沉淀检查点) |
| ralph | ralph: 把 README 的测试徽章数字同步到当前实际值 | 显式触发:行首 ralph: 或「用 ralph …」(锚定守卫防误触发;/ralph 斜杠形态经技能面加载,同效);PRD + 证据契约的迭代循环,前台阻塞 |
| team | 用 team 调研插件市场生态并出报告 | 无关键词,只能显式调用;五阶段流水线 + 领队运行时(team_phase_transition 状态机 / team_register_worker 生命周期 / team_mail_* 信箱 / team_heartbeat_scan / team_merge_plan) |
三个斜杠命令与取消/诊断入口:
| 操作 | 命令 |
|---|---|
| 速查帮助 | /omd(模式关键词 / 技能总览 / HUD 与记忆入口) |
| 取消当前模式 | 输入 cancelomd(或 stopomd),或斜杠命令 /omd-cancel |
| 验装诊断 | /omd-doctor(注册计数 / Config / MCP 冒烟 / .omd 可写性) |
退役关键词
ultrawork/ulw/uw/ccg不再触发,命中时会提示改用 autopilot 或 team(如autopilot <你的任务>)。触发词
code review/代码评审命中的是行内指引块(轻量提示),不是完整 review 技能流程;要完整评审请显式调用(如「用 review 技能评审这次改动」)。
能力速览 / Capabilities
| 维度 | 内容 |
|---|---|
| 执行模式 | 3 种:autopilot(goal 循环)/ ralph(PRD 迭代)/ team(五阶段流水线 + 领队运行时),模式互斥 + 触发守卫防误触发 |
| 角色 | 33 个委派角色卡(omd-agent-*:OMC 19 + OMX 移植 14——api-reviewer / style-reviewer / performance-reviewer / quality-reviewer / quality-strategist / build-fixer / dependency-expert / information-architect / vision / product-analyst / product-manager / ux-researcher / researcher / explore-harness),各带档位(low 5 / medium 17 / high 11)与职责资产 |
| Skills | 49 个(中英双语资产):3 执行模式 + 规划 + 质量 + 研究 + 记忆 + 基础设施与元 + OMX 移植 4(analyze / best-practice-research / design / performance-goal) |
| MCP 工具 | 58 个(内置 omd-state MCP server):state_*×5 / notepad_*×6 / prd_*×4 / handoff_*×3 / team_*×18(c5/c6/c8 + 领队运行时 + team_cancel 取消路径) / events_*×1/ trace_*×4 / hud_*×2 / graph_*×6(U4 graph DAG 运行时:validate/run/status/resume/node_result/gate_resolve)/ 代码智能×9(ast_grep_*×2 + lsp_*×7) |
| Team 运行时 | lib/team.js:阶段状态机(team-plan→prd→exec→verify→fix(≤3,状态机强制)→终态)/ 队员 registry(workerId=UUID,runId=owner-epoch,终态不可复活)/ mailbox(in=队员→队长 progress/blocker/done/question,out=队长→队员 nudge/assign/answer)/ heartbeat(team_heartbeat_scan 按需扫描 + 插件侧周期检测定时器——检测+呈面,催促归队长模型,绝不自动杀)/ merge 计划(树∩主仓冲突候选 + 建议序,执行归模型) |
| HUD | 三层承载:web GUI 右侧边栏 omd-hud 面板(client half,lib/client.js,自适应轮询五要素卡:活跃 5s,空转退避至 ≤30s;full preset 另渲染「队员」「工具调用」两区)/ 数据路由 GET /oh-my-dsh/hud.json(loopback 私有面另聚合 team registry 为 workers、聚合 .omd/state/events.jsonl 派发事件总线为 toolCalls,MCP wire 零变化)/ MCP hud_render hud_summary(CLI 会话同款摘要) |
| 代码智能 | ast_grep_search / ast_grep_replace(结构化语法检索/重写,$VAR/$$$VARS 元变量,dryRun 默认不落盘);lsp_start/stop/status/document_symbols/references/definition/diagnostics(Config codeIntel.lspServers 注册表驱动,单实例/崩溃重启 ≤2/随 MCP server 退出回收) |
| Hook 与定时 | c2 keyword-hook(agent/pre-step 原生拦截点,唯一 hook 电线)+ team heartbeat 周期检测定时器(Config team.heartbeatIntervalMs,默认 60s,0=关闭) |
| 跨会话记忆 | omd_memory_set/get/list/delete(宿主 storage domain 承载)+ notepad 三区(priority 永久 / working 7 天 / MANUAL 永不清理)+ autopilot/ralph 收尾沉淀检查点(替代 OMC hook 自动 learner) |
| 路由 | c3 自适应路由(4 特征 + 表上限钳制 + fallback 审计)+ omd_delegate 硬路由工具(tier/model 经 spawn 路径强制生效) |
功能点对齐全景(OMC/OMX 45 功能点:✅34 / ⚠️1 / ❌0 / 🚫10 含决定记录)见 docs/feature-parity-audit.md。
配置 / Config
插件配置(cordis Config,schemastery 校验):
| 键 | 类型 / 默认 | 说明 |
|---|---|---|
language | 'zh' | 'en' | 'both',默认 'zh' | 资产语言:中文 / 英文 / 中文正文+英文术语 |
tiers.low | 模型标识,默认 'inherit' | 档位→模型映射;值可为 provider/model 或 'inherit'(继承主会话模型) |
tiers.medium | 同上,默认 'inherit' | 同上 |
tiers.high | 同上,默认 'inherit' | 同上 |
roleOverrides | dict<string>,默认 {} | 角色级覆盖,优先于 tiers,如 { "omd-agent-code-reviewer": "deepseek/deepseek-reasoner" } |
stateDir | 字符串,默认 '.omd' | 项目状态目录名(改名注意:协议与技能文档多处按 .omd/ 举例,改名后文档示例同步失效,非必要不建议改) |
autopilot.maxIterations | 自然数 ≥1,默认 10 | autopilot 最大轮次(create_goal 的 max_goal_rounds 默认值) |
autopilot.maxQaCycles | 自然数 ≥1,默认 5 | QA 循环上限 |
autopilot.maxValidationRounds | 自然数 ≥1,默认 3 | re-validation 轮次上限 |
team.heartbeatIntervalMs | 自然数,默认 60000 | 插件侧 heartbeat 周期检测间隔(0=关闭定时器;team_heartbeat_scan 按需扫描仍可用) |
team.staleAfterMs | 自然数 ≥1,默认 300000 | 队员无心跳 stale 阈值 |
hudRoute | 布尔,默认 true | HUD 数据路由 /oh-my-dsh/hud.json 开关(安全阀:该 loopback 只读路由无鉴权、?cwd= 可读任意已存在目录的 .omd 摘要——多用户/非可信本机环境可关闭;MCP hud_render 不受影响) |
hudPreset | 'minimal' | 'focused' | 'full',默认 'focused' | HUD 面板预设:minimal=纯卡文本 / focused=主模式卡+告警 / full=追加记忆三区/队员/工具调用/数据面 |
graph.stalledAfterMs | 自然数 ≥1,默认 600000 | graph run 停滞告警阈值(HUD 告警面扫描用,默认 10 分钟) |
codeIntel.astGrep | 布尔,默认 true | ast_grep_* 开关(@ast-grep/napi 缺席时工具显式报错) |
codeIntel.lspServers | dict,默认 {} | LSP 注册表:{ <name>: { command, args?, languages?, env? } }——语言服务器本体由用户环境提供 |
配置示例(写在 profile 目录的 cordis.patch.yml——如 C:\Users\<你>\.dsh\profiles\<profile>\cordis.patch.yml,不是包内自带的同名只读挂载补丁;用 - id: oh-my-dsh + config: 覆盖形式,改完重载 profile):
# <profile 目录>/cordis.patch.yml(追加一条;文件里已有其他插件条目则并列)
- id: oh-my-dsh
config:
language: zh
tiers:
low: inherit # 继承主会话
high: deepseek-reasoner
roleOverrides:
omd-agent-verifier: deepseek/deepseek-reasoner
autopilot:
maxIterations: 15
team:
heartbeatIntervalMs: 60000
codeIntel:
lspServers:
typescript:
command: typescript-language-server
args: ["--stdio"]
languages: [typescript]
「stale」阈值总表(同一术语三处语义,一处可查)
| 面 | 阈值 | 配置键 | 含义 |
|---|---|---|---|
| team 队员心跳 | 5 分钟 | team.staleAfterMs | 队员超阈值无心跳 → stale(检测+呈面,绝不自动杀) |
| 模式状态(ralph/autopilot 等非 team) | 2 小时 | 无(规格 §5.4 定值) | 状态文件超阈值未更新 → HUD/协议判 stale(只报告不自动续跑) |
| graph run 停滞 | 10 分钟 | graph.stalledAfterMs | journal 超阈值未推进且有等待节点 → HUD 告警行 |
迁移说明 / Migration(0.4.4 → 0.4.5 行为变更)
tiers 三档默认值从写死的 glm-5.3-flash 改为 'inherit'(继承主会话模型路由)。影响面:
- 已显式配置
tiers或经roleOverrides覆盖的部署:不受影响; - 经
omd_delegate显式指定model的派发:不受影响(显式 model 绕过档位表,一等硬指定); - 未做任何配置的部署:档位派发从「固定 glm-5.3-flash」变为「继承主会话模型」——成本敏感部署(希望档位派发继续走指定小模型)应在 Config 中把
tiers.<tier>显式写回具体模型 id。
状态目录 / .omd/ Layout
所有模式状态落在项目目录的 .omd/(可用 stateDir 改名),取消/崩溃后可恢复:
.omd/
├── state/
│ ├── sessions/<sessionId>/<mode>-state.json # 每会话每模式状态(active/phase/iteration)
│ ├── run-state.json # c6 七字段镜像(CAS,队长独占写)
│ ├── boulder.json # ralph 进度石
│ └── events.jsonl # U8 派发事件总线(route/fallback,append-only,读面尾部窗口 64 KiB;写面 ≥1MiB 轮转单档 events.jsonl.1——.1 归档不进读面/聚合)
├── plans/ # autopilot/team 计划
├── specs/ # 规格文档
├── prd/ # ralph PRD(JSON + reconciliation.jsonl 台账)
├── handoffs/ # team 阶段交接(五段固定格式)
├── team/<runId>/ # team 运行时:phase.json / registry.json / mailbox/{in,out}/*.jsonl
├── trace/ # trace 时间线(<traceId>.jsonl,append-only;读面 8MiB 上限——超限策略性拒绝,引导另开新 trace)
├── worktrees/ # c5 team 运行树(gitignored,两阶段拆除)
├── graph-runs/ # graph 运行(journal.jsonl + descriptor.json 快照 + outputs/ + fence 旁文件 owner.lock/owner.epoch/owner.json)
├── checkpoints/ # 恢复快照
├── logs/
├── wiki/ # LLM Wiki 知识库(index.md + log.md + 分类页)
└── notepad.md # 三区记事本(Priority 永久 / Working 7 天过期 / MANUAL 永不清理)
.omd/是运行时产物,建议加入.gitignore。
降级与依赖边界 / Graceful Degradation
- 零第三方 dsh 插件依赖:不依赖任何非
@deepseek-ai/*官方插件。 - 启动时能力探测与注册结果汇总渲染进系统提示词的能力矩阵(其中 core/storage 两项由 probe.js 实测探测;skills/mcpServer/delegate/keywordHook/teamHeartbeat/hudRoute/codeIntel/memoryTools/commands 九项为 apply 注册结果的追加记录——「注册成功」不等于「探测通过」),降级时协议指导模型走文件直读兜底:
- 核心 inject 服务(tools/skills/systemPrompt/commands)缺失 → 插件启动即报错(唯一硬依赖);
storage缺失 → 记忆工具不注册;- MCP server 挂载失败 →
state_*/notepad_*/prd_*/handoff_*/team_*/trace_*/hud_*/graph_*不可用,协议降级为直接读写.omd/文件; @ast-grep/napi缺失 →ast_grep_*显式报错(probe 记codeIntel: unavailable),LSP 不受影响;webServer缺席(CLI 会话)→ HUD 数据路由不注册(probe 记hudRoute: skipped,MCPhud_render同款可用);- 运行
/omd-doctor可随时查看当前降级状态。
- graph 运行时授权面(已知暴露面登记):descriptor 内 command 节点是经 pwsh 执行的任意 shell 行,
bin/graph-runner.mjs与 MCPgraph_run同权——只运行你撰写或信任的 descriptor。MVP 阶段为声明式信任(无 allowlist/沙箱),登记于 docs/code-quality-logic-review.md 安全节。
开发 / Development
npm test # vitest 全量(53 files / 652 tests)
npm run test:watch
lib/client.js(HUD client half)是手工维护的懒加载 CJS bundle(无构建步骤),格式经 tests/lib/client-bundle.test.js 沙箱断言;dsh web 宿主需重启以装载/更新 client 插件。
上游快照约定:reference/(gitignored 本机快照)升级 OMC/OMX 版本后,必须同轮更新 docs/upstream-form-*.md 形态卡与 docs/feature-parity-audit.md,并跑 npm test -- upstream-forms 守门(两层门:仓内一致性恒跑;reference 缺席环境漂移层 skip 属预期)。
License
MIT