Turborepo Integration
Miso integrates with Turborepo by delegating orchestration while providing an enhanced terminal UI.
Setup
Set repo to "turbo" in your miso.json:
{
"repo": "turbo",
"tui": "tabbed"
}Requirements: The turbo binary must be available in your PATH.
How It Works
When you run a task declared in turbo.json (say miso build) with turbo mode:
- Miso spawns
turbo run <task>as a single process - Turbo handles dependency ordering, caching, and parallelism
- Miso displays the process output in the TUI with per-workspace tabs
- Each workspace gets its own tab with independent scroll, exit code, and cache status
Names turbo doesn’t know — folder scripts, workspace scripts, repo.tasks overrides — run under miso’s own orchestration with the usual chrome, following the resolution ladder. A name claimed by both turbo.json and a scripts-folder file is an error, not a silent pick: declare it under repo.tasks to hand it to miso, or rename the script so turbo owns it. Root package.json scripts are entry points rather than claimants, so the usual "build": "turbo run build" keeps working.
You can still target specific workspaces with an @scope — miso passes it through as turbo --filter (or nx --projects).
With TUI enabled
Miso wraps turbo’s output in the tabbed or merged view. Workspaces are discovered dynamically as turbo’s output arrives.
With TUI disabled
Same routing, plain output. Turbo-declared tasks still delegate to turbo run; miso-orchestrated names stream as prefixed [label] line output instead of chrome.
What Miso Delegates vs Handles
| Concern | Owner |
|---|---|
| Task dependency ordering | Turbo |
| Caching | Turbo |
| Parallelism | Turbo |
| Output display (TUI) | Miso |
Task discovery (miso scripts) | Miso (reads turbo.json) |
Because turbo owns the child processes in delegated mode, miso’s per-process features — single-task restart (r), interactive mode (i), and the per-task pseudo-terminal — apply only to tasks miso orchestrates directly (see Overriding Tasks below). Delegated output is rendered as it arrives.
Overriding Tasks with Miso Orchestration
Tasks declared in turbo.json are delegated to Turbo by default. If you want Miso to orchestrate one of those directly — while Turbo handles everything else — add a tasks block to the repo config. Declaring a task there opts that one name out of delegation entirely (including turbo’s caching and graph — that’s the point).
A common use case: let Miso manage your dev servers (so you get per-process restart, status indicators, and the full TUI experience) while Turbo handles builds, linting, and other pipeline tasks.
{
"tui": "tabbed",
"repo": {
"mode": "turbo",
"tasks": {
"dev": {
"concurrent": ["db:studio", "stripe:listen"]
}
}
}
}With this config, miso dev uses Miso’s direct orchestration — discovering dev scripts across your workspaces, launching them as individual processes, and giving you per-workspace restart with r. Any other command like miso build or miso lint is still delegated to Turbo as normal.
Version Support
Miso supports both turbo.json formats:
v2 (current): reads from the tasks key v1 (legacy): reads from the pipeline key Version is detected automatically.