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.jsonin 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.
{
"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.
| Section | Purpose |
|---|---|
general | General format, template, and behavior settings. |
defaults | Default execution properties applied to all new workflows (mirrors ExecutionProperties). |
worktrees | User-only worktree checkout placement configuration. |
coordination | Retention and participant settings for the execution-root coordination board. |
storage | User-only storage location configuration. |
permissions | Harness-specific path and sandbox permission settings. |
usageTracking | Controls workspace-local provider quota and observed-usage collection. |
execution | Execution settings. |
queue | Queue management settings. |
runs | Execution run retention settings. |
terminal | Embedded terminal settings. |
ui | UI display settings. |
server | ctrlyoke hosted server settings. |
notifications | Notification settings. |
commit | Commit message generation settings. |
statusLine | Machine-only settings for providers that install a global statusline command. |
diagnostics | Logging and diagnostic output settings. |
| Top-level settings | Settings that sit directly at the root of settings.json. |
| Shared types | Value 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
{
"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·stringclaude-cli·stringcodex-cli·stringopencode-cli·stringqwen-cli·stringantigravity-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·stringclaude-cli·stringcodex-cli·stringopencode-cli·stringqwen-cli·stringantigravity-cli·string
defaults.agent
- Type:
stringor""ornull - 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:
stringmatching^[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[]ornull - 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[]ornull - 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"orinteger[]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 (
stringor{ 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 identifierdescription·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 ofstring— Environment variables for the server process (stdio servers only)autoApprove·booleanorstring[]— Tools to auto-approve: true = all tools, string[] = specific toolsurl·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 ofstring— 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 ofstring— 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? }ornull - 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? }ornull - 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 > thedefaults.toolPermissionssetting.null
Default value
{
"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?, … }ornull - 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 ofstring— 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 toexpected, 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, theexecution.scriptTimeoutSecsetting applies.shell·string— Pin the shell that runs this script's inline text. Used only whenscriptis 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 theterminal.shellExecutablesetting 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 againstexpected. 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' treatsexpectedas an unanchored regular expression — add ^ and $ to require a full match. 'isEmpty'/'isNotEmpty' take noexpected. Word tokens only:operator: >=is a YAML parse error andoperator: !=silently parses as a YAML tag.expected·stringornumber— 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 whilecompareSourceoroperatorstates 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·-1orinteger— Maximum number of retry attempts.-1means 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?, … }ornull - 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 ofstring— 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 toexpected, 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, theexecution.scriptTimeoutSecsetting applies.shell·string— Pin the shell that runs this script's inline text. Used only whenscriptis 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 theterminal.shellExecutablesetting 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 againstexpected. 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' treatsexpectedas an unanchored regular expression — add ^ and $ to require a full match. 'isEmpty'/'isNotEmpty' take noexpected. Word tokens only:operator: >=is a YAML parse error andoperator: !=silently parses as a YAML tag.expected·stringornumber— 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 whilecompareSourceoroperatorstates 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:
falseortrueorstringor{ 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:
{
"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-rootsin the workspace. Add--yesto 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:
-1orinteger - 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:
-1orinteger - 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:
-1orinteger - 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:
-1orinteger - 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.
terminal.cursorBlink
- 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
{
"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[]· requiredpopup·string[]· requiredhidden·string[]· required
terminal.mobileCustomShortcuts
- Type: array of
{ id, label, sequence } - Default:
[]
Custom shortcuts in the mobile terminal control bar More menu.
Fields:
id·string· requiredlabel·string· requiredsequence·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:
-1orinteger - 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.
ui.offerTrustForUntrustedFileLinks
- 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·stringclaude-cli·stringcodex-cli·stringopencode-cli·stringqwen-cli·stringantigravity-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
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
- Type: statusLineFormat
Statusline format every harness renders while 'useDifferentFormatPerHarness' is false.
Default value
[
{
"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
- Type: statusLineSettings
Statusline settings for Claude CLI.
Default value
{
"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
- Type: statusLineSettings
Statusline settings for Copilot CLI.
Default value
{
"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
- Type: statusLineSettings
Statusline settings for Qwen Code.
Default value
{
"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
- Type: statusLineSettings
Statusline settings for Antigravity CLI.
Default value
{
"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· requiredoutputPerMTok·number· requiredcachedInputPerMTok·numbercacheWritePerMTok·numberreasoningPerMTok·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"· requiredlabel·stringcolor·"default" | "red" | "yellow" | "green" | "cyan" | "blue" | "magenta" | "white" | "gray"
When type is "literal":
Fields:
text·string· requiredcolor·"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
- Type: statusLineFormat
Statusline format for this harness, used only while 'useDifferentFormatPerHarness' is true.