Advanced Usage
curo provides a small set of flags to target, customize and compose workflows. Flags can go anywhere in the invocation.
Selecting the Profile (-p, --profile)
A profile is a lifecycle stage: dev (the default) is the snapshot base, ci adds machine manner, rel adds the release. The chain falls back rel -> ci -> dev, so a stage inherits everything below it unless the manifest overrides it. A pipeline can always say -p ci for its test jobs and -p rel for its delivery jobs:
curo -p ci install
curo -p rel build -n publish curo/cli
curo -p rel deploy curo/cli -- prod # rel picks the procedure, -- prod picks where it lands
The 1.x spelling -e/--env still parses as a deprecated alias and prints a warning.
Running the Root's Command for a Component (-g, --global)
Use -g/--global to apply the root's definition of an action to a specific component, even if that component defines its own:
curo -g lint frontend/ui
This runs the root's lint command from the frontend/ui directory. Relative paths in the root's command are re-anchored so they still resolve.
If a component should always resolve this way, declare it in the component's manifest instead of remembering the flag: a {{ global }} command makes curo lint frontend/ui do the right thing through ordinary precedence, and curo repo info will show the action under the component. See Configuration.
When an invocation resolves to zero actions, curo says so loudly and suggests the -g invocation if the root defines the action. There is no silent no-op.
Running from Inside a Component (-l, --local)
If you are inside a component's directory, use -l to target it without typing the path:
cd src/frontend/ui
curo -l start
Running All Definitions (-a, --all)
By default, the definition closest to the root wins: if the root defines install, components underneath are not consulted. Use -a to keep resolving through components that also define the action:
curo -a install
Excluding Components (-x, --exclude)
Skip a component and its subtree. The flag takes a slash path, matches exactly, and repeats:
curo build -x frontend/lib -x backend/database
Overriding the Runtime (-r, --runtime)
A command's runtime declaration is its default binding; -r is what's true right now. The reserved name bare forces no runtime at all:
curo test backend/server -r bare # skip the declared runtime
curo test -r ci-image # reproduce CI locally
Every component the invocation reaches must define the named runtime, otherwise the run fails loudly. -r bare is always valid.
Rendering the Plan (--plan)
--plan renders the execution plan without running it: which components resolved, in what order, with which commands.
curo build curo/cli --plan
Machine-Readable Output (--porcelain)
--porcelain replaces the ledger with JSON on stdout, for scripts and agents. It works on action invocations and on the repo commands, and combines with --plan:
curo test.unit --porcelain
curo build curo/cli --plan --porcelain
curo repo info --porcelain
Verbosity (-v)
Repeat -v to raise the ledger's detail level:
curo -vv build
Putting It Together
curo -p ci -x cicd-runtime build -n test.unit -n test.integration
curo test.functional curo/cli -- -k test_smoke