teddy-cli 0.1.17.dev1406__tar.gz → 0.1.17.dev1408__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.dev1406 → teddy_cli-0.1.17.dev1408}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/__main__.py +4 -1
  4. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +48 -23
  5. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/config_schema.py +3 -1
  6. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +10 -0
  7. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/context_service.py +9 -0
  8. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/registries/infrastructure.py +5 -1
  9. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/config/config.yaml +2 -1
  10. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/.gitignore +0 -0
  11. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/LICENSE +0 -0
  12. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/README.md +0 -0
  13. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/__init__.py +0 -0
  14. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/__init__.py +0 -0
  15. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  16. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  17. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  18. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -0
  19. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  20. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  21. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  22. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  23. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  24. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  25. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  26. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  27. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  28. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  29. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  30. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  31. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  32. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  33. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  34. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  35. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  36. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  37. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  38. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  39. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  41. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  42. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  43. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  44. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  45. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  46. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/container.py +0 -0
  47. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/__init__.py +0 -0
  48. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/__init__.py +0 -0
  49. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  50. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  51. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  52. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  53. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  54. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  55. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  56. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/plan.py +0 -0
  57. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  58. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  59. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  60. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/session.py +0 -0
  61. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  62. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  63. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/__init__.py +0 -0
  64. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  65. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  66. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  67. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  68. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  69. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  70. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  71. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  72. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  73. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  74. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  75. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  76. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  77. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  78. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  79. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  80. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  81. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  82. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  83. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  84. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  85. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  86. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  87. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  88. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  89. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  90. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  91. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/__init__.py +0 -0
  92. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  93. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  94. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  95. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/action_executor.py +0 -0
  96. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/action_factory.py +0 -0
  97. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  98. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  99. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  100. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  101. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  102. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/init_service.py +0 -0
  103. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  104. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  105. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  106. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  107. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  108. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/plan_validator.py +0 -0
  109. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/planning_service.py +0 -0
  110. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  111. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  112. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  113. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  114. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/session_planner.py +0 -0
  115. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  116. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/session_replanner.py +0 -0
  117. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/session_repository.py +0 -0
  118. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/session_service.py +0 -0
  119. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  120. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/update_checker.py +0 -0
  121. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  122. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  123. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  124. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  125. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  126. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  127. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  128. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  129. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/__init__.py +0 -0
  130. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/diff.py +0 -0
  131. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/editor_names.py +0 -0
  132. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  133. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/interruptible_call.py +0 -0
  134. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/io.py +0 -0
  135. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/markdown.py +0 -0
  136. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/paths.py +0 -0
  137. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/serialization.py +0 -0
  138. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/session_notices.py +0 -0
  139. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  140. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/string.py +0 -0
  141. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/core/utils/terminal.py +0 -0
  142. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/prompts.py +0 -0
  143. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/registries/__init__.py +0 -0
  144. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/registries/reviewer.py +0 -0
  145. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/registries/validators.py +0 -0
  146. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/MRP.md +0 -0
  147. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/__init__.py +0 -0
  148. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/config/__init__.py +0 -0
  149. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/config/init.context +0 -0
  150. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  151. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  152. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/config/prompts/debugger.md +0 -0
  153. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  154. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  155. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  156. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  157. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  158. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/templates/case-file.md +0 -0
  159. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/templates/ci.md +0 -0
  160. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/templates/component-design.md +0 -0
  161. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/templates/makefile.md +0 -0
  162. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/templates/milestone.md +0 -0
  163. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  164. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  165. {teddy_cli-0.1.17.dev1406 → teddy_cli-0.1.17.dev1408}/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.dev1406
3
+ Version: 0.1.17.dev1408
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.dev1406"
3
+ version = "0.1.17.dev1408"
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 = [
@@ -194,7 +194,10 @@ def _ensure_project_initialized(container, root_dir: str | None = None) -> None:
194
194
  factory=lambda: LocalRepoTreeGenerator(
195
195
  root_dir=root,
196
196
  max_depth=c.resolve(IConfigService).get_setting(
197
- "context.max_tree_depth", 4
197
+ "context.max_tree_depth", 3
198
+ ),
199
+ max_tree_width=c.resolve(IConfigService).get_setting(
200
+ "context.max_tree_width", 20
198
201
  ),
199
202
  ),
200
203
  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):
@@ -19,22 +19,37 @@ class LocalRepoTreeGenerator(IRepoTreeGenerator):
19
19
  self,
20
20
  root_dir: str = ".",
21
21
  max_depth: int = DEFAULT_APP_CONFIG.context.max_tree_depth,
22
+ max_tree_width: int = DEFAULT_APP_CONFIG.context.max_tree_width,
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_tree_width >= 1, (
30
+ f"max_tree_width must be positive, got {max_tree_width}"
31
+ )
28
32
  self.root_dir = Path(root_dir).resolve()
29
33
  self.ignore_spec = load_ignore_spec(self.root_dir)
30
34
  self._max_depth = max_depth
35
+ self._max_tree_width = max_tree_width
36
+
37
+ @property
38
+ def max_depth(self) -> int:
39
+ """The configured maximum directory nesting depth."""
40
+ return self._max_depth
41
+
42
+ @property
43
+ def max_tree_width(self) -> int:
44
+ """The configured maximum visible entries per non-root directory."""
45
+ return self._max_tree_width
31
46
 
32
47
  def generate_tree(self) -> str:
33
48
  """
34
49
  Generates a string representation of the file tree in a single pass.
35
50
  """
36
51
  sections: list[tuple[str, str, list[str]]] = []
37
- root_names = self._collect_directory(self.root_dir, "", sections)
52
+ root_names = self._collect_directory(self.root_dir, "", sections, is_root=True)
38
53
  # Sections sort by their relative path, and the root resolves to ".",
39
54
  # so a top-level name below "." (for example "!important") renders
40
55
  # before the root block. The "." key preserves that exact order.
@@ -57,26 +72,34 @@ class LocalRepoTreeGenerator(IRepoTreeGenerator):
57
72
  relative_path: str,
58
73
  sections: list[tuple[str, str, list[str]]],
59
74
  depth: int = 0,
75
+ is_root: bool = False,
60
76
  ) -> list[str]:
61
77
  """
62
78
  Collects one directory's visible names and recurses into its children.
63
79
 
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.
80
+ One scan supplies both limits. A directory at or beyond the configured
81
+ depth limit renders one compact count notice instead of expanding, so
82
+ truncation is never silent. A non-root directory holding more visible
83
+ entries than the width cap renders the same notice and withholds its
84
+ descendants, because names without their parent folder cannot be
85
+ mapped. The project root is exempt from the width cap, because it is
86
+ the only place where a top-level file is named. An unreadable directory
87
+ renders an explicit marker rather than an empty section, so it never
88
+ looks like a readable empty directory. Directory and symlink flags come
89
+ from the scan cache, so each entry costs no additional stat call.
90
+ Symlinks are listed as files and are never followed, which keeps
91
+ circular links from recursing.
71
92
  """
72
93
  if depth >= self._max_depth:
73
- marker = self._depth_limit_marker(directory, relative_path)
74
- return [marker] if marker else []
94
+ return self._omission_notice(directory, relative_path)
75
95
 
76
96
  entries = self._scan_visible_entries(directory, relative_path)
77
97
  if entries is None:
78
98
  return [UNREADABLE_MARKER]
79
99
 
100
+ if not is_root and len(entries) > self._max_tree_width:
101
+ return [self._compact_notice(entries)]
102
+
80
103
  names: list[str] = []
81
104
  for entry, is_directory, child_path in entries:
82
105
  names.append(entry.name)
@@ -119,25 +142,27 @@ class LocalRepoTreeGenerator(IRepoTreeGenerator):
119
142
  visible.append((entry, is_directory, child_path))
120
143
  return visible
121
144
 
122
- def _depth_limit_marker(self, directory: str | Path, relative_path: str) -> str:
145
+ def _omission_notice(self, directory: str | Path, relative_path: str) -> list[str]:
123
146
  """
124
- Renders the omission marker for a directory at the depth limit.
147
+ Renders the compact notice for a directory at the depth limit.
125
148
 
126
149
  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.
150
+ unreadable directory renders the unreadable marker instead, and a
151
+ directory with no visible child renders nothing, so a genuinely empty
152
+ directory is not shown as an omission.
130
153
  """
131
154
  entries = self._scan_visible_entries(directory, relative_path)
132
155
  if entries is None:
133
- return UNREADABLE_MARKER
156
+ return [UNREADABLE_MARKER]
157
+ if not entries:
158
+ return []
159
+ return [self._compact_notice(entries)]
160
+
161
+ @staticmethod
162
+ def _compact_notice(entries: list[tuple[os.DirEntry, bool, str]]) -> str:
163
+ """Render the compact ``[X folders, Y files]`` notice for ``entries``."""
134
164
  folders = sum(1 for _entry, is_directory, _path in entries if is_directory)
135
165
  files = len(entries) - folders
136
- if not folders and not files:
137
- return ""
138
166
  folder_noun = "folder" if folders == 1 else "folders"
139
167
  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
- )
168
+ 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_tree_depth: int = 3
48
+ max_tree_width: int = 20
48
49
 
49
50
 
50
51
  @dataclass(frozen=True)
@@ -211,6 +212,7 @@ _SCHEMA_FIELDS: tuple[_FieldSpec, ...] = (
211
212
  _FieldSpec("workspace.pull", "workspace", "pull", bool),
212
213
  _FieldSpec("read.max_lines", "read", "max_lines", int, minimum=1),
213
214
  _FieldSpec("context.max_tree_depth", "context", "max_tree_depth", int, minimum=0),
215
+ _FieldSpec("context.max_tree_width", "context", "max_tree_width", 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_tree_width(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_tree_width}: "
397
+ "truncated directories show counts only.*"
398
+ )
399
+
391
400
  def _format_workspace_contents(
392
401
  self,
393
402
  workspace_paths: List[str],
@@ -148,7 +148,11 @@ def register_infrastructure(container: punq.Container) -> None:
148
148
  factory=lambda: LocalRepoTreeGenerator(
149
149
  max_depth=container.resolve(IConfigService).get_setting(
150
150
  "context.max_tree_depth", DEFAULT_APP_CONFIG.context.max_tree_depth
151
- )
151
+ ),
152
+ max_tree_width=container.resolve(IConfigService).get_setting(
153
+ "context.max_tree_width",
154
+ DEFAULT_APP_CONFIG.context.max_tree_width,
155
+ ),
152
156
  ),
153
157
  scope=punq.Scope.transient,
154
158
  )
@@ -18,7 +18,8 @@ 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_tree_depth: 3 # Max project tree depth.
22
+ max_tree_width: 20 # Max entries listed per directory.
22
23
 
23
24
  research:
24
25
  max_results: 5 # Number of search results to fetch and scrape.