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.

Files changed (104) hide show
  1. {jarvis_ai_assistant-0.1.160/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.162}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/__init__.py +1 -2
  6. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/jarvis.py +2 -3
  7. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_agent/code_agent.py +135 -20
  8. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_dev/main.py +11 -4
  9. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_utils/git_commiter.py +9 -6
  10. 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
  11. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/input.py +40 -37
  12. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  13. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -1
  14. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/LICENSE +0 -0
  15. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/MANIFEST.in +0 -0
  16. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/README.md +0 -0
  17. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/setup.cfg +0 -0
  18. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  19. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
  20. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/main.py +0 -0
  21. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  22. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  23. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  24. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  25. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  26. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  27. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  28. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  29. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  30. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  31. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  32. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  33. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  34. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  35. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  36. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  37. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  38. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  39. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  40. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  41. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  42. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  43. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  44. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  45. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  46. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_details/main.py +0 -0
  47. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  48. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_squash/main.py +0 -0
  49. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/base.py +0 -0
  50. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/cpp.py +0 -0
  51. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/go.py +0 -0
  52. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/python.py +0 -0
  53. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/registry.py +0 -0
  54. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/rust.py +0 -0
  55. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  56. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  57. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  58. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_methodology/main.py +0 -0
  59. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  60. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  61. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/__init__.py +0 -0
  62. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/base.py +0 -0
  63. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/human.py +0 -0
  64. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/kimi.py +0 -0
  65. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/registry.py +0 -0
  66. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  67. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  68. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  69. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  70. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  71. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/__init__.py +0 -0
  72. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
  73. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  74. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/base.py +0 -0
  75. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/chdir.py +0 -0
  76. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/code_plan.py +0 -0
  77. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
  78. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  79. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  80. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  81. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/file_operation.py +0 -0
  82. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/find_methodology.py +0 -0
  83. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
  84. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/methodology.py +0 -0
  85. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/read_code.py +0 -0
  86. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  87. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/registry.py +0 -0
  88. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/search_web.py +0 -0
  89. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  90. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/__init__.py +0 -0
  91. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  92. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/config.py +0 -0
  93. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/embedding.py +0 -0
  94. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  95. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  96. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/globals.py +0 -0
  97. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/methodology.py +0 -0
  98. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/output.py +0 -0
  99. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/tag.py +0 -0
  100. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/utils.py +0 -0
  101. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  102. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  103. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  104. {jarvis_ai_assistant-0.1.160 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.160
3
+ Version: 0.1.162
4
4
  Summary: Jarvis: An AI assistant that uses tools to interact with the system
5
5
  Home-page: https://github.com/skyfireitdiy/Jarvis
6
6
  Author: skyfire
@@ -8,7 +8,7 @@ default = true
8
8
 
9
9
  [project]
10
10
  name = "jarvis-ai-assistant"
11
- version = "0.1.160"
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.160",
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",
@@ -1,3 +1,3 @@
1
1
  """Jarvis AI Assistant"""
2
2
 
3
- __version__ = "0.1.160"
3
+ __version__ = "0.1.162"
@@ -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(), PatchOutputHandler()]
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 = ""
@@ -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(), PatchOutputHandler()],
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
- "virtual_tty",
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
- - 对于非常复杂的需求,可以使用create_code_agent工具,但是要提供完整的上下文信息
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, PatchOutputHandler()],
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
- git_commiter = GitCommitTool()
265
- git_commiter.execute({})
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
- if len(commits) > 1 and user_confirm(
305
- "是否要合并为一个更清晰的提交记录?", True
306
- ):
307
- subprocess.run(
308
- ["git", "reset", "--mixed", str(start_commit)],
309
- stdout=subprocess.DEVNULL,
310
- stderr=subprocess.DEVNULL,
311
- check=True
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(user_input)
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.utils import ct, ot, init_env
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
- if not upload_success and not is_large_content:
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
- commit_message = self._extract_commit_message(commit_message)
186
+ extracted_message = self._extract_commit_message(commit_message)
186
187
  # 如果成功提取,就跳出循环
187
- if commit_message:
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
  # 执行提交