coder-eval 0.8.6__tar.gz → 0.8.7rc11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/release.yml +119 -23
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/PKG-INFO +4 -4
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/pyproject.toml +19 -12
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/__init__.py +1 -1
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/codex_agent.py +184 -27
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/skill_triggered.py +9 -9
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/mock_agent.py +6 -1
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/text_stub_agent.py +5 -1
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_codex_agent.py +452 -61
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_early_stop.py +8 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_simulation_integration.py +5 -1
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_skill_triggered.py +16 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/uv.lock +33 -33
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-code-review-full.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-code-review-wf.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-code-review.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-create-plan.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-implement-plan.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-review.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-run-analysis.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-task-create.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/harness-candidates.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/shared/axes.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/shared/multi-model-review.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/shared/review-rubric.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/shared/run-layout.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/workflows/cr-axis.js +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/workflows/cr-parent.js +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.env.example +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/CODEOWNERS +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/code_review.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/dependabot.yml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/claude-pr-review.yml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/codeql.yml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/conventional-commits.yml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/docker-publish.yml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/pr-checks.yml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/publish-testpypi.yml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.gitignore +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.pre-commit-config.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.python-version +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/CHANGELOG.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/CLAUDE.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/CODE_OF_CONDUCT.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/CONTRIBUTING.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/LICENSE +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/Makefile +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/NOTICE +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/README.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/SECURITY.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docker/Dockerfile +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docker/Dockerfile.runtime +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docker/coder_eval_entrypoint.sh +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docker/coder_eval_runtime_entrypoint.sh +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/AB_EXPERIMENTS.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/BYOD.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/CODEX_AGENT_GUIDE.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/DOCKER_ISOLATION.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/IDEAS.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/TASK_DEFINITION_GUIDE.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/USER_GUIDE.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/assets/hero.gif +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/01-first-evaluation.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/02-ci-pipeline.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/03-evalboard-local.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/04-writing-a-task.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/05-comparing-models.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/06-use-docker-isolation.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/README.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/.gitignore +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/README.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/col-help.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/collapsible-rail.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/harness-badge.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/scroll-table.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/search-box.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/unit-toggle.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/version-list.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/window-selector.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_overview/daily-chart.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_overview/tag-rail.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_overview/window-summary.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/api/download/route.ts +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/api/file/route.ts +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/api/refresh/route.ts +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/error.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/globals.css +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/icon.png +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/layout.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/page.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/path-to-ga/page.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/trends/actions.ts +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/trends/page.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/trends/trends-view.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/watchlist/page.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/next-env.d.ts +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/next.config.mjs +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/package.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/pnpm-lock.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/postcss.config.mjs +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/public/harness/antigravity.png +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/public/harness/claude-code.png +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/public/harness/codex.png +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/public/uipath.png +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/tailwind.config.ts +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/tsconfig.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/vitest.config.ts +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/vitest.setup.ts +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/default.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/early-stop-ab.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/model-comparison.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/permissions-smoke.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/plugin-comparison.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/prompt-mutations-example.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/smoke_variants.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/osv-scanner.toml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/.gitattributes +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agent.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/_logging.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/antigravity_agent.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/claude_code_agent.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/noop_agent.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/registry.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/watchdog.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/analysis.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/aggregate_command.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/console.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/evaluate_command.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/plan_command.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/report_command.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/run_command.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/run_helpers.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/run_task_internal_command.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/utils.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/config.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/agent_judge.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/base.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/classification_match.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/command_executed.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/commands_efficiency.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/file_check.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/file_contains.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/file_exists.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/file_matches_regex.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/json_check.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/llm_judge.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/reference_comparison.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/run_command.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/uipath_eval.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/agent.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/budget.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/categories.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/categorization.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/executor.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/judge.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/retry.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/timeout.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/checker.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_context.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_models.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_persistence.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_usage.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/sub_agent.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/summaries.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/verdict_tool.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/formatting.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/isolation/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/isolation/docker_runner.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/logging_config.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/agent_config.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/container_paths.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/criteria.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/enums.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/experiment.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/judge.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/judge_defaults.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/limits.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/merge_strategy.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/mutations.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/results.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/routing.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/sandbox.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/tasks.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/telemetry.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/templates.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/batch.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/config.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/config_merge.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/early_stop.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/evaluation.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/experiment.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/overrides.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/task_loader.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestrator.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/path_utils.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/plugins.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/pricing.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/py.typed +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/reports.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/reports_experiment.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/reports_html.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/reports_stats.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/resources/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/resources/tags.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/sandbox.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/ast_similarity.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/complexity.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/quality.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/signature_similarity.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/similarity.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/token_similarity.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/simulation/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/simulation/termination.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/simulation/user_simulator.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/callbacks.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/collector.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/events.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/renderers.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/wire.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/telemetry.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/utils.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/README.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agentless_smoke_test.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/antigravity_hello_world.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/claude_hello_world.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/claude_hello_world_docker.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/claude_subagent_test.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_hello_world.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_parallel_commands.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_skills_test.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_string_utils.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_subagent_test.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/subagent_bash_long_input.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/subagent_merge_sort.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/byod_smoke_test.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dataset_example.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/datasets/sentiment.jsonl +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/environment/input.txt +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/fibonacci_with_template.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/hello_date.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/inline_starter_example.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/internal/session_resumption.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_smoke.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/README.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/sentiment_classification.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_agent_judge.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_budget_exceeded.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_llm_judge.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_negative_path.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_task_timeout.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_variants.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/test_sandbox.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/token_check.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/templates/byod_smoke_test/Dockerfile +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/templates/fibonacci-starter/README.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/templates/fibonacci-starter/src/main.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/templates/fibonacci-starter/tests/test_main.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/_scrub.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/run_full.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_path_helpers.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/conftest.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/__init__.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/base.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce025_live_verdict_consistency.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_agent_timing_access.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_silent_except.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_submodule_model_imports.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/open_explicit_encoding.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/register_criterion_required.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/runner.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/violation.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_config_no_timing_fields.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_config_optional_type.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_config_registry_dispatch.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_config_sdk_decoupling.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_golden_master.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_judge_criterion.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_telemetry.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_telemetry_advanced.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_timeout.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agentless.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_aggregate.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_antigravity_agent.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_byoa_plugin.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_byoa_plugin_live.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_byod_feature.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_checker_logging.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_classification_match.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_claude_settings_enforcement_live.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cleanup_preservation_guard.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_backend_flag.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_empty_glob.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_sdk_options.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_set_overrides.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_telemetry.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_type_flag.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_code_review_bugs.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_codex_agent_live.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_codex_agent_unit.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_codex_token_mapping.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_command_executed.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_command_statistics.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_command_telemetry_result_data.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_commands_efficiency.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_config_lineage.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_config_merge_engine.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_config_precedence.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_continuous_scoring.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_criterion_result_round_trip.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_custom_lint.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_dataset_expansion.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_debug_logging.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_build_failure.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_runner_container_death.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_runner_mounts.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_runner_stream_limit.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_wildcard_env.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_workdir_live.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_driver_resolver.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_error_handling.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_evaluate_command.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_evaluator.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_event_collector.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_cli.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_loader.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_models.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_reports.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_resolver.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_runner.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_file_check.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_file_contains_scoring.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_formatting.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_git_clone_failure.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_heartbeat_watchdog.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_ignore_patterns_negation.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_image_from_dockerfiles.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_integration.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_json_check.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_anthropic.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_bedrock.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_burn_in_live.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_context_builder.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_models.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_persistence.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_lint_no_top_level_run_limits.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_lint_runner.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_llm_judge_criterion.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_log_tail_buffer.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_logging.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_logging_isolation.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_merge_characterization.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_merge_strategy_annotations.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_merge_unification.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_models.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_mutations.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_new_criteria.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_node_env_config.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_optional_dependencies.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_orchestrator.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_orchestrator_error_log_tail.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_orchestrator_telemetry.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_overrides_engine.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_parallel.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_path_utils.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_plan_command.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_plugin_processing.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_plugins.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_post_run.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_pr_review_workflow.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_pre_run.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_preservation_mode.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_pricing_registry.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reference_comparison_scoring.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reference_evaluator.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reference_missing_file.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reference_models.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reference_orchestrator.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_registry.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_replicate_stats.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_report_command.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reports.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reports_experiment.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reports_html.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reports_stats.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_resolve_task_files.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_resume.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_retry_logic_comprehensive.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_routing.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_run_command_stdout.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_run_limits_models.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_run_limits_orchestrator.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_run_limits_resolver.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_runtime_tool_versions.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox_layer_builder.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox_optional.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox_security.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox_symlink_preservation.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox_templates.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_scorers.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_scoring_quality.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sdk_option_classification.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_simulation_config.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_simulation_termination.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_simulation_trials.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_agent_integration.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_batch.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_callbacks.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_cli.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_events.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_orchestrator.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_renderers.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_wire.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sub_agent_runner.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_success_criterion_union.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_suite_rollup.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_summaries.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_tags.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_task_definition_unknown_fields.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_teardown_interrupt.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_telemetry.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_template_env_expansion.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_threshold_enforcement.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_timeout_batch.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_timeout_categorization.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_timeout_exceptions.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_timeout_models.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_timeout_orchestrator.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_token_usage.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_uipath_eval.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_user_simulator.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_utils.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_utterance_extraction.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_variant_prompt_file.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_verdict_tool.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_watchdog.py +0 -0
- {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_yaml_migration.py +0 -0
|
@@ -13,6 +13,13 @@ name: Release
|
|
|
13
13
|
# and push.
|
|
14
14
|
# (Continuous :latest / :sha- agent images still publish on every main push via
|
|
15
15
|
# docker-publish.yml -- only the versioned release artifacts gate on this run.)
|
|
16
|
+
#
|
|
17
|
+
# PRERELEASE mode (dispatched from a NON-main branch): instead of bumping and
|
|
18
|
+
# pushing main, stamp a throwaway `<next-patch>rc<run#>` version, then build and
|
|
19
|
+
# publish the wheel to public PyPI + a `:<version>` GHCR image. It does NOT move
|
|
20
|
+
# `:latest`, tag, commit, or push to main. This lets a branch be dry-run on the
|
|
21
|
+
# ADO nightly infra before merge (pinned via the pipeline's `coderEvalVersion`).
|
|
22
|
+
# The `bump` input is ignored off main. On `main` the behavior is unchanged.
|
|
16
23
|
|
|
17
24
|
on:
|
|
18
25
|
workflow_dispatch:
|
|
@@ -47,9 +54,9 @@ jobs:
|
|
|
47
54
|
runs-on: ubuntu-latest
|
|
48
55
|
timeout-minutes: 15
|
|
49
56
|
outputs:
|
|
50
|
-
# Exposed so the downstream publish-pypi job
|
|
51
|
-
#
|
|
52
|
-
version: ${{ steps.
|
|
57
|
+
# Exposed so the downstream publish-pypi job gates on a version having been
|
|
58
|
+
# produced (real release on main, or a stamped prerelease on a branch).
|
|
59
|
+
version: ${{ steps.ver.outputs.version }}
|
|
53
60
|
env:
|
|
54
61
|
# The self-hosted `uipath-ubuntu-latest` runners enforce a minimum
|
|
55
62
|
# package-age safe-chain check on uv installs; on GitHub-hosted runners
|
|
@@ -58,8 +65,13 @@ jobs:
|
|
|
58
65
|
SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS: "openai-codex-cli-bin,openai-codex"
|
|
59
66
|
|
|
60
67
|
steps:
|
|
68
|
+
# Only a real release (main) needs the app token: semantic-release pushes the
|
|
69
|
+
# bump commit + tag to the ruleset-protected main branch, and only this app
|
|
70
|
+
# has the bypass. A prerelease from a branch never commits or pushes, so it
|
|
71
|
+
# skips the token and checks out with the default GITHUB_TOKEN.
|
|
61
72
|
- name: Mint release app token
|
|
62
73
|
id: app-token
|
|
74
|
+
if: github.ref == 'refs/heads/main'
|
|
63
75
|
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
|
|
64
76
|
with:
|
|
65
77
|
app-id: ${{ secrets.RELEASE_APP_ID }}
|
|
@@ -70,8 +82,9 @@ jobs:
|
|
|
70
82
|
with:
|
|
71
83
|
fetch-depth: 0 # semantic-release needs full history for tags + changelog
|
|
72
84
|
# Persisted in .git config so semantic-release's push to main is
|
|
73
|
-
# authenticated as the app (which bypasses the branch ruleset).
|
|
74
|
-
token
|
|
85
|
+
# authenticated as the app (which bypasses the branch ruleset). Falls back
|
|
86
|
+
# to the default token for a prerelease (no push, read-only checkout).
|
|
87
|
+
token: ${{ steps.app-token.outputs.token || github.token }}
|
|
75
88
|
|
|
76
89
|
- name: Set up Python 3.13
|
|
77
90
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
@@ -83,11 +96,38 @@ jobs:
|
|
|
83
96
|
with:
|
|
84
97
|
enable-cache: true
|
|
85
98
|
|
|
99
|
+
# Release mode is chosen by the dispatched ref: main => real release (the
|
|
100
|
+
# semantic-release path below); any other branch => prerelease (stamp a
|
|
101
|
+
# throwaway rc version, publish, never touch main). Keying off the ref (not a
|
|
102
|
+
# new input) keeps this dispatchable from a branch — a new input would have to
|
|
103
|
+
# exist on the default branch first to be accepted.
|
|
104
|
+
- name: Determine release mode
|
|
105
|
+
id: mode
|
|
106
|
+
env:
|
|
107
|
+
REF: ${{ github.ref }}
|
|
108
|
+
RUN_NUMBER: ${{ github.run_number }}
|
|
109
|
+
run: |
|
|
110
|
+
set -euo pipefail
|
|
111
|
+
if [ "$REF" = "refs/heads/main" ]; then
|
|
112
|
+
echo "prerelease=false" >> "$GITHUB_OUTPUT"
|
|
113
|
+
echo "Mode: RELEASE (main)"
|
|
114
|
+
else
|
|
115
|
+
# Next patch of the current version, suffixed with the run number so
|
|
116
|
+
# repeated dispatches never collide on PyPI. An exact `==` pin installs
|
|
117
|
+
# it even though pip/uv skip prereleases by default.
|
|
118
|
+
NEXT=$(python3 -c 'import re,tomllib; v=tomllib.load(open("pyproject.toml","rb"))["project"]["version"]; m=re.match(r"(\d+)\.(\d+)\.(\d+)",v); print("{}.{}.{}".format(int(m[1]),int(m[2]),int(m[3])+1))')
|
|
119
|
+
PRE="${NEXT}rc${RUN_NUMBER}"
|
|
120
|
+
echo "prerelease=true" >> "$GITHUB_OUTPUT"
|
|
121
|
+
echo "version=${PRE}" >> "$GITHUB_OUTPUT"
|
|
122
|
+
echo "Mode: PRERELEASE ${PRE}"
|
|
123
|
+
fi
|
|
124
|
+
|
|
86
125
|
- name: Install build + release tools
|
|
87
126
|
run: uv tool install python-semantic-release && uv tool install twine
|
|
88
127
|
|
|
89
128
|
- name: Run semantic-release (bump + tag, no push yet)
|
|
90
129
|
id: release
|
|
130
|
+
if: steps.mode.outputs.prerelease != 'true'
|
|
91
131
|
env:
|
|
92
132
|
GH_TOKEN: ${{ steps.app-token.outputs.token }}
|
|
93
133
|
# Passed via env (not interpolated into the script) per GitHub's
|
|
@@ -105,8 +145,45 @@ jobs:
|
|
|
105
145
|
# A dispatch always cuts a release; report the just-published version.
|
|
106
146
|
echo "version=$($PSR version --print)" >> "$GITHUB_OUTPUT"
|
|
107
147
|
|
|
148
|
+
# PRERELEASE: stamp the rc version into the two canonical spots (mirrors
|
|
149
|
+
# publish-testpypi.yml), then refresh uv.lock so the Dockerfile's
|
|
150
|
+
# `uv export --frozen` accepts the bumped project version. No commit is made —
|
|
151
|
+
# the working tree is what `uv build` and the image build below consume.
|
|
152
|
+
- name: Stamp prerelease version
|
|
153
|
+
if: steps.mode.outputs.prerelease == 'true'
|
|
154
|
+
env:
|
|
155
|
+
PRE_VERSION: ${{ steps.mode.outputs.version }}
|
|
156
|
+
run: |
|
|
157
|
+
set -euo pipefail
|
|
158
|
+
python3 - <<'PY'
|
|
159
|
+
import os, re, pathlib
|
|
160
|
+
version = os.environ["PRE_VERSION"]
|
|
161
|
+
for path, key in (("pyproject.toml", "version"), ("src/coder_eval/__init__.py", "__version__")):
|
|
162
|
+
p = pathlib.Path(path)
|
|
163
|
+
new, n = re.subn(rf'(?m)^{key}\s*=\s*".+?"$', f'{key} = "{version}"', p.read_text(), count=1)
|
|
164
|
+
if n != 1:
|
|
165
|
+
raise SystemExit(f"version pattern did not match {path} (matched {n})")
|
|
166
|
+
p.write_text(new)
|
|
167
|
+
print(f"Stamped prerelease version: {version}")
|
|
168
|
+
PY
|
|
169
|
+
uv lock
|
|
170
|
+
|
|
171
|
+
# Single source of truth for the steps below: the real release version (main)
|
|
172
|
+
# or the stamped prerelease version (branch).
|
|
173
|
+
- name: Resolve published version
|
|
174
|
+
id: ver
|
|
175
|
+
env:
|
|
176
|
+
REL: ${{ steps.release.outputs.version }}
|
|
177
|
+
PRE: ${{ steps.mode.outputs.version }}
|
|
178
|
+
run: |
|
|
179
|
+
set -euo pipefail
|
|
180
|
+
V="${REL:-$PRE}"
|
|
181
|
+
if [ -z "$V" ]; then echo "no version resolved" >&2; exit 1; fi
|
|
182
|
+
echo "version=$V" >> "$GITHUB_OUTPUT"
|
|
183
|
+
echo "Publishing version: $V"
|
|
184
|
+
|
|
108
185
|
- name: Regenerate uv.lock and amend release commit
|
|
109
|
-
if: steps.release.outputs.version != ''
|
|
186
|
+
if: steps.mode.outputs.prerelease != 'true' && steps.release.outputs.version != ''
|
|
110
187
|
run: |
|
|
111
188
|
uv lock
|
|
112
189
|
if ! git diff --quiet uv.lock; then
|
|
@@ -119,43 +196,64 @@ jobs:
|
|
|
119
196
|
fi
|
|
120
197
|
|
|
121
198
|
- name: Push release commit and tags
|
|
122
|
-
if: steps.release.outputs.version != ''
|
|
199
|
+
if: steps.mode.outputs.prerelease != 'true' && steps.release.outputs.version != ''
|
|
123
200
|
run: git push origin main "v${{ steps.release.outputs.version }}"
|
|
124
201
|
|
|
125
202
|
- name: Build wheel + sdist
|
|
126
|
-
if: steps.
|
|
203
|
+
if: steps.ver.outputs.version != ''
|
|
127
204
|
run: uv build
|
|
128
205
|
|
|
129
206
|
# Hand the exact built artifacts to the publish-pypi job. Publishing to
|
|
130
207
|
# public PyPI runs in its own environment-gated job (OIDC), so it must
|
|
131
208
|
# consume these files rather than rebuild them.
|
|
132
209
|
- name: Upload dist for PyPI publish
|
|
133
|
-
if: steps.
|
|
210
|
+
if: steps.ver.outputs.version != ''
|
|
134
211
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
135
212
|
with:
|
|
136
213
|
name: release-dist
|
|
137
214
|
path: dist/
|
|
138
215
|
if-no-files-found: error
|
|
139
216
|
|
|
140
|
-
# Build + push the agent image HERE, in the same job that
|
|
141
|
-
# so the `:<version>` tag is built from the
|
|
142
|
-
#
|
|
143
|
-
# runs on the triggering commit, BEFORE
|
|
144
|
-
# release version -- this is the authoritative versioned
|
|
145
|
-
# repoints `:latest
|
|
217
|
+
# Build + push the agent image HERE, in the same job that produced the
|
|
218
|
+
# version, so the `:<version>` tag is built from the correct pyproject (bumped
|
|
219
|
+
# by semantic-release on main, or the stamped rc on a prerelease).
|
|
220
|
+
# docker-publish.yml runs on the triggering commit, BEFORE a main bump, so it
|
|
221
|
+
# can never tag the release version -- this is the authoritative versioned
|
|
222
|
+
# image. A real release also repoints `:latest`; a prerelease publishes only
|
|
223
|
+
# its `:<version>` tag (see Compute image tags).
|
|
146
224
|
- name: Lowercase owner for GHCR
|
|
147
|
-
if: steps.
|
|
225
|
+
if: steps.ver.outputs.version != ''
|
|
148
226
|
id: img
|
|
149
227
|
run: echo "owner_lc=$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_OUTPUT"
|
|
150
228
|
|
|
229
|
+
# `:<version>` always; `:latest` only for a real release. A prerelease must
|
|
230
|
+
# not move `:latest`, which the nightly treats as tip-of-main.
|
|
231
|
+
- name: Compute image tags
|
|
232
|
+
if: steps.ver.outputs.version != ''
|
|
233
|
+
id: tags
|
|
234
|
+
env:
|
|
235
|
+
OWNER: ${{ steps.img.outputs.owner_lc }}
|
|
236
|
+
VERSION: ${{ steps.ver.outputs.version }}
|
|
237
|
+
IS_PRERELEASE: ${{ steps.mode.outputs.prerelease }}
|
|
238
|
+
run: |
|
|
239
|
+
set -euo pipefail
|
|
240
|
+
{
|
|
241
|
+
echo "tags<<EOF"
|
|
242
|
+
echo "ghcr.io/${OWNER}/coder-eval-agent:${VERSION}"
|
|
243
|
+
if [ "$IS_PRERELEASE" != "true" ]; then
|
|
244
|
+
echo "ghcr.io/${OWNER}/coder-eval-agent:latest"
|
|
245
|
+
fi
|
|
246
|
+
echo "EOF"
|
|
247
|
+
} >> "$GITHUB_OUTPUT"
|
|
248
|
+
|
|
151
249
|
- name: Set up Docker Buildx
|
|
152
250
|
continue-on-error: true # GHCR image is internal/best-effort; don't block PyPI
|
|
153
|
-
if: steps.
|
|
251
|
+
if: steps.ver.outputs.version != ''
|
|
154
252
|
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
|
155
253
|
|
|
156
254
|
- name: Log in to GHCR
|
|
157
255
|
continue-on-error: true # GHCR image is internal/best-effort; don't block PyPI
|
|
158
|
-
if: steps.
|
|
256
|
+
if: steps.ver.outputs.version != ''
|
|
159
257
|
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
|
|
160
258
|
with:
|
|
161
259
|
registry: ghcr.io
|
|
@@ -164,17 +262,15 @@ jobs:
|
|
|
164
262
|
|
|
165
263
|
- name: Build and push versioned agent image
|
|
166
264
|
continue-on-error: true # GHCR image is internal/best-effort; don't block PyPI
|
|
167
|
-
if: steps.
|
|
265
|
+
if: steps.ver.outputs.version != ''
|
|
168
266
|
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
|
|
169
267
|
with:
|
|
170
268
|
context: .
|
|
171
269
|
file: docker/Dockerfile
|
|
172
270
|
push: true
|
|
173
|
-
tags:
|
|
174
|
-
ghcr.io/${{ steps.img.outputs.owner_lc }}/coder-eval-agent:${{ steps.release.outputs.version }}
|
|
175
|
-
ghcr.io/${{ steps.img.outputs.owner_lc }}/coder-eval-agent:latest
|
|
271
|
+
tags: ${{ steps.tags.outputs.tags }}
|
|
176
272
|
build-args: |
|
|
177
|
-
CODER_EVAL_VERSION=${{ steps.
|
|
273
|
+
CODER_EVAL_VERSION=${{ steps.ver.outputs.version }}
|
|
178
274
|
secrets: |
|
|
179
275
|
"uv_index_username=${{ secrets.UV_INDEX_UIPATH_USERNAME }}"
|
|
180
276
|
"uv_index_password=${{ secrets.UV_INDEX_UIPATH_PASSWORD }}"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coder-eval
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.7rc11
|
|
4
4
|
Summary: Evaluate, benchmark, and A/B-test AI coding agents (Claude Code, Codex, Gemini/Antigravity) with sandboxed, reproducible YAML task suites.
|
|
5
5
|
Project-URL: Homepage, https://github.com/UiPath/coder_eval
|
|
6
6
|
Project-URL: Repository, https://github.com/UiPath/coder_eval
|
|
@@ -26,7 +26,7 @@ Requires-Python: >=3.13
|
|
|
26
26
|
Requires-Dist: anthropic>=0.86.0
|
|
27
27
|
Requires-Dist: anyio>=4.13.0
|
|
28
28
|
Requires-Dist: azure-monitor-opentelemetry-exporter<1.1.0,>=1.0.0b30
|
|
29
|
-
Requires-Dist: claude-agent-sdk>=0.2.
|
|
29
|
+
Requires-Dist: claude-agent-sdk>=0.2.124
|
|
30
30
|
Requires-Dist: click>=8.3.3
|
|
31
31
|
Requires-Dist: jmespath>=1.1.0
|
|
32
32
|
Requires-Dist: jsonschema>=4.26.0
|
|
@@ -41,9 +41,9 @@ Requires-Dist: starlette>=1.3.1
|
|
|
41
41
|
Requires-Dist: tqdm>=4.67.3
|
|
42
42
|
Requires-Dist: typer>=0.24.1
|
|
43
43
|
Provides-Extra: antigravity
|
|
44
|
-
Requires-Dist: google-antigravity==0.1.
|
|
44
|
+
Requires-Dist: google-antigravity==0.1.7; extra == 'antigravity'
|
|
45
45
|
Provides-Extra: codex
|
|
46
|
-
Requires-Dist: openai-codex>=0.
|
|
46
|
+
Requires-Dist: openai-codex>=0.144.4; extra == 'codex'
|
|
47
47
|
Provides-Extra: dev
|
|
48
48
|
Requires-Dist: bandit[toml]>=1.9.4; extra == 'dev'
|
|
49
49
|
Requires-Dist: mcp>=1.28.1; extra == 'dev'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "coder-eval"
|
|
3
|
-
version = "0.8.
|
|
3
|
+
version = "0.8.7rc11"
|
|
4
4
|
description = "Evaluate, benchmark, and A/B-test AI coding agents (Claude Code, Codex, Gemini/Antigravity) with sandboxed, reproducible YAML task suites."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -34,7 +34,7 @@ dependencies = [
|
|
|
34
34
|
"rich>=14.3.3",
|
|
35
35
|
"python-dotenv>=1.2.2",
|
|
36
36
|
"anthropic>=0.86.0",
|
|
37
|
-
"claude-agent-sdk>=0.2.
|
|
37
|
+
"claude-agent-sdk>=0.2.124",
|
|
38
38
|
"anyio>=4.13.0",
|
|
39
39
|
"radon>=6.0.1",
|
|
40
40
|
"tqdm>=4.67.3",
|
|
@@ -85,19 +85,24 @@ uipath = [
|
|
|
85
85
|
# Without this extra, the framework still installs and runs; Codex-dependent
|
|
86
86
|
# code paths fail at dispatch with a clear hint pointing back here.
|
|
87
87
|
codex = [
|
|
88
|
-
"openai-codex>=0.
|
|
88
|
+
"openai-codex>=0.144.4",
|
|
89
89
|
]
|
|
90
90
|
# Optional extra that enables Antigravity agent support:
|
|
91
91
|
# - AntigravityAgent implementation using Google's official google-antigravity SDK
|
|
92
92
|
# (drives the bundled `localharness` binary, authenticated via GEMINI_API_KEY).
|
|
93
93
|
# Pinned exactly: the harness binary is a dominant non-model driver of eval results,
|
|
94
94
|
# so it travels with the coder_eval release tag and is bumped deliberately (mirrors
|
|
95
|
-
# the claude-code CLI / codex cli-bin pins).
|
|
96
|
-
#
|
|
95
|
+
# the claude-code CLI / codex cli-bin pins).
|
|
96
|
+
# glibc note — verify before bumping: the wheel's manylinux_2_17 tag is NOT a
|
|
97
|
+
# reliable floor; the bundled `localharness` ELF can require a newer glibc than the
|
|
98
|
+
# tag advertises. Eval agents run on Ubuntu 22.04 (glibc 2.35), so the pinned build
|
|
99
|
+
# must load there. 0.1.7 links without DT_RELR (max required symbol GLIBC_2.26) and
|
|
100
|
+
# loads on 2.35+; confirm any future pin does too (readelf -d | grep RELR must be
|
|
101
|
+
# empty / max GLIBC symbol <= the oldest target's glibc).
|
|
97
102
|
# Without this extra the framework still installs and runs; Antigravity-dependent
|
|
98
103
|
# code paths fail at start() with a clear hint pointing back here.
|
|
99
104
|
antigravity = [
|
|
100
|
-
"google-antigravity==0.1.
|
|
105
|
+
"google-antigravity==0.1.7",
|
|
101
106
|
]
|
|
102
107
|
|
|
103
108
|
[project.scripts]
|
|
@@ -129,12 +134,14 @@ packages = ["src/coder_eval"]
|
|
|
129
134
|
allow-direct-references = true
|
|
130
135
|
|
|
131
136
|
[tool.uv]
|
|
132
|
-
# openai-codex 0.
|
|
133
|
-
#
|
|
134
|
-
#
|
|
135
|
-
#
|
|
136
|
-
#
|
|
137
|
-
|
|
137
|
+
# openai-codex 0.144.4 hardpins `openai-codex-cli-bin==0.144.4` (a stable
|
|
138
|
+
# release; the SDK version now tracks the codex CLI version line). Naming it
|
|
139
|
+
# here documents and holds the pinned cli-bin build — the harness binary is a
|
|
140
|
+
# dominant non-model driver of eval results, so it travels with the coder_eval
|
|
141
|
+
# release tag and is bumped deliberately (mirrors the antigravity localharness
|
|
142
|
+
# and claude-code CLI pins). 0.144.4 publishes manylinux wheels (x86_64 +
|
|
143
|
+
# aarch64), so CI/Linux installs work.
|
|
144
|
+
override-dependencies = ["openai-codex-cli-bin==0.144.4"]
|
|
138
145
|
|
|
139
146
|
constraint-dependencies = [
|
|
140
147
|
# Fix known CVEs in transitive dependencies
|
|
@@ -5,7 +5,9 @@ import contextlib
|
|
|
5
5
|
import json
|
|
6
6
|
import logging
|
|
7
7
|
import os
|
|
8
|
+
import shlex
|
|
8
9
|
import shutil
|
|
10
|
+
import tempfile
|
|
9
11
|
import time
|
|
10
12
|
from collections.abc import Callable
|
|
11
13
|
from datetime import datetime
|
|
@@ -65,14 +67,6 @@ _CLAUDE_TO_CODEX_TOOL_MAP: dict[str, str] = {
|
|
|
65
67
|
"Glob": "shell",
|
|
66
68
|
}
|
|
67
69
|
|
|
68
|
-
# Permission mode → sandbox mode mapping
|
|
69
|
-
_PERMISSION_MODE_TO_SANDBOX: dict[str, str] = {
|
|
70
|
-
"bypassPermissions": "full-access",
|
|
71
|
-
"acceptEdits": "workspace-write",
|
|
72
|
-
"default": "workspace-write",
|
|
73
|
-
"plan": "read-only",
|
|
74
|
-
}
|
|
75
|
-
|
|
76
70
|
# Approval mode — the SAME for every permission mode (no per-mode mapping).
|
|
77
71
|
#
|
|
78
72
|
# The Codex SDK exposes exactly two approval modes:
|
|
@@ -88,9 +82,9 @@ _PERMISSION_MODE_TO_SANDBOX: dict[str, str] = {
|
|
|
88
82
|
# escalations BEYOND the sandbox are refused.
|
|
89
83
|
#
|
|
90
84
|
# An eval harness never wants a reviewer that can flake, so EVERY permission mode
|
|
91
|
-
# uses deny_all. The trust boundary is
|
|
92
|
-
#
|
|
93
|
-
# full-access (
|
|
85
|
+
# uses deny_all. The trust boundary is coder_eval's per-run sandbox — a docker
|
|
86
|
+
# container or an ephemeral tempdir — NOT Codex's in-process OS sandbox, which
|
|
87
|
+
# _build_thread_options always drops to full-access (rationale there).
|
|
94
88
|
_CODEX_APPROVAL_MODE = "deny_all"
|
|
95
89
|
|
|
96
90
|
# Provider id registered in thread config when CODEX_BASE_URL routes to a
|
|
@@ -215,6 +209,17 @@ def _message_uncached_input(m: AssistantMessage) -> int:
|
|
|
215
209
|
# supported"), so this is a fixed constant, not an operator knob.
|
|
216
210
|
_CODEX_WIRE_API = "responses"
|
|
217
211
|
|
|
212
|
+
# Login-shell profile files generated into the per-task HOME (see
|
|
213
|
+
# _setup_login_shell_home). ``.bash_profile`` is what ``bash -l`` reads;
|
|
214
|
+
# ``.profile`` covers ``sh``/``dash`` login shells. The zsh trio covers macOS,
|
|
215
|
+
# where zsh is the default shell: ``.zshenv`` runs in EVERY zsh, ``.zprofile``
|
|
216
|
+
# in login shells (AFTER /etc/zprofile, whose path_helper resets PATH), and
|
|
217
|
+
# ``.zshrc`` in interactive shells - including codex's shell snapshot, which
|
|
218
|
+
# sources it explicitly. zsh selects its dotfiles via $ZDOTDIR (fallback
|
|
219
|
+
# $HOME), so _build_codex_env points ZDOTDIR at the generated home.
|
|
220
|
+
_LOGIN_PROFILE_NAMES = (".bash_profile", ".profile", ".zshenv", ".zprofile", ".zshrc")
|
|
221
|
+
_ZSH_PROFILE_NAMES = frozenset({".zshenv", ".zprofile", ".zshrc"})
|
|
222
|
+
|
|
218
223
|
|
|
219
224
|
def _get_item_root(notification: Any) -> Any:
|
|
220
225
|
"""Extract the typed item root from a Codex SDK notification.
|
|
@@ -649,6 +654,7 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
649
654
|
self.thread: Any = None
|
|
650
655
|
self.working_directory: Path | None = None
|
|
651
656
|
self._env_path_prepend: list[str] = []
|
|
657
|
+
self._login_shell_home: Path | None = None
|
|
652
658
|
# _state / _iteration / _iteration_was_incremented / pending_turn lifecycle
|
|
653
659
|
# bookkeeping lives on the Agent base class (shared defaults + helpers).
|
|
654
660
|
self._log = PrefixedAdapter(logger, {"prefix": instance_name})
|
|
@@ -677,6 +683,7 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
677
683
|
"""
|
|
678
684
|
self.working_directory = Path(working_directory)
|
|
679
685
|
self._env_path_prepend = list(env_path_prepend or [])
|
|
686
|
+
self._setup_login_shell_home()
|
|
680
687
|
self._state = AgentState.WORKING
|
|
681
688
|
|
|
682
689
|
try:
|
|
@@ -872,6 +879,7 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
872
879
|
self._close_client()
|
|
873
880
|
self.thread = None
|
|
874
881
|
self._active_turn_handle = None
|
|
882
|
+
self._cleanup_login_shell_home()
|
|
875
883
|
self._mark_stopped()
|
|
876
884
|
|
|
877
885
|
async def kill(self) -> None:
|
|
@@ -887,6 +895,7 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
887
895
|
"""
|
|
888
896
|
self._interrupt_active_turn()
|
|
889
897
|
self._close_client()
|
|
898
|
+
self._cleanup_login_shell_home()
|
|
890
899
|
|
|
891
900
|
def _interrupt_active_turn(self) -> None:
|
|
892
901
|
"""Interrupt the in-flight Codex turn, if any (best-effort, idempotent)."""
|
|
@@ -1071,8 +1080,159 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
1071
1080
|
path_key = next((k for k in os.environ if k.upper() == "PATH"), "PATH")
|
|
1072
1081
|
env[path_key] = os.pathsep.join([*self._env_path_prepend, os.environ.get(path_key, "")])
|
|
1073
1082
|
self._log.debug(f"PATH prepend: {os.pathsep.join(self._env_path_prepend)}")
|
|
1083
|
+
if self._login_shell_home is not None:
|
|
1084
|
+
# Point login shells at the generated profile dir (see
|
|
1085
|
+
# _setup_login_shell_home) while pinning codex state (auth, rollout
|
|
1086
|
+
# sessions) to its real location — _codex_home() reads the same
|
|
1087
|
+
# resolution for sub-agent rollout recovery, so both sides agree.
|
|
1088
|
+
# HOME steers bash/sh; ZDOTDIR steers zsh (the macOS default
|
|
1089
|
+
# shell), which ignores HOME for dotfile selection when it is set.
|
|
1090
|
+
env["HOME"] = str(self._login_shell_home)
|
|
1091
|
+
env["ZDOTDIR"] = str(self._login_shell_home)
|
|
1092
|
+
env["CODEX_HOME"] = str(self._codex_home())
|
|
1074
1093
|
return env if env else None
|
|
1075
1094
|
|
|
1095
|
+
@staticmethod
|
|
1096
|
+
def _login_shell_profiles_supported() -> bool:
|
|
1097
|
+
"""Whether to generate login-shell profile shims (POSIX shells only)."""
|
|
1098
|
+
return os.name == "posix"
|
|
1099
|
+
|
|
1100
|
+
def _setup_login_shell_home(self) -> None:
|
|
1101
|
+
"""Create a per-task HOME whose profiles restore the mock PATH prepend.
|
|
1102
|
+
|
|
1103
|
+
Codex issues every shell command through the user's default shell as a
|
|
1104
|
+
login shell: ``bash -lc`` on Linux, ``zsh -lc`` on macOS (its default
|
|
1105
|
+
shell; fish would need the same treatment here if codex ever picks
|
|
1106
|
+
it). A login shell re-sources the system profile chain -
|
|
1107
|
+
``/etc/profile`` on Linux, ``/etc/zprofile``'s path_helper on macOS -
|
|
1108
|
+
which unconditionally RESETS PATH, silently dropping the mock-CLI
|
|
1109
|
+
prepend passed via the app-server environment, so bare commands
|
|
1110
|
+
resolve to the REAL CLIs (real-tenant contamination). The per-user
|
|
1111
|
+
dotfiles are sourced AFTER that chain, so a generated per-task HOME
|
|
1112
|
+
(wired up in ``_build_codex_env``; codex state stays in CODEX_HOME)
|
|
1113
|
+
gets the last word and re-prepends the mock dirs:
|
|
1114
|
+
``.bash_profile``/``.profile`` for bash/sh (selected via env HOME) and
|
|
1115
|
+
``.zshenv``/``.zprofile``/``.zshrc`` for zsh (selected via env
|
|
1116
|
+
ZDOTDIR; ``.zshrc`` also feeds codex's shell snapshot, which sources
|
|
1117
|
+
it explicitly). Per-task rather than the user's real dotfiles so
|
|
1118
|
+
parallel tasks with different mocks cannot collide. No-op without mock
|
|
1119
|
+
dirs or on non-POSIX hosts: Windows codex shells through PowerShell
|
|
1120
|
+
(``-NoProfile``) or ``cmd /c``, neither of which re-sources a profile
|
|
1121
|
+
chain that resets PATH, so the plain env prepend survives there as-is.
|
|
1122
|
+
|
|
1123
|
+
Bash uses the env HOME only to PICK the profile file; the generated
|
|
1124
|
+
profile's first act is to export the ORIGINAL home back, so the
|
|
1125
|
+
sourced user profile and the command body see the real ``$HOME``
|
|
1126
|
+
(git config, tool caches, ``$HOME``-relative sourcing keep working).
|
|
1127
|
+
Known residual gap: a NESTED bash/sh login shell inside a command
|
|
1128
|
+
re-reads the real profiles and loses the prepend again (nested zsh
|
|
1129
|
+
keeps it - ZDOTDIR stays exported).
|
|
1130
|
+
"""
|
|
1131
|
+
self._cleanup_login_shell_home()
|
|
1132
|
+
if not (self._env_path_prepend and self._login_shell_profiles_supported()):
|
|
1133
|
+
return
|
|
1134
|
+
original_home = os.environ.get("HOME", "")
|
|
1135
|
+
# Where the user's REAL zsh dotfiles live: their own ZDOTDIR when set,
|
|
1136
|
+
# else their home (zsh's fallback).
|
|
1137
|
+
original_zdotdir = os.environ.get("ZDOTDIR", "") or original_home
|
|
1138
|
+
# The profile only ever executes under a POSIX shell, so the PATH
|
|
1139
|
+
# separator is ':' regardless of the host building it.
|
|
1140
|
+
quoted_prepend = shlex.quote(":".join(self._env_path_prepend))
|
|
1141
|
+
export_line = f'export PATH={quoted_prepend}:"$PATH"'
|
|
1142
|
+
# Track the dir BEFORE writing so a failed write can't orphan it —
|
|
1143
|
+
# the except below (and any later cleanup) always sees it.
|
|
1144
|
+
home = Path(tempfile.mkdtemp(prefix="coder-eval-codex-home-"))
|
|
1145
|
+
self._login_shell_home = home
|
|
1146
|
+
try:
|
|
1147
|
+
for name in _LOGIN_PROFILE_NAMES:
|
|
1148
|
+
content = self._login_profile_content(
|
|
1149
|
+
name,
|
|
1150
|
+
original_home,
|
|
1151
|
+
export_line,
|
|
1152
|
+
original_zdotdir=original_zdotdir,
|
|
1153
|
+
generated_home=str(home),
|
|
1154
|
+
)
|
|
1155
|
+
# newline="\n": the profile must stay LF-only no matter which host
|
|
1156
|
+
# builds it, or bash sees literal \r at end of line.
|
|
1157
|
+
(home / name).write_text(content, encoding="utf-8", newline="\n")
|
|
1158
|
+
except Exception:
|
|
1159
|
+
self._cleanup_login_shell_home()
|
|
1160
|
+
raise
|
|
1161
|
+
self._log.debug(f"Login-shell mock-PATH home: {home}")
|
|
1162
|
+
|
|
1163
|
+
@staticmethod
|
|
1164
|
+
def _login_profile_content(
|
|
1165
|
+
profile_name: str,
|
|
1166
|
+
original_home: str,
|
|
1167
|
+
export_line: str,
|
|
1168
|
+
*,
|
|
1169
|
+
original_zdotdir: str = "",
|
|
1170
|
+
generated_home: str = "",
|
|
1171
|
+
) -> str:
|
|
1172
|
+
"""One generated profile file: restore the ORIGINAL ``$HOME``, source
|
|
1173
|
+
the user's own counterpart file (so image/user setup isn't lost), then
|
|
1174
|
+
re-prepend the mock dirs.
|
|
1175
|
+
|
|
1176
|
+
The env HOME pointing at the generated dir exists ONLY so bash selects
|
|
1177
|
+
this file; exporting the original home back on the first line keeps
|
|
1178
|
+
every ``$HOME`` consumer (git, npm, the sourced profile's own
|
|
1179
|
+
``$HOME/.bashrc`` references) on the real home.
|
|
1180
|
+
|
|
1181
|
+
``.bash_profile`` mimics bash's first-found chain over the original
|
|
1182
|
+
home; the ``.profile`` twin (read by ``sh``/``dash`` login shells)
|
|
1183
|
+
sources only ``.profile`` — the bash-specific files may contain
|
|
1184
|
+
bashisms a POSIX shell would choke on.
|
|
1185
|
+
|
|
1186
|
+
The zsh files each source their exact counterpart from the user's real
|
|
1187
|
+
zsh dotfile dir (``original_zdotdir``) - zsh reads ALL of its startup
|
|
1188
|
+
files, not a first-found chain. ``.zshenv`` additionally re-pins
|
|
1189
|
+
ZDOTDIR to the generated home AFTER sourcing: the user's ``.zshenv``
|
|
1190
|
+
may redefine ZDOTDIR, which would steer the rest of the startup chain
|
|
1191
|
+
away from the generated ``.zprofile``/``.zshrc``. Each zsh file
|
|
1192
|
+
re-prepends because /etc/zprofile resets PATH BETWEEN ``.zshenv`` and
|
|
1193
|
+
``.zprofile``, and a sourced user file may reset it again; a duplicate
|
|
1194
|
+
PATH entry is harmless, a lost prepend is contamination.
|
|
1195
|
+
"""
|
|
1196
|
+
lines = [
|
|
1197
|
+
"# Generated by coder_eval (CodexAgent): the system profile chain resets",
|
|
1198
|
+
"# PATH in login shells, dropping the mock-CLI prepend - this restores it.",
|
|
1199
|
+
]
|
|
1200
|
+
if original_home:
|
|
1201
|
+
orig = shlex.quote(original_home)
|
|
1202
|
+
lines.append(f"export HOME={orig}")
|
|
1203
|
+
if profile_name in _ZSH_PROFILE_NAMES:
|
|
1204
|
+
if original_zdotdir:
|
|
1205
|
+
origz = shlex.quote(original_zdotdir)
|
|
1206
|
+
lines += [
|
|
1207
|
+
f"if [ -r {origz}/{profile_name} ]; then . {origz}/{profile_name}",
|
|
1208
|
+
"fi",
|
|
1209
|
+
]
|
|
1210
|
+
if profile_name == ".zshenv" and generated_home:
|
|
1211
|
+
lines.append(f"export ZDOTDIR={shlex.quote(generated_home)}")
|
|
1212
|
+
elif original_home:
|
|
1213
|
+
orig = shlex.quote(original_home)
|
|
1214
|
+
if profile_name == ".bash_profile":
|
|
1215
|
+
lines += [
|
|
1216
|
+
f"if [ -r {orig}/.bash_profile ]; then . {orig}/.bash_profile",
|
|
1217
|
+
f"elif [ -r {orig}/.bash_login ]; then . {orig}/.bash_login",
|
|
1218
|
+
f"elif [ -r {orig}/.profile ]; then . {orig}/.profile",
|
|
1219
|
+
"fi",
|
|
1220
|
+
]
|
|
1221
|
+
else:
|
|
1222
|
+
lines += [
|
|
1223
|
+
f"if [ -r {orig}/.profile ]; then . {orig}/.profile",
|
|
1224
|
+
"fi",
|
|
1225
|
+
]
|
|
1226
|
+
lines.append(export_line)
|
|
1227
|
+
return "\n".join(lines) + "\n"
|
|
1228
|
+
|
|
1229
|
+
def _cleanup_login_shell_home(self) -> None:
|
|
1230
|
+
"""Remove the generated per-task HOME (best-effort, idempotent)."""
|
|
1231
|
+
home, self._login_shell_home = self._login_shell_home, None
|
|
1232
|
+
if home is None:
|
|
1233
|
+
return
|
|
1234
|
+
shutil.rmtree(home, ignore_errors=True)
|
|
1235
|
+
|
|
1076
1236
|
def _build_thread_options(self) -> dict[str, Any]:
|
|
1077
1237
|
"""Build thread_start options from agent config.
|
|
1078
1238
|
|
|
@@ -1090,25 +1250,22 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
1090
1250
|
options["model"] = effective_model
|
|
1091
1251
|
self._log.debug(f"Codex model pinned to {effective_model}")
|
|
1092
1252
|
|
|
1093
|
-
# Map permission_mode to sandbox and approval_mode
|
|
1094
1253
|
permission_mode = self.config.permission_mode.value
|
|
1095
|
-
sandbox_mode_str = _PERMISSION_MODE_TO_SANDBOX.get(permission_mode, "workspace-write")
|
|
1096
1254
|
approval_mode_str = _CODEX_APPROVAL_MODE
|
|
1097
1255
|
|
|
1098
|
-
# Codex
|
|
1099
|
-
#
|
|
1100
|
-
#
|
|
1101
|
-
#
|
|
1102
|
-
#
|
|
1103
|
-
# the
|
|
1104
|
-
#
|
|
1105
|
-
#
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
sandbox_mode_str = "full-access"
|
|
1256
|
+
# Codex always runs full-access. coder_eval owns this run's isolation
|
|
1257
|
+
# boundary either way — a docker container (docker driver) or an ephemeral
|
|
1258
|
+
# per-task tempdir it creates and discards (tempdir driver); those are the
|
|
1259
|
+
# only two drivers — so Codex's own in-process OS sandbox (Landlock/seatbelt)
|
|
1260
|
+
# is always redundant. Worse, it actively breaks on the paths we rely on:
|
|
1261
|
+
# inside the container Landlock is unavailable, on constrained CI agents the
|
|
1262
|
+
# bwrap re-exec is denied ("bwrap: execvp .../codex: Permission denied"), and
|
|
1263
|
+
# on Windows there is no OS sandbox at all — in each case a read-only /
|
|
1264
|
+
# workspace-write run fails its writes/execs silently and scores 0 with no
|
|
1265
|
+
# loud error. Dropping to full-access matches Claude Code and Antigravity,
|
|
1266
|
+
# which run with no in-agent OS sandbox; hard isolation of untrusted actions
|
|
1267
|
+
# is the docker driver's job, and approval_mode stays deny_all regardless.
|
|
1268
|
+
sandbox_mode_str = "full-access"
|
|
1112
1269
|
|
|
1113
1270
|
# Convert to Codex SDK enum values
|
|
1114
1271
|
# Sandbox enum values use hyphens, ApprovalMode uses underscores
|