GthDevToolsConfig
Defined in: core/dist/config/shell-policy.d.ts:117
Config for GthDevToolkit — the INTERNAL, resolved dev/shell view (CFG-18: no longer an
on-disk shape; built from the GthConfig.builtInTools registry by
getEffectiveDevToolsConfig). Tools are not applied when the config is empty. Only active
in code/exec mode (and ask --write).
Properties
Section titled “Properties”run_build?
Section titled “run_build?”
optionalrun_build?:string
Defined in: core/dist/config/shell-policy.d.ts:132
Optional shell command to run the build. Not applied when config is not provided.
run_lint?
Section titled “run_lint?”
optionalrun_lint?:string
Defined in: core/dist/config/shell-policy.d.ts:127
Optional shell command to run static analysis (lint). Not applied when config is not provided.
run_single_test?
Section titled “run_single_test?”
optionalrun_single_test?:string
Defined in: core/dist/config/shell-policy.d.ts:140
Optional shell command to run a single test file.
Supports command interpolation with the ${testPath} placeholder.
Example: “npm test – ${testPath}” or “jest ${testPath}”
Example: “npm test” - the test will simply be appended
Not applied when config is not provided.
run_tests?
Section titled “run_tests?”
optionalrun_tests?:string
Defined in: core/dist/config/shell-policy.d.ts:122
Optional shell command to run tests. Not applied when config is not provided.
shell?
Section titled “shell?”
optionalshell?:boolean| {enabled?:boolean;maxOutputBytes?:number;timeout?:number; }
Defined in: core/dist/config/shell-policy.d.ts:180
Opt-in general-purpose shell tool (run_shell_command). Unlike the fixed
run_* commands above, this lets the agent run ARBITRARY shell commands it
composes itself — the agentic-coding escape hatch the deep agent otherwise
lacks (it can read/write files but not run commands).
EXT-12 — default: ON in code mode, OFF elsewhere. When this is ABSENT/undefined,
code mode emits the tool (still GATED behind the approval gate — the absent-config
default NEVER implies bypass); exec / ask --write keep it OFF. An EXPLICIT value
always wins: shell: false (or { enabled: false }) is a hard escape hatch that fully
disables it even in code. Accepts a bare boolean or an { enabled } object.
Because the model chooses the command, every invocation is gated behind the CFG-26
approvals gate (LangChain humanInTheLoopMiddleware, wired via deepagents’ interruptOn)
UNLESS approvals.mode: "bypass" turns the gate off. The gate — not string-filtering — is
the guardrail, so the command is passed through verbatim (pipes / $ / ; are all
legitimate).
The object form also tunes the EXT-9 Tier-1 hardening applied to every run
(these have safe defaults so bare shell: true is already hardened):
timeout: per-command wall-clock limit in MILLISECONDS before the child (and its process group) is killed. Default SHELL_DEFAULT_TIMEOUT_MS.maxOutputBytes: byte budget for the captured output returned to the model (head + tail window; the middle is dropped and the full output spilled to a temp file). Default SHELL_DEFAULT_MAX_OUTPUT_BYTES. Live terminal streaming is never capped.
A hardcoded hardline blocklist of catastrophic commands (rm -rf /, mkfs, dd
to a block device, fork bomb, shutdown/reboot, …) is refused even under
approvals.mode: "bypass"; that floor is not configurable.
On-disk (CFG-18) these live on the run_shell_command entry of builtInTools, e.g.
{ "builtInTools": { "run_shell_command": true } } or
{ "builtInTools": { "run_shell_command": { "timeout": 300000, "maxOutputBytes": 200000 } } }.
CFG-26 — the approval knobs that used to live here (allowlist, persistAllowlist,
judge, yolo) moved to the top-level approvals block (ApprovalsConfig); read
them through resolveApprovals, never from this object.