jarvis-ai-assistant 0.1.154__tar.gz → 0.1.155__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 (103) hide show
  1. {jarvis_ai_assistant-0.1.154/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.155}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/pyproject.toml +2 -1
  3. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/setup.py +2 -1
  4. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_agent/__init__.py +1 -1
  6. jarvis_ai_assistant-0.1.155/src/jarvis/jarvis_agent/builtin_input_handler.py +51 -0
  7. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_agent/jarvis.py +6 -0
  8. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_agent/patch.py +65 -37
  9. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_agent/code_agent.py +6 -1
  10. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/code_review.py +5 -5
  11. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_git_utils/git_commiter.py +2 -1
  12. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_platform/base.py +2 -1
  13. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_platform_manager/main.py +41 -0
  14. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_smart_shell/main.py +68 -27
  15. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/create_code_agent.py +0 -20
  16. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/find_methodology.py +2 -1
  17. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/registry.py +2 -1
  18. jarvis_ai_assistant-0.1.154/src/jarvis/jarvis_agent/builtin_input_handler.py → jarvis_ai_assistant-0.1.155/src/jarvis/jarvis_utils/builtin_replace_map.py +55 -57
  19. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_utils/config.py +26 -8
  20. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_utils/input.py +34 -20
  21. jarvis_ai_assistant-0.1.155/src/jarvis/jarvis_utils/tag.py +21 -0
  22. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_utils/utils.py +0 -22
  23. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  24. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +2 -0
  25. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis_ai_assistant.egg-info/entry_points.txt +1 -0
  26. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/LICENSE +0 -0
  27. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/MANIFEST.in +0 -0
  28. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/README.md +0 -0
  29. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/setup.cfg +0 -0
  30. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
  31. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_agent/main.py +0 -0
  32. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  33. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  34. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  35. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  36. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  37. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  38. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  39. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  40. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  41. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  42. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  43. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  44. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  45. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  46. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  47. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  48. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  49. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  50. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  51. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  52. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  53. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  54. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  55. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_dev/main.py +0 -0
  56. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  57. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_git_details/main.py +0 -0
  58. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  59. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_git_squash/main.py +0 -0
  60. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_lsp/base.py +0 -0
  61. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_lsp/cpp.py +0 -0
  62. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_lsp/go.py +0 -0
  63. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_lsp/python.py +0 -0
  64. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_lsp/registry.py +0 -0
  65. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_lsp/rust.py +0 -0
  66. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  67. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  68. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  69. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_methodology/main.py +0 -0
  70. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  71. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  72. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_platform/__init__.py +0 -0
  73. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_platform/kimi.py +0 -0
  74. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_platform/registry.py +0 -0
  75. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  76. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  77. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  78. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/__init__.py +0 -0
  79. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
  80. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  81. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/base.py +0 -0
  82. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/chdir.py +0 -0
  83. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/code_plan.py +0 -0
  84. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  85. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  86. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  87. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/file_operation.py +0 -0
  88. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
  89. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/methodology.py +0 -0
  90. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/read_code.py +0 -0
  91. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  92. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/search_web.py +0 -0
  93. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  94. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_utils/__init__.py +0 -0
  95. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_utils/embedding.py +0 -0
  96. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  97. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  98. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_utils/globals.py +0 -0
  99. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_utils/methodology.py +0 -0
  100. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis/jarvis_utils/output.py +0 -0
  101. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  102. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  103. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.155}/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.154
3
+ Version: 0.1.155
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.154"
11
+ version = "0.1.155"
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" }]
@@ -66,5 +66,6 @@ jarvis-multi-agent = "jarvis.jarvis_multi_agent.main:main"
66
66
  jarvis-agent = "jarvis.jarvis_agent.main:main"
67
67
  jarvis-tool = "jarvis.jarvis_tools.registry:main"
68
68
  jarvis-ask-codebase = "jarvis.jarvis_tools.ask_codebase:main"
69
+ jac = "jarvis.jarvis_tools.ask_codebase:main"
69
70
  jarvis-git-details = "jarvis.jarvis_git_details.main:main"
70
71
  jarvis-methodology = "jarvis.jarvis_methodology.main:main"
@@ -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.154",
5
+ version="0.1.155",
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",
@@ -46,6 +46,7 @@ setup(
46
46
  "jarvis-agent=jarvis.jarvis_agent.main:main",
47
47
  "jarvis-tool=jarvis.jarvis_tools.registry:main",
48
48
  "jarvis-ask-codebase=jarvis.jarvis_tools.ask_codebase:main",
49
+ "jac=jarvis.jarvis_tools.ask_codebase:main",
49
50
  "jarvis-git-details=jarvis.jarvis_git_details.main:main",
50
51
  "jarvis-methodology=jarvis.jarvis_methodology.main:main",
51
52
  ],
@@ -1,3 +1,3 @@
1
1
  """Jarvis AI Assistant"""
2
2
 
3
- __version__ = "0.1.154"
3
+ __version__ = "0.1.155"
@@ -15,7 +15,7 @@ from jarvis.jarvis_utils.methodology import load_methodology
15
15
  from jarvis.jarvis_utils.globals import make_agent_name, set_agent, delete_agent
16
16
  from jarvis.jarvis_utils.input import get_multiline_input
17
17
  from jarvis.jarvis_utils.config import get_max_token_count
18
- from jarvis.jarvis_utils.utils import ct, ot
18
+ from jarvis.jarvis_utils.tag import ct, ot
19
19
  from jarvis.jarvis_utils.utils import user_confirm
20
20
 
21
21
  from jarvis.jarvis_platform.registry import PlatformRegistry
@@ -0,0 +1,51 @@
1
+ import re
2
+ from typing import Any, Tuple
3
+ from jarvis.jarvis_utils.config import get_replace_map
4
+
5
+
6
+
7
+ def builtin_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
8
+ """
9
+ 处理内置的特殊输入标记,并追加相应的提示词
10
+
11
+ 参数:
12
+ user_input: 用户输入
13
+ agent: 代理对象
14
+
15
+ 返回:
16
+ Tuple[str, bool]: 处理后的输入和是否需要进一步处理
17
+ """
18
+ # 查找特殊标记
19
+ special_tags = re.findall(r"'<([^>]+)>'", user_input)
20
+
21
+ if not special_tags:
22
+ return user_input, False
23
+
24
+ # 获取替换映射表
25
+ replace_map = get_replace_map()
26
+ # 处理每个标记
27
+ for tag in special_tags:
28
+
29
+ # 优先处理特殊标记
30
+ if tag == "Summary":
31
+ agent._summarize_and_clear_history()
32
+ return "", True
33
+ elif tag == "Clear":
34
+ agent.clear()
35
+ return "", True
36
+
37
+ processed_tag = set()
38
+ add_on_prompt = ""
39
+
40
+ # 处理普通替换标记
41
+ if tag in replace_map:
42
+ processed_tag.add(tag)
43
+ if "append" in replace_map[tag] and replace_map[tag]["append"] and tag not in processed_tag:
44
+ user_input = user_input.replace(f"'<{tag}>'", "")
45
+ add_on_prompt += replace_map[tag]["template"] + "\n"
46
+ else:
47
+ user_input = user_input.replace(f"'<{tag}>'", replace_map[tag]["template"])
48
+
49
+ agent.set_addon_prompt(add_on_prompt)
50
+
51
+ return user_input, False
@@ -114,6 +114,7 @@ def main() -> None:
114
114
  parser = argparse.ArgumentParser(description='Jarvis AI assistant')
115
115
  parser.add_argument('-p', '--platform', type=str, help='Platform to use')
116
116
  parser.add_argument('-m', '--model', type=str, help='Model to use')
117
+ parser.add_argument('-t', '--task', type=str, help='Directly input task content from command line')
117
118
  args = parser.parse_args()
118
119
 
119
120
  try:
@@ -126,6 +127,11 @@ def main() -> None:
126
127
  need_summary=False
127
128
  )
128
129
 
130
+ # 优先处理命令行直接传入的任务
131
+ if args.task:
132
+ agent.run(args.task)
133
+ sys.exit(0)
134
+
129
135
  tasks = _load_tasks()
130
136
  if tasks and (selected_task := _select_task(tasks)):
131
137
  PrettyOutput.print(f"执行任务: {selected_task}", OutputType.INFO)
@@ -15,7 +15,8 @@ from jarvis.jarvis_utils.git_utils import get_commits_between, get_latest_commit
15
15
  from jarvis.jarvis_utils.globals import add_read_file_record, has_read_file
16
16
  from jarvis.jarvis_utils.input import get_multiline_input
17
17
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
18
- from jarvis.jarvis_utils.utils import ct, ot, get_file_line_count, user_confirm
18
+ from jarvis.jarvis_utils.utils import get_file_line_count, user_confirm
19
+ from jarvis.jarvis_utils.tag import ot, ct
19
20
 
20
21
 
21
22
  class PatchOutputHandler(OutputHandler):
@@ -153,6 +154,13 @@ def apply_patch(output_str: str, agent: Any) -> str:
153
154
  spinner.fail("❌")
154
155
  return f"以下文件未读取: {not_read_file},应用补丁存在风险,请先读取文件后再生成补丁"
155
156
 
157
+ # 检查是否有文件在Git仓库外
158
+ in_git_repo = True
159
+ for filepath in patches.keys():
160
+ if not _is_file_in_git_repo(filepath):
161
+ in_git_repo = False
162
+ break
163
+
156
164
  # 按文件逐个处理
157
165
  for filepath, patch_content in patches.items():
158
166
  try:
@@ -177,46 +185,50 @@ def apply_patch(output_str: str, agent: Any) -> str:
177
185
  spinner.write(f"✅ 文件 {filepath} 回滚完成")
178
186
 
179
187
  final_ret = ""
180
- diff = get_diff()
181
- if diff:
182
- PrettyOutput.print(diff, OutputType.CODE, lang="diff")
183
- with spinner.hidden():
184
- commited = handle_commit_workflow()
185
- if commited:
186
- # 获取提交信息
187
- end_hash = get_latest_commit_hash()
188
- commits = get_commits_between(start_hash, end_hash)
189
-
190
- # 添加提交信息到final_ret
191
- if commits:
192
- final_ret += "✅ 补丁已应用\n"
193
- final_ret += "# 提交信息:\n"
194
- for commit_hash, commit_message in commits:
195
- final_ret += f"- {commit_hash[:7]}: {commit_message}\n"
196
-
197
- final_ret += f"# 应用补丁:\n```diff\n{diff}\n```"
198
-
199
- # 增加代码变更分析和错误提示
200
-
201
- addon_prompt = "1. 请调用静态检查工具(如有)检查以上变更是否引入了潜在错误\n"
202
- addon_prompt += "2. 如果发现致命的代码错误,请立即开始修复\n"
203
- addon_prompt += "3. 如果发现性能、风格等问题,要询问用户是否需要立即修复\n"
204
- addon_prompt += "\n\n"
205
- addon_prompt += "如果没有问题,请继续进行下一步修改\n"
206
- addon_prompt += f"如果用户的需求已经完成,请终止,不要输出新的 {ot('PATCH')},不要实现任何超出用户需求外的内容\n"
207
- addon_prompt += "如果有任何信息不清楚,调用工具获取信息\n"
208
- addon_prompt += "每次响应必须且只能包含一个操作\n"
209
-
210
- agent.set_addon_prompt(addon_prompt)
188
+ if in_git_repo:
189
+ diff = get_diff()
190
+ if diff:
191
+ PrettyOutput.print(diff, OutputType.CODE, lang="diff")
192
+ with spinner.hidden():
193
+ commited = handle_commit_workflow()
194
+ if commited:
195
+ # 获取提交信息
196
+ end_hash = get_latest_commit_hash()
197
+ commits = get_commits_between(start_hash, end_hash)
198
+
199
+ # 添加提交信息到final_ret
200
+ if commits:
201
+ final_ret += " 补丁已应用\n"
202
+ final_ret += "# 提交信息:\n"
203
+ for commit_hash, commit_message in commits:
204
+ final_ret += f"- {commit_hash[:7]}: {commit_message}\n"
205
+
206
+ final_ret += f"# 应用补丁:\n```diff\n{diff}\n```"
207
+
208
+ # 增加代码变更分析和错误提示
209
+ addon_prompt = "1. 请调用静态检查工具(如有)检查以上变更是否引入了潜在错误\n"
210
+ addon_prompt += "2. 如果发现致命的代码错误,请立即开始修复\n"
211
+ addon_prompt += "3. 如果发现性能、风格等问题,要询问用户是否需要立即修复\n"
212
+ addon_prompt += "\n\n"
213
+ addon_prompt += "如果没有问题,请继续进行下一步修改\n"
214
+ addon_prompt += f"如果用户的需求已经完成,请终止,不要输出新的 {ot('PATCH')},不要实现任何超出用户需求外的内容\n"
215
+ addon_prompt += "如果有任何信息不清楚,调用工具获取信息\n"
216
+ addon_prompt += "每次响应必须且只能包含一个操作\n"
217
+
218
+ agent.set_addon_prompt(addon_prompt)
211
219
 
220
+ else:
221
+ final_ret += "✅ 补丁已应用(没有新的提交)"
212
222
  else:
213
- final_ret += " 补丁已应用(没有新的提交)"
223
+ final_ret += " 补丁应用被拒绝\n"
224
+ final_ret += f"# 补丁预览:\n```diff\n{diff}\n```"
214
225
  else:
215
- final_ret += "❌ 补丁应用被拒绝\n"
216
- final_ret += f"# 补丁预览:\n```diff\n{diff}\n```"
226
+ commited = False
227
+ final_ret += " 没有要提交的更改\n"
217
228
  else:
218
- commited = False
219
- final_ret += " 没有要提交的更改\n"
229
+ # 对于Git仓库外的文件,直接返回成功
230
+ final_ret += " 补丁已应用(文件不在Git仓库中)"
231
+ commited = True
220
232
  # 用户确认最终结果
221
233
  with spinner.hidden():
222
234
  if commited:
@@ -231,6 +243,22 @@ def apply_patch(output_str: str, agent: Any) -> str:
231
243
  return final_ret
232
244
 
233
245
 
246
+ def _is_file_in_git_repo(filepath: str) -> bool:
247
+ """检查文件是否在当前Git仓库中"""
248
+ import subprocess
249
+ try:
250
+ # 获取Git仓库根目录
251
+ repo_root = subprocess.run(
252
+ ['git', 'rev-parse', '--show-toplevel'],
253
+ capture_output=True,
254
+ text=True
255
+ ).stdout.strip()
256
+
257
+ # 检查文件路径是否在仓库根目录下
258
+ return os.path.abspath(filepath).startswith(os.path.abspath(repo_root))
259
+ except:
260
+ return False
261
+
234
262
  def revert_file(filepath: str):
235
263
  """增强版git恢复,处理新文件"""
236
264
  import subprocess
@@ -354,6 +354,8 @@ def main() -> None:
354
354
  help='Target platform name', default=None)
355
355
  parser.add_argument('-m', '--model', type=str,
356
356
  help='Model name to use', default=None)
357
+ parser.add_argument('-r', '--requirement', type=str,
358
+ help='Requirement to process', default=None)
357
359
  args = parser.parse_args()
358
360
 
359
361
  curr_dir = os.getcwd()
@@ -361,7 +363,10 @@ def main() -> None:
361
363
  PrettyOutput.print(f"当前目录: {git_dir}", OutputType.INFO)
362
364
 
363
365
  try:
364
- user_input = get_multiline_input("请输入你的需求(输入空行退出):")
366
+ if args.requirement:
367
+ user_input = args.requirement
368
+ else:
369
+ user_input = get_multiline_input("请输入你的需求(输入空行退出):")
365
370
  if not user_input:
366
371
  sys.exit(0)
367
372
  agent = CodeAgent(platform=args.platform,
@@ -13,7 +13,8 @@ from jarvis.jarvis_agent import Agent
13
13
  from jarvis.jarvis_utils.config import INPUT_WINDOW_REVERSE_SIZE, get_max_input_token_count
14
14
  from jarvis.jarvis_utils.embedding import get_context_token_count
15
15
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
16
- from jarvis.jarvis_utils.utils import ct, ot, init_env
16
+ from jarvis.jarvis_utils.utils import init_env
17
+ from jarvis.jarvis_utils.tag import ot, ct
17
18
  from jarvis.jarvis_code_analysis.checklists.loader import get_language_checklist
18
19
 
19
20
  class CodeReviewTool:
@@ -559,7 +560,7 @@ class CodeReviewTool:
559
560
  {ct("REPORT")}""",
560
561
  output_handler=[tool_registry],
561
562
  platform=PlatformRegistry().get_thinking_platform(),
562
- auto_complete=True
563
+ auto_complete=False
563
564
  )
564
565
 
565
566
  # Determine if we need to split the diff due to size
@@ -616,9 +617,8 @@ class CodeReviewTool:
616
617
  complete_prompt = user_prompt + "\n\n代码差异内容:\n```diff\n" + diff_output + "\n```"
617
618
 
618
619
  # Run the agent with the prompt
619
- with yaspin(text="正在分析代码变更...", color="cyan") as spinner:
620
- result = agent.run(complete_prompt)
621
- spinner.ok("✅")
620
+
621
+ result = agent.run(complete_prompt)
622
622
  finally:
623
623
  # Clean up the temporary file
624
624
  if os.path.exists(temp_file_path):
@@ -14,7 +14,8 @@ from jarvis.jarvis_utils.config import INPUT_WINDOW_REVERSE_SIZE, get_max_input_
14
14
  from jarvis.jarvis_utils.embedding import get_context_token_count
15
15
  from jarvis.jarvis_utils.git_utils import find_git_root, has_uncommitted_changes
16
16
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
17
- from jarvis.jarvis_utils.utils import ct, ot, init_env
17
+ from jarvis.jarvis_utils.utils import init_env
18
+ from jarvis.jarvis_utils.tag import ot, ct
18
19
 
19
20
 
20
21
  class GitCommitTool:
@@ -3,7 +3,8 @@ import re
3
3
  from typing import List, Tuple
4
4
  from jarvis.jarvis_utils.globals import clear_read_file_record
5
5
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
6
- from jarvis.jarvis_utils.utils import ct, ot, get_context_token_count, while_success, while_true
6
+ from jarvis.jarvis_utils.utils import get_context_token_count, while_success, while_true
7
+ from jarvis.jarvis_utils.tag import ot, ct
7
8
 
8
9
 
9
10
  class BasePlatform(ABC):
@@ -1,3 +1,4 @@
1
+ import os
1
2
  from jarvis.jarvis_platform.registry import PlatformRegistry
2
3
  import asyncio
3
4
  from fastapi import FastAPI, HTTPException
@@ -61,6 +62,7 @@ def chat_with_model(platform_name: str, model_name: str):
61
62
  platform.set_model_name(model_name)
62
63
  platform.set_suppress_output(False)
63
64
  PrettyOutput.print(f"连接到 {platform_name} 平台 {model_name} 模型", OutputType.SUCCESS)
65
+ PrettyOutput.print("可用命令: /bye - 退出聊天, /clear - 清除会话, /upload - 上传文件, /shell - 执行shell命令", OutputType.INFO)
64
66
 
65
67
  # Start conversation loop
66
68
  while True:
@@ -86,6 +88,45 @@ def chat_with_model(platform_name: str, model_name: str):
86
88
  PrettyOutput.print(f"清除会话失败: {str(e)}", OutputType.ERROR)
87
89
  continue
88
90
 
91
+ # Check if it is an upload command
92
+ if user_input.strip().startswith("/upload"):
93
+ try:
94
+ file_path = user_input.strip()[8:].strip()
95
+ if not file_path:
96
+ PrettyOutput.print("请指定要上传的文件路径,例如: /upload /path/to/file 或 /upload \"/path/with spaces/file\"", OutputType.WARNING)
97
+ continue
98
+
99
+ # Remove quotes if present
100
+ if (file_path.startswith('"') and file_path.endswith('"')) or (file_path.startswith("'") and file_path.endswith("'")):
101
+ file_path = file_path[1:-1]
102
+
103
+ PrettyOutput.print(f"正在上传文件: {file_path}", OutputType.INFO)
104
+ if platform.upload_files([file_path]):
105
+ PrettyOutput.print("文件上传成功", OutputType.SUCCESS)
106
+ else:
107
+ PrettyOutput.print("文件上传失败", OutputType.ERROR)
108
+ except Exception as e:
109
+ PrettyOutput.print(f"上传文件失败: {str(e)}", OutputType.ERROR)
110
+ continue
111
+
112
+ # Check if it is a shell command
113
+ if user_input.strip().startswith("/shell"):
114
+ try:
115
+ command = user_input.strip()[6:].strip()
116
+ if not command:
117
+ PrettyOutput.print("请指定要执行的shell命令,例如: /shell ls -l", OutputType.WARNING)
118
+ continue
119
+
120
+ PrettyOutput.print(f"执行命令: {command}", OutputType.INFO)
121
+ return_code = os.system(command)
122
+ if return_code == 0:
123
+ PrettyOutput.print("命令执行完成", OutputType.SUCCESS)
124
+ else:
125
+ PrettyOutput.print(f"命令执行失败(返回码: {return_code})", OutputType.ERROR)
126
+ except Exception as ex:
127
+ PrettyOutput.print(f"执行命令失败: {str(ex)}", OutputType.ERROR)
128
+ continue
129
+
89
130
  try:
90
131
  # Send to model and get reply
91
132
  response = platform.chat_until_success(user_input)
@@ -2,33 +2,63 @@
2
2
  import argparse
3
3
  import os
4
4
  import sys
5
- import readline
6
5
  from typing import Optional
7
6
 
8
- from yaspin import yaspin
9
-
10
7
  from jarvis.jarvis_platform.registry import PlatformRegistry
11
8
  from jarvis.jarvis_utils.config import get_shell_name
12
9
  from jarvis.jarvis_utils.input import get_multiline_input
13
- from jarvis.jarvis_utils.output import OutputType, PrettyOutput
14
10
  from jarvis.jarvis_utils.utils import init_env
15
11
 
16
- def execute_command(command: str) -> None:
17
- """Show command and allow user to edit, then execute, Ctrl+C to cancel"""
18
- try:
19
- print("生成的命令 (可以编辑, 按回车执行, Ctrl+C 取消):")
20
- # Pre-fill input line
21
- readline.set_startup_hook(lambda: readline.insert_text(command))
22
- try:
23
- edited_command = input("> ")
24
- if edited_command.strip(): # Ensure command is not empty
25
- os.system(edited_command)
26
- except KeyboardInterrupt:
27
- PrettyOutput.print("执行取消", OutputType.INFO)
28
- finally:
29
- readline.set_startup_hook() # Clear pre-filled
30
- except Exception as e:
31
- PrettyOutput.print(f"执行命令失败: {str(e)}", OutputType.WARNING)
12
+ def execute_command(command: str, should_run: bool) -> None:
13
+ """Print command without execution"""
14
+ print(command)
15
+ if should_run:
16
+ os.system(command)
17
+
18
+
19
+ def install_fish_completion() -> int:
20
+ """Install fish shell command completion if not already installed
21
+
22
+ Returns:
23
+ int: 0 if success, 1 if failed
24
+ """
25
+ if get_shell_name() != "fish":
26
+ print("当前不是fish shell,无需安装")
27
+ return 0
28
+
29
+ # 使用fish命令检查函数是否已加载
30
+ check_cmd = 'functions --names | grep fish_command_not_found > /dev/null && echo "defined" || echo "undefined"'
31
+ result = os.popen(f'fish -c \'{check_cmd}\'').read().strip()
32
+
33
+ if result == "defined":
34
+ print("fish_command_not_found函数已加载,无需安装")
35
+ return 0
36
+
37
+ config_file = os.path.expanduser("~/.config/fish/config.fish")
38
+
39
+ # 检查文件内容是否已定义但未加载
40
+ if os.path.exists(config_file):
41
+ with open(config_file, 'r') as config:
42
+ if "function fish_command_not_found" in config.read():
43
+ print("fish_command_not_found函数已定义但未加载,请执行: source ~/.config/fish/config.fish")
44
+ return 0
45
+
46
+ # 创建config.fish文件如果不存在
47
+ os.makedirs(os.path.dirname(config_file), exist_ok=True)
48
+
49
+ # 追加函数定义到config.fish
50
+ with open(config_file, 'a') as config:
51
+ config.write("""
52
+ function fish_command_not_found
53
+ commandline -r (jss $argv)
54
+ end
55
+
56
+ function __fish_command_not_found_handler --on-event fish_command_not_found
57
+ fish_command_not_found $argv
58
+ end
59
+ """)
60
+ print("Fish shell命令补全功能已安装到config.fish,请执行: source ~/.config/fish/config.fish")
61
+ return 0
32
62
 
33
63
 
34
64
  def process_request(request: str) -> Optional[str]:
@@ -97,9 +127,7 @@ Output: find . -name "*.py"
97
127
  prefix = f"Current path: {current_path}\n"
98
128
  prefix += f"Current shell: {shell}\n"
99
129
 
100
- with yaspin(text="正在生成命令...", color="cyan") as spinner:
101
- result = model.chat_until_success(prefix + request)
102
- spinner.ok("✅ 命令生成成功")
130
+ result = model.chat_until_success(prefix + request)
103
131
 
104
132
  # 提取命令
105
133
  if result and isinstance(result, str):
@@ -108,8 +136,7 @@ Output: find . -name "*.py"
108
136
 
109
137
  return None
110
138
 
111
- except Exception as e:
112
- PrettyOutput.print(f"处理请求失败: {str(e)}", OutputType.WARNING)
139
+ except Exception:
113
140
  return None
114
141
 
115
142
  def main():
@@ -123,6 +150,7 @@ Example:
123
150
  %(prog)s "Find all Python files in the current directory"
124
151
  %(prog)s "Compress all jpg images"
125
152
  %(prog)s "Find documents modified in the last week"
153
+ %(prog)s install
126
154
  """)
127
155
 
128
156
  # 修改为可选参数,添加从stdin读取的支持
@@ -131,21 +159,34 @@ Example:
131
159
  nargs='?', # 设置为可选参数
132
160
  help="描述您想要执行的操作(用自然语言描述),如果未提供则从标准输入读取"
133
161
  )
162
+
163
+ # 添加install子命令
164
+ parser.add_argument(
165
+ "--install",
166
+ action="store_true",
167
+ help="安装fish shell的命令补全功能"
168
+ )
134
169
 
135
170
  # 解析参数
136
171
  args = parser.parse_args()
137
172
 
173
+ # 处理install命令
174
+ if args.install:
175
+ return install_fish_completion()
176
+
177
+ should_run = False
178
+
138
179
  # 添加标准输入处理
139
180
  if not args.request:
140
181
  # 检查是否在交互式终端中运行
141
182
  args.request = get_multiline_input(tip="请输入您要执行的功能:")
142
-
183
+ should_run = True
143
184
  # 处理请求
144
185
  command = process_request(args.request)
145
186
 
146
187
  # 输出结果
147
188
  if command:
148
- execute_command(command) # 显示并执行命令
189
+ execute_command(command, should_run) # 显示并执行命令
149
190
  return 0
150
191
  else:
151
192
  return 1
@@ -2,7 +2,6 @@ from typing import Dict, Any
2
2
  import os
3
3
  from jarvis.jarvis_code_agent.code_agent import CodeAgent
4
4
  from jarvis.jarvis_git_utils.git_commiter import GitCommitTool
5
- from jarvis.jarvis_code_analysis.code_review import CodeReviewTool, extract_code_report
6
5
  from jarvis.jarvis_utils.git_utils import get_latest_commit_hash, has_uncommitted_changes
7
6
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
8
7
 
@@ -69,23 +68,6 @@ class CreateCodeAgentTool:
69
68
  # Get new commit hash after development
70
69
  end_commit = get_latest_commit_hash()
71
70
 
72
- # Step 3: Code Review
73
- PrettyOutput.print("开始代码审查...", OutputType.INFO)
74
- reviewer = CodeReviewTool()
75
- review_result = reviewer.execute({
76
- "review_type": "range",
77
- "start_commit": start_commit,
78
- "end_commit": end_commit,
79
- "root_dir": root_dir
80
- })
81
-
82
- if not review_result["success"]:
83
- return {
84
- "success": False,
85
- "stderr": "Code review failed: " + review_result["stderr"],
86
- "stdout": ""
87
- }
88
-
89
71
  # Step 4: Generate Summary
90
72
  summary = f"""开发总结:
91
73
 
@@ -95,8 +77,6 @@ class CreateCodeAgentTool:
95
77
  需求:
96
78
  {requirement}
97
79
 
98
- 代码审查结果:
99
- {extract_code_report(review_result["stdout"])}
100
80
  """
101
81
 
102
82
  return {
@@ -36,7 +36,8 @@ class FindMethodologyTool:
36
36
  }
37
37
 
38
38
  with yaspin(text="搜索相关方法论...", color="cyan") as spinner:
39
- methodology_prompt = load_methodology(args["query"])
39
+ with spinner.hidden():
40
+ methodology_prompt = load_methodology(args["query"])
40
41
 
41
42
  if methodology_prompt:
42
43
  spinner.text = "找到相关方法论"
@@ -17,7 +17,8 @@ from jarvis.jarvis_utils.config import (
17
17
  )
18
18
  from jarvis.jarvis_utils.embedding import get_context_token_count
19
19
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
20
- from jarvis.jarvis_utils.utils import ct, ot, init_env
20
+ from jarvis.jarvis_utils.utils import init_env
21
+ from jarvis.jarvis_utils.tag import ot, ct
21
22
  from jarvis.jarvis_mcp.stdio_mcp_client import StdioMcpClient
22
23
  from jarvis.jarvis_mcp.sse_mcp_client import SSEMcpClient
23
24
  from jarvis.jarvis_mcp import McpClient