pdd-cli 0.0.240__tar.gz → 0.0.241__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (677) hide show
  1. {pdd_cli-0.0.240/pdd_cli.egg-info → pdd_cli-0.0.241}/PKG-INFO +3 -3
  2. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/README.md +2 -2
  3. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/ci_drift_heal.py +75 -8
  4. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/pdd_completion.sh +1 -1
  5. {pdd_cli-0.0.240 → pdd_cli-0.0.241/pdd_cli.egg-info}/PKG-INFO +3 -3
  6. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pypi_description.rst +2 -2
  7. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pyproject.toml +2 -2
  8. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_ci_drift_heal.py +242 -8
  9. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/LICENSE +0 -0
  10. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/__init__.py +0 -0
  11. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/__main__.py +0 -0
  12. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/_keyring_timeout.py +0 -0
  13. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_architecture.py +0 -0
  14. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_architecture_orchestrator.py +0 -0
  15. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_bug.py +0 -0
  16. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_bug_orchestrator.py +0 -0
  17. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_change.py +0 -0
  18. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_change_orchestrator.py +0 -0
  19. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_checkup.py +0 -0
  20. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_checkup_orchestrator.py +0 -0
  21. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_common.py +0 -0
  22. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_common_worktree.py +0 -0
  23. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_crash.py +0 -0
  24. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_e2e_fix.py +0 -0
  25. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_e2e_fix_orchestrator.py +0 -0
  26. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_fix.py +0 -0
  27. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_langtest.py +0 -0
  28. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_split.py +0 -0
  29. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_split_orchestrator.py +0 -0
  30. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_sync.py +0 -0
  31. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_sync_runner.py +0 -0
  32. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_test.py +0 -0
  33. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_test_generate.py +0 -0
  34. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_test_orchestrator.py +0 -0
  35. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_update.py +0 -0
  36. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/agentic_verify.py +0 -0
  37. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/api_key_scanner.py +0 -0
  38. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/architecture_include_validation.py +0 -0
  39. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/architecture_registry.py +0 -0
  40. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/architecture_sync.py +0 -0
  41. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/architecture_sync_helper.py +0 -0
  42. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/auth_service.py +0 -0
  43. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/auto_deps_architecture.py +0 -0
  44. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/auto_deps_main.py +0 -0
  45. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/auto_include.py +0 -0
  46. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/auto_update.py +0 -0
  47. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/bug_main.py +0 -0
  48. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/bug_to_unit_test.py +0 -0
  49. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/change.py +0 -0
  50. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/change_main.py +0 -0
  51. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/checkup_review_loop.py +0 -0
  52. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/ci_detect_changed_modules.py +0 -0
  53. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/ci_validation.py +0 -0
  54. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/cli.py +0 -0
  55. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/cli_detector.py +0 -0
  56. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/cmd_test_main.py +0 -0
  57. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/code_generator.py +0 -0
  58. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/code_generator_main.py +0 -0
  59. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/__init__.py +0 -0
  60. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/analysis.py +0 -0
  61. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/auth.py +0 -0
  62. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/checkup.py +0 -0
  63. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/connect.py +0 -0
  64. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/extracts.py +0 -0
  65. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/firecrawl.py +0 -0
  66. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/fix.py +0 -0
  67. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/generate.py +0 -0
  68. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/maintenance.py +0 -0
  69. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/misc.py +0 -0
  70. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/modify.py +0 -0
  71. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/report.py +0 -0
  72. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/sessions.py +0 -0
  73. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/templates.py +0 -0
  74. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/utility.py +0 -0
  75. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/commands/which.py +0 -0
  76. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/comment_line.py +0 -0
  77. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/config_resolution.py +0 -0
  78. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/conflicts_in_prompts.py +0 -0
  79. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/conflicts_main.py +0 -0
  80. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/construct_paths.py +0 -0
  81. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/content_selector.py +0 -0
  82. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/context_generator.py +0 -0
  83. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/context_generator_main.py +0 -0
  84. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/continue_generation.py +0 -0
  85. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/core/__init__.py +0 -0
  86. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/core/cli.py +0 -0
  87. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/core/cloud.py +0 -0
  88. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/core/dump.py +0 -0
  89. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/core/duplicate_cli_guard.py +0 -0
  90. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/core/errors.py +0 -0
  91. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/core/llm_trace.py +0 -0
  92. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/core/remote_session.py +0 -0
  93. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/core/utils.py +0 -0
  94. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/crash_main.py +0 -0
  95. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/data/arena_elo_manifest.json +0 -0
  96. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/data/language_format.csv +0 -0
  97. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/data/llm_model.csv +0 -0
  98. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/detect_change.py +0 -0
  99. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/detect_change_main.py +0 -0
  100. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/docs/prompting_guide.md +0 -0
  101. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/durable_sync_runner.py +0 -0
  102. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/edit_file.py +0 -0
  103. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/embed_retrieve.py +0 -0
  104. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/extracts_prune.py +0 -0
  105. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/failure_classification.py +0 -0
  106. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/find_section.py +0 -0
  107. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/firecrawl_cache.py +0 -0
  108. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/fix_code_loop.py +0 -0
  109. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/fix_code_module_errors.py +0 -0
  110. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/fix_error_loop.py +0 -0
  111. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/fix_errors_from_unit_tests.py +0 -0
  112. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/fix_main.py +0 -0
  113. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/fix_verification_errors.py +0 -0
  114. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/fix_verification_errors_loop.py +0 -0
  115. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/fix_verification_main.py +0 -0
  116. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/generate_model_catalog.py +0 -0
  117. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/generate_output_paths.py +0 -0
  118. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/generate_test.py +0 -0
  119. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/generation_completion.py +0 -0
  120. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/get_comment.py +0 -0
  121. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/get_extension.py +0 -0
  122. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/get_jwt_token.py +0 -0
  123. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/get_language.py +0 -0
  124. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/get_lint_commands.py +0 -0
  125. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/get_run_command.py +0 -0
  126. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/get_test_command.py +0 -0
  127. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/git_update.py +0 -0
  128. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/include_query_extractor.py +0 -0
  129. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/increase_tests.py +0 -0
  130. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/incremental_code_generator.py +0 -0
  131. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/incremental_prd_architecture.py +0 -0
  132. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/insert_includes.py +0 -0
  133. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/install_completion.py +0 -0
  134. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/json_atomic.py +0 -0
  135. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/list_drift_detection.py +0 -0
  136. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/llm_invoke.py +0 -0
  137. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/load_prompt_template.py +0 -0
  138. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/logo_animation.py +0 -0
  139. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/mcp_config.json +0 -0
  140. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/metadata_sync.py +0 -0
  141. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/model_tester.py +0 -0
  142. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/one_session_sync.py +0 -0
  143. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/operation_log.py +0 -0
  144. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/path_resolution.py +0 -0
  145. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/pdd_completion.fish +0 -0
  146. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/pdd_completion.zsh +0 -0
  147. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/pddrc_initializer.py +0 -0
  148. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/pin_example_hack.py +0 -0
  149. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/postprocess.py +0 -0
  150. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/postprocess_0.py +0 -0
  151. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/preprocess.py +0 -0
  152. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/preprocess_main.py +0 -0
  153. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/process_csv_change.py +0 -0
  154. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step10_completeness_LLM.prompt +0 -0
  155. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step11_sync_LLM.prompt +0 -0
  156. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step12_deps_LLM.prompt +0 -0
  157. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step13_fix_LLM.prompt +0 -0
  158. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step1_analyze_prd_LLM.prompt +0 -0
  159. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step1b_complexity_LLM.prompt +0 -0
  160. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step2_analyze_LLM.prompt +0 -0
  161. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step2b_codebase_scan_LLM.prompt +0 -0
  162. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step3_research_LLM.prompt +0 -0
  163. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step4_data_model_LLM.prompt +0 -0
  164. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step5_design_LLM.prompt +0 -0
  165. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step5b_completeness_gate_LLM.prompt +0 -0
  166. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step5b_fix_LLM.prompt +0 -0
  167. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step6_research_deps_LLM.prompt +0 -0
  168. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step7_generate_LLM.prompt +0 -0
  169. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step7b_review_LLM.prompt +0 -0
  170. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step8_5_context_docs_LLM.prompt +0 -0
  171. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step8_pddrc_LLM.prompt +0 -0
  172. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step9_prompts_LLM.prompt +0 -0
  173. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_arch_step9b_cross_audit_LLM.prompt +0 -0
  174. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step10_verify_LLM.prompt +0 -0
  175. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step11_e2e_test_LLM.prompt +0 -0
  176. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step12_pr_LLM.prompt +0 -0
  177. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step1_duplicate_LLM.prompt +0 -0
  178. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step2_docs_LLM.prompt +0 -0
  179. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step3_triage_LLM.prompt +0 -0
  180. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step4_api_research_LLM.prompt +0 -0
  181. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step5_reproduce_LLM.prompt +0 -0
  182. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step6_root_cause_LLM.prompt +0 -0
  183. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step7_prompt_classification_LLM.prompt +0 -0
  184. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step8_test_plan_LLM.prompt +0 -0
  185. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_bug_step9_generate_LLM.prompt +0 -0
  186. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step10_architecture_update_LLM.prompt +0 -0
  187. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step11_identify_issues_LLM.prompt +0 -0
  188. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step12_fix_issues_LLM.prompt +0 -0
  189. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step13_create_pr_LLM.prompt +0 -0
  190. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step1_duplicate_LLM.prompt +0 -0
  191. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step2_docs_LLM.prompt +0 -0
  192. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step3_research_LLM.prompt +0 -0
  193. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step4_clarify_LLM.prompt +0 -0
  194. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step5_docs_change_LLM.prompt +0 -0
  195. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step6_devunits_LLM.prompt +0 -0
  196. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step7_architecture_LLM.prompt +0 -0
  197. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step8_analyze_LLM.prompt +0 -0
  198. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_change_step9_implement_LLM.prompt +0 -0
  199. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step1_discover_LLM.prompt +0 -0
  200. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step2_deps_LLM.prompt +0 -0
  201. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step3_build_LLM.prompt +0 -0
  202. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step4_interfaces_LLM.prompt +0 -0
  203. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step5_test_LLM.prompt +0 -0
  204. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step6_1_fix_LLM.prompt +0 -0
  205. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step6_2_regression_tests_LLM.prompt +0 -0
  206. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step6_3_e2e_tests_LLM.prompt +0 -0
  207. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step7_verify_LLM.prompt +0 -0
  208. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_checkup_step8_create_pr_LLM.prompt +0 -0
  209. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_crash_explore_LLM.prompt +0 -0
  210. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step10_ci_validation_LLM.prompt +0 -0
  211. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step11_code_cleanup_LLM.prompt +0 -0
  212. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step1_unit_tests_LLM.prompt +0 -0
  213. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step2_e2e_tests_LLM.prompt +0 -0
  214. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step3_root_cause_LLM.prompt +0 -0
  215. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step4_fix_e2e_tests_LLM.prompt +0 -0
  216. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step5_identify_devunits_LLM.prompt +0 -0
  217. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step6_create_unit_tests_LLM.prompt +0 -0
  218. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step7_verify_tests_LLM.prompt +0 -0
  219. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step8_run_pdd_fix_LLM.prompt +0 -0
  220. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_e2e_fix_step9_verify_all_LLM.prompt +0 -0
  221. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_fix_explore_LLM.prompt +0 -0
  222. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_fix_nonpython_LLM.prompt +0 -0
  223. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_fix_primary_LLM.prompt +0 -0
  224. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step0_intent_LLM.prompt +0 -0
  225. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step1_survey_LLM.prompt +0 -0
  226. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step2_diagnose_LLM.prompt +0 -0
  227. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step3_investigate_LLM.prompt +0 -0
  228. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step4_propose_options_LLM.prompt +0 -0
  229. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step6_extract_LLM.prompt +0 -0
  230. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step6a_phase_extract_LLM.prompt +0 -0
  231. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step7_assess_LLM.prompt +0 -0
  232. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step8_repair_LLM.prompt +0 -0
  233. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_split_step9_refine_check_LLM.prompt +0 -0
  234. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_sync_fix_dry_run_LLM.prompt +0 -0
  235. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_sync_identify_modules_LLM.prompt +0 -0
  236. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_generate_LLM.prompt +0 -0
  237. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step10_validate_LLM.prompt +0 -0
  238. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step11_loop_LLM.prompt +0 -0
  239. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step15_plan_validation_LLM.prompt +0 -0
  240. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step16_run_tests_LLM.prompt +0 -0
  241. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step1_duplicate_LLM.prompt +0 -0
  242. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step2_docs_LLM.prompt +0 -0
  243. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step3_clarify_LLM.prompt +0 -0
  244. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step4_detect_frontend_LLM.prompt +0 -0
  245. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step5_test_plan_LLM.prompt +0 -0
  246. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step5b_enhance_plan_LLM.prompt +0 -0
  247. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step6_coverage_LLM.prompt +0 -0
  248. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step6_generate_tests_LLM.prompt +0 -0
  249. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step7_checklist_LLM.prompt +0 -0
  250. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step7_run_tests_LLM.prompt +0 -0
  251. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step8_fix_iterate_LLM.prompt +0 -0
  252. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step8_manual_test_LLM.prompt +0 -0
  253. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step9_regression_LLM.prompt +0 -0
  254. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_test_step9_submit_pr_LLM.prompt +0 -0
  255. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_update_LLM.prompt +0 -0
  256. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/agentic_verify_explore_LLM.prompt +0 -0
  257. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/arrange_graph_layout_LLM.prompt +0 -0
  258. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/auto_include_LLM.prompt +0 -0
  259. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/bug_to_unit_test_LLM.prompt +0 -0
  260. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/change_LLM.prompt +0 -0
  261. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/code_patcher_LLM.prompt +0 -0
  262. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/conflict_LLM.prompt +0 -0
  263. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/continue_generation_LLM.prompt +0 -0
  264. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/core_dump_requirements_LLM.prompt +0 -0
  265. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/cross_issue_reconcile_LLM.prompt +0 -0
  266. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/detect_change_LLM.prompt +0 -0
  267. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/diff_analyzer_LLM.prompt +0 -0
  268. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/example_generator_LLM.prompt +0 -0
  269. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/extract_code_LLM.prompt +0 -0
  270. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/extract_conflict_LLM.prompt +0 -0
  271. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/extract_detect_change_LLM.prompt +0 -0
  272. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/extract_program_code_fix_LLM.prompt +0 -0
  273. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/extract_prompt_change_LLM.prompt +0 -0
  274. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/extract_prompt_split_LLM.prompt +0 -0
  275. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/extract_prompt_update_LLM.prompt +0 -0
  276. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/extract_promptline_LLM.prompt +0 -0
  277. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/extract_unit_code_fix_LLM.prompt +0 -0
  278. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/extract_xml_LLM.prompt +0 -0
  279. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/find_verification_errors_LLM.prompt +0 -0
  280. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/fix_code_module_errors_LLM.prompt +0 -0
  281. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/fix_errors_from_unit_tests_LLM.prompt +0 -0
  282. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/fix_verification_errors_LLM.prompt +0 -0
  283. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/generate_test_LLM.prompt +0 -0
  284. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/generate_test_from_example_LLM.prompt +0 -0
  285. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/include_query_extractor_LLM.prompt +0 -0
  286. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/increase_tests_LLM.prompt +0 -0
  287. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/incremental_prd_architecture_patch_LLM.prompt +0 -0
  288. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/insert_includes_LLM.prompt +0 -0
  289. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/one_session_agent_LLM.prompt +0 -0
  290. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/post_gen_verify_LLM.prompt +0 -0
  291. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/prompt_code_diff_LLM.prompt +0 -0
  292. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/prompt_diff_LLM.prompt +0 -0
  293. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/split_LLM.prompt +0 -0
  294. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/summarize_file_LLM.prompt +0 -0
  295. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/sync_analysis_LLM.prompt +0 -0
  296. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/trace_LLM.prompt +0 -0
  297. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/trim_results_LLM.prompt +0 -0
  298. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/trim_results_start_LLM.prompt +0 -0
  299. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/unfinished_prompt_LLM.prompt +0 -0
  300. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/update_prompt_LLM.prompt +0 -0
  301. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/prompts/xml_convertor_LLM.prompt +0 -0
  302. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/provider_manager.py +0 -0
  303. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/pytest_output.py +0 -0
  304. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/python_env_detector.py +0 -0
  305. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/reasoning.py +0 -0
  306. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/remote_session.py +0 -0
  307. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/render_mermaid.py +0 -0
  308. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/__init__.py +0 -0
  309. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/app.py +0 -0
  310. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/click_executor.py +0 -0
  311. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/executor.py +0 -0
  312. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/jobs.py +0 -0
  313. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/models.py +0 -0
  314. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/routes/__init__.py +0 -0
  315. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/routes/architecture.py +0 -0
  316. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/routes/auth.py +0 -0
  317. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/routes/commands.py +0 -0
  318. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/routes/config.py +0 -0
  319. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/routes/extracts.py +0 -0
  320. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/routes/files.py +0 -0
  321. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/routes/prompts.py +0 -0
  322. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/routes/websocket.py +0 -0
  323. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/security.py +0 -0
  324. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/terminal_spawner.py +0 -0
  325. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/server/token_counter.py +0 -0
  326. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/setup_tool.py +0 -0
  327. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/split.py +0 -0
  328. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/split_main.py +0 -0
  329. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/split_validation.py +0 -0
  330. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/summarize_directory.py +0 -0
  331. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/sync_animation.py +0 -0
  332. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/sync_determine_operation.py +0 -0
  333. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/sync_graph_order_consistency.py +0 -0
  334. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/sync_main.py +0 -0
  335. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/sync_orchestration.py +0 -0
  336. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/sync_order.py +0 -0
  337. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/sync_tui.py +0 -0
  338. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/template_expander.py +0 -0
  339. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/template_registry.py +0 -0
  340. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/templates/architecture/architecture_json.prompt +0 -0
  341. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/templates/architecture/example_nextjs_task_notes.prompt +0 -0
  342. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/templates/architecture/example_python_backend.prompt +0 -0
  343. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/templates/architecture/pdd_path_construction_guide.prompt +0 -0
  344. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/templates/generic/generate_pddrc_YAML.prompt +0 -0
  345. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/templates/generic/generate_prompt.prompt +0 -0
  346. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/test_result.py +0 -0
  347. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/trace.py +0 -0
  348. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/trace_main.py +0 -0
  349. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/track_cost.py +0 -0
  350. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/unfinished_prompt.py +0 -0
  351. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/update_main.py +0 -0
  352. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/update_model_costs.py +0 -0
  353. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/update_prompt.py +0 -0
  354. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/user_story_tests.py +0 -0
  355. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/validate_prompt_includes.py +0 -0
  356. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd/xml_tagger.py +0 -0
  357. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd_cli.egg-info/SOURCES.txt +0 -0
  358. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd_cli.egg-info/dependency_links.txt +0 -0
  359. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd_cli.egg-info/entry_points.txt +0 -0
  360. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd_cli.egg-info/requires.txt +0 -0
  361. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/pdd_cli.egg-info/top_level.txt +0 -0
  362. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/setup.cfg +0 -0
  363. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_739_complete.py +0 -0
  364. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_739_e2e_synthetic.py +0 -0
  365. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_739_fixtures.py +0 -0
  366. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_arch_complexity_prompt.py +0 -0
  367. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_architecture.py +0 -0
  368. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_architecture_orchestrator.py +0 -0
  369. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_bug.py +0 -0
  370. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_bug_orchestrator.py +0 -0
  371. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_bug_orchestrator_1.py +0 -0
  372. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_bug_orchestrator_step_comments.py +0 -0
  373. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_bug_step10_prompt.py +0 -0
  374. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_bug_step11_prompt.py +0 -0
  375. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_bug_step7_prompt.py +0 -0
  376. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_change.py +0 -0
  377. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_change_orchestrator.py +0 -0
  378. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_checkup.py +0 -0
  379. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_checkup_orchestrator.py +0 -0
  380. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_common.py +0 -0
  381. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_common_issue_813_anthropic_api_key_oauth_shadow.py +0 -0
  382. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_common_worktree.py +0 -0
  383. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_crash.py +0 -0
  384. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_e2e_fix.py +0 -0
  385. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_e2e_fix_orchestrator.py +0 -0
  386. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_e2e_fix_orchestrator_resume_prompt.py +0 -0
  387. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_e2e_fix_step10_prompt.py +0 -0
  388. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_fix.py +0 -0
  389. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_langtest.py +0 -0
  390. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_split.py +0 -0
  391. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_split_orchestrator.py +0 -0
  392. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_split_real.py +0 -0
  393. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_split_v2.py +0 -0
  394. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_sync.py +0 -0
  395. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_sync_nearest_config.py +0 -0
  396. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_sync_runner.py +0 -0
  397. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_test.py +0 -0
  398. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_test_generate.py +0 -0
  399. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_test_orchestrator.py +0 -0
  400. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_update.py +0 -0
  401. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_agentic_verify.py +0 -0
  402. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_api_key_scanner.py +0 -0
  403. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_architecture_include_validation.py +0 -0
  404. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_architecture_registry.py +0 -0
  405. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_architecture_sync.py +0 -0
  406. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_auth_service.py +0 -0
  407. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_auto_deps_architecture.py +0 -0
  408. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_auto_deps_entry_wipe.py +0 -0
  409. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_auto_deps_lock.py +0 -0
  410. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_auto_deps_main.py +0 -0
  411. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_auto_heal_workflow.py +0 -0
  412. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_auto_include.py +0 -0
  413. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_auto_update.py +0 -0
  414. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_bug_main.py +0 -0
  415. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_bug_to_unit_test.py +0 -0
  416. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_change.py +0 -0
  417. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_change_call_site_and_retry.py +0 -0
  418. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_change_main.py +0 -0
  419. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_checkup_pr_mode.py +0 -0
  420. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_checkup_review_loop.py +0 -0
  421. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_ci_detect_changed_modules.py +0 -0
  422. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_ci_validation.py +0 -0
  423. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_circular_includes.py +0 -0
  424. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_cli.py +0 -0
  425. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_cli_binary_isolation.py +0 -0
  426. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_cli_detector.py +0 -0
  427. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_cloud_noninteractive_auth.py +0 -0
  428. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_cmd_test_main.py +0 -0
  429. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_code_generator.py +0 -0
  430. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_code_generator_main.py +0 -0
  431. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_code_patcher_prompt_json_example.py +0 -0
  432. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_commands_auth.py +0 -0
  433. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_commands_firecrawl.py +0 -0
  434. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_commands_fix.py +0 -0
  435. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_commands_generate.py +0 -0
  436. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_commands_maintenance.py +0 -0
  437. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_commands_modify.py +0 -0
  438. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_commands_templates.py +0 -0
  439. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_commands_utility.py +0 -0
  440. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_comment_line.py +0 -0
  441. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_conflicts_in_prompts.py +0 -0
  442. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_conflicts_main.py +0 -0
  443. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_construct_paths.py +0 -0
  444. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_content_selector.py +0 -0
  445. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_context_example_isolation.py +0 -0
  446. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_context_generator.py +0 -0
  447. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_context_generator_main.py +0 -0
  448. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_continue_generation.py +0 -0
  449. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_copy_package_data_to_public.py +0 -0
  450. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_core_dump.py +0 -0
  451. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_core_errors.py +0 -0
  452. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_core_utils.py +0 -0
  453. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_crash_main.py +0 -0
  454. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_cross_step_consistency_prompts.py +0 -0
  455. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_detect_change.py +0 -0
  456. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_detect_change_main.py +0 -0
  457. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_discover_associated_documents.py +0 -0
  458. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_duplicate_cli_guard.py +0 -0
  459. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_durable_sync_runner.py +0 -0
  460. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_auto_deps_pipeline.py +0 -0
  461. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_bug_step9_verification.py +0 -0
  462. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_219_duplicate_includes.py +0 -0
  463. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_295_openai_schema.py +0 -0
  464. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_296_custom_csv.py +0 -0
  465. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_305_false_success.py +0 -0
  466. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_309_oauth_rate_limit.py +0 -0
  467. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_319_json_braces.py +0 -0
  468. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_340_report_core_no_default.py +0 -0
  469. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_342_syspath_isolation.py +0 -0
  470. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_349_sys_modules_pollution.py +0 -0
  471. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_357_step9_keyerror.py +0 -0
  472. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_358_jwt_cache_null.py +0 -0
  473. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_364_cumulative_cost.py +0 -0
  474. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_373_step5_keyerror.py +0 -0
  475. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_375_malformed_json.py +0 -0
  476. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_379_auth_null_expires.py +0 -0
  477. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_383_commit_intermediate_files.py +0 -0
  478. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_399_ssh_url_message.py +0 -0
  479. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_419_cli_unpushed_commits.py +0 -0
  480. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_419_unpushed_commits.py +0 -0
  481. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_426_include_path_validation.py +0 -0
  482. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_429_prompt_files_in_pr.py +0 -0
  483. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_445_worktree_resume.py +0 -0
  484. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_448_change_orchestrator.py +0 -0
  485. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_448_step5_keyerror.py +0 -0
  486. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_449_auth_logout_message.py +0 -0
  487. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_467_false_cached_steps.py +0 -0
  488. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_468_not_a_bug_early_exit.py +0 -0
  489. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_469_cleanup_messages.py +0 -0
  490. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_469_duplicate_unresolved.py +0 -0
  491. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_470_sessions_cleanup_auth_message.py +0 -0
  492. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_481_pagination.py +0 -0
  493. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_485_warning_false_negative.py +0 -0
  494. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_493_update_output_subdir.py +0 -0
  495. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_508_budget_test_cost.py +0 -0
  496. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_508_sync_budget_tracking.py +0 -0
  497. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_509_retry_cost.py +0 -0
  498. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_521_circular_includes.py +0 -0
  499. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_522_include_fingerprint.py +0 -0
  500. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_545_no_changes_to_commit.py +0 -0
  501. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_549_format_double_escaping.py +0 -0
  502. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_549_other_orchestrators.py +0 -0
  503. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_553_circular_includes_non_recursive.py +0 -0
  504. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_557_codex_ndjson.py +0 -0
  505. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_566_code_fence_tags.py +0 -0
  506. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_579_bug_worktree_rerun.py +0 -0
  507. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_579_orchestrator_rerun.py +0 -0
  508. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_594_preamble_imports.py +0 -0
  509. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_604_handler_wiring.py +0 -0
  510. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_620_hallucinated_imports.py +0 -0
  511. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_626_nextjs_rendering_model.py +0 -0
  512. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_686_anthropic_cost_double_count.py +0 -0
  513. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_687_postprocess_model_name.py +0 -0
  514. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_737_step_completion_markers.py +0 -0
  515. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_745_initial_cost_tracking.py +0 -0
  516. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_773_hard_stop.py +0 -0
  517. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_791_e2e_timeout_retry.py +0 -0
  518. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_796_typescript_python_validation.py +0 -0
  519. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_797_typescript_verification.py +0 -0
  520. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_817_step5_degenerate_cli.py +0 -0
  521. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_824_artifact_filtering.py +0 -0
  522. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_825_param_drop.py +0 -0
  523. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_830_workflow_stall.py +0 -0
  524. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_894.py +0 -0
  525. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_902_provider_fallback.py +0 -0
  526. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_issue_903_convergence.py +0 -0
  527. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_openai_required_array.py +0 -0
  528. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_pattern_verification.py +0 -0
  529. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_selective_includes.py +0 -0
  530. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_selective_includes_integration.py +0 -0
  531. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_step11_cleanup_revert.py +0 -0
  532. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_subprocess_issue_399_ssh_url_message.py +0 -0
  533. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_subprocess_issue_541_quiet_flag.py +0 -0
  534. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_e2e_subprocess_issue_593_bug_exit_code.py +0 -0
  535. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_embed_retrieve.py +0 -0
  536. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_example_error_detection.py +0 -0
  537. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_explicit_output_paths.py +0 -0
  538. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_extracts_prune.py +0 -0
  539. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_failure_classification.py +0 -0
  540. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_find_prompt_file.py +0 -0
  541. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_find_section.py +0 -0
  542. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_firecrawl_cache.py +0 -0
  543. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_fix_code_loop.py +0 -0
  544. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_fix_code_module_errors.py +0 -0
  545. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_fix_error_loop.py +0 -0
  546. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_fix_error_loop_failure_aware.py +0 -0
  547. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_fix_errors_from_unit_tests.py +0 -0
  548. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_fix_main.py +0 -0
  549. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_fix_main_issue_232.py +0 -0
  550. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_fix_verification_errors.py +0 -0
  551. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_fix_verification_errors_loop.py +0 -0
  552. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_fix_verification_main.py +0 -0
  553. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_generate_model_catalog.py +0 -0
  554. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_generate_output_paths.py +0 -0
  555. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_generate_output_paths_regression.py +0 -0
  556. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_generate_test.py +0 -0
  557. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_generation_completion.py +0 -0
  558. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_get_comment.py +0 -0
  559. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_get_extension.py +0 -0
  560. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_get_jwt_token.py +0 -0
  561. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_get_language.py +0 -0
  562. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_get_lint_commands.py +0 -0
  563. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_get_run_command.py +0 -0
  564. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_get_test_command.py +0 -0
  565. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_git_update.py +0 -0
  566. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_include_query_extractor.py +0 -0
  567. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_increase_tests.py +0 -0
  568. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_incremental_code_generator.py +0 -0
  569. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_incremental_prd_architecture.py +0 -0
  570. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_incremental_prd_architecture_real.py +0 -0
  571. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_insert_includes.py +0 -0
  572. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_install_completion.py +0 -0
  573. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_1021_reproduction.py +0 -0
  574. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_1049_reproduction.py +0 -0
  575. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_1240_generate_prompt_meta_framing.py +0 -0
  576. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_1272_cloud_timeout.py +0 -0
  577. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_225_paths_and_includes.py +0 -0
  578. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_237.py +0 -0
  579. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_467_all_orchestrators.py +0 -0
  580. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_469_duplicate_unresolved.py +0 -0
  581. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_592_failing_case.py +0 -0
  582. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_600_agentic_weaknesses.py +0 -0
  583. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_633_reproduction.py +0 -0
  584. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_686_post_process_args_braces.py +0 -0
  585. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_737_step_completion_markers.py +0 -0
  586. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_791_reproduction.py +0 -0
  587. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_794_anti_tdd_and_test_discovery.py +0 -0
  588. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_794_repro.py +0 -0
  589. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_830_remaining_fixes.py +0 -0
  590. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_865_reproduction.py +0 -0
  591. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_894_pytest_output_deadlock.py +0 -0
  592. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_902.py +0 -0
  593. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_902_prompt_sync.py +0 -0
  594. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_926_preserve_comments_directive.py +0 -0
  595. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_issue_953_directory_scan_regression.py +0 -0
  596. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_jobs_sync_failure_detection.py +0 -0
  597. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_list_drift_detection.py +0 -0
  598. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_llm_invoke.py +0 -0
  599. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_llm_invoke_csv_model_registration.py +0 -0
  600. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_llm_invoke_integration.py +0 -0
  601. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_llm_invoke_nested_schema.py +0 -0
  602. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_llm_invoke_retry_cost.py +0 -0
  603. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_llm_invoke_vertex_retry.py +0 -0
  604. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_load_prompt_template.py +0 -0
  605. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_logo_animation.py +0 -0
  606. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_metadata_sync.py +0 -0
  607. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_mock_vs_production_fix.py +0 -0
  608. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_model_tester.py +0 -0
  609. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_nextjs_rendering_model.py +0 -0
  610. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_one_session_eval.py +0 -0
  611. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_one_session_sync.py +0 -0
  612. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_opencode_provider.py +0 -0
  613. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_operation_log.py +0 -0
  614. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_operation_logging_e2e.py +0 -0
  615. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_path_resolution.py +0 -0
  616. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_pattern_completeness_verification.py +0 -0
  617. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_pddrc_initializer.py +0 -0
  618. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_pddrc_true_e2e.py +0 -0
  619. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_pin_example_hack.py +0 -0
  620. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_postprocess.py +0 -0
  621. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_postprocess_0.py +0 -0
  622. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_preprocess.py +0 -0
  623. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_preprocess_main.py +0 -0
  624. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_preprocess_main_pdd_tags.py +0 -0
  625. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_process_csv_change.py +0 -0
  626. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_prompt_contract_validation.py +0 -0
  627. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_provider_env_isolation.py +0 -0
  628. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_provider_manager.py +0 -0
  629. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_pytest_output.py +0 -0
  630. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_quiet_flag.py +0 -0
  631. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_reasoning.py +0 -0
  632. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_remote_command_completion.py +0 -0
  633. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_remote_session.py +0 -0
  634. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_render_mermaid.py +0 -0
  635. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_report.py +0 -0
  636. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_research_prompt_web_tools.py +0 -0
  637. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_server_routes_prompts.py +0 -0
  638. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_server_spawn.py +0 -0
  639. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_setup_tool.py +0 -0
  640. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_split.py +0 -0
  641. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_split_main.py +0 -0
  642. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_split_seam_resolution.py +0 -0
  643. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_split_validation.py +0 -0
  644. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_step11_api_mocking_guidance.py +0 -0
  645. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_structural_test_guard.py +0 -0
  646. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_structural_test_guard_integration.py +0 -0
  647. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_summarize_directory.py +0 -0
  648. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_animation.py +0 -0
  649. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_animation_0.py +0 -0
  650. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_backward_compat.py +0 -0
  651. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_code_main.py +0 -0
  652. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_contract_matrix.py +0 -0
  653. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_determine_operation.py +0 -0
  654. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_graph_order_consistency.py +0 -0
  655. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_main.py +0 -0
  656. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_orchestration.py +0 -0
  657. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_order.py +0 -0
  658. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_target_coverage_infinite_loop.py +0 -0
  659. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_template_prompt_discovery.py +0 -0
  660. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_sync_tui.py +0 -0
  661. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_template_expander.py +0 -0
  662. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_template_registry.py +0 -0
  663. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_thread_safe_redirector.py +0 -0
  664. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_time_reasoning_effort_env.py +0 -0
  665. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_trace.py +0 -0
  666. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_trace_main.py +0 -0
  667. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_track_cost.py +0 -0
  668. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_unfinished_prompt.py +0 -0
  669. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_update_command.py +0 -0
  670. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_update_main.py +0 -0
  671. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_update_model_costs.py +0 -0
  672. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_update_prompt.py +0 -0
  673. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_user_story_tests.py +0 -0
  674. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_version.py +0 -0
  675. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_which.py +0 -0
  676. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_xml_tagger.py +0 -0
  677. {pdd_cli-0.0.240 → pdd_cli-0.0.241}/tests/test_z3_prompt_test_correspondence.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pdd-cli
3
- Version: 0.0.240
3
+ Version: 0.0.241
4
4
  Summary: PDD (Prompt-Driven Development) Command Line Interface
5
5
  Author: Greg Tanaka
6
6
  Author-email: glt@alumni.caltech.edu
@@ -66,7 +66,7 @@ Requires-Dist: twine; extra == "dev"
66
66
  Requires-Dist: httpx==0.28.1; extra == "dev"
67
67
  Dynamic: license-file
68
68
 
69
- .. image:: https://img.shields.io/badge/pdd--cli-v0.0.240-blue
69
+ .. image:: https://img.shields.io/badge/pdd--cli-v0.0.241-blue
70
70
  :alt: PDD-CLI Version
71
71
 
72
72
  .. image:: https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white&link=https://discord.gg/Yp4RTh8bG7
@@ -143,7 +143,7 @@ After installation, verify:
143
143
 
144
144
  pdd --version
145
145
 
146
- You'll see the current PDD version (e.g., 0.0.240).
146
+ You'll see the current PDD version (e.g., 0.0.241).
147
147
 
148
148
  Getting Started with Examples
149
149
  -----------------------------
@@ -1,6 +1,6 @@
1
1
  # PDD (Prompt-Driven Development) Command Line Interface
2
2
 
3
- ![PDD-CLI Version](https://img.shields.io/badge/pdd--cli-v0.0.240-blue) [![Discord](https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white)](https://discord.gg/Yp4RTh8bG7)
3
+ ![PDD-CLI Version](https://img.shields.io/badge/pdd--cli-v0.0.241-blue) [![Discord](https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white)](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.240
365
+ Current version: 0.0.241
366
366
 
367
367
  To check your installed version, run:
368
368
  ```
@@ -18,7 +18,7 @@ import subprocess
18
18
  import sys
19
19
  import tempfile
20
20
  from dataclasses import dataclass
21
- from pathlib import Path
21
+ from pathlib import Path, PurePosixPath
22
22
  from typing import Any, Dict, List, Optional, Sequence, Set, Tuple
23
23
 
24
24
  from rich.console import Console
@@ -918,23 +918,90 @@ def _healed_module_file_relpaths(module: Any, repo_root: Path) -> List[str]:
918
918
  return relpaths
919
919
 
920
920
 
921
+ def _has_symlinked_ancestor(rel: str, repo_root: Path) -> bool:
922
+ """Return True if any directory ancestor of ``rel`` under ``repo_root`` is a symlink.
923
+
924
+ ``git add`` refuses pathspecs whose ancestor directory is a symlink ("pathspec
925
+ 'X' is beyond a symbolic link"). When ``_git_relative_path_candidates`` returns
926
+ both the symlinked form (e.g. ``prompts/foo.prompt`` via ``prompts -> pdd/prompts``)
927
+ and the canonical form (``pdd/prompts/foo.prompt``) for the same source path,
928
+ the symlinked form will fail staging. Dropping it lets the canonical form get
929
+ staged instead.
930
+ """
931
+ parts = PurePosixPath(rel).parts
932
+ if len(parts) <= 1:
933
+ return False
934
+ cur = repo_root
935
+ for part in parts[:-1]:
936
+ cur = cur / part
937
+ try:
938
+ if cur.is_symlink():
939
+ return True
940
+ except OSError:
941
+ return False
942
+ return False
943
+
944
+
921
945
  def _git_add_pathspecs(pathspecs: Sequence[str], cwd: Optional[Path] = None) -> bool:
922
946
  """Stage existing pathspecs with an explicit git-add call.
923
947
 
924
- Filters out paths that ``.gitignore`` excludes before invoking ``git add``
925
- — otherwise Git refuses the whole batch with "paths are ignored", aborting
926
- an otherwise-successful heal commit. Examples include per-run reports
927
- under ``.pdd/meta/*_run.json``, which the repo intentionally ignores but
928
- which appear in the healed module's metadata pathspecs.
948
+ Two filters run **before** ``git add`` and **before** ``git check-ignore``:
949
+
950
+ 1. **Symlink-traversal filter.** Drops pathspecs whose ancestor directory is
951
+ a symlink (e.g. the repo-root ``prompts -> pdd/prompts`` shim). Recent
952
+ Git fatals on such paths with "pathspec 'X' is beyond a symbolic link" —
953
+ and that fatal hits ``git check-ignore`` first, not just ``git add``, so
954
+ the symlink filter MUST run before any git invocation. The canonical
955
+ form is normally also present in the list because
956
+ ``_git_relative_path_candidates`` returns both shapes.
957
+
958
+ 2. **Gitignore filter.** Run ``git check-ignore`` on the symlink-free
959
+ survivors so we know which paths to skip — otherwise ``git add`` refuses
960
+ the whole batch with "paths are ignored" (e.g. per-run reports under
961
+ ``.pdd/meta/*_run.json``), aborting an otherwise-successful heal commit.
962
+
963
+ Returns True on success or on a "nothing to stage" no-op. Returns False
964
+ only if ``git add`` itself fails after filters have been applied. Emits a
965
+ warning (not a hard failure) if all input paths get filtered out, since
966
+ silent drops are observable here but would be invisible at the caller.
929
967
  """
968
+ repo_root = (cwd or Path.cwd()).resolve()
930
969
  existing = [rel for rel in pathspecs if (cwd or Path.cwd()).joinpath(rel).exists()]
931
970
  if not existing:
932
971
  return True
933
972
 
973
+ # Filter 1: symlink-traversal. Must come BEFORE check-ignore — git's
974
+ # "beyond a symbolic link" fatal applies to check-ignore too, not just to
975
+ # `git add`. If the symlink filter ran after check-ignore, a mixed batch
976
+ # would lose its ignore information when check-ignore fatals on the
977
+ # symlinked entry, and ignored paths would then leak through to `git add`
978
+ # (which would refuse the whole batch). Invariant:
979
+ # `_git_relative_path_candidates` emits both the symlinked and the
980
+ # canonical form for any source that traverses a symlinked ancestor, so
981
+ # dropping the symlinked form here loses nothing.
982
+ symlinked = {rel for rel in existing if _has_symlinked_ancestor(rel, repo_root)}
983
+ if symlinked:
984
+ console.print(
985
+ f"[dim]ci-heal: skipping symlink-traversal paths during stage: "
986
+ f"{sorted(symlinked)}[/dim]"
987
+ )
988
+ survivors = [rel for rel in existing if rel not in symlinked]
989
+ if not survivors:
990
+ # Every input went through a symlinked ancestor and was dropped.
991
+ # That's almost certainly a caller bug (the canonical form was not
992
+ # supplied alongside), so make it observable.
993
+ console.print(
994
+ f"[yellow]ci-heal: every input pathspec was dropped as symlink-traversal "
995
+ f"({sorted(symlinked)}); nothing staged. Caller should also pass the "
996
+ f"canonical (resolved) form for these paths.[/yellow]"
997
+ )
998
+ return True
999
+
1000
+ # Filter 2: gitignore.
934
1001
  ignored: Set[str] = set()
935
1002
  try:
936
1003
  rc_check = subprocess.run(
937
- ["git", "check-ignore", "--", *existing],
1004
+ ["git", "check-ignore", "--", *survivors],
938
1005
  cwd=cwd,
939
1006
  capture_output=True,
940
1007
  text=True,
@@ -959,7 +1026,7 @@ def _git_add_pathspecs(pathspecs: Sequence[str], cwd: Optional[Path] = None) ->
959
1026
  f"{sorted(ignored)}[/dim]"
960
1027
  )
961
1028
 
962
- stageable = [rel for rel in existing if rel not in ignored]
1029
+ stageable = [rel for rel in survivors if rel not in ignored]
963
1030
  if not stageable:
964
1031
  return True
965
1032
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
3
  # PDD CLI Bash Completion Script
4
- # Version: 0.0.240
4
+ # Version: 0.0.241
5
5
  # Supports all PDD commands and options with filename completion
6
6
 
7
7
  _pdd() {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pdd-cli
3
- Version: 0.0.240
3
+ Version: 0.0.241
4
4
  Summary: PDD (Prompt-Driven Development) Command Line Interface
5
5
  Author: Greg Tanaka
6
6
  Author-email: glt@alumni.caltech.edu
@@ -66,7 +66,7 @@ Requires-Dist: twine; extra == "dev"
66
66
  Requires-Dist: httpx==0.28.1; extra == "dev"
67
67
  Dynamic: license-file
68
68
 
69
- .. image:: https://img.shields.io/badge/pdd--cli-v0.0.240-blue
69
+ .. image:: https://img.shields.io/badge/pdd--cli-v0.0.241-blue
70
70
  :alt: PDD-CLI Version
71
71
 
72
72
  .. image:: https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white&link=https://discord.gg/Yp4RTh8bG7
@@ -143,7 +143,7 @@ After installation, verify:
143
143
 
144
144
  pdd --version
145
145
 
146
- You'll see the current PDD version (e.g., 0.0.240).
146
+ You'll see the current PDD version (e.g., 0.0.241).
147
147
 
148
148
  Getting Started with Examples
149
149
  -----------------------------
@@ -1,4 +1,4 @@
1
- .. image:: https://img.shields.io/badge/pdd--cli-v0.0.240-blue
1
+ .. image:: https://img.shields.io/badge/pdd--cli-v0.0.241-blue
2
2
  :alt: PDD-CLI Version
3
3
 
4
4
  .. image:: https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white&link=https://discord.gg/Yp4RTh8bG7
@@ -75,7 +75,7 @@ After installation, verify:
75
75
 
76
76
  pdd --version
77
77
 
78
- You'll see the current PDD version (e.g., 0.0.240).
78
+ You'll see the current PDD version (e.g., 0.0.241).
79
79
 
80
80
  Getting Started with Examples
81
81
  -----------------------------
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "pdd-cli"
10
- version = "0.0.240"
10
+ version = "0.0.241"
11
11
  description = "PDD (Prompt-Driven Development) Command Line Interface"
12
12
  readme = {file = "pypi_description.rst", content-type = "text/x-rst"}
13
13
  authors = [
@@ -132,7 +132,7 @@ filterwarnings = [
132
132
 
133
133
  [tool.commitizen]
134
134
  name = "cz_conventional_commits"
135
- version = "0.0.240"
135
+ version = "0.0.241"
136
136
  tag_format = "v$version"
137
137
  version_files = [
138
138
  "pyproject.toml:version",
@@ -14,7 +14,9 @@ from pdd.ci_drift_heal import (
14
14
  PromptRevertError,
15
15
  _AUTO_HEAL_SUCCESS_TRAILER,
16
16
  _capture_rollback_state,
17
+ _git_add_pathspecs,
17
18
  _git_relative_path_candidates,
19
+ _has_symlinked_ancestor,
18
20
  _run_pdd_command,
19
21
  _get_git_changed_files,
20
22
  detect_drift,
@@ -163,14 +165,39 @@ class TestDetectDrift:
163
165
  assert len(example_drifts) == 0
164
166
 
165
167
  def test_pr_touched_metadata_modules_are_not_left_in_drift(self):
166
- """Regression guard for PR metadata churn on long-running modules."""
167
- prompt_drifts, example_drifts = detect_drift(
168
- modules=[
169
- "metadata_sync",
170
- "agentic_change_orchestrator",
171
- "ci_drift_heal",
172
- ]
173
- )
168
+ """Regression guard for PR metadata churn on long-running modules.
169
+
170
+ Isolates from the developer's working-tree state. Without isolation
171
+ this test breaks any time someone has an in-flight edit to one of
172
+ the listed modules (operation: 'verify' fires from
173
+ sync_determine_operation, lands in example_drifts, assert fails).
174
+ That breakage is the kind of false positive the auto-heal CI cycle
175
+ is supposed to catch and resolve, not a unit test.
176
+ """
177
+ modules = [
178
+ "metadata_sync",
179
+ "agentic_change_orchestrator",
180
+ "ci_drift_heal",
181
+ ]
182
+ # Pretend sync_determine_operation reports no work for these
183
+ # modules. The test then verifies detect_drift correctly maps
184
+ # "nothing to do" → empty drift lists for these specific modules
185
+ # (no module-name-based special casing that would re-flag them).
186
+ no_op = MagicMock(operation="nothing", reason="clean")
187
+ files = [Path(f"prompts/{bn}_python.prompt") for bn in modules]
188
+
189
+ def fake_infer(path):
190
+ stem = Path(path).stem
191
+ base, _, lang = stem.rpartition("_")
192
+ return base, lang
193
+
194
+ def fake_sync(basename, language, target_coverage, log_mode):
195
+ return no_op
196
+
197
+ with patch("pdd.user_story_tests.discover_prompt_files", return_value=files), \
198
+ patch("pdd.operation_log.infer_module_identity", side_effect=fake_infer), \
199
+ patch("pdd.sync_determine_operation.sync_determine_operation", side_effect=fake_sync):
200
+ prompt_drifts, example_drifts = detect_drift(modules=modules)
174
201
 
175
202
  assert prompt_drifts == []
176
203
  assert example_drifts == []
@@ -285,6 +312,213 @@ class TestGetGitChangedFiles:
285
312
  assert "pdd/prompts/auth_python.prompt" in candidates
286
313
 
287
314
 
315
+ # ---------------------------------------------------------------------------
316
+ # _has_symlinked_ancestor / _git_add_pathspecs symlink-staging tests
317
+ # ---------------------------------------------------------------------------
318
+
319
+
320
+ class TestSymlinkStaging:
321
+ """Regression: auto-heal must not pass symlink-traversal pathspecs to git add.
322
+
323
+ `_git_relative_path_candidates` returns both the symlinked form
324
+ (e.g. ``prompts/foo.prompt`` via a tracked ``prompts -> pdd/prompts`` shim)
325
+ and the canonical form (``pdd/prompts/foo.prompt``) for the same source.
326
+ Newer Git refuses the symlinked form with
327
+ ``pathspec 'prompts/foo.prompt' is beyond a symbolic link``, which kills
328
+ the whole heal commit. The fix drops symlink-traversal paths at the
329
+ staging boundary so the canonical form (always also in the list) wins.
330
+ """
331
+
332
+ def _make_symlink_repo(self, tmp_path: Path) -> Path:
333
+ """Set up a fake repo where ``prompts -> pdd/prompts``."""
334
+ (tmp_path / "pdd" / "prompts").mkdir(parents=True)
335
+ (tmp_path / "prompts").symlink_to("pdd/prompts")
336
+ (tmp_path / "pdd" / "prompts" / "foo.prompt").write_text("% prompt", encoding="utf-8")
337
+ return tmp_path
338
+
339
+ def test_has_symlinked_ancestor_detects_symlinked_dir(self, tmp_path):
340
+ self._make_symlink_repo(tmp_path)
341
+ assert _has_symlinked_ancestor("prompts/foo.prompt", tmp_path) is True
342
+ assert _has_symlinked_ancestor("pdd/prompts/foo.prompt", tmp_path) is False
343
+ # Trivial top-level files have no ancestor to traverse.
344
+ assert _has_symlinked_ancestor("foo.prompt", tmp_path) is False
345
+
346
+ def test_git_add_pathspecs_drops_symlinked_form(self, tmp_path):
347
+ """When both forms of a symlinked path are passed, only the canonical
348
+ form reaches `git add`; the symlinked form is dropped."""
349
+ self._make_symlink_repo(tmp_path)
350
+
351
+ captured: dict = {}
352
+
353
+ def fake_run(cmd, **kwargs):
354
+ captured.setdefault("calls", []).append(list(cmd))
355
+ # check-ignore: pretend none are ignored
356
+ if cmd[:2] == ["git", "check-ignore"]:
357
+ return MagicMock(returncode=1, stdout="", stderr="")
358
+ # git add: succeed
359
+ if cmd[:2] == ["git", "add"]:
360
+ return MagicMock(returncode=0, stdout="", stderr="")
361
+ return MagicMock(returncode=0, stdout="", stderr="")
362
+
363
+ with patch("pdd.ci_drift_heal.subprocess.run", side_effect=fake_run):
364
+ ok = _git_add_pathspecs(
365
+ ["prompts/foo.prompt", "pdd/prompts/foo.prompt"],
366
+ cwd=tmp_path,
367
+ )
368
+
369
+ assert ok is True
370
+ add_calls = [c for c in captured["calls"] if c[:2] == ["git", "add"]]
371
+ assert len(add_calls) == 1, f"expected one git add call, got {add_calls}"
372
+ staged = add_calls[0][add_calls[0].index("--") + 1 :]
373
+ assert "pdd/prompts/foo.prompt" in staged
374
+ assert "prompts/foo.prompt" not in staged, (
375
+ "symlinked-ancestor path must be filtered before git add"
376
+ )
377
+
378
+ def test_git_add_pathspecs_unchanged_without_symlink(self, tmp_path):
379
+ """No symlinks in the repo → no filtering, behaviour matches the
380
+ original (gitignore-only) filter path."""
381
+ (tmp_path / "pdd").mkdir()
382
+ (tmp_path / "pdd" / "foo.py").write_text("# foo", encoding="utf-8")
383
+
384
+ captured: dict = {}
385
+
386
+ def fake_run(cmd, **kwargs):
387
+ captured.setdefault("calls", []).append(list(cmd))
388
+ if cmd[:2] == ["git", "check-ignore"]:
389
+ return MagicMock(returncode=1, stdout="", stderr="")
390
+ if cmd[:2] == ["git", "add"]:
391
+ return MagicMock(returncode=0, stdout="", stderr="")
392
+ return MagicMock(returncode=0, stdout="", stderr="")
393
+
394
+ with patch("pdd.ci_drift_heal.subprocess.run", side_effect=fake_run):
395
+ ok = _git_add_pathspecs(["pdd/foo.py"], cwd=tmp_path)
396
+
397
+ assert ok is True
398
+ add_calls = [c for c in captured["calls"] if c[:2] == ["git", "add"]]
399
+ assert len(add_calls) == 1
400
+ staged = add_calls[0][add_calls[0].index("--") + 1 :]
401
+ assert staged == ["pdd/foo.py"]
402
+
403
+
404
+ class TestSymlinkStagingRealGit:
405
+ """Integration tests that exercise the *real* git binary, no subprocess mocking.
406
+
407
+ The mocked tests above prove the helper builds the right ``git add`` argv.
408
+ These tests prove the helper survives the actual git fatals that the
409
+ auto-heal CI Cloud Build hit in production — specifically that
410
+ ``git check-ignore`` ALSO refuses pathspecs whose ancestor is a symlink
411
+ ("pathspec 'X' is beyond a symbolic link", exit 128), so a filter that
412
+ only runs after ``check-ignore`` is too late.
413
+
414
+ Regression for the mixed-batch case the reviewer of PR #1048 surfaced:
415
+ when ``prompts/foo.prompt`` (via symlink) and ``pdd/meta/foo_run.json``
416
+ (gitignored) appear in the same batch, naive ordering loses the ignore
417
+ info to a check-ignore fatal and the heal commit blows up at ``git add``.
418
+ """
419
+
420
+ def _init_repo(self, tmp_path: Path) -> None:
421
+ """Build a tmp git repo with the exact shape that triggers the bug.
422
+
423
+ - ``prompts/`` is a tracked symlink to ``pdd/prompts/``.
424
+ - ``.gitignore`` excludes ``*_run.json``.
425
+ - One file exists under each: a prompt under ``pdd/prompts/`` and an
426
+ ignored metadata file under ``pdd/meta/``.
427
+ """
428
+ subprocess.run(["git", "init", "-q"], cwd=tmp_path, check=True)
429
+ subprocess.run(
430
+ ["git", "config", "user.email", "test@example.com"],
431
+ cwd=tmp_path,
432
+ check=True,
433
+ )
434
+ subprocess.run(
435
+ ["git", "config", "user.name", "test"], cwd=tmp_path, check=True
436
+ )
437
+ (tmp_path / "pdd" / "prompts").mkdir(parents=True)
438
+ (tmp_path / "pdd" / "meta").mkdir(parents=True)
439
+ (tmp_path / "prompts").symlink_to("pdd/prompts")
440
+ (tmp_path / "pdd" / "prompts" / "foo.prompt").write_text("% prompt\n", encoding="utf-8")
441
+ (tmp_path / ".gitignore").write_text("*_run.json\n", encoding="utf-8")
442
+ (tmp_path / "pdd" / "meta" / "foo_run.json").write_text("{}\n", encoding="utf-8")
443
+ subprocess.run(["git", "add", ".gitignore", "prompts"], cwd=tmp_path, check=True)
444
+ subprocess.run(
445
+ ["git", "commit", "-q", "-m", "init"], cwd=tmp_path, check=True
446
+ )
447
+
448
+ def test_mixed_batch_with_symlink_and_ignored_path(self, tmp_path):
449
+ """Reviewer-of-#1048's exact reproducer: mixed batch including a
450
+ symlinked path AND a gitignored path. ``check-ignore`` fatals on the
451
+ symlinked path; if the symlink filter runs too late, the ignore info
452
+ is lost and ``git add`` refuses the batch."""
453
+ self._init_repo(tmp_path)
454
+
455
+ ok = _git_add_pathspecs(
456
+ [
457
+ "prompts/foo.prompt", # symlinked form — fatals on check-ignore
458
+ "pdd/prompts/foo.prompt", # canonical form — must stage cleanly
459
+ "pdd/meta/foo_run.json", # gitignored — must NOT reach git add
460
+ ],
461
+ cwd=tmp_path,
462
+ )
463
+ assert ok is True, (
464
+ "helper must return True; symlink filter must run before "
465
+ "check-ignore so the ignore info isn't lost"
466
+ )
467
+
468
+ # Confirm the right path actually landed in the index.
469
+ status = subprocess.run(
470
+ ["git", "status", "--porcelain"],
471
+ cwd=tmp_path,
472
+ capture_output=True,
473
+ text=True,
474
+ check=True,
475
+ )
476
+ staged_lines = [line for line in status.stdout.splitlines() if line.startswith("A ")]
477
+ assert any("pdd/prompts/foo.prompt" in line for line in staged_lines), (
478
+ f"canonical prompt path must be staged; got {status.stdout!r}"
479
+ )
480
+ assert not any("foo_run.json" in line for line in staged_lines), (
481
+ f"gitignored path must not be staged; got {status.stdout!r}"
482
+ )
483
+
484
+ def test_canonical_only_batch_still_works(self, tmp_path):
485
+ """Sanity: when the caller passes only the canonical form (no
486
+ symlinked twin), the helper still stages correctly."""
487
+ self._init_repo(tmp_path)
488
+
489
+ ok = _git_add_pathspecs(
490
+ ["pdd/prompts/foo.prompt", "pdd/meta/foo_run.json"],
491
+ cwd=tmp_path,
492
+ )
493
+ assert ok is True
494
+
495
+ def test_symlinked_only_batch_warns_and_no_ops(self, tmp_path):
496
+ """Defensive log path: if the caller passes ONLY a symlinked path
497
+ (no canonical twin), the helper should not stage anything but must
498
+ return True (so the heal commit isn't crashed by a silent miss)."""
499
+ self._init_repo(tmp_path)
500
+
501
+ ok = _git_add_pathspecs(
502
+ ["prompts/foo.prompt"], # only the symlinked form
503
+ cwd=tmp_path,
504
+ )
505
+ # Returning True here is intentional: the caller (auto-heal) typically
506
+ # has both forms in the candidate list; if it only has the symlinked
507
+ # form, that's a caller bug we want surfaced via the warning log, not
508
+ # a False return that aborts an otherwise-successful heal commit.
509
+ assert ok is True
510
+
511
+ # Nothing should be staged.
512
+ status = subprocess.run(
513
+ ["git", "status", "--porcelain"],
514
+ cwd=tmp_path,
515
+ capture_output=True,
516
+ text=True,
517
+ check=True,
518
+ )
519
+ assert "A " not in status.stdout
520
+
521
+
288
522
  # ---------------------------------------------------------------------------
289
523
  # detect_drift with diff_base (git-based reclassification) tests
290
524
  # ---------------------------------------------------------------------------
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes