claude-code-generator 0.5.0__tar.gz → 0.5.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {claude_code_generator-0.5.0/src/claude_code_generator.egg-info → claude_code_generator-0.5.2}/PKG-INFO +1 -1
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/pyproject.toml +1 -1
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2/src/claude_code_generator.egg-info}/PKG-INFO +1 -1
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/__init__.py +1 -1
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/_dispatch.py +67 -11
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_dispatch_graph_report.py +65 -16
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/LICENSE +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/README.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/setup.cfg +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/claude_code_generator.egg-info/SOURCES.txt +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/claude_code_generator.egg-info/dependency_links.txt +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/claude_code_generator.egg-info/entry_points.txt +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/claude_code_generator.egg-info/requires.txt +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/claude_code_generator.egg-info/top_level.txt +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/agents.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/cli.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/__init__.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/_bench_io.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/_crash_recovery.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/_detect.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/_resume.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/_validators.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/bench.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/bench_compare.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/bench_export.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/generate.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/init.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/optimize.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/review.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/status.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/effort.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/env.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/gh/__init__.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/gh/core.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/gh/issues.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/gh/labels.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/gh/milestones.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/git_ops.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/logging_setup.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/memory.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/__init__.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/_client_lifecycle.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/_comments.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/_memory_writers.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/_phase5_precommit.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/cycle_loop.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/cycle_prompts.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/ollama_budget.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/phase0_complexity.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/phase1_plan.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/phase2_review.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/phase3_4_implement.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/phase5_closure.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/phase6_test.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/orchestrator/phase7_commit.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/preflight.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/__init__.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/hashes.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/prompt-cycle-specializer.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/prompt-optimize-requirements.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/prompt-phase-0-complexity.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/prompt-phase-1-planning.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/prompt-phase-2-batch-review.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/prompt-phase-3-implementation.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/prompt-phase-5-final-review.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/prompt-phase-6-test.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/prompt-phase-7-commit.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/prompt-review.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/repo_info.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/requirements_structure.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/__init__.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/_telemetry.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/batch.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/fake_runner.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/mcp.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/message_parsing.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/options.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/protocol.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/rate_limit.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/retry.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/sdk_runner.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/soft_reset.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/state_guard.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/subprocess_runner.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/types.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/utils.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/state.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/state_retention.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/__init__.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/angular.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/base.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/fastapi.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/finance.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/fullstack.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/nestjs.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/python-cli.md +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_agents.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_bench.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_bench_compare.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_bench_export.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_bench_fixture.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_bench_regression.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_changelog.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_claude_md.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_client_lifecycle.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_comments.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_commit_message.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_crash_recovery.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_cycle_loop.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_cycle_loop_multicycle.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_cycle_ollama_model.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_cycle_prompts.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_delta_planning.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_dependencies.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_detect.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_docs_no_default_max_turns.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_docs_ollama_model_guide.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_docs_ollama_pro.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_effective_model_routing.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_effort.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_env.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_generate.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_generate_ollama.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_generate_resume.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_gh.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_gh_labels.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_gh_milestones.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_gh_repo_threading.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_gh_submodules.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_git_ops.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_init.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_logging_setup.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_max_turns_cli_flag.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_mcp.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_memory.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_memory_writers.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_message_parsing.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_no_max_turns_in_call_sites.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_no_max_turns_literal.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_non_goals_grep_guard.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_ollama_budget.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_ollama_rate_limit.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_optimize.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_options.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase0.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase1.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase2.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase3_4.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase5.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase5_precommit.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase6.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase7.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase_mcp_regression.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase_token_logging.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_preflight.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_preflight_ollama.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_prompt_drift.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_prompt_prefix_snapshots.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_prompt_prefix_stability.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_prompts.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_rate_limit.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_repo_info.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_requirements_structure.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_retry.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_review.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_runner_protocol.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_runner_protocol_annotations.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_runner_types.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_runner_utils.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_sdk_runner.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_sdk_runner_shared.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_session_mode.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_state.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_state_guard.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_state_retention.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_status.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_subprocess_runner.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_telemetry.py +0 -0
- {claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_version.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "claude-code-generator"
|
|
7
|
-
version = "0.5.
|
|
7
|
+
version = "0.5.2"
|
|
8
8
|
description = "Orchestrator CLI that drives Claude Code end-to-end to generate whole projects from a requirements.md file."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/_dispatch.py
RENAMED
|
@@ -37,23 +37,67 @@ __all__ = ["dispatch_async", "dispatch_orchestrator"]
|
|
|
37
37
|
_GRAPHIFY_TIMEOUT = int(os.environ.get("CODE_GENERATOR_GRAPHIFY_TIMEOUT", "600"))
|
|
38
38
|
|
|
39
39
|
|
|
40
|
+
def _graphify_command(project_dir: Path) -> list[str]:
|
|
41
|
+
"""Return the right graphify CLI invocation based on whether a prior graph exists.
|
|
42
|
+
|
|
43
|
+
Graphify's CLI parser treats the first positional arg as a *subcommand*
|
|
44
|
+
name (``install``, ``query``, ``update``, ...) and only falls through to
|
|
45
|
+
"build the graph for this directory" when the arg looks like a relative
|
|
46
|
+
path (``.``, ``./src``). Passing an absolute path like
|
|
47
|
+
``/Volumes/External SSD/optimizer`` makes graphify exit 1 with
|
|
48
|
+
``error: unknown command '<path>'``. We always pass ``.`` and rely on
|
|
49
|
+
``subprocess.run(cwd=project_dir)`` to anchor it.
|
|
50
|
+
|
|
51
|
+
Graphify's ``--update`` flag *requires* an existing ``graph.json`` to
|
|
52
|
+
merge into ("re-extract only changed files, merge into existing graph").
|
|
53
|
+
On a virgin project tree it fails with exit 1. We detect that case by
|
|
54
|
+
looking for ``graphify-out/graph.json`` and skipping ``--update`` on the
|
|
55
|
+
first run.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
project_dir: Project root directory.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
The argv list to pass to ``subprocess.run``.
|
|
62
|
+
"""
|
|
63
|
+
graph_json = project_dir / "graphify-out" / "graph.json"
|
|
64
|
+
base = ["graphify", ".", "--no-viz"]
|
|
65
|
+
if graph_json.exists():
|
|
66
|
+
base.append("--update")
|
|
67
|
+
return base
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _decode_stderr(stderr: bytes | str | None) -> str:
|
|
71
|
+
"""Decode subprocess stderr to a short single-line string for logging."""
|
|
72
|
+
if stderr is None:
|
|
73
|
+
return ""
|
|
74
|
+
text = stderr.decode("utf-8", errors="replace") if isinstance(stderr, bytes) else stderr
|
|
75
|
+
text = text.strip().replace("\n", " | ")
|
|
76
|
+
return text[:500]
|
|
77
|
+
|
|
78
|
+
|
|
40
79
|
def _compute_and_persist_graph_report(project_dir: Path, log: logging.Logger) -> None:
|
|
41
80
|
"""Build the codebase graph via graphify and persist it to memories.
|
|
42
81
|
|
|
43
|
-
Invokes ``graphify
|
|
44
|
-
|
|
82
|
+
Invokes the ``graphify`` CLI to (re)build ``graphify-out/GRAPH_REPORT.md``
|
|
83
|
+
and copies the resulting markdown into
|
|
45
84
|
``.code-generator/memories/cycle-repo-map.md`` so Phases 0, 1, 2 can read
|
|
46
85
|
it via :func:`code_generator.memory.read_cycle_repomap`.
|
|
47
86
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
87
|
+
Two modes:
|
|
88
|
+
|
|
89
|
+
- **First run** (no ``graphify-out/graph.json``): full build via
|
|
90
|
+
``graphify <path> --no-viz``. ``--update`` is *not* added because it
|
|
91
|
+
requires a prior graph to merge into — passing it on a virgin tree
|
|
92
|
+
makes graphify exit 1.
|
|
93
|
+
- **Incremental** (graph.json exists): ``graphify <path> --update
|
|
94
|
+
--no-viz``. Graphify's SHA256-keyed cache in ``graphify-out/cache/``
|
|
95
|
+
keeps subsequent runs cheap.
|
|
54
96
|
|
|
55
97
|
Falls back to :data:`code_generator.memory.REPOMAP_FALLBACK` on any
|
|
56
98
|
failure (binary missing, timeout, non-zero exit, missing report file).
|
|
99
|
+
Stderr from graphify is captured and logged at WARN level on failure so
|
|
100
|
+
the user can diagnose without re-running by hand.
|
|
57
101
|
|
|
58
102
|
Auth: graphify inherits the parent process env (Claude Code OAuth
|
|
59
103
|
subscription). Do **not** strip ``ANTHROPIC_*`` here — graphify is a
|
|
@@ -79,7 +123,7 @@ def _compute_and_persist_graph_report(project_dir: Path, log: logging.Logger) ->
|
|
|
79
123
|
_memory.write_memory_file(memories_dir, "cycle-repo-map.md", _memory.REPOMAP_FALLBACK)
|
|
80
124
|
return
|
|
81
125
|
|
|
82
|
-
cmd =
|
|
126
|
+
cmd = _graphify_command(project_dir)
|
|
83
127
|
try:
|
|
84
128
|
log.info("graph-report: building (cmd=%s)", " ".join(cmd))
|
|
85
129
|
subprocess.run( # noqa: S603
|
|
@@ -89,8 +133,20 @@ def _compute_and_persist_graph_report(project_dir: Path, log: logging.Logger) ->
|
|
|
89
133
|
capture_output=True,
|
|
90
134
|
check=True,
|
|
91
135
|
)
|
|
92
|
-
except
|
|
93
|
-
|
|
136
|
+
except subprocess.CalledProcessError as exc:
|
|
137
|
+
stderr = _decode_stderr(exc.stderr)
|
|
138
|
+
log.warning(
|
|
139
|
+
"graph-report: graphify exited %d; using fallback. stderr: %s",
|
|
140
|
+
exc.returncode,
|
|
141
|
+
stderr or "<empty>",
|
|
142
|
+
)
|
|
143
|
+
_memory.write_memory_file(memories_dir, "cycle-repo-map.md", _memory.REPOMAP_FALLBACK)
|
|
144
|
+
return
|
|
145
|
+
except subprocess.TimeoutExpired as exc:
|
|
146
|
+
log.warning(
|
|
147
|
+
"graph-report: graphify timed out after %ss; using fallback",
|
|
148
|
+
exc.timeout,
|
|
149
|
+
)
|
|
94
150
|
_memory.write_memory_file(memories_dir, "cycle-repo-map.md", _memory.REPOMAP_FALLBACK)
|
|
95
151
|
return
|
|
96
152
|
except (FileNotFoundError, OSError) as exc:
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_dispatch_graph_report.py
RENAMED
|
@@ -4,18 +4,12 @@ The helper shells out to the ``graphify`` CLI to (re)build
|
|
|
4
4
|
``graphify-out/GRAPH_REPORT.md`` and copies the result into
|
|
5
5
|
``.code-generator/memories/cycle-repo-map.md``.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- happy path (writes the report into memories)
|
|
14
|
-
- binary missing (writes fallback)
|
|
15
|
-
- timeout (writes fallback)
|
|
16
|
-
- non-zero exit (writes fallback)
|
|
17
|
-
- missing report after a successful exit (writes fallback)
|
|
18
|
-
- inherited-env: no env stripping (graphify uses parent OAuth)
|
|
7
|
+
Two invocation modes:
|
|
8
|
+
- **First run** (no ``graphify-out/graph.json``): ``graphify <path> --no-viz``
|
|
9
|
+
- **Incremental** (graph.json exists): ``graphify <path> --update --no-viz``
|
|
10
|
+
|
|
11
|
+
The ``--update`` flag merges into an existing graph and fails on a virgin
|
|
12
|
+
tree, so we detect first-run via ``graph.json`` existence.
|
|
19
13
|
"""
|
|
20
14
|
|
|
21
15
|
from __future__ import annotations
|
|
@@ -44,10 +38,10 @@ def _read_persisted(project_dir: Path) -> str:
|
|
|
44
38
|
class TestGraphReportBuild:
|
|
45
39
|
"""Behaviour of _compute_and_persist_graph_report under each branch."""
|
|
46
40
|
|
|
47
|
-
def
|
|
41
|
+
def test_first_run_uses_full_build_without_update_flag(
|
|
48
42
|
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
49
43
|
) -> None:
|
|
50
|
-
"""
|
|
44
|
+
"""First run (no graph.json) invokes `graphify <path> --no-viz` (no --update)."""
|
|
51
45
|
monkeypatch.setattr(_dispatch.shutil, "which", lambda _name: "/usr/bin/graphify")
|
|
52
46
|
|
|
53
47
|
commands_seen: list[list[str]] = []
|
|
@@ -63,13 +57,47 @@ class TestGraphReportBuild:
|
|
|
63
57
|
|
|
64
58
|
_dispatch._compute_and_persist_graph_report(tmp_path, _logger())
|
|
65
59
|
|
|
66
|
-
# Single invocation: no check-update, just the build.
|
|
67
60
|
assert len(commands_seen) == 1
|
|
68
61
|
assert commands_seen[0][0] == "graphify"
|
|
69
|
-
assert "--update" in commands_seen[0]
|
|
70
62
|
assert "--no-viz" in commands_seen[0]
|
|
63
|
+
assert "--update" not in commands_seen[0], (
|
|
64
|
+
"first run must not pass --update — graphify exits 1 without an existing graph"
|
|
65
|
+
)
|
|
66
|
+
# Path arg must be relative '.', not absolute — graphify's CLI parser
|
|
67
|
+
# rejects absolute paths as 'unknown command' (verified on graphify 0.5.x).
|
|
68
|
+
assert "." in commands_seen[0], "must pass relative '.' so graphify accepts it"
|
|
69
|
+
assert str(tmp_path) not in commands_seen[0], (
|
|
70
|
+
"absolute path would trigger graphify's `unknown command` error"
|
|
71
|
+
)
|
|
71
72
|
assert _read_persisted(tmp_path) == "# fresh report\n"
|
|
72
73
|
|
|
74
|
+
def test_incremental_run_uses_update_flag(
|
|
75
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
76
|
+
) -> None:
|
|
77
|
+
"""When graph.json already exists, the run uses `--update --no-viz`."""
|
|
78
|
+
report_dir = tmp_path / "graphify-out"
|
|
79
|
+
report_dir.mkdir(parents=True)
|
|
80
|
+
(report_dir / "graph.json").write_text("{}", encoding="utf-8")
|
|
81
|
+
(report_dir / "GRAPH_REPORT.md").write_text("# old report\n", encoding="utf-8")
|
|
82
|
+
|
|
83
|
+
monkeypatch.setattr(_dispatch.shutil, "which", lambda _name: "/usr/bin/graphify")
|
|
84
|
+
|
|
85
|
+
commands_seen: list[list[str]] = []
|
|
86
|
+
|
|
87
|
+
def _fake_run(cmd: list[str], **_kwargs: object) -> subprocess.CompletedProcess[bytes]:
|
|
88
|
+
commands_seen.append(cmd)
|
|
89
|
+
(report_dir / "GRAPH_REPORT.md").write_text("# updated report\n", encoding="utf-8")
|
|
90
|
+
return subprocess.CompletedProcess(args=cmd, returncode=0, stdout=b"", stderr=b"")
|
|
91
|
+
|
|
92
|
+
monkeypatch.setattr(_dispatch.subprocess, "run", _fake_run)
|
|
93
|
+
|
|
94
|
+
_dispatch._compute_and_persist_graph_report(tmp_path, _logger())
|
|
95
|
+
|
|
96
|
+
assert len(commands_seen) == 1
|
|
97
|
+
assert "--update" in commands_seen[0]
|
|
98
|
+
assert "--no-viz" in commands_seen[0]
|
|
99
|
+
assert _read_persisted(tmp_path) == "# updated report\n"
|
|
100
|
+
|
|
73
101
|
def test_binary_missing_writes_fallback(
|
|
74
102
|
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
75
103
|
) -> None:
|
|
@@ -119,6 +147,27 @@ class TestGraphReportBuild:
|
|
|
119
147
|
|
|
120
148
|
assert _read_persisted(tmp_path) == REPOMAP_FALLBACK
|
|
121
149
|
|
|
150
|
+
def test_failure_logs_graphify_stderr(
|
|
151
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch, caplog: pytest.LogCaptureFixture
|
|
152
|
+
) -> None:
|
|
153
|
+
"""On non-zero exit, graphify's stderr must appear in the log warning."""
|
|
154
|
+
monkeypatch.setattr(_dispatch.shutil, "which", lambda _name: "/usr/bin/graphify")
|
|
155
|
+
|
|
156
|
+
stderr_msg = b"Error: graph.json not found, cannot --update"
|
|
157
|
+
|
|
158
|
+
def _fake_run(cmd: list[str], **_kwargs: object) -> subprocess.CompletedProcess[bytes]:
|
|
159
|
+
raise subprocess.CalledProcessError(returncode=1, cmd=cmd, stderr=stderr_msg)
|
|
160
|
+
|
|
161
|
+
monkeypatch.setattr(_dispatch.subprocess, "run", _fake_run)
|
|
162
|
+
|
|
163
|
+
with caplog.at_level("WARNING"):
|
|
164
|
+
_dispatch._compute_and_persist_graph_report(tmp_path, _logger())
|
|
165
|
+
|
|
166
|
+
warnings = [r.getMessage() for r in caplog.records if r.levelname == "WARNING"]
|
|
167
|
+
assert any("graph.json not found" in w for w in warnings), (
|
|
168
|
+
f"stderr from graphify must be in the log warning. Got: {warnings}"
|
|
169
|
+
)
|
|
170
|
+
|
|
122
171
|
def test_missing_report_after_success_writes_fallback(
|
|
123
172
|
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
124
173
|
) -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/__init__.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/_bench_io.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/_detect.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/_resume.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/bench.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/generate.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/init.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/optimize.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/review.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/commands/status.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/gh/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/gh/milestones.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/logging_setup.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/__init__.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/prompts/hashes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/__init__.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/_telemetry.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/batch.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/fake_runner.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/mcp.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/options.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/protocol.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/rate_limit.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/retry.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/sdk_runner.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/soft_reset.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/state_guard.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/types.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/runner/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/state_retention.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/__init__.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/angular.md
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/base.md
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/fastapi.md
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/finance.md
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/src/code_generator/templates/nestjs.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_cycle_loop_multicycle.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_cycle_ollama_model.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_docs_no_default_max_turns.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_docs_ollama_model_guide.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_effective_model_routing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_max_turns_cli_flag.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_no_max_turns_in_call_sites.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_no_max_turns_literal.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_non_goals_grep_guard.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase_mcp_regression.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_phase_token_logging.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_prompt_prefix_snapshots.py
RENAMED
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_prompt_prefix_stability.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_code_generator-0.5.0 → claude_code_generator-0.5.2}/tests/test_requirements_structure.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|