Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions codex-rs/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

71 changes: 64 additions & 7 deletions codex-rs/cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,74 @@ path = "src/lib.rs"
[lints]
workspace = true

[features]
default = []

# Full feature set - enables all legacy functionality
full = [
"app-server",
"cloud-tasks",
"login",
"feedback",
"backend-client",
"upstream-updates",
"mcp-server",
"chatgpt",
"responses-api-proxy",
"oss-providers",
]

# App server functionality
app-server = ["dep:codex-app-server"]

# Cloud tasks command
cloud-tasks = ["dep:codex-cloud-tasks"]

# Login/logout commands - propagate to TUI
login = ["dep:codex-login", "codex-tui/login"]

# Feedback feature - propagate to TUI (legacy OpenAI Sentry feedback)
# Future Nori feedback: https://github.com/tilework-tech/nori-cli/issues
feedback = ["codex-tui/feedback"]

# Backend client feature - propagate to TUI
backend-client = ["codex-tui/backend-client"]

# Upstream updates feature - propagate to TUI
upstream-updates = ["codex-tui/upstream-updates"]

# OSS providers (Ollama, LM Studio) - propagate to TUI and codex-common
oss-providers = ["codex-tui/oss-providers", "codex-common/oss-providers"]

# MCP server functionality
mcp-server = ["dep:codex-mcp-server", "dep:codex-rmcp-client"]

# ChatGPT/apply command
chatgpt = ["dep:codex-chatgpt"]

# Responses API proxy
responses-api-proxy = ["dep:codex-responses-api-proxy"]

[dependencies]
anyhow = { workspace = true }
clap = { workspace = true, features = ["derive"] }
clap_complete = { workspace = true }
codex-acp = { workspace = true }
codex-app-server = { workspace = true }
codex-app-server = { workspace = true, optional = true }
codex-app-server-protocol = { workspace = true }
codex-arg0 = { workspace = true }
codex-chatgpt = { workspace = true }
codex-cloud-tasks = { path = "../cloud-tasks" }
codex-chatgpt = { workspace = true, optional = true }
codex-cloud-tasks = { path = "../cloud-tasks", optional = true }
codex-common = { workspace = true, features = ["cli"] }
codex-core = { workspace = true }
codex-exec = { workspace = true }
codex-execpolicy = { workspace = true }
codex-login = { workspace = true }
codex-mcp-server = { workspace = true }
codex-login = { workspace = true, optional = true }
codex-mcp-server = { workspace = true, optional = true }
codex-process-hardening = { workspace = true }
codex-protocol = { workspace = true }
codex-responses-api-proxy = { workspace = true }
codex-rmcp-client = { workspace = true }
codex-responses-api-proxy = { workspace = true, optional = true }
codex-rmcp-client = { workspace = true, optional = true }
codex-stdio-to-uds = { workspace = true }
codex-tui = { workspace = true }
ctor = { workspace = true }
Expand Down Expand Up @@ -62,3 +110,12 @@ assert_matches = { workspace = true }
predicates = { workspace = true }
pretty_assertions = { workspace = true }
tempfile = { workspace = true }

# Integration tests that require the mcp-server feature
[[test]]
name = "mcp_add_remove"
required-features = ["mcp-server"]

[[test]]
name = "mcp_list"
required-features = ["mcp-server"]
75 changes: 54 additions & 21 deletions codex-rs/cli/docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,8 @@ The `codex-cli` crate is the main multitool binary that provides the `codex` com

This crate is the primary entry point that ties together all other crates:

- **Dispatches to** `codex-tui` for interactive mode (default, no subcommand)
- **Dispatches to** `codex-exec` for `codex exec` non-interactive execution
- **Dispatches to** `codex-mcp-server` for `codex mcp-server`
- **Dispatches to** `codex-app-server` for `codex app-server`
- **Dispatches to** `codex-cloud-tasks` for `codex cloud` browsing
- **Uses** `codex-login` for authentication flows
- **Uses** `codex-chatgpt` for the `codex apply` command
- **Always included:** `codex-tui`, `codex-exec`, `codex-acp`, `codex-core` (minimal build)
- **Optional via features:** `codex-mcp-server`, `codex-app-server`, `codex-cloud-tasks`, `codex-login`, `codex-chatgpt`, `codex-responses-api-proxy`
- **Uses** `codex-arg0` for arg0-based dispatch (Linux sandbox embedding)

### Core Implementation
Expand All @@ -38,20 +33,20 @@ match subcommand {

**Subcommands:**

| Subcommand | Alias | Description |
|------------|-------|-------------|
| `exec` | `e` | Run Codex non-interactively |
| `login` | | Manage authentication |
| `logout` | | Remove stored credentials |
| `mcp` | | Manage MCP server configurations |
| `mcp-server` | | Run as MCP server (stdio) |
| `app-server` | | Run app server (JSON-RPC stdio) |
| `resume` | | Resume previous session |
| `apply` | `a` | Apply latest Codex diff to working tree |
| `sandbox` | `debug` | Test sandbox enforcement |
| `cloud` | | Browse Codex Cloud tasks |
| `completion` | | Generate shell completions |
| `features` | | List feature flags |
| Subcommand | Alias | Description | Required Feature |
|------------|-------|-------------|------------------|
| `exec` | `e` | Run Codex non-interactively | (always) |
| `login` | | Manage authentication | `login` |
| `logout` | | Remove stored credentials | `login` |
| `mcp` | | Manage MCP server configurations | `mcp-server` |
| `mcp-server` | | Run as MCP server (stdio) | `mcp-server` |
| `app-server` | | Run app server (JSON-RPC stdio) | `app-server` |
| `resume` | | Resume previous session | (always) |
| `apply` | `a` | Apply latest Codex diff to working tree | `chatgpt` |
| `sandbox` | `debug` | Test sandbox enforcement | (always) |
| `cloud` | | Browse Codex Cloud tasks | `cloud-tasks` |
| `completion` | | Generate shell completions | (always) |
| `features` | | List feature flags | (always) |

**Feature Toggles:**

Expand All @@ -71,6 +66,44 @@ These translate to `-c features.<name>=true/false` config overrides.

### Things to Know

**Cargo Feature Flags (Compile-time):**

The CLI uses Cargo features to enable optional functionality. By default (`default = []`), only core functionality is included (TUI, exec, ACP). Optional features can be enabled individually or via the `full` meta-feature:

| Feature | Dependencies | Enables |
|---------|--------------|---------|
| `full` | All features | Complete legacy binary |
| `app-server` | `codex-app-server` | `app-server` subcommand |
| `cloud-tasks` | `codex-cloud-tasks` | `cloud` subcommand |
| `login` | `codex-login`, `codex-tui/login` | `login`/`logout` subcommands + TUI login |
| `feedback` | `codex-tui/feedback` | Sentry feedback in TUI |
| `backend-client` | `codex-tui/backend-client` | Cloud tasks backend client |
| `upstream-updates` | `codex-tui/upstream-updates` | OpenAI update mechanism (vs Nori's) |
| `mcp-server` | `codex-mcp-server`, `codex-rmcp-client` | `mcp`, `mcp-server` subcommands |
| `chatgpt` | `codex-chatgpt` | `apply` subcommand |
| `responses-api-proxy` | `codex-responses-api-proxy` | `responses-api-proxy` subcommand |
| `oss-providers` | `codex-tui/oss-providers`, `codex-common/oss-providers` | Ollama/LM Studio local model support |

**Feature Propagation to TUI:**

Several CLI features propagate to the TUI crate for coordinated behavior:
- `login` -> `codex-tui/login`: Enables login screens and `/login` command in TUI
- `feedback` -> `codex-tui/feedback`: Enables Sentry feedback and `/feedback` command
- `backend-client` -> `codex-tui/backend-client`: Enables cloud tasks backend
- `upstream-updates` -> `codex-tui/upstream-updates`: Uses OpenAI update system instead of Nori's
- `oss-providers` -> `codex-tui/oss-providers` -> `codex-common/oss-providers`: Enables Ollama/LM Studio local model support

Without these features, the TUI uses Nori-specific alternatives (e.g., GitHub Discussions for feedback, GitHub releases for updates). For OSS providers, the `codex-common` crate provides stub implementations that return `None` or errors when the feature is disabled.

Build examples:
```bash
cargo build -p codex-cli # Minimal (TUI + exec + ACP only, Nori updates)
cargo build -p codex-cli --features full # All functionality (OpenAI-compatible)
cargo build -p codex-cli --features login,mcp-server # Selective
```

Feature-gated code uses `#[cfg(feature = "...")]` on imports, enum variants, match arms, and struct definitions in `main.rs`. Integration tests that require specific features use `required-features` in `Cargo.toml` (e.g., MCP tests require `mcp-server`).

**Sandbox Debugging:**

The `debug_sandbox` module (in `debug_sandbox/`) provides:
Expand Down
1 change: 1 addition & 0 deletions codex-rs/cli/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
pub mod debug_sandbox;
mod exit_status;
#[cfg(feature = "login")]
pub mod login;

use clap::Parser;
Expand Down
Loading
Loading