mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
6471f8b31a
## Why #25156 moved Bazel CI launches into a shared Python wrapper. On Windows, launching Bazel with `os.execvp` can split the spaced `--test_env=PATH=...` argument and fail to propagate the eventual Bazel exit status, allowing jobs to pass without running tests. This reapplies the wrapper after #25909 with a Windows-safe launch path. ## What changed Use a waited `subprocess.run` launch on Windows while preserving `os.execvp` on Unix. Add a process-level regression test for spaced arguments and child exit status, and run it on Windows Bazel shard 1. ## Experiment To confirm Bazel was actually invoking tests, patch `87b61d0be6` temporarily added an intentionally failing `codex-core` unit test. Bazel failed on that sentinel on all three major platforms: - [Linux Bazel test](https://github.com/openai/codex/actions/runs/26841132773/job/79151062486) - [macOS Bazel test](https://github.com/openai/codex/actions/runs/26841132773/job/79151062362) - [Windows Bazel test shard 1/4](https://github.com/openai/codex/actions/runs/26841132773/job/79151062155) The sentinel was removed after collecting this evidence. Windows Bazel [clippy](https://github.com/openai/codex/actions/runs/26841132773/job/79151062914) and [release verification](https://github.com/openai/codex/actions/runs/26841132773/job/79151062739) also passed. ## Validation After removing the sentinel, `just test -p codex-core` no longer reported it. The local run retained two unrelated environment-specific failures.
179 lines
5.7 KiB
Makefile
179 lines
5.7 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}
|
|
|
|
# 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, 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 }} cargo nextest run --no-fail-fast "$@"
|
|
just bench-smoke
|
|
|
|
[windows]
|
|
test *args:
|
|
$env:RUST_MIN_STACK = "{{ rust_min_stack }}"; cargo nextest run --no-fail-fast @($args | Select-Object -Skip 1)
|
|
just bench-smoke
|
|
|
|
# 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)
|
|
|
|
[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
|