tunacode-cli 0.0.13__py3-none-any.whl → 0.0.15__py3-none-any.whl

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.

@@ -7,12 +7,17 @@ Provides safe file reading with size limits and proper error handling.
7
7
 
8
8
  import os
9
9
 
10
- from tunacode.constants import (ERROR_FILE_DECODE, ERROR_FILE_DECODE_DETAILS, ERROR_FILE_NOT_FOUND,
11
- ERROR_FILE_TOO_LARGE, MAX_FILE_SIZE, MSG_FILE_SIZE_LIMIT)
10
+ from tunacode.constants import (
11
+ ERROR_FILE_DECODE,
12
+ ERROR_FILE_DECODE_DETAILS,
13
+ ERROR_FILE_NOT_FOUND,
14
+ ERROR_FILE_TOO_LARGE,
15
+ MAX_FILE_SIZE,
16
+ MSG_FILE_SIZE_LIMIT,
17
+ )
12
18
  from tunacode.exceptions import ToolExecutionError
13
19
  from tunacode.tools.base import FileBasedTool
14
- from tunacode.types import FilePath, ToolResult
15
- from tunacode.ui import console as default_ui
20
+ from tunacode.types import ToolResult
16
21
 
17
22
 
18
23
  class ReadFileTool(FileBasedTool):
@@ -22,7 +27,7 @@ class ReadFileTool(FileBasedTool):
22
27
  def tool_name(self) -> str:
23
28
  return "Read"
24
29
 
25
- async def _execute(self, filepath: FilePath) -> ToolResult:
30
+ async def _execute(self, filepath: str) -> ToolResult:
26
31
  """Read the contents of a file.
27
32
 
28
33
  Args:
@@ -45,7 +50,7 @@ class ReadFileTool(FileBasedTool):
45
50
  content = file.read()
46
51
  return content
47
52
 
48
- async def _handle_error(self, error: Exception, filepath: FilePath = None) -> ToolResult:
53
+ async def _handle_error(self, error: Exception, filepath: str = None) -> ToolResult:
49
54
  """Handle errors with specific messages for common cases.
50
55
 
51
56
  Raises:
@@ -71,17 +76,17 @@ class ReadFileTool(FileBasedTool):
71
76
 
72
77
 
73
78
  # Create the function that maintains the existing interface
74
- async def read_file(filepath: FilePath) -> ToolResult:
79
+ async def read_file(filepath: str) -> str:
75
80
  """
76
81
  Read the contents of a file.
77
82
 
78
83
  Args:
79
- filepath (FilePath): The path to the file to read.
84
+ filepath: The path to the file to read.
80
85
 
81
86
  Returns:
82
- ToolResult: The contents of the file or an error message.
87
+ str: The contents of the file or an error message.
83
88
  """
84
- tool = ReadFileTool(default_ui)
89
+ tool = ReadFileTool(None) # No UI for pydantic-ai compatibility
85
90
  try:
86
91
  return await tool.execute(filepath)
87
92
  except ToolExecutionError as e:
@@ -7,14 +7,20 @@ Provides controlled shell command execution with output capture and truncation.
7
7
 
8
8
  import subprocess
9
9
 
10
- from tunacode.constants import (CMD_OUTPUT_FORMAT, CMD_OUTPUT_NO_ERRORS, CMD_OUTPUT_NO_OUTPUT,
11
- CMD_OUTPUT_TRUNCATED, COMMAND_OUTPUT_END_SIZE,
12
- COMMAND_OUTPUT_START_INDEX, COMMAND_OUTPUT_THRESHOLD,
13
- ERROR_COMMAND_EXECUTION, MAX_COMMAND_OUTPUT)
10
+ from tunacode.constants import (
11
+ CMD_OUTPUT_FORMAT,
12
+ CMD_OUTPUT_NO_ERRORS,
13
+ CMD_OUTPUT_NO_OUTPUT,
14
+ CMD_OUTPUT_TRUNCATED,
15
+ COMMAND_OUTPUT_END_SIZE,
16
+ COMMAND_OUTPUT_START_INDEX,
17
+ COMMAND_OUTPUT_THRESHOLD,
18
+ ERROR_COMMAND_EXECUTION,
19
+ MAX_COMMAND_OUTPUT,
20
+ )
14
21
  from tunacode.exceptions import ToolExecutionError
15
22
  from tunacode.tools.base import BaseTool
16
23
  from tunacode.types import ToolResult
17
- from tunacode.ui import console as default_ui
18
24
 
19
25
 
20
26
  class RunCommandTool(BaseTool):
@@ -89,7 +95,7 @@ class RunCommandTool(BaseTool):
89
95
 
90
96
 
91
97
  # Create the function that maintains the existing interface
92
- async def run_command(command: str) -> ToolResult:
98
+ async def run_command(command: str) -> str:
93
99
  """
94
100
  Run a shell command and return the output. User must confirm risky commands.
95
101
 
@@ -99,7 +105,7 @@ async def run_command(command: str) -> ToolResult:
99
105
  Returns:
100
106
  ToolResult: The output of the command (stdout and stderr) or an error message.
101
107
  """
102
- tool = RunCommandTool(default_ui)
108
+ tool = RunCommandTool(None) # No UI for pydantic-ai compatibility
103
109
  try:
104
110
  return await tool.execute(command)
105
111
  except ToolExecutionError as e:
@@ -11,8 +11,7 @@ from pydantic_ai.exceptions import ModelRetry
11
11
 
12
12
  from tunacode.exceptions import ToolExecutionError
13
13
  from tunacode.tools.base import FileBasedTool
14
- from tunacode.types import FileContent, FilePath, ToolResult
15
- from tunacode.ui import console as default_ui
14
+ from tunacode.types import ToolResult
16
15
 
17
16
 
18
17
  class UpdateFileTool(FileBasedTool):
@@ -23,7 +22,7 @@ class UpdateFileTool(FileBasedTool):
23
22
  return "Update"
24
23
 
25
24
  async def _execute(
26
- self, filepath: FilePath, target: FileContent, patch: FileContent
25
+ self, filepath: str, target: str, patch: str
27
26
  ) -> ToolResult:
28
27
  """Update an existing file by replacing a target text block with a patch.
29
28
 
@@ -75,7 +74,7 @@ class UpdateFileTool(FileBasedTool):
75
74
  return f"File '{filepath}' updated successfully."
76
75
 
77
76
  def _format_args(
78
- self, filepath: FilePath, target: FileContent = None, patch: FileContent = None
77
+ self, filepath: str, target: str = None, patch: str = None
79
78
  ) -> str:
80
79
  """Format arguments, truncating target and patch for display."""
81
80
  args = [repr(filepath)]
@@ -96,20 +95,20 @@ class UpdateFileTool(FileBasedTool):
96
95
 
97
96
 
98
97
  # Create the function that maintains the existing interface
99
- async def update_file(filepath: FilePath, target: FileContent, patch: FileContent) -> ToolResult:
98
+ async def update_file(filepath: str, target: str, patch: str) -> str:
100
99
  """
101
100
  Update an existing file by replacing a target text block with a patch.
102
101
  Requires confirmation with diff before applying.
103
102
 
104
103
  Args:
105
- filepath (FilePath): The path to the file to update.
106
- target (FileContent): The entire, exact block of text to be replaced.
107
- patch (FileContent): The new block of text to insert.
104
+ filepath: The path to the file to update.
105
+ target: The entire, exact block of text to be replaced.
106
+ patch: The new block of text to insert.
108
107
 
109
108
  Returns:
110
- ToolResult: A message indicating the success or failure of the operation.
109
+ str: A message indicating the success or failure of the operation.
111
110
  """
112
- tool = UpdateFileTool(default_ui)
111
+ tool = UpdateFileTool(None) # No UI for pydantic-ai compatibility
113
112
  try:
114
113
  return await tool.execute(filepath, target, patch)
115
114
  except ToolExecutionError as e:
@@ -11,8 +11,7 @@ from pydantic_ai.exceptions import ModelRetry
11
11
 
12
12
  from tunacode.exceptions import ToolExecutionError
13
13
  from tunacode.tools.base import FileBasedTool
14
- from tunacode.types import FileContent, FilePath, ToolResult
15
- from tunacode.ui import console as default_ui
14
+ from tunacode.types import ToolResult
16
15
 
17
16
 
18
17
  class WriteFileTool(FileBasedTool):
@@ -22,7 +21,7 @@ class WriteFileTool(FileBasedTool):
22
21
  def tool_name(self) -> str:
23
22
  return "Write"
24
23
 
25
- async def _execute(self, filepath: FilePath, content: FileContent) -> ToolResult:
24
+ async def _execute(self, filepath: str, content: str) -> ToolResult:
26
25
  """Write content to a new file. Fails if the file already exists.
27
26
 
28
27
  Args:
@@ -54,7 +53,7 @@ class WriteFileTool(FileBasedTool):
54
53
 
55
54
  return f"Successfully wrote to new file: {filepath}"
56
55
 
57
- def _format_args(self, filepath: FilePath, content: FileContent = None) -> str:
56
+ def _format_args(self, filepath: str, content: str = None) -> str:
58
57
  """Format arguments, truncating content for display."""
59
58
  if content is not None and len(content) > 50:
60
59
  return f"{repr(filepath)}, content='{content[:47]}...'"
@@ -62,19 +61,19 @@ class WriteFileTool(FileBasedTool):
62
61
 
63
62
 
64
63
  # Create the function that maintains the existing interface
65
- async def write_file(filepath: FilePath, content: FileContent) -> ToolResult:
64
+ async def write_file(filepath: str, content: str) -> str:
66
65
  """
67
66
  Write content to a new file. Fails if the file already exists.
68
67
  Requires confirmation before writing.
69
68
 
70
69
  Args:
71
- filepath (FilePath): The path to the file to write to.
72
- content (FileContent): The content to write to the file.
70
+ filepath: The path to the file to write to.
71
+ content: The content to write to the file.
73
72
 
74
73
  Returns:
75
- ToolResult: A message indicating the success or failure of the operation.
74
+ A message indicating the success or failure of the operation.
76
75
  """
77
- tool = WriteFileTool(default_ui)
76
+ tool = WriteFileTool(None) # No UI for pydantic-ai compatibility
78
77
  try:
79
78
  return await tool.execute(filepath, content)
80
79
  except ToolExecutionError as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tunacode-cli
3
- Version: 0.0.13
3
+ Version: 0.0.15
4
4
  Summary: Your agentic CLI developer.
5
5
  Author-email: larock22 <noreply@github.com>
6
6
  License-Expression: MIT
@@ -58,13 +58,14 @@ Dynamic: license-file
58
58
 
59
59
  ---
60
60
 
61
- ### Recent Updates
61
+ ### Recent Updates (v0.0.14)
62
62
 
63
- - **Simplified Setup**: Direct CLI configuration with `--model` and `--key` flags
64
- - **Enhanced Safety**: Removed `/undo` command in favor of git-based workflows
65
- - **Cleaner Codebase**: Removed `/init` command and automatic TUNACODE.md generation
66
- - **Better Onboarding**: No model validation - trust users to provide correct model names
67
- - **Unified Model Format**: All models use `provider:model-name` format
63
+ - **🔧 JSON Tool Parsing Fallback**: Automatic recovery when API providers fail with structured tool calling
64
+ - **⚡ Enhanced Reliability**: Fixed parameter naming issues that caused tool schema errors
65
+ - **🔄 Configuration Management**: New `/refresh` command to reload config without restart
66
+ - **🧠 Improved ReAct Reasoning**: Enhanced iteration limits (now defaults to 20) and better thought processing
67
+ - **🛠️ New Debug Commands**: `/parsetools` for manual JSON parsing, `/iterations` for controlling reasoning depth
68
+ - **📊 Better Error Recovery**: Multiple fallback mechanisms for various failure scenarios
68
69
 
69
70
  ### Core Features
70
71
 
@@ -75,17 +76,18 @@ Dynamic: license-file
75
76
  ### **Multi-Provider Support**
76
77
 
77
78
  - Anthropic Claude
78
- - OpenAI GPT
79
+ - OpenAI GPT
79
80
  - Google Gemini
80
81
  - OpenRouter (100+ models)
81
82
  - Any OpenAI-compatible API
82
83
 
83
84
  ### **Developer Tools**
84
85
 
85
- - 4 core tools: read_file, write_file, update_file, run_command
86
+ - 6 core tools: bash, grep, read_file, write_file, update_file, run_command
86
87
  - MCP (Model Context Protocol) support
87
88
  - File operation confirmations with diffs
88
89
  - Per-project context guides (TUNACODE.md)
90
+ - JSON tool parsing fallback for API compatibility
89
91
 
90
92
  </td>
91
93
  <td width="50%">
@@ -104,6 +106,7 @@ Dynamic: license-file
104
106
  - Async throughout
105
107
  - Modular command system
106
108
  - Rich UI with syntax highlighting
109
+ - ReAct reasoning patterns
107
110
 
108
111
  </td>
109
112
  </tr>
@@ -268,6 +271,8 @@ Learn more at [modelcontextprotocol.io](https://modelcontextprotocol.io/)
268
271
 
269
272
  ## Commands Reference
270
273
 
274
+ ### Core Commands
275
+
271
276
  | Command | Description |
272
277
  | -------------------------------- | -------------------------------- |
273
278
  | `/help` | Show available commands |
@@ -281,13 +286,43 @@ Learn more at [modelcontextprotocol.io](https://modelcontextprotocol.io/)
281
286
  | `/dump` | Show message history (debug) |
282
287
  | `exit` | Exit application |
283
288
 
289
+ ### Debug & Recovery Commands
290
+
291
+ | Command | Description |
292
+ | -------------------------------- | -------------------------------- |
293
+ | `/thoughts` | Toggle ReAct thought display |
294
+ | `/iterations <1-50>` | Set max reasoning iterations |
295
+ | `/parsetools` | Parse JSON tool calls manually |
296
+ | `/fix` | Fix orphaned tool calls |
297
+ | `/refresh` | Reload configuration from defaults |
298
+
299
+ ---
300
+
301
+ ## Reliability Features
302
+
303
+ ### JSON Tool Parsing Fallback
304
+
305
+ TunaCode automatically handles API provider failures with robust JSON parsing:
306
+
307
+ - **Automatic Recovery**: When structured tool calling fails, TunaCode parses JSON from text responses
308
+ - **Multiple Formats**: Supports inline JSON, code blocks, and complex nested structures
309
+ - **Manual Recovery**: Use `/parsetools` when automatic parsing needs assistance
310
+ - **Visual Feedback**: See `🔧 Recovered using JSON tool parsing` messages during fallback
311
+
312
+ ### Enhanced Error Handling
313
+
314
+ - **Tool Schema Fixes**: Consistent parameter naming across all tools
315
+ - **Orphaned Tool Call Recovery**: Automatic cleanup with `/fix` command
316
+ - **Configuration Refresh**: Update settings without restart using `/refresh`
317
+ - **ReAct Reasoning**: Configurable iteration limits for complex problem solving
318
+
284
319
  ---
285
320
 
286
321
  ## Customization
287
322
 
288
323
  ### Project Guides
289
324
 
290
- Create a `TUNACODE.md` file your project root to customize TunaCode's behavior:
325
+ Create a `TUNACODE.md` file in your project root to customize TunaCode's behavior:
291
326
 
292
327
  ```markdown
293
328
  # Project Guide
@@ -337,13 +372,14 @@ src/tunacode/
337
372
  │ └── tool_handler.py # Tool execution and validation
338
373
 
339
374
  ├── services/ # External Services
340
- ├── mcp.py # Model Context Protocol integration
341
- │ └── undo_service.py # Undo operations (beta)
375
+ └── mcp.py # Model Context Protocol integration
342
376
 
343
377
  ├── tools/ # AI Agent Tools
344
378
  │ ├── base.py # Tool base classes
379
+ │ ├── bash.py # Enhanced shell command execution
380
+ │ ├── grep.py # Parallel content search tool
345
381
  │ ├── read_file.py # File reading tool
346
- │ ├── run_command.py # Command execution tool
382
+ │ ├── run_command.py # Basic command execution tool
347
383
  │ ├── update_file.py # File modification tool
348
384
  │ └── write_file.py # File creation tool
349
385
 
@@ -360,7 +396,7 @@ src/tunacode/
360
396
  │ └── validators.py # Input validation
361
397
 
362
398
  ├── utils/ # Utility Functions
363
- │ ├── bm25.py # BM25 search algorithm(beta)
399
+ │ ├── bm25.py # BM25 search algorithm (beta)
364
400
  │ ├── diff_utils.py # Diff generation and formatting
365
401
  │ ├── file_utils.py # File system operations
366
402
  │ ├── ripgrep.py # Code search utilities
@@ -1,25 +1,25 @@
1
1
  tunacode/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- tunacode/constants.py,sha256=gBGd50EIBnIUeflCZXGpyWYXjEOgymDTmVwETS1fDFE,3807
2
+ tunacode/constants.py,sha256=N4LvTb3Q6R-Wx9Ho6odnPc8PNCWbJMYImYpPrY4A9mc,3807
3
3
  tunacode/context.py,sha256=0ttsxxLAyD4pSoxw7S-pyzor0JUkhOFZh96aAf4Kqsg,2634
4
4
  tunacode/exceptions.py,sha256=RFUH8wOsWEvSPGIYM2exr4t47YkEyZt4Fr-DfTo6_JY,2647
5
5
  tunacode/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  tunacode/setup.py,sha256=dYn0NeAxtNIDSogWEmGSyjb9wsr8AonZ8vAo5sw9NIw,1909
7
7
  tunacode/types.py,sha256=5mMJDgFqVcKzhtHh9unPISBFqkeNje6KISGUpRkqRjY,7146
8
8
  tunacode/cli/__init__.py,sha256=zgs0UbAck8hfvhYsWhWOfBe5oK09ug2De1r4RuQZREA,55
9
- tunacode/cli/commands.py,sha256=80GuUnzJs5JxOr-5Vf4mzkMSCWLST4neTqJKnAzfKOM,18431
9
+ tunacode/cli/commands.py,sha256=Bd1Yw_CG1xuHj4qUStgbuahZ2PwGTUT4fvcSQ05gBw8,29751
10
10
  tunacode/cli/main.py,sha256=mmJ-x5fUcW2349fz-85LSiNRf0hvKOw0TQfxtPWWbDg,1760
11
- tunacode/cli/repl.py,sha256=AhLmKZBNqxyLCsQAiM9ef7qYjqlRzb4sE1130Cx74QA,8579
11
+ tunacode/cli/repl.py,sha256=BR2TNTNf1g14V278loSA3JysiaYrM2nXhL6BxmVqUuI,10942
12
12
  tunacode/cli/textual_app.py,sha256=EdeeKjIikrtj-3FleBtP5DX5KwnMjc_bPepUB5DDkvw,13202
13
13
  tunacode/cli/textual_bridge.py,sha256=QoPNSCVwdzVoNE5WzcZiH0jk2JopAoEvCRXGifwCzYU,6417
14
14
  tunacode/configuration/__init__.py,sha256=MbVXy8bGu0yKehzgdgZ_mfWlYGvIdb1dY2Ly75nfuPE,17
15
- tunacode/configuration/defaults.py,sha256=x2SynAuIKSOEAdtn4md2B1tVUh3DqHC1wohLhu0tNU0,658
15
+ tunacode/configuration/defaults.py,sha256=7UdHP50NmnZWlx0f1PGV4JZIpmQem191vWisGky6AVA,688
16
16
  tunacode/configuration/models.py,sha256=XPobkLM_TzKTuMIWhK-svJfGRGFT9r2LhKEM6rv6QHk,3756
17
17
  tunacode/configuration/settings.py,sha256=KoN0u6GG3Hh_TWt02D_wpRfbACYri3gCDTXHtJfHl2w,994
18
18
  tunacode/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- tunacode/core/state.py,sha256=sf3xvc9NBnz98tkHiSi-mi1GgxuN-r5kERwjmuIKjq8,1344
19
+ tunacode/core/state.py,sha256=djkU7dL7kns74vUxgL6q_PyCD9qLElxgUk_8KpM4tJo,1379
20
20
  tunacode/core/tool_handler.py,sha256=OKx7jM8pml6pSEnoARu33_uBY8awJBqvhbVeBn6T4ow,1804
21
21
  tunacode/core/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- tunacode/core/agents/main.py,sha256=DVwm0T3NbmY1NmA41EWHiLry_OE_f-CUoV6tyn3Y9bo,4751
22
+ tunacode/core/agents/main.py,sha256=GMOtF7wvLqRXYHH_tvTnRdLkIDnuufGrC3fJ6SZcEw4,14118
23
23
  tunacode/core/setup/__init__.py,sha256=lzdpY6rIGf9DDlDBDGFvQZaSOQeFsNglHbkpq1-GtU8,376
24
24
  tunacode/core/setup/agent_setup.py,sha256=trELO8cPnWo36BBnYmXDEnDPdhBg0p-VLnx9A8hSSSQ,1401
25
25
  tunacode/core/setup/base.py,sha256=cbyT2-xK2mWgH4EO17VfM_OM2bj0kT895NW2jSXbe3c,968
@@ -27,16 +27,17 @@ tunacode/core/setup/config_setup.py,sha256=pAa6nLNuJPsMzDMxwZj_d0DxvT-rIJuPxflV4
27
27
  tunacode/core/setup/coordinator.py,sha256=Rdudp2znfAV240HdXjvXPAn_4VZt_pNZBgEY8v_uPHw,1652
28
28
  tunacode/core/setup/environment_setup.py,sha256=n3IrObKEynHZSwtUJ1FddMg2C4sHz7ca42awemImV8s,2225
29
29
  tunacode/core/setup/git_safety_setup.py,sha256=6sAQ0L74rRpayR7hWpnPyGKxCzW1Mk-2gm1BLt-fRyg,7170
30
- tunacode/prompts/system.txt,sha256=6ecousLK6KvRj6wzIVyzRE7OPQVC5n7P6ceSbtmmaZQ,3207
30
+ tunacode/prompts/system.txt,sha256=wZkP3vTv4h8ukBUkCZ9yR-oZt-ZcdvIRPxl1uN3AHIk,4030
31
31
  tunacode/services/__init__.py,sha256=w_E8QK6RnvKSvU866eDe8BCRV26rAm4d3R-Yg06OWCU,19
32
32
  tunacode/services/mcp.py,sha256=R48X73KQjQ9vwhBrtbWHSBl-4K99QXmbIhh5J_1Gezo,3046
33
33
  tunacode/tools/__init__.py,sha256=l5O018T-bUjCSy7JSupJoKojZp07uAz3913qDFVdCzM,29
34
34
  tunacode/tools/base.py,sha256=UioygDbXy0JY67EIcyEoYt2TBfX9-n9Usf_1huQ4zOE,7046
35
35
  tunacode/tools/bash.py,sha256=h8pUzfp7n2aVtAJcUICJOJV0FBTphifZdYrzHLvrZjA,8781
36
- tunacode/tools/read_file.py,sha256=ZNX9PvaYcI2Hw_GeSpQ3_wEy26DQ3LqLwYlaCVYDXO0,3051
37
- tunacode/tools/run_command.py,sha256=jI5TWi4SKukfUkCdcFpSWDULsAM4RQN2Du0VTttIWvs,3796
38
- tunacode/tools/update_file.py,sha256=QQwdTHUbtfwjCa2sbbrf-d2uIfZY1SQH1wkvjKU9OlQ,4137
39
- tunacode/tools/write_file.py,sha256=nSIr2yN3JWALm9GUxUwCh5B6C9ej64HHR4PC0BURvuQ,2818
36
+ tunacode/tools/grep.py,sha256=sqwZEsBCWV0LEz1J1Jc9sGBALf9MxLFc61Xg7nSwCNU,28299
37
+ tunacode/tools/read_file.py,sha256=zt45qNPLFGn7JJb3iQAAFcLjXQDx1jruzOoOhxCfME8,2983
38
+ tunacode/tools/run_command.py,sha256=mJeuazhEQBeNaWgvYp4XZYilWRqotXLeTOA2jx0nOnI,3719
39
+ tunacode/tools/update_file.py,sha256=-kla9849xYPD3GZCBwGeH4e2o_OMGT6A_0zvcPUoso8,3985
40
+ tunacode/tools/write_file.py,sha256=prL6u8XOi9ZyPU-YNlG9YMLbSLrDJXDRuDX73ncXh-k,2699
40
41
  tunacode/ui/__init__.py,sha256=aRNE2pS50nFAX6y--rSGMNYwhz905g14gRd6g4BolYU,13
41
42
  tunacode/ui/completers.py,sha256=E3dUe3jHsrIwqWWfWQGCHWnnpo6NJAZXBhlzY3yDKPw,5051
42
43
  tunacode/ui/console.py,sha256=2Su2y9o5zQVmOP-V1SMhTqMjqsiAMXXY-iB9QNHkvxM,1890
@@ -58,9 +59,9 @@ tunacode/utils/ripgrep.py,sha256=AXUs2FFt0A7KBV996deS8wreIlUzKOlAHJmwrcAr4No,583
58
59
  tunacode/utils/system.py,sha256=FSoibTIH0eybs4oNzbYyufIiV6gb77QaeY2yGqW39AY,11381
59
60
  tunacode/utils/text_utils.py,sha256=B9M1cuLTm_SSsr15WNHF6j7WdLWPvWzKZV0Lvfgdbjg,2458
60
61
  tunacode/utils/user_configuration.py,sha256=uFrpSRTUf0CijZjw1rOp1sovqy1uyr0UNcn85S6jvdk,1790
61
- tunacode_cli-0.0.13.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
62
- tunacode_cli-0.0.13.dist-info/METADATA,sha256=sJNahxSaLVB_QK6WoXW3SkDD0Wmh67MPSTmI0g_gub8,12837
63
- tunacode_cli-0.0.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
64
- tunacode_cli-0.0.13.dist-info/entry_points.txt,sha256=hbkytikj4dGu6rizPuAd_DGUPBGF191RTnhr9wdhORY,51
65
- tunacode_cli-0.0.13.dist-info/top_level.txt,sha256=lKy2P6BWNi5XSA4DHFvyjQ14V26lDZctwdmhEJrxQbU,9
66
- tunacode_cli-0.0.13.dist-info/RECORD,,
62
+ tunacode_cli-0.0.15.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
63
+ tunacode_cli-0.0.15.dist-info/METADATA,sha256=QhX_Thz6c1q3jmu5kVIn3jFYnmiFxX1wB1suX_zt4Ik,14633
64
+ tunacode_cli-0.0.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
65
+ tunacode_cli-0.0.15.dist-info/entry_points.txt,sha256=hbkytikj4dGu6rizPuAd_DGUPBGF191RTnhr9wdhORY,51
66
+ tunacode_cli-0.0.15.dist-info/top_level.txt,sha256=lKy2P6BWNi5XSA4DHFvyjQ14V26lDZctwdmhEJrxQbU,9
67
+ tunacode_cli-0.0.15.dist-info/RECORD,,