teddy-cli 0.1.14__tar.gz → 0.1.16.dev1149__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 (166) hide show
  1. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/PKG-INFO +2 -2
  2. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/pyproject.toml +2 -2
  3. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/__main__.py +131 -48
  4. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/inbound/cli_helpers.py +9 -8
  5. teddy_cli-0.1.16.dev1149/src/teddy_executor/adapters/inbound/session_cli_handlers.py +1031 -0
  6. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +7 -1
  7. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +97 -59
  8. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/console_interactor.py +37 -24
  9. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +55 -33
  10. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +6 -31
  11. teddy_cli-0.1.16.dev1149/src/teddy_executor/adapters/outbound/console_tooling.py +188 -0
  12. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/litellm_adapter.py +155 -25
  13. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +40 -6
  14. teddy_cli-0.1.16.dev1149/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +167 -0
  15. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/shell_adapter.py +94 -8
  16. teddy_cli-0.1.16.dev1149/src/teddy_executor/adapters/outbound/suppressed_logging.py +39 -0
  17. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +18 -24
  18. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +20 -1
  19. teddy_cli-0.1.16.dev1149/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +154 -0
  20. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +28 -6
  21. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +6 -4
  22. teddy_cli-0.1.16.dev1149/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +350 -0
  23. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/container.py +36 -0
  24. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/execution_report.py +2 -0
  25. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/orchestrator_ports.py +2 -0
  26. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/planning_ports.py +9 -1
  27. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/shell_output.py +4 -0
  28. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/inbound/init.py +2 -2
  29. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/inbound/planning_use_case.py +4 -2
  30. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +4 -3
  31. teddy_cli-0.1.16.dev1149/src/teddy_executor/core/ports/outbound/config_service.py +55 -0
  32. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/file_system_manager.py +23 -2
  33. teddy_cli-0.1.16.dev1149/src/teddy_executor/core/ports/outbound/quit_key_listener.py +32 -0
  34. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/session_manager.py +23 -1
  35. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/system_environment.py +4 -0
  36. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/web_scraper.py +3 -1
  37. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/action_dispatcher.py +6 -1
  38. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/action_executor.py +17 -0
  39. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/action_factory.py +1 -1
  40. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/context_service.py +56 -13
  41. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/execution_orchestrator.py +48 -12
  42. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/execution_report_assembler.py +7 -0
  43. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/init_service.py +58 -8
  44. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/markdown_plan_parser.py +1 -1
  45. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/parser_infrastructure.py +18 -0
  46. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/planning_service.py +5 -3
  47. teddy_cli-0.1.16.dev1149/src/teddy_executor/core/services/session_lifecycle_manager.py +560 -0
  48. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/session_orchestrator.py +161 -75
  49. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/session_planner.py +11 -5
  50. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/session_repository.py +1 -1
  51. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/session_service.py +80 -73
  52. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/templates/execution_report.md.j2 +55 -40
  53. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/update_checker.py +3 -1
  54. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/validation_rules/edit.py +1 -1
  55. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +22 -5
  56. teddy_cli-0.1.16.dev1149/src/teddy_executor/core/utils/interrupt_guard.py +110 -0
  57. teddy_cli-0.1.16.dev1149/src/teddy_executor/core/utils/stdin_ownership.py +43 -0
  58. teddy_cli-0.1.16.dev1149/src/teddy_executor/core/utils/terminal.py +47 -0
  59. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/registries/infrastructure.py +9 -1
  60. teddy_cli-0.1.16.dev1149/src/teddy_executor/registries/reviewer.py +35 -0
  61. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/config/config.yaml +15 -3
  62. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/config/prompts/debugger.xml +2 -2
  63. teddy_cli-0.1.14/src/teddy_executor/adapters/inbound/console_plan_reviewer.py +0 -69
  64. teddy_cli-0.1.14/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -567
  65. teddy_cli-0.1.14/src/teddy_executor/adapters/outbound/console_tooling.py +0 -76
  66. teddy_cli-0.1.14/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -89
  67. teddy_cli-0.1.14/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -105
  68. teddy_cli-0.1.14/src/teddy_executor/core/ports/outbound/config_service.py +0 -29
  69. teddy_cli-0.1.14/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -228
  70. teddy_cli-0.1.14/src/teddy_executor/registries/reviewer.py +0 -59
  71. teddy_cli-0.1.14/src/teddy_executor/resources/config/.gitignore +0 -2
  72. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/.gitignore +0 -0
  73. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/LICENSE +0 -0
  74. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/__init__.py +0 -0
  75. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/__init__.py +0 -0
  76. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  77. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  78. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  79. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  80. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  81. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  82. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  83. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  84. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  85. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  86. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  87. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  88. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  89. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/__init__.py +0 -0
  90. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/__init__.py +0 -0
  91. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  92. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  93. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  94. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  95. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/plan.py +0 -0
  96. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  97. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  98. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/session.py +0 -0
  99. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  100. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/__init__.py +0 -0
  101. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  102. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  103. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  104. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  105. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  106. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  107. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  108. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  109. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  110. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  111. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  112. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  113. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  114. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  115. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  116. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  117. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  118. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  119. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  120. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/__init__.py +0 -0
  121. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  122. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  123. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  124. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  125. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  126. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  127. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  128. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  129. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/plan_validator.py +0 -0
  130. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  131. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  132. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  133. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/session_replanner.py +0 -0
  134. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  135. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  136. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  137. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  138. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  139. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  140. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/utils/__init__.py +0 -0
  141. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/utils/diff.py +0 -0
  142. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/utils/io.py +0 -0
  143. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/utils/markdown.py +0 -0
  144. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/utils/serialization.py +0 -0
  145. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/core/utils/string.py +0 -0
  146. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/prompts.py +0 -0
  147. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/registries/__init__.py +0 -0
  148. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/registries/validators.py +0 -0
  149. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/__init__.py +0 -0
  150. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/config/__init__.py +0 -0
  151. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/config/init.context +0 -0
  152. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/config/prompts/architect.xml +0 -0
  153. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/config/prompts/assistant.xml +0 -0
  154. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/config/prompts/developer.xml +0 -0
  155. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/config/prompts/pathfinder.xml +0 -0
  156. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/config/prompts/prototyper.xml +0 -0
  157. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  158. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/templates/MM-NN-vertical-slice.md +0 -0
  159. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/templates/MM-milestone.md +0 -0
  160. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/templates/NN-case-file.md +0 -0
  161. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/templates/NN-task-brief.md +0 -0
  162. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  163. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/templates/ci.md +0 -0
  164. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/templates/component-design.md +0 -0
  165. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/templates/makefile.md +0 -0
  166. {teddy_cli-0.1.14 → teddy_cli-0.1.16.dev1149}/src/teddy_executor/resources/templates/specification-document.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: teddy-cli
3
- Version: 0.1.14
3
+ Version: 0.1.16.dev1149
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
@@ -27,5 +27,5 @@ Requires-Dist: requests<3,>=2.33.0
27
27
  Requires-Dist: textual<9,>=8.1.0
28
28
  Requires-Dist: tld<1.0,>=0.10
29
29
  Requires-Dist: trafilatura<3,>=2.0.0
30
- Requires-Dist: typer[all]
30
+ Requires-Dist: typer
31
31
  Requires-Dist: urllib3<3,>=2.7.0
@@ -1,12 +1,12 @@
1
1
  [project]
2
2
  name = "teddy-cli"
3
- version = "0.1.14"
3
+ version = "0.1.16.dev1149"
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" }
7
7
  requires-python = ">=3.11, <3.15"
8
8
  dependencies = [
9
- "typer[all]",
9
+ "typer",
10
10
  "pyperclip",
11
11
  "playwright",
12
12
  "httpx>=0.28.1,<0.29",
@@ -11,6 +11,8 @@ import typer
11
11
  from teddy_executor.core.domain.models import (
12
12
  ExecutionReport,
13
13
  )
14
+ from teddy_executor.core.ports.outbound.config_service import IConfigService
15
+ from teddy_executor.core.ports.outbound.system_environment import ISystemEnvironment
14
16
 
15
17
  if TYPE_CHECKING:
16
18
  from teddy_executor.core.ports.inbound.plan_parser import IPlanParser
@@ -42,13 +44,6 @@ def get_container():
42
44
  return _get_container()
43
45
 
44
46
 
45
- def _apply_ui_mode_override(container, ui_mode_bool: bool) -> None:
46
- from teddy_executor.container import register_reviewer
47
-
48
- mode = "tui" if ui_mode_bool else "console"
49
- register_reviewer(container, ui_mode=mode)
50
-
51
-
52
47
  logging.basicConfig(
53
48
  level=logging.INFO,
54
49
  format="%(message)s",
@@ -57,6 +52,54 @@ logging.basicConfig(
57
52
  )
58
53
 
59
54
 
55
+ def _resolve_yolo(yolo: Optional[bool], config_service: IConfigService) -> bool:
56
+ """Resolve the effective YOLO mode (single-sourced across commands).
57
+
58
+ An explicit flag always wins (``--yolo`` / ``-y`` -> ``True``,
59
+ ``--no-yolo`` / ``-n`` -> ``False``). When the flag is unset, the mode
60
+ falls back to the ``yolo_default`` config setting (code default ``False``).
61
+ """
62
+ if yolo is not None:
63
+ return yolo
64
+ return bool(config_service.get_setting("yolo_default", False))
65
+
66
+
67
+ def _resolve_setup_editor(
68
+ system_env: ISystemEnvironment,
69
+ interactive: bool,
70
+ message: Optional[str],
71
+ pipeline: bool,
72
+ ) -> bool:
73
+ """Resolve whether the one-time editor setup should run (Slice 00-26).
74
+
75
+ The editor gate keys on "will the session actually read the terminal"
76
+ rather than on the approval (``interactive``) flag: setup runs only when a
77
+ terminal is attached (``system_env.isatty``), the run is not a pipeline,
78
+ and the session will either enter the approval loop (``interactive``) or
79
+ block on the opening-message prompt (``message is None``). This lets a yolo
80
+ run without ``-m`` configure its editor once, while fully-specified batch
81
+ runs (``-y -m``), pipeline runs, and non-TTY (CI/piped) runs stay
82
+ prompt-free.
83
+ """
84
+ return system_env.isatty() and not pipeline and (interactive or message is None)
85
+
86
+
87
+ def _resolve_setup_api_key(
88
+ system_env: ISystemEnvironment,
89
+ pipeline: bool,
90
+ ) -> bool:
91
+ """Resolve whether the interactive LLM API-key setup should run.
92
+
93
+ Unlike the optional editor, the LLM API key is REQUIRED, so its gate is
94
+ deliberately WIDER: setup runs whenever a terminal is attached and the run
95
+ is not a pipeline. There is intentionally no ``interactive``/``-m`` clause --
96
+ a fully-specified batch run (``-y -m``) on a TTY still prompts, because the
97
+ session cannot proceed without a key. Pipeline runs remain the clean
98
+ automation path (they hard-error by design).
99
+ """
100
+ return system_env.isatty() and not pipeline
101
+
102
+
60
103
  def _ensure_project_initialized(container, root_dir: str | None = None) -> None:
61
104
  """Lazily performs project anchoring and initialization.
62
105
 
@@ -110,8 +153,11 @@ def _ensure_project_initialized(container, root_dir: str | None = None) -> None:
110
153
  OPT_NO_COPY = typer.Option(
111
154
  False, "--no-copy", help="Do not copy the output to the clipboard."
112
155
  )
113
- OPT_UI_MODE = typer.Option(
114
- None, "--tui/--console", help="Force TUI or Console mode.", show_default=False
156
+ OPT_PIPELINE = typer.Option(
157
+ False,
158
+ "--pipeline",
159
+ "-p",
160
+ help="Pipeline mode: auto-approve all actions, requires -m, exits after first ## Message.",
115
161
  )
116
162
 
117
163
 
@@ -121,22 +167,28 @@ def start( # noqa: PLR0913
121
167
  agent: str = typer.Option(
122
168
  "pathfinder", "--agent", "-a", help="Agent prompt to use."
123
169
  ),
124
- yolo: bool = typer.Option(
125
- False, "--yolo", "-y", help="Auto-approve all actions (non-interactive mode)."
170
+ yolo: Optional[bool] = typer.Option(
171
+ None,
172
+ "--yolo/--no-yolo",
173
+ "-y/-n",
174
+ help=(
175
+ "Auto-approve all actions (non-interactive). "
176
+ "--no-yolo / -n forces interactive mode."
177
+ ),
126
178
  ),
127
- yes: bool = typer.Option(False, "--yes", hidden=True),
128
- no_interactive: bool = typer.Option(False, "--no-interactive", hidden=True),
129
- non_interactive: bool = typer.Option(False, "--non-interactive", hidden=True),
179
+ pipeline: bool = OPT_PIPELINE,
130
180
  no_copy: bool = OPT_NO_COPY,
131
- ui_mode: Optional[bool] = OPT_UI_MODE,
132
181
  message: Optional[str] = typer.Option(
133
182
  None, "-m", "--message", help="Instruction for the first turn."
134
183
  ),
135
- context: Optional[str] = typer.Option(
184
+ context: Optional[list[str]] = typer.Option(
136
185
  None,
137
186
  "--context",
138
187
  "-c",
139
- help="Comma-separated list of additional files/dirs for context.",
188
+ help=(
189
+ "Additional files/dirs for context. Repeatable (-c a.py -c b.md); "
190
+ 'comma-separated values are also accepted (-c "a.py,b.md").'
191
+ ),
140
192
  ),
141
193
  model: Optional[str] = typer.Option(None, "--model", help="LLM model override."),
142
194
  provider: Optional[str] = typer.Option(
@@ -153,18 +205,33 @@ def start( # noqa: PLR0913
153
205
 
154
206
  container = get_container()
155
207
  _ensure_project_initialized(container)
156
- if ui_mode is not None:
157
- _apply_ui_mode_override(container, ui_mode)
158
-
159
- additional_context = context.split(",") if context else None
208
+ config_service = container.resolve(IConfigService)
209
+
210
+ additional_context = (
211
+ [
212
+ path.strip()
213
+ for occurrence in context
214
+ for path in occurrence.split(",")
215
+ if path.strip()
216
+ ]
217
+ if context
218
+ else None
219
+ )
160
220
 
221
+ interactive = not (_resolve_yolo(yolo, config_service) or pipeline)
222
+ system_env = container.resolve(ISystemEnvironment)
161
223
  handle_new_session(
162
224
  container=container,
163
225
  name=name,
164
226
  agent=agent,
165
- interactive=not (yolo or yes or no_interactive or non_interactive),
227
+ interactive=interactive,
228
+ setup_editor=_resolve_setup_editor(
229
+ system_env, interactive=interactive, message=message, pipeline=pipeline
230
+ ),
231
+ setup_api_key=_resolve_setup_api_key(system_env, pipeline=pipeline),
166
232
  no_copy=no_copy,
167
233
  message=message,
234
+ pipeline=pipeline,
168
235
  additional_context=additional_context,
169
236
  model=model,
170
237
  provider=provider,
@@ -287,15 +354,13 @@ def update(
287
354
  typer.echo("To apply prompt updates, run: teddy init prompts")
288
355
  elif experimental:
289
356
  typer.echo(f"A new experimental version {latest} is available.")
290
- typer.echo(
291
- "To upgrade, run: uv tool install teddy-cli --pre --force --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ --index-strategy unsafe-best-match"
292
- )
357
+ typer.echo("To upgrade, run: uv tool install teddy-cli --pre --force")
293
358
  typer.echo("To apply prompt updates, run: teddy init prompts")
294
359
  else:
295
360
  typer.echo(f"A new version {latest} is available.")
296
- # A pre-release install comes from the TestPyPI experimental channel.
297
- # `uv tool upgrade` cannot reliably move the tool off that index back to
298
- # PyPI, so force a reinstall from the default index instead.
361
+ # A pre-release install comes from PyPI with a dev version (--pre).
362
+ # `uv tool upgrade` cannot reliably move the tool off --pre back to
363
+ # stable, so force a reinstall from the default index instead.
299
364
  if is_prerelease(current):
300
365
  typer.echo("To upgrade, run: uv tool install teddy-cli --force")
301
366
  else:
@@ -365,14 +430,16 @@ def create_parser_for_plan(plan_content: str) -> IPlanParser:
365
430
  @app.command()
366
431
  def resume( # noqa: PLR0913
367
432
  path: Optional[str] = typer.Argument(None, help="Path to session or turn."),
368
- yolo: bool = typer.Option(
369
- False, "--yolo", "-y", help="Auto-approve all actions (non-interactive mode)."
433
+ yolo: Optional[bool] = typer.Option(
434
+ None,
435
+ "--yolo/--no-yolo",
436
+ "-y/-n",
437
+ help=(
438
+ "Auto-approve all actions (non-interactive). "
439
+ "--no-yolo / -n forces interactive mode."
440
+ ),
370
441
  ),
371
- yes: bool = typer.Option(False, "--yes", hidden=True),
372
- no_interactive: bool = typer.Option(False, "--no-interactive", hidden=True),
373
- non_interactive: bool = typer.Option(False, "--non-interactive", hidden=True),
374
442
  no_copy: bool = OPT_NO_COPY,
375
- ui_mode: Optional[bool] = OPT_UI_MODE,
376
443
  model: Optional[str] = typer.Option(None, "--model", help="LLM model override."),
377
444
  provider: Optional[str] = typer.Option(
378
445
  None, "--provider", help="LLM provider override."
@@ -380,28 +447,44 @@ def resume( # noqa: PLR0913
380
447
  api_key: Optional[str] = typer.Option(
381
448
  None, "--api-key", help="LLM API key override."
382
449
  ),
450
+ message: Optional[str] = typer.Option(
451
+ None,
452
+ "--message",
453
+ "-m",
454
+ help=(
455
+ "Inject a user request/reply without interactive prompting "
456
+ "(e.g. to continue after interrupting a --yolo run)."
457
+ ),
458
+ ),
459
+ pipeline: bool = OPT_PIPELINE,
383
460
  ):
384
461
  """
385
462
  Intelligently resumes the last turn of a session or starts a new one.
386
463
  """
387
- from teddy_executor.adapters.inbound.cli_helpers import apply_ui_mode_override
388
464
  from teddy_executor.adapters.inbound.session_cli_handlers import (
389
465
  handle_resume_session,
390
466
  )
391
467
 
392
468
  container = get_container()
393
469
  _ensure_project_initialized(container)
394
- if ui_mode is not None:
395
- apply_ui_mode_override(container, ui_mode)
470
+ config_service = container.resolve(IConfigService)
396
471
 
472
+ interactive = not (_resolve_yolo(yolo, config_service) or pipeline)
473
+ system_env = container.resolve(ISystemEnvironment)
397
474
  handle_resume_session(
398
475
  container=container,
399
476
  path=path,
400
- interactive=not (yolo or yes or no_interactive or non_interactive),
477
+ interactive=interactive,
478
+ setup_editor=_resolve_setup_editor(
479
+ system_env, interactive=interactive, message=message, pipeline=pipeline
480
+ ),
481
+ setup_api_key=_resolve_setup_api_key(system_env, pipeline=pipeline),
401
482
  no_copy=no_copy,
402
483
  model=model,
403
484
  provider=provider,
404
485
  api_key=api_key,
486
+ message=message,
487
+ pipeline=pipeline,
405
488
  )
406
489
 
407
490
 
@@ -410,17 +493,19 @@ def execute( # noqa: PLR0913
410
493
  plan_file: Optional[Path] = typer.Argument(
411
494
  None, help="Root-relative path to the plan file (.md).", show_default=False
412
495
  ),
413
- yolo: bool = typer.Option(
414
- False, "--yolo", "-y", help="Auto-approve all actions (non-interactive mode)."
496
+ yolo: Optional[bool] = typer.Option(
497
+ None,
498
+ "--yolo/--no-yolo",
499
+ "-y/-n",
500
+ help=(
501
+ "Auto-approve all actions (non-interactive). "
502
+ "--no-yolo / -n forces interactive mode."
503
+ ),
415
504
  ),
416
- yes: bool = typer.Option(False, "--yes", hidden=True),
417
- no_interactive: bool = typer.Option(False, "--no-interactive", hidden=True),
418
- non_interactive: bool = typer.Option(False, "--non-interactive", hidden=True),
419
505
  no_copy: bool = OPT_NO_COPY,
420
506
  plan_content: Optional[str] = typer.Option(
421
507
  None, "--plan-content", help="Plan content.", show_default=False
422
508
  ),
423
- ui_mode: Optional[bool] = OPT_UI_MODE,
424
509
  message: Optional[str] = typer.Option(
425
510
  None, "-m", "--message", help="Optional instruction for the report."
426
511
  ),
@@ -429,7 +514,6 @@ def execute( # noqa: PLR0913
429
514
  Executes a Markdown plan file (from path or clipboard) and generates an execution report.
430
515
  """
431
516
  from teddy_executor.adapters.inbound.cli_helpers import (
432
- apply_ui_mode_override,
433
517
  get_plan_content,
434
518
  handle_report_output,
435
519
  )
@@ -437,13 +521,12 @@ def execute( # noqa: PLR0913
437
521
  from teddy_executor.core.ports.inbound.run_plan_use_case import IRunPlanUseCase
438
522
 
439
523
  report: Optional[ExecutionReport] = None
440
- interactive_mode = not (yolo or yes or no_interactive or non_interactive)
441
524
  start_time = datetime.now(timezone.utc)
442
525
 
443
526
  container = get_container()
444
527
  _ensure_project_initialized(container)
445
- if ui_mode is not None:
446
- apply_ui_mode_override(container, ui_mode)
528
+ config_service = container.resolve(IConfigService)
529
+ interactive_mode = not _resolve_yolo(yolo, config_service)
447
530
 
448
531
  try:
449
532
  final_plan_content = get_plan_content(plan_content, plan_file)
@@ -241,14 +241,6 @@ def handle_report_output(
241
241
  raise typer.Exit(code=1)
242
242
 
243
243
 
244
- def apply_ui_mode_override(container: Container, ui_mode_bool: bool) -> None:
245
- """Applies a UI mode override to the container."""
246
- from teddy_executor.container import register_reviewer
247
-
248
- mode = "tui" if ui_mode_bool else "console"
249
- register_reviewer(container, ui_mode=mode)
250
-
251
-
252
244
  def prewarm_imports() -> None:
253
245
  """
254
246
  Pre-warm heavy imports to reduce first-run latency.
@@ -260,5 +252,14 @@ def prewarm_imports() -> None:
260
252
  import pyperclip # noqa: F401
261
253
  from bs4 import BeautifulSoup # noqa: F401
262
254
  from ddgs import DDGS # noqa: F401
255
+ import tiktoken # noqa: F401
256
+
257
+ try:
258
+ tiktoken.get_encoding("cl100k_base")
259
+ except Exception:
260
+ logger.warning(
261
+ "Failed to prewarm tiktoken encoding (best-effort)",
262
+ exc_info=True,
263
+ )
263
264
  except ImportError:
264
265
  pass