Caveats

curo is deliberately constrained. The caps below are the product working as intended, kept small on purpose; the error messages are written to tell you which one you hit.

The Action Vocabulary Is Closed

There are exactly fifteen actions and no way to define more. Sublevels are curated per action, and test (unit, integration, functional) is deliberately the only action that has them. If a workflow does not fit an action, that is a signal to reshape the workflow, not the vocabulary.

Exactly Three Profiles

Profiles are hard-coded: dev, ci and rel, falling back down that chain. A profile means lifecycle stage, nothing else. Deploy targets and environment names (staging, prod) are not profiles; pass them as trailing arguments and let the script own them.

Three Levels, One Level at a Time

Each curo.toml only declares components one level deeper; hierarchies are built by placing a manifest in each component directory. The tree caps at three levels: root, component, subcomponent.

Component Command Precedence

The definition closest to the root wins. If both the root and a component define build, curo build runs only the root's version; use -a/--all to keep resolving through definitions. Component order in components is execution order.

Exclusions Match Exactly

-x/--exclude repeats, takes slash paths, and must exactly match a component path. Pattern matching and globs are not supported.

Local Targeting Needs a Component Directory

-l/--local resolves the component from your current directory. It cannot be used from outside the tree, and discovery stops at a .git boundary.

Runtimes Are Per-Manifest

Runtime names are declared in each component's manifest. A -r override fails loudly on any resolved component that does not define that name; only -r bare is always valid. Runtimes are also torn down when the invocation ends. If you want a database left running between invocations, manage it with start/stop actions instead of a runtime.

The Loader Is Strict

Unknown keys, unknown actions, unknown tokens and wrong shapes in curo.toml are errors, not warnings. A typo cannot silently become a no-op or a corrupted shell command.

Environment Variable Expansion

curo executes commands via the shell (by default bash -c; the shell key overrides it), so environment variables behave as they do in your shell. If a command depends on specific environment setup, make sure your shell provides it.

Cross-Platform Considerations

curo runs your specified shell commands as-is. If you are working in a cross-platform team, ensure your commands are portable or conditionally written.

Dependency Assumptions

curo does not manage or install any system or language dependencies for you. That is for you to set up; curo makes sense of the parts once you have.