doc/configuration/cli.md
By default, CodeCompanion uses the terminal provider for CLI interactions, which runs agents in a Neovim terminal buffer. However, the CLI system is flexible and allows you to define custom agents and providers to suit your workflow.
To use the CLI interaction, you need to define at least one agent in your configuration:
require("codecompanion").setup({
interactions = {
cli = {
agent = "claude_code",
agents = {
claude_code = {
cmd = "claude",
args = {},
description = "Claude Code CLI",
provider = "terminal",
},
},
},
},
})
The agent field sets the default agent. You can override it per-command with :CodeCompanionCLI agent=<name>.
| Option | Type | Description |
|---|---|---|
cmd | string | The command to run (e.g. "claude", "codex") |
args | table | Arguments to pass to the command |
description | string | Description shown in the action palette |
provider | string | Which provider to use (defaults to "terminal") |
You can define multiple agents and switch between them:
require("codecompanion").setup({
interactions = {
cli = {
agent = "claude_code",
agents = {
claude_code = {
cmd = "claude",
args = {},
description = "Claude Code CLI",
},
codex = {
cmd = "codex",
args = {},
description = "OpenAI Codex CLI",
},
},
},
},
})
Then use :CodeCompanionCLI agent=codex <prompt> to use a specific agent.
Providers determine how the CLI agent is run. The built-in terminal provider uses a Neovim terminal buffer with jobstart():
require("codecompanion").setup({
interactions = {
cli = {
providers = {
terminal = {
path = "interactions.cli.providers.terminal",
description = "Terminal CLI provider",
},
},
},
},
})
You can create custom providers and reference them by module path or file path:
require("codecompanion").setup({
interactions = {
cli = {
providers = {
my_provider = {
-- Can be a codecompanion module, a Lua module, or a file path
path = "my_custom.cli_provider",
description = "My custom CLI provider",
},
},
agents = {
my_agent = {
cmd = "my-cli",
args = {},
provider = "my_provider",
},
},
},
},
})
If an agent's provider field doesn't match any entry in the providers table, the terminal provider is used as a fallback.
The CLI buffer supports keymaps for navigating between interactions:
require("codecompanion").setup({
interactions = {
cli = {
keymaps = {
next_chat = {
modes = { n = "}" },
callback = "keymaps.next_chat",
description = "[Nav] Next interaction",
},
previous_chat = {
modes = { n = "{" },
callback = "keymaps.previous_chat",
description = "[Nav] Previous interaction",
},
},
},
},
})
There are a number of options available for CLI interactions:
require("codecompanion").setup({
interactions = {
cli = {
opts = {
auto_insert = true, -- Enter insert mode when focusing the CLI terminal
reload = true, -- Reload buffers when an agent modifies files on disk
},
},
},
})
| Option | Type | Default | Description |
|---|---|---|---|
auto_insert | boolean | true | Automatically enter insert mode when the CLI terminal is focused |
reload | boolean | true | Watches the cwd for file changes and runs :checktime to reload buffers |
The CLI window inherits its layout from display.chat.window by default. You can override specific options via display.cli.window:
require("codecompanion").setup({
display = {
cli = {
window = {
layout = "vertical",
width = 0.4,
height = 0.6,
opts = {
list = false,
},
},
},
},
})
Any options set in display.cli.window are merged on top of the chat window defaults. This means you only need to specify what you want to change.
You can also pass width and height overrides via the Lua API:
require("codecompanion").cli("fix the tests", {
width = 0.5,
height = 0.8,
})