Config Options
Complete reference for Candid configuration.
Schema
{
"tone": "harsh" | "constructive",
"focus": "security" | "performance" | "architecture" | "edge-case",
"mergeTargetBranches": ["branch1", "branch2"],
"exclude": ["pattern1", "pattern2"],
"commit": boolean,
"decisionRegister": {
"enabled": boolean,
"path": "string",
"mode": "lookup" | "load"
},
"ship": {
"installCommand": "string",
"buildCommand": "string",
"testCommand": "string",
"targetBranch": "string",
"autoMerge": boolean,
"additionalPrompt": "string",
"postMergeCommand": "string",
"issueTracker": {
"provider": "linear",
"enabled": boolean,
"teamPrefixes": ["string"],
"state": "string",
"prompt": "string"
}
},
"fastShip": {
"review": boolean,
"install": boolean,
"build": boolean,
"tests": boolean,
"issueTracker": boolean,
"autoMerge": boolean,
"postMergeCommand": boolean,
"targetBranch": "string"
}
}Options
tone
Review tone.
| Value | Description |
|---|---|
"harsh" | Brutal honesty, no sugar-coating |
"constructive" | Direct but caring feedback |
focus
Review focus mode.
| Value | Description |
|---|---|
"security" | Security vulnerabilities |
"performance" | Performance issues |
"architecture" | Design patterns |
"edge-case" | Unhandled scenarios |
mergeTargetBranches
Array of branches to compare against. First existing branch is used.
Default: ["main", "stable", "master"]
exclude
Array of glob patterns for files to skip.
Example: ["*.generated.ts", "vendor/*"]
commit
Whether to auto-commit applied fixes.
Default: false
decisionRegister
Configuration for tracking questions and decisions during reviews.
| Field | Type | Default | Description |
|---|---|---|---|
enabled | boolean | false | Whether to track questions during reviews |
path | string | ".candid/register" | Directory for the register file |
mode | string | "lookup" | How the register is consulted: "lookup" (per-question check) or "load" (full register in context) |
Example:
{
"decisionRegister": {
"enabled": true,
"path": ".candid/register",
"mode": "lookup"
}
}See Decision Register for full documentation.
ship
Configuration for the /candid-ship shipping workflow. All sub-fields are optional; if absent, candid-ship uses defaults or skips the corresponding step.
| Field | Type | Default | Description |
|---|---|---|---|
installCommand | string | — | Shell command to install dependencies before build (e.g. pnpm install, npm ci). Runs before buildCommand and testCommand. Skipped if not set. |
buildCommand | string | — | Shell command for build verification before creating the PR. Skipped if not set. |
testCommand | string | — | Shell command for running tests before creating the PR. Skipped if not set. |
targetBranch | string | first mergeTargetBranches or "main" | Branch to target for the PR. |
autoMerge | boolean | false | Auto-merge the PR after creation via gh pr merge --squash --auto. |
additionalPrompt | string | — | Extra context passed to candid-loop/review during the review step. |
postMergeCommand | string | — | Shell command to run after auto-merge succeeds. Skipped if auto-merge is disabled or fails. |
issueTracker | object | — | Issue tracker auto-update config (see below). Opt-in. |
Example (minimal):
{
"ship": {
"targetBranch": "main"
}
}Example (full pipeline):
{
"ship": {
"installCommand": "pnpm install",
"buildCommand": "pnpm build",
"testCommand": "pnpm test",
"targetBranch": "stable",
"autoMerge": true,
"additionalPrompt": "Ensure error handling covers all async operations",
"postMergeCommand": "curl -X POST https://deploy.example.com/trigger"
}
}See Candid Ship for full documentation.
ship.issueTracker
Optional auto-update of an external issue tracker after the PR is created. Currently provider: "linear" is the only supported provider; this field can be safely left unset, in which case the issue-tracker step is skipped silently and the rest of the ship runs unchanged.
| Field | Type | Default | Description |
|---|---|---|---|
provider | string | "linear" | Issue tracker name. Only "linear" is supported today. Other values produce a warning with a link to request support and the step is skipped. |
enabled | boolean | false | Whether to attempt the issue update. Opt-in. |
teamPrefixes | string[] | ["DIS", "ENG", "DISC"] | Team key prefixes to match in branch names. Edit this list to match your tracker workspace’s team keys. |
state | string | "In Review" | Workflow state to transition the issue to. Must match a state name in your tracker exactly (case-sensitive). |
prompt | string | (see default) | Customizable prompt template sent to the tracker’s MCP. Supports {issueId}, {state}, {provider} placeholders. Must restrict the action to a single issue. |
Default prompt:
Update issue {issueId}: set its state to "{state}". Update only this one issue and only its state — do not modify any other issues, fields, or properties. If the issue is already in "{state}", report success without action. If the issue is missing or inaccessible, report the error and stop.This default encodes four safety invariants so a verbose MCP can’t accidentally fan out:
- Single issue — only
{issueId}is touched. - Single field — only the
statefield changes (assignees, labels, priority, etc. are untouched). - Idempotent — already in
{state}? Succeed without action. - No fallback search — missing or inaccessible? Stop. Don’t look for “similar” issues.
candid-init writes this default into .candid/config.json so it’s discoverable and easy to edit. Custom prompts must preserve invariants 1 and 4.
Example:
{
"ship": {
"issueTracker": {
"provider": "linear",
"enabled": true,
"teamPrefixes": ["DIS", "ENG"],
"state": "In Review"
}
}
}Behavior when not configured or disabled:
issueTrackerfield absent → step skipped silentlyenabled: false→ step skipped silently- branch name has no matching team prefix → step skipped silently (branches without an issue ID just ship normally)
- provider’s MCP is not installed → warning shown, step skipped, ship continues
- provider is unsupported (anything other than
"linear") → warning with link to issue tracker, step skipped, ship continues
See Candid Ship — Issue Tracker Integration for full setup and usage.
fastShip
Configuration for the /candid-fast-ship minimal shipping workflow. All steps are opt-in — nothing runs by default except PR creation. Command values are inherited from the ship block.
| Field | Type | Default | Description |
|---|---|---|---|
review | boolean | false | Run candid-loop code review. |
install | boolean | false | Run ship.installCommand. Skipped if not configured in ship. |
build | boolean | false | Run ship.buildCommand. Skipped if not configured in ship. |
tests | boolean | false | Run ship.testCommand. Skipped if not configured in ship. |
issueTracker | boolean | false | Update issue tracker after PR creation. Uses ship.issueTracker config. |
autoMerge | boolean | false | Auto-merge the PR after creation. |
postMergeCommand | boolean | false | Run ship.postMergeCommand after auto-merge succeeds. |
targetBranch | string | from ship.targetBranch or mergeTargetBranches | PR target branch override. |
Example (install + build check + auto-merge, no review):
{
"ship": {
"installCommand": "pnpm install",
"buildCommand": "pnpm build",
"targetBranch": "stable"
},
"fastShip": {
"install": true,
"build": true,
"autoMerge": true
}
}See Candid Fast Ship for full documentation.
Config Precedence
- CLI flags
- Project config (
.candid/config.json) - User config (
~/.candid/config.json) - Interactive prompt