teddy-cli 0.1.17.dev1329__tar.gz → 0.1.17.dev1331__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 (162) hide show
  1. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +10 -2
  4. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/markdown_plan_parser.py +49 -28
  5. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/.gitignore +0 -0
  6. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/LICENSE +0 -0
  7. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/README.md +0 -0
  8. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/__init__.py +0 -0
  9. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/__main__.py +0 -0
  10. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/__init__.py +0 -0
  11. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  12. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  13. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  14. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -0
  15. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  16. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  17. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  18. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  19. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  20. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  21. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  22. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  23. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  24. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  25. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  26. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  27. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  28. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  29. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  30. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  31. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  32. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  33. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  34. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  35. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  36. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  37. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  38. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  39. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  41. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  42. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/container.py +0 -0
  43. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/__init__.py +0 -0
  44. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/__init__.py +0 -0
  45. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  46. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  47. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  48. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  49. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  50. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  51. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  52. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/plan.py +0 -0
  53. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  54. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  55. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  56. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/session.py +0 -0
  57. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  58. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  59. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/__init__.py +0 -0
  60. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  61. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  62. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  63. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  64. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  65. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  66. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  67. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  68. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  69. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  70. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  71. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  72. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  73. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  74. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  75. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  76. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  77. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  78. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  79. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  80. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  81. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  82. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  83. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  84. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  85. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  86. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  87. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  88. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/__init__.py +0 -0
  89. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  90. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  91. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  92. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/action_executor.py +0 -0
  93. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/action_factory.py +0 -0
  94. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  95. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  96. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/context_service.py +0 -0
  97. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  98. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  99. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  100. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/init_service.py +0 -0
  101. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  102. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  103. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  104. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  105. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/plan_validator.py +0 -0
  106. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/planning_service.py +0 -0
  107. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  108. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  109. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  110. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  111. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/session_planner.py +0 -0
  112. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  113. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/session_replanner.py +0 -0
  114. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/session_repository.py +0 -0
  115. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/session_service.py +0 -0
  116. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  117. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/update_checker.py +0 -0
  118. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  119. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  120. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  121. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  122. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  123. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  124. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  125. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  126. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/utils/__init__.py +0 -0
  127. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/utils/diff.py +0 -0
  128. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  129. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/utils/io.py +0 -0
  130. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/utils/markdown.py +0 -0
  131. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/utils/paths.py +0 -0
  132. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/utils/serialization.py +0 -0
  133. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/utils/session_notices.py +0 -0
  134. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  135. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/utils/string.py +0 -0
  136. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/core/utils/terminal.py +0 -0
  137. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/prompts.py +0 -0
  138. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/registries/__init__.py +0 -0
  139. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/registries/infrastructure.py +0 -0
  140. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/registries/reviewer.py +0 -0
  141. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/registries/validators.py +0 -0
  142. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/MRP.md +0 -0
  143. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/__init__.py +0 -0
  144. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/config/__init__.py +0 -0
  145. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/config/config.yaml +0 -0
  146. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/config/init.context +0 -0
  147. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  148. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  149. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/config/prompts/debugger.md +0 -0
  150. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  151. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  152. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  153. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  154. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  155. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/templates/case-file.md +0 -0
  156. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/templates/ci.md +0 -0
  157. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/templates/component-design.md +0 -0
  158. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/templates/makefile.md +0 -0
  159. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/templates/milestone.md +0 -0
  160. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  161. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  162. {teddy_cli-0.1.17.dev1329 → teddy_cli-0.1.17.dev1331}/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.dev1329
3
+ Version: 0.1.17.dev1331
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.dev1329"
3
+ version = "0.1.17.dev1331"
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 = [
@@ -260,13 +260,16 @@ class LocalFileSystemAdapter(IFileSystemManager):
260
260
  def create_file(self, path: str, content: str, overwrite: bool = False) -> None:
261
261
  """
262
262
  Creates a new file with the given content.
263
+
264
+ Newline-deterministic: ``newline=""`` keeps LF line endings verbatim
265
+ on every OS, matching the write_file and edit_file contracts.
263
266
  """
264
267
  try:
265
268
  file_path = self._resolve_path(path)
266
269
  file_path.parent.mkdir(parents=True, exist_ok=True)
267
270
 
268
271
  mode = "w" if overwrite else "x"
269
- with open(file_path, mode, encoding="utf-8") as f:
272
+ with open(file_path, mode, encoding="utf-8", newline="") as f:
270
273
  f.write(content)
271
274
  except FileExistsError as e:
272
275
  # Raise a domain-specific exception to conform to the port's contract.
@@ -327,6 +330,11 @@ class LocalFileSystemAdapter(IFileSystemManager):
327
330
  ) -> list[float]:
328
331
  """
329
332
  Modifies an existing file by applying a list of find-and-replace blocks.
333
+
334
+ Newline-deterministic: ``newline=""`` on the write disables platform
335
+ newline translation, so the simulated content is emitted verbatim on
336
+ every OS. This prevents Windows from doubling CRLF sequences that a
337
+ clipboard plan carries into the REPLACE block.
330
338
  """
331
339
  file_path = self._resolve_path(path)
332
340
  content = file_path.read_text(encoding="utf-8")
@@ -344,5 +352,5 @@ class LocalFileSystemAdapter(IFileSystemManager):
344
352
  match_all=match_all,
345
353
  )
346
354
 
347
- file_path.write_text(new_content, encoding="utf-8")
355
+ file_path.write_text(new_content, encoding="utf-8", newline="")
348
356
  return scores
@@ -60,32 +60,65 @@ class MarkdownPlanParser(IPlanParser):
60
60
  ),
61
61
  }
62
62
 
63
- def parse(self, plan_content: str, plan_path: Optional[str] = None) -> Plan:
64
- """
65
- Parses the specified Markdown plan string into a structured Plan object.
63
+ def _normalize_plan_content(self, plan_content: str) -> str:
64
+ """Normalize raw plan text into canonical Markdown before parsing.
65
+
66
+ Converts Windows clipboard CRLF endings to LF, trims trailing
67
+ whitespace, strips any preamble before the first heading, and
68
+ normalizes the H1 title.
66
69
  """
67
- from mistletoe.block_token import (
68
- Document,
69
- )
70
+ # Normalize Windows clipboard line endings to LF so fence content and
71
+ # extracted message sections never carry stray carriage returns.
72
+ normalized_content = plan_content.replace("\r\n", "\n")
70
73
 
71
74
  # Trim trailing whitespace to prevent mistletoe from
72
75
  # interpreting trailing indentation as an unexpected code block.
73
76
  # We keep leading whitespace for potential Markdown significance (though rare at top-level).
74
- clean_content = plan_content.rstrip()
77
+ clean_content = normalized_content.rstrip()
75
78
 
76
79
  if not clean_content:
77
80
  raise InvalidPlanError("Plan content cannot be empty.")
78
81
 
79
- # Strip preamble (text before the first # heading at start of a line)
80
- # Use MULTILINE so ^ matches start of any line. Allow optional leading whitespace
81
- # before # because Markdown permits up to 3 spaces before heading markers.
82
+ # Strip preamble (text before the first # heading at start of a line).
83
+ # MULTILINE lets ^ match the start of any line, and Markdown permits up
84
+ # to 3 leading spaces before a heading marker.
82
85
  h1_match = re.search(r"^[ \t]*#", clean_content, re.MULTILINE)
83
86
  if h1_match and h1_match.start() > 0:
84
87
  clean_content = clean_content[h1_match.start() :]
85
88
 
86
- # Normalize H1 heading on the first line (e.g., #Title -> # Title)
87
- # This runs after preamble stripping so it always targets the heading line
88
- clean_content = normalize_headings(clean_content)
89
+ # Normalize the H1 heading (e.g. #Title -> # Title) after preamble
90
+ # stripping so it always targets the heading line.
91
+ return normalize_headings(clean_content)
92
+
93
+ @staticmethod
94
+ def _is_session_plan(plan_path: Optional[str]) -> bool:
95
+ """Return True when the plan path points inside a session directory."""
96
+ if not plan_path:
97
+ return False
98
+ normalized_path = plan_path.replace("\\", "/").lower()
99
+ return ".teddy/sessions/" in normalized_path
100
+
101
+ def _write_back_session_plan(self, plan_path: str, clean_content: str) -> None:
102
+ """Persist normalized content to a session plan file when it changed."""
103
+ from pathlib import Path
104
+
105
+ path_obj = Path(plan_path)
106
+ try:
107
+ current_disk = path_obj.read_text(encoding="utf-8")
108
+ except Exception:
109
+ current_disk = None
110
+ if current_disk is not None and current_disk.rstrip() != clean_content:
111
+ path_obj.write_text(clean_content, encoding="utf-8", newline="")
112
+
113
+ def parse(self, plan_content: str, plan_path: Optional[str] = None) -> Plan:
114
+ """
115
+ Parses the specified Markdown plan string into a structured Plan object.
116
+ """
117
+ from mistletoe.block_token import (
118
+ Document,
119
+ )
120
+
121
+ clean_content = self._normalize_plan_content(plan_content)
89
122
 
90
123
  processed_content = self._preprocessor.process(clean_content)
91
124
  doc = Document(processed_content)
@@ -106,10 +139,7 @@ class MarkdownPlanParser(IPlanParser):
106
139
  stream, clean_content, section_heading, doc
107
140
  )
108
141
 
109
- is_session = False
110
- if plan_path:
111
- normalized_path = plan_path.replace("\\", "/").lower()
112
- is_session = ".teddy/sessions/" in normalized_path
142
+ is_session = self._is_session_plan(plan_path)
113
143
 
114
144
  plan = Plan(
115
145
  title=title,
@@ -122,17 +152,8 @@ class MarkdownPlanParser(IPlanParser):
122
152
  raw_content=clean_content,
123
153
  )
124
154
 
125
- # Write corrected content back to source file if it came from a session file path
126
- if plan_path and is_session:
127
- from pathlib import Path
128
-
129
- path_obj = Path(plan_path)
130
- try:
131
- current_disk = path_obj.read_text(encoding="utf-8")
132
- except Exception:
133
- current_disk = None
134
- if current_disk is not None and current_disk.rstrip() != clean_content:
135
- path_obj.write_text(clean_content, encoding="utf-8", newline="")
155
+ if is_session and plan_path:
156
+ self._write_back_session_plan(plan_path, clean_content)
136
157
 
137
158
  return plan
138
159
  except InvalidPlanError as e: