teddy-cli 0.1.17.dev1301__tar.gz → 0.1.17.dev1303__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +83 -72
  4. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/init_service.py +46 -12
  5. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/templates/vertical-slice.md +7 -2
  6. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/.gitignore +0 -0
  7. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/LICENSE +0 -0
  8. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/README.md +0 -0
  9. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/__init__.py +0 -0
  10. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/__main__.py +0 -0
  11. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/__init__.py +0 -0
  12. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  13. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  14. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  15. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  16. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  17. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  18. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  19. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  20. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  21. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  22. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  23. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  24. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  25. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  26. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  27. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  28. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  29. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  30. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  31. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  32. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  33. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  34. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  35. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  36. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  37. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  38. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  39. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  40. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  41. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  42. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  43. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/container.py +0 -0
  44. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/__init__.py +0 -0
  45. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/__init__.py +0 -0
  46. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  47. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  48. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  49. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  50. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  51. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  52. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  53. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/plan.py +0 -0
  54. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  55. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  56. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  57. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/session.py +0 -0
  58. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  59. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  60. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/__init__.py +0 -0
  61. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  62. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  63. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  64. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  65. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  66. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  67. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  68. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  69. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  70. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  71. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  72. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  73. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  74. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  75. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  76. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  77. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  78. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  79. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  80. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  81. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  82. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  83. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  84. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  85. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  86. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  87. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  88. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  89. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/__init__.py +0 -0
  90. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  91. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  92. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  93. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/action_executor.py +0 -0
  94. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/action_factory.py +0 -0
  95. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  96. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  97. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/context_service.py +0 -0
  98. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  99. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  100. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  101. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  102. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  103. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  104. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  105. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  106. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/plan_validator.py +0 -0
  107. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/planning_service.py +0 -0
  108. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  109. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  110. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  111. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  112. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/session_planner.py +0 -0
  113. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  114. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/session_replanner.py +0 -0
  115. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/session_repository.py +0 -0
  116. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/session_service.py +0 -0
  117. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  118. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/update_checker.py +0 -0
  119. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  120. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  121. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  122. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  123. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  124. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  125. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  126. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  127. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/utils/__init__.py +0 -0
  128. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/utils/diff.py +0 -0
  129. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  130. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/utils/io.py +0 -0
  131. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/utils/markdown.py +0 -0
  132. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/utils/paths.py +0 -0
  133. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/utils/serialization.py +0 -0
  134. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/utils/session_notices.py +0 -0
  135. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  136. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/utils/string.py +0 -0
  137. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/core/utils/terminal.py +0 -0
  138. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/prompts.py +0 -0
  139. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/registries/__init__.py +0 -0
  140. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/registries/infrastructure.py +0 -0
  141. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/registries/reviewer.py +0 -0
  142. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/registries/validators.py +0 -0
  143. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/MRP.md +0 -0
  144. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/__init__.py +0 -0
  145. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/config/__init__.py +0 -0
  146. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/config/config.yaml +0 -0
  147. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/config/init.context +0 -0
  148. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  149. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  150. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/config/prompts/debugger.md +0 -0
  151. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  152. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  153. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  154. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  155. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  156. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/templates/case-file.md +0 -0
  157. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/templates/ci.md +0 -0
  158. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/templates/component-design.md +0 -0
  159. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/templates/makefile.md +0 -0
  160. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/templates/milestone.md +0 -0
  161. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  162. {teddy_cli-0.1.17.dev1301 → teddy_cli-0.1.17.dev1303}/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.17.dev1301
3
+ Version: 0.1.17.dev1303
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.dev1301"
3
+ version = "0.1.17.dev1303"
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 = [
@@ -241,6 +241,71 @@ def _run_health_checks() -> None:
241
241
  _check_git_initialized()
242
242
 
243
243
 
244
+ def _start_background_update_check(container: Container) -> list[str]:
245
+ """Start the non-blocking version check and report the update-check keys.
246
+
247
+ Both session entry points share this preamble: it spawns the daemon
248
+ version-fetch thread, then emits the cached update notification (if any).
249
+ The returned list names the checks that fired so the shared disable-footer
250
+ can report them.
251
+ """
252
+ import threading
253
+
254
+ cache_path = find_project_root() / ".teddy" / ".update_cache.json"
255
+ thread = threading.Thread(
256
+ target=background_check,
257
+ args=(cache_path,),
258
+ daemon=True,
259
+ )
260
+ thread.start()
261
+ return _display_update_notification(container, cache_path)
262
+
263
+
264
+ def _run_startup_preamble(
265
+ container: Container,
266
+ fired: list[str],
267
+ agent: Optional[str] = None,
268
+ setup_editor: Optional[bool] = None,
269
+ setup_api_key: Optional[bool] = None,
270
+ ) -> None:
271
+ """Run the shared startup preamble for both session entry points.
272
+
273
+ The order is fixed so the banner layout cannot drift: health checks, the
274
+ ``Checking configurations...`` line, the preflight check (whose returned
275
+ keys extend ``fired``), then the shared disable-footer. ``start`` forwards
276
+ its ``agent`` so the preflight validates the agent prompt; ``resume``
277
+ leaves it ``None`` and validates no agent.
278
+ """
279
+ _run_health_checks()
280
+ typer.echo("Checking configurations...", err=True)
281
+ fired.extend(
282
+ _run_cli_preflight_check(
283
+ container,
284
+ agent=agent,
285
+ setup_editor=setup_editor,
286
+ setup_api_key=setup_api_key,
287
+ )
288
+ )
289
+ _display_checks_footer(fired)
290
+
291
+
292
+ def _handle_startup_error(container: Container, error: Exception) -> None:
293
+ """Print a startup error and exit with code 1 (shared by both entry points).
294
+
295
+ A ``ConfigurationError`` additionally prints the configuration path hint.
296
+ """
297
+ from teddy_executor.core.domain.models.exceptions import ConfigurationError
298
+
299
+ if isinstance(error, ConfigurationError):
300
+ config_service = container.resolve(IConfigService)
301
+ config_path = config_service.get_config_path()
302
+ typer.echo(f"Error: {error}", err=True)
303
+ typer.echo(f"Please update your configuration at: {config_path}", err=True)
304
+ else:
305
+ typer.echo(f"Error: {error}", err=True)
306
+ raise typer.Exit(code=1)
307
+
308
+
244
309
  def _determine_session_name(name: Optional[str], message: Optional[str]) -> str:
245
310
  """Determine session name (slugify message if name is missing)."""
246
311
  if name:
@@ -565,17 +630,7 @@ def handle_new_session( # noqa: PLR0913
565
630
  setup_api_key: Optional[bool] = None,
566
631
  ):
567
632
  """Logic for the 'start' command."""
568
- import threading
569
-
570
- # Start non-blocking background version check
571
- cache_path = find_project_root() / ".teddy" / ".update_cache.json"
572
- thread = threading.Thread(
573
- target=background_check,
574
- args=(cache_path,),
575
- daemon=True,
576
- )
577
- thread.start()
578
- fired = _display_update_notification(container, cache_path)
633
+ fired = _start_background_update_check(container)
579
634
 
580
635
  try:
581
636
  # 0. Pipeline mode requires an initial message
@@ -587,20 +642,14 @@ def handle_new_session( # noqa: PLR0913
587
642
  # 1. Ensure project is initialized
588
643
  container.resolve(IInitUseCase).ensure_initialized()
589
644
 
590
- # 2. Health checks (advisory, non-blocking)
591
- _run_health_checks()
592
-
593
- # 2. Pre-flight checks (Fail-fast before user interaction)
594
- typer.echo("Checking configurations...", err=True)
595
- fired.extend(
596
- _run_cli_preflight_check(
597
- container,
598
- agent=agent,
599
- setup_editor=setup_editor,
600
- setup_api_key=setup_api_key,
601
- )
645
+ # 2. Shared startup preamble (health checks + preflight + footer)
646
+ _run_startup_preamble(
647
+ container,
648
+ fired,
649
+ agent=agent,
650
+ setup_editor=setup_editor,
651
+ setup_api_key=setup_api_key,
602
652
  )
603
- _display_checks_footer(fired)
604
653
  _echo_config_success(container, agent, model=model)
605
654
 
606
655
  session_manager: ISessionManager = container.resolve(ISessionManager)
@@ -635,18 +684,7 @@ def handle_new_session( # noqa: PLR0913
635
684
  )
636
685
 
637
686
  except Exception as e:
638
- from teddy_executor.core.domain.models.exceptions import ConfigurationError
639
-
640
- if isinstance(e, ConfigurationError):
641
- from teddy_executor.core.ports.outbound.config_service import IConfigService
642
-
643
- config_service = container.resolve(IConfigService)
644
- config_path = config_service.get_config_path()
645
- typer.echo(f"Error: {e}", err=True)
646
- typer.echo(f"Please update your configuration at: {config_path}", err=True)
647
- else:
648
- typer.echo(f"Error: {e}", err=True)
649
- raise typer.Exit(code=1)
687
+ _handle_startup_error(container, e)
650
688
 
651
689
 
652
690
  def _echo_config_success(
@@ -1109,32 +1147,16 @@ def handle_resume_session( # noqa: PLR0913
1109
1147
  setup_api_key: Optional[bool] = None,
1110
1148
  ):
1111
1149
  """Logic for the 'resume' command."""
1112
- import threading
1113
-
1114
- # Start non-blocking background version check
1115
- cache_path = find_project_root() / ".teddy" / ".update_cache.json"
1116
- thread = threading.Thread(
1117
- target=background_check,
1118
- args=(cache_path,),
1119
- daemon=True,
1120
- )
1121
- thread.start()
1122
- fired = _display_update_notification(container, cache_path)
1150
+ fired = _start_background_update_check(container)
1123
1151
 
1124
1152
  try:
1125
- # 1. Health checks (advisory, non-blocking)
1126
- _run_health_checks()
1127
-
1128
- # 2. Pre-flight checks
1129
- typer.echo("Checking configurations...", err=True)
1130
- fired.extend(
1131
- _run_cli_preflight_check(
1132
- container,
1133
- setup_editor=setup_editor,
1134
- setup_api_key=setup_api_key,
1135
- )
1153
+ # 1. Shared startup preamble (health checks + preflight + footer)
1154
+ _run_startup_preamble(
1155
+ container,
1156
+ fired,
1157
+ setup_editor=setup_editor,
1158
+ setup_api_key=setup_api_key,
1136
1159
  )
1137
- _display_checks_footer(fired)
1138
1160
 
1139
1161
  # 2. Resolve session name
1140
1162
  session_name = _resolve_session_name(container, path)
@@ -1146,7 +1168,7 @@ def handle_resume_session( # noqa: PLR0913
1146
1168
 
1147
1169
  # 4. Display session path (below the Agent/Model identity block)
1148
1170
  session_relative_path = str(Path(".teddy") / "sessions" / session_name)
1149
- typer.echo(f"\nResuming session: {session_relative_path}")
1171
+ typer.echo(f"Resuming session: {session_relative_path}")
1150
1172
 
1151
1173
  # 5. Agent switch: if -a/--agent provided, update session agent permanently
1152
1174
  if agent:
@@ -1163,15 +1185,4 @@ def handle_resume_session( # noqa: PLR0913
1163
1185
  )
1164
1186
 
1165
1187
  except Exception as e:
1166
- from teddy_executor.core.domain.models.exceptions import ConfigurationError
1167
-
1168
- if isinstance(e, ConfigurationError):
1169
- from teddy_executor.core.ports.outbound.config_service import IConfigService
1170
-
1171
- config_service = container.resolve(IConfigService)
1172
- config_path = config_service.get_config_path()
1173
- typer.echo(f"Error: {e}", err=True)
1174
- typer.echo(f"Please update your configuration at: {config_path}", err=True)
1175
- else:
1176
- typer.echo(f"Error: {e}", err=True)
1177
- raise typer.Exit(code=1)
1188
+ _handle_startup_error(container, e)
@@ -146,6 +146,35 @@ class InitService(IInitUseCase):
146
146
  """Returns a filename's case-folded stem for identity comparison."""
147
147
  return Path(filename).stem.casefold()
148
148
 
149
+ def _present_stems(self, dest_dir: str) -> set[str]:
150
+ """Returns the case-folded stems of every entry in ``dest_dir``.
151
+
152
+ Returns an empty set when ``dest_dir`` is absent, because the file-system
153
+ adapter raises ``FileNotFoundError`` when asked to list a missing
154
+ directory. Single-sources the directory scan shared by the prompt copy
155
+ routine and the drift check.
156
+ """
157
+ if not self._file_system.path_exists(dest_dir):
158
+ return set()
159
+ return {
160
+ self._stem_key(name) for name in self._file_system.list_directory(dest_dir)
161
+ }
162
+
163
+ def _entry_is_present(
164
+ self, target_path: str, filename: str, present_stems: set[str]
165
+ ) -> bool:
166
+ """True when the exact file OR a same-stem sibling exists in the directory.
167
+
168
+ ``present_stems`` carries the case-folded stems of the directory entries,
169
+ so a same-stem file under ANY extension counts as present. An empty set
170
+ means the caller disabled stem identity or the directory holds no
171
+ same-stem entry. Single-sources the stem-membership predicate shared by
172
+ the prompt copy routine and the drift check.
173
+ """
174
+ return self._file_system.path_exists(target_path) or (
175
+ self._stem_key(filename) in present_stems
176
+ )
177
+
149
178
  def _prune_same_stem(self, dest_dir: str, filename: str) -> None:
150
179
  """Removes same-stem files with a different name (stem identity).
151
180
 
@@ -183,20 +212,11 @@ class InitService(IInitUseCase):
183
212
  stem_identity = policy.stem_identity
184
213
  if not self._file_system.path_exists(dest_dir):
185
214
  self._file_system.create_directory(dest_dir)
186
- same_stems = (
187
- {
188
- self._stem_key(name)
189
- for name in self._file_system.list_directory(dest_dir)
190
- }
191
- if stem_identity
192
- else set()
193
- )
215
+ present_stems = self._present_stems(dest_dir) if stem_identity else set()
194
216
  count = 0
195
217
  for fname in filenames:
196
218
  target_path = f"{dest_dir}/{fname}"
197
- exists = self._file_system.path_exists(target_path) or (
198
- stem_identity and self._stem_key(fname) in same_stems
199
- )
219
+ exists = self._entry_is_present(target_path, fname, present_stems)
200
220
  if not exists or (overwrite and fname not in create_only):
201
221
  content = resolve_content(fname)
202
222
  if content is not None:
@@ -353,6 +373,7 @@ class InitService(IInitUseCase):
353
373
  dest_dir: str,
354
374
  filenames: Sequence[str],
355
375
  resolve_bundled: Callable[[str], str | None],
376
+ stem_identity: bool = False,
356
377
  ) -> tuple[tuple[str, ...], tuple[str, ...]]:
357
378
  """Partitions ``filenames`` into (edited, missing) against bundled defaults.
358
379
 
@@ -360,14 +381,26 @@ class InitService(IInitUseCase):
360
381
  user copy exists, a bundled default is resolvable, and the two contents
361
382
  differ. Unresolvable bundled defaults are skipped (never reported as
362
383
  drift). Order is preserved from ``filenames`` for deterministic output.
384
+
385
+ When ``stem_identity`` is set (prompt checks only), a destination entry
386
+ sharing an entry's stem under ANY extension (e.g. a pre-migration
387
+ ``.xml``) counts as PRESENT and is reported as EDITED. Such a file
388
+ diverges from the bundled ``.md`` default, so it is not missing. This
389
+ mirrors the stem identity used by the prompt copy routine.
363
390
  """
364
391
  edited: list[str] = []
365
392
  missing: list[str] = []
393
+ present_stems = self._present_stems(dest_dir) if stem_identity else set()
366
394
  for fname in filenames:
367
395
  user_path = f"{dest_dir}/{fname}"
368
- if not self._file_system.path_exists(user_path):
396
+ if not self._entry_is_present(user_path, fname, present_stems):
369
397
  missing.append(fname)
370
398
  continue
399
+ if not self._file_system.path_exists(user_path):
400
+ # Present only as a same-stem sibling (e.g. a stale ``.xml``);
401
+ # it diverges from the bundled ``.md`` default.
402
+ edited.append(fname)
403
+ continue
371
404
  bundled_content = resolve_bundled(fname)
372
405
  if bundled_content is None:
373
406
  continue
@@ -389,6 +422,7 @@ class InitService(IInitUseCase):
389
422
  dest_dir=".teddy/prompts",
390
423
  filenames=_PROMPT_FILES,
391
424
  resolve_bundled=lambda fname: self._get_default_content(f"prompts/{fname}"),
425
+ stem_identity=True,
392
426
  )
393
427
  edited_templates, missing_templates = self._classify_drift(
394
428
  dest_dir="docs/templates",
@@ -80,5 +80,10 @@ Free-form notes recording decisions, deviations, or discoveries during implement
80
80
  <!-- Do NOT include running automated tests here; those are covered by the automated test suite. -->
81
81
 
82
82
  **Format:**
83
- - [ ] **[Title]:** Run `command <args>` and verify output contains `expected output`.
84
- - [ ] **[Title]:** Navigate to `[View/Screen]`, trigger `[Action]`, and confirm `[Observed State/Element]`.
83
+ - [ ] **Title:**
84
+ Run `command <args>`.
85
+ Verify output contains `expected output`.
86
+ - [ ] **Title:**
87
+ Navigate to `[View/Screen]`.
88
+ Trigger `[Action]`.
89
+ Confirm `[Observed State/Element]`.