# `ComposerNew.Shell`
[🔗](https://github.com/elixir-composer/composer/blob/v0.3.0/lib/composer_new/shell.ex#L1)

Prints a `ComposerNew.Plan`, or runs it.

Each command is its own OS process, with its output streamed to the
terminal. A child's stdin isn't a terminal, so a prompt would hang: every
`mix` command in the plan gets `--yes`.

# `describe`

```elixir
@spec describe(ComposerNew.Plan.step()) :: String.t()
```

A plan step as a shell line, with the directory it runs in.

# `print`

```elixir
@spec print(ComposerNew.Plan.t()) :: :ok
```

Prints the plan's summary and its numbered commands.

# `run`

```elixir
@spec run(ComposerNew.Plan.t()) ::
  :ok | {:error, ComposerNew.Command.t(), non_neg_integer()}
```

Runs the plan's commands in order, stopping at the first that fails.
Returns `:ok` or `{:error, command, status}`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
