# `Codex.CLI`
[🔗](https://github.com/nshkrdotcom/codex_sdk/blob/v0.18.0/lib/codex/cli.ex#L1)

Thin wrapper around the upstream `codex` terminal client.

Use this module when you want command-surface parity with the Codex CLI,
including commands that do not fit the SDK's structured `Codex.Exec` or
`Codex.AppServer` APIs.

One-shot non-PTY commands run through the execution-plane-backed
`CliSubprocessCore.Command` lane, while `start/2` and the helpers that return
`%Codex.CLI.Session{}` remain the raw local path for interactive PTY sessions
and long-lived provider-native control surfaces such as `codex app-server`
and `codex mcp-server`.

# `result`

```elixir
@type result() :: Codex.CLI.Session.result()
```

# `app`

```elixir
@spec app(
  String.t() | nil | keyword(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex app`.

# `app_server`

```elixir
@spec app_server(keyword()) :: {:ok, Codex.CLI.Session.t()} | {:error, term()}
```

Launches `codex app-server`.

# `apply`

```elixir
@spec apply(
  String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex apply TASK_ID`.

# `cloud`

```elixir
@spec cloud(keyword()) :: {:ok, Codex.CLI.Session.t()} | {:error, term()}
```

Launches the interactive `codex cloud` picker.

# `cloud_exec`

```elixir
@spec cloud_exec(
  String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex cloud exec`.

# `cloud_list`

```elixir
@spec cloud_list(keyword()) :: {:ok, result()} | {:error, term()}
```

Runs `codex cloud list`.

# `completion`

```elixir
@spec completion(
  String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex completion`.

# `debug_app_server_send_message_v2`

```elixir
@spec debug_app_server_send_message_v2(
  String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex debug app-server send-message-v2`.

# `execpolicy_check`

```elixir
@spec execpolicy_check(
  [String.t()] | String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex execpolicy check`.

Upstream removed its legacy policy engine, but this current `execpolicy check`
subcommand remains supported.

# `features_disable`

```elixir
@spec features_disable(
  String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex features disable FEATURE`.

# `features_enable`

```elixir
@spec features_enable(
  String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex features enable FEATURE`.

# `features_list`

```elixir
@spec features_list(keyword()) :: {:ok, result()} | {:error, term()}
```

Runs `codex features list`.

# `fork`

```elixir
@spec fork(
  String.t() | :last | keyword() | nil,
  keyword()
) :: {:ok, Codex.CLI.Session.t()} | {:error, term()}
```

Launches `codex fork`.

# `interactive`

```elixir
@spec interactive(
  String.t() | nil | keyword(),
  keyword()
) :: {:ok, Codex.CLI.Session.t()} | {:error, term()}
```

Launches `codex` in interactive mode (or one-shot prompt mode when `prompt`
is provided) and returns a raw subprocess session.

# `login`

```elixir
@spec login(
  :chatgpt | :device_auth | {:api_key, String.t()} | keyword(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex login`.

# `login_status`

```elixir
@spec login_status(keyword()) :: {:ok, result()} | {:error, term()}
```

Runs `codex login status`.

# `logout`

```elixir
@spec logout(keyword()) :: {:ok, result()} | {:error, term()}
```

Runs `codex logout`.

# `marketplace_add`

```elixir
@spec marketplace_add(
  String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex marketplace add`.

# `mcp_add`

```elixir
@spec mcp_add(String.t(), {:command, [String.t()]} | {:url, String.t()}, keyword()) ::
  {:ok, result()} | {:error, term()}
```

Runs `codex mcp add`.

# `mcp_get`

```elixir
@spec mcp_get(
  String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex mcp get`.

# `mcp_list`

```elixir
@spec mcp_list(keyword()) :: {:ok, result()} | {:error, term()}
```

Runs `codex mcp list`.

# `mcp_login`

```elixir
@spec mcp_login(
  String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex mcp login`.

# `mcp_logout`

```elixir
@spec mcp_logout(
  String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex mcp logout`.

# `mcp_remove`

```elixir
@spec mcp_remove(
  String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex mcp remove`.

# `mcp_server`

```elixir
@spec mcp_server(keyword()) :: {:ok, Codex.CLI.Session.t()} | {:error, term()}
```

Launches `codex mcp-server`.

# `resume`

```elixir
@spec resume(
  String.t() | :last | keyword() | nil,
  keyword()
) :: {:ok, Codex.CLI.Session.t()} | {:error, term()}
```

Launches `codex resume`.

# `run`

```elixir
@spec run(
  [String.t()],
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs a `codex` command synchronously and collects stdout/stderr until exit.

# `sandbox`

```elixir
@spec sandbox(
  [String.t()] | String.t(),
  keyword()
) :: {:ok, result()} | {:error, term()}
```

Runs `codex sandbox`.

# `start`

```elixir
@spec start(
  [String.t()],
  keyword()
) :: {:ok, Codex.CLI.Session.t()} | {:error, term()}
```

Starts a raw `codex` subprocess session.

---

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