claude-code-generator 0.2.0__tar.gz → 0.2.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 (115) hide show
  1. {claude_code_generator-0.2.0/src/claude_code_generator.egg-info → claude_code_generator-0.2.1}/PKG-INFO +17 -3
  2. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/README.md +16 -2
  3. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/pyproject.toml +1 -1
  4. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1/src/claude_code_generator.egg-info}/PKG-INFO +17 -3
  5. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/__init__.py +1 -1
  6. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/orchestrator/phase2_review.py +17 -2
  7. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/LICENSE +0 -0
  8. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/setup.cfg +0 -0
  9. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/claude_code_generator.egg-info/SOURCES.txt +0 -0
  10. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/claude_code_generator.egg-info/dependency_links.txt +0 -0
  11. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/claude_code_generator.egg-info/entry_points.txt +0 -0
  12. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/claude_code_generator.egg-info/requires.txt +0 -0
  13. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/claude_code_generator.egg-info/top_level.txt +0 -0
  14. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/agents.py +0 -0
  15. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/cli.py +0 -0
  16. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/commands/__init__.py +0 -0
  17. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/commands/_detect.py +0 -0
  18. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/commands/_dispatch.py +0 -0
  19. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/commands/_resume.py +0 -0
  20. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/commands/generate.py +0 -0
  21. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/commands/init.py +0 -0
  22. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/commands/optimize.py +0 -0
  23. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/commands/review.py +0 -0
  24. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/commands/status.py +0 -0
  25. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/effort.py +0 -0
  26. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/env.py +0 -0
  27. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/gh/__init__.py +0 -0
  28. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/gh/core.py +0 -0
  29. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/gh/issues.py +0 -0
  30. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/gh/labels.py +0 -0
  31. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/gh/milestones.py +0 -0
  32. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/git_ops.py +0 -0
  33. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/logging_setup.py +0 -0
  34. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/orchestrator/__init__.py +0 -0
  35. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/orchestrator/_comments.py +0 -0
  36. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/orchestrator/cycle_loop.py +0 -0
  37. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/orchestrator/phase0_complexity.py +0 -0
  38. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/orchestrator/phase1_plan.py +0 -0
  39. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/orchestrator/phase3_4_implement.py +0 -0
  40. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/orchestrator/phase5_closure.py +0 -0
  41. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/orchestrator/phase6_test.py +0 -0
  42. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/orchestrator/phase7_commit.py +0 -0
  43. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/prompts/__init__.py +0 -0
  44. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/prompts/prompt-optimize-requirements.md +0 -0
  45. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/prompts/prompt-phase-0-complexity.md +0 -0
  46. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/prompts/prompt-phase-1-planning.md +0 -0
  47. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/prompts/prompt-phase-2-issue-review.md +0 -0
  48. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/prompts/prompt-phase-3-implementation.md +0 -0
  49. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/prompts/prompt-phase-5-final-review.md +0 -0
  50. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/prompts/prompt-phase-6-test.md +0 -0
  51. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/prompts/prompt-phase-7-commit.md +0 -0
  52. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/prompts/prompt-review.md +0 -0
  53. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/requirements_structure.py +0 -0
  54. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/runner/__init__.py +0 -0
  55. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/runner/message_parsing.py +0 -0
  56. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/runner/options.py +0 -0
  57. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/runner/protocol.py +0 -0
  58. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/runner/rate_limit.py +0 -0
  59. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/runner/retry.py +0 -0
  60. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/runner/sdk_runner.py +0 -0
  61. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/runner/subprocess_runner.py +0 -0
  62. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/runner/types.py +0 -0
  63. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/runner/utils.py +0 -0
  64. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/state.py +0 -0
  65. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/templates/__init__.py +0 -0
  66. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/templates/angular.md +0 -0
  67. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/templates/base.md +0 -0
  68. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/templates/fastapi.md +0 -0
  69. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/templates/finance.md +0 -0
  70. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/templates/fullstack.md +0 -0
  71. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/templates/nestjs.md +0 -0
  72. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/src/code_generator/templates/python-cli.md +0 -0
  73. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_agents.py +0 -0
  74. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_comments.py +0 -0
  75. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_commit_message.py +0 -0
  76. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_cycle_loop.py +0 -0
  77. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_cycle_loop_multicycle.py +0 -0
  78. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_delta_planning.py +0 -0
  79. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_detect.py +0 -0
  80. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_effort.py +0 -0
  81. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_env.py +0 -0
  82. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_generate.py +0 -0
  83. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_generate_resume.py +0 -0
  84. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_gh.py +0 -0
  85. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_gh_labels.py +0 -0
  86. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_gh_milestones.py +0 -0
  87. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_gh_submodules.py +0 -0
  88. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_git_ops.py +0 -0
  89. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_init.py +0 -0
  90. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_logging_setup.py +0 -0
  91. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_message_parsing.py +0 -0
  92. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_optimize.py +0 -0
  93. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_options.py +0 -0
  94. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_phase0.py +0 -0
  95. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_phase1.py +0 -0
  96. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_phase2.py +0 -0
  97. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_phase3_4.py +0 -0
  98. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_phase5.py +0 -0
  99. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_phase6.py +0 -0
  100. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_phase7.py +0 -0
  101. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_phase_token_logging.py +0 -0
  102. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_prompts.py +0 -0
  103. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_rate_limit.py +0 -0
  104. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_requirements_structure.py +0 -0
  105. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_retry.py +0 -0
  106. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_review.py +0 -0
  107. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_runner_protocol.py +0 -0
  108. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_runner_protocol_annotations.py +0 -0
  109. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_runner_types.py +0 -0
  110. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_runner_utils.py +0 -0
  111. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_sdk_runner.py +0 -0
  112. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_state.py +0 -0
  113. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_status.py +0 -0
  114. {claude_code_generator-0.2.0 → claude_code_generator-0.2.1}/tests/test_subprocess_runner.py +0 -0
  115. {claude_code_generator-0.2.0 → claude_code_generator-0.2.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.2.0
3
+ Version: 0.2.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
@@ -31,7 +31,7 @@ Dynamic: license-file
31
31
 
32
32
  # code-generator
33
33
 
34
- A Python CLI that orchestrates Claude Code end-to-end to generate a whole project from a `requirements.md` file. Three commands — `init`, `generate`, `review` — plus `status`. Works for any project type: Python CLI, FastAPI, Angular, NestJS, full-stack, finance, BAML/LLM.
34
+ A Python CLI that orchestrates Claude Code end-to-end to generate a whole project from a `requirements.md` file. Five commands — `init`, `optimize`, `generate`, `review`, `status`. Works for any project type: Python CLI, FastAPI, Angular, NestJS, full-stack, finance, BAML/LLM.
35
35
 
36
36
  > **Max subscription only.** This tool uses **exclusively** the Claude Max subscription. It strips every environment variable that could route a call through the API and aborts on startup if any are still present. There is no path to API credit billing — see [Safety constraints](#safety-constraints) below.
37
37
 
@@ -68,6 +68,20 @@ code-generator init --template fastapi
68
68
  $EDITOR .code-generator/requirements.md
69
69
  ```
70
70
 
71
+ ### `code-generator optimize [--dry-run] [--force]`
72
+
73
+ Pre-flight rewrite of `.code-generator/requirements.md` into the canonical structure the orchestrator expects: `# Title` → `## Description` → `## Tech Stack` → `## Goals` → `## Scope` (numbered `### N.` subsections with per-section `Acceptance criteria` checklists) → `## Non-goals` → `## Constraints` → `## Global acceptance criteria`.
74
+
75
+ Runs a single Opus 4.6 session with a dedicated prompt, preserves the original intent verbatim when ambiguous (never invents new scope), and writes the rewrite back to disk atomically. The pre-optimize original is saved to `.code-generator/requirements.backup-<UTC-timestamp>.md` so you can always `diff` and recover. The command is stateless — it never reads or writes `state.json` and never calls `gh`.
76
+
77
+ Short-circuits and exits 0 if the file is already canonical. Use `--force` to re-optimize anyway. Use `--dry-run` to print the proposed rewrite to stdout without touching the file or creating a backup.
78
+
79
+ ```bash
80
+ code-generator optimize --dry-run # preview
81
+ code-generator optimize # commit the rewrite
82
+ code-generator generate # then run the pipeline
83
+ ```
84
+
71
85
  ### `code-generator generate [flags]`
72
86
 
73
87
  Read `.code-generator/requirements.md` and orchestrate Claude Code through the 0→7 phase pipeline:
@@ -155,7 +169,7 @@ src/code_generator/
155
169
  │ ├── phase6_test.py # test runner, max 3 retries
156
170
  │ ├── phase7_commit.py # Opus commit message + push with rebase retry
157
171
  │ └── cycle_loop.py # multi-cycle driver
158
- └── commands/ # init, status, generate, review (Typer commands)
172
+ └── commands/ # init, optimize, status, generate, review (Typer commands)
159
173
  ```
160
174
 
161
175
  ## Development
@@ -1,6 +1,6 @@
1
1
  # code-generator
2
2
 
3
- A Python CLI that orchestrates Claude Code end-to-end to generate a whole project from a `requirements.md` file. Three commands — `init`, `generate`, `review` — plus `status`. Works for any project type: Python CLI, FastAPI, Angular, NestJS, full-stack, finance, BAML/LLM.
3
+ A Python CLI that orchestrates Claude Code end-to-end to generate a whole project from a `requirements.md` file. Five commands — `init`, `optimize`, `generate`, `review`, `status`. Works for any project type: Python CLI, FastAPI, Angular, NestJS, full-stack, finance, BAML/LLM.
4
4
 
5
5
  > **Max subscription only.** This tool uses **exclusively** the Claude Max subscription. It strips every environment variable that could route a call through the API and aborts on startup if any are still present. There is no path to API credit billing — see [Safety constraints](#safety-constraints) below.
6
6
 
@@ -37,6 +37,20 @@ code-generator init --template fastapi
37
37
  $EDITOR .code-generator/requirements.md
38
38
  ```
39
39
 
40
+ ### `code-generator optimize [--dry-run] [--force]`
41
+
42
+ Pre-flight rewrite of `.code-generator/requirements.md` into the canonical structure the orchestrator expects: `# Title` → `## Description` → `## Tech Stack` → `## Goals` → `## Scope` (numbered `### N.` subsections with per-section `Acceptance criteria` checklists) → `## Non-goals` → `## Constraints` → `## Global acceptance criteria`.
43
+
44
+ Runs a single Opus 4.6 session with a dedicated prompt, preserves the original intent verbatim when ambiguous (never invents new scope), and writes the rewrite back to disk atomically. The pre-optimize original is saved to `.code-generator/requirements.backup-<UTC-timestamp>.md` so you can always `diff` and recover. The command is stateless — it never reads or writes `state.json` and never calls `gh`.
45
+
46
+ Short-circuits and exits 0 if the file is already canonical. Use `--force` to re-optimize anyway. Use `--dry-run` to print the proposed rewrite to stdout without touching the file or creating a backup.
47
+
48
+ ```bash
49
+ code-generator optimize --dry-run # preview
50
+ code-generator optimize # commit the rewrite
51
+ code-generator generate # then run the pipeline
52
+ ```
53
+
40
54
  ### `code-generator generate [flags]`
41
55
 
42
56
  Read `.code-generator/requirements.md` and orchestrate Claude Code through the 0→7 phase pipeline:
@@ -124,7 +138,7 @@ src/code_generator/
124
138
  │ ├── phase6_test.py # test runner, max 3 retries
125
139
  │ ├── phase7_commit.py # Opus commit message + push with rebase retry
126
140
  │ └── cycle_loop.py # multi-cycle driver
127
- └── commands/ # init, status, generate, review (Typer commands)
141
+ └── commands/ # init, optimize, status, generate, review (Typer commands)
128
142
  ```
129
143
 
130
144
  ## Development
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "claude-code-generator"
7
- version = "0.2.0"
7
+ version = "0.2.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.2.0
3
+ Version: 0.2.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
@@ -31,7 +31,7 @@ Dynamic: license-file
31
31
 
32
32
  # code-generator
33
33
 
34
- A Python CLI that orchestrates Claude Code end-to-end to generate a whole project from a `requirements.md` file. Three commands — `init`, `generate`, `review` — plus `status`. Works for any project type: Python CLI, FastAPI, Angular, NestJS, full-stack, finance, BAML/LLM.
34
+ A Python CLI that orchestrates Claude Code end-to-end to generate a whole project from a `requirements.md` file. Five commands — `init`, `optimize`, `generate`, `review`, `status`. Works for any project type: Python CLI, FastAPI, Angular, NestJS, full-stack, finance, BAML/LLM.
35
35
 
36
36
  > **Max subscription only.** This tool uses **exclusively** the Claude Max subscription. It strips every environment variable that could route a call through the API and aborts on startup if any are still present. There is no path to API credit billing — see [Safety constraints](#safety-constraints) below.
37
37
 
@@ -68,6 +68,20 @@ code-generator init --template fastapi
68
68
  $EDITOR .code-generator/requirements.md
69
69
  ```
70
70
 
71
+ ### `code-generator optimize [--dry-run] [--force]`
72
+
73
+ Pre-flight rewrite of `.code-generator/requirements.md` into the canonical structure the orchestrator expects: `# Title` → `## Description` → `## Tech Stack` → `## Goals` → `## Scope` (numbered `### N.` subsections with per-section `Acceptance criteria` checklists) → `## Non-goals` → `## Constraints` → `## Global acceptance criteria`.
74
+
75
+ Runs a single Opus 4.6 session with a dedicated prompt, preserves the original intent verbatim when ambiguous (never invents new scope), and writes the rewrite back to disk atomically. The pre-optimize original is saved to `.code-generator/requirements.backup-<UTC-timestamp>.md` so you can always `diff` and recover. The command is stateless — it never reads or writes `state.json` and never calls `gh`.
76
+
77
+ Short-circuits and exits 0 if the file is already canonical. Use `--force` to re-optimize anyway. Use `--dry-run` to print the proposed rewrite to stdout without touching the file or creating a backup.
78
+
79
+ ```bash
80
+ code-generator optimize --dry-run # preview
81
+ code-generator optimize # commit the rewrite
82
+ code-generator generate # then run the pipeline
83
+ ```
84
+
71
85
  ### `code-generator generate [flags]`
72
86
 
73
87
  Read `.code-generator/requirements.md` and orchestrate Claude Code through the 0→7 phase pipeline:
@@ -155,7 +169,7 @@ src/code_generator/
155
169
  │ ├── phase6_test.py # test runner, max 3 retries
156
170
  │ ├── phase7_commit.py # Opus commit message + push with rebase retry
157
171
  │ └── cycle_loop.py # multi-cycle driver
158
- └── commands/ # init, status, generate, review (Typer commands)
172
+ └── commands/ # init, optimize, status, generate, review (Typer commands)
159
173
  ```
160
174
 
161
175
  ## Development
@@ -1,3 +1,3 @@
1
1
  """code-generator: orchestrator CLI for end-to-end project generation."""
2
2
 
3
- __version__ = "0.2.0"
3
+ __version__ = "0.2.1"
@@ -18,7 +18,7 @@ from code_generator.orchestrator._comments import fetch_formatted_comments
18
18
  from code_generator.prompts import load_prompt
19
19
  from code_generator.runner import rate_limit, retry
20
20
  from code_generator.runner.options import make_agent_options
21
- from code_generator.runner.types import TokenUsage
21
+ from code_generator.runner.types import MaxTurnsExceeded, TokenUsage
22
22
  from code_generator.state import get_issues, save_state
23
23
 
24
24
  if TYPE_CHECKING:
@@ -84,7 +84,7 @@ async def run(
84
84
  effort=effort_level,
85
85
  allowed_tools=["Read", "Bash", "Glob", "Grep"],
86
86
  cwd=str(project_dir),
87
- max_turns=15,
87
+ max_turns=40,
88
88
  )
89
89
 
90
90
  breaker = retry.CircuitBreaker(max_failures=3)
@@ -103,6 +103,21 @@ async def run(
103
103
  breaker=breaker,
104
104
  )
105
105
  issue_usage = result.usage if result is not None else TokenUsage()
106
+ except MaxTurnsExceeded:
107
+ reviewed = False
108
+ logger.error(
109
+ "Phase 2: issue #%d hit max_turns ceiling"
110
+ " — no retry (deterministic failure), tagging for manual review.",
111
+ issue.number,
112
+ )
113
+ try:
114
+ gh.add_label(issue.number, "needs-manual-review")
115
+ except gh.GhError as exc:
116
+ logger.warning(
117
+ "Could not add needs-manual-review label to #%d: %s",
118
+ issue.number,
119
+ exc,
120
+ )
106
121
  except retry.CircuitOpen:
107
122
  reviewed = False
108
123
  logger.error(