jarvis-ai-assistant 0.1.160__tar.gz → 0.1.162__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 jarvis-ai-assistant might be problematic. Click here for more details.
- {jarvis_ai_assistant-0.1.160/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.162}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/pyproject.toml +1 -1
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/setup.py +1 -1
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/__init__.py +1 -2
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/jarvis.py +2 -3
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_agent/code_agent.py +135 -20
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_dev/main.py +11 -4
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_utils/git_commiter.py +9 -6
- jarvis_ai_assistant-0.1.160/src/jarvis/jarvis_agent/patch.py → jarvis_ai_assistant-0.1.162/src/jarvis/jarvis_tools/edit_file.py +147 -175
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/input.py +40 -37
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -1
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/README.md +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_details/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_details/main.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_squash/main.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/base.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/cpp.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/go.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/python.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/registry.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/rust.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_mcp/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_methodology/main.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_multi_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/base.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/human.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/kimi.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform_manager/main.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_smart_shell/main.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/chdir.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/code_plan.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/execute_script.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/file_operation.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/find_methodology.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/read_code.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/registry.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/search_web.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/config.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/embedding.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/file_processors.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/git_utils.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/output.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/tag.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/utils.py +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
- {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
|
@@ -8,7 +8,7 @@ default = true
|
|
|
8
8
|
|
|
9
9
|
[project]
|
|
10
10
|
name = "jarvis-ai-assistant"
|
|
11
|
-
version = "0.1.
|
|
11
|
+
version = "0.1.162"
|
|
12
12
|
description = "Jarvis: An AI assistant that uses tools to interact with the system"
|
|
13
13
|
readme = "README.md"
|
|
14
14
|
authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
|
|
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|
|
2
2
|
|
|
3
3
|
setup(
|
|
4
4
|
name="jarvis-ai-assistant",
|
|
5
|
-
version="0.1.
|
|
5
|
+
version="0.1.162",
|
|
6
6
|
author="skyfire",
|
|
7
7
|
author_email="skyfireitdiy@hotmail.com",
|
|
8
8
|
description="An AI assistant that uses various tools to interact with the system",
|
{jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/__init__.py
RENAMED
|
@@ -5,7 +5,6 @@ from typing import Any, Callable, List, Optional, Tuple, Union
|
|
|
5
5
|
from yaspin import yaspin # type: ignore
|
|
6
6
|
|
|
7
7
|
from jarvis.jarvis_agent.output_handler import OutputHandler
|
|
8
|
-
from jarvis.jarvis_agent.patch import PatchOutputHandler
|
|
9
8
|
from jarvis.jarvis_platform.base import BasePlatform
|
|
10
9
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
|
11
10
|
from jarvis.jarvis_utils.output import PrettyOutput, OutputType
|
|
@@ -180,7 +179,7 @@ class Agent:
|
|
|
180
179
|
self.model.set_suppress_output(False)
|
|
181
180
|
|
|
182
181
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
|
183
|
-
self.output_handler = output_handler if output_handler else [ToolRegistry()
|
|
182
|
+
self.output_handler = output_handler if output_handler else [ToolRegistry()]
|
|
184
183
|
self.multiline_inputer = multiline_inputer if multiline_inputer else get_multiline_input
|
|
185
184
|
|
|
186
185
|
self.prompt = ""
|
{jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/jarvis.py
RENAMED
|
@@ -15,7 +15,6 @@ from jarvis.jarvis_agent import (
|
|
|
15
15
|
Agent,
|
|
16
16
|
origin_agent_system_prompt
|
|
17
17
|
)
|
|
18
|
-
from jarvis.jarvis_agent.patch import PatchOutputHandler
|
|
19
18
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
|
20
19
|
from jarvis.jarvis_utils.utils import init_env
|
|
21
20
|
from jarvis.jarvis_agent.file_input_handler import file_input_handler
|
|
@@ -94,7 +93,7 @@ def _select_task(tasks: Dict[str, str]) -> str:
|
|
|
94
93
|
# 询问是否需要补充信息
|
|
95
94
|
need_additional = user_confirm("需要为此任务添加补充信息吗?", default=False)
|
|
96
95
|
if need_additional:
|
|
97
|
-
additional_input = get_multiline_input("
|
|
96
|
+
additional_input = get_multiline_input("请输入补充信息:")
|
|
98
97
|
if additional_input:
|
|
99
98
|
selected_task = f"{selected_task}\n\n补充信息:\n{additional_input}"
|
|
100
99
|
return selected_task
|
|
@@ -123,7 +122,7 @@ def main() -> None:
|
|
|
123
122
|
platform=args.platform,
|
|
124
123
|
model_name=args.model,
|
|
125
124
|
input_handler=[file_input_handler, shell_input_handler, builtin_input_handler],
|
|
126
|
-
output_handler=[ToolRegistry()
|
|
125
|
+
output_handler=[ToolRegistry()],
|
|
127
126
|
need_summary=False
|
|
128
127
|
)
|
|
129
128
|
|
|
@@ -7,7 +7,7 @@ import os
|
|
|
7
7
|
import sys
|
|
8
8
|
import subprocess
|
|
9
9
|
import argparse
|
|
10
|
-
from typing import Optional, List, Tuple
|
|
10
|
+
from typing import Any, Dict, Optional, List, Tuple
|
|
11
11
|
|
|
12
12
|
# 忽略yaspin的类型检查
|
|
13
13
|
from yaspin import yaspin # type: ignore
|
|
@@ -16,7 +16,6 @@ from jarvis.jarvis_agent import Agent
|
|
|
16
16
|
from jarvis.jarvis_agent.builtin_input_handler import builtin_input_handler
|
|
17
17
|
from jarvis.jarvis_agent.file_input_handler import file_input_handler
|
|
18
18
|
from jarvis.jarvis_agent.shell_input_handler import shell_input_handler
|
|
19
|
-
from jarvis.jarvis_agent.patch import PatchOutputHandler
|
|
20
19
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
|
21
20
|
from jarvis.jarvis_git_utils.git_commiter import GitCommitTool
|
|
22
21
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
|
@@ -51,9 +50,8 @@ class CodeAgent:
|
|
|
51
50
|
"read_code",
|
|
52
51
|
"methodology",
|
|
53
52
|
"chdir",
|
|
54
|
-
"create_code_agent",
|
|
55
53
|
"find_methodology",
|
|
56
|
-
"
|
|
54
|
+
"edit_file",
|
|
57
55
|
])
|
|
58
56
|
code_system_prompt = """
|
|
59
57
|
<code_engineer_guide>
|
|
@@ -204,7 +202,13 @@ class CodeAgent:
|
|
|
204
202
|
- loc比wc -l提供更多代码统计信息,应优先使用
|
|
205
203
|
- 针对不同编程语言选择对应的代码质量检查工具
|
|
206
204
|
- 不要留下未实现的代码
|
|
207
|
-
|
|
205
|
+
|
|
206
|
+
### 代码编辑规范
|
|
207
|
+
- 使用edit_file工具进行代码修改时,必须遵循最小补丁原则
|
|
208
|
+
- 只提供需要修改的代码部分,不要提供完整文件内容
|
|
209
|
+
- 保持原始代码的缩进、空行和格式风格
|
|
210
|
+
- 每个修改必须包含清晰的修改理由
|
|
211
|
+
- 新建文件时可以提供完整内容,修改现有文件时只提供差异部分
|
|
208
212
|
</notes>
|
|
209
213
|
</code_engineer_guide>
|
|
210
214
|
"""
|
|
@@ -220,7 +224,7 @@ class CodeAgent:
|
|
|
220
224
|
system_prompt=code_system_prompt,
|
|
221
225
|
name="CodeAgent",
|
|
222
226
|
auto_complete=False,
|
|
223
|
-
output_handler=[tool_registry
|
|
227
|
+
output_handler=[tool_registry],
|
|
224
228
|
platform=platform_instance,
|
|
225
229
|
input_handler=[
|
|
226
230
|
shell_input_handler,
|
|
@@ -243,6 +247,83 @@ class CodeAgent:
|
|
|
243
247
|
"""
|
|
244
248
|
return self.root_dir
|
|
245
249
|
|
|
250
|
+
def get_loc_stats(self) -> str:
|
|
251
|
+
"""使用loc命令获取当前目录的代码统计信息
|
|
252
|
+
|
|
253
|
+
返回:
|
|
254
|
+
str: loc命令输出的原始字符串,失败时返回空字符串
|
|
255
|
+
"""
|
|
256
|
+
try:
|
|
257
|
+
result = subprocess.run(
|
|
258
|
+
['loc'],
|
|
259
|
+
cwd=self.root_dir,
|
|
260
|
+
capture_output=True,
|
|
261
|
+
text=True
|
|
262
|
+
)
|
|
263
|
+
return result.stdout if result.returncode == 0 else ""
|
|
264
|
+
except FileNotFoundError:
|
|
265
|
+
return ""
|
|
266
|
+
|
|
267
|
+
def get_recent_commits_with_files(self) -> List[Dict[str, Any]]:
|
|
268
|
+
"""获取最近5次提交的commit信息和文件清单
|
|
269
|
+
|
|
270
|
+
返回:
|
|
271
|
+
List[Dict[str, Any]]: 包含commit信息和文件清单的字典列表,格式为:
|
|
272
|
+
[
|
|
273
|
+
{
|
|
274
|
+
'hash': 提交hash,
|
|
275
|
+
'message': 提交信息,
|
|
276
|
+
'author': 作者,
|
|
277
|
+
'date': 提交日期,
|
|
278
|
+
'files': [修改的文件列表] (最多50个文件)
|
|
279
|
+
},
|
|
280
|
+
...
|
|
281
|
+
]
|
|
282
|
+
失败时返回空列表
|
|
283
|
+
"""
|
|
284
|
+
try:
|
|
285
|
+
# 获取最近5次提交的基本信息
|
|
286
|
+
result = subprocess.run(
|
|
287
|
+
['git', 'log', '-5', '--pretty=format:%H%n%s%n%an%n%ad'],
|
|
288
|
+
cwd=self.root_dir,
|
|
289
|
+
capture_output=True,
|
|
290
|
+
text=True
|
|
291
|
+
)
|
|
292
|
+
if result.returncode != 0:
|
|
293
|
+
return []
|
|
294
|
+
|
|
295
|
+
# 解析提交信息
|
|
296
|
+
commits = []
|
|
297
|
+
lines = result.stdout.splitlines()
|
|
298
|
+
for i in range(0, len(lines), 4):
|
|
299
|
+
if i + 3 >= len(lines):
|
|
300
|
+
break
|
|
301
|
+
commit = {
|
|
302
|
+
'hash': lines[i],
|
|
303
|
+
'message': lines[i+1],
|
|
304
|
+
'author': lines[i+2],
|
|
305
|
+
'date': lines[i+3],
|
|
306
|
+
'files': []
|
|
307
|
+
}
|
|
308
|
+
commits.append(commit)
|
|
309
|
+
|
|
310
|
+
# 获取每个提交的文件修改清单
|
|
311
|
+
for commit in commits:
|
|
312
|
+
files_result = subprocess.run(
|
|
313
|
+
['git', 'show', '--name-only', '--pretty=format:', commit['hash']],
|
|
314
|
+
cwd=self.root_dir,
|
|
315
|
+
capture_output=True,
|
|
316
|
+
text=True
|
|
317
|
+
)
|
|
318
|
+
if files_result.returncode == 0:
|
|
319
|
+
files = list(set(filter(None, files_result.stdout.splitlines())))
|
|
320
|
+
commit['files'] = files[:50] # 限制最多50个文件
|
|
321
|
+
|
|
322
|
+
return commits
|
|
323
|
+
|
|
324
|
+
except subprocess.CalledProcessError:
|
|
325
|
+
return []
|
|
326
|
+
|
|
246
327
|
def _init_env(self) -> None:
|
|
247
328
|
"""初始化环境"""
|
|
248
329
|
with yaspin(text="正在初始化环境...", color="cyan") as spinner:
|
|
@@ -261,8 +342,29 @@ class CodeAgent:
|
|
|
261
342
|
if has_uncommitted_changes():
|
|
262
343
|
PrettyOutput.print("检测到未提交的修改,是否要提交?", OutputType.WARNING)
|
|
263
344
|
if user_confirm("是否要提交?", True):
|
|
264
|
-
|
|
265
|
-
|
|
345
|
+
import subprocess
|
|
346
|
+
try:
|
|
347
|
+
# 获取当前分支的提交总数
|
|
348
|
+
commit_count = subprocess.run(
|
|
349
|
+
['git', 'rev-list', '--count', 'HEAD'],
|
|
350
|
+
capture_output=True,
|
|
351
|
+
text=True
|
|
352
|
+
)
|
|
353
|
+
if commit_count.returncode != 0:
|
|
354
|
+
return
|
|
355
|
+
|
|
356
|
+
commit_count = int(commit_count.stdout.strip())
|
|
357
|
+
|
|
358
|
+
# 暂存所有修改
|
|
359
|
+
subprocess.run(['git', 'add', '.'], check=True)
|
|
360
|
+
|
|
361
|
+
# 提交变更
|
|
362
|
+
subprocess.run(
|
|
363
|
+
['git', 'commit', '-m', f'CheckPoint #{commit_count + 1}'],
|
|
364
|
+
check=True
|
|
365
|
+
)
|
|
366
|
+
except subprocess.CalledProcessError as e:
|
|
367
|
+
PrettyOutput.print(f"提交失败: {str(e)}", OutputType.ERROR)
|
|
266
368
|
|
|
267
369
|
def _show_commit_history(
|
|
268
370
|
self,
|
|
@@ -301,17 +403,14 @@ class CodeAgent:
|
|
|
301
403
|
) -> None:
|
|
302
404
|
"""处理提交确认和可能的重置"""
|
|
303
405
|
if commits and user_confirm("是否接受以上提交记录?", True):
|
|
304
|
-
|
|
305
|
-
"
|
|
306
|
-
|
|
307
|
-
subprocess.
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
)
|
|
313
|
-
git_commiter = GitCommitTool()
|
|
314
|
-
git_commiter.execute({})
|
|
406
|
+
subprocess.run(
|
|
407
|
+
["git", "reset", "--mixed", str(start_commit)],
|
|
408
|
+
stdout=subprocess.DEVNULL,
|
|
409
|
+
stderr=subprocess.DEVNULL,
|
|
410
|
+
check=True
|
|
411
|
+
)
|
|
412
|
+
git_commiter = GitCommitTool()
|
|
413
|
+
git_commiter.execute({})
|
|
315
414
|
elif start_commit:
|
|
316
415
|
os.system(f"git reset --hard {str(start_commit)}") # 确保转换为字符串
|
|
317
416
|
PrettyOutput.print("已重置到初始提交", OutputType.INFO)
|
|
@@ -329,8 +428,24 @@ class CodeAgent:
|
|
|
329
428
|
self._init_env()
|
|
330
429
|
start_commit = get_latest_commit_hash()
|
|
331
430
|
|
|
431
|
+
# 获取项目统计信息并附加到用户输入
|
|
432
|
+
loc_stats = self.get_loc_stats()
|
|
433
|
+
commits_info = self.get_recent_commits_with_files()
|
|
434
|
+
|
|
435
|
+
project_info = []
|
|
436
|
+
if loc_stats:
|
|
437
|
+
project_info.append(f"代码统计:\n{loc_stats}")
|
|
438
|
+
if commits_info:
|
|
439
|
+
commits_str = "\n".join(
|
|
440
|
+
f"提交 {i+1}: {commit['hash'][:7]} - {commit['message']} ({len(commit['files'])}个文件)"
|
|
441
|
+
for i, commit in enumerate(commits_info)
|
|
442
|
+
)
|
|
443
|
+
project_info.append(f"最近提交:\n{commits_str}")
|
|
444
|
+
|
|
445
|
+
enhanced_input = f"{user_input}\n\n项目概况:\n" + "\n\n".join(project_info) if project_info else user_input
|
|
446
|
+
|
|
332
447
|
try:
|
|
333
|
-
self.agent.run(
|
|
448
|
+
self.agent.run(enhanced_input)
|
|
334
449
|
except RuntimeError as e:
|
|
335
450
|
PrettyOutput.print(f"执行失败: {str(e)}", OutputType.WARNING)
|
|
336
451
|
return str(e)
|
|
@@ -3,7 +3,8 @@ from jarvis.jarvis_multi_agent import MultiAgent
|
|
|
3
3
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
|
4
4
|
from jarvis.jarvis_utils.input import get_multiline_input
|
|
5
5
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
6
|
-
from jarvis.jarvis_utils.
|
|
6
|
+
from jarvis.jarvis_utils.tag import ct, ot
|
|
7
|
+
from jarvis.jarvis_utils.utils import init_env
|
|
7
8
|
|
|
8
9
|
# 定义每个角色的系统提示
|
|
9
10
|
PM_PROMPT = f"""
|
|
@@ -994,7 +995,8 @@ def create_dev_team() -> MultiAgent:
|
|
|
994
995
|
"search_web",
|
|
995
996
|
"execute_script",
|
|
996
997
|
"methodology",
|
|
997
|
-
"ask_codebase"
|
|
998
|
+
"ask_codebase",
|
|
999
|
+
"edit_file",
|
|
998
1000
|
])
|
|
999
1001
|
|
|
1000
1002
|
BA_output_handler = ToolRegistry()
|
|
@@ -1005,7 +1007,8 @@ def create_dev_team() -> MultiAgent:
|
|
|
1005
1007
|
"execute_script",
|
|
1006
1008
|
"read_webpage",
|
|
1007
1009
|
"methodology",
|
|
1008
|
-
"ask_codebase"
|
|
1010
|
+
"ask_codebase",
|
|
1011
|
+
"edit_file",
|
|
1009
1012
|
])
|
|
1010
1013
|
|
|
1011
1014
|
SA_output_handler = ToolRegistry()
|
|
@@ -1015,7 +1018,8 @@ def create_dev_team() -> MultiAgent:
|
|
|
1015
1018
|
"ask_codebase",
|
|
1016
1019
|
"execute_script",
|
|
1017
1020
|
"read_code",
|
|
1018
|
-
"methodology"
|
|
1021
|
+
"methodology",
|
|
1022
|
+
"edit_file",
|
|
1019
1023
|
])
|
|
1020
1024
|
|
|
1021
1025
|
TL_output_handler = ToolRegistry()
|
|
@@ -1025,6 +1029,7 @@ def create_dev_team() -> MultiAgent:
|
|
|
1025
1029
|
"lsp_get_diagnostics",
|
|
1026
1030
|
"execute_script",
|
|
1027
1031
|
"methodology",
|
|
1032
|
+
"edit_file",
|
|
1028
1033
|
])
|
|
1029
1034
|
|
|
1030
1035
|
DEV_output_handler = ToolRegistry()
|
|
@@ -1036,6 +1041,7 @@ def create_dev_team() -> MultiAgent:
|
|
|
1036
1041
|
"read_code",
|
|
1037
1042
|
"create_sub_agent",
|
|
1038
1043
|
"methodology",
|
|
1044
|
+
"edit_file",
|
|
1039
1045
|
])
|
|
1040
1046
|
|
|
1041
1047
|
QA_output_handler = ToolRegistry()
|
|
@@ -1048,6 +1054,7 @@ def create_dev_team() -> MultiAgent:
|
|
|
1048
1054
|
"execute_script",
|
|
1049
1055
|
"read_code",
|
|
1050
1056
|
"methodology",
|
|
1057
|
+
"edit_file",
|
|
1051
1058
|
])
|
|
1052
1059
|
|
|
1053
1060
|
# Update PM prompt with tool usage guidance
|
|
@@ -153,9 +153,10 @@ class GitCommitTool:
|
|
|
153
153
|
except Exception as e:
|
|
154
154
|
spinner.write(f"⚠️ 上传文件时出错: {str(e)}")
|
|
155
155
|
upload_success = False
|
|
156
|
-
|
|
157
156
|
# 根据上传状态准备完整的提示
|
|
158
157
|
if upload_success:
|
|
158
|
+
# 尝试生成提交信息
|
|
159
|
+
spinner.text = "正在生成提交消息..."
|
|
159
160
|
# 使用上传的文件
|
|
160
161
|
prompt = base_prompt + f'''
|
|
161
162
|
# 变更概述
|
|
@@ -164,6 +165,7 @@ class GitCommitTool:
|
|
|
164
165
|
|
|
165
166
|
请详细分析已上传的代码差异文件,生成符合上述格式的提交信息。
|
|
166
167
|
'''
|
|
168
|
+
commit_message = platform.chat_until_success(prompt)
|
|
167
169
|
else:
|
|
168
170
|
# 如果上传失败但内容较大,使用chat_big_content
|
|
169
171
|
if is_large_content and hasattr(platform, 'chat_big_content'):
|
|
@@ -177,14 +179,14 @@ class GitCommitTool:
|
|
|
177
179
|
'''
|
|
178
180
|
commit_message = platform.chat_until_success(prompt)
|
|
179
181
|
|
|
180
|
-
# 尝试生成提交信息
|
|
181
|
-
spinner.text = "正在生成提交消息..."
|
|
182
182
|
while True:
|
|
183
|
-
|
|
183
|
+
# 只在特定情况下重新获取commit_message
|
|
184
|
+
if not upload_success and not is_large_content and not commit_message:
|
|
184
185
|
commit_message = platform.chat_until_success(prompt)
|
|
185
|
-
|
|
186
|
+
extracted_message = self._extract_commit_message(commit_message)
|
|
186
187
|
# 如果成功提取,就跳出循环
|
|
187
|
-
if
|
|
188
|
+
if extracted_message:
|
|
189
|
+
commit_message = extracted_message
|
|
188
190
|
break
|
|
189
191
|
prompt = f"""格式错误,请按照以下格式重新生成提交信息:
|
|
190
192
|
{ot("COMMIT_MESSAGE")}
|
|
@@ -193,6 +195,7 @@ class GitCommitTool:
|
|
|
193
195
|
[可选] 详细描述变更内容和原因
|
|
194
196
|
{ct("COMMIT_MESSAGE")}
|
|
195
197
|
"""
|
|
198
|
+
commit_message = platform.chat_until_success(prompt)
|
|
196
199
|
spinner.write("✅ 生成提交消息")
|
|
197
200
|
|
|
198
201
|
# 执行提交
|