claude-code-generator 0.4.16__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.
- {claude_code_generator-0.4.16/src/claude_code_generator.egg-info → claude_code_generator-0.5.0}/PKG-INFO +17 -5
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/README.md +15 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/pyproject.toml +8 -12
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0/src/claude_code_generator.egg-info}/PKG-INFO +17 -5
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/claude_code_generator.egg-info/SOURCES.txt +1 -4
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/claude_code_generator.egg-info/requires.txt +1 -5
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/__init__.py +1 -1
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/agents.py +2 -31
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/_dispatch.py +94 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/memory.py +6 -4
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/cycle_loop.py +0 -36
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/cycle_prompts.py +1 -1
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase0_complexity.py +1 -1
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase1_plan.py +3 -3
- claude_code_generator-0.5.0/src/code_generator/orchestrator/phase2_review.py +329 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase3_4_implement.py +2 -44
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase5_closure.py +1 -1
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/prompts/__init__.py +0 -3
- claude_code_generator-0.5.0/src/code_generator/prompts/prompt-cycle-specializer.md +62 -0
- claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-0-complexity.md +96 -0
- claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-1-planning.md +149 -0
- claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-2-batch-review.md +73 -0
- claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-3-implementation.md +97 -0
- claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-5-final-review.md +123 -0
- claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-6-test.md +77 -0
- claude_code_generator-0.5.0/src/code_generator/prompts/prompt-phase-7-commit.md +108 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_agents.py +1 -98
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_cycle_loop.py +0 -120
- claude_code_generator-0.5.0/tests/test_dispatch_graph_report.py +178 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_effective_model_routing.py +0 -2
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_memory.py +3 -1
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_phase3_4.py +0 -116
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_phase5.py +1 -1
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_prompt_drift.py +2 -2
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_prompt_prefix_stability.py +0 -26
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_prompts.py +6 -28
- claude_code_generator-0.4.16/src/code_generator/orchestrator/phase2_review.py +0 -775
- claude_code_generator-0.4.16/src/code_generator/prompts/prompt-cycle-specializer.md +0 -62
- claude_code_generator-0.4.16/src/code_generator/prompts/prompt-phase-0-complexity.md +0 -153
- claude_code_generator-0.4.16/src/code_generator/prompts/prompt-phase-1-planning.md +0 -228
- claude_code_generator-0.4.16/src/code_generator/prompts/prompt-phase-2-batch-review.md +0 -84
- claude_code_generator-0.4.16/src/code_generator/prompts/prompt-phase-2-issue-review.md +0 -110
- claude_code_generator-0.4.16/src/code_generator/prompts/prompt-phase-3-implementation.md +0 -213
- claude_code_generator-0.4.16/src/code_generator/prompts/prompt-phase-5-final-review.md +0 -174
- claude_code_generator-0.4.16/src/code_generator/prompts/prompt-phase-6-test.md +0 -113
- claude_code_generator-0.4.16/src/code_generator/prompts/prompt-phase-7-commit.md +0 -148
- claude_code_generator-0.4.16/src/code_generator/repomap.py +0 -237
- claude_code_generator-0.4.16/tests/test_phase2_batch.py +0 -602
- claude_code_generator-0.4.16/tests/test_repomap.py +0 -111
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/LICENSE +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/setup.cfg +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/claude_code_generator.egg-info/dependency_links.txt +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/claude_code_generator.egg-info/entry_points.txt +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/claude_code_generator.egg-info/top_level.txt +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/cli.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/__init__.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/_bench_io.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/_crash_recovery.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/_detect.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/_resume.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/_validators.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/bench.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/bench_compare.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/bench_export.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/generate.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/init.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/optimize.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/review.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/commands/status.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/effort.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/env.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/gh/__init__.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/gh/core.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/gh/issues.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/gh/labels.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/gh/milestones.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/git_ops.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/logging_setup.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/__init__.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/_client_lifecycle.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/_comments.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/_memory_writers.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/_phase5_precommit.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/ollama_budget.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase6_test.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/orchestrator/phase7_commit.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/preflight.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/prompts/hashes.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/prompts/prompt-optimize-requirements.md +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/prompts/prompt-review.md +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/repo_info.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/requirements_structure.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/__init__.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/_telemetry.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/batch.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/fake_runner.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/mcp.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/message_parsing.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/options.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/protocol.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/rate_limit.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/retry.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/sdk_runner.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/soft_reset.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/state_guard.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/subprocess_runner.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/types.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/runner/utils.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/state.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/state_retention.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/templates/__init__.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/templates/angular.md +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/templates/base.md +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/templates/fastapi.md +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/templates/finance.md +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/templates/fullstack.md +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/templates/nestjs.md +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/src/code_generator/templates/python-cli.md +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_bench.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_bench_compare.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_bench_export.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_bench_fixture.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_bench_regression.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_changelog.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_claude_md.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_client_lifecycle.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_comments.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_commit_message.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_crash_recovery.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_cycle_loop_multicycle.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_cycle_ollama_model.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_cycle_prompts.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_delta_planning.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_dependencies.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_detect.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_docs_no_default_max_turns.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_docs_ollama_model_guide.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_docs_ollama_pro.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_effort.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_env.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_generate.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_generate_ollama.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_generate_resume.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_gh.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_gh_labels.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_gh_milestones.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_gh_repo_threading.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_gh_submodules.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_git_ops.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_init.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_logging_setup.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_max_turns_cli_flag.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_mcp.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_memory_writers.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_message_parsing.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_no_max_turns_in_call_sites.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_no_max_turns_literal.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_non_goals_grep_guard.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_ollama_budget.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_ollama_rate_limit.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_optimize.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_options.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_phase0.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_phase1.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_phase2.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_phase5_precommit.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_phase6.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_phase7.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_phase_mcp_regression.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_phase_token_logging.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_preflight.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_preflight_ollama.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_prompt_prefix_snapshots.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_rate_limit.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_repo_info.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_requirements_structure.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_retry.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_review.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_runner_protocol.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_runner_protocol_annotations.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_runner_types.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_runner_utils.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_sdk_runner.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_sdk_runner_shared.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_session_mode.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_state.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_state_guard.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_state_retention.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_status.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_subprocess_runner.py +0 -0
- {claude_code_generator-0.4.16 → claude_code_generator-0.5.0}/tests/test_telemetry.py +0 -0
- {claude_code_generator-0.4.16 → 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.
|
|
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
|
|
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.
|
|
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:
|
|
65
|
-
#
|
|
66
|
-
#
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
@@ -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=("
|
|
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=("
|
|
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
|
-
#
|
|
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.
|
|
20
|
-
REPOMAP_FALLBACK =
|
|
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
|
|
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
|
)
|
|
@@ -72,7 +72,7 @@ def _build_issue_states(raw_issues: list[dict[str, Any]]) -> list[_state.IssueSt
|
|
|
72
72
|
_state.IssueState(
|
|
73
73
|
number=issue["number"],
|
|
74
74
|
title=issue.get("title", ""),
|
|
75
|
-
status="
|
|
75
|
+
status=issue.get("state", "OPEN").lower(),
|
|
76
76
|
agent=gh.agent_from_labels(issue.get("labels", [])),
|
|
77
77
|
labels=[lbl.get("name", "") for lbl in issue.get("labels", []) if lbl.get("name")],
|
|
78
78
|
)
|
|
@@ -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
|
)
|
|
@@ -313,7 +313,7 @@ async def run(
|
|
|
313
313
|
raw_issues = gh.list_issues(
|
|
314
314
|
repo,
|
|
315
315
|
milestone=milestone_title,
|
|
316
|
-
state="
|
|
316
|
+
state="open",
|
|
317
317
|
)
|
|
318
318
|
issue_states = _build_issue_states(raw_issues)
|
|
319
319
|
if issue_states:
|