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