teddy-cli 0.1.17.dev1366__tar.gz → 0.1.17.dev1368__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.dev1366 → teddy_cli-0.1.17.dev1368}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/templates/makefile.md +37 -19
  4. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/.gitignore +0 -0
  5. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/LICENSE +0 -0
  6. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/README.md +0 -0
  7. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/__init__.py +0 -0
  8. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/__main__.py +0 -0
  9. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/__init__.py +0 -0
  10. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  11. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  12. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  13. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -0
  14. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  15. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  16. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  17. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  18. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  19. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  20. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  21. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  22. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  23. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  24. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  25. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  26. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  27. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  28. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  29. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  30. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  31. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  32. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  33. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  34. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  35. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  36. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  37. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  38. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  39. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  41. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  42. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/container.py +0 -0
  43. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/__init__.py +0 -0
  44. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/__init__.py +0 -0
  45. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  46. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  47. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  48. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  49. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  50. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  51. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  52. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/plan.py +0 -0
  53. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  54. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  55. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  56. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/session.py +0 -0
  57. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  58. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  59. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/__init__.py +0 -0
  60. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  61. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  62. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  63. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  64. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  65. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  66. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  67. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  68. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  69. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  70. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  71. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  72. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  73. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  74. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  75. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  76. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  77. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  78. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  79. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  80. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  81. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  82. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  83. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  84. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  85. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  86. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  87. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  88. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/__init__.py +0 -0
  89. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  90. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  91. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  92. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/action_executor.py +0 -0
  93. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/action_factory.py +0 -0
  94. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  95. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  96. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/context_service.py +0 -0
  97. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  98. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  99. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  100. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/init_service.py +0 -0
  101. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  102. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  103. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  104. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  105. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  106. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/plan_validator.py +0 -0
  107. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/planning_service.py +0 -0
  108. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  109. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  110. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  111. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  112. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/session_planner.py +0 -0
  113. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  114. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/session_replanner.py +0 -0
  115. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/session_repository.py +0 -0
  116. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/session_service.py +0 -0
  117. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  118. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/update_checker.py +0 -0
  119. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  120. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  121. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  122. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  123. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  124. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  125. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  126. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  127. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/utils/__init__.py +0 -0
  128. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/utils/diff.py +0 -0
  129. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  130. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/utils/io.py +0 -0
  131. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/utils/markdown.py +0 -0
  132. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/utils/paths.py +0 -0
  133. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/utils/serialization.py +0 -0
  134. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/utils/session_notices.py +0 -0
  135. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  136. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/utils/string.py +0 -0
  137. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/core/utils/terminal.py +0 -0
  138. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/prompts.py +0 -0
  139. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/registries/__init__.py +0 -0
  140. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/registries/infrastructure.py +0 -0
  141. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/registries/reviewer.py +0 -0
  142. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/registries/validators.py +0 -0
  143. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/MRP.md +0 -0
  144. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/__init__.py +0 -0
  145. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/config/__init__.py +0 -0
  146. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/config/config.yaml +0 -0
  147. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/config/init.context +0 -0
  148. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  149. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  150. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/config/prompts/debugger.md +0 -0
  151. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  152. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  153. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  154. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  155. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  156. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/templates/case-file.md +0 -0
  157. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/templates/ci.md +0 -0
  158. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/templates/component-design.md +0 -0
  159. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/templates/milestone.md +0 -0
  160. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  161. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  162. {teddy_cli-0.1.17.dev1366 → teddy_cli-0.1.17.dev1368}/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.dev1366
3
+ Version: 0.1.17.dev1368
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.dev1366"
3
+ version = "0.1.17.dev1368"
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 = [
@@ -13,7 +13,7 @@ make commit "feat(templates): add PROJECT.md template"
13
13
  ```
14
14
 
15
15
  **What is `.PHONY`?**
16
- `.PHONY` is a Makefile directive that declares `commit`, `push`, `ci-watch`, `probe`, `test`, and `logs` as phony targets — they do not correspond to actual files. Without `.PHONY`, if a file named `commit` or `probe` existed in the directory (e.g., a script called `commit`), Make would see it as up-to-date and skip the target entirely. By declaring them phony, Make always runs the recipe when you call `make commit`, `make push`, `make ci-watch`, `make probe`, or `make test`.
16
+ `.PHONY` is a Makefile directive that declares `commit`, `push`, `ci-watch`, `probe`, `test`, `logs`, and the internal `_preflight` gate as phony targets — they do not correspond to actual files. Without `.PHONY`, if a file named `commit` or `probe` existed in the directory (e.g., a script called `commit`), Make would see it as up-to-date and skip the target entirely. By declaring them phony, Make always runs the recipe when you call `make commit`, `make push`, `make ci-watch`, `make probe`, or `make test`.
17
17
 
18
18
  ### Push
19
19
  ```shell
@@ -86,7 +86,10 @@ Always use GNU Make native features for cross-platform compatibility instead of
86
86
 
87
87
  - **Native argument validation:** Use `$(if $(strip $(VAR)),,$(error Usage: ...))` instead of POSIX `[ -n "$$VAR" ]`. GNU Make validates parameters before spawning any shell process.
88
88
  - **Shell-less empty recipe:** Use `%: ;` to absorb extra command-line arguments. In Windows `cmd.exe`, the Unix built-in `@:` fails because `:` is reserved syntax for labels and drives. The empty recipe `%: ;` tells Make to do nothing without spawning a subshell.
89
- - **Windows shell selection:** Set `SHELL := bash.exe` when `OS` is `Windows_NT` so multi-line shell pipelines (`ci-watch`, `probe`, `logs`) execute through Git Bash.
89
+ - **POSIX shell preflight:** Every POSIX recipe target (`ci-watch`, `probe`, `logs`) depends on the internal `_preflight` target, which verifies `git`, `gh`, `awk`, and `sed` before any network call. It aborts with one actionable message instead of a generic `make: *** Error 1`.
90
+ - **Windows shell selection:** Set `SHELL := bash.exe` when `OS` is `Windows_NT` so multi-line shell pipelines (`ci-watch`, `probe`, `logs`) execute through Git Bash. `_preflight` also confirms that the shell is Git Bash rather than the WSL `bash.exe` shim, and it names the `SHELL=` override when it is not.
91
+ - **Portable quoting:** Pass values with double quotes, as in `--field reason="..."`, because Windows `cmd.exe` keeps single quotes literally.
92
+ - **ASCII-only output:** Recipe output stays ASCII, because a Windows console turns a non-ASCII dash into mojibake in captured logs.
90
93
  - **Native error suppression:** The Makefile uses Make's built-in `-` prefix (`-pre-commit run`) instead of shell-level `|| true` or `&&`/`||` chaining. Make suppresses non-zero exit codes natively before passing lines to the shell.
91
94
  - **Error transparency:** The first pre-commit pass is advisory, so its non-zero exit is ignored and auto-fixed files are re-staged. Git then runs the same hooks again during `git commit`, and that second run is the blocking local gate. A hook failure there aborts the commit. The post-commit test gate is the final safety net. `make push` runs `git pull --rebase` and `git push` without suppression, so a rebase conflict or push rejection surfaces as a non-zero exit.
92
95
 
@@ -119,7 +122,7 @@ commit: ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
119
122
  commit:
120
123
  $(if $(strip $(ARGS)),,$(error Usage: make commit '<message>'))
121
124
  git add .
122
- -pre-commit run
125
+ -uv run pre-commit run
123
126
  git add .
124
127
  git commit -m "$(ARGS)"
125
128
 
@@ -155,7 +158,7 @@ push:
155
158
 
156
159
  ## CI Watch & Attribution
157
160
 
158
- `make ci-watch` discovers **every** CI run for the target commit (`HEAD` by default, or `COMMIT=<sha>`), waits for and reports each workflow with its jobs. It answers ONE question: **did this commit turn a BLOCKING gate red?** Only push-triggered workflows are attributed; a downstream workflow that registers from a `workflow_run` event is not a regression in this commit. Only include and configure this target if a remote CI pipeline is configured or planned for the project.
161
+ `make ci-watch` discovers **every** CI run for the target commit (`HEAD` by default, or `COMMIT=<sha>`), waits for and reports each workflow with its jobs. The target depends on `_preflight`, so a missing `gh`, `awk`, or Git Bash shell fails once with an actionable message. Before polling, it rejects an unknown `COMMIT` and a commit that no remote branch contains, because no run can exist for an un-pushed commit. Every blocking verdict prints to stdout for the log and repeats its reason on stderr. It answers ONE question: **did this commit turn a BLOCKING gate red?** Only push-triggered workflows are attributed; a downstream workflow that registers from a `workflow_run` event is not a regression in this commit. Only include and configure this target if a remote CI pipeline is configured or planned for the project.
159
162
 
160
163
  The pushed RUN's own conclusion is authoritative: it already folds in `continue-on-error`, so a **non-blocking** job (e.g. the CI `Quality Checks` job) can NEVER block the session — it is reported as a triage item instead. Only when the run-level conclusion is `failure` does attribution run, comparing the pushed run's failing-JOB set against the base run's:
161
164
 
@@ -165,7 +168,7 @@ The pushed RUN's own conclusion is authoritative: it already folds in `continue-
165
168
  - **all green / non-blocking** → PASSED → **exit 0**.
166
169
  - **job-less base** → NOT green: a base run that exists but carries zero jobs (an invalid-workflow failure) is treated as an unknown base and fails safe (block).
167
170
 
168
- When any step fails — blocking or not — the target prints the failing step's name and its run id, then that step's log details (ANSI/timestamp-stripped and indented), bounded to `DETAIL_LINES` lines (default 50), and points to `make logs <run-id> '<step-name>'` for the full step log when needed.
171
+ When any step fails — blocking or not — the target prints the failing step's name and its run id, then that step's log details (ANSI/timestamp-stripped and indented), bounded to `DETAIL_LINES` lines (default 50), and points to `make logs <run-id> "<step-name>"` for the full step log when needed.
169
172
 
170
173
  Attribution is deterministic: SHA → run → run-level + per-job conclusion (never "the latest run").
171
174
 
@@ -185,12 +188,20 @@ DETAIL_LINES ?= 50
185
188
  BASE_DEPTH ?= 50
186
189
  BASE ?=
187
190
 
188
- ci-watch:
189
- @SHA=$$(git rev-parse $${COMMIT:-HEAD}); \
191
+ ci-watch: _preflight
192
+ @SHA=$$(git rev-parse --verify --quiet "$(or $(COMMIT),HEAD)^{commit}") || { \
193
+ echo "ERROR: '$(or $(COMMIT),HEAD)' is not a known commit. Pass COMMIT=<sha> for a commit that exists locally." >&2; \
194
+ exit 1; \
195
+ }; \
190
196
  if [ -z "$$(ls .github/workflows/*.yml .github/workflows/*.yaml 2>/dev/null)" ]; then \
191
197
  echo "No CI configured - skipping attribution"; \
192
198
  exit 0; \
193
199
  fi; \
200
+ if [ -n "$$(git remote)" ] && ! git branch -r --contains "$$SHA" 2>/dev/null | grep -q .; then \
201
+ echo "CI: commit $$SHA is not on any remote branch, so no run can exist." >&2; \
202
+ echo "CI: push the commit first, then retry." >&2; \
203
+ exit 1; \
204
+ fi; \
194
205
  STATUS=0; ATTEMPTS=0; WFS=""; \
195
206
  while [ -z "$$WFS" ] && [ $$ATTEMPTS -lt $(RETRY_POLLS) ]; do \
196
207
  WFS=$$(gh run list --commit "$$SHA" --json workflowName --jq '.[].workflowName' | sort -u); \
@@ -200,7 +211,9 @@ ci-watch:
200
211
  done; \
201
212
  echo "Watching CI for $$SHA after $$ATTEMPTS poll(s)"; \
202
213
  if [ -z "$$WFS" ]; then \
203
- echo "CI: no run registered for $$SHA after $$(( $(RETRY_POLLS) * $(RETRY_SLEEP) ))s - fail-safe block"; \
214
+ ELAPSED=$$(( $(RETRY_POLLS) * $(RETRY_SLEEP) )); \
215
+ echo "CI: no run registered for $$SHA after $${ELAPSED}s - fail-safe block"; \
216
+ echo "CI: no run registered for $$SHA after $${ELAPSED}s. Wait for CI to start, then retry." >&2; \
204
217
  exit 1; \
205
218
  fi; \
206
219
  WFLIST=$${TMPDIR:-/tmp}/ci-watch-workflows.$$$$; \
@@ -216,18 +229,19 @@ ci-watch:
216
229
  echo "$$WF: failing step(s): $$NEWSTEPS (run $$NEW)"; \
217
230
  gh run view "$$NEW" --log-failed 2>/dev/null | awk -F'\t' '{ l=$$3; p=index(l,"Z "); if(p>0)l=substr(l,p+2); gsub(/\x1B\[[0-9;]*[a-zA-Z]/,"",l); gsub(/\^\[\[[0-9;]*[a-zA-Z]/,"",l); if(l ~ /^##\[group\]/ || l ~ /^##\[endgroup\]/) next; gsub(/^##\[error\]/,"Error: ",l); print l }' | tail -n $(DETAIL_LINES) | sed 's/^/ /'; \
218
231
  echo " view all failed logs: make logs $$NEW"; \
219
- echo " view specific step: make logs $$NEW '<step-name>'"; \
232
+ echo " view specific step: make logs $$NEW \"<step-name>\""; \
220
233
  fi; \
221
234
  if [ "$$NEWCONC" = "success" ]; then \
222
235
  if [ -n "$$NEWFAIL" ]; then \
223
- echo "$$WF: PASSED (run=$$NEWCONC) — non-blocking failure(s) [$$NEWFAIL] — triage, does not block"; \
236
+ echo "$$WF: PASSED (run=$$NEWCONC) - non-blocking failure(s) [$$NEWFAIL] - triage, does not block"; \
224
237
  else \
225
238
  echo "$$WF: PASSED"; \
226
239
  fi; \
227
240
  continue; \
228
241
  fi; \
229
242
  if [ "$$NEWCONC" != "failure" ]; then \
230
- echo "$$WF: BLOCKING (run=$$NEWCONC) — unknown conclusion — fail-safe block"; \
243
+ echo "$$WF: BLOCKING (run=$$NEWCONC) - unknown conclusion - fail-safe block"; \
244
+ echo "$$WF: unknown conclusion '$$NEWCONC' on run $$NEW blocks the session." >&2; \
231
245
  STATUS=1; continue; \
232
246
  fi; \
233
247
  BASE="$(BASE)"; CUR="$$SHA"; DEPTH=0; \
@@ -240,25 +254,29 @@ ci-watch:
240
254
  DEPTH=$$((DEPTH + 1)); \
241
255
  done; \
242
256
  if [ -z "$$BASE" ]; then \
243
- echo "$$WF: BLOCKING failure ($$NEWFAIL) — no run-bearing ancestor (unknown base) — YOUR regression"; \
257
+ echo "$$WF: BLOCKING failure ($$NEWFAIL) - no run-bearing ancestor (unknown base) - YOUR regression"; \
258
+ echo "$$WF: no run-bearing ancestor within $(BASE_DEPTH) commits, so the baseline is unknown." >&2; \
244
259
  STATUS=1; continue; \
245
260
  fi; \
246
261
  OLD=$$(gh run list --commit "$$BASE" --workflow "$$WF" --json databaseId --jq '.[0].databaseId'); \
247
262
  if [ -z "$$OLD" ]; then \
248
- echo "$$WF: BLOCKING failure ($$NEWFAIL) — pinned base has no run (unknown base) — YOUR regression"; \
263
+ echo "$$WF: BLOCKING failure ($$NEWFAIL) - pinned base has no run (unknown base) - YOUR regression"; \
264
+ echo "$$WF: pinned base $$BASE carries no run for this workflow." >&2; \
249
265
  STATUS=1; continue; \
250
266
  fi; \
251
267
  OLDJOBS=$$(gh run view "$$OLD" --json jobs --jq '.jobs | length'); \
252
268
  if [ "$$OLDJOBS" = "0" ]; then \
253
- echo "$$WF: BLOCKING failure ($$NEWFAIL) — base run is job-less (invalid workflow, not green) — YOUR regression"; \
269
+ echo "$$WF: BLOCKING failure ($$NEWFAIL) - base run is job-less (invalid workflow, not green) - YOUR regression"; \
270
+ echo "$$WF: base run $$OLD carries zero jobs, so it cannot prove a green baseline." >&2; \
254
271
  STATUS=1; continue; \
255
272
  fi; \
256
273
  OLDFAIL=$$(gh run view "$$OLD" --json jobs --jq '[.jobs[] | select(.conclusion=="failure") | .name] | sort | join(",")'); \
257
274
  SUBSET=$$(awk -v new="$$NEWFAIL" -v old="$$OLDFAIL" 'BEGIN { n=split(new,na,","); m=split(old,oa,","); for (i=1;i<=n;i++) { if (na[i]=="") continue; f=0; for (j=1;j<=m;j++) { if (oa[j]==na[i]) { f=1; break } } if (!f) { print "regression"; exit } } print "pre-existing" }' </dev/null); \
258
275
  if [ "$$SUBSET" = "pre-existing" ]; then \
259
- echo "$$WF: pre-existing BLOCKING failure ($$NEWFAIL) — not yours"; \
276
+ echo "$$WF: pre-existing BLOCKING failure ($$NEWFAIL) - not yours"; \
260
277
  else \
261
- echo "$$WF: BLOCKING failure ($$NEWFAIL) — YOUR regression"; \
278
+ echo "$$WF: BLOCKING failure ($$NEWFAIL) - YOUR regression"; \
279
+ echo "$$WF: YOUR regression - run $$NEW turned these jobs red and base $$BASE did not: $$NEWFAIL" >&2; \
262
280
  STATUS=1; \
263
281
  fi; \
264
282
  done < "$$WFLIST"; \
@@ -282,7 +300,7 @@ probe:
282
300
  git add -f spikes/debug/probe.sh
283
301
  git commit -m 'debug: probe' --no-verify --allow-empty
284
302
  git push
285
- @gh workflow run debug.yml --field reason='$(REASON)'
303
+ @gh workflow run debug.yml --field reason="$(REASON)"
286
304
  @sleep 5
287
305
  @RUN_ID=$$(gh run list --workflow debug.yml -L 1 --json databaseId --jq '.[0].databaseId') && \
288
306
  gh run watch "$$RUN_ID" --exit-status >/dev/null 2>&1 && \
@@ -303,7 +321,7 @@ logs: LOGS_RUN := $(word 2,$(MAKECMDGOALS))
303
321
  logs: LOGS_STEP := $(wordlist 3,99,$(MAKECMDGOALS))
304
322
 
305
323
  logs:
306
- $(if $(strip $(LOGS_RUN)),,$(error Usage: make logs <run-id> ['<step-name>']))
324
+ $(if $(strip $(LOGS_RUN)),,$(error Usage: make logs <run-id> ["<step-name>"]))
307
325
  @if [ -z "$(LOGS_STEP)" ]; then \
308
326
  gh run view "$(LOGS_RUN)" --log-failed 2>/dev/null | awk -F'\t' '{ if(j!=$$1||s!=$$2){j=$$1;s=$$2;print "\n["j" > "s"]"} l=$$3; p=index(l,"Z "); if(p>0)l=substr(l,p+2); gsub(/\x1B\[[0-9;]*[a-zA-Z]/,"",l); gsub(/\^\[\[[0-9;]*[a-zA-Z]/,"",l); if(l ~ /^##\[group\]Run /){k=1;next} if(k && l ~ /^##\[endgroup\]/){k=0;next} if(k)next; if(l ~ /^##\[group\]/ || l ~ /^##\[endgroup\]/)next; gsub(/^##\[error\]/,"Error: ",l); print l }'; \
309
327
  else \
@@ -316,7 +334,7 @@ logs:
316
334
 
317
335
  **Usage:**
318
336
  - `make logs 12345` — extract logs for ALL failed steps from run `12345`.
319
- - `make logs 12345 'Run tests'` — extract logs for a specific step (substring match) from run `12345`.
337
+ - `make logs 12345 "Run tests"` — extract logs for a specific step (substring match) from run `12345`.
320
338
 
321
339
  **How it works:**
322
340
  - `$(word 2,$(MAKECMDGOALS))` takes the run ID and `$(wordlist 3,99,$(MAKECMDGOALS))` captures any optional step name.