claude-code-generator 0.4.3__tar.gz → 0.4.4__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.3/src/claude_code_generator.egg-info → claude_code_generator-0.4.4}/PKG-INFO +40 -2
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/README.md +38 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/pyproject.toml +2 -2
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4/src/claude_code_generator.egg-info}/PKG-INFO +40 -2
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/claude_code_generator.egg-info/SOURCES.txt +9 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/claude_code_generator.egg-info/requires.txt +1 -1
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/__init__.py +1 -1
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/cli.py +2 -2
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_dispatch.py +20 -2
- claude_code_generator-0.4.4/src/code_generator/commands/generate.py +460 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/status.py +20 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/effort.py +1 -3
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/env.py +103 -5
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/cycle_loop.py +58 -5
- claude_code_generator-0.4.4/src/code_generator/orchestrator/ollama_budget.py +116 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase0_complexity.py +21 -4
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase1_plan.py +6 -1
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase2_review.py +19 -6
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase3_4_implement.py +8 -1
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase5_closure.py +6 -1
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase6_test.py +8 -2
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase7_commit.py +7 -2
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/preflight.py +123 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/rate_limit.py +97 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/state.py +7 -0
- claude_code_generator-0.4.4/tests/test_cycle_ollama_model.py +219 -0
- claude_code_generator-0.4.4/tests/test_docs_ollama_model_guide.py +88 -0
- claude_code_generator-0.4.4/tests/test_docs_ollama_pro.py +176 -0
- claude_code_generator-0.4.4/tests/test_effective_model_routing.py +290 -0
- claude_code_generator-0.4.4/tests/test_env.py +450 -0
- claude_code_generator-0.4.4/tests/test_generate_ollama.py +329 -0
- claude_code_generator-0.4.4/tests/test_ollama_budget.py +214 -0
- claude_code_generator-0.4.4/tests/test_ollama_rate_limit.py +336 -0
- claude_code_generator-0.4.4/tests/test_preflight_ollama.py +282 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_status.py +154 -0
- claude_code_generator-0.4.3/src/code_generator/commands/generate.py +0 -238
- claude_code_generator-0.4.3/tests/test_env.py +0 -203
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/LICENSE +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/setup.cfg +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/claude_code_generator.egg-info/dependency_links.txt +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/claude_code_generator.egg-info/entry_points.txt +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/claude_code_generator.egg-info/top_level.txt +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/agents.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/__init__.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_bench_io.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_crash_recovery.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_detect.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_resume.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_validators.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/bench.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/bench_compare.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/bench_export.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/init.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/optimize.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/review.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/gh/__init__.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/gh/core.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/gh/issues.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/gh/labels.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/gh/milestones.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/git_ops.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/logging_setup.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/memory.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/__init__.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/_client_lifecycle.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/_comments.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/_memory_writers.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/_phase5_precommit.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/__init__.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/hashes.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-optimize-requirements.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-0-complexity.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-1-planning.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-2-issue-review.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-3-implementation.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-5-final-review.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-6-test.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-7-commit.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-review.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/repo_info.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/repomap.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/requirements_structure.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/__init__.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/_telemetry.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/batch.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/fake_runner.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/mcp.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/message_parsing.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/options.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/protocol.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/retry.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/sdk_runner.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/soft_reset.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/state_guard.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/subprocess_runner.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/types.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/utils.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/state_retention.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/__init__.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/angular.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/base.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/fastapi.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/finance.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/fullstack.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/nestjs.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/python-cli.md +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_agents.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_bench.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_bench_compare.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_bench_export.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_bench_fixture.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_bench_regression.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_changelog.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_claude_md.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_client_lifecycle.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_comments.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_commit_message.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_crash_recovery.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_cycle_loop.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_cycle_loop_multicycle.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_delta_planning.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_dependencies.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_detect.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_docs_no_default_max_turns.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_effort.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_generate.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_generate_resume.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_gh.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_gh_labels.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_gh_milestones.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_gh_repo_threading.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_gh_submodules.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_git_ops.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_init.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_logging_setup.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_max_turns_cli_flag.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_mcp.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_memory.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_memory_writers.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_message_parsing.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_no_max_turns_in_call_sites.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_no_max_turns_literal.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_non_goals_grep_guard.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_optimize.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_options.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase0.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase1.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase2.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase2_batch.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase3_4.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase5.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase5_precommit.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase6.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase7.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase_mcp_regression.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase_token_logging.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_preflight.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_prompt_drift.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_prompt_prefix_snapshots.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_prompt_prefix_stability.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_prompts.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_rate_limit.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_repo_info.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_repomap.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_requirements_structure.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_retry.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_review.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_runner_protocol.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_runner_protocol_annotations.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_runner_types.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_runner_utils.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_sdk_runner.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_sdk_runner_shared.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_session_mode.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_state.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_state_guard.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_state_retention.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_subprocess_runner.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_telemetry.py +0 -0
- {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-code-generator
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.4
|
|
4
4
|
Summary: Orchestrator CLI that drives Claude Code end-to-end to generate whole projects from a requirements.md file.
|
|
5
5
|
Author: Silvio Baratto
|
|
6
6
|
License: MIT
|
|
@@ -20,7 +20,7 @@ Classifier: Topic :: Software Development :: Code Generators
|
|
|
20
20
|
Requires-Python: >=3.11
|
|
21
21
|
Description-Content-Type: text/markdown
|
|
22
22
|
License-File: LICENSE
|
|
23
|
-
Requires-Dist: claude-agent-sdk<0.
|
|
23
|
+
Requires-Dist: claude-agent-sdk<0.4.0,>=0.3.0
|
|
24
24
|
Requires-Dist: typer
|
|
25
25
|
Requires-Dist: rich
|
|
26
26
|
Provides-Extra: dev
|
|
@@ -134,6 +134,44 @@ Run a standalone Opus 4.7 review of the current codebase against the design prin
|
|
|
134
134
|
|
|
135
135
|
Print a Rich table with the current mode, current cycle, current phase, open/closed issue counts, the rate-limit pause state (with minutes remaining if paused), per-cycle token consumption columns (`in | cache_read | cache_write | out`), wall-clock elapsed time, and any `last_error` highlighted in red.
|
|
136
136
|
|
|
137
|
+
## Running against Ollama Pro
|
|
138
|
+
|
|
139
|
+
An opt-in subcommand, `code-generator generate ollama`, runs the full 0→7 pipeline against **one** Ollama-hosted model instead of the Anthropic Max subscription. This is the only supported way to bypass the Max-subscription invariant and is gated by `provider == "ollama"` inside `env.py`.
|
|
140
|
+
|
|
141
|
+
### One-time setup
|
|
142
|
+
|
|
143
|
+
1. Install the Ollama daemon (≥ 0.14.0) and start it on the default endpoint `http://localhost:11434`.
|
|
144
|
+
2. Sign the daemon into your Ollama Pro account — required for any `:cloud` model:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
ollama signin
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
3. Export your existing `OLLAMA_API_KEY` (the same secret you already use elsewhere — no new secret is introduced):
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
export OLLAMA_API_KEY=... # typically set once in ~/.zshrc
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Preflight refuses to run if the daemon is unreachable, not signed in, or `OLLAMA_API_KEY` is empty — fix the message it prints and re-run.
|
|
157
|
+
|
|
158
|
+
### Worked examples
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# Plan + implement a whole repo on a cloud-hosted 480B coding model
|
|
162
|
+
code-generator generate ollama --model "qwen3-coder:480b:cloud"
|
|
163
|
+
|
|
164
|
+
# Same pipeline on a different cloud model
|
|
165
|
+
code-generator generate ollama --model "gpt-oss:120b-cloud"
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
The `--model` tag you pass drives **every** phase (0 through 7). There is no per-phase override on this codepath: single-model is the whole point. The tag is persisted to `state.json` as `CycleState.ollama_model` so `code-generator generate ollama --continue` resumes with the same model without re-typing it.
|
|
169
|
+
|
|
170
|
+
### What is overridden vs. preserved
|
|
171
|
+
|
|
172
|
+
- **Overridden under `provider == "ollama"`:** non-negotiable #1 (Max-only env strip is narrowed to `ANTHROPIC_AUTH_TOKEN` / `ANTHROPIC_BASE_URL` passthrough), #4 (no Anthropic overage telemetry — replaced by turn-count + wall-clock budgets), #8 (fixed-model-per-phase — replaced by single-model routing).
|
|
173
|
+
- **Preserved on every path:** #2 (never `--bare`), #3 (YOLO permissions), #5 (wait-and-resume on 429), #6 (fresh context per issue), #7 (atomic state writes), #9 (no default `max_turns`).
|
|
174
|
+
|
|
137
175
|
## Safety constraints
|
|
138
176
|
|
|
139
177
|
The tool enforces nine non-negotiables (see `CLAUDE.md` for the full list):
|
|
@@ -94,6 +94,44 @@ Run a standalone Opus 4.7 review of the current codebase against the design prin
|
|
|
94
94
|
|
|
95
95
|
Print a Rich table with the current mode, current cycle, current phase, open/closed issue counts, the rate-limit pause state (with minutes remaining if paused), per-cycle token consumption columns (`in | cache_read | cache_write | out`), wall-clock elapsed time, and any `last_error` highlighted in red.
|
|
96
96
|
|
|
97
|
+
## Running against Ollama Pro
|
|
98
|
+
|
|
99
|
+
An opt-in subcommand, `code-generator generate ollama`, runs the full 0→7 pipeline against **one** Ollama-hosted model instead of the Anthropic Max subscription. This is the only supported way to bypass the Max-subscription invariant and is gated by `provider == "ollama"` inside `env.py`.
|
|
100
|
+
|
|
101
|
+
### One-time setup
|
|
102
|
+
|
|
103
|
+
1. Install the Ollama daemon (≥ 0.14.0) and start it on the default endpoint `http://localhost:11434`.
|
|
104
|
+
2. Sign the daemon into your Ollama Pro account — required for any `:cloud` model:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
ollama signin
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
3. Export your existing `OLLAMA_API_KEY` (the same secret you already use elsewhere — no new secret is introduced):
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
export OLLAMA_API_KEY=... # typically set once in ~/.zshrc
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Preflight refuses to run if the daemon is unreachable, not signed in, or `OLLAMA_API_KEY` is empty — fix the message it prints and re-run.
|
|
117
|
+
|
|
118
|
+
### Worked examples
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Plan + implement a whole repo on a cloud-hosted 480B coding model
|
|
122
|
+
code-generator generate ollama --model "qwen3-coder:480b:cloud"
|
|
123
|
+
|
|
124
|
+
# Same pipeline on a different cloud model
|
|
125
|
+
code-generator generate ollama --model "gpt-oss:120b-cloud"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The `--model` tag you pass drives **every** phase (0 through 7). There is no per-phase override on this codepath: single-model is the whole point. The tag is persisted to `state.json` as `CycleState.ollama_model` so `code-generator generate ollama --continue` resumes with the same model without re-typing it.
|
|
129
|
+
|
|
130
|
+
### What is overridden vs. preserved
|
|
131
|
+
|
|
132
|
+
- **Overridden under `provider == "ollama"`:** non-negotiable #1 (Max-only env strip is narrowed to `ANTHROPIC_AUTH_TOKEN` / `ANTHROPIC_BASE_URL` passthrough), #4 (no Anthropic overage telemetry — replaced by turn-count + wall-clock budgets), #8 (fixed-model-per-phase — replaced by single-model routing).
|
|
133
|
+
- **Preserved on every path:** #2 (never `--bare`), #3 (YOLO permissions), #5 (wait-and-resume on 429), #6 (fresh context per issue), #7 (atomic state writes), #9 (no default `max_turns`).
|
|
134
|
+
|
|
97
135
|
## Safety constraints
|
|
98
136
|
|
|
99
137
|
The tool enforces nine non-negotiables (see `CLAUDE.md` for the full list):
|
|
@@ -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.4"
|
|
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" }
|
|
@@ -23,7 +23,7 @@ classifiers = [
|
|
|
23
23
|
]
|
|
24
24
|
requires-python = ">=3.11"
|
|
25
25
|
dependencies = [
|
|
26
|
-
"claude-agent-sdk>=0.
|
|
26
|
+
"claude-agent-sdk>=0.3.0,<0.4.0",
|
|
27
27
|
"typer",
|
|
28
28
|
"rich",
|
|
29
29
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-code-generator
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.4
|
|
4
4
|
Summary: Orchestrator CLI that drives Claude Code end-to-end to generate whole projects from a requirements.md file.
|
|
5
5
|
Author: Silvio Baratto
|
|
6
6
|
License: MIT
|
|
@@ -20,7 +20,7 @@ Classifier: Topic :: Software Development :: Code Generators
|
|
|
20
20
|
Requires-Python: >=3.11
|
|
21
21
|
Description-Content-Type: text/markdown
|
|
22
22
|
License-File: LICENSE
|
|
23
|
-
Requires-Dist: claude-agent-sdk<0.
|
|
23
|
+
Requires-Dist: claude-agent-sdk<0.4.0,>=0.3.0
|
|
24
24
|
Requires-Dist: typer
|
|
25
25
|
Requires-Dist: rich
|
|
26
26
|
Provides-Extra: dev
|
|
@@ -134,6 +134,44 @@ Run a standalone Opus 4.7 review of the current codebase against the design prin
|
|
|
134
134
|
|
|
135
135
|
Print a Rich table with the current mode, current cycle, current phase, open/closed issue counts, the rate-limit pause state (with minutes remaining if paused), per-cycle token consumption columns (`in | cache_read | cache_write | out`), wall-clock elapsed time, and any `last_error` highlighted in red.
|
|
136
136
|
|
|
137
|
+
## Running against Ollama Pro
|
|
138
|
+
|
|
139
|
+
An opt-in subcommand, `code-generator generate ollama`, runs the full 0→7 pipeline against **one** Ollama-hosted model instead of the Anthropic Max subscription. This is the only supported way to bypass the Max-subscription invariant and is gated by `provider == "ollama"` inside `env.py`.
|
|
140
|
+
|
|
141
|
+
### One-time setup
|
|
142
|
+
|
|
143
|
+
1. Install the Ollama daemon (≥ 0.14.0) and start it on the default endpoint `http://localhost:11434`.
|
|
144
|
+
2. Sign the daemon into your Ollama Pro account — required for any `:cloud` model:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
ollama signin
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
3. Export your existing `OLLAMA_API_KEY` (the same secret you already use elsewhere — no new secret is introduced):
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
export OLLAMA_API_KEY=... # typically set once in ~/.zshrc
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Preflight refuses to run if the daemon is unreachable, not signed in, or `OLLAMA_API_KEY` is empty — fix the message it prints and re-run.
|
|
157
|
+
|
|
158
|
+
### Worked examples
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# Plan + implement a whole repo on a cloud-hosted 480B coding model
|
|
162
|
+
code-generator generate ollama --model "qwen3-coder:480b:cloud"
|
|
163
|
+
|
|
164
|
+
# Same pipeline on a different cloud model
|
|
165
|
+
code-generator generate ollama --model "gpt-oss:120b-cloud"
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
The `--model` tag you pass drives **every** phase (0 through 7). There is no per-phase override on this codepath: single-model is the whole point. The tag is persisted to `state.json` as `CycleState.ollama_model` so `code-generator generate ollama --continue` resumes with the same model without re-typing it.
|
|
169
|
+
|
|
170
|
+
### What is overridden vs. preserved
|
|
171
|
+
|
|
172
|
+
- **Overridden under `provider == "ollama"`:** non-negotiable #1 (Max-only env strip is narrowed to `ANTHROPIC_AUTH_TOKEN` / `ANTHROPIC_BASE_URL` passthrough), #4 (no Anthropic overage telemetry — replaced by turn-count + wall-clock budgets), #8 (fixed-model-per-phase — replaced by single-model routing).
|
|
173
|
+
- **Preserved on every path:** #2 (never `--bare`), #3 (YOLO permissions), #5 (wait-and-resume on 429), #6 (fresh context per issue), #7 (atomic state writes), #9 (no default `max_turns`).
|
|
174
|
+
|
|
137
175
|
## Safety constraints
|
|
138
176
|
|
|
139
177
|
The tool enforces nine non-negotiables (see `CLAUDE.md` for the full list):
|
|
@@ -47,6 +47,7 @@ src/code_generator/orchestrator/_comments.py
|
|
|
47
47
|
src/code_generator/orchestrator/_memory_writers.py
|
|
48
48
|
src/code_generator/orchestrator/_phase5_precommit.py
|
|
49
49
|
src/code_generator/orchestrator/cycle_loop.py
|
|
50
|
+
src/code_generator/orchestrator/ollama_budget.py
|
|
50
51
|
src/code_generator/orchestrator/phase0_complexity.py
|
|
51
52
|
src/code_generator/orchestrator/phase1_plan.py
|
|
52
53
|
src/code_generator/orchestrator/phase2_review.py
|
|
@@ -103,13 +104,18 @@ tests/test_commit_message.py
|
|
|
103
104
|
tests/test_crash_recovery.py
|
|
104
105
|
tests/test_cycle_loop.py
|
|
105
106
|
tests/test_cycle_loop_multicycle.py
|
|
107
|
+
tests/test_cycle_ollama_model.py
|
|
106
108
|
tests/test_delta_planning.py
|
|
107
109
|
tests/test_dependencies.py
|
|
108
110
|
tests/test_detect.py
|
|
109
111
|
tests/test_docs_no_default_max_turns.py
|
|
112
|
+
tests/test_docs_ollama_model_guide.py
|
|
113
|
+
tests/test_docs_ollama_pro.py
|
|
114
|
+
tests/test_effective_model_routing.py
|
|
110
115
|
tests/test_effort.py
|
|
111
116
|
tests/test_env.py
|
|
112
117
|
tests/test_generate.py
|
|
118
|
+
tests/test_generate_ollama.py
|
|
113
119
|
tests/test_generate_resume.py
|
|
114
120
|
tests/test_gh.py
|
|
115
121
|
tests/test_gh_labels.py
|
|
@@ -127,6 +133,8 @@ tests/test_message_parsing.py
|
|
|
127
133
|
tests/test_no_max_turns_in_call_sites.py
|
|
128
134
|
tests/test_no_max_turns_literal.py
|
|
129
135
|
tests/test_non_goals_grep_guard.py
|
|
136
|
+
tests/test_ollama_budget.py
|
|
137
|
+
tests/test_ollama_rate_limit.py
|
|
130
138
|
tests/test_optimize.py
|
|
131
139
|
tests/test_options.py
|
|
132
140
|
tests/test_phase0.py
|
|
@@ -141,6 +149,7 @@ tests/test_phase7.py
|
|
|
141
149
|
tests/test_phase_mcp_regression.py
|
|
142
150
|
tests/test_phase_token_logging.py
|
|
143
151
|
tests/test_preflight.py
|
|
152
|
+
tests/test_preflight_ollama.py
|
|
144
153
|
tests/test_prompt_drift.py
|
|
145
154
|
tests/test_prompt_prefix_snapshots.py
|
|
146
155
|
tests/test_prompt_prefix_stability.py
|
|
@@ -10,7 +10,7 @@ import typer
|
|
|
10
10
|
|
|
11
11
|
import code_generator
|
|
12
12
|
from code_generator.commands.bench import bench_app
|
|
13
|
-
from code_generator.commands.generate import
|
|
13
|
+
from code_generator.commands.generate import generate_app
|
|
14
14
|
from code_generator.commands.init import init_command
|
|
15
15
|
from code_generator.commands.optimize import optimize_command
|
|
16
16
|
from code_generator.commands.review import review_command
|
|
@@ -46,8 +46,8 @@ def root(
|
|
|
46
46
|
|
|
47
47
|
|
|
48
48
|
app.add_typer(bench_app, name="bench")
|
|
49
|
+
app.add_typer(generate_app, name="generate")
|
|
49
50
|
app.command(name="init")(init_command)
|
|
50
51
|
app.command(name="status")(status_command)
|
|
51
|
-
app.command(name="generate")(generate_command)
|
|
52
52
|
app.command(name="optimize")(optimize_command)
|
|
53
53
|
app.command(name="review")(review_command)
|
{claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_dispatch.py
RENAMED
|
@@ -170,6 +170,7 @@ async def dispatch_async(
|
|
|
170
170
|
state_path: Path | None = None,
|
|
171
171
|
session_mode: Literal["shared", "fresh", "batch"] = "shared",
|
|
172
172
|
max_turns: int | None = None,
|
|
173
|
+
ollama_model: str | None = None,
|
|
173
174
|
) -> None:
|
|
174
175
|
"""Async entry point for the orchestration pipeline.
|
|
175
176
|
|
|
@@ -221,14 +222,27 @@ async def dispatch_async(
|
|
|
221
222
|
needs_phase0 = False
|
|
222
223
|
|
|
223
224
|
if needs_phase0:
|
|
224
|
-
await phase0_complexity.run(
|
|
225
|
+
await phase0_complexity.run(
|
|
226
|
+
st,
|
|
227
|
+
project_dir,
|
|
228
|
+
runner_module=runner_module,
|
|
229
|
+
logger=logger,
|
|
230
|
+
effective_model=ollama_model,
|
|
231
|
+
)
|
|
225
232
|
|
|
226
233
|
# Dry-run: planning only (phase 0 + phase 1).
|
|
227
234
|
if dry_run:
|
|
228
235
|
from code_generator.orchestrator import phase1_plan
|
|
229
236
|
|
|
230
237
|
logger.info("--dry-run: running phase 1 (planning only).")
|
|
231
|
-
await phase1_plan.run(
|
|
238
|
+
await phase1_plan.run(
|
|
239
|
+
st,
|
|
240
|
+
None,
|
|
241
|
+
project_dir,
|
|
242
|
+
runner_module=runner_module,
|
|
243
|
+
logger=logger,
|
|
244
|
+
effective_model=ollama_model,
|
|
245
|
+
)
|
|
232
246
|
return
|
|
233
247
|
|
|
234
248
|
# Dispatch to cycle loop.
|
|
@@ -242,6 +256,7 @@ async def dispatch_async(
|
|
|
242
256
|
start_phase=start_phase,
|
|
243
257
|
session_mode=session_mode,
|
|
244
258
|
max_turns=max_turns,
|
|
259
|
+
effective_model=ollama_model,
|
|
245
260
|
)
|
|
246
261
|
else:
|
|
247
262
|
await cycle_loop.run_single_mode(
|
|
@@ -252,6 +267,7 @@ async def dispatch_async(
|
|
|
252
267
|
start_phase=start_phase,
|
|
253
268
|
session_mode=session_mode,
|
|
254
269
|
max_turns=max_turns,
|
|
270
|
+
effective_model=ollama_model,
|
|
255
271
|
)
|
|
256
272
|
|
|
257
273
|
|
|
@@ -309,6 +325,7 @@ def dispatch_orchestrator(
|
|
|
309
325
|
session_mode: Literal["shared", "fresh", "batch"] = "shared",
|
|
310
326
|
session_mode_explicit: bool = False,
|
|
311
327
|
max_turns: int | None = None,
|
|
328
|
+
ollama_model: str | None = None,
|
|
312
329
|
) -> None:
|
|
313
330
|
"""Resolve resume parameters and dispatch the async orchestrator.
|
|
314
331
|
|
|
@@ -433,5 +450,6 @@ def dispatch_orchestrator(
|
|
|
433
450
|
state_path=state_path,
|
|
434
451
|
session_mode=effective_session_mode,
|
|
435
452
|
max_turns=max_turns,
|
|
453
|
+
ollama_model=ollama_model,
|
|
436
454
|
)
|
|
437
455
|
)
|