Command Patterns Reference
Common patterns, creation workflow, and example commands for OpenCode slash commands.
Creation Workflow
Command creation is conversational, not transactional.
- MUST NOT assume what the user wants — ask
- SHOULD start simple, add complexity only if needed
- MUST show drafts and iterate based on feedback
Phase 1: Understand the Task
-
“What task do you want to automate?”
- Get the repetitive prompt/workflow
- Examples: “run tests”, “review this file”, “create a component”
-
“Can you show me how you’d normally ask for this?”
- Get the actual prompt they’d type
- This becomes the template body
Phase 2: Inputs & Routing
-
“Does it need arguments?”
- If they mention “this file”, “a name”, “the function” → yes
/command foo bar→$ARGUMENTS= “foo bar”,$1= “foo”,$2= “bar”
-
“Should it make changes or just analyze?”
- Changes → default agent (build)
- Analysis only → set
agent: plan
-
“Should it run as a background subtask?”
- Long-running or parallel work → set
subtask: true - Interactive or quick → leave unset
- Long-running or parallel work → set
-
“Project-specific or use everywhere?”
- Project →
.opencode/commands/ - Global →
~/.config/opencode/commands/
- Project →
Phase 3: Review & Refine
- Show the draft command, ask for feedback
- Iterate until user is satisfied
Be flexible: If user provides lots of info upfront, adapt — MUST NOT rigidly ask every question.
Command File Format
---
description: 3-word command summary
agent: build # Optional: build, plan, or custom agent
model: provider/model-id # Optional: override model
subtask: true # Optional: run as subagent
---
<summary>
Line 1: You MUST [purpose].
Line 2: You SHOULD [inputs].
Line 3: You MUST [outcome].
</summary>
<user_guidelines>
$ARGUMENTS
</user_guidelines>
Template body goes here.
Frontmatter Options
| Field | Purpose | Required |
|---|---|---|
description |
Shown in command list | Recommended |
agent |
Route to specific agent | No |
model |
Override model | No |
subtask |
Force subagent invocation | No |
Command Locations
| Scope | Path |
|---|---|
| Project | .opencode/commands/<name>.md |
| Global | ~/.config/opencode/commands/<name>.md |
Example Commands
/test — Run Tests and Fix Failures
---
description: Run tests and fix failures
---
<summary>
You MUST run the full test suite.
You SHOULD identify and fix failures.
You MUST re-verify fixes.
</summary>
<objective>
You MUST run the full test suite, find the root cause of any failures, and fix the issue.
</objective>
1. Show the failing test
2. Identify the root cause
3. Fix the issue
4. Re-run to verify
/review — Code Review (Read-Only)
---
description: Review code for issues
agent: plan
---
<summary>
You MUST review $ARGUMENTS for issues.
You SHOULD check for bugs, security, and performance.
You MUST provide actionable feedback.
</summary>
<target>
$ARGUMENTS
</target>
<objective>
You MUST review the file above for bugs, security, and performance issues and provide actionable feedback without making changes.
</objective>
/commit — Smart Commit with Conventional Prefix
---
description: Stage and commit with conventional prefix
---
<summary>
You MUST analyze changes and stage files.
You SHOULD choose a conventional commit prefix.
You MUST commit with a concise message.
</summary>
<context>
!`git status`
!`git diff`
</context>
<objective>
You MUST analyze changes, stage relevant files, and commit with a concise message.
</objective>
1. Analyze all changes
2. Choose appropriate prefix: docs:, feat:, fix:, refactor:, test:, ci:
3. Write concise commit message (imperative mood)
4. Stage relevant files and commit
/spellcheck — Check Spelling in Markdown
---
description: Check spelling in markdown files
subtask: true
---
<summary>
You MUST find unstaged markdown files.
You SHOULD check them for spelling errors.
You MUST report any found errors.
</summary>
<context>
!`git diff --name-only | grep -E '\.md$'`
</context>
<objective>
You MUST check for and report any spelling errors found in unstaged markdown files.
</objective>
/issues — Search GitHub Issues
---
description: Search GitHub issues
model: anthropic/claude-3-5-haiku-20241022
subtask: true
---
<summary>
You MUST search GitHub issues for $ARGUMENTS.
You SHOULD limit results to the top 10.
You MUST summarize the relevant issues.
</summary>
<context>
!`gh issue list --search "$ARGUMENTS" --limit 10`
</context>
<objective>
You MUST summarize the top 10 relevant GitHub issues found for $ARGUMENTS.
</objective>
/component — Create React Component
---
description: Create a new React component
---
<summary>
You MUST create a React component named $1.
You SHOULD include TypeScript props and basic styling.
You MUST provide a unit test file.
</summary>
<objective>
You MUST create a React component named $1 in $2 with TypeScript props interface, basic styling, and a unit test file.
</objective>
Usage: /component UserProfile src/components
/migrate — Database Migration
---
description: Generate database migration
---
<summary>
You MUST read the Prisma schema.
You SHOULD generate a migration for $ARGUMENTS.
You MUST ensure the migration matches the schema.
</summary>
<context>
@prisma/schema.prisma
</context>
<objective>
You MUST generate a Prisma migration for $ARGUMENTS that matches the provided schema.
</objective>
Shell Commands in Templates
Use the !cmd syntax to inject bash output:
Review recent changes:
!`git log --oneline -10`
Suggest improvements.
File References
Use @ to include file content:
Given the schema in @prisma/schema.prisma, generate a migration for $ARGUMENTS.
Pattern: Analysis Command (Read-Only)
Use agent: plan for commands that should never modify files.
---
description: Analyze code quality
agent: plan
---
<summary>
You MUST analyze $ARGUMENTS for code quality issues.
You SHOULD check for bugs, security issues, and anti-patterns.
You MUST provide a prioritized list of improvements.
</summary>
<target>
$ARGUMENTS
</target>
<objective>
Provide actionable feedback without making any changes.
</objective>
Pattern: Fire-and-Forget (Background Task)
Use subtask: true for tasks that run independently and produce a single output.
---
description: Generate test coverage report
subtask: true
model: anthropic/claude-3-5-haiku-20241022
---
<summary>
You MUST generate a test coverage report.
You SHOULD identify untested code paths.
You MUST output a markdown summary.
</summary>
<context>
!`npm run test -- --coverage --json 2>/dev/null | tail -100`
</context>
<objective>
Analyze coverage and produce a markdown report of untested paths.
</objective>
Pattern: Contextual Command (Dynamic Injection)
Use !cmd to inject live shell output and @file for file content.
---
description: Review recent changes
---
<summary>
You MUST review recent git changes.
You SHOULD identify potential issues or improvements.
You MUST provide actionable feedback.
</summary>
<context>
!`git log --oneline -10`
!`git diff HEAD~5`
</context>
<objective>
Review the changes above and provide specific, actionable feedback.
</objective>
Pattern: Multi-Argument Command
Use $1, $2 when two distinct pieces of information are needed.
---
description: Migrate component to new pattern
---
<summary>
You MUST migrate $1 from $2 pattern to the new pattern.
You SHOULD preserve existing behavior.
You MUST run tests after migration.
</summary>
<target>
Component: $1
From pattern: $2
</target>
<objective>
Perform the migration and verify tests still pass.
</objective>
Usage: /migrate UserCard class-component
Pattern: Scope-Limited Command
Use @file references to constrain context to relevant files.
---
description: Generate API client from schema
---
<summary>
You MUST generate a TypeScript API client.
You SHOULD follow patterns in existing client code.
You MUST export typed functions for each endpoint.
</summary>
<schema>
@openapi.yaml
</schema>
<existing_client>
@src/api/client.ts
</existing_client>
<objective>
Generate TypeScript functions for each endpoint following existing patterns.
</objective>
Decision Guide: Which Pattern to Use
| Requirement | Pattern | Key Setting |
|---|---|---|
| Read-only analysis | Analysis | agent: plan |
| Background processing | Fire-and-forget | subtask: true |
| Needs live data | Contextual | !cmd injection |
| Two input variables | Multi-argument | $1, $2 |
| Schema or config driven | Scope-limited | @file reference |
| Default (interactive) | None | Omit all flags |
Naming Conventions
| Command Name | Convention | Example |
|---|---|---|
File → /filename |
Kebab-case | code-review.md → /code-review |
| Short action verbs | Prefer imperative | /test, /review, /deploy |
| Qualified actions | Noun-verb | /db-migrate, /api-generate |
Best Practices Summary
- Single responsibility — One command does one thing
- Use XML blocks — Separate objectives, context, and user input
- Inject, don’t hardcode —
!cmdfor dynamic data,@filefor configs - Match agent to purpose —
planfor analysis, default for changes - Start with
$ARGUMENTS— Only use$1/$2when order matters