teddy-cli 0.1.17.dev1420__tar.gz → 0.1.17.dev1422__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +50 -25
  4. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/templates/makefile.md +21 -16
  5. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/.gitignore +0 -0
  6. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/LICENSE +0 -0
  7. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/README.md +0 -0
  8. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/__init__.py +0 -0
  9. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/__main__.py +0 -0
  10. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/__init__.py +0 -0
  11. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  12. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  13. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  14. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  15. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  16. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  17. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  18. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  19. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  20. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  21. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  22. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  23. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  24. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  25. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  26. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  27. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  28. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  29. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  30. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  31. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  32. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  33. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  34. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  35. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  36. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  37. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  38. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  39. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  41. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  42. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/container.py +0 -0
  43. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/__init__.py +0 -0
  44. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/__init__.py +0 -0
  45. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  46. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  47. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  48. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/config_schema.py +0 -0
  49. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  50. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  51. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  52. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  53. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/plan.py +0 -0
  54. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  55. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  56. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  57. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/session.py +0 -0
  58. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  59. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  60. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/__init__.py +0 -0
  61. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  62. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  63. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  64. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  65. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  66. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  67. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  68. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  69. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  70. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  71. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  72. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  73. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  74. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  75. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  76. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  77. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  78. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  79. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  80. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  81. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  82. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  83. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  84. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  85. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  86. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  87. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  88. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  89. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/__init__.py +0 -0
  90. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  91. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  92. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  93. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/action_executor.py +0 -0
  94. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/action_factory.py +0 -0
  95. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  96. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  97. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/context_service.py +0 -0
  98. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  99. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  100. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  101. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/init_service.py +0 -0
  102. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  103. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  104. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  105. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  106. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  107. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/plan_validator.py +0 -0
  108. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/planning_service.py +0 -0
  109. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  110. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  111. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  112. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  113. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/session_planner.py +0 -0
  114. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  115. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/session_replanner.py +0 -0
  116. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/session_repository.py +0 -0
  117. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/session_service.py +0 -0
  118. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  119. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/update_checker.py +0 -0
  120. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  121. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  122. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  123. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  124. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  125. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  126. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  127. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  128. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/__init__.py +0 -0
  129. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/diff.py +0 -0
  130. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/editor_names.py +0 -0
  131. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  132. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/interruptible_call.py +0 -0
  133. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/io.py +0 -0
  134. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/markdown.py +0 -0
  135. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/paths.py +0 -0
  136. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/serialization.py +0 -0
  137. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/session_notices.py +0 -0
  138. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  139. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/string.py +0 -0
  140. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/core/utils/terminal.py +0 -0
  141. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/prompts.py +0 -0
  142. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/registries/__init__.py +0 -0
  143. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/registries/infrastructure.py +0 -0
  144. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/registries/reviewer.py +0 -0
  145. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/registries/validators.py +0 -0
  146. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/MRP.md +0 -0
  147. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/__init__.py +0 -0
  148. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/config/__init__.py +0 -0
  149. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/config/config.yaml +0 -0
  150. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/config/init.context +0 -0
  151. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  152. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  153. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/config/prompts/debugger.md +0 -0
  154. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  155. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  156. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  157. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  158. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  159. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/templates/case-file.md +0 -0
  160. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/templates/ci.md +0 -0
  161. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/templates/component-design.md +0 -0
  162. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/templates/milestone.md +0 -0
  163. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  164. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  165. {teddy_cli-0.1.17.dev1420 → teddy_cli-0.1.17.dev1422}/src/teddy_executor/resources/templates/vertical-slice.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: teddy-cli
3
- Version: 0.1.17.dev1420
3
+ Version: 0.1.17.dev1422
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.dev1420"
3
+ version = "0.1.17.dev1422"
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 = [
@@ -287,6 +287,9 @@ _PULL_SKIPPED_WARNING = "⚠ Workspace pull skipped; continuing with the current
287
287
  _PULL_TIMEOUT_WARNING = "⚠ Workspace pull timed out; continuing without it."
288
288
  _PULL_GIT_UNAVAILABLE_WARNING = "⚠ Workspace pull skipped; git is unavailable."
289
289
  _PULL_UP_TO_DATE_NOTICE = "✓ Workspace up-to-date with remote"
290
+ _PULL_IN_PROGRESS_NOTICE = "✓ Workspace pull skipped; Git operation in progress"
291
+ _PULL_DETACHED_HEAD_NOTICE = "✓ Workspace pull skipped; detached HEAD"
292
+ _PULL_NO_UPSTREAM_NOTICE = "✓ Workspace pull skipped; no upstream branch"
290
293
  _IN_PROGRESS_GIT_MARKERS = (
291
294
  "rebase-merge",
292
295
  "rebase-apply",
@@ -304,6 +307,15 @@ def _warn_pull(message: str) -> None:
304
307
  typer.secho(message, fg=typer.colors.YELLOW, err=True)
305
308
 
306
309
 
310
+ def _notice_pull(message: str) -> None:
311
+ """Print one green pull notice.
312
+
313
+ The checkmark line joins the startup block, so it carries no trailing
314
+ blank and never uses the warning color.
315
+ """
316
+ typer.secho(message, fg=typer.colors.GREEN, err=True)
317
+
318
+
307
319
  def _pull_workspace_on_start(
308
320
  config_service: IConfigService,
309
321
  run_func: Optional[Callable[..., Any]] = None,
@@ -313,10 +325,11 @@ def _pull_workspace_on_start(
313
325
  The pull runs only when ``workspace.pull`` is enabled and the workspace is
314
326
  a Git repository, so a disabled toggle or a non-repository directory stays
315
327
  silent. A detached HEAD, a missing upstream, or an in-progress operation
316
- also stays silent, because there is nothing safe to fast-forward. A dirty
317
- worktree, a failed pull, a timeout, or an unavailable git binary reports
318
- one warning and leaves the workspace unchanged. A successful fast-forward
319
- names the number of commits it moved.
328
+ reports one checkmark notice, because the user needs a pull outcome on
329
+ every run. A dirty worktree, a failed pull, a timeout, or an unavailable
330
+ git binary reports one warning and leaves the workspace unchanged. A
331
+ successful fast-forward names the number of commits it moved, and a pull
332
+ that moves no commit confirms the workspace is up to date.
320
333
 
321
334
  The Git process is injected through ``run_func`` so every decision is
322
335
  testable without spawning a real repository.
@@ -339,12 +352,16 @@ def _fast_forward_workspace(git_run: Callable[..., Any]) -> None:
339
352
 
340
353
  Each precondition is probed before the pull so an unsafe state never
341
354
  reaches ``git pull``. A dirty worktree reports one warning, while every
342
- other unsafe state stays silent because it has nothing to report.
355
+ other unsafe state reports one checkmark notice so the user always sees a
356
+ pull outcome.
343
357
  """
344
- skip_reason = _pull_skip_reason(git_run)
345
- if skip_reason is not None:
346
- if skip_reason:
347
- _warn_pull(skip_reason)
358
+ skip = _pull_skip_reason(git_run)
359
+ if skip is not None:
360
+ message, is_warning = skip
361
+ if is_warning:
362
+ _warn_pull(message)
363
+ else:
364
+ _notice_pull(message)
348
365
  return
349
366
  before = _read_head(git_run)
350
367
  result = git_run(
@@ -360,30 +377,33 @@ def _fast_forward_workspace(git_run: Callable[..., Any]) -> None:
360
377
  _report_fast_forward(git_run, before, _read_head(git_run))
361
378
 
362
379
 
363
- def _pull_skip_reason(git_run: Callable[..., Any]) -> Optional[str]:
364
- """Return the outcome text to print, or None when the pull may proceed.
380
+ def _pull_skip_reason(
381
+ git_run: Callable[..., Any],
382
+ ) -> Optional[tuple[str, bool]]:
383
+ """Return the outcome text and severity, or None when the pull may proceed.
365
384
 
366
- An empty string marks a silent skip, because the workspace holds no safe
367
- fast-forward and reporting it would only add noise. A dirty worktree
368
- returns the skipped warning, because tracked changes can conflict.
385
+ Each unsafe state names its own reason, because the user needs a pull
386
+ outcome on every run. The boolean marks a warning (``True``) versus a
387
+ checkmark notice (``False``). A dirty worktree returns the skipped
388
+ warning, because tracked changes can conflict.
369
389
  """
370
390
  git_dir = Path.cwd() / ".git"
371
391
  if any((git_dir / marker).exists() for marker in _IN_PROGRESS_GIT_MARKERS):
372
- return ""
392
+ return _PULL_IN_PROGRESS_NOTICE, False
373
393
  detached = git_run(
374
394
  ["git", "symbolic-ref", "-q", "HEAD"],
375
395
  capture_output=True,
376
396
  timeout=_GIT_PULL_TIMEOUT_SECONDS,
377
397
  )
378
398
  if detached.returncode != 0:
379
- return ""
399
+ return _PULL_DETACHED_HEAD_NOTICE, False
380
400
  upstream = git_run(
381
401
  ["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"],
382
402
  capture_output=True,
383
403
  timeout=_GIT_PULL_TIMEOUT_SECONDS,
384
404
  )
385
405
  if upstream.returncode != 0:
386
- return ""
406
+ return _PULL_NO_UPSTREAM_NOTICE, False
387
407
  status = git_run(
388
408
  ["git", "status", "--porcelain"],
389
409
  capture_output=True,
@@ -396,7 +416,7 @@ def _pull_skip_reason(git_run: Callable[..., Any]) -> Optional[str]:
396
416
  if line and not line.startswith("??")
397
417
  ]
398
418
  if tracked_changes:
399
- return _PULL_SKIPPED_WARNING
419
+ return _PULL_SKIPPED_WARNING, True
400
420
  return None
401
421
 
402
422
 
@@ -774,10 +794,10 @@ def _display_drift_notification(container: Container) -> list[str]:
774
794
  fired.append("checks.templates")
775
795
 
776
796
  if drift_lines:
777
- # The notices sit directly under ``Checking configurations...``. The
778
- # lines carry no trailing newline, so the shared disable-footer
779
- # (emitted next) abuts the final drift line.
780
- typer.echo("\n".join(drift_lines))
797
+ # Stderr keeps the notices in the startup banner order even when the
798
+ # run is redirected. The lines carry no trailing newline, so the
799
+ # shared disable-footer (emitted next) abuts the final drift line.
800
+ typer.echo("\n".join(drift_lines), err=True)
781
801
 
782
802
  return fired
783
803
 
@@ -797,10 +817,14 @@ def _display_checks_footer(keys: list[str]) -> None:
797
817
  ordered = [key for key in canonical if key in unique]
798
818
 
799
819
  if len(ordered) == 1:
800
- typer.echo(f"You can disable this check in .teddy/config.yaml: {ordered[0]}.")
820
+ typer.echo(
821
+ f"You can disable this check in .teddy/config.yaml: {ordered[0]}.",
822
+ err=True,
823
+ )
801
824
  else:
802
825
  typer.echo(
803
- f"You can disable these checks in .teddy/config.yaml: {', '.join(ordered)}."
826
+ f"You can disable these checks in .teddy/config.yaml: {', '.join(ordered)}.",
827
+ err=True,
804
828
  )
805
829
 
806
830
 
@@ -838,7 +862,8 @@ def _display_update_notification(container: Container, cache_path: Path) -> list
838
862
  f"ℹ A new version {latest} is available. "
839
863
  f"To upgrade, run: {command}\n",
840
864
  fg=typer.colors.YELLOW,
841
- )
865
+ ),
866
+ err=True,
842
867
  )
843
868
  return ["checks.update"]
844
869
  except Exception:
@@ -202,7 +202,7 @@ Attribution is deterministic: SHA → run → run-level + per-job conclusion (ne
202
202
 
203
203
  Key behaviors:
204
204
 
205
- 1. **Automatic SHA and BASE resolution.** `SHA` defaults to current `HEAD` (or `COMMIT=<sha>`), and `BASE` resolves per workflow to the most recent ancestor of `SHA` that carries a run for that workflow (bounded by `BASE_DEPTH`, default 50). An explicit `BASE=<sha>` pins the baseline verbatim and skips resolution; if the pinned commit carries no run for the workflow, the target fails safe as an unknown base.
205
+ 1. **Automatic SHA and BASE resolution.** `SHA` defaults to current `HEAD` (or `COMMIT=<sha>`), and `BASE` resolves per workflow to the most recent ancestor of `SHA` that carries a run for that workflow. The target fetches one bounded list of the workflow's latest runs (`BASE_SCAN`, default 200) and intersects it with the newest `BASE_DEPTH` ancestors (`git rev-list`, default 50), so resolution costs one API call instead of one per ancestor. An explicit `BASE=<sha>` pins the baseline verbatim and skips resolution; if the pinned commit carries no run for the workflow, the target fails safe as an unknown base.
206
206
  2. **Registration lag is tolerated by a bounded retry.** CI can fail to register a run for the pushed SHA immediately. The target polls `gh run list --commit <sha>` up to `RETRY_POLLS × RETRY_SLEEP` (default 10 × 2s ≈ 20s) before attributing. It fails safe if the run never registers.
207
207
  3. **No CI is non-blocking.** If the repository has no workflow files under `.github/workflows/` (`*.yml`/`*.yaml`), the target logs `No CI configured - skipping attribution` and exits 0.
208
208
  4. **Workflow names with spaces stay whole.** The target reads workflow names one line at a time. A name such as `Publish to PyPI` is attributed as one workflow.
@@ -214,6 +214,7 @@ RETRY_POLLS ?= 10
214
214
  RETRY_SLEEP ?= 2
215
215
  DETAIL_LINES ?= 50
216
216
  BASE_DEPTH ?= 50
217
+ BASE_SCAN ?= 200
217
218
  BASE ?=
218
219
 
219
220
  ci-watch: _preflight
@@ -250,9 +251,10 @@ ci-watch: _preflight
250
251
  while IFS= read -r WF; do \
251
252
  NEW=$$(gh run list --commit "$$SHA" --workflow "$$WF" --json databaseId --jq '.[0].databaseId'); \
252
253
  gh run watch "$$NEW" --exit-status >/dev/null 2>&1 || true; \
253
- NEWCONC=$$(gh run view "$$NEW" --json conclusion --jq '.conclusion'); \
254
- NEWFAIL=$$(gh run view "$$NEW" --json jobs --jq '[.jobs[] | select(.conclusion=="failure") | .name] | sort | join(",")'); \
255
- NEWSTEPS=$$(gh run view "$$NEW" --json jobs --jq '[.jobs[] | select(.conclusion=="failure") | .steps[]? | select(.conclusion=="failure") | .name] | sort | join(", ")'); \
254
+ NEWMETA=$$(gh run view "$$NEW" --json conclusion,jobs --jq '.conclusion, ([.jobs[] | select(.conclusion=="failure") | .name] | sort | join(",")), ([.jobs[] | select(.conclusion=="failure") | .steps[]? | select(.conclusion=="failure") | .name] | sort | join(", "))'); \
255
+ NEWCONC=$$(printf '%s\n' "$$NEWMETA" | sed -n '1p'); \
256
+ NEWFAIL=$$(printf '%s\n' "$$NEWMETA" | sed -n '2p'); \
257
+ NEWSTEPS=$$(printf '%s\n' "$$NEWMETA" | sed -n '3p'); \
256
258
  if [ -n "$$NEWSTEPS" ]; then \
257
259
  echo "$$WF: failing step(s): $$NEWSTEPS (run $$NEW)"; \
258
260
  gh run view "$$NEW" --log-failed 2>/dev/null | awk -F'\t' '{ l=$$3; p=index(l,"Z "); if(p>0)l=substr(l,p+2); gsub(/\x1B\[[0-9;]*[a-zA-Z]/,"",l); gsub(/\^\[\[[0-9;]*[a-zA-Z]/,"",l); if(l ~ /^##\[group\]/ || l ~ /^##\[endgroup\]/) next; gsub(/^##\[error\]/,"Error: ",l); print l }' | tail -n $(DETAIL_LINES) | sed 's/^/ /'; \
@@ -272,33 +274,36 @@ ci-watch: _preflight
272
274
  echo "$$WF: unknown conclusion '$$NEWCONC' on run $$NEW blocks the session." >&2; \
273
275
  STATUS=1; continue; \
274
276
  fi; \
275
- BASE="$(BASE)"; CUR="$$SHA"; DEPTH=0; \
276
- while [ -z "$$BASE" ] && [ $$DEPTH -lt $(BASE_DEPTH) ]; do \
277
- CUR=$$(git rev-parse "$$CUR~1" 2>/dev/null) || break; \
278
- [ -n "$$CUR" ] || break; \
279
- if [ -n "$$(gh run list --commit "$$CUR" --workflow "$$WF" --json databaseId --jq '.[0].databaseId')" ]; then \
280
- BASE="$$CUR"; break; \
281
- fi; \
282
- DEPTH=$$((DEPTH + 1)); \
283
- done; \
277
+ BASE="$(BASE)"; OLD=""; \
278
+ if [ -n "$$BASE" ]; then \
279
+ OLD=$$(gh run list --commit "$$BASE" --workflow "$$WF" --json databaseId --jq '.[0].databaseId'); \
280
+ else \
281
+ RUNLIST=$${TMPDIR:-/tmp}/ci-watch-runs.$$$$; \
282
+ gh run list --workflow "$$WF" -L $(BASE_SCAN) --json headSha,databaseId --jq '.[] | "\(.headSha) \(.databaseId)"' > "$$RUNLIST" 2>/dev/null; \
283
+ for CUR in $$(git rev-list -n $(BASE_DEPTH) "$$SHA^" 2>/dev/null); do \
284
+ OLD=$$(awk -v sha="$$CUR" '$$1 == sha { print $$2; exit }' "$$RUNLIST"); \
285
+ if [ -n "$$OLD" ]; then BASE="$$CUR"; break; fi; \
286
+ done; \
287
+ rm -f "$$RUNLIST"; \
288
+ fi; \
284
289
  if [ -z "$$BASE" ]; then \
285
290
  echo "$$WF: BLOCKING failure ($$NEWFAIL) - no run-bearing ancestor (unknown base) - YOUR regression"; \
286
291
  echo "$$WF: no run-bearing ancestor within $(BASE_DEPTH) commits, so the baseline is unknown." >&2; \
287
292
  STATUS=1; continue; \
288
293
  fi; \
289
- OLD=$$(gh run list --commit "$$BASE" --workflow "$$WF" --json databaseId --jq '.[0].databaseId'); \
290
294
  if [ -z "$$OLD" ]; then \
291
295
  echo "$$WF: BLOCKING failure ($$NEWFAIL) - pinned base has no run (unknown base) - YOUR regression"; \
292
296
  echo "$$WF: pinned base $$BASE carries no run for this workflow." >&2; \
293
297
  STATUS=1; continue; \
294
298
  fi; \
295
- OLDJOBS=$$(gh run view "$$OLD" --json jobs --jq '.jobs | length'); \
299
+ OLDMETA=$$(gh run view "$$OLD" --json jobs --jq '(.jobs | length), ([.jobs[] | select(.conclusion=="failure") | .name] | sort | join(","))'); \
300
+ OLDJOBS=$$(printf '%s\n' "$$OLDMETA" | sed -n '1p'); \
296
301
  if [ "$$OLDJOBS" = "0" ]; then \
297
302
  echo "$$WF: BLOCKING failure ($$NEWFAIL) - base run is job-less (invalid workflow, not green) - YOUR regression"; \
298
303
  echo "$$WF: base run $$OLD carries zero jobs, so it cannot prove a green baseline." >&2; \
299
304
  STATUS=1; continue; \
300
305
  fi; \
301
- OLDFAIL=$$(gh run view "$$OLD" --json jobs --jq '[.jobs[] | select(.conclusion=="failure") | .name] | sort | join(",")'); \
306
+ OLDFAIL=$$(printf '%s\n' "$$OLDMETA" | sed -n '2p'); \
302
307
  SUBSET=$$(awk -v new="$$NEWFAIL" -v old="$$OLDFAIL" 'BEGIN { n=split(new,na,","); m=split(old,oa,","); for (i=1;i<=n;i++) { if (na[i]=="") continue; f=0; for (j=1;j<=m;j++) { if (oa[j]==na[i]) { f=1; break } } if (!f) { print "regression"; exit } } print "pre-existing" }' </dev/null); \
303
308
  if [ "$$SUBSET" = "pre-existing" ]; then \
304
309
  echo "$$WF: pre-existing BLOCKING failure ($$NEWFAIL) - not yours"; \