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.

Files changed (249) hide show
  1. {tunacode_cli-0.0.48/src/tunacode_cli.egg-info → tunacode_cli-0.0.50}/PKG-INFO +2 -2
  2. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/README.md +1 -1
  3. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/pyproject.toml +34 -1
  4. tunacode_cli-0.0.50/src/api/auth.py +13 -0
  5. tunacode_cli-0.0.50/src/api/users.py +8 -0
  6. tunacode_cli-0.0.50/src/tunacode/__init__.py +4 -0
  7. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/main.py +4 -0
  8. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/repl.py +39 -6
  9. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/configuration/defaults.py +0 -1
  10. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/constants.py +7 -1
  11. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/agents/main.py +268 -245
  12. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/agents/utils.py +54 -6
  13. tunacode_cli-0.0.50/src/tunacode/core/logging/__init__.py +29 -0
  14. tunacode_cli-0.0.50/src/tunacode/core/logging/config.py +57 -0
  15. tunacode_cli-0.0.50/src/tunacode/core/logging/formatters.py +48 -0
  16. tunacode_cli-0.0.50/src/tunacode/core/logging/handlers.py +83 -0
  17. tunacode_cli-0.0.50/src/tunacode/core/logging/logger.py +8 -0
  18. tunacode_cli-0.0.50/src/tunacode/core/recursive/__init__.py +18 -0
  19. tunacode_cli-0.0.50/src/tunacode/core/recursive/aggregator.py +467 -0
  20. tunacode_cli-0.0.50/src/tunacode/core/recursive/budget.py +414 -0
  21. tunacode_cli-0.0.50/src/tunacode/core/recursive/decomposer.py +398 -0
  22. tunacode_cli-0.0.50/src/tunacode/core/recursive/executor.py +470 -0
  23. tunacode_cli-0.0.50/src/tunacode/core/recursive/hierarchy.py +488 -0
  24. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/state.py +45 -0
  25. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/exceptions.py +23 -0
  26. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/base.py +7 -1
  27. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/types.py +5 -1
  28. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/completers.py +2 -2
  29. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/console.py +30 -9
  30. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/input.py +2 -1
  31. tunacode_cli-0.0.50/src/tunacode/ui/keybindings.py +82 -0
  32. tunacode_cli-0.0.50/src/tunacode/ui/logging_compat.py +44 -0
  33. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/output.py +7 -6
  34. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/panels.py +30 -5
  35. tunacode_cli-0.0.50/src/tunacode/ui/recursive_progress.py +380 -0
  36. tunacode_cli-0.0.50/src/tunacode/utils/retry.py +163 -0
  37. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/security.py +3 -2
  38. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/token_counter.py +1 -2
  39. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50/src/tunacode_cli.egg-info}/PKG-INFO +2 -2
  40. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode_cli.egg-info/SOURCES.txt +20 -65
  41. tunacode_cli-0.0.50/src/tunacode_cli.egg-info/top_level.txt +3 -0
  42. tunacode_cli-0.0.50/tests/characterization/context/test_tunacode_logging.py +84 -0
  43. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_error_handling.py +12 -4
  44. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_input_handling.py +6 -4
  45. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_multiline_input.py +11 -4
  46. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_output_display_logic.py +1 -1
  47. tunacode_cli-0.0.50/tests/characterization/repl/test_repl_initialization.py +114 -0
  48. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/ui/test_async_ui.py +5 -3
  49. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/conftest.py +4 -2
  50. tunacode_cli-0.0.50/tests/test_json_retry.py +230 -0
  51. tunacode_cli-0.0.50/tests/test_logging_config.py +112 -0
  52. tunacode_cli-0.0.50/tests/test_tool_batching_retry.py +287 -0
  53. tunacode_cli-0.0.50/tests/unit/test_recursive_executor.py +218 -0
  54. tunacode_cli-0.0.48/src/tunacode/core/agents/dspy_integration.py +0 -223
  55. tunacode_cli-0.0.48/src/tunacode/core/agents/dspy_tunacode.py +0 -458
  56. tunacode_cli-0.0.48/src/tunacode/prompts/dspy_task_planning.md +0 -45
  57. tunacode_cli-0.0.48/src/tunacode/prompts/dspy_tool_selection.md +0 -58
  58. tunacode_cli-0.0.48/src/tunacode/ui/keybindings.py +0 -25
  59. tunacode_cli-0.0.48/src/tunacode/utils/__init__.py +0 -0
  60. tunacode_cli-0.0.48/src/tunacode_cli.egg-info/top_level.txt +0 -1
  61. tunacode_cli-0.0.48/tests/characterization/context/test_tunacode_logging.py +0 -79
  62. tunacode_cli-0.0.48/tests/characterization/repl/test_repl_initialization.py +0 -59
  63. tunacode_cli-0.0.48/tests/crud/test_core_file_operations.py +0 -452
  64. tunacode_cli-0.0.48/tests/fixtures/__init__.py +0 -1
  65. tunacode_cli-0.0.48/tests/fixtures/file_operations.py +0 -332
  66. tunacode_cli-0.0.48/tests/integration/test_error_recovery_flow.py +0 -43
  67. tunacode_cli-0.0.48/tests/integration/test_full_session_flow.py +0 -68
  68. tunacode_cli-0.0.48/tests/integration/test_mcp_tool_flow.py +0 -51
  69. tunacode_cli-0.0.48/tests/integration/test_multi_tool_operations.py +0 -61
  70. tunacode_cli-0.0.48/tests/integration/test_performance_scenarios.py +0 -62
  71. tunacode_cli-0.0.48/tests/integration/test_usage_tracking_integration.py +0 -134
  72. tunacode_cli-0.0.48/tests/test_actual_parallelism.py +0 -260
  73. tunacode_cli-0.0.48/tests/test_agent_initialization.py +0 -152
  74. tunacode_cli-0.0.48/tests/test_api_response_parser.py +0 -82
  75. tunacode_cli-0.0.48/tests/test_background_manager.py +0 -27
  76. tunacode_cli-0.0.48/tests/test_characterization_agent_main.py +0 -57
  77. tunacode_cli-0.0.48/tests/test_characterization_bash.py +0 -227
  78. tunacode_cli-0.0.48/tests/test_characterization_commands_system.py +0 -90
  79. tunacode_cli-0.0.48/tests/test_characterization_glob.py +0 -395
  80. tunacode_cli-0.0.48/tests/test_characterization_grep.py +0 -329
  81. tunacode_cli-0.0.48/tests/test_characterization_grep_performance.py +0 -296
  82. tunacode_cli-0.0.48/tests/test_characterization_iteration_limits.py +0 -141
  83. tunacode_cli-0.0.48/tests/test_characterization_list_dir.py +0 -289
  84. tunacode_cli-0.0.48/tests/test_characterization_read_file.py +0 -201
  85. tunacode_cli-0.0.48/tests/test_characterization_repl_utils.py +0 -41
  86. tunacode_cli-0.0.48/tests/test_characterization_run_command.py +0 -241
  87. tunacode_cli-0.0.48/tests/test_characterization_setup_system.py +0 -76
  88. tunacode_cli-0.0.48/tests/test_characterization_tool_ui_behavior.py +0 -381
  89. tunacode_cli-0.0.48/tests/test_characterization_update_file.py +0 -231
  90. tunacode_cli-0.0.48/tests/test_characterization_utilities.py +0 -64
  91. tunacode_cli-0.0.48/tests/test_characterization_write_file.py +0 -224
  92. tunacode_cli-0.0.48/tests/test_cli_command_flow.py +0 -312
  93. tunacode_cli-0.0.48/tests/test_cli_file_operations_integration.py +0 -283
  94. tunacode_cli-0.0.48/tests/test_config_directory_creation.py +0 -105
  95. tunacode_cli-0.0.48/tests/test_config_setup_async.py +0 -120
  96. tunacode_cli-0.0.48/tests/test_cost_calculator.py +0 -32
  97. tunacode_cli-0.0.48/tests/test_dspy_integration.py +0 -127
  98. tunacode_cli-0.0.48/tests/test_enhanced_visual_feedback.py +0 -95
  99. tunacode_cli-0.0.48/tests/test_fallback_responses.py +0 -48
  100. tunacode_cli-0.0.48/tests/test_fast_glob_search.py +0 -129
  101. tunacode_cli-0.0.48/tests/test_file_operations_edge_cases.py +0 -393
  102. tunacode_cli-0.0.48/tests/test_file_operations_stress.py +0 -333
  103. tunacode_cli-0.0.48/tests/test_file_reference_context_tracking.py +0 -146
  104. tunacode_cli-0.0.48/tests/test_file_reference_expansion.py +0 -208
  105. tunacode_cli-0.0.48/tests/test_grep_fast_glob.py +0 -380
  106. tunacode_cli-0.0.48/tests/test_grep_legacy_compat.py +0 -61
  107. tunacode_cli-0.0.48/tests/test_grep_timeout.py +0 -180
  108. tunacode_cli-0.0.48/tests/test_json_tool_parsing.py +0 -214
  109. tunacode_cli-0.0.48/tests/test_list_dir.py +0 -188
  110. tunacode_cli-0.0.48/tests/test_parallel_execution_demo.py +0 -151
  111. tunacode_cli-0.0.48/tests/test_parallel_execution_freeze_fix.py +0 -153
  112. tunacode_cli-0.0.48/tests/test_parallel_execution_integration.py +0 -202
  113. tunacode_cli-0.0.48/tests/test_parallel_read_only_tools.py +0 -248
  114. tunacode_cli-0.0.48/tests/test_parallel_tool_execution.py +0 -151
  115. tunacode_cli-0.0.48/tests/test_read_only_confirmation.py +0 -67
  116. tunacode_cli-0.0.48/tests/test_streaming_panel_tool_confirmation.py +0 -176
  117. tunacode_cli-0.0.48/tests/test_streaming_spinner_conflict.py +0 -117
  118. tunacode_cli-0.0.48/tests/test_todo_functionality.py +0 -441
  119. tunacode_cli-0.0.48/tests/test_tool_categorization.py +0 -110
  120. tunacode_cli-0.0.48/tests/test_tool_combinations.py +0 -575
  121. tunacode_cli-0.0.48/tests/test_tool_handler_ui_messages.py +0 -113
  122. tunacode_cli-0.0.48/tests/test_update_command.py +0 -48
  123. tunacode_cli-0.0.48/tests/test_visual_parallel_feedback.py +0 -172
  124. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/CLAUDE.md +0 -0
  125. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/LICENSE +0 -0
  126. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/MANIFEST.in +0 -0
  127. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/TUNACODE.md +0 -0
  128. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/setup.cfg +0 -0
  129. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/setup.py +0 -0
  130. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/__init__.py +0 -0
  131. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/__init__.py +0 -0
  132. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/base.py +0 -0
  133. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/__init__.py +0 -0
  134. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/conversation.py +0 -0
  135. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/debug.py +0 -0
  136. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/development.py +0 -0
  137. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/model.py +0 -0
  138. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/system.py +0 -0
  139. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/implementations/todo.py +0 -0
  140. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/cli/commands/registry.py +0 -0
  141. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/configuration/__init__.py +0 -0
  142. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/configuration/models.py +0 -0
  143. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/configuration/settings.py +0 -0
  144. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/context.py +0 -0
  145. {tunacode_cli-0.0.48/src/tunacode → tunacode_cli-0.0.50/src/tunacode/core}/__init__.py +0 -0
  146. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/agents/__init__.py +0 -0
  147. {tunacode_cli-0.0.48/src/tunacode/core → tunacode_cli-0.0.50/src/tunacode/core/background}/__init__.py +0 -0
  148. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/background/manager.py +0 -0
  149. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/code_index.py +0 -0
  150. {tunacode_cli-0.0.48/src/tunacode/core/background → tunacode_cli-0.0.50/src/tunacode/core/llm}/__init__.py +0 -0
  151. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/__init__.py +0 -0
  152. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/agent_setup.py +0 -0
  153. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/base.py +0 -0
  154. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/config_setup.py +0 -0
  155. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/coordinator.py +0 -0
  156. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/environment_setup.py +0 -0
  157. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/setup/git_safety_setup.py +0 -0
  158. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/token_usage/api_response_parser.py +0 -0
  159. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/token_usage/cost_calculator.py +0 -0
  160. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/token_usage/usage_tracker.py +0 -0
  161. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/core/tool_handler.py +0 -0
  162. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/prompts/system.md +0 -0
  163. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/py.typed +0 -0
  164. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/services/__init__.py +0 -0
  165. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/services/mcp.py +0 -0
  166. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/setup.py +0 -0
  167. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/__init__.py +0 -0
  168. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/bash.py +0 -0
  169. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/glob.py +0 -0
  170. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/grep.py +0 -0
  171. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/list_dir.py +0 -0
  172. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/read_file.py +0 -0
  173. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/read_file_async_poc.py +0 -0
  174. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/run_command.py +0 -0
  175. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/todo.py +0 -0
  176. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/update_file.py +0 -0
  177. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/tools/write_file.py +0 -0
  178. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/__init__.py +0 -0
  179. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/constants.py +0 -0
  180. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/decorators.py +0 -0
  181. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/lexers.py +0 -0
  182. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/prompt_manager.py +0 -0
  183. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/tool_ui.py +0 -0
  184. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/utils.py +0 -0
  185. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/ui/validators.py +0 -0
  186. {tunacode_cli-0.0.48/src/tunacode/core/llm → tunacode_cli-0.0.50/src/tunacode/utils}/__init__.py +0 -0
  187. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/bm25.py +0 -0
  188. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/diff_utils.py +0 -0
  189. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/file_utils.py +0 -0
  190. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/import_cache.py +0 -0
  191. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/message_utils.py +0 -0
  192. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/ripgrep.py +0 -0
  193. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/system.py +0 -0
  194. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/text_utils.py +0 -0
  195. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode/utils/user_configuration.py +0 -0
  196. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode_cli.egg-info/dependency_links.txt +0 -0
  197. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode_cli.egg-info/entry_points.txt +0 -0
  198. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/src/tunacode_cli.egg-info/requires.txt +0 -0
  199. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/__init__.py +0 -0
  200. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/conftest.py +0 -0
  201. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/test_agent_creation.py +0 -0
  202. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/test_json_tool_parsing.py +0 -0
  203. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/test_process_node.py +0 -0
  204. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/test_process_request.py +0 -0
  205. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/agent/test_tool_message_patching.py +0 -0
  206. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/background/test_background_edge_cases.py +0 -0
  207. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/background/test_cleanup.py +0 -0
  208. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/background/test_task_cancellation.py +0 -0
  209. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/background/test_task_creation.py +0 -0
  210. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/background/test_task_execution.py +0 -0
  211. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/code_index/test_cache_management.py +0 -0
  212. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/code_index/test_file_scanning.py +0 -0
  213. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/code_index/test_index_building.py +0 -0
  214. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/code_index/test_search_operations.py +0 -0
  215. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/code_index/test_symbol_extraction.py +0 -0
  216. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/commands/__init__.py +0 -0
  217. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/commands/test_init_command.py +0 -0
  218. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/conftest.py +0 -0
  219. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/context/__init__.py +0 -0
  220. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/context/test_context_acceptance.py +0 -0
  221. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/context/test_context_integration.py +0 -0
  222. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/context/test_context_loading.py +0 -0
  223. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_command_parsing.py +0 -0
  224. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_keyboard_interrupts.py +0 -0
  225. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/repl/test_session_flow.py +0 -0
  226. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/services/test_error_recovery.py +0 -0
  227. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/services/test_llm_routing.py +0 -0
  228. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/services/test_mcp_integration.py +0 -0
  229. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/services/test_service_lifecycle.py +0 -0
  230. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_agent_tracking.py +0 -0
  231. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_message_history.py +0 -0
  232. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_permissions.py +0 -0
  233. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_session_management.py +0 -0
  234. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_state_initialization.py +0 -0
  235. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/state/test_user_config.py +0 -0
  236. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/test_characterization_commands.py +0 -0
  237. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/ui/test_console_output.py +0 -0
  238. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/ui/test_diff_display.py +0 -0
  239. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/ui/test_prompt_rendering.py +0 -0
  240. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/ui/test_tool_confirmations.py +0 -0
  241. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/conftest.py +0 -0
  242. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/test_expand_file_refs.py +0 -0
  243. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/test_file_operations.py +0 -0
  244. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/test_git_commands.py +0 -0
  245. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/test_token_counting.py +0 -0
  246. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/characterization/utils/test_utils_edge_cases.py +0 -0
  247. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/test_agent_output_formatting.py +0 -0
  248. {tunacode_cli-0.0.48 → tunacode_cli-0.0.50}/tests/test_prompt_changes_validation.py +0 -0
  249. {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.48
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
- ![Demo](docs/assets/demo.gif)
51
+ ![TunaCode Example](assets/tunacode_example.png)
52
52
 
53
53
  </div>
54
54
 
@@ -9,7 +9,7 @@
9
9
 
10
10
  **AI-powered CLI coding assistant**
11
11
 
12
- ![Demo](docs/assets/demo.gif)
12
+ ![TunaCode Example](assets/tunacode_example.png)
13
13
 
14
14
  </div>
15
15
 
@@ -4,7 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tunacode-cli"
7
- version = "0.0.48"
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")
@@ -0,0 +1,8 @@
1
+ from .auth import authenticate
2
+
3
+
4
+ class UserManager:
5
+ def login(self, username, password):
6
+ token = authenticate(username, password)
7
+ # TODO: Store session
8
+ return token
@@ -0,0 +1,4 @@
1
+ # Initialize unified logging system on package import
2
+ from tunacode.core.logging import setup_logging
3
+
4
+ setup_logging()
@@ -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"\nFiles in context: {', '.join(filenames)}")
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
- await ui.muted(f"• Model: {model_name} • {context_display}")
389
- await ui.success("Ready to assist")
390
- await ui.line()
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
- await ui.muted(f"• Model: {state_manager.session.current_model} {context_display}")
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.48"
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