claude-code-generator 0.4.0__tar.gz → 0.4.2__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 (169) hide show
  1. {claude_code_generator-0.4.0/src/claude_code_generator.egg-info → claude_code_generator-0.4.2}/PKG-INFO +1 -1
  2. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/pyproject.toml +1 -1
  3. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2/src/claude_code_generator.egg-info}/PKG-INFO +1 -1
  4. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/__init__.py +1 -1
  5. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/effort.py +23 -14
  6. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/_client_lifecycle.py +6 -0
  7. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/phase2_review.py +3 -3
  8. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/phase3_4_implement.py +2 -1
  9. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/phase5_closure.py +1 -1
  10. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_effort.py +18 -5
  11. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/LICENSE +0 -0
  12. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/README.md +0 -0
  13. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/setup.cfg +0 -0
  14. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/claude_code_generator.egg-info/SOURCES.txt +0 -0
  15. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/claude_code_generator.egg-info/dependency_links.txt +0 -0
  16. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/claude_code_generator.egg-info/entry_points.txt +0 -0
  17. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/claude_code_generator.egg-info/requires.txt +0 -0
  18. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/claude_code_generator.egg-info/top_level.txt +0 -0
  19. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/agents.py +0 -0
  20. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/cli.py +0 -0
  21. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/__init__.py +0 -0
  22. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/_bench_io.py +0 -0
  23. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/_crash_recovery.py +0 -0
  24. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/_detect.py +0 -0
  25. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/_dispatch.py +0 -0
  26. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/_resume.py +0 -0
  27. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/_validators.py +0 -0
  28. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/bench.py +0 -0
  29. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/bench_compare.py +0 -0
  30. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/bench_export.py +0 -0
  31. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/generate.py +0 -0
  32. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/init.py +0 -0
  33. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/optimize.py +0 -0
  34. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/review.py +0 -0
  35. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/commands/status.py +0 -0
  36. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/env.py +0 -0
  37. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/gh/__init__.py +0 -0
  38. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/gh/core.py +0 -0
  39. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/gh/issues.py +0 -0
  40. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/gh/labels.py +0 -0
  41. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/gh/milestones.py +0 -0
  42. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/git_ops.py +0 -0
  43. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/logging_setup.py +0 -0
  44. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/memory.py +0 -0
  45. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/__init__.py +0 -0
  46. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/_comments.py +0 -0
  47. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/_memory_writers.py +0 -0
  48. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/_phase5_precommit.py +0 -0
  49. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/cycle_loop.py +0 -0
  50. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/phase0_complexity.py +0 -0
  51. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/phase1_plan.py +0 -0
  52. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/phase6_test.py +0 -0
  53. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/orchestrator/phase7_commit.py +0 -0
  54. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/preflight.py +0 -0
  55. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/prompts/__init__.py +0 -0
  56. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/prompts/hashes.py +0 -0
  57. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/prompts/prompt-optimize-requirements.md +0 -0
  58. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/prompts/prompt-phase-0-complexity.md +0 -0
  59. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/prompts/prompt-phase-1-planning.md +0 -0
  60. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/prompts/prompt-phase-2-issue-review.md +0 -0
  61. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/prompts/prompt-phase-3-implementation.md +0 -0
  62. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/prompts/prompt-phase-5-final-review.md +0 -0
  63. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/prompts/prompt-phase-6-test.md +0 -0
  64. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/prompts/prompt-phase-7-commit.md +0 -0
  65. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/prompts/prompt-review.md +0 -0
  66. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/repo_info.py +0 -0
  67. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/repomap.py +0 -0
  68. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/requirements_structure.py +0 -0
  69. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/__init__.py +0 -0
  70. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/_telemetry.py +0 -0
  71. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/batch.py +0 -0
  72. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/fake_runner.py +0 -0
  73. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/mcp.py +0 -0
  74. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/message_parsing.py +0 -0
  75. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/options.py +0 -0
  76. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/protocol.py +0 -0
  77. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/rate_limit.py +0 -0
  78. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/retry.py +0 -0
  79. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/sdk_runner.py +0 -0
  80. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/soft_reset.py +0 -0
  81. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/state_guard.py +0 -0
  82. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/subprocess_runner.py +0 -0
  83. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/types.py +0 -0
  84. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/runner/utils.py +0 -0
  85. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/state.py +0 -0
  86. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/state_retention.py +0 -0
  87. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/templates/__init__.py +0 -0
  88. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/templates/angular.md +0 -0
  89. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/templates/base.md +0 -0
  90. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/templates/fastapi.md +0 -0
  91. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/templates/finance.md +0 -0
  92. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/templates/fullstack.md +0 -0
  93. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/templates/nestjs.md +0 -0
  94. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/src/code_generator/templates/python-cli.md +0 -0
  95. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_agents.py +0 -0
  96. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_bench.py +0 -0
  97. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_bench_compare.py +0 -0
  98. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_bench_export.py +0 -0
  99. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_bench_fixture.py +0 -0
  100. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_bench_regression.py +0 -0
  101. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_changelog.py +0 -0
  102. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_claude_md.py +0 -0
  103. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_client_lifecycle.py +0 -0
  104. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_comments.py +0 -0
  105. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_commit_message.py +0 -0
  106. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_crash_recovery.py +0 -0
  107. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_cycle_loop.py +0 -0
  108. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_cycle_loop_multicycle.py +0 -0
  109. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_delta_planning.py +0 -0
  110. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_dependencies.py +0 -0
  111. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_detect.py +0 -0
  112. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_docs_no_default_max_turns.py +0 -0
  113. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_env.py +0 -0
  114. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_generate.py +0 -0
  115. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_generate_resume.py +0 -0
  116. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_gh.py +0 -0
  117. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_gh_labels.py +0 -0
  118. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_gh_milestones.py +0 -0
  119. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_gh_repo_threading.py +0 -0
  120. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_gh_submodules.py +0 -0
  121. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_git_ops.py +0 -0
  122. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_init.py +0 -0
  123. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_logging_setup.py +0 -0
  124. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_max_turns_cli_flag.py +0 -0
  125. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_mcp.py +0 -0
  126. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_memory.py +0 -0
  127. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_memory_writers.py +0 -0
  128. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_message_parsing.py +0 -0
  129. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_no_max_turns_in_call_sites.py +0 -0
  130. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_no_max_turns_literal.py +0 -0
  131. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_non_goals_grep_guard.py +0 -0
  132. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_optimize.py +0 -0
  133. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_options.py +0 -0
  134. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_phase0.py +0 -0
  135. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_phase1.py +0 -0
  136. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_phase2.py +0 -0
  137. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_phase2_batch.py +0 -0
  138. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_phase3_4.py +0 -0
  139. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_phase5.py +0 -0
  140. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_phase5_precommit.py +0 -0
  141. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_phase6.py +0 -0
  142. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_phase7.py +0 -0
  143. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_phase_mcp_regression.py +0 -0
  144. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_phase_token_logging.py +0 -0
  145. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_preflight.py +0 -0
  146. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_prompt_drift.py +0 -0
  147. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_prompt_prefix_snapshots.py +0 -0
  148. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_prompt_prefix_stability.py +0 -0
  149. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_prompts.py +0 -0
  150. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_rate_limit.py +0 -0
  151. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_repo_info.py +0 -0
  152. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_repomap.py +0 -0
  153. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_requirements_structure.py +0 -0
  154. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_retry.py +0 -0
  155. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_review.py +0 -0
  156. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_runner_protocol.py +0 -0
  157. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_runner_protocol_annotations.py +0 -0
  158. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_runner_types.py +0 -0
  159. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_runner_utils.py +0 -0
  160. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_sdk_runner.py +0 -0
  161. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_sdk_runner_shared.py +0 -0
  162. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_session_mode.py +0 -0
  163. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_state.py +0 -0
  164. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_state_guard.py +0 -0
  165. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_state_retention.py +0 -0
  166. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_status.py +0 -0
  167. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_subprocess_runner.py +0 -0
  168. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/tests/test_telemetry.py +0 -0
  169. {claude_code_generator-0.4.0 → claude_code_generator-0.4.2}/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.0
3
+ Version: 0.4.2
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "claude-code-generator"
7
- version = "0.4.0"
7
+ version = "0.4.2"
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" }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-generator
3
- Version: 0.4.0
3
+ Version: 0.4.2
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
@@ -1,3 +1,3 @@
1
1
  """code-generator: orchestrator CLI for end-to-end project generation."""
2
2
 
3
- __version__ = "0.4.0"
3
+ __version__ = "0.4.2"
@@ -26,7 +26,7 @@ if TYPE_CHECKING:
26
26
  # Public types
27
27
  # ---------------------------------------------------------------------------
28
28
 
29
- EffortLiteral = Literal["low", "medium", "high", "max"]
29
+ EffortLiteral = Literal["low", "medium", "high", "xhigh", "max"]
30
30
 
31
31
 
32
32
  class InvalidEffortInput(ValueError):
@@ -45,6 +45,7 @@ class EffortLevel(StrEnum):
45
45
  LOW = "low"
46
46
  MEDIUM = "medium"
47
47
  HIGH = "high"
48
+ XHIGH = "xhigh"
48
49
  MAX = "max"
49
50
 
50
51
 
@@ -53,14 +54,14 @@ class EffortLevel(StrEnum):
53
54
  # ---------------------------------------------------------------------------
54
55
 
55
56
  _BASELINE: dict[int, EffortLevel] = {
56
- 0: EffortLevel.LOW, # complexity analysis
57
- 1: EffortLevel.HIGH, # plan
58
- 2: EffortLevel.HIGH, # review
59
- 3: EffortLevel.MEDIUM, # implement (lower bound of 3+4 combined)
60
- 4: EffortLevel.MEDIUM, # implement (upper bound of 3+4 combined)
61
- 5: EffortLevel.HIGH, # closure
62
- 6: EffortLevel.LOW, # tests (escalated by retry_count)
63
- 7: EffortLevel.LOW, # commit
57
+ 0: EffortLevel.XHIGH, # complexity analysis + cycle decomposition (architectural)
58
+ 1: EffortLevel.XHIGH, # plan
59
+ 2: EffortLevel.XHIGH, # review
60
+ 3: EffortLevel.MEDIUM, # implement (lower bound of 3+4 combined; Sonnet)
61
+ 4: EffortLevel.MEDIUM, # implement (upper bound of 3+4 combined; Sonnet)
62
+ 5: EffortLevel.XHIGH, # closure (cross-module review)
63
+ 6: EffortLevel.LOW, # tests (Sonnet; escalated by retry_count)
64
+ 7: EffortLevel.LOW, # commit (mechanical, Opus)
64
65
  }
65
66
 
66
67
  _COMPLEXITY_HIGH_LABEL = "complexity:high"
@@ -96,19 +97,27 @@ def _test_effort(retry_count: int) -> EffortLevel:
96
97
  _OPUS_MODEL = "claude-opus-4-7"
97
98
 
98
99
 
100
+ _OPUS_ONLY_EFFORTS: frozenset[str] = frozenset({"xhigh", "max"})
101
+
102
+
99
103
  def validate_effort(effort: str | None, model: str) -> None:
100
- """Raise ValueError when ``max`` effort is paired with a non-Opus model.
104
+ """Raise ValueError when an Opus-only effort is paired with a non-Opus model.
105
+
106
+ ``xhigh`` and ``max`` are gated to Opus 4.7+ (introduced in 4.7); Sonnet
107
+ and Haiku do not expose them.
101
108
 
102
109
  Parameters
103
110
  ----------
104
111
  effort:
105
- Effort level string (``"low"`` / ``"medium"`` / ``"high"`` / ``"max"``),
106
- or ``None`` (no-op).
112
+ Effort level string (``"low"`` / ``"medium"`` / ``"high"`` / ``"xhigh"``
113
+ / ``"max"``), or ``None`` (no-op).
107
114
  model:
108
115
  Anthropic model ID (e.g. ``"claude-opus-4-7"``).
109
116
  """
110
- if effort == "max" and model != _OPUS_MODEL:
111
- raise ValueError(f"effort='max' is only allowed with {_OPUS_MODEL!r}, got {model!r}.")
117
+ if effort in _OPUS_ONLY_EFFORTS and model != _OPUS_MODEL:
118
+ raise ValueError(
119
+ f"effort={effort!r} is only allowed with {_OPUS_MODEL!r}, got {model!r}."
120
+ )
112
121
 
113
122
 
114
123
  def resolve_effort(
@@ -41,6 +41,12 @@ _SHARED_CLIENT_ALLOWED_TOOLS: tuple[str, ...] = (
41
41
  "Bash",
42
42
  "Glob",
43
43
  "Grep",
44
+ # Web access — Phase 3/4 prompt instructs the model to consult upstream
45
+ # docs for unfamiliar libraries before guessing. WebFetch is sandboxed by
46
+ # the API: it can only retrieve URLs already in conversation context (no
47
+ # arbitrary model-generated URLs), which closes the exfiltration vector.
48
+ "WebSearch",
49
+ "WebFetch",
44
50
  )
45
51
 
46
52
  # Guard SDK import so this module can be loaded without the SDK installed
@@ -169,7 +169,7 @@ async def run_batch(
169
169
  warmup_options = make_agent_options(
170
170
  model="claude-opus-4-7",
171
171
  effort=effort_level,
172
- allowed_tools=["Read", "Bash", "Glob", "Grep"] + mcp_tools,
172
+ allowed_tools=["Read", "Bash", "Glob", "Grep", "WebSearch", "WebFetch"] + mcp_tools,
173
173
  cwd=str(project_dir),
174
174
  mcp_servers=mcp_servers,
175
175
  context_management=None,
@@ -419,7 +419,7 @@ async def _run_fallback_review(
419
419
  options = make_agent_options(
420
420
  model="claude-opus-4-7",
421
421
  effort=effort_level,
422
- allowed_tools=["Read", "Bash", "Glob", "Grep"] + mcp_tools,
422
+ allowed_tools=["Read", "Bash", "Glob", "Grep", "WebSearch", "WebFetch"] + mcp_tools,
423
423
  cwd=str(project_dir),
424
424
  mcp_servers=mcp_servers,
425
425
  context_management=None,
@@ -579,7 +579,7 @@ async def run(
579
579
  options = make_agent_options(
580
580
  model="claude-opus-4-7",
581
581
  effort=effort_level,
582
- allowed_tools=["Read", "Bash", "Glob", "Grep"] + mcp_tools,
582
+ allowed_tools=["Read", "Bash", "Glob", "Grep", "WebSearch", "WebFetch"] + mcp_tools,
583
583
  cwd=str(project_dir),
584
584
  mcp_servers=mcp_servers,
585
585
  context_management=cm_block,
@@ -242,7 +242,8 @@ async def _implement_single_issue(
242
242
  options = make_agent_options(
243
243
  model="claude-sonnet-4-6",
244
244
  effort=effort_level,
245
- allowed_tools=["Read", "Edit", "Write", "Bash", "Glob", "Grep"] + mcp_tools,
245
+ allowed_tools=["Read", "Edit", "Write", "Bash", "Glob", "Grep", "WebSearch", "WebFetch"]
246
+ + mcp_tools,
246
247
  cwd=str(project_dir),
247
248
  mcp_servers=mcp_servers,
248
249
  context_management_enabled=True,
@@ -338,7 +338,7 @@ async def run(
338
338
  options = make_agent_options(
339
339
  model="claude-opus-4-7",
340
340
  effort=effort_level,
341
- allowed_tools=["Read", "Bash", "Glob", "Grep"] + mcp_tools,
341
+ allowed_tools=["Read", "Bash", "Glob", "Grep", "WebSearch", "WebFetch"] + mcp_tools,
342
342
  cwd=str(project_dir),
343
343
  mcp_servers=mcp_servers,
344
344
  **max_turns_kwargs(max_turns),
@@ -17,10 +17,10 @@ from code_generator.effort import EffortLevel, InvalidEffortInput, resolve_effor
17
17
  @pytest.mark.parametrize(
18
18
  ("phase", "expected"),
19
19
  [
20
- (0, EffortLevel.LOW),
21
- (1, EffortLevel.HIGH),
22
- (2, EffortLevel.HIGH),
23
- (5, EffortLevel.HIGH),
20
+ (0, EffortLevel.XHIGH),
21
+ (1, EffortLevel.XHIGH),
22
+ (2, EffortLevel.XHIGH),
23
+ (5, EffortLevel.XHIGH),
24
24
  (3, EffortLevel.MEDIUM),
25
25
  (4, EffortLevel.MEDIUM),
26
26
  (7, EffortLevel.LOW),
@@ -128,7 +128,7 @@ def test_effort_hint_none_does_not_override() -> None:
128
128
  result = resolve_effort(
129
129
  phase=0, complexity="low", issue_labels=[], retry_count=0, effort_hint=None
130
130
  )
131
- assert result == EffortLevel.LOW
131
+ assert result == EffortLevel.XHIGH
132
132
 
133
133
 
134
134
  # ---------------------------------------------------------------------------
@@ -141,6 +141,7 @@ def test_effort_level_string_values() -> None:
141
141
  assert EffortLevel.LOW == "low"
142
142
  assert EffortLevel.MEDIUM == "medium"
143
143
  assert EffortLevel.HIGH == "high"
144
+ assert EffortLevel.XHIGH == "xhigh"
144
145
  assert EffortLevel.MAX == "max"
145
146
 
146
147
 
@@ -165,6 +166,11 @@ def test_validate_effort_max_with_opus_passes() -> None:
165
166
  validate_effort("max", "claude-opus-4-7") # must not raise
166
167
 
167
168
 
169
+ def test_validate_effort_xhigh_with_opus_passes() -> None:
170
+ """xhigh effort is allowed for claude-opus-4-7 (introduced in 4.7)."""
171
+ validate_effort("xhigh", "claude-opus-4-7") # must not raise
172
+
173
+
168
174
  @pytest.mark.parametrize("model", ["claude-sonnet-4-6", "claude-haiku-4-5"])
169
175
  def test_validate_effort_max_with_non_opus_raises(model: str) -> None:
170
176
  """max effort raises ValueError for Sonnet and Haiku models."""
@@ -172,6 +178,13 @@ def test_validate_effort_max_with_non_opus_raises(model: str) -> None:
172
178
  validate_effort("max", model)
173
179
 
174
180
 
181
+ @pytest.mark.parametrize("model", ["claude-sonnet-4-6", "claude-haiku-4-5"])
182
+ def test_validate_effort_xhigh_with_non_opus_raises(model: str) -> None:
183
+ """xhigh effort raises ValueError for Sonnet and Haiku models."""
184
+ with pytest.raises(ValueError, match="xhigh"):
185
+ validate_effort("xhigh", model)
186
+
187
+
175
188
  @pytest.mark.parametrize(
176
189
  ("effort", "model"),
177
190
  [