claude-code-generator 0.4.13__tar.gz → 0.4.14__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.
- {claude_code_generator-0.4.13/src/claude_code_generator.egg-info → claude_code_generator-0.4.14}/PKG-INFO +1 -1
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/pyproject.toml +1 -1
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14/src/claude_code_generator.egg-info}/PKG-INFO +1 -1
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/env.py +30 -10
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/_client_lifecycle.py +15 -4
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/cycle_loop.py +6 -2
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/subprocess_runner.py +11 -1
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/LICENSE +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/README.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/setup.cfg +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/claude_code_generator.egg-info/SOURCES.txt +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/claude_code_generator.egg-info/dependency_links.txt +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/claude_code_generator.egg-info/entry_points.txt +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/claude_code_generator.egg-info/requires.txt +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/claude_code_generator.egg-info/top_level.txt +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/__init__.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/agents.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/cli.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/__init__.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/_bench_io.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/_crash_recovery.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/_detect.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/_dispatch.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/_resume.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/_validators.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/bench.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/bench_compare.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/bench_export.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/generate.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/init.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/optimize.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/review.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/status.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/effort.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/gh/__init__.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/gh/core.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/gh/issues.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/gh/labels.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/gh/milestones.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/git_ops.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/logging_setup.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/memory.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/__init__.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/_comments.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/_memory_writers.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/_phase5_precommit.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/cycle_prompts.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/ollama_budget.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/phase0_complexity.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/phase1_plan.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/phase2_review.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/phase3_4_implement.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/phase5_closure.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/phase6_test.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/orchestrator/phase7_commit.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/preflight.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/__init__.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/hashes.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/prompt-cycle-specializer.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/prompt-optimize-requirements.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/prompt-phase-0-complexity.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/prompt-phase-1-planning.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/prompt-phase-2-batch-review.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/prompt-phase-2-issue-review.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/prompt-phase-3-implementation.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/prompt-phase-5-final-review.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/prompt-phase-6-test.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/prompt-phase-7-commit.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/prompt-review.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/repo_info.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/repomap.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/requirements_structure.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/__init__.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/_telemetry.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/batch.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/fake_runner.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/mcp.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/message_parsing.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/options.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/protocol.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/rate_limit.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/retry.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/sdk_runner.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/soft_reset.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/state_guard.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/types.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/utils.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/state.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/state_retention.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/templates/__init__.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/templates/angular.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/templates/base.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/templates/fastapi.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/templates/finance.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/templates/fullstack.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/templates/nestjs.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/templates/python-cli.md +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_agents.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_bench.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_bench_compare.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_bench_export.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_bench_fixture.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_bench_regression.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_changelog.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_claude_md.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_client_lifecycle.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_comments.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_commit_message.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_crash_recovery.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_cycle_loop.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_cycle_loop_multicycle.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_cycle_ollama_model.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_cycle_prompts.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_delta_planning.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_dependencies.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_detect.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_docs_no_default_max_turns.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_docs_ollama_model_guide.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_docs_ollama_pro.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_effective_model_routing.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_effort.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_env.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_generate.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_generate_ollama.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_generate_resume.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_gh.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_gh_labels.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_gh_milestones.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_gh_repo_threading.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_gh_submodules.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_git_ops.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_init.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_logging_setup.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_max_turns_cli_flag.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_mcp.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_memory.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_memory_writers.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_message_parsing.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_no_max_turns_in_call_sites.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_no_max_turns_literal.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_non_goals_grep_guard.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_ollama_budget.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_ollama_rate_limit.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_optimize.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_options.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase0.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase1.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase2.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase2_batch.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase3_4.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase5.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase5_precommit.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase6.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase7.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase_mcp_regression.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase_token_logging.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_preflight.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_preflight_ollama.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_prompt_drift.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_prompt_prefix_snapshots.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_prompt_prefix_stability.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_prompts.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_rate_limit.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_repo_info.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_repomap.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_requirements_structure.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_retry.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_review.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_runner_protocol.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_runner_protocol_annotations.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_runner_types.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_runner_utils.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_sdk_runner.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_sdk_runner_shared.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_session_mode.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_state.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_state_guard.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_state_retention.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_status.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_subprocess_runner.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_telemetry.py +0 -0
- {claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_version.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "claude-code-generator"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.14"
|
|
8
8
|
description = "Orchestrator CLI that drives Claude Code end-to-end to generate whole projects from a requirements.md file."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -48,7 +48,17 @@ def strip_dangerous_env() -> None:
|
|
|
48
48
|
(``sdk_runner.run``, ``run_with_shared_client``).
|
|
49
49
|
"""
|
|
50
50
|
ollama_mode = _is_localhost_base_url(os.environ.get("ANTHROPIC_BASE_URL"))
|
|
51
|
-
|
|
51
|
+
# On the Ollama codepath, ANTHROPIC_AUTH_TOKEN carries the daemon token
|
|
52
|
+
# and must survive stripping. ANTHROPIC_API_KEY is also protected when it
|
|
53
|
+
# has been set to "" by assert_safe_environment_ollama() — the empty-string
|
|
54
|
+
# sentinel tells the SDK to accept non-Claude model tags. A non-empty
|
|
55
|
+
# ANTHROPIC_API_KEY (e.g. "sk-evil") is still stripped because it would
|
|
56
|
+
# route traffic to Anthropic's real API, defeating the localhost redirect.
|
|
57
|
+
protected: set[str] = set()
|
|
58
|
+
if ollama_mode:
|
|
59
|
+
protected.add("ANTHROPIC_AUTH_TOKEN")
|
|
60
|
+
if os.environ.get("ANTHROPIC_API_KEY") == "":
|
|
61
|
+
protected.add("ANTHROPIC_API_KEY")
|
|
52
62
|
for var in DANGEROUS_VARS:
|
|
53
63
|
if var in protected:
|
|
54
64
|
continue
|
|
@@ -116,7 +126,7 @@ def _require_ollama_preconditions() -> str:
|
|
|
116
126
|
|
|
117
127
|
Refuses the bypass when:
|
|
118
128
|
* ``OLLAMA_API_KEY`` is unset or empty.
|
|
119
|
-
* ``ANTHROPIC_BASE_URL`` is pre-set to
|
|
129
|
+
* ``ANTHROPIC_BASE_URL`` is pre-set to a non-localhost value.
|
|
120
130
|
|
|
121
131
|
A non-empty ``ANTHROPIC_API_KEY`` in the parent env is **not** a refusal:
|
|
122
132
|
``_build_ollama_env`` strips every ``ANTHROPIC_*`` var from the returned
|
|
@@ -132,10 +142,10 @@ def _require_ollama_preconditions() -> str:
|
|
|
132
142
|
"before running with provider='ollama'."
|
|
133
143
|
)
|
|
134
144
|
preset_base = os.environ.get("ANTHROPIC_BASE_URL")
|
|
135
|
-
if preset_base and preset_base
|
|
145
|
+
if preset_base and not _is_localhost_base_url(preset_base):
|
|
136
146
|
raise RuntimeError(
|
|
137
|
-
f"ANTHROPIC_BASE_URL={preset_base!r} does not
|
|
138
|
-
f"
|
|
147
|
+
f"ANTHROPIC_BASE_URL={preset_base!r} does not point at a local "
|
|
148
|
+
f"daemon. Unset it or point it at localhost/127.0.0.1."
|
|
139
149
|
)
|
|
140
150
|
return token
|
|
141
151
|
|
|
@@ -222,14 +232,24 @@ def assert_single_workspace(
|
|
|
222
232
|
)
|
|
223
233
|
|
|
224
234
|
|
|
235
|
+
_LOCALHOST_PREFIXES: tuple[str, ...] = (
|
|
236
|
+
"http://localhost:",
|
|
237
|
+
"http://127.0.0.1:",
|
|
238
|
+
"http://[::1]:",
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
|
|
225
242
|
def _is_localhost_base_url(base_url: str | None) -> bool:
|
|
226
243
|
"""Return True when the ANTHROPIC_BASE_URL points at any localhost port.
|
|
227
244
|
|
|
228
|
-
Deliberately lenient —
|
|
229
|
-
|
|
230
|
-
Ollama preflight refusal
|
|
245
|
+
Deliberately lenient — ``http://localhost:*``, ``http://127.0.0.1:*``,
|
|
246
|
+
and ``http://[::1]:*`` all match — because the workspace invariant is
|
|
247
|
+
\"local endpoint\", not the strict :11434 the Ollama preflight refusal
|
|
248
|
+
gate enforces.
|
|
231
249
|
"""
|
|
232
|
-
|
|
250
|
+
if base_url is None:
|
|
251
|
+
return False
|
|
252
|
+
return any(base_url.startswith(prefix) for prefix in _LOCALHOST_PREFIXES)
|
|
233
253
|
|
|
234
254
|
|
|
235
255
|
def _log_localhost_short_circuit_once(state: dict[str, object]) -> None:
|
|
@@ -302,7 +322,7 @@ def assert_safe_environment_ollama() -> None:
|
|
|
302
322
|
preset_base = os.environ.get("ANTHROPIC_BASE_URL")
|
|
303
323
|
if not token:
|
|
304
324
|
return
|
|
305
|
-
if preset_base and preset_base
|
|
325
|
+
if preset_base and not _is_localhost_base_url(preset_base):
|
|
306
326
|
return
|
|
307
327
|
|
|
308
328
|
os.environ["ANTHROPIC_AUTH_TOKEN"] = token
|
|
@@ -92,12 +92,15 @@ def _open_cycle_client(options_template: Any) -> Any:
|
|
|
92
92
|
return ClaudeSDKClient(options=options_template)
|
|
93
93
|
|
|
94
94
|
|
|
95
|
-
def _build_cycle_options(project_dir: Path) -> Any:
|
|
95
|
+
def _build_cycle_options(project_dir: Path, effective_model: str | None = None) -> Any:
|
|
96
96
|
"""Return cycle-scoped options for the shared ``ClaudeSDKClient``.
|
|
97
97
|
|
|
98
98
|
``ClaudeSDKClient`` locks options at open-time — per-query changes do not
|
|
99
99
|
apply. The shared client therefore opens with:
|
|
100
100
|
|
|
101
|
+
- ``model``: the effective Ollama model tag (when on the Ollama codepath),
|
|
102
|
+
or ``None`` to let the SDK default (Anthropic Max path). Must be set at
|
|
103
|
+
open-time because per-query overrides are silently ignored.
|
|
101
104
|
- ``system_prompt``: canonical ``claude_code`` preset with
|
|
102
105
|
``exclude_dynamic_sections=True`` (§2 cache-safe prefix).
|
|
103
106
|
- ``extra_headers``: default betas (extended-cache-ttl + token-efficient-tools).
|
|
@@ -114,6 +117,9 @@ def _build_cycle_options(project_dir: Path) -> Any:
|
|
|
114
117
|
|
|
115
118
|
Args:
|
|
116
119
|
project_dir: Project root; used to resolve MCP servers.
|
|
120
|
+
effective_model: Ollama model tag to lock into the shared client
|
|
121
|
+
(threaded from cycle_loop). When ``None``, the SDK default
|
|
122
|
+
(Anthropic Max path) is used.
|
|
117
123
|
|
|
118
124
|
Returns:
|
|
119
125
|
A ``ClaudeAgentOptions`` instance (or duck-typed fallback) suitable
|
|
@@ -121,15 +127,18 @@ def _build_cycle_options(project_dir: Path) -> Any:
|
|
|
121
127
|
"""
|
|
122
128
|
mcp_servers = build_mcp_servers(project_dir)
|
|
123
129
|
allowed_tools: list[str] = list(_SHARED_CLIENT_ALLOWED_TOOLS) + mcp_tool_wildcards(mcp_servers)
|
|
124
|
-
|
|
130
|
+
kwargs: dict[str, Any] = dict(
|
|
125
131
|
allowed_tools=allowed_tools,
|
|
126
132
|
permission_mode="bypassPermissions",
|
|
127
133
|
mcp_servers=mcp_servers,
|
|
128
134
|
)
|
|
135
|
+
if effective_model is not None:
|
|
136
|
+
kwargs["model"] = effective_model
|
|
137
|
+
return make_agent_options(**kwargs)
|
|
129
138
|
|
|
130
139
|
|
|
131
140
|
@contextlib.asynccontextmanager
|
|
132
|
-
async def managed_shared_client(state: State, state_path: Path): # type: ignore[return]
|
|
141
|
+
async def managed_shared_client(state: State, state_path: Path, effective_model: str | None = None): # type: ignore[return]
|
|
133
142
|
"""Async context manager owning the full shared-client lifecycle.
|
|
134
143
|
|
|
135
144
|
On entry: strips dangerous env vars (non-negotiable #1), opens one
|
|
@@ -151,6 +160,8 @@ async def managed_shared_client(state: State, state_path: Path): # type: ignore
|
|
|
151
160
|
Args:
|
|
152
161
|
state: Root state (mutated by mark/clear helpers).
|
|
153
162
|
state_path: Path to ``state.json`` for atomic persistence.
|
|
163
|
+
effective_model: Ollama model tag to lock into the shared client.
|
|
164
|
+
When ``None``, the SDK default (Anthropic Max path) is used.
|
|
154
165
|
|
|
155
166
|
Yields:
|
|
156
167
|
The open ``ClaudeSDKClient`` instance.
|
|
@@ -158,7 +169,7 @@ async def managed_shared_client(state: State, state_path: Path): # type: ignore
|
|
|
158
169
|
_env.strip_dangerous_env()
|
|
159
170
|
# state.json lives at {project_dir}/.code-generator/state.json.
|
|
160
171
|
project_dir = state_path.parent.parent
|
|
161
|
-
options = _build_cycle_options(project_dir)
|
|
172
|
+
options = _build_cycle_options(project_dir, effective_model=effective_model)
|
|
162
173
|
async with _open_cycle_client(options) as client:
|
|
163
174
|
_state.mark_client_alive(state, state_path)
|
|
164
175
|
try:
|
|
@@ -435,7 +435,9 @@ async def run_single_mode(
|
|
|
435
435
|
state_path = project_dir / ".code-generator" / "state.json"
|
|
436
436
|
|
|
437
437
|
if state.session_mode in ("shared", "batch"):
|
|
438
|
-
async with managed_shared_client(
|
|
438
|
+
async with managed_shared_client(
|
|
439
|
+
state, state_path, effective_model=effective_model
|
|
440
|
+
) as client:
|
|
439
441
|
await _run_phases(
|
|
440
442
|
state,
|
|
441
443
|
None,
|
|
@@ -665,7 +667,9 @@ async def _run_cycle_phases(
|
|
|
665
667
|
log_prefix = f"cycle{cycle.id}_"
|
|
666
668
|
|
|
667
669
|
if state.session_mode in ("shared", "batch"):
|
|
668
|
-
async with managed_shared_client(
|
|
670
|
+
async with managed_shared_client(
|
|
671
|
+
state, state_path, effective_model=effective_model
|
|
672
|
+
) as client:
|
|
669
673
|
await _run_phases(
|
|
670
674
|
state,
|
|
671
675
|
cycle,
|
|
@@ -13,6 +13,7 @@ from __future__ import annotations
|
|
|
13
13
|
import asyncio
|
|
14
14
|
import contextlib
|
|
15
15
|
import json
|
|
16
|
+
import os
|
|
16
17
|
import subprocess
|
|
17
18
|
import time
|
|
18
19
|
from typing import TYPE_CHECKING, Any
|
|
@@ -313,7 +314,16 @@ async def run(
|
|
|
313
314
|
"CLI session starting (model=%s effort=%s max_turns=%s).", model, effort_display, max_turns
|
|
314
315
|
)
|
|
315
316
|
|
|
316
|
-
|
|
317
|
+
# Detect Ollama mode so build_agent_env() preserves the scoped localhost
|
|
318
|
+
# routing (ANTHROPIC_API_KEY="" + pinned BASE_URL). Without provider="ollama"
|
|
319
|
+
# the default "anthropic-max" path omits ANTHROPIC_API_KEY, which causes
|
|
320
|
+
# the CLI to reject non-Claude model tags or fall back to real credentials.
|
|
321
|
+
_provider: _env.Provider = (
|
|
322
|
+
"ollama"
|
|
323
|
+
if _env._is_localhost_base_url(os.environ.get("ANTHROPIC_BASE_URL"))
|
|
324
|
+
else "anthropic-max"
|
|
325
|
+
)
|
|
326
|
+
safe_env = _env.build_agent_env(provider=_provider)
|
|
317
327
|
|
|
318
328
|
text_parts: list[str] = []
|
|
319
329
|
result_holder: dict[str, Any] = {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/_detect.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/_resume.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/bench.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/init.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/review.py
RENAMED
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/commands/status.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/gh/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/gh/issues.py
RENAMED
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/gh/labels.py
RENAMED
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/gh/milestones.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/logging_setup.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/preflight.py
RENAMED
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/__init__.py
RENAMED
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/prompts/hashes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/repo_info.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/batch.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/mcp.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/options.py
RENAMED
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/protocol.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/retry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/types.py
RENAMED
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/runner/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/state_retention.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/templates/base.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/src/code_generator/templates/nestjs.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_bench_regression.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_client_lifecycle.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_cycle_loop_multicycle.py
RENAMED
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_cycle_ollama_model.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_docs_ollama_model_guide.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_effective_model_routing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_gh_repo_threading.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_max_turns_cli_flag.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_no_max_turns_literal.py
RENAMED
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_non_goals_grep_guard.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_ollama_rate_limit.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase5_precommit.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase_mcp_regression.py
RENAMED
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_phase_token_logging.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_preflight_ollama.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_prompt_prefix_snapshots.py
RENAMED
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_prompt_prefix_stability.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_requirements_structure.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_sdk_runner_shared.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.4.13 → claude_code_generator-0.4.14}/tests/test_subprocess_runner.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|