Your personal board of advisors — a local-first, role-based agent system for OpenCode.
Eureka gives you a team of AI specialists that live on your machine. One orchestrator (Ultima) routes your request to the right specialist — researcher, teacher, developer, designer, market strategist, finance, legal, and more — then validates and synthesizes the result. No embeddings, no external state, no cloud vendor lock-in for memory.
- Local-first: state lives in SQLite + Markdown on disk, not a vector database.
- Specialist model: 13 roles with distinct personalities, permissions, and contracts.
- Sequential execution: subagents spawn one at a time; no chaotic parallel loops.
- Contract-validated output: every subagent returns structured data validated against YAML schemas.
- Privacy by default: MCP servers are disabled until you explicitly approve them.
User
|
v
Ultima (orchestrator / gatekeeper)
|
+-- Minerva (research, web, documents)
+-- Chiron (teaching, explanation)
+-- Specialist
Atlas (architecture) Metis (product)
Vulcan (development) Hermes (market)
Aura (design) Juno (BD)
Fama (growth) Plutus (finance)
Dike (legal) Philia (community)
|
v
Validation -> Synthesis -> User
# Clone
git clone https://github.com/oxelmour/eureka.git
cd eureka
# Install with uv (recommended)
uv sync --extra dev
# Run tests
uv run pytest- Restart OpenCode in the repo directory so it discovers
.opencode/agents/and.opencode/skills/. - The default primary agent is Ultima. Ask anything; Ultima will decide whether to answer directly, research with Minerva, teach with Chiron, or invite a specialist.
Firecrawl gives Minerva high-quality web search, scraping, and crawling. It is disabled by default.
# Install globally (requires Node.js)
npm install -g firecrawl-mcp
# Create an API key at https://firecrawl.dev/app/api-keys
# Then set it as a user-level env var (Windows PowerShell)
[Environment]::SetEnvironmentVariable("FIRECRAWL_API_KEY", "fc-...", "User")Then enable it in opencode.json:
"mcp": {
"firecrawl": {
"enabled": true
}
}Restart OpenCode after changing the config.
| Role | Domain | Spawns When |
|---|---|---|
| Ultima | Orchestration | Always (primary) |
| Minerva | Research | You need facts, sources, or market intel |
| Chiron | Teaching | You want to understand, not just know |
| Atlas | Architecture | You design systems, databases, APIs |
| Vulcan | Development | You write, debug, or review code |
| Aura | Design | You need UX, accessibility, or visual direction |
| Metis | Product | You prioritize features or define roadmaps |
| Hermes | Market | You analyze competitors or pricing |
| Juno | Business Dev | You structure partnerships or deals |
| Fama | Growth | You need distribution, SEO, or viral mechanics |
| Plutus | Finance/Ops | You model unit economics or budgets |
| Dike | Legal | You review compliance or contracts |
| Philia | Community | You build community health or engagement |
.
├── .opencode/
│ ├── agents/ # OpenCode runtime definitions (13 agents)
│ └── skills/ # Local skill library (deep-research)
├── config/
│ ├── roles.yaml # Role registry & spawning policy
│ ├── limits.yaml # Approval rules & safety thresholds
│ └── mcp-candidates.yaml # Audited MCP catalog (disabled by default)
├── contracts/ # YAML schemas for subagent outputs
│ ├── default.yaml
│ ├── research.yaml
│ ├── teaching.yaml
│ └── specialist.yaml
├── memory/
│ ├── state.py # SQLite session & decision store
│ └── semantic/knowledge.md # Human-curated knowledge base
├── pipeline/
│ ├── routing.py # Keyword-based task routing logic
│ ├── validator.py # Contract validation engine
│ ├── aggregator.py # Sequential result synthesis
│ └── loaders.py # Role & contract file parser
├── roles/
│ ├── _core/ # Ultima, Minerva, Chiron
│ └── _specialist/ # 10 startup strategist role files
├── tests/ # pytest suite (11 tests)
├── skills/ # Skill registry & policy
├── tools/ # Shared file/search utilities
├── roles.md # Original role manifesto (reference)
├── opencode.json # OpenCode runtime configuration
└── pyproject.toml # Python project definition
- Least privilege: Every specialist runs with restricted file/system access.
- Approval-gated actions: Deletion, overwrites, public posts, pushes, and financial commitments require your explicit confirmation.
- No recursive spawning: Specialists cannot spawn other specialists; deep tasks return a handoff request to Ultima.
- MCP audit trail: Every MCP server is vetted in
config/mcp-candidates.yamland must be enabled manually.
# Run tests
uv run pytest
# Compile check
uv run python -m compileall -q memory pipeline tools tests
# Lock check
uv lock --check- Copy a template from
roles/_template.md(or copy any existing role file). - Update frontmatter:
name,domain,layer. - Write the prompt in English.
- Register it in
config/roles.yamlunder the right layer. - Create a runtime file in
.opencode/agents/<name>.mdpointing to the role file. - Run tests to verify consistency.
- Create
.opencode/skills/<skill-name>/SKILL.md. - Add an entry to
skills/registry.jsonwith source and status. - Reference it in the role's
skills.approvedlist if it should auto-load.
This is primarily a personal research project. Issues and PRs are welcome, but the architecture may evolve quickly.
MIT — do whatever you want, but don't blame me if your agents are too loud at 3 AM.
Built with a lot of coffee and an unusually high tolerance for YAML. "Eureka!" is what you say when Minerva finally finds the answer.