teddy-cli 0.1.17.dev1424__tar.gz → 0.1.17.dev1426__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 (165) hide show
  1. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/__main__.py +3 -4
  4. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +60 -118
  5. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/.gitignore +0 -0
  6. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/LICENSE +0 -0
  7. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/README.md +0 -0
  8. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/__init__.py +0 -0
  9. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/__init__.py +0 -0
  10. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  11. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  12. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  13. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  14. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  15. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  16. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  17. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  18. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  19. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  20. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  21. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  22. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  23. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  24. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  25. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  26. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  27. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  28. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  29. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  30. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  31. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  32. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  33. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  34. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  35. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  36. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  37. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  38. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  39. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  41. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/container.py +0 -0
  42. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/__init__.py +0 -0
  43. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/__init__.py +0 -0
  44. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  45. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  46. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  47. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/config_schema.py +0 -0
  48. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  49. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  50. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  51. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  52. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/plan.py +0 -0
  53. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  54. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  55. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  56. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/session.py +0 -0
  57. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  58. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  59. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/__init__.py +0 -0
  60. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  61. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  62. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  63. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  64. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  65. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  66. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  67. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  68. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  69. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  70. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  71. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  72. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  73. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  74. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  75. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  76. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  77. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  78. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  79. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  80. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  81. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  82. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  83. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  84. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  85. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  86. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  87. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  88. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/__init__.py +0 -0
  89. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  90. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  91. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  92. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/action_executor.py +0 -0
  93. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/action_factory.py +0 -0
  94. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  95. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  96. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/context_service.py +0 -0
  97. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  98. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  99. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  100. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/init_service.py +0 -0
  101. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  102. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  103. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  104. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  105. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  106. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/plan_validator.py +0 -0
  107. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/planning_service.py +0 -0
  108. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  109. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  110. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  111. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  112. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/session_planner.py +0 -0
  113. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  114. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/session_replanner.py +0 -0
  115. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/session_repository.py +0 -0
  116. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/session_service.py +0 -0
  117. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  118. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/update_checker.py +0 -0
  119. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  120. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  121. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  122. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  123. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  124. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  125. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  126. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  127. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/__init__.py +0 -0
  128. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/diff.py +0 -0
  129. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/editor_names.py +0 -0
  130. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  131. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/interruptible_call.py +0 -0
  132. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/io.py +0 -0
  133. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/markdown.py +0 -0
  134. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/paths.py +0 -0
  135. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/serialization.py +0 -0
  136. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/session_notices.py +0 -0
  137. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  138. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/string.py +0 -0
  139. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/core/utils/terminal.py +0 -0
  140. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/prompts.py +0 -0
  141. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/registries/__init__.py +0 -0
  142. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/registries/infrastructure.py +0 -0
  143. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/registries/reviewer.py +0 -0
  144. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/registries/validators.py +0 -0
  145. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/MRP.md +0 -0
  146. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/__init__.py +0 -0
  147. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/config/__init__.py +0 -0
  148. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/config/config.yaml +0 -0
  149. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/config/init.context +0 -0
  150. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  151. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  152. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/config/prompts/debugger.md +0 -0
  153. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  154. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  155. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  156. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  157. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  158. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/templates/case-file.md +0 -0
  159. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/templates/ci.md +0 -0
  160. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/templates/component-design.md +0 -0
  161. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/templates/makefile.md +0 -0
  162. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/templates/milestone.md +0 -0
  163. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  164. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  165. {teddy_cli-0.1.17.dev1424 → teddy_cli-0.1.17.dev1426}/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.dev1424
3
+ Version: 0.1.17.dev1426
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.dev1424"
3
+ version = "0.1.17.dev1426"
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 = [
@@ -119,15 +119,14 @@ def _display_init_drift(container) -> None:
119
119
  Bare ``teddy init`` reuses the SAME advice ``teddy start`` prints, so its
120
120
  "unchanged" summary cannot mislead: it flags drifted prompts and missing
121
121
  templates and names the actionable ``teddy init prompts`` /
122
- ``teddy init templates`` commands. The two shared helpers are imported
123
- lazily, and they are advisory only -- they never block the command.
122
+ ``teddy init templates`` commands. The helper is imported lazily, and it is
123
+ advisory only -- it never blocks the command.
124
124
  """
125
125
  from teddy_executor.adapters.inbound.session_cli_handlers import (
126
- _display_checks_footer,
127
126
  _display_drift_notification,
128
127
  )
129
128
 
130
- _display_checks_footer(_display_drift_notification(container))
129
+ _display_drift_notification(container)
131
130
 
132
131
 
133
132
  def _resolve_config_or_exit(container) -> IConfigService:
@@ -245,49 +245,29 @@ def _check_git_initialized() -> None:
245
245
  )
246
246
 
247
247
 
248
- def _warn_disabled_workspace_steps(config_service: IConfigService) -> None:
249
- """Print one warning per disabled workspace step with a real consequence.
250
-
251
- A disabled hook installer warns because the unskippable post-commit test
252
- gate then depends on a hook that never landed. A disabled git init warns
253
- only when the workspace is not already a repository, because an existing
254
- repository needs no initialization.
255
- """
256
- if not config_service.get_setting("workspace.pre-commit", True):
257
- typer.secho(
258
- "⚠ Pre-commit hook installation is disabled. "
259
- "The post-commit test gate will not run.",
260
- fg=typer.colors.YELLOW,
261
- err=True,
262
- )
263
- init_disabled = not config_service.get_setting("workspace.init", True)
264
- if init_disabled and not (Path.cwd() / ".git").exists():
265
- typer.secho(
266
- "⚠ Git repository not initialized. Version control actions will fail.",
267
- fg=typer.colors.YELLOW,
268
- err=True,
269
- )
270
-
271
-
272
248
  def _run_health_checks(config_service: IConfigService) -> None:
273
249
  """Run each startup health check the workspace toggles allow.
274
250
 
275
- A disabled step is skipped, and ``_warn_disabled_workspace_steps`` reports
276
- the ones that carry a real consequence.
251
+ A disabled step is skipped without a warning, because the setting is the
252
+ user's own choice and needs no reminder.
277
253
  """
278
254
  if config_service.get_setting("workspace.pre-commit", True):
279
255
  _ensure_commit_hooks()
280
256
  if config_service.get_setting("workspace.init", True):
281
257
  _check_git_initialized()
282
- _warn_disabled_workspace_steps(config_service)
283
258
 
284
259
 
285
260
  _GIT_PULL_TIMEOUT_SECONDS = 15
286
- _PULL_SKIPPED_WARNING = "⚠ Workspace pull skipped."
287
- _PULL_TIMEOUT_WARNING = "⚠ Workspace pull timed out."
288
- _PULL_GIT_UNAVAILABLE_WARNING = "⚠ Workspace pull skipped; git is unavailable."
261
+ _PULL_DETACHED_HEAD_WARNING = "⚠ Workspace pull skipped: detached HEAD."
262
+ _PULL_NO_UPSTREAM_WARNING = "⚠ Workspace pull skipped: no upstream branch."
263
+ _PULL_IN_PROGRESS_WARNING = "⚠ Workspace pull skipped: Git operation in progress."
264
+ _PULL_NOT_A_REPOSITORY_WARNING = "⚠ Workspace pull skipped: not a Git repository."
265
+ _PULL_FAILED_WARNING = "⚠ Workspace pull failed."
266
+ _PULL_GIT_UNAVAILABLE_WARNING = "⚠ Workspace pull failed: git is unavailable."
267
+ _PULL_TIMEOUT_WARNING = (
268
+ f"⚠ Workspace pull timed out after {_GIT_PULL_TIMEOUT_SECONDS}s."
269
+ )
289
270
  _PULL_UP_TO_DATE_NOTICE = "✓ Workspace up-to-date with remote"
290
- _PULL_SKIPPED_NOTICE = "✓ Workspace pull skipped"
291
271
  _IN_PROGRESS_GIT_MARKERS = (
292
272
  "rebase-merge",
293
273
  "rebase-apply",
@@ -305,30 +285,21 @@ def _warn_pull(message: str) -> None:
305
285
  typer.secho(message, fg=typer.colors.YELLOW, err=True)
306
286
 
307
287
 
308
- def _notice_pull(message: str) -> None:
309
- """Print one green pull notice.
310
-
311
- The checkmark line joins the startup block, so it carries no trailing
312
- blank and never uses the warning color.
313
- """
314
- typer.secho(message, fg=typer.colors.GREEN, err=True)
315
-
316
-
317
288
  def _pull_workspace_on_start(
318
289
  config_service: IConfigService,
319
290
  run_func: Optional[Callable[..., Any]] = None,
320
291
  ) -> None:
321
292
  """Fast-forward the workspace before starting a new session.
322
293
 
323
- The pull runs only when ``workspace.pull`` is enabled and the workspace is
324
- a Git repository, so a disabled toggle or a non-repository directory stays
325
- silent. A detached HEAD, a missing upstream, or an in-progress operation
326
- reports one generic checkmark notice, because the user needs a pull outcome
327
- on every run without the diagnostic detail. A dirty worktree, a failed
328
- pull, a timeout, or an unavailable git binary reports one warning and
329
- leaves the workspace unchanged. A successful fast-forward names the number
330
- of commits it moved, and a pull that moves no commit confirms the workspace
331
- is up to date.
294
+ The pull runs only when ``workspace.pull`` is enabled, so a disabled toggle
295
+ stays silent because the user opted out. Every other outcome warns once and
296
+ names its cause, so a skipped or failed pull never carries a checkmark. A
297
+ detached HEAD, a missing upstream, an in-progress operation, a dirty
298
+ worktree, or a missing repository reports why the workspace stayed
299
+ unchanged. A failed pull, a timeout, or an unavailable git binary reports
300
+ the failure. A successful fast-forward names the number of commits it
301
+ moved, and a pull that moves no commit confirms the workspace is up to
302
+ date.
332
303
 
333
304
  The Git process is injected through ``run_func`` so every decision is
334
305
  testable without spawning a real repository.
@@ -336,6 +307,7 @@ def _pull_workspace_on_start(
336
307
  if not config_service.get_setting("workspace.pull", True):
337
308
  return
338
309
  if not (Path.cwd() / ".git").exists():
310
+ _warn_pull(_PULL_NOT_A_REPOSITORY_WARNING)
339
311
  return
340
312
  git_run = run_func or subprocess.run
341
313
  try:
@@ -350,16 +322,12 @@ def _fast_forward_workspace(git_run: Callable[..., Any]) -> None:
350
322
  """Run the pull decision table through the injected Git runner.
351
323
 
352
324
  Each precondition is probed before the pull so an unsafe state never
353
- reaches ``git pull``. A dirty worktree reports one warning, while every
354
- other unsafe state reports one generic checkmark notice so the user always
355
- sees a pull outcome.
325
+ reaches ``git pull``. Every skip reports its cause as one warning, so the
326
+ user always sees a pull outcome.
356
327
  """
357
- skip = _pull_skip_reason(git_run)
358
- if skip is not None:
359
- if skip:
360
- _warn_pull(_PULL_SKIPPED_WARNING)
361
- else:
362
- _notice_pull(_PULL_SKIPPED_NOTICE)
328
+ skip_message = _pull_skip_message(git_run)
329
+ if skip_message is not None:
330
+ _warn_pull(skip_message)
363
331
  return
364
332
  before = _read_head(git_run)
365
333
  result = git_run(
@@ -370,52 +338,60 @@ def _fast_forward_workspace(git_run: Callable[..., Any]) -> None:
370
338
  timeout=_GIT_PULL_TIMEOUT_SECONDS,
371
339
  )
372
340
  if result.returncode != 0:
373
- _warn_pull(_PULL_SKIPPED_WARNING)
341
+ _warn_pull(_PULL_FAILED_WARNING)
374
342
  return
375
343
  _report_fast_forward(git_run, before, _read_head(git_run))
376
344
 
377
345
 
378
- def _pull_skip_reason(git_run: Callable[..., Any]) -> Optional[bool]:
379
- """Return the skip severity, or None when the pull may proceed.
346
+ def _pull_skip_message(git_run: Callable[..., Any]) -> Optional[str]:
347
+ """Return the warning text for a skip, or None when the pull may proceed.
380
348
 
381
- Every skip prints one generic notice, so the caller only needs to know
382
- whether an attention-worthy warning replaces it. The boolean marks a
383
- warning (``True``) versus a checkmark notice (``False``). A dirty worktree
384
- returns the warning, because tracked changes can conflict.
349
+ Every skip names its own cause, because the user needs to know why the
350
+ workspace stayed unchanged. A dirty worktree reports how many tracked
351
+ files block the fast-forward.
385
352
  """
386
353
  git_dir = Path.cwd() / ".git"
387
354
  if any((git_dir / marker).exists() for marker in _IN_PROGRESS_GIT_MARKERS):
388
- return False
355
+ return _PULL_IN_PROGRESS_WARNING
389
356
  detached = git_run(
390
357
  ["git", "symbolic-ref", "-q", "HEAD"],
391
358
  capture_output=True,
392
359
  timeout=_GIT_PULL_TIMEOUT_SECONDS,
393
360
  )
394
361
  if detached.returncode != 0:
395
- return False
362
+ return _PULL_DETACHED_HEAD_WARNING
396
363
  upstream = git_run(
397
364
  ["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"],
398
365
  capture_output=True,
399
366
  timeout=_GIT_PULL_TIMEOUT_SECONDS,
400
367
  )
401
368
  if upstream.returncode != 0:
402
- return False
369
+ return _PULL_NO_UPSTREAM_WARNING
403
370
  status = git_run(
404
371
  ["git", "status", "--porcelain"],
405
372
  capture_output=True,
406
373
  text=True,
407
374
  timeout=_GIT_PULL_TIMEOUT_SECONDS,
408
375
  )
376
+ # Porcelain prints exactly one line per tracked path, so the line count is
377
+ # the file count. A path that is both staged and modified still yields one
378
+ # line with two status columns.
409
379
  tracked_changes = [
410
380
  line
411
381
  for line in status.stdout.splitlines()
412
382
  if line and not line.startswith("??")
413
383
  ]
414
384
  if tracked_changes:
415
- return True
385
+ return _format_uncommitted_warning(len(tracked_changes))
416
386
  return None
417
387
 
418
388
 
389
+ def _format_uncommitted_warning(count: int) -> str:
390
+ """Name how many tracked files block the fast-forward."""
391
+ noun = "file" if count == 1 else "files"
392
+ return f"⚠ Workspace pull skipped: {count} uncommitted {noun}."
393
+
394
+
419
395
  def _read_head(git_run: Callable[..., Any]) -> str:
420
396
  """Read the current commit id through the injected Git runner."""
421
397
  return git_run(
@@ -457,8 +433,7 @@ def _start_background_update_check(container: Container) -> list[str]:
457
433
 
458
434
  Both session entry points share this preamble: it spawns the daemon
459
435
  version-fetch thread, then emits the cached update notification (if any).
460
- The returned list names the checks that fired so the shared disable-footer
461
- can report them.
436
+ The returned list names the update checks that fired.
462
437
  """
463
438
  import threading
464
439
 
@@ -472,9 +447,8 @@ def _start_background_update_check(container: Container) -> list[str]:
472
447
  return _display_update_notification(container, cache_path)
473
448
 
474
449
 
475
- def _run_startup_preamble( # noqa: PLR0913 # Each parameter is an explicit startup gate.
450
+ def _run_startup_preamble(
476
451
  container: Container,
477
- fired: list[str],
478
452
  agent: Optional[str] = None,
479
453
  setup_editor: Optional[bool] = None,
480
454
  setup_api_key: Optional[bool] = None,
@@ -484,11 +458,10 @@ def _run_startup_preamble( # noqa: PLR0913 # Each parameter is an explicit sta
484
458
 
485
459
  The order is fixed so the banner layout cannot drift: health checks, the
486
460
  start-only workspace fast-forward line, one separator blank line, the
487
- ``Checking configurations...`` line, the preflight check (whose returned
488
- keys extend ``fired``), then the shared disable-footer. ``start`` forwards
489
- its ``agent`` so the preflight validates the agent prompt and enables
490
- ``pull_workspace``; ``resume`` leaves the agent ``None`` and keeps the pull
491
- off.
461
+ ``Checking configurations...`` line, then the preflight check. ``start``
462
+ forwards its ``agent`` so the preflight validates the agent prompt and
463
+ enables ``pull_workspace``; ``resume`` leaves the agent ``None`` and keeps
464
+ the pull off.
492
465
  """
493
466
  config_service = container.resolve(IConfigService)
494
467
  _run_health_checks(config_service)
@@ -497,15 +470,12 @@ def _run_startup_preamble( # noqa: PLR0913 # Each parameter is an explicit sta
497
470
  # One separator groups the checkmark block above with the notices below.
498
471
  typer.echo("", err=True)
499
472
  typer.echo("Checking configurations...", err=True)
500
- fired.extend(
501
- _run_cli_preflight_check(
502
- container,
503
- agent=agent,
504
- setup_editor=setup_editor,
505
- setup_api_key=setup_api_key,
506
- )
473
+ _run_cli_preflight_check(
474
+ container,
475
+ agent=agent,
476
+ setup_editor=setup_editor,
477
+ setup_api_key=setup_api_key,
507
478
  )
508
- _display_checks_footer(fired)
509
479
 
510
480
 
511
481
  def _handle_startup_error(container: Container, error: Exception) -> None:
@@ -798,32 +768,6 @@ def _display_drift_notification(container: Container) -> list[str]:
798
768
  return fired
799
769
 
800
770
 
801
- def _display_checks_footer(keys: list[str]) -> None:
802
- """Emit the shared disable-footer naming the checks that just fired.
803
-
804
- No-op when no check fired. Otherwise prints exactly ONE plain (uncolored)
805
- line so the user can discover how to silence the notifications they saw,
806
- ordering the deduped keys by the canonical check sequence.
807
- """
808
- if not keys:
809
- return
810
-
811
- canonical = ("checks.prompts", "checks.templates", "checks.update")
812
- unique = set(keys)
813
- ordered = [key for key in canonical if key in unique]
814
-
815
- if len(ordered) == 1:
816
- typer.echo(
817
- f"You can disable this check in .teddy/config.yaml: {ordered[0]}.",
818
- err=True,
819
- )
820
- else:
821
- typer.echo(
822
- f"You can disable these checks in .teddy/config.yaml: {', '.join(ordered)}.",
823
- err=True,
824
- )
825
-
826
-
827
771
  def _display_update_notification(container: Container, cache_path: Path) -> list[str]:
828
772
  """Check the update cache and display a non-blocking notification
829
773
  if a newer version is available. Called on session startup, after
@@ -886,7 +830,7 @@ def handle_new_session( # noqa: PLR0913
886
830
  max_cost: Optional[float] = None,
887
831
  ):
888
832
  """Logic for the 'start' command."""
889
- fired = _start_background_update_check(container)
833
+ _start_background_update_check(container)
890
834
 
891
835
  try:
892
836
  # 0. Pipeline mode requires an initial message
@@ -898,10 +842,9 @@ def handle_new_session( # noqa: PLR0913
898
842
  # 1. Ensure project is initialized
899
843
  container.resolve(IInitUseCase).ensure_initialized()
900
844
 
901
- # 2. Shared startup preamble (health checks + preflight + footer)
845
+ # 2. Shared startup preamble (health checks + preflight)
902
846
  _run_startup_preamble(
903
847
  container,
904
- fired,
905
848
  agent=agent,
906
849
  setup_editor=setup_editor,
907
850
  setup_api_key=setup_api_key,
@@ -1570,13 +1513,12 @@ def handle_resume_session( # noqa: PLR0913
1570
1513
  max_cost: Optional[float] = None,
1571
1514
  ):
1572
1515
  """Logic for the 'resume' command."""
1573
- fired = _start_background_update_check(container)
1516
+ _start_background_update_check(container)
1574
1517
 
1575
1518
  try:
1576
- # 1. Shared startup preamble (health checks + preflight + footer)
1519
+ # 1. Shared startup preamble (health checks + preflight)
1577
1520
  _run_startup_preamble(
1578
1521
  container,
1579
- fired,
1580
1522
  setup_editor=setup_editor,
1581
1523
  setup_api_key=setup_api_key,
1582
1524
  )