tunacode-cli 0.0.48__tar.gz → 0.0.50__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.
Potentially problematic release.
This version of tunacode-cli might be problematic. Click here for more details.
- {tunacode_cli-0.0.48/src/tunacode_cli.egg-info → tunacode_cli-0.0.50}/PKG-INFO +2 -2
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/README.md +1 -1
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/pyproject.toml +34 -1
- tunacode_cli-0.0.50/src/api/auth.py +13 -0
- tunacode_cli-0.0.50/src/api/users.py +8 -0
- tunacode_cli-0.0.50/src/tunacode/__init__.py +4 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/main.py +4 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/repl.py +39 -6
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/configuration/defaults.py +0 -1
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/constants.py +7 -1
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/agents/main.py +268 -245
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/agents/utils.py +54 -6
- tunacode_cli-0.0.50/src/tunacode/core/logging/__init__.py +29 -0
- tunacode_cli-0.0.50/src/tunacode/core/logging/config.py +57 -0
- tunacode_cli-0.0.50/src/tunacode/core/logging/formatters.py +48 -0
- tunacode_cli-0.0.50/src/tunacode/core/logging/handlers.py +83 -0
- tunacode_cli-0.0.50/src/tunacode/core/logging/logger.py +8 -0
- tunacode_cli-0.0.50/src/tunacode/core/recursive/__init__.py +18 -0
- tunacode_cli-0.0.50/src/tunacode/core/recursive/aggregator.py +467 -0
- tunacode_cli-0.0.50/src/tunacode/core/recursive/budget.py +414 -0
- tunacode_cli-0.0.50/src/tunacode/core/recursive/decomposer.py +398 -0
- tunacode_cli-0.0.50/src/tunacode/core/recursive/executor.py +470 -0
- tunacode_cli-0.0.50/src/tunacode/core/recursive/hierarchy.py +488 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/state.py +45 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/exceptions.py +23 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/base.py +7 -1
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/types.py +5 -1
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/completers.py +2 -2
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/console.py +30 -9
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/input.py +2 -1
- tunacode_cli-0.0.50/src/tunacode/ui/keybindings.py +82 -0
- tunacode_cli-0.0.50/src/tunacode/ui/logging_compat.py +44 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/output.py +7 -6
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/panels.py +30 -5
- tunacode_cli-0.0.50/src/tunacode/ui/recursive_progress.py +380 -0
- tunacode_cli-0.0.50/src/tunacode/utils/retry.py +163 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/security.py +3 -2
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/token_counter.py +1 -2
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50/src/tunacode_cli.egg-info}/PKG-INFO +2 -2
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode_cli.egg-info/SOURCES.txt +20 -65
- tunacode_cli-0.0.50/src/tunacode_cli.egg-info/top_level.txt +3 -0
- tunacode_cli-0.0.50/tests/characterization/context/test_tunacode_logging.py +84 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_error_handling.py +12 -4
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_input_handling.py +6 -4
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_multiline_input.py +11 -4
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_output_display_logic.py +1 -1
- tunacode_cli-0.0.50/tests/characterization/repl/test_repl_initialization.py +114 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/ui/test_async_ui.py +5 -3
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/conftest.py +4 -2
- tunacode_cli-0.0.50/tests/test_json_retry.py +230 -0
- tunacode_cli-0.0.50/tests/test_logging_config.py +112 -0
- tunacode_cli-0.0.50/tests/test_tool_batching_retry.py +287 -0
- tunacode_cli-0.0.50/tests/unit/test_recursive_executor.py +218 -0
- tunacode_cli-0.0.48/src/tunacode/core/agents/dspy_integration.py +0 -223
- tunacode_cli-0.0.48/src/tunacode/core/agents/dspy_tunacode.py +0 -458
- tunacode_cli-0.0.48/src/tunacode/prompts/dspy_task_planning.md +0 -45
- tunacode_cli-0.0.48/src/tunacode/prompts/dspy_tool_selection.md +0 -58
- tunacode_cli-0.0.48/src/tunacode/ui/keybindings.py +0 -25
- tunacode_cli-0.0.48/src/tunacode/utils/__init__.py +0 -0
- tunacode_cli-0.0.48/src/tunacode_cli.egg-info/top_level.txt +0 -1
- tunacode_cli-0.0.48/tests/characterization/context/test_tunacode_logging.py +0 -79
- tunacode_cli-0.0.48/tests/characterization/repl/test_repl_initialization.py +0 -59
- tunacode_cli-0.0.48/tests/crud/test_core_file_operations.py +0 -452
- tunacode_cli-0.0.48/tests/fixtures/__init__.py +0 -1
- tunacode_cli-0.0.48/tests/fixtures/file_operations.py +0 -332
- tunacode_cli-0.0.48/tests/integration/test_error_recovery_flow.py +0 -43
- tunacode_cli-0.0.48/tests/integration/test_full_session_flow.py +0 -68
- tunacode_cli-0.0.48/tests/integration/test_mcp_tool_flow.py +0 -51
- tunacode_cli-0.0.48/tests/integration/test_multi_tool_operations.py +0 -61
- tunacode_cli-0.0.48/tests/integration/test_performance_scenarios.py +0 -62
- tunacode_cli-0.0.48/tests/integration/test_usage_tracking_integration.py +0 -134
- tunacode_cli-0.0.48/tests/test_actual_parallelism.py +0 -260
- tunacode_cli-0.0.48/tests/test_agent_initialization.py +0 -152
- tunacode_cli-0.0.48/tests/test_api_response_parser.py +0 -82
- tunacode_cli-0.0.48/tests/test_background_manager.py +0 -27
- tunacode_cli-0.0.48/tests/test_characterization_agent_main.py +0 -57
- tunacode_cli-0.0.48/tests/test_characterization_bash.py +0 -227
- tunacode_cli-0.0.48/tests/test_characterization_commands_system.py +0 -90
- tunacode_cli-0.0.48/tests/test_characterization_glob.py +0 -395
- tunacode_cli-0.0.48/tests/test_characterization_grep.py +0 -329
- tunacode_cli-0.0.48/tests/test_characterization_grep_performance.py +0 -296
- tunacode_cli-0.0.48/tests/test_characterization_iteration_limits.py +0 -141
- tunacode_cli-0.0.48/tests/test_characterization_list_dir.py +0 -289
- tunacode_cli-0.0.48/tests/test_characterization_read_file.py +0 -201
- tunacode_cli-0.0.48/tests/test_characterization_repl_utils.py +0 -41
- tunacode_cli-0.0.48/tests/test_characterization_run_command.py +0 -241
- tunacode_cli-0.0.48/tests/test_characterization_setup_system.py +0 -76
- tunacode_cli-0.0.48/tests/test_characterization_tool_ui_behavior.py +0 -381
- tunacode_cli-0.0.48/tests/test_characterization_update_file.py +0 -231
- tunacode_cli-0.0.48/tests/test_characterization_utilities.py +0 -64
- tunacode_cli-0.0.48/tests/test_characterization_write_file.py +0 -224
- tunacode_cli-0.0.48/tests/test_cli_command_flow.py +0 -312
- tunacode_cli-0.0.48/tests/test_cli_file_operations_integration.py +0 -283
- tunacode_cli-0.0.48/tests/test_config_directory_creation.py +0 -105
- tunacode_cli-0.0.48/tests/test_config_setup_async.py +0 -120
- tunacode_cli-0.0.48/tests/test_cost_calculator.py +0 -32
- tunacode_cli-0.0.48/tests/test_dspy_integration.py +0 -127
- tunacode_cli-0.0.48/tests/test_enhanced_visual_feedback.py +0 -95
- tunacode_cli-0.0.48/tests/test_fallback_responses.py +0 -48
- tunacode_cli-0.0.48/tests/test_fast_glob_search.py +0 -129
- tunacode_cli-0.0.48/tests/test_file_operations_edge_cases.py +0 -393
- tunacode_cli-0.0.48/tests/test_file_operations_stress.py +0 -333
- tunacode_cli-0.0.48/tests/test_file_reference_context_tracking.py +0 -146
- tunacode_cli-0.0.48/tests/test_file_reference_expansion.py +0 -208
- tunacode_cli-0.0.48/tests/test_grep_fast_glob.py +0 -380
- tunacode_cli-0.0.48/tests/test_grep_legacy_compat.py +0 -61
- tunacode_cli-0.0.48/tests/test_grep_timeout.py +0 -180
- tunacode_cli-0.0.48/tests/test_json_tool_parsing.py +0 -214
- tunacode_cli-0.0.48/tests/test_list_dir.py +0 -188
- tunacode_cli-0.0.48/tests/test_parallel_execution_demo.py +0 -151
- tunacode_cli-0.0.48/tests/test_parallel_execution_freeze_fix.py +0 -153
- tunacode_cli-0.0.48/tests/test_parallel_execution_integration.py +0 -202
- tunacode_cli-0.0.48/tests/test_parallel_read_only_tools.py +0 -248
- tunacode_cli-0.0.48/tests/test_parallel_tool_execution.py +0 -151
- tunacode_cli-0.0.48/tests/test_read_only_confirmation.py +0 -67
- tunacode_cli-0.0.48/tests/test_streaming_panel_tool_confirmation.py +0 -176
- tunacode_cli-0.0.48/tests/test_streaming_spinner_conflict.py +0 -117
- tunacode_cli-0.0.48/tests/test_todo_functionality.py +0 -441
- tunacode_cli-0.0.48/tests/test_tool_categorization.py +0 -110
- tunacode_cli-0.0.48/tests/test_tool_combinations.py +0 -575
- tunacode_cli-0.0.48/tests/test_tool_handler_ui_messages.py +0 -113
- tunacode_cli-0.0.48/tests/test_update_command.py +0 -48
- tunacode_cli-0.0.48/tests/test_visual_parallel_feedback.py +0 -172
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/CLAUDE.md +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/LICENSE +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/MANIFEST.in +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/TUNACODE.md +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/setup.cfg +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/setup.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/base.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/conversation.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/debug.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/development.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/model.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/system.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/todo.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/registry.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/configuration/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/configuration/models.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/configuration/settings.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/context.py +0 -0
- {tunacode_cli-0.0.48/src/tunacode → tunacode_cli-0.0.50/src/tunacode/core}/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/agents/__init__.py +0 -0
- {tunacode_cli-0.0.48/src/tunacode/core → tunacode_cli-0.0.50/src/tunacode/core/background}/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/background/manager.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/code_index.py +0 -0
- {tunacode_cli-0.0.48/src/tunacode/core/background → tunacode_cli-0.0.50/src/tunacode/core/llm}/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/agent_setup.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/base.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/config_setup.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/coordinator.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/environment_setup.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/git_safety_setup.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/token_usage/api_response_parser.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/token_usage/cost_calculator.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/token_usage/usage_tracker.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/tool_handler.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/prompts/system.md +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/py.typed +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/services/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/services/mcp.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/setup.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/bash.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/glob.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/grep.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/list_dir.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/read_file.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/read_file_async_poc.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/run_command.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/todo.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/update_file.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/write_file.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/constants.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/decorators.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/lexers.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/prompt_manager.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/tool_ui.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/utils.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/validators.py +0 -0
- {tunacode_cli-0.0.48/src/tunacode/core/llm → tunacode_cli-0.0.50/src/tunacode/utils}/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/bm25.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/diff_utils.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/file_utils.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/import_cache.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/message_utils.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/ripgrep.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/system.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/text_utils.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/user_configuration.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode_cli.egg-info/dependency_links.txt +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode_cli.egg-info/entry_points.txt +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode_cli.egg-info/requires.txt +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/conftest.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/test_agent_creation.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/test_json_tool_parsing.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/test_process_node.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/test_process_request.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/test_tool_message_patching.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/background/test_background_edge_cases.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/background/test_cleanup.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/background/test_task_cancellation.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/background/test_task_creation.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/background/test_task_execution.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/code_index/test_cache_management.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/code_index/test_file_scanning.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/code_index/test_index_building.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/code_index/test_search_operations.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/code_index/test_symbol_extraction.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/commands/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/commands/test_init_command.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/conftest.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/context/__init__.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/context/test_context_acceptance.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/context/test_context_integration.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/context/test_context_loading.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_command_parsing.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_keyboard_interrupts.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_session_flow.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/services/test_error_recovery.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/services/test_llm_routing.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/services/test_mcp_integration.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/services/test_service_lifecycle.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_agent_tracking.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_message_history.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_permissions.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_session_management.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_state_initialization.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_user_config.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/test_characterization_commands.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/ui/test_console_output.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/ui/test_diff_display.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/ui/test_prompt_rendering.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/ui/test_tool_confirmations.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/conftest.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/test_expand_file_refs.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/test_file_operations.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/test_git_commands.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/test_token_counting.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/test_utils_edge_cases.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/test_agent_output_formatting.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/test_prompt_changes_validation.py +0 -0
- {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/test_security.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tunacode-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.50
|
|
4
4
|
Summary: Your agentic CLI developer.
|
|
5
5
|
Author-email: larock22 <noreply@github.com>
|
|
6
6
|
License: MIT
|
|
@@ -48,7 +48,7 @@ Dynamic: license-file
|
|
|
48
48
|
|
|
49
49
|
**AI-powered CLI coding assistant**
|
|
50
50
|
|
|
51
|
-

|
|
52
52
|
|
|
53
53
|
</div>
|
|
54
54
|
|
|
@@ -4,7 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tunacode-cli"
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
version = "0.0.50"
|
|
8
9
|
description = "Your agentic CLI developer."
|
|
9
10
|
keywords = ["cli", "agent", "development", "automation"]
|
|
10
11
|
readme = "README.md"
|
|
@@ -77,3 +78,35 @@ exclude = [
|
|
|
77
78
|
"dist",
|
|
78
79
|
"venv",
|
|
79
80
|
]
|
|
81
|
+
|
|
82
|
+
[tool.vulture]
|
|
83
|
+
min_confidence = 80
|
|
84
|
+
paths = ["src", "tests"]
|
|
85
|
+
exclude = ["venv/", "build/", "dist/", ".git/", "__pycache__/", "*.egg-info/"]
|
|
86
|
+
# Whitelist of false positives
|
|
87
|
+
ignore_names = [
|
|
88
|
+
# TYPE_CHECKING imports
|
|
89
|
+
"ReadStream",
|
|
90
|
+
"WriteStream",
|
|
91
|
+
"StateManager",
|
|
92
|
+
"ModelRequest",
|
|
93
|
+
"CommandRegistry",
|
|
94
|
+
# Pytest fixtures
|
|
95
|
+
"caplog",
|
|
96
|
+
"temp_workspace",
|
|
97
|
+
"setup_test_environment",
|
|
98
|
+
"excinfo",
|
|
99
|
+
# Common patterns
|
|
100
|
+
"_complete_event", # prompt_toolkit API requirement
|
|
101
|
+
"kw", # **kw pattern
|
|
102
|
+
"kwargs", # **kwargs pattern
|
|
103
|
+
"message", # exception handling
|
|
104
|
+
"response_obj", # API responses
|
|
105
|
+
# Test parameters and mock arguments
|
|
106
|
+
"should_restart", # test parameter
|
|
107
|
+
"exc", # exception handling in __aexit__
|
|
108
|
+
"exc_type", # exception handling in __aexit__
|
|
109
|
+
"tb", # traceback in __aexit__
|
|
110
|
+
"style_dict", # Style.from_dict parameter
|
|
111
|
+
"style_str", # get_attrs_for_style_str parameter
|
|
112
|
+
]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import jwt
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def authenticate(username, password):
|
|
5
|
+
# TODO: Add password hashing
|
|
6
|
+
if username == "admin" and password == "admin":
|
|
7
|
+
return generate_token(username)
|
|
8
|
+
return None
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def generate_token(username):
|
|
12
|
+
# TODO: Add expiration
|
|
13
|
+
return jwt.encode({"user": username}, "secret")
|
|
@@ -5,6 +5,7 @@ Enhanced CLI entry point with better styling while staying CLI-based.
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
import asyncio
|
|
8
|
+
import logging
|
|
8
9
|
|
|
9
10
|
import typer
|
|
10
11
|
|
|
@@ -36,6 +37,9 @@ def main(
|
|
|
36
37
|
):
|
|
37
38
|
"""Start TunaCode - Your AI-powered development assistant"""
|
|
38
39
|
|
|
40
|
+
# Configure logging to suppress INFO messages by default
|
|
41
|
+
logging.basicConfig(level=logging.WARNING, force=True)
|
|
42
|
+
|
|
39
43
|
async def async_main():
|
|
40
44
|
if version:
|
|
41
45
|
await ui.version()
|
|
@@ -90,6 +90,12 @@ def _parse_args(args) -> ToolArgs:
|
|
|
90
90
|
|
|
91
91
|
async def _tool_handler(part, state_manager: StateManager):
|
|
92
92
|
"""Handle tool execution with separated business logic and UI."""
|
|
93
|
+
# Check for cancellation before tool execution (only if explicitly set to True)
|
|
94
|
+
operation_cancelled = getattr(state_manager.session, "operation_cancelled", False)
|
|
95
|
+
if operation_cancelled is True:
|
|
96
|
+
logger.debug("Tool execution cancelled")
|
|
97
|
+
raise CancelledError("Operation was cancelled")
|
|
98
|
+
|
|
93
99
|
tool_handler = ToolHandler(state_manager)
|
|
94
100
|
|
|
95
101
|
if tool_handler.should_confirm(part.tool_name):
|
|
@@ -249,6 +255,12 @@ async def _display_agent_output(res, enable_streaming: bool) -> None:
|
|
|
249
255
|
async def process_request(text: str, state_manager: StateManager, output: bool = True):
|
|
250
256
|
"""Process input using the agent, handling cancellation safely."""
|
|
251
257
|
|
|
258
|
+
# Check for cancellation before starting (only if explicitly set to True)
|
|
259
|
+
operation_cancelled = getattr(state_manager.session, "operation_cancelled", False)
|
|
260
|
+
if operation_cancelled is True:
|
|
261
|
+
logger.debug("Operation cancelled before processing started")
|
|
262
|
+
raise CancelledError("Operation was cancelled")
|
|
263
|
+
|
|
252
264
|
state_manager.session.spinner = await ui.spinner(
|
|
253
265
|
True, state_manager.session.spinner, state_manager
|
|
254
266
|
)
|
|
@@ -275,6 +287,12 @@ async def process_request(text: str, state_manager: StateManager, output: bool =
|
|
|
275
287
|
await ui.error(str(e))
|
|
276
288
|
return
|
|
277
289
|
|
|
290
|
+
# Check for cancellation before proceeding with agent call (only if explicitly set to True)
|
|
291
|
+
operation_cancelled = getattr(state_manager.session, "operation_cancelled", False)
|
|
292
|
+
if operation_cancelled is True:
|
|
293
|
+
logger.debug("Operation cancelled before agent processing")
|
|
294
|
+
raise CancelledError("Operation was cancelled")
|
|
295
|
+
|
|
278
296
|
enable_streaming = state_manager.session.user_config.get("settings", {}).get(
|
|
279
297
|
"enable_streaming", True
|
|
280
298
|
)
|
|
@@ -338,7 +356,7 @@ async def process_request(text: str, state_manager: StateManager, output: bool =
|
|
|
338
356
|
# Always show files in context after agent response
|
|
339
357
|
if state_manager.session.files_in_context:
|
|
340
358
|
filenames = [Path(f).name for f in sorted(state_manager.session.files_in_context)]
|
|
341
|
-
await ui.muted(f"
|
|
359
|
+
await ui.muted(f"Files in context: {', '.join(filenames)}")
|
|
342
360
|
|
|
343
361
|
# --- ERROR HANDLING ---
|
|
344
362
|
except CancelledError:
|
|
@@ -360,6 +378,9 @@ async def process_request(text: str, state_manager: StateManager, output: bool =
|
|
|
360
378
|
finally:
|
|
361
379
|
await ui.spinner(False, state_manager.session.spinner, state_manager)
|
|
362
380
|
state_manager.session.current_task = None
|
|
381
|
+
# Reset cancellation flag when task completes (if attribute exists)
|
|
382
|
+
if hasattr(state_manager.session, "operation_cancelled"):
|
|
383
|
+
state_manager.session.operation_cancelled = False
|
|
363
384
|
|
|
364
385
|
if "multiline" in state_manager.session.input_sessions:
|
|
365
386
|
await run_in_terminal(
|
|
@@ -385,9 +406,13 @@ async def repl(state_manager: StateManager):
|
|
|
385
406
|
|
|
386
407
|
state_manager.session.update_token_count()
|
|
387
408
|
context_display = get_context_window_display(state_manager.session.total_tokens, max_tokens)
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
409
|
+
|
|
410
|
+
# Only show startup info if thoughts are enabled or on first run
|
|
411
|
+
if state_manager.session.show_thoughts or not hasattr(state_manager.session, "_startup_shown"):
|
|
412
|
+
await ui.muted(f"• Model: {model_name} • {context_display}")
|
|
413
|
+
await ui.success("Ready to assist")
|
|
414
|
+
await ui.line()
|
|
415
|
+
state_manager.session._startup_shown = True
|
|
391
416
|
|
|
392
417
|
instance = agent.get_or_create_agent(state_manager.session.current_model, state_manager)
|
|
393
418
|
|
|
@@ -456,6 +481,10 @@ async def repl(state_manager: StateManager):
|
|
|
456
481
|
await ui.muted(MSG_AGENT_BUSY)
|
|
457
482
|
continue
|
|
458
483
|
|
|
484
|
+
# Reset cancellation flag for new operations (if attribute exists)
|
|
485
|
+
if hasattr(state_manager.session, "operation_cancelled"):
|
|
486
|
+
state_manager.session.operation_cancelled = False
|
|
487
|
+
|
|
459
488
|
state_manager.session.current_task = get_app().create_background_task(
|
|
460
489
|
process_request(line, state_manager)
|
|
461
490
|
)
|
|
@@ -465,7 +494,11 @@ async def repl(state_manager: StateManager):
|
|
|
465
494
|
context_display = get_context_window_display(
|
|
466
495
|
state_manager.session.total_tokens, state_manager.session.max_tokens
|
|
467
496
|
)
|
|
468
|
-
|
|
497
|
+
# Only show model/context info if thoughts are enabled
|
|
498
|
+
if state_manager.session.show_thoughts:
|
|
499
|
+
await ui.muted(
|
|
500
|
+
f"• Model: {state_manager.session.current_model} • {context_display}"
|
|
501
|
+
)
|
|
469
502
|
|
|
470
503
|
if action == "restart":
|
|
471
504
|
await repl(state_manager)
|
|
@@ -480,7 +513,7 @@ async def repl(state_manager: StateManager):
|
|
|
480
513
|
total_cost = float(session_total.get("cost", 0) or 0)
|
|
481
514
|
|
|
482
515
|
# Only show summary if we have actual token usage
|
|
483
|
-
if total_tokens > 0 or total_cost > 0:
|
|
516
|
+
if state_manager.session.show_thoughts and (total_tokens > 0 or total_cost > 0):
|
|
484
517
|
summary = (
|
|
485
518
|
f"\n[bold cyan]TunaCode Session Summary[/bold cyan]\n"
|
|
486
519
|
f" - Total Tokens: {total_tokens:,}\n"
|
|
@@ -24,7 +24,6 @@ DEFAULT_USER_CONFIG: UserConfig = {
|
|
|
24
24
|
"fallback_response": True,
|
|
25
25
|
"fallback_verbosity": "normal", # Options: minimal, normal, detailed
|
|
26
26
|
"context_window_size": 200000,
|
|
27
|
-
"use_dspy_optimization": True, # Enable DSPy tool selection optimization
|
|
28
27
|
},
|
|
29
28
|
"mcpServers": {},
|
|
30
29
|
}
|
|
@@ -7,7 +7,8 @@ Centralizes all magic strings, UI text, error messages, and application constant
|
|
|
7
7
|
|
|
8
8
|
# Application info
|
|
9
9
|
APP_NAME = "TunaCode"
|
|
10
|
-
APP_VERSION = "0.0.
|
|
10
|
+
APP_VERSION = "0.0.50"
|
|
11
|
+
|
|
11
12
|
|
|
12
13
|
# File patterns
|
|
13
14
|
GUIDE_FILE_PATTERN = "{name}.md"
|
|
@@ -157,3 +158,8 @@ MAX_TODOS_PER_SESSION = 100
|
|
|
157
158
|
|
|
158
159
|
# Maximum length for todo content
|
|
159
160
|
MAX_TODO_CONTENT_LENGTH = 500
|
|
161
|
+
|
|
162
|
+
# JSON parsing retry configuration
|
|
163
|
+
JSON_PARSE_MAX_RETRIES = 10
|
|
164
|
+
JSON_PARSE_BASE_DELAY = 0.1 # Initial delay in seconds
|
|
165
|
+
JSON_PARSE_MAX_DELAY = 5.0 # Maximum delay in seconds
|