skills/ian-pascoe/dotfiles/writing-agents

writing-agents

SKILL.md

Writing Agents

Overview

Agents are specialized AI assistants with custom prompts, models, and tool access. Configure via markdown files or JSON.

When to Use

  • Creating a new agent for specific tasks
  • Editing agent prompts, permissions, or tool access
  • Choosing between primary vs subagent mode
  • Setting up task permissions for orchestration
  • Reviewing agent configuration quality

Don't use for: skill files (use writing-skills), system prompts without agent context, or MCP server config.

File Locations

~/.config/opencode/agent/<name>.md     # Global agents
.opencode/agent/<name>.md              # Project-local agents
opencode.json → agent.<name>           # JSON config (either location)

Filename becomes agent name (e.g., review.mdreview agent).

Frontmatter Reference

Field Required Values Notes
description Yes string Brief description for agent selection
mode No primary, subagent, all Default: all
model No provider/model-id Inherits from parent if unset
temperature No 0.0-1.0 0.0-0.2 focused, 0.6-1.0 creative
maxSteps No integer Limit agentic iterations
hidden No boolean Hide from @ autocomplete (subagents only)
disable No boolean Disable the agent
tools No object Enable/disable specific tools
permission No object Configure ask/allow/deny per tool

Mode Selection

Mode Use Case
primary Main agents user switches between (Tab key)
subagent Invoked by primary agents or via @ mention
all Available in both contexts (default)

Tool Configuration

tools:
  write: false # Disable write tool
  edit: false # Disable edit tool
  bash: false # Disable bash tool
  mymcp_*: false # Wildcards for MCP tools

Permission Configuration

permission:
  edit: deny # deny | ask | allow
  bash:
    "*": ask # Default for all commands
    "git status": allow # Specific command override
    "git push*": ask # Glob patterns supported
  webfetch: deny
  task:
    "*": deny # Block all subagent invocation
    "my-helper-*": allow # Allow specific subagents

Rule evaluation: Last matching rule wins. Put * first, specifics after.

Markdown Template

---
description: <what it does and when to use>
mode: subagent
model: anthropic/claude-sonnet-4-20250514
temperature: 0.1
tools:
  write: false
  edit: false
  bash: false
permission:
  edit: deny
---

<system prompt content>

Focus on:

- Point 1
- Point 2

JSON Template

{
  "agent": {
    "my-agent": {
      "description": "What it does",
      "mode": "subagent",
      "model": "anthropic/claude-sonnet-4-20250514",
      "prompt": "{file:./prompts/my-agent.txt}",
      "tools": {
        "write": false,
        "edit": false
      },
      "permission": {
        "bash": {
          "*": "ask",
          "git diff": "allow"
        }
      }
    }
  }
}

Common Patterns

Read-Only Reviewer

tools:
  write: false
  edit: false
  bash: false

Restricted Bash Access

permission:
  bash:
    "*": ask
    "git status": allow
    "git log*": allow
    "git diff*": allow

Orchestrator with Task Limits

permission:
  task:
    "*": deny
    "my-workers-*": allow

Common Mistakes

Mistake Fix
Missing description Always provide clear description
Using hidden on primary agent hidden only works on subagents
Expecting * to be evaluated last Last rule wins - put * first
Setting model on subagent Subagents inherit parent model if unset
Narrative prompt style Focus on role and constraints, not conversation

Validation Checklist

  • Description clearly states purpose and trigger conditions
  • Mode matches intended usage (primary vs subagent)
  • Tools restricted appropriately for the role
  • Permissions use correct ask/allow/deny values
  • Bash permission rules ordered correctly (* first)
  • Prompt focuses on role, constraints, and focus areas
Weekly Installs
2
GitHub Stars
1
First Seen
Jan 24, 2026
Installed on
opencode2
claude-code2
windsurf1
codex1
antigravity1
gemini-cli1