teddy-cli 0.1.17.dev1407__tar.gz → 0.1.17.dev1409__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.dev1407 → teddy_cli-0.1.17.dev1409}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/__main__.py +3 -2
  4. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +47 -24
  5. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/config_schema.py +4 -2
  6. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +10 -0
  7. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/context_service.py +9 -0
  8. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/registries/infrastructure.py +6 -2
  9. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/config/config.yaml +11 -7
  10. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/.gitignore +0 -0
  11. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/LICENSE +0 -0
  12. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/README.md +0 -0
  13. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/__init__.py +0 -0
  14. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/__init__.py +0 -0
  15. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  16. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  17. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  18. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -0
  19. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  20. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  21. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  22. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  23. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  24. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  25. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  26. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  27. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  28. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  29. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  30. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  31. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  32. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  33. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  34. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  35. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  36. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  37. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  38. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  39. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  41. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  42. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  43. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  44. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  45. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  46. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/container.py +0 -0
  47. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/__init__.py +0 -0
  48. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/__init__.py +0 -0
  49. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  50. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  51. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  52. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  53. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  54. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  55. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  56. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/plan.py +0 -0
  57. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  58. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  59. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  60. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/session.py +0 -0
  61. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  62. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  63. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/__init__.py +0 -0
  64. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  65. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  66. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  67. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  68. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  69. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  70. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  71. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  72. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  73. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  74. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  75. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  76. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  77. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  78. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  79. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  80. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  81. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  82. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  83. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  84. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  85. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  86. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  87. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  88. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  89. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  90. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  91. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/__init__.py +0 -0
  92. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  93. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  94. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  95. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/action_executor.py +0 -0
  96. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/action_factory.py +0 -0
  97. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  98. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  99. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  100. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  101. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  102. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/init_service.py +0 -0
  103. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  104. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  105. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  106. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  107. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  108. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/plan_validator.py +0 -0
  109. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/planning_service.py +0 -0
  110. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  111. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  112. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  113. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  114. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/session_planner.py +0 -0
  115. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  116. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/session_replanner.py +0 -0
  117. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/session_repository.py +0 -0
  118. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/session_service.py +0 -0
  119. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  120. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/update_checker.py +0 -0
  121. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  122. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  123. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  124. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  125. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  126. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  127. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  128. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  129. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/__init__.py +0 -0
  130. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/diff.py +0 -0
  131. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/editor_names.py +0 -0
  132. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  133. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/interruptible_call.py +0 -0
  134. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/io.py +0 -0
  135. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/markdown.py +0 -0
  136. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/paths.py +0 -0
  137. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/serialization.py +0 -0
  138. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/session_notices.py +0 -0
  139. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  140. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/string.py +0 -0
  141. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/core/utils/terminal.py +0 -0
  142. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/prompts.py +0 -0
  143. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/registries/__init__.py +0 -0
  144. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/registries/reviewer.py +0 -0
  145. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/registries/validators.py +0 -0
  146. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/MRP.md +0 -0
  147. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/__init__.py +0 -0
  148. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/config/__init__.py +0 -0
  149. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/config/init.context +0 -0
  150. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  151. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  152. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/config/prompts/debugger.md +0 -0
  153. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  154. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  155. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  156. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  157. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  158. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/templates/case-file.md +0 -0
  159. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/templates/ci.md +0 -0
  160. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/templates/component-design.md +0 -0
  161. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/templates/makefile.md +0 -0
  162. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/templates/milestone.md +0 -0
  163. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  164. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  165. {teddy_cli-0.1.17.dev1407 → teddy_cli-0.1.17.dev1409}/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.dev1407
3
+ Version: 0.1.17.dev1409
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.dev1407"
3
+ version = "0.1.17.dev1409"
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 = [
@@ -193,8 +193,9 @@ def _ensure_project_initialized(container, root_dir: str | None = None) -> None:
193
193
  IRepoTreeGenerator,
194
194
  factory=lambda: LocalRepoTreeGenerator(
195
195
  root_dir=root,
196
- max_depth=c.resolve(IConfigService).get_setting(
197
- "context.max_tree_depth", 4
196
+ max_depth=c.resolve(IConfigService).get_setting("context.max_depth", 3),
197
+ max_children=c.resolve(IConfigService).get_setting(
198
+ "context.max_children", 20
198
199
  ),
199
200
  ),
200
201
  scope=Scope.transient,
@@ -6,7 +6,7 @@ from teddy_executor.core.ports.outbound.repo_tree_generator import IRepoTreeGene
6
6
 
7
7
  logger = logging.getLogger(__name__)
8
8
 
9
- UNREADABLE_MARKER = "[... directory not expanded (unreadable): 0 folders, 0 files]"
9
+ UNREADABLE_MARKER = "[unreadable]"
10
10
 
11
11
 
12
12
  class LocalRepoTreeGenerator(IRepoTreeGenerator):
@@ -18,23 +18,36 @@ class LocalRepoTreeGenerator(IRepoTreeGenerator):
18
18
  def __init__(
19
19
  self,
20
20
  root_dir: str = ".",
21
- max_depth: int = DEFAULT_APP_CONFIG.context.max_tree_depth,
21
+ max_depth: int = DEFAULT_APP_CONFIG.context.max_depth,
22
+ max_children: int = DEFAULT_APP_CONFIG.context.max_children,
22
23
  ):
23
24
  from teddy_executor.adapters.outbound.filesystem_helpers import (
24
25
  load_ignore_spec,
25
26
  )
26
27
 
27
28
  assert max_depth >= 0, f"max_depth must be non-negative, got {max_depth}"
29
+ assert max_children >= 1, f"max_children must be positive, got {max_children}"
28
30
  self.root_dir = Path(root_dir).resolve()
29
31
  self.ignore_spec = load_ignore_spec(self.root_dir)
30
32
  self._max_depth = max_depth
33
+ self._max_children = max_children
34
+
35
+ @property
36
+ def max_depth(self) -> int:
37
+ """The configured maximum directory nesting depth."""
38
+ return self._max_depth
39
+
40
+ @property
41
+ def max_children(self) -> int:
42
+ """The configured maximum visible entries per non-root directory."""
43
+ return self._max_children
31
44
 
32
45
  def generate_tree(self) -> str:
33
46
  """
34
47
  Generates a string representation of the file tree in a single pass.
35
48
  """
36
49
  sections: list[tuple[str, str, list[str]]] = []
37
- root_names = self._collect_directory(self.root_dir, "", sections)
50
+ root_names = self._collect_directory(self.root_dir, "", sections, is_root=True)
38
51
  # Sections sort by their relative path, and the root resolves to ".",
39
52
  # so a top-level name below "." (for example "!important") renders
40
53
  # before the root block. The "." key preserves that exact order.
@@ -57,26 +70,34 @@ class LocalRepoTreeGenerator(IRepoTreeGenerator):
57
70
  relative_path: str,
58
71
  sections: list[tuple[str, str, list[str]]],
59
72
  depth: int = 0,
73
+ is_root: bool = False,
60
74
  ) -> list[str]:
61
75
  """
62
76
  Collects one directory's visible names and recurses into its children.
63
77
 
64
- A directory at or beyond the configured depth limit renders one
65
- omission marker instead of expanding, so truncation is never silent.
66
- An unreadable directory renders an explicit marker rather than an
67
- empty section, so it never looks like a readable empty directory.
68
- Directory and symlink flags come from the scan cache, so each entry
69
- costs no additional stat call. Symlinks are listed as files and are
70
- never followed, which keeps circular links from recursing.
78
+ One scan supplies both limits. A directory at or beyond the configured
79
+ depth limit renders one compact count notice instead of expanding, so
80
+ truncation is never silent. A non-root directory holding more visible
81
+ entries than the width cap renders the same notice and withholds its
82
+ descendants, because names without their parent folder cannot be
83
+ mapped. The project root is exempt from the width cap, because it is
84
+ the only place where a top-level file is named. An unreadable directory
85
+ renders an explicit marker rather than an empty section, so it never
86
+ looks like a readable empty directory. Directory and symlink flags come
87
+ from the scan cache, so each entry costs no additional stat call.
88
+ Symlinks are listed as files and are never followed, which keeps
89
+ circular links from recursing.
71
90
  """
72
91
  if depth >= self._max_depth:
73
- marker = self._depth_limit_marker(directory, relative_path)
74
- return [marker] if marker else []
92
+ return self._omission_notice(directory, relative_path)
75
93
 
76
94
  entries = self._scan_visible_entries(directory, relative_path)
77
95
  if entries is None:
78
96
  return [UNREADABLE_MARKER]
79
97
 
98
+ if not is_root and len(entries) > self._max_children:
99
+ return [self._compact_notice(entries)]
100
+
80
101
  names: list[str] = []
81
102
  for entry, is_directory, child_path in entries:
82
103
  names.append(entry.name)
@@ -119,25 +140,27 @@ class LocalRepoTreeGenerator(IRepoTreeGenerator):
119
140
  visible.append((entry, is_directory, child_path))
120
141
  return visible
121
142
 
122
- def _depth_limit_marker(self, directory: str | Path, relative_path: str) -> str:
143
+ def _omission_notice(self, directory: str | Path, relative_path: str) -> list[str]:
123
144
  """
124
- Renders the omission marker for a directory at the depth limit.
145
+ Renders the compact notice for a directory at the depth limit.
125
146
 
126
147
  Counts only the visible immediate children after ignore rules. An
127
- unreadable directory renders the unreadable marker instead. Returns an
128
- empty string when no child is visible, so a genuinely empty directory
129
- renders no section rather than a misleading marker.
148
+ unreadable directory renders the unreadable marker instead, and a
149
+ directory with no visible child renders nothing, so a genuinely empty
150
+ directory is not shown as an omission.
130
151
  """
131
152
  entries = self._scan_visible_entries(directory, relative_path)
132
153
  if entries is None:
133
- return UNREADABLE_MARKER
154
+ return [UNREADABLE_MARKER]
155
+ if not entries:
156
+ return []
157
+ return [self._compact_notice(entries)]
158
+
159
+ @staticmethod
160
+ def _compact_notice(entries: list[tuple[os.DirEntry, bool, str]]) -> str:
161
+ """Render the compact ``[X folders, Y files]`` notice for ``entries``."""
134
162
  folders = sum(1 for _entry, is_directory, _path in entries if is_directory)
135
163
  files = len(entries) - folders
136
- if not folders and not files:
137
- return ""
138
164
  folder_noun = "folder" if folders == 1 else "folders"
139
165
  file_noun = "file" if files == 1 else "files"
140
- return (
141
- f"[... directory not expanded (depth limit {self._max_depth}): "
142
- f"{folders} {folder_noun}, {files} {file_noun}]"
143
- )
166
+ return f"[{folders} {folder_noun}, {files} {file_noun}]"
@@ -44,7 +44,8 @@ class ReadConfig:
44
44
 
45
45
  @dataclass(frozen=True)
46
46
  class ContextConfig:
47
- max_tree_depth: int = 4
47
+ max_depth: int = 3
48
+ max_children: int = 20
48
49
 
49
50
 
50
51
  @dataclass(frozen=True)
@@ -210,7 +211,8 @@ _SCHEMA_FIELDS: tuple[_FieldSpec, ...] = (
210
211
  _FieldSpec("workspace.pre-commit", "workspace", "pre_commit", bool),
211
212
  _FieldSpec("workspace.pull", "workspace", "pull", bool),
212
213
  _FieldSpec("read.max_lines", "read", "max_lines", int, minimum=1),
213
- _FieldSpec("context.max_tree_depth", "context", "max_tree_depth", int, minimum=0),
214
+ _FieldSpec("context.max_depth", "context", "max_depth", int, minimum=0),
215
+ _FieldSpec("context.max_children", "context", "max_children", int, minimum=1),
214
216
  _FieldSpec("research.max_results", "research", "max_results", int, minimum=1),
215
217
  _FieldSpec("checks.prompts", "checks", "prompts", bool),
216
218
  _FieldSpec("checks.templates", "checks", "templates", bool),
@@ -6,6 +6,16 @@ class IRepoTreeGenerator(Protocol):
6
6
  Outbound Port for generating a repository file tree.
7
7
  """
8
8
 
9
+ @property
10
+ def max_depth(self) -> int:
11
+ """The maximum directory nesting depth rendered in the tree."""
12
+ ...
13
+
14
+ @property
15
+ def max_children(self) -> int:
16
+ """The maximum visible entries listed for a non-root directory."""
17
+ ...
18
+
9
19
  def generate_tree(self) -> str:
10
20
  """
11
21
  Generates a string representation of the file tree,
@@ -371,6 +371,7 @@ class ContextService(IGetContextUseCase):
371
371
  "\n## Git Status",
372
372
  git_status_body,
373
373
  "\n## Project Structure",
374
+ self._format_tree_subtitle(),
374
375
  f"```\n{repo_tree}\n```",
375
376
  ]
376
377
 
@@ -388,6 +389,14 @@ class ContextService(IGetContextUseCase):
388
389
 
389
390
  return "\n".join(content_parts)
390
391
 
392
+ def _format_tree_subtitle(self) -> str:
393
+ """State both tree limits once, so the compact notices stay meaningful."""
394
+ return (
395
+ f"*Tree capped at depth {self._repo_tree_generator.max_depth} "
396
+ f"and width {self._repo_tree_generator.max_children}: "
397
+ "truncated directories show counts only.*"
398
+ )
399
+
391
400
  def _format_workspace_contents(
392
401
  self,
393
402
  workspace_paths: List[str],
@@ -147,8 +147,12 @@ def register_infrastructure(container: punq.Container) -> None:
147
147
  IRepoTreeGenerator,
148
148
  factory=lambda: LocalRepoTreeGenerator(
149
149
  max_depth=container.resolve(IConfigService).get_setting(
150
- "context.max_tree_depth", DEFAULT_APP_CONFIG.context.max_tree_depth
151
- )
150
+ "context.max_depth", DEFAULT_APP_CONFIG.context.max_depth
151
+ ),
152
+ max_children=container.resolve(IConfigService).get_setting(
153
+ "context.max_children",
154
+ DEFAULT_APP_CONFIG.context.max_children,
155
+ ),
152
156
  ),
153
157
  scope=punq.Scope.transient,
154
158
  )
@@ -10,15 +10,16 @@ edit:
10
10
  similarity_threshold: 0.95 # EDIT match threshold (1.0 = exact match; ignores relative indentation).
11
11
 
12
12
  workspace:
13
- init: true # Initialize a missing Git repository (start and resume).
14
- pre-commit: true # Install pre-commit and post-commit git hooks (start and resume).
15
- pull: true # Fast-forward pull before starting a new session (start only).
13
+ init: true # Initialize a missing Git repository (start and resume).
14
+ pre-commit: true # Install pre-commit and post-commit git hooks (start and resume).
15
+ pull: true # Fast-forward pull before starting a new session (start only).
16
16
 
17
17
  read:
18
18
  max_lines: 1000 # Caps READ action output lines.
19
19
 
20
20
  context:
21
- max_tree_depth: 4 # Max project tree depth (0 = omit tree; raise the number to show more levels).
21
+ max_depth: 3 # Max project tree depth.
22
+ max_children: 20 # Max entries listed per directory.
22
23
 
23
24
  research:
24
25
  max_results: 5 # Number of search results to fetch and scrape.
@@ -39,15 +40,18 @@ guardrails: # Non-interactive limits (--yolo / --pipelin
39
40
  auto_pruning:
40
41
  enabled: true
41
42
  turn_context_threshold: 50000 # Token budget for turn-scoped files only (excludes session.context & system prompts).
42
- prune_failure_history: true # Prunes non-green turns once recovery succeeds.
43
+ prune_failure_history: true # Prunes non-green turns once recovery succeeds.
43
44
  prune_validation_failures: true # Prunes malformed turns that failed validation.
44
45
  preserve_message_turns: true # Preserves user-communicating turns from pruning.
45
46
  max_turns_retention: 10 # Max historical turns retained in turn context.
46
47
 
47
48
  # LiteLLM reference: https://docs.litellm.ai/docs/completion/input (all keys under llm pass directly to litellm).
49
+ # OpenRouter syntax: "openrouter/<slug>" (:nitro=fastest, :floor=cheapest).
50
+ # ${TEDDY_LLM_API_KEY} resolves from .teddy/.env or shell environment.
51
+
48
52
  llm:
49
- model: "openrouter/~deepseek/deepseek-flash-latest:nitro" # OpenRouter syntax: "openrouter/<slug>" (:nitro=fast, :floor=cheap).
50
- api_key: "${TEDDY_LLM_API_KEY}" # Resolves from .teddy/.env or shell environment.
53
+ model: "openrouter/~deepseek/deepseek-flash-latest:nitro"
54
+ api_key: "${TEDDY_LLM_API_KEY}"
51
55
  max_retries: 3
52
56
  timeout: 300
53
57
  extra_headers: