teddy-cli 0.1.17.dev1191__tar.gz → 0.1.17.dev1192__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 (159) hide show
  1. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/init_service.py +147 -53
  4. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/.gitignore +0 -0
  5. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/LICENSE +0 -0
  6. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/__init__.py +0 -0
  7. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/__main__.py +0 -0
  8. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/__init__.py +0 -0
  9. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  10. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  11. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  12. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -0
  13. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  14. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  15. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  16. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  17. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  18. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  19. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  20. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  21. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  22. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  23. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  24. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  25. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  26. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  27. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  28. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  29. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  30. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  31. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  32. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  33. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  34. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  35. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  36. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  37. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  38. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  39. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  41. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/container.py +0 -0
  42. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/__init__.py +0 -0
  43. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/__init__.py +0 -0
  44. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  45. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  46. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  47. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  48. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  49. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  50. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/plan.py +0 -0
  51. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  52. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  53. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  54. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/session.py +0 -0
  55. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  56. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  57. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/__init__.py +0 -0
  58. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  59. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  60. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  61. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  62. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  63. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  64. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  65. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  66. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  67. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  68. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  69. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  70. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  71. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  72. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  73. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  74. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  75. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  76. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  77. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  78. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  79. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  80. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  81. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  82. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  83. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  84. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  85. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  86. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/__init__.py +0 -0
  87. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  88. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  89. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  90. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/action_executor.py +0 -0
  91. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/action_factory.py +0 -0
  92. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  93. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  94. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/context_service.py +0 -0
  95. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  96. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  97. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  98. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  99. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  100. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  101. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  102. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  103. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/plan_validator.py +0 -0
  104. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/planning_service.py +0 -0
  105. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  106. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  107. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  108. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  109. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/session_planner.py +0 -0
  110. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  111. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/session_replanner.py +0 -0
  112. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/session_repository.py +0 -0
  113. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/session_service.py +0 -0
  114. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  115. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/update_checker.py +0 -0
  116. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  117. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  118. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  119. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  120. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  121. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  122. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  123. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  124. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/utils/__init__.py +0 -0
  125. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/utils/diff.py +0 -0
  126. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  127. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/utils/io.py +0 -0
  128. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/utils/markdown.py +0 -0
  129. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/utils/serialization.py +0 -0
  130. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  131. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/utils/string.py +0 -0
  132. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/core/utils/terminal.py +0 -0
  133. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/prompts.py +0 -0
  134. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/registries/__init__.py +0 -0
  135. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/registries/infrastructure.py +0 -0
  136. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/registries/reviewer.py +0 -0
  137. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/registries/validators.py +0 -0
  138. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/MRP.xml +0 -0
  139. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/__init__.py +0 -0
  140. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/config/__init__.py +0 -0
  141. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/config/config.yaml +0 -0
  142. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/config/init.context +0 -0
  143. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/config/prompts/architect.xml +0 -0
  144. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/config/prompts/assistant.xml +0 -0
  145. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/config/prompts/debugger.xml +0 -0
  146. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/config/prompts/developer.xml +0 -0
  147. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/config/prompts/pathfinder.xml +0 -0
  148. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/config/prompts/prototyper.xml +0 -0
  149. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  150. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  151. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/templates/case-file.md +0 -0
  152. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/templates/ci.md +0 -0
  153. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/templates/component-design.md +0 -0
  154. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/templates/makefile.md +0 -0
  155. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/templates/milestone.md +0 -0
  156. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  157. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  158. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/src/teddy_executor/resources/templates/task-brief.md +0 -0
  159. {teddy_cli-0.1.17.dev1191 → teddy_cli-0.1.17.dev1192}/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.dev1191
3
+ Version: 0.1.17.dev1192
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.dev1191"
3
+ version = "0.1.17.dev1192"
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" }
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  import os
3
+ from collections.abc import Callable, Sequence
3
4
  from importlib import resources
4
5
 
5
6
  import yaml
@@ -33,13 +34,37 @@ _EMBEDDED_DEFAULTS = {
33
34
  # files are regenerable defaults that ``teddy init config`` intentionally resets.
34
35
  _CREATE_ONLY_CONFIG_FILES = frozenset({".env"})
35
36
 
37
+ # Bundled Markdown templates copied into a project's ``docs/templates/`` by
38
+ # ``_init_templates``. Kept as a fixed manifest (rather than a directory
39
+ # listing) so the copy is deterministic and mirrors the ``_init_prompts``
40
+ # pattern. Single source of truth for the template names, also imported by the
41
+ # unit tests to avoid shadow literals.
42
+ _TEMPLATE_FILES = [
43
+ "specification-document.md",
44
+ "task-brief.md",
45
+ "case-file.md",
46
+ "vertical-slice.md",
47
+ "milestone.md",
48
+ "component-design.md",
49
+ "ARCHITECTURE.md",
50
+ "PROJECT.md",
51
+ "makefile.md",
52
+ "ci.md",
53
+ "pre-commit.md",
54
+ ]
55
+
36
56
 
37
57
  class InitService(IInitUseCase):
38
58
  """
39
59
  Service for initializing projects.
40
60
  """
41
61
 
42
- def __init__(self, file_system: IFileSystemManager, config_dir: str | None = None):
62
+ def __init__(
63
+ self,
64
+ file_system: IFileSystemManager,
65
+ config_dir: str | None = None,
66
+ templates_dir: str | None = None,
67
+ ):
43
68
  self._file_system = file_system
44
69
  # Find the config directory relative to the package root if not provided
45
70
  if config_dir:
@@ -49,6 +74,73 @@ class InitService(IInitUseCase):
49
74
  resource_path = resources.files("teddy_executor.resources.config")
50
75
  # Ensure we resolve to an absolute string for compatibility with the FileSystem port
51
76
  self._config_dir = os.path.abspath(str(resource_path))
77
+ # Templates ship as a sibling directory of the bundled config package. We
78
+ # join onto ``resources`` (rather than resolving a ``resources.templates``
79
+ # subpackage) so the directory needs no ``__init__.py``.
80
+ if templates_dir:
81
+ self._templates_dir = templates_dir
82
+ else:
83
+ resource_path = resources.files("teddy_executor.resources") / "templates"
84
+ self._templates_dir = os.path.abspath(str(resource_path))
85
+
86
+ def _read_bundled_resource(self, base_dir: str, filename: str) -> str | None:
87
+ """Reads a bundled resource file from ``base_dir`` via the file-system port.
88
+
89
+ Returns ``None`` when the resource is absent or unreadable, so callers
90
+ can silently skip missing scaffold resources (logged at DEBUG).
91
+ """
92
+ try:
93
+ target_path = os.path.join(base_dir, filename)
94
+ if self._file_system.path_exists(target_path):
95
+ return self._file_system.read_file(target_path)
96
+ except (OSError, yaml.YAMLError, ImportError, AttributeError):
97
+ logging.getLogger(__name__).debug(
98
+ "Failed to load bundled resource %s", filename
99
+ )
100
+ return None
101
+
102
+ @staticmethod
103
+ def _format_init_status(count: int, overwrite: bool) -> str:
104
+ """Formats the shared copy-result status string.
105
+
106
+ Single-sources the "unchanged" / "updated (N files)" / "overwritten (N
107
+ files)" vocabulary shared by the config, prompts, and templates copy
108
+ routines.
109
+ """
110
+ if count == 0:
111
+ return "unchanged"
112
+ if overwrite:
113
+ return f"overwritten ({count} files)"
114
+ return f"updated ({count} files)"
115
+
116
+ def _copy_bundled_files(
117
+ self,
118
+ dest_dir: str,
119
+ filenames: Sequence[str],
120
+ resolve_content: Callable[[str], str | None],
121
+ overwrite: bool,
122
+ create_only: frozenset[str] = frozenset(),
123
+ ) -> str:
124
+ """Copies bundled resources into ``dest_dir`` via the file-system port.
125
+
126
+ Creates ``dest_dir`` when absent. Writes each ``filenames`` entry that is
127
+ missing, or every entry when ``overwrite`` is set -- except names listed
128
+ in ``create_only``, which are written only when absent. Content is
129
+ supplied by ``resolve_content``; a ``None`` result silently skips a
130
+ missing bundled resource. Returns the shared copy-result status string.
131
+ """
132
+ if not self._file_system.path_exists(dest_dir):
133
+ self._file_system.create_directory(dest_dir)
134
+ count = 0
135
+ for fname in filenames:
136
+ target_path = f"{dest_dir}/{fname}"
137
+ exists = self._file_system.path_exists(target_path)
138
+ if not exists or (overwrite and fname not in create_only):
139
+ content = resolve_content(fname)
140
+ if content is not None:
141
+ self._file_system.write_file(target_path, content)
142
+ count += 1
143
+ return self._format_init_status(count, overwrite)
52
144
 
53
145
  def _get_default_content(self, filename: str) -> str | None:
54
146
  """Loads default content for a bundled config file.
@@ -60,15 +152,7 @@ class InitService(IInitUseCase):
60
152
  """
61
153
  if filename in _EMBEDDED_DEFAULTS:
62
154
  return _EMBEDDED_DEFAULTS[filename]
63
- try:
64
- target_path = os.path.join(self._config_dir, filename)
65
- if self._file_system.path_exists(target_path):
66
- return self._file_system.read_file(target_path)
67
- except (OSError, yaml.YAMLError, ImportError, AttributeError):
68
- logging.getLogger(__name__).debug(
69
- "Failed to load default content for %s", filename
70
- )
71
- return None
155
+ return self._read_bundled_resource(self._config_dir, filename)
72
156
 
73
157
  def _init_config_dir(self, overwrite: bool = False) -> str:
74
158
  """Copies config files (config.yaml, .gitignore, init.context, .env) to .teddy/.
@@ -86,24 +170,13 @@ class InitService(IInitUseCase):
86
170
  Returns:
87
171
  A status string: "unchanged", "updated (N files)", or "overwritten (N files)".
88
172
  """
89
- config_files = ["config.yaml", ".gitignore", "init.context", ".env"]
90
- count = 0
91
- for fname in config_files:
92
- target_path = f".teddy/{fname}"
93
- exists = self._file_system.path_exists(target_path)
94
- should_write = not exists or (
95
- overwrite and fname not in _CREATE_ONLY_CONFIG_FILES
96
- )
97
- if should_write:
98
- content = self._get_default_content(fname)
99
- if content is not None:
100
- self._file_system.write_file(target_path, content)
101
- count += 1
102
- if count == 0:
103
- return "unchanged"
104
- if overwrite:
105
- return f"overwritten ({count} files)"
106
- return f"updated ({count} files)"
173
+ return self._copy_bundled_files(
174
+ dest_dir=".teddy",
175
+ filenames=["config.yaml", ".gitignore", "init.context", ".env"],
176
+ resolve_content=self._get_default_content,
177
+ overwrite=overwrite,
178
+ create_only=_CREATE_ONLY_CONFIG_FILES,
179
+ )
107
180
 
108
181
  def _init_prompts(self, overwrite: bool = False) -> str:
109
182
  """Copies bundled prompt XMLs to .teddy/prompts/.
@@ -114,31 +187,38 @@ class InitService(IInitUseCase):
114
187
  Returns:
115
188
  A status string: "unchanged", "updated (N files)", or "overwritten (N files)".
116
189
  """
117
- prompts_dir = ".teddy/prompts"
118
- if not self._file_system.path_exists(prompts_dir):
119
- self._file_system.create_directory(prompts_dir)
120
-
121
- prompt_files = [
122
- "architect.xml",
123
- "assistant.xml",
124
- "debugger.xml",
125
- "developer.xml",
126
- "pathfinder.xml",
127
- "prototyper.xml",
128
- ]
129
- count = 0
130
- for fname in prompt_files:
131
- target_path = f"{prompts_dir}/{fname}"
132
- if overwrite or not self._file_system.path_exists(target_path):
133
- content = self._get_default_content(f"prompts/{fname}")
134
- if content is not None:
135
- self._file_system.write_file(target_path, content)
136
- count += 1
137
- if count == 0:
138
- return "unchanged"
139
- if overwrite:
140
- return f"overwritten ({count} files)"
141
- return f"updated ({count} files)"
190
+ return self._copy_bundled_files(
191
+ 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
+ ],
200
+ resolve_content=lambda fname: self._get_default_content(f"prompts/{fname}"),
201
+ overwrite=overwrite,
202
+ )
203
+
204
+ def _init_templates(self, overwrite: bool = False) -> str:
205
+ """Copies bundled Markdown templates to docs/templates/.
206
+
207
+ Args:
208
+ overwrite: If True, always overwrite existing files.
209
+ If False (default), only write missing files.
210
+
211
+ Returns:
212
+ A status string: "unchanged", "updated (N files)", or "overwritten (N files)".
213
+ """
214
+ return self._copy_bundled_files(
215
+ dest_dir="docs/templates",
216
+ filenames=_TEMPLATE_FILES,
217
+ resolve_content=lambda fname: self._read_bundled_resource(
218
+ self._templates_dir, fname
219
+ ),
220
+ overwrite=overwrite,
221
+ )
142
222
 
143
223
  def ensure_initialized(self) -> str:
144
224
  """
@@ -186,3 +266,17 @@ class InitService(IInitUseCase):
186
266
  """
187
267
  status = self._init_config_dir(overwrite=overwrite)
188
268
  return f"Configuration files {status}."
269
+
270
+ def ensure_templates_initialized(self, overwrite: bool = False) -> str:
271
+ """
272
+ Ensures Markdown templates are present in the docs/templates/ directory.
273
+
274
+ Args:
275
+ overwrite: If True, always overwrite existing template files with
276
+ defaults. If False (default), only write missing files.
277
+
278
+ Returns:
279
+ A human-readable status string (e.g., "Templates updated (11 files).").
280
+ """
281
+ status = self._init_templates(overwrite=overwrite)
282
+ return f"Templates {status}."