A specialized mode for software engineering: reading, editing, testing, and refactoring.
The /coder mode is specialized for software engineering tasks with a read, modify, and feedback cycle.It provides more rigor than /agent, because the assistant follows an output contract so that ChatCLI can execute actions safely (with rollback semantics).
You do not have to know in advance that a request needs the workspace. In chat mode the assistant recognizes it (changing code, running or debugging the project, multi-step work in the repository), answers briefly with its understanding, and proposes the switch itself:
🛠 The assistant proposes switching to coder mode for this task: Fix the failing parser tests in cli/parser_test.go Press Enter (or y) to enter coder mode, n to stay in chat; anything else continues the chat.
Your next input is the answer: Enter (or y, yes, s, sim, ok) enters coder mode with that task, exactly as if you had typed /coder <task>; n / no stays in chat; any other text is a normal chat turn and the proposal is dropped. Plain text never changes mode on its own — you always confirm.The proposal is only made on an attended interactive session; the gateway, MCP/ACP and one-shot (-p) surfaces never receive it. Set CHATCLI_CHAT_CODER_HANDOFF=false to turn it off (see environment variables).
Personas from ~/.chatcli/agents/ registered automatically
Each agent has its own skills and executes in its own isolated mini ReAct loop. Multiple agents run simultaneously via goroutines with a configurable semaphore (CHATCLI_AGENT_MAX_WORKERS).
Disable with CHATCLI_AGENT_PARALLEL_MODE=false if needed. See the full documentation.
When the AI violates the output contract, ChatCLI automatically detects it and injects a format correction feedback message. The turn is reprocessed until the format is correct. The enforcement rules are:
Detected Violation
Injected Feedback
tool_call uses a tool other than@coder
Format error — only @coder is allowed in /coder mode
tool_call missing but code blocks present
”Code blocks are not allowed, use @coder”
<plan> missing before tool_call
”A plan block is required before any tool_call”
Loose shell commands detected (e.g., $ go test)
“Use @coder exec, not direct commands”
If the AI persists in violating the contract after multiple attempts, ChatCLI aborts the turn and displays a warning to the user. This rarely happens with modern models.
Internally, validation occurs in agent_coder_validation.go — a dedicated module that inspects each AI response before executing any tool_call. The sequence is:
Parse the response — extract <plan>, <tool_call>, code blocks, and loose text
Plan check — if <tool_call> exists but <plan> does not, reject
Tool name check — if the tool_callname is not @coder, reject
Code block check — if code blocks (```) are present in the response, reject
Both modes use the same ReAct loop (processAIResponseAndAct). The difference is in configuration, not architecture:
Aspect
/coder
/agent
System Prompt
CoderSystemPrompt (full) or CoderFormatInstructions (when persona active)
AgentFormatInstructions
Output format
Strict: <plan> + <tool_call name="@coder"> only
Flexible: any tool, execute blocks, free text
Validation
Active (isCoderMode=true) — rejects violations
Disabled — accepts any valid format
Tool context
Compact: required flags only, 1-2 examples per subcommand
Full: all flags, multiple examples
History
Shared (unified history)
Shared (unified history)
Multi-agent
Supports <agent_call>
Supports <agent_call>
Format anchor
Reminds about <plan> + @coder each turn
Reminds about tool_call and execute each turn
In practice, /coder is /agent with additional guardrails. If you switch from /agent to /coder mid-conversation, the history is preserved — only the validation rules and system prompt change.
The isCoderMode flag is what activates all the differences. When true:
When the AI includes a <plan> block with numbered tasks (e.g., “1. Read files\n2. Apply patch\n3. Run tests”), the TaskTracker automatically parses this and creates a TaskPlan:
If 3 or more tasks fail consecutively, the TaskTracker signals NeedsReplan = true. ChatCLI then injects a system message asking the AI to reformulate its plan before continuing.The TaskTracker also computes a signature (hash) of the plan. If the AI changes its plan between turns (e.g., adds or removes tasks), the tracker detects the change and restarts tracking with the new plan.
The TaskTracker is purely informational for the user — it does not block execution. Even if the progress shows “Failed”, the AI may decide to ignore the error and continue.
Beyond the TaskTracker (which automatically extracts tasks from the <plan> block), agent mode also exposes an atomic plugin@todo with parity to Claude Code’s TodoWrite. The AI can explicitly emit:
The system prompt is assembled in layers, in the following order:
1
Layer 1: Persona or CoderSystemPrompt
If a custom persona is active (e.g., --persona senior-go), the persona prompt is used as the base. Otherwise, the default CoderSystemPrompt is used.
2
Layer 2: CoderFormatInstructions
When a persona is active, CoderFormatInstructions are appended to the persona prompt. This ensures the persona respects the /coder output contract. When no persona is active, the instructions are already embedded in the CoderSystemPrompt.
3
Layer 3: Workspace Context
Project context files are injected via contextBuilder:
SOUL.md — personality and global guidelines
USER.md — user preferences
RULES.md — project-specific rules
4
Layer 4: Tool Context
The compact @coder schema is included: list of subcommands, required flags, and 1-2 examples per subcommand. In /coder mode, this context is reduced compared to /agent to save tokens.
5
Layer 5: Multi-Agent Orchestrator Prompt
If parallel mode is active (CHATCLI_AGENT_PARALLEL_MODE=true), the multi-agent orchestrator prompt is appended with the list of available agents and dispatch instructions.
At each turn of the ReAct loop, a short format reminder is appended to the message history. This prevents the AI from “forgetting” the format rules in long conversations.
The anchor is a prompt engineering technique to maintain format adherence. Without it, models tend to “drift” into free text after 10-15 turns of conversation. The anchor is short (3-5 lines) to avoid consuming excessive tokens.
Delegate sub-task to a subagent with isolated context — see Subagent Delegation
/coder mode also receives the CHATCLI_AGENT_TMPDIR variable pointing to the session scratch dir. It is the recommended path for creating temporary scripts and intermediate files without polluting the project.
/coder maximizes parallelism by emitting multiple tool_calls in a single response when operations are independent. For example, when needing to read 3 files, the AI emits 3 tool_call tags at once instead of one per turn.For complex tasks with 3+ independent operations, the AI uses <agent_call> to dispatch specialized agents in parallel via goroutines.
If you notice the AI performing sequential operations that could be parallel, remind it: “emit all independent tool_calls in a single response”.
The AI doesn’t always have all the information needed to execute a task. When it needs data that only the user can provide (database choice, framework, credentials, options), the AI asks directly instead of guessing.
When the AI responds without emitting any tool_call (just text with a question), ChatCLI detects this and:
Displays the AI’s question normally
Shows a Waiting for your response... prompt instead of ending the session
Waits for the user to type a response
Adds the response to the history and continues the ReAct cycle
+-- RESPONSE| I need information before proceeding:| 1. Which database? (PostgreSQL, MySQL, SQLite)| 2. Which library? (pgx, GORM, sqlx)| 3. Database host and port?+-------------------------------------------------- Waiting for your response (--- for multiline, 'exit' to finish): PostgreSQL, pgx, localhost:5432
The AI receives the response and continues with <plan> + <tool_call> as usual.
For complex responses, use multiline mode with --- (``` is also accepted as a fence opener):
Waiting for your response: --- Multiline mode — type --- on a new line to finish ... [1] PostgreSQL on port 5432 ... [2] Host: db.internal ... [3] Use pgx as driver ... [4] Schema: public ... [5] ---
The input that appears while /coder is waiting for your reply uses the same readline engine as chat mode (go-prompt + BracketedPasteParser). That means:
Feature
Behavior
Width
Grows to the real terminal width — no 80-column cap
Bracketed paste
Pasted multiline content is preserved (does not submit on the first newline)
Editing
Arrows, Home/End, Ctrl+A/E, word navigation (Alt/Ctrl+arrows)
Paste detection
Large pastes are captured via placeholder (same mechanism as chat) and expanded before going to the AI
Non-TTY stdin (pipes, CI)
Automatic fallback to bufio.Reader — the agent still reads one line per iteration
This input used to be a stripped-down golang.org/x/term reader that capped at 80 columns and treated each pasted \n as Enter. If you still see that behavior, update ChatCLI — the chat-parity holds on any modern terminal.
This feature is enabled by the “ASK WHEN NEEDED” rule in the /coder system prompt. The AI is instructed not to emit tool_calls when it needs user-provided information, but instead ask the question directly. This ensures ChatCLI detects the question and waits for the response.
Yes, it is the recommended format:tool_call name="@coder" args='{"cmd":"read","args":{"file":"main.go"}}'
When should I use patch --diff?
When the change involves multiple sections or requires more precision. It accepts unified diff in text or base64.
Do I need to install @coder separately?
No. @coder is a builtin plugin — it comes embedded in the binary. If you install a custom version in ~/.chatcli/plugins/, it will take precedence over the builtin.
Is exec safe?
@coder exec blocks dangerous patterns by default. For sensitive commands, prefer using the Git subcommands and test.
Is there a read limit?
Yes. Use read --max-bytes, --head, or --tail to control the output size.
How does /coder handle AI format errors?
ChatCLI validates every response from the AI against the output contract. If a violation is detected (e.g., direct code block, wrong tool, missing reasoning), a format correction feedback message is injected into the history and the turn is reprocessed. The AI gets up to 3 attempts to correct the format. In practice, modern models get it right on the first or second turn.
Can I use /coder with a custom persona?
Yes. When a persona is active (e.g., --persona senior-go), the persona prompt is used as the base and CoderFormatInstructions are automatically appended. This ensures the persona respects the /coder output contract without losing its custom personality.
What is the Task Tracker?
It is a module that parses numbered tasks from the AI’s <plan> block (e.g., “1. Read files\n2. Apply patch”). Each task receives a status (Pending, InProgress, Completed, Failed) that is updated as tool_calls are executed. Progress is displayed in the interface. If 3+ tasks fail, ChatCLI asks the AI to reformulate its plan.
Why is base64 required for write?
Source code frequently contains quotes, line breaks, backslashes, and other characters that conflict with JSON. When the AI sends code as plain text in the tool_call args, the JSON parse can fail or the content gets corrupted. Base64 encodes the content safely, eliminating 100% of escaping issues.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/schema.json","name":"ChatCLI","description":"Official ChatCLI documentation — a multi-provider AI CLI with agent mode, gRPC server and Kubernetes operator.","colors":{"primary":"#0F766E","light":"#2DD4BF","dark":"#0D9488"},"logo":{"light":"https://mintcdn.com/encom/Rcdb5Pr5hpjwN46r/images/logo-light.svg?fit=max\u0026auto=format\u0026n=Rcdb5Pr5hpjwN46r\u0026q=85\u0026s=965a0feb9bd2f65a11b3c486e2488101","dark":"https://mintcdn.com/encom/Rcdb5Pr5hpjwN46r/images/logo-dark.svg?fit=max\u0026auto=format\u0026n=Rcdb5Pr5hpjwN46r\u0026q=85\u0026s=ac3f6607cdea0039d0b66b80f700e512","href":"/"},"favicon":"https://mintcdn.com/encom/Rcdb5Pr5hpjwN46r/images/favicon.svg?fit=max\u0026auto=format\u0026n=Rcdb5Pr5hpjwN46r\u0026q=85\u0026s=c774e29d1b243b7c3b4bf5e173fef299","api":{"openapi":"api-reference/openapi.json","playground":{"display":"interactive"}},"appearance":{"default":"dark","strict":false},"background":{"color":{"light":"#F7F7F5","dark":"#0E0F10"}},"navbar":{"links":[{"href":"/cookbook/agent-refactoring","label":"Cookbook"},{"href":"/releases","label":"Releases"},{"href":"https://github.com/diillson/chatcli","type":"github"}],"primary":{"type":"button","label":"Install","href":"/start/installation"}},"footer":{"socials":{"github":"https://github.com/diillson/chatcli","x":"https://x.com/diillson"},"links":[{"header":"Resources","items":[{"label":"Documentation","href":"/"},{"label":"Cookbook","href":"/cookbook/agent-refactoring"},{"label":"API Reference","href":"/reference/api/overview"}]},{"header":"Community","items":[{"label":"GitHub","href":"https://github.com/diillson/chatcli"},{"label":"Issues","href":"https://github.com/diillson/chatcli/issues"},{"label":"Discussions","href":"https://github.com/diillson/chatcli/discussions"},{"label":"Releases","href":"https://github.com/diillson/chatcli/releases"}]},{"header":"Distribution","items":[{"label":"ArtifactHub","href":"https://artifacthub.io/packages/search?ts_query_web=chatcli"},{"label":"Helm Charts","href":"https://artifacthub.io/packages/helm/chatcli/chatcli"},{"label":"Container Registry","href":"https://github.com/diillson/chatcli/pkgs/container/chatcli"}]}]},"search":{"prompt":"Search"},"seo":{"metatags":{"og:type":"website","og:site_name":"ChatCLI Documentation","twitter:card":"summary_large_image","twitter:site":"@diillson"}},"fonts":{"heading":{"family":"Geist","weight":600},"body":{"family":"Geist"}},"styling":{"eyebrows":"section","codeblocks":"system","latex":true},"integrations":{},"errors":{"404":{"redirect":false}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity"],"display":"header"},"interaction":{"drilldown":true},"navigation":{"languages":[{"language":"en","default":true,"href":""},{"language":"pt-BR","footer":{"socials":{"github":"https://github.com/diillson/chatcli","x":"https://x.com/diillson"},"links":[{"header":"Recursos","items":[{"label":"Documentação","href":"/pt"},{"label":"Cookbook","href":"/pt/cookbook/agent-refactoring"},{"label":"API Reference","href":"/pt/reference/api/overview"}]},{"header":"Comunidade","items":[{"label":"GitHub","href":"https://github.com/diillson/chatcli"},{"label":"Issues","href":"https://github.com/diillson/chatcli/issues"},{"label":"Discussions","href":"https://github.com/diillson/chatcli/discussions"},{"label":"Releases","href":"https://github.com/diillson/chatcli/releases"}]},{"header":"Distribuição","items":[{"label":"ArtifactHub","href":"https://artifacthub.io/packages/search?ts_query_web=chatcli"},{"label":"Helm Charts","href":"https://artifacthub.io/packages/helm/chatcli/chatcli"},{"label":"Container Registry","href":"https://github.com/diillson/chatcli/pkgs/container/chatcli"}]}]},"navbar":{"links":[{"href":"/pt/cookbook/agent-refactoring","label":"Cookbook"},{"href":"/pt/releases","label":"Releases"},{"href":"https://github.com/diillson/chatcli","type":"github"}],"primary":{"type":"button","label":"Instalar","href":"/pt/start/installation"}},"href":"pt"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"encom","hasAudioNarration":false,"actualSubdomain":"encom","customDomains":["chatcli.edilsonfreitas.com"],"gitSource":{"type":"github","owner":"diillson","repo":"chatcli.ai","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad7d0ebd8a64fb93f78a90e","collectionId":"8cbbcbec-1722-4fa8-be01-aad6ba324d29","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad7d0ebd8a64fb93f78a90e"},"entitlements":{},"buildId":"6ad7d0ebd8a64fb93f78a90e","clientVersion":"0.0.3918","searchFilterCounts":[{"language":"en","tag":"Documentation","count":201},{"language":"pt-BR","tag":"Documentação","count":201},{"language":"en","tag":"Reference","count":55},{"language":"pt-BR","tag":"Referência","count":55},{"language":"en","tag":"REST API","count":50},{"language":"pt-BR","tag":"REST API","count":50},{"language":"en","tag":"Agents","count":20},{"language":"pt-BR","tag":"Agentes","count":20},{"language":"en","tag":"Cookbook","count":16},{"language":"pt-BR","tag":"Cookbook","count":16},{"language":"en","tag":"Context \u0026 memory","count":15},{"language":"en","tag":"Using ChatCLI","count":15},{"language":"pt-BR","tag":"Contexto e memória","count":15},{"language":"pt-BR","tag":"Usando o ChatCLI","count":15},{"language":"en","tag":"Kubernetes \u0026 AIOps","count":14},{"language":"pt-BR","tag":"Kubernetes e AIOps","count":14},{"language":"en","tag":"Channels \u0026 gateway","count":11},{"language":"en","tag":"Releases","count":11},{"language":"pt-BR","tag":"Canais e gateway","count":11},{"language":"pt-BR","tag":"Releases","count":11}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-branches-v2-autocommit","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-branches-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"teamspace","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"client-snapshot-docs-config","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n@keyframes cb-blink{50%{opacity:0}}@keyframes cc-nav-in{0%{opacity:0;transform:translateX(18px)}}@keyframes cc-nav-out{0%{opacity:0;transform:translateX(-18px)}}:root{--cc-accent:#0f766e;--cc-accent-strong:#115e59;--cc-accent-soft:rgb(13 148 136 / 0.08);--cc-accent-ring:rgb(13 148 136 / 0.32);--cc-glow:rgb(20 184 166 / 0.07);--cc-text:#17171a;--cc-text-2:#46464e;--cc-text-3:#6b6b74;--cc-surface:#ffffff;--cc-surface-2:#f1f0ed;--cc-code-bg:#f3f2ef;--cc-border:rgb(23 23 26 / 0.10);--cc-border-strong:rgb(23 23 26 / 0.18);--cc-shadow:0 1px 2px rgb(0 0 0 / 0.04), 0 8px 24px -12px rgb(0 0 0 / 0.10);--cc-radius:0.75rem;--cc-radius-sm:0.5rem;--cc-mono:\"Geist Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace}html.dark{--cc-accent:#2dd4bf;--cc-accent-strong:#5eead4;--cc-accent-soft:rgb(45 212 191 / 0.12);--cc-accent-ring:rgb(45 212 191 / 0.40);--cc-glow:rgb(45 212 191 / 0.08);--cc-text:#ededed;--cc-text-2:#bcbcc4;--cc-text-3:#8e8e96;--cc-surface:#161719;--cc-surface-2:#1c1d20;--cc-code-bg:#121314;--cc-border:rgb(154 154 162 / 0.16);--cc-border-strong:rgb(154 154 162 / 0.28);--cc-shadow:0 1px 2px rgb(0 0 0 / 0.25), 0 12px 32px -16px rgb(0 0 0 / 0.6);--cc-live:#4ade80;--cc-live-soft:rgb(74 222 128 / 0.12)}::selection{background:var(--cc-accent-ring)}body::before{content:\"\";position:fixed;inset:0 0 auto auto;width:60vw;height:32rem;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 75% 0%,var(--cc-glow),transparent 65%)}#navbar{backdrop-filter:saturate(140%) blur(12px)}#navbar #search-bar-entry{border-color:var(--cc-border);background:var(--cc-surface);box-shadow:none}#sidebar-title,#topbar-cta-button a{font-weight:500}#sidebar-title{font-size:.75rem;letter-spacing:.01em;color:var(--cc-text-3)}#navbar #search-bar-entry,#sidebar #navigation-items a,#topbar-cta-button a{border-radius:var(--cc-radius-sm)}#sidebar #navigation-items a.text-primary,#sidebar #navigation-items a[class*=bg-primary]{background:var(--cc-accent-soft);color:var(--cc-accent);text-shadow:none;font-weight:500}.nav-tag-pill-text{font-family:var(--cc-mono);font-weight:500!important;letter-spacing:.02em}#header .eyebrow{color:var(--cc-accent);font-size:.8125rem;font-weight:500}#page-title{font-size:clamp(2rem,3.2vw,2.5rem);font-weight:600;letter-spacing:-.025em;line-height:1.15}#header .prose{color:var(--cc-text-2)}#page-context-menu button,#page-context-menu-button{border-radius:var(--cc-radius-sm)}#content{font-size:.975rem}#content h2,#content h3{letter-spacing:-.02em;font-weight:600}#content h3{letter-spacing:-.01em}#content a:not(.card):not([class*=cc-]){text-decoration-color:var(--cc-accent-ring);text-underline-offset:3px}#content a:not(.card):not([class*=cc-]):hover{text-decoration-color:var(--cc-accent)}.font-mono,code,kbd,pre{font-family:var(--cc-mono)!important}#content :not(pre)>code{font-size:.85em;padding:.1em .38em;border-radius:.375rem;border:1px solid var(--cc-border);background:var(--cc-surface-2)}.code-block,[data-component-part=code-block-root]{border-radius:var(--cc-radius)!important;border-color:var(--cc-border)!important}.callout,.code-block-background{border-radius:var(--cc-radius)!important}html.dark .code-block-background{background:var(--cc-code-bg)!important}#content table{font-size:.9rem}#content table thead th{font-size:.8125rem;font-weight:600;color:var(--cc-text-2);border-bottom:1px solid var(--cc-border-strong)}#content table td{border-color:var(--cc-border)}.callout{border:1px solid var(--cc-border)!important;background:var(--cc-surface)!important;box-shadow:var(--cc-shadow)}.callout>div:last-child,.callout>div:last-child *{color:var(--cc-text-2)}.callout>div:last-child code,.callout>div:last-child strong{color:var(--cc-text)!important}.callout[data-callout-type=warning]{border-left:3px solid #f59e0b!important}.callout[data-callout-type=danger]{border-left:3px solid #ef4444!important}.card{border-radius:var(--cc-radius)!important;border-color:var(--cc-border)!important;background:var(--cc-surface)!important;transition:border-color 160ms ease,transform 160ms ease}a.card:hover{border-color:var(--cc-accent-ring)!important}.card [data-component-part=card-icon]{display:grid;place-items:center;width:2.25rem;height:2.25rem;margin-bottom:.25rem;border-radius:var(--cc-radius-sm);border:1px solid var(--cc-border);background:var(--cc-surface-2)}.card [data-component-part=card-icon] svg{width:1rem!important;height:1rem!important;background-color:var(--cc-accent)!important}.steps [data-component-part=step-number]>div{background:var(--cc-surface)!important;box-shadow:0 0 0 1px var(--cc-accent-ring);color:var(--cc-accent)!important;font-family:var(--cc-mono)}[role=tablist] [data-state=active],[role=tablist] button[aria-selected=true]{color:var(--cc-accent)!important;border-color:var(--cc-accent)!important}#content-area:has([data-chatcli-banner]) #header,#content-area:has([data-chatcli-banner]) #header .eyebrow,#content-area:has([data-chatcli-banner]) #header .prose,#content-area:has([data-chatcli-banner]) #page-title{display:none}#content-area:has([data-chatcli-banner]) #content{margin-top:0}.chatcli-banner{margin:3rem 0 .75rem}.chatcli-banner-art{--cb-a:#0d9488;--cb-b:#0891b2;--cb-c:#2563eb;--cb-edge:rgb(23 23 26 / 0.28);--cb-glow:rgb(13 148 136 / 0.18);display:block;width:min(100%,30rem);height:auto;overflow:visible}html.dark .chatcli-banner-art{--cb-a:#2dd4bf;--cb-b:#22d3ee;--cb-c:#60a5fa;--cb-edge:rgb(237 237 237 / 0.22);--cb-glow:rgb(45 212 191 / 0.34)}.chatcli-banner .cb-fills rect{shape-rendering:crispEdges}.chatcli-banner .cb-fills{filter:drop-shadow(0 0 14px var(--cb-glow))}.chatcli-banner .cb-edges path{fill:none;stroke:var(--cb-edge);stroke-width:.55;stroke-linecap:square}.cb-prompt{margin:0 0 1.25rem;font-family:var(--cc-mono);font-size:.95rem;color:var(--cc-text-2)}.cb-prompt-sign{color:var(--cc-accent)}.cb-cursor{display:inline-block;width:.55em;height:1.1em;margin-left:.3em;vertical-align:-.18em;background:var(--cc-accent);animation:cb-blink 1.1s steps(1) infinite}@media (prefers-reduced-motion:reduce){.cb-cursor{animation:none}}.chatcli-banner-tagline{font-size:1.125rem;line-height:1.6;margin:0 0 2rem;max-width:44rem;color:var(--cc-text-2)}.chatcli-banner-tagline strong{color:var(--cc-text);font-weight:500}.cc-entry>div,a.cc-release{border:1px solid var(--cc-border);border-radius:var(--cc-radius);background:var(--cc-surface)}a.cc-release{display:flex;align-items:center;gap:.75rem;padding:.85rem 1.1rem;margin:0 0 1.25rem;color:var(--cc-text-2);font-size:.875rem;text-decoration:none!important;border-bottom-width:1px;transition:border-color 160ms ease}a.cc-release:hover{border-color:var(--cc-accent-ring)}.cc-release-label{color:var(--cc-text-3);white-space:nowrap}.cc-release-version{display:inline-flex;align-items:center;gap:.4rem;font-weight:600;color:var(--cc-text);white-space:nowrap}.cc-release-version::before{content:\"\";width:.4rem;height:.4rem;border-radius:999px;background:var(--cc-live);box-shadow:0 0 0 3px var(--cc-live-soft)}.cc-release-summary{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cc-release-cta{font-weight:500;color:var(--cc-text);white-space:nowrap}.cc-entry{margin:0 0 3rem}.cc-entry>div{gap:0!important;overflow:hidden}.cc-entry .card{margin:0!important;border:0!important;border-radius:0!important;background:0 0!important;height:100%}.cc-entry .card:hover{background:var(--cc-accent-soft)!important}@media (min-width:1024px){.cc-entry .card{border-left:1px solid var(--cc-border)!important}.cc-entry>div>.card:first-child,.cc-entry>div>:first-child .card{border-left:0!important}}@media (max-width:1023px){.cc-entry .card{border-top:1px solid var(--cc-border)!important}.cc-entry>div>.card:first-child,.cc-entry>div>:first-child .card{border-top:0!important}a.cc-release{flex-wrap:wrap}.cc-release-summary{flex-basis:100%;white-space:normal}}.cc-release-meta{display:flex;flex-wrap:wrap;gap:.5rem 1.25rem;margin:0 0 1.5rem;font-size:.875rem;color:var(--cc-text-3)}.cc-release-meta a{color:var(--cc-text-2)!important}.cc-scope{display:inline-block;margin-right:.35rem;padding:.05rem .4rem;border-radius:.375rem;border:1px solid var(--cc-border);background:var(--cc-surface-2);font-family:var(--cc-mono);font-size:.78em;color:var(--cc-text-2);vertical-align:.08em}a.cc-scope{text-decoration:none!important;color:var(--cc-accent)!important}.cc-refs{font-size:.85em;color:var(--cc-text-3);white-space:nowrap}.cc-refs a{color:var(--cc-text-3)!important}html{--cc-live:#15803d;--cc-live-soft:rgb(21 128 61 / 0.10)}.nav-tag-pill-text[data-nav-tag=\"Mais recente\"],.nav-tag-pill-text[data-nav-tag=Latest],.nav-tag-pill-text[data-nav-tag^=v]{display:inline-flex;align-items:center;gap:.3rem;color:var(--cc-live)!important;background:var(--cc-live-soft)!important}.nav-tag-pill-text[data-nav-tag=\"Mais recente\"]::before,.nav-tag-pill-text[data-nav-tag=Latest]::before,.nav-tag-pill-text[data-nav-tag^=v]::before{content:\"\";width:.35rem;height:.35rem;border-radius:999px;background:currentColor}.cc-nav-back{display:flex;align-items:center;gap:.6rem;width:100%;margin:0 0 1rem;padding:.6rem .85rem;border:1px solid var(--cc-border);border-radius:var(--cc-radius-sm);background:var(--cc-surface);color:var(--cc-text);font-weight:600;text-align:left;cursor:pointer;transition:border-color 160ms ease,background 160ms ease}#navigation-items[data-cc-focus] [data-cc-focused]>button,.cc-nav-back[hidden]{display:none}.cc-nav-back:hover,a.cc-channel:hover{border-color:var(--cc-accent-ring)}.cc-nav-back svg{flex:none;color:var(--cc-text-3)}#navigation-items[data-cc-focus] ul.sidebar-group>li:not([data-cc-focused]),#navigation-items[data-cc-focus]>div:not(:has([data-cc-focused])){display:none}#navigation-items[data-cc-focus]>div:has([data-cc-focused]){margin-top:0}#navigation-items[data-cc-focus]>div:has([data-cc-focused])>:not(ul){display:none}#navigation-items[data-cc-focus] [data-cc-focused]>ul>li>a,#navigation-items[data-cc-focus] [data-cc-focused]>ul>li>button{padding-left:1rem!important}#navigation-items[data-cc-focus] [data-cc-focused]>ul>li>ul a,#navigation-items[data-cc-focus] [data-cc-focused]>ul>li>ul button{padding-left:1.75rem!important}#navigation-items.cc-nav-in{animation:cc-nav-in 220ms cubic-bezier(.23,1,.32,1)}#navigation-items.cc-nav-out{animation:cc-nav-out 220ms cubic-bezier(.23,1,.32,1)}@media (prefers-reduced-motion:reduce){#navigation-items.cc-nav-in,#navigation-items.cc-nav-out{animation:none}}.cc-channels{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.85rem;margin:1.25rem 0 2rem}@media (max-width:900px){.cc-channels{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:520px){.cc-channels{grid-template-columns:1fr}}a.cc-channel{display:flex;align-items:center;gap:.85rem;padding:1rem 1.1rem;border:1px solid var(--cc-border);border-radius:var(--cc-radius);background:var(--cc-surface);color:var(--cc-text)!important;font-weight:500;font-size:.95rem;text-decoration:none!important;transition:border-color 160ms ease,transform 160ms ease}.cc-channel-icon{display:grid;place-items:center;flex:none;width:1.6rem;height:1.6rem}.cc-channel-icon svg{width:1.45rem;height:1.45rem}.cc-channel-name{flex:1;min-width:0}.cc-channel-arrow{flex:none;width:1rem;height:1rem;color:var(--cc-text-3);transition:transform 160ms ease,color 160ms ease}a.cc-channel:hover .cc-channel-arrow{color:var(--cc-text);transform:translateX(2px)}.cc-ch-telegram{color:#26a5e4}.cc-ch-slack{color:#e01e5a}.cc-ch-discord{color:#5865f2}.cc-ch-whatsapp{color:#25d366}.cc-ch-webhook{color:var(--cc-accent)}.cc-ch-all{color:var(--cc-text-3)}html.dark .cc-ch-discord{color:#8991ff}#sidebar #navigation-items a,#sidebar #navigation-items button{font-size:.8125rem!important;line-height:1.35rem;padding-top:.3rem!important;padding-bottom:.3rem!important}#sidebar #navigation-items svg{width:.95rem;height:.95rem}.cc-nav-back{font-size:.8125rem}#table-of-contents,#table-of-contents a,#table-of-contents li{font-size:.8125rem!important;line-height:1.3rem}#table-of-contents a{padding-top:.2rem;padding-bottom:.2rem}#content-container:has([data-chatcli-banner]){max-width:min(100%,1440px)!important}#content-container:has([data-chatcli-banner]) #content-area{max-width:none!important}#navigation-items li[data-title]:not([id])>button>div:not(:has(svg)){flex:1 1 auto;min-width:0;text-align:left}body::after{content:\"\";position:absolute;top:0;right:0;z-index:0;width:min(78vw,1100px);height:440px;pointer-events:none;background:linear-gradient(225deg,#2dd4bf 0,#22d3ee 40%,#60a5fa 75%,transparent 100%);-webkit-mask:url(/images/hero-halftone.svg) right top/100% 100% no-repeat;mask:url(/images/hero-halftone.svg) right top/100% 100% no-repeat;opacity:.6}html:not(.dark) body::after{background:linear-gradient(225deg,#0d9488 0,#0891b2 40%,#2563eb 75%,transparent 100%);opacity:.38}@media (max-width:760px){body::after{width:100vw;height:280px;opacity:.4}html:not(.dark) body::after{opacity:.26}}#navigation-items li[data-title]:not([id])>button{position:relative}#navigation-items li[data-title]:not([id])>button>:last-child svg,#navigation-items li[data-title]:not([id])>button>svg:last-child{visibility:hidden}#navigation-items li[data-title]:not([id])>button::after{content:\"\";position:absolute;top:50%;right:.7rem;width:12px;height:12px;margin-top:-6px;background:currentColor;-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='m6 3.5 4.5 4.5L6 12.5' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\") center/contain no-repeat;mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='m6 3.5 4.5 4.5L6 12.5' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\") center/contain no-repeat;opacity:.42;pointer-events:none;transition:rotate 200ms cubic-bezier(.23,1,.32,1),opacity 160ms ease}#navigation-items li[data-title]:not([id])>button[aria-expanded=true]::after{rotate:90deg}#navigation-items li[data-title]:not([id])>button:hover::after{opacity:.75}@media (prefers-reduced-motion:reduce){#navigation-items li[data-title]:not([id])>button::after{transition:none}}"}],"page":{"pagePath":"usage/coder-mode","slug":"/usage/coder-mode","pageMetadata":{"title":"Coder Mode (/coder)","sidebarTitle":"Coder Mode (/coder)","description":"A specialized mode for software engineering: reading, editing, testing, and refactoring.","icon":"code","href":"/usage/coder-mode"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"A specialized mode for software engineering: reading, editing, testing, and refactoring.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,hr:`hr`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,CodeBlock,Heading,Info,Mermaid,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`/coder`}),` mode is specialized for software engineering tasks with a `,_jsx(_components.strong,{children:`read, modify, and feedback`}),` cycle.`]}),`\n`,_jsxs(_components.p,{children:[`It provides more rigor than `,_jsx(_components.code,{children:`/agent`}),`, because the assistant follows an output contract so that ChatCLI can execute actions safely (with rollback semantics).`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`when-to-use`,children:`When to Use`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Use /coder for...`,icon:`check`,children:_jsx(_components.p,{children:`Real changes to the repository, running tests/lint/build automatically, applying patches with rollback, iterating until a verifiable result.`})}),_jsx(Card,{title:`Use /agent for...`,icon:`arrow-right`,children:_jsx(_components.p,{children:`High-level conversations, writing text, ideas, plans — without executing code directly.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`handoff-from-chat`,children:`Handoff from chat`}),`\n`,_jsx(_components.p,{children:`You do not have to know in advance that a request needs the workspace. In chat mode the assistant recognizes it (changing code, running or debugging the project, multi-step work in the repository), answers briefly with its understanding, and proposes the switch itself:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` 🛠 The assistant proposes switching to coder mode for this task:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` Fix the failing parser tests in cli/parser_test.go`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` Press Enter (or y) to enter coder mode, n to stay in chat; anything else continues the chat.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Your next input is the answer: `,_jsx(_components.strong,{children:`Enter`}),` (or `,_jsx(_components.code,{children:`y`}),`, `,_jsx(_components.code,{children:`yes`}),`, `,_jsx(_components.code,{children:`s`}),`, `,_jsx(_components.code,{children:`sim`}),`, `,_jsx(_components.code,{children:`ok`}),`) enters coder mode with that task, exactly as if you had typed `,_jsx(_components.code,{children:`/coder \u003ctask>`}),`; `,_jsx(_components.code,{children:`n`}),` / `,_jsx(_components.code,{children:`no`}),` stays in chat; any other text is a normal chat turn and the proposal is dropped. Plain text never changes mode on its own — you always confirm.`]}),`\n`,_jsxs(_components.p,{children:[`The proposal is only made on an attended interactive session; the gateway, MCP/ACP and one-shot (`,_jsx(_components.code,{children:`-p`}),`) surfaces never receive it. Set `,_jsx(_components.code,{children:`CHATCLI_CHAT_CODER_HANDOFF=false`}),` to turn it off (see `,_jsx(_components.a,{href:`/reference/environment-variables`,children:`environment variables`}),`).`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`engineering-flow`,children:`Engineering Flow`}),`\n`,_jsx(Mermaid,{chart:`sequenceDiagram\n actor User as User\n participant CLI as ChatCLI (Orchestrator)\n participant LLM as AI (Engineer Persona)\n participant Plugin as @coder Plugin\n\n User->>CLI: /coder \u003ctask>\n\n loop Engineering Cycle\n CLI->>LLM: Sends Context\n LLM-->>CLI: \u003cplan>...\u003c/plan>\u003cbr/>\u003ctool_call name=\"@coder\" args=\"...\"/>\n CLI->>Plugin: Executes @coder\n Plugin-->>CLI: Returns Output\n CLI->>LLM: Sends Feedback\n end\n\n LLM-->>CLI: Final Response\n CLI-->>User: Displays Result`}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`multi-agent-orchestration`,children:`Multi-Agent Orchestration`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`/coder`}),` includes multi-agent orchestration `,_jsx(_components.strong,{children:`enabled by default`}),`. The orchestrator LLM dispatches specialized agents in parallel:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Agent`}),_jsx(_components.th,{children:`Role`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`FileAgent`})}),_jsx(_components.td,{children:`Code reading and analysis (read-only)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`CoderAgent`})}),_jsx(_components.td,{children:`Code writing and modification`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`ShellAgent`})}),_jsx(_components.td,{children:`Command execution and testing`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`GitAgent`})}),_jsx(_components.td,{children:`Version control operations`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`SearchAgent`})}),_jsx(_components.td,{children:`Codebase search (read-only)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`PlannerAgent`})}),_jsx(_components.td,{children:`Reasoning and task decomposition (no tools)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`ReviewerAgent`})}),_jsx(_components.td,{children:`Code review and quality (read-only)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`TesterAgent`})}),_jsx(_components.td,{children:`Test generation and coverage`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`RefactorAgent`})}),_jsx(_components.td,{children:`Structural transformations (rename, extract, move)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`DiagnosticsAgent`})}),_jsx(_components.td,{children:`Troubleshooting and error investigation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`FormatterAgent`})}),_jsx(_components.td,{children:`Code formatting and style`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`DepsAgent`})}),_jsx(_components.td,{children:`Dependency management and auditing`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Custom Agents`})}),_jsxs(_components.td,{children:[`Personas from `,_jsx(_components.code,{children:`~/.chatcli/agents/`}),` registered automatically`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Each agent has its own skills and executes in its own isolated mini ReAct loop. Multiple agents run simultaneously via goroutines with a configurable semaphore (`,_jsx(_components.code,{children:`CHATCLI_AGENT_MAX_WORKERS`}),`).`]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`Disable with `,_jsx(_components.code,{children:`CHATCLI_AGENT_PARALLEL_MODE=false`}),` if needed. See the `,_jsx(_components.a,{href:`/agents/multi-agent-orchestration`,children:`full documentation`}),`.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`output-contract`,children:`Output Contract`}),`\n`,_jsxs(_components.p,{children:[`The assistant’s response format in `,_jsx(_components.code,{children:`/coder`}),` is mandatory:`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Reasoning`,children:_jsxs(_components.p,{children:[`Before any action, the assistant writes a short `,_jsx(_components.code,{children:`reasoning`}),` block (2 to 6 lines).`]})}),_jsx(Step,{title:`Tool Call`,children:_jsxs(_components.p,{children:[`If it needs to act, it emits a `,_jsx(_components.code,{children:`tool_call name=\"@coder\" args=\"...\"`}),` with JSON in the args.`]})}),_jsx(Step,{title:`No direct commands`,children:_jsxs(_components.p,{children:[`It never uses code blocks or direct shell commands — everything goes through `,_jsx(_components.code,{children:`@coder`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`contract-validation-and-enforcement`,children:`Contract Validation and Enforcement`}),`\n`,_jsx(_components.p,{children:`When the AI violates the output contract, ChatCLI automatically detects it and injects a format correction feedback message. The turn is reprocessed until the format is correct. The enforcement rules are:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Detected Violation`}),_jsx(_components.th,{children:`Injected Feedback`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`tool_call`}),` uses a tool `,_jsx(_components.strong,{children:`other than`}),` `,_jsx(_components.code,{children:`@coder`})]}),_jsxs(_components.td,{children:[`Format error — only `,_jsx(_components.code,{children:`@coder`}),` is allowed in `,_jsx(_components.code,{children:`/coder`}),` mode`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`tool_call`}),` missing but code blocks present`]}),_jsxs(_components.td,{children:[`”Code blocks are not allowed, use `,_jsx(_components.code,{children:`@coder`}),`”`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`\u003cplan>`}),` missing before `,_jsx(_components.code,{children:`tool_call`})]}),_jsx(_components.td,{children:`”A plan block is required before any tool_call”`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Loose shell commands detected (e.g., `,_jsx(_components.code,{children:`$ go test`}),`)`]}),_jsxs(_components.td,{children:[`“Use `,_jsx(_components.code,{children:`@coder exec`}),`, not direct commands”`]})]})]})]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`If the AI persists in violating the contract after multiple attempts, ChatCLI aborts the turn and displays a warning to the user. This rarely happens with modern models.`})}),`\n`,_jsxs(_components.p,{children:[`Internally, validation occurs in `,_jsx(_components.code,{children:`agent_coder_validation.go`}),` — a dedicated module that inspects each AI response before executing any tool_call. The sequence is:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Parse`}),` the response — extract `,_jsx(_components.code,{children:`\u003cplan>`}),`, `,_jsx(_components.code,{children:`\u003ctool_call>`}),`, code blocks, and loose text`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Plan check`}),` — if `,_jsx(_components.code,{children:`\u003ctool_call>`}),` exists but `,_jsx(_components.code,{children:`\u003cplan>`}),` does not, reject`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Tool name check`}),` — if the `,_jsx(_components.code,{children:`tool_call`}),` `,_jsx(_components.code,{children:`name`}),` is not `,_jsx(_components.code,{children:`@coder`}),`, reject`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Code block check`}),` — if code blocks (`,_jsx(_components.code,{children:\"```\"}),`) are present in the response, reject`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Shell pattern check`}),` — detect patterns like `,_jsx(_components.code,{children:`$ cmd`}),`, `,_jsx(_components.code,{children:`> cmd`}),`, `,_jsx(_components.code,{children:`run: cmd`})]}),`\n`,_jsxs(_components.li,{children:[`If any check fails, inject feedback and `,_jsx(_components.strong,{children:`retry the turn`}),` (up to 3 attempts)`]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`internal-difference-between-/coder-and-/agent`,children:`Internal Difference Between /coder and /agent`}),`\n`,_jsxs(_components.p,{children:[`Both modes use the `,_jsx(_components.strong,{children:`same ReAct loop`}),` (`,_jsx(_components.code,{children:`processAIResponseAndAct`}),`). The difference is in configuration, not architecture:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Aspect`}),_jsx(_components.th,{children:_jsx(_components.code,{children:`/coder`})}),_jsx(_components.th,{children:_jsx(_components.code,{children:`/agent`})})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`System Prompt`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`CoderSystemPrompt`}),` (full) or `,_jsx(_components.code,{children:`CoderFormatInstructions`}),` (when persona active)`]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`AgentFormatInstructions`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Output format`})}),_jsxs(_components.td,{children:[`Strict: `,_jsx(_components.code,{children:`\u003cplan>`}),` + `,_jsx(_components.code,{children:`\u003ctool_call name=\"@coder\">`}),` only`]}),_jsxs(_components.td,{children:[`Flexible: any tool, `,_jsx(_components.code,{children:`execute`}),` blocks, free text`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Validation`})}),_jsxs(_components.td,{children:[`Active (`,_jsx(_components.code,{children:`isCoderMode=true`}),`) — rejects violations`]}),_jsx(_components.td,{children:`Disabled — accepts any valid format`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Tool context`})}),_jsx(_components.td,{children:`Compact: required flags only, 1-2 examples per subcommand`}),_jsx(_components.td,{children:`Full: all flags, multiple examples`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`History`})}),_jsx(_components.td,{children:`Shared (unified history)`}),_jsx(_components.td,{children:`Shared (unified history)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Multi-agent`})}),_jsxs(_components.td,{children:[`Supports `,_jsx(_components.code,{children:`\u003cagent_call>`})]}),_jsxs(_components.td,{children:[`Supports `,_jsx(_components.code,{children:`\u003cagent_call>`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Format anchor`})}),_jsxs(_components.td,{children:[`Reminds about `,_jsx(_components.code,{children:`\u003cplan>`}),` + `,_jsx(_components.code,{children:`@coder`}),` each turn`]}),_jsxs(_components.td,{children:[`Reminds about `,_jsx(_components.code,{children:`tool_call`}),` and `,_jsx(_components.code,{children:`execute`}),` each turn`]})]})]})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`In practice, `,_jsx(_components.code,{children:`/coder`}),` is `,_jsx(_components.code,{children:`/agent`}),` with `,_jsx(_components.strong,{children:`additional guardrails`}),`. If you switch from `,_jsx(_components.code,{children:`/agent`}),` to `,_jsx(_components.code,{children:`/coder`}),` mid-conversation, the history is preserved — only the validation rules and system prompt change.`]})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`isCoderMode`}),` flag is what activates all the differences. When `,_jsx(_components.code,{children:`true`}),`:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The contract validator runs on every response`}),`\n`,_jsx(_components.li,{children:`The tool context is reduced to save tokens`}),`\n`,_jsxs(_components.li,{children:[`The format anchor is specific to `,_jsx(_components.code,{children:`@coder`})]}),`\n`,_jsx(_components.li,{children:`The system prompt includes base64 encoding rules`}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`task-tracker-and-progress`,children:`Task Tracker and Progress`}),`\n`,_jsxs(_components.p,{children:[`When the AI includes a `,_jsx(_components.code,{children:`\u003cplan>`}),` block with numbered tasks (e.g., “1. Read files\\\\n2. Apply patch\\\\n3. Run tests”), the `,_jsx(_components.strong,{children:`TaskTracker`}),` automatically parses this and creates a `,_jsx(_components.code,{children:`TaskPlan`}),`:`]}),`\n`,_jsx(Heading,{level:`3`,id:`how-it-works`,children:`How it works`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Parse`}),`: Each numbered line becomes a `,_jsx(_components.code,{children:`Task`}),` with initial status `,_jsx(_components.code,{children:`Pending`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Tracking`}),`: As tool_calls are executed, the current task’s status is updated`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Rendering`}),`: Progress appears below the reasoning as compact status lines`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`task-status`,children:`Task status`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Meaning`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Pending`})}),_jsx(_components.td,{children:`Waiting for execution`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`InProgress`})}),_jsx(_components.td,{children:`Being executed in the current turn`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Completed`})}),_jsx(_components.td,{children:`Tool_call executed successfully`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Failed`})}),_jsx(_components.td,{children:`Tool_call returned an error`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`automatic-replanning`,children:`Automatic replanning`}),`\n`,_jsxs(_components.p,{children:[`If `,_jsx(_components.strong,{children:`3 or more tasks fail`}),` consecutively, the TaskTracker signals `,_jsx(_components.code,{children:`NeedsReplan = true`}),`. ChatCLI then injects a system message asking the AI to `,_jsx(_components.strong,{children:`reformulate its plan`}),` before continuing.`]}),`\n`,_jsxs(_components.p,{children:[`The TaskTracker also computes a `,_jsx(_components.strong,{children:`signature (hash)`}),` of the plan. If the AI changes its plan between turns (e.g., adds or removes tasks), the tracker detects the change and restarts tracking with the new plan.`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`The TaskTracker is purely informational for the user — it does not block execution. Even if the progress shows “Failed”, the AI may decide to ignore the error and continue.`})}),`\n`,_jsxs(Heading,{level:`3`,id:`todowrite-parity-—-@todo-plugin`,children:[`TodoWrite parity — `,_jsx(_components.code,{children:`@todo`}),` plugin`]}),`\n`,_jsxs(_components.p,{children:[`Beyond the TaskTracker (which automatically extracts tasks from the `,_jsx(_components.code,{children:`\u003cplan>`}),` block), agent mode also exposes an `,_jsx(_components.strong,{children:`atomic plugin`}),` `,_jsx(_components.code,{children:`@todo`}),` with parity to Claude Code’s `,_jsx(_components.strong,{children:`TodoWrite`}),`. The AI can explicitly emit:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\u003ctool_call name=\"@todo\" args='{\"action\":\"write\",\"tasks\":[\"read main.go\",\"apply patch\",\"run tests\"]}' />`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\u003ctool_call name=\"@todo\" args='{\"action\":\"mark\",\"index\":1,\"status\":\"done\"}' />`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\u003ctool_call name=\"@todo\" args='{\"action\":\"list\"}' />`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The list is shared with the TaskTracker via `,_jsx(_components.code,{children:`liveTodoAdapter`}),`, so the checkbox UI renders the same plan that appears in `,_jsx(_components.code,{children:`\u003cplan>`}),`. Details in `,_jsx(_components.a,{href:`/coder/atomic-tools`,children:`Atomic Tools`}),`.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`base64-encoding-requirements`,children:`Base64 Encoding Requirements`}),`\n`,_jsxs(_components.p,{children:[`For write and patch operations, the `,_jsx(_components.code,{children:`/coder`}),` system prompt mandates base64 encoding:`]}),`\n`,_jsx(Heading,{level:`3`,id:`why-base64`,children:`Why base64?`}),`\n`,_jsx(_components.p,{children:`Source code frequently contains characters that conflict with the JSON format of args:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Double and single quotes`}),`\n`,_jsx(_components.li,{children:`Line breaks`}),`\n`,_jsx(_components.li,{children:`Backslashes (escapes)`}),`\n`,_jsx(_components.li,{children:`Indentation with tabs vs. spaces`}),`\n`]}),`\n`,_jsx(_components.p,{children:`When the AI tries to send code as plain text in JSON, the parse fails or the content gets corrupted. Base64 eliminates this problem completely.`}),`\n`,_jsx(Heading,{level:`3`,id:`encoding-rules`,children:`Encoding rules`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Operation`}),_jsx(_components.th,{children:`Rule`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`write --content`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Required`}),`: content must be base64, with `,_jsx(_components.code,{children:`--encoding base64`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`patch --search / --replace`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Recommended`}),` for multiline content: use base64`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`patch --diff`})}),_jsxs(_components.td,{children:[`Use `,_jsx(_components.code,{children:`--diff-encoding base64`}),` for base64-encoded diffs`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`read`}),`, `,_jsx(_components.code,{children:`search`}),`, `,_jsx(_components.code,{children:`tree`})]}),_jsx(_components.td,{children:`Not applicable (output is always text)`})]})]})]}),`\n`,_jsxs(Heading,{level:`3`,id:`the-encoding-flag`,children:[`The `,_jsx(_components.code,{children:`--encoding`}),` flag`]}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`--encoding`}),` flag controls content interpretation:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`text`}),` (default): content is interpreted as literal text`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`base64`}),`: content is decoded from base64 before being written`]}),`\n`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`6`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# Example: writing with base64`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`@coder write --file main.go --content \"cGFja2FnZSBtYWluCg==\" --encoding base64`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# Example: patch with base64 diff`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`@coder patch --diff \"LS0tIGEvbWFpbi5nbw...\" --diff-encoding base64`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`system-prompt-composition-in-/coder`,children:`System Prompt Composition in /coder`}),`\n`,_jsx(_components.p,{children:`The system prompt is assembled in layers, in the following order:`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Layer 1: Persona or CoderSystemPrompt`,children:_jsxs(_components.p,{children:[`If a `,_jsx(_components.strong,{children:`custom persona`}),` is active (e.g., `,_jsx(_components.code,{children:`--persona senior-go`}),`), the persona prompt is used as the base. Otherwise, the default `,_jsx(_components.code,{children:`CoderSystemPrompt`}),` is used.`]})}),_jsx(Step,{title:`Layer 2: CoderFormatInstructions`,children:_jsxs(_components.p,{children:[`When a persona is active, `,_jsx(_components.code,{children:`CoderFormatInstructions`}),` are `,_jsx(_components.strong,{children:`appended`}),` to the persona prompt. This ensures the persona respects the `,_jsx(_components.code,{children:`/coder`}),` output contract. When no persona is active, the instructions are already embedded in the `,_jsx(_components.code,{children:`CoderSystemPrompt`}),`.`]})}),_jsxs(Step,{title:`Layer 3: Workspace Context`,children:[_jsxs(_components.p,{children:[`Project context files are injected via `,_jsx(_components.code,{children:`contextBuilder`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`SOUL.md`}),` — personality and global guidelines`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`USER.md`}),` — user preferences`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`RULES.md`}),` — project-specific rules`]}),`\n`]})]}),_jsx(Step,{title:`Layer 4: Tool Context`,children:_jsxs(_components.p,{children:[`The compact `,_jsx(_components.code,{children:`@coder`}),` schema is included: list of subcommands, required flags, and 1-2 examples per subcommand. In `,_jsx(_components.code,{children:`/coder`}),` mode, this context is `,_jsx(_components.strong,{children:`reduced`}),` compared to `,_jsx(_components.code,{children:`/agent`}),` to save tokens.`]})}),_jsx(Step,{title:`Layer 5: Multi-Agent Orchestrator Prompt`,children:_jsxs(_components.p,{children:[`If parallel mode is active (`,_jsx(_components.code,{children:`CHATCLI_AGENT_PARALLEL_MODE=true`}),`), the multi-agent orchestrator prompt is appended with the list of available agents and dispatch instructions.`]})})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`format-anchor-per-turn-reminder`,children:`Format Anchor (Per-Turn Reminder)`}),`\n`,_jsxs(_components.p,{children:[`At each turn of the ReAct loop, a `,_jsx(_components.strong,{children:`short format reminder`}),` is appended to the message history. This prevents the AI from “forgetting” the format rules in long conversations.`]}),`\n`,_jsx(Heading,{level:`3`,id:`in-/coder-mode`,children:`In /coder mode`}),`\n`,_jsx(_components.p,{children:`The anchor reminds about:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Mandatory format: `,_jsx(_components.code,{children:`\u003cplan>`}),` followed by `,_jsx(_components.code,{children:`\u003ctool_call name=\"@coder\">`})]}),`\n`,_jsx(_components.li,{children:`Prohibition of code blocks and direct commands`}),`\n`,_jsx(_components.li,{children:`Base64 encoding requirement for file writes`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`in-/agent-mode`,children:`In /agent mode`}),`\n`,_jsx(_components.p,{children:`The anchor reminds about:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`tool_call`}),` and `,_jsx(_components.code,{children:`execute`}),` block format`]}),`\n`,_jsx(_components.li,{children:`Tools available in the current turn`}),`\n`]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`The anchor is a `,_jsx(_components.strong,{children:`prompt engineering`}),` technique to maintain format adherence. Without it, models tend to “drift” into free text after 10-15 turns of conversation. The anchor is short (3-5 lines) to avoid consuming excessive tokens.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`tools-and-dependency`,children:`Tools and Dependency`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`/coder`}),` mode uses the `,_jsx(_components.a,{href:`/coder/coder-plugin`,children:`@coder`}),` plugin, which comes `,_jsx(_components.strong,{children:`built into ChatCLI`}),` — no additional installation required.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Check with `,_jsx(_components.code,{children:`/plugin list`}),` — `,_jsx(_components.code,{children:`@coder`}),` appears with the `,_jsx(_components.code,{children:`[builtin]`}),` tag.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`supported-subcommands`,children:`Supported Subcommands`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Subcommand`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`tree --dir .`})}),_jsx(_components.td,{children:`List directory tree`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`search --term \"x\" --dir .`})}),_jsx(_components.td,{children:`Search the codebase`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`read --file x`})}),_jsx(_components.td,{children:`Read file`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`write --file x --content \"...\" --encoding base64`})}),_jsx(_components.td,{children:`Write file`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`patch --file x --search \"...\" --replace \"...\"`})}),_jsx(_components.td,{children:`Apply patch`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`patch --diff \"...\" --diff-encoding base64`})}),_jsx(_components.td,{children:`Apply unified diff`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`exec --cmd \"command\"`})}),_jsx(_components.td,{children:`Execute command`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`git-status --dir .`})}),_jsx(_components.td,{children:`Git status`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`git-diff --dir .`})}),_jsx(_components.td,{children:`Git diff`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`git-log --dir .`})}),_jsx(_components.td,{children:`Git log`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`git-changed --dir .`})}),_jsx(_components.td,{children:`Changed files`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`git-branch --dir .`})}),_jsx(_components.td,{children:`Current branch`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`test --dir .`})}),_jsx(_components.td,{children:`Run tests`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`rollback --file x`})}),_jsx(_components.td,{children:`Revert change`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`clean --dir .`})}),_jsx(_components.td,{children:`Clean backups`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delegate --prompt \"...\" --tools [...]`})}),_jsxs(_components.td,{children:[`Delegate sub-task to a subagent with isolated context — see `,_jsx(_components.a,{href:`/agents/subagent-delegation`,children:`Subagent Delegation`})]})]})]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`/coder`}),` mode also receives the `,_jsx(_components.code,{children:`CHATCLI_AGENT_TMPDIR`}),` variable pointing to the `,_jsx(_components.a,{href:`/context/session-workspace`,children:`session scratch dir`}),`. It is the recommended path for creating temporary scripts and intermediate files without polluting the project.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`example-flow`,children:`Example Flow`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`List the tree`,children:_jsx(_components.p,{children:_jsx(_components.code,{children:`tree --dir .`})})}),_jsx(Step,{title:`Search for occurrences`,children:_jsx(_components.p,{children:_jsx(_components.code,{children:`search --term \"FAIL\" --dir .`})})}),_jsx(Step,{title:`Read relevant files`,children:_jsx(_components.p,{children:_jsx(_components.code,{children:`read --file cli/agent_mode.go`})})}),_jsx(Step,{title:`Apply patch`,children:_jsx(_components.p,{children:_jsx(_components.code,{children:`patch --file cli/agent_mode.go --search \"...\" --replace \"...\"`})})}),_jsx(Step,{title:`Run tests`,children:_jsx(_components.p,{children:_jsx(_components.code,{children:`exec --cmd \"go test ./...\"`})})})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`operation-parallelization`,children:`Operation Parallelization`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`/coder`}),` maximizes parallelism by emitting `,_jsx(_components.strong,{children:`multiple tool_calls in a single response`}),` when operations are independent. For example, when needing to read 3 files, the AI emits 3 `,_jsx(_components.code,{children:`tool_call`}),` tags at once instead of one per turn.`]}),`\n`,_jsxs(_components.p,{children:[`For complex tasks with 3+ independent operations, the AI uses `,_jsx(_components.code,{children:`\u003cagent_call>`}),` to dispatch specialized agents in parallel via goroutines.`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`If you notice the AI performing sequential operations that could be parallel, remind it: “emit all independent tool_calls in a single response”.`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`user-interaction-ask-when-needed`,children:`User Interaction (Ask When Needed)`}),`\n`,_jsxs(_components.p,{children:[`The AI doesn’t always have all the information needed to execute a task. When it needs data that only the user can provide (database choice, framework, credentials, options), the AI `,_jsx(_components.strong,{children:`asks directly`}),` instead of guessing.`]}),`\n`,_jsx(Heading,{level:`3`,id:`how-it-works-2`,children:`How It Works`}),`\n`,_jsxs(_components.p,{children:[`When the AI responds `,_jsxs(_components.strong,{children:[`without emitting any `,_jsx(_components.code,{children:`tool_call`})]}),` (just text with a question), ChatCLI detects this and:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Displays the AI’s question normally`}),`\n`,_jsxs(_components.li,{children:[`Shows a `,_jsx(_components.code,{children:`Waiting for your response...`}),` prompt instead of ending the session`]}),`\n`,_jsx(_components.li,{children:`Waits for the user to type a response`}),`\n`,_jsxs(_components.li,{children:[`Adds the response to the history and `,_jsx(_components.strong,{children:`continues the ReAct cycle`})]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`9`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+-- RESPONSE`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| I need information before proceeding:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| 1. Which database? (PostgreSQL, MySQL, SQLite)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| 2. Which library? (pgx, GORM, sqlx)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| 3. Database host and port?`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+--------------------------------------------------`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` Waiting for your response (--- for multiline, 'exit' to finish): PostgreSQL, pgx, localhost:5432`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The AI receives the response and continues with `,_jsx(_components.code,{children:`\u003cplan>`}),` + `,_jsx(_components.code,{children:`\u003ctool_call>`}),` as usual.`]}),`\n`,_jsx(Heading,{level:`3`,id:`multiline-responses`,children:`Multiline Responses`}),`\n`,_jsxs(_components.p,{children:[`For complex responses, use `,_jsx(_components.a,{href:`/usage/multiline-input`,children:`multiline mode`}),` with `,_jsx(_components.code,{children:`---`}),` (`,_jsx(_components.code,{children:\"```\"}),` is also accepted as a fence opener):`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` Waiting for your response: ---`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` Multiline mode — type --- on a new line to finish`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ... [1] PostgreSQL on port 5432`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ... [2] Host: db.internal`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ... [3] Use pgx as driver`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ... [4] Schema: public`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ... [5] ---`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`coder-mode-prompt-ux-parity-with-chat`,children:`Coder-mode prompt UX (parity with chat)`}),`\n`,_jsxs(_components.p,{children:[`The input that appears while `,_jsx(_components.code,{children:`/coder`}),` is waiting for your reply uses `,_jsx(_components.strong,{children:`the same readline engine as chat mode`}),` (`,_jsx(_components.code,{children:`go-prompt`}),` + `,_jsx(_components.code,{children:`BracketedPasteParser`}),`). That means:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Feature`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Behavior`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Width`}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Grows to the `,_jsx(_components.strong,{children:`real`}),` terminal width — no 80-column cap`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Bracketed paste`}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Pasted multiline content is `,_jsx(_components.strong,{children:`preserved`}),` (does not submit on the first newline)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Editing`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Arrows, Home/End, Ctrl+A/E, word navigation (Alt/Ctrl+arrows)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Paste detection`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Large pastes are captured via placeholder (same mechanism as chat) and expanded before going to the AI`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Non-TTY stdin (pipes, CI)`}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Automatic fallback to `,_jsx(_components.code,{children:`bufio.Reader`}),` — the agent still reads one line per iteration`]})]})]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`This input used to be a stripped-down `,_jsx(_components.code,{children:`golang.org/x/term`}),` reader that capped at 80 columns and treated each pasted `,_jsx(_components.code,{children:`\\\\n`}),` as Enter. If you still see that behavior, update ChatCLI — the chat-parity holds on any modern terminal.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`exiting-the-session`,children:`Exiting the Session`}),`\n`,_jsx(_components.p,{children:`To end the session when the AI is waiting, type:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`exit`}),`, `,_jsx(_components.code,{children:`quit`}),`, or `,_jsx(_components.code,{children:`sair`})]}),`\n`,_jsxs(_components.li,{children:[`Or press `,_jsx(_components.code,{children:`Ctrl+C`})]}),`\n`]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`This feature is enabled by the `,_jsx(_components.strong,{children:`“ASK WHEN NEEDED”`}),` rule in the `,_jsx(_components.code,{children:`/coder`}),` system prompt. The AI is instructed not to emit tool_calls when it needs user-provided information, but instead ask the question directly. This ensures ChatCLI detects the question and waits for the response.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`faq`,children:`FAQ`}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`Can I use JSON in args?`,id:`can-i-use-json-in-args`,children:[_jsx(_components.p,{children:`Yes, it is the recommended format:`}),_jsx(_components.p,{children:_jsx(_components.code,{children:`tool_call name=\"@coder\" args='{\"cmd\":\"read\",\"args\":{\"file\":\"main.go\"}}'`})})]}),_jsx(Accordion,{title:`When should I use patch --diff?`,id:`when-should-i-use-patch-diff`,children:_jsxs(_components.p,{children:[`When the change involves multiple sections or requires more precision. It accepts unified diff in `,_jsx(_components.code,{children:`text`}),` or `,_jsx(_components.code,{children:`base64`}),`.`]})}),_jsx(Accordion,{title:`Do I need to install @coder separately?`,id:`do-i-need-to-install-coder-separately`,children:_jsxs(_components.p,{children:[`No. `,_jsx(_components.code,{children:`@coder`}),` is a `,_jsx(_components.strong,{children:`builtin`}),` plugin — it comes embedded in the binary. If you install a custom version in `,_jsx(_components.code,{children:`~/.chatcli/plugins/`}),`, it will take precedence over the builtin.`]})}),_jsx(Accordion,{title:`Is exec safe?`,id:`is-exec-safe`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`@coder exec`}),` blocks dangerous patterns by default. For sensitive commands, prefer using the Git subcommands and `,_jsx(_components.code,{children:`test`}),`.`]})}),_jsx(Accordion,{title:`Is there a read limit?`,id:`is-there-a-read-limit`,children:_jsxs(_components.p,{children:[`Yes. Use `,_jsx(_components.code,{children:`read --max-bytes`}),`, `,_jsx(_components.code,{children:`--head`}),`, or `,_jsx(_components.code,{children:`--tail`}),` to control the output size.`]})}),_jsx(Accordion,{title:`How does /coder handle AI format errors?`,id:`how-does-coder-handle-ai-format-errors`,children:_jsxs(_components.p,{children:[`ChatCLI validates `,_jsx(_components.strong,{children:`every response`}),` from the AI against the output contract. If a violation is detected (e.g., direct code block, wrong tool, missing reasoning), a format correction feedback message is injected into the history and the turn is reprocessed. The AI gets up to 3 attempts to correct the format. In practice, modern models get it right on the first or second turn.`]})}),_jsx(Accordion,{title:`Can I use /coder with a custom persona?`,id:`can-i-use-coder-with-a-custom-persona`,children:_jsxs(_components.p,{children:[`Yes. When a persona is active (e.g., `,_jsx(_components.code,{children:`--persona senior-go`}),`), the persona prompt is used as the base and `,_jsx(_components.code,{children:`CoderFormatInstructions`}),` are `,_jsx(_components.strong,{children:`automatically appended`}),`. This ensures the persona respects the `,_jsx(_components.code,{children:`/coder`}),` output contract without losing its custom personality.`]})}),_jsx(Accordion,{title:`What is the Task Tracker?`,id:`what-is-the-task-tracker`,children:_jsxs(_components.p,{children:[`It is a module that parses numbered tasks from the AI’s `,_jsx(_components.code,{children:`\u003cplan>`}),` block (e.g., “1. Read files\\\\n2. Apply patch”). Each task receives a status (Pending, InProgress, Completed, Failed) that is updated as tool_calls are executed. Progress is displayed in the interface. If 3+ tasks fail, ChatCLI asks the AI to reformulate its plan.`]})}),_jsx(Accordion,{title:`Why is base64 required for write?`,id:`why-is-base64-required-for-write`,children:_jsx(_components.p,{children:`Source code frequently contains quotes, line breaks, backslashes, and other characters that conflict with JSON. When the AI sends code as plain text in the tool_call args, the JSON parse can fail or the content gets corrupted. Base64 encodes the content safely, eliminating 100% of escaping issues.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Coder Mode (/coder)","sidebarTitle":"Coder Mode (/coder)","description":"A specialized mode for software engineering: reading, editing, testing, and refactoring.","icon":"code","href":"/usage/coder-mode"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"When to Use","slug":"when-to-use","depth":2,"children":[]},{"title":"Handoff from chat","slug":"handoff-from-chat","depth":2,"children":[]},{"title":"Engineering Flow","slug":"engineering-flow","depth":2,"children":[]},{"title":"Multi-Agent Orchestration","slug":"multi-agent-orchestration","depth":2,"children":[]},{"title":"Output Contract","slug":"output-contract","depth":2,"children":[{"title":"Contract Validation and Enforcement","slug":"contract-validation-and-enforcement","depth":3,"children":[]}]},{"title":"Internal Difference Between /coder and /agent","slug":"internal-difference-between-/coder-and-/agent","depth":2,"children":[]},{"title":"Task Tracker and Progress","slug":"task-tracker-and-progress","depth":2,"children":[{"title":"How it works","slug":"how-it-works","depth":3,"children":[]},{"title":"Task status","slug":"task-status","depth":3,"children":[]},{"title":"Automatic replanning","slug":"automatic-replanning","depth":3,"children":[]},{"title":"TodoWrite parity — @todo plugin","slug":"todowrite-parity-—-@todo-plugin","depth":3,"children":[]}]},{"title":"Base64 Encoding Requirements","slug":"base64-encoding-requirements","depth":2,"children":[{"title":"Why base64?","slug":"why-base64","depth":3,"children":[]},{"title":"Encoding rules","slug":"encoding-rules","depth":3,"children":[]},{"title":"The --encoding flag","slug":"the-encoding-flag","depth":3,"children":[]}]},{"title":"System Prompt Composition in /coder","slug":"system-prompt-composition-in-/coder","depth":2,"children":[]},{"title":"Format Anchor (Per-Turn Reminder)","slug":"format-anchor-per-turn-reminder","depth":2,"children":[{"title":"In /coder mode","slug":"in-/coder-mode","depth":3,"children":[]},{"title":"In /agent mode","slug":"in-/agent-mode","depth":3,"children":[]}]},{"title":"Tools and Dependency","slug":"tools-and-dependency","depth":2,"children":[]},{"title":"Supported Subcommands","slug":"supported-subcommands","depth":2,"children":[]},{"title":"Example Flow","slug":"example-flow","depth":2,"children":[]},{"title":"Operation Parallelization","slug":"operation-parallelization","depth":2,"children":[]},{"title":"User Interaction (Ask When Needed)","slug":"user-interaction-ask-when-needed","depth":2,"children":[{"title":"How It Works","slug":"how-it-works-2","depth":3,"children":[]},{"title":"Multiline Responses","slug":"multiline-responses","depth":3,"children":[]},{"title":"Coder-mode prompt UX (parity with chat)","slug":"coder-mode-prompt-ux-parity-with-chat","depth":3,"children":[]},{"title":"Exiting the Session","slug":"exiting-the-session","depth":3,"children":[]}]},{"title":"FAQ","slug":"faq","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/encom/03414b2589eb02b8/flags.js","/_mintlify/custom/encom/f19b212850d023b6/sidebar-focus.js"],"subdomain":"encom","siteName":"ChatCLI","title":"Coder Mode (/coder) - ChatCLI","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/usage/coder-mode","matchLevel":0},"pt-BR":{"href":"/pt/usage/coder-mode","matchLevel":1}}},"lastModified":"2026-10-09T21:28:53.518Z","originalFileLocation":"usage/coder-mode.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"A specialized mode for software engineering: reading, editing, testing, and refactoring.\">\u003cmeta data-mint-head name=\"application-name\" content=\"ChatCLI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/encom/ilreks3OQttPbvib/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/encom/ilreks3OQttPbvib/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/encom/ilreks3OQttPbvib/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/encom/ilreks3OQttPbvib/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/encom/ilreks3OQttPbvib/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/encom/ilreks3OQttPbvib/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/encom/ilreks3OQttPbvib/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/encom/ilreks3OQttPbvib/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/encom/ilreks3OQttPbvib/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Coder Mode (/coder) - ChatCLI\">\u003cmeta data-mint-head property=\"og:description\" content=\"A specialized mode for software engineering: reading, editing, testing, and refactoring.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"ChatCLI Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://chatcli.edilsonfreitas.com/usage/coder-mode\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://encom.mintlify.app/_mintlify/api/og/v2?division=Using+ChatCLI\u0026amp;title=Coder+Mode+%28%2Fcoder%29\u0026amp;description=A+specialized+mode+for+software+engineering%3A+reading%2C+editing%2C+testing%2C+and+refactoring.\u0026amp;theme=731a6fec9091f5f0b8feb4c9\u0026amp;signature=6cf1b1a29c0936967e66d05ad26c43aab40103541912dcd03ebe204977869cf7\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Coder Mode (/coder) - ChatCLI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"A specialized mode for software engineering: reading, editing, testing, and refactoring.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://encom.mintlify.app/_mintlify/api/og/v2?division=Using+ChatCLI\u0026amp;title=Coder+Mode+%28%2Fcoder%29\u0026amp;description=A+specialized+mode+for+software+engineering%3A+reading%2C+editing%2C+testing%2C+and+refactoring.\u0026amp;theme=731a6fec9091f5f0b8feb4c9\u0026amp;signature=6cf1b1a29c0936967e66d05ad26c43aab40103541912dcd03ebe204977869cf7\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/encom/ilreks3OQttPbvib/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"ChatCLI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0F766E\">\u003clink data-mint-head rel=\"canonical\" href=\"https://chatcli.edilsonfreitas.com/usage/coder-mode\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/usage/coder-mode.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://chatcli.edilsonfreitas.com/usage/coder-mode\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"pt-BR\" href=\"https://chatcli.edilsonfreitas.com/pt/usage/coder-mode\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://chatcli.edilsonfreitas.com/usage/coder-mode\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://chatcli.edilsonfreitas.com/#organization\",\"name\":\"ChatCLI\",\"url\":\"https://chatcli.edilsonfreitas.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/encom/Rcdb5Pr5hpjwN46r/images/logo-light.svg?fit=max\u0026auto=format\u0026n=Rcdb5Pr5hpjwN46r\u0026q=85\u0026s=965a0feb9bd2f65a11b3c486e2488101\"}},{\"@type\":\"WebSite\",\"@id\":\"https://chatcli.edilsonfreitas.com#website\",\"name\":\"ChatCLI\",\"url\":\"https://chatcli.edilsonfreitas.com\",\"publisher\":{\"@id\":\"https://chatcli.edilsonfreitas.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://chatcli.edilsonfreitas.com/usage/coder-mode#webpage\",\"url\":\"https://chatcli.edilsonfreitas.com/usage/coder-mode\",\"name\":\"Coder Mode (/coder)\",\"description\":\"A specialized mode for software engineering: reading, editing, testing, and refactoring.\",\"dateModified\":\"2026-10-09T21:28:53.518Z\",\"isPartOf\":{\"@id\":\"https://chatcli.edilsonfreitas.com#website\"},\"breadcrumb\":{\"@id\":\"https://chatcli.edilsonfreitas.com/usage/coder-mode#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://chatcli.edilsonfreitas.com/usage/coder-mode#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Documentation\",\"item\":\"https://chatcli.edilsonfreitas.com/usage/basic-usage\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using ChatCLI\",\"item\":\"https://chatcli.edilsonfreitas.com/usage/basic-usage\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Coder Mode (/coder)\",\"item\":\"https://chatcli.edilsonfreitas.com/usage/coder-mode\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://chatcli.edilsonfreitas.com/usage/coder-mode#article\",\"headline\":\"Coder Mode (/coder)\",\"name\":\"Coder Mode (/coder)\",\"description\":\"A specialized mode for software engineering: reading, editing, testing, and refactoring.\",\"url\":\"https://chatcli.edilsonfreitas.com/usage/coder-mode\",\"mainEntityOfPage\":{\"@id\":\"https://chatcli.edilsonfreitas.com/usage/coder-mode#webpage\"},\"dateModified\":\"2026-10-09T21:28:53.518Z\",\"publisher\":{\"@id\":\"https://chatcli.edilsonfreitas.com/#organization\"},\"isPartOf\":{\"@id\":\"https://chatcli.edilsonfreitas.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"ChatCLI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"ChatCLI","nav":{"global":null,"languages":[{"language":"en","default":true,"groups":[{"group":"Get started","pages":[{"title":"ChatCLI","sidebarTitle":"Overview","icon":"house","mode":"wide","href":""},{"title":"Quickstart","icon":"rocket","href":"/start/quickstart"},{"title":"Installation and Configuration","sidebarTitle":"Installation","icon":"download","href":"/start/installation"},{"title":"Deploy with Docker and Kubernetes","sidebarTitle":"Docker \u0026 Kubernetes","icon":"docker","href":"/start/docker-deployment"},{"title":"Auto-Update","sidebarTitle":"Auto-Update","icon":"arrows-rotate","href":"/start/auto-update"},{"title":"Configuration Migration","sidebarTitle":"Config Migration","icon":"arrows-rotate","href":"/start/config-migration"}]},{"group":"Documentation","pages":[{"group":"Using ChatCLI","icon":"terminal","pages":[{"title":"Basic Usage and Main Commands","sidebarTitle":"Basic Usage","icon":"terminal","href":"/usage/basic-usage"},{"title":"Adding Context (@ Commands)","sidebarTitle":"Context Commands","icon":"at","href":"/usage/context-commands"},{"title":"Agent Mode: Task Execution","sidebarTitle":"Agent Mode (/agent)","description":"Learn how to delegate complete tasks to ChatCLI, which will plan and execute commands for you.","icon":"robot","href":"/usage/agent-mode"},{"title":"Coder Mode (/coder)","sidebarTitle":"Coder Mode (/coder)","icon":"code","href":"/usage/coder-mode"},{"title":"Non-Interactive Mode (One-Shot)","sidebarTitle":"One-Shot Mode","description":"Learn how to use ChatCLI in scripts, automations, and pipelines through command-line flags and pipe usage.","icon":"terminal","href":"/usage/non-interactive-mode"},{"title":"Conversation Control","sidebarTitle":"Conversation Control","icon":"clock-rotate-left","href":"/usage/conversation-control"},{"title":"Multiline Input","sidebarTitle":"Multiline Input","icon":"bars-staggered","href":"/usage/multiline-input"},{"title":"Real-Time Streaming","sidebarTitle":"Streaming","icon":"bolt","href":"/usage/streaming"},{"title":"Image Input (Vision)","sidebarTitle":"Image Input (Vision)","icon":"eye","href":"/usage/vision-input"},{"title":"PDF Input","sidebarTitle":"PDF Input","icon":"file-pdf","href":"/usage/pdf-input"},{"title":"Web UI","sidebarTitle":"Web UI","icon":"browser","href":"/usage/web-ui"},{"title":"Live Dashboard","sidebarTitle":"Live Dashboard","icon":"chart-network","href":"/usage/live-dashboard"},{"title":"Compact UI Mode","sidebarTitle":"Compact UI","icon":"minimize","href":"/usage/compact-ui"},{"title":"Theme System (Colors)","sidebarTitle":"Theme System","icon":"palette","href":"/usage/ui-theme"},{"title":"Internationalization (i18n)","sidebarTitle":"Internationalization","icon":"language","href":"/usage/i18n"}]},{"group":"Coder","icon":"code","pages":[{"title":"Plugin @coder","sidebarTitle":"Plugin @coder","icon":"hammer","href":"/coder/coder-plugin"},{"title":"Atomic Tools (@read, @search, @tree, @todo)","sidebarTitle":"Atomic Tools","icon":"wand-magic-sparkles","href":"/coder/atomic-tools"},{"title":"Coder Mode Security (Governance)","sidebarTitle":"Coder Mode Security (Governance)","icon":"shield-halved","href":"/coder/coder-security"},{"title":"Enhanced Permissions System","sidebarTitle":"Permissions","icon":"shield-halved","href":"/coder/enhanced-permissions"},{"title":"Git Worktrees","sidebarTitle":"Git Worktrees","icon":"code-branch","href":"/coder/worktrees"},{"title":"File Staleness Detection","sidebarTitle":"File Staleness","icon":"eye","href":"/coder/file-staleness"},{"title":"JSON Recovery","sidebarTitle":"JSON Recovery","icon":"screwdriver-wrench","href":"/coder/json-recovery"},{"title":"LSP Diagnostics","sidebarTitle":"LSP Diagnostics","icon":"stethoscope","href":"/coder/lsp-diagnostics"},{"title":"Interactive Questions (ask_user)","sidebarTitle":"Interactive Questions","icon":"list-check","href":"/coder/interactive-ask"},{"title":"Live Agent Progress","sidebarTitle":"Live Progress","icon":"chart-bar","href":"/coder/agent-progress-ui"}]},{"group":"Agents","icon":"robot","pages":[{"title":"Native Tool Use (Structured API)","sidebarTitle":"Native Tool Use","icon":"wrench","href":"/agents/native-tool-use"},{"title":"Agentic AI and Plugin System","sidebarTitle":"Agentic AI \u0026 Plugins","icon":"puzzle-piece","href":"/agents/agentic-plugins"},{"title":"Customizable Agents (Personas)","sidebarTitle":"Customizable Agents","icon":"user-gear","href":"/agents/customizable-agents"},{"title":"Multi-Agent Orchestration","sidebarTitle":"Multi-Agent","icon":"users","href":"/agents/multi-agent-orchestration"},{"title":"Agent Squad","sidebarTitle":"Agent Squad","icon":"people-group","href":"/agents/agent-squad"},{"title":"Task Graph","sidebarTitle":"Task Graph","icon":"diagram-project","href":"/agents/task-graph"},{"title":"Subagent Delegation","sidebarTitle":"Subagent Delegate","icon":"diagram-project","href":"/agents/subagent-delegation"},{"title":"Mixture-of-Agents (MoA)","sidebarTitle":"Mixture-of-Agents","icon":"layer-group","href":"/agents/mixture-of-agents"},{"title":"Model Routing (@model)","sidebarTitle":"Model Routing","icon":"shuffle","href":"/agents/model-routing"},{"title":"Agent Park \u0026 Resume — Non-blocking suspension","sidebarTitle":"Park \u0026 Resume","icon":"circle-pause","href":"/agents/agent-park"},{"group":"Harness (7 patterns + evals)","icon":"wand-magic-sparkles","pages":[{"title":"Agent Harness/Quality Pipeline","sidebarTitle":"Overview","icon":"sparkles","href":"/agents/harness/overview"},{"title":"#1 ReAct — Reason + Act","sidebarTitle":"ReAct","icon":"rotate","href":"/agents/harness/react"},{"title":"#2 Plan-and-Solve / ReWOO","sidebarTitle":"Plan-and-Solve","icon":"list-check","href":"/agents/harness/plan-and-solve"},{"title":"#3 Reflexion — Learn from Failures","sidebarTitle":"Reflexion","icon":"lightbulb","href":"/agents/harness/reflexion"},{"title":"#4 RAG + HyDE — Semantic Retrieval","sidebarTitle":"RAG + HyDE","icon":"database","href":"/agents/harness/rag-hyde"},{"title":"#5 Self-Refine — Critique and Rewrite","sidebarTitle":"Self-Refine","icon":"wand-magic-sparkles","href":"/agents/harness/self-refine"},{"title":"#6 Chain-of-Verification (CoVe)","sidebarTitle":"CoVe","icon":"check-double","href":"/agents/harness/cove"},{"title":"#7 Cross-Provider Reasoning Backbone","sidebarTitle":"Reasoning Backbone","icon":"brain-circuit","href":"/agents/harness/reasoning-backbone"},{"title":"Configuration — Env, Slashes and /config","sidebarTitle":"Configuration","icon":"sliders","href":"/agents/harness/configuration"},{"title":"Evals: measuring ChatCLI","sidebarTitle":"Evals","icon":"flask","href":"/agents/harness/evals"}]}]},{"group":"Context \u0026 memory","icon":"layer-group","pages":[{"title":"LongMemEval: how well chatcli remembers","sidebarTitle":"LongMemEval results","icon":"chart-simple","href":"/context/longmemeval"},{"title":"Persistent Context Management","sidebarTitle":"Contexts (/context)","icon":"database","href":"/context/persistent-context"},{"title":"Knowledge Base (keyless RAG)","sidebarTitle":"Knowledge Base","icon":"book-open","href":"/context/knowledge-base"},{"title":"Bootstrap and Persistent Memory","sidebarTitle":"Bootstrap and Memory","icon":"memory","href":"/context/bootstrap-memory"},{"title":"Path-Specific Rules","sidebarTitle":"Path Rules","icon":"folder-tree","href":"/context/path-rules"},{"title":"Filtering with .chatignore","sidebarTitle":".chatignore","icon":"filter","href":"/context/chatignore"},{"group":"Sessions","icon":"clock-rotate-left","pages":[{"title":"Session Management","sidebarTitle":"Sessions","icon":"clock-rotate-left","href":"/context/session-management"},{"title":"Conversation Search (@session)","sidebarTitle":"Conversation Search","icon":"magnifying-glass","href":"/context/session-search"},{"title":"Session Workspace (Scratch Dir)","sidebarTitle":"Session Workspace","icon":"folder-tree","href":"/context/session-workspace"},{"title":"Trajectory Export (ShareGPT)","sidebarTitle":"Export Trajectory","icon":"file-export","href":"/context/trajectory-export"}]},{"group":"Token efficiency","icon":"gauge-high","pages":[{"title":"Token Efficiency","sidebarTitle":"Token Efficiency","icon":"gauge-high","href":"/context/token-efficiency"},{"title":"Context Compression (CCR)","sidebarTitle":"Context Compression","icon":"file-zipper","href":"/context/context-compression"},{"title":"Chat Prefix Curation","sidebarTitle":"Prefix Curation","icon":"scissors","href":"/context/prefix-curation"},{"title":"Tool Result Management","sidebarTitle":"Tool Results","icon":"database","href":"/context/tool-result-management"},{"title":"Context Recovery","sidebarTitle":"Context Recovery","icon":"life-ring","href":"/context/context-recovery"}]}]},{"group":"Models \u0026 providers","icon":"shuffle","pages":[{"title":"Supported AI Models","sidebarTitle":"Supported Models","icon":"microchip","href":"/providers/supported-models"},{"title":"OAuth Authentication","sidebarTitle":"OAuth Authentication","icon":"key","href":"/providers/oauth-authentication"},{"title":"AWS Bedrock","sidebarTitle":"AWS Bedrock","icon":"aws","href":"/providers/bedrock"},{"title":"Devin Provider — the local Devin CLI as an LLM transport","sidebarTitle":"Devin Provider","icon":"robot","href":"/providers/devin-provider"},{"title":"Provider Fallback","sidebarTitle":"Provider Fallback","icon":"rotate","href":"/providers/provider-fallback"},{"title":"Rate Limits — provider limit visibility","sidebarTitle":"Rate Limits","icon":"gauge-high","href":"/providers/rate-limits"},{"title":"Cost Tracking","sidebarTitle":"Cost Tracking","icon":"money-bill-trend-up","href":"/providers/cost-tracking"}]},{"group":"Tools","icon":"toolbox","pages":[{"title":"WebFetch \u0026 WebSearch","sidebarTitle":"Web Tools","icon":"globe","href":"/tools/web-tools"},{"title":"Browser Automation (@browser)","sidebarTitle":"Browser Automation","icon":"chrome","href":"/tools/browser-automation"},{"title":"API Explorer (@api-explorer)","sidebarTitle":"API Explorer","icon":"compass","href":"/tools/api-explorer"},{"title":"Git Forge (@forge)","sidebarTitle":"Git Forge","icon":"code-pull-request","href":"/tools/git-forge"},{"title":"Image Generation \u0026 Editing (@image)","sidebarTitle":"Image Generation \u0026 Editing","icon":"image","href":"/tools/image-generation"},{"title":"Diagrams (@diagram)","sidebarTitle":"Diagrams","icon":"diagram-project","href":"/tools/diagram"},{"title":"Interactive graph (@graphview)","sidebarTitle":"Interactive graph","icon":"circle-nodes","href":"/tools/graphview"},{"title":"Image Tags (@registry-tags)","sidebarTitle":"Registry Tags","icon":"tags","href":"/tools/registry-tags"},{"title":"Builtin Skills","sidebarTitle":"Builtin Skills","icon":"boxes-stacked","href":"/tools/builtin-skills"},{"title":"Scheduler (Chronos) — Durable scheduling","sidebarTitle":"Scheduler","icon":"clock","href":"/tools/scheduler"}]},{"group":"Extensions","icon":"plug","pages":[{"title":"Plugin System","sidebarTitle":"Plugin System","icon":"plug","href":"/extensions/plugin-system"},{"title":"Provider Plugins","sidebarTitle":"Provider Plugins","icon":"plug-circle-bolt","href":"/extensions/provider-plugins"},{"title":"MCP (Model Context Protocol)","sidebarTitle":"Connect MCP Servers","icon":"link","href":"/extensions/mcp-integration"},{"title":"Skill Registry","sidebarTitle":"Skill Registry","icon":"store","tag":"NEW","href":"/extensions/skill-registry"},{"title":"Skill Authoring (@skill)","sidebarTitle":"Skill Authoring","icon":"wand-magic-sparkles","href":"/extensions/skill-authoring"},{"title":"Slash Commands","sidebarTitle":"Slash Commands","icon":"terminal","tag":"NEW","href":"/extensions/slash-commands"},{"title":"Hooks System","sidebarTitle":"Hooks","icon":"webhook","href":"/extensions/hooks-system"}]},{"group":"Channels \u0026 gateway","icon":"comments","pages":[{"title":"Chat gateway","sidebarTitle":"Chat gateway","icon":"messages","href":"/gateway/chat-gateway"},{"title":"Telegram","icon":"telegram","href":"/gateway/telegram"},{"title":"Slack","icon":"slack","href":"/gateway/slack"},{"title":"Discord","icon":"discord","href":"/gateway/discord"},{"title":"WhatsApp","icon":"whatsapp","href":"/gateway/whatsapp"},{"title":"Webhook","icon":"webhook","href":"/gateway/webhook"},{"title":"Conversation Hub — conversation continuity across channels","sidebarTitle":"Conversation Hub","icon":"share-nodes","href":"/gateway/conversation-hub"},{"title":"MCP Channels","sidebarTitle":"MCP Channels","icon":"tower-broadcast","href":"/gateway/mcp-channels"},{"title":"Proactive Messaging (@send)","sidebarTitle":"Proactive Messaging","icon":"paper-plane","href":"/gateway/proactive-messaging"},{"title":"Text-to-Speech \u0026 Gateway Voice","sidebarTitle":"Text-to-Speech","icon":"volume-high","href":"/gateway/text-to-speech"},{"title":"Gateway Voice Replies","sidebarTitle":"Voice Replies","icon":"microphone","href":"/gateway/voice-replies"}]},{"group":"Server \u0026 IDE","icon":"server","pages":[{"title":"Server Mode (chatcli server)","sidebarTitle":"Server Mode","icon":"server","href":"/server/server-mode"},{"title":"Remote Connection (chatcli connect)","sidebarTitle":"Remote Connection","icon":"plug","href":"/server/remote-connect"},{"title":"MCP Server — ChatCLI as a server (and ACP)","sidebarTitle":"ChatCLI MCP Server","icon":"server","href":"/server/mcp-server"},{"title":"ACP — ChatCLI inside your IDE","sidebarTitle":"ACP (IDE Agent)","icon":"plug-circle-bolt","href":"/server/acp"}]},{"group":"Kubernetes \u0026 AIOps","icon":"dharmachakra","pages":[{"title":"Kubernetes Monitoring (K8s Watcher)","sidebarTitle":"K8s Watcher","icon":"binoculars","href":"/kubernetes/k8s-watcher"},{"title":"Kubernetes Operator (AIOps)","sidebarTitle":"K8s Operator","icon":"dharmachakra","href":"/kubernetes/k8s-operator"},{"title":"AIOps Platform (Deep-Dive)","sidebarTitle":"AIOps Platform","icon":"brain","href":"/kubernetes/aiops-platform"},{"title":"ArtifactHub","sidebarTitle":"ArtifactHub","icon":"cube","href":"/kubernetes/artifacthub"},{"group":"AIOps platform","icon":"siren-on","pages":[{"title":"Incident Lifecycle","sidebarTitle":"Lifecycle","icon":"arrows-spin","href":"/kubernetes/aiops/incident-lifecycle"},{"title":"Notifications and Escalation","sidebarTitle":"Notifications","icon":"bell","href":"/kubernetes/aiops/notifications"},{"title":"SLOs and SLAs","sidebarTitle":"SLOs and SLAs","icon":"gauge-high","href":"/kubernetes/aiops/slo-sla"},{"title":"Approval Workflow","sidebarTitle":"Approvals","icon":"shield-check","href":"/kubernetes/aiops/approval-workflow"},{"title":"AI-Powered Decision Engine","sidebarTitle":"Decision Engine","icon":"brain-circuit","href":"/kubernetes/aiops/decision-engine"},{"title":"Multi-Cluster Federation","sidebarTitle":"Multi-Cluster Federation","icon":"network-wired","href":"/kubernetes/aiops/federation"},{"title":"Chaos Engineering","sidebarTitle":"Chaos Engineering","icon":"explosion","href":"/kubernetes/aiops/chaos-engineering"},{"title":"Audit and Compliance","sidebarTitle":"Audit and Compliance","icon":"clipboard-check","href":"/kubernetes/aiops/audit-compliance"},{"title":"Capacity Planning and Cost Attribution","sidebarTitle":"Capacity \u0026 Costs","icon":"chart-line","href":"/kubernetes/aiops/capacity-cost"},{"title":"Web Dashboard and Grafana","sidebarTitle":"Dashboard \u0026 Grafana","icon":"chart-mixed","href":"/kubernetes/aiops/web-dashboard"}]}]},{"group":"Security","icon":"shield-halved","pages":[{"title":"Enterprise Security","sidebarTitle":"Security","icon":"shield-halved","href":"/security/overview"},{"title":"Encryption at Rest","sidebarTitle":"Encryption at Rest","icon":"lock","href":"/security/encryption-at-rest"},{"title":"Security Hardening Upgrade Guide","sidebarTitle":"Hardening upgrade","icon":"shield-exclamation","href":"/security/hardening-upgrade"},{"title":"Vulnerability Scan (@osv)","sidebarTitle":"Dependency Scan","icon":"shield-halved","href":"/security/dependency-scan"}]},{"group":"Cookbook","icon":"kitchen-set","pages":[{"title":"Recipe: Safe Refactoring with Agent Mode","sidebarTitle":"Refactoring with Agent","icon":"screwdriver-wrench","href":"/cookbook/agent-refactoring"},{"title":"Fix tests with /coder","sidebarTitle":"Fix tests with /coder","icon":"vial","href":"/cookbook/coder-fix-tests"},{"title":"Recipe: Catching a Regression with Evals","sidebarTitle":"Catching a Regression with Evals","icon":"flask","href":"/cookbook/eval-regression"},{"title":"Recipe: Debugging Error Logs with Pipes","sidebarTitle":"Debug Error Logs","icon":"bug","href":"/cookbook/debugging-logs-with-pipes"},{"title":"One-Shot, Pipes, and Automation","sidebarTitle":"One-Shot and Pipes","icon":"wand-magic-sparkles","href":"/cookbook/oneshot-pipelines"},{"title":"Recipe: K8s Monitoring with AI","sidebarTitle":"K8s Monitoring","icon":"chart-line","href":"/cookbook/k8s-monitoring"},{"title":"Recipe: Managing Multiple Projects with Contexts and Sessions","sidebarTitle":"Multi-Project Workflow","icon":"folder-tree","href":"/cookbook/multi-project-workflow"},{"title":"Recipe: Understanding a Code Project","sidebarTitle":"Understand a New Project","icon":"rocket","href":"/cookbook/onboarding-new-project"},{"title":"Recipe: Generating Release Notes with @git","sidebarTitle":"Generate Release Notes","icon":"scroll","href":"/cookbook/release-notes-automation"},{"title":"Recipe: Remote Server for Teams","sidebarTitle":"Team Server","icon":"network-wired","href":"/cookbook/remote-server-setup"},{"title":"AIOps: Complete Production Setup","sidebarTitle":"AIOps Production Setup","icon":"rocket","href":"/cookbook/aiops-production-setup"},{"title":"Recipe: Scaling Instances","sidebarTitle":"Scaling Instances","icon":"arrows-left-right","href":"/cookbook/scaling-instances"},{"title":"AIOps: Incident Response Guide","sidebarTitle":"Incident Response","icon":"siren-on","href":"/cookbook/aiops-incident-response"},{"title":"Production Security Hardening","sidebarTitle":"Security Hardening","icon":"lock","href":"/cookbook/security-hardening-production"},{"title":"Scheduler automation recipes","sidebarTitle":"Scheduler: automations","icon":"book-open","href":"/cookbook/scheduler-automations"},{"title":"Recipe: Cross-Layer Debugging with 3 Knowledge Bases","sidebarTitle":"Cross-Layer Debugging","icon":"diagram-project","href":"/cookbook/cross-layer-knowledge-debug"}]},{"group":"Reference","icon":"rectangle-list","pages":[{"title":"Complete Command Reference","sidebarTitle":"Command Reference","icon":"rectangle-list","href":"/reference/command-reference"},{"title":"Environment Variables","sidebarTitle":"Environment Variables","icon":"sliders","href":"/reference/environment-variables"},{"title":"Configuration Reference (.env)","sidebarTitle":"Configuration (.env)","icon":"gear","href":"/reference/configuration"},{"title":"MCP Configuration (mcp_servers.json)","sidebarTitle":"MCP Config","icon":"gear","href":"/reference/mcp-config"},{"title":"Architecture and Code Structure","sidebarTitle":"Architecture","icon":"sitemap","href":"/reference/architecture"},{"group":"REST API","icon":"code","pages":[{"group":"Introduction","icon":"compass","pages":[{"title":"API Overview","sidebarTitle":"Overview","icon":"compass","href":"/reference/api/overview"}]},{"group":"Incidents","icon":"siren-on","pages":[{"title":"List Incidents","openapi":"GET /incidents","icon":"list","href":"/reference/api/list-incidents"},{"title":"Get Incident","openapi":"GET /incidents/{name}","icon":"magnifying-glass","href":"/reference/api/get-incident"},{"title":"Acknowledge Incident","openapi":"POST /incidents/{name}/acknowledge","icon":"check","href":"/reference/api/acknowledge-incident"},{"title":"Resolve Incident","openapi":"POST /incidents/{name}/resolve","icon":"circle-check","href":"/reference/api/resolve-incident"},{"title":"Snooze Incident","openapi":"POST /incidents/{name}/snooze","icon":"clock","href":"/reference/api/snooze-incident"},{"title":"Get Incident Timeline","openapi":"GET /incidents/{name}/timeline","icon":"timeline","href":"/reference/api/get-timeline"},{"title":"Get Incident Remediation","openapi":"GET /incidents/{name}/remediation","icon":"wrench","href":"/reference/api/get-remediation"}]},{"group":"AI Insights","icon":"lightbulb","pages":[{"title":"List AI Insights","openapi":"GET /aiinsights","icon":"list","href":"/reference/api/list-aiinsights"},{"title":"Get AI Insight","openapi":"GET /aiinsights/{name}","icon":"lightbulb","href":"/reference/api/get-aiinsight"}]},{"group":"Remediations","icon":"wrench","pages":[{"title":"List Remediations","openapi":"GET /remediations","icon":"list","href":"/reference/api/list-remediations"},{"title":"Get Remediation Plan","openapi":"GET /remediations/{name}","icon":"wrench","href":"/reference/api/get-remediation-detail"}]},{"group":"Runbooks","icon":"book-open","pages":[{"title":"List Runbooks","openapi":"GET /runbooks","icon":"list","href":"/reference/api/list-runbooks"},{"title":"Get Runbook","openapi":"GET /runbooks/{name}","icon":"book-open","href":"/reference/api/get-runbook"},{"title":"Create Runbook","openapi":"POST /runbooks","icon":"plus","href":"/reference/api/create-runbook"},{"title":"Update Runbook","openapi":"PUT /runbooks/{name}","icon":"pen-to-square","href":"/reference/api/update-runbook"},{"title":"Delete Runbook","openapi":"DELETE /runbooks/{name}","icon":"trash","href":"/reference/api/delete-runbook"}]},{"group":"Approvals","icon":"circle-check","pages":[{"title":"List Approvals","openapi":"GET /approvals","icon":"list","href":"/reference/api/list-approvals"},{"title":"Get Approval","openapi":"GET /approvals/{name}","icon":"magnifying-glass","href":"/reference/api/get-approval"},{"title":"Approve Request","openapi":"POST /approvals/{name}/approve","icon":"circle-check","href":"/reference/api/approve"},{"title":"Reject Request","openapi":"POST /approvals/{name}/reject","icon":"circle-xmark","href":"/reference/api/reject"}]},{"group":"SLOs","icon":"gauge","pages":[{"title":"List SLOs","openapi":"GET /slos","icon":"list","href":"/reference/api/list-slos"},{"title":"Get SLO","openapi":"GET /slos/{name}","icon":"gauge","href":"/reference/api/get-slo"},{"title":"Get SLO Error Budget","openapi":"GET /slos/{name}/budget","icon":"coins","href":"/reference/api/get-slo-budget"}]},{"group":"PostMortems","icon":"magnifying-glass-chart","pages":[{"title":"List PostMortems","openapi":"GET /postmortems","icon":"list","href":"/reference/api/list-postmortems"},{"title":"Get PostMortem","openapi":"GET /postmortems/{name}","icon":"magnifying-glass","href":"/reference/api/get-postmortem"},{"title":"Review PostMortem","openapi":"POST /postmortems/{name}/review","icon":"user-pen","href":"/reference/api/review-postmortem"},{"title":"Developer Feedback","openapi":"POST /postmortems/{name}/feedback","icon":"comment","href":"/reference/api/feedback-postmortem"},{"title":"Acknowledge Human Action","openapi":"POST /postmortems/{name}/ack-human-action","icon":"user-check","href":"/reference/api/ack-human-action-postmortem"},{"title":"Close PostMortem","openapi":"POST /postmortems/{name}/close","icon":"lock","href":"/reference/api/close-postmortem"}]},{"group":"Analytics","icon":"chart-line","pages":[{"title":"Analytics Summary","openapi":"GET /analytics/summary","icon":"chart-line","href":"/reference/api/analytics-summary"},{"title":"Analytics MTTR","openapi":"GET /analytics/mttr","icon":"stopwatch","href":"/reference/api/analytics-mttr"},{"title":"Analytics MTTD","openapi":"GET /analytics/mttd","icon":"stopwatch","href":"/reference/api/analytics-mttd"},{"title":"Analytics Trends","openapi":"GET /analytics/trends","icon":"arrow-trend-up","href":"/reference/api/analytics-trends"},{"title":"Analytics Top Resources","openapi":"GET /analytics/top-resources","icon":"ranking-star","href":"/reference/api/analytics-top-resources"},{"title":"Analytics Remediation Stats","openapi":"GET /analytics/remediation-stats","icon":"chart-pie","href":"/reference/api/analytics-remediation-stats"},{"title":"Analytics Compliance","openapi":"GET /analytics/compliance","icon":"clipboard-check","href":"/reference/api/analytics-compliance"},{"title":"Analytics Capacity","openapi":"GET /analytics/capacity","icon":"server","href":"/reference/api/analytics-capacity"},{"title":"Analytics Cost","openapi":"GET /analytics/cost","icon":"coins","href":"/reference/api/analytics-cost"}]},{"group":"Clusters","icon":"diagram-project","pages":[{"title":"List Clusters","openapi":"GET /clusters","icon":"list","href":"/reference/api/list-clusters"},{"title":"Get Cluster","openapi":"GET /clusters/{name}","icon":"diagram-project","href":"/reference/api/get-cluster"},{"title":"List Policies","openapi":"GET /policies/{kind}","icon":"list-check","href":"/reference/api/list-policies"},{"title":"Get Policy","openapi":"GET /policies/{kind}/{name}","icon":"file-lines","href":"/reference/api/get-policy"},{"title":"Global Cluster Status","openapi":"GET /clusters/global-status","icon":"globe","href":"/reference/api/global-status"}]},{"group":"Federation","icon":"network-wired","pages":[{"title":"Federation Status","openapi":"GET /federation/status","icon":"network-wired","href":"/reference/api/federation-status"},{"title":"Federation Clusters","openapi":"GET /federation/clusters","icon":"list","href":"/reference/api/federation-clusters"},{"title":"Federation Correlations","openapi":"GET /federation/correlations","icon":"diagram-project","href":"/reference/api/federation-correlations"}]},{"group":"Audit","icon":"clipboard-check","pages":[{"title":"List Audit Events","openapi":"GET /audit","icon":"list","href":"/reference/api/list-audit"},{"title":"Export Audit","openapi":"GET /audit/export","icon":"file-export","href":"/reference/api/export-audit"}]},{"group":"Health","icon":"heart-pulse","pages":[{"title":"Health Endpoints","openapi":"GET /healthz","icon":"heart-pulse","href":"/reference/api/health-endpoints"}]}]}]},{"group":"Releases","icon":"rocket","tag":"v1.223.0","pages":[{"title":"Release notes","icon":"tag","href":"/releases"},{"title":"v1.223.0","tag":"Latest","href":"/releases/1.223.0"},{"title":"v1.222.0","href":"/releases/1.222.0"},{"title":"v1.221.3","href":"/releases/1.221.3"},{"title":"v1.221.2","href":"/releases/1.221.2"},{"title":"v1.221.1","href":"/releases/1.221.1"},{"title":"v1.221.0","href":"/releases/1.221.0"},{"title":"v1.220.0","href":"/releases/1.220.0"},{"title":"v1.219.0","href":"/releases/1.219.0"},{"title":"v1.218.0","href":"/releases/1.218.0"},{"title":"v1.217.0","href":"/releases/1.217.0"}]},{"group":"Help","icon":"life-ring","pages":[{"title":"Troubleshooting","sidebarTitle":"Troubleshooting","icon":"life-ring","href":"/help/troubleshooting"},{"title":"Contributing to ChatCLI","sidebarTitle":"Contributing","icon":"code-pull-request","href":"/help/contributing"}]}]}]},{"language":"pt-BR","footer":{"socials":{"github":"https://github.com/diillson/chatcli","x":"https://x.com/diillson"},"links":[{"header":"Recursos","items":[{"label":"Documentação","href":"/pt"},{"label":"Cookbook","href":"/pt/cookbook/agent-refactoring"},{"label":"API Reference","href":"/pt/reference/api/overview"}]},{"header":"Comunidade","items":[{"label":"GitHub","href":"https://github.com/diillson/chatcli"},{"label":"Issues","href":"https://github.com/diillson/chatcli/issues"},{"label":"Discussions","href":"https://github.com/diillson/chatcli/discussions"},{"label":"Releases","href":"https://github.com/diillson/chatcli/releases"}]},{"header":"Distribuição","items":[{"label":"ArtifactHub","href":"https://artifacthub.io/packages/search?ts_query_web=chatcli"},{"label":"Helm Charts","href":"https://artifacthub.io/packages/helm/chatcli/chatcli"},{"label":"Container Registry","href":"https://github.com/diillson/chatcli/pkgs/container/chatcli"}]}]},"navbar":{"links":[{"href":"/pt/cookbook/agent-refactoring","label":"Cookbook"},{"href":"/pt/releases","label":"Releases"},{"href":"https://github.com/diillson/chatcli","type":"github"}],"primary":{"type":"button","label":"Instalar","href":"/pt/start/installation"}},"pages":[{"title":"pt-BR","href":"/pt/usage/coder-mode"}]}]},"title":"Coder Mode (/coder) - ChatCLI","buildId":"dpl_22zLaHtK6fmmSqApXTTP5tC7UBZn","deploymentId":"dpl_22zLaHtK6fmmSqApXTTP5tC7UBZn","dynamics":[],"chunks":[]}