tunacode-cli 0.0.40__tar.gz → 0.0.42__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.40 → tunacode_cli-0.0.42}/CLAUDE.md +4 -0
- {tunacode_cli-0.0.40/src/tunacode_cli.egg-info → tunacode_cli-0.0.42}/PKG-INFO +4 -1
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/pyproject.toml +4 -1
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/commands/__init__.py +2 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/commands/implementations/__init__.py +3 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/commands/implementations/debug.py +1 -1
- tunacode_cli-0.0.42/src/tunacode/cli/commands/implementations/todo.py +217 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/commands/registry.py +2 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/main.py +12 -5
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/repl.py +205 -136
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/configuration/defaults.py +2 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/configuration/models.py +6 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/constants.py +27 -3
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/context.py +7 -3
- tunacode_cli-0.0.42/src/tunacode/core/agents/dspy_integration.py +223 -0
- tunacode_cli-0.0.42/src/tunacode/core/agents/dspy_tunacode.py +458 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/agents/main.py +182 -12
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/agents/utils.py +54 -6
- tunacode_cli-0.0.42/src/tunacode/core/recursive/__init__.py +18 -0
- tunacode_cli-0.0.42/src/tunacode/core/recursive/aggregator.py +467 -0
- tunacode_cli-0.0.42/src/tunacode/core/recursive/budget.py +414 -0
- tunacode_cli-0.0.42/src/tunacode/core/recursive/decomposer.py +398 -0
- tunacode_cli-0.0.42/src/tunacode/core/recursive/executor.py +467 -0
- tunacode_cli-0.0.42/src/tunacode/core/recursive/hierarchy.py +487 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/setup/config_setup.py +5 -0
- tunacode_cli-0.0.42/src/tunacode/core/state.py +150 -0
- tunacode_cli-0.0.42/src/tunacode/core/token_usage/api_response_parser.py +44 -0
- tunacode_cli-0.0.42/src/tunacode/core/token_usage/cost_calculator.py +58 -0
- tunacode_cli-0.0.42/src/tunacode/core/token_usage/usage_tracker.py +98 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/exceptions.py +23 -0
- tunacode_cli-0.0.42/src/tunacode/prompts/dspy_task_planning.md +45 -0
- tunacode_cli-0.0.42/src/tunacode/prompts/dspy_tool_selection.md +58 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/prompts/system.md +69 -5
- tunacode_cli-0.0.42/src/tunacode/tools/todo.py +343 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/types.py +20 -1
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/console.py +1 -1
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/input.py +1 -1
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/output.py +38 -1
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/panels.py +4 -1
- tunacode_cli-0.0.42/src/tunacode/ui/recursive_progress.py +380 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/tool_ui.py +24 -6
- tunacode_cli-0.0.42/src/tunacode/ui/utils.py +3 -0
- tunacode_cli-0.0.42/src/tunacode/utils/message_utils.py +17 -0
- tunacode_cli-0.0.42/src/tunacode/utils/retry.py +163 -0
- tunacode_cli-0.0.42/src/tunacode/utils/token_counter.py +93 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42/src/tunacode_cli.egg-info}/PKG-INFO +4 -1
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode_cli.egg-info/SOURCES.txt +30 -3
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode_cli.egg-info/requires.txt +3 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/agent/test_agent_creation.py +3 -3
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/repl/test_command_parsing.py +3 -0
- tunacode_cli-0.0.42/tests/characterization/repl/test_error_handling.py +235 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/repl/test_input_handling.py +5 -2
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/repl/test_keyboard_interrupts.py +3 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/repl/test_multiline_input.py +4 -3
- tunacode_cli-0.0.42/tests/characterization/repl/test_output_display_logic.py +73 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/repl/test_repl_initialization.py +12 -1
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/repl/test_session_flow.py +6 -0
- tunacode_cli-0.0.42/tests/characterization/utils/conftest.py +4 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/utils/test_token_counting.py +10 -9
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/utils/test_utils_edge_cases.py +2 -2
- tunacode_cli-0.0.42/tests/integration/test_usage_tracking_integration.py +134 -0
- tunacode_cli-0.0.42/tests/test_api_response_parser.py +82 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_tool_ui_behavior.py +11 -102
- tunacode_cli-0.0.42/tests/test_cost_calculator.py +32 -0
- tunacode_cli-0.0.42/tests/test_dspy_integration.py +127 -0
- tunacode_cli-0.0.42/tests/test_json_retry.py +230 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_streaming_panel_tool_confirmation.py +3 -3
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_streaming_spinner_conflict.py +30 -42
- tunacode_cli-0.0.42/tests/test_todo_functionality.py +441 -0
- tunacode_cli-0.0.42/tests/test_tool_batching_retry.py +287 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_tool_handler_ui_messages.py +3 -9
- tunacode_cli-0.0.42/tests/unit/test_recursive_executor.py +218 -0
- tunacode_cli-0.0.40/src/tunacode/cli/textual_app.py +0 -420
- tunacode_cli-0.0.40/src/tunacode/cli/textual_bridge.py +0 -161
- tunacode_cli-0.0.40/src/tunacode/core/state.py +0 -60
- tunacode_cli-0.0.40/src/tunacode/ui/utils.py +0 -3
- tunacode_cli-0.0.40/src/tunacode/utils/token_counter.py +0 -23
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/LICENSE +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/MANIFEST.in +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/README.md +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/TUNACODE.md +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/setup.cfg +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/setup.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/commands/base.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/commands/implementations/conversation.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/commands/implementations/development.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/commands/implementations/model.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/commands/implementations/system.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/configuration/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/configuration/settings.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/agents/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/background/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/background/manager.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/code_index.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/llm/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/setup/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/setup/agent_setup.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/setup/base.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/setup/coordinator.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/setup/environment_setup.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/setup/git_safety_setup.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/core/tool_handler.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/py.typed +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/services/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/services/mcp.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/setup.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/tools/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/tools/base.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/tools/bash.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/tools/glob.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/tools/grep.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/tools/list_dir.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/tools/read_file.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/tools/read_file_async_poc.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/tools/run_command.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/tools/update_file.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/tools/write_file.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/completers.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/constants.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/decorators.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/keybindings.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/lexers.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/prompt_manager.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/ui/validators.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/utils/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/utils/bm25.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/utils/diff_utils.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/utils/file_utils.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/utils/import_cache.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/utils/ripgrep.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/utils/security.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/utils/system.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/utils/text_utils.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/utils/user_configuration.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode_cli.egg-info/dependency_links.txt +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode_cli.egg-info/entry_points.txt +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode_cli.egg-info/top_level.txt +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/agent/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/agent/conftest.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/agent/test_json_tool_parsing.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/agent/test_process_node.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/agent/test_process_request.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/agent/test_tool_message_patching.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/background/test_background_edge_cases.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/background/test_cleanup.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/background/test_task_cancellation.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/background/test_task_creation.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/background/test_task_execution.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/code_index/test_cache_management.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/code_index/test_file_scanning.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/code_index/test_index_building.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/code_index/test_search_operations.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/code_index/test_symbol_extraction.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/commands/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/commands/test_init_command.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/conftest.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/context/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/context/test_context_acceptance.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/context/test_context_integration.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/context/test_context_loading.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/context/test_tunacode_logging.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/services/test_error_recovery.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/services/test_llm_routing.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/services/test_mcp_integration.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/services/test_service_lifecycle.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/state/test_agent_tracking.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/state/test_message_history.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/state/test_permissions.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/state/test_session_management.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/state/test_state_initialization.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/state/test_user_config.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/test_characterization_commands.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/ui/test_async_ui.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/ui/test_console_output.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/ui/test_diff_display.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/ui/test_prompt_rendering.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/ui/test_tool_confirmations.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/utils/test_expand_file_refs.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/utils/test_file_operations.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/characterization/utils/test_git_commands.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/conftest.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/crud/test_core_file_operations.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/fixtures/__init__.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/fixtures/file_operations.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/integration/test_error_recovery_flow.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/integration/test_full_session_flow.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/integration/test_mcp_tool_flow.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/integration/test_multi_tool_operations.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/integration/test_performance_scenarios.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_actual_parallelism.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_agent_initialization.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_agent_output_formatting.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_background_manager.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_agent_main.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_bash.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_commands_system.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_glob.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_grep.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_grep_performance.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_iteration_limits.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_list_dir.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_read_file.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_repl_utils.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_run_command.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_setup_system.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_update_file.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_utilities.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_characterization_write_file.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_cli_command_flow.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_cli_file_operations_integration.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_config_directory_creation.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_config_setup_async.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_enhanced_visual_feedback.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_fallback_responses.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_fast_glob_search.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_file_operations_edge_cases.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_file_operations_stress.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_file_reference_context_tracking.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_file_reference_expansion.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_grep_fast_glob.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_grep_legacy_compat.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_grep_timeout.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_json_tool_parsing.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_list_dir.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_parallel_execution_demo.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_parallel_execution_freeze_fix.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_parallel_execution_integration.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_parallel_read_only_tools.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_parallel_tool_execution.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_prompt_changes_validation.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_read_only_confirmation.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_security.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_tool_categorization.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_tool_combinations.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_update_command.py +0 -0
- {tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/tests/test_visual_parallel_feedback.py +0 -0
|
@@ -249,3 +249,7 @@ Follow this code styling
|
|
|
249
249
|
| 8 | **Explaining Variable** | Extract a sub-expression into a well-named variable to record intent |
|
|
250
250
|
| 9 | **Explaining Constant** | Replace magic literals with symbolic constants that broadcast meaning |
|
|
251
251
|
| 10 | **Explicit Parameters** | Split a routine so all inputs are passed openly, banishing hidden state or maps |
|
|
252
|
+
|
|
253
|
+
## Task Master AI Instructions
|
|
254
|
+
**Import Task Master's development workflow commands and guidelines, treat as if import is in the main CLAUDE.md file.**
|
|
255
|
+
@./.taskmaster/CLAUDE.md
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tunacode-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.42
|
|
4
4
|
Summary: Your agentic CLI developer.
|
|
5
5
|
Author-email: larock22 <noreply@github.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -24,6 +24,9 @@ Requires-Dist: prompt_toolkit==3.0.51
|
|
|
24
24
|
Requires-Dist: pydantic-ai[logfire]==0.2.6
|
|
25
25
|
Requires-Dist: pygments==2.19.1
|
|
26
26
|
Requires-Dist: rich==14.0.0
|
|
27
|
+
Requires-Dist: tiktoken>=0.5.2
|
|
28
|
+
Requires-Dist: dspy-ai>=0.1.0
|
|
29
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
27
30
|
Provides-Extra: dev
|
|
28
31
|
Requires-Dist: build; extra == "dev"
|
|
29
32
|
Requires-Dist: ruff; extra == "dev"
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tunacode-cli"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.42"
|
|
8
8
|
description = "Your agentic CLI developer."
|
|
9
9
|
keywords = ["cli", "agent", "development", "automation"]
|
|
10
10
|
readme = "README.md"
|
|
@@ -30,6 +30,9 @@ dependencies = [
|
|
|
30
30
|
"pydantic-ai[logfire]==0.2.6",
|
|
31
31
|
"pygments==2.19.1",
|
|
32
32
|
"rich==14.0.0",
|
|
33
|
+
"tiktoken>=0.5.2",
|
|
34
|
+
"dspy-ai>=0.1.0",
|
|
35
|
+
"python-dotenv>=1.0.0",
|
|
33
36
|
]
|
|
34
37
|
|
|
35
38
|
[project.scripts]
|
|
@@ -26,6 +26,7 @@ from .implementations import (
|
|
|
26
26
|
ParseToolsCommand,
|
|
27
27
|
RefreshConfigCommand,
|
|
28
28
|
ThoughtsCommand,
|
|
29
|
+
TodoCommand,
|
|
29
30
|
UpdateCommand,
|
|
30
31
|
YoloCommand,
|
|
31
32
|
)
|
|
@@ -59,4 +60,5 @@ __all__ = [
|
|
|
59
60
|
"UpdateCommand",
|
|
60
61
|
"ModelCommand",
|
|
61
62
|
"InitCommand",
|
|
63
|
+
"TodoCommand",
|
|
62
64
|
]
|
{tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/commands/implementations/__init__.py
RENAMED
|
@@ -13,6 +13,7 @@ from .debug import (
|
|
|
13
13
|
from .development import BranchCommand, InitCommand
|
|
14
14
|
from .model import ModelCommand
|
|
15
15
|
from .system import ClearCommand, HelpCommand, RefreshConfigCommand, StreamingCommand, UpdateCommand
|
|
16
|
+
from .todo import TodoCommand
|
|
16
17
|
|
|
17
18
|
__all__ = [
|
|
18
19
|
# System commands
|
|
@@ -35,4 +36,6 @@ __all__ = [
|
|
|
35
36
|
"ModelCommand",
|
|
36
37
|
# Conversation commands
|
|
37
38
|
"CompactCommand",
|
|
39
|
+
# Todo commands
|
|
40
|
+
"TodoCommand",
|
|
38
41
|
]
|
{tunacode_cli-0.0.40 → tunacode_cli-0.0.42}/src/tunacode/cli/commands/implementations/debug.py
RENAMED
|
@@ -170,7 +170,7 @@ class ParseToolsCommand(SimpleCommand):
|
|
|
170
170
|
from tunacode.cli.repl import _tool_handler
|
|
171
171
|
|
|
172
172
|
def tool_callback_with_state(part, node):
|
|
173
|
-
return _tool_handler(part,
|
|
173
|
+
return _tool_handler(part, context.state_manager)
|
|
174
174
|
|
|
175
175
|
try:
|
|
176
176
|
await extract_and_execute_tool_calls(
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"""Todo command implementation."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
|
|
5
|
+
from rich.box import ROUNDED
|
|
6
|
+
from rich.table import Table
|
|
7
|
+
|
|
8
|
+
from tunacode.types import CommandArgs, CommandContext, CommandResult, TodoItem
|
|
9
|
+
from tunacode.ui import console as ui
|
|
10
|
+
|
|
11
|
+
from ..base import CommandCategory, CommandSpec, SimpleCommand
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TodoCommand(SimpleCommand):
|
|
15
|
+
"""Manage todo items."""
|
|
16
|
+
|
|
17
|
+
spec = CommandSpec(
|
|
18
|
+
name="todo",
|
|
19
|
+
aliases=["/todo", "todos"],
|
|
20
|
+
description="Manage todo items.",
|
|
21
|
+
category=CommandCategory.DEVELOPMENT,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
async def execute(self, args: CommandArgs, context: CommandContext) -> CommandResult:
|
|
25
|
+
if not args:
|
|
26
|
+
await self.list_todos(context)
|
|
27
|
+
return
|
|
28
|
+
|
|
29
|
+
subcommand = args[0].lower()
|
|
30
|
+
subcommand_args = args[1:]
|
|
31
|
+
|
|
32
|
+
if subcommand == "list":
|
|
33
|
+
await self.list_todos(context)
|
|
34
|
+
elif subcommand == "add":
|
|
35
|
+
await self.add_todo(subcommand_args, context)
|
|
36
|
+
elif subcommand == "done":
|
|
37
|
+
await self.mark_done(subcommand_args, context)
|
|
38
|
+
elif subcommand == "update":
|
|
39
|
+
await self.update_todo(subcommand_args, context)
|
|
40
|
+
elif subcommand == "priority":
|
|
41
|
+
await self.set_priority(subcommand_args, context)
|
|
42
|
+
elif subcommand == "remove":
|
|
43
|
+
await self.remove_todo(subcommand_args, context)
|
|
44
|
+
elif subcommand == "clear":
|
|
45
|
+
await self.clear_todos(context)
|
|
46
|
+
else:
|
|
47
|
+
await ui.error(
|
|
48
|
+
"Invalid todo subcommand. Available subcommands: list, add, done, update, priority, remove, clear"
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
async def list_todos(self, context: CommandContext) -> None:
|
|
52
|
+
"""Display the todo list with Rich formatting."""
|
|
53
|
+
todos = context.state_manager.session.todos
|
|
54
|
+
if not todos:
|
|
55
|
+
await ui.info("No todos found.")
|
|
56
|
+
return
|
|
57
|
+
|
|
58
|
+
# Create Rich table
|
|
59
|
+
table = Table(show_header=True, box=ROUNDED, padding=(0, 1))
|
|
60
|
+
table.add_column("ID", style="bold cyan", width=4, justify="center")
|
|
61
|
+
table.add_column("Status", width=12, justify="center")
|
|
62
|
+
table.add_column("Task", style="white", min_width=20)
|
|
63
|
+
table.add_column("Priority", width=10, justify="center")
|
|
64
|
+
table.add_column("Created", style="dim", width=12)
|
|
65
|
+
|
|
66
|
+
# Sort todos by status and priority
|
|
67
|
+
pending = [t for t in todos if t.status == "pending"]
|
|
68
|
+
in_progress = [t for t in todos if t.status == "in_progress"]
|
|
69
|
+
completed = [t for t in todos if t.status == "completed"]
|
|
70
|
+
|
|
71
|
+
# Sort each group by priority (high->medium->low)
|
|
72
|
+
priority_order = {"high": 0, "medium": 1, "low": 2}
|
|
73
|
+
|
|
74
|
+
for group in [in_progress, pending, completed]:
|
|
75
|
+
group.sort(key=lambda x: priority_order.get(x.priority, 3))
|
|
76
|
+
|
|
77
|
+
# Add rows to table
|
|
78
|
+
for todo in in_progress + pending + completed:
|
|
79
|
+
# Status with emoji
|
|
80
|
+
if todo.status == "pending":
|
|
81
|
+
status_display = "○ pending"
|
|
82
|
+
elif todo.status == "in_progress":
|
|
83
|
+
status_display = "○ in progress"
|
|
84
|
+
else:
|
|
85
|
+
status_display = "✓ completed"
|
|
86
|
+
|
|
87
|
+
# Priority with color coding
|
|
88
|
+
if todo.priority == "high":
|
|
89
|
+
priority_display = "[red] high[/red]"
|
|
90
|
+
elif todo.priority == "medium":
|
|
91
|
+
priority_display = "[yellow] medium[/yellow]"
|
|
92
|
+
else:
|
|
93
|
+
priority_display = "[green] low[/green]"
|
|
94
|
+
|
|
95
|
+
# Format created date
|
|
96
|
+
created_display = todo.created_at.strftime("%m/%d %H:%M")
|
|
97
|
+
|
|
98
|
+
table.add_row(todo.id, status_display, todo.content, priority_display, created_display)
|
|
99
|
+
|
|
100
|
+
await ui.print(table)
|
|
101
|
+
|
|
102
|
+
async def add_todo(self, args: CommandArgs, context: CommandContext) -> None:
|
|
103
|
+
"""Add a new todo and show updated list."""
|
|
104
|
+
if not args:
|
|
105
|
+
await ui.error("Please provide a task to add.")
|
|
106
|
+
return
|
|
107
|
+
|
|
108
|
+
content = " ".join(args)
|
|
109
|
+
new_id = f"{int(datetime.now().timestamp() * 1000000)}"
|
|
110
|
+
new_todo = TodoItem(
|
|
111
|
+
id=new_id,
|
|
112
|
+
content=content,
|
|
113
|
+
status="pending",
|
|
114
|
+
priority="medium",
|
|
115
|
+
created_at=datetime.now(),
|
|
116
|
+
)
|
|
117
|
+
context.state_manager.add_todo(new_todo)
|
|
118
|
+
|
|
119
|
+
await ui.success(f"Todo created: {content}")
|
|
120
|
+
await self.list_todos(context)
|
|
121
|
+
|
|
122
|
+
async def mark_done(self, args: CommandArgs, context: CommandContext) -> None:
|
|
123
|
+
"""Mark a todo as done and show updated list."""
|
|
124
|
+
if not args:
|
|
125
|
+
await ui.error("Please provide a todo ID to mark as done.")
|
|
126
|
+
return
|
|
127
|
+
|
|
128
|
+
todo_id = args[0]
|
|
129
|
+
# Find the todo to get its content for feedback
|
|
130
|
+
todo_content = None
|
|
131
|
+
for todo in context.state_manager.session.todos:
|
|
132
|
+
if todo.id == todo_id:
|
|
133
|
+
todo_content = todo.content
|
|
134
|
+
break
|
|
135
|
+
|
|
136
|
+
if not todo_content:
|
|
137
|
+
await ui.error(f"Todo with id {todo_id} not found.")
|
|
138
|
+
return
|
|
139
|
+
|
|
140
|
+
context.state_manager.update_todo(todo_id, "completed")
|
|
141
|
+
await ui.success(f"Marked todo {todo_id} as done: {todo_content}")
|
|
142
|
+
await self.list_todos(context)
|
|
143
|
+
|
|
144
|
+
async def update_todo(self, args: CommandArgs, context: CommandContext) -> None:
|
|
145
|
+
"""Update a todo status and show updated list."""
|
|
146
|
+
if len(args) < 2:
|
|
147
|
+
await ui.error("Please provide a todo ID and a new status.")
|
|
148
|
+
return
|
|
149
|
+
|
|
150
|
+
todo_id = args[0]
|
|
151
|
+
new_status = args[1].lower()
|
|
152
|
+
if new_status not in ["pending", "in_progress", "completed"]:
|
|
153
|
+
await ui.error("Invalid status. Must be one of: pending, in_progress, completed")
|
|
154
|
+
return
|
|
155
|
+
|
|
156
|
+
for todo in context.state_manager.session.todos:
|
|
157
|
+
if todo.id == todo_id:
|
|
158
|
+
todo.status = new_status
|
|
159
|
+
await ui.success(f"Updated todo {todo_id} to status {new_status}: {todo.content}")
|
|
160
|
+
await self.list_todos(context)
|
|
161
|
+
return
|
|
162
|
+
|
|
163
|
+
await ui.error(f"Todo with id {todo_id} not found.")
|
|
164
|
+
|
|
165
|
+
async def set_priority(self, args: CommandArgs, context: CommandContext) -> None:
|
|
166
|
+
"""Set todo priority and show updated list."""
|
|
167
|
+
if len(args) < 2:
|
|
168
|
+
await ui.error("Please provide a todo ID and a new priority.")
|
|
169
|
+
return
|
|
170
|
+
|
|
171
|
+
todo_id = args[0]
|
|
172
|
+
new_priority = args[1].lower()
|
|
173
|
+
if new_priority not in ["high", "medium", "low"]:
|
|
174
|
+
await ui.error("Invalid priority. Must be one of: high, medium, low")
|
|
175
|
+
return
|
|
176
|
+
|
|
177
|
+
for todo in context.state_manager.session.todos:
|
|
178
|
+
if todo.id == todo_id:
|
|
179
|
+
todo.priority = new_priority
|
|
180
|
+
await ui.success(f"Set todo {todo_id} to priority {new_priority}: {todo.content}")
|
|
181
|
+
await self.list_todos(context)
|
|
182
|
+
return
|
|
183
|
+
|
|
184
|
+
await ui.error(f"Todo with id {todo_id} not found.")
|
|
185
|
+
|
|
186
|
+
async def remove_todo(self, args: CommandArgs, context: CommandContext) -> None:
|
|
187
|
+
"""Remove a todo and show updated list."""
|
|
188
|
+
if not args:
|
|
189
|
+
await ui.error("Please provide a todo ID to remove.")
|
|
190
|
+
return
|
|
191
|
+
|
|
192
|
+
todo_id = args[0]
|
|
193
|
+
# Find the todo to get its content for feedback
|
|
194
|
+
todo_content = None
|
|
195
|
+
for todo in context.state_manager.session.todos:
|
|
196
|
+
if todo.id == todo_id:
|
|
197
|
+
todo_content = todo.content
|
|
198
|
+
break
|
|
199
|
+
|
|
200
|
+
if not todo_content:
|
|
201
|
+
await ui.error(f"Todo with id {todo_id} not found.")
|
|
202
|
+
return
|
|
203
|
+
|
|
204
|
+
context.state_manager.remove_todo(todo_id)
|
|
205
|
+
await ui.success(f"Removed todo {todo_id}: {todo_content}")
|
|
206
|
+
await self.list_todos(context)
|
|
207
|
+
|
|
208
|
+
async def clear_todos(self, context: CommandContext) -> None:
|
|
209
|
+
"""Clear all todos and show confirmation."""
|
|
210
|
+
todo_count = len(context.state_manager.session.todos)
|
|
211
|
+
if todo_count == 0:
|
|
212
|
+
await ui.info("No todos to clear.")
|
|
213
|
+
return
|
|
214
|
+
|
|
215
|
+
context.state_manager.clear_todos()
|
|
216
|
+
await ui.success(f"Cleared all {todo_count} todos.")
|
|
217
|
+
await self.list_todos(context)
|
|
@@ -26,6 +26,7 @@ from .implementations.system import (
|
|
|
26
26
|
StreamingCommand,
|
|
27
27
|
UpdateCommand,
|
|
28
28
|
)
|
|
29
|
+
from .implementations.todo import TodoCommand
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
@dataclass
|
|
@@ -119,6 +120,7 @@ class CommandRegistry:
|
|
|
119
120
|
CompactCommand,
|
|
120
121
|
ModelCommand,
|
|
121
122
|
InitCommand,
|
|
123
|
+
TodoCommand,
|
|
122
124
|
]
|
|
123
125
|
|
|
124
126
|
# Register all discovered commands
|
|
@@ -17,7 +17,7 @@ from tunacode.ui import console as ui
|
|
|
17
17
|
from tunacode.utils.system import check_for_updates
|
|
18
18
|
|
|
19
19
|
app_settings = ApplicationSettings()
|
|
20
|
-
app = typer.Typer(help="
|
|
20
|
+
app = typer.Typer(help="TunaCode - OS AI-powered development assistant")
|
|
21
21
|
state_manager = StateManager()
|
|
22
22
|
|
|
23
23
|
|
|
@@ -30,8 +30,11 @@ def main(
|
|
|
30
30
|
),
|
|
31
31
|
model: str = typer.Option(None, "--model", help="Default model to use (e.g., openai/gpt-4)"),
|
|
32
32
|
key: str = typer.Option(None, "--key", help="API key for the provider"),
|
|
33
|
+
context: int = typer.Option(
|
|
34
|
+
None, "--context", help="Maximum context window size for custom models"
|
|
35
|
+
),
|
|
33
36
|
):
|
|
34
|
-
"""
|
|
37
|
+
"""Start TunaCode - Your AI-powered development assistant"""
|
|
35
38
|
|
|
36
39
|
async def async_main():
|
|
37
40
|
if version:
|
|
@@ -43,9 +46,13 @@ def main(
|
|
|
43
46
|
# Start update check in background
|
|
44
47
|
update_task = asyncio.create_task(asyncio.to_thread(check_for_updates))
|
|
45
48
|
|
|
46
|
-
cli_config = {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
cli_config = {
|
|
50
|
+
"baseurl": baseurl,
|
|
51
|
+
"model": model,
|
|
52
|
+
"key": key,
|
|
53
|
+
"custom_context_window": context,
|
|
54
|
+
}
|
|
55
|
+
cli_config = {k: v for k, v in cli_config.items() if v is not None}
|
|
49
56
|
|
|
50
57
|
try:
|
|
51
58
|
await setup(run_setup, state_manager, cli_config)
|