Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ If this project helps your workflow, please consider supporting ongoing maintena

## Agent roles (Tab menu)

This setup keeps `build` as the default agent for quick direct work, while adding `orchestrator` and focused specialists for manual selection via `Tab`:
This setup keeps `build` as the default agent for quick direct work, exposes only `build`, `plan`, and `orchestrator` in the `Tab` switcher, and keeps focused specialists available as hidden secondary subagents:

- `orchestrator` (primary): execution lead for complex tasks, with explicit delegation and completion gates.
- `explore` (subagent): read-only internal codebase scout.
Expand All @@ -94,7 +94,9 @@ This setup keeps `build` as the default agent for quick direct work, while addin
Default selection note:

- `build` remains the configured `default_agent` in `opencode.json` for speed.
- `plan` remains the built-in planning primary in OpenCode.
- choose `orchestrator` when you want end-to-end multi-step execution with delegation and completion gates.
- specialist subagents stay hidden from `Tab` and are meant for delegation or explicit `@agent` invocation.

Agent files live in `agent/*.md` and install globally to `~/.config/opencode/agent/`.
Agent source-of-truth specs live in `agent/specs/*.json` and generate markdown via `scripts/build_agents.py`.
Expand Down
1 change: 1 addition & 0 deletions agent/ambiguity-analyst.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ tools:
task: false
todowrite: false
todoread: false
hidden: true
routing:
cost_tier: cheap
default_category: deep
Expand Down
1 change: 1 addition & 0 deletions agent/explore.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ tools:
task: false
todowrite: false
todoread: false
hidden: true
routing:
cost_tier: free
default_category: quick
Expand Down
1 change: 1 addition & 0 deletions agent/librarian.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ tools:
task: false
todowrite: false
todoread: false
hidden: true
routing:
cost_tier: cheap
default_category: balanced
Expand Down
1 change: 1 addition & 0 deletions agent/oracle.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ tools:
task: false
todowrite: false
todoread: false
hidden: true
routing:
cost_tier: expensive
default_category: critical
Expand Down
1 change: 1 addition & 0 deletions agent/plan-critic.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ tools:
task: false
todowrite: false
todoread: false
hidden: true
routing:
cost_tier: expensive
default_category: critical
Expand Down
1 change: 1 addition & 0 deletions agent/release-scribe.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ tools:
task: false
todowrite: false
todoread: false
hidden: true
routing:
cost_tier: cheap
default_category: quick
Expand Down
1 change: 1 addition & 0 deletions agent/reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ tools:
task: false
todowrite: false
todoread: false
hidden: true
routing:
cost_tier: expensive
default_category: critical
Expand Down
3 changes: 2 additions & 1 deletion agent/specs/ambiguity-analyst.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
"task",
"todowrite",
"todoread"
]
],
"hidden": true
}
}
3 changes: 2 additions & 1 deletion agent/specs/explore.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
"task",
"todowrite",
"todoread"
]
],
"hidden": true
}
}
3 changes: 2 additions & 1 deletion agent/specs/librarian.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"task",
"todowrite",
"todoread"
]
],
"hidden": true
}
}
3 changes: 2 additions & 1 deletion agent/specs/oracle.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
"task",
"todowrite",
"todoread"
]
],
"hidden": true
}
}
3 changes: 2 additions & 1 deletion agent/specs/plan-critic.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
"task",
"todowrite",
"todoread"
]
],
"hidden": true
}
}
3 changes: 2 additions & 1 deletion agent/specs/release-scribe.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"task",
"todowrite",
"todoread"
]
],
"hidden": true
}
}
3 changes: 2 additions & 1 deletion agent/specs/reviewer.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
"task",
"todowrite",
"todoread"
]
],
"hidden": true
}
}
3 changes: 2 additions & 1 deletion agent/specs/strategic-planner.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
"task",
"todowrite",
"todoread"
]
],
"hidden": true
}
}
3 changes: 2 additions & 1 deletion agent/specs/verifier.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"task",
"todowrite",
"todoread"
]
],
"hidden": true
}
}
1 change: 1 addition & 0 deletions agent/strategic-planner.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ tools:
task: false
todowrite: false
todoread: false
hidden: true
routing:
cost_tier: cheap
default_category: deep
Expand Down
1 change: 1 addition & 0 deletions agent/verifier.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ tools:
task: false
todowrite: false
todoread: false
hidden: true
routing:
cost_tier: cheap
default_category: quick
Expand Down
4 changes: 3 additions & 1 deletion docs/agents-playbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,11 @@ Think of it as:
In OpenCode prompt:

1. Press `Tab`
2. Pick agent (`build`, `orchestrator`, etc.)
2. Pick agent (`build`, `plan`, or `orchestrator`)
3. Run your prompt normally

Our custom specialist subagents are intentionally marked hidden, so they stay out of the `Tab` switcher and are used through delegation or explicit `@agent` mention instead.

You can verify available agents with:

```bash
Expand Down
19 changes: 19 additions & 0 deletions opencode.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
{
"$schema": "https://opencode.ai/config.json",
"default_agent": "build",
"agent": {
"executor": {
"hidden": true
},
"planner": {
"hidden": true
},
"supervisor": {
"hidden": true
},
"oracle": {
"mode": "subagent",
"hidden": true
},
"reviewer": {
"mode": "subagent",
"hidden": true
}
},
"autoupdate": true,
"share": "manual",
"permission": {
Expand Down
38 changes: 30 additions & 8 deletions scripts/agent_doctor.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,20 +77,42 @@
"Use `reviewer` for final quality/safety pass",
"Anti-loop guard",
],
"explore.md": ["mode: subagent", "bash: false", "write: false", "edit: false"],
"explore.md": [
"mode: subagent",
"hidden: true",
"bash: false",
"write: false",
"edit: false",
],
"librarian.md": [
"mode: subagent",
"hidden: true",
"bash: false",
"write: false",
"edit: false",
],
"oracle.md": ["mode: subagent", "write: false", "edit: false"],
"verifier.md": ["mode: subagent", "write: false", "edit: false"],
"reviewer.md": ["mode: subagent", "write: false", "edit: false"],
"release-scribe.md": ["mode: subagent", "write: false", "edit: false"],
"strategic-planner.md": ["mode: subagent", "write: false", "edit: false"],
"ambiguity-analyst.md": ["mode: subagent", "write: false", "edit: false"],
"plan-critic.md": ["mode: subagent", "write: false", "edit: false"],
"oracle.md": ["mode: subagent", "hidden: true", "write: false", "edit: false"],
"verifier.md": ["mode: subagent", "hidden: true", "write: false", "edit: false"],
"reviewer.md": ["mode: subagent", "hidden: true", "write: false", "edit: false"],
"release-scribe.md": [
"mode: subagent",
"hidden: true",
"write: false",
"edit: false",
],
"strategic-planner.md": [
"mode: subagent",
"hidden: true",
"write: false",
"edit: false",
],
"ambiguity-analyst.md": [
"mode: subagent",
"hidden: true",
"write: false",
"edit: false",
],
"plan-critic.md": ["mode: subagent", "hidden: true", "write: false", "edit: false"],
}

REQUIRED_ORCHESTRATION_MARKERS: list[str] = [
Expand Down
7 changes: 7 additions & 0 deletions scripts/build_agents.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ def _validate_metadata(name: str, metadata: Any) -> dict[str, Any]:
if not isinstance(value, str) or not value.strip():
raise ValueError(f"{name}: metadata.{key} must be a non-empty string")
result[key] = value.strip()
hidden = metadata.get("hidden")
if hidden is not None:
if not isinstance(hidden, bool):
raise ValueError(f"{name}: metadata.hidden must be boolean")
result["hidden"] = hidden
for key in ("triggers", "avoid_when", "denied_tools"):
value = metadata.get(key)
if value is None:
Expand Down Expand Up @@ -138,6 +143,8 @@ def _render_agent(spec: dict[str, Any], profile: str) -> tuple[str, str]:
for tool_name, enabled in tools.items():
header_lines.append(f" {tool_name}: {'true' if enabled else 'false'}")
if metadata:
if isinstance(metadata.get("hidden"), bool):
header_lines.append(f"hidden: {'true' if metadata['hidden'] else 'false'}")
header_lines.append("routing:")
for key in ("cost_tier", "default_category", "fallback_policy"):
value = metadata.get(key)
Expand Down