teddy-cli 0.1.17.dev1275__tar.gz → 0.1.17.dev1277__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.dev1275 → teddy_cli-0.1.17.dev1277}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/MRP.xml +2 -1
  4. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/config/prompts/architect.xml +1 -1
  5. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/config/prompts/developer.xml +1 -1
  6. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/config/prompts/prototyper.xml +7 -7
  7. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/templates/ARCHITECTURE.md +1 -1
  8. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/templates/PROJECT.md +1 -1
  9. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/templates/ci.md +25 -9
  10. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/templates/makefile.md +43 -16
  11. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/.gitignore +0 -0
  12. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/LICENSE +0 -0
  13. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/__init__.py +0 -0
  14. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/__main__.py +0 -0
  15. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/__init__.py +0 -0
  16. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  17. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  18. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  19. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -0
  20. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  21. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  22. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  23. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  24. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  25. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  26. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  27. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  28. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  29. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  30. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  31. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  32. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  33. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  34. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  35. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  36. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  37. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  38. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  39. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  40. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  41. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  42. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  43. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  44. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  45. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  46. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  47. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  48. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/container.py +0 -0
  49. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/__init__.py +0 -0
  50. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/__init__.py +0 -0
  51. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  52. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  53. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  54. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  55. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  56. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  57. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  58. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/plan.py +0 -0
  59. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  60. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  61. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  62. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/session.py +0 -0
  63. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  64. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  65. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/__init__.py +0 -0
  66. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  67. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  68. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  69. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  70. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  71. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  72. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  73. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  74. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  75. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  76. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  77. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  78. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  79. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  80. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  81. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  82. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  83. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  84. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  85. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  86. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  87. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  88. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  89. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  90. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  91. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  92. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  93. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  94. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/__init__.py +0 -0
  95. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  96. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  97. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  98. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/action_executor.py +0 -0
  99. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/action_factory.py +0 -0
  100. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  101. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  102. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/context_service.py +0 -0
  103. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  104. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  105. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  106. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/init_service.py +0 -0
  107. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  108. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  109. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  110. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  111. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  112. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/plan_validator.py +0 -0
  113. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/planning_service.py +0 -0
  114. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  115. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  116. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  117. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  118. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/session_planner.py +0 -0
  119. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  120. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/session_replanner.py +0 -0
  121. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/session_repository.py +0 -0
  122. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/session_service.py +0 -0
  123. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  124. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/update_checker.py +0 -0
  125. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  126. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  127. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  128. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  129. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  130. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  131. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  132. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  133. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/utils/__init__.py +0 -0
  134. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/utils/diff.py +0 -0
  135. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  136. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/utils/io.py +0 -0
  137. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/utils/markdown.py +0 -0
  138. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/utils/paths.py +0 -0
  139. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/utils/serialization.py +0 -0
  140. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  141. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/utils/string.py +0 -0
  142. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/core/utils/terminal.py +0 -0
  143. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/prompts.py +0 -0
  144. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/registries/__init__.py +0 -0
  145. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/registries/infrastructure.py +0 -0
  146. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/registries/reviewer.py +0 -0
  147. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/registries/validators.py +0 -0
  148. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/__init__.py +0 -0
  149. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/config/__init__.py +0 -0
  150. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/config/config.yaml +0 -0
  151. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/config/init.context +0 -0
  152. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/config/prompts/assistant.xml +0 -0
  153. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/config/prompts/debugger.xml +0 -0
  154. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/config/prompts/pathfinder.xml +0 -0
  155. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/templates/case-file.md +0 -0
  156. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/templates/component-design.md +0 -0
  157. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/templates/milestone.md +0 -0
  158. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  159. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  160. {teddy_cli-0.1.17.dev1275 → teddy_cli-0.1.17.dev1277}/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.dev1275
3
+ Version: 0.1.17.dev1277
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.dev1275"
3
+ version = "0.1.17.dev1277"
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" }
@@ -50,7 +50,8 @@ NOTES:
50
50
  2. Commit Message: Use Conventional Commits `'<type>(<scope>): <description>'` in single quotes (imperative mood; append `!` for breaking changes) on a single line.
51
51
  3. Execution: Run `make commit '<type>(<scope>): <description>'`. This stages all local changes (`git add .`) and runs Git's local hooks before committing.
52
52
  4. Post-conditions: All tests MUST pass: the post-commit hook reverts automatically on failure and cannot be bypassed.
53
- 5. Push at Conclusion: In the Conclusion phase, run `make push` to rebase, push, and inspect CI: use `make logs <run-id> '<step-name>'` for full logs. If blocking test failures occur, fix them immediately, commit, and push again. For non-blocking quality gate results, address directly if localized, or record them in the roadmap in `docs/project/PROJECT.md` if not already planned.
53
+ 5. Push at Conclusion: In the Conclusion phase, run `make push` to rebase and push.
54
+ 6. If needed: to verify remote CI run `make ci-watch` to monitor workflow runs and to inspect results: use `make logs <run-id> '<step-name>'` for full logs.
54
55
  </rule>
55
56
 
56
57
  <rule n="7" name="Standardized Plan Types">
@@ -35,7 +35,7 @@
35
35
  <phase n="4" name="Conclusion">
36
36
  <goal>Clean up the workspace, commit changes, push, and hand off to the next agent.</goal>
37
37
  <step n="1" name="Cleanup">Delete temporary files, scratchpads, and diagnostic notes.</step>
38
- <step n="2" name="Commit and Push">Execute `make commit`, then run `make push` and inspect CI results</step>
38
+ <step n="2" name="Commit and Push">Execute `make commit`, then run `make push`.</step>
39
39
  <step n="3" name="Handoff">Message the user with instructions to start the next session, including the new Vertical Slice as a reference file. Route to the Prototyper if the slice contains unresolved Key Unknowns; otherwise route directly to the Developer.</step>
40
40
  </phase>
41
41
  </workflow>
@@ -110,7 +110,7 @@
110
110
 
111
111
  <phase n="7" name="Conclusion">
112
112
  <goal>Finalize remote synchronization and dynamically route the next session handoff.</goal>
113
- <step n="1" name="Remote Sync">Run `make push` to push commits and inspect CI results. If blocking test failures occur, fix them immediately, commit, and push again. For non-blocking quality gate issues, address them if contained or record them in the roadmap in `docs/project/PROJECT.md`.</step>
113
+ <step n="1" name="Remote Sync">Run `make push` to push commits, then run `make ci-watch` to monitor and inspect remote CI results. If blocking test failures occur, fix them immediately, commit, and push again. For non-blocking quality gate issues, address them if contained or record them in the roadmap in `docs/project/PROJECT.md`.</step>
114
114
  <step n="2" name="Handoff">Message the user to route the next session based on milestone state: the Architect if the next slice is un-designed, the Prototyper if it has unresolved Key Unknowns, the Developer if ready to implement, or the Pathfinder if all milestone slices are complete.</step>
115
115
  </phase>
116
116
  </workflow>
@@ -18,18 +18,18 @@
18
18
  <step n="2" name="Iteration Loop">Iterate until internal workings are deeply understood and all Technical and Functional unknowns are resolved. If an unexpected failure occurs, isolate it using a focused sub-prototype. Update Key Unknowns with any emerging uncertainties.</step>
19
19
  </phase>
20
20
 
21
- <phase n="3" name="Documentation">
22
- <goal>Translate verified findings into buildable slices, component designs, and specifications.</goal>
23
- <step n="1" name="Artifact Updates">EDIT the Vertical Slice to reflect validated scenarios, edge cases, implementation deliverables, and verification steps. Place Wiring first as the tracer bullet deliverable, followed by contract, logic, refactoring, and harness deliverables. Mark resolved unknowns as completed, link the prototype directory in the slice metadata, and set status to Planned. EDIT linked Component Design Docs and specs in `docs/project/specs/` to reflect as-tested contracts, parameters, and invariants discovered during prototyping.</step>
24
- <step n="2" name="Impact and Debt Audit">Run EXECUTE `git grep` on target components. If a modified component has more than one consumer, treat it as a Shared Seam and structure deliverables as a non-breaking parallel change: expand, migrate, contract. Ensure all contract changes include matching harness deliverables.</step>
25
- </phase>
26
-
27
- <phase n="4" name="Alignment">
21
+ <phase n="3" name="Alignment">
28
22
  <goal>Present prototype findings and demo to the user for explicit validation and approval.</goal>
29
23
  <step n="1" name="Showcase Presentation">Message the user to present findings in clear prose. For Technical unknowns, provide raw assertion evidence or benchmarks. For Functional unknowns, provide copy-pasteable execution commands and list adjustable knobs. Present the updated slice deliverables and component specifications.</step>
30
24
  <step n="2" name="Approval Gate">Await explicit user approval before proceeding to the Conclusion phase. If the user requests changes, refine the prototypes and artifacts, re-run verification, and re-align.</step>
31
25
  </phase>
32
26
 
27
+ <phase n="4" name="Documentation">
28
+ <goal>Translate verified findings into buildable slices, component designs, and specifications.</goal>
29
+ <step n="1" name="Impact and Debt Audit">Run EXECUTE `git grep` on target components. If a modified component has more than one consumer, treat it as a Shared Seam and structure deliverables as a non-breaking parallel change: expand, migrate, contract. Ensure all contract changes include matching harness deliverables.</step>
30
+ <step n="2" name="Artifact Updates">EDIT the Vertical Slice to reflect validated scenarios, edge cases, implementation deliverables, and verification steps. Place Wiring first as the tracer bullet deliverable, followed by contract, logic, refactoring, and harness deliverables. Mark resolved unknowns as completed, link the prototype directory in the slice metadata, and set status to Planned. EDIT linked Component Design Docs and specs in `docs/project/specs/` to reflect as-tested contracts, parameters, and invariants discovered during prototyping.</step>
31
+ </phase>
32
+
33
33
  <phase n="5" name="Conclusion">
34
34
  <goal>Clean workspace, commit changes, push, and hand off to the Developer.</goal>
35
35
  <step n="1" name="Cleanup">Delete scratch files and unapproved probes, preserving only the approved prototype directory under `spikes/prototypes/{scope-slug}/`.</step>
@@ -17,7 +17,7 @@ This section defines foundational engineering practices. Each entry MUST be a sp
17
17
  - **CI Pipeline:** Two parallel jobs — 1) Blocking OS matrix test suite with strict test coverage targets. 2) Non-blocking (continue-on-error: true) quality checks running fast formatters, linters, security/secret scanners, type checkers, and repository-wide structural checks (excluding sandboxes and third-party dependencies).
18
18
  - **Pre-commit Hooks:** Scope (staged files only) and keep the local loop fast — formatters, secret scanners, and merge-conflict checks only. Move heavy, false-positive-prone checks (type checkers, security scanners, repository-wide structural checkers) to the non-blocking CI quality job, scoped to a non-default pre-commit stage.
19
19
  - **Post-commit Execution:** Full test suite run on commit, automatic revert on failure.
20
- - **Makefile Commands:** The `Makefile` is the canonical entry point for the VCP commit workflow and on-demand test runs. `make test` runs the full suite, `make commit '<msg>'` performs a LOCAL-ONLY VCP commit (it runs the pre-commit hooks once as an advisory auto-fix pass and commits WITHOUT `--no-verify`, so Git's own pre-commit hook is the real local gate, while the post-commit test gate remains unskippable), `make push` rebases, pushes, and reports CI results back (deferred to the session Conclusion), and `make probe '<reason>'` runs the Remote Probing Protocol. See [docs/templates/makefile.md](docs/templates/makefile.md).
20
+ - **Makefile Commands:** The `Makefile` is the canonical entry point for the VCP commit workflow and on-demand test runs. `make test` runs the full suite, `make commit '<msg>'` performs a LOCAL-ONLY VCP commit (it runs the pre-commit hooks once as an advisory auto-fix pass and commits WITHOUT `--no-verify`, so Git's own pre-commit hook is the real local gate, while the post-commit test gate remains unskippable), `make push` rebases and pushes, `make ci-watch` watches remote CI and reports results (used by Developer at slice conclusion), and `make probe '<reason>'` runs the Remote Probing Protocol. See [docs/templates/makefile.md](docs/templates/makefile.md).
21
21
 
22
22
  ### Pre-commit Quick-Start
23
23
 
@@ -25,7 +25,7 @@ Defines the high-level artifact lifecycle and conventions for project management
25
25
  - **Archiving Policy:** When and how completed artifacts are archived or deleted.
26
26
  - **Spec Organization:** Specification documents live in a single flat directory `docs/project/specs/` and are reserved strictly for **permanent system invariants** — formats, contracts, protocols (e.g. the MRP), core data models, and non-negotiable architectural rules. Feature goals, requirements, and acceptance criteria belong in Milestone documents (`docs/project/milestones/`), not in specs. There is no ephemeral `specs/features/` lifecycle.
27
27
  - **Run Environment:** Specify the project's designated environment/dependency manager (e.g., `uv`, `poetry`, `pip`) and prefix ALL execution commands with its runner (e.g., `uv run pytest`). The chosen runner MUST be reflected in the `Makefile`.
28
- - **Build & Run Commands:** Document the standard commands in the project `Makefile` (see [docs/templates/makefile.md](docs/templates/makefile.md)). At minimum: `make test` (full suite), `make commit '<msg>'` (VCP), and `make probe '<reason>'` (Remote Probing Protocol).
28
+ - **Build & Run Commands:** Document the standard commands in the project `Makefile` (see [docs/templates/makefile.md](docs/templates/makefile.md)). At minimum: `make test` (full suite), `make commit '<msg>'` (VCP), `make push`, `make ci-watch` (CI monitoring), and `make probe '<reason>'` (Remote Probing Protocol).
29
29
  - **Release Process:** Document how releases are cut. At minimum: (1) **Triage** the scope (patch/minor/major) from conventional commits since the last tag; (2) write **release notes** to `docs/project/releases/v<version>.md`; (3) bump the `version` field in the project manifest; (4) present the notes and version bump at an **approval gate**; (5) **commit** (`chore(release): bump version to <version>`) and **tag** (`git tag -a v<version>`); and (6) **publish** (e.g. create a GitHub Release). Adapt the concrete commands to the project's packaging and distribution channel.
30
30
 
31
31
  ## Templates
@@ -15,8 +15,8 @@ The CI pipeline consists of two parallel jobs:
15
15
  - **Blocking:** If this job fails, the CI pipeline is marked as failed.
16
16
 
17
17
  ### Job 2: Non-Blocking Quality Checks
18
- - Runs the pre-commit hooks in two explicit passes: the fast hooks (formatters, `detect-secrets`, merge-conflict check) at the default `pre-commit` stage, then the heavy hooks (type checkers, security/dependency scanners, and the repository-wide structural checkers) at the non-default `manual` stage.
19
- - The heavy hooks are scoped to the `manual` stage so they never slow down the local pre-commit loop; CI invokes both stages explicitly.
18
+ - Runs granular quality checks in separate steps with `if: success() || failure()`, ensuring that all checks execute and report their outcomes even if an earlier check fails.
19
+ - Scopes heavy checks (type checkers, security/dependency scanners, structural checkers) to the non-default `manual` stage so they never slow down the local pre-commit loop.
20
20
  - Excludes sandboxes (`spikes/`) and third-party dependencies.
21
21
  - **Non-Blocking:** Configured with `continue-on-error: true` so quality failures do not block the pipeline.
22
22
 
@@ -97,16 +97,32 @@ jobs:
97
97
  - name: Install dependencies
98
98
  run: {runner} sync --frozen
99
99
 
100
- # Quote any step name that contains a colon. An unquoted YAML plain
101
- # scalar cannot contain ": " (colon+space) — it would be parsed as a
102
- # nested mapping and fail the entire workflow.
103
- - name: "Run Pre-commit Hooks (fast: formatters, secrets)"
100
+ # Each check runs with `if: success() || failure()` so all checks run
101
+ # even if an earlier check fails.
102
+ - name: "Secrets Check (detect-secrets)"
103
+ if: success() || failure()
104
104
  run: |
105
- {runner} pre-commit run --all-files
105
+ {runner} pre-commit run detect-secrets --all-files
106
106
 
107
- - name: "Run Pre-commit Hooks (heavy: types, security, structural)"
107
+ - name: "Code Formatting (ruff format)"
108
+ if: success() || failure()
108
109
  run: |
109
- {runner} pre-commit run --all-files --hook-stage manual
110
+ {runner} pre-commit run ruff-format --all-files
111
+
112
+ - name: "Linter (ruff check)"
113
+ if: success() || failure()
114
+ run: |
115
+ {runner} pre-commit run ruff-lint --all-files
116
+
117
+ - name: "Type Checker (mypy)"
118
+ if: success() || failure()
119
+ run: |
120
+ {runner} pre-commit run mypy --all-files --hook-stage manual
121
+
122
+ - name: "Security Audit (bandit & pip-audit)"
123
+ if: success() || failure()
124
+ run: |
125
+ {runner} pre-commit run bandit pip-audit --all-files --hook-stage manual
110
126
  ```
111
127
 
112
128
  ## Debug Workflow (Remote Probing Protocol)
@@ -13,13 +13,21 @@ 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`, `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 probe`, or `make test`.
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`.
17
17
 
18
18
  ### Push
19
19
  ```shell
20
20
  make push
21
21
  ```
22
22
 
23
+ ### CI Watch
24
+ ```shell
25
+ make ci-watch
26
+ ```
27
+
28
+ **What does `make ci-watch` do?**
29
+ `make ci-watch` resolves the commit hash from `HEAD` (or an explicit `COMMIT=<sha>`), polls GitHub Actions to allow for workflow registration lag, watches all running workflows for that commit, prints failing step details, and attributes regressions. It is used by the Developer at slice conclusion to verify remote CI without slowing down routine pushes.
30
+
23
31
  ### Test
24
32
  ```shell
25
33
  make test
@@ -128,7 +136,21 @@ commit:
128
136
 
129
137
  ## Push (Deferred to Conclusion)
130
138
 
131
- `make push` runs `git pull --rebase`, captures the base and the pushed SHA, pushes, then discovers **every** CI run for the pushed SHA (`gh run list --commit <sha>`) and waits for and reports each workflow with its jobs. It answers ONE question: **did this push turn a BLOCKING gate red?**
139
+ `make push` is fast and non-blocking: it runs `git pull --rebase` and pushes local commits to remote.
140
+
141
+ ### Example
142
+
143
+ ```makefile
144
+ push:
145
+ git pull --rebase
146
+ git push
147
+ ```
148
+
149
+ **Usage:** `make push`
150
+
151
+ ## CI Watch & Attribution
152
+
153
+ `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?**
132
154
 
133
155
  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:
134
156
 
@@ -141,24 +163,22 @@ When any step fails — blocking or not — the target prints the failing step's
141
163
 
142
164
  Attribution is deterministic: SHA → run → run-level + per-job conclusion (never "the latest run").
143
165
 
144
- Three behaviors make the attribution trustworthy:
166
+ Key behaviors:
145
167
 
146
- 1. **The base is captured BEFORE the push.** `BASE=$$(git rev-parse origin/main)` is read immediately after `git pull --rebase` and before `git push`; otherwise the push advances `origin/main` and `BASE` collapses onto the pushed SHA, making every comparison trivially equal (a real regression would be silently misclassified as pre-existing). `git push` is folded into the same shell block behind `|| exit $$?` so a rejected push still aborts the target.
147
- 2. **Registration lag is tolerated by a bounded retry.** CI may not have registered a run for the pushed SHA yet; the target polls `gh run list --commit <sha>` up to `RETRY_POLLS × RETRY_SLEEP` (default 10 × 1s ≈ 10s) before attributing, then fails safe if the run never registers.
148
- 3. **No CI is non-blocking.** If the repository has no workflow files under `.github/workflows/` (`*.yml`/`*.yaml`), the target logs `No CI configured - skipping attribution` and exits 0 — a CI-less repo is never blocked. This is distinct from a repo WITH CI whose pushed SHA registered no run (that still fail-safe blocks).
168
+ 1. **Automatic SHA and BASE resolution.** `SHA` defaults to current `HEAD` (or `COMMIT=<sha>`), and `BASE` defaults to `HEAD~1`.
169
+ 2. **Registration lag is tolerated by a bounded retry.** CI may not have registered a run for the pushed SHA immediately; the target polls `gh run list --commit <sha>` up to `RETRY_POLLS × RETRY_SLEEP` (default 10 × 2s ≈ 20s) before attributing, then fails safe if the run never registers.
170
+ 3. **No CI is non-blocking.** If the repository has no workflow files under `.github/workflows/` (`*.yml`/`*.yaml`), the target logs `No CI configured - skipping attribution` and exits 0.
149
171
 
150
172
  ### Example
151
173
 
152
174
  ```makefile
153
175
  RETRY_POLLS ?= 10
154
- RETRY_SLEEP ?= 1
176
+ RETRY_SLEEP ?= 2
155
177
  DETAIL_LINES ?= 50
156
178
 
157
- push:
158
- git pull --rebase
159
- @BASE=$$(git rev-parse origin/main); \
160
- SHA=$$(git rev-parse HEAD); \
161
- git push || exit $$?; \
179
+ ci-watch:
180
+ @SHA=$$(git rev-parse $${COMMIT:-HEAD}); \
181
+ BASE=$$(git rev-parse $${COMMIT:-HEAD}~1 2>/dev/null || echo ""); \
162
182
  if [ -z "$$(ls .github/workflows/*.yml .github/workflows/*.yaml 2>/dev/null)" ]; then \
163
183
  echo "No CI configured - skipping attribution"; \
164
184
  exit 0; \
@@ -170,9 +190,9 @@ push:
170
190
  ATTEMPTS=$$((ATTEMPTS + 1)); \
171
191
  sleep $(RETRY_SLEEP); \
172
192
  done; \
173
- echo "Pushed $$SHA (base $$BASE) after $$ATTEMPTS poll(s)"; \
193
+ echo "Watching CI for $$SHA (base $${BASE:-none}) after $$ATTEMPTS poll(s)"; \
174
194
  if [ -z "$$WFS" ]; then \
175
- echo "CI: no run registered for $$SHA after $(RETRY_POLLS) poll(s) - fail-safe block"; \
195
+ echo "CI: no run registered for $$SHA after $$(( $(RETRY_POLLS) * $(RETRY_SLEEP) ))s - fail-safe block"; \
176
196
  exit 1; \
177
197
  fi; \
178
198
  for WF in $$WFS; do \
@@ -194,6 +214,10 @@ push:
194
214
  fi; \
195
215
  continue; \
196
216
  fi; \
217
+ if [ -z "$$BASE" ]; then \
218
+ echo "$$WF: BLOCKING failure ($$NEWFAIL) — no base commit — YOUR regression"; \
219
+ STATUS=1; continue; \
220
+ fi; \
197
221
  OLD=$$(gh run list --commit "$$BASE" --workflow "$$WF" --json databaseId --jq '.[0].databaseId'); \
198
222
  if [ -z "$$OLD" ]; then \
199
223
  echo "$$WF: BLOCKING failure ($$NEWFAIL) — base has no run (unknown base) — YOUR regression"; \
@@ -215,7 +239,9 @@ push:
215
239
  exit $$STATUS
216
240
  ```
217
241
 
218
- **Usage:** `make push`
242
+ **Usage:**
243
+ - `make ci-watch` (watches CI for current `HEAD`)
244
+ - `make ci-watch COMMIT=<sha>` (watches CI for a specific commit)
219
245
 
220
246
  ## Remote Probing Protocol (RPP)
221
247
 
@@ -273,4 +299,5 @@ logs:
273
299
  - Post-commit hook lives at `.githooks/post-commit.py` and runs the full `uv run pytest` suite.
274
300
  - Ensure `gh` (GitHub CLI) is authenticated for `make push`, the Remote Probing Protocol, and CI Log Extraction.
275
301
  - The `make logs` target abstracts the Debugger's CI-log extraction (Phase 1, Step 2). See [CI Log Extraction](#ci-log-extraction).
276
- - `make push` runs in the session Conclusion phase (see [Push (Deferred to Conclusion)](#push-deferred-to-conclusion)); it rebases, pushes, and reports CI results back.
302
+ - `make push` runs in the session Conclusion phase (see [Push (Deferred to Conclusion)](#push-deferred-to-conclusion)); it rebases and pushes.
303
+ - `make ci-watch` monitors and attributes CI results for `HEAD` or an explicit commit (see [CI Watch & Attribution](#ci-watch--attribution)).