mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
da78d5fdc5
## Summary - implement the standalone `codex-code-mode-host` stdio service - route sessions, cells, delegate requests, responses, and cancellation through a bounded host peer - supervise request, writer, cell-forwarding, actor, and V8 failure boundaries - bound request/session tombstones and fail-stop the connection on invalid protocol state - add host-only duplex protocol tests and local Cargo/Bazel run recipes ## Why This stage makes the host process independently runnable and reviewable before exposing any remote client in Codex. Transport or runtime failure closes the connection and relies on process replacement rather than transactional recovery. ## Stack This is **3 of 4** in the process-owned code-mode session stack. - Depends on #30110 - The final client PR targets this branch ## Validation - `just test -p codex-code-mode-host` — 7 host-only tests passed - `just fix -p codex-code-mode-host` - `just bazel-lock-update` - `just bazel-lock-check` - `just fmt`
191 lines
6.2 KiB
Makefile
191 lines
6.2 KiB
Makefile
set working-directory := "codex-rs"
|
|
set positional-arguments
|
|
export JUST_SHELL := justfile_directory() / "scripts/just-shell.py"
|
|
set shell := ["python3", "-c", 'import os, runpy; runpy.run_path(os.environ["JUST_SHELL"], run_name="__main__")']
|
|
set windows-shell := ["python", "-c", 'import os, runpy; runpy.run_path(os.environ["JUST_SHELL"], run_name="__main__")']
|
|
|
|
rust_min_stack := "8388608" # 8 MiB
|
|
python := if os_family() == "windows" { "python" } else { "python3" }
|
|
|
|
# Display help
|
|
help:
|
|
just -l
|
|
|
|
# `codex`
|
|
alias c := codex
|
|
codex *args:
|
|
cargo run --bin codex -- {args}
|
|
|
|
# `codex exec`
|
|
exec *args:
|
|
cargo run --bin codex -- exec {args}
|
|
|
|
# Start `codex exec-server` and run codex-tui.
|
|
[no-cd]
|
|
[positional-arguments]
|
|
[unix]
|
|
tui-with-exec-server *args:
|
|
{{ justfile_directory() }}/scripts/run_tui_with_exec_server.sh "$@"
|
|
|
|
# Run the CLI version of the file-search crate.
|
|
file-search *args:
|
|
cargo run --bin codex-file-search -- {args}
|
|
|
|
# Run the standalone code-mode host from source.
|
|
code-mode-host *args:
|
|
cargo run --bin codex-code-mode-host -- {args}
|
|
|
|
# Build the CLI and run the app-server test client
|
|
app-server-test-client *args:
|
|
cargo build -p codex-cli
|
|
cargo run -p codex-app-server-test-client -- --codex-bin ./target/debug/codex {args}
|
|
|
|
# Format the justfile, Rust, Bazel/Starlark, Python SDK code, and Python scripts.
|
|
fmt:
|
|
@{{ python }} ../scripts/format.py
|
|
|
|
# Check formatting without modifying files.
|
|
fmt-check:
|
|
@{{ python }} ../scripts/format.py --check
|
|
|
|
fix *args:
|
|
cargo clippy --fix --tests --allow-dirty {args}
|
|
|
|
clippy *args:
|
|
cargo clippy --tests {args}
|
|
|
|
[unix]
|
|
install:
|
|
rustup show active-toolchain
|
|
cargo fetch
|
|
|
|
[windows]
|
|
install:
|
|
#!powershell.exe -File
|
|
$pwsh = Get-Command pwsh.exe -ErrorAction SilentlyContinue
|
|
if (-not $pwsh) {
|
|
winget install --exact --id Microsoft.PowerShell --source winget --accept-package-agreements --accept-source-agreements
|
|
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
}
|
|
rustup show active-toolchain
|
|
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
cargo fetch
|
|
exit $LASTEXITCODE
|
|
|
|
# Run nextest with --no-fail-fast so all tests are run.
|
|
#
|
|
# Run `cargo install --locked cargo-nextest` if you don't have it installed.
|
|
# Prefer this for routine local runs. Workspace crate features are banned, so
|
|
# there should be no need to add `--all-features`.
|
|
[unix]
|
|
test *args:
|
|
RUST_MIN_STACK={{ rust_min_stack }} NEXTEST_PROFILE=local cargo nextest run --no-fail-fast "$@"
|
|
|
|
[windows]
|
|
test *args:
|
|
$env:RUST_MIN_STACK = "{{ rust_min_stack }}"; $env:NEXTEST_PROFILE = "local"; cargo nextest run --no-fail-fast @($args | Select-Object -Skip 1)
|
|
|
|
# Run from the repository root so scripts that resolve paths from `cwd` see
|
|
# the same layout they use in GitHub Actions.
|
|
[no-cd]
|
|
test-github-scripts:
|
|
{{ python }} -m unittest discover -s {{ justfile_directory() }}/.github/scripts -p 'test_*.py'
|
|
|
|
# Run explicit workspace benchmark targets.
|
|
bench *args:
|
|
cargo bench --workspace --bench '*' {args}
|
|
|
|
# Run benchmark targets once to ensure they start successfully.
|
|
bench-smoke:
|
|
just bench -- --test
|
|
|
|
# Build and run Codex from source using Bazel.
|
|
# On Unix, use `[no-cd]` and `--run_under="cd $PWD &&"` to ensure Bazel runs
|
|
# the command in the current working directory.
|
|
[no-cd]
|
|
[unix]
|
|
bazel-codex *args:
|
|
bazel run //codex-rs/cli:codex --run_under="cd $PWD &&" -- "$@"
|
|
|
|
[windows]
|
|
bazel-codex *args:
|
|
bazel run //codex-rs/cli:codex --run_under='cd /d "{{ invocation_directory_native() }}" &&' -- @($args | Select-Object -Skip 1)
|
|
|
|
# Build and run the standalone code-mode host from source using Bazel.
|
|
[no-cd]
|
|
[unix]
|
|
bazel-code-mode-host *args:
|
|
bazel run //codex-rs/code-mode-host:codex-code-mode-host --run_under="cd $PWD &&" -- "$@"
|
|
|
|
[windows]
|
|
bazel-code-mode-host *args:
|
|
bazel run //codex-rs/code-mode-host:codex-code-mode-host --run_under='cd /d "{{ invocation_directory_native() }}" &&' -- @($args | Select-Object -Skip 1)
|
|
|
|
[no-cd]
|
|
bazel-lock-update:
|
|
bazel mod deps --lockfile_mode=update
|
|
|
|
[no-cd]
|
|
[unix]
|
|
bazel-lock-check:
|
|
{{ justfile_directory() }}/scripts/check-module-bazel-lock.sh
|
|
|
|
[windows]
|
|
bazel-lock-check:
|
|
bazel mod deps --lockfile_mode=error; if ($LASTEXITCODE -ne 0) { Write-Error "MODULE.bazel.lock is out of date. Run 'just bazel-lock-update' and commit the updated lockfile."; exit 1 }
|
|
|
|
bazel-test:
|
|
bazel test --test_tag_filters=-argument-comment-lint //... --keep_going
|
|
|
|
[no-cd]
|
|
[unix]
|
|
bazel-clippy:
|
|
bazel_targets="$({{ justfile_directory() }}/scripts/list-bazel-clippy-targets.sh)" && bazel build --config=clippy -- ${bazel_targets}
|
|
|
|
[no-cd]
|
|
[unix]
|
|
bazel-argument-comment-lint:
|
|
bazel build --config=argument-comment-lint -- $({{ justfile_directory() }}/tools/argument-comment-lint/list-bazel-targets.sh)
|
|
|
|
build-for-release:
|
|
bazel build //codex-rs/cli:release_binaries
|
|
|
|
# Run the MCP server
|
|
mcp-server-run *args:
|
|
cargo run -p codex-mcp-server -- {args}
|
|
|
|
# Regenerate the json schema for config.toml from the current config types.
|
|
write-config-schema:
|
|
cargo run -p codex-core --bin codex-write-config-schema
|
|
|
|
# Regenerate vendored app-server protocol schema artifacts.
|
|
write-app-server-schema *args:
|
|
cargo run -p codex-app-server-protocol --bin write_schema_fixtures -- {args}
|
|
|
|
[no-cd]
|
|
write-hooks-schema:
|
|
cargo run --manifest-path {{ justfile_directory() }}/codex-rs/Cargo.toml -p codex-hooks --bin write_hooks_schema_fixtures
|
|
|
|
# Run the argument-comment Dylint checks across codex-rs.
|
|
[no-cd]
|
|
[unix]
|
|
argument-comment-lint *args:
|
|
if [ "$#" -eq 0 ]; then \
|
|
bazel build --config=argument-comment-lint -- $({{ justfile_directory() }}/tools/argument-comment-lint/list-bazel-targets.sh); \
|
|
else \
|
|
{{ justfile_directory() }}/tools/argument-comment-lint/run-prebuilt-linter.py "$@"; \
|
|
fi
|
|
|
|
[no-cd]
|
|
argument-comment-lint-from-source *args:
|
|
{{ python }} {{ justfile_directory() }}/tools/argument-comment-lint/run.py {args}
|
|
|
|
# Tail logs from the state SQLite database
|
|
[unix]
|
|
log *args:
|
|
if [ "${1:-}" = "--" ]; then shift; fi; cargo run -p codex-state --bin logs_client -- "$@"
|
|
|
|
[windows]
|
|
log *args:
|
|
$forwarded_args = @($args | Select-Object -Skip 1); if ($forwarded_args.Count -gt 0 -and $forwarded_args[0] -eq "--") { $forwarded_args = @($forwarded_args | Select-Object -Skip 1) }; cargo run -p codex-state --bin logs_client -- @forwarded_args
|