You already use Plan and Build. You probably review your changes too.
YACAO just connects the dots, so you don't have to.
What is YACAO? · Why YACAO? · How it works · Install · Configuration · Development · License
YACAO is a truly minimal agent workflow for OpenCode and Claude Code: just 2 agents and 3 skills to handle all planning, building, and reviewing.
The main orchestrator agent handles code exploration, implementation planning, and review. Each workflow phase has specific guidance defined as skills, loaded on demand. Implementation is delegated to the builder agent.
The goal is to streamline the natural coding-agent workflow, with little to no learning curve. There is no need to learn and memorize a bunch of commands, fancily named agents and skills. Work the same way you already do, without manually switching between planning and implementation.
YACAO is intended for small, incremental tasks built through iterative processes rather than single-shot solutions, although it can handle those too. It is not necessarily better, cheaper, or more effective than your host's native workflow; it is simply more practical.
Most "slim" or "minimal" multi-agent frameworks still feel too bloated for my taste, packed with too many agents and commands and skills and whatever. So I decided to build my own version, and it has been working well for my use case so far.
I used to discuss ideas with the built-in Plan Agent, plan solutions, then manually switch to the Build Agent to implement it, and then ask the Plan Agent to review the output, which often led to further adjustments.
With YACAO, the workflow is fundamentally the same but feels much more natural: the orchestrator kicks off implementation once the idea is solid, reviews the result upon completion, and automatically instructs the builder to fix issues if needed.
TL;DR: the orchestrator receives your prompt. Questions and discussions are answered directly after exploring if needed. For change requests, the orchestrator asks clarifying questions until the goal is well defined, then:
- small changes go straight to the builder and back for review;
- larger changes get a written plan you approve first, then the builder implements it, with review and fixes until it's right.
- by default the approved work stays uncommitted; you can ask for a commit after each approved task, or for a single commit at the end;
- each task is still reviewed before the next one starts, and a task that needs fixes gets at most two adjustment rounds before it comes back to you.
The three skills - planning, implementation and review - own the detailed mechanics behind this behavior.
Requires OpenCode 1.18.29 or newer.
Add the plugin to your opencode.jsonc:
To be notified when a new release is available, enable the autoUpdate option:
{
"plugin": [
[
"yacao@git+https://github.com/augustoolucas/yacao.git",
{
"autoUpdate": true
}
]
]
}Then restart OpenCode.
Add the plugin:
{
"plugins": ["yacao@git+https://github.com/augustoolucas/yacao.git"],
"default_agent": "orchestrator"
}Then restart OpenCode.
OpenCode caches the installed plugin, so a plain restart alone re-fetches nothing.
On V1 the spec string is the cache key:
- with a pinned spec, point the tag at the new release;
- with an unpinned spec, remove only YACAO's cached package under
~/.cache/opencode/packages/and restart - never clear the whole plugin cache.
On V2 use the native command:
opencode plugin update <configured-target>Omit the target to update all outdated plugins.
This is the configured behavior from the installed CLI help and the versioned source; it has not been exercised end to end here.
integrations/claude-code/ ships an experimental Claude Code adapter generated from the same canonical sources: two agents (yacao:orchestrator, yacao:builder), three skills and a guard hook.
Load the committed bundle from an unrelated disposable project (no build step; Node.js 22 or newer is required for the guard hook):
claude --plugin-dir /absolute/path/to/yacao/integrations/claude-code --agent yacao:orchestratorAvailable from v0.6.0 through the Git marketplace: add the release tag with /plugin marketplace add augustoolucas/yacao#v0.6.1, then /plugin install yacao@yacao. Full guide and install options: docs/claude-code.md.
On OpenCode V1 YACAO sets orchestrator as the default agent automatically if no default_agent is already set.
On OpenCode V2 you need to set "default_agent": "orchestrator".
Builder inherits the model set for the Orchestrator.
On V1, to set a different model, or override any other agent option, add it to opencode.jsonc:
{
"agent": {
"builder": {
"model": "your-provider/your-model"
}
}
}On V2, use the agents key:
{
"agents": {
"builder": {
"model": "your-provider/your-model"
}
}
}The builder can dispatch OpenCode's explore subagent to parallelize searches inside a task.
OpenCode limits subagent nesting to one level by default, so raise it:
On V1, add to opencode.jsonc:
{
"subagent_depth": 2
}On V2, the key lives under experimental:
{
"experimental": {
"subagent_depth": 2
}
}Without this, the builder's spawn attempts fail with a subagent depth limit error.
Permissions are guardrails against honest mistakes, not a sandbox: shell access can bypass most of them by design.
YACAO's agents define their own permission guardrails. Your opencode.jsonc entries are applied as well; on V2 they take precedence, so avoid broad global allows (such as edit: allow) if you rely on YACAO's guardrails. To loosen one of their rules, override it per agent: agent.<name>.permission on V1, agents.<name>.permissions on V2.
These rules are limits of what the tools guard, not content isolation: the plan-read rule restricts the read tool, not what an agent can reach through shell; explore may still use shell; and the Git guards cover the common commands, not every possible commit-producing operation. Plain stash reads are allowed while prefixed forms ask, and a later user configuration can change the agent mode.
autoUpdate(defaults tofalse): on startup, checks the latest release and shows a notification when a newer version exists. It never edits your configuration.
See the Claude Code guide for model selection and host-specific permissions.
I personally use YACAO daily, so I am constantly fine tuning and adjusting it.
Contributions are very welcome.
MIT - see LICENSE
{ "plugin": ["yacao@git+https://github.com/augustoolucas/yacao.git"] }