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.
Files changed (180) hide show
  1. {claude_code_generator-0.4.3/src/claude_code_generator.egg-info → claude_code_generator-0.4.4}/PKG-INFO +40 -2
  2. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/README.md +38 -0
  3. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/pyproject.toml +2 -2
  4. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4/src/claude_code_generator.egg-info}/PKG-INFO +40 -2
  5. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/claude_code_generator.egg-info/SOURCES.txt +9 -0
  6. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/claude_code_generator.egg-info/requires.txt +1 -1
  7. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/__init__.py +1 -1
  8. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/cli.py +2 -2
  9. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_dispatch.py +20 -2
  10. claude_code_generator-0.4.4/src/code_generator/commands/generate.py +460 -0
  11. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/status.py +20 -0
  12. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/effort.py +1 -3
  13. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/env.py +103 -5
  14. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/cycle_loop.py +58 -5
  15. claude_code_generator-0.4.4/src/code_generator/orchestrator/ollama_budget.py +116 -0
  16. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase0_complexity.py +21 -4
  17. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase1_plan.py +6 -1
  18. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase2_review.py +19 -6
  19. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase3_4_implement.py +8 -1
  20. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase5_closure.py +6 -1
  21. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase6_test.py +8 -2
  22. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/phase7_commit.py +7 -2
  23. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/preflight.py +123 -0
  24. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/rate_limit.py +97 -0
  25. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/state.py +7 -0
  26. claude_code_generator-0.4.4/tests/test_cycle_ollama_model.py +219 -0
  27. claude_code_generator-0.4.4/tests/test_docs_ollama_model_guide.py +88 -0
  28. claude_code_generator-0.4.4/tests/test_docs_ollama_pro.py +176 -0
  29. claude_code_generator-0.4.4/tests/test_effective_model_routing.py +290 -0
  30. claude_code_generator-0.4.4/tests/test_env.py +450 -0
  31. claude_code_generator-0.4.4/tests/test_generate_ollama.py +329 -0
  32. claude_code_generator-0.4.4/tests/test_ollama_budget.py +214 -0
  33. claude_code_generator-0.4.4/tests/test_ollama_rate_limit.py +336 -0
  34. claude_code_generator-0.4.4/tests/test_preflight_ollama.py +282 -0
  35. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_status.py +154 -0
  36. claude_code_generator-0.4.3/src/code_generator/commands/generate.py +0 -238
  37. claude_code_generator-0.4.3/tests/test_env.py +0 -203
  38. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/LICENSE +0 -0
  39. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/setup.cfg +0 -0
  40. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/claude_code_generator.egg-info/dependency_links.txt +0 -0
  41. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/claude_code_generator.egg-info/entry_points.txt +0 -0
  42. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/claude_code_generator.egg-info/top_level.txt +0 -0
  43. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/agents.py +0 -0
  44. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/__init__.py +0 -0
  45. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_bench_io.py +0 -0
  46. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_crash_recovery.py +0 -0
  47. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_detect.py +0 -0
  48. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_resume.py +0 -0
  49. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/_validators.py +0 -0
  50. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/bench.py +0 -0
  51. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/bench_compare.py +0 -0
  52. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/bench_export.py +0 -0
  53. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/init.py +0 -0
  54. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/optimize.py +0 -0
  55. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/commands/review.py +0 -0
  56. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/gh/__init__.py +0 -0
  57. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/gh/core.py +0 -0
  58. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/gh/issues.py +0 -0
  59. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/gh/labels.py +0 -0
  60. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/gh/milestones.py +0 -0
  61. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/git_ops.py +0 -0
  62. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/logging_setup.py +0 -0
  63. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/memory.py +0 -0
  64. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/__init__.py +0 -0
  65. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/_client_lifecycle.py +0 -0
  66. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/_comments.py +0 -0
  67. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/_memory_writers.py +0 -0
  68. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/orchestrator/_phase5_precommit.py +0 -0
  69. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/__init__.py +0 -0
  70. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/hashes.py +0 -0
  71. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-optimize-requirements.md +0 -0
  72. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-0-complexity.md +0 -0
  73. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-1-planning.md +0 -0
  74. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-2-issue-review.md +0 -0
  75. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-3-implementation.md +0 -0
  76. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-5-final-review.md +0 -0
  77. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-6-test.md +0 -0
  78. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-phase-7-commit.md +0 -0
  79. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/prompts/prompt-review.md +0 -0
  80. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/repo_info.py +0 -0
  81. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/repomap.py +0 -0
  82. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/requirements_structure.py +0 -0
  83. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/__init__.py +0 -0
  84. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/_telemetry.py +0 -0
  85. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/batch.py +0 -0
  86. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/fake_runner.py +0 -0
  87. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/mcp.py +0 -0
  88. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/message_parsing.py +0 -0
  89. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/options.py +0 -0
  90. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/protocol.py +0 -0
  91. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/retry.py +0 -0
  92. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/sdk_runner.py +0 -0
  93. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/soft_reset.py +0 -0
  94. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/state_guard.py +0 -0
  95. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/subprocess_runner.py +0 -0
  96. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/types.py +0 -0
  97. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/runner/utils.py +0 -0
  98. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/state_retention.py +0 -0
  99. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/__init__.py +0 -0
  100. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/angular.md +0 -0
  101. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/base.md +0 -0
  102. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/fastapi.md +0 -0
  103. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/finance.md +0 -0
  104. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/fullstack.md +0 -0
  105. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/nestjs.md +0 -0
  106. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/src/code_generator/templates/python-cli.md +0 -0
  107. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_agents.py +0 -0
  108. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_bench.py +0 -0
  109. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_bench_compare.py +0 -0
  110. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_bench_export.py +0 -0
  111. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_bench_fixture.py +0 -0
  112. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_bench_regression.py +0 -0
  113. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_changelog.py +0 -0
  114. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_claude_md.py +0 -0
  115. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_client_lifecycle.py +0 -0
  116. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_comments.py +0 -0
  117. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_commit_message.py +0 -0
  118. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_crash_recovery.py +0 -0
  119. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_cycle_loop.py +0 -0
  120. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_cycle_loop_multicycle.py +0 -0
  121. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_delta_planning.py +0 -0
  122. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_dependencies.py +0 -0
  123. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_detect.py +0 -0
  124. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_docs_no_default_max_turns.py +0 -0
  125. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_effort.py +0 -0
  126. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_generate.py +0 -0
  127. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_generate_resume.py +0 -0
  128. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_gh.py +0 -0
  129. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_gh_labels.py +0 -0
  130. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_gh_milestones.py +0 -0
  131. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_gh_repo_threading.py +0 -0
  132. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_gh_submodules.py +0 -0
  133. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_git_ops.py +0 -0
  134. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_init.py +0 -0
  135. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_logging_setup.py +0 -0
  136. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_max_turns_cli_flag.py +0 -0
  137. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_mcp.py +0 -0
  138. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_memory.py +0 -0
  139. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_memory_writers.py +0 -0
  140. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_message_parsing.py +0 -0
  141. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_no_max_turns_in_call_sites.py +0 -0
  142. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_no_max_turns_literal.py +0 -0
  143. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_non_goals_grep_guard.py +0 -0
  144. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_optimize.py +0 -0
  145. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_options.py +0 -0
  146. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase0.py +0 -0
  147. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase1.py +0 -0
  148. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase2.py +0 -0
  149. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase2_batch.py +0 -0
  150. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase3_4.py +0 -0
  151. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase5.py +0 -0
  152. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase5_precommit.py +0 -0
  153. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase6.py +0 -0
  154. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase7.py +0 -0
  155. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase_mcp_regression.py +0 -0
  156. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_phase_token_logging.py +0 -0
  157. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_preflight.py +0 -0
  158. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_prompt_drift.py +0 -0
  159. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_prompt_prefix_snapshots.py +0 -0
  160. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_prompt_prefix_stability.py +0 -0
  161. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_prompts.py +0 -0
  162. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_rate_limit.py +0 -0
  163. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_repo_info.py +0 -0
  164. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_repomap.py +0 -0
  165. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_requirements_structure.py +0 -0
  166. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_retry.py +0 -0
  167. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_review.py +0 -0
  168. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_runner_protocol.py +0 -0
  169. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_runner_protocol_annotations.py +0 -0
  170. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_runner_types.py +0 -0
  171. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_runner_utils.py +0 -0
  172. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_sdk_runner.py +0 -0
  173. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_sdk_runner_shared.py +0 -0
  174. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_session_mode.py +0 -0
  175. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_state.py +0 -0
  176. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_state_guard.py +0 -0
  177. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_state_retention.py +0 -0
  178. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_subprocess_runner.py +0 -0
  179. {claude_code_generator-0.4.3 → claude_code_generator-0.4.4}/tests/test_telemetry.py +0 -0
  180. {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
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.2.0,>=0.1.61
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.3"
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.1.61,<0.2.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
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.2.0,>=0.1.61
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
@@ -1,4 +1,4 @@
1
- claude-agent-sdk<0.2.0,>=0.1.61
1
+ claude-agent-sdk<0.4.0,>=0.3.0
2
2
  typer
3
3
  rich
4
4
 
@@ -1,3 +1,3 @@
1
1
  """code-generator: orchestrator CLI for end-to-end project generation."""
2
2
 
3
- __version__ = "0.4.3"
3
+ __version__ = "0.4.4"
@@ -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 generate_command
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)
@@ -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(st, project_dir, runner_module=runner_module, logger=logger)
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(st, None, project_dir, runner_module=runner_module, logger=logger)
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
  )