teddy-cli 0.1.17.dev1369__tar.gz → 0.1.17.dev1371__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 (162) hide show
  1. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +12 -4
  4. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/shell_adapter.py +51 -11
  5. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +4 -1
  6. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/.gitignore +0 -0
  7. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/LICENSE +0 -0
  8. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/README.md +0 -0
  9. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/__init__.py +0 -0
  10. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/__main__.py +0 -0
  11. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/__init__.py +0 -0
  12. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  13. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  14. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  15. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  16. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  17. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  18. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  19. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  20. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  21. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  22. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  23. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  24. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  25. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  26. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  27. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  28. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  29. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  30. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  31. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  32. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  33. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  34. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  35. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  36. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  37. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  38. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  39. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  41. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/container.py +0 -0
  42. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/__init__.py +0 -0
  43. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/__init__.py +0 -0
  44. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  45. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  46. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  47. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  48. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  49. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  50. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  51. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/plan.py +0 -0
  52. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  53. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  54. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  55. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/session.py +0 -0
  56. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  57. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  58. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/__init__.py +0 -0
  59. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  60. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  61. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  62. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  63. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  64. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  65. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  66. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  67. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  68. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  69. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  70. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  71. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  72. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  73. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  74. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  75. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  76. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  77. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  78. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  79. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  80. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  81. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  82. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  83. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  84. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  85. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  86. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  87. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/__init__.py +0 -0
  88. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  89. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  90. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  91. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/action_executor.py +0 -0
  92. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/action_factory.py +0 -0
  93. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  94. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  95. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/context_service.py +0 -0
  96. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  97. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  98. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  99. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/init_service.py +0 -0
  100. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  101. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  102. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  103. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  104. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  105. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/plan_validator.py +0 -0
  106. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/planning_service.py +0 -0
  107. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  108. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  109. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  110. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  111. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/session_planner.py +0 -0
  112. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  113. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/session_replanner.py +0 -0
  114. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/session_repository.py +0 -0
  115. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/session_service.py +0 -0
  116. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  117. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/update_checker.py +0 -0
  118. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  119. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  120. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  121. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  122. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  123. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  124. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  125. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  126. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/utils/__init__.py +0 -0
  127. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/utils/diff.py +0 -0
  128. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  129. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/utils/io.py +0 -0
  130. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/utils/markdown.py +0 -0
  131. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/utils/paths.py +0 -0
  132. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/utils/serialization.py +0 -0
  133. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/utils/session_notices.py +0 -0
  134. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  135. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/utils/string.py +0 -0
  136. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/core/utils/terminal.py +0 -0
  137. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/prompts.py +0 -0
  138. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/registries/__init__.py +0 -0
  139. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/registries/infrastructure.py +0 -0
  140. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/registries/reviewer.py +0 -0
  141. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/registries/validators.py +0 -0
  142. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/MRP.md +0 -0
  143. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/__init__.py +0 -0
  144. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/config/__init__.py +0 -0
  145. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/config/config.yaml +0 -0
  146. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/config/init.context +0 -0
  147. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  148. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  149. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/config/prompts/debugger.md +0 -0
  150. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  151. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  152. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  153. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  154. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  155. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/templates/case-file.md +0 -0
  156. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/templates/ci.md +0 -0
  157. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/templates/component-design.md +0 -0
  158. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/templates/makefile.md +0 -0
  159. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/templates/milestone.md +0 -0
  160. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  161. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  162. {teddy_cli-0.1.17.dev1369 → teddy_cli-0.1.17.dev1371}/src/teddy_executor/resources/templates/vertical-slice.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: teddy-cli
3
- Version: 0.1.17.dev1369
3
+ Version: 0.1.17.dev1371
4
4
  Summary: The local-first, test-driven agentic engineering harness. Because you should own the means of development.
5
5
  Author: Raphael Atteritano
6
6
  License: AGPL-3.0-only
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "teddy-cli"
3
- version = "0.1.17.dev1369"
3
+ version = "0.1.17.dev1371"
4
4
  description = "The local-first, test-driven agentic engineering harness. Because you should own the means of development."
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -3,7 +3,7 @@ import shutil
3
3
  import signal
4
4
  import subprocess # nosec B404
5
5
  from pathlib import Path
6
- from typing import Any, Dict, Optional, Sequence
6
+ from typing import Any, Callable, Dict, Optional, Sequence
7
7
 
8
8
  import typer
9
9
  from punq import Container
@@ -43,7 +43,9 @@ _HOOK_IMPL_FLAG = "hook-impl"
43
43
  _HOOK_CONFIG_FLAG = "--config=.pre-commit-config.yaml"
44
44
 
45
45
 
46
- def _resolve_hooks_dir() -> Optional[Path]:
46
+ def _resolve_hooks_dir(
47
+ run_func: Optional[Callable[..., Any]] = None,
48
+ ) -> Optional[Path]:
47
49
  """Resolve the git hooks directory using git's own answer.
48
50
 
49
51
  Returns None when unresolvable (not a repository, git CLI failure,
@@ -52,12 +54,18 @@ def _resolve_hooks_dir() -> Optional[Path]:
52
54
  the same directory `pre-commit install` writes to. Relative output
53
55
  is anchored against the current working directory (git semantics).
54
56
  """
57
+ # Explicit decoding keeps a non-UTF-8 path byte from raising mid-read,
58
+ # which the guard would swallow as an unresolvable hooks directory.
59
+ # The runner defaults to subprocess.run at call time, so tests inject
60
+ # a replacement instead of patching the module global.
61
+ runner = run_func or subprocess.run
55
62
  try:
56
- result = subprocess.run( # nosec B603 B607
63
+ result = runner( # nosec B603 B607
57
64
  ["git", "rev-parse", "--git-path", "hooks"],
58
65
  check=True,
59
66
  capture_output=True,
60
- text=True,
67
+ encoding="utf-8",
68
+ errors="replace",
61
69
  )
62
70
  except (subprocess.CalledProcessError, OSError, ValueError):
63
71
  logger.debug("hooks directory resolution failed", exc_info=True)
@@ -1,3 +1,4 @@
1
+ import locale
1
2
  import os
2
3
  import subprocess # nosec
3
4
  import sys
@@ -47,6 +48,27 @@ class ShellAdapter(IShellExecutor):
47
48
  text = re.sub(r"\x1b\[[0-9;?><\$]*[a-zA-Z]", "", text)
48
49
  return text
49
50
 
51
+ def _decode_stream(self, data: bytes | str | None) -> str:
52
+ """Decode one captured child stream to text without raising.
53
+
54
+ Text payloads from test doubles pass through untouched. Raw bytes
55
+ decode as UTF-8 first, so identical UTF-8 streams yield identical
56
+ text on every platform. A stream that is not valid UTF-8 falls back
57
+ to the locale codec with replacement, which keeps native Windows
58
+ child output readable and never kills a reader thread.
59
+ Universal-newline normalisation preserves the previous text-mode
60
+ contract.
61
+ """
62
+ if data is None:
63
+ return ""
64
+ if isinstance(data, str):
65
+ return data
66
+ try:
67
+ decoded = data.decode("utf-8")
68
+ except UnicodeDecodeError:
69
+ decoded = data.decode(locale.getpreferredencoding(False), errors="replace")
70
+ return decoded.replace("\r\n", "\n").replace("\r", "\n")
71
+
50
72
  def _validate_cwd(self, cwd: Optional[str]) -> str:
51
73
  """Validates and resolves the working directory."""
52
74
  project_root = os.path.realpath(os.getcwd())
@@ -125,7 +147,9 @@ class ShellAdapter(IShellExecutor):
125
147
  # Python 3.14.2's C-level initialization. The pipe is closed
126
148
  # immediately after Popen so children see EOF on reads.
127
149
  "stdin": subprocess.PIPE,
128
- "text": True,
150
+ # Bytes mode: the pipes are drained undecoded, so no reader
151
+ # thread can die on a codec mismatch. Each stream is decoded
152
+ # explicitly by _decode_stream after the wait.
129
153
  "cwd": cwd,
130
154
  "env": env,
131
155
  }
@@ -171,9 +195,11 @@ class ShellAdapter(IShellExecutor):
171
195
 
172
196
  try:
173
197
  # Give the OS a moment to close pipes naturally after SIGKILL.
174
- stdout, stderr = process.communicate(timeout=0.5)
198
+ raw_stdout, raw_stderr = process.communicate(timeout=0.5)
175
199
  except subprocess.TimeoutExpired:
176
- stdout, stderr = "", ""
200
+ raw_stdout, raw_stderr = "", ""
201
+ stdout = self._decode_stream(raw_stdout)
202
+ stderr = self._decode_stream(raw_stderr)
177
203
 
178
204
  sanitized_stderr = self._sanitize_output(stderr) or ""
179
205
  if self._detect_interactive_prompt(sanitized_stderr, stdout):
@@ -228,8 +254,12 @@ class ShellAdapter(IShellExecutor):
228
254
  guard = self._interrupt_guard
229
255
  if guard is None:
230
256
  comm_res = process.communicate(timeout=timeout)
231
- stdout, stderr = cast(tuple[str, str], comm_res)
232
- return stdout, stderr, False
257
+ raw_stdout, raw_stderr = cast(tuple[bytes | str, bytes | str], comm_res)
258
+ return (
259
+ self._decode_stream(raw_stdout),
260
+ self._decode_stream(raw_stderr),
261
+ False,
262
+ )
233
263
 
234
264
  poll_interval = self._poll_interval_seconds
235
265
  deadline = None if timeout is None else time.monotonic() + timeout
@@ -238,10 +268,16 @@ class ShellAdapter(IShellExecutor):
238
268
  self._terminate_process_group(process)
239
269
  try:
240
270
  comm_res = process.communicate(timeout=1.0)
241
- stdout, stderr = cast(tuple[str, str], comm_res)
271
+ raw_stdout, raw_stderr = cast(
272
+ tuple[bytes | str, bytes | str], comm_res
273
+ )
242
274
  except subprocess.TimeoutExpired:
243
- stdout, stderr = "", ""
244
- return stdout, stderr, True
275
+ raw_stdout, raw_stderr = "", ""
276
+ return (
277
+ self._decode_stream(raw_stdout),
278
+ self._decode_stream(raw_stderr),
279
+ True,
280
+ )
245
281
  slice_timeout: float = poll_interval
246
282
  if deadline is not None:
247
283
  remaining = deadline - time.monotonic()
@@ -250,8 +286,12 @@ class ShellAdapter(IShellExecutor):
250
286
  slice_timeout = min(poll_interval, remaining)
251
287
  try:
252
288
  comm_res = process.communicate(timeout=slice_timeout)
253
- stdout, stderr = cast(tuple[str, str], comm_res)
254
- return stdout, stderr, False
289
+ raw_stdout, raw_stderr = cast(tuple[bytes | str, bytes | str], comm_res)
290
+ return (
291
+ self._decode_stream(raw_stdout),
292
+ self._decode_stream(raw_stderr),
293
+ False,
294
+ )
255
295
  except subprocess.TimeoutExpired:
256
296
  continue
257
297
 
@@ -407,7 +447,7 @@ class ShellAdapter(IShellExecutor):
407
447
  }
408
448
 
409
449
  # jscpd:ignore-start
410
- def execute(
450
+ def execute( # noqa: PLR0913 # Signature fixed by the IShellExecutor port.
411
451
  self,
412
452
  command: str,
413
453
  cwd: Optional[str] = None,
@@ -60,11 +60,14 @@ class SystemEnvironmentInspector(IEnvironmentInspector):
60
60
  """
61
61
  Gathers the current Git status of the working directory in porcelain format.
62
62
  """
63
+ # Explicit decoding keeps a non-UTF-8 path byte from raising mid-read
64
+ # or emptying the status, which would hide pending changes.
63
65
  try:
64
66
  result = self._run_func( # nosec B603 B607
65
67
  ["git", "status", "--porcelain", "-b"],
66
68
  capture_output=True,
67
- text=True,
69
+ encoding="utf-8",
70
+ errors="replace",
68
71
  check=True,
69
72
  stdin=subprocess.DEVNULL,
70
73
  )