SeanTolstoyevski/dsh-code-review ↗★ 2
@local/dsh-code-review
On-demand review for DeepSeek Harness: audits the uncommitted changes in a workspace in one of its modes (code review, architecture review, or a mode the user writes) and renders the report as a card in the conversation, for the human who asked for it.
Install
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:SeanTolstoyevski/dsh-code-reviewREADME
Read the full README ↗Configuration
DSH_HOME/code-review/config.json — the harness home, which is $DSH_HOME when
that variable is set and not blank, and ~/.dsh otherwise. It is never the
current working directory: dsh web is started from wherever you happen to be,
and a config read from there would quietly be no config at all. Every key is
optional and the file is re-read on every run — tuning needs neither a restart
nor a reload, and each run logs the file it read, the mode it resolved and the
values in force.
The file is created for you and then completed, never rewritten. The first time the plugin loads in a harness home that has none — and any run that finds it gone — it writes the settings below plus both built-in modes. Any load that finds a key missing adds it: a setting this release introduced, a mode this release ships, a key you deleted. A value you wrote is never replaced, a mode of your own is never extended, and a file with nothing missing is not written to at all. A file that does not parse is reported and left exactly as it is, and that run uses the release defaults.
That gives one rule for going back: delete a key to get the current release's
default for it back, and use "enabled": false to take a built-in mode off the
command surface.
{
"mode": "cr",
"provider": "",
"model": "",
"language": "",
"source": "auto",
"gitRev": "HEAD",
"notifyAgent": "off",
"projectAccess": true,
"maxToolCalls": 30,
"maxReadBytes": 524288,
"toolDeadlineRatio": 0.8,
"maxSearchResults": 40,
"maxFiles": 25,
"maxDiffChars": 150000,
"maxHintChars": 600,
"maxTokens": 50000,
"temperature": 0.1,
"reasoningEffort": "",
"timeoutMs": 600000,
"ignored": [],
"ignoreDefaults": true,
"respectGitIgnore": true
}
| Key | Meaning |
|---|---|
mode | The mode a /review without mode= runs. |
provider, model | Reviewer route. Both empty reuses the agent's own. |
language | Report language. Empty mirrors the focus message; with no focus message the report is English. |
source, gitRev | Where the change set comes from and what git compares against. |
notifyAgent | off (default): only you see the report. steer hands it to the agent as a notice, which starts a turn; inject puts it in the agent's context without starting one. Set one of those only if you want the agent in the loop. |
projectAccess | Give the reviewer the read-only tools above. |
maxToolCalls, maxReadBytes, maxSearchResults, toolDeadlineRatio | Reader budgets. |
maxFiles, maxDiffChars | Reviewed files and total diff size; the rest are listed as left out. |
maxHintChars | Cap on the focus message you type. |
ignored | Extra ignore patterns (an array, or one string with commas or newlines between them), on top of the built-in standard list. Prefix a pattern with ! to put a path back. |
ignoreDefaults | true (default): the built-in standard list applies. false reviews dependency trees and build output like anything else. |
respectGitIgnore | true (default): the repository's own ignore rules are honored too, tracked files included. false reviews them. |
maxTokens, temperature, timeoutMs | Output cap, sampling and the budget for the whole run. A first call that fails is retried once without project access and with the output cap lowered to 8192 or to the configured value when that is smaller; the report says the run was degraded. |
reasoningEffort | The thinking level handed to the reviewer, as the adapter names it — off, low, high, max on DeepSeek. Empty (the default) sends no level, so the provider's own default decides; that is what every run did before this key existed. A mode can preset it (modes.cr.settings.reasoningEffort) and reasoningEffort= on the command line beats them both. A level the selected model does not offer is refused before any model call, and the offered levels are listed. |
modes is the one key the file holds that the table above does not list: an
object of mode entries, documented under Modes, with the built-in modes
written into it so they are editable like any other.
What wins. What you type after /review beats the mode's settings, which
beat this file, which beats the release default. A mode is a preset: arc's
maxToolCalls: 60 applies even if you set a global maxToolCalls, and changing
it means editing modes.arc.settings.maxToolCalls — or deleting the mode's
maxToolCalls and setting the global one, since a mode without it inherits.
The same holds for reasoningEffort: modes.cr.settings.reasoningEffort: "max"
makes every code review think at max while arc keeps whatever the file says,
and reasoningEffort=low on one command overrides both.
An empty value is not a value: it presets nothing and never erases the layer
below it, so a mode that writes reasoningEffort: "" inherits the file's.