Multi-Project Setup
Symphony supports managing multiple projects simultaneously from a single instance. Each project gets its own issue board, agent profiles, and configuration.
How Project Detection Works
When Symphony starts, it scans the configured workspace directory for repositories. A directory is detected as a project if it contains recognizable project markers:
package.json(Node.js/JavaScript)composer.json(PHP)Cargo.toml(Rust)go.mod(Go)pyproject.tomlorsetup.py(Python)
Each detected project is registered in the database with a unique identifier prefix (e.g., SYM, API, WEB).
Workspace Structure
Symphony expects projects to be siblings in a workspace directory:
~/workspace/
project-a/ -> SYM-001, SYM-002, ...
project-b/ -> API-001, API-002, ...
project-c/ -> WEB-001, WEB-002, ...Per-Project Configuration
Each project has independent settings accessible through the web UI:
- Agent toggles — Enable/disable worker, researcher, scanner, and planner agents per project
- Concurrency limits — Control how many agents can work on a project simultaneously
- Custom instructions — Project-specific guidance for all agents
- Pipeline configuration — Which phases to include (e.g., skip research for simple projects)
Configuring via the Web UI
- Navigate to your project's board at
/p/:slug - Click Settings in the project header
- Adjust agent toggles, concurrency, and custom instructions
- Click Save
Configuring via the CLI
npm run cli -- status # See all projects and their statusConcurrency and Slot Management
Symphony allocates agent slots across projects:
- Global limit — Maximum total concurrent agents (configured in
symphony.config.json) - Per-project limit — Maximum concurrent agents per project
- Reserved worker slots — Ensures workers aren't starved by phase agents
The orchestrator dispatches work in priority order: judge (review) > phase agents > workers > scanners.
Testing
Worker slot reservation is tested in tests/integration/orchestrator/workerSlotStarvation.test.ts:
npx vitest run tests/integration/orchestrator/workerSlotStarvation.test.tsThe test suite verifies that phase agents cannot consume all concurrency slots when worker items are waiting.
Worktree Isolation
Each agent gets its own git worktree, regardless of which project it belongs to. Worktrees are created in .symphony-workspaces/<identifier> and cleaned up after the agent completes.
This means agents from different projects never interfere with each other, and multiple agents can work on the same project simultaneously without merge conflicts.