Multi-agent software engineering orchestrator for the CLI.
Ocean sits between you and your coding agents (Codex CLI, Claude CLI, Cursor). It turns plain-language product direction into a living team chat: capture intent, let the characters reason through value, dispatch the next build to a coding brain, show proof for taste, then wind down until the next interval.
reify@Reifs-MacBook-Pro my-repo % ocean
π Ocean: Workspace: /Users/reify/projects/my-repo
π Ocean: Codegen backend β cursor_handoff
π Ocean: Hello β what are we building today?
π Ocean: The crew will keep building at intervals. Jump in whenever you want.
pip install ocean
ocean --helpRequires Python 3.11+. Codex CLI (npm install -g @openai/codex) or Claude CLI required for code generation.
Ocean is an orchestrator β it does not write code itself. The default path:
- Binds the current repo to lightweight product doctrine (
VISION.md,TASKS.md,docs/project.json) - Chats with a small fixed cast that has roles, history, stance, and semantic memory
- Ranks candidate improvements by value, effort, risk, verification path, and token spend
- Dispatches the selected job to your configured coding brain (Codex, Claude, Cursor handoff, or dry plan)
- Records proposals, chat history, screenshots, verification notes, and the next round of work
The agent does the coding. Ocean handles what should happen next, why it matters, how the result gets checked, and when the loop should stop for the round.
# Default: chat-first team room; background loop keeps building at intervals
ocean
# Interactive REPL (onboarding + commands, then loop on exit unless --no-loop)
ocean chat --repl
# Legacy full wizard (crew β plan β execute)
ocean chat --full
# Loop with a custom cadence
ocean loop --interval 300Set OCEAN_STRICT_CODEX=1 to abort when the Codex exec probe fails; default is warn-and-continue.
Use ocean chat --no-loop for setup only (no loop). Use ocean loop when you specifically want the worker without the chat room.
Ocean is designed to keep building until you stop it, but it paces itself against the key/project tier you give it. Set the provider's daily token limit from the provider dashboard, and Ocean uses 30% by default, split into hourly and per-round chunks:
OCEAN_GEMINI_TPD=240000 ocean loop
OCEAN_OPENAI_TPD=240000 ocean loop
OCEAN_CLAUDE_TPD=240000 ocean loopYou can change the operating fraction with OCEAN_TOKEN_BUDGET_FRACTION=0.5, or bypass provider math with OCEAN_TOKEN_BUDGET_PER_DAY / OCEAN_TOKEN_BUDGET_PER_HOUR. Without a numeric key-tier limit or a provider response that exposes one, Ocean will keep the loop alive but pause codegen rather than spend against an unknown budget.
In the REPL (ocean chat --repl or ocean chat-repl):
ocean> prd: build a task tracker CLI with add/list/done commands
β
PRD updated (docs/prd.md)
ocean> plan
π Ocean: Preparing project contextβ¦
β
Plan ready.
ocean> build
π Ocean: Dispatching to agent β building nowβ¦
π Ocean: β
wrote task_tracker.py
β
Build complete β 1 file(s) written.
ocean> crew
πΉοΈ Moroni
Β· Phase 1: gather resources. Phase 2: secure interfaces. πΉοΈ
Β· Skills β Vision synthesis, phased roadmaps, acceptance criteria β¦
ocean> exit
| Command | What it does |
|---|---|
ocean |
Chat-first team room; background build loop runs at intervals |
ocean chat |
Same chat-first session as bare ocean |
ocean chat --repl |
Interactive REPL; loop after exit unless --no-loop |
ocean chat --full |
Legacy wizard: crew β clarify β plan β execute |
ocean chat --no-loop |
Setup only, no autonomous loop |
ocean chat-repl |
Standalone quick REPL with prd: / plan / build / crew |
ocean loop |
Autonomous worker only (interval from prefs / --interval) |
ocean crew |
Show each agent's skills and voicing |
ocean clarify |
Capture project intent, save docs/project.json |
ocean doctor |
Check Codex/Claude auth and environment |
ocean onboard |
First-run setup: venv + pip install + pytest |
ocean mcp-server |
Run Ocean as a stdio MCP server for Cursor/Codex |
The chat-first product loop keeps a small fixed cast in .ocean/actors.json:
| Agent | Role |
|---|---|
| Captain | Orchestrator β turns conversation into the smallest valuable next move |
| Scrooge | Impact and money β checks adoption, value, and monetization |
| Edna | UX and product feel β keeps setup, screens, and workflows understandable |
| Q | Builder β translates selected jobs into pragmatic code changes |
| Mario | Ship and verify β proves the work runs and can be handed off |
The legacy ocean chat --full / planner path still uses the older specialist personas in docs/personas.yaml: Moroni, Q, Edna, Mario, and Tony.
Set in docs/ocean_prefs.json or via OCEAN_CODEGEN_BACKEND:
| Backend | How it works |
|---|---|
codex |
Calls codex exec directly (default when Codex is authed) |
cursor_handoff |
Writes docs/handoffs/ for Cursor Composer to pick up |
openai_api |
Calls OpenAI API directly (requires OPENAI_API_KEY) |
dry_plan_only |
Generates backlog/plan only, no code execution |
Ocean can run as an MCP server for Cursor or any MCP client:
ocean mcp-serverExposes ocean_turn, ocean_next_action, ocean_record_feedback, ocean_bootstrap_doctrine, ocean_health, ocean_set_codegen_backend.
docs/
prd.md β what to build (set via `prd:` in REPL)
project.json β clarified spec (name, kind, goals, vision)
personas.yaml β agent voices and skills
plan.md β generated backlog
handoffs/ β Cursor handoff files (cursor_handoff mode)
logs/
events-*.jsonl β structured session events
ocean/
cli.py β all commands
codex_exec.py β Codex CLI dispatch
persona.py β voice loading from personas.yaml
planner.py β backlog generation and execution
pty_harness.py β PTY driver for integration tests
pytest tests/ # 70 tests, ~25s
ocean doctor # environment + auth checkMIT