teddy-cli 0.1.17.dev1378__tar.gz → 0.1.17.dev1380__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 (163) hide show
  1. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +74 -18
  4. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/.gitignore +0 -0
  5. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/LICENSE +0 -0
  6. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/README.md +0 -0
  7. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/__init__.py +0 -0
  8. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/__main__.py +0 -0
  9. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/__init__.py +0 -0
  10. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  11. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  12. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  13. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -0
  14. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  15. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  16. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  17. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  18. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  19. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  20. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  21. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  22. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  23. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  24. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  25. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  26. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  27. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  28. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  29. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  30. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  31. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  32. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  33. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  34. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  35. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  36. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  37. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  38. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  39. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  41. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/container.py +0 -0
  42. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/__init__.py +0 -0
  43. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/__init__.py +0 -0
  44. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  45. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  46. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  47. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  48. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  49. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  50. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  51. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/plan.py +0 -0
  52. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  53. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  54. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  55. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/session.py +0 -0
  56. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  57. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  58. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/__init__.py +0 -0
  59. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  60. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  61. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  62. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  63. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  64. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  65. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  66. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  67. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  68. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  69. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  70. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  71. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  72. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  73. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  74. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  75. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  76. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  77. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  78. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  79. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  80. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  81. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  82. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  83. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  84. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  85. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  86. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  87. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/__init__.py +0 -0
  88. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  89. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  90. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  91. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/action_executor.py +0 -0
  92. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/action_factory.py +0 -0
  93. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  94. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  95. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/context_service.py +0 -0
  96. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  97. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  98. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  99. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/init_service.py +0 -0
  100. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  101. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  102. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  103. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  104. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  105. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/plan_validator.py +0 -0
  106. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/planning_service.py +0 -0
  107. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  108. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  109. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  110. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  111. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/session_planner.py +0 -0
  112. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  113. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/session_replanner.py +0 -0
  114. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/session_repository.py +0 -0
  115. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/session_service.py +0 -0
  116. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  117. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/update_checker.py +0 -0
  118. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  119. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  120. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  121. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  122. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  123. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  124. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  125. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  126. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/__init__.py +0 -0
  127. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/diff.py +0 -0
  128. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/editor_names.py +0 -0
  129. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  130. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/io.py +0 -0
  131. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/markdown.py +0 -0
  132. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/paths.py +0 -0
  133. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/serialization.py +0 -0
  134. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/session_notices.py +0 -0
  135. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  136. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/string.py +0 -0
  137. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/core/utils/terminal.py +0 -0
  138. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/prompts.py +0 -0
  139. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/registries/__init__.py +0 -0
  140. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/registries/infrastructure.py +0 -0
  141. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/registries/reviewer.py +0 -0
  142. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/registries/validators.py +0 -0
  143. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/MRP.md +0 -0
  144. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/__init__.py +0 -0
  145. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/config/__init__.py +0 -0
  146. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/config/config.yaml +0 -0
  147. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/config/init.context +0 -0
  148. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  149. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  150. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/config/prompts/debugger.md +0 -0
  151. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  152. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  153. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  154. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  155. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  156. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/templates/case-file.md +0 -0
  157. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/templates/ci.md +0 -0
  158. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/templates/component-design.md +0 -0
  159. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/templates/makefile.md +0 -0
  160. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/templates/milestone.md +0 -0
  161. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  162. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  163. {teddy_cli-0.1.17.dev1378 → teddy_cli-0.1.17.dev1380}/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.dev1378
3
+ Version: 0.1.17.dev1380
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.dev1378"
3
+ version = "0.1.17.dev1380"
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 = [
@@ -1,15 +1,67 @@
1
1
  import os
2
2
  import re
3
+ from collections.abc import Hashable
3
4
  from importlib import resources
4
5
  from typing import Any, Dict, Optional
5
6
  import yaml
6
7
  from dotenv import dotenv_values, set_key
8
+ from teddy_executor.core.domain.models.exceptions import ConfigurationError
7
9
  from teddy_executor.core.ports.outbound.config_service import IConfigService
8
10
 
9
11
  _INTERPOLATION_PATTERN = re.compile(
10
12
  r"\$\$|\$\{([_A-Za-z][_A-Za-z0-9]*)(?::-([^}]*))?\}"
11
13
  )
12
14
 
15
+ _MERGE_TAG = "tag:yaml.org,2002:merge"
16
+
17
+
18
+ def _strict_load(text: str, source_path: str) -> Any:
19
+ """Parse ``text`` and reject a repeated mapping key at any depth."""
20
+
21
+ class _StrictLoader(yaml.SafeLoader):
22
+ pass
23
+
24
+ def _construct_mapping(
25
+ loader: yaml.SafeLoader, node: yaml.MappingNode, deep: bool = False
26
+ ) -> Dict[Any, Any]:
27
+ if isinstance(node, yaml.MappingNode):
28
+ seen: set[Any] = set()
29
+ for key_node, _value_node in node.value:
30
+ if key_node.tag == _MERGE_TAG:
31
+ continue
32
+ key = loader.construct_object(key_node, deep=True)
33
+ if not isinstance(key, Hashable):
34
+ # An unhashable key is invalid YAML for a mapping. The base
35
+ # loader raises its standard error, which the adapter treats
36
+ # as an unreadable user config.
37
+ continue
38
+ if key in seen:
39
+ line = key_node.start_mark.line + 1
40
+ raise ConfigurationError(
41
+ f"Duplicate configuration key {key!r} in {source_path} "
42
+ f"at line {line}. Remove or rename one occurrence."
43
+ )
44
+ seen.add(key)
45
+ return yaml.SafeLoader.construct_mapping(loader, node, deep=deep)
46
+
47
+ _StrictLoader.add_constructor(
48
+ yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, _construct_mapping
49
+ )
50
+ return yaml.load(text, Loader=_StrictLoader)
51
+
52
+
53
+ def _normalize_key_token(token: str) -> str:
54
+ """Unquote a YAML key token so ``"llm.model"`` matches ``llm.model``."""
55
+ quote = token[:1]
56
+ if quote and quote in ("'", '"') and token[-1:] == quote:
57
+ try:
58
+ parsed = yaml.safe_load(token)
59
+ except yaml.YAMLError:
60
+ return token
61
+ if isinstance(parsed, str):
62
+ return parsed
63
+ return token
64
+
13
65
 
14
66
  class YamlConfigAdapter(IConfigService):
15
67
  """
@@ -51,13 +103,17 @@ class YamlConfigAdapter(IConfigService):
51
103
  return {}
52
104
 
53
105
  def _load_user_config(self) -> Dict[str, Any]:
54
- """Loads the user-specific YAML configuration file if it exists."""
106
+ """Loads the user config, failing fast on a repeated mapping key.
107
+
108
+ Unreadable YAML still falls back to an empty user config, but a
109
+ ``ConfigurationError`` for a duplicate key propagates to the caller.
110
+ """
55
111
  if not os.path.exists(self._config_path):
56
112
  return {}
57
113
 
58
114
  try:
59
115
  with open(self._config_path, "r", encoding="utf-8") as f:
60
- data = yaml.safe_load(f)
116
+ data = _strict_load(f.read(), self._config_path)
61
117
  return data if isinstance(data, dict) else {}
62
118
  except (yaml.YAMLError, OSError):
63
119
  return {}
@@ -189,10 +245,11 @@ class YamlConfigAdapter(IConfigService):
189
245
  through a data-only loader (``yaml.safe_load``/``yaml.dump``), which
190
246
  would strip all comments and reformat the document.
191
247
 
192
- Supports dot-notation for nested keys. The user config file and its
193
- parent directory are created if they do not exist. After writing, the
194
- in-memory merged cache is updated so a subsequent ``get_setting()`` on
195
- THIS adapter reflects the change without a reload.
248
+ Supports dot-notation for nested keys and honours the same precedence
249
+ as ``get_setting``: an exact top-level dotted key wins over a nested
250
+ key. The user config file and its parent directory are created if they
251
+ do not exist. After writing, the merged cache is rebuilt from disk so a
252
+ subsequent ``get_setting()`` on THIS adapter matches a fresh reload.
196
253
  """
197
254
  # 1. Ensure the parent directory exists.
198
255
  parent_dir = os.path.dirname(self._config_path)
@@ -212,16 +269,11 @@ class YamlConfigAdapter(IConfigService):
212
269
  with open(self._config_path, "w", encoding="utf-8") as f:
213
270
  f.write(text)
214
271
 
215
- # 4. Synchronize the in-memory merged cache so a subsequent
216
- # get_setting() on THIS adapter reflects the change.
217
- cache = self._config
218
- for part in key_path[:-1]:
219
- nxt = cache.get(part)
220
- if not isinstance(nxt, dict):
221
- nxt = {}
222
- cache[part] = nxt
223
- cache = nxt
224
- cache[key_path[-1]] = value
272
+ # 4. Rebuild the merged cache from disk so a subsequent get_setting()
273
+ # on THIS adapter resolves exactly what a fresh adapter resolves.
274
+ merged = self._load_layered_config()
275
+ self._config.clear()
276
+ self._config.update(merged)
225
277
 
226
278
  def _scalar_repr(self, value: Any) -> str:
227
279
  """Render a scalar value as YAML text with no document-end marker."""
@@ -238,7 +290,7 @@ class YamlConfigAdapter(IConfigService):
238
290
  if ":" not in stripped:
239
291
  continue
240
292
  indent = len(raw) - len(raw.lstrip(" "))
241
- key_part = stripped.split(":", 1)[0].strip()
293
+ key_part = _normalize_key_token(stripped.split(":", 1)[0].strip())
242
294
  while stack and stack[-1][0] >= indent:
243
295
  stack.pop()
244
296
  current = [k for _, k in stack] + [key_part]
@@ -252,7 +304,11 @@ class YamlConfigAdapter(IConfigService):
252
304
  lines = text.split("\n")
253
305
  value_str = self._scalar_repr(value)
254
306
 
255
- idx = self._find_key_line(lines, key_path)
307
+ idx = None
308
+ if len(key_path) > 1:
309
+ idx = self._find_key_line(lines, [".".join(key_path)])
310
+ if idx is None:
311
+ idx = self._find_key_line(lines, key_path)
256
312
  if idx is not None:
257
313
  raw = lines[idx]
258
314
  colon = raw.index(":")