oh-my-dsh
Plugins, sensible defaults, and a launcher for DeepSeek Harness (dsh) — everything you're missing, without forking upstream. 适合希望整合多服务商模型、搜索与网页抓取的用户,支持macOS、Linux,Windows需通过WSL2使用。
同名パッケージの別リポジトリ
インストール
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, skill saves, 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.