claude-code-generator 0.4.17__tar.gz → 0.5.0__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 (192) hide show
  1. {claude_code_generator-0.4.17/src/claude_code_generator.egg-info → claude_code_generator-0.5.0}/PKG-INFO +17 -5
  2. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/README.md +15 -0
  3. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/pyproject.toml +8 -12
  4. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0/src/claude_code_generator.egg-info}/PKG-INFO +17 -5
  5. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/claude_code_generator.egg-info/SOURCES.txt +1 -4
  6. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/claude_code_generator.egg-info/requires.txt +1 -5
  7. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/__init__.py +1 -1
  8. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/agents.py +2 -31
  9. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/_dispatch.py +94 -0
  10. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/memory.py +6 -4
  11. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/cycle_loop.py +0 -36
  12. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/cycle_prompts.py +1 -1
  13. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase0_complexity.py +1 -1
  14. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase1_plan.py +1 -1
  15. claude_code_generator-0.5.0/src/code_generator/orchestrator/phase2_review.py +329 -0
  16. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase3_4_implement.py +2 -44
  17. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase5_closure.py +1 -1
  18. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/prompts/__init__.py +0 -3
  19. claude_code_generator-0.5.0/src/code_generator/prompts/prompt-cycle-specializer.md +62 -0
  20. claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-0-complexity.md +96 -0
  21. claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-1-planning.md +149 -0
  22. claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-2-batch-review.md +73 -0
  23. claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-3-implementation.md +97 -0
  24. claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-5-final-review.md +123 -0
  25. claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-6-test.md +77 -0
  26. claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-7-commit.md +108 -0
  27. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_agents.py +1 -98
  28. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_cycle_loop.py +0 -120
  29. claude_code_generator-0.5.0/tests/test_dispatch_graph_report.py +178 -0
  30. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_effective_model_routing.py +0 -2
  31. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_memory.py +3 -1
  32. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_phase3_4.py +0 -116
  33. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_phase5.py +1 -1
  34. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_prompt_drift.py +2 -2
  35. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_prompt_prefix_stability.py +0 -26
  36. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_prompts.py +6 -28
  37. claude_code_generator-0.4.17/src/code_generator/orchestrator/phase2_review.py +0 -775
  38. claude_code_generator-0.4.17/src/code_generator/prompts/prompt-cycle-specializer.md +0 -62
  39. claude_code_generator-0.4.17/src/code_generator/prompts/prompt-phase-0-complexity.md +0 -153
  40. claude_code_generator-0.4.17/src/code_generator/prompts/prompt-phase-1-planning.md +0 -228
  41. claude_code_generator-0.4.17/src/code_generator/prompts/prompt-phase-2-batch-review.md +0 -84
  42. claude_code_generator-0.4.17/src/code_generator/prompts/prompt-phase-2-issue-review.md +0 -110
  43. claude_code_generator-0.4.17/src/code_generator/prompts/prompt-phase-3-implementation.md +0 -213
  44. claude_code_generator-0.4.17/src/code_generator/prompts/prompt-phase-5-final-review.md +0 -174
  45. claude_code_generator-0.4.17/src/code_generator/prompts/prompt-phase-6-test.md +0 -113
  46. claude_code_generator-0.4.17/src/code_generator/prompts/prompt-phase-7-commit.md +0 -148
  47. claude_code_generator-0.4.17/src/code_generator/repomap.py +0 -237
  48. claude_code_generator-0.4.17/tests/test_phase2_batch.py +0 -602
  49. claude_code_generator-0.4.17/tests/test_repomap.py +0 -111
  50. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/LICENSE +0 -0
  51. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/setup.cfg +0 -0
  52. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/claude_code_generator.egg-info/dependency_links.txt +0 -0
  53. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/claude_code_generator.egg-info/entry_points.txt +0 -0
  54. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/claude_code_generator.egg-info/top_level.txt +0 -0
  55. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/cli.py +0 -0
  56. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/__init__.py +0 -0
  57. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/_bench_io.py +0 -0
  58. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/_crash_recovery.py +0 -0
  59. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/_detect.py +0 -0
  60. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/_resume.py +0 -0
  61. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/_validators.py +0 -0
  62. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/bench.py +0 -0
  63. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/bench_compare.py +0 -0
  64. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/bench_export.py +0 -0
  65. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/generate.py +0 -0
  66. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/init.py +0 -0
  67. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/optimize.py +0 -0
  68. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/review.py +0 -0
  69. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/commands/status.py +0 -0
  70. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/effort.py +0 -0
  71. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/env.py +0 -0
  72. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/gh/__init__.py +0 -0
  73. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/gh/core.py +0 -0
  74. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/gh/issues.py +0 -0
  75. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/gh/labels.py +0 -0
  76. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/gh/milestones.py +0 -0
  77. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/git_ops.py +0 -0
  78. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/logging_setup.py +0 -0
  79. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/__init__.py +0 -0
  80. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/_client_lifecycle.py +0 -0
  81. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/_comments.py +0 -0
  82. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/_memory_writers.py +0 -0
  83. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/_phase5_precommit.py +0 -0
  84. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/ollama_budget.py +0 -0
  85. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase6_test.py +0 -0
  86. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase7_commit.py +0 -0
  87. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/preflight.py +0 -0
  88. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/prompts/hashes.py +0 -0
  89. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/prompts/prompt-optimize-requirements.md +0 -0
  90. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/prompts/prompt-review.md +0 -0
  91. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/repo_info.py +0 -0
  92. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/requirements_structure.py +0 -0
  93. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/__init__.py +0 -0
  94. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/_telemetry.py +0 -0
  95. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/batch.py +0 -0
  96. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/fake_runner.py +0 -0
  97. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/mcp.py +0 -0
  98. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/message_parsing.py +0 -0
  99. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/options.py +0 -0
  100. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/protocol.py +0 -0
  101. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/rate_limit.py +0 -0
  102. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/retry.py +0 -0
  103. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/sdk_runner.py +0 -0
  104. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/soft_reset.py +0 -0
  105. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/state_guard.py +0 -0
  106. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/subprocess_runner.py +0 -0
  107. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/types.py +0 -0
  108. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/runner/utils.py +0 -0
  109. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/state.py +0 -0
  110. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/state_retention.py +0 -0
  111. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/templates/__init__.py +0 -0
  112. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/templates/angular.md +0 -0
  113. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/templates/base.md +0 -0
  114. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/templates/fastapi.md +0 -0
  115. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/templates/finance.md +0 -0
  116. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/templates/fullstack.md +0 -0
  117. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/templates/nestjs.md +0 -0
  118. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/src/code_generator/templates/python-cli.md +0 -0
  119. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_bench.py +0 -0
  120. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_bench_compare.py +0 -0
  121. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_bench_export.py +0 -0
  122. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_bench_fixture.py +0 -0
  123. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_bench_regression.py +0 -0
  124. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_changelog.py +0 -0
  125. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_claude_md.py +0 -0
  126. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_client_lifecycle.py +0 -0
  127. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_comments.py +0 -0
  128. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_commit_message.py +0 -0
  129. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_crash_recovery.py +0 -0
  130. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_cycle_loop_multicycle.py +0 -0
  131. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_cycle_ollama_model.py +0 -0
  132. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_cycle_prompts.py +0 -0
  133. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_delta_planning.py +0 -0
  134. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_dependencies.py +0 -0
  135. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_detect.py +0 -0
  136. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_docs_no_default_max_turns.py +0 -0
  137. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_docs_ollama_model_guide.py +0 -0
  138. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_docs_ollama_pro.py +0 -0
  139. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_effort.py +0 -0
  140. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_env.py +0 -0
  141. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_generate.py +0 -0
  142. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_generate_ollama.py +0 -0
  143. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_generate_resume.py +0 -0
  144. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_gh.py +0 -0
  145. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_gh_labels.py +0 -0
  146. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_gh_milestones.py +0 -0
  147. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_gh_repo_threading.py +0 -0
  148. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_gh_submodules.py +0 -0
  149. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_git_ops.py +0 -0
  150. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_init.py +0 -0
  151. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_logging_setup.py +0 -0
  152. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_max_turns_cli_flag.py +0 -0
  153. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_mcp.py +0 -0
  154. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_memory_writers.py +0 -0
  155. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_message_parsing.py +0 -0
  156. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_no_max_turns_in_call_sites.py +0 -0
  157. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_no_max_turns_literal.py +0 -0
  158. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_non_goals_grep_guard.py +0 -0
  159. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_ollama_budget.py +0 -0
  160. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_ollama_rate_limit.py +0 -0
  161. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_optimize.py +0 -0
  162. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_options.py +0 -0
  163. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_phase0.py +0 -0
  164. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_phase1.py +0 -0
  165. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_phase2.py +0 -0
  166. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_phase5_precommit.py +0 -0
  167. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_phase6.py +0 -0
  168. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_phase7.py +0 -0
  169. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_phase_mcp_regression.py +0 -0
  170. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_phase_token_logging.py +0 -0
  171. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_preflight.py +0 -0
  172. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_preflight_ollama.py +0 -0
  173. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_prompt_prefix_snapshots.py +0 -0
  174. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_rate_limit.py +0 -0
  175. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_repo_info.py +0 -0
  176. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_requirements_structure.py +0 -0
  177. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_retry.py +0 -0
  178. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_review.py +0 -0
  179. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_runner_protocol.py +0 -0
  180. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_runner_protocol_annotations.py +0 -0
  181. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_runner_types.py +0 -0
  182. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_runner_utils.py +0 -0
  183. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_sdk_runner.py +0 -0
  184. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_sdk_runner_shared.py +0 -0
  185. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_session_mode.py +0 -0
  186. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_state.py +0 -0
  187. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_state_guard.py +0 -0
  188. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_state_retention.py +0 -0
  189. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_status.py +0 -0
  190. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_subprocess_runner.py +0 -0
  191. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/tests/test_telemetry.py +0 -0
  192. {claude_code_generator-0.4.17 → claude_code_generator-0.5.0}/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.17
3
+ Version: 0.5.0
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
@@ -27,16 +27,13 @@ Provides-Extra: dev
27
27
  Requires-Dist: pytest; extra == "dev"
28
28
  Requires-Dist: pytest-asyncio; extra == "dev"
29
29
  Requires-Dist: ruff; extra == "dev"
30
- Provides-Extra: repomap
31
- Requires-Dist: tree-sitter>=0.23; extra == "repomap"
32
- Requires-Dist: tree-sitter-language-pack>=0.5; extra == "repomap"
33
30
  Provides-Extra: mcp
34
31
  Requires-Dist: mcp<2.0,>=1.0; extra == "mcp"
35
32
  Requires-Dist: serena-agent<2.0,>=1.1; extra == "mcp"
36
33
  Provides-Extra: batch
37
34
  Requires-Dist: anthropic>=0.35; extra == "batch"
38
35
  Provides-Extra: all
39
- Requires-Dist: claude-code-generator[batch,mcp,repomap]; extra == "all"
36
+ Requires-Dist: claude-code-generator[batch,mcp]; extra == "all"
40
37
  Dynamic: license-file
41
38
 
42
39
  # code-generator
@@ -56,6 +53,21 @@ git clone git@github.com:SilvioBaratto/code-generator.git
56
53
  cd code-generator && pip install -e ".[dev]"
57
54
  ```
58
55
 
56
+ ### Optional: codebase graph (graphify)
57
+
58
+ Phases 0, 1, and 2 inject a knowledge-graph report from [graphify](https://github.com/safishamsi/graphify) for richer code orientation. When the binary is missing, the orchestrator falls back to a sentinel string and continues.
59
+
60
+ ```bash
61
+ pipx install graphifyy # CLI binary is `graphify`
62
+ ```
63
+
64
+ Add to your project's `.gitignore`:
65
+
66
+ ```
67
+ graphify-out/manifest.json
68
+ graphify-out/cost.json
69
+ ```
70
+
59
71
  ## Authentication
60
72
 
61
73
  ```bash
@@ -15,6 +15,21 @@ git clone git@github.com:SilvioBaratto/code-generator.git
15
15
  cd code-generator && pip install -e ".[dev]"
16
16
  ```
17
17
 
18
+ ### Optional: codebase graph (graphify)
19
+
20
+ Phases 0, 1, and 2 inject a knowledge-graph report from [graphify](https://github.com/safishamsi/graphify) for richer code orientation. When the binary is missing, the orchestrator falls back to a sentinel string and continues.
21
+
22
+ ```bash
23
+ pipx install graphifyy # CLI binary is `graphify`
24
+ ```
25
+
26
+ Add to your project's `.gitignore`:
27
+
28
+ ```
29
+ graphify-out/manifest.json
30
+ graphify-out/cost.json
31
+ ```
32
+
18
33
  ## Authentication
19
34
 
20
35
  ```bash
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "claude-code-generator"
7
- version = "0.4.17"
7
+ version = "0.5.0"
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" }
@@ -39,13 +39,6 @@ dev = [
39
39
  "pytest-asyncio",
40
40
  "ruff",
41
41
  ]
42
- repomap = [
43
- # Migrated from the unmaintained tree-sitter-languages (1.10, late 2023)
44
- # to its actively-maintained successor tree-sitter-language-pack
45
- # (released April 2026, 305+ grammars, modern Python/TS syntax).
46
- "tree-sitter>=0.23",
47
- "tree-sitter-language-pack>=0.5",
48
- ]
49
42
  mcp = [
50
43
  # Python MCP client library.
51
44
  "mcp>=1.0,<2.0",
@@ -61,11 +54,14 @@ batch = [
61
54
  "anthropic>=0.35",
62
55
  ]
63
56
  all = [
64
- # Everything pip can install: repomap (tree-sitter), MCP client + Serena
65
- # MCP server, and the Anthropic Batches API. The primary MCP server
66
- # codebase-memory-mcp is a Rust crate and must be installed separately:
57
+ # Everything pip can install: MCP client + Serena MCP server, and the
58
+ # Anthropic Batches API. The primary MCP server codebase-memory-mcp is a
59
+ # Rust crate and must be installed separately:
67
60
  # cargo install codebase-memory-mcp
68
- "claude-code-generator[repomap,mcp,batch]",
61
+ # The codebase graph injection (replaces the old [repomap] extra) requires
62
+ # graphify to be installed separately:
63
+ # pipx install graphifyy
64
+ "claude-code-generator[mcp,batch]",
69
65
  ]
70
66
 
71
67
  [project.scripts]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-generator
3
- Version: 0.4.17
3
+ Version: 0.5.0
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
@@ -27,16 +27,13 @@ Provides-Extra: dev
27
27
  Requires-Dist: pytest; extra == "dev"
28
28
  Requires-Dist: pytest-asyncio; extra == "dev"
29
29
  Requires-Dist: ruff; extra == "dev"
30
- Provides-Extra: repomap
31
- Requires-Dist: tree-sitter>=0.23; extra == "repomap"
32
- Requires-Dist: tree-sitter-language-pack>=0.5; extra == "repomap"
33
30
  Provides-Extra: mcp
34
31
  Requires-Dist: mcp<2.0,>=1.0; extra == "mcp"
35
32
  Requires-Dist: serena-agent<2.0,>=1.1; extra == "mcp"
36
33
  Provides-Extra: batch
37
34
  Requires-Dist: anthropic>=0.35; extra == "batch"
38
35
  Provides-Extra: all
39
- Requires-Dist: claude-code-generator[batch,mcp,repomap]; extra == "all"
36
+ Requires-Dist: claude-code-generator[batch,mcp]; extra == "all"
40
37
  Dynamic: license-file
41
38
 
42
39
  # code-generator
@@ -56,6 +53,21 @@ git clone git@github.com:SilvioBaratto/code-generator.git
56
53
  cd code-generator && pip install -e ".[dev]"
57
54
  ```
58
55
 
56
+ ### Optional: codebase graph (graphify)
57
+
58
+ Phases 0, 1, and 2 inject a knowledge-graph report from [graphify](https://github.com/safishamsi/graphify) for richer code orientation. When the binary is missing, the orchestrator falls back to a sentinel string and continues.
59
+
60
+ ```bash
61
+ pipx install graphifyy # CLI binary is `graphify`
62
+ ```
63
+
64
+ Add to your project's `.gitignore`:
65
+
66
+ ```
67
+ graphify-out/manifest.json
68
+ graphify-out/cost.json
69
+ ```
70
+
59
71
  ## Authentication
60
72
 
61
73
  ```bash
@@ -17,7 +17,6 @@ src/code_generator/logging_setup.py
17
17
  src/code_generator/memory.py
18
18
  src/code_generator/preflight.py
19
19
  src/code_generator/repo_info.py
20
- src/code_generator/repomap.py
21
20
  src/code_generator/requirements_structure.py
22
21
  src/code_generator/state.py
23
22
  src/code_generator/state_retention.py
@@ -63,7 +62,6 @@ src/code_generator/prompts/prompt-optimize-requirements.md
63
62
  src/code_generator/prompts/prompt-phase-0-complexity.md
64
63
  src/code_generator/prompts/prompt-phase-1-planning.md
65
64
  src/code_generator/prompts/prompt-phase-2-batch-review.md
66
- src/code_generator/prompts/prompt-phase-2-issue-review.md
67
65
  src/code_generator/prompts/prompt-phase-3-implementation.md
68
66
  src/code_generator/prompts/prompt-phase-5-final-review.md
69
67
  src/code_generator/prompts/prompt-phase-6-test.md
@@ -112,6 +110,7 @@ tests/test_cycle_prompts.py
112
110
  tests/test_delta_planning.py
113
111
  tests/test_dependencies.py
114
112
  tests/test_detect.py
113
+ tests/test_dispatch_graph_report.py
115
114
  tests/test_docs_no_default_max_turns.py
116
115
  tests/test_docs_ollama_model_guide.py
117
116
  tests/test_docs_ollama_pro.py
@@ -144,7 +143,6 @@ tests/test_options.py
144
143
  tests/test_phase0.py
145
144
  tests/test_phase1.py
146
145
  tests/test_phase2.py
147
- tests/test_phase2_batch.py
148
146
  tests/test_phase3_4.py
149
147
  tests/test_phase5.py
150
148
  tests/test_phase5_precommit.py
@@ -160,7 +158,6 @@ tests/test_prompt_prefix_stability.py
160
158
  tests/test_prompts.py
161
159
  tests/test_rate_limit.py
162
160
  tests/test_repo_info.py
163
- tests/test_repomap.py
164
161
  tests/test_requirements_structure.py
165
162
  tests/test_retry.py
166
163
  tests/test_review.py
@@ -3,7 +3,7 @@ typer
3
3
  rich
4
4
 
5
5
  [all]
6
- claude-code-generator[batch,mcp,repomap]
6
+ claude-code-generator[batch,mcp]
7
7
 
8
8
  [batch]
9
9
  anthropic>=0.35
@@ -16,7 +16,3 @@ ruff
16
16
  [mcp]
17
17
  mcp<2.0,>=1.0
18
18
  serena-agent<2.0,>=1.1
19
-
20
- [repomap]
21
- tree-sitter>=0.23
22
- tree-sitter-language-pack>=0.5
@@ -1,3 +1,3 @@
1
1
  """code-generator: orchestrator CLI for end-to-end project generation."""
2
2
 
3
- __version__ = "0.4.17"
3
+ __version__ = "0.5.0"
@@ -45,19 +45,13 @@ _GENERIC_FALLBACK = AgentSelection(
45
45
 
46
46
  _ANGULAR_FASTAPI = AgentSelection(
47
47
  primary=("frontend-developer", "python-pro", "fastapi-expert-agent"),
48
- support=("typescript-pro", "tailwind-patterns", "ui-ux-designer", "supabase-connection-expert"),
48
+ support=("ui-ux-designer", "supabase-connection-expert"),
49
49
  skills=("solid-principles", "python-expert"),
50
50
  )
51
51
 
52
- _ANGULAR_NESTJS = AgentSelection(
53
- primary=("frontend-developer", "nestjs-expert"),
54
- support=("typescript-pro", "tailwind-patterns", "ui-ux-designer", "supabase-connection-expert"),
55
- skills=("solid-principles",),
56
- )
57
-
58
52
  _ANGULAR_ONLY = AgentSelection(
59
53
  primary=("frontend-developer",),
60
- support=("typescript-pro", "tailwind-patterns", "ui-ux-designer"),
54
+ support=("ui-ux-designer",),
61
55
  skills=("solid-principles",),
62
56
  )
63
57
 
@@ -67,18 +61,6 @@ _FASTAPI = AgentSelection(
67
61
  skills=("solid-principles", "python-expert"),
68
62
  )
69
63
 
70
- _NESTJS = AgentSelection(
71
- primary=("nestjs-expert",),
72
- support=("supabase-connection-expert",),
73
- skills=("solid-principles",),
74
- )
75
-
76
- _PORTFOLIO = AgentSelection(
77
- primary=("riskfolio-expert", "python-pro"),
78
- support=(),
79
- skills=("skfolio", "yfinance"),
80
- )
81
-
82
64
  _BAML = AgentSelection(
83
65
  primary=("baml-expert-agent", "python-pro"),
84
66
  support=(),
@@ -147,27 +129,16 @@ def detect(requirements_path: Path) -> AgentSelection:
147
129
 
148
130
  has_angular = "angular" in block or " ng " in block or " ng," in block
149
131
  has_fastapi = "fastapi" in block or "python api" in block
150
- has_nestjs = "nestjs" in block or "nest" in block
151
132
 
152
- # Full-stack combos checked first (most specific).
153
133
  if has_angular and has_fastapi:
154
134
  return _ANGULAR_FASTAPI
155
135
 
156
- if has_angular and has_nestjs:
157
- return _ANGULAR_NESTJS
158
-
159
136
  if has_angular:
160
137
  return _ANGULAR_ONLY
161
138
 
162
139
  if has_fastapi:
163
140
  return _FASTAPI
164
141
 
165
- if has_nestjs:
166
- return _NESTJS
167
-
168
- if "portfolio" in block or "riskfolio" in block or "skfolio" in block:
169
- return _PORTFOLIO
170
-
171
142
  if "baml" in block or "llm function" in block:
172
143
  return _BAML
173
144
 
@@ -9,10 +9,14 @@ from __future__ import annotations
9
9
 
10
10
  import asyncio
11
11
  import logging
12
+ import os
13
+ import shutil
14
+ import subprocess
12
15
  from typing import TYPE_CHECKING, Literal
13
16
 
14
17
  import typer
15
18
 
19
+ from code_generator import memory as _memory
16
20
  from code_generator.commands._crash_recovery import check_and_log_crash_recovery
17
21
  from code_generator.commands._resume import next_start_phase, resolve_continue_multi_cycle
18
22
 
@@ -26,6 +30,91 @@ _logger = logging.getLogger(__name__)
26
30
  __all__ = ["dispatch_async", "dispatch_orchestrator"]
27
31
 
28
32
 
33
+ # ---------------------------------------------------------------------------
34
+ # Codebase graph build (graphify subprocess)
35
+ # ---------------------------------------------------------------------------
36
+
37
+ _GRAPHIFY_TIMEOUT = int(os.environ.get("CODE_GENERATOR_GRAPHIFY_TIMEOUT", "600"))
38
+
39
+
40
+ def _compute_and_persist_graph_report(project_dir: Path, log: logging.Logger) -> None:
41
+ """Build the codebase graph via graphify and persist it to memories.
42
+
43
+ Invokes ``graphify <project_dir> --update --no-viz`` to (re)build
44
+ ``graphify-out/GRAPH_REPORT.md`` and copies the resulting markdown into
45
+ ``.code-generator/memories/cycle-repo-map.md`` so Phases 0, 1, 2 can read
46
+ it via :func:`code_generator.memory.read_cycle_repomap`.
47
+
48
+ Incremental builds rely on graphify's own SHA256-keyed cache in
49
+ ``graphify-out/cache/`` — the ``--update`` flag short-circuits unchanged
50
+ files, so repeated invocations on a clean tree are nearly free. We
51
+ deliberately do *not* call ``graphify check-update`` because it is an
52
+ undocumented subcommand (see graphify issue #277) and not part of the
53
+ stable CLI surface.
54
+
55
+ Falls back to :data:`code_generator.memory.REPOMAP_FALLBACK` on any
56
+ failure (binary missing, timeout, non-zero exit, missing report file).
57
+
58
+ Auth: graphify inherits the parent process env (Claude Code OAuth
59
+ subscription). Do **not** strip ``ANTHROPIC_*`` here — graphify is a
60
+ user-facing dev tool that piggybacks on whichever assistant invoked it.
61
+ The startup ``env.assert_safe_environment()`` check (CLAUDE.md
62
+ non-negotiable #1) already guarantees no API-key vars are present in the
63
+ process environment when the orchestrator runs on the Anthropic Max
64
+ path, so passing the inherited env to graphify is safe.
65
+
66
+ Args:
67
+ project_dir: Project root directory (graphify writes ``graphify-out/``
68
+ into this directory).
69
+ log: Phase logger.
70
+ """
71
+ memories_dir = project_dir / ".code-generator" / "memories"
72
+ report_path = project_dir / "graphify-out" / "GRAPH_REPORT.md"
73
+
74
+ if shutil.which("graphify") is None:
75
+ log.warning(
76
+ "graph-report: graphify binary not found; install via "
77
+ "`pipx install graphifyy`. Using fallback."
78
+ )
79
+ _memory.write_memory_file(memories_dir, "cycle-repo-map.md", _memory.REPOMAP_FALLBACK)
80
+ return
81
+
82
+ cmd = ["graphify", str(project_dir), "--update", "--no-viz"]
83
+ try:
84
+ log.info("graph-report: building (cmd=%s)", " ".join(cmd))
85
+ subprocess.run( # noqa: S603
86
+ cmd,
87
+ cwd=project_dir,
88
+ timeout=_GRAPHIFY_TIMEOUT,
89
+ capture_output=True,
90
+ check=True,
91
+ )
92
+ except (subprocess.CalledProcessError, subprocess.TimeoutExpired) as exc:
93
+ log.warning("graph-report: graphify subprocess failed (%s); using fallback", exc)
94
+ _memory.write_memory_file(memories_dir, "cycle-repo-map.md", _memory.REPOMAP_FALLBACK)
95
+ return
96
+ except (FileNotFoundError, OSError) as exc:
97
+ # `FileNotFoundError` here means the `graphify` binary disappeared
98
+ # between `shutil.which` and `subprocess.run`. Extremely unlikely.
99
+ log.warning("graph-report: could not invoke graphify (%s); using fallback", exc)
100
+ _memory.write_memory_file(memories_dir, "cycle-repo-map.md", _memory.REPOMAP_FALLBACK)
101
+ return
102
+
103
+ try:
104
+ content = report_path.read_text(encoding="utf-8")
105
+ except (FileNotFoundError, OSError) as exc:
106
+ log.warning(
107
+ "graph-report: graphify exited 0 but %s is missing (%s); using fallback",
108
+ report_path.name,
109
+ exc,
110
+ )
111
+ _memory.write_memory_file(memories_dir, "cycle-repo-map.md", _memory.REPOMAP_FALLBACK)
112
+ return
113
+
114
+ log.info("graph-report: built (%d chars / ~%d tokens)", len(content), len(content) // 4)
115
+ _memory.write_memory_file(memories_dir, "cycle-repo-map.md", content)
116
+
117
+
29
118
  def _warn_on_drift(st: state_module.State, logger: logging.Logger) -> None:
30
119
  """Emit WARNING logs when prompt hashes or SDK version have drifted.
31
120
 
@@ -196,6 +285,11 @@ async def dispatch_async(
196
285
  runner_module = get_runner()
197
286
  logger = setup_phase_logger("generate", project_dir)
198
287
 
288
+ # Build the codebase graph once at the top of dispatch so Phase 0
289
+ # (complexity analysis) sees a fresh report alongside Phases 1 and 2.
290
+ graph_logger = setup_phase_logger("graph-report", project_dir)
291
+ _compute_and_persist_graph_report(project_dir, graph_logger)
292
+
199
293
  # Phase 0: determine mode when not already known.
200
294
  if mode == "auto":
201
295
  needs_phase0 = st.mode not in ("single", "multi-cycle")
@@ -12,14 +12,16 @@ import tempfile
12
12
  from pathlib import Path
13
13
 
14
14
  # ---------------------------------------------------------------------------
15
- # Repomap constants
15
+ # Codebase graph constants
16
16
  # ---------------------------------------------------------------------------
17
17
 
18
18
  #: Fallback string injected into prompts when the cycle-repo-map.md file is
19
- #: missing or empty. Matches the ``_FALLBACK`` sentinel in ``repomap.py``.
20
- REPOMAP_FALLBACK = "(repomap unavailable — rely on MCP or Read tools)"
19
+ #: missing or empty. Used when graphify is not installed or fails to build.
20
+ REPOMAP_FALLBACK = (
21
+ "(graphify report unavailable — rely on feature-dev:code-explorer or MCP tools)"
22
+ )
21
23
 
22
- #: Relative path of the per-cycle repo-map memory file inside ``memories/``.
24
+ #: Relative path of the per-cycle codebase-graph memory file inside ``memories/``.
23
25
  _REPOMAP_FILE = "cycle-repo-map.md"
24
26
 
25
27
  # ---------------------------------------------------------------------------
@@ -15,11 +15,9 @@ from __future__ import annotations
15
15
 
16
16
  import logging
17
17
  import shutil
18
- import time
19
18
  from typing import TYPE_CHECKING, Any, Literal
20
19
 
21
20
  from code_generator import gh, git_ops
22
- from code_generator import memory as _memory
23
21
  from code_generator import state as _state
24
22
  from code_generator.logging_setup import setup_phase_logger
25
23
  from code_generator.orchestrator import (
@@ -37,7 +35,6 @@ from code_generator.orchestrator._memory_writers import (
37
35
  write_project_plan,
38
36
  )
39
37
  from code_generator.orchestrator.ollama_budget import OllamaBudgetTracker
40
- from code_generator.repomap import compute_repomap
41
38
  from code_generator.state import CycleState
42
39
 
43
40
  if TYPE_CHECKING:
@@ -83,35 +80,6 @@ def populate_cycle_start_fields(state: State, state_path: Path) -> None:
83
80
  _state.save_state(state_path, state)
84
81
 
85
82
 
86
- # ---------------------------------------------------------------------------
87
- # Repomap helpers
88
- # ---------------------------------------------------------------------------
89
-
90
-
91
- def _compute_and_persist_repomap(project_dir: Path, log: logging.Logger) -> None:
92
- """Compute the repo-map once and atomically write it to the memories directory.
93
-
94
- Computes the project's tree-sitter + PageRank repo-map, logs wall-clock
95
- time and token count, then writes the result to
96
- ``.code-generator/memories/cycle-repo-map.md`` via the atomic writer.
97
-
98
- This is idempotent: a second call in the same cycle silently overwrites
99
- the file. Falls back gracefully when tree-sitter is not installed
100
- (``compute_repomap`` returns a sentinel string in that case).
101
-
102
- Args:
103
- project_dir: Project root directory.
104
- log: Logger for timing and progress messages.
105
- """
106
- memories_dir = project_dir / ".code-generator" / "memories"
107
- start = time.monotonic()
108
- content = compute_repomap(project_dir)
109
- elapsed = time.monotonic() - start
110
- tokens = len(content) // 4
111
- log.info("repomap: computed in %.1fs, %d tokens", elapsed, tokens)
112
- _memory.write_memory_file(memories_dir, "cycle-repo-map.md", content)
113
-
114
-
115
83
  # ---------------------------------------------------------------------------
116
84
  # Internal helpers
117
85
  # ---------------------------------------------------------------------------
@@ -240,7 +208,6 @@ async def _run_phases(
240
208
  Phases 2/3/4/5 only; Phases 1/6/7 never see it.
241
209
  """
242
210
  state_path = project_dir / ".code-generator" / "state.json"
243
- _run_phases_log = setup_phase_logger(f"{log_prefix}repomap", project_dir)
244
211
 
245
212
  def _phase_logger(name: str): # type: ignore[return]
246
213
  return setup_phase_logger(f"{log_prefix}{name}", project_dir)
@@ -279,9 +246,6 @@ async def _run_phases(
279
246
  _state.save_state(state_path, state)
280
247
  _budget.check(state, cycle)
281
248
 
282
- # Compute and persist the repo-map once per cycle start (idempotent).
283
- _compute_and_persist_repomap(project_dir, _run_phases_log)
284
-
285
249
  if start_phase <= _PHASE_PLAN:
286
250
  await phase1_plan.run(
287
251
  state,
@@ -236,7 +236,7 @@ async def generate_cycle_prompts(
236
236
  model = effective_model or _SPECIALIZER_DEFAULT_MODEL
237
237
  options = make_agent_options(
238
238
  model=model,
239
- allowed_tools=[],
239
+ allowed_tools=["Agent", "Read"],
240
240
  cwd=str(project_dir),
241
241
  **max_turns_kwargs(max_turns),
242
242
  )
@@ -207,7 +207,7 @@ async def _run_phase0_prompt(
207
207
  options = make_agent_options(
208
208
  model=model,
209
209
  effort=effort_level,
210
- allowed_tools=["Read", "Glob", "Grep"],
210
+ allowed_tools=["Agent", "Read", "Glob", "Grep"],
211
211
  cwd=str(project_dir),
212
212
  **max_turns_kwargs(max_turns),
213
213
  )
@@ -285,7 +285,7 @@ async def run(
285
285
  options = make_agent_options(
286
286
  model=effective_model or _PHASE1_DEFAULT_MODEL,
287
287
  effort=effort_level,
288
- allowed_tools=["Read", "Bash", "Glob", "Grep"],
288
+ allowed_tools=["Agent", "Read", "Bash", "Glob", "Grep"],
289
289
  cwd=str(project_dir),
290
290
  **max_turns_kwargs(max_turns),
291
291
  )