teddy-cli 0.1.17.dev1377__tar.gz → 0.1.17.dev1379__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.dev1377 → teddy_cli-0.1.17.dev1379}/PKG-INFO +23 -18
  2. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/README.md +22 -17
  3. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/pyproject.toml +1 -1
  4. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +74 -18
  5. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/MRP.md +2 -2
  6. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/config/config.yaml +1 -1
  7. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/.gitignore +0 -0
  8. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/LICENSE +0 -0
  9. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/__init__.py +0 -0
  10. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/__main__.py +0 -0
  11. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/__init__.py +0 -0
  12. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  13. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  14. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  15. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -0
  16. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  17. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  18. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  19. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  20. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  21. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  22. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  23. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  24. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  25. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  26. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  27. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  28. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  29. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  30. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  31. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  32. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  33. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  34. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  35. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  36. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  37. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  38. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  39. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  41. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  42. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  43. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/container.py +0 -0
  44. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/__init__.py +0 -0
  45. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/__init__.py +0 -0
  46. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  47. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  48. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  49. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  50. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  51. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  52. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  53. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/plan.py +0 -0
  54. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  55. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  56. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  57. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/session.py +0 -0
  58. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  59. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  60. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/__init__.py +0 -0
  61. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  62. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  63. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  64. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  65. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  66. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  67. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  68. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  69. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  70. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  71. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  72. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  73. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  74. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  75. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  76. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  77. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  78. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  79. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  80. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  81. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  82. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  83. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  84. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  85. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  86. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  87. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  88. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  89. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/__init__.py +0 -0
  90. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  91. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  92. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  93. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/action_executor.py +0 -0
  94. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/action_factory.py +0 -0
  95. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  96. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  97. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/context_service.py +0 -0
  98. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  99. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  100. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  101. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/init_service.py +0 -0
  102. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  103. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  104. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  105. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  106. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  107. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/plan_validator.py +0 -0
  108. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/planning_service.py +0 -0
  109. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  110. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  111. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  112. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  113. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/session_planner.py +0 -0
  114. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  115. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/session_replanner.py +0 -0
  116. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/session_repository.py +0 -0
  117. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/session_service.py +0 -0
  118. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  119. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/update_checker.py +0 -0
  120. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  121. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  122. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  123. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  124. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  125. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  126. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  127. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  128. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/__init__.py +0 -0
  129. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/diff.py +0 -0
  130. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/editor_names.py +0 -0
  131. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  132. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/io.py +0 -0
  133. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/markdown.py +0 -0
  134. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/paths.py +0 -0
  135. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/serialization.py +0 -0
  136. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/session_notices.py +0 -0
  137. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  138. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/string.py +0 -0
  139. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/core/utils/terminal.py +0 -0
  140. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/prompts.py +0 -0
  141. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/registries/__init__.py +0 -0
  142. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/registries/infrastructure.py +0 -0
  143. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/registries/reviewer.py +0 -0
  144. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/registries/validators.py +0 -0
  145. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/__init__.py +0 -0
  146. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/config/__init__.py +0 -0
  147. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/config/init.context +0 -0
  148. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  149. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  150. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/config/prompts/debugger.md +0 -0
  151. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  152. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  153. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  154. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  155. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  156. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/templates/case-file.md +0 -0
  157. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/templates/ci.md +0 -0
  158. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/templates/component-design.md +0 -0
  159. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/templates/makefile.md +0 -0
  160. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/templates/milestone.md +0 -0
  161. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  162. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  163. {teddy_cli-0.1.17.dev1377 → teddy_cli-0.1.17.dev1379}/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.dev1377
3
+ Version: 0.1.17.dev1379
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
@@ -52,7 +52,7 @@ uv tool install teddy-cli
52
52
  <img src="./assets/demo.gif" alt="TeDDy TUI Demo" width="100%" style="max-width: 100%; height: auto;" />
53
53
  </p>
54
54
 
55
- [Why TeDDy?](#why-not-just-use) &bull; [TeDDy's SDLC](#teddys-software-delivery-lifecycle) &bull; [Owning Your SDLC](#owning-your-sdlc) &bull; [Quickstart](#getting-started) &bull; [Usage](#usage) &bull; [FAQ](#frequently-asked-questions)
55
+ [Why TeDDy?](#why-not-just-use) &bull; [TeDDy's SDLC](#teddys-software-delivery-lifecycle) &bull; [Owning Your SDLC](#owning-your-sdlc) &bull; [Quickstart](#getting-started) &bull; [Usage](#usage) &bull; [FAQ](#frequently-asked-questions) &bull; [Support](#support)
56
56
 
57
57
  </div>
58
58
 
@@ -161,10 +161,11 @@ TeDDy is built on the belief that you should own your software delivery lifecycl
161
161
  - **Artifact Templates (`docs/templates/`):** Standardize the artifacts produced during development. Customize the Markdown templates for vertical slices, specifications, case files, and milestones to match your documentation standards.
162
162
  - **Agent Prompts (`.teddy/prompts/`):** To change the process itself, customize the agent prompts. Each agent's workflow is broken down into structured phases and individual steps, defined entirely in Markdown. You can tweak instructions, add domain-specific quality gates, or introduce brand-new agent personas to match how your team builds software.
163
163
  - **Command Automation (`Makefile`):** Instead of hardcoding shell commands inside agent prompts, common development and verification operations are routed through the Makefile. When you need to change a flag, runner, or environment setup, you change it once in the Makefile instead of updating instructions across multiple agent prompts.
164
+ - **Context Filtering (`.teddyignore`):** Control which files TeDDy scans during context generation and tree traversal. A `.teddyignore` file in the project root follows standard ignore syntax and takes precedence over `.gitignore`, allowing you to ignore extra paths or re-include git-ignored files using negation patterns.
164
165
 
165
166
  > [!TIP]
166
167
  > *Interested in bringing TeDDy into your team or designing custom agent workflows?* <br>
167
- > **[Professional consulting is available!](mailto:raphael@atteritano.ch)**
168
+ > **[Professional consulting is available!](#support)**
168
169
 
169
170
  ---
170
171
 
@@ -269,15 +270,17 @@ teddy resume -m "your next instruction"
269
270
 
270
271
  ### Optional Flags
271
272
 
272
- - `--agent` / `-a`: Select agent persona (`pathfinder`, `architect`, `developer`, `debugger`, `assistant`). Default: `pathfinder` (`assistant` in pipeline mode).
273
- - `--context` / `-c`: Supply additional context files or directories. Repeatable (`-c a.py -c b.md`) or comma-separated (`-c "a.py,b.md"`).
274
- - `--model`: Override the default configured model.
275
- - `--yolo` / `-y`: Auto-approve all actions. To make this default, set `yolo_default: true` in `.teddy/config.yaml`.
276
- - `--no-yolo` / `-n`: Force interactive mode for a single run.
277
- - `--message` / `-m`: Initial instruction to pass directly to the agent.
278
- - `--pipeline` / `-p`: Pipeline mode. Auto-approves actions, requires `-m`, exits immediately after the first message turn, and defaults to the `assistant` agent.
279
- - `--max-turns`: Maximum turns for a non-interactive run. Overrides `guardrails.max_turns` in `.teddy/config.yaml`.
280
- - `--max-cost`: Maximum session cost in dollars for a non-interactive run. Overrides `guardrails.max_session_cost` in `.teddy/config.yaml`.
273
+ | Flag | Description |
274
+ | :----------------- | :-------------------------------------------------------------------------------------------------------------------------------------------- |
275
+ | `--agent`, `-a` | Select agent persona (`pathfinder`, `architect`, `developer`, `debugger`, `assistant`). Default: `pathfinder` (`assistant` in pipeline mode). |
276
+ | `--context`, `-c` | Supply additional context files or directories. Repeatable (`-c a.py -c b.md`) or comma-separated (`-c "a.py,b.md"`). |
277
+ | `--model` | Override the default configured model. |
278
+ | `--yolo`, `-y` | Auto-approve all actions. To make this default, set `yolo_default: true` in `.teddy/config.yaml`. |
279
+ | `--no-yolo`, `-n` | Force interactive mode for a single run. |
280
+ | `--message`, `-m` | Initial instruction to pass directly to the agent. |
281
+ | `--pipeline`, `-p` | Pipeline mode. Auto-approves actions, requires `-m`, exits immediately after the first message turn, and defaults to the `assistant` agent. |
282
+ | `--max-turns` | Maximum turns for a non-interactive run. Overrides `guardrails.max_turns` in `.teddy/config.yaml`. |
283
+ | `--max-cost` | Maximum session cost in dollars for a non-interactive run. Overrides `guardrails.max_session_cost` in `.teddy/config.yaml`. |
281
284
 
282
285
  ### Chat-Oriented Workflow (CHOP)
283
286
 
@@ -376,14 +379,16 @@ The tool itself is not monetized. If your team needs custom agent architectures,
376
379
 
377
380
  ---
378
381
 
379
- <div align="center">
380
-
381
- ### Star TeDDy on GitHub
382
+ <div align="center" id="support">
382
383
 
383
- If you find TeDDy useful for your workflow, consider giving it a star. It helps other developers find the project.
384
+ ### Support
384
385
 
385
- [![GitHub stars](https://img.shields.io/github/stars/atte500/teddy?style=social)](https://github.com/atte500/teddy)
386
+ If you find TeDDy useful, consider giving it a star!
386
387
 
387
- Need custom agent architectures or team onboarding? **[Let's get in touch!](mailto:raphael@atteritano.ch)**
388
+ <p align="center">
389
+ <a href="https://github.com/atte500/teddy"><img src="https://img.shields.io/github/stars/atte500/teddy?style=flat-square&logo=github&label=Star%20TeDDy" alt="GitHub stars" /></a>
390
+ <a href="https://www.youtube.com/@xCogito-tv"><img src="https://img.shields.io/badge/YouTube-@xCogito--tv-red?style=flat-square&logo=youtube" alt="YouTube" /></a>
391
+ <a href="mailto:raphael@atteritano.ch"><img src="https://img.shields.io/badge/Email-raphael%40atteritano.ch-blue?style=flat-square&logo=gmail" alt="Email" /></a>
392
+ </p>
388
393
 
389
394
  </div>
@@ -18,7 +18,7 @@ uv tool install teddy-cli
18
18
  <img src="./assets/demo.gif" alt="TeDDy TUI Demo" width="100%" style="max-width: 100%; height: auto;" />
19
19
  </p>
20
20
 
21
- [Why TeDDy?](#why-not-just-use) &bull; [TeDDy's SDLC](#teddys-software-delivery-lifecycle) &bull; [Owning Your SDLC](#owning-your-sdlc) &bull; [Quickstart](#getting-started) &bull; [Usage](#usage) &bull; [FAQ](#frequently-asked-questions)
21
+ [Why TeDDy?](#why-not-just-use) &bull; [TeDDy's SDLC](#teddys-software-delivery-lifecycle) &bull; [Owning Your SDLC](#owning-your-sdlc) &bull; [Quickstart](#getting-started) &bull; [Usage](#usage) &bull; [FAQ](#frequently-asked-questions) &bull; [Support](#support)
22
22
 
23
23
  </div>
24
24
 
@@ -127,10 +127,11 @@ TeDDy is built on the belief that you should own your software delivery lifecycl
127
127
  - **Artifact Templates (`docs/templates/`):** Standardize the artifacts produced during development. Customize the Markdown templates for vertical slices, specifications, case files, and milestones to match your documentation standards.
128
128
  - **Agent Prompts (`.teddy/prompts/`):** To change the process itself, customize the agent prompts. Each agent's workflow is broken down into structured phases and individual steps, defined entirely in Markdown. You can tweak instructions, add domain-specific quality gates, or introduce brand-new agent personas to match how your team builds software.
129
129
  - **Command Automation (`Makefile`):** Instead of hardcoding shell commands inside agent prompts, common development and verification operations are routed through the Makefile. When you need to change a flag, runner, or environment setup, you change it once in the Makefile instead of updating instructions across multiple agent prompts.
130
+ - **Context Filtering (`.teddyignore`):** Control which files TeDDy scans during context generation and tree traversal. A `.teddyignore` file in the project root follows standard ignore syntax and takes precedence over `.gitignore`, allowing you to ignore extra paths or re-include git-ignored files using negation patterns.
130
131
 
131
132
  > [!TIP]
132
133
  > *Interested in bringing TeDDy into your team or designing custom agent workflows?* <br>
133
- > **[Professional consulting is available!](mailto:raphael@atteritano.ch)**
134
+ > **[Professional consulting is available!](#support)**
134
135
 
135
136
  ---
136
137
 
@@ -235,15 +236,17 @@ teddy resume -m "your next instruction"
235
236
 
236
237
  ### Optional Flags
237
238
 
238
- - `--agent` / `-a`: Select agent persona (`pathfinder`, `architect`, `developer`, `debugger`, `assistant`). Default: `pathfinder` (`assistant` in pipeline mode).
239
- - `--context` / `-c`: Supply additional context files or directories. Repeatable (`-c a.py -c b.md`) or comma-separated (`-c "a.py,b.md"`).
240
- - `--model`: Override the default configured model.
241
- - `--yolo` / `-y`: Auto-approve all actions. To make this default, set `yolo_default: true` in `.teddy/config.yaml`.
242
- - `--no-yolo` / `-n`: Force interactive mode for a single run.
243
- - `--message` / `-m`: Initial instruction to pass directly to the agent.
244
- - `--pipeline` / `-p`: Pipeline mode. Auto-approves actions, requires `-m`, exits immediately after the first message turn, and defaults to the `assistant` agent.
245
- - `--max-turns`: Maximum turns for a non-interactive run. Overrides `guardrails.max_turns` in `.teddy/config.yaml`.
246
- - `--max-cost`: Maximum session cost in dollars for a non-interactive run. Overrides `guardrails.max_session_cost` in `.teddy/config.yaml`.
239
+ | Flag | Description |
240
+ | :----------------- | :-------------------------------------------------------------------------------------------------------------------------------------------- |
241
+ | `--agent`, `-a` | Select agent persona (`pathfinder`, `architect`, `developer`, `debugger`, `assistant`). Default: `pathfinder` (`assistant` in pipeline mode). |
242
+ | `--context`, `-c` | Supply additional context files or directories. Repeatable (`-c a.py -c b.md`) or comma-separated (`-c "a.py,b.md"`). |
243
+ | `--model` | Override the default configured model. |
244
+ | `--yolo`, `-y` | Auto-approve all actions. To make this default, set `yolo_default: true` in `.teddy/config.yaml`. |
245
+ | `--no-yolo`, `-n` | Force interactive mode for a single run. |
246
+ | `--message`, `-m` | Initial instruction to pass directly to the agent. |
247
+ | `--pipeline`, `-p` | Pipeline mode. Auto-approves actions, requires `-m`, exits immediately after the first message turn, and defaults to the `assistant` agent. |
248
+ | `--max-turns` | Maximum turns for a non-interactive run. Overrides `guardrails.max_turns` in `.teddy/config.yaml`. |
249
+ | `--max-cost` | Maximum session cost in dollars for a non-interactive run. Overrides `guardrails.max_session_cost` in `.teddy/config.yaml`. |
247
250
 
248
251
  ### Chat-Oriented Workflow (CHOP)
249
252
 
@@ -342,14 +345,16 @@ The tool itself is not monetized. If your team needs custom agent architectures,
342
345
 
343
346
  ---
344
347
 
345
- <div align="center">
346
-
347
- ### Star TeDDy on GitHub
348
+ <div align="center" id="support">
348
349
 
349
- If you find TeDDy useful for your workflow, consider giving it a star. It helps other developers find the project.
350
+ ### Support
350
351
 
351
- [![GitHub stars](https://img.shields.io/github/stars/atte500/teddy?style=social)](https://github.com/atte500/teddy)
352
+ If you find TeDDy useful, consider giving it a star!
352
353
 
353
- Need custom agent architectures or team onboarding? **[Let's get in touch!](mailto:raphael@atteritano.ch)**
354
+ <p align="center">
355
+ <a href="https://github.com/atte500/teddy"><img src="https://img.shields.io/github/stars/atte500/teddy?style=flat-square&logo=github&label=Star%20TeDDy" alt="GitHub stars" /></a>
356
+ <a href="https://www.youtube.com/@xCogito-tv"><img src="https://img.shields.io/badge/YouTube-@xCogito--tv-red?style=flat-square&logo=youtube" alt="YouTube" /></a>
357
+ <a href="mailto:raphael@atteritano.ch"><img src="https://img.shields.io/badge/Email-raphael%40atteritano.ch-blue?style=flat-square&logo=gmail" alt="Email" /></a>
358
+ </p>
354
359
 
355
360
  </div>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "teddy-cli"
3
- version = "0.1.17.dev1377"
3
+ version = "0.1.17.dev1379"
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(":")
@@ -104,7 +104,7 @@ Use `EXECUTE` with shell commands or inline Python when surgical `EDIT` is britt
104
104
 
105
105
  ### Template-First Documentation & Tooling
106
106
 
107
- All documentation and project infrastructure are template-first. Before creating or modifying files under `docs/`, CI workflows, pre-commit hooks, or the `Makefile`, you MUST `READ` the matching template in `docs/templates/`. Follow the artifact numbering and path conventions defined in `docs/project/PROJECT.md`. If `docs/templates/` does not exist, EXECUTE `teddy init templates` to initialize defaults. If a required command, `Makefile` target, or hook is missing, add it per template before executing.
107
+ All documentation and project infrastructure are template-first. Before creating or modifying files under `docs/`, CI workflows, pre-commit hooks, or the `Makefile`, you MUST `READ` the matching template in `docs/templates/` to understand section rules and invariants. Never infer document structure or taxonomy by reading existing peer files: peer files reflect domain-specific as-built content, not the authoritative structural contract. Follow the artifact numbering and path conventions defined in `docs/project/PROJECT.md`. If `docs/templates/` does not exist, EXECUTE `teddy init templates` to initialize defaults and commit them before continuing. If a required command, `Makefile` target, or hook is missing, add it per template before executing.
108
108
 
109
109
  ### Communication Hygiene
110
110
 
@@ -134,7 +134,7 @@ Your entire response is parsed into an AST and must strictly adhere to the forma
134
134
 
135
135
  ### No Preamble
136
136
 
137
- Output your response as raw Markdown. Do NOT wrap your response in a code block, and do not add any introductory or concluding text. Start immediately with the Level 1 Markdown heading.
137
+ Output your response as raw Markdown. The very first token of your response MUST be the `#` character of the Level 1 heading. Do not output preambles, greetings, blank lines, or enclosing code fences before or around your response.
138
138
 
139
139
  ### Rationale Encapsulation
140
140
 
@@ -3,7 +3,7 @@
3
3
  editor: ""
4
4
 
5
5
  execution:
6
- default_timeout_seconds: 60 # EXECUTE timeout.
6
+ default_timeout_seconds: 60 # Default timeout for EXECUTE actions (in seconds).
7
7
  similarity_threshold: 0.95 # EDIT match threshold (1.0 = exact match; ignores relative indentation).
8
8
  max_output_lines: 100 # Caps EXECUTE stdout/stderr output lines.
9
9