Public, versioned OpenCode configuration for a multi-agent coding workflow: global agents, reusable skills, review guardrails, and a per-repo GitHub Issues bundle template. Clone it on any machine, run the installer, and your OpenCode setup is ready.
.
├── opencode.json # Main config: model, providers, MCP servers, permissions
├── AGENTS.md # Opinionated global rules loaded into every agent
├── package.json # OpenCode plugin dependencies
├── agents/ # Custom agents
│ ├── architect.md # Primary orchestrator (GitHub-Issues-aware + ad-hoc) — Opus 4.8 max
│ ├── coder.md # Primary fast-path agent for trivial changes — Opus 4.8 max
│ ├── exec.md # Subagent: implementer driven by pipeline-execution — GPT-5.5
│ ├── reviewer.md # Subagent: review-fix loop owner + PR opener — Opus 4.8 medium
│ ├── fixer.md # Subagent: applies blocker deltas from reviewer — GPT-5.5
│ └── reviewer-*.md # Four read-only swarm reviewers
├── skills/ # Global skills; also installable per repo with `bunx skills add ... --all`
│ ├── pipeline-execution/ # Generic exec → reviewer → fixer → PR pipeline (tracker-agnostic)
│ └── swarm-review/ # Multi-model parallel code review (used by `coder` fast path)
├── templates/
│ └── github-issues-skill/ # GitHub Issues bundle template — installed PER REPO via `bun run install-issues-bundle`
├── scripts/
│ └── cli.ts # Bun CLI: `setup`, `cleanup`, `install-skills`, `install-issues-bundle`
├── .opencode/
│ ├── plugins/ # Global OpenCode plugins symlinked into ~/.config/opencode/plugins/
│ │ └── review-guardrails.ts # Publish gate: blocks `git push` / `gh pr create` until review-state authorizes
│ └── tools/ # Global OpenCode tools symlinked into ~/.config/opencode/tools/
│ └── review-state.ts # Custom tool owning review-fix loop state (consumed by `agents/reviewer.md`)
└── .gitignore
curl -fsSL https://opencode.ai/install | bashgit clone https://github.com/cgaravitoq/my-opencode.git ~/code/my-opencode
cd ~/code/my-opencodebun run setupThis symlinks every file in this repo into ~/.config/opencode/. Existing files are backed up to <name>.backup before being replaced. Re-run any time you add new agents or skills to the repo (existing symlinks resolve through git pull automatically; only new files need re-linking).
The reviewer subagents use models from OpenCode Go ($10/month). Subscribe and connect:
opencode
# in the TUI:
/connect
# select OpenCode Go and paste the API keyopencode
# in the TUI:
/agents # should list: architect, coder, exec, reviewer, fixer, reviewer-arch, reviewer-reasoning, reviewer-e2e, reviewer-quick
/models # should include anthropic/claude-opus-4-8, anthropic/claude-sonnet-4-6, openai/gpt-5.5, opencode-go/deepseek-v4-pro, opencode-go/deepseek-v4-flashUse this when OpenCode is already configured globally and you only want this repo's reusable skills in the project you're currently in:
cd /path/to/target-repo
bunx skills add cgaravitoq/my-opencode --allThat installs pipeline-execution and swarm-review into .agents/skills/ and writes skills-lock.json. It does not install global agents, plugins, or tools; run bun run setup from this repo once for those.
From a local checkout of this repo, the equivalent target-repo installer is:
bun run install-skills /path/to/target-repoGlobal layer (lives in ~/.config/opencode/, symlinked from this repo):
- 5 + 4 agents (primaries + swarm).
- 2 skills:
pipeline-execution(the code-shipping pipeline) andswarm-review(used by thecoderfast path).
Per-repo skills layer (lives in each repo's .agents/skills/):
- Installed from the public repo with
bunx skills add cgaravitoq/my-opencode --all. - Adds the reusable skills to that repo without touching global OpenCode config.
Per-repo GitHub Issues layer (lives in each repo's .agents/skills/github-issues/):
- One GitHub Issues bundle per repo. Defines that repo's status-label flow, sub-skills, and shaping rules.
- Installed once per repo via
bun run install-issues-bundle /path/to/repo. After install, you customize it for your label conventions. - The architect auto-detects the bundle and uses it for issue-mode requests in that repo. No bundle = ad-hoc only.
Two primary agents — switch with Tab in the TUI:
architect— orchestrator. Auto-detects the per-repo GitHub Issues bundle if present, falls back to ad-hoc otherwise. All code work goes through the globalpipeline-executionskill.coder— fast path for trivial changes (one-line fixes, renames, doc tweaks). Optionally delegates to thereviewer-*swarm via theswarm-reviewskill.
The pipeline subagents are invoked by pipeline-execution (not the architect directly):
exec— implementer. Commits one task per call to the parent branch.reviewer— review-fix loop owner. Invokes swarm + fixer, runs final verify gate, opens the draft PR.fixer— applies blocker deltas. Surgical only.
| Agent | Mode | Model | Lab | Specialty |
|---|---|---|---|---|
architect |
primary | Claude Opus 4.8 (max) | Anthropic | Orchestrator. Per-repo GitHub Issues bundle aware. |
coder |
primary | Claude Sonnet 4.6 (medium) | Anthropic | Fast-path coder for trivial changes. |
exec |
subagent | GPT-5.5 (low) | OpenAI | Implementer (invoked via pipeline-execution). |
reviewer |
subagent | Claude Opus 4.8 (medium) | Anthropic | Review-fix loop owner + PR opener. |
fixer |
subagent | GPT-5.5 (medium) | OpenAI | Applies blocker deltas from reviewer. |
reviewer-quick |
subagent | DeepSeek V4 Flash | DeepSeek | Fast first-pass: typos, copy-paste errors. |
reviewer-arch |
subagent | DeepSeek V4 Pro | DeepSeek | Architecture, design patterns, abstractions. |
reviewer-reasoning |
subagent | DeepSeek V4 Pro | DeepSeek | Logic correctness, edge cases, error paths. |
reviewer-e2e |
subagent | DeepSeek V4 Pro (1M ctx) | DeepSeek | Cross-file impact, integration, breaking changes. |
The single shared implementation pipeline. Tracker-agnostic. Used by the architect (ad-hoc) and by per-repo GitHub Issues bundles (when their *-to-execution step needs to ship code).
pipeline-execution (skill)
├─ task → exec (GPT-5.5) implement task on parent branch
└─ task → reviewer (Opus 4.8 medium)
├─ task → reviewer-* (swarm, parallel) audit
├─ task → fixer (GPT-5.5) ← loop ≤3
└─ push parent branch
└─ open draft PR with `hitl` | `hitl-blocked` label
Diversity by design: planner (Anthropic Opus), executor (OpenAI GPT-5.5), reviewer orchestrator (Anthropic Opus) + a DeepSeek swarm (V4 Flash for fast smoke checks, V4 Pro for architecture, deep reasoning, and 1M-context cross-file review). Three labs (Anthropic, OpenAI, DeepSeek) avoid shared blind spots while keeping costs low.
The loop above is enforced by two global files symlinked into ~/.config/opencode/ by the installer. .opencode/plugins/review-guardrails.ts intercepts git push and gh pr create and blocks them until the branch has been authorized — that's why pushes can error with publish gated by review-state for branch <name>. Authorization lives in .opencode/tools/review-state.ts, the custom tool the reviewer agent uses to track the review-fix loop and mark a branch ready to publish (see agents/reviewer.md "Loop State (hard gate)"). The loop budget (3 fixer passes + swarm cap) is per review cycle; re-reviewing the same branch after a published cycle starts a fresh budget automatically and archives the prior cycle in cycles[], so manually deleting state is rarely needed for a normal re-review. Add your own plugins or tools by dropping .ts/.js files into these directories and re-running bun run setup.
OpenCode does not expose an agent-level knob that shrinks or expands a model's usable context window. For built-in providers, OpenCode loads model limits from Models.dev automatically. For custom providers or custom model entries, configure provider.<id>.models.<model>.limit.context and limit.output so OpenCode knows the model's real capacity.
Use compaction for session behavior around that capacity:
{
"$schema": "https://opencode.ai/config.json",
"compaction": {
"auto": true,
"prune": true,
"reserved": 10000
}
}reserved leaves a token buffer before compaction. It does not increase the model's actual context window.
Each repo that wants GitHub Issues integration installs its own bundle in .agents/skills/github-issues/:
# from this template repo
bun run install-issues-bundle /path/to/your/repo
# or from anywhere, pointing at the target
bun --cwd /path/to/template run install-issues-bundle /path/to/your/repoDefault template (under templates/github-issues-skill/) ships with an opinionated flow, encoded as status:* labels:
status:idea → status:draft → status:prd → status:running → status:hitl → status:ready
Exactly one status:* label is active per issue at any time. Transitions are always atomic: gh issue edit <N> --remove-label status:A --add-label status:B.
Sub-skills:
idea-to-issue/— capture a raw idea (single issue or parent issue + initial drafts via tasklist).project-to-draft/— split an existing parent issue intostatus:draftchild slices.draft-to-prd/— three-phase guided interview to promote a draft to PRD.prd-to-execution/— GitHub Issues bookkeeping for executing a PRD. Code work is delegated topipeline-execution.
After install, edit:
<repo>/.agents/skills/github-issues/SKILL.md— changestatus:*label names if you prefer different conventions (e.g.status:prd→status:spec-ready,status:hitl→status:in-review).- Sub-skill bodies — adjust shaping rules (e.g. always-parent-issue vs single-issue intake, more or fewer interview phases, etc.).
- Seed the labels in the repo (see
references/status-mapping.md"Seeding labels" — short bash loop usinggh label create).
Different repos can have completely different label flows. The architect doesn't care — it reads each repo's bundle and adapts.
Trigger phrases for issue mode (Spanish or English):
- "tengo una idea" / "I have an idea"
- "captura esto" / "capture this"
- "trabajemos en #42" / "let's work on #42"
- "abordemos esta issue" / "execute owner/repo#42"
- "promote to PRD"
The architect routes by current status:* label as defined in the active repo's bundle, not by the verb you used.
Fallback path for the coder fast path. The full pipeline does not use this skill — pipeline-execution's reviewer agent owns swarm orchestration directly.
Trigger phrases when invoked from coder:
- "audita el código" / "audit my code"
- "revisa mi implementación" / "review this"
- "second opinion"
- "qué se me escapó"
- "lanza el swarm"
Picks a subset of reviewers based on change size, runs them in parallel, consolidates findings into a prioritized summary.
Background subagents must be enabled for real wall-clock parallelism:
export OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true
export OPENCODE_REVIEW_SWARM_CAP=32The swarm cap is a guardrail against runaway reviewer loops. 32 supports four full PR swarms (4 PRs × 4 reviewers) plus follow-up quick checks.
If the review-guardrails plugin blocks a git push / gh pr create due to corrupted or stale loop state (e.g. an interrupted process that left review-state mid-write), set OPENCODE_REVIEW_BYPASS=1 for the current process to skip the publish gate entirely:
OPENCODE_REVIEW_BYPASS=1 git pushUse it only as an escape hatch — bypassing the gate also disables the swarm-budget cap, so a runaway reviewer loop can keep spawning subagents past OPENCODE_REVIEW_SWARM_CAP. Prefer inspecting or deleting the offending state file first: $XDG_STATE_HOME/opencode/review-state/<repo-hash>/<branch>.json (defaults to ~/.local/state/opencode/review-state/...); manual reset is now mostly for corrupted or stale state because normal new cycles reset themselves on start after publish.
The canonical opencode.json ships with only the MCP server used by the agents and skills in this template: sequential-thinking. GitHub Issues integration goes through the gh CLI directly — no MCP required.
Drop any of these into opencode.json under "mcp" if you want them. None are required by the template.
- cloudflare — Cloudflare Workers / DNS / KV management. Remote server, no install:
{ "type": "remote", "url": "https://mcp.cloudflare.com/mcp" }. - tavily — web search and content extraction. Remote server, requires a Tavily API key in the auth flow:
{ "type": "remote", "url": "https://mcp.tavily.com/mcp/" }. - vercel — Vercel projects, deployments, env vars. Remote server, no install:
{ "type": "remote", "url": "https://mcp.vercel.com" }. - btca — local MCP for users who have the
btcaCLI installed:{ "type": "local", "command": ["bun", "x", "btca", "mcp"] }.
The architect adapts to whatever repo you're in:
- Repo with
.agents/skills/github-issues/— architect loads that bundle and routes issue-mode requests through it. Each repo can have its own label names and flow (e.g.status:prdvsstatus:spec-ready, 6-state vs 11-state flow). - Repo without a bundle — only ad-hoc mode is available. Architect asks if you want to install one (
bun run install-issues-bundle <repo>) or proceed without issue tracking. - Trivial change — invoke
coderdirectly. Skips the pipeline.
Code work always goes through the global pipeline-execution skill — same exec → reviewer → fixer → PR everywhere. The per-repo bundle only handles GitHub Issues bookkeeping.
To install the GitHub Issues bundle in a new repo:
# from the template repo, pointing at the target
bun --cwd ~/code/my-opencode run install-issues-bundle /path/to/repo
# from inside the template repo, defaults to $(pwd)
bun run install-issues-bundle /path/to/repo
# overwrite an existing bundle (auto-backed-up)
bun run install-issues-bundle /path/to/repo --forceAfter install, edit <repo>/.agents/skills/github-issues/SKILL.md and the sub-skills to match your label conventions. Seed the labels with gh label create (see references/status-mapping.md in the bundle). Commit the bundle to the repo so the rest of the team (and your other machines) get the same setup.
Edit files in this repo (not in ~/.config/opencode/ — those are symlinks). Commit and push. On other machines, git pull and changes apply immediately (symlinks resolve to the repo).
If you ever pull a version of this repo that removed a globally-symlinked file, the old symlink becomes a dangling pointer. Re-run bun run cleanup && bun run setup once to refresh.
bun run cleanupRemoves only the symlinks pointing into this repo; restores .backup files if they exist.
- Never commit secrets.
ghCLI uses its own keyring-backed token (gh auth login) — no.envfile or{env:VAR_NAME}references are required for anything shipped here. Remote MCPs added later (e.g.vercel,cloudflare) authenticate through OpenCode's/connectOAuth flow. - The
.gitignoreexcludes.envand*.backupso future env-var-backed integrations stay out of git. - Rotate any token that ever ended up in a commit, even after deleting it — git history keeps everything.