Plexus

Documentation

Autonomous multi-agent software development for macOS. Write a spec, decompose into tasks, orchestrate with any agent.

Overview

Plexus is a native macOS application that orchestrates autonomous coding agents in parallel. You describe the work in a Simplex spec, Plexus decomposes it into isolated tasks, assigns agents, and merges the results. Your working directory is never modified until you approve.

Spec-driven
Write structured specs with landmarks, constraints, and DONE_WHEN criteria. The linter catches ambiguity before orchestration begins.
Parallel isolation
Every agent runs in its own git worktree branched from HEAD. No shared state, no race conditions, no conflicts during execution.
Mix agents
Claude Code, Codex, Cline — pick one for planning, another for execution. Swap models per task. Escalate on failure.
Spec Intelligence
Track spec evolution across runs. Timeline, diffs, and function-to-file footprints in a dedicated git repo inside .plex/specs/.

Installation

Download the DMG from the Plexus homepage and drag the app to Applications. Requires macOS 14 (Sonoma) or later. Universal binary — runs natively on Apple Silicon and Intel.

Or install via the command line:

Shell
curl -fsSL https://thinkwright.ai/plexus/install | sh

On first launch, Plexus will prompt you to select an agent provider and configure your API key. Keys are stored in the macOS Keychain — never written to disk.

No telemetry, no tracking, no accounts. Plexus runs entirely on your machine. API calls go directly to your chosen provider.

Core Workflow

1. Write a Spec
Create a Simplex specification with landmarks, constraints, and DONE_WHEN criteria. The built-in linter validates structure before you proceed.
2. Orchestrate
Plexus decomposes the spec into parallel tasks, creates isolated git worktrees, and launches agents. Monitor progress in real time via the coordinator chat.
3. Review
Each agent's diff is presented independently. Accept, reject, or re-run individual tasks with a different model. Failed tasks support model escalation.
4. Merge
Passing agents merge into the orchestration branch automatically. Review the combined diff, then merge to main in one action. Failed agents can be re-run. Your checkout stays clean until you approve.

Simplex Specs

Plexus uses or generates Simplex specifications. Simplex is a structured format designed for AI agent consumption — every function maps to an agent task with deterministic boundaries, constraints, and success criteria.

Why Simplex instead of free-form prompts:

Spec Anatomy

A Simplex spec has three levels: the project header, landmarks (groups of related work), and functions (individual agent tasks).

Simplex
PROJECT auth-system
GOAL    Add JWT authentication to the API server

LANDMARK token-service "JWT token generation and validation"

  FUNCTION generate-tokens
    CONSTRAINTS
      MODIFY server/auth/jwt.go
      MODIFY server/auth/jwt_test.go
    DONE_WHEN
      "go test ./server/auth/... passes"
      "tokens include exp, sub, and iss claims"

  FUNCTION middleware
    DEPENDS_ON generate-tokens
    CONSTRAINTS
      MODIFY server/middleware/auth.go
    DONE_WHEN
      "401 returned for missing/expired tokens"
      "valid tokens pass through to handler"

LANDMARK integration "Wire auth into existing routes"

  FUNCTION protect-routes
    DEPENDS_ON middleware
    CONSTRAINTS
      MODIFY server/routes.go
    DONE_WHEN
      "all /api/* routes require auth"
      "/health and /login remain public"

Key Concepts

Linting & Validation

Before orchestration begins, Plexus runs the Simplex linter across your spec. The linter catches:

The linter reports warnings and errors with line numbers. Errors block orchestration; warnings are advisory. You can also lint specs on the web at thinkwright.ai/simplex.

Constraint overlap without dependencies is the #1 cause of merge conflicts. If two functions both modify routes.go, they must declare a dependency relationship or the linter will flag it.

How It Works

When you start orchestration, Plexus creates a dedicated orchestration branch from your current HEAD. Each function in the spec becomes an agent task that runs in its own git worktree branched from that point.

Agents run in real tmux sessions with full terminal access — they can run tests, build projects, inspect files, and use any tool available in your shell. There is no sandbox or simulation; agents operate in the same environment you do.

Execution Model

Your checkout is never modified. All agent work happens in isolated worktrees. Changes only appear in your working directory after you explicitly merge them.

Task Decomposition

Each Simplex function becomes exactly one agent task. You don't need to manually wire up dependencies between functions. Plexus infers them automatically from the READS and WRITES declarations in your spec.

Smart Dependency Inference

When a function declares that it READS a resource that another function WRITES, Plexus establishes a dependency. The matching uses four strategies, applied in order:

The inferred dependencies form a directed acyclic graph, which is topologically sorted into execution waves:

Example: Wave Scheduling
# Wave 1 (parallel) ─ no dependencies
  generate-tokens    → Agent 1
  setup-database     → Agent 2
  add-config-schema  → Agent 3

# Wave 2 (waits for wave 1 to merge)
  middleware         → Agent 1  # READS token output
  seed-data          → Agent 2  # READS database schema

# Wave 3
  protect-routes     → Agent 1  # READS middleware

Deferred Branching

Wave scheduling determines what code each agent can see. Wave 1 agents branch from your current HEAD. After wave 1 completes and merges, wave 2 agents branch from the orchestration branch tip, so they work on top of wave 1's merged output. This continues for each subsequent wave.

A wave 2 agent that depends on database setup will see the actual tables, migrations, and schema that the wave 1 agent created, not just a description of them in the spec.

Agent Isolation

Each agent receives the full spec for context but is instructed to implement only its assigned function. Every agent runs in its own git worktree, a real isolated checkout of the repository. Your working directory is never modified during orchestration. Agents evaluate their own DONE_WHEN criteria before reporting completion.

Merge Strategy

After agents complete their tasks, Plexus merges each worktree back into the orchestration branch. All merging happens on a dedicated orch branch. Your working branch is never touched until you explicitly accept the results.

Conflict Prevention

Before any merging begins, Plexus takes several steps to prevent conflicts:

Multi-Stage Merge Pipeline

For each agent, Plexus attempts to merge its work through up to three escalating strategies:

If all three stages fail, the agent is marked as merge-failed. You then have several options:

Coordinator Chat

The coordinator is a dedicated chat interface that runs alongside orchestration. It has visibility into all agent activity and lets you monitor, steer, and intervene without leaving Plexus.

What the Coordinator Can Do

Open the coordinator with ⌘K during orchestration. The coordinator maintains its own conversation history, separate from the planning chat.


Spec Intelligence

Spec Intelligence tracks how your specs evolve across orchestration runs. Every time you run an orchestration, Plexus snapshots the spec into a dedicated git repository at .plex/specs/ in your project root.

What Gets Tracked

Accessing Spec Intelligence

Use the Spec Intelligence menu in the macOS menu bar:

The .plex/specs/ repo is a full git repository. You can use standard git tools to analyze spec evolution — git log --stat, git diff HEAD~3, etc.

Orchestration Reports

After every orchestration, Plexus generates a PLEXUS_REPORT.md in the orchestration branch. The report includes:

Reports are viewable in Plexus's file explorer with full markdown rendering — tables, code blocks, blockquotes, and horizontal rules all render inline.


Agent Configuration

The planning model and execution model are configured independently. Use a fast model for plan decomposition and a more capable model for complex implementation tasks.

Claude Code
Anthropic's coding agent. Max subscription (no API key needed) or bring your own Anthropic API key. Supports Sonnet, Opus, and Haiku with extended thinking. Default concurrency: 3.
Codex
OpenAI's coding agent. Requires an OpenAI API key. Works with GPT-4o, o3, and other models. No concurrency limit.
Cline
Open-source agent. Bring any API key — Anthropic, OpenAI, Google, or local models via Ollama. No concurrency limit.

Agent Control

Plexus gives you fine-grained control over individual agent tasks during and after orchestration:

During Orchestration

After Orchestration

Timeout Configuration

Agent timeout defaults to 30 minutes (1800 seconds). This accommodates long-running operations like Rust compilation, cargo test on large projects, or complex refactors. Configure via ~/.config/plex/config.json:

JSON
{
  "claude_timeout": 1800,
  "max_concurrent": 3,
  "max_attempts": 3
}

Set claude_timeout to 0 to disable the timeout entirely. Plexus will still terminate agent processes cleanly when you cancel orchestration or close the app.


File Explorer

The sidebar file explorer shows your project tree with language-specific icons and real-time git status indicators:

Keyboard Shortcuts

ShortcutAction
⌘NNew plan
⌘⏎Start orchestration
⌘1-9Switch to agent tab
⌘[ / ⌘]Previous / next tab
⌘DToggle diff view
⌘KOpen coordinator chat
⌘.Stop current agent
⌘⇧MMerge selected task
⌘EToggle file explorer
⌘,Settings

Configuration

Plexus stores configuration at ~/.config/plex/config.json. All fields are optional — sensible defaults are used when not specified.

FieldDefaultDescription
default_agent"claude"Agent provider for new tasks: claude, codex, or cline
work_dir(cwd)Default project directory on launch
max_attempts3Maximum retry attempts per failed task
max_concurrent0Concurrent agent limit. 0 = auto (3 for Claude, unlimited for others)
claude_timeout1800Per-agent timeout in seconds. 0 = no timeout
Example config.json
{
  "default_agent": "claude",
  "max_attempts": 3,
  "max_concurrent": 4,
  "claude_timeout": 3600
}