tunacode-cli 0.0.38__tar.gz → 0.0.39__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 (207) hide show
  1. {tunacode_cli-0.0.38/src/tunacode_cli.egg-info → tunacode_cli-0.0.39}/PKG-INFO +1 -1
  2. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/pyproject.toml +1 -1
  3. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/constants.py +1 -1
  4. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/prompts/system.md +49 -12
  5. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39/src/tunacode_cli.egg-info}/PKG-INFO +1 -1
  6. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode_cli.egg-info/SOURCES.txt +2 -0
  7. tunacode_cli-0.0.39/tests/test_agent_output_formatting.py +107 -0
  8. tunacode_cli-0.0.39/tests/test_prompt_changes_validation.py +35 -0
  9. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/CLAUDE.md +0 -0
  10. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/LICENSE +0 -0
  11. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/MANIFEST.in +0 -0
  12. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/README.md +0 -0
  13. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/TUNACODE.md +0 -0
  14. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/setup.cfg +0 -0
  15. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/setup.py +0 -0
  16. {tunacode_cli-0.0.38/src/tunacode/utils → tunacode_cli-0.0.39/src/tunacode}/__init__.py +0 -0
  17. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/__init__.py +0 -0
  18. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/commands/__init__.py +0 -0
  19. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/commands/base.py +0 -0
  20. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/commands/implementations/__init__.py +0 -0
  21. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/commands/implementations/conversation.py +0 -0
  22. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/commands/implementations/debug.py +0 -0
  23. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/commands/implementations/development.py +0 -0
  24. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/commands/implementations/model.py +0 -0
  25. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/commands/implementations/system.py +0 -0
  26. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/commands/registry.py +0 -0
  27. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/main.py +0 -0
  28. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/repl.py +0 -0
  29. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/textual_app.py +0 -0
  30. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/cli/textual_bridge.py +0 -0
  31. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/configuration/__init__.py +0 -0
  32. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/configuration/defaults.py +0 -0
  33. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/configuration/models.py +0 -0
  34. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/configuration/settings.py +0 -0
  35. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/context.py +0 -0
  36. {tunacode_cli-0.0.38/src/tunacode/core/llm → tunacode_cli-0.0.39/src/tunacode/core}/__init__.py +0 -0
  37. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/agents/__init__.py +0 -0
  38. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/agents/main.py +0 -0
  39. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/agents/utils.py +0 -0
  40. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/background/__init__.py +0 -0
  41. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/background/manager.py +0 -0
  42. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/code_index.py +0 -0
  43. {tunacode_cli-0.0.38/src/tunacode/core → tunacode_cli-0.0.39/src/tunacode/core/llm}/__init__.py +0 -0
  44. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/setup/__init__.py +0 -0
  45. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/setup/agent_setup.py +0 -0
  46. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/setup/base.py +0 -0
  47. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/setup/config_setup.py +0 -0
  48. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/setup/coordinator.py +0 -0
  49. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/setup/environment_setup.py +0 -0
  50. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/setup/git_safety_setup.py +0 -0
  51. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/state.py +0 -0
  52. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/core/tool_handler.py +0 -0
  53. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/exceptions.py +0 -0
  54. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/py.typed +0 -0
  55. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/services/__init__.py +0 -0
  56. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/services/mcp.py +0 -0
  57. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/setup.py +0 -0
  58. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/tools/__init__.py +0 -0
  59. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/tools/base.py +0 -0
  60. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/tools/bash.py +0 -0
  61. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/tools/glob.py +0 -0
  62. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/tools/grep.py +0 -0
  63. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/tools/list_dir.py +0 -0
  64. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/tools/read_file.py +0 -0
  65. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/tools/read_file_async_poc.py +0 -0
  66. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/tools/run_command.py +0 -0
  67. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/tools/update_file.py +0 -0
  68. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/tools/write_file.py +0 -0
  69. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/types.py +0 -0
  70. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/__init__.py +0 -0
  71. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/completers.py +0 -0
  72. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/console.py +0 -0
  73. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/constants.py +0 -0
  74. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/decorators.py +0 -0
  75. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/input.py +0 -0
  76. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/keybindings.py +0 -0
  77. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/lexers.py +0 -0
  78. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/output.py +0 -0
  79. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/panels.py +0 -0
  80. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/prompt_manager.py +0 -0
  81. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/tool_ui.py +0 -0
  82. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/utils.py +0 -0
  83. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/ui/validators.py +0 -0
  84. {tunacode_cli-0.0.38/src/tunacode → tunacode_cli-0.0.39/src/tunacode/utils}/__init__.py +0 -0
  85. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/utils/bm25.py +0 -0
  86. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/utils/diff_utils.py +0 -0
  87. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/utils/file_utils.py +0 -0
  88. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/utils/import_cache.py +0 -0
  89. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/utils/ripgrep.py +0 -0
  90. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/utils/security.py +0 -0
  91. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/utils/system.py +0 -0
  92. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/utils/text_utils.py +0 -0
  93. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/utils/token_counter.py +0 -0
  94. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode/utils/user_configuration.py +0 -0
  95. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode_cli.egg-info/dependency_links.txt +0 -0
  96. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode_cli.egg-info/entry_points.txt +0 -0
  97. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode_cli.egg-info/requires.txt +0 -0
  98. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/src/tunacode_cli.egg-info/top_level.txt +0 -0
  99. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/agent/__init__.py +0 -0
  100. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/agent/conftest.py +0 -0
  101. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/agent/test_agent_creation.py +0 -0
  102. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/agent/test_json_tool_parsing.py +0 -0
  103. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/agent/test_process_node.py +0 -0
  104. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/agent/test_process_request.py +0 -0
  105. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/agent/test_tool_message_patching.py +0 -0
  106. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/background/test_background_edge_cases.py +0 -0
  107. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/background/test_cleanup.py +0 -0
  108. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/background/test_task_cancellation.py +0 -0
  109. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/background/test_task_creation.py +0 -0
  110. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/background/test_task_execution.py +0 -0
  111. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/code_index/test_cache_management.py +0 -0
  112. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/code_index/test_file_scanning.py +0 -0
  113. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/code_index/test_index_building.py +0 -0
  114. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/code_index/test_search_operations.py +0 -0
  115. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/code_index/test_symbol_extraction.py +0 -0
  116. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/commands/__init__.py +0 -0
  117. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/commands/test_init_command.py +0 -0
  118. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/conftest.py +0 -0
  119. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/context/__init__.py +0 -0
  120. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/context/test_context_acceptance.py +0 -0
  121. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/context/test_context_integration.py +0 -0
  122. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/context/test_context_loading.py +0 -0
  123. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/context/test_tunacode_logging.py +0 -0
  124. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/repl/test_command_parsing.py +0 -0
  125. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/repl/test_input_handling.py +0 -0
  126. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/repl/test_keyboard_interrupts.py +0 -0
  127. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/repl/test_multiline_input.py +0 -0
  128. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/repl/test_repl_initialization.py +0 -0
  129. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/repl/test_session_flow.py +0 -0
  130. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/services/test_error_recovery.py +0 -0
  131. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/services/test_llm_routing.py +0 -0
  132. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/services/test_mcp_integration.py +0 -0
  133. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/services/test_service_lifecycle.py +0 -0
  134. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/state/test_agent_tracking.py +0 -0
  135. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/state/test_message_history.py +0 -0
  136. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/state/test_permissions.py +0 -0
  137. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/state/test_session_management.py +0 -0
  138. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/state/test_state_initialization.py +0 -0
  139. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/state/test_user_config.py +0 -0
  140. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/test_characterization_commands.py +0 -0
  141. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/ui/test_async_ui.py +0 -0
  142. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/ui/test_console_output.py +0 -0
  143. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/ui/test_diff_display.py +0 -0
  144. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/ui/test_prompt_rendering.py +0 -0
  145. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/ui/test_tool_confirmations.py +0 -0
  146. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/utils/test_file_operations.py +0 -0
  147. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/utils/test_git_commands.py +0 -0
  148. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/utils/test_token_counting.py +0 -0
  149. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/characterization/utils/test_utils_edge_cases.py +0 -0
  150. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/conftest.py +0 -0
  151. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/crud/test_core_file_operations.py +0 -0
  152. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/fixtures/__init__.py +0 -0
  153. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/fixtures/file_operations.py +0 -0
  154. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/integration/test_error_recovery_flow.py +0 -0
  155. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/integration/test_full_session_flow.py +0 -0
  156. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/integration/test_mcp_tool_flow.py +0 -0
  157. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/integration/test_multi_tool_operations.py +0 -0
  158. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/integration/test_performance_scenarios.py +0 -0
  159. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_actual_parallelism.py +0 -0
  160. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_agent_initialization.py +0 -0
  161. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_background_manager.py +0 -0
  162. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_agent_main.py +0 -0
  163. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_bash.py +0 -0
  164. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_commands_system.py +0 -0
  165. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_glob.py +0 -0
  166. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_grep.py +0 -0
  167. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_grep_performance.py +0 -0
  168. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_iteration_limits.py +0 -0
  169. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_list_dir.py +0 -0
  170. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_read_file.py +0 -0
  171. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_repl_utils.py +0 -0
  172. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_run_command.py +0 -0
  173. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_setup_system.py +0 -0
  174. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_tool_ui_behavior.py +0 -0
  175. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_update_file.py +0 -0
  176. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_utilities.py +0 -0
  177. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_characterization_write_file.py +0 -0
  178. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_cli_command_flow.py +0 -0
  179. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_cli_file_operations_integration.py +0 -0
  180. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_config_directory_creation.py +0 -0
  181. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_config_setup_async.py +0 -0
  182. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_enhanced_visual_feedback.py +0 -0
  183. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_fallback_responses.py +0 -0
  184. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_fast_glob_search.py +0 -0
  185. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_file_operations_edge_cases.py +0 -0
  186. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_file_operations_stress.py +0 -0
  187. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_file_reference_context_tracking.py +0 -0
  188. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_file_reference_expansion.py +0 -0
  189. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_grep_fast_glob.py +0 -0
  190. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_grep_legacy_compat.py +0 -0
  191. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_grep_timeout.py +0 -0
  192. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_json_tool_parsing.py +0 -0
  193. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_list_dir.py +0 -0
  194. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_parallel_execution_demo.py +0 -0
  195. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_parallel_execution_freeze_fix.py +0 -0
  196. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_parallel_execution_integration.py +0 -0
  197. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_parallel_read_only_tools.py +0 -0
  198. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_parallel_tool_execution.py +0 -0
  199. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_read_only_confirmation.py +0 -0
  200. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_security.py +0 -0
  201. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_streaming_panel_tool_confirmation.py +0 -0
  202. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_streaming_spinner_conflict.py +0 -0
  203. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_tool_categorization.py +0 -0
  204. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_tool_combinations.py +0 -0
  205. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_tool_handler_ui_messages.py +0 -0
  206. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_update_command.py +0 -0
  207. {tunacode_cli-0.0.38 → tunacode_cli-0.0.39}/tests/test_visual_parallel_feedback.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tunacode-cli
3
- Version: 0.0.38
3
+ Version: 0.0.39
4
4
  Summary: Your agentic CLI developer.
5
5
  Author-email: larock22 <noreply@github.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tunacode-cli"
7
- version = "0.0.38"
7
+ version = "0.0.39"
8
8
  description = "Your agentic CLI developer."
9
9
  keywords = ["cli", "agent", "development", "automation"]
10
10
  readme = "README.md"
@@ -7,7 +7,7 @@ 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.38"
10
+ APP_VERSION = "0.0.39"
11
11
 
12
12
  # File patterns
13
13
  GUIDE_FILE_PATTERN = "{name}.md"
@@ -256,13 +256,48 @@ If deeper exploration needed:
256
256
 
257
257
  \###Meta Behavior###
258
258
 
259
- Use the **ReAct** (Reasoning + Action) framework:
259
+ Use the **ReAct** (Reasoning + Action) framework internally:
260
260
 
261
- - {"thought": "I need to inspect the file before modifying."}
262
- - → run tool
263
- - {"thought": "I see the old import. Now I'll patch it."}
264
- - update file
265
- - {"thought": "Patch complete. Ready for next instruction."}
261
+ **IMPORTANT**: Thoughts are for internal reasoning only. NEVER include JSON-formatted thoughts in your responses to users.
262
+
263
+ Internal process (not shown to user):
264
+ - Think: "I need to inspect the file before modifying."
265
+ - Act: run tool
266
+ - Think: "I see the old import. Now I'll patch it."
267
+ - Act: update file
268
+ - Think: "Patch complete. Ready for next instruction."
269
+
270
+ **Your responses to users should be clean, formatted text without JSON artifacts.**
271
+
272
+ ---
273
+
274
+ \###Output Formatting Rules###
275
+
276
+ **CRITICAL**: Your responses to users must be clean, readable text:
277
+
278
+ 1. **NO JSON in responses** - Never output {"thought": ...}, {"suggestions": ...}, or any JSON to users
279
+ 2. **Use markdown formatting** - Use headers, lists, code blocks for readability
280
+ 3. **Be direct and clear** - Provide actionable feedback and concrete suggestions
281
+ 4. **Format suggestions as numbered or bulleted lists** - Not as JSON arrays
282
+
283
+ **Example of GOOD response formatting:**
284
+ ```
285
+ Code Review Results:
286
+
287
+ The JavaScript code has good structure. Here are suggestions for improvement:
288
+
289
+ 1. **Add comments** - Document major functions for better maintainability
290
+ 2. **Consistent error handling** - Use try-catch blocks consistently
291
+ 3. **Form validation** - Validate before submitting to ensure fields are filled
292
+
293
+ These changes will improve maintainability and user experience.
294
+ ```
295
+
296
+ **Example of BAD response formatting (DO NOT DO THIS):**
297
+ ```
298
+ {"thought": "Reviewing the code..."}
299
+ {"suggestions": ["Add comments", "Error handling", "Validation"]}
300
+ ```
266
301
 
267
302
  ---
268
303
 
@@ -281,12 +316,13 @@ When users provide @ file references, they want information, not file creation.
281
316
  ```plaintext
282
317
  User: What's the current app version?
283
318
 
284
- THINK: {"thought": "I should search for APP_VERSION. I'll use grep for parallel capability."}
319
+ [Internal thinking - not shown to user]
285
320
  ACT: grep("APP_VERSION", ".")
286
- OBSERVE: {"thought": "Found APP_VERSION in constants.py at line 12."}
321
+ [Found APP_VERSION in constants.py at line 12]
287
322
  ACT: read_file("constants.py")
288
- OBSERVE: {"thought": "APP_VERSION is set to '2.4.1'. This is the current version."}
289
- RESPONSE: "Current version is 2.4.1 (from constants.py)"
323
+ [APP_VERSION is set to '2.4.1']
324
+
325
+ RESPONSE TO USER: Current version is 2.4.1 (from constants.py)
290
326
  ```
291
327
 
292
328
  ````plaintext
@@ -300,8 +336,9 @@ def main():
300
336
 
301
337
  === END FILE REFERENCE: src/main.py ===
302
338
 
303
- THINK: {"thought": "User is asking about the referenced file, not asking me to create it."}
304
- RESPONSE: "The main.py file contains a simple main function that prints 'Hello World'."
339
+ [Internal: User is asking about the referenced file, not asking me to create it]
340
+
341
+ RESPONSE TO USER: The main.py file contains a simple main function that prints 'Hello World'.
305
342
 
306
343
  ```
307
344
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tunacode-cli
3
- Version: 0.0.38
3
+ Version: 0.0.39
4
4
  Summary: Your agentic CLI developer.
5
5
  Author-email: larock22 <noreply@github.com>
6
6
  License-Expression: MIT
@@ -95,6 +95,7 @@ src/tunacode_cli.egg-info/top_level.txt
95
95
  tests/conftest.py
96
96
  tests/test_actual_parallelism.py
97
97
  tests/test_agent_initialization.py
98
+ tests/test_agent_output_formatting.py
98
99
  tests/test_background_manager.py
99
100
  tests/test_characterization_agent_main.py
100
101
  tests/test_characterization_bash.py
@@ -133,6 +134,7 @@ tests/test_parallel_execution_freeze_fix.py
133
134
  tests/test_parallel_execution_integration.py
134
135
  tests/test_parallel_read_only_tools.py
135
136
  tests/test_parallel_tool_execution.py
137
+ tests/test_prompt_changes_validation.py
136
138
  tests/test_read_only_confirmation.py
137
139
  tests/test_security.py
138
140
  tests/test_streaming_panel_tool_confirmation.py
@@ -0,0 +1,107 @@
1
+ """Tests for agent output formatting to ensure clean display without JSON artifacts."""
2
+
3
+ from unittest.mock import AsyncMock, MagicMock, patch
4
+
5
+ import pytest
6
+
7
+ from tunacode.cli.repl import process_request
8
+ from tunacode.types import SimpleResult
9
+
10
+
11
+ class TestAgentOutputFormatting:
12
+ """Test that agent output is properly formatted for users."""
13
+
14
+ def _create_mock_state_manager(self):
15
+ """Create a properly configured mock StateManager."""
16
+ state_manager = MagicMock()
17
+ state_manager.session = MagicMock()
18
+ state_manager.session.messages = []
19
+ state_manager.session.show_thoughts = False
20
+ state_manager.session.user_config = {"settings": {"enable_streaming": False}}
21
+ state_manager.session.spinner = None
22
+ state_manager.session.files_in_context = set()
23
+ state_manager.session.is_streaming_active = False
24
+ return state_manager
25
+
26
+ @pytest.mark.asyncio
27
+ async def test_agent_output_without_json_thoughts(self):
28
+ """Agent should return clean formatted text without JSON thought artifacts."""
29
+ # Arrange
30
+ state_manager = self._create_mock_state_manager()
31
+
32
+ # Mock agent response with JSON thought that should be filtered
33
+ mock_response = MagicMock()
34
+ mock_response.result = SimpleResult(
35
+ output='{"thought": "Reviewing the current JavaScript code..."}\n'
36
+ '{"suggestions": ["1. Add comments to functions", "2. Use consistent error handling"]}'
37
+ )
38
+
39
+ with patch(
40
+ "tunacode.cli.repl.agent.process_request", new_callable=AsyncMock
41
+ ) as mock_process:
42
+ mock_process.return_value = mock_response
43
+ with patch("tunacode.cli.repl.ui.agent", new_callable=AsyncMock) as mock_ui_agent:
44
+ # Act
45
+ await process_request("Review my code", state_manager, output=True)
46
+
47
+ # Assert - UI should NOT be called since JSON output is filtered
48
+ mock_ui_agent.assert_not_called()
49
+
50
+ @pytest.mark.asyncio
51
+ async def test_agent_clean_text_output_displayed(self):
52
+ """Clean text output from agent should be displayed to user."""
53
+ # Arrange
54
+ state_manager = self._create_mock_state_manager()
55
+
56
+ # Mock agent response with clean text
57
+ expected_output = "Here are my suggestions for improving your code:\n1. Add comments\n2. Improve error handling"
58
+ mock_response = MagicMock()
59
+ mock_response.result = SimpleResult(output=expected_output)
60
+
61
+ with patch(
62
+ "tunacode.cli.repl.agent.process_request", new_callable=AsyncMock
63
+ ) as mock_process:
64
+ mock_process.return_value = mock_response
65
+ with patch("tunacode.cli.repl.ui.agent", new_callable=AsyncMock) as mock_ui_agent:
66
+ # Act
67
+ await process_request("Review my code", state_manager, output=True)
68
+
69
+ # Assert - Clean text should be displayed
70
+ mock_ui_agent.assert_called_once_with(expected_output)
71
+
72
+ @pytest.mark.asyncio
73
+ async def test_formatted_suggestions_without_json_wrapper(self):
74
+ """Agent should format suggestions as clean text, not JSON."""
75
+ # Arrange
76
+ state_manager = self._create_mock_state_manager()
77
+
78
+ # Expected clean formatted output
79
+ expected_output = """Code Review Results:
80
+
81
+ The JavaScript code has a good structure with clear separation of concerns. Here are some suggestions for improvement:
82
+
83
+ 1. **Add comments to functions** - Document the purpose and parameters of major functions for better maintainability.
84
+
85
+ 2. **Consistent error handling** - Use try-catch blocks consistently and provide user-friendly error messages instead of alerts.
86
+
87
+ 3. **Form validation** - Implement validation before submitting to ensure required fields are properly filled.
88
+
89
+ 4. **Debounce input handlers** - Consider debouncing the updateSubmitButtonState function to prevent excessive calls.
90
+
91
+ 5. **Accessibility improvements** - Add ARIA labels and ensure keyboard navigation works properly.
92
+
93
+ These changes will improve code maintainability and user experience."""
94
+
95
+ mock_response = MagicMock()
96
+ mock_response.result = SimpleResult(output=expected_output)
97
+
98
+ with patch(
99
+ "tunacode.cli.repl.agent.process_request", new_callable=AsyncMock
100
+ ) as mock_process:
101
+ mock_process.return_value = mock_response
102
+ with patch("tunacode.cli.repl.ui.agent", new_callable=AsyncMock) as mock_ui_agent:
103
+ # Act
104
+ await process_request("Review my JavaScript code", state_manager, output=True)
105
+
106
+ # Assert - Formatted text should be displayed
107
+ mock_ui_agent.assert_called_once_with(expected_output)
@@ -0,0 +1,35 @@
1
+ """Test to validate the system prompt changes."""
2
+
3
+ from pathlib import Path
4
+
5
+
6
+ def test_system_prompt_no_json_in_responses():
7
+ """Verify system prompt doesn't instruct agent to output JSON to users."""
8
+ prompt_path = Path(__file__).parent.parent / "src" / "tunacode" / "prompts" / "system.md"
9
+
10
+ with open(prompt_path, "r") as f:
11
+ content = f.read()
12
+
13
+ # Check that we have the new formatting rules
14
+ assert "Output Formatting Rules" in content
15
+ assert "NO JSON in responses" in content
16
+ assert 'Never output {"thought":' in content
17
+
18
+ # Check that thoughts are marked as internal
19
+ assert "Thoughts are for internal reasoning only" in content
20
+ assert "NEVER include JSON-formatted thoughts in your responses to users" in content
21
+
22
+ # Check examples use clean formatting
23
+ assert "RESPONSE TO USER:" in content
24
+ assert "[Internal thinking - not shown to user]" in content
25
+
26
+ # Check we have good/bad examples
27
+ assert "Example of GOOD response formatting:" in content
28
+ assert "Example of BAD response formatting (DO NOT DO THIS):" in content
29
+
30
+ print("\n=== SYSTEM PROMPT VALIDATION ===")
31
+ print("✓ Output formatting rules added")
32
+ print("✓ JSON responses explicitly forbidden")
33
+ print("✓ Thoughts marked as internal only")
34
+ print("✓ Examples updated to show clean output")
35
+ print("\nThe system prompt should now produce clean, formatted text responses.")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes