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