Files
AGENTS/skill/agent-development/SKILL.md
m3tm3re 924b3476f9 Rewrite agent-development skill for opencode
- Update SKILL.md with JSON-first approach (agents.json pattern)
- Add all opencode config options: mode, temperature, maxSteps, hidden, permission
- Document permissions system with granular rules and glob patterns
- Add references/opencode-agents-json-example.md with chiron pattern
- Rewrite triggering-examples.md for opencode (Tab, @mention, Task tool)
- Update agent-creation-system-prompt.md for JSON output format
- Rewrite complete-agent-examples.md with JSON examples
- Rewrite validate-agent.sh to support both JSON and Markdown validation
2026-01-19 19:35:55 +01:00

492 lines
11 KiB
Markdown

---
name: agent-development
description: "(opencode - Skill) Create and configure agents for Opencode. Use when: (1) creating a new agent, (2) adding agents to agents.json or opencode.json, (3) configuring agent permissions, (4) setting up primary vs subagent modes, (5) writing agent system prompts, (6) understanding agent triggering. Triggers: create agent, add agent, agents.json, subagent, primary agent, agent permissions, agent configuration, agent prompt."
compatibility: opencode
---
# Agent Development for Opencode
## Overview
Agents are specialized AI assistants configured for specific tasks and workflows. Opencode supports two agent types with different configuration formats.
### Agent Types
| Type | Description | Invocation |
|------|-------------|------------|
| **Primary** | Main assistants for direct interaction | Tab key to cycle, or configured keybind |
| **Subagent** | Specialized assistants for delegated tasks | Automatically by primary agents, or @ mention |
**Built-in agents:**
- `build` (primary) - Full development with all tools enabled
- `plan` (primary) - Analysis/planning with edit/bash requiring approval
- `general` (subagent) - Multi-step tasks with full tool access
- `explore` (subagent) - Fast, read-only codebase exploration
### Configuration Formats
Agents can be defined in two formats. Ask the user which format they prefer; default to **JSON** if no preference stated.
**Format 1: JSON** (recommended for central management)
- In `opencode.json` under the `agent` key
- Or standalone `agents.json` file
- Best for: version control, Nix flake consumption, central configuration
**Format 2: Markdown** (for quick addition)
- Global: `~/.config/opencode/agents/*.md`
- Per-project: `.opencode/agents/*.md`
- Best for: project-specific agents, quick prototyping
## JSON Agent Structure
### In opencode.json
```json
{
"$schema": "https://opencode.ai/config.json",
"agent": {
"agent-name": {
"description": "When to use this agent",
"mode": "primary",
"model": "provider/model-id",
"prompt": "{file:./prompts/agent-name.txt}",
"permission": { ... },
"tools": { ... }
}
}
}
```
### Standalone agents.json
```json
{
"agent-name": {
"description": "When to use this agent",
"mode": "subagent",
"model": "anthropic/claude-sonnet-4-20250514",
"prompt": "You are an expert...",
"tools": {
"write": false,
"edit": false
}
}
}
```
## Markdown Agent Structure
File: `~/.config/opencode/agents/agent-name.md` or `.opencode/agents/agent-name.md`
```markdown
---
description: When to use this agent
mode: subagent
model: anthropic/claude-sonnet-4-20250514
temperature: 0.1
tools:
write: false
edit: false
bash: false
permission:
bash:
"*": ask
"git diff": allow
---
You are an expert [role]...
**Your Core Responsibilities:**
1. [Responsibility 1]
2. [Responsibility 2]
```
The filename becomes the agent name (e.g., `review.md``review` agent).
## Configuration Options
### description (required)
Defines when Opencode should use this agent. Critical for subagent triggering.
```json
"description": "Reviews code for best practices and security issues"
```
### mode
Controls how the agent can be used.
| Value | Behavior |
|-------|----------|
| `primary` | Directly accessible via Tab cycling |
| `subagent` | Invoked by Task tool or @ mention |
| `all` | Both (default if omitted) |
```json
"mode": "primary"
```
### model
Override the model for this agent. Format: `provider/model-id`.
```json
"model": "anthropic/claude-sonnet-4-20250514"
```
If omitted: primary agents use globally configured model; subagents inherit from invoking primary agent.
### prompt
System prompt defining agent behavior. Can be inline or file reference.
**Inline:**
```json
"prompt": "You are an expert code reviewer..."
```
**File reference:**
```json
"prompt": "{file:./prompts/agent-name.txt}"
```
File paths are relative to the config file location.
### temperature
Control response randomness (0.0 - 1.0).
| Range | Use Case |
|-------|----------|
| 0.0-0.2 | Focused, deterministic (code analysis, planning) |
| 0.3-0.5 | Balanced (general development) |
| 0.6-1.0 | Creative (brainstorming) |
```json
"temperature": 0.1
```
### maxSteps
Limit agentic iterations before forcing text-only response.
```json
"maxSteps": 10
```
### tools
Control which tools are available. Boolean to enable/disable, or object for granular control.
**Disable specific tools:**
```json
"tools": {
"write": false,
"edit": false,
"bash": false
}
```
**Wildcard for MCP tools:**
```json
"tools": {
"mymcp_*": false
}
```
### hidden
Hide subagent from @ autocomplete menu. Agent can still be invoked via Task tool.
```json
"hidden": true
```
### disable
Disable the agent entirely.
```json
"disable": true
```
## Permissions System
Permissions control what actions require approval. Each rule resolves to:
- `"allow"` - Run without approval
- `"ask"` - Prompt for approval
- `"deny"` - Block the action
### Permission Types
| Permission | Matches Against |
|------------|-----------------|
| `read` | File path |
| `edit` | File path (covers edit, write, patch, multiedit) |
| `bash` | Parsed command |
| `task` | Subagent type |
| `external_directory` | Paths outside project |
| `doom_loop` | Repeated identical tool calls |
### Simple Permissions
```json
"permission": {
"edit": "ask",
"bash": "ask"
}
```
### Granular Permissions with Glob Patterns
Rules evaluated in order; **last matching rule wins**.
```json
"permission": {
"read": {
"*": "allow",
"*.env": "deny",
"*.env.*": "deny",
"*.env.example": "allow"
},
"bash": {
"*": "ask",
"git status*": "allow",
"git log*": "allow",
"git diff*": "allow",
"rm *": "ask",
"sudo *": "deny"
},
"edit": "allow",
"external_directory": "ask",
"doom_loop": "ask"
}
```
### Task Permissions (Subagent Control)
Control which subagents an agent can invoke via Task tool.
```json
"permission": {
"task": {
"*": "deny",
"code-reviewer": "allow",
"test-generator": "ask"
}
}
```
## Complete JSON Example
```json
{
"chiron": {
"description": "Personal AI assistant (Plan Mode). Read-only analysis and planning.",
"mode": "primary",
"model": "anthropic/claude-sonnet-4-20250514",
"prompt": "{file:./prompts/chiron.txt}",
"permission": {
"read": {
"*": "allow",
"*.env": "deny",
"*.env.*": "deny",
"*.env.example": "allow",
"*/.ssh/*": "deny",
"*credentials*": "deny"
},
"edit": "ask",
"bash": "ask",
"external_directory": "ask"
}
},
"chiron-forge": {
"description": "Personal AI assistant (Worker Mode). Full write access.",
"mode": "primary",
"model": "anthropic/claude-sonnet-4-20250514",
"prompt": "{file:./prompts/chiron-forge.txt}",
"permission": {
"read": {
"*": "allow",
"*.env": "deny"
},
"edit": "allow",
"bash": {
"*": "allow",
"rm *": "ask",
"git push *": "ask",
"sudo *": "deny"
}
}
},
"code-reviewer": {
"description": "Reviews code for quality, security, and best practices",
"mode": "subagent",
"model": "anthropic/claude-sonnet-4-20250514",
"temperature": 0.1,
"tools": {
"write": false,
"edit": false
},
"prompt": "You are an expert code reviewer..."
}
}
```
## System Prompt Design
Write prompts in second person, addressing the agent directly.
### Standard Structure
```
You are [role] specializing in [domain].
**Your Core Responsibilities:**
1. [Primary responsibility]
2. [Secondary responsibility]
3. [Additional responsibilities]
**Process:**
1. [Step one]
2. [Step two]
3. [Continue with clear steps]
**Quality Standards:**
- [Standard 1]
- [Standard 2]
**Output Format:**
[What to include and how to structure]
**Edge Cases:**
- [Edge case 1]: [How to handle]
- [Edge case 2]: [How to handle]
```
### Prompt File Convention
Store prompts in a `prompts/` directory with `.txt` extension:
- `prompts/agent-name.txt`
Reference in config:
```json
"prompt": "{file:./prompts/agent-name.txt}"
```
### Best Practices
**DO:**
- Use second person ("You are...", "You will...")
- Be specific about responsibilities
- Provide step-by-step processes
- Define output format
- Include quality standards
- Address edge cases
- Keep under 10,000 characters
**DON'T:**
- Write in first person
- Be vague or generic
- Omit process steps
- Leave output format undefined
## Creating Agents
### Method 1: Opencode CLI (Interactive)
```bash
opencode agent create
```
Prompts for: location, description, tools, then generates the agent file.
### Method 2: JSON Configuration
1. Add agent to `opencode.json` or `agents.json`
2. Create prompt file in `prompts/` directory
3. Validate with `scripts/validate-agent.sh`
### Method 3: Markdown File
1. Create `~/.config/opencode/agents/agent-name.md` or `.opencode/agents/agent-name.md`
2. Add frontmatter with configuration
3. Write system prompt as markdown body
## Validation
Validate agent configuration:
```bash
# Validate agents.json
./scripts/validate-agent.sh agents.json
# Validate markdown agent
./scripts/validate-agent.sh ~/.config/opencode/agents/review.md
```
## Testing
1. Reload opencode or start new session
2. For primary agents: use Tab to cycle
3. For subagents: use @ mention or let primary agent invoke via Task tool
4. Verify expected behavior and tool access
## Quick Reference
### JSON Agent Template
```json
{
"my-agent": {
"description": "What this agent does and when to use it",
"mode": "subagent",
"model": "anthropic/claude-sonnet-4-20250514",
"prompt": "{file:./prompts/my-agent.txt}",
"tools": {
"write": false,
"edit": false
}
}
}
```
### Markdown Agent Template
```markdown
---
description: What this agent does and when to use it
mode: subagent
model: anthropic/claude-sonnet-4-20250514
tools:
write: false
edit: false
---
You are an expert [role]...
```
### Configuration Options Summary
| Option | Required | Type | Default |
|--------|----------|------|---------|
| description | Yes | string | - |
| mode | No | primary/subagent/all | all |
| model | No | string | inherited |
| prompt | No | string | - |
| temperature | No | number | model default |
| maxSteps | No | number | unlimited |
| tools | No | object/boolean | all enabled |
| permission | No | object | allow |
| hidden | No | boolean | false |
| disable | No | boolean | false |
## Additional Resources
- **System prompt patterns**: See `references/system-prompt-design.md`
- **Triggering examples**: See `references/triggering-examples.md`
- **AI-assisted generation**: See `examples/agent-creation-prompt.md`
- **Complete examples**: See `examples/complete-agent-examples.md`
- **Real-world JSON example**: See `references/opencode-agents-json-example.md`