teddy-cli 0.1.17.dev1289__tar.gz → 0.1.17.dev1291__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 (161) hide show
  1. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +10 -3
  4. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/container.py +19 -1
  5. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_orchestrator.py +7 -8
  6. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/interrupt_guard.py +13 -0
  7. teddy_cli-0.1.17.dev1291/src/teddy_executor/core/utils/session_notices.py +42 -0
  8. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/.gitignore +0 -0
  9. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/LICENSE +0 -0
  10. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/__init__.py +0 -0
  11. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/__main__.py +0 -0
  12. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/__init__.py +0 -0
  13. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  14. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  15. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  16. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  17. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  18. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  19. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  20. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  21. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  22. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  23. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  24. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  25. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  26. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  27. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  28. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  29. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  30. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  31. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  32. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  33. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  34. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  35. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  36. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  37. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  38. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  39. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  41. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  42. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  43. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  44. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/__init__.py +0 -0
  45. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/__init__.py +0 -0
  46. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  47. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  48. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  49. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  50. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  51. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  52. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  53. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/plan.py +0 -0
  54. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  55. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  56. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  57. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/session.py +0 -0
  58. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  59. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  60. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/__init__.py +0 -0
  61. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  62. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  63. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  64. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  65. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  66. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  67. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  68. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  69. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  70. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  71. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  72. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  73. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  74. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  75. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  76. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  77. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  78. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  79. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  80. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  81. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  82. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  83. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  84. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  85. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  86. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  87. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  88. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  89. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/__init__.py +0 -0
  90. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  91. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  92. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  93. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_executor.py +0 -0
  94. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_factory.py +0 -0
  95. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  96. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  97. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/context_service.py +0 -0
  98. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  99. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  100. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  101. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/init_service.py +0 -0
  102. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  103. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  104. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  105. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  106. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  107. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/plan_validator.py +0 -0
  108. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/planning_service.py +0 -0
  109. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  110. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  111. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  112. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_planner.py +0 -0
  113. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  114. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_replanner.py +0 -0
  115. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_repository.py +0 -0
  116. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_service.py +0 -0
  117. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  118. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/update_checker.py +0 -0
  119. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  120. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  121. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  122. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  123. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  124. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  125. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  126. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  127. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/__init__.py +0 -0
  128. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/diff.py +0 -0
  129. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/io.py +0 -0
  130. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/markdown.py +0 -0
  131. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/paths.py +0 -0
  132. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/serialization.py +0 -0
  133. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  134. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/string.py +0 -0
  135. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/terminal.py +0 -0
  136. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/prompts.py +0 -0
  137. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/registries/__init__.py +0 -0
  138. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/registries/infrastructure.py +0 -0
  139. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/registries/reviewer.py +0 -0
  140. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/registries/validators.py +0 -0
  141. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/MRP.xml +0 -0
  142. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/__init__.py +0 -0
  143. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/__init__.py +0 -0
  144. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/config.yaml +0 -0
  145. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/init.context +0 -0
  146. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/architect.xml +0 -0
  147. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/assistant.xml +0 -0
  148. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/debugger.xml +0 -0
  149. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/developer.xml +0 -0
  150. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/pathfinder.xml +0 -0
  151. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/prototyper.xml +0 -0
  152. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  153. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  154. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/case-file.md +0 -0
  155. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/ci.md +0 -0
  156. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/component-design.md +0 -0
  157. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/makefile.md +0 -0
  158. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/milestone.md +0 -0
  159. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  160. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  161. {teddy_cli-0.1.17.dev1289 → teddy_cli-0.1.17.dev1291}/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.dev1289
3
+ Version: 0.1.17.dev1291
4
4
  Summary: A local-first, file-based AI coding workflow that applies the UNIX philosophy to AI collaboration.
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.dev1289"
3
+ version = "0.1.17.dev1291"
4
4
  description = "A local-first, file-based AI coding workflow that applies the UNIX philosophy to AI collaboration."
5
5
  authors = [{ name = "Raphael Atteritano" }]
6
6
  license = { text = "AGPL-3.0-only" }
@@ -17,7 +17,8 @@ from teddy_executor.core.ports.outbound.user_interactor import IUserInteractor
17
17
  from teddy_executor.core.ports.outbound.session_loop_guard import ISessionLoopGuard
18
18
  from teddy_executor.core.ports.outbound.config_service import IConfigService
19
19
  from teddy_executor.core.ports.outbound.session_repository import ISessionRepository
20
- from teddy_executor.core.utils.interrupt_guard import INTERRUPT_REASON, InterruptGuard
20
+ from teddy_executor.core.utils.interrupt_guard import InterruptGuard
21
+ from teddy_executor.core.utils.session_notices import format_interrupt_notice
21
22
  from teddy_executor.core.utils.string import canonical_agent_name, slugify
22
23
  from teddy_executor.adapters.inbound.cli_formatter import format_project_context
23
24
  from teddy_executor.adapters.inbound.cli_helpers import (
@@ -358,7 +359,10 @@ def _orchestrate_session_loop( # noqa: PLR0913
358
359
  # the orchestrator's turn-transition path. EXIT the session so the
359
360
  # user regains control instead of auto-advancing to the next turn.
360
361
  if interrupt_guard.interrupted.is_set():
361
- typer.secho(INTERRUPT_REASON, fg=typer.colors.YELLOW)
362
+ typer.secho(
363
+ format_interrupt_notice(interrupt_guard.source),
364
+ fg=typer.colors.YELLOW,
365
+ )
362
366
  break
363
367
 
364
368
  cumulative_cost = float(report.metadata.get("cumulative_cost", 0.0))
@@ -376,7 +380,10 @@ def _orchestrate_session_loop( # noqa: PLR0913
376
380
  # Immediate-exit semantics (Task Brief): Ctrl+C while nothing is in
377
381
  # flight (prompts, planning) terminates the session with a notice —
378
382
  # no report is generated and nothing is mutated.
379
- typer.secho(INTERRUPT_REASON, fg=typer.colors.YELLOW)
383
+ typer.secho(
384
+ format_interrupt_notice(interrupt_guard.source),
385
+ fg=typer.colors.YELLOW,
386
+ )
380
387
  finally:
381
388
  # Caller-owned restoration contract: restore the SIGINT disposition
382
389
  # that preceded the guard's install() when the turn loop ends. Stop the
@@ -1,5 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import os
4
+ import signal
3
5
  import time
4
6
 
5
7
  import punq
@@ -31,6 +33,20 @@ def create_container() -> punq.Container:
31
33
  return container
32
34
 
33
35
 
36
+ def _record_quit_source(container: punq.Container) -> None:
37
+ """Record the bare-`q` source on the shared guard, then self-deliver SIGINT.
38
+
39
+ Invoked from the quit-key listener's reader thread when `q` is pressed.
40
+ Recording the source lets the boundary notice name `q` instead of the
41
+ default `Ctrl+C`; the self-delivered SIGINT then drives the shared guard's
42
+ already-tested WAITING/EXECUTING branch unchanged.
43
+ """
44
+ from teddy_executor.core.utils.interrupt_guard import InterruptGuard
45
+
46
+ container.resolve(InterruptGuard).record_source("q")
47
+ os.kill(os.getpid(), signal.SIGINT)
48
+
49
+
34
50
  def _register_services(container: punq.Container) -> None:
35
51
  """Registers core application services."""
36
52
  from teddy_executor.core.ports.inbound.edit_simulator import IEditSimulator
@@ -176,7 +192,9 @@ def _register_orchestration_services(container: punq.Container) -> None:
176
192
  # so ONE instance serves the boundary's install/restore window.
177
193
  container.register(
178
194
  IQuitKeyListener,
179
- factory=lambda: TerminalQuitKeyListener(),
195
+ factory=lambda: TerminalQuitKeyListener(
196
+ on_quit=lambda: _record_quit_source(container)
197
+ ),
180
198
  scope=punq.Scope.singleton,
181
199
  )
182
200
  container.register(
@@ -14,6 +14,7 @@ from teddy_executor.core.ports.inbound.run_plan_use_case import IRunPlanUseCase
14
14
  from teddy_executor.core.ports.outbound.file_system_manager import IFileSystemManager
15
15
  from teddy_executor.core.services.session_replanner import SessionReplanner
16
16
  from teddy_executor.core.utils.io import Tee as _Tee
17
+ from teddy_executor.core.utils.session_notices import format_termination_notice
17
18
  from teddy_executor.core.utils.terminal import emit_user_message
18
19
  import typer
19
20
 
@@ -304,12 +305,10 @@ class SessionOrchestrator(IRunPlanUseCase):
304
305
  )
305
306
  if user_reply is not None and not user_reply.strip():
306
307
  typer.secho(
307
- "\nSession terminated (empty message).",
308
- fg=typer.colors.RED,
309
- err=True,
310
- )
311
- typer.secho(
312
- "To continue the session, use `teddy resume [session_path]`.",
308
+ format_termination_notice(
309
+ "Session terminated (empty message)."
310
+ ),
311
+ fg=typer.colors.YELLOW,
313
312
  err=True,
314
313
  )
315
314
  return None # type: ignore
@@ -334,9 +333,9 @@ class SessionOrchestrator(IRunPlanUseCase):
334
333
  elif is_session and plan_path:
335
334
  report = self._handle_aborted_session(report, plan)
336
335
  if report is None:
337
- typer.secho("\nSession terminated.", fg=typer.colors.RED, err=True)
338
336
  typer.secho(
339
- "To continue the session, use `teddy resume [session_path]`.",
337
+ format_termination_notice("Session terminated."),
338
+ fg=typer.colors.YELLOW,
340
339
  err=True,
341
340
  )
342
341
  return None # type: ignore
@@ -51,6 +51,10 @@ class InterruptGuard:
51
51
  self._grace_window = GRACE_WINDOW_SECONDS
52
52
  self._monotonic = monotonic
53
53
  self.interrupted = threading.Event()
54
+ # The key that triggered the interrupt (e.g. "q"), recorded by the
55
+ # quit-key listener before it self-delivers SIGINT. None means a
56
+ # genuine Ctrl+C (or a direct interrupted.set() in tests).
57
+ self.source: Optional[str] = None
54
58
  self._executing = False
55
59
  self._first_signal_at: Optional[float] = None
56
60
 
@@ -62,6 +66,15 @@ class InterruptGuard:
62
66
  """
63
67
  return signal.signal(signal.SIGINT, self._handle_signal)
64
68
 
69
+ def record_source(self, source: str) -> None:
70
+ """Record which key triggered the interrupt (e.g. ``"q"``).
71
+
72
+ The quit-key listener's ``on_quit`` callback calls this BEFORE
73
+ self-delivering SIGINT so the boundary notice can name the key the
74
+ user actually pressed instead of defaulting to ``Ctrl+C``.
75
+ """
76
+ self.source = source
77
+
65
78
  def _handle_signal(self, signum: int, frame: Optional[FrameType]) -> None:
66
79
  """The installed SIGINT handler; branches on the current phase."""
67
80
  if not self._executing:
@@ -0,0 +1,42 @@
1
+ """Shared session-termination and interrupt notice strings.
2
+
3
+ Single source for the resume hint and the interrupt-notice composition so the
4
+ session-loop boundary (interrupt notices) and the session orchestrator
5
+ (termination notices) render the same actionable next step.
6
+
7
+ The interrupt notice names the key the user actually pressed: the shared
8
+ guard's ``source`` marker (set by the bare-``q`` listener callback) when
9
+ present, and the ``Ctrl+C`` default otherwise.
10
+ """
11
+
12
+ from typing import Optional
13
+
14
+ from teddy_executor.core.utils.interrupt_guard import INTERRUPT_REASON
15
+
16
+ # The single resume hint shared by every termination and interrupt notice.
17
+ RESUME_HINT = "To continue the session, use `teddy resume`."
18
+
19
+ # Key label used when no interrupt source was recorded (a genuine Ctrl+C).
20
+ DEFAULT_INTERRUPT_KEY = "Ctrl+C"
21
+
22
+
23
+ def format_interrupt_notice(source: Optional[str] = None) -> str:
24
+ """Compose the one-line interrupt notice naming the pressed key.
25
+
26
+ The prefix is derived from ``INTERRUPT_REASON`` (sans its trailing period)
27
+ so the boundary notice and the audit-trail reason stay in lockstep; the key
28
+ label defaults to ``Ctrl+C`` when no source was recorded.
29
+ """
30
+ key = source or DEFAULT_INTERRUPT_KEY
31
+ return f"{INTERRUPT_REASON.removesuffix('.')} ({key}). {RESUME_HINT}"
32
+
33
+
34
+ def format_termination_notice(reason: str) -> str:
35
+ """Compose a one-line termination notice ending with the shared resume hint.
36
+
37
+ ``reason`` is the situation-specific lead-in (e.g. ``"Session terminated."``
38
+ or ``"Session terminated (empty message)."``); the shared ``RESUME_HINT``
39
+ is appended so every termination notice ends with the same actionable next
40
+ step on a single line.
41
+ """
42
+ return f"{reason} {RESUME_HINT}"