Skip to content

Settings reference ​

ctrlyoke reads its settings from two settings.json files. Both use the same shape:

  • User scope: ~/.ctrlyoke/settings.json. Applies to every workspace.
  • Workspace scope: .ctrlyoke/settings.json in the workspace. Applies only to that workspace and overrides user values.

Objects merge key by key across the two files. An array or a single value in the workspace file replaces the user value entirely. The one exception is permissions.trustedExternalRoots: ctrlyoke combines the roots from both files. When you run the ctrlyoke CLI, the flags you pass override both files for that run.

Some settings are machine-specific and are read only from user scope: worktrees, storage, statusLine, and usageTracking.enabled. ctrlyoke ignores these settings in a workspace file.

The dashboard's Settings page edits these files for you. If you edit a file by hand in VS Code, ctrlyoke checks every .ctrlyoke/settings.json against its settings schema, so completion and error checking work as you type. Don't add a $schema key in VS Code: a $schema URL replaces the extension's bundled schema, so VS Code downloads the published copy instead, which fails offline and needs ctrlyoke.dev in json.schemaDownload.trustedDomains. In other editors, set $schema to https://ctrlyoke.dev/schema/v1/settings.json. Every key is optional, and a key you leave out keeps the default shown below.

json
{
  "defaults": {
    "harness": "claude-cli",
    "models": { "claude-cli": "sonnet" },
    "executionMode": "headless"
  },
  "execution": { "scriptTimeoutSec": 120 },
  "queue": { "maxParallelSteps": 4 }
}

Settings under defaults set the starting values for workflow fields. A workflow or step that sets the same field overrides them. See the workflow schema reference for the workflow fields.

SectionPurpose
generalGeneral format, template, and behavior settings.
defaultsDefault execution properties applied to all new workflows (mirrors ExecutionProperties).
worktreesUser-only worktree checkout placement configuration.
coordinationRetention and participant settings for the execution-root coordination board.
storageUser-only storage location configuration.
permissionsHarness-specific path and sandbox permission settings.
usageTrackingControls workspace-local provider quota and observed-usage collection.
executionExecution settings.
queueQueue management settings.
runsExecution run retention settings.
terminalEmbedded terminal settings.
uiUI display settings.
serverctrlyoke hosted server settings.
notificationsNotification settings.
commitCommit message generation settings.
statusLineMachine-only settings for providers that install a global statusline command.
diagnosticsLogging and diagnostic output settings.
Top-level settingsSettings that sit directly at the root of settings.json.
Shared typesValue shapes referenced by more than one setting.

general ​

General format, template, and behavior settings.

general.defaultFormat ​

  • Type: "yaml" | "json"
  • Default: "yaml"

Default file format for new workflows.

general.defaultTemplate ​

  • Type: string
  • Default: "blank"

Default template to use for new workflows.

general.autoLoadRecentSession ​

  • Type: boolean
  • Default: true

Automatically load the most recent session on startup.

general.omitPreviouslyAttachedAgentsSkillsOnResume ​

  • Type: boolean
  • Default: true

When resuming an existing session, omit only agent/skill declarations that were already attached earlier in that same session.

general.includeFullDiffsInPriorContext ​

  • Type: boolean
  • Default: true

Include full file diffs in captured AI responses so later prior-context attachments contain the actual changes instead of edit summaries.

defaults ​

Default execution properties applied to all new workflows (mirrors ExecutionProperties).

defaults.harness ​

  • Type: "copilot-cli" | "claude-cli" | "codex-cli" | "opencode-cli" | "qwen-cli" | "antigravity-cli"
  • Default: "copilot-cli"
  • Workflow field: harness — a workflow or step value overrides this default

The default harness to use for new workflows.

defaults.models ​

  • Type: { copilot-cli?, claude-cli?, codex-cli?, … }

The default model to use for each harness for new workflows.

Default value
json
{
  "copilot-cli": "claude-sonnet-4.6",
  "claude-cli": "sonnet",
  "codex-cli": "gpt-5.5",
  "opencode-cli": "opencode/big-pickle",
  "qwen-cli": "qwen3.5-plus",
  "antigravity-cli": "gemini-3.6-flash-medium"
}

Fields:

  • copilot-cli · string
  • claude-cli · string
  • codex-cli · string
  • opencode-cli · string
  • qwen-cli · string
  • antigravity-cli · string

defaults.additionalArgs ​

  • Type: { copilot-cli?, claude-cli?, codex-cli?, … }
  • Default: {}
  • Workflow field: additionalArgs — a workflow or step value overrides this default

The default additional CLI arguments for each harness for new workflows.

Fields:

  • copilot-cli · string
  • claude-cli · string
  • codex-cli · string
  • opencode-cli · string
  • qwen-cli · string
  • antigravity-cli · string

defaults.agent ​

  • Type: string or "" or null
  • Default: ""
  • Workflow field: agent — a workflow or step value overrides this default

Default portable ctrlyoke workflow agent attachment for new workflows. Native harness agent discovery is managed separately by the Agents & Skills settings page.

Accepted forms:

  • string matching ^[a-zA-Z0-9-_]+$
  • "" — Empty string means no agent — the form the dashboard's "None" selection serializes to. Distinct from null, which explicitly disables an inherited agent.
  • null

defaults.skills ​

  • Type: string[] or null
  • Default: []
  • Workflow field: skills — a workflow or step value overrides this default

Default portable ctrlyoke workflow skill attachments for new workflows. Native harness skill discovery is managed separately by the Agents & Skills settings page and does not determine workflow skill support.

defaults.secrets ​

  • Type: string[] or null
  • Default: []
  • Workflow field: secrets — a workflow or step value overrides this default

Default secret environment-variable names granted to new workflows. Values are resolved by the execution host and never stored in workflow definitions.

defaults.executionMode ​

  • Type: "interactive" | "headless"
  • Default: "interactive"
  • Workflow field: executionMode — a workflow or step value overrides this default

Default execution mode for new workflows. 'interactive' spawns a live terminal (TUI) the user can steer; 'headless' runs in the background with output in the Output panel. Workflows and individual steps can override this.

defaults.resumeSession ​

  • Type: boolean
  • Default: false
  • Workflow field: resumeSession — a workflow or step value overrides this default

Resume an existing session when running a workflow.

defaults.priorContext ​

  • Type: "all" | "previous" | "none" | "finalStepAll" | "finalStepPrevious" or integer[] or { previous }
  • Default: "none"
  • Workflow field: priorContext — a workflow or step value overrides this default

Default priorContext for every step that doesn't set its own.

Fields:

  • previous · integer · required — How many of the most recent earlier outputs to include

defaults.mcpServers ​

  • Type: array of (string or { id: "ctrlyoke", deniedTools? } or { id, description?, command?, … })
  • Default: []
  • Workflow field: mcpServers — a workflow or step value overrides this default

Default MCP servers to attach to each prompt execution.

When id is "ctrlyoke":

Fields:

  • deniedTools · string[]

Fields:

  • id · string · required — Unique server identifier
  • description · string — Human-readable description shown in MCP Manager. ctrlyoke-only metadata — deliberately omitted by every harness export path so it never leaks an unrecognized key into an external tool's native config file.
  • command · string — Command to run the MCP server process (stdio servers, e.g. "npx" or "node")
  • args · string[] — Arguments to pass to the command (stdio servers only)
  • env · map of string — Environment variables for the server process (stdio servers only)
  • autoApprove · boolean or string[] — Tools to auto-approve: true = all tools, string[] = specific tools
  • url · string — Remote endpoint URL for streamable-http or SSE servers (e.g. "https://mcp.example.com")
  • transport · "streamable-http" | "sse" — Transport protocol for remote servers. Defaults to "streamable-http".
  • headers · map of string — HTTP headers to send with every request (remote servers only, e.g. { "Authorization": "Bearer token" }). Secret references are allowed as ${secret:NAME} values.
  • deniedTools · string[] — Tool names from this server to deny at execution time. Use bare tool names without the mcp__<serverid>__ prefix (e.g. ["append_step"]). Translated to mcp__<id>__<tool> deny patterns and merged into the harness permission args. Supported on harnesses that accept tool deny patterns.

defaults.hooks ​

  • Type: array of { event, command, env?, … }
  • Default: []
  • Workflow field: hooks — a workflow or step value overrides this default

User-defined hooks to run at various execution lifecycle points.

Fields:

  • event · "stop" | "sessionStart" | "preToolUse" | "postToolUse" | "userPromptSubmit" | "permissionRequest" | "notification" | "error" · required — Logical hook event. Unsupported events for the active harness are silently skipped. 'stop' maps to Stop (Claude/Qwen/Antigravity), agentStop (Copilot), notify (Codex). 'notification' maps to Notification (Claude/Qwen), notification (Copilot), and is n/a for Codex/Antigravity/OpenCode.
  • command · string · required — Command to execute. Resolved relative to workspace root if not absolute.
  • env · map of string — Environment map consumed by the hook process. Secret references are allowed only as ${secret:NAME} values.
  • timeoutSec · integer — Timeout in seconds. Only respected by CLIs that support per-hook timeouts.

defaults.errorBehavior ​

  • Type: { onError, maxRetries?, retryDelaySec? } or null
  • Default: null
  • Workflow field: errorBehavior — a workflow or step value overrides this default

Default policy for internal errors in any step phase. null (the default) stops the workflow unless the workflow or step sets its own policy.

Fields:

  • onError · "stopWorkflow" | "retry" | "continue" · required — What to do when a step phase cannot run or otherwise encounters an internal error.
  • maxRetries · integer — Maximum retry attempts when onError is retry. When omitted, one retry is allowed.
  • retryDelaySec · number — Delay before retrying, in seconds.

defaults.toolPermissions ​

  • Type: { mode?, allowedTools?, deniedTools? } or null
  • Workflow field: toolPermissions — a workflow or step value overrides this default

Default tool permission settings for prompt execution. Allowed Tools and Denied Tools are currently supported by Copilot CLI, Claude CLI, Qwen Code, and OpenCode; Qwen is inline granular support and OpenCode uses OPENCODE_CONFIG_CONTENT without writing a workspace opencode.json. Codex and Antigravity only support an overall permission mode, not individual tool patterns, and do NOT ENFORCE these lists.

Accepted forms:

  • { mode?, allowedTools?, deniedTools? } — Per-workflow/prompt tool permission overrides. Follows three-tier precedence: prompt > workflow > the defaults.toolPermissions setting.
  • null
Default value
json
{
  "mode": "allowAll",
  "allowedTools": [
    "write",
    "shell(git status)",
    "shell(git diff)",
    "shell(git add:*)",
    "shell(git commit:*)",
    "shell(git log:*)",
    "shell(npm:*)",
    "shell(yarn:*)",
    "shell(pnpm:*)",
    "shell(node:*)",
    "shell(npx:*)"
  ],
  "deniedTools": [
    "shell(rm:*)",
    "shell(del:*)",
    "shell(Remove-Item:*)",
    "shell(rd:*)",
    "shell(rmdir:*)",
    "shell(sudo:*)",
    "shell(chmod:*)",
    "shell(chown:*)",
    "shell(git push:*)",
    "shell(git reset:*)",
    "shell(git checkout:*)",
    "shell(git clean:*)",
    "shell(docker rm:*)",
    "shell(docker rmi:*)",
    "shell(kubectl delete:*)"
  ]
}

Fields:

  • mode · "dangerouslyAllowAll" | "allowAll" | "custom" | "none" — Permission mode. 'dangerouslyAllowAll' bypasses all restrictions. 'allowAll' auto-grants all but respects deny list. 'custom' uses allowedTools + deniedTools only. 'none' passes no permission flags at all — it does not deny tools; the harness applies whatever permissions are configured in its own local settings (e.g. ~/.claude/settings.json, Copilot CLI config).
  • allowedTools · string[] — Tool patterns to allow (used in custom mode). Currently supported by Copilot CLI, Claude CLI, Qwen Code, and OpenCode. Qwen uses inline granular support. OpenCode delivers permissions through OPENCODE_CONFIG_CONTENT and writes no workspace opencode.json. Codex and Antigravity only support an overall permission mode, not individual tool patterns; Allowed Tools are NOT ENFORCED by those harnesses.
  • deniedTools · string[] — Tool patterns to deny (takes precedence over allow list). Currently supported by Copilot CLI, Claude CLI, Qwen Code, and OpenCode. Qwen uses inline granular support. OpenCode delivers permissions through OPENCODE_CONFIG_CONTENT and writes no workspace opencode.json. Codex and Antigravity only support an overall permission mode, not individual tool patterns; Denied Tools are NOT ENFORCED by those harnesses.

defaults.endCondition ​

  • Type: { script, env?, compareSource?, … } or null
  • Default: null
  • Workflow field: endCondition — a workflow or step value overrides this default

Default end condition for new workflows. null (the default) means new workflows have no end condition.

Fields:

  • script · string · required — Shell command or path to script. Resolved relative to workspace root or .ctrlyoke/.
  • env · map of string — Environment map consumed by the script process. Secret references are allowed only as ${secret:NAME} values.
  • compareSource · "stdout" | "stderr" | "exitCode" — Which output the comparison reads. Default: 'exitCode'. 'stdout'/'stderr' compare the trimmed text; 'exitCode' compares the numeric exit code. There is no implicit clean-exit requirement layered onto a text comparison.
  • returns · removed — Removed — renamed to expected, and 'true'/'false' are no longer mapped onto exit codes. Omit it entirely to pass on exit code 0.
  • timeoutSec · number — Timeout in seconds. When omitted, the execution.scriptTimeoutSec setting applies.
  • shell · string — Pin the shell that runs this script's inline text. Used only when script is inline text rather than a path to a script file with a known extension. Free-form executable name or path, e.g. "pwsh", "bash", "cmd". Overrides the terminal.shellExecutable setting for this one script; falls back to it, then platform auto-detect, when omitted.
  • operator · "eq" | "ne" | "contains" | "notContains" | "gte" | "gt" | "lte" | "lt" | "matches" | "isEmpty" | "isNotEmpty" — How the compare source is compared against expected. Default: 'eq' (whole-value literal match on trimmed text; numeric when compareSource is exitCode). 'contains'/'notContains' are substring tests. 'gte'/'gt'/'lte'/'lt' are numeric and fail when either side is not a number. 'matches' treats expected as an unanchored regular expression — add ^ and $ to require a full match. 'isEmpty'/'isNotEmpty' take no expected. Word tokens only: operator: >= is a YAML parse error and operator: != silently parses as a YAML tag.
  • expected · string or number — Value the compare source is compared against. Omit it to pass when the script exits 0 — there is no boolean form, and 'true'/'false' are not accepted as exit-code values. Omitting it while compareSource or operator states a comparison is allowed but ignores that comparison and still falls back to exit code 0; the dashboard flags this as a warning rather than refusing the workflow.
  • ignoreCase · boolean — Compare text case-insensitively. Applies only to eq/ne/contains/notContains. Default: false.
  • maxRetries · -1 or integer — Maximum number of retry attempts. -1 means unlimited. 0 means no retries by default, or 1-100 for a specific limit. When onPass or onFail is 'retry' and this field is omitted, one retry is allowed.
  • retryPrompt · string — Template for retry prompt. Supports $preCondition:<field> and $endCondition:<field> for condition output fields (stdout, stderr, exitCode, actual, expected, compareSource). $preCondition:* works in the step and retry prompts; $endCondition:* is only available in the retry prompt.
  • passRetryPrompt · string — Template for the prompt sent after the end condition passes and onPass is 'retry'. Supports $preCondition:<field> and $endCondition:<field> for condition output fields (stdout, stderr, exitCode, actual, expected, compareSource); both prefixes are substituted on a pass retry. If omitted, the step's own prompt is re-sent.
  • resumeSessionOnRetry · boolean — Whether retries continue in the same session. Default: true (retries resume the existing session for context continuity). Set to false to start a fresh session for each retry.
  • onPass · "continue" | "retry" | "stopWorkflow" — What to do when the end condition passes. 'continue': advance to the next step (default). 'retry': re-run the step's prompt while the condition keeps passing, up to maxRetries; exhausting the retries advances to the next step. A failure during the loop is handled by onFail. 'stopWorkflow': halt execution immediately.
  • onFail · "continue" | "retry" | "stopWorkflow" — What to do when end condition fails. 'retry': re-run the AI prompt (up to maxRetries times); if retryPrompt is omitted, a fallback prompt includes the expected and actual values and script output. When maxRetries is omitted, one retry is allowed. 'continue': advance to the next step even if validation fails. 'stopWorkflow': halt execution (default). A retryPrompt alone does not enable retries; set maxRetries above 0 on the condition or in defaults.endCondition.maxRetries, or use onFail: retry.

defaults.preCondition ​

  • Type: { script, env?, compareSource?, … } or null
  • Default: null
  • Workflow field: preCondition — a workflow or step value overrides this default

Default pre-condition for new workflows. null (the default) means new workflows have no pre-condition.

Fields:

  • script · string · required — Shell command or path to script. Resolved relative to workspace root or .ctrlyoke/.
  • env · map of string — Environment map consumed by the script process. Secret references are allowed only as ${secret:NAME} values.
  • compareSource · "stdout" | "stderr" | "exitCode" — Which output the comparison reads. Default: 'exitCode'. 'stdout'/'stderr' compare the trimmed text; 'exitCode' compares the numeric exit code. There is no implicit clean-exit requirement layered onto a text comparison.
  • returns · removed — Removed — renamed to expected, and 'true'/'false' are no longer mapped onto exit codes. Omit it entirely to pass on exit code 0.
  • timeoutSec · number — Timeout in seconds. When omitted, the execution.scriptTimeoutSec setting applies.
  • shell · string — Pin the shell that runs this script's inline text. Used only when script is inline text rather than a path to a script file with a known extension. Free-form executable name or path, e.g. "pwsh", "bash", "cmd". Overrides the terminal.shellExecutable setting for this one script; falls back to it, then platform auto-detect, when omitted.
  • operator · "eq" | "ne" | "contains" | "notContains" | "gte" | "gt" | "lte" | "lt" | "matches" | "isEmpty" | "isNotEmpty" — How the compare source is compared against expected. Default: 'eq' (whole-value literal match on trimmed text; numeric when compareSource is exitCode). 'contains'/'notContains' are substring tests. 'gte'/'gt'/'lte'/'lt' are numeric and fail when either side is not a number. 'matches' treats expected as an unanchored regular expression — add ^ and $ to require a full match. 'isEmpty'/'isNotEmpty' take no expected. Word tokens only: operator: >= is a YAML parse error and operator: != silently parses as a YAML tag.
  • expected · string or number — Value the compare source is compared against. Omit it to pass when the script exits 0 — there is no boolean form, and 'true'/'false' are not accepted as exit-code values. Omitting it while compareSource or operator states a comparison is allowed but ignores that comparison and still falls back to exit code 0; the dashboard flags this as a warning rather than refusing the workflow.
  • ignoreCase · boolean — Compare text case-insensitively. Applies only to eq/ne/contains/notContains. Default: false.
  • onPass · "continue" | "skipPrompt" | "stopWorkflow" — What to do when the pre-condition check passes (script exits 0 / returns matches). 'continue': run the prompt (default). 'skipPrompt': skip this prompt and advance the queue. 'stopWorkflow': halt execution.
  • onFail · "continue" | "skipPrompt" | "stopWorkflow" — What to do when the pre-condition check fails. 'continue': run the prompt anyway (pre-condition is advisory). 'skipPrompt': skip this prompt and advance the queue (default). 'stopWorkflow': halt execution.

defaults.worktree ​

  • Type: false or true or string or { mode: "managed", merge?, keep?, … } or { mode: "named", branch, base?, … }
  • Default: false
  • Workflow field: worktree — a workflow or step value overrides this default

Default worktree behavior for workflows that omit a root worktree value. Uses the same false, shorthand, and object forms as workflow worktree; an inherited value degrades to ordinary execution when the workspace is not eligible.

Accepted forms:

  • false — Explicitly run this workflow in the ordinary workspace.
  • true — Managed-worktree shorthand.
  • string — Named-worktree branch shorthand. The value must be a valid local Git branch name.
  • { mode: "managed", merge?, keep?, … } — Managed creates a throw-away worktree and branch per run and removes the directory when the workflow completes, leaving the branch for review; pick it for isolated runs you will not follow up on.
  • { mode: "named", branch, base?, … } — Named targets a persistent worktree you own, which ctrlyoke never commits, merges, or removes; pick it for conversational workflows you will append to.

When mode is "managed":

Fields:

  • merge · boolean — Merge the managed branch into the captured source checkout after the run.
  • keep · boolean — Keeps the managed worktree directory after the run instead of removing it. Without it, appending a follow-up prompt recreates the directory from the branch; ignored files such as node_modules are gone and the setup command runs again, so a long setup pays that cost on every append. Removing the directory also ends filesystem undo for that run.
  • base · string — Optional Git ref resolved to a commit when the worktree is created.
  • setup · string — Optional setup command run after a new managed worktree is created. Setup is outside the step-scoped errorBehavior policy: it runs before any step is in flight, so a non-succeeded setup blocks the worktree and the next Run re-runs it; a succeeded outcome is skipped.

When mode is "named":

Fields:

  • branch · string · required — Local Git branch name for the named worktree.
  • base · string — Optional Git ref resolved to a commit when the worktree is created.
  • setup · string — Optional setup command run after a new named worktree is created. Setup is outside the step-scoped errorBehavior policy: it runs before any step is in flight, so a non-succeeded setup blocks the worktree and the next Run re-runs it; a succeeded outcome is skipped.

worktrees ​

User-only worktree checkout placement configuration.

worktrees.root ​

  • Type: string
  • Default: ""

Absolute or ~-prefixed directory where ctrlyoke creates worktrees.

coordination ​

Retention and participant settings for the execution-root coordination board.

coordination.readNotesPageSize ​

  • Type: integer
  • Default: 50
  • Constraints: minimum 1

Maximum number of coordination entries returned by one read_notes page. Reads are always paged.

coordination.maxNoteLength ​

  • Type: integer
  • Default: 2000
  • Constraints: minimum 1

Maximum number of characters in a coordination note.

coordination.maxEntries ​

  • Type: integer
  • Default: 1000
  • Constraints: minimum 1

Maximum number of coordination entries retained after compaction.

coordination.maxBoardBytes ​

  • Type: integer
  • Default: 5242880
  • Constraints: minimum 1

Hard maximum size of the coordination board in bytes.

coordination.maxEntryAgeDays ​

  • Type: number
  • Default: 7
  • Constraints: minimum 1

Remove coordination notes older than this many days during compaction.

coordination.cliParticipantTtlMinutes ​

  • Type: number
  • Default: 30
  • Constraints: minimum 1

Lease lifetime for participants delivered through the CLI or built-in skill.

coordination.allowExternalParticipants ​

  • Type: boolean
  • Default: true

Allow participants not launched by ctrlyoke to join the coordination board.

storage ​

User-only storage location configuration.

storage.runHistoryLocation ​

  • Type: "user" | "workspace"
  • Default: "user"

Store run history under the user state home or beside the workspace.

storage.trashRetentionDays ​

  • Type: integer
  • Default: 30
  • Constraints: minimum 1

Days a deleted run or workflow stays in Recently deleted before it is permanently removed. Every history delete, including Clear all history, moves runs to Recently deleted, where they can be restored until then.

permissions ​

Harness-specific path and sandbox permission settings.

External file roots ​

Workspace files are always trusted. To let ctrlyoke use a directory outside the workspace, add it to permissions.trustedExternalRoots:

json
{
  "permissions": {
    "trustedExternalRoots": ["C:/Users/me/.codex/sessions", "C:/temp/repros"]
  }
}
  • User scope: trusted immediately, because you edited your own settings file.
  • Workspace scope: treated as a request. Each machine must approve it once, through the prompt in VS Code or by running ctrlyoke trust-external-roots in the workspace. Add --yes to approve every pending root without being asked. ctrlyoke stores approvals on the local machine and never writes them into the workspace settings file.

Roots from the user and workspace files are combined. They don't replace each other.

A single workflow can inherit, replace, or disable this set with its trustedExternalRoots field. To approve the new roots a workflow declares, use ctrlyoke trust-workflow-external-roots <file>.

permissions.codexSandboxMode ​

  • Type: "read-only" | "workspace-write" | "danger-full-access"
  • Default: "workspace-write"

Sandbox mode for Codex CLI.

permissions.codexApprovalPolicy ​

  • Type: "untrusted" | "on-request" | "never"
  • Default: "on-request"

Approval policy for Codex CLI tool calls.

permissions.trustedExternalRoots ​

  • Type: string[]
  • Default: []

Absolute directory paths outside the workspace that ctrlyoke may read for prompt attachments and open from file links. Workspace files are always allowed. User-scope entries are trusted immediately; workspace-scope entries require a one-time batch approval before they take effect.

permissions.heuristicSecretRedactionEnabled ​

  • Type: boolean
  • Default: true

Apply pattern-based heuristics (e.g. 'token=...', 'Bearer ...', private-key blocks) when redacting logs, transports, exports, and history, in addition to exact matches of resolved managed/env secret values. Exact-value redaction of secrets ctrlyoke actually resolved always stays on regardless of this setting. Disable this if the heuristics are over-matching and corrupting legitimate output, such as code samples or public identifiers that merely look like credentials.

usageTracking ​

Controls workspace-local provider quota and observed-usage collection.

usageTracking.enabled ​

  • Type: boolean
  • Default: true

Enable usage collection for ctrlyoke-started harness sessions.

usageTracking.providerRefreshEnabled ​

  • Type: boolean
  • Default: true

Allow provider quota refreshes from configured collectors.

usageTracking.persistObservedUsage ​

  • Type: boolean
  • Default: true

Persist normalized observed usage in the workspace.

usageTracking.warningPercentUsed ​

  • Type: number
  • Default: 80
  • Constraints: minimum 0 · maximum 100

Quota usage percentage at which ctrlyoke starts warning that a provider limit is close.

usageTracking.percentDirection ​

  • Type: "used" | "remaining"
  • Default: "used"

Whether quota percentages are displayed as used or remaining.

execution ​

Execution settings.

execution.injectMode ​

  • Type: boolean
  • Default: true

When true, keeps the TUI alive between prompts and writes follow-up prompts directly into the PTY. Faster than restarting and avoids the Claude Code resume cache bug.

execution.closeTerminalOnComplete ​

  • Type: boolean
  • Default: false

Automatically close the terminal when execution completes.

execution.autoDeleteTempFiles ​

  • Type: boolean
  • Default: true

Automatically delete categorized prompt temp files after execution. Set to false to retain files in .ctrlyoke/temp/ for debugging.

execution.contextResolutionFailure ​

  • Type: "warn" | "fail"
  • Default: "warn"

How to handle a declared reference that fails to resolve: a missing/invalid secret (!NAME), an unknown skill (/skill:) or MCP server (/mcp:), an unresolved @file/#selection/#sym reference, or an unresolved ~diff/~staged/~stash/~<hash> git reference. 'warn' (default) reports a diagnostic and lets the step run anyway. 'fail' stops the step before the harness spawns, naming the unresolved reference.

execution.maxPromptTimeoutSec ​

  • Type: -1 or integer
  • Default: -1

Maximum time in seconds to wait for a prompt to complete. -1 means unlimited.

execution.scriptTimeoutSec ​

  • Type: number
  • Default: 3600

Maximum time in seconds for pre-condition, end-condition, and script-step scripts to run. A script's own timeoutSec (in seconds) overrides it.

execution.ctrlyokeMcpMode ​

  • Type: "native" | "skill"
  • Default: "native"

Whether ctrlyoke's own MCP server is attached natively or replaced with the built-in MCP tools skill. Only affects ctrlyoke's server, not other MCP servers configured in a workflow.

queue ​

Queue management settings.

queue.maxParallelSteps caps how many members of a parallel group run at once. If a group has more members than the cap, the extra members wait for a free slot. Set it to 1 to run grouped steps one at a time. Members share the workflow's workspace and its worktree. This setting limits how many run at once. It does not isolate members from each other or merge their work.

queue.maxSteps ​

  • Type: -1 or integer
  • Default: 100

Maximum number of entries allowed in the run's steps array. -1 means unlimited.

queue.maxParallelSteps ​

  • Type: integer
  • Default: 6
  • Constraints: minimum 1

Maximum number of active members in a parallel step group.

queue.notifyOnExtension ​

  • Type: boolean
  • Default: true

Currently has no effect; queue extension notifications are not implemented.

queue.maxWorkflowExecutionTimeSec ​

  • Type: -1 or integer
  • Default: -1

Maximum total execution time in seconds for a workflow. -1 means unlimited.

runs ​

Execution run retention settings. History is always on.

runs.maxRuns ​

  • Type: -1 or integer
  • Default: -1

Deletes entire runs—definition and output—oldest first. -1 means unlimited.

runs.historySearchCacheMb ​

  • Type: number
  • Default: 320
  • Constraints: minimum 0

Approximate working-set budget in MB for caching parsed history-search documents from the most recent runs, evicted oldest-first when exceeded. Bounds real extension-host process memory (RSS), not a literal byte count — actual RSS runs above this number due to V8 overhead the estimate can't see, so the default is calibrated from measured RSS on a real index rather than the byte math alone. 0 disables the cache.

terminal ​

Embedded terminal settings.

terminal.fontSize ​

  • Type: number
  • Default: 14
  • Constraints: minimum 8 · maximum 24

Terminal font size in pixels.

terminal.lineHeight ​

  • Type: number
  • Default: 1.2
  • Constraints: minimum 1 · maximum 2

Terminal line height multiplier.

terminal.scrollback ​

  • Type: integer
  • Default: 5000
  • Constraints: minimum 1000 · maximum 50000

Maximum scrollback lines retained in memory.

terminal.cursorStyle ​

  • Type: "block" | "underline" | "bar"
  • Default: "block"

Terminal cursor shape.

  • Type: boolean
  • Default: true

Blink the terminal cursor.

terminal.macOptionIsMeta ​

  • Type: boolean
  • Default: false

Treat the macOS Option key as Meta.

terminal.wordSeparators ​

  • Type: string
  • Default: " ()[]{}',\""`

Characters treated as word boundaries on double-click selection.

terminal.replayBufferKb ​

  • Type: number
  • Default: 50
  • Constraints: minimum 10 · maximum 500

Output replayed on webview reconnect, in KB.

terminal.shellExecutable ​

  • Type: string
  • Default: ""

Override the shell spawned for user terminal sessions. Empty means auto-detect.

terminal.mobileControlBar ​

  • Type: "auto" | "always" | "never"
  • Default: "auto"

When to show the mobile terminal control bar.

terminal.mobileBarLayout ​

  • Type: { bar, popup, hidden }

Which keys the mobile terminal control bar shows: 'bar' keys are always visible, 'popup' keys sit behind the More menu, and 'hidden' keys are not shown.

Default value
json
{
  "bar": [
    "modifier:ctrl",
    "key:esc",
    "key:tab",
    "key:up",
    "key:down",
    "key:left",
    "key:right",
    "key:enter"
  ],
  "popup": [
    "shortcut:shift-tab",
    "shortcut:ctrl-c",
    "shortcut:ctrl-z",
    "shortcut:ctrl-l",
    "shortcut:ctrl-r",
    "shortcut:ctrl-a"
  ],
  "hidden": []
}

Fields:

  • bar · string[] · required
  • popup · string[] · required
  • hidden · string[] · required

terminal.mobileCustomShortcuts ​

  • Type: array of { id, label, sequence }
  • Default: []

Custom shortcuts in the mobile terminal control bar More menu.

Fields:

  • id · string · required
  • label · string · required
  • sequence · string · required

ui ​

UI display settings.

ui.showCliCommand ​

  • Type: boolean
  • Default: true

Show the CLI command being executed.

ui.showHeadlessPermissionWarning ​

  • Type: boolean
  • Default: true

Show a warning when headless execution uses limited tool permissions.

ui.autoFocusOutputOnExecution ​

  • Type: boolean
  • Default: true

Automatically expand the output section and switch to the relevant output view when a prompt starts. Headless runs show Output; interactive and inject-mode runs show Terminal.

ui.openPromptsInSecondGroup ​

  • Type: boolean
  • Default: false

Open prompt files in a second editor group.

ui.respectGitignoreForCompletions ​

  • Type: boolean
  • Default: true

Filter file completions using .gitignore rules.

ui.autoExpandEditorWhenTyping ​

  • Type: boolean
  • Default: true

Automatically grow the editor panel as you type past its current height, up to 60% of the available area. Shrinks back when text is deleted or the prompt is submitted.

ui.useAbsolutePathReferences ​

  • Type: boolean
  • Default: false

Send absolute file paths to the harness/model instead of relative paths. Stored workflow text stays relative regardless of this setting. Forced on in multi-root workspaces and by harnesses that require it (e.g. Antigravity).

ui.outputVirtualizationRowThreshold ​

  • Type: -1 or integer
  • Default: 200

Minimum projected output row count before the Output panel uses virtualization. 0 means always virtualize. -1 means never.

ui.collapsedToolOutputLineCount ​

  • Type: integer
  • Default: 3
  • Constraints: minimum 1

Approximate number of wrapped lines shown for Bash and generic tool results before they collapse.

ui.confirmDeleteOperations ​

  • Type: boolean
  • Default: true

Show a confirmation dialog before delete operations like removing prompts, deleting workflow history, or discarding untracked files.

ui.confirmResetOperations ​

  • Type: boolean
  • Default: true

Show a confirmation dialog before resetting workflow start position.

ui.confirmContinuationDiscardOperations ​

  • Type: boolean
  • Default: true

Show a confirmation dialog before discarding a continuation's edited suffix (Discard Continuation, Start New Run Instead).

ui.hideGitIgnoredFiles ​

  • Type: boolean
  • Default: false

Hide files and directories ignored by .gitignore in the workspace file explorer and workflow file picker.

ui.atomicContextReferences ​

  • Type: boolean
  • Default: true

In the prompt editor, treat @file/#symbol/~git/$context references as single units: arrow keys skip over them and Backspace/Delete removes the whole reference at once. In output, format clickable local references as compact chips. Clicking or long-pressing a reference still opens it; when off, editor references edit character by character and output uses ordinary text links.

ui.showCostEstimates ​

  • Type: boolean
  • Default: true

Show token cost estimates in dashboard and CLI statistics.

  • Type: boolean
  • Default: true

Allow AI-generated file links outside trusted roots to offer a Trust Parent Folder action. Untrusted paths are always blocked unless their parent is explicitly trusted; this only controls whether the trust offer appears.

ui.stepColorMode ​

  • Type: "none" | "harness" | "unique"
  • Default: "none"

Choose how workflow step identity colors are rendered: none uses status colors only, harness uses harness colors, and unique assigns a distinct color to each step.

ui.harnessColors ​

  • Type: { byHarness?, script? }

Controls the per-harness identity colors used to correlate workflow steps across the dashboard.

ui.harnessColors.byHarness ​

  • Type: { copilot-cli?, claude-cli?, codex-cli?, … }
  • Default: {}

Optional hex color overrides for each harness. Remove an override to follow the built-in theme-aware chart color.

Fields:

  • copilot-cli · string
  • claude-cli · string
  • codex-cli · string
  • opencode-cli · string
  • qwen-cli · string
  • antigravity-cli · string

ui.harnessColors.script ​

  • Type: string
  • Default: "#808080"
  • Constraints: pattern ^#[0-9a-fA-F]{6}$

Hex color used for script steps.

server ​

ctrlyoke hosted server settings.

server.autoStart ​

  • Type: boolean
  • Default: false

Automatically start the hosted dashboard server when the VS Code extension activates.

server.port ​

  • Type: integer
  • Default: 4747
  • Constraints: minimum 1 · maximum 65535

Port for the ctrlyoke hosted server.

server.fallbackPorts ​

  • Type: integer[]
  • Default: []

Ordered ports to try, in order, if 'port' is already in use, before falling back to an OS-assigned port. Useful for a stable, bookmarkable URL across restarts when 'port' is often taken by another running instance.

server.theme ​

  • Type: "auto" | "light" | "dark"
  • Default: "auto"

Color theme for the hosted server UI.

server.bindAddress ​

  • Type: string
  • Default: "127.0.0.1"

Network interface to bind the server to. Use '127.0.0.1' for localhost only or '0.0.0.0' for all interfaces.

server.tls ​

  • Type: { enabled?, certPath?, keyPath? }

TLS configuration for the hosted server.

server.tls.enabled ​

  • Type: boolean
  • Default: false

Whether TLS is enabled.

server.tls.certPath ​

  • Type: string
  • Default: ""

Path to the TLS certificate file.

server.tls.keyPath ​

  • Type: string
  • Default: ""

Path to the TLS private key file.

server.iconBgColor ​

  • Type: string
  • Default: "#3994BC"
  • Constraints: pattern ^#[0-9a-fA-F]{6}$

Background color for the workspace icon (hex, e.g. '#1076ba'). Applies to the SVG favicon and PWA homescreen icon.

server.iconFgColor ​

  • Type: string
  • Default: "#051923"
  • Constraints: pattern ^#[0-9a-fA-F]{6}$

Foreground (path/stroke) color for the workspace icon (hex, e.g. '#ffffff'). Applies to the SVG favicon and PWA homescreen icon.

notifications ​

Notification settings.

notifications.vscode ​

  • Type: { enabled? }

VS Code notification settings.

notifications.vscode.enabled ​

  • Type: boolean
  • Default: true

Show VS Code notification popups when workflows complete.

notifications.browser ​

  • Type: { mode? }

Browser notification settings.

notifications.browser.mode ​

  • Type: "never" | "connectedOnly" | "push"
  • Default: "never"

When to send browser notifications. 'connectedOnly' fires while the hosted dashboard is open; 'push' enables background push notifications.

notifications.toastLevel ​

  • Type: "all" | "warningAndError" | "errorOnly" | "none"
  • Default: "all"

Minimum severity for operational toast/feedback popups, such as action results (save failures and validation errors); separate from completion notifications.

notifications.events ​

  • Type: { workflowComplete?, promptComplete?, hookEvents? }

Which events trigger notifications.

notifications.events.workflowComplete ​

  • Type: "all" | "failuresOnly" | "none"
  • Default: "all"

When to notify on workflow completion.

notifications.events.promptComplete ​

  • Type: "all" | "failuresOnly" | "none"
  • Default: "none"

When to notify on individual prompt completion.

notifications.events.hookEvents ​

  • Type: { stop?, sessionStart?, preToolUse?, … }

Which hook events trigger notifications. All default to false (opt-in).

notifications.events.hookEvents.stop ​

  • Type: boolean
  • Default: false

Notify when the AI agent finishes responding.

notifications.events.hookEvents.sessionStart ​

  • Type: boolean
  • Default: false

Notify when a new AI session is created.

notifications.events.hookEvents.preToolUse ​

  • Type: boolean
  • Default: false

Notify before the AI invokes a tool.

notifications.events.hookEvents.postToolUse ​

  • Type: boolean
  • Default: false

Notify after the AI receives the result of a tool call.

notifications.events.hookEvents.userPromptSubmit ​

  • Type: boolean
  • Default: false

Notify when a user prompt is submitted to the AI.

notifications.events.hookEvents.permissionRequest ​

  • Type: boolean
  • Default: false

Notify when the AI requests permission to perform an action.

notifications.events.hookEvents.notification ​

  • Type: boolean
  • Default: false

Notify when the harness displays a notification, including prompts that may require user input.

notifications.events.hookEvents.error ​

  • Type: boolean
  • Default: false

Notify when the harness reports a session-level error.

notifications.includeWorkflowName ​

  • Type: boolean
  • Default: true

Include the workflow name in the notification message.

notifications.includePromptName ​

  • Type: boolean
  • Default: true

Include the prompt name in the notification message.

notifications.onlyWhenWindowUnfocused ​

  • Type: boolean
  • Default: true

Suppress notifications while the VS Code window or hosted dashboard is focused.

commit ​

Commit message generation settings.

commit.harness ​

  • Type: "copilot-cli" | "claude-cli" | "codex-cli" | "opencode-cli" | "qwen-cli" | "antigravity-cli" or ""
  • Default: ""

Harness to use for commit message generation. Empty = use the workspace default harness.

commit.model ​

  • Type: string
  • Default: ""

Model override for commit message generation. Empty = use the commit harness default.

commit.systemPrompt ​

  • Type: string

System prompt sent before the git diff. The diff is appended automatically.

Default value
text
Generate a conventional commit message based on the included git diff. Return ONLY the final commit message content based on the included diff — no explanation, no code fences, no author or co-author attribution lines. Treat the provided diff and any optional user draft as the complete context for composing the message; do not read extra instruction files or inspect other workspace files unless explicitly instructed. Follow the Conventional Commits format: one or more 'type(scope): short description' header lines (use multiple headers if the change covers multiple distinct features or fixes), followed by a blank line, then one or more body paragraphs explaining the implementation details of what changed and why. Use markdown formatting in the body to improve readability where appropriate. Use bullet points for lists where necessary. If you are explicitly instructed to submit the message with a tool, call that tool with the complete commit message and do not repeat the message outside the tool call.

Example format:
feat(auth): add OAuth2 login support

Implemented OAuth2 authorization code flow using the existing HTTP client. Token refresh is handled automatically on 401 responses. Session state is persisted to localStorage to survive page reloads

Only return or submit the commit message, no extra text. Here is the git diff to generate the commit message for:

statusLine ​

Machine-only settings for providers that install a global statusline command.

statusLine.useDifferentFormatPerHarness ​

  • Type: boolean
  • Default: false

Configure each harness's statusline format independently. When false (the default), every harness renders 'sharedFormat' and the per-harness 'format' values are left untouched but unused.

statusLine.sharedFormat ​

Statusline format every harness renders while 'useDifferentFormatPerHarness' is false.

Default value
json
[
  {
    "type": "literal",
    "text": "ctrlyoke"
  },
  {
    "type": "field",
    "field": "model"
  },
  {
    "type": "literal",
    "text": "·"
  },
  {
    "type": "field",
    "field": "context"
  },
  {
    "type": "literal",
    "text": "·"
  },
  {
    "type": "field",
    "field": "usage"
  }
]

statusLine.byHarness ​

  • Type: { claude-cli?, copilot-cli?, qwen-cli?, … }

Statusline configuration keyed by ctrlyoke harness ID.

statusLine.byHarness.claude-cli ​

Statusline settings for Claude CLI.

Default value
json
{
  "enabled": true,
  "customCommand": "",
  "useCtrlyokeStyle": true,
  "format": [
    {
      "type": "literal",
      "text": "ctrlyoke"
    },
    {
      "type": "field",
      "field": "model"
    },
    {
      "type": "literal",
      "text": "·"
    },
    {
      "type": "field",
      "field": "context"
    },
    {
      "type": "literal",
      "text": "·"
    },
    {
      "type": "field",
      "field": "usage"
    }
  ]
}

statusLine.byHarness.copilot-cli ​

Statusline settings for Copilot CLI.

Default value
json
{
  "enabled": true,
  "customCommand": "",
  "useCtrlyokeStyle": true,
  "format": [
    {
      "type": "literal",
      "text": "ctrlyoke"
    },
    {
      "type": "field",
      "field": "model"
    },
    {
      "type": "literal",
      "text": "·"
    },
    {
      "type": "field",
      "field": "context"
    },
    {
      "type": "literal",
      "text": "·"
    },
    {
      "type": "field",
      "field": "usage"
    }
  ]
}

statusLine.byHarness.qwen-cli ​

Statusline settings for Qwen Code.

Default value
json
{
  "enabled": true,
  "customCommand": "",
  "useCtrlyokeStyle": true,
  "format": [
    {
      "type": "literal",
      "text": "ctrlyoke"
    },
    {
      "type": "field",
      "field": "model"
    },
    {
      "type": "literal",
      "text": "·"
    },
    {
      "type": "field",
      "field": "context"
    },
    {
      "type": "literal",
      "text": "·"
    },
    {
      "type": "field",
      "field": "usage"
    }
  ]
}

statusLine.byHarness.antigravity-cli ​

Statusline settings for Antigravity CLI.

Default value
json
{
  "enabled": true,
  "customCommand": "",
  "useCtrlyokeStyle": true,
  "format": [
    {
      "type": "literal",
      "text": "ctrlyoke"
    },
    {
      "type": "field",
      "field": "model"
    },
    {
      "type": "literal",
      "text": "·"
    },
    {
      "type": "field",
      "field": "context"
    },
    {
      "type": "literal",
      "text": "·"
    },
    {
      "type": "field",
      "field": "usage"
    }
  ]
}

diagnostics ​

Logging and diagnostic output settings.

diagnostics.verboseLogging ​

  • Type: boolean
  • Default: false

Enable verbose diagnostic logging for troubleshooting.

diagnostics.logRawCliOutput ​

  • Type: boolean
  • Default: false

Log raw CLI output to the extension output channel.

Top-level settings ​

$schema ​

  • Type: string

Schema URL used by JSON-aware editors for validation and completion.

schemaVersion ​

  • Type: integer
  • Default: 1
  • Constraints: minimum 1

Settings format version. Absent means format 1. ctrlyoke stamps this field when it writes settings; an older host reads newer settings best-effort but refuses to write them.

modelPricing ​

  • Type: map of map of { inputPerMTok, outputPerMTok, cachedInputPerMTok?, … }
  • Default: {}

Optional per-harness/per-model USD pricing overrides. Rates are USD per one million tokens.

Fields:

  • inputPerMTok · number · required
  • outputPerMTok · number · required
  • cachedInputPerMTok · number
  • cacheWritePerMTok · number
  • reasoningPerMTok · number

Shared types ​

statusLineFormat ​

  • Type: array of ({ type: "field", field, label?, … } or { type: "literal", text, color? })

Ordered statusline segments. Used both for a provider's own 'format' and for the shared 'sharedFormat' that applies to every harness when 'useDifferentFormatPerHarness' is false.

When type is "field":

Fields:

  • field · "brand" | "model" | "context" | "usage" | "usage1" | "usage2" | "version" | "cwd" | "sessionId" | "branch" | "date" | "time" · required
  • label · string
  • color · "default" | "red" | "yellow" | "green" | "cyan" | "blue" | "magenta" | "white" | "gray"

When type is "literal":

Fields:

  • text · string · required
  • color · "default" | "red" | "yellow" | "green" | "cyan" | "blue" | "magenta" | "white" | "gray"

statusLineSettings ​

  • Type: { enabled?, customCommand?, useCtrlyokeStyle?, … }

Statusline settings for one harness.

statusLineSettings.enabled ​

  • Type: boolean
  • Default: true

Install ctrlyoke's statusline command for this harness.

statusLineSettings.customCommand ​

  • Type: string
  • Default: ""

Command to run for the provider's statusline output.

statusLineSettings.useCtrlyokeStyle ​

  • Type: boolean
  • Default: true

Show ctrlyoke's branded statusline instead of custom-command output.

statusLineSettings.format ​

Statusline format for this harness, used only while 'useDifferentFormatPerHarness' is true.

Source-available under the ctrlyoke Commercial License.