pdd-cli 0.0.239__tar.gz → 0.0.241__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.
- {pdd_cli-0.0.239/pdd_cli.egg-info → pdd_cli-0.0.241}/PKG-INFO +4 -3
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/README.md +10 -2
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_e2e_fix_orchestrator.py +231 -18
- pdd_cli-0.0.241/pdd/auto_deps_main.py +267 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/ci_drift_heal.py +75 -8
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/pdd_completion.sh +1 -1
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/sync_determine_operation.py +1 -1
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/sync_orchestration.py +19 -1
- {pdd_cli-0.0.239 → pdd_cli-0.0.241/pdd_cli.egg-info}/PKG-INFO +4 -3
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd_cli.egg-info/SOURCES.txt +1 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd_cli.egg-info/requires.txt +1 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pypi_description.rst +2 -2
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pyproject.toml +4 -3
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_e2e_fix_orchestrator.py +1363 -0
- pdd_cli-0.0.241/tests/test_agentic_e2e_fix_orchestrator_resume_prompt.py +713 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_auto_deps_main.py +532 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_ci_drift_heal.py +242 -8
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_determine_operation.py +34 -0
- pdd_cli-0.0.239/pdd/auto_deps_main.py +0 -163
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/LICENSE +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/__init__.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/__main__.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/_keyring_timeout.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_architecture.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_architecture_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_bug.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_bug_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_change.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_change_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_checkup.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_checkup_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_common.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_common_worktree.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_crash.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_e2e_fix.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_fix.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_langtest.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_split.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_split_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_sync.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_sync_runner.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_test.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_test_generate.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_test_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_update.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/agentic_verify.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/api_key_scanner.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/architecture_include_validation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/architecture_registry.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/architecture_sync.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/architecture_sync_helper.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/auth_service.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/auto_deps_architecture.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/auto_include.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/auto_update.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/bug_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/bug_to_unit_test.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/change.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/change_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/checkup_review_loop.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/ci_detect_changed_modules.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/ci_validation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/cli.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/cli_detector.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/cmd_test_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/code_generator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/code_generator_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/__init__.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/analysis.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/auth.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/checkup.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/connect.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/extracts.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/firecrawl.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/fix.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/generate.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/maintenance.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/misc.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/modify.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/report.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/sessions.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/templates.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/utility.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/commands/which.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/comment_line.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/config_resolution.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/conflicts_in_prompts.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/conflicts_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/construct_paths.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/content_selector.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/context_generator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/context_generator_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/continue_generation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/core/__init__.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/core/cli.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/core/cloud.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/core/dump.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/core/duplicate_cli_guard.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/core/errors.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/core/llm_trace.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/core/remote_session.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/core/utils.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/crash_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/data/arena_elo_manifest.json +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/data/language_format.csv +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/data/llm_model.csv +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/detect_change.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/detect_change_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/docs/prompting_guide.md +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/durable_sync_runner.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/edit_file.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/embed_retrieve.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/extracts_prune.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/failure_classification.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/find_section.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/firecrawl_cache.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/fix_code_loop.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/fix_code_module_errors.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/fix_error_loop.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/fix_errors_from_unit_tests.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/fix_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/fix_verification_errors.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/fix_verification_errors_loop.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/fix_verification_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/generate_model_catalog.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/generate_output_paths.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/generate_test.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/generation_completion.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/get_comment.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/get_extension.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/get_jwt_token.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/get_language.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/get_lint_commands.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/get_run_command.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/get_test_command.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/git_update.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/include_query_extractor.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/increase_tests.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/incremental_code_generator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/incremental_prd_architecture.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/insert_includes.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/install_completion.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/json_atomic.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/list_drift_detection.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/llm_invoke.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/load_prompt_template.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/logo_animation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/mcp_config.json +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/metadata_sync.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/model_tester.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/one_session_sync.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/operation_log.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/path_resolution.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/pdd_completion.fish +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/pdd_completion.zsh +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/pddrc_initializer.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/pin_example_hack.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/postprocess.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/postprocess_0.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/preprocess.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/preprocess_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/process_csv_change.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step10_completeness_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step11_sync_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step12_deps_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step13_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step1_analyze_prd_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step1b_complexity_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step2_analyze_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step2b_codebase_scan_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step3_research_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step4_data_model_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step5_design_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step5b_completeness_gate_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step5b_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step6_research_deps_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step7_generate_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step7b_review_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step8_5_context_docs_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step8_pddrc_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step9_prompts_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step9b_cross_audit_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step10_verify_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step11_e2e_test_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step12_pr_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step1_duplicate_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step2_docs_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step3_triage_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step4_api_research_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step5_reproduce_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step6_root_cause_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step7_prompt_classification_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step8_test_plan_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step9_generate_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step10_architecture_update_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step11_identify_issues_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step12_fix_issues_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step13_create_pr_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step1_duplicate_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step2_docs_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step3_research_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step4_clarify_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step5_docs_change_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step6_devunits_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step7_architecture_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step8_analyze_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step9_implement_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step1_discover_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step2_deps_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step3_build_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step4_interfaces_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step5_test_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step6_1_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step6_2_regression_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step6_3_e2e_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step7_verify_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step8_create_pr_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_crash_explore_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step10_ci_validation_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step11_code_cleanup_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step1_unit_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step2_e2e_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step3_root_cause_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step4_fix_e2e_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step5_identify_devunits_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step6_create_unit_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step7_verify_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step8_run_pdd_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step9_verify_all_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_fix_explore_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_fix_nonpython_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_fix_primary_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step0_intent_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step1_survey_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step2_diagnose_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step3_investigate_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step4_propose_options_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step6_extract_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step6a_phase_extract_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step7_assess_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step8_repair_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step9_refine_check_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_sync_fix_dry_run_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_sync_identify_modules_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_generate_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step10_validate_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step11_loop_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step15_plan_validation_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step16_run_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step1_duplicate_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step2_docs_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step3_clarify_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step4_detect_frontend_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step5_test_plan_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step5b_enhance_plan_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step6_coverage_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step6_generate_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step7_checklist_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step7_run_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step8_fix_iterate_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step8_manual_test_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step9_regression_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step9_submit_pr_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_update_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/agentic_verify_explore_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/arrange_graph_layout_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/auto_include_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/bug_to_unit_test_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/change_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/code_patcher_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/conflict_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/continue_generation_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/core_dump_requirements_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/cross_issue_reconcile_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/detect_change_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/diff_analyzer_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/example_generator_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/extract_code_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/extract_conflict_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/extract_detect_change_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/extract_program_code_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/extract_prompt_change_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/extract_prompt_split_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/extract_prompt_update_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/extract_promptline_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/extract_unit_code_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/extract_xml_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/find_verification_errors_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/fix_code_module_errors_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/fix_errors_from_unit_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/fix_verification_errors_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/generate_test_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/generate_test_from_example_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/include_query_extractor_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/increase_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/incremental_prd_architecture_patch_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/insert_includes_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/one_session_agent_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/post_gen_verify_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/prompt_code_diff_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/prompt_diff_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/split_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/summarize_file_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/sync_analysis_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/trace_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/trim_results_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/trim_results_start_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/unfinished_prompt_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/update_prompt_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/prompts/xml_convertor_LLM.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/provider_manager.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/pytest_output.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/python_env_detector.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/reasoning.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/remote_session.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/render_mermaid.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/__init__.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/app.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/click_executor.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/executor.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/jobs.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/models.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/routes/__init__.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/routes/architecture.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/routes/auth.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/routes/commands.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/routes/config.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/routes/extracts.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/routes/files.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/routes/prompts.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/routes/websocket.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/security.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/terminal_spawner.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/server/token_counter.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/setup_tool.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/split.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/split_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/split_validation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/summarize_directory.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/sync_animation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/sync_graph_order_consistency.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/sync_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/sync_order.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/sync_tui.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/template_expander.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/template_registry.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/templates/architecture/architecture_json.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/templates/architecture/example_nextjs_task_notes.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/templates/architecture/example_python_backend.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/templates/architecture/pdd_path_construction_guide.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/templates/generic/generate_pddrc_YAML.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/templates/generic/generate_prompt.prompt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/test_result.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/trace.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/trace_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/track_cost.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/unfinished_prompt.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/update_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/update_model_costs.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/update_prompt.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/user_story_tests.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/validate_prompt_includes.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd/xml_tagger.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd_cli.egg-info/dependency_links.txt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd_cli.egg-info/entry_points.txt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/pdd_cli.egg-info/top_level.txt +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/setup.cfg +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_739_complete.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_739_e2e_synthetic.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_739_fixtures.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_arch_complexity_prompt.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_architecture.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_architecture_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_bug.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_bug_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_bug_orchestrator_1.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_bug_orchestrator_step_comments.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_bug_step10_prompt.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_bug_step11_prompt.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_bug_step7_prompt.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_change.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_change_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_checkup.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_checkup_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_common.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_common_issue_813_anthropic_api_key_oauth_shadow.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_common_worktree.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_crash.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_e2e_fix.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_e2e_fix_step10_prompt.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_fix.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_langtest.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_split.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_split_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_split_real.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_split_v2.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_sync.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_sync_nearest_config.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_sync_runner.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_test.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_test_generate.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_test_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_update.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_agentic_verify.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_api_key_scanner.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_architecture_include_validation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_architecture_registry.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_architecture_sync.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_auth_service.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_auto_deps_architecture.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_auto_deps_entry_wipe.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_auto_deps_lock.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_auto_heal_workflow.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_auto_include.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_auto_update.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_bug_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_bug_to_unit_test.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_change.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_change_call_site_and_retry.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_change_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_checkup_pr_mode.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_checkup_review_loop.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_ci_detect_changed_modules.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_ci_validation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_circular_includes.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_cli.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_cli_binary_isolation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_cli_detector.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_cloud_noninteractive_auth.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_cmd_test_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_code_generator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_code_generator_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_code_patcher_prompt_json_example.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_commands_auth.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_commands_firecrawl.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_commands_fix.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_commands_generate.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_commands_maintenance.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_commands_modify.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_commands_templates.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_commands_utility.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_comment_line.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_conflicts_in_prompts.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_conflicts_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_construct_paths.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_content_selector.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_context_example_isolation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_context_generator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_context_generator_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_continue_generation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_copy_package_data_to_public.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_core_dump.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_core_errors.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_core_utils.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_crash_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_cross_step_consistency_prompts.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_detect_change.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_detect_change_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_discover_associated_documents.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_duplicate_cli_guard.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_durable_sync_runner.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_auto_deps_pipeline.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_bug_step9_verification.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_219_duplicate_includes.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_295_openai_schema.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_296_custom_csv.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_305_false_success.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_309_oauth_rate_limit.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_319_json_braces.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_340_report_core_no_default.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_342_syspath_isolation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_349_sys_modules_pollution.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_357_step9_keyerror.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_358_jwt_cache_null.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_364_cumulative_cost.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_373_step5_keyerror.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_375_malformed_json.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_379_auth_null_expires.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_383_commit_intermediate_files.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_399_ssh_url_message.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_419_cli_unpushed_commits.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_419_unpushed_commits.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_426_include_path_validation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_429_prompt_files_in_pr.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_445_worktree_resume.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_448_change_orchestrator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_448_step5_keyerror.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_449_auth_logout_message.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_467_false_cached_steps.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_468_not_a_bug_early_exit.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_469_cleanup_messages.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_469_duplicate_unresolved.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_470_sessions_cleanup_auth_message.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_481_pagination.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_485_warning_false_negative.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_493_update_output_subdir.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_508_budget_test_cost.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_508_sync_budget_tracking.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_509_retry_cost.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_521_circular_includes.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_522_include_fingerprint.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_545_no_changes_to_commit.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_549_format_double_escaping.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_549_other_orchestrators.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_553_circular_includes_non_recursive.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_557_codex_ndjson.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_566_code_fence_tags.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_579_bug_worktree_rerun.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_579_orchestrator_rerun.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_594_preamble_imports.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_604_handler_wiring.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_620_hallucinated_imports.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_626_nextjs_rendering_model.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_686_anthropic_cost_double_count.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_687_postprocess_model_name.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_737_step_completion_markers.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_745_initial_cost_tracking.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_773_hard_stop.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_791_e2e_timeout_retry.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_796_typescript_python_validation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_797_typescript_verification.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_817_step5_degenerate_cli.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_824_artifact_filtering.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_825_param_drop.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_830_workflow_stall.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_894.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_902_provider_fallback.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_issue_903_convergence.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_openai_required_array.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_pattern_verification.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_selective_includes.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_selective_includes_integration.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_step11_cleanup_revert.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_subprocess_issue_399_ssh_url_message.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_subprocess_issue_541_quiet_flag.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_e2e_subprocess_issue_593_bug_exit_code.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_embed_retrieve.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_example_error_detection.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_explicit_output_paths.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_extracts_prune.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_failure_classification.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_find_prompt_file.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_find_section.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_firecrawl_cache.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_fix_code_loop.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_fix_code_module_errors.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_fix_error_loop.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_fix_error_loop_failure_aware.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_fix_errors_from_unit_tests.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_fix_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_fix_main_issue_232.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_fix_verification_errors.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_fix_verification_errors_loop.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_fix_verification_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_generate_model_catalog.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_generate_output_paths.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_generate_output_paths_regression.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_generate_test.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_generation_completion.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_get_comment.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_get_extension.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_get_jwt_token.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_get_language.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_get_lint_commands.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_get_run_command.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_get_test_command.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_git_update.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_include_query_extractor.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_increase_tests.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_incremental_code_generator.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_incremental_prd_architecture.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_incremental_prd_architecture_real.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_insert_includes.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_install_completion.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_1021_reproduction.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_1049_reproduction.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_1240_generate_prompt_meta_framing.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_1272_cloud_timeout.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_225_paths_and_includes.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_237.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_467_all_orchestrators.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_469_duplicate_unresolved.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_592_failing_case.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_600_agentic_weaknesses.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_633_reproduction.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_686_post_process_args_braces.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_737_step_completion_markers.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_791_reproduction.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_794_anti_tdd_and_test_discovery.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_794_repro.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_830_remaining_fixes.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_865_reproduction.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_894_pytest_output_deadlock.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_902.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_902_prompt_sync.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_926_preserve_comments_directive.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_issue_953_directory_scan_regression.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_jobs_sync_failure_detection.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_list_drift_detection.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_llm_invoke.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_llm_invoke_csv_model_registration.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_llm_invoke_integration.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_llm_invoke_nested_schema.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_llm_invoke_retry_cost.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_llm_invoke_vertex_retry.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_load_prompt_template.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_logo_animation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_metadata_sync.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_mock_vs_production_fix.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_model_tester.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_nextjs_rendering_model.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_one_session_eval.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_one_session_sync.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_opencode_provider.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_operation_log.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_operation_logging_e2e.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_path_resolution.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_pattern_completeness_verification.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_pddrc_initializer.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_pddrc_true_e2e.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_pin_example_hack.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_postprocess.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_postprocess_0.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_preprocess.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_preprocess_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_preprocess_main_pdd_tags.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_process_csv_change.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_prompt_contract_validation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_provider_env_isolation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_provider_manager.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_pytest_output.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_quiet_flag.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_reasoning.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_remote_command_completion.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_remote_session.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_render_mermaid.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_report.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_research_prompt_web_tools.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_server_routes_prompts.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_server_spawn.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_setup_tool.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_split.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_split_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_split_seam_resolution.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_split_validation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_step11_api_mocking_guidance.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_structural_test_guard.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_structural_test_guard_integration.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_summarize_directory.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_animation.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_animation_0.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_backward_compat.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_code_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_contract_matrix.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_graph_order_consistency.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_orchestration.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_order.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_target_coverage_infinite_loop.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_template_prompt_discovery.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_sync_tui.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_template_expander.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_template_registry.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_thread_safe_redirector.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_time_reasoning_effort_env.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_trace.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_trace_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_track_cost.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_unfinished_prompt.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_update_command.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_update_main.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_update_model_costs.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_update_prompt.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_user_story_tests.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_version.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_which.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_xml_tagger.py +0 -0
- {pdd_cli-0.0.239 → pdd_cli-0.0.241}/tests/test_z3_prompt_test_correspondence.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pdd-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.241
|
|
4
4
|
Summary: PDD (Prompt-Driven Development) Command Line Interface
|
|
5
5
|
Author: Greg Tanaka
|
|
6
6
|
Author-email: glt@alumni.caltech.edu
|
|
@@ -52,6 +52,7 @@ Requires-Dist: uvicorn[standard]>=0.32.0
|
|
|
52
52
|
Requires-Dist: websockets>=13.0
|
|
53
53
|
Requires-Dist: watchdog>=4.0.0
|
|
54
54
|
Requires-Dist: tiktoken>=0.7.0
|
|
55
|
+
Requires-Dist: filelock>=3.12
|
|
55
56
|
Provides-Extra: dev
|
|
56
57
|
Requires-Dist: commitizen; extra == "dev"
|
|
57
58
|
Requires-Dist: pytest-cov; extra == "dev"
|
|
@@ -65,7 +66,7 @@ Requires-Dist: twine; extra == "dev"
|
|
|
65
66
|
Requires-Dist: httpx==0.28.1; extra == "dev"
|
|
66
67
|
Dynamic: license-file
|
|
67
68
|
|
|
68
|
-
.. image:: https://img.shields.io/badge/pdd--cli-v0.0.
|
|
69
|
+
.. image:: https://img.shields.io/badge/pdd--cli-v0.0.241-blue
|
|
69
70
|
:alt: PDD-CLI Version
|
|
70
71
|
|
|
71
72
|
.. image:: https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white&link=https://discord.gg/Yp4RTh8bG7
|
|
@@ -142,7 +143,7 @@ After installation, verify:
|
|
|
142
143
|
|
|
143
144
|
pdd --version
|
|
144
145
|
|
|
145
|
-
You'll see the current PDD version (e.g., 0.0.
|
|
146
|
+
You'll see the current PDD version (e.g., 0.0.241).
|
|
146
147
|
|
|
147
148
|
Getting Started with Examples
|
|
148
149
|
-----------------------------
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# PDD (Prompt-Driven Development) Command Line Interface
|
|
2
2
|
|
|
3
|
-
 [](https://discord.gg/Yp4RTh8bG7)
|
|
4
4
|
|
|
5
5
|
## Introduction
|
|
6
6
|
|
|
@@ -362,7 +362,7 @@ For proper model identifiers to use in your custom configuration, refer to the [
|
|
|
362
362
|
|
|
363
363
|
## Version
|
|
364
364
|
|
|
365
|
-
Current version: 0.0.
|
|
365
|
+
Current version: 0.0.241
|
|
366
366
|
|
|
367
367
|
To check your installed version, run:
|
|
368
368
|
```
|
|
@@ -2658,6 +2658,14 @@ The command uses a two-stage retrieval pipeline when candidates exceed 50:
|
|
|
2658
2658
|
|
|
2659
2659
|
After inserting `<include>` directives, the command performs a **deduplication pass** that identifies and removes inline content in the prompt that semantically duplicates what the included documents already provide.
|
|
2660
2660
|
|
|
2661
|
+
**Metadata finalization (on success):** After a successful `auto-deps` run, the command writes/updates a fingerprint in `.pdd/meta/` for the file that was actually written (with `operation="auto-deps"` and the current include-dependency hashes) and clears any stale per-module `_run.json` report keyed by the same identity, so downstream commands see a consistent view. The fingerprint write and the include-dependency metadata update are committed together (atomic from the caller's perspective) and use hash-based, language-agnostic helpers from `pdd.operation_log`. Finalization errors are surfaced as warnings and do not mask a successful `auto-deps` result. Invalid `<include>` tags stripped by the prompt sanitizer and architecture-merge failures (e.g. `architecture.json` could not be patched in place) are also surfaced as yellow warnings before the success summary.
|
|
2662
|
+
|
|
2663
|
+
Identity is derived from the **output path**:
|
|
2664
|
+
- **In-place mode** (`--output <PROMPT_FILE>`, or `pdd sync`'s post-move flow): the output path is the canonical prompt, so the fingerprint lands at `.pdd/meta/<basename>_<language>.json`.
|
|
2665
|
+
- **Default mode** (output is the separate `<basename>_<language>_with_deps.prompt` derivative): the fingerprint lands at `.pdd/meta/<basename>_<language>_with_deps.json`. Canonical metadata is intentionally untouched in this case — the derivative fingerprint records that an `auto-deps` run produced that file without overwriting the canonical module's record.
|
|
2666
|
+
|
|
2667
|
+
**Note on `pdd sync`:** `pdd sync` invokes `auto-deps` with a `*_with_deps.prompt` temp output and then moves it onto the canonical prompt. To avoid leaving orphan `.pdd/meta/*_with_deps.json` files for the moved temp prompt (and to avoid clearing the wrong run report), sync passes the internal `_skip_finalization=True` flag to `auto_deps_main` and owns canonical metadata itself: sync writes the canonical fingerprint via its atomic state machinery (`_save_fingerprint_atomic`) and clears the canonical `_run.json` via `clear_run_report` immediately after the move.
|
|
2668
|
+
|
|
2661
2669
|
The command maintains a CSV file with the following columns:
|
|
2662
2670
|
- `full_path`: The full path to the dependency file
|
|
2663
2671
|
- `file_summary`: A one-sentence summary of the file's content and purpose
|
|
@@ -262,6 +262,70 @@ def _resolve_step9_loop_token(step_output: str, console: Console) -> Optional[st
|
|
|
262
262
|
return None
|
|
263
263
|
|
|
264
264
|
|
|
265
|
+
def _resolve_cached_step9_output(step_outputs: Dict[str, str]) -> str:
|
|
266
|
+
"""Return the authoritative Step 9 output for resume token resolution.
|
|
267
|
+
|
|
268
|
+
Step 9 may run twice in one cycle: the initial pass, plus a retry when the
|
|
269
|
+
initial pass emits no recognizable loop-control token. The retry output is
|
|
270
|
+
stored under ``step_outputs["9_retry"]`` (see the retry persistence site
|
|
271
|
+
in the inner loop); the initial output is ``step_outputs["9"]``. The retry
|
|
272
|
+
output is the authoritative one when it ran — if the retry succeeded with
|
|
273
|
+
``ALL_TESTS_PASS`` but the workflow was interrupted before the next pause,
|
|
274
|
+
reading only ``"9"`` (which can be tokenless) would let resume fall
|
|
275
|
+
through to ``CONTINUE_CYCLE`` and silently advance into a fresh cycle even
|
|
276
|
+
though Step 9 actually succeeded. Prefer the retry output when present
|
|
277
|
+
and non-empty (#1001).
|
|
278
|
+
"""
|
|
279
|
+
retry_out = step_outputs.get("9_retry", "")
|
|
280
|
+
if retry_out:
|
|
281
|
+
return retry_out
|
|
282
|
+
return step_outputs.get("9", "")
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def _post_step9_resume_action(
|
|
286
|
+
step9_output: str,
|
|
287
|
+
current_cycle: int,
|
|
288
|
+
max_cycles: int,
|
|
289
|
+
console: Console,
|
|
290
|
+
) -> str:
|
|
291
|
+
"""Decide what resume should do when last_completed_step >= 9 (Issue #1001).
|
|
292
|
+
|
|
293
|
+
The prior buggy code unconditionally advanced the cycle whenever
|
|
294
|
+
`last_completed_step >= 9` on resume, ignoring what Step 9 actually
|
|
295
|
+
emitted. This helper inspects the cached Step 9 output and branches:
|
|
296
|
+
|
|
297
|
+
- "SUCCESS_FALL_THROUGH" — Step 9 declared success (ALL_TESTS_PASS,
|
|
298
|
+
LOCAL_TESTS_PASS, or NOT_A_BUG). Caller must keep `current_cycle`,
|
|
299
|
+
`last_completed_step`, and `step_outputs` intact and fall through
|
|
300
|
+
to Step 11 cleanup + Step 10 CI validation.
|
|
301
|
+
- "ADVANCE_CYCLE" — Step 9 wants another cycle and budget remains.
|
|
302
|
+
- "MAX_CYCLES_REACHED" — Either Step 9 explicitly emitted
|
|
303
|
+
MAX_CYCLES_REACHED (resolved via the tier-1–3 classifier in
|
|
304
|
+
`_classify_step_output` or the tier-4 LLM fallback in
|
|
305
|
+
`_resolve_step9_loop_token`), or Step 9 wants another cycle but
|
|
306
|
+
the cycle budget is exhausted. In both cases the caller must
|
|
307
|
+
surface this as a non-success exit, reusing the same path Step 9
|
|
308
|
+
uses when emitting MAX_CYCLES_REACHED directly (see
|
|
309
|
+
`_apply_step9_resolved_token` MAX_CYCLES_REACHED handler).
|
|
310
|
+
"""
|
|
311
|
+
# Defensive NOT_A_BUG check: Step 9 normally doesn't emit NOT_A_BUG
|
|
312
|
+
# (that's Step 3), but if the cached output surfaces it, treat as
|
|
313
|
+
# success — Step 3 would already have determined no bug exists.
|
|
314
|
+
if "NOT_A_BUG" in step9_output:
|
|
315
|
+
return "SUCCESS_FALL_THROUGH"
|
|
316
|
+
tok = _resolve_step9_loop_token(step9_output, console)
|
|
317
|
+
if tok in ("ALL_TESTS_PASS", "LOCAL_TESTS_PASS"):
|
|
318
|
+
return "SUCCESS_FALL_THROUGH"
|
|
319
|
+
# Explicit terminal token from Step 9 (tier-1–3 detect_control_token
|
|
320
|
+
# or tier-4 LLM classifier) must NOT be overridden by the budget
|
|
321
|
+
# check below — Step 9 already declared the loop terminal.
|
|
322
|
+
if tok == "MAX_CYCLES_REACHED":
|
|
323
|
+
return "MAX_CYCLES_REACHED"
|
|
324
|
+
if current_cycle < max_cycles:
|
|
325
|
+
return "ADVANCE_CYCLE"
|
|
326
|
+
return "MAX_CYCLES_REACHED"
|
|
327
|
+
|
|
328
|
+
|
|
265
329
|
class _Step9TokenApplyResult(NamedTuple):
|
|
266
330
|
"""Outcome of applying a resolved Step 9 loop token (shared initial + retry paths)."""
|
|
267
331
|
|
|
@@ -477,6 +541,7 @@ def _is_intermediate_file(filepath: str) -> bool:
|
|
|
477
541
|
- *.bak, *.backup, *.orig, *.tmp extensions
|
|
478
542
|
- error_output*.txt (e.g., error_output.txt, error_output_models.txt)
|
|
479
543
|
- .pdd/** (any file under .pdd/ directory — backups, core_dumps, etc.)
|
|
544
|
+
- .gh-wrapper/** (executor `gh` wrapper artifacts — Issue #1001)
|
|
480
545
|
- *_errors.txt, *_fix_errors.txt (e.g., waitlist_fix_errors.txt)
|
|
481
546
|
- step*_output.md (e.g., step9_output.md)
|
|
482
547
|
- test_issue_*_reproduction.py (e.g., test_issue_824_reproduction.py)
|
|
@@ -491,6 +556,13 @@ def _is_intermediate_file(filepath: str) -> bool:
|
|
|
491
556
|
stem = path.stem # filename without extension
|
|
492
557
|
suffix = path.suffix # extension including dot
|
|
493
558
|
|
|
559
|
+
# Issue #1001: filter executor wrapper artifacts.
|
|
560
|
+
# Anchor on the directory boundary so legitimate paths like
|
|
561
|
+
# "gh-wrapper-docs.md" or "tools/gh_wrapper.py" are not over-filtered.
|
|
562
|
+
normalized_gh = str(filepath).replace("\\", "/")
|
|
563
|
+
if normalized_gh.startswith(".gh-wrapper/") or "/.gh-wrapper/" in normalized_gh:
|
|
564
|
+
return True
|
|
565
|
+
|
|
494
566
|
# Check for backup extensions (e.g., foo.py.bak, foo.py.backup)
|
|
495
567
|
if suffix in _BACKUP_EXTENSIONS:
|
|
496
568
|
return True
|
|
@@ -1038,6 +1110,20 @@ def _has_unpushed_commits(cwd: Path) -> bool:
|
|
|
1038
1110
|
return False
|
|
1039
1111
|
|
|
1040
1112
|
|
|
1113
|
+
def _push_unpushed_commits_or_report_noop(
|
|
1114
|
+
cwd: Path,
|
|
1115
|
+
repo_owner: str,
|
|
1116
|
+
repo_name: str,
|
|
1117
|
+
) -> Tuple[bool, str]:
|
|
1118
|
+
"""Push ahead commits if present; otherwise treat the commit step as a no-op."""
|
|
1119
|
+
if _has_unpushed_commits(cwd):
|
|
1120
|
+
push_ok, push_err = _push_with_retry(cwd, repo_owner, repo_name)
|
|
1121
|
+
if push_ok:
|
|
1122
|
+
return True, "Pushed existing commits"
|
|
1123
|
+
return False, f"Push failed: {push_err}"
|
|
1124
|
+
return True, "No changes to commit"
|
|
1125
|
+
|
|
1126
|
+
|
|
1041
1127
|
def push_with_retry(
|
|
1042
1128
|
cwd: Path,
|
|
1043
1129
|
*,
|
|
@@ -1273,15 +1359,8 @@ def _commit_and_push(
|
|
|
1273
1359
|
fallback_files = [f for f in fallback_files if not _is_intermediate_file(f)]
|
|
1274
1360
|
if fallback_files:
|
|
1275
1361
|
files_to_commit = list(fallback_files)
|
|
1276
|
-
elif _has_unpushed_commits(cwd):
|
|
1277
|
-
# Check if there are unpushed commits to push
|
|
1278
|
-
push_ok, push_err = _push_with_retry(cwd, repo_owner, repo_name)
|
|
1279
|
-
if push_ok:
|
|
1280
|
-
return True, "Pushed existing commits"
|
|
1281
|
-
else:
|
|
1282
|
-
return False, f"Push failed: {push_err}"
|
|
1283
1362
|
else:
|
|
1284
|
-
return
|
|
1363
|
+
return _push_unpushed_commits_or_report_noop(cwd, repo_owner, repo_name)
|
|
1285
1364
|
|
|
1286
1365
|
# Stage only workflow-changed files
|
|
1287
1366
|
for filepath in files_to_commit:
|
|
@@ -1306,12 +1385,12 @@ def _commit_and_push(
|
|
|
1306
1385
|
# Commit may fail with "nothing to commit" when fallback files were
|
|
1307
1386
|
# already committed on the branch (merge-base diff includes them).
|
|
1308
1387
|
# In that case, push any unpushed commits instead of failing.
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1388
|
+
commit_output = f"{commit_result.stdout}\n{commit_result.stderr}".lower()
|
|
1389
|
+
if (
|
|
1390
|
+
"nothing to commit" in commit_output
|
|
1391
|
+
or "no changes added to commit" in commit_output
|
|
1392
|
+
):
|
|
1393
|
+
return _push_unpushed_commits_or_report_noop(cwd, repo_owner, repo_name)
|
|
1315
1394
|
return False, f"Failed to commit: {commit_result.stderr}"
|
|
1316
1395
|
|
|
1317
1396
|
# Push to remote with retry on auth failure
|
|
@@ -1539,6 +1618,9 @@ def run_agentic_e2e_fix_orchestrator(
|
|
|
1539
1618
|
# against it (e.g. NOT_A_BUG direct-edit suppression) keep working.
|
|
1540
1619
|
resumed_initial_file_hashes: Optional[Dict[str, Optional[str]]] = None
|
|
1541
1620
|
resumed_initial_sha: Optional[str] = None
|
|
1621
|
+
# Issue #1001: deferred action computed during resume that must be applied
|
|
1622
|
+
# after `success`/`final_message` are initialized below. Default: no-op.
|
|
1623
|
+
_resume_deferred_action: Optional[str] = None
|
|
1542
1624
|
|
|
1543
1625
|
# Resume Logic
|
|
1544
1626
|
if resume:
|
|
@@ -1575,11 +1657,35 @@ def run_agentic_e2e_fix_orchestrator(
|
|
|
1575
1657
|
|
|
1576
1658
|
_check_staleness(loaded_state, cwd)
|
|
1577
1659
|
|
|
1578
|
-
# If
|
|
1660
|
+
# Issue #1001: If Step 9 was the last completed step, branch on its
|
|
1661
|
+
# cached output rather than unconditionally advancing the cycle.
|
|
1662
|
+
# Prefer the retry output (stored under "9_retry") when present —
|
|
1663
|
+
# otherwise a retry that emitted ALL_TESTS_PASS but was interrupted
|
|
1664
|
+
# before the post-Step-9 pause could be misread as a tokenless "9"
|
|
1665
|
+
# and silently advance into a fresh cycle.
|
|
1579
1666
|
if last_completed_step >= 9:
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1667
|
+
step9_cached = _resolve_cached_step9_output(step_outputs)
|
|
1668
|
+
resume_action = _post_step9_resume_action(
|
|
1669
|
+
step9_cached, current_cycle, max_cycles, console
|
|
1670
|
+
)
|
|
1671
|
+
if resume_action == "ADVANCE_CYCLE":
|
|
1672
|
+
current_cycle += 1
|
|
1673
|
+
last_completed_step = 0
|
|
1674
|
+
step_outputs = {} # Clear outputs for new cycle
|
|
1675
|
+
elif resume_action == "MAX_CYCLES_REACHED":
|
|
1676
|
+
# Defer surfacing the failure until after `success` and
|
|
1677
|
+
# `final_message` are initialized below — mirrors the
|
|
1678
|
+
# path used by _apply_step9_resolved_token's
|
|
1679
|
+
# MAX_CYCLES_REACHED handler (final_message set, outer
|
|
1680
|
+
# loop skipped, post-loop failure handler runs).
|
|
1681
|
+
_resume_deferred_action = "MAX_CYCLES_REACHED"
|
|
1682
|
+
elif resume_action == "SUCCESS_FALL_THROUGH":
|
|
1683
|
+
# Step 9 already declared success but workflow was
|
|
1684
|
+
# interrupted before commit/Step 11/Step 10. Defer
|
|
1685
|
+
# setting `success=True` until after its initialization
|
|
1686
|
+
# so we fall through to the success path (commit, code
|
|
1687
|
+
# cleanup, CI validation).
|
|
1688
|
+
_resume_deferred_action = "SUCCESS_FALL_THROUGH"
|
|
1583
1689
|
else:
|
|
1584
1690
|
# No state found, start fresh
|
|
1585
1691
|
clear_workflow_state(cwd, issue_number, workflow_name, state_dir, repo_owner, repo_name, use_github_state)
|
|
@@ -1642,6 +1748,113 @@ def run_agentic_e2e_fix_orchestrator(
|
|
|
1642
1748
|
import_error_retries = 0 # Global budget: max 1 retry across all cycles
|
|
1643
1749
|
verification_failure_context = "" # Injected into Step 1 prompt on retry
|
|
1644
1750
|
|
|
1751
|
+
# Issue #1001 round 11: save-before-verify race.
|
|
1752
|
+
# The inner-loop state save at line ~2049 persists step_outputs["9"] with
|
|
1753
|
+
# the LLM's raw output BEFORE the independent verification at line ~2061 /
|
|
1754
|
+
# _apply_step9_resolved_token at line ~2154 runs. A process pause in that
|
|
1755
|
+
# window can leave disk state with ALL_TESTS_PASS even though verification
|
|
1756
|
+
# would have failed. Re-run _verify_tests_independently on resume to close
|
|
1757
|
+
# the race BEFORE treating the cycle as terminal. On failure, demote the
|
|
1758
|
+
# resume action to ADVANCE_CYCLE (or MAX_CYCLES_REACHED if budget
|
|
1759
|
+
# exhausted) and overwrite step_outputs["9"] with a
|
|
1760
|
+
# FAILED: VERIFICATION_FAILED_ON_RESUME: prefix so the cached state
|
|
1761
|
+
# reflects reality.
|
|
1762
|
+
if _resume_deferred_action == "SUCCESS_FALL_THROUGH":
|
|
1763
|
+
test_files = _extract_test_files(
|
|
1764
|
+
issue_content, changed_files, cwd, initial_file_hashes
|
|
1765
|
+
)
|
|
1766
|
+
if test_files:
|
|
1767
|
+
verified, verify_output = _verify_tests_independently(test_files, cwd)
|
|
1768
|
+
# Mirror the cap-downgrade in _apply_step9_resolved_token for
|
|
1769
|
+
# symmetry with the initial Step 9 verification path.
|
|
1770
|
+
if _fallback_scan_was_capped and verified:
|
|
1771
|
+
verified = False
|
|
1772
|
+
verify_output += (
|
|
1773
|
+
f"\nFALLBACK_CAPPED: Only {len(test_files)} of potentially "
|
|
1774
|
+
"hundreds of test files were verified; cannot confirm full "
|
|
1775
|
+
"suite pass."
|
|
1776
|
+
)
|
|
1777
|
+
if not verified:
|
|
1778
|
+
console.print(
|
|
1779
|
+
"[yellow]Resume re-verification: cached Step 9 success no "
|
|
1780
|
+
"longer verified by independent pytest run; advancing "
|
|
1781
|
+
"cycle.[/yellow]"
|
|
1782
|
+
)
|
|
1783
|
+
step_outputs["9"] = (
|
|
1784
|
+
f"FAILED: VERIFICATION_FAILED_ON_RESUME: {verify_output}"
|
|
1785
|
+
)
|
|
1786
|
+
|
|
1787
|
+
# Issue #1001 round 12 (LOW): persist the FAILED marker BEFORE
|
|
1788
|
+
# the ADVANCE_CYCLE branch clears step_outputs, otherwise the
|
|
1789
|
+
# diagnostic is dead code — the inner-loop's first state save
|
|
1790
|
+
# would only land after cycle advance with an empty step_outputs.
|
|
1791
|
+
# Assemble the full state dict here (state_data is not yet in
|
|
1792
|
+
# scope at this point in the function; it is first defined at
|
|
1793
|
+
# the inner-loop site). The shape mirrors that site exactly so
|
|
1794
|
+
# other fields (total_cost, dev_unit_states, initial_sha, etc.)
|
|
1795
|
+
# are not clobbered on disk.
|
|
1796
|
+
_state_data_resume = {
|
|
1797
|
+
"workflow": workflow_name,
|
|
1798
|
+
"issue_url": issue_url,
|
|
1799
|
+
"issue_number": issue_number,
|
|
1800
|
+
"current_cycle": current_cycle,
|
|
1801
|
+
"last_completed_step": last_completed_step,
|
|
1802
|
+
"step_outputs": step_outputs.copy(),
|
|
1803
|
+
"dev_unit_states": dev_unit_states.copy(),
|
|
1804
|
+
"total_cost": total_cost,
|
|
1805
|
+
"model_used": model_used,
|
|
1806
|
+
"changed_files": changed_files.copy(),
|
|
1807
|
+
"skipped_steps": {str(k): v for k, v in skipped_steps.items()},
|
|
1808
|
+
"last_saved_at": datetime.now().isoformat(),
|
|
1809
|
+
"github_comment_id": github_comment_id,
|
|
1810
|
+
"initial_file_hashes": dict(initial_file_hashes),
|
|
1811
|
+
"initial_sha": initial_sha,
|
|
1812
|
+
}
|
|
1813
|
+
try:
|
|
1814
|
+
new_gh_id = save_workflow_state(
|
|
1815
|
+
cwd,
|
|
1816
|
+
issue_number,
|
|
1817
|
+
workflow_name,
|
|
1818
|
+
_state_data_resume,
|
|
1819
|
+
state_dir,
|
|
1820
|
+
repo_owner,
|
|
1821
|
+
repo_name,
|
|
1822
|
+
use_github_state,
|
|
1823
|
+
github_comment_id,
|
|
1824
|
+
)
|
|
1825
|
+
if new_gh_id:
|
|
1826
|
+
github_comment_id = new_gh_id
|
|
1827
|
+
except Exception as _save_exc:
|
|
1828
|
+
# Best-effort: the FAILED marker is still observable in
|
|
1829
|
+
# the in-memory step_outputs if we later save again
|
|
1830
|
+
# within the same cycle; don't crash resume on a save
|
|
1831
|
+
# transient.
|
|
1832
|
+
logger.debug(
|
|
1833
|
+
"Best-effort resume-reverify state save failed: %s",
|
|
1834
|
+
_save_exc,
|
|
1835
|
+
exc_info=True,
|
|
1836
|
+
)
|
|
1837
|
+
|
|
1838
|
+
if current_cycle < max_cycles:
|
|
1839
|
+
current_cycle += 1
|
|
1840
|
+
last_completed_step = 0
|
|
1841
|
+
step_outputs = {} # ADVANCE_CYCLE: clear for new cycle
|
|
1842
|
+
_resume_deferred_action = None
|
|
1843
|
+
else:
|
|
1844
|
+
_resume_deferred_action = "MAX_CYCLES_REACHED"
|
|
1845
|
+
# else: no test files — match the initial-flow fallback (no
|
|
1846
|
+
# independent verification possible). Trust the cached token, fall
|
|
1847
|
+
# through to the existing SUCCESS_FALL_THROUGH handling below.
|
|
1848
|
+
|
|
1849
|
+
# Issue #1001: Apply deferred resume action now that `success` and
|
|
1850
|
+
# `final_message` exist. Mirrors how the in-cycle Step 9 handler
|
|
1851
|
+
# surfaces these tokens via _apply_step9_resolved_token.
|
|
1852
|
+
if _resume_deferred_action == "SUCCESS_FALL_THROUGH":
|
|
1853
|
+
success = True
|
|
1854
|
+
final_message = "All tests passed after fixes (resumed)."
|
|
1855
|
+
elif _resume_deferred_action == "MAX_CYCLES_REACHED":
|
|
1856
|
+
final_message = "Max cycles reached."
|
|
1857
|
+
|
|
1645
1858
|
try:
|
|
1646
1859
|
# Outer Loop
|
|
1647
1860
|
if current_cycle == 0:
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Callable, Optional, Tuple
|
|
5
|
+
|
|
6
|
+
import click
|
|
7
|
+
import filelock
|
|
8
|
+
from rich.console import Console
|
|
9
|
+
|
|
10
|
+
from . import DEFAULT_STRENGTH, DEFAULT_TIME
|
|
11
|
+
from .construct_paths import construct_paths
|
|
12
|
+
from .insert_includes import insert_includes
|
|
13
|
+
from .validate_prompt_includes import sanitize_prompt_output
|
|
14
|
+
from .auto_deps_architecture import merge_auto_deps_includes_from_cwd
|
|
15
|
+
from .operation_log import (
|
|
16
|
+
infer_module_identity,
|
|
17
|
+
save_fingerprint,
|
|
18
|
+
clear_run_report,
|
|
19
|
+
get_run_report_path,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def auto_deps_main(
|
|
24
|
+
ctx: click.Context,
|
|
25
|
+
prompt_file: str,
|
|
26
|
+
directory_path: str,
|
|
27
|
+
auto_deps_csv_path: Optional[str],
|
|
28
|
+
output: Optional[str],
|
|
29
|
+
force_scan: Optional[bool] = False,
|
|
30
|
+
progress_callback: Optional[Callable[[int, int], None]] = None,
|
|
31
|
+
include_docs: bool = False,
|
|
32
|
+
no_dedup: bool = False,
|
|
33
|
+
concurrency: int = 1,
|
|
34
|
+
_skip_finalization: bool = False,
|
|
35
|
+
) -> Tuple[str, float, str]:
|
|
36
|
+
"""
|
|
37
|
+
CLI entry point for the `auto-deps` command.
|
|
38
|
+
|
|
39
|
+
Analyzes the given prompt file, discovers dependencies (and optionally docs)
|
|
40
|
+
in `directory_path`, inserts `<include>` directives, deduplicates redundant
|
|
41
|
+
inline content (unless disabled), writes the modified prompt + dependency
|
|
42
|
+
CSV, and finalizes per-module fingerprint metadata when overwriting the
|
|
43
|
+
canonical prompt in place.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
(cleaned_prompt, total_cost, model_name) on success.
|
|
47
|
+
("", 0.0, f"Error: {exc}") on non-Abort failures so orchestrators can
|
|
48
|
+
continue gracefully.
|
|
49
|
+
"""
|
|
50
|
+
console = Console()
|
|
51
|
+
quiet = ctx.obj.get("quiet", False) if ctx.obj else False
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
# Build inputs for construct_paths
|
|
55
|
+
input_file_paths = {"prompt_file": prompt_file}
|
|
56
|
+
command_options = {"output": output, "csv": auto_deps_csv_path}
|
|
57
|
+
|
|
58
|
+
force = ctx.obj.get("force", False) if ctx.obj else False
|
|
59
|
+
context_override = ctx.obj.get("context") if ctx.obj else None
|
|
60
|
+
confirm_callback = ctx.obj.get("confirm_callback") if ctx.obj else None
|
|
61
|
+
|
|
62
|
+
resolved_config, input_strings, output_file_paths, _ = construct_paths(
|
|
63
|
+
input_file_paths=input_file_paths,
|
|
64
|
+
force=force,
|
|
65
|
+
quiet=quiet,
|
|
66
|
+
command="auto-deps",
|
|
67
|
+
command_options=command_options,
|
|
68
|
+
context_override=context_override,
|
|
69
|
+
confirm_callback=confirm_callback,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# Resolve CSV path with default fallback
|
|
73
|
+
csv_path = output_file_paths.get("csv", "project_dependencies.csv")
|
|
74
|
+
|
|
75
|
+
# Acquire exclusive lock for the entire operation
|
|
76
|
+
lock_path = Path(f"{csv_path}.lock")
|
|
77
|
+
lock_path.parent.mkdir(parents=True, exist_ok=True)
|
|
78
|
+
lock = filelock.FileLock(f"{csv_path}.lock")
|
|
79
|
+
with lock:
|
|
80
|
+
# Force-scan: delete existing CSV if requested
|
|
81
|
+
if force_scan and Path(csv_path).exists():
|
|
82
|
+
if not quiet:
|
|
83
|
+
console.print(
|
|
84
|
+
f"[yellow]Removing existing CSV file due to --force-scan option: {csv_path}[/yellow]"
|
|
85
|
+
)
|
|
86
|
+
try:
|
|
87
|
+
Path(csv_path).unlink()
|
|
88
|
+
except OSError as exc:
|
|
89
|
+
if not quiet:
|
|
90
|
+
console.print(
|
|
91
|
+
f"[yellow]Warning: Could not remove CSV file {csv_path}: {exc}[/yellow]"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# LLM parameters
|
|
95
|
+
strength = ctx.obj.get("strength", DEFAULT_STRENGTH) if ctx.obj else DEFAULT_STRENGTH
|
|
96
|
+
temperature = ctx.obj.get("temperature", 0) if ctx.obj else 0
|
|
97
|
+
time_budget = ctx.obj.get("time", DEFAULT_TIME) if ctx.obj else DEFAULT_TIME
|
|
98
|
+
verbose = not quiet
|
|
99
|
+
|
|
100
|
+
# Run insert_includes
|
|
101
|
+
modified_prompt, csv_output, total_cost, model_name = insert_includes(
|
|
102
|
+
input_prompt=input_strings["prompt_file"],
|
|
103
|
+
directory_path=directory_path,
|
|
104
|
+
csv_filename=csv_path,
|
|
105
|
+
prompt_filename=prompt_file,
|
|
106
|
+
strength=strength,
|
|
107
|
+
temperature=temperature,
|
|
108
|
+
time=time_budget,
|
|
109
|
+
verbose=verbose,
|
|
110
|
+
progress_callback=progress_callback,
|
|
111
|
+
include_docs=include_docs,
|
|
112
|
+
dedup=(not no_dedup),
|
|
113
|
+
max_workers=concurrency,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# Sanitize prompt output before persisting (removes invalid <include>
|
|
117
|
+
# selectors so a later `pdd sync` does not trip on them).
|
|
118
|
+
output_path = output_file_paths["output"]
|
|
119
|
+
cleaned_prompt, invalid_includes = sanitize_prompt_output(
|
|
120
|
+
modified_prompt, output_path
|
|
121
|
+
)
|
|
122
|
+
if invalid_includes and not quiet:
|
|
123
|
+
console.print(
|
|
124
|
+
f"[yellow]Warning: Cleaned {len(invalid_includes)} invalid "
|
|
125
|
+
f"<include> tag(s) before saving {output_path}: "
|
|
126
|
+
f"{invalid_includes}[/yellow]"
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
# Persist modified prompt
|
|
130
|
+
Path(output_path).parent.mkdir(parents=True, exist_ok=True)
|
|
131
|
+
with open(output_path, "w", encoding="utf-8") as fh:
|
|
132
|
+
fh.write(cleaned_prompt)
|
|
133
|
+
|
|
134
|
+
# Persist CSV if non-empty
|
|
135
|
+
if csv_output:
|
|
136
|
+
Path(csv_path).parent.mkdir(parents=True, exist_ok=True)
|
|
137
|
+
with open(csv_path, "w", encoding="utf-8") as fh:
|
|
138
|
+
fh.write(csv_output)
|
|
139
|
+
|
|
140
|
+
# Merge architecture.json dependencies (if architecture.json exists in project root)
|
|
141
|
+
try:
|
|
142
|
+
merge_result = merge_auto_deps_includes_from_cwd(
|
|
143
|
+
Path(output_path),
|
|
144
|
+
old_prompt_text=input_strings["prompt_file"],
|
|
145
|
+
new_prompt_text=cleaned_prompt,
|
|
146
|
+
)
|
|
147
|
+
except Exception as merge_exc:
|
|
148
|
+
if not quiet:
|
|
149
|
+
console.print(
|
|
150
|
+
f"[yellow]Warning: architecture.json merge failed: {merge_exc}[/yellow]"
|
|
151
|
+
)
|
|
152
|
+
else:
|
|
153
|
+
# Non-exception failures must still reach the user; otherwise the
|
|
154
|
+
# CLI prints success while architecture.json was silently left
|
|
155
|
+
# unchanged. ``updated=False`` is also returned for legitimate
|
|
156
|
+
# no-ops (auto_deps_architecture.py:326 — nothing needed adding),
|
|
157
|
+
# so gate the warning on ``added_dependencies`` being non-empty:
|
|
158
|
+
# that distinguishes "we wanted to write X but couldn't" from
|
|
159
|
+
# "nothing to write."
|
|
160
|
+
if (
|
|
161
|
+
isinstance(merge_result, dict)
|
|
162
|
+
and not merge_result.get("updated", True)
|
|
163
|
+
and merge_result.get("added_dependencies")
|
|
164
|
+
):
|
|
165
|
+
if not quiet:
|
|
166
|
+
messages = merge_result.get("messages") or [
|
|
167
|
+
"merge_auto_deps_includes_from_cwd reported updated=False"
|
|
168
|
+
]
|
|
169
|
+
for msg in messages:
|
|
170
|
+
console.print(
|
|
171
|
+
f"[yellow]Warning: architecture.json not updated: {msg}[/yellow]"
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
# Console reporting
|
|
175
|
+
if not quiet:
|
|
176
|
+
console.print(
|
|
177
|
+
"[bold green]Successfully analyzed and inserted dependencies![/bold green]"
|
|
178
|
+
)
|
|
179
|
+
console.print(f"[bold]Model used:[/bold] {model_name}")
|
|
180
|
+
console.print(f"[bold]Total cost:[/bold] ${total_cost:.6f}")
|
|
181
|
+
console.print(f"[bold]Modified prompt saved to:[/bold] {output_path}")
|
|
182
|
+
console.print(f"[bold]Dependency information saved to:[/bold] {csv_path}")
|
|
183
|
+
|
|
184
|
+
# Metadata finalization for every successful auto-deps mutation
|
|
185
|
+
# (issue #989). Identity comes from the file that was actually
|
|
186
|
+
# written (``output_path``); in in-place mode this resolves to the
|
|
187
|
+
# canonical ``<basename>_<language>`` module, in the default CLI
|
|
188
|
+
# flow it resolves to the ``<basename>_<language>_with_deps``
|
|
189
|
+
# derivative. Errors are surfaced as warnings and never mask a
|
|
190
|
+
# successful auto-deps result.
|
|
191
|
+
#
|
|
192
|
+
# ``_skip_finalization=True`` is set by ``pdd sync`` because it
|
|
193
|
+
# invokes auto-deps with a temp ``<basename>_<language>_with_deps``
|
|
194
|
+
# output that it then ``shutil.move``s onto the canonical prompt;
|
|
195
|
+
# writing a fingerprint for that temp identity here would leave
|
|
196
|
+
# ``.pdd/meta/*_with_deps.json`` orphaned after the move, and the
|
|
197
|
+
# derivative's identity is the wrong target for run-report clears
|
|
198
|
+
# (sync owns the canonical fingerprint write and the canonical
|
|
199
|
+
# run-report clear on its side).
|
|
200
|
+
if _skip_finalization:
|
|
201
|
+
return cleaned_prompt, total_cost, model_name
|
|
202
|
+
try:
|
|
203
|
+
basename, language = infer_module_identity(Path(output_path))
|
|
204
|
+
if basename is None or language is None:
|
|
205
|
+
if not quiet:
|
|
206
|
+
console.print(
|
|
207
|
+
f"[yellow]Warning: Could not infer module identity for "
|
|
208
|
+
f"{output_path}; skipping fingerprint finalization.[/yellow]"
|
|
209
|
+
)
|
|
210
|
+
else:
|
|
211
|
+
# Clear stale run report; do not let its failure block fingerprint save
|
|
212
|
+
try:
|
|
213
|
+
clear_run_report(basename, language)
|
|
214
|
+
except Exception as cr_exc:
|
|
215
|
+
if not quiet:
|
|
216
|
+
console.print(
|
|
217
|
+
f"[yellow]Warning: Failed to clear run report for "
|
|
218
|
+
f"{basename}_{language}: {cr_exc}[/yellow]"
|
|
219
|
+
)
|
|
220
|
+
# Defensive: clear_run_report() in pdd.operation_log silently swallows
|
|
221
|
+
# OSError on the actual unlink, so verify the report is really gone.
|
|
222
|
+
try:
|
|
223
|
+
_stale_report_path = get_run_report_path(basename, language)
|
|
224
|
+
if _stale_report_path.exists():
|
|
225
|
+
if not quiet:
|
|
226
|
+
console.print(
|
|
227
|
+
f"[yellow]Warning: clear_run_report did not remove "
|
|
228
|
+
f"{_stale_report_path}; downstream sync may still see "
|
|
229
|
+
f"stale results.[/yellow]"
|
|
230
|
+
)
|
|
231
|
+
except Exception as _vrf_exc:
|
|
232
|
+
if not quiet:
|
|
233
|
+
console.print(
|
|
234
|
+
f"[yellow]Warning: could not verify run-report removal: "
|
|
235
|
+
f"{_vrf_exc}[/yellow]"
|
|
236
|
+
)
|
|
237
|
+
try:
|
|
238
|
+
save_fingerprint(
|
|
239
|
+
basename=basename,
|
|
240
|
+
language=language,
|
|
241
|
+
operation="auto-deps",
|
|
242
|
+
paths={"prompt": Path(output_path)},
|
|
243
|
+
cost=total_cost,
|
|
244
|
+
model=model_name,
|
|
245
|
+
)
|
|
246
|
+
except Exception as fp_exc:
|
|
247
|
+
if not quiet:
|
|
248
|
+
console.print(
|
|
249
|
+
f"[yellow]Warning: Failed to save fingerprint for "
|
|
250
|
+
f"{basename}_{language}: {fp_exc}[/yellow]"
|
|
251
|
+
)
|
|
252
|
+
except Exception as meta_exc:
|
|
253
|
+
# Never mask a successful auto-deps result on metadata errors
|
|
254
|
+
if not quiet:
|
|
255
|
+
console.print(
|
|
256
|
+
f"[yellow]Warning: Metadata finalization encountered an error: {meta_exc}[/yellow]"
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
return cleaned_prompt, total_cost, model_name
|
|
260
|
+
|
|
261
|
+
except click.Abort:
|
|
262
|
+
# Re-raise to allow orchestrators (e.g. pdd sync) to stop the loop
|
|
263
|
+
raise
|
|
264
|
+
except Exception as exc:
|
|
265
|
+
if not quiet:
|
|
266
|
+
console.print(f"[red]Error in auto-deps: {exc}[/red]")
|
|
267
|
+
return "", 0.0, f"Error: {exc}"
|