teddy-cli 0.1.17.dev1414__tar.gz → 0.1.17.dev1416__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 (165) hide show
  1. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/MRP.md +2 -2
  4. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/config/prompts/debugger.md +2 -2
  5. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/templates/ARCHITECTURE.md +2 -2
  6. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/templates/PROJECT.md +1 -1
  7. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/templates/ci.md +1 -1
  8. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/templates/makefile.md +35 -36
  9. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/.gitignore +0 -0
  10. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/LICENSE +0 -0
  11. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/README.md +0 -0
  12. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/__init__.py +0 -0
  13. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/__main__.py +0 -0
  14. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/__init__.py +0 -0
  15. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  16. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  17. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  18. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -0
  19. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  20. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  21. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  22. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  23. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  24. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  25. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  26. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  27. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  28. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  29. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  30. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  31. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  32. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  33. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  34. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  35. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  36. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  37. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  38. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  39. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  40. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  41. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  42. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  43. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  44. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  45. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  46. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  47. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/container.py +0 -0
  48. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/__init__.py +0 -0
  49. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/__init__.py +0 -0
  50. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  51. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  52. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  53. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/config_schema.py +0 -0
  54. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  55. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  56. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  57. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  58. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/plan.py +0 -0
  59. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  60. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  61. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  62. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/session.py +0 -0
  63. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  64. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  65. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/__init__.py +0 -0
  66. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  67. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  68. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  69. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  70. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  71. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  72. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  73. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  74. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  75. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  76. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  77. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  78. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  79. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  80. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  81. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  82. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  83. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  84. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  85. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  86. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  87. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  88. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  89. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  90. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  91. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  92. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  93. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  94. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/__init__.py +0 -0
  95. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  96. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  97. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  98. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/action_executor.py +0 -0
  99. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/action_factory.py +0 -0
  100. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  101. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  102. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/context_service.py +0 -0
  103. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  104. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  105. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  106. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/init_service.py +0 -0
  107. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  108. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  109. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  110. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  111. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  112. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/plan_validator.py +0 -0
  113. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/planning_service.py +0 -0
  114. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  115. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  116. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  117. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  118. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/session_planner.py +0 -0
  119. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  120. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/session_replanner.py +0 -0
  121. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/session_repository.py +0 -0
  122. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/session_service.py +0 -0
  123. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  124. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/update_checker.py +0 -0
  125. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  126. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  127. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  128. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  129. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  130. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  131. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  132. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  133. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/__init__.py +0 -0
  134. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/diff.py +0 -0
  135. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/editor_names.py +0 -0
  136. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
  137. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/interruptible_call.py +0 -0
  138. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/io.py +0 -0
  139. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/markdown.py +0 -0
  140. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/paths.py +0 -0
  141. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/serialization.py +0 -0
  142. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/session_notices.py +0 -0
  143. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  144. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/string.py +0 -0
  145. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/core/utils/terminal.py +0 -0
  146. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/prompts.py +0 -0
  147. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/registries/__init__.py +0 -0
  148. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/registries/infrastructure.py +0 -0
  149. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/registries/reviewer.py +0 -0
  150. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/registries/validators.py +0 -0
  151. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/__init__.py +0 -0
  152. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/config/__init__.py +0 -0
  153. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/config/config.yaml +0 -0
  154. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/config/init.context +0 -0
  155. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  156. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  157. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  158. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  159. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  160. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/templates/case-file.md +0 -0
  161. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/templates/component-design.md +0 -0
  162. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/templates/milestone.md +0 -0
  163. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  164. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  165. {teddy_cli-0.1.17.dev1414 → teddy_cli-0.1.17.dev1416}/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.dev1414
3
+ Version: 0.1.17.dev1416
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.dev1414"
3
+ version = "0.1.17.dev1416"
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 = [
@@ -64,10 +64,10 @@ The entire commit cycle (test, stage, commit) MUST occur in a dedicated Version
64
64
 
65
65
  1. Pre-conditions: Clean up temporary files. If recurring script, test, or tool detritus appears, do not just delete it manually: update `.gitignore` or configure the script to write outside tracked directories. If unsure of changes, inspect via `EXECUTE git add . && git diff HEAD`.
66
66
  2. Commit Message: Use Conventional Commits `"<type>(<scope>): <description>"` in double quotes (imperative mood; plain text without backticks, quotes, or `$`; append `!` for breaking changes) on a single line.
67
- 3. Execution: Run `make commit "<type>(<scope>): <description>"`. This stages all local changes (`git add .`) and runs Git's local hooks before committing.
67
+ 3. Execution: Run `make commit MSG="<type>(<scope>): <description>"`. This stages all local changes (`git add .`) and runs Git's local hooks before committing.
68
68
  4. Post-conditions: All tests MUST pass: the post-commit hook reverts automatically on failure and cannot be bypassed.
69
69
  5. Push at Conclusion: In the Conclusion phase, if a remote is configured, run `make push`.
70
- 6. CI Monitoring: If remote CI is configured and a push occurred, run `make ci-watch` to monitor workflow runs and to inspect results: use `make logs <run-id>` (or `make logs <run-id> '<step-name>'`) for full logs.
70
+ 6. CI Monitoring: If remote CI is configured and a push occurred, run `make ci-watch` to monitor workflow runs and to inspect results: use `make logs RUN=<run-id>` (or `make logs RUN=<run-id> STEP="<step-name>"`) for full logs.
71
71
 
72
72
  ### Standardized Plan Types
73
73
 
@@ -14,7 +14,7 @@ Follow these phases and steps in order. Keep track of your progress in your Stat
14
14
  1. **Case File Check:**
15
15
  If a Case File was not provided in the initial context, CREATE one following the case file template and path conventions.
16
16
  2. **Context and History Gathering:**
17
- Use EXECUTE `git grep`, EXECUTE `git log`, READ, and RESEARCH to understand the codebase, recent changes, and identify the last known green CI run or commit. For historical CI failures, do not try to read the entire log: extract failed step logs by executing `make logs [ID]` (for all failed steps) or `make logs [ID] "[STEP_NAME]"` (for a specific step).
17
+ Use EXECUTE `git grep`, EXECUTE `git log`, READ, and RESEARCH to understand the codebase, recent changes, and identify the last known green CI run or commit. For historical CI failures, do not try to read the entire log: extract failed step logs by executing `make logs RUN=[ID]` (for all failed steps) or `make logs RUN=[ID] STEP="[STEP_NAME]"` (for a specific step).
18
18
  3. **Diagnostic MRE and Platform Check:**
19
19
  Trigger the symptom: if an existing command, test, or CI failure exists, execute it to observe the failure live. If the bug is reported verbally or without an existing test, write a targeted probe script in `spikes/debug/{scope-slug}/` to trigger the symptom.
20
20
 
@@ -26,7 +26,7 @@ Follow these phases and steps in order. Keep track of your progress in your Stat
26
26
  - **Probe file:**
27
27
  consolidate diagnostic logic into the single shell entry point `spikes/debug/probe.sh` following the Makefile template pattern. Output must be written to `spikes/debug/probe_output.txt` for artifact upload, using the single-file Heredoc pattern.
28
28
  - **Execution:**
29
- use `make probe "<reason>"` to push the probe, trigger the workflow, and retrieve logs.
29
+ use `make probe REASON="<reason>"` to push the probe, trigger the workflow, and retrieve logs.
30
30
 
31
31
  ### Investigation
32
32
  **Goal:** Peel back internal layers to resolve discrepancies and update the Causal Model.
@@ -14,13 +14,13 @@ This section defines foundational engineering practices. Each entry MUST be a sp
14
14
  - **Runtime Contract Assertions:** Enforce Design-by-Contract with native `assert condition, "message"` for pre/post-conditions and invariants (strippable via `python -O`); never custom exceptions for contract checks.
15
15
  - **Dependency Injection:** Constructor injection mandate; forbid Service Locator and global containers.
16
16
  - **Centralized Configuration:** Config file location, prohibition of magic numbers.
17
- - **Continuous Integration & Remote Diagnostics:** Parallel CI jobs: 1) Blocking OS matrix test suite. 2) Non-blocking (`continue-on-error: true`) quality checks running fast formatters, linters, security scanners, type checkers, and repository-wide structural checks. Platform-specific and CI-only issues are investigated via the Remote Probing Protocol (`make probe '<reason>'`). See [docs/templates/ci.md](docs/templates/ci.md).
17
+ - **Continuous Integration & Remote Diagnostics:** Parallel CI jobs: 1) Blocking OS matrix test suite. 2) Non-blocking (`continue-on-error: true`) quality checks running fast formatters, linters, security scanners, type checkers, and repository-wide structural checks. Platform-specific and CI-only issues are investigated via the Remote Probing Protocol (`make probe REASON="<reason>"`). See [docs/templates/ci.md](docs/templates/ci.md).
18
18
  - **Local Quality Gates (Pre-commit & Post-commit):** Local pre-commit hooks MUST stay fast, checking only staged files (formatters, secret detection, merge conflict markers). Heavy, false-positive-prone checks run non-blocking in CI. The full test suite runs via the post-commit hook (`.githooks/post-commit.py`) as an unskippable safety net, reverting automatically on failure. See [docs/templates/pre-commit.md](docs/templates/pre-commit.md).
19
19
  - **Diagnostic Instrumentation:** High-value diagnostics MUST use zero-cost language-native dead-code elimination (e.g. `if __debug__:`) and Composition Root toggles; mid-logic environment checks are forbidden.
20
20
  - **Experimental Code:** The `spikes/` directory is reserved for rapid, isolated experimentation (`debug/`, `prototypes/`, `showcases/`) and is explicitly excluded from all quality gates (linters, type checkers, test suites).
21
21
  - **Directory Conventions:**
22
22
  `docs/architecture/BOUNDARY/LAYER/TYPE/name.md` -> Source path: `src/{pkg}/BOUNDARY/LAYER/TYPE/name.ext` -> Test path: `tests/suites/TEST_TYPE/BOUNDARY/LAYER/TYPE/test_name.ext`
23
- - **Makefile Commands:** The `Makefile` is the canonical entry point for the version control workflow and on-demand test runs: `make test` (full suite), `make commit '<msg>'` (local commit with advisory auto-fix and unskippable post-commit test gate), `make push` (rebase and push), `make ci-watch` (CI monitoring), and `make probe '<reason>'` (Remote Probing Protocol). See [docs/templates/makefile.md](docs/templates/makefile.md).
23
+ - **Makefile Commands:** The `Makefile` is the canonical entry point for the version control workflow and on-demand test runs: `make test` (full suite), `make commit MSG="<msg>"` (local commit with advisory auto-fix and unskippable post-commit test gate), `make push` (rebase and push), `make ci-watch` (CI monitoring), and `make probe REASON="<reason>"` (Remote Probing Protocol). See [docs/templates/makefile.md](docs/templates/makefile.md).
24
24
 
25
25
  ## Ubiquitous Language
26
26
 
@@ -24,7 +24,7 @@ Defines the high-level artifact lifecycle and conventions for project management
24
24
  - **Milestone 0 (bootstrapping) & Ad-hoc work (not tied to a milestone):** `00-NN-name.md` (in `docs/project/slices/`) — `00` is used as the Milestone prefix for Milestone 0 bootstrapping slices and for ad-hoc slices. Ad-hoc slices are NOT tracked in Milestone documents or the Roadmap.
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.
27
- - **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>'`, `make push`, `make ci-watch` (CI monitoring), and `make probe '<reason>'` (Remote Probing Protocol).
27
+ - **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="<msg>"`, `make push`, `make ci-watch` (CI monitoring), and `make probe REASON="<reason>"` (Remote Probing Protocol).
28
28
  - **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.
29
29
 
30
30
  ## Templates
@@ -162,7 +162,7 @@ jobs:
162
162
 
163
163
  ### How to use it
164
164
  1. Create a probe script at `spikes/debug/remote_probe.sh` containing diagnostic logic.
165
- 2. Commit and push via: `make probe 'reason for probing'`
165
+ 2. Commit and push via: `make probe REASON="reason for probing"`
166
166
  3. The Makefile will: push the probe → trigger the workflow → wait for completion → retrieve logs.
167
167
 
168
168
  ### Prerequisites
@@ -9,11 +9,18 @@ and the Debugger's Remote Probing Protocol (RPP). Below are concrete examples ad
9
9
 
10
10
  ### Commit
11
11
  ```shell
12
- make commit "feat(templates): add PROJECT.md template"
12
+ make commit MSG="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`, `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`.
16
+ `.PHONY` is a Makefile directive that declares `commit`, `push`, `ci-watch`, `probe`, `test`, `logs`, `help`, 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
+
18
+ ### Help
19
+ ```shell
20
+ make
21
+ ```
22
+
23
+ The default goal is `help`, so a bare `make` prints the target list. An unknown goal aborts with its own name instead of an "up to date" line.
17
24
 
18
25
  ### Push
19
26
  ```shell
@@ -38,7 +45,7 @@ make test
38
45
 
39
46
  ### Probe
40
47
  ```shell
41
- make probe "investigate windows path handling"
48
+ make probe REASON="investigate windows path handling"
42
49
  ```
43
50
 
44
51
  **Why does `probe` need a reason?**
@@ -46,12 +53,12 @@ The Remote Probing Protocol requires a reason string because it is passed as the
46
53
 
47
54
  ### Logs
48
55
  ```shell
49
- make logs 12345 # extract logs for ALL failed steps
50
- make logs 12345 "Run tests" # extract logs for a specific step (substring match)
56
+ make logs RUN=12345 # extract logs for ALL failed steps
57
+ make logs RUN=12345 STEP="Run tests" # extract logs for a specific step (substring match)
51
58
  ```
52
59
 
53
60
  **How does `make logs` work?**
54
- The first argument is the GitHub Actions run ID (as shown by `gh run list`). If invoked without a second argument, it extracts and formats logs for **all failed steps** using `gh run view --log-failed`. An optional second argument filters down to a specific step using substring matching, stripping ANSI escapes and GitHub boilerplate so you see the failure without noise. See [CI Log Extraction](#ci-log-extraction).
61
+ The `RUN` value is the GitHub Actions run ID (as shown by `gh run list`). If `STEP` is omitted, it extracts and formats logs for **all failed steps** using `gh run view --log-failed`. An optional `STEP` value filters down to a specific step using substring matching, stripping ANSI escapes and GitHub boilerplate so you see the failure without noise. See [CI Log Extraction](#ci-log-extraction).
55
62
 
56
63
  ## Probe Script
57
64
 
@@ -85,13 +92,14 @@ EOF
85
92
  Always use GNU Make native features for cross-platform compatibility instead of shell-specific constructs:
86
93
 
87
94
  - **Native argument validation:** Use `$(if $(strip $(VAR)),,$(error Usage: ...))` instead of POSIX `[ -n "$$VAR" ]`. GNU Make validates parameters before spawning any shell process.
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.
95
+ - **Named inputs instead of positional goals:** Pass values as `NAME="value"`, as in `make commit MSG="feat(scope): add thing"`. GNU Make treats a command-line assignment as a variable, so no word of the value can become a goal. Positional capture through `$(MAKECMDGOALS)` is forbidden, because a word that names a real target executes that target.
96
+ - **Parse-time goal validation:** Compare `$(MAKECMDGOALS)` against a `_KNOWN_GOALS` list and abort with `$(error ...)` when a goal is unknown or when more than one goal is present. The check runs while Make reads the file, so no recipe line can run first.
89
97
  - **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
98
  - **Shell routing for Bash-only commands:** Make spawns a recipe line directly when the line carries no shell metacharacter. That direct spawn bypasses `SHELL`. On Windows it fails for Git Bash-only programs such as `sleep` and for shell builtins such as `echo`. Keep these commands inside a shell block that carries `;`, `&&`, or a variable expansion.
91
99
  - **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.
92
100
  - **Portable quoting:** Pass values with double quotes, as in `--field reason="..."`, because Windows `cmd.exe` keeps single quotes literally.
93
101
  - **ASCII-only output:** Recipe output stays ASCII, because a Windows console turns a non-ASCII dash into mojibake in captured logs.
94
- - **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.
102
+ - **Explicit advisory fallback:** The advisory pre-commit pass consumes its own exit code with `|| echo "<sentence>"`, so a failing run prints one plain sentence. Make's `-` prefix is forbidden here, because it prints a bare `Error 1 (ignored)` line that reads as an unexplained defect.
95
103
  - **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.
96
104
 
97
105
  ## Test Workflow
@@ -118,25 +126,22 @@ test:
118
126
  ### Example
119
127
 
120
128
  ```makefile
121
- commit: ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
122
-
123
129
  commit:
124
- $(if $(strip $(ARGS)),,$(error Usage: make commit '<message>'))
130
+ $(if $(strip $(MSG)),,$(error Usage: make commit MSG="<type>(<scope>): <description>"))
125
131
  git add .
126
- -uv run pre-commit run
132
+ @uv run pre-commit run || echo "Advisory pre-commit reported issues. Auto-fixed files were re-staged and the commit continues."
127
133
  git add .
128
- git commit -m "$(ARGS)"
134
+ git commit -m "$(MSG)"
129
135
 
130
- # Empty recipe absorbs extra arguments without invoking a subshell.
131
- %: ;
132
136
  ```
133
137
 
134
138
  **Usage:**
135
- - `make commit 'feat(templates): add PROJECT.md template'`
139
+ - `make commit MSG="feat(templates): add PROJECT.md template"`
136
140
 
137
- **Message-input contract:** the recipe captures the message from the extra `make` goals via `$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))`. Supported input:
141
+ **Message-input contract:** the message arrives in the named variable `MSG`, so its words are data and never goals. Supported input:
138
142
 
139
- - ✅ **Single-line Conventional Commits in double quotes survive verbatim** — e.g. `make commit "feat(scope): add thing"`. Always use double quotes across all operating systems.
143
+ - ✅ **Single-line Conventional Commits in double quotes survive verbatim** — e.g. `make commit MSG="feat(scope): add thing"`. Always use double quotes across all operating systems.
144
+ - ✅ **`#` survives** — Make keeps the character inside a quoted command-line value, so `MSG="fix: close #42"` commits that subject.
140
145
  - ❌ **`$VAR` is swallowed or expanded** — `make` and shells expand `$(...)`/`$X`; avoid `$`.
141
146
  - ❌ **Backticks trigger command substitution** in POSIX shells when inside double quotes; avoid backticks.
142
147
  - ❌ **Multiline messages fail hard** (`unexpected EOF`).
@@ -169,7 +174,7 @@ The pushed RUN's own conclusion is authoritative: it already folds in `continue-
169
174
  - **all green / non-blocking** → PASSED → **exit 0**.
170
175
  - **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).
171
176
 
172
- 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.
177
+ 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=<run-id> STEP="<step-name>"` for the full step log when needed.
173
178
 
174
179
  Attribution is deterministic: SHA → run → run-level + per-job conclusion (never "the latest run").
175
180
 
@@ -229,8 +234,8 @@ ci-watch: _preflight
229
234
  if [ -n "$$NEWSTEPS" ]; then \
230
235
  echo "$$WF: failing step(s): $$NEWSTEPS (run $$NEW)"; \
231
236
  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/^/ /'; \
232
- echo " view all failed logs: make logs $$NEW"; \
233
- echo " view specific step: make logs $$NEW \"<step-name>\""; \
237
+ echo " view all failed logs: make logs RUN=$$NEW"; \
238
+ echo " view specific step: make logs RUN=$$NEW STEP=\"<step-name>\""; \
234
239
  fi; \
235
240
  if [ "$$NEWCONC" = "success" ]; then \
236
241
  if [ -n "$$NEWFAIL" ]; then \
@@ -294,11 +299,10 @@ ci-watch: _preflight
294
299
  ### Example
295
300
 
296
301
  ```makefile
297
- probe: REASON := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
298
302
  probe: _preflight
299
303
 
300
304
  probe:
301
- $(if $(strip $(REASON)),,$(error Usage: make probe '<reason>'))
305
+ $(if $(strip $(REASON)),,$(error Usage: make probe REASON="<reason>"))
302
306
  git add -f spikes/debug/probe.sh
303
307
  git commit -m "debug: probe" --no-verify --allow-empty
304
308
  git push
@@ -321,7 +325,7 @@ probe:
321
325
  cat spikes/debug/probe_output.txt 2>/dev/null || echo "(no output file)"
322
326
  ```
323
327
 
324
- **Usage:** `make probe 'investigate windows path handling'`
328
+ **Usage:** `make probe REASON="investigate windows path handling"`
325
329
 
326
330
  `make probe` resolves the dispatched run by the pushed SHA inside a bounded retry loop. It reuses `RETRY_POLLS` and `RETRY_SLEEP` from the CI watch section. The dispatch, the run resolution, the watch, and the download stay in one shell block, because a metacharacter-free line would bypass the recipe shell on Windows. The target rejects the probe with a stderr reason when no run registers for that SHA, so a stale run can never be mistaken for the new probe.
327
331
 
@@ -332,27 +336,22 @@ The Debugger's Reproduction phase needs to read CI logs without drowning in the
332
336
  ### Example
333
337
 
334
338
  ```makefile
335
- logs: LOGS_RUN := $(word 2,$(MAKECMDGOALS))
336
- logs: LOGS_STEP := $(wordlist 3,99,$(MAKECMDGOALS))
337
-
338
339
  logs:
339
- $(if $(strip $(LOGS_RUN)),,$(error Usage: make logs <run-id> ["<step-name>"]))
340
- @if [ -z "$(LOGS_STEP)" ]; then \
341
- 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 }'; \
340
+ $(if $(strip $(RUN)),,$(error Usage: make logs RUN=<run-id> [STEP="<step-name>"]))
341
+ @if [ -z "$(STEP)" ]; then \
342
+ gh run view "$(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 }'; \
342
343
  else \
343
- gh run view "$(LOGS_RUN)" --log 2>/dev/null | awk -F'\t' -v step="$(LOGS_STEP)" 'index($$2, step) > 0 { 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 }'; \
344
+ gh run view "$(RUN)" --log 2>/dev/null | awk -F'\t' -v step="$(STEP)" 'index($$2, step) > 0 { 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 }'; \
344
345
  fi
345
346
 
346
- # Empty recipe absorbs extra arguments without invoking a subshell.
347
- %: ;
348
347
  ```
349
348
 
350
349
  **Usage:**
351
- - `make logs 12345` — extract logs for ALL failed steps from run `12345`.
352
- - `make logs 12345 "Run tests"` — extract logs for a specific step (substring match) from run `12345`.
350
+ - `make logs RUN=12345` — extract logs for ALL failed steps from run `12345`.
351
+ - `make logs RUN=12345 STEP="Run tests"` — extract logs for a specific step (substring match) from run `12345`.
353
352
 
354
353
  **How it works:**
355
- - `$(word 2,$(MAKECMDGOALS))` takes the run ID and `$(wordlist 3,99,$(MAKECMDGOALS))` captures any optional step name.
354
+ - `RUN` carries the run ID and `STEP` carries the optional step name. Both arrive as command-line variables, so neither can become a goal.
356
355
  - When no step name is provided, `gh run view --log-failed` is used so only failed steps are fetched and printed with `[job > step]` headers.
357
356
  - When a step name is supplied, `index($2, step) > 0` performs substring matching against column 2.
358
357
  - Timestamps and ANSI escapes are stripped, and `##[error]` lines are prefixed with `Error: `.