teddy-cli 0.1.16.dev1150__tar.gz → 0.1.16.dev1152__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 (157) hide show
  1. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/__main__.py +7 -0
  4. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +6 -1
  5. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +12 -0
  6. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/file_system_manager.py +9 -0
  7. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/session_manager.py +8 -0
  8. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_service.py +84 -35
  9. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/.gitignore +0 -0
  10. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/LICENSE +0 -0
  11. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/__init__.py +0 -0
  12. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/__init__.py +0 -0
  13. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  14. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  15. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  16. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  17. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  18. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  19. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  20. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  21. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  22. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  23. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  24. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  25. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  26. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  27. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  28. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  29. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  30. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  31. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  32. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  33. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  34. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  35. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  36. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  37. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  38. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  39. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  40. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  41. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  42. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  43. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/container.py +0 -0
  44. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/__init__.py +0 -0
  45. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/__init__.py +0 -0
  46. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  47. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  48. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  49. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  50. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  51. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  52. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/plan.py +0 -0
  53. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  54. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  55. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  56. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/session.py +0 -0
  57. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  58. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  59. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/__init__.py +0 -0
  60. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  61. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  62. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  63. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  64. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  65. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  66. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  67. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  68. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  69. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  70. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  71. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  72. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  73. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  74. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  75. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  76. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  77. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  78. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  79. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  80. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  81. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  82. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  83. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  84. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  85. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  86. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/__init__.py +0 -0
  87. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  88. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  89. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  90. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_executor.py +0 -0
  91. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_factory.py +0 -0
  92. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  93. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  94. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/context_service.py +0 -0
  95. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  96. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  97. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  98. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/init_service.py +0 -0
  99. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  100. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  101. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  102. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  103. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  104. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/plan_validator.py +0 -0
  105. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/planning_service.py +0 -0
  106. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  107. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  108. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  109. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  110. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_planner.py +0 -0
  111. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  112. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_replanner.py +0 -0
  113. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_repository.py +0 -0
  114. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  115. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/update_checker.py +0 -0
  116. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  117. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  118. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  119. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  120. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  121. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  122. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  123. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  124. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/__init__.py +0 -0
  125. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/diff.py +0 -0
  126. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  127. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/io.py +0 -0
  128. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/markdown.py +0 -0
  129. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/serialization.py +0 -0
  130. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  131. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/string.py +0 -0
  132. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/terminal.py +0 -0
  133. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/prompts.py +0 -0
  134. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/registries/__init__.py +0 -0
  135. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/registries/infrastructure.py +0 -0
  136. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/registries/reviewer.py +0 -0
  137. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/registries/validators.py +0 -0
  138. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/__init__.py +0 -0
  139. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/__init__.py +0 -0
  140. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/config.yaml +0 -0
  141. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/init.context +0 -0
  142. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/architect.xml +0 -0
  143. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/assistant.xml +0 -0
  144. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/debugger.xml +0 -0
  145. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/developer.xml +0 -0
  146. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/pathfinder.xml +0 -0
  147. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/prototyper.xml +0 -0
  148. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  149. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/MM-NN-vertical-slice.md +0 -0
  150. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/MM-milestone.md +0 -0
  151. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/NN-case-file.md +0 -0
  152. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/NN-task-brief.md +0 -0
  153. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  154. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/ci.md +0 -0
  155. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/component-design.md +0 -0
  156. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/makefile.md +0 -0
  157. {teddy_cli-0.1.16.dev1150 → teddy_cli-0.1.16.dev1152}/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.16.dev1150
3
+ Version: 0.1.16.dev1152
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.16.dev1150"
3
+ version = "0.1.16.dev1152"
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" }
@@ -447,6 +447,12 @@ def resume( # noqa: PLR0913
447
447
  api_key: Optional[str] = typer.Option(
448
448
  None, "--api-key", help="LLM API key override."
449
449
  ),
450
+ agent: Optional[str] = typer.Option(
451
+ None,
452
+ "--agent",
453
+ "-a",
454
+ help="Switch to a different agent persona for this session.",
455
+ ),
450
456
  message: Optional[str] = typer.Option(
451
457
  None,
452
458
  "--message",
@@ -483,6 +489,7 @@ def resume( # noqa: PLR0913
483
489
  model=model,
484
490
  provider=provider,
485
491
  api_key=api_key,
492
+ agent=agent,
486
493
  message=message,
487
494
  pipeline=pipeline,
488
495
  )
@@ -964,6 +964,7 @@ def handle_resume_session( # noqa: PLR0913
964
964
  model: Optional[str] = None,
965
965
  provider: Optional[str] = None,
966
966
  api_key: Optional[str] = None,
967
+ agent: Optional[str] = None,
967
968
  message: Optional[str] = None,
968
969
  pipeline: bool = False,
969
970
  setup_editor: Optional[bool] = None,
@@ -1006,7 +1007,11 @@ def handle_resume_session( # noqa: PLR0913
1006
1007
  container, session_name, model=model, provider=provider, api_key=api_key
1007
1008
  )
1008
1009
 
1009
- # 5. Enter the session loop
1010
+ # 5. Agent switch: if -a/--agent provided, update session agent permanently
1011
+ if agent:
1012
+ container.resolve(ISessionManager).set_session_agent(session_name, agent)
1013
+
1014
+ # 6. Enter the session loop
1010
1015
  _orchestrate_session_loop(
1011
1016
  container=container,
1012
1017
  session_name=session_name,
@@ -306,6 +306,18 @@ class LocalFileSystemAdapter(IFileSystemManager):
306
306
  except IOError as e:
307
307
  raise IOError(f"Failed to read raw file at {path}: {e}") from e
308
308
 
309
+ def remove_file(self, path: str) -> None:
310
+ """
311
+ Deletes a file from the file system.
312
+ """
313
+ file_path = self._resolve_path(path)
314
+ try:
315
+ file_path.unlink()
316
+ except FileNotFoundError:
317
+ raise
318
+ except OSError as e:
319
+ raise OSError(f"Failed to remove file at {path}: {e}") from e
320
+
309
321
  def edit_file(
310
322
  self,
311
323
  path: str,
@@ -86,6 +86,15 @@ class IFileSystemManager(Protocol):
86
86
  """
87
87
  ...
88
88
 
89
+ def remove_file(self, path: str) -> None:
90
+ """
91
+ Deletes a file from the file system.
92
+
93
+ Raises:
94
+ FileNotFoundError: If no file exists at the specified path.
95
+ """
96
+ ...
97
+
89
98
  def edit_file(
90
99
  self,
91
100
  path: str,
@@ -117,3 +117,11 @@ class ISessionManager(Protocol):
117
117
  finalization can still be preserved.
118
118
  """
119
119
  ...
120
+
121
+ def set_session_agent(self, session_name: str, agent_name: str) -> None:
122
+ """
123
+ Permanently changes the session's agent. Updates meta.yaml
124
+ with the new agent_name and replaces the session's prompt
125
+ XML with the new agent's prompt from .teddy/prompts/.
126
+ """
127
+ ...
@@ -62,41 +62,7 @@ class SessionService(ISessionManager):
62
62
  )
63
63
 
64
64
  # 2. Prompt population — read from .teddy/prompts/ (canonical source)
65
- prompts_dir = ".teddy/prompts"
66
- if not self._file_system_manager.path_exists(prompts_dir):
67
- available = self._prompt_manager.get_available_agents()
68
- if available:
69
- msg = (
70
- f"Agent prompt '{options.agent_name}' not found in .teddy/prompts/. "
71
- f"Available agents: {', '.join(available)}"
72
- )
73
- else:
74
- msg = (
75
- f"Agent prompt '{options.agent_name}' not found in .teddy/prompts/. "
76
- "Please run 'teddy init' to restore prompts."
77
- )
78
- raise ValueError(msg)
79
- # Find the prompt file with the agent name (any extension)
80
- prompt_filename = None
81
- for f in self._file_system_manager.list_directory(prompts_dir):
82
- if Path(f).stem.casefold() == options.agent_name.casefold():
83
- prompt_filename = f
84
- break
85
- if prompt_filename is None:
86
- available = self._prompt_manager.get_available_agents()
87
- if available:
88
- msg = (
89
- f"Agent prompt '{options.agent_name}' not found in .teddy/prompts/. "
90
- f"Available agents: {', '.join(available)}"
91
- )
92
- else:
93
- msg = (
94
- f"Agent prompt '{options.agent_name}' not found in .teddy/prompts/. "
95
- "Please run 'teddy init' to restore prompts."
96
- )
97
- raise ValueError(msg)
98
- prompt_path = f"{prompts_dir}/{prompt_filename}"
99
- prompt_content = self._file_system_manager.read_file(prompt_path)
65
+ prompt_filename, prompt_content = self._resolve_agent_prompt(options.agent_name)
100
66
  self._file_system_manager.write_file(
101
67
  f"{session_root}/{prompt_filename}", prompt_content
102
68
  )
@@ -167,6 +133,55 @@ class SessionService(ISessionManager):
167
133
  meta_data["api_key"] = options.api_key
168
134
  return meta_data
169
135
 
136
+ def _resolve_agent_prompt(self, agent_name: str) -> tuple[str, str]:
137
+ """
138
+ Resolves an agent's prompt file from .teddy/prompts/ via casefold stem matching.
139
+
140
+ Returns:
141
+ (prompt_filename, prompt_content)
142
+
143
+ Raises:
144
+ ValueError: If the prompts directory is missing or no matching prompt exists.
145
+ """
146
+ prompts_dir = ".teddy/prompts"
147
+ if not self._file_system_manager.path_exists(prompts_dir):
148
+ available = self._prompt_manager.get_available_agents()
149
+ if available:
150
+ msg = (
151
+ f"Agent prompt '{agent_name}' not found in .teddy/prompts/. "
152
+ f"Available agents: {', '.join(available)}"
153
+ )
154
+ else:
155
+ msg = (
156
+ f"Agent prompt '{agent_name}' not found in .teddy/prompts/. "
157
+ "Please run 'teddy init' to restore prompts."
158
+ )
159
+ raise ValueError(msg)
160
+
161
+ prompt_filename = None
162
+ for f in self._file_system_manager.list_directory(prompts_dir):
163
+ if Path(f).stem.casefold() == agent_name.casefold():
164
+ prompt_filename = f
165
+ break
166
+
167
+ if prompt_filename is None:
168
+ available = self._prompt_manager.get_available_agents()
169
+ if available:
170
+ msg = (
171
+ f"Agent prompt '{agent_name}' not found in .teddy/prompts/. "
172
+ f"Available agents: {', '.join(available)}"
173
+ )
174
+ else:
175
+ msg = (
176
+ f"Agent prompt '{agent_name}' not found in .teddy/prompts/. "
177
+ "Please run 'teddy init' to restore prompts."
178
+ )
179
+ raise ValueError(msg)
180
+
181
+ prompt_path = f"{prompts_dir}/{prompt_filename}"
182
+ prompt_content = self._file_system_manager.read_file(prompt_path)
183
+ return prompt_filename, prompt_content
184
+
170
185
  def get_latest_turn(self, session_name: str) -> str:
171
186
  """
172
187
  Identifies and returns the latest turn directory in the specified session.
@@ -505,6 +520,40 @@ class SessionService(ISessionManager):
505
520
  """Resolves a session name from a given path."""
506
521
  return self._repository.resolve_session_from_path(path)
507
522
 
523
+ def set_session_agent(self, session_name: str, agent_name: str) -> None:
524
+ """
525
+ Permanently changes the session's agent. Updates meta.yaml
526
+ with the new agent_name and replaces the session's prompt
527
+ XML with the new agent's prompt from .teddy/prompts/.
528
+ """
529
+ session_root = f".teddy/sessions/{session_name}"
530
+ latest_turn_path = self.get_latest_turn(session_name)
531
+
532
+ # 1. Update meta.yaml
533
+ meta = self.load_turn_meta(latest_turn_path)
534
+ meta["agent_name"] = agent_name
535
+ self.save_turn_meta(latest_turn_path, meta)
536
+
537
+ # 2. Find new prompt in .teddy/prompts/ (mirrors create_session pattern)
538
+ prompt_filename, prompt_content = self._resolve_agent_prompt(agent_name)
539
+
540
+ # 3. Write prompt to session root (overwrite any existing file with same stem)
541
+ self._file_system_manager.write_file(
542
+ f"{session_root}/{prompt_filename}", prompt_content
543
+ )
544
+
545
+ # 4. Remove stale prompt files (any file in session root whose stem matches a
546
+ # known prompt from .teddy/prompts/ but whose stem does not match the new agent)
547
+ known_prompt_stems = {
548
+ Path(f).stem.casefold()
549
+ for f in self._file_system_manager.list_directory(".teddy/prompts")
550
+ }
551
+ new_agent_stem = agent_name.casefold()
552
+ for f in self._file_system_manager.list_directory(session_root):
553
+ stem = Path(f).stem.casefold()
554
+ if stem in known_prompt_stems and stem != new_agent_stem:
555
+ self._file_system_manager.remove_file(f"{session_root}/{f}")
556
+
508
557
  def _resolve_next_turn_path(self, cur_dir: Path) -> tuple[str, Path]:
509
558
  """Determines the next turn ID and session directory (same session)."""
510
559
  next_id = f"{int(cur_dir.name) + 1:02d}"