> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cirron.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Monorepo support

> Manage multiple models from one repo with a root `cirron.yaml`.

# Monorepo support

Many teams keep several models in one repository, each in its own directory with its own `cirron.yaml`. A **root
`cirron.yaml`** with a top-level `workspace:` key lets the CLI discover all of them and
operate from the repo root, the way Turborepo's `turbo.json` does for JavaScript
monorepos.

When the CLI finds a `workspace:` config in the current directory it runs in **monorepo
mode**. Otherwise it runs in **single-model mode** (the default behavior). There is no
upward search. Running a command inside a model subdirectory operates on that model
alone.

## Root `cirron.yaml`

```yaml theme={null}
workspace:
  name: ml-models                  # workspace / repo name
  models:
    - path: models/sentiment-rnn   # a single model directory
    - path: models/news-classifier
    - path: models/*               # glob: each immediate subdir that has a cirron.yaml
  # Optional: shared defaults inherited by every model
  defaults:
    profiling:
      snapshots: stats
      flush_interval: 1.0
    env:
      ENVIRONMENT: production
```

Each `path` points to a directory containing a model-level `cirron.yaml`. A `path` that
doesn't resolve to a directory with a cirron config is reported as an error.

## Model `cirron.yaml`

Unchanged: a model config never has a `workspace:` key:

```yaml theme={null}
name: sentiment-rnn
framework: tensorflow
type: classification
version: "1.0.0"
description: Bidirectional LSTM sentiment classifier
profiling:
  snapshots: sampled        # overrides the workspace default of "stats"
env:
  THRESHOLD: "0.5"          # merged with the workspace defaults
```

## Inheritance

Root `defaults` are merged into each model's config with a **shallow** strategy:

* **`env`**: shallow-merged; the model's value wins on key conflicts. With the example
  above the model ends up with `ENVIRONMENT: production` (from defaults) and
  `THRESHOLD: "0.5"` (its own).
* **`profiling`**: replaced wholesale when the model defines its own `profiling` block;
  otherwise the default `profiling` is used as-is.
* **Any other key** under `defaults`: applied only when the model doesn't already set it.

No deep merge anywhere. Predictable, no surprises.

## Commands

Today `cirron validate` is workspace-aware:

```bash theme={null}
cirron validate                       # validate the root config + every model
cirron validate --model sentiment-rnn  # validate just one model (by name or path)
cirron validate --json                 # machine-readable results
```

See [`cirron validate`](/cli/commands/validate) for details.

Workspace-aware `push`, `status`, and `list` are on the roadmap.
