| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- ---
- title: Commands
- description: Create custom commands for repetitive tasks.
- ---
- Custom commands let you specify a prompt you want to run when that command is executed in the TUI.
- ```bash frame="none"
- /my-command
- ```
- Custom commands are in addition to the built-in commands like `/init`, `/undo`, `/redo`, `/share`, `/help`. [Learn more](/docs/tui#commands).
- ---
- ## Create command files
- Create markdown files in the `command/` directory to define custom commands.
- Create `.opencode/command/test.md`:
- ```md title=".opencode/command/test.md"
- ---
- description: Run tests with coverage
- agent: build
- model: anthropic/claude-3-5-sonnet-20241022
- ---
- Run the full test suite with coverage report and show any failures.
- Focus on the failing tests and suggest fixes.
- ```
- The frontmatter defines command properties. The content becomes the template.
- Use the command by typing `/` followed by the command name.
- ```bash frame="none"
- "/test"
- ```
- ---
- ## Configure
- You can add custom commands through the OpenCode config or by creating markdown files in the `command/` directory.
- ---
- ### JSON
- Use the `command` option in your OpenCode [config](/docs/config):
- ```json title="opencode.jsonc" {4-12}
- {
- "$schema": "https://opencode.ai/config.json",
- "command": {
- // This becomes the name of the command
- "test": {
- // This is the prompt that will be sent to the LLM
- "template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes.",
- // This is show as the description in the TUI
- "description": "Run tests with coverage",
- "agent": "build",
- "model": "anthropic/claude-3-5-sonnet-20241022"
- }
- }
- }
- ```
- Now you can run this command in the TUI:
- ```bash frame="none"
- /test
- ```
- ---
- ### Markdown
- You can also define commands using markdown files. Place them in:
- - Global: `~/.config/opencode/command/`
- - Per-project: `.opencode/command/`
- ```markdown title="~/.config/opencode/command/test.md"
- ---
- description: Run tests with coverage
- agent: build
- model: anthropic/claude-3-5-sonnet-20241022
- ---
- Run the full test suite with coverage report and show any failures.
- Focus on the failing tests and suggest fixes.
- ```
- The markdown file name becomes the command name. For example, `test.md` lets
- you run:
- ```bash frame="none"
- /test
- ```
- ---
- ## Prompt config
- The prompts for the custom commands support several special placeholders and syntax.
- ---
- ### Arguments
- Pass arguments to commands using the `$ARGUMENTS` placeholder.
- ```md title=".opencode/command/component.md"
- ---
- description: Create a new component
- ---
- Create a new React component named $ARGUMENTS with TypeScript support.
- Include proper typing and basic structure.
- ```
- Run the command with arguments:
- ```bash frame="none"
- /component Button
- ```
- And `$ARGUMENTS` will be replaced with `Button`.
- You can also access individual arguments using positional parameters:
- - `$1` - First argument
- - `$2` - Second argument
- - `$3` - Third argument
- - And so on...
- For example:
- ```md title=".opencode/command/create-file.md"
- ---
- description: Create a new file with content
- ---
- Create a file named $1 in the directory $2
- with the following content: $3
- ```
- Run the command:
- ```bash frame="none"
- /create-file config.json src "{ \"key\": \"value\" }"
- ```
- This replaces:
- - `$1` with `config.json`
- - `$2` with `src`
- - `$3` with `{ "key": "value" }`
- ---
- ### Shell output
- Use _!`command`_ to inject [bash command](/docs/tui#bash-commands) output into your prompt.
- For example, to create a custom command that analyzes test coverage:
- ```md title=".opencode/command/analyze-coverage.md"
- ---
- description: Analyze test coverage
- ---
- Here are the current test results:
- !`npm test`
- Based on these results, suggest improvements to increase coverage.
- ```
- Or to review recent changes:
- ```md title=".opencode/command/review-changes.md"
- ---
- description: Review recent changes
- ---
- Recent git commits:
- !`git log --oneline -10`
- Review these changes and suggest any improvements.
- ```
- Commands run in your project's root directory and their output becomes part of the prompt.
- ---
- ### File references
- Include files in your command using `@` followed by the filename.
- ```md title=".opencode/command/review-component.md"
- ---
- description: Review component
- ---
- Review the component in @src/components/Button.tsx.
- Check for performance issues and suggest improvements.
- ```
- The file content gets included in the prompt automatically.
- ---
- ## Options
- Let's look at the configuration options in detail.
- ---
- ### Template
- The `template` option defines the prompt that will be sent to the LLM when the command is executed.
- ```json title="opencode.json"
- {
- "command": {
- "test": {
- "template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes."
- }
- }
- }
- ```
- This is a **required** config option.
- ---
- ### Description
- Use the `description` option to provide a brief description of what the command does.
- ```json title="opencode.json"
- {
- "command": {
- "test": {
- "description": "Run tests with coverage"
- }
- }
- }
- ```
- This is shown as the description in the TUI when you type in the command.
- ---
- ### Agent
- Use the `agent` config to optionally specify which [agent](/docs/agents) should execute this command.
- If this is a [subagent](/docs/agents/#subagents) the command will trigger a subagent invocation by default.
- To disable this behavior, set `subtask` to `false`.
- ```json title="opencode.json"
- {
- "command": {
- "review": {
- "agent": "plan"
- }
- }
- }
- ```
- This is an **optional** config option. If not specified, defaults to your current agent.
- ---
- ### Subtask
- Use the `subtask` boolean to force the command to trigger a [subagent](/docs/agents/#subagents) invocation.
- This useful if you want the command to not pollute your primary context and will **force** the agent to act as a subagent,
- even if `mode` is set to `primary` on the [agent](/docs/agents) configuration.
- ```json title="opencode.json"
- {
- "command": {
- "analyze": {
- "subtask": true
- }
- }
- }
- ```
- This is an **optional** config option.
- ---
- ### Model
- Use the `model` config to override the default model for this command.
- ```json title="opencode.json"
- {
- "command": {
- "analyze": {
- "model": "anthropic/claude-3-5-sonnet-20241022"
- }
- }
- }
- ```
- This is an **optional** config option.
- ---
- ## Built-in
- opencode includes several built-in commands like `/init`, `/undo`, `/redo`, `/share`, `/help`; [learn more](/docs/tui#commands).
- :::note
- Custom commands can override built-in commands.
- :::
- If you define a custom command with the same name, it will override the built-in command.
|