teddy-cli 0.1.16.dev1151__tar.gz → 0.1.16.dev1152__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.16.dev1151 → teddy_cli-0.1.16.dev1152}/PKG-INFO +1 -1
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/pyproject.toml +1 -1
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/__main__.py +7 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +6 -1
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +12 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/file_system_manager.py +9 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/session_manager.py +8 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_service.py +84 -35
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/.gitignore +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/LICENSE +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/container.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/change_set.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/plan.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/project_context.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/session.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/init.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_executor.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_factory.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/context_service.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/edit_simulator.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/init_service.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/parser_metadata.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/parser_reporting.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/plan_validator.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/planning_service.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/prompt_manager.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_planner.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_replanner.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/session_repository.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/update_checker.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/diff.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/interrupt_guard.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/io.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/markdown.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/serialization.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/string.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/terminal.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/prompts.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/registries/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/registries/infrastructure.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/registries/reviewer.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/registries/validators.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/__init__.py +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/config.yaml +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/init.context +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/architect.xml +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/assistant.xml +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/debugger.xml +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/developer.xml +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/pathfinder.xml +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/config/prompts/prototyper.xml +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/MM-NN-vertical-slice.md +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/MM-milestone.md +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/NN-case-file.md +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/NN-task-brief.md +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/ci.md +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/component-design.md +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/makefile.md +0 -0
- {teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/specification-document.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "teddy-cli"
|
|
3
|
-
version = "0.1.16.
|
|
3
|
+
version = "0.1.16.dev1152"
|
|
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" }
|
|
@@ -447,6 +447,12 @@ def resume( # noqa: PLR0913
|
|
|
447
447
|
api_key: Optional[str] = typer.Option(
|
|
448
448
|
None, "--api-key", help="LLM API key override."
|
|
449
449
|
),
|
|
450
|
+
agent: Optional[str] = typer.Option(
|
|
451
|
+
None,
|
|
452
|
+
"--agent",
|
|
453
|
+
"-a",
|
|
454
|
+
help="Switch to a different agent persona for this session.",
|
|
455
|
+
),
|
|
450
456
|
message: Optional[str] = typer.Option(
|
|
451
457
|
None,
|
|
452
458
|
"--message",
|
|
@@ -483,6 +489,7 @@ def resume( # noqa: PLR0913
|
|
|
483
489
|
model=model,
|
|
484
490
|
provider=provider,
|
|
485
491
|
api_key=api_key,
|
|
492
|
+
agent=agent,
|
|
486
493
|
message=message,
|
|
487
494
|
pipeline=pipeline,
|
|
488
495
|
)
|
|
@@ -964,6 +964,7 @@ def handle_resume_session( # noqa: PLR0913
|
|
|
964
964
|
model: Optional[str] = None,
|
|
965
965
|
provider: Optional[str] = None,
|
|
966
966
|
api_key: Optional[str] = None,
|
|
967
|
+
agent: Optional[str] = None,
|
|
967
968
|
message: Optional[str] = None,
|
|
968
969
|
pipeline: bool = False,
|
|
969
970
|
setup_editor: Optional[bool] = None,
|
|
@@ -1006,7 +1007,11 @@ def handle_resume_session( # noqa: PLR0913
|
|
|
1006
1007
|
container, session_name, model=model, provider=provider, api_key=api_key
|
|
1007
1008
|
)
|
|
1008
1009
|
|
|
1009
|
-
# 5.
|
|
1010
|
+
# 5. Agent switch: if -a/--agent provided, update session agent permanently
|
|
1011
|
+
if agent:
|
|
1012
|
+
container.resolve(ISessionManager).set_session_agent(session_name, agent)
|
|
1013
|
+
|
|
1014
|
+
# 6. Enter the session loop
|
|
1010
1015
|
_orchestrate_session_loop(
|
|
1011
1016
|
container=container,
|
|
1012
1017
|
session_name=session_name,
|
|
@@ -306,6 +306,18 @@ class LocalFileSystemAdapter(IFileSystemManager):
|
|
|
306
306
|
except IOError as e:
|
|
307
307
|
raise IOError(f"Failed to read raw file at {path}: {e}") from e
|
|
308
308
|
|
|
309
|
+
def remove_file(self, path: str) -> None:
|
|
310
|
+
"""
|
|
311
|
+
Deletes a file from the file system.
|
|
312
|
+
"""
|
|
313
|
+
file_path = self._resolve_path(path)
|
|
314
|
+
try:
|
|
315
|
+
file_path.unlink()
|
|
316
|
+
except FileNotFoundError:
|
|
317
|
+
raise
|
|
318
|
+
except OSError as e:
|
|
319
|
+
raise OSError(f"Failed to remove file at {path}: {e}") from e
|
|
320
|
+
|
|
309
321
|
def edit_file(
|
|
310
322
|
self,
|
|
311
323
|
path: str,
|
|
@@ -86,6 +86,15 @@ class IFileSystemManager(Protocol):
|
|
|
86
86
|
"""
|
|
87
87
|
...
|
|
88
88
|
|
|
89
|
+
def remove_file(self, path: str) -> None:
|
|
90
|
+
"""
|
|
91
|
+
Deletes a file from the file system.
|
|
92
|
+
|
|
93
|
+
Raises:
|
|
94
|
+
FileNotFoundError: If no file exists at the specified path.
|
|
95
|
+
"""
|
|
96
|
+
...
|
|
97
|
+
|
|
89
98
|
def edit_file(
|
|
90
99
|
self,
|
|
91
100
|
path: str,
|
|
@@ -117,3 +117,11 @@ class ISessionManager(Protocol):
|
|
|
117
117
|
finalization can still be preserved.
|
|
118
118
|
"""
|
|
119
119
|
...
|
|
120
|
+
|
|
121
|
+
def set_session_agent(self, session_name: str, agent_name: str) -> None:
|
|
122
|
+
"""
|
|
123
|
+
Permanently changes the session's agent. Updates meta.yaml
|
|
124
|
+
with the new agent_name and replaces the session's prompt
|
|
125
|
+
XML with the new agent's prompt from .teddy/prompts/.
|
|
126
|
+
"""
|
|
127
|
+
...
|
|
@@ -62,41 +62,7 @@ class SessionService(ISessionManager):
|
|
|
62
62
|
)
|
|
63
63
|
|
|
64
64
|
# 2. Prompt population — read from .teddy/prompts/ (canonical source)
|
|
65
|
-
|
|
66
|
-
if not self._file_system_manager.path_exists(prompts_dir):
|
|
67
|
-
available = self._prompt_manager.get_available_agents()
|
|
68
|
-
if available:
|
|
69
|
-
msg = (
|
|
70
|
-
f"Agent prompt '{options.agent_name}' not found in .teddy/prompts/. "
|
|
71
|
-
f"Available agents: {', '.join(available)}"
|
|
72
|
-
)
|
|
73
|
-
else:
|
|
74
|
-
msg = (
|
|
75
|
-
f"Agent prompt '{options.agent_name}' not found in .teddy/prompts/. "
|
|
76
|
-
"Please run 'teddy init' to restore prompts."
|
|
77
|
-
)
|
|
78
|
-
raise ValueError(msg)
|
|
79
|
-
# Find the prompt file with the agent name (any extension)
|
|
80
|
-
prompt_filename = None
|
|
81
|
-
for f in self._file_system_manager.list_directory(prompts_dir):
|
|
82
|
-
if Path(f).stem.casefold() == options.agent_name.casefold():
|
|
83
|
-
prompt_filename = f
|
|
84
|
-
break
|
|
85
|
-
if prompt_filename is None:
|
|
86
|
-
available = self._prompt_manager.get_available_agents()
|
|
87
|
-
if available:
|
|
88
|
-
msg = (
|
|
89
|
-
f"Agent prompt '{options.agent_name}' not found in .teddy/prompts/. "
|
|
90
|
-
f"Available agents: {', '.join(available)}"
|
|
91
|
-
)
|
|
92
|
-
else:
|
|
93
|
-
msg = (
|
|
94
|
-
f"Agent prompt '{options.agent_name}' not found in .teddy/prompts/. "
|
|
95
|
-
"Please run 'teddy init' to restore prompts."
|
|
96
|
-
)
|
|
97
|
-
raise ValueError(msg)
|
|
98
|
-
prompt_path = f"{prompts_dir}/{prompt_filename}"
|
|
99
|
-
prompt_content = self._file_system_manager.read_file(prompt_path)
|
|
65
|
+
prompt_filename, prompt_content = self._resolve_agent_prompt(options.agent_name)
|
|
100
66
|
self._file_system_manager.write_file(
|
|
101
67
|
f"{session_root}/{prompt_filename}", prompt_content
|
|
102
68
|
)
|
|
@@ -167,6 +133,55 @@ class SessionService(ISessionManager):
|
|
|
167
133
|
meta_data["api_key"] = options.api_key
|
|
168
134
|
return meta_data
|
|
169
135
|
|
|
136
|
+
def _resolve_agent_prompt(self, agent_name: str) -> tuple[str, str]:
|
|
137
|
+
"""
|
|
138
|
+
Resolves an agent's prompt file from .teddy/prompts/ via casefold stem matching.
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
(prompt_filename, prompt_content)
|
|
142
|
+
|
|
143
|
+
Raises:
|
|
144
|
+
ValueError: If the prompts directory is missing or no matching prompt exists.
|
|
145
|
+
"""
|
|
146
|
+
prompts_dir = ".teddy/prompts"
|
|
147
|
+
if not self._file_system_manager.path_exists(prompts_dir):
|
|
148
|
+
available = self._prompt_manager.get_available_agents()
|
|
149
|
+
if available:
|
|
150
|
+
msg = (
|
|
151
|
+
f"Agent prompt '{agent_name}' not found in .teddy/prompts/. "
|
|
152
|
+
f"Available agents: {', '.join(available)}"
|
|
153
|
+
)
|
|
154
|
+
else:
|
|
155
|
+
msg = (
|
|
156
|
+
f"Agent prompt '{agent_name}' not found in .teddy/prompts/. "
|
|
157
|
+
"Please run 'teddy init' to restore prompts."
|
|
158
|
+
)
|
|
159
|
+
raise ValueError(msg)
|
|
160
|
+
|
|
161
|
+
prompt_filename = None
|
|
162
|
+
for f in self._file_system_manager.list_directory(prompts_dir):
|
|
163
|
+
if Path(f).stem.casefold() == agent_name.casefold():
|
|
164
|
+
prompt_filename = f
|
|
165
|
+
break
|
|
166
|
+
|
|
167
|
+
if prompt_filename is None:
|
|
168
|
+
available = self._prompt_manager.get_available_agents()
|
|
169
|
+
if available:
|
|
170
|
+
msg = (
|
|
171
|
+
f"Agent prompt '{agent_name}' not found in .teddy/prompts/. "
|
|
172
|
+
f"Available agents: {', '.join(available)}"
|
|
173
|
+
)
|
|
174
|
+
else:
|
|
175
|
+
msg = (
|
|
176
|
+
f"Agent prompt '{agent_name}' not found in .teddy/prompts/. "
|
|
177
|
+
"Please run 'teddy init' to restore prompts."
|
|
178
|
+
)
|
|
179
|
+
raise ValueError(msg)
|
|
180
|
+
|
|
181
|
+
prompt_path = f"{prompts_dir}/{prompt_filename}"
|
|
182
|
+
prompt_content = self._file_system_manager.read_file(prompt_path)
|
|
183
|
+
return prompt_filename, prompt_content
|
|
184
|
+
|
|
170
185
|
def get_latest_turn(self, session_name: str) -> str:
|
|
171
186
|
"""
|
|
172
187
|
Identifies and returns the latest turn directory in the specified session.
|
|
@@ -505,6 +520,40 @@ class SessionService(ISessionManager):
|
|
|
505
520
|
"""Resolves a session name from a given path."""
|
|
506
521
|
return self._repository.resolve_session_from_path(path)
|
|
507
522
|
|
|
523
|
+
def set_session_agent(self, session_name: str, agent_name: str) -> None:
|
|
524
|
+
"""
|
|
525
|
+
Permanently changes the session's agent. Updates meta.yaml
|
|
526
|
+
with the new agent_name and replaces the session's prompt
|
|
527
|
+
XML with the new agent's prompt from .teddy/prompts/.
|
|
528
|
+
"""
|
|
529
|
+
session_root = f".teddy/sessions/{session_name}"
|
|
530
|
+
latest_turn_path = self.get_latest_turn(session_name)
|
|
531
|
+
|
|
532
|
+
# 1. Update meta.yaml
|
|
533
|
+
meta = self.load_turn_meta(latest_turn_path)
|
|
534
|
+
meta["agent_name"] = agent_name
|
|
535
|
+
self.save_turn_meta(latest_turn_path, meta)
|
|
536
|
+
|
|
537
|
+
# 2. Find new prompt in .teddy/prompts/ (mirrors create_session pattern)
|
|
538
|
+
prompt_filename, prompt_content = self._resolve_agent_prompt(agent_name)
|
|
539
|
+
|
|
540
|
+
# 3. Write prompt to session root (overwrite any existing file with same stem)
|
|
541
|
+
self._file_system_manager.write_file(
|
|
542
|
+
f"{session_root}/{prompt_filename}", prompt_content
|
|
543
|
+
)
|
|
544
|
+
|
|
545
|
+
# 4. Remove stale prompt files (any file in session root whose stem matches a
|
|
546
|
+
# known prompt from .teddy/prompts/ but whose stem does not match the new agent)
|
|
547
|
+
known_prompt_stems = {
|
|
548
|
+
Path(f).stem.casefold()
|
|
549
|
+
for f in self._file_system_manager.list_directory(".teddy/prompts")
|
|
550
|
+
}
|
|
551
|
+
new_agent_stem = agent_name.casefold()
|
|
552
|
+
for f in self._file_system_manager.list_directory(session_root):
|
|
553
|
+
stem = Path(f).stem.casefold()
|
|
554
|
+
if stem in known_prompt_stems and stem != new_agent_stem:
|
|
555
|
+
self._file_system_manager.remove_file(f"{session_root}/{f}")
|
|
556
|
+
|
|
508
557
|
def _resolve_next_turn_path(self, cur_dir: Path) -> tuple[str, Path]:
|
|
509
558
|
"""Determines the next turn ID and session directory (same session)."""
|
|
510
559
|
next_id = f"{int(cur_dir.name) + 1:02d}"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/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.16.dev1151 → teddy_cli-0.1.16.dev1152}/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
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/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.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/ports/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/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
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/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.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/markdown.py
RENAMED
|
File without changes
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/serialization.py
RENAMED
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/string.py
RENAMED
|
File without changes
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/core/utils/terminal.py
RENAMED
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/registries/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/registries/reviewer.py
RENAMED
|
File without changes
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/registries/validators.py
RENAMED
|
File without changes
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{teddy_cli-0.1.16.dev1151 → teddy_cli-0.1.16.dev1152}/src/teddy_executor/resources/templates/ci.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|