tunacode-cli 0.0.11__py3-none-any.whl → 0.0.12__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.
- tunacode/cli/commands.py +3 -4
- tunacode/cli/main.py +5 -4
- tunacode/cli/repl.py +2 -13
- tunacode/cli/textual_app.py +423 -0
- tunacode/cli/textual_bridge.py +158 -0
- tunacode/configuration/defaults.py +3 -4
- tunacode/configuration/models.py +3 -3
- tunacode/configuration/settings.py +2 -2
- tunacode/constants.py +2 -10
- tunacode/core/agents/main.py +3 -3
- tunacode/core/setup/__init__.py +0 -2
- tunacode/core/setup/agent_setup.py +3 -3
- tunacode/core/setup/base.py +3 -3
- tunacode/core/setup/coordinator.py +2 -2
- tunacode/core/setup/environment_setup.py +2 -2
- tunacode/core/setup/git_safety_setup.py +1 -2
- tunacode/core/state.py +3 -3
- tunacode/setup.py +2 -3
- tunacode/tools/base.py +4 -43
- tunacode/tools/read_file.py +2 -2
- tunacode/tools/run_command.py +2 -2
- tunacode/tools/update_file.py +3 -3
- tunacode/tools/write_file.py +3 -3
- tunacode/ui/completers.py +1 -1
- tunacode/ui/console.py +2 -3
- tunacode/ui/constants.py +1 -1
- tunacode/ui/decorators.py +2 -2
- tunacode/ui/input.py +1 -1
- tunacode/ui/keybindings.py +1 -1
- tunacode/ui/output.py +11 -4
- tunacode/ui/panels.py +3 -4
- tunacode/ui/prompt_manager.py +1 -1
- tunacode/ui/validators.py +1 -1
- tunacode/utils/diff_utils.py +3 -3
- {tunacode_cli-0.0.11.dist-info → tunacode_cli-0.0.12.dist-info}/METADATA +94 -40
- tunacode_cli-0.0.12.dist-info/RECORD +65 -0
- tunacode/core/setup/undo_setup.py +0 -33
- tunacode/services/undo_service.py +0 -244
- tunacode_cli-0.0.11.dist-info/RECORD +0 -65
- {tunacode_cli-0.0.11.dist-info → tunacode_cli-0.0.12.dist-info}/WHEEL +0 -0
- {tunacode_cli-0.0.11.dist-info → tunacode_cli-0.0.12.dist-info}/entry_points.txt +0 -0
- {tunacode_cli-0.0.11.dist-info → tunacode_cli-0.0.12.dist-info}/licenses/LICENSE +0 -0
- {tunacode_cli-0.0.11.dist-info → tunacode_cli-0.0.12.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
tunacode/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
tunacode/constants.py,sha256=RPAd2a-jP0RifT8Rfj1EVfoG8i7U5viyk99HKLwPy5U,3807
|
|
3
|
+
tunacode/context.py,sha256=0ttsxxLAyD4pSoxw7S-pyzor0JUkhOFZh96aAf4Kqsg,2634
|
|
4
|
+
tunacode/exceptions.py,sha256=RFUH8wOsWEvSPGIYM2exr4t47YkEyZt4Fr-DfTo6_JY,2647
|
|
5
|
+
tunacode/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
+
tunacode/setup.py,sha256=dYn0NeAxtNIDSogWEmGSyjb9wsr8AonZ8vAo5sw9NIw,1909
|
|
7
|
+
tunacode/types.py,sha256=5mMJDgFqVcKzhtHh9unPISBFqkeNje6KISGUpRkqRjY,7146
|
|
8
|
+
tunacode/cli/__init__.py,sha256=zgs0UbAck8hfvhYsWhWOfBe5oK09ug2De1r4RuQZREA,55
|
|
9
|
+
tunacode/cli/commands.py,sha256=80GuUnzJs5JxOr-5Vf4mzkMSCWLST4neTqJKnAzfKOM,18431
|
|
10
|
+
tunacode/cli/main.py,sha256=mmJ-x5fUcW2349fz-85LSiNRf0hvKOw0TQfxtPWWbDg,1760
|
|
11
|
+
tunacode/cli/repl.py,sha256=AhLmKZBNqxyLCsQAiM9ef7qYjqlRzb4sE1130Cx74QA,8579
|
|
12
|
+
tunacode/cli/textual_app.py,sha256=EdeeKjIikrtj-3FleBtP5DX5KwnMjc_bPepUB5DDkvw,13202
|
|
13
|
+
tunacode/cli/textual_bridge.py,sha256=QoPNSCVwdzVoNE5WzcZiH0jk2JopAoEvCRXGifwCzYU,6417
|
|
14
|
+
tunacode/configuration/__init__.py,sha256=MbVXy8bGu0yKehzgdgZ_mfWlYGvIdb1dY2Ly75nfuPE,17
|
|
15
|
+
tunacode/configuration/defaults.py,sha256=x2SynAuIKSOEAdtn4md2B1tVUh3DqHC1wohLhu0tNU0,658
|
|
16
|
+
tunacode/configuration/models.py,sha256=XPobkLM_TzKTuMIWhK-svJfGRGFT9r2LhKEM6rv6QHk,3756
|
|
17
|
+
tunacode/configuration/settings.py,sha256=KoN0u6GG3Hh_TWt02D_wpRfbACYri3gCDTXHtJfHl2w,994
|
|
18
|
+
tunacode/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
|
+
tunacode/core/state.py,sha256=sf3xvc9NBnz98tkHiSi-mi1GgxuN-r5kERwjmuIKjq8,1344
|
|
20
|
+
tunacode/core/tool_handler.py,sha256=OKx7jM8pml6pSEnoARu33_uBY8awJBqvhbVeBn6T4ow,1804
|
|
21
|
+
tunacode/core/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
|
+
tunacode/core/agents/main.py,sha256=o6EJUWBbOMqg9Y9UVgn_3l2ZK8iJveK5UpAmWQQYz0E,4661
|
|
23
|
+
tunacode/core/setup/__init__.py,sha256=lzdpY6rIGf9DDlDBDGFvQZaSOQeFsNglHbkpq1-GtU8,376
|
|
24
|
+
tunacode/core/setup/agent_setup.py,sha256=trELO8cPnWo36BBnYmXDEnDPdhBg0p-VLnx9A8hSSSQ,1401
|
|
25
|
+
tunacode/core/setup/base.py,sha256=cbyT2-xK2mWgH4EO17VfM_OM2bj0kT895NW2jSXbe3c,968
|
|
26
|
+
tunacode/core/setup/config_setup.py,sha256=pAa6nLNuJPsMzDMxwZj_d0DxvT-rIJuPxflV4gkCPzU,12007
|
|
27
|
+
tunacode/core/setup/coordinator.py,sha256=Rdudp2znfAV240HdXjvXPAn_4VZt_pNZBgEY8v_uPHw,1652
|
|
28
|
+
tunacode/core/setup/environment_setup.py,sha256=n3IrObKEynHZSwtUJ1FddMg2C4sHz7ca42awemImV8s,2225
|
|
29
|
+
tunacode/core/setup/git_safety_setup.py,sha256=6sAQ0L74rRpayR7hWpnPyGKxCzW1Mk-2gm1BLt-fRyg,7170
|
|
30
|
+
tunacode/prompts/system.txt,sha256=6ecousLK6KvRj6wzIVyzRE7OPQVC5n7P6ceSbtmmaZQ,3207
|
|
31
|
+
tunacode/services/__init__.py,sha256=w_E8QK6RnvKSvU866eDe8BCRV26rAm4d3R-Yg06OWCU,19
|
|
32
|
+
tunacode/services/mcp.py,sha256=R48X73KQjQ9vwhBrtbWHSBl-4K99QXmbIhh5J_1Gezo,3046
|
|
33
|
+
tunacode/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
|
+
tunacode/tools/base.py,sha256=UioygDbXy0JY67EIcyEoYt2TBfX9-n9Usf_1huQ4zOE,7046
|
|
35
|
+
tunacode/tools/read_file.py,sha256=ZNX9PvaYcI2Hw_GeSpQ3_wEy26DQ3LqLwYlaCVYDXO0,3051
|
|
36
|
+
tunacode/tools/run_command.py,sha256=jI5TWi4SKukfUkCdcFpSWDULsAM4RQN2Du0VTttIWvs,3796
|
|
37
|
+
tunacode/tools/update_file.py,sha256=QQwdTHUbtfwjCa2sbbrf-d2uIfZY1SQH1wkvjKU9OlQ,4137
|
|
38
|
+
tunacode/tools/write_file.py,sha256=nSIr2yN3JWALm9GUxUwCh5B6C9ej64HHR4PC0BURvuQ,2818
|
|
39
|
+
tunacode/ui/__init__.py,sha256=aRNE2pS50nFAX6y--rSGMNYwhz905g14gRd6g4BolYU,13
|
|
40
|
+
tunacode/ui/completers.py,sha256=E3dUe3jHsrIwqWWfWQGCHWnnpo6NJAZXBhlzY3yDKPw,5051
|
|
41
|
+
tunacode/ui/console.py,sha256=2Su2y9o5zQVmOP-V1SMhTqMjqsiAMXXY-iB9QNHkvxM,1890
|
|
42
|
+
tunacode/ui/constants.py,sha256=A76B_KpM8jCuBYRg4cPmhi8_j6LLyWttO7_jjv47r3w,421
|
|
43
|
+
tunacode/ui/decorators.py,sha256=e2KM-_pI5EKHa2M045IjUe4rPkTboxaKHXJT0K3461g,1914
|
|
44
|
+
tunacode/ui/input.py,sha256=5jE7k97vEMuEDS4L2nn7DQe_0R5_GJbf-MzHQxXV1GM,2962
|
|
45
|
+
tunacode/ui/keybindings.py,sha256=SJ4Lbkh2Mi4i9WeTkIizqZXfgUJ89BM2dksK7ne_5IE,701
|
|
46
|
+
tunacode/ui/lexers.py,sha256=3qFwogyS_3zlS0NDxbc4e_sPvNHylNdCVMjPIIp85go,1507
|
|
47
|
+
tunacode/ui/output.py,sha256=ms9pS6noo7i5GAw36fSEwLiGTDH22Fcu3FnwwqWETl8,4259
|
|
48
|
+
tunacode/ui/panels.py,sha256=iDnOho-_ySMQummUEotAnpBqOez6_LFN8zhWAh56f2Y,5952
|
|
49
|
+
tunacode/ui/prompt_manager.py,sha256=2HBaRQWMOhsk_CmzcwxPN5UMfUPxhf32ZR8fP3KMwBc,4010
|
|
50
|
+
tunacode/ui/tool_ui.py,sha256=S5-k1HwRlSqiQ8shGQ_QYGXQbuzb6Pg7u3CTqZwffdQ,6533
|
|
51
|
+
tunacode/ui/validators.py,sha256=MMIMT1I2v0l2jIy-gxX_4GSApvUTi8XWIOACr_dmoBA,758
|
|
52
|
+
tunacode/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
+
tunacode/utils/bm25.py,sha256=yq7KFWP3g_zIsjUV7l2hFPXYCzXyNQUInLU7u4qsc_4,1909
|
|
54
|
+
tunacode/utils/diff_utils.py,sha256=V9QqQ0q4MfabVTnWptF3IXDp3estnfOKcJtDe_Sj14I,2372
|
|
55
|
+
tunacode/utils/file_utils.py,sha256=AXiAJ_idtlmXEi9pMvwtfPy9Ys3yK-F4K7qb_NpwonU,923
|
|
56
|
+
tunacode/utils/ripgrep.py,sha256=AXUs2FFt0A7KBV996deS8wreIlUzKOlAHJmwrcAr4No,583
|
|
57
|
+
tunacode/utils/system.py,sha256=FSoibTIH0eybs4oNzbYyufIiV6gb77QaeY2yGqW39AY,11381
|
|
58
|
+
tunacode/utils/text_utils.py,sha256=B9M1cuLTm_SSsr15WNHF6j7WdLWPvWzKZV0Lvfgdbjg,2458
|
|
59
|
+
tunacode/utils/user_configuration.py,sha256=uFrpSRTUf0CijZjw1rOp1sovqy1uyr0UNcn85S6jvdk,1790
|
|
60
|
+
tunacode_cli-0.0.12.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
|
|
61
|
+
tunacode_cli-0.0.12.dist-info/METADATA,sha256=cgYzSgQ7fjai-wCWUiETKaqpU-itmLUhIkM1ZUIK7bg,12837
|
|
62
|
+
tunacode_cli-0.0.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
63
|
+
tunacode_cli-0.0.12.dist-info/entry_points.txt,sha256=hbkytikj4dGu6rizPuAd_DGUPBGF191RTnhr9wdhORY,51
|
|
64
|
+
tunacode_cli-0.0.12.dist-info/top_level.txt,sha256=lKy2P6BWNi5XSA4DHFvyjQ14V26lDZctwdmhEJrxQbU,9
|
|
65
|
+
tunacode_cli-0.0.12.dist-info/RECORD,,
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"""Module: sidekick.core.setup.undo_setup
|
|
2
|
-
|
|
3
|
-
Undo system initialization for the Sidekick CLI.
|
|
4
|
-
Sets up file tracking and state management for undo operations.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from tunacode.core.setup.base import BaseSetup
|
|
8
|
-
from tunacode.core.state import StateManager
|
|
9
|
-
from tunacode.services.undo_service import init_undo_system
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class UndoSetup(BaseSetup):
|
|
13
|
-
"""Setup step for undo system initialization."""
|
|
14
|
-
|
|
15
|
-
def __init__(self, state_manager: StateManager):
|
|
16
|
-
super().__init__(state_manager)
|
|
17
|
-
|
|
18
|
-
@property
|
|
19
|
-
def name(self) -> str:
|
|
20
|
-
return "Undo System"
|
|
21
|
-
|
|
22
|
-
async def should_run(self, force_setup: bool = False) -> bool:
|
|
23
|
-
"""Undo setup should run if not already initialized."""
|
|
24
|
-
return not self.state_manager.session.undo_initialized
|
|
25
|
-
|
|
26
|
-
async def execute(self, force_setup: bool = False) -> None:
|
|
27
|
-
"""Initialize the undo system."""
|
|
28
|
-
self.state_manager.session.undo_initialized = init_undo_system(self.state_manager)
|
|
29
|
-
|
|
30
|
-
async def validate(self) -> bool:
|
|
31
|
-
"""Validate that undo system setup completed (even if disabled)."""
|
|
32
|
-
# Validation passes if setup was attempted, regardless of whether undo is enabled
|
|
33
|
-
return True
|
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Module: tunacode.services.undo_service
|
|
3
|
-
|
|
4
|
-
Provides Git-based undo functionality for TunaCode operations.
|
|
5
|
-
Manages automatic commits and rollback operations.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import subprocess
|
|
9
|
-
import time
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
from typing import Optional, Tuple
|
|
12
|
-
|
|
13
|
-
from pydantic_ai.messages import ModelResponse, TextPart
|
|
14
|
-
|
|
15
|
-
from tunacode.constants import (ERROR_UNDO_INIT, UNDO_DISABLED_HOME, UNDO_DISABLED_NO_GIT,
|
|
16
|
-
UNDO_GIT_TIMEOUT, UNDO_INITIAL_COMMIT)
|
|
17
|
-
from tunacode.core.state import StateManager
|
|
18
|
-
from tunacode.exceptions import GitOperationError
|
|
19
|
-
from tunacode.ui import console as ui
|
|
20
|
-
from tunacode.utils.system import get_session_dir
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def is_in_git_project(directory: Optional[Path] = None) -> bool:
|
|
24
|
-
"""
|
|
25
|
-
Recursively check if the given directory is inside a git project.
|
|
26
|
-
|
|
27
|
-
Args:
|
|
28
|
-
directory (Path, optional): Directory to check. Defaults to current working directory.
|
|
29
|
-
|
|
30
|
-
Returns:
|
|
31
|
-
bool: True if in a git project, False otherwise
|
|
32
|
-
"""
|
|
33
|
-
if directory is None:
|
|
34
|
-
directory = Path.cwd()
|
|
35
|
-
|
|
36
|
-
if (directory / ".git").exists():
|
|
37
|
-
return True
|
|
38
|
-
|
|
39
|
-
if directory == directory.parent:
|
|
40
|
-
return False
|
|
41
|
-
|
|
42
|
-
return is_in_git_project(directory.parent)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def init_undo_system(state_manager: StateManager) -> bool:
|
|
46
|
-
"""
|
|
47
|
-
Initialize the undo system by creating a Git repository
|
|
48
|
-
in the ~/.tunacode/sessions/<session-id> directory.
|
|
49
|
-
|
|
50
|
-
Skip initialization if running from home directory or not in a git project.
|
|
51
|
-
|
|
52
|
-
Args:
|
|
53
|
-
state_manager: The StateManager instance.
|
|
54
|
-
|
|
55
|
-
Returns:
|
|
56
|
-
bool: True if the undo system was initialized, False otherwise.
|
|
57
|
-
"""
|
|
58
|
-
cwd = Path.cwd()
|
|
59
|
-
home_dir = Path.home()
|
|
60
|
-
|
|
61
|
-
if cwd == home_dir:
|
|
62
|
-
print(f"⚠️ {UNDO_DISABLED_HOME}")
|
|
63
|
-
return False
|
|
64
|
-
|
|
65
|
-
if not is_in_git_project():
|
|
66
|
-
# Temporarily use sync print for warnings during init
|
|
67
|
-
print("⚠️ Not in a git repository - undo functionality will be limited")
|
|
68
|
-
print("💡 To enable undo functionality, run: git init")
|
|
69
|
-
print(" File operations will still work, but can't be undone")
|
|
70
|
-
return False
|
|
71
|
-
|
|
72
|
-
# Get the session directory path
|
|
73
|
-
session_dir = get_session_dir(state_manager)
|
|
74
|
-
tunacode_git_dir = session_dir / ".git"
|
|
75
|
-
|
|
76
|
-
# Check if already initialized
|
|
77
|
-
if tunacode_git_dir.exists():
|
|
78
|
-
return True
|
|
79
|
-
|
|
80
|
-
# Initialize Git repository
|
|
81
|
-
try:
|
|
82
|
-
subprocess.run(
|
|
83
|
-
["git", "init", str(session_dir)], capture_output=True, check=True, timeout=5
|
|
84
|
-
)
|
|
85
|
-
|
|
86
|
-
# Make an initial commit
|
|
87
|
-
git_dir_arg = f"--git-dir={tunacode_git_dir}"
|
|
88
|
-
|
|
89
|
-
# Add all files
|
|
90
|
-
subprocess.run(["git", git_dir_arg, "add", "."], capture_output=True, check=True, timeout=5)
|
|
91
|
-
|
|
92
|
-
# Create initial commit
|
|
93
|
-
subprocess.run(
|
|
94
|
-
["git", git_dir_arg, "commit", "-m", UNDO_INITIAL_COMMIT],
|
|
95
|
-
capture_output=True,
|
|
96
|
-
check=True,
|
|
97
|
-
timeout=5,
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
return True
|
|
101
|
-
except subprocess.TimeoutExpired as e:
|
|
102
|
-
error = GitOperationError(operation="init", message=UNDO_GIT_TIMEOUT, original_error=e)
|
|
103
|
-
print(f"⚠️ {str(error)}")
|
|
104
|
-
return False
|
|
105
|
-
except Exception as e:
|
|
106
|
-
error = GitOperationError(operation="init", message=str(e), original_error=e)
|
|
107
|
-
print(f"⚠️ {ERROR_UNDO_INIT.format(e=e)}")
|
|
108
|
-
return False
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def commit_for_undo(
|
|
112
|
-
message_prefix: str = "tunacode", state_manager: Optional[StateManager] = None
|
|
113
|
-
) -> bool:
|
|
114
|
-
"""
|
|
115
|
-
Commit the current state to the undo repository.
|
|
116
|
-
|
|
117
|
-
Args:
|
|
118
|
-
message_prefix (str): Prefix for the commit message.
|
|
119
|
-
state_manager: The StateManager instance.
|
|
120
|
-
|
|
121
|
-
Returns:
|
|
122
|
-
bool: True if the commit was successful, False otherwise.
|
|
123
|
-
"""
|
|
124
|
-
# Get the session directory and git dir
|
|
125
|
-
if state_manager is None:
|
|
126
|
-
raise ValueError("state_manager is required for commit_for_undo")
|
|
127
|
-
session_dir = get_session_dir(state_manager)
|
|
128
|
-
tunacode_git_dir = session_dir / ".git"
|
|
129
|
-
|
|
130
|
-
if not tunacode_git_dir.exists():
|
|
131
|
-
return False
|
|
132
|
-
|
|
133
|
-
try:
|
|
134
|
-
git_dir_arg = f"--git-dir={tunacode_git_dir}"
|
|
135
|
-
|
|
136
|
-
# Add all files
|
|
137
|
-
subprocess.run(["git", git_dir_arg, "add", "."], capture_output=True, timeout=5)
|
|
138
|
-
|
|
139
|
-
# Create commit with timestamp
|
|
140
|
-
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
|
|
141
|
-
commit_message = f"{message_prefix} - {timestamp}"
|
|
142
|
-
|
|
143
|
-
result = subprocess.run(
|
|
144
|
-
["git", git_dir_arg, "commit", "-m", commit_message],
|
|
145
|
-
capture_output=True,
|
|
146
|
-
text=True,
|
|
147
|
-
timeout=5,
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
# Handle case where there are no changes to commit
|
|
151
|
-
if "nothing to commit" in result.stdout or "nothing to commit" in result.stderr:
|
|
152
|
-
return False
|
|
153
|
-
|
|
154
|
-
return True
|
|
155
|
-
except subprocess.TimeoutExpired as e:
|
|
156
|
-
error = GitOperationError(
|
|
157
|
-
operation="commit", message="Git commit timed out", original_error=e
|
|
158
|
-
)
|
|
159
|
-
print(f"⚠️ {str(error)}")
|
|
160
|
-
return False
|
|
161
|
-
except Exception as e:
|
|
162
|
-
error = GitOperationError(operation="commit", message=str(e), original_error=e)
|
|
163
|
-
print(f"⚠️ Error creating undo commit: {e}")
|
|
164
|
-
return False
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
def perform_undo(state_manager: StateManager) -> Tuple[bool, str]:
|
|
168
|
-
"""
|
|
169
|
-
Undo the most recent change by resetting to the previous commit.
|
|
170
|
-
Also adds a system message to the chat history to inform the AI
|
|
171
|
-
that the last changes were undone.
|
|
172
|
-
|
|
173
|
-
Args:
|
|
174
|
-
state_manager: The StateManager instance.
|
|
175
|
-
|
|
176
|
-
Returns:
|
|
177
|
-
tuple: (bool, str) - Success status and message
|
|
178
|
-
"""
|
|
179
|
-
# Get the session directory and git dir
|
|
180
|
-
session_dir = get_session_dir(state_manager)
|
|
181
|
-
tunacode_git_dir = session_dir / ".git"
|
|
182
|
-
|
|
183
|
-
if not tunacode_git_dir.exists():
|
|
184
|
-
return False, "Undo system not initialized"
|
|
185
|
-
|
|
186
|
-
try:
|
|
187
|
-
git_dir_arg = f"--git-dir={tunacode_git_dir}"
|
|
188
|
-
|
|
189
|
-
# Get commit log to check if we have commits to undo
|
|
190
|
-
result = subprocess.run(
|
|
191
|
-
["git", git_dir_arg, "log", "--format=%H", "-n", "2"],
|
|
192
|
-
capture_output=True,
|
|
193
|
-
text=True,
|
|
194
|
-
check=True,
|
|
195
|
-
timeout=5,
|
|
196
|
-
)
|
|
197
|
-
|
|
198
|
-
commits = result.stdout.strip().split("\n")
|
|
199
|
-
if len(commits) < 2:
|
|
200
|
-
return False, "Nothing to undo"
|
|
201
|
-
|
|
202
|
-
# Get the commit message of the commit we're undoing for context
|
|
203
|
-
commit_msg_result = subprocess.run(
|
|
204
|
-
["git", git_dir_arg, "log", "--format=%B", "-n", "1"],
|
|
205
|
-
capture_output=True,
|
|
206
|
-
text=True,
|
|
207
|
-
check=True,
|
|
208
|
-
timeout=5,
|
|
209
|
-
)
|
|
210
|
-
commit_msg = commit_msg_result.stdout.strip()
|
|
211
|
-
|
|
212
|
-
# Perform reset to previous commit
|
|
213
|
-
subprocess.run(
|
|
214
|
-
["git", git_dir_arg, "reset", "--hard", "HEAD~1"],
|
|
215
|
-
capture_output=True,
|
|
216
|
-
check=True,
|
|
217
|
-
timeout=5,
|
|
218
|
-
)
|
|
219
|
-
|
|
220
|
-
# Add a system message to the chat history to inform the AI
|
|
221
|
-
# about the undo operation
|
|
222
|
-
state_manager.session.messages.append(
|
|
223
|
-
ModelResponse(
|
|
224
|
-
parts=[
|
|
225
|
-
TextPart(
|
|
226
|
-
content=(
|
|
227
|
-
"The last changes were undone. "
|
|
228
|
-
f"Commit message of undone changes: {commit_msg}"
|
|
229
|
-
)
|
|
230
|
-
)
|
|
231
|
-
],
|
|
232
|
-
kind="response",
|
|
233
|
-
)
|
|
234
|
-
)
|
|
235
|
-
|
|
236
|
-
return True, "Successfully undid last change"
|
|
237
|
-
except subprocess.TimeoutExpired as e:
|
|
238
|
-
error = GitOperationError(
|
|
239
|
-
operation="reset", message="Undo operation timed out", original_error=e
|
|
240
|
-
)
|
|
241
|
-
return False, str(error)
|
|
242
|
-
except Exception as e:
|
|
243
|
-
error = GitOperationError(operation="reset", message=str(e), original_error=e)
|
|
244
|
-
return False, f"Error performing undo: {e}"
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
tunacode/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
tunacode/constants.py,sha256=q3w4LFygyS5x_qN0jIYo6kndopbqzrzx3GMUyrepK-A,4235
|
|
3
|
-
tunacode/context.py,sha256=0ttsxxLAyD4pSoxw7S-pyzor0JUkhOFZh96aAf4Kqsg,2634
|
|
4
|
-
tunacode/exceptions.py,sha256=RFUH8wOsWEvSPGIYM2exr4t47YkEyZt4Fr-DfTo6_JY,2647
|
|
5
|
-
tunacode/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
tunacode/setup.py,sha256=4LIlYtDk5FzBoJzC9Uw_9VmVUkZ8ojmeNdrxspBa2BU,2016
|
|
7
|
-
tunacode/types.py,sha256=5mMJDgFqVcKzhtHh9unPISBFqkeNje6KISGUpRkqRjY,7146
|
|
8
|
-
tunacode/cli/__init__.py,sha256=zgs0UbAck8hfvhYsWhWOfBe5oK09ug2De1r4RuQZREA,55
|
|
9
|
-
tunacode/cli/commands.py,sha256=6q2gRN9uSd_BQTBUQK7QGpFUR7i0QtBTs5n8BPHkFCo,18473
|
|
10
|
-
tunacode/cli/main.py,sha256=BXsWm4b-XtmnJBh-9g4X0Dt5y6jNR-mIugzw9jPigNM,1721
|
|
11
|
-
tunacode/cli/repl.py,sha256=oQ7w7SQ8TXi8V6fmxxy7WDpCWJueZUtIUBa14-yPfvk,9115
|
|
12
|
-
tunacode/configuration/__init__.py,sha256=MbVXy8bGu0yKehzgdgZ_mfWlYGvIdb1dY2Ly75nfuPE,17
|
|
13
|
-
tunacode/configuration/defaults.py,sha256=6CQbXUslZLShZCyRqak_Hz8d889jPxfB-QQ26qnIuUg,683
|
|
14
|
-
tunacode/configuration/models.py,sha256=SclALgdHhL1ffxNMlSamTVA_EJvxlcTbtqdHJ502n5o,3781
|
|
15
|
-
tunacode/configuration/settings.py,sha256=4vXHiRuhyU6vW1nvtxzxEMSnT5E0mhZ0RwtAiKtGcq8,991
|
|
16
|
-
tunacode/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
-
tunacode/core/state.py,sha256=0U_WU92yn5EQ27BLlHIkNIJJqjLMNHKNYSoba1rQqbQ,1376
|
|
18
|
-
tunacode/core/tool_handler.py,sha256=OKx7jM8pml6pSEnoARu33_uBY8awJBqvhbVeBn6T4ow,1804
|
|
19
|
-
tunacode/core/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
-
tunacode/core/agents/main.py,sha256=ZGB-EUQ7ow-m3ohSAmfPZ5UN9XC2Gbz40rKjsZsWwrA,4669
|
|
21
|
-
tunacode/core/setup/__init__.py,sha256=jlveyriTXRcnoBLU6_TJ7Z-3E6EXjT9L5GD1vW4dei0,427
|
|
22
|
-
tunacode/core/setup/agent_setup.py,sha256=65FVtta4xE9Dg_rDgVBsUkIHsAjXEavhmvAy5eFS5IA,1411
|
|
23
|
-
tunacode/core/setup/base.py,sha256=x9uYOITulrf4faP70NPTNBPb-wW1ZJGmcjAe0Sk5slk,961
|
|
24
|
-
tunacode/core/setup/config_setup.py,sha256=pAa6nLNuJPsMzDMxwZj_d0DxvT-rIJuPxflV4gkCPzU,12007
|
|
25
|
-
tunacode/core/setup/coordinator.py,sha256=v_zJIPCGlJWEApY5I2S7VR5uKAQe0TVn5zI-NYq2m_c,1653
|
|
26
|
-
tunacode/core/setup/environment_setup.py,sha256=c371l9ePPmI-3I4NCJVu3iQg_tgFZz_X7qWbc_Lld_k,2234
|
|
27
|
-
tunacode/core/setup/git_safety_setup.py,sha256=1NuzSASi0b69wQRpcOgINKklGnq34Xh3itm_PEpjDus,7238
|
|
28
|
-
tunacode/core/setup/undo_setup.py,sha256=uHy7YWXPnxQ-b_36SNKtMZNyDR_u-p4OPDARHAgp6Lo,1179
|
|
29
|
-
tunacode/prompts/system.txt,sha256=6ecousLK6KvRj6wzIVyzRE7OPQVC5n7P6ceSbtmmaZQ,3207
|
|
30
|
-
tunacode/services/__init__.py,sha256=w_E8QK6RnvKSvU866eDe8BCRV26rAm4d3R-Yg06OWCU,19
|
|
31
|
-
tunacode/services/mcp.py,sha256=R48X73KQjQ9vwhBrtbWHSBl-4K99QXmbIhh5J_1Gezo,3046
|
|
32
|
-
tunacode/services/undo_service.py,sha256=lb2IlSv7bMDOOz72iVAiAy-0U49T1MsCO9bhhNhdzww,7783
|
|
33
|
-
tunacode/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
|
-
tunacode/tools/base.py,sha256=5IXKgiHVnV7pPgWTiT0mhFLy2dA2vuryy8Ri_CHsZBY,8936
|
|
35
|
-
tunacode/tools/read_file.py,sha256=QW97pPVcHvNJk48iPSwzOZ9Dbq_Ce8lQ7W0F82SXi7k,3051
|
|
36
|
-
tunacode/tools/run_command.py,sha256=dspFV71g98gbOQV6CT9LsEoytQ_4zyVqqZD99zf__OY,3796
|
|
37
|
-
tunacode/tools/update_file.py,sha256=oG7ELWX3uHboDs2BPy8hfZb6hh0bQOav-LlWIRynMO4,4145
|
|
38
|
-
tunacode/tools/write_file.py,sha256=bV-Xz_Wy_SaCqU78PcxP2ttScfH7F7GGnvs4P7EDuAM,2821
|
|
39
|
-
tunacode/ui/__init__.py,sha256=aRNE2pS50nFAX6y--rSGMNYwhz905g14gRd6g4BolYU,13
|
|
40
|
-
tunacode/ui/completers.py,sha256=mWnZmm8tjTuIgDq7Y8znwjKEF_ZAvrkMKPx1DEdqLJQ,5060
|
|
41
|
-
tunacode/ui/console.py,sha256=7ua1LaBP3ZCRHzV0SqVCkgNlgBuBcBTcvybRjWl5jew,1943
|
|
42
|
-
tunacode/ui/constants.py,sha256=NxegAWaoDaEa4gzNZ7p67M0ZsHJJxZMtf2bW8E5WeZE,421
|
|
43
|
-
tunacode/ui/decorators.py,sha256=I09tETtxPfcWdh1B3kEM0nJ8E6HvdBZAdYhRzYUa_p8,1901
|
|
44
|
-
tunacode/ui/input.py,sha256=IZovxw_-1zEJ-OXMdb0O0T-bqn7Eo09NFc6M6yq3fp0,2962
|
|
45
|
-
tunacode/ui/keybindings.py,sha256=uT23EYLLoso-b4ppN-RqbdYOYanGqMr5FKm8OphhhFs,701
|
|
46
|
-
tunacode/ui/lexers.py,sha256=3qFwogyS_3zlS0NDxbc4e_sPvNHylNdCVMjPIIp85go,1507
|
|
47
|
-
tunacode/ui/output.py,sha256=p9q5dTHaqvawtM2TTDi-mnIsAiY0WNMWcLF2pFQaFnM,3716
|
|
48
|
-
tunacode/ui/panels.py,sha256=Ju4eOOfrazPVjySiyEcXkame7IXHiBb2HZFWKl5Re48,6008
|
|
49
|
-
tunacode/ui/prompt_manager.py,sha256=i8LBDFalo72b9YP1-65X0v0DA62k-auSVEJMXXr31fs,4010
|
|
50
|
-
tunacode/ui/tool_ui.py,sha256=S5-k1HwRlSqiQ8shGQ_QYGXQbuzb6Pg7u3CTqZwffdQ,6533
|
|
51
|
-
tunacode/ui/validators.py,sha256=wkg-lQrP-Wjm5phUHKD3Mte8F1J3A2EjESQgPPtRcvQ,758
|
|
52
|
-
tunacode/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
-
tunacode/utils/bm25.py,sha256=yq7KFWP3g_zIsjUV7l2hFPXYCzXyNQUInLU7u4qsc_4,1909
|
|
54
|
-
tunacode/utils/diff_utils.py,sha256=V9PM1Of0wvWNTVyw7iZYrNowFuRiKSyWiw5F39yRRYA,2394
|
|
55
|
-
tunacode/utils/file_utils.py,sha256=AXiAJ_idtlmXEi9pMvwtfPy9Ys3yK-F4K7qb_NpwonU,923
|
|
56
|
-
tunacode/utils/ripgrep.py,sha256=AXUs2FFt0A7KBV996deS8wreIlUzKOlAHJmwrcAr4No,583
|
|
57
|
-
tunacode/utils/system.py,sha256=FSoibTIH0eybs4oNzbYyufIiV6gb77QaeY2yGqW39AY,11381
|
|
58
|
-
tunacode/utils/text_utils.py,sha256=B9M1cuLTm_SSsr15WNHF6j7WdLWPvWzKZV0Lvfgdbjg,2458
|
|
59
|
-
tunacode/utils/user_configuration.py,sha256=uFrpSRTUf0CijZjw1rOp1sovqy1uyr0UNcn85S6jvdk,1790
|
|
60
|
-
tunacode_cli-0.0.11.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
|
|
61
|
-
tunacode_cli-0.0.11.dist-info/METADATA,sha256=aAYLNB_yGyz9rat_s0n7hFhX9dDAi7kxh0WtUJQXUJ4,9205
|
|
62
|
-
tunacode_cli-0.0.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
63
|
-
tunacode_cli-0.0.11.dist-info/entry_points.txt,sha256=hbkytikj4dGu6rizPuAd_DGUPBGF191RTnhr9wdhORY,51
|
|
64
|
-
tunacode_cli-0.0.11.dist-info/top_level.txt,sha256=lKy2P6BWNi5XSA4DHFvyjQ14V26lDZctwdmhEJrxQbU,9
|
|
65
|
-
tunacode_cli-0.0.11.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|