oh-my-dsh
oh-my-dsh:为 DeepSeek Harness (dsh) 提供插件、合理的默认配置以及启动器,无需 Fork 上游即可补全缺失功能。
AI 分析
核心用途是简化 DSH 的配置与启动流程。适合希望开箱即用、一键配置多模型适配器及安全搜索功能的 DSH 用户。需要 Node.js 环境支持。
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:amplifthq/oh-my-dsh说明文档
阅读完整 README ↗Configuration
Models
Configure DeepSeek or upstream's multi-provider adapter in the Web Models page. The latter supports OpenAI, Anthropic, Google, OpenRouter, and compatible gateways.
Search and fetch
Search selection follows:
DSH_WEB_SEARCH_PROVIDER- Exa when
EXA_API_KEYis present - Perplexity when
PERPLEXITY_API_KEYis present - DeepSeek search
HTTP fetch is on by default and routes through OMD's hardened provider. IP-literal and conventionally-local destinations are rejected before any request, and every DNS resolution is re-validated at connect time, so redirects and DNS rebinding cannot reach loopback, private-range, link-local, or cloud-metadata addresses. Upstream's own provider ships without this protection, which is why fetch stays off in the reference setup — OMD closes the gap instead of inheriting the friction. (The previous OMD_ENABLE_WEB_FETCH opt-in is superseded.)
OMD_DISABLE_WEB_FETCH=1 omd # turn the fetch tool off entirely
OMD_WEB_FETCH_ALLOW_PRIVATE=1 omd # allow private/internal destinations (trusted networks only)
DSH_WEB_FETCH_PROVIDER=http omd # explicit opt-out to upstream's unprotected provider
When fetch is disabled, shell fetches of public URLs (curl, wget, HTTPie) prompt for approval instead of silently bypassing the missing tool — the common failure mode where a model degrades to curl with a spoofed browser User-Agent. Fetches of local and private URLs (curl localhost:3000) are never intercepted.
Advisor
The advisor is disabled until both values are configured:
export OMD_ADVISOR_PROVIDER=anthropic
export OMD_ADVISOR_MODEL=claude-fable-5
omd
It adds latency and another model call to each reviewed turn.
Debugging
Debug Adapter Protocol support is off by default:
OMD_ENABLE_DEBUG=1 omd
debug_control adapters lists what was discovered: debugpy (when importable by python3/python), lldb-dap (when on PATH), plus custom stdio adapters from plugin configuration. Launching or attaching always returns a proposal; only proposal_control apply with user approval spawns the adapter and debuggee. An approved session supports breakpoints, stepping, stack and variable inspection, and expression evaluation inside the debuggee process — that evaluation capability is stated in the approval text. Debuggee programs and breakpoint files must stay inside the workspace, and runInTerminal reverse requests are rejected.
Local overrides
Edit either profile's cordis.patch.yml for profile-specific changes. omd setup preserves these files. $DSH_HOME/cordis.patch.yml applies after every profile and therefore has the final word.
Proposal and recovery lifecycle
Capability activation, debug launch/attach, and source mutation use the same prepare → inspect → approve → commit → verify lifecycle. A proposal is session-local and cannot authorize itself; applying it always reaches the upstream approval service.
Semantic refactors accept text-only WorkspaceEdit results. Resource create/delete/rename operations, server-driven workspace/applyEdit, and workspace/executeCommand are rejected. Recovery journals live under $DSH_HOME/omd/refactors/ with mode 0600 and are deleted after successful apply or rollback. They make interrupted work recoverable, but do not claim filesystem-wide crash atomicity.