teddy-cli 0.1.17.dev1290__tar.gz → 0.1.17.dev1291__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.
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/PKG-INFO +1 -1
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/pyproject.toml +1 -1
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +10 -3
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/container.py +19 -1
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_orchestrator.py +7 -8
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/interrupt_guard.py +13 -0
- teddy_cli-0.1.17.dev1291/src/teddy_executor/core/utils/session_notices.py +42 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/.gitignore +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/LICENSE +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/__main__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/change_set.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/plan.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/project_context.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/session.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/init.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_executor.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_factory.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/context_service.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/edit_simulator.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/init_service.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/parser_metadata.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/parser_reporting.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/plan_validator.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/planning_service.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/prompt_manager.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_planner.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_replanner.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_repository.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/session_service.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/update_checker.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/diff.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/io.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/markdown.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/paths.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/serialization.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/string.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/terminal.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/prompts.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/registries/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/registries/infrastructure.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/registries/reviewer.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/registries/validators.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/MRP.xml +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/__init__.py +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/config.yaml +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/init.context +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/architect.xml +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/assistant.xml +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/debugger.xml +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/developer.xml +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/pathfinder.xml +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/config/prompts/prototyper.xml +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/case-file.md +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/ci.md +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/component-design.md +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/makefile.md +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/milestone.md +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/specification-document.md +0 -0
- {teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/vertical-slice.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "teddy-cli"
|
|
3
|
-
version = "0.1.17.
|
|
3
|
+
version = "0.1.17.dev1291"
|
|
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" }
|
|
@@ -17,7 +17,8 @@ from teddy_executor.core.ports.outbound.user_interactor import IUserInteractor
|
|
|
17
17
|
from teddy_executor.core.ports.outbound.session_loop_guard import ISessionLoopGuard
|
|
18
18
|
from teddy_executor.core.ports.outbound.config_service import IConfigService
|
|
19
19
|
from teddy_executor.core.ports.outbound.session_repository import ISessionRepository
|
|
20
|
-
from teddy_executor.core.utils.interrupt_guard import
|
|
20
|
+
from teddy_executor.core.utils.interrupt_guard import InterruptGuard
|
|
21
|
+
from teddy_executor.core.utils.session_notices import format_interrupt_notice
|
|
21
22
|
from teddy_executor.core.utils.string import canonical_agent_name, slugify
|
|
22
23
|
from teddy_executor.adapters.inbound.cli_formatter import format_project_context
|
|
23
24
|
from teddy_executor.adapters.inbound.cli_helpers import (
|
|
@@ -358,7 +359,10 @@ def _orchestrate_session_loop( # noqa: PLR0913
|
|
|
358
359
|
# the orchestrator's turn-transition path. EXIT the session so the
|
|
359
360
|
# user regains control instead of auto-advancing to the next turn.
|
|
360
361
|
if interrupt_guard.interrupted.is_set():
|
|
361
|
-
typer.secho(
|
|
362
|
+
typer.secho(
|
|
363
|
+
format_interrupt_notice(interrupt_guard.source),
|
|
364
|
+
fg=typer.colors.YELLOW,
|
|
365
|
+
)
|
|
362
366
|
break
|
|
363
367
|
|
|
364
368
|
cumulative_cost = float(report.metadata.get("cumulative_cost", 0.0))
|
|
@@ -376,7 +380,10 @@ def _orchestrate_session_loop( # noqa: PLR0913
|
|
|
376
380
|
# Immediate-exit semantics (Task Brief): Ctrl+C while nothing is in
|
|
377
381
|
# flight (prompts, planning) terminates the session with a notice —
|
|
378
382
|
# no report is generated and nothing is mutated.
|
|
379
|
-
typer.secho(
|
|
383
|
+
typer.secho(
|
|
384
|
+
format_interrupt_notice(interrupt_guard.source),
|
|
385
|
+
fg=typer.colors.YELLOW,
|
|
386
|
+
)
|
|
380
387
|
finally:
|
|
381
388
|
# Caller-owned restoration contract: restore the SIGINT disposition
|
|
382
389
|
# that preceded the guard's install() when the turn loop ends. Stop the
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import os
|
|
4
|
+
import signal
|
|
3
5
|
import time
|
|
4
6
|
|
|
5
7
|
import punq
|
|
@@ -31,6 +33,20 @@ def create_container() -> punq.Container:
|
|
|
31
33
|
return container
|
|
32
34
|
|
|
33
35
|
|
|
36
|
+
def _record_quit_source(container: punq.Container) -> None:
|
|
37
|
+
"""Record the bare-`q` source on the shared guard, then self-deliver SIGINT.
|
|
38
|
+
|
|
39
|
+
Invoked from the quit-key listener's reader thread when `q` is pressed.
|
|
40
|
+
Recording the source lets the boundary notice name `q` instead of the
|
|
41
|
+
default `Ctrl+C`; the self-delivered SIGINT then drives the shared guard's
|
|
42
|
+
already-tested WAITING/EXECUTING branch unchanged.
|
|
43
|
+
"""
|
|
44
|
+
from teddy_executor.core.utils.interrupt_guard import InterruptGuard
|
|
45
|
+
|
|
46
|
+
container.resolve(InterruptGuard).record_source("q")
|
|
47
|
+
os.kill(os.getpid(), signal.SIGINT)
|
|
48
|
+
|
|
49
|
+
|
|
34
50
|
def _register_services(container: punq.Container) -> None:
|
|
35
51
|
"""Registers core application services."""
|
|
36
52
|
from teddy_executor.core.ports.inbound.edit_simulator import IEditSimulator
|
|
@@ -176,7 +192,9 @@ def _register_orchestration_services(container: punq.Container) -> None:
|
|
|
176
192
|
# so ONE instance serves the boundary's install/restore window.
|
|
177
193
|
container.register(
|
|
178
194
|
IQuitKeyListener,
|
|
179
|
-
factory=lambda: TerminalQuitKeyListener(
|
|
195
|
+
factory=lambda: TerminalQuitKeyListener(
|
|
196
|
+
on_quit=lambda: _record_quit_source(container)
|
|
197
|
+
),
|
|
180
198
|
scope=punq.Scope.singleton,
|
|
181
199
|
)
|
|
182
200
|
container.register(
|
|
@@ -14,6 +14,7 @@ from teddy_executor.core.ports.inbound.run_plan_use_case import IRunPlanUseCase
|
|
|
14
14
|
from teddy_executor.core.ports.outbound.file_system_manager import IFileSystemManager
|
|
15
15
|
from teddy_executor.core.services.session_replanner import SessionReplanner
|
|
16
16
|
from teddy_executor.core.utils.io import Tee as _Tee
|
|
17
|
+
from teddy_executor.core.utils.session_notices import format_termination_notice
|
|
17
18
|
from teddy_executor.core.utils.terminal import emit_user_message
|
|
18
19
|
import typer
|
|
19
20
|
|
|
@@ -304,12 +305,10 @@ class SessionOrchestrator(IRunPlanUseCase):
|
|
|
304
305
|
)
|
|
305
306
|
if user_reply is not None and not user_reply.strip():
|
|
306
307
|
typer.secho(
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
typer.secho(
|
|
312
|
-
"To continue the session, use `teddy resume [session_path]`.",
|
|
308
|
+
format_termination_notice(
|
|
309
|
+
"Session terminated (empty message)."
|
|
310
|
+
),
|
|
311
|
+
fg=typer.colors.YELLOW,
|
|
313
312
|
err=True,
|
|
314
313
|
)
|
|
315
314
|
return None # type: ignore
|
|
@@ -334,9 +333,9 @@ class SessionOrchestrator(IRunPlanUseCase):
|
|
|
334
333
|
elif is_session and plan_path:
|
|
335
334
|
report = self._handle_aborted_session(report, plan)
|
|
336
335
|
if report is None:
|
|
337
|
-
typer.secho("\nSession terminated.", fg=typer.colors.RED, err=True)
|
|
338
336
|
typer.secho(
|
|
339
|
-
"
|
|
337
|
+
format_termination_notice("Session terminated."),
|
|
338
|
+
fg=typer.colors.YELLOW,
|
|
340
339
|
err=True,
|
|
341
340
|
)
|
|
342
341
|
return None # type: ignore
|
|
@@ -51,6 +51,10 @@ class InterruptGuard:
|
|
|
51
51
|
self._grace_window = GRACE_WINDOW_SECONDS
|
|
52
52
|
self._monotonic = monotonic
|
|
53
53
|
self.interrupted = threading.Event()
|
|
54
|
+
# The key that triggered the interrupt (e.g. "q"), recorded by the
|
|
55
|
+
# quit-key listener before it self-delivers SIGINT. None means a
|
|
56
|
+
# genuine Ctrl+C (or a direct interrupted.set() in tests).
|
|
57
|
+
self.source: Optional[str] = None
|
|
54
58
|
self._executing = False
|
|
55
59
|
self._first_signal_at: Optional[float] = None
|
|
56
60
|
|
|
@@ -62,6 +66,15 @@ class InterruptGuard:
|
|
|
62
66
|
"""
|
|
63
67
|
return signal.signal(signal.SIGINT, self._handle_signal)
|
|
64
68
|
|
|
69
|
+
def record_source(self, source: str) -> None:
|
|
70
|
+
"""Record which key triggered the interrupt (e.g. ``"q"``).
|
|
71
|
+
|
|
72
|
+
The quit-key listener's ``on_quit`` callback calls this BEFORE
|
|
73
|
+
self-delivering SIGINT so the boundary notice can name the key the
|
|
74
|
+
user actually pressed instead of defaulting to ``Ctrl+C``.
|
|
75
|
+
"""
|
|
76
|
+
self.source = source
|
|
77
|
+
|
|
65
78
|
def _handle_signal(self, signum: int, frame: Optional[FrameType]) -> None:
|
|
66
79
|
"""The installed SIGINT handler; branches on the current phase."""
|
|
67
80
|
if not self._executing:
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Shared session-termination and interrupt notice strings.
|
|
2
|
+
|
|
3
|
+
Single source for the resume hint and the interrupt-notice composition so the
|
|
4
|
+
session-loop boundary (interrupt notices) and the session orchestrator
|
|
5
|
+
(termination notices) render the same actionable next step.
|
|
6
|
+
|
|
7
|
+
The interrupt notice names the key the user actually pressed: the shared
|
|
8
|
+
guard's ``source`` marker (set by the bare-``q`` listener callback) when
|
|
9
|
+
present, and the ``Ctrl+C`` default otherwise.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from typing import Optional
|
|
13
|
+
|
|
14
|
+
from teddy_executor.core.utils.interrupt_guard import INTERRUPT_REASON
|
|
15
|
+
|
|
16
|
+
# The single resume hint shared by every termination and interrupt notice.
|
|
17
|
+
RESUME_HINT = "To continue the session, use `teddy resume`."
|
|
18
|
+
|
|
19
|
+
# Key label used when no interrupt source was recorded (a genuine Ctrl+C).
|
|
20
|
+
DEFAULT_INTERRUPT_KEY = "Ctrl+C"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def format_interrupt_notice(source: Optional[str] = None) -> str:
|
|
24
|
+
"""Compose the one-line interrupt notice naming the pressed key.
|
|
25
|
+
|
|
26
|
+
The prefix is derived from ``INTERRUPT_REASON`` (sans its trailing period)
|
|
27
|
+
so the boundary notice and the audit-trail reason stay in lockstep; the key
|
|
28
|
+
label defaults to ``Ctrl+C`` when no source was recorded.
|
|
29
|
+
"""
|
|
30
|
+
key = source or DEFAULT_INTERRUPT_KEY
|
|
31
|
+
return f"{INTERRUPT_REASON.removesuffix('.')} ({key}). {RESUME_HINT}"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def format_termination_notice(reason: str) -> str:
|
|
35
|
+
"""Compose a one-line termination notice ending with the shared resume hint.
|
|
36
|
+
|
|
37
|
+
``reason`` is the situation-specific lead-in (e.g. ``"Session terminated."``
|
|
38
|
+
or ``"Session terminated (empty message)."``); the shared ``RESUME_HINT``
|
|
39
|
+
is appended so every termination notice ends with the same actionable next
|
|
40
|
+
step on a single line.
|
|
41
|
+
"""
|
|
42
|
+
return f"{reason} {RESUME_HINT}"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/domain/models/plan.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/ports/inbound/init.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/services/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/markdown.py
RENAMED
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/paths.py
RENAMED
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/serialization.py
RENAMED
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/string.py
RENAMED
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/core/utils/terminal.py
RENAMED
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/registries/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/registries/reviewer.py
RENAMED
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/registries/validators.py
RENAMED
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.17.dev1290 → teddy_cli-0.1.17.dev1291}/src/teddy_executor/resources/templates/ci.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|