Skip to content
Global config

Global config

The global config file is ~/.drudge/config.json. drg setup writes it when it is missing, with the answers to its questions. After that the file is yours to edit, and running drg setup again is the way to change the answers.

In a terminal, drg setup asks these questions before it writes the file:

  • drudger.harness, the harness the Drudgers run.
  • drudger.model, the model the harness runs. With no model set, Enter leaves the key out, so the harness picks its own model. With a model set, Enter keeps it and - removes the key.
  • drudger.maxConcurrentDrudgers, how many Drudgers may work on one project at once.
  • task.defaultStatus, the status of a new task.
  • remote.pullRequests.isEnabled, whether a Drudger opens pull requests. Yes also sets remote.provider to github and asks remote.pullRequests.isDraft.

Every asked key is written to the file, defaults included. --defaults, or -y, skips the questions and writes the defaults. Input that is not a terminal skips them too.

When the file exists, drg setup asks again with the values of the file preselected. A key the file does not have starts on its default. The answers are merged into the file, and every key it does not ask about stays as it is, unknown keys and $schema included. Turning pull requests off keeps remote.provider and remote.pullRequests.isDraft. A file whose answers match what it holds is left as it was. --defaults and input that is not a terminal leave an existing file alone. A file that does not load stops drg setup with the error before any question is asked.

Schema

The file starts with "$schema": "./schema/config.json", a path relative to the file. It points at ~/.drudge/schema/config.json, the local copy of the schema that drg setup rewrites on every run. An editor with JSON schema support uses it to complete keys and flag wrong values.

Defaults

Every command reads the file again, so a change applies from the next command. A missing file means every key takes its default. A key left out of the file takes the default in the table below. A key without a default stays unset. A value DRUDGE does not accept stops the command with an error that names the file and the key.

The task and remote keys, drudger.pageSize, drudger.promptFile and drudger.maxConcurrentDrudgers can be overridden per project in the project config.

Keys

KeyTypeDefaultAllowedDescription
$schemastringJSON schema reference for configuration validation
drudgerobjectSettings for the Drudgers that execute tasks.
drudger.environmentstring"docker-sbx""docker-sbx"The environment tasks run in.
drudger.harnessstring"claude-code""claude-code", "opencode"The agent harness used to run tasks.
drudger.promptFilestringFile name of the prompt handed to an agent, resolved under ~/.drudge/prompts/. Omit to use the built-in default prompt.
drudger.modelstringThe model the harness runs, passed to it as is. Claude Code takes an alias like opus or sonnet, or a full model name like claude-opus-5-5. opencode takes provider/model, like ollama/qwen3-coder. DRUDGE does not check the format. Omit to leave the choice to the harness.
drudger.maxConcurrentDrudgersinteger3minimum 1How many Drudgers may work on one project at once.
drudger.pageSizeinteger20minimum 0How many Drudgers drg drudger list shows on one page. 0 shows every Drudger on one page.
drudger.sandboxTimeoutsobjectHow long DRUDGE waits for a sandbox command before it kills it. A command that needs longer than its timeout is killed and reported.
drudger.sandboxTimeouts.listSecondsinteger30minimum 1Seconds allowed for listing the sandboxes, and for looking for a running agent in one before a launch.
drudger.sandboxTimeouts.createSecondsinteger600minimum 1Seconds allowed for creating a sandbox. A first creation pulls an image, which is why this one is generous.
drudger.sandboxTimeouts.removeSecondsinteger120minimum 1Seconds allowed for removing a sandbox, and for killing the agent in it and stopping it after a failed launch.
drudger.sandboxTimeouts.setupSecondsinteger900minimum 1Seconds allowed for each setup command of a repository, run in the sandbox before the agent starts.
drudger.sandboxTimeouts.firstOutputSecondsinteger60minimum 1Seconds a launch waits for the agent to write its first output before it kills the agent. Raise it for a model that takes longer to load. It applies to every harness.
drudger.gitTimeoutsobjectHow long DRUDGE waits for a git command before it kills it. Git has no timeout of its own.
drudger.gitTimeouts.fetchSecondsinteger15minimum 1Seconds allowed for fetching from a remote. Kept short so an unreachable remote costs seconds.
drudger.gitTimeouts.worktreeSecondsinteger600minimum 1Seconds allowed for creating a worktree, which is a full checkout.
drudger.gitTimeouts.commandSecondsinteger60minimum 1Seconds allowed for every other git command.
taskobjectSettings for tasks. A project config may override each of them.
task.defaultStatusstring"todo""todo", "draft"Status of a new task created without –status. A draft task waits for review, a todo task is ready to run.
task.branchFormatstring"drudge/{{taskShortID}}-{{taskSlug}}"Format of the names of the branches DRUDGE makes for tasks. Literal text mixes with the placeholders {{taskShortID}}, the leading characters of the task id, {{taskSlug}}, the task title folded to lowercase words joined by -, and {{ticketID}}, the ticket id of the task with its case kept and every character git refuses in a ref, / included, replaced by -. A format needs {{taskShortID}} or {{taskSlug}}. Once the placeholders are filled in, repeated / collapse into one, -, _, . and / are trimmed from both ends of every segment and empty segments are dropped. A changed format applies from the next run. Branches made before stay as they are.
task.pageSizeinteger20minimum 0How many tasks drg task list shows on one page. 0 shows every task on one page.
projectobjectSettings for projects.
project.pageSizeinteger20minimum 0How many projects drg project list shows on one page. 0 shows every project on one page.
remoteobjectSettings for the provider the repositories of a project are hosted on. A project config may override each of them.
remote.providerstring"github"The provider the repositories are hosted on. Required when pull requests are on.
remote.timeoutSecondsinteger60minimum 1Seconds allowed for one call of the provider CLI.
remote.pullRequestsobjectSettings for the pull requests DRUDGE opens.
remote.pullRequests.isEnabledbooleanfalseOpen a pull request for the work of a task. When it is off the work is merged locally. When it is on a run is refused unless the provider CLI is installed and logged in and every repository has an origin remote on the provider.
remote.pullRequests.isDraftbooleanfalseOpen pull requests as drafts.
remote.pullRequests.titleFormatstring"<a short summary of the change>"How the agent is told to write the title of a pull request, word for word. {{ticketID}} and {{taskTitle}} are filled in first.
remote.pullRequests.templateFilestringFile name of the pull request body template used for a repository that has none, resolved under ~/.drudge/prompts/. Omit to use the built-in template.
remote.pullRequests.stepsFilestringFile name of the pull request steps the prompt is given in place of {{pullRequestSteps}}, resolved under ~/.drudge/prompts/. It may use the {{titleFormat}}, {{templatePaths}} and {{defaultTemplate}} placeholders. Omit to use the built-in steps.
Last updated on