{"id":50697962,"url":"https://github.com/hacklabr/opencode-mesa","last_synced_at":"2026-06-09T07:35:34.124Z","repository":{"id":361444564,"uuid":"1254472765","full_name":"hacklabr/opencode-mesa","owner":"hacklabr","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-30T18:09:31.000Z","size":1256,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-30T18:11:38.922Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hacklabr.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-30T15:57:38.000Z","updated_at":"2026-05-30T18:09:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hacklabr/opencode-mesa","commit_stats":null,"previous_names":["hacklabr/opencode-mesa"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/hacklabr/opencode-mesa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hacklabr%2Fopencode-mesa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hacklabr%2Fopencode-mesa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hacklabr%2Fopencode-mesa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hacklabr%2Fopencode-mesa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hacklabr","download_url":"https://codeload.github.com/hacklabr/opencode-mesa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hacklabr%2Fopencode-mesa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34096952,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-09T07:35:33.533Z","updated_at":"2026-06-09T07:35:34.114Z","avatar_url":"https://github.com/hacklabr.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Mesa\n\n\u003e Structured AI specialist discussions for OpenCode — produce high-quality specifications through multi-agent analysis, debate, and consensus.\n\n![Version](https://img.shields.io/badge/version-2.2.0-blue)\n![License](https://img.shields.io/badge/license-MIT-green)\n![Bun](https://img.shields.io/badge/runtime-Bun-f9f1e0)\n\n## Why This Exists\n\nSingle-agent AI coding has a fundamental limitation: there's no peer review, no debate, no structured analysis. When one AI produces a specification, there's nobody to challenge assumptions, spot blind spots, or push back on weak ideas. The result is often a shallow, one-perspective document that looks complete but falls apart under scrutiny.\n\nMesa fixes this by orchestrating multiple AI specialists — each with distinct domain expertise — who analyze your project from different angles, debate their findings, and reach consensus before producing a specification. A backend architect sees things a security specialist misses; a product manager catches gaps an engineer overlooks.\n\nThink of Mesa as a **round table** for AI agents: you bring the problem, Mesa assembles the right experts, and the structured workflow ensures every voice is heard before anything gets written down.\n\n## How It Works\n\n```mermaid\nflowchart TD\n    Start([User types /agent briefing-writer]) --\u003e Discovery\n\n    subgraph \"Phase 1: Briefing\"\n        Discovery[Briefing Writer\\nStructured discovery interview] --\u003e Draft[Draft briefing document]\n        Draft --\u003e Review{User reviews\\nbriefing}\n        Review --\u003e|Changes needed| Discovery\n        Review --\u003e|Approved| Approve[approve_briefing]\n        Approve --\u003e Deliver[deliver_briefing]\n    end\n\n    Deliver --\u003e Planning\n\n    subgraph \"Phase 2: Planning\"\n        Planning[Manager analyzes briefing\\nanalyze_briefing] --\u003e Browse[list_specialists\\nbrowse catalog]\n        Browse --\u003e Propose[propose_team\\nwith justifications]\n        Propose --\u003e TeamReview{User reviews\\nteam proposal}\n        TeamReview --\u003e|Changes needed| Browse\n        TeamReview --\u003e|Approved| Summon[summon_team]\n        Summon --\u003e Phases[define_phases]\n    end\n\n    Phases --\u003e Analysis\n\n    subgraph \"Phase 3: Analysis\"\n        Analysis[open_analysis_round] --\u003e Loop{For each specialist\\neach turn}\n        Loop --\u003e Task[Manager invokes specialist\\nvia task tool]\n        Task --\u003e Register[register_analysis]\n        Register --\u003e Loop\n        Loop --\u003e|All turns done| Consensus\n    end\n\n    subgraph \"Phase 4: Consensus\"\n        Consensus[request_consensus\\nSpecialists vote] --\u003e VoteResult{Result}\n        VoteResult --\u003e|All AGREE| Spec\n        VoteResult --\u003e|DISAGREE| Debate[Debate round\\nre-analyze]\n        Debate --\u003e Consensus\n    end\n\n    subgraph \"Phase 5: Specification\"\n        Spec[generate_specification] --\u003e SpecReview{User reviews\\nspecification}\n        SpecReview --\u003e|Rejected| Revision[Return for revision]\n        Revision --\u003e Spec\n        SpecReview --\u003e|Approved| ApproveSpec[approve_specification]\n    end\n\n    ApproveSpec --\u003e Execution\n\n    subgraph \"Phase 6: Execution\"\n        Execution[delegate_task\\nfor each task] --\u003e Impl[Manager invokes specialist\\nvia task tool]\n        Impl --\u003e More{More tasks?}\n        More --\u003e|Yes| Execution\n        More --\u003e|No| Done([Done ✅])\n    end\n\n    style Start fill:#4CAF50,color:#fff\n    style Done fill:#4CAF50,color:#fff\n    style Discovery fill:#2196F3,color:#fff\n    style Planning fill:#FF9800,color:#fff\n    style Analysis fill:#9C27B0,color:#fff\n    style Consensus fill:#F44336,color:#fff\n    style Spec fill:#00BCD4,color:#fff\n    style Execution fill:#795548,color:#fff\n```\n\nThe workflow has six phases:\n\n1. **Briefing** — The Briefing Writer agent conducts a structured discovery interview with you, drafts a briefing document, and waits for your approval.\n2. **Planning** — The Manager agent analyzes your briefing, browses the specialist catalog, proposes a team with justifications, and waits for your approval.\n3. **Analysis** — Each specialist analyzes the briefing from their unique perspective, across multiple turns. Analyses are registered and accumulated.\n4. **Consensus** — Specialists vote on the combined analysis (AGREE / AGREE_WITH_RESERVATIONS / DISAGREE). If disagreements exist, a debate round follows until consensus is reached.\n5. **Specification** — All specialist sections are compiled into a single Markdown document. You review and approve or reject it.\n6. **Execution** — The Manager delegates implementation tasks to individual specialists.\n\nEvery phase transition requires **explicit human approval** — Mesa never proceeds without your say-so.\n\n## Quick Start\n\n```bash\n# Install Mesa in under 2 minutes\ncurl -fsSL https://raw.githubusercontent.com/hacklabr/opencode-mesa/main/install.sh | bash\n```\n\nThe script clones the repo, builds the plugin, generates specialist agents, and prints the plugin path to add to your `opencode.json`. Restart OpenCode, then start a discussion:\n\n```\n/agent briefing-writer\n```\n\nThat's it. The Briefing Writer will guide you through discovery, and the workflow proceeds from there.\n\n## Installation\n\n### Quick Install\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/hacklabr/opencode-mesa/main/install.sh | bash\n```\n\nThis single command:\n\n- Clones the repository to `~/.local/share/opencode-mesa`\n- Installs dependencies and builds the plugin\n- Generates 173 specialist subagents from the catalog\n- Prints the plugin path for your `opencode.json`\n\n### Manual Install\n\n```bash\ngit clone https://github.com/hacklabr/opencode-mesa.git ~/.local/share/opencode-mesa\ncd ~/.local/share/opencode-mesa\nbun install \u0026\u0026 bun run build \u0026\u0026 bun run setup:agents\n```\n\nThen add to your project's `opencode.json`:\n\n```json\n{\n  \"plugin\": [\"file:///home/YOURUSER/.local/share/opencode-mesa/dist/index.js\"]\n}\n```\n\n### Custom Install Location\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/hacklabr/opencode-mesa/main/install.sh | bash -s -- \\\n  https://github.com/hacklabr/opencode-mesa /path/to/install\n```\n\n### Verifying Installation\n\nAfter restarting OpenCode, verify Mesa is loaded:\n\n```\n\u003e mesa_status\n```\n\nYou should see the plugin version, current phase (`PLANNING`), and empty counts for team, analyses, and votes.\n\n## Usage\n\n### Starting a Discussion (Briefing Phase)\n\nSwitch to the Briefing Writer agent and describe what you need:\n\n```\n/agent briefing-writer\n```\n\nThe Briefing Writer conducts a structured discovery interview — asking about your project's goals, constraints, scope, and success criteria. When the interview is complete, it calls `create_briefing` to save the document, and waits for your approval via `approve_briefing`.\n\nOnce approved, `deliver_briefing` hands the briefing to the Manager agent and transitions to the **PLANNING** phase.\n\nYou can also import an existing document as a briefing (skips the interview):\n\n```\n\u003e import_briefing(file_path=\"/path/to/my-briefing.md\", slug=\"my-project\", title=\"My Project\")\n```\n\n### Team Proposal \u0026 Approval (Planning Phase)\n\nThe Manager agent reads the briefing via `analyze_briefing`, browses the specialist catalog with `list_specialists`, and proposes a team:\n\n```\n\u003e propose_team(specialists=[\n    { personaId: \"engineering-backend-architect\", name: \"Backend Architect\", division: \"engineering\", justification: \"...\" },\n    { personaId: \"security-specialist\", name: \"Security Specialist\", division: \"specialized\", justification: \"...\" }\n  ])\n```\n\nYou review the proposal — if you approve, the Manager calls `summon_team` to mark specialists as ready, then `define_phases` to set the workflow phases.\n\n### Analysis Rounds (Analysis Phase)\n\nThe Manager opens an analysis round:\n\n```\n\u003e open_analysis_round(\n    topic=\"API design for order management\",\n    participants=[\"engineering-backend-architect\", \"security-specialist\"],\n    max_turns=2,\n    briefing_content=\"...\"\n  )\n```\n\nFor each specialist, the Manager invokes them via OpenCode's native `task` tool:\n\n```\ntask(subagent_type=\"mesa/engineering-backend-architect\", prompt=\"Analyze the following...\", description=\"Backend analysis\")\n```\n\nAfter each specialist responds, the Manager registers their analysis:\n\n```\n\u003e register_analysis(agent_id=\"engineering-backend-architect\", agent_name=\"Backend Architect\", content=\"...\", turn=1)\n```\n\n### Consensus \u0026 Specification (Consensus + Documentation Phases)\n\nOnce all analyses are in, the Manager calls `request_consensus` with each specialist's vote:\n\n```\n\u003e request_consensus(\n    votes=[\n      { agent_id: \"engineering-backend-architect\", agent_name: \"Backend Architect\", vote: 1, reason: \"Agree with security findings\" },\n      { agent_id: \"security-specialist\", agent_name: \"Security Specialist\", vote: 2, reason: \"Agree but recommend rate limiting\" }\n    ],\n    round=1\n  )\n```\n\nVotes: `0` = DISAGREE, `1` = AGREE, `2` = AGREE_WITH_RESERVATIONS.\n\nIf all agree, the Manager compiles the specification:\n\n```\n\u003e generate_specification(\n    sections=[\n      { specialist_name: \"Backend Architect\", specialist_id: \"engineering-backend-architect\", content: \"## Backend Recommendations\\n\\n...\" },\n      { specialist_name: \"Security Specialist\", specialist_id: \"security-specialist\", content: \"## Security Analysis\\n\\n...\" }\n    ],\n    topic=\"Order Management API\"\n  )\n```\n\nYou review the generated spec, then approve or reject:\n\n```\n\u003e approve_specification(approved=true)\n\u003e approve_specification(approved=false, feedback=\"Missing error handling section\")\n```\n\n### Execution (Execution Phase)\n\nAfter specification approval, the Manager delegates implementation tasks:\n\n```\n\u003e delegate_task(\n    personaId=\"engineering-backend-architect\",\n    task=\"Implement order management API endpoints\",\n    context_info=\"See specification section 2...\"\n  )\n```\n\nThe tool returns instructions for invoking the specialist via the `task` tool.\n\n## Workflow Reference\n\nThe state machine controls phase transitions. Every transition is validated — invalid transitions are rejected with a clear error message.\n\n```mermaid\nstateDiagram-v2\n    [*] --\u003e PLANNING\n    PLANNING --\u003e ANALYSIS : open_analysis_round\n    PLANNING --\u003e PAUSED : pause_discussion\n    PLANNING --\u003e CANCELLED : cancel_discussion\n    ANALYSIS --\u003e CONSENSUS : request_consensus\n    ANALYSIS --\u003e PAUSED : pause_discussion\n    ANALYSIS --\u003e CANCELLED : cancel_discussion\n    CONSENSUS --\u003e DOCUMENTATION : generate_specification\n    CONSENSUS --\u003e ANALYSIS : reopen debate\n    CONSENSUS --\u003e PAUSED : pause_discussion\n    CONSENSUS --\u003e CANCELLED : cancel_discussion\n    DOCUMENTATION --\u003e APPROVAL : auto-transition\n    DOCUMENTATION --\u003e PAUSED : pause_discussion\n    DOCUMENTATION --\u003e CANCELLED : cancel_discussion\n    APPROVAL --\u003e EXECUTION : approve_specification(true)\n    APPROVAL --\u003e DOCUMENTATION : approve_specification(false)\n    APPROVAL --\u003e PAUSED : pause_discussion\n    APPROVAL --\u003e CANCELLED : cancel_discussion\n    EXECUTION --\u003e PAUSED : pause_discussion\n    EXECUTION --\u003e CANCELLED : cancel_discussion\n    PAUSED --\u003e PLANNING : resume_discussion\n    PAUSED --\u003e ANALYSIS : resume_discussion\n    PAUSED --\u003e CONSENSUS : resume_discussion\n    PAUSED --\u003e DOCUMENTATION : resume_discussion\n    PAUSED --\u003e APPROVAL : resume_discussion\n    PAUSED --\u003e EXECUTION : resume_discussion\n    PAUSED --\u003e CANCELLED : cancel_discussion\n    CANCELLED --\u003e PLANNING : restart\n```\n\nYou can pause, resume, or cancel at any phase. Cancelling clears analysis data but preserves the briefing and team. You can restart from `CANCELLED` back to `PLANNING`.\n\n## Architecture\n\n```mermaid\ngraph TB\n    subgraph \"OpenCode Host\"\n        User[User]\n        Agents[Agent Sessions\\nbriefing-writer · manager]\n        TaskTool[task tool\\nnative]\n        SubAgents[\"Specialist Subagents\\nmesa/* namespace\"]\n    end\n\n    subgraph \"Mesa Plugin\"\n        Tools[\"21 Tools\\nbriefing · manager · discussion\\ncatalog · status\"]\n        State[\"State Layer\\nstate.ts · audit.ts\"]\n        Catalog[\"Catalog\\nloader.ts · 173 specialists\"]\n        Hook[\"System Prompt Hook\\ninjects Mesa context\"]\n    end\n\n    subgraph \"Workspace (.mesa/)\"\n        StateFile[state.json]\n        Briefings[briefings/]\n        Specs[specifications/]\n        AuditFile[audit.log]\n    end\n\n    Tools --\u003e State --\u003e StateFile\n    Tools --\u003e Catalog\n    Hook --\u003e Agents\n    Agents --\u003e Tools\n    Agents --\u003e TaskTool --\u003e SubAgents\n\n    style Tools fill:#E91E63,color:#fff\n    style State fill:#FFC107,color:#000\n    style Catalog fill:#4CAF50,color:#fff\n    style Hook fill:#9C27B0,color:#fff\n```\n\nMesa is an OpenCode plugin that registers 21 tools, 173 specialist subagents, and a system prompt hook. The plugin itself manages state transitions and persistence — the actual specialist invocation happens through OpenCode's native `task` tool, which creates a real subagent session with the specialist's own system prompt.\n\nKey design decisions:\n\n- **Specialists are real subagents** — each runs in its own session with its own system prompt, not a simulated persona.\n- **State is file-based** — everything lives in `.mesa/` within your workspace. No databases, no external services.\n- **The Manager never generates content** — it orchestrates. Specialists generate the actual analysis and specification content.\n- **Human approval gates** — team proposal, specification, and every phase transition can require explicit human confirmation.\n\n## Tool Reference\n\nMesa provides 21 tools organized into five categories.\n\n### General Tools\n\n| Tool | Description | Parameters |\n|------|-------------|------------|\n| `mesa_status` | Returns the current plugin status, phase, and counts | _(none)_ |\n\n### Catalog Tools\n\n| Tool | Description | Parameters |\n|------|-------------|------------|\n| `list_specialists` | Lists available specialist personas from the catalog | `division?` `string` — filter by division name (e.g. `'engineering'`, `'product'`) · `search?` `string` — search term to filter by name or description |\n| `get_specialist` | Returns full details and system prompt of a specialist | `id` `string` — the persona ID (e.g. `'engineering-backend-architect'`) |\n\n### Briefing Tools\n\n| Tool | Description | Parameters |\n|------|-------------|------------|\n| `create_briefing` | Creates and saves a new briefing document in `.mesa/briefings/` | `slug` `string` — URL-friendly identifier (e.g. `'ecommerce-platform'`) · `title` `string` — the briefing title · `content` `string` — full briefing content in Markdown |\n| `approve_briefing` | Marks the current briefing as approved (requires human confirmation) | _(none)_ |\n| `deliver_briefing` | Delivers the approved briefing to the Manager, transitions to PLANNING | _(none)_ |\n| `import_briefing` | Imports an existing file as a pre-approved briefing, resets to PLANNING | `file_path` `string` — absolute path to the briefing file · `slug` `string` — URL-friendly identifier · `title?` `string` — title (defaults to filename) |\n\n### Manager Tools\n\n| Tool | Description | Parameters |\n|------|-------------|------------|\n| `analyze_briefing` | Reads the current approved briefing for analysis (PLANNING phase only) | _(none)_ |\n| `propose_team` | Proposes a team of specialists with justifications for human approval | `specialists` `array\u003c{ personaId: string, name: string, division: string, justification: string }\u003e` — proposed specialists |\n| `summon_team` | Summons the approved team, marking each specialist as ready | _(none)_ |\n| `delegate_task` | Defines a task for a specialist, returns invocation instructions (EXECUTION phase only) | `personaId` `string` — specialist persona ID · `task` `string` — task description · `context_info?` `string` — additional context |\n| `define_phases` | Defines the ordered workflow phases for the current project | `phases` `array\u003cstring\u003e` — ordered phase names (e.g. `['PLANNING', 'ANALYSIS', 'CONSENSUS']`) |\n\n### Discussion Tools\n\n| Tool | Description | Parameters |\n|------|-------------|------------|\n| `open_analysis_round` | Opens a structured analysis round with topic and participants (PLANNING → ANALYSIS) | `topic` `string` — the discussion topic · `participants` `array\u003cstring\u003e` — ordered specialist persona IDs · `max_turns?` `number` — max turns per specialist (default: 2) · `briefing_content?` `string` — briefing content for specialists |\n| `register_analysis` | Registers a specialist's analysis in the current round (ANALYSIS phase only) | `agent_id` `string` — specialist persona ID · `agent_name` `string` — specialist display name · `content` `string` — the analysis content · `turn` `number` — current turn number (1-based) |\n| `request_consensus` | Initiates consensus voting (ANALYSIS → CONSENSUS) | `votes` `array\u003c{ agent_id: string, agent_name: string, vote: 0\\|1\\|2, reason: string }\u003e` — specialist votes (0=DISAGREE, 1=AGREE, 2=AGREE_WITH_RESERVATIONS) · `round` `number` — consensus round number |\n| `generate_specification` | Compiles specialist analyses into a specification document (CONSENSUS → DOCUMENTATION → APPROVAL) | `sections` `array\u003c{ specialist_name: string, specialist_id: string, content: string }\u003e` — specification sections · `topic` `string` — specification topic/title |\n| `approve_specification` | Approves or rejects the specification (APPROVAL → EXECUTION or → DOCUMENTATION) | `approved` `boolean` — whether approved · `feedback?` `string` — optional rejection reason |\n| `pause_discussion` | Pauses the current discussion, preserving state for later resumption | _(none)_ |\n| `resume_discussion` | Resumes a paused discussion to a specified phase | `target_phase` `string` — phase to resume to (e.g. `'ANALYSIS'`, `'CONSENSUS'`) |\n| `cancel_discussion` | Cancels the discussion and clears analysis data | _(none)_ |\n\n## State Persistence\n\nAll discussion state is stored in `.mesa/` within your workspace:\n\n```\n.mesa/\n├── state.json                 # Current discussion state (phase, team, analyses, votes)\n├── briefing-current.md        # Active briefing (delivered to Manager)\n├── briefings/                 # Saved briefing documents\n│   └── briefing-{slug}.md\n├── specifications/            # Generated specification documents\n│   └── spec-{id}.md\n├── briefing-for-discussion.md # Briefing content passed to specialists\n└── audit.log                  # Action audit trail\n```\n\nState is managed through strict phase transitions — every tool validates the current phase before executing. Invalid transitions are rejected with a descriptive error. The audit log records every significant action (briefing approved, team summoned, consensus reached, etc.) for traceability.\n\n## Agents\n\n### Primary Agents\n\n| Agent | Description |\n|-------|-------------|\n| `briefing-writer` | Conducts structured discovery sessions to produce professional briefings |\n| `manager` | Orchestrates specialist teams for structured discussion and specification |\n\n### Specialist Subagents\n\n173 specialists from the [agency-agents](https://github.com/msitarzewski/agency-agents) catalog, organized in 16+ divisions:\n\n- academic, design, engineering, finance, game-development\n- integrations, marketing, paid-media, product, project-management\n- sales, spatial-computing, specialized, strategy, support, testing\n\nEach specialist is registered as a hidden subagent in the `mesa/` namespace with `mode: subagent` and their own system prompt. OpenCode automatically injects the specialist's system prompt when invoked — the Manager must NOT include it in the task prompt.\n\nThe Manager invokes specialists via:\n\n```\ntask(subagent_type=\"mesa/engineering-backend-architect\", prompt=\"\u003ctask details only\u003e\", description=\"...\")\n```\n\nTo regenerate after catalog changes:\n\n```bash\nbun run setup:agents\n```\n\n## Development\n\n```bash\nbun install            # Install dependencies\nbun run build          # Build the plugin (tsc + copy catalog)\nbun run lint           # Type-check without emitting\nbun run typecheck      # Type-check without emitting\nbun test               # Run test suite (vitest)\nbun run dev            # Watch mode (tsc --watch)\nbun run setup:agents   # Generate .opencode/agents/ from catalog\n```\n\n**Prerequisites**: [Bun](https://bun.sh/) runtime, TypeScript 5+\n\n## Contributing\n\nContributions are welcome. Please follow the conventions in `AGENTS.md`:\n\n- Code in English (variables, functions, types, comments)\n- Commits: concise, imperative present (`feat: add catalog loader`, `fix: handle missing frontmatter`)\n- Run `bun run lint` and `bun run typecheck` before every commit\n- Every new feature must include tests\n\nSee [AGENTS.md](AGENTS.md) for the full contribution guidelines.\n\n## License\n\n[MIT](LICENSE) © [HackLab](https://github.com/hacklabr)\n\nThe specialist catalog is sourced from [agency-agents](https://github.com/msitarzewski/agency-agents) — see its license for catalog usage terms.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhacklabr%2Fopencode-mesa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhacklabr%2Fopencode-mesa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhacklabr%2Fopencode-mesa/lists"}