jarvis-ai-assistant 0.1.161__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.161/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.162}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/__init__.py +1 -2
  6. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/jarvis.py +1 -2
  7. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_agent/code_agent.py +9 -5
  8. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_dev/main.py +11 -4
  9. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_utils/git_commiter.py +2 -3
  10. jarvis_ai_assistant-0.1.161/src/jarvis/jarvis_agent/patch.py → jarvis_ai_assistant-0.1.162/src/jarvis/jarvis_tools/edit_file.py +107 -155
  11. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  12. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -1
  13. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/LICENSE +0 -0
  14. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/MANIFEST.in +0 -0
  15. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/README.md +0 -0
  16. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/setup.cfg +0 -0
  17. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  18. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
  19. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/main.py +0 -0
  20. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  21. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  22. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  23. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  24. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  25. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  26. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  27. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  28. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  29. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  30. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  31. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  32. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  33. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  34. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  35. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  36. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  37. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  38. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  39. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  40. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  41. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  42. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  43. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  44. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  45. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_details/main.py +0 -0
  46. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  47. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_git_squash/main.py +0 -0
  48. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/base.py +0 -0
  49. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/cpp.py +0 -0
  50. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/go.py +0 -0
  51. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/python.py +0 -0
  52. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/registry.py +0 -0
  53. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_lsp/rust.py +0 -0
  54. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  55. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  56. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  57. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_methodology/main.py +0 -0
  58. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  59. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  60. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/__init__.py +0 -0
  61. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/base.py +0 -0
  62. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/human.py +0 -0
  63. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/kimi.py +0 -0
  64. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/registry.py +0 -0
  65. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  66. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  67. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  68. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  69. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  70. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/__init__.py +0 -0
  71. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
  72. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  73. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/base.py +0 -0
  74. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/chdir.py +0 -0
  75. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/code_plan.py +0 -0
  76. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
  77. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  78. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  79. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  80. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/file_operation.py +0 -0
  81. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/find_methodology.py +0 -0
  82. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
  83. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/methodology.py +0 -0
  84. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/read_code.py +0 -0
  85. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  86. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/registry.py +0 -0
  87. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/search_web.py +0 -0
  88. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  89. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/__init__.py +0 -0
  90. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  91. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/config.py +0 -0
  92. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/embedding.py +0 -0
  93. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  94. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  95. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/globals.py +0 -0
  96. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/input.py +0 -0
  97. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/methodology.py +0 -0
  98. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/output.py +0 -0
  99. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/tag.py +0 -0
  100. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis/jarvis_utils/utils.py +0 -0
  101. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  102. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  103. {jarvis_ai_assistant-0.1.161 → jarvis_ai_assistant-0.1.162}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  104. {jarvis_ai_assistant-0.1.161 → 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.161
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.161"
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.161",
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.161"
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
@@ -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
 
@@ -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,
@@ -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
  # 变更概述
@@ -178,8 +179,6 @@ class GitCommitTool:
178
179
  '''
179
180
  commit_message = platform.chat_until_success(prompt)
180
181
 
181
- # 尝试生成提交信息
182
- spinner.text = "正在生成提交消息..."
183
182
  while True:
184
183
  # 只在特定情况下重新获取commit_message
185
184
  if not upload_success and not is_large_content and not commit_message:
@@ -1,7 +1,10 @@
1
+ from pydoc import describe
1
2
  import re
2
3
  from typing import Dict, Any, Tuple
3
4
  import os
4
5
 
6
+ from networkx import descendants
7
+
5
8
  from yaspin import yaspin # type: ignore
6
9
 
7
10
  from jarvis.jarvis_agent.output_handler import OutputHandler
@@ -18,35 +21,15 @@ from jarvis.jarvis_utils.utils import is_context_overflow, get_file_line_count,
18
21
  from jarvis.jarvis_utils.tag import ot, ct
19
22
 
20
23
 
21
- class PatchOutputHandler(OutputHandler):
22
- def name(self) -> str:
23
- return "PATCH"
24
-
25
- def handle(self, response: str, agent: Any) -> Tuple[bool, Any]:
26
- return False, apply_patch(response, agent)
27
-
28
- def can_handle(self, response: str) -> bool:
29
- if _has_patch_block(response):
30
- return True
31
- return False
24
+ class PatchOutputHandler:
32
25
 
33
- def prompt(self) -> str:
34
- return f"""
35
- # 代码补丁规范
26
+ name = "edit_file"
27
+ description = """代码编辑工具,用于编辑文件
28
+ # 代码编辑规范
36
29
 
37
30
  ## 重要提示
38
31
  我可以看到完整的代码,所以不需要生成完整的代码,只需要提供修改的代码片段即可。请尽量精简补丁内容,只包含必要的上下文和修改部分。特别注意:不要提供完整文件内容,只提供需要修改的部分!
39
32
 
40
- ## 补丁格式定义
41
- 使用{ot("PATCH")}块来精确指定代码更改:
42
- ```
43
- {ot("PATCH")}
44
- File: [文件路径]
45
- Reason: [修改原因]
46
- [代码修改说明,不用输出完整的代码,仅输出修改的片段即可]
47
- {ct("PATCH")}
48
- ```
49
-
50
33
  ## 核心原则
51
34
  1. **精准修改**:只显示需要修改的代码部分,不需要展示整个文件内容
52
35
  2. **最小补丁原则**:始终生成最小范围的补丁,只包含必要的上下文和实际修改
@@ -71,22 +54,6 @@ Reason: [修改原因]
71
54
  - 如果原代码行尾没有空格,补丁也不应添加行尾空格
72
55
  - 如果原代码使用特定的行尾注释风格,补丁也应保持该风格
73
56
 
74
- ## 补丁示例
75
- ```
76
- {ot("PATCH")}
77
- File: src/utils/math.py
78
- Reason: 修复除零错误,增加参数验证以提高函数健壮性
79
- def safe_divide(a, b):
80
- # 添加参数验证
81
- if b == 0:
82
- raise ValueError("除数不能为零")
83
- return a / b
84
- # 现有代码 ...
85
- def add(a, b):
86
- return a + b
87
- {ct("PATCH")}
88
- ```
89
-
90
57
  ## 最佳实践
91
58
  - 每个补丁专注于单一职责的修改
92
59
  - 避免包含过多无关代码
@@ -96,77 +63,47 @@ def add(a, b):
96
63
  - 绝不提供完整文件内容,除非是新建文件
97
64
  - 每个文件的修改是独立的,不能出现“参照xxx文件的修改”这样的描述
98
65
  - 不要出现未实现的代码,如:TODO
99
- """
100
-
101
- def _has_patch_block(patch_str: str) -> bool:
102
- """判断是否存在补丁块"""
103
- return re.search(ot("PATCH")+r'\n?(.*?)\n?' +
104
- ct("PATCH"), patch_str, re.DOTALL) is not None
105
-
106
-
107
- def _parse_patch(patch_str: str) -> Tuple[Dict[str, str], str]:
108
- """解析新的上下文补丁格式"""
109
- result = {}
110
- patches = re.findall(ot("PATCH")+r'\n?(.*?)\n?' +
111
- ct("PATCH"), patch_str, re.DOTALL)
112
- if patches:
113
- for patch in patches:
114
- first_line = patch.splitlines()[0]
115
- sm = re.match(r'^File:\s*(.+)$', first_line)
116
- if not sm:
117
- return ({}, f"""无效的补丁格式,正确格式应该为:
118
- {ot("PATCH")}
119
- File: [文件路径]
120
- Reason: [修改原因]
121
- [代码修改说明,不用输出完整的代码,仅输出修改的片段即可]
122
- {ct("PATCH")}""")
123
- filepath = os.path.abspath(sm.group(1).strip())
124
- if filepath not in result:
125
- result[filepath] = patch
126
- else:
127
- result[filepath] += "\n\n" + patch
128
- return result, ""
66
+ - 如果要修改的内容较多,请分多次修改
67
+ """
68
+ parameters = {
69
+ "type": "object",
70
+ "properties": {
71
+ "file": {"type": "string", "description": "文件路径"},
72
+ "reason": {"type": "string", "description": "修改原因"},
73
+ "content": {"type": "string", "description": "补丁内容"}
74
+ }
75
+ }
129
76
 
130
77
 
131
- def apply_patch(output_str: str, agent: Any) -> str:
132
- """Apply patches to files"""
133
- with yaspin(text="正在应用补丁...", color="cyan") as spinner:
134
- try:
135
- patches, error_msg = _parse_patch(output_str)
136
- if error_msg:
137
- spinner.text = "补丁格式错误"
78
+
79
+ def execute(self, args: Dict) -> Dict[str, Any]:
80
+ """Apply patches to files"""
81
+
82
+ from jarvis.jarvis_agent import Agent
83
+ filepath = args["file"]
84
+ patch_content = args["content"]
85
+ agent: Agent = args["agent"]
86
+
87
+ with yaspin(text="正在应用补丁...", color="cyan") as spinner:
88
+
89
+ # 获取当前提交hash作为起始点
90
+ spinner.text = "开始获取当前提交hash..."
91
+ start_hash = get_latest_commit_hash()
92
+ spinner.write("✅ 当前提交hash获取完成")
93
+
94
+ not_read_file = not has_read_file(filepath) and os.path.exists(filepath) and os.path.getsize(filepath) > 0
95
+ if not_read_file:
96
+ spinner.text=f"以下文件未读取: {filepath},应用补丁存在风险,将先读取文件后再生成补丁"
138
97
  spinner.fail("❌")
139
- return error_msg
140
- except Exception as e:
141
- spinner.text = "解析补丁失败"
142
- spinner.fail("")
143
- return f"解析补丁失败: {str(e)}"
144
-
145
- # 获取当前提交hash作为起始点
146
- spinner.text = "开始获取当前提交hash..."
147
- start_hash = get_latest_commit_hash()
148
- spinner.write("✅ 当前提交hash获取完成")
149
-
150
- not_read_file = [
151
- f for f in patches.keys()
152
- if not has_read_file(f)
153
- and os.path.exists(f)
154
- and os.path.getsize(f) > 0
155
- ]
156
- if not_read_file:
157
- spinner.text=f"以下文件未读取: {not_read_file},应用补丁存在风险,将先读取文件后再生成补丁"
158
- spinner.fail("❌")
159
- return f"以下文件未读取: {not_read_file},应用补丁存在风险,请先读取文件后再生成补丁"
98
+ return {
99
+ "success": False,
100
+ "stdout": f"以下文件未读取: {filepath},应用补丁存在风险,请先读取文件后再生成补丁",
101
+ "stderr": ""
102
+ }
160
103
 
161
- # 检查是否有文件在Git仓库外
162
- in_git_repo = True
163
- for filepath in patches.keys():
164
- if not _is_file_in_git_repo(filepath):
165
- in_git_repo = False
166
- break
104
+ # 检查是否有文件在Git仓库外
105
+ in_git_repo = _is_file_in_git_repo(filepath)
167
106
 
168
- # 按文件逐个处理
169
- for filepath, patch_content in patches.items():
170
107
  try:
171
108
  spinner.text = f"正在处理文件: {filepath}"
172
109
  if not os.path.exists(filepath):
@@ -188,59 +125,74 @@ def apply_patch(output_str: str, agent: Any) -> str:
188
125
  revert_file(filepath) # 回滚单个文件
189
126
  spinner.write(f"✅ 文件 {filepath} 回滚完成")
190
127
 
191
- final_ret = ""
192
- if in_git_repo:
193
- diff = get_diff()
194
- if diff:
195
- PrettyOutput.print(diff, OutputType.CODE, lang="diff")
196
- with spinner.hidden():
197
- commited = handle_commit_workflow()
198
- if commited:
199
- # 获取提交信息
200
- end_hash = get_latest_commit_hash()
201
- commits = get_commits_between(start_hash, end_hash)
128
+ final_ret = ""
129
+ if in_git_repo:
130
+ diff = get_diff()
131
+ if diff:
132
+ PrettyOutput.print(diff, OutputType.CODE, lang="diff")
133
+ with spinner.hidden():
134
+ commited = handle_commit_workflow()
135
+ if commited:
136
+ # 获取提交信息
137
+ end_hash = get_latest_commit_hash()
138
+ commits = get_commits_between(start_hash, end_hash)
202
139
 
203
- # 添加提交信息到final_ret
204
- if commits:
205
- final_ret += "✅ 补丁已应用\n"
206
- final_ret += "# 提交信息:\n"
207
- for commit_hash, commit_message in commits:
208
- final_ret += f"- {commit_hash[:7]}: {commit_message}\n"
140
+ # 添加提交信息到final_ret
141
+ if commits:
142
+ final_ret += "✅ 补丁已应用\n"
143
+ final_ret += "# 提交信息:\n"
144
+ for commit_hash, commit_message in commits:
145
+ final_ret += f"- {commit_hash[:7]}: {commit_message}\n"
209
146
 
210
- final_ret += f"# 应用补丁:\n```diff\n{diff}\n```"
147
+ final_ret += f"# 应用补丁:\n```diff\n{diff}\n```"
211
148
 
212
- # 修改后的提示逻辑
213
- addon_prompt = f"如果用户的需求未完成,请继续生成补丁,如果已经完成,请终止,不要输出新的 {ot('PATCH')},不要实现任何超出用户需求外的内容\n"
214
- addon_prompt += "如果有任何信息不明确,调用工具获取信息\n"
215
- addon_prompt += "每次响应必须且只能包含一个操作\n"
149
+ # 修改后的提示逻辑
150
+ addon_prompt = f"如果用户的需求未完成,请继续生成补丁,如果已经完成,请终止,不要输出新的PATCH,不要实现任何超出用户需求外的内容\n"
151
+ addon_prompt += "如果有任何信息不明确,调用工具获取信息\n"
152
+ addon_prompt += "每次响应必须且只能包含一个操作\n"
216
153
 
217
- agent.set_addon_prompt(addon_prompt)
154
+ agent.set_addon_prompt(addon_prompt)
218
155
 
156
+ else:
157
+ final_ret += "✅ 补丁已应用(没有新的提交)"
219
158
  else:
220
- final_ret += " 补丁已应用(没有新的提交)"
159
+ final_ret += " 补丁应用被拒绝\n"
160
+ final_ret += f"# 补丁预览:\n```diff\n{diff}\n```"
221
161
  else:
222
- final_ret += "❌ 补丁应用被拒绝\n"
223
- final_ret += f"# 补丁预览:\n```diff\n{diff}\n```"
162
+ commited = False
163
+ final_ret += " 没有要提交的更改\n"
224
164
  else:
225
- commited = False
226
- final_ret += " 没有要提交的更改\n"
227
- else:
228
- # 对于Git仓库外的文件,直接返回成功
229
- final_ret += "✅ 补丁已应用(文件不在Git仓库中)"
230
- commited = True
231
- # 用户确认最终结果
232
- with spinner.hidden():
233
- if commited:
234
- return final_ret
235
- PrettyOutput.print(final_ret, OutputType.USER, lang="markdown")
236
- if not is_confirm_before_apply_patch() or user_confirm("是否使用此回复?", default=True):
237
- return final_ret
238
- custom_reply = get_multiline_input("请输入自定义回复")
239
- if not custom_reply.strip(): # 如果自定义回复为空,返回空字符串
240
- return ""
241
- agent.set_addon_prompt(custom_reply)
242
- return final_ret
243
-
165
+ # 对于Git仓库外的文件,直接返回成功
166
+ final_ret += " 补丁已应用(文件不在Git仓库中)"
167
+ commited = True
168
+ # 用户确认最终结果
169
+ with spinner.hidden():
170
+ if commited:
171
+ return {
172
+ "success": True,
173
+ "stdout": final_ret,
174
+ "stderr": ""
175
+ }
176
+ PrettyOutput.print(final_ret, OutputType.USER, lang="markdown")
177
+ if not is_confirm_before_apply_patch() or user_confirm("是否使用此回复?", default=True):
178
+ return {
179
+ "success": True,
180
+ "stdout": final_ret,
181
+ "stderr": ""
182
+ }
183
+ custom_reply = get_multiline_input("请输入自定义回复")
184
+ if not custom_reply.strip(): # 如果自定义回复为空,返回空字符串
185
+ return {
186
+ "success": True,
187
+ "stdout": final_ret,
188
+ "stderr": ""
189
+ }
190
+ agent.set_addon_prompt(custom_reply)
191
+ return {
192
+ "success": True,
193
+ "stdout": final_ret,
194
+ "stderr": ""
195
+ }
244
196
 
245
197
  def _is_file_in_git_repo(filepath: str) -> bool:
246
198
  """检查文件是否在当前Git仓库中"""
@@ -532,19 +484,19 @@ def handle_large_code_operation(filepath: str, patch_content: str, model: BasePl
532
484
 
533
485
  ## 输出模板
534
486
  {ot("DIFF")}
535
- >>>>>> SEARCH
487
+ {">" * 5} SEARCH
536
488
  [需要查找的原始代码,包含足够上下文,避免出现可匹配多处的情况]
537
489
  {'='*5}
538
490
  [替换后的新代码]
539
- <<<<<< REPLACE
491
+ {"<" * 5} REPLACE
540
492
  {ct("DIFF")}
541
493
 
542
494
  {ot("DIFF")}
543
- >>>>>> SEARCH
495
+ {">" * 5} SEARCH
544
496
  [另一处需要查找的原始代码,包含足够上下文,避免出现可匹配多处的情况]
545
497
  {'='*5}
546
498
  [另一处替换后的新代码]
547
- <<<<<< REPLACE
499
+ {"<" * 5} REPLACE
548
500
  {ct("DIFF")}
549
501
  """
550
502
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.161
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
@@ -10,7 +10,6 @@ src/jarvis/jarvis_agent/file_input_handler.py
10
10
  src/jarvis/jarvis_agent/jarvis.py
11
11
  src/jarvis/jarvis_agent/main.py
12
12
  src/jarvis/jarvis_agent/output_handler.py
13
- src/jarvis/jarvis_agent/patch.py
14
13
  src/jarvis/jarvis_agent/shell_input_handler.py
15
14
  src/jarvis/jarvis_code_agent/__init__.py
16
15
  src/jarvis/jarvis_code_agent/code_agent.py
@@ -71,6 +70,7 @@ src/jarvis/jarvis_tools/chdir.py
71
70
  src/jarvis/jarvis_tools/code_plan.py
72
71
  src/jarvis/jarvis_tools/create_code_agent.py
73
72
  src/jarvis/jarvis_tools/create_sub_agent.py
73
+ src/jarvis/jarvis_tools/edit_file.py
74
74
  src/jarvis/jarvis_tools/execute_script.py
75
75
  src/jarvis/jarvis_tools/file_analyzer.py
76
76
  src/jarvis/jarvis_tools/file_operation.py