Skip to content

GthDevToolsConfig

Defined in: _worktrees/docs-release/gaunt-sloth/packages/core/src/config/shell-policy.ts:144

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).

optional run_build?: string

Defined in: _worktrees/docs-release/gaunt-sloth/packages/core/src/config/shell-policy.ts:159

Optional shell command to run the build. Not applied when config is not provided.


optional run_lint?: string

Defined in: _worktrees/docs-release/gaunt-sloth/packages/core/src/config/shell-policy.ts:154

Optional shell command to run static analysis (lint). Not applied when config is not provided.


optional run_single_test?: string

Defined in: _worktrees/docs-release/gaunt-sloth/packages/core/src/config/shell-policy.ts:167

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.


optional run_tests?: string

Defined in: _worktrees/docs-release/gaunt-sloth/packages/core/src/config/shell-policy.ts:149

Optional shell command to run tests. Not applied when config is not provided.


optional shell?: boolean | { enabled?: boolean; maxOutputBytes?: number; timeout?: number; }

Defined in: _worktrees/docs-release/gaunt-sloth/packages/core/src/config/shell-policy.ts:207

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.