teddy-cli 0.1.17.dev1209__tar.gz → 0.1.17.dev1211__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 (160) hide show
  1. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +43 -4
  4. teddy_cli-0.1.17.dev1211/src/teddy_executor/core/domain/models/drift_report.py +38 -0
  5. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/inbound/init.py +14 -0
  6. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/init_service.py +71 -8
  7. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/.gitignore +0 -0
  8. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/LICENSE +0 -0
  9. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/__init__.py +0 -0
  10. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/__main__.py +0 -0
  11. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/__init__.py +0 -0
  12. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  13. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  14. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  15. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  16. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  17. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  18. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  19. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  20. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  21. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  22. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  23. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  24. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  25. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  26. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  27. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  28. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  29. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  30. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  31. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  32. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  33. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  34. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  35. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  36. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  37. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  38. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  39. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  40. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  41. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  42. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  43. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/container.py +0 -0
  44. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/__init__.py +0 -0
  45. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/__init__.py +0 -0
  46. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  47. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  48. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  49. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  50. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  51. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  52. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/plan.py +0 -0
  53. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  54. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  55. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  56. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/session.py +0 -0
  57. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  58. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  59. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/__init__.py +0 -0
  60. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  61. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  62. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  63. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  64. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  65. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  66. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  67. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  68. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  69. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  70. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  71. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  72. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  73. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  74. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  75. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  76. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  77. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  78. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  79. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  80. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  81. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  82. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  83. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  84. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  85. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  86. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  87. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/__init__.py +0 -0
  88. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  89. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  90. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  91. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/action_executor.py +0 -0
  92. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/action_factory.py +0 -0
  93. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  94. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  95. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/context_service.py +0 -0
  96. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  97. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  98. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  99. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  100. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  101. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  102. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  103. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  104. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/plan_validator.py +0 -0
  105. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/planning_service.py +0 -0
  106. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  107. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  108. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  109. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  110. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/session_planner.py +0 -0
  111. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  112. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/session_replanner.py +0 -0
  113. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/session_repository.py +0 -0
  114. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/session_service.py +0 -0
  115. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  116. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/update_checker.py +0 -0
  117. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  118. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  119. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  120. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  121. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  122. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  123. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  124. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  125. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/utils/__init__.py +0 -0
  126. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/utils/diff.py +0 -0
  127. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  128. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/utils/io.py +0 -0
  129. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/utils/markdown.py +0 -0
  130. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/utils/serialization.py +0 -0
  131. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  132. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/utils/string.py +0 -0
  133. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/core/utils/terminal.py +0 -0
  134. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/prompts.py +0 -0
  135. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/registries/__init__.py +0 -0
  136. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/registries/infrastructure.py +0 -0
  137. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/registries/reviewer.py +0 -0
  138. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/registries/validators.py +0 -0
  139. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/MRP.xml +0 -0
  140. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/__init__.py +0 -0
  141. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/config/__init__.py +0 -0
  142. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/config/config.yaml +0 -0
  143. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/config/init.context +0 -0
  144. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/config/prompts/architect.xml +0 -0
  145. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/config/prompts/assistant.xml +0 -0
  146. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/config/prompts/debugger.xml +0 -0
  147. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/config/prompts/developer.xml +0 -0
  148. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/config/prompts/pathfinder.xml +0 -0
  149. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/config/prompts/prototyper.xml +0 -0
  150. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  151. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  152. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/templates/case-file.md +0 -0
  153. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/templates/ci.md +0 -0
  154. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/templates/component-design.md +0 -0
  155. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/templates/makefile.md +0 -0
  156. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/templates/milestone.md +0 -0
  157. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  158. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  159. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/src/teddy_executor/resources/templates/task-brief.md +0 -0
  160. {teddy_cli-0.1.17.dev1209 → teddy_cli-0.1.17.dev1211}/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.dev1209
3
+ Version: 0.1.17.dev1211
4
4
  Summary: A local-first, file-based AI coding workflow that applies the UNIX philosophy to AI collaboration.
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.dev1209"
3
+ version = "0.1.17.dev1211"
4
4
  description = "A local-first, file-based AI coding workflow that applies the UNIX philosophy to AI collaboration."
5
5
  authors = [{ name = "Raphael Atteritano" }]
6
6
  license = { text = "AGPL-3.0-only" }
@@ -369,10 +369,48 @@ def _orchestrate_session_loop(
369
369
  signal.signal(signal.SIGINT, previous_handler)
370
370
 
371
371
 
372
- def _display_update_notification(cache_path: Path) -> None:
372
+ def _display_drift_notification(container: Container) -> None:
373
+ """Advises the restore command when user prompts/templates have drifted.
374
+
375
+ Compares the user's ``.teddy/prompts/`` and ``docs/templates/`` against the
376
+ bundled defaults (via ``IInitUseCase.check_drift``) and, when they have
377
+ drifted (edited or missing), emits a yellow, actionable advice naming the
378
+ restore command(s). Advisory only: it runs on the preflight HEALTHY path and
379
+ never blocks the session. Gated by the checks.prompts_templates config
380
+ toggle (defaults to enabled).
381
+ """
382
+ config = container.resolve(IConfigService)
383
+ if not config.get_setting("checks.prompts_templates", True):
384
+ return
385
+
386
+ report = container.resolve(IInitUseCase).check_drift()
387
+ if not report.has_drift:
388
+ return
389
+
390
+ commands: list[str] = []
391
+ if report.prompts_drifted:
392
+ commands.append("teddy init prompts")
393
+ if report.templates_drifted:
394
+ commands.append("teddy init templates")
395
+
396
+ typer.echo(
397
+ typer.style(
398
+ "ℹ Prompt/template drift detected. To restore the bundled "
399
+ f"defaults, run: {' and '.join(commands)}\n",
400
+ fg=typer.colors.YELLOW,
401
+ )
402
+ )
403
+
404
+
405
+ def _display_update_notification(container: Container, cache_path: Path) -> None:
373
406
  """Check the update cache and display a non-blocking notification
374
407
  if a newer version is available. Called on session startup, after
375
- the background check thread has been started."""
408
+ the background check thread has been started. Gated by the
409
+ checks.update config toggle (defaults to enabled); a disabled toggle
410
+ suppresses the notification only -- the background fetch still runs."""
411
+ config = container.resolve(IConfigService)
412
+ if not config.get_setting("checks.update", True):
413
+ return
376
414
  try:
377
415
  cache = read_update_cache(cache_path)
378
416
  if cache is None:
@@ -428,7 +466,7 @@ def handle_new_session( # noqa: PLR0913
428
466
  daemon=True,
429
467
  )
430
468
  thread.start()
431
- _display_update_notification(cache_path)
469
+ _display_update_notification(container, cache_path)
432
470
 
433
471
  try:
434
472
  # 0. Pipeline mode requires an initial message
@@ -591,6 +629,7 @@ def _run_cli_preflight_check(
591
629
  # one-time setup stays decoupled from the approval flag (Slice 00-26).
592
630
  if setup_editor:
593
631
  _validate_editor_config(container)
632
+ _display_drift_notification(container)
594
633
  return
595
634
 
596
635
  error_msg = f"Configuration Error: {', '.join(errors)}"
@@ -977,7 +1016,7 @@ def handle_resume_session( # noqa: PLR0913
977
1016
  daemon=True,
978
1017
  )
979
1018
  thread.start()
980
- _display_update_notification(cache_path)
1019
+ _display_update_notification(container, cache_path)
981
1020
 
982
1021
  try:
983
1022
  # 1. Health checks (advisory, non-blocking)
@@ -0,0 +1,38 @@
1
+ """Domain model describing drift between user files and bundled defaults.
2
+
3
+ Seam Items 3/4 (session-behaviour): ``InitService.check_drift`` returns this
4
+ immutable report so the CLI preflight can advise ``teddy init prompts`` /
5
+ ``teddy init templates`` when the user's local copies have diverged from (or are
6
+ missing relative to) the bundled defaults.
7
+ """
8
+
9
+ from dataclasses import dataclass
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class DriftReport:
14
+ """Immutable summary of user files that diverge from bundled defaults.
15
+
16
+ Each field holds the *basenames* (e.g. ``pathfinder.xml``) of the affected
17
+ files, preserving the canonical manifest order for deterministic output.
18
+ """
19
+
20
+ edited_prompts: tuple[str, ...] = ()
21
+ missing_prompts: tuple[str, ...] = ()
22
+ edited_templates: tuple[str, ...] = ()
23
+ missing_templates: tuple[str, ...] = ()
24
+
25
+ @property
26
+ def prompts_drifted(self) -> bool:
27
+ """True when any user prompt is edited or missing."""
28
+ return bool(self.edited_prompts or self.missing_prompts)
29
+
30
+ @property
31
+ def templates_drifted(self) -> bool:
32
+ """True when any user template is edited or missing."""
33
+ return bool(self.edited_templates or self.missing_templates)
34
+
35
+ @property
36
+ def has_drift(self) -> bool:
37
+ """True when any user prompt or template has drifted from its default."""
38
+ return self.prompts_drifted or self.templates_drifted
@@ -1,5 +1,7 @@
1
1
  from abc import ABC, abstractmethod
2
2
 
3
+ from teddy_executor.core.domain.models.drift_report import DriftReport
4
+
3
5
 
4
6
  class IInitUseCase(ABC):
5
7
  """
@@ -60,3 +62,15 @@ class IInitUseCase(ABC):
60
62
  A human-readable status string (e.g., "Templates updated (11 files).").
61
63
  """
62
64
  pass
65
+
66
+ @abstractmethod
67
+ def check_drift(self) -> DriftReport:
68
+ """
69
+ Compares the user's prompts and templates against the bundled defaults.
70
+
71
+ Returns:
72
+ A DriftReport enumerating which ``.teddy/prompts/*.xml`` and
73
+ ``docs/templates/*.md`` files are edited or missing relative to the
74
+ bundled defaults.
75
+ """
76
+ pass
@@ -5,6 +5,7 @@ from importlib import resources
5
5
 
6
6
  import yaml
7
7
 
8
+ from teddy_executor.core.domain.models.drift_report import DriftReport
8
9
  from teddy_executor.core.ports.inbound.init import IInitUseCase
9
10
  from teddy_executor.core.ports.outbound.file_system_manager import IFileSystemManager
10
11
 
@@ -53,6 +54,19 @@ _TEMPLATE_FILES = [
53
54
  "pre-commit.md",
54
55
  ]
55
56
 
57
+ # Bundled prompt XMLs copied into a project's ``.teddy/prompts/`` by
58
+ # ``_init_prompts`` and compared by ``check_drift``. Kept as a fixed manifest
59
+ # (mirroring ``_TEMPLATE_FILES``) so the copy routine and the drift check share
60
+ # one single source of truth.
61
+ _PROMPT_FILES = [
62
+ "architect.xml",
63
+ "assistant.xml",
64
+ "debugger.xml",
65
+ "developer.xml",
66
+ "pathfinder.xml",
67
+ "prototyper.xml",
68
+ ]
69
+
56
70
 
57
71
  class InitService(IInitUseCase):
58
72
  """
@@ -189,14 +203,7 @@ class InitService(IInitUseCase):
189
203
  """
190
204
  return self._copy_bundled_files(
191
205
  dest_dir=".teddy/prompts",
192
- filenames=[
193
- "architect.xml",
194
- "assistant.xml",
195
- "debugger.xml",
196
- "developer.xml",
197
- "pathfinder.xml",
198
- "prototyper.xml",
199
- ],
206
+ filenames=_PROMPT_FILES,
200
207
  resolve_content=lambda fname: self._get_default_content(f"prompts/{fname}"),
201
208
  overwrite=overwrite,
202
209
  )
@@ -285,3 +292,59 @@ class InitService(IInitUseCase):
285
292
  """
286
293
  status = self._init_templates(overwrite=overwrite)
287
294
  return f"Templates {status}."
295
+
296
+ def _classify_drift(
297
+ self,
298
+ dest_dir: str,
299
+ filenames: Sequence[str],
300
+ resolve_bundled: Callable[[str], str | None],
301
+ ) -> tuple[tuple[str, ...], tuple[str, ...]]:
302
+ """Partitions ``filenames`` into (edited, missing) against bundled defaults.
303
+
304
+ A file is MISSING when its user copy is absent. It is EDITED when the
305
+ user copy exists, a bundled default is resolvable, and the two contents
306
+ differ. Unresolvable bundled defaults are skipped (never reported as
307
+ drift). Order is preserved from ``filenames`` for deterministic output.
308
+ """
309
+ edited: list[str] = []
310
+ missing: list[str] = []
311
+ for fname in filenames:
312
+ user_path = f"{dest_dir}/{fname}"
313
+ if not self._file_system.path_exists(user_path):
314
+ missing.append(fname)
315
+ continue
316
+ bundled_content = resolve_bundled(fname)
317
+ if bundled_content is None:
318
+ continue
319
+ if self._file_system.read_file(user_path) != bundled_content:
320
+ edited.append(fname)
321
+ return tuple(edited), tuple(missing)
322
+
323
+ def check_drift(self) -> DriftReport:
324
+ """Compares the user's prompts and templates against bundled defaults.
325
+
326
+ Reports which ``.teddy/prompts/*.xml`` and ``docs/templates/*.md`` files
327
+ have been EDITED away from their bundled default and which are MISSING,
328
+ so the CLI preflight can advise ``teddy init prompts`` /
329
+ ``teddy init templates``. An absent ``.teddy/prompts/`` directory simply
330
+ makes every prompt report as MISSING (per-file check, no directory
331
+ special-casing).
332
+ """
333
+ edited_prompts, missing_prompts = self._classify_drift(
334
+ dest_dir=".teddy/prompts",
335
+ filenames=_PROMPT_FILES,
336
+ resolve_bundled=lambda fname: self._get_default_content(f"prompts/{fname}"),
337
+ )
338
+ edited_templates, missing_templates = self._classify_drift(
339
+ dest_dir="docs/templates",
340
+ filenames=_TEMPLATE_FILES,
341
+ resolve_bundled=lambda fname: self._read_bundled_resource(
342
+ self._templates_dir, fname
343
+ ),
344
+ )
345
+ return DriftReport(
346
+ edited_prompts=edited_prompts,
347
+ missing_prompts=missing_prompts,
348
+ edited_templates=edited_templates,
349
+ missing_templates=missing_templates,
350
+ )