pdd-cli 0.0.237__tar.gz → 0.0.239__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.237 → pdd_cli-0.0.239}/PKG-INFO +3 -3
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/README.md +12 -6
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_change_orchestrator.py +11 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_checkup.py +7 -1
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_common.py +20 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_sync.py +271 -31
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_sync_runner.py +3 -1
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/checkup_review_loop.py +355 -20
- pdd_cli-0.0.239/pdd/ci_drift_heal.py +1638 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/checkup.py +16 -1
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/duplicate_cli_guard.py +9 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/metadata_sync.py +22 -6
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pdd_completion.fish +1 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pdd_completion.sh +2 -2
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pdd_completion.zsh +1 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_determine_operation.py +9 -2
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/update_main.py +171 -2
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/PKG-INFO +3 -3
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/SOURCES.txt +2 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pypi_description.rst +2 -2
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pyproject.toml +2 -2
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_change_orchestrator.py +25 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_common.py +134 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_sync.py +650 -45
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_sync_runner.py +32 -0
- pdd_cli-0.0.239/tests/test_auto_heal_workflow.py +128 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_checkup_review_loop.py +1389 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_ci_drift_heal.py +607 -19
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_duplicate_cli_guard.py +34 -2
- pdd_cli-0.0.239/tests/test_issue_1021_reproduction.py +584 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_determine_operation.py +23 -1
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_update_main.py +421 -13
- pdd_cli-0.0.237/pdd/ci_drift_heal.py +0 -1484
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/LICENSE +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/__init__.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/__main__.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/_keyring_timeout.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_architecture.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_architecture_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_bug.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_bug_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_change.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_checkup_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_common_worktree.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_crash.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_e2e_fix.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_e2e_fix_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_fix.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_langtest.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_split.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_split_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_test.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_test_generate.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_test_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_update.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_verify.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/api_key_scanner.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/architecture_include_validation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/architecture_registry.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/architecture_sync.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/architecture_sync_helper.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/auth_service.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/auto_deps_architecture.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/auto_deps_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/auto_include.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/auto_update.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/bug_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/bug_to_unit_test.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/change.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/change_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/ci_detect_changed_modules.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/ci_validation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/cli.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/cli_detector.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/cmd_test_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/code_generator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/code_generator_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/__init__.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/analysis.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/auth.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/connect.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/extracts.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/firecrawl.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/fix.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/generate.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/maintenance.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/misc.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/modify.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/report.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/sessions.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/templates.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/utility.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/which.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/comment_line.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/config_resolution.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/conflicts_in_prompts.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/conflicts_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/construct_paths.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/content_selector.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/context_generator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/context_generator_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/continue_generation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/__init__.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/cli.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/cloud.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/dump.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/errors.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/llm_trace.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/remote_session.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/utils.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/crash_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/data/arena_elo_manifest.json +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/data/language_format.csv +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/data/llm_model.csv +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/detect_change.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/detect_change_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/docs/prompting_guide.md +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/durable_sync_runner.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/edit_file.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/embed_retrieve.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/extracts_prune.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/failure_classification.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/find_section.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/firecrawl_cache.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_code_loop.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_code_module_errors.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_error_loop.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_errors_from_unit_tests.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_verification_errors.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_verification_errors_loop.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_verification_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/generate_model_catalog.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/generate_output_paths.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/generate_test.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/generation_completion.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_comment.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_extension.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_jwt_token.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_language.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_lint_commands.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_run_command.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_test_command.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/git_update.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/include_query_extractor.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/increase_tests.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/incremental_code_generator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/incremental_prd_architecture.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/insert_includes.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/install_completion.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/json_atomic.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/list_drift_detection.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/llm_invoke.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/load_prompt_template.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/logo_animation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/mcp_config.json +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/model_tester.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/one_session_sync.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/operation_log.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/path_resolution.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pddrc_initializer.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pin_example_hack.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/postprocess.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/postprocess_0.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/preprocess.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/preprocess_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/process_csv_change.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step10_completeness_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step11_sync_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step12_deps_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step13_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step1_analyze_prd_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step1b_complexity_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step2_analyze_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step2b_codebase_scan_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step3_research_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step4_data_model_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step5_design_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step5b_completeness_gate_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step5b_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step6_research_deps_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step7_generate_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step7b_review_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step8_5_context_docs_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step8_pddrc_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step9_prompts_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step9b_cross_audit_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step10_verify_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step11_e2e_test_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step12_pr_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step1_duplicate_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step2_docs_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step3_triage_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step4_api_research_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step5_reproduce_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step6_root_cause_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step7_prompt_classification_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step8_test_plan_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step9_generate_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step10_architecture_update_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step11_identify_issues_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step12_fix_issues_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step13_create_pr_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step1_duplicate_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step2_docs_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step3_research_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step4_clarify_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step5_docs_change_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step6_devunits_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step7_architecture_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step8_analyze_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step9_implement_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step1_discover_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step2_deps_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step3_build_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step4_interfaces_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step5_test_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step6_1_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step6_2_regression_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step6_3_e2e_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step7_verify_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step8_create_pr_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_crash_explore_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step10_ci_validation_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step11_code_cleanup_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step1_unit_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step2_e2e_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step3_root_cause_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step4_fix_e2e_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step5_identify_devunits_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step6_create_unit_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step7_verify_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step8_run_pdd_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step9_verify_all_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_fix_explore_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_fix_nonpython_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_fix_primary_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step0_intent_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step1_survey_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step2_diagnose_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step3_investigate_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step4_propose_options_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step6_extract_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step6a_phase_extract_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step7_assess_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step8_repair_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step9_refine_check_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_sync_fix_dry_run_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_sync_identify_modules_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_generate_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step10_validate_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step11_loop_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step15_plan_validation_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step16_run_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step1_duplicate_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step2_docs_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step3_clarify_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step4_detect_frontend_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step5_test_plan_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step5b_enhance_plan_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step6_coverage_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step6_generate_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step7_checklist_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step7_run_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step8_fix_iterate_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step8_manual_test_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step9_regression_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step9_submit_pr_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_update_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_verify_explore_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/arrange_graph_layout_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/auto_include_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/bug_to_unit_test_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/change_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/code_patcher_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/conflict_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/continue_generation_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/core_dump_requirements_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/cross_issue_reconcile_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/detect_change_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/diff_analyzer_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/example_generator_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_code_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_conflict_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_detect_change_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_program_code_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_prompt_change_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_prompt_split_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_prompt_update_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_promptline_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_unit_code_fix_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_xml_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/find_verification_errors_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/fix_code_module_errors_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/fix_errors_from_unit_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/fix_verification_errors_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/generate_test_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/generate_test_from_example_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/include_query_extractor_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/increase_tests_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/incremental_prd_architecture_patch_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/insert_includes_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/one_session_agent_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/post_gen_verify_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/prompt_code_diff_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/prompt_diff_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/split_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/summarize_file_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/sync_analysis_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/trace_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/trim_results_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/trim_results_start_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/unfinished_prompt_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/update_prompt_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/xml_convertor_LLM.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/provider_manager.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pytest_output.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/python_env_detector.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/reasoning.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/remote_session.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/render_mermaid.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/__init__.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/app.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/click_executor.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/executor.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/jobs.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/models.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/__init__.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/architecture.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/auth.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/commands.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/config.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/extracts.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/files.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/prompts.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/websocket.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/security.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/terminal_spawner.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/token_counter.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/setup_tool.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/split.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/split_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/split_validation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/summarize_directory.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_animation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_graph_order_consistency.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_orchestration.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_order.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_tui.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/template_expander.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/template_registry.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/architecture/architecture_json.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/architecture/example_nextjs_task_notes.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/architecture/example_python_backend.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/architecture/pdd_path_construction_guide.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/generic/generate_pddrc_YAML.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/generic/generate_prompt.prompt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/test_result.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/trace.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/trace_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/track_cost.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/unfinished_prompt.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/update_model_costs.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/update_prompt.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/user_story_tests.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/validate_prompt_includes.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/xml_tagger.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/dependency_links.txt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/entry_points.txt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/requires.txt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/top_level.txt +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/setup.cfg +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_739_complete.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_739_e2e_synthetic.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_739_fixtures.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_arch_complexity_prompt.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_architecture.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_architecture_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_orchestrator_1.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_orchestrator_step_comments.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_step10_prompt.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_step11_prompt.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_step7_prompt.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_change.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_checkup.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_checkup_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_common_issue_813_anthropic_api_key_oauth_shadow.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_common_worktree.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_crash.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_e2e_fix.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_e2e_fix_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_e2e_fix_step10_prompt.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_fix.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_langtest.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_split.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_split_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_split_real.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_split_v2.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_sync_nearest_config.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_test.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_test_generate.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_test_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_update.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_verify.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_api_key_scanner.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_architecture_include_validation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_architecture_registry.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_architecture_sync.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auth_service.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_deps_architecture.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_deps_entry_wipe.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_deps_lock.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_deps_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_include.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_update.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_bug_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_bug_to_unit_test.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_change.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_change_call_site_and_retry.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_change_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_checkup_pr_mode.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_ci_detect_changed_modules.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_ci_validation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_circular_includes.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cli.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cli_binary_isolation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cli_detector.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cloud_noninteractive_auth.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cmd_test_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_code_generator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_code_generator_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_code_patcher_prompt_json_example.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_auth.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_firecrawl.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_fix.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_generate.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_maintenance.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_modify.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_templates.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_utility.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_comment_line.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_conflicts_in_prompts.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_conflicts_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_construct_paths.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_content_selector.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_context_example_isolation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_context_generator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_context_generator_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_continue_generation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_copy_package_data_to_public.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_core_dump.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_core_errors.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_core_utils.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_crash_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cross_step_consistency_prompts.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_detect_change.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_detect_change_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_discover_associated_documents.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_durable_sync_runner.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_auto_deps_pipeline.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_bug_step9_verification.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_219_duplicate_includes.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_295_openai_schema.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_296_custom_csv.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_305_false_success.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_309_oauth_rate_limit.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_319_json_braces.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_340_report_core_no_default.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_342_syspath_isolation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_349_sys_modules_pollution.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_357_step9_keyerror.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_358_jwt_cache_null.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_364_cumulative_cost.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_373_step5_keyerror.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_375_malformed_json.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_379_auth_null_expires.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_383_commit_intermediate_files.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_399_ssh_url_message.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_419_cli_unpushed_commits.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_419_unpushed_commits.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_426_include_path_validation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_429_prompt_files_in_pr.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_445_worktree_resume.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_448_change_orchestrator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_448_step5_keyerror.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_449_auth_logout_message.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_467_false_cached_steps.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_468_not_a_bug_early_exit.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_469_cleanup_messages.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_469_duplicate_unresolved.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_470_sessions_cleanup_auth_message.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_481_pagination.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_485_warning_false_negative.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_493_update_output_subdir.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_508_budget_test_cost.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_508_sync_budget_tracking.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_509_retry_cost.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_521_circular_includes.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_522_include_fingerprint.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_545_no_changes_to_commit.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_549_format_double_escaping.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_549_other_orchestrators.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_553_circular_includes_non_recursive.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_557_codex_ndjson.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_566_code_fence_tags.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_579_bug_worktree_rerun.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_579_orchestrator_rerun.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_594_preamble_imports.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_604_handler_wiring.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_620_hallucinated_imports.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_626_nextjs_rendering_model.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_686_anthropic_cost_double_count.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_687_postprocess_model_name.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_737_step_completion_markers.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_745_initial_cost_tracking.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_773_hard_stop.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_791_e2e_timeout_retry.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_796_typescript_python_validation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_797_typescript_verification.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_817_step5_degenerate_cli.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_824_artifact_filtering.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_825_param_drop.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_830_workflow_stall.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_894.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_902_provider_fallback.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_903_convergence.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_openai_required_array.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_pattern_verification.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_selective_includes.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_selective_includes_integration.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_step11_cleanup_revert.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_subprocess_issue_399_ssh_url_message.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_subprocess_issue_541_quiet_flag.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_subprocess_issue_593_bug_exit_code.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_embed_retrieve.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_example_error_detection.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_explicit_output_paths.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_extracts_prune.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_failure_classification.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_find_prompt_file.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_find_section.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_firecrawl_cache.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_code_loop.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_code_module_errors.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_error_loop.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_error_loop_failure_aware.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_errors_from_unit_tests.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_main_issue_232.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_verification_errors.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_verification_errors_loop.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_verification_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_generate_model_catalog.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_generate_output_paths.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_generate_output_paths_regression.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_generate_test.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_generation_completion.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_comment.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_extension.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_jwt_token.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_language.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_lint_commands.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_run_command.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_test_command.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_git_update.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_include_query_extractor.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_increase_tests.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_incremental_code_generator.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_incremental_prd_architecture.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_incremental_prd_architecture_real.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_insert_includes.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_install_completion.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_1049_reproduction.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_1240_generate_prompt_meta_framing.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_1272_cloud_timeout.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_225_paths_and_includes.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_237.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_467_all_orchestrators.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_469_duplicate_unresolved.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_592_failing_case.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_600_agentic_weaknesses.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_633_reproduction.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_686_post_process_args_braces.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_737_step_completion_markers.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_791_reproduction.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_794_anti_tdd_and_test_discovery.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_794_repro.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_830_remaining_fixes.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_865_reproduction.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_894_pytest_output_deadlock.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_902.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_902_prompt_sync.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_926_preserve_comments_directive.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_953_directory_scan_regression.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_jobs_sync_failure_detection.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_list_drift_detection.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke_csv_model_registration.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke_integration.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke_nested_schema.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke_retry_cost.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke_vertex_retry.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_load_prompt_template.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_logo_animation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_metadata_sync.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_mock_vs_production_fix.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_model_tester.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_nextjs_rendering_model.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_one_session_eval.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_one_session_sync.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_opencode_provider.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_operation_log.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_operation_logging_e2e.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_path_resolution.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_pattern_completeness_verification.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_pddrc_initializer.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_pddrc_true_e2e.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_pin_example_hack.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_postprocess.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_postprocess_0.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_preprocess.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_preprocess_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_preprocess_main_pdd_tags.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_process_csv_change.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_prompt_contract_validation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_provider_env_isolation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_provider_manager.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_pytest_output.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_quiet_flag.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_reasoning.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_remote_command_completion.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_remote_session.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_render_mermaid.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_report.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_research_prompt_web_tools.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_server_routes_prompts.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_server_spawn.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_setup_tool.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_split.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_split_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_split_seam_resolution.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_split_validation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_step11_api_mocking_guidance.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_structural_test_guard.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_structural_test_guard_integration.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_summarize_directory.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_animation.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_animation_0.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_backward_compat.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_code_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_contract_matrix.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_graph_order_consistency.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_orchestration.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_order.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_target_coverage_infinite_loop.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_template_prompt_discovery.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_tui.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_template_expander.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_template_registry.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_thread_safe_redirector.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_time_reasoning_effort_env.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_trace.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_trace_main.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_track_cost.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_unfinished_prompt.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_update_command.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_update_model_costs.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_update_prompt.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_user_story_tests.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_version.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_which.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_xml_tagger.py +0 -0
- {pdd_cli-0.0.237 → pdd_cli-0.0.239}/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.239
|
|
4
4
|
Summary: PDD (Prompt-Driven Development) Command Line Interface
|
|
5
5
|
Author: Greg Tanaka
|
|
6
6
|
Author-email: glt@alumni.caltech.edu
|
|
@@ -65,7 +65,7 @@ Requires-Dist: twine; extra == "dev"
|
|
|
65
65
|
Requires-Dist: httpx==0.28.1; extra == "dev"
|
|
66
66
|
Dynamic: license-file
|
|
67
67
|
|
|
68
|
-
.. image:: https://img.shields.io/badge/pdd--cli-v0.0.
|
|
68
|
+
.. image:: https://img.shields.io/badge/pdd--cli-v0.0.239-blue
|
|
69
69
|
:alt: PDD-CLI Version
|
|
70
70
|
|
|
71
71
|
.. image:: https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white&link=https://discord.gg/Yp4RTh8bG7
|
|
@@ -142,7 +142,7 @@ After installation, verify:
|
|
|
142
142
|
|
|
143
143
|
pdd --version
|
|
144
144
|
|
|
145
|
-
You'll see the current PDD version (e.g., 0.0.
|
|
145
|
+
You'll see the current PDD version (e.g., 0.0.239).
|
|
146
146
|
|
|
147
147
|
Getting Started with Examples
|
|
148
148
|
-----------------------------
|
|
@@ -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.239
|
|
366
366
|
|
|
367
367
|
To check your installed version, run:
|
|
368
368
|
```
|
|
@@ -864,7 +864,7 @@ Options:
|
|
|
864
864
|
- `--skip-verify`: Skip the functional verification step
|
|
865
865
|
- `--skip-tests`: Skip unit test generation and fixing
|
|
866
866
|
- `--target-coverage FLOAT`: Desired code coverage percentage (default is 90.0)
|
|
867
|
-
- `--dry-run`: Display real-time sync analysis instead of running sync operations. For no-argument project-wide sync, this prints the dependency-ordered module list and estimated cost without executing any module syncs. For single-module sync, it performs the same state analysis as a normal sync run but without acquiring exclusive locks or executing operations.
|
|
867
|
+
- `--dry-run`: Display real-time sync analysis instead of running sync operations. For no-argument project-wide sync, this prints the dependency-ordered module list and estimated cost without executing any module syncs, plus a single compact roll-up of modules outside the Tier 1 (`generate` / `auto-deps`) scope — bucketed by reason (e.g. `Out of Tier 1 scope: 42 example, 31 test, 18 verify, 12 update, 74 no-prompt fixture`) instead of one warning line per skipped entry. When zero modules are stale, the `0 stale module(s)` fragment is rendered in green so the success signal is visually unambiguous. Actionable architecture-graph warnings (ambiguous or unresolved cross-arch dependencies) are still printed individually in yellow. For single-module sync, it performs the same state analysis as a normal sync run but without acquiring exclusive locks or executing operations. Passing the top-level `pdd --verbose` flag (see above) restores the legacy per-module enumeration after the compact roll-up — one yellow warning line per module outside the Tier 1 scope — for debugging.
|
|
868
868
|
- `--one-session / --no-one-session`: Run sync in a single agentic session instead of separate sessions for each step. Cannot be combined with `--skip-tests` or `--skip-verify`.
|
|
869
869
|
- `--no-steer`: Disable interactive steering of sync operations.
|
|
870
870
|
- `--steer-timeout FLOAT`: Timeout in seconds for steering prompts (default: 8.0).
|
|
@@ -2412,7 +2412,7 @@ Options:
|
|
|
2412
2412
|
- `--git`: Use git history to find the original code file, eliminating the need for the `INPUT_CODE_FILE` argument.
|
|
2413
2413
|
- `--extensions EXTENSIONS`: In repository-wide mode, filter the update to only include files with the specified comma-separated extensions (e.g., `py,js,ts`).
|
|
2414
2414
|
- `--simple`: Use the legacy 2-stage LLM update process instead of the default agentic mode. Useful when agentic CLIs are not available or for faster updates.
|
|
2415
|
-
- `--sync-metadata`: After the prompt update, run the shared metadata-sync orchestrator so prompt PDD tags, `architecture.json` entries, run reports, and fingerprint state are reconciled in one step. Works in single-file, regeneration, and repo modes. Without this flag,
|
|
2415
|
+
- `--sync-metadata`: After the prompt update, run the shared metadata-sync orchestrator so prompt PDD tags, `architecture.json` entries, run reports, and fingerprint state are reconciled in one step. Works in single-file, regeneration, and repo modes. **Fingerprint note:** default single-file/regeneration `pdd update <code>` already finalizes the per-target fingerprint (`.pdd/meta/<basename>_<language>.json`) on success, and logs a skip reason when finalization is intentionally bypassed; `--sync-metadata` does not gate that behavior. Without this flag, the broader prompt-tag/architecture/run-report orchestrator is not run and those layers must be reconciled with separate commands. **Scope note:** the `tags` stage currently *preserves* existing PDD tags and only *seeds* tags from the matching `architecture.json` entry when a prompt has none — LLM-first **refresh** of stale-but-present tags is tracked at issue [#870](https://github.com/promptdriven/pdd/issues/870) and is not invoked by this orchestrator. When a prompt has zero PDD tags AND no architecture entry, the `tags` stage reports `skipped` (never `ok`) so operators see honest status. On any stage `failed`, `pdd update --sync-metadata` exits non-zero so CI auto-heal does not treat a half-finalized update as healed.
|
|
2416
2416
|
|
|
2417
2417
|
Example (Metadata Sync):
|
|
2418
2418
|
```bash
|
|
@@ -2745,8 +2745,9 @@ Options:
|
|
|
2745
2745
|
- `--fixer ROLE`: Fixer role for `--review-loop` (for example, `claude`). The fixer must be different from the reviewer unless `--review-only` is used.
|
|
2746
2746
|
- `--reviewers ROLES`: Legacy comma-separated review-loop role order, interpreted as `reviewer,fixer` (default: `codex,claude`).
|
|
2747
2747
|
- `--reviewer-fallback ROLE`: Optional secondary reviewer role to invoke once if the primary reviewer cannot complete (for example, because of auth, network, sandbox, or CLI failures). The fallback must resolve to a role different from the reviewer and fixer; if it succeeds, it becomes the active reviewer for the remaining loop and the superseded primary's row in the final report is annotated `(optional, superseded by <fallback>)` so downstream verdict adapters drop the failed primary from the required-reviewer set and resolve to `ship_degraded` instead of `unknown`.
|
|
2748
|
+
- `--fixer-fallback ROLE`: Optional secondary fixer role to invoke once if the primary fixer cannot complete (for example, Claude Code subscription-tier `credential-limit` failures). Role aliases are normalized so `claude` and `anthropic` resolve to the same identity; the fallback must resolve to a role different from the active fixer, the active reviewer, AND the originally configured reviewer (so `--reviewer codex --reviewer-fallback gemini --fixer-fallback codex` is skipped even after gemini takes over reviewing). Before the fallback runs the worktree is reset so the primary fixer's partial edits do not leak; on success the fallback takes over as the active fixer for the remaining rounds.
|
|
2748
2749
|
- `--max-review-rounds INT`: Maximum primary-reviewer/fixer rounds (default: 5).
|
|
2749
|
-
- `--max-review-cost FLOAT`: Maximum review-loop LLM cost in USD (default:
|
|
2750
|
+
- `--max-review-cost FLOAT`: Maximum review-loop LLM cost in USD (default: 50.0).
|
|
2750
2751
|
- `--max-review-minutes FLOAT`: Maximum review-loop wall-clock minutes (default: 90.0).
|
|
2751
2752
|
- `--blocking-severities LIST`: Comma-separated severity names used for review-loop reporting and prompt guidance (default: `blocker,critical,medium`). The fixer still receives every valid reviewer finding.
|
|
2752
2753
|
- `--continue-on-reviewer-limit`: Report provider, rate, context-window, timeout, auth, network, sandbox, permission, and non-zero-exit reviewer failures as `degraded` instead of `failed`. Degraded reviewers are still not clean unless a configured fallback reviewer completes successfully and takes over as the active reviewer.
|
|
@@ -3512,7 +3513,7 @@ PDD can be integrated into various development workflows. Here are the conceptua
|
|
|
3512
3513
|
4. Stage and commit healed files with a descriptive message — partial metadata state (any stage reporting `failed`) blocks the commit/checkpoint in PR mode. `skipped` is permitted for legitimate cases (no `architecture.json`, unregistered modules, LLM-first tag generation pending #870) and does not block.
|
|
3513
3514
|
5. Push changes to the current branch
|
|
3514
3515
|
|
|
3515
|
-
**Metadata Finalization**: The CI auto-heal `update` branch and the preflight drift-heal path both call the same `run_metadata_sync` orchestrator that `pdd update --sync-metadata` uses, so all three workflows share one finalization surface. The orchestrator runs in a fixed order — prompt → tags → architecture → run-report cleanup → fingerprint last. **Within `run_metadata_sync`** a `failed` upstream stage gates every later write-bearing stage (architecture, run_report, fingerprint), so a tags failure cannot drag architecture or fingerprint state out of sync. `skipped` upstream (no `architecture.json`, unregistered modules, LLM-first tag refresh pending #870) is acceptable and does not gate later stages. **The orchestrator is not transactional across stages**: if e.g. tags + architecture succeed and fingerprint then fails, the prompt and `architecture.json` writes have already landed on disk and `run_metadata_sync` itself does not roll them back. End-to-end rollback for a failing module is handled by the CI auto-heal layer — on a sync failure, `pdd.ci_drift_heal` calls `_revert_prompt_file` and the module-scoped `_snapshot_metadata_state_for(drift)` / `_restore_metadata_state_for(snapshot)` pair (which captures this module's `architecture.json` bytes + `.pdd/meta/<basename>_<language>.json` pre-sync and writes them back on failure, never touching other modules' state). A repo-scoped `git restore -- .pdd` / `git restore -- architecture.json` is explicitly NOT used because in a multi-module push-to-main heal it would wipe earlier successful modules' writes from the same run; the legacy `_cleanup_metadata_artifacts` symbol is kept only as a no-op import shim.
|
|
3516
|
+
**Metadata Finalization**: The CI auto-heal `update` branch and the preflight drift-heal path both call the same `run_metadata_sync` orchestrator that `pdd update --sync-metadata` uses, so all three workflows share one finalization surface. The orchestrator runs in a fixed order — prompt → tags → architecture → run-report cleanup → fingerprint last. **Within `run_metadata_sync`** a `failed` upstream stage gates every later write-bearing stage (architecture, run_report, fingerprint), so a tags failure cannot drag architecture or fingerprint state out of sync. `skipped` upstream (no `architecture.json`, unregistered modules, LLM-first tag refresh pending #870) is acceptable and does not gate later stages. **The orchestrator is not transactional across stages**: if e.g. tags + architecture succeed and fingerprint then fails, the prompt and `architecture.json` writes have already landed on disk and `run_metadata_sync` itself does not roll them back. End-to-end rollback for a failing module is handled by the CI auto-heal layer — on a sync failure, `pdd.ci_drift_heal` calls `_revert_prompt_file` and the module-scoped `_snapshot_metadata_state_for(drift)` / `_restore_metadata_state_for(snapshot)` pair (which captures this module's `architecture.json` bytes + `.pdd/meta/<basename>_<language>.json` pre-sync and writes them back on failure, never touching other modules' state). A repo-scoped `git restore -- .pdd` / `git restore -- architecture.json` is explicitly NOT used because in a multi-module push-to-main heal it would wipe earlier successful modules' writes from the same run; the legacy `_cleanup_metadata_artifacts` symbol is kept only as a no-op import shim. **Staging is scoped, not blanket** — `commit_and_push` runs `git add -u` for tracked updates plus explicit per-module pathspecs (computed from each `DriftInfo`'s `prompt_path`/`code_path`/`example_path`/`test_path` and `_operation_log_metadata_relpaths(basename, language)`), filters out gitignored paths via `git check-ignore`, and adds `project_dependencies.csv` only when a healed module ran `auto-deps`; `git add -A` is explicitly rejected because it sweeps unrelated `.pdd/meta/*.json` fingerprints from out-of-scope modules into the heal commit (issue #1021) and could publish a failed module's partial metadata alongside another module's successful heal. The combined invariant: auto-heal never commits a half-synced state, and preflight never leaves stale fingerprints after a successful update.
|
|
3516
3517
|
|
|
3517
3518
|
**Usage:**
|
|
3518
3519
|
```bash
|
|
@@ -3561,6 +3562,11 @@ For detailed command examples for each workflow, see the respective command docu
|
|
|
3561
3562
|
- `pull_request_target` (opened / synchronize / reopened / ready_for_review): heals only modules changed by the PR and pushes a `chore: auto-heal …` commit back to the PR branch.
|
|
3562
3563
|
- `issue_comment` with a `/heal` command on a PR by an authorized collaborator: same as above, on demand.
|
|
3563
3564
|
|
|
3565
|
+
Generated internal PRs authored by `prompt-driven-github[bot]` are trusted as
|
|
3566
|
+
the autonomous pdd-issue App identity for the `pull_request_target` heal path.
|
|
3567
|
+
Other PR authors and all `/heal` comment requesters must pass the `pdd_cloud`
|
|
3568
|
+
collaborator check before Cloud Build is dispatched.
|
|
3569
|
+
|
|
3564
3570
|
There is no push-to-main trigger. Drift on `main` is healed by the next PR that touches the affected modules.
|
|
3565
3571
|
|
|
3566
3572
|
**Loop prevention**: Auto-heal commits start with `chore: auto-heal …`; the Cloud Build step short-circuits when the triggering commit subject matches that prefix, so the heal cannot retrigger itself.
|
|
@@ -1013,6 +1013,15 @@ def _preflight_drift_heal(
|
|
|
1013
1013
|
if not quiet:
|
|
1014
1014
|
console.print(f" [green]✓[/green] healed {drift.basename}")
|
|
1015
1015
|
else:
|
|
1016
|
+
combined_output = f"{result.stdout or ''}\n{result.stderr or ''}"
|
|
1017
|
+
if (
|
|
1018
|
+
"metadata finalization failed" in combined_output
|
|
1019
|
+
or "metadata staging verification failed" in combined_output
|
|
1020
|
+
or "[metadata-sync]" in combined_output
|
|
1021
|
+
):
|
|
1022
|
+
raise RuntimeError(
|
|
1023
|
+
f"preflight metadata finalization failed for {drift.basename}"
|
|
1024
|
+
)
|
|
1016
1025
|
failed.append(drift.basename)
|
|
1017
1026
|
if not quiet:
|
|
1018
1027
|
tail = result.stderr.strip().splitlines()[-1:] or ["(no stderr)"]
|
|
@@ -1026,6 +1035,8 @@ def _preflight_drift_heal(
|
|
|
1026
1035
|
console.print(
|
|
1027
1036
|
f" [red]✗[/red] heal timed out for {drift.basename}"
|
|
1028
1037
|
)
|
|
1038
|
+
except RuntimeError:
|
|
1039
|
+
raise
|
|
1029
1040
|
except Exception as exc:
|
|
1030
1041
|
failed.append(drift.basename)
|
|
1031
1042
|
if not quiet:
|
|
@@ -321,8 +321,9 @@ def run_agentic_checkup(
|
|
|
321
321
|
reviewer: Optional[str] = None,
|
|
322
322
|
fixer: Optional[str] = None,
|
|
323
323
|
reviewer_fallback: Optional[str] = None,
|
|
324
|
+
fixer_fallback: Optional[str] = None,
|
|
324
325
|
max_review_rounds: int = 5,
|
|
325
|
-
max_review_cost: float =
|
|
326
|
+
max_review_cost: float = 50.0,
|
|
326
327
|
max_review_minutes: float = 90.0,
|
|
327
328
|
require_all_reviewers_clean: bool = True,
|
|
328
329
|
continue_on_reviewer_limit: bool = False,
|
|
@@ -349,6 +350,10 @@ def run_agentic_checkup(
|
|
|
349
350
|
reviewer first pass and do not invoke the fixer or push changes.
|
|
350
351
|
reviewer_fallback: Optional secondary reviewer role to try once when
|
|
351
352
|
the primary reviewer cannot complete.
|
|
353
|
+
fixer_fallback: Optional secondary fixer role to try once when the
|
|
354
|
+
primary fixer cannot address the reviewer's findings (e.g. a
|
|
355
|
+
subscription-tier credential is exhausted). Must differ from
|
|
356
|
+
both the primary fixer and the active reviewer.
|
|
352
357
|
|
|
353
358
|
Returns:
|
|
354
359
|
Tuple of (success, message, total_cost, model_used).
|
|
@@ -452,6 +457,7 @@ def run_agentic_checkup(
|
|
|
452
457
|
reviewer=reviewer,
|
|
453
458
|
fixer=fixer,
|
|
454
459
|
reviewer_fallback=reviewer_fallback,
|
|
460
|
+
fixer_fallback=fixer_fallback,
|
|
455
461
|
review_only=review_only,
|
|
456
462
|
max_rounds=max_review_rounds,
|
|
457
463
|
max_cost=max_review_cost,
|
|
@@ -388,6 +388,26 @@ _PERMANENT_ERROR_CLASSES: Tuple[Tuple[str, Tuple[str, ...]], ...] = (
|
|
|
388
388
|
r"model\s+not\s+found(?!\s+in\s+provider)",
|
|
389
389
|
),
|
|
390
390
|
),
|
|
391
|
+
(
|
|
392
|
+
# Issue (this PR): Claude Code subscription-tier weekly limit ("You've
|
|
393
|
+
# hit your limit · resets [TIME]"). Distinct from API-tier 429 because
|
|
394
|
+
# the reset window is hours-to-days, not seconds-to-minutes — retrying
|
|
395
|
+
# on the 60s rate-limit floor wastes minutes. Stable token
|
|
396
|
+
# `credential-limit` lets pdd_cloud's OAuth-token waterfall detect this
|
|
397
|
+
# and rotate to a different credential instead of retrying the dead one.
|
|
398
|
+
"credential-limit",
|
|
399
|
+
(
|
|
400
|
+
# Proximity + time-token guard. Requires "hit your limit" and
|
|
401
|
+
# "resets" within 40 chars (typical envelope is "... limit ·
|
|
402
|
+
# resets May 18, 11pm (UTC) ...") AND requires a time-token
|
|
403
|
+
# OR delimiter immediately after "resets" so distant prose
|
|
404
|
+
# like "if you hit your limit, nothing resets automatically"
|
|
405
|
+
# does NOT classify as credential-limit. Without the time
|
|
406
|
+
# token, any sentence stringing both phrases together would
|
|
407
|
+
# short-circuit the rate-limit retry path on benign text.
|
|
408
|
+
r"hit\s+your\s+limit[^\n]{0,40}?\bresets?\b\s*(?:[·:|\-]|in\s|at\s|on\s|\d|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)",
|
|
409
|
+
),
|
|
410
|
+
),
|
|
391
411
|
(
|
|
392
412
|
# Issue #1072: quota exhaustion (permanent even when 429 is present)
|
|
393
413
|
"quota",
|
|
@@ -36,7 +36,11 @@ from .architecture_include_validation import (
|
|
|
36
36
|
validate_prompt_contract_context,
|
|
37
37
|
)
|
|
38
38
|
from .sync_graph_order_consistency import warnings_for_arch_vs_include_sync_order
|
|
39
|
-
from .architecture_registry import
|
|
39
|
+
from .architecture_registry import (
|
|
40
|
+
extract_modules,
|
|
41
|
+
find_architecture_for_project,
|
|
42
|
+
find_project_root as _find_project_root,
|
|
43
|
+
)
|
|
40
44
|
from .construct_paths import (
|
|
41
45
|
_detect_context_from_basename,
|
|
42
46
|
_extract_prefix_from_prompts_dir,
|
|
@@ -421,12 +425,23 @@ class GlobalSyncAnalysis(NamedTuple):
|
|
|
421
425
|
|
|
422
426
|
modules_to_sync: List[str]
|
|
423
427
|
module_cwds: Dict[str, Path]
|
|
428
|
+
module_targets: Dict[str, str]
|
|
424
429
|
estimated_cost: float
|
|
425
430
|
module_operations: Dict[str, List[str]]
|
|
426
431
|
skipped_modules: List[str]
|
|
427
432
|
all_modules: List[str]
|
|
428
433
|
|
|
429
434
|
|
|
435
|
+
class GlobalSyncModule(NamedTuple):
|
|
436
|
+
"""Scoped global-sync module identity."""
|
|
437
|
+
|
|
438
|
+
key: str
|
|
439
|
+
basename: str
|
|
440
|
+
cwd: Path
|
|
441
|
+
architecture_path: Path
|
|
442
|
+
entry: Dict[str, Any]
|
|
443
|
+
|
|
444
|
+
|
|
430
445
|
def _architecture_module_basenames(architecture: List[Dict[str, Any]]) -> List[str]:
|
|
431
446
|
"""Return syncable architecture module basenames, preserving declaration order."""
|
|
432
447
|
basenames: List[str] = []
|
|
@@ -441,6 +456,58 @@ def _architecture_module_basenames(architecture: List[Dict[str, Any]]) -> List[s
|
|
|
441
456
|
return basenames
|
|
442
457
|
|
|
443
458
|
|
|
459
|
+
def _architecture_sync_modules(project_root: Path) -> Tuple[List[GlobalSyncModule], List[Dict[str, Any]], Path]:
|
|
460
|
+
"""Return architecture modules with cwd scope preserved."""
|
|
461
|
+
arch_files = find_architecture_for_project(project_root)
|
|
462
|
+
if not arch_files:
|
|
463
|
+
return [], [], project_root / "architecture.json"
|
|
464
|
+
|
|
465
|
+
raw_modules: List[Tuple[str, Path, Path, Dict[str, Any]]] = []
|
|
466
|
+
architecture: List[Dict[str, Any]] = []
|
|
467
|
+
seen: set[Tuple[Path, str]] = set()
|
|
468
|
+
|
|
469
|
+
for arch_path in arch_files:
|
|
470
|
+
try:
|
|
471
|
+
data = json.loads(arch_path.read_text(encoding="utf-8"))
|
|
472
|
+
except (json.JSONDecodeError, OSError):
|
|
473
|
+
continue
|
|
474
|
+
|
|
475
|
+
arch_dir = arch_path.parent
|
|
476
|
+
for entry in extract_modules(data):
|
|
477
|
+
basename = _basename_from_architecture_filename(entry.get("filename", ""))
|
|
478
|
+
if not basename:
|
|
479
|
+
continue
|
|
480
|
+
dedupe_key = (arch_path.resolve(), basename)
|
|
481
|
+
if dedupe_key in seen:
|
|
482
|
+
continue
|
|
483
|
+
seen.add(dedupe_key)
|
|
484
|
+
architecture.append(entry)
|
|
485
|
+
# Consult _resolve_module_cwd so a nested .pddrc whose context owns
|
|
486
|
+
# this basename wins over the arch file's own directory. The
|
|
487
|
+
# resolver scans subdirectories of arch_dir for .pddrc files and
|
|
488
|
+
# falls back to arch_dir when no nested config claims the basename.
|
|
489
|
+
cwd = _resolve_module_cwd(basename, arch_dir)
|
|
490
|
+
raw_modules.append((basename, cwd, arch_path, entry))
|
|
491
|
+
|
|
492
|
+
counts: Dict[str, int] = {}
|
|
493
|
+
for basename, _, _, _ in raw_modules:
|
|
494
|
+
counts[basename] = counts.get(basename, 0) + 1
|
|
495
|
+
|
|
496
|
+
modules: List[GlobalSyncModule] = []
|
|
497
|
+
for basename, cwd, arch_path, entry in raw_modules:
|
|
498
|
+
if counts[basename] > 1:
|
|
499
|
+
try:
|
|
500
|
+
rel_scope = arch_path.parent.resolve().relative_to(project_root.resolve()).as_posix()
|
|
501
|
+
except (OSError, ValueError):
|
|
502
|
+
rel_scope = arch_path.parent.as_posix()
|
|
503
|
+
key = f"{rel_scope or '.'}:{basename}"
|
|
504
|
+
else:
|
|
505
|
+
key = basename
|
|
506
|
+
modules.append(GlobalSyncModule(key, basename, cwd, arch_path, entry))
|
|
507
|
+
|
|
508
|
+
return modules, architecture, arch_files[0]
|
|
509
|
+
|
|
510
|
+
|
|
444
511
|
def _prompt_contract_errors_for_module(
|
|
445
512
|
basename: str,
|
|
446
513
|
cwd: Path,
|
|
@@ -578,7 +645,7 @@ def _resolve_module_sync_context(
|
|
|
578
645
|
|
|
579
646
|
|
|
580
647
|
def _analyze_global_sync_modules(
|
|
581
|
-
modules: List[
|
|
648
|
+
modules: List[GlobalSyncModule],
|
|
582
649
|
project_root: Path,
|
|
583
650
|
*,
|
|
584
651
|
quiet: bool = False,
|
|
@@ -590,29 +657,33 @@ def _analyze_global_sync_modules(
|
|
|
590
657
|
"""Tier 1 global sync analysis: fingerprint-scan all architecture modules."""
|
|
591
658
|
modules_to_sync: List[str] = []
|
|
592
659
|
module_cwds: Dict[str, Path] = {}
|
|
660
|
+
module_targets: Dict[str, str] = {}
|
|
593
661
|
module_operations: Dict[str, List[str]] = {}
|
|
594
662
|
skipped_modules: List[str] = []
|
|
595
663
|
estimated_cost = 0.0
|
|
596
664
|
effective_budget = budget if budget is not None else 10.0
|
|
597
665
|
effective_coverage = target_coverage if target_coverage is not None else 90.0
|
|
598
666
|
|
|
599
|
-
for
|
|
600
|
-
|
|
601
|
-
|
|
667
|
+
for module in modules:
|
|
668
|
+
key = module.key
|
|
669
|
+
basename = module.basename
|
|
670
|
+
cwd = module.cwd
|
|
671
|
+
module_cwds[key] = cwd
|
|
672
|
+
module_targets[key] = basename
|
|
602
673
|
|
|
603
674
|
try:
|
|
604
675
|
context_name, prompts_dir, lang_to_path = _resolve_module_sync_context(
|
|
605
676
|
basename, cwd
|
|
606
677
|
)
|
|
607
678
|
except Exception as exc:
|
|
608
|
-
modules_to_sync.append(
|
|
609
|
-
module_operations[
|
|
679
|
+
modules_to_sync.append(key)
|
|
680
|
+
module_operations[key] = [
|
|
610
681
|
f"analysis-error: {exc}; queued for sync as safe fallback"
|
|
611
682
|
]
|
|
612
683
|
continue
|
|
613
684
|
|
|
614
685
|
if not lang_to_path:
|
|
615
|
-
skipped_modules.append(f"{
|
|
686
|
+
skipped_modules.append(f"{key}: no syncable prompt file found")
|
|
616
687
|
continue
|
|
617
688
|
|
|
618
689
|
operations: List[str] = []
|
|
@@ -644,28 +715,34 @@ def _analyze_global_sync_modules(
|
|
|
644
715
|
estimated_cost += float(decision.estimated_cost or 0.0)
|
|
645
716
|
elif decision.operation not in _GLOBAL_SYNC_NOOP_OPERATIONS:
|
|
646
717
|
skipped_modules.append(
|
|
647
|
-
f"{
|
|
718
|
+
f"{key}: {language} requires {decision.operation}; "
|
|
648
719
|
"outside Tier 1 prompt-staleness scope"
|
|
649
720
|
)
|
|
650
721
|
|
|
651
722
|
if needs_sync:
|
|
652
|
-
modules_to_sync.append(
|
|
653
|
-
module_operations[
|
|
723
|
+
modules_to_sync.append(key)
|
|
724
|
+
module_operations[key] = operations
|
|
654
725
|
|
|
655
726
|
if not quiet:
|
|
656
727
|
skipped_count = len(modules) - len(modules_to_sync)
|
|
728
|
+
stale_count = len(modules_to_sync)
|
|
729
|
+
if stale_count == 0:
|
|
730
|
+
stale_fragment = f"[green]0 stale module(s)[/green]"
|
|
731
|
+
else:
|
|
732
|
+
stale_fragment = f"{stale_count} stale module(s)"
|
|
657
733
|
console.print(
|
|
658
|
-
f"[bold]Global sync analysis:[/bold] {
|
|
659
|
-
f"
|
|
734
|
+
f"[bold]Global sync analysis:[/bold] {stale_fragment}, "
|
|
735
|
+
f"{skipped_count} already synced or skipped."
|
|
660
736
|
)
|
|
661
737
|
|
|
662
738
|
return GlobalSyncAnalysis(
|
|
663
739
|
modules_to_sync=modules_to_sync,
|
|
664
740
|
module_cwds=module_cwds,
|
|
741
|
+
module_targets=module_targets,
|
|
665
742
|
estimated_cost=estimated_cost,
|
|
666
743
|
module_operations=module_operations,
|
|
667
744
|
skipped_modules=skipped_modules,
|
|
668
|
-
all_modules=modules,
|
|
745
|
+
all_modules=[module.key for module in modules],
|
|
669
746
|
)
|
|
670
747
|
|
|
671
748
|
|
|
@@ -683,15 +760,163 @@ def _dependency_ordered_modules(
|
|
|
683
760
|
return ordered
|
|
684
761
|
|
|
685
762
|
|
|
763
|
+
def _build_scoped_global_dep_graph(
|
|
764
|
+
modules: List[GlobalSyncModule],
|
|
765
|
+
target_keys: List[str],
|
|
766
|
+
project_root: Path,
|
|
767
|
+
) -> Tuple[Dict[str, List[str]], List[str]]:
|
|
768
|
+
"""Build a dependency graph for scoped global-sync module keys.
|
|
769
|
+
|
|
770
|
+
Dep resolution proceeds in two passes:
|
|
771
|
+
|
|
772
|
+
1. Same-architecture scope: prefer a module declared in the same
|
|
773
|
+
architecture.json as the depending module.
|
|
774
|
+
2. Cross-architecture fallback: if no same-arch match exists, look across
|
|
775
|
+
all loaded modules by basename. An unambiguous match (exactly one
|
|
776
|
+
module across all archs with that basename) is accepted to preserve
|
|
777
|
+
the prior combined-architecture behaviour. Ambiguous cross-arch
|
|
778
|
+
basenames (multiple matches) emit a warning and drop the edge.
|
|
779
|
+
"""
|
|
780
|
+
target_set = set(target_keys)
|
|
781
|
+
module_by_key = {module.key: module for module in modules}
|
|
782
|
+
key_by_scope_basename = {
|
|
783
|
+
(module.architecture_path.resolve(), module.basename): module.key
|
|
784
|
+
for module in modules
|
|
785
|
+
}
|
|
786
|
+
# Global basename index used for unambiguous cross-arch fallback.
|
|
787
|
+
keys_by_basename: Dict[str, List[str]] = {}
|
|
788
|
+
for module in modules:
|
|
789
|
+
keys_by_basename.setdefault(module.basename, []).append(module.key)
|
|
790
|
+
graph: Dict[str, List[str]] = {key: [] for key in target_keys}
|
|
791
|
+
warnings: List[str] = []
|
|
792
|
+
|
|
793
|
+
for key in target_keys:
|
|
794
|
+
module = module_by_key.get(key)
|
|
795
|
+
if module is None:
|
|
796
|
+
continue
|
|
797
|
+
deps = module.entry.get("dependencies", [])
|
|
798
|
+
if not isinstance(deps, list):
|
|
799
|
+
continue
|
|
800
|
+
for dep in deps:
|
|
801
|
+
dep_basename = _basename_from_architecture_filename(str(dep))
|
|
802
|
+
if not dep_basename:
|
|
803
|
+
continue
|
|
804
|
+
dep_key = key_by_scope_basename.get(
|
|
805
|
+
(module.architecture_path.resolve(), dep_basename)
|
|
806
|
+
)
|
|
807
|
+
if dep_key is None:
|
|
808
|
+
# Same-architecture lookup missed. Fall back to a global
|
|
809
|
+
# basename lookup so cross-arch edges (preserved by the old
|
|
810
|
+
# combined-architecture builder) still resolve when the
|
|
811
|
+
# basename is unambiguous across the loaded modules.
|
|
812
|
+
candidate_keys = keys_by_basename.get(dep_basename, [])
|
|
813
|
+
if len(candidate_keys) == 1:
|
|
814
|
+
dep_key = candidate_keys[0]
|
|
815
|
+
elif len(candidate_keys) > 1:
|
|
816
|
+
warnings.append(
|
|
817
|
+
f"combined architecture data under {project_root}: "
|
|
818
|
+
f"module '{key}' declares ambiguous cross-arch "
|
|
819
|
+
f"dependency '{dep}' (basename '{dep_basename}' "
|
|
820
|
+
f"matches multiple modules: "
|
|
821
|
+
f"{', '.join(sorted(candidate_keys))}); "
|
|
822
|
+
"edge omitted from schedule"
|
|
823
|
+
)
|
|
824
|
+
continue
|
|
825
|
+
else:
|
|
826
|
+
warnings.append(
|
|
827
|
+
f"combined architecture data under {project_root}: "
|
|
828
|
+
f"module '{key}' declares unresolved dependency "
|
|
829
|
+
f"'{dep}'; no module with that filename in the same "
|
|
830
|
+
"architecture scope; edge omitted from schedule"
|
|
831
|
+
)
|
|
832
|
+
continue
|
|
833
|
+
if dep_key == key:
|
|
834
|
+
continue
|
|
835
|
+
if dep_key in target_set:
|
|
836
|
+
graph[key].append(dep_key)
|
|
837
|
+
else:
|
|
838
|
+
warnings.append(
|
|
839
|
+
f"combined architecture data under {project_root}: module "
|
|
840
|
+
f"'{key}' depends on '{dep_key}' (via '{dep}'), which is not "
|
|
841
|
+
"in the sync target set; edge omitted from schedule"
|
|
842
|
+
)
|
|
843
|
+
|
|
844
|
+
return graph, warnings
|
|
845
|
+
|
|
846
|
+
|
|
847
|
+
_SKIPPED_BUCKET_ORDER: Tuple[str, ...] = (
|
|
848
|
+
"example",
|
|
849
|
+
"test",
|
|
850
|
+
"verify",
|
|
851
|
+
"update",
|
|
852
|
+
"fix",
|
|
853
|
+
"crash",
|
|
854
|
+
"no-prompt fixture",
|
|
855
|
+
"other",
|
|
856
|
+
)
|
|
857
|
+
_SKIPPED_OPERATION_BUCKETS: Tuple[str, ...] = (
|
|
858
|
+
"example",
|
|
859
|
+
"test",
|
|
860
|
+
"verify",
|
|
861
|
+
"update",
|
|
862
|
+
"fix",
|
|
863
|
+
"crash",
|
|
864
|
+
)
|
|
865
|
+
|
|
866
|
+
|
|
867
|
+
def _bucket_skipped_reasons(skipped_modules: List[str]) -> Dict[str, int]:
|
|
868
|
+
"""Bucket skipped-module entries by reason for the dry-run roll-up.
|
|
869
|
+
|
|
870
|
+
Entries flagged "no syncable prompt file found" go into `no-prompt fixture`;
|
|
871
|
+
entries shaped "{key}: {language} requires {operation}; outside Tier 1 ..."
|
|
872
|
+
bucket by `operation` when it matches a known Tier-1-out-of-scope op,
|
|
873
|
+
otherwise into `other`.
|
|
874
|
+
"""
|
|
875
|
+
buckets: Dict[str, int] = {name: 0 for name in _SKIPPED_BUCKET_ORDER}
|
|
876
|
+
for entry in skipped_modules:
|
|
877
|
+
lower = entry.lower()
|
|
878
|
+
if "no syncable prompt file found" in lower:
|
|
879
|
+
buckets["no-prompt fixture"] += 1
|
|
880
|
+
continue
|
|
881
|
+
matched = False
|
|
882
|
+
for op in _SKIPPED_OPERATION_BUCKETS:
|
|
883
|
+
if f"requires {op}" in lower:
|
|
884
|
+
buckets[op] += 1
|
|
885
|
+
matched = True
|
|
886
|
+
break
|
|
887
|
+
if not matched:
|
|
888
|
+
buckets["other"] += 1
|
|
889
|
+
return buckets
|
|
890
|
+
|
|
891
|
+
|
|
892
|
+
def _format_skipped_bucket_summary(skipped_modules: List[str]) -> Optional[str]:
|
|
893
|
+
"""Return a stable single-line roll-up of skipped buckets, or None if empty."""
|
|
894
|
+
if not skipped_modules:
|
|
895
|
+
return None
|
|
896
|
+
buckets = _bucket_skipped_reasons(skipped_modules)
|
|
897
|
+
parts = [
|
|
898
|
+
f"{count} {name}"
|
|
899
|
+
for name in _SKIPPED_BUCKET_ORDER
|
|
900
|
+
if (count := buckets.get(name, 0)) > 0
|
|
901
|
+
]
|
|
902
|
+
if not parts:
|
|
903
|
+
return None
|
|
904
|
+
return "Out of Tier 1 scope: " + ", ".join(parts)
|
|
905
|
+
|
|
906
|
+
|
|
686
907
|
def _print_global_sync_plan(
|
|
687
908
|
analysis: GlobalSyncAnalysis,
|
|
688
909
|
ordered_modules: List[str],
|
|
689
910
|
warnings: List[str],
|
|
690
911
|
budget: Optional[float] = None,
|
|
912
|
+
verbose: bool = False,
|
|
691
913
|
) -> None:
|
|
692
914
|
"""Render a concise global sync dry-run plan."""
|
|
693
915
|
console.print("[bold]Global sync dry run:[/bold]")
|
|
694
|
-
|
|
916
|
+
if len(ordered_modules) == 0:
|
|
917
|
+
console.print(" Tier 1 (prompt staleness): [green]0 module(s) stale[/green]")
|
|
918
|
+
else:
|
|
919
|
+
console.print(f" Tier 1 (prompt staleness): {len(ordered_modules)} module(s) stale")
|
|
695
920
|
console.print(f" Total architecture modules scanned: {len(analysis.all_modules)}")
|
|
696
921
|
console.print(f" Estimated cost: ${analysis.estimated_cost:.2f}")
|
|
697
922
|
if budget is not None:
|
|
@@ -714,8 +939,13 @@ def _print_global_sync_plan(
|
|
|
714
939
|
for warning in warnings:
|
|
715
940
|
console.print(f"[yellow]Warning: {warning}[/yellow]")
|
|
716
941
|
|
|
717
|
-
|
|
718
|
-
|
|
942
|
+
if analysis.skipped_modules:
|
|
943
|
+
summary = _format_skipped_bucket_summary(analysis.skipped_modules)
|
|
944
|
+
if summary is not None:
|
|
945
|
+
console.print(f" [dim]{summary}[/dim]")
|
|
946
|
+
if verbose:
|
|
947
|
+
for skipped in analysis.skipped_modules:
|
|
948
|
+
console.print(f"[yellow]Warning: {skipped}[/yellow]")
|
|
719
949
|
|
|
720
950
|
|
|
721
951
|
def run_global_sync(
|
|
@@ -736,8 +966,8 @@ def run_global_sync(
|
|
|
736
966
|
) -> Tuple[bool, str, float, str]:
|
|
737
967
|
"""Run project-wide Tier 1 global sync from architecture.json."""
|
|
738
968
|
project_root = _find_project_root(Path.cwd())
|
|
739
|
-
architecture, arch_path =
|
|
740
|
-
if architecture
|
|
969
|
+
all_modules, architecture, arch_path = _architecture_sync_modules(project_root)
|
|
970
|
+
if not architecture:
|
|
741
971
|
return (
|
|
742
972
|
False,
|
|
743
973
|
f"No architecture.json found under {project_root}.",
|
|
@@ -745,7 +975,6 @@ def run_global_sync(
|
|
|
745
975
|
"global-sync",
|
|
746
976
|
)
|
|
747
977
|
|
|
748
|
-
all_modules = _architecture_module_basenames(architecture)
|
|
749
978
|
if not all_modules:
|
|
750
979
|
return (
|
|
751
980
|
False,
|
|
@@ -764,18 +993,20 @@ def run_global_sync(
|
|
|
764
993
|
target_coverage=target_coverage,
|
|
765
994
|
)
|
|
766
995
|
|
|
767
|
-
|
|
768
|
-
|
|
996
|
+
dep_graph, dep_warnings = _build_scoped_global_dep_graph(
|
|
997
|
+
all_modules,
|
|
769
998
|
analysis.modules_to_sync,
|
|
770
|
-
|
|
999
|
+
project_root,
|
|
771
1000
|
)
|
|
772
1001
|
ordered_modules = _dependency_ordered_modules(
|
|
773
|
-
analysis.modules_to_sync,
|
|
1002
|
+
analysis.modules_to_sync, dep_graph
|
|
774
1003
|
)
|
|
775
1004
|
|
|
776
1005
|
if dry_run:
|
|
777
1006
|
if not quiet:
|
|
778
|
-
_print_global_sync_plan(
|
|
1007
|
+
_print_global_sync_plan(
|
|
1008
|
+
analysis, ordered_modules, dep_warnings, budget, verbose=verbose
|
|
1009
|
+
)
|
|
779
1010
|
return (
|
|
780
1011
|
True,
|
|
781
1012
|
f"Global sync dry run: {len(ordered_modules)} module(s) would sync.",
|
|
@@ -801,13 +1032,13 @@ def run_global_sync(
|
|
|
801
1032
|
"global-sync",
|
|
802
1033
|
)
|
|
803
1034
|
|
|
804
|
-
for warning in
|
|
1035
|
+
for warning in dep_warnings:
|
|
805
1036
|
if not quiet:
|
|
806
1037
|
console.print(f"[yellow]Warning: {warning}[/yellow]")
|
|
807
1038
|
|
|
808
1039
|
runner = AsyncSyncRunner(
|
|
809
1040
|
basenames=ordered_modules,
|
|
810
|
-
dep_graph=
|
|
1041
|
+
dep_graph=dep_graph,
|
|
811
1042
|
sync_options={
|
|
812
1043
|
"total_budget": budget,
|
|
813
1044
|
"skip_verify": skip_verify,
|
|
@@ -825,6 +1056,7 @@ def run_global_sync(
|
|
|
825
1056
|
verbose=verbose,
|
|
826
1057
|
issue_url=None,
|
|
827
1058
|
module_cwds=analysis.module_cwds,
|
|
1059
|
+
module_targets=analysis.module_targets,
|
|
828
1060
|
initial_cost=0.0,
|
|
829
1061
|
)
|
|
830
1062
|
success, message, cost = runner.run()
|
|
@@ -946,6 +1178,13 @@ def _resolve_module_cwd(basename: str, project_root: Path) -> Path:
|
|
|
946
1178
|
they match everything and should not claim ownership of unrelated modules.
|
|
947
1179
|
2. Fall back to project_root (which may have its own root .pddrc).
|
|
948
1180
|
"""
|
|
1181
|
+
root_has_prompt = False
|
|
1182
|
+
try:
|
|
1183
|
+
_, _, root_lang_to_path = _resolve_module_sync_context(basename, project_root)
|
|
1184
|
+
root_has_prompt = bool(root_lang_to_path)
|
|
1185
|
+
except Exception:
|
|
1186
|
+
root_has_prompt = False
|
|
1187
|
+
|
|
949
1188
|
# 1. Scan subdirectories for .pddrc files (max depth 2)
|
|
950
1189
|
best_match: Optional[Path] = None
|
|
951
1190
|
best_depth = -1
|
|
@@ -962,10 +1201,11 @@ def _resolve_module_cwd(basename: str, project_root: Path) -> Path:
|
|
|
962
1201
|
if _is_catchall_match(basename, config):
|
|
963
1202
|
continue
|
|
964
1203
|
candidate_dir = pddrc_path.parent
|
|
965
|
-
if _is_broad_basename_glob_match(basename, config, detected)
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
1204
|
+
if _is_broad_basename_glob_match(basename, config, detected):
|
|
1205
|
+
if root_has_prompt:
|
|
1206
|
+
continue
|
|
1207
|
+
if not _prompt_exists_for_context(candidate_dir, config, detected, basename):
|
|
1208
|
+
continue
|
|
969
1209
|
candidate_depth = len(candidate_dir.relative_to(project_root).parts)
|
|
970
1210
|
if candidate_depth > best_depth:
|
|
971
1211
|
best_match = candidate_dir
|