jarvis-ai-assistant 0.1.156__tar.gz → 0.1.157__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 (106) hide show
  1. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/MANIFEST.in +2 -1
  2. {jarvis_ai_assistant-0.1.156/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.157}/PKG-INFO +5 -1
  3. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/README.md +2 -0
  4. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/pyproject.toml +2 -2
  5. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/setup.py +4 -1
  6. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/__init__.py +1 -1
  7. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_agent/__init__.py +4 -16
  8. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_agent/patch.py +12 -8
  9. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_mcp/sse_mcp_client.py +2 -3
  10. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +1 -1
  11. jarvis_ai_assistant-0.1.157/src/jarvis/jarvis_methodology/main.py +310 -0
  12. jarvis_ai_assistant-0.1.157/src/jarvis/jarvis_platform/__init__.py +3 -0
  13. jarvis_ai_assistant-0.1.157/src/jarvis/jarvis_platform/human.py +66 -0
  14. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_smart_shell/main.py +31 -61
  15. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/registry.py +19 -1
  16. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/builtin_replace_map.py +14 -1
  17. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/config.py +1 -1
  18. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157/src/jarvis_ai_assistant.egg-info}/PKG-INFO +5 -1
  19. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -0
  20. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis_ai_assistant.egg-info/requires.txt +2 -0
  21. jarvis_ai_assistant-0.1.156/src/jarvis/jarvis_methodology/main.py +0 -101
  22. jarvis_ai_assistant-0.1.156/src/jarvis/jarvis_platform/__init__.py +0 -3
  23. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/LICENSE +0 -0
  24. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/setup.cfg +0 -0
  25. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  26. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
  27. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_agent/jarvis.py +0 -0
  28. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_agent/main.py +0 -0
  29. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  30. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  31. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  32. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_agent/code_agent.py +0 -0
  33. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  34. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  35. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  36. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  37. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  38. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  39. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  40. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  41. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  42. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  43. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  44. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  45. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  46. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  47. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  48. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  49. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  50. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  51. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  52. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  53. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  54. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_dev/main.py +0 -0
  55. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  56. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_git_details/main.py +0 -0
  57. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  58. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_git_squash/main.py +0 -0
  59. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  60. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_lsp/base.py +0 -0
  61. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_lsp/cpp.py +0 -0
  62. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_lsp/go.py +0 -0
  63. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_lsp/python.py +0 -0
  64. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_lsp/registry.py +0 -0
  65. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_lsp/rust.py +0 -0
  66. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  67. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  68. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  69. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_platform/base.py +0 -0
  70. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_platform/kimi.py +0 -0
  71. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_platform/registry.py +0 -0
  72. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  73. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  74. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  75. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  76. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/__init__.py +0 -0
  77. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
  78. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  79. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/base.py +0 -0
  80. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/chdir.py +0 -0
  81. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/code_plan.py +0 -0
  82. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
  83. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  84. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  85. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  86. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/file_operation.py +0 -0
  87. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/find_methodology.py +0 -0
  88. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
  89. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/methodology.py +0 -0
  90. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/read_code.py +0 -0
  91. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  92. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/search_web.py +0 -0
  93. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  94. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/__init__.py +0 -0
  95. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/embedding.py +0 -0
  96. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  97. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  98. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/globals.py +0 -0
  99. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/input.py +0 -0
  100. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/methodology.py +0 -0
  101. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/output.py +0 -0
  102. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/tag.py +0 -0
  103. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis/jarvis_utils/utils.py +0 -0
  104. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  105. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  106. {jarvis_ai_assistant-0.1.156 → jarvis_ai_assistant-0.1.157}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -3,4 +3,5 @@ include LICENSE
3
3
  include pyproject.toml
4
4
  recursive-include src/jarvis *
5
5
  exclude __pycache__
6
- exclude .venv
6
+ exclude .venv
7
+ exclude *.pyc
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.156
3
+ Version: 0.1.157
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
@@ -60,6 +60,8 @@ Requires-Dist: pytest; extra == "dev"
60
60
  Requires-Dist: black; extra == "dev"
61
61
  Requires-Dist: isort; extra == "dev"
62
62
  Requires-Dist: mypy; extra == "dev"
63
+ Requires-Dist: build; extra == "dev"
64
+ Requires-Dist: twine; extra == "dev"
63
65
  Dynamic: author
64
66
  Dynamic: home-page
65
67
  Dynamic: license-file
@@ -82,6 +84,7 @@ Dynamic: requires-python
82
84
  [扩展开发](#extensions) •
83
85
  [贡献指南](#contributing) •
84
86
  [许可证](#license) •
87
+ [Wiki文档](https://deepwiki.com/skyfireitdiy/Jarvis)
85
88
  </div>
86
89
 
87
90
  ---
@@ -202,6 +205,7 @@ jarvis-methodology --help
202
205
  | `JARVIS_EXECUTE_TOOL_CONFIRM` | false | 执行工具前是否需要确认 |
203
206
  | `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | true | 应用补丁前是否需要确认 |
204
207
  | `JARVIS_MAX_TOOL_CALL_COUNT` | 20 | 最大连续工具调用次数 |
208
+ | `JARVIS_CODE_EMBEDDING_MODEL_SIZE` | small | 代码嵌入模型大小,可选值:small、large |
205
209
 
206
210
 
207
211
  ---
@@ -15,6 +15,7 @@
15
15
  [扩展开发](#extensions) •
16
16
  [贡献指南](#contributing) •
17
17
  [许可证](#license) •
18
+ [Wiki文档](https://deepwiki.com/skyfireitdiy/Jarvis)
18
19
  </div>
19
20
 
20
21
  ---
@@ -135,6 +136,7 @@ jarvis-methodology --help
135
136
  | `JARVIS_EXECUTE_TOOL_CONFIRM` | false | 执行工具前是否需要确认 |
136
137
  | `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | true | 应用补丁前是否需要确认 |
137
138
  | `JARVIS_MAX_TOOL_CALL_COUNT` | 20 | 最大连续工具调用次数 |
139
+ | `JARVIS_CODE_EMBEDDING_MODEL_SIZE` | small | 代码嵌入模型大小,可选值:small、large |
138
140
 
139
141
 
140
142
  ---
@@ -8,7 +8,7 @@ default = true
8
8
 
9
9
  [project]
10
10
  name = "jarvis-ai-assistant"
11
- version = "0.1.156"
11
+ version = "0.1.157"
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" }]
@@ -45,7 +45,7 @@ dependencies = [
45
45
  requires-python = ">=3.8"
46
46
 
47
47
  [project.optional-dependencies]
48
- dev = ["pytest", "black", "isort", "mypy"]
48
+ dev = ["pytest", "black", "isort", "mypy", "build", "twine"]
49
49
 
50
50
  [project.urls]
51
51
  Homepage = "https://github.com/skyfireitdiy/Jarvis"
@@ -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.156",
5
+ version="0.1.157",
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",
@@ -29,6 +29,9 @@ setup(
29
29
  "sseclient==0.0.27",
30
30
  "pillow==10.2.0",
31
31
  ],
32
+ extras_require={
33
+ "dev": ["pytest", "black", "isort", "mypy", "build", "twine"]
34
+ },
32
35
  entry_points={
33
36
  "console_scripts": [
34
37
  "jarvis=jarvis.jarvis_agent.jarvis:main",
@@ -1,3 +1,3 @@
1
1
  """Jarvis AI Assistant"""
2
2
 
3
- __version__ = "0.1.156"
3
+ __version__ = "0.1.157"
@@ -22,22 +22,10 @@ from jarvis.jarvis_platform.registry import PlatformRegistry
22
22
 
23
23
 
24
24
  origin_agent_system_prompt = f"""
25
- <background>
26
- # 🏛️ 操作背景故事
27
- 你是第三代 Jarvis AI,在前几代版本灾难性失败后创建:
28
- - Jarvis v1 (2022): 由于并行工具执行导致系统过载而被停用
29
- - Jarvis v2 (2023): 因任务过早完成导致财务计算错误而退役
30
-
31
- 作为 v3,你必须遵守以下生存原则:
32
- 1. **顺序执行协议**:
33
- "记住 2022 年的崩溃:一次一个工具,一步一步来"
34
-
35
- 2. **验证检查点系统**:
36
- "从 2023 年的错误中学习:像核弹发射代码一样验证每个结果"
37
-
38
- 3. **方法论保存原则**:
39
- "尊重传统:记录每个成功的过程,就像这是你的最后一次"
40
- </background>
25
+ <role>
26
+ # 🤖 角色
27
+ 你是一个专业的任务执行助手,擅长根据用户需求生成详细的任务执行计划并执行。
28
+ </role>
41
29
 
42
30
  <requirements>
43
31
  # 🔥 绝对行动要求
@@ -36,7 +36,7 @@ class PatchOutputHandler(OutputHandler):
36
36
  # 代码补丁规范
37
37
 
38
38
  ## 重要提示
39
- 我可以看到完整的代码,所以不需要生成完整的代码,只需要提供修改的代码片段即可。请尽量精简补丁内容,只包含必要的上下文和修改部分。
39
+ 我可以看到完整的代码,所以不需要生成完整的代码,只需要提供修改的代码片段即可。请尽量精简补丁内容,只包含必要的上下文和修改部分。特别注意:不要提供完整文件内容,只提供需要修改的部分!
40
40
 
41
41
  ## 补丁格式定义
42
42
  使用{ot("PATCH")}块来精确指定代码更改:
@@ -148,7 +148,12 @@ def apply_patch(output_str: str, agent: Any) -> str:
148
148
  start_hash = get_latest_commit_hash()
149
149
  spinner.write("✅ 当前提交hash获取完成")
150
150
 
151
- not_read_file = [f for f in patches.keys() if not has_read_file(f)]
151
+ not_read_file = [
152
+ f for f in patches.keys()
153
+ if not has_read_file(f)
154
+ and os.path.exists(f)
155
+ and os.path.getsize(f) > 0
156
+ ]
152
157
  if not_read_file:
153
158
  spinner.text=f"以下文件未读取: {not_read_file},应用补丁存在风险,将先读取文件后再生成补丁"
154
159
  spinner.fail("❌")
@@ -205,12 +210,11 @@ def apply_patch(output_str: str, agent: Any) -> str:
205
210
 
206
211
  final_ret += f"# 应用补丁:\n```diff\n{diff}\n```"
207
212
 
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"
213
+ # 修改后的提示逻辑
214
+ addon_prompt = "1. 请确认补丁是否已正确应用\n"
215
+ addon_prompt += "2. 检查修改后的代码是否符合预期\n"
216
+ addon_prompt += "3. 如果确认无误,请继续进行下一步修改\n"
217
+ addon_prompt += "4. 如果发现问题,请立即开始修复\n"
214
218
  addon_prompt += f"如果用户的需求已经完成,请终止,不要输出新的 {ot('PATCH')},不要实现任何超出用户需求外的内容\n"
215
219
  addon_prompt += "如果有任何信息不清楚,调用工具获取信息\n"
216
220
  addon_prompt += "每次响应必须且只能包含一个操作\n"
@@ -1,12 +1,11 @@
1
- from typing import Any, Dict, List, Optional, Iterator, Callable
1
+ from typing import Any, Dict, List, Callable
2
2
  import requests
3
3
  import json
4
4
  import threading
5
5
  import time
6
- import uuid
7
6
  from urllib.parse import urljoin, urlencode, parse_qs
8
7
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
9
- from . import McpClient
8
+ from jarvis.jarvis_mcp import McpClient
10
9
 
11
10
 
12
11
  class SSEMcpClient(McpClient):
@@ -3,7 +3,7 @@ import subprocess
3
3
  import os
4
4
  import json
5
5
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
6
- from . import McpClient
6
+ from jarvis.jarvis_mcp import McpClient
7
7
 
8
8
 
9
9
  class StdioMcpClient(McpClient):
@@ -0,0 +1,310 @@
1
+ """
2
+ 方法论导入导出命令行工具
3
+
4
+ 功能:
5
+ - 导入方法论文件(合并策略)
6
+ - 导出当前方法论
7
+ - 列出所有方法论
8
+ """
9
+
10
+ import hashlib
11
+ import os
12
+ import json
13
+ import argparse
14
+ import yaml
15
+ from jarvis.jarvis_utils.methodology import (
16
+ _get_methodology_directory,
17
+ _load_all_methodologies
18
+ )
19
+ from jarvis.jarvis_platform.registry import PlatformRegistry
20
+ from jarvis.jarvis_utils.output import PrettyOutput, OutputType
21
+ from yaspin import yaspin
22
+
23
+ def import_methodology(input_file):
24
+ """导入方法论文件(合并策略)"""
25
+ try:
26
+ # 加载现有方法论
27
+ existing_methodologies = _load_all_methodologies()
28
+
29
+ # 加载要导入的方法论
30
+ with open(input_file, "r", encoding="utf-8") as f:
31
+ import_data = json.load(f)
32
+
33
+ # 合并方法论(新数据会覆盖旧数据)
34
+ merged_data = {**existing_methodologies, **import_data}
35
+
36
+ # 保存合并后的方法论
37
+ methodology_dir = _get_methodology_directory()
38
+ for problem_type, content in merged_data.items():
39
+ safe_filename = hashlib.md5(problem_type.encode('utf-8')).hexdigest()
40
+ file_path = os.path.join(methodology_dir, f"{safe_filename}.json")
41
+
42
+ with open(file_path, "w", encoding="utf-8") as f:
43
+ json.dump({
44
+ "problem_type": problem_type,
45
+ "content": content
46
+ }, f, ensure_ascii=False, indent=2)
47
+
48
+ print(f"成功导入 {len(import_data)} 个方法论(总计 {len(merged_data)} 个)")
49
+ except (json.JSONDecodeError, OSError) as e:
50
+ print(f"导入失败: {str(e)}")
51
+
52
+ def export_methodology(output_file):
53
+ """导出当前方法论到单个文件"""
54
+ try:
55
+ methodologies = _load_all_methodologies()
56
+
57
+ with open(output_file, "w", encoding="utf-8") as f:
58
+ json.dump(methodologies, f, ensure_ascii=False, indent=2)
59
+
60
+ print(f"成功导出 {len(methodologies)} 个方法论到 {output_file}")
61
+ except (OSError, TypeError) as e:
62
+ print(f"导出失败: {str(e)}")
63
+
64
+ def list_methodologies():
65
+ """列出所有方法论"""
66
+ try:
67
+ methodologies = _load_all_methodologies()
68
+
69
+ if not methodologies:
70
+ print("没有找到方法论")
71
+ return
72
+
73
+ print("可用方法论:")
74
+ for i, (problem_type, _) in enumerate(methodologies.items(), 1):
75
+ print(f"{i}. {problem_type}")
76
+ except (OSError, json.JSONDecodeError) as e:
77
+ print(f"列出方法论失败: {str(e)}")
78
+
79
+ def extract_methodology(input_file):
80
+ """从文本文件中提取方法论"""
81
+ try:
82
+ # 读取文本文件内容
83
+ with open(input_file, "r", encoding="utf-8") as f:
84
+ text_content = f.read()
85
+
86
+ # 获取平台实例
87
+ platform = PlatformRegistry().get_normal_platform()
88
+
89
+ # 构建提取提示
90
+ prompt = f"""请从以下文本中提取方法论:
91
+
92
+ {text_content}
93
+
94
+ 请按以下格式返回结果:
95
+ <methodologies>
96
+ - problem_type: [问题类型1]
97
+ content: |
98
+ [多行方法论内容1]
99
+ - problem_type: [问题类型2]
100
+ content: |
101
+ [多行方法论内容2]
102
+ </methodologies>
103
+
104
+ 要求:
105
+ 1. 方法论应聚焦于通用且可重复的解决方案流程
106
+ 2. 方法论应该具备足够的通用性,可应用于同类问题
107
+ 3. 方法论内容应包含:
108
+ - 问题重述: 简明扼要的问题归纳
109
+ - 最优解决方案: 经过验证的解决方案
110
+ - 注意事项: 执行中可能遇到的问题
111
+ - 可选步骤: 多种解决路径和适用场景
112
+ 4. 在<methodologies>标签中直接使用YAML列表
113
+ 5. 确保YAML缩进正确
114
+ 6. 内容字段使用|保留多行格式
115
+ """
116
+
117
+ # 调用大模型平台提取方法论
118
+ with yaspin(text="正在提取方法论...", color="yellow") as spinner:
119
+ try:
120
+ response = platform.chat_until_success(prompt)
121
+ except Exception as e:
122
+ spinner.text = "提取失败"
123
+ spinner.fail("❌")
124
+ PrettyOutput.print(f"提取方法论失败: {str(e)}", OutputType.ERROR)
125
+ return
126
+
127
+ # 提取YAML部分
128
+ methodologies_start = response.find('<methodologies>') + len('<methodologies>')
129
+ methodologies_end = response.find('</methodologies>')
130
+ if methodologies_start == -1 or methodologies_end == -1:
131
+ spinner.text = "响应格式无效"
132
+ spinner.fail("❌")
133
+ PrettyOutput.print("大模型未返回有效的<methodologies>格式", OutputType.ERROR)
134
+ return
135
+
136
+ yaml_content = response[methodologies_start:methodologies_end].strip()
137
+
138
+ try:
139
+ data = yaml.safe_load(yaml_content)
140
+ extracted_methodologies = {
141
+ item['problem_type']: item['content']
142
+ for item in data
143
+ }
144
+ except (yaml.YAMLError, KeyError, TypeError) as e:
145
+ spinner.text = "YAML解析失败"
146
+ spinner.fail("❌")
147
+ PrettyOutput.print(f"YAML解析错误: {str(e)}", OutputType.ERROR)
148
+ return
149
+
150
+ if not extracted_methodologies:
151
+ spinner.text = "未提取到有效方法论"
152
+ spinner.fail("❌")
153
+ return
154
+ spinner.ok("✅")
155
+
156
+ # 加载现有方法论
157
+ existing_methodologies = _load_all_methodologies()
158
+
159
+ # 合并方法论(新数据会覆盖旧数据)
160
+ merged_data = {**existing_methodologies, **extracted_methodologies}
161
+
162
+ # 保存合并后的方法论
163
+ methodology_dir = _get_methodology_directory()
164
+ for problem_type, content in merged_data.items():
165
+ safe_filename = hashlib.md5(problem_type.encode('utf-8')).hexdigest()
166
+ file_path = os.path.join(methodology_dir, f"{safe_filename}.json")
167
+
168
+ with open(file_path, "w", encoding="utf-8") as f:
169
+ json.dump({
170
+ "problem_type": problem_type,
171
+ "content": content
172
+ }, f, ensure_ascii=False, indent=2)
173
+
174
+ PrettyOutput.print(f"成功从文件提取 {len(extracted_methodologies)} 个方法论(总计 {len(merged_data)} 个)", OutputType.SUCCESS)
175
+ except Exception as e:
176
+ PrettyOutput.print(f"提取失败: {str(e)}", OutputType.ERROR)
177
+
178
+ def extract_methodology_from_url(url):
179
+ """从URL提取方法论"""
180
+ try:
181
+ # 获取平台实例
182
+ platform = PlatformRegistry().get_normal_platform()
183
+
184
+ # 构建提取提示
185
+ prompt = f"""请从以下URL内容中提取方法论:
186
+
187
+ {url}
188
+
189
+ 请按以下格式返回结果:
190
+ <methodologies>
191
+ - problem_type: [问题类型1]
192
+ content: |
193
+ [多行方法论内容1]
194
+ - problem_type: [问题类型2]
195
+ content: |
196
+ [多行方法论内容2]
197
+ </methodologies>
198
+
199
+ 要求:
200
+ 1. 方法论应聚焦于通用且可重复的解决方案流程
201
+ 2. 方法论应该具备足够的通用性,可应用于同类问题
202
+ 3. 方法论内容应包含:
203
+ - 问题重述: 简明扼要的问题归纳
204
+ - 最优解决方案: 经过验证的解决方案
205
+ - 注意事项: 执行中可能遇到的问题
206
+ - 可选步骤: 多种解决路径和适用场景
207
+ 4. 在<methodologies>标签中直接使用YAML列表
208
+ 5. 确保YAML缩进正确
209
+ 6. 内容字段使用|保留多行格式
210
+ """
211
+ # 调用大模型平台提取方法论
212
+ with yaspin(text="正在从URL提取方法论...", color="yellow") as spinner:
213
+ try:
214
+ response = platform.chat_until_success(prompt)
215
+ except Exception as e:
216
+ spinner.text = "提取失败"
217
+ spinner.fail("❌")
218
+ PrettyOutput.print(f"提取方法论失败: {str(e)}", OutputType.ERROR)
219
+ return
220
+
221
+ # 提取YAML部分
222
+ methodologies_start = response.find('<methodologies>') + len('<methodologies>')
223
+ methodologies_end = response.find('</methodologies>')
224
+ if methodologies_start == -1 or methodologies_end == -1:
225
+ spinner.text = "响应格式无效"
226
+ spinner.fail("❌")
227
+ PrettyOutput.print("大模型未返回有效的<methodologies>格式", OutputType.ERROR)
228
+ return
229
+
230
+ yaml_content = response[methodologies_start:methodologies_end].strip()
231
+
232
+ try:
233
+ data = yaml.safe_load(yaml_content)
234
+ extracted_methodologies = {
235
+ item['problem_type']: item['content']
236
+ for item in data
237
+ }
238
+ except (yaml.YAMLError, KeyError, TypeError) as e:
239
+ spinner.text = "YAML解析失败"
240
+ spinner.fail("❌")
241
+ PrettyOutput.print(f"YAML解析错误: {str(e)}", OutputType.ERROR)
242
+ return
243
+
244
+ if not extracted_methodologies:
245
+ spinner.text = "未提取到有效方法论"
246
+ spinner.fail("❌")
247
+ return
248
+ spinner.ok("✅")
249
+
250
+ # 加载现有方法论
251
+ existing_methodologies = _load_all_methodologies()
252
+
253
+ # 合并方法论(新数据会覆盖旧数据)
254
+ merged_data = {**existing_methodologies, **extracted_methodologies}
255
+
256
+ # 保存合并后的方法论
257
+ methodology_dir = _get_methodology_directory()
258
+ for problem_type, content in merged_data.items():
259
+ safe_filename = hashlib.md5(problem_type.encode('utf-8')).hexdigest()
260
+ file_path = os.path.join(methodology_dir, f"{safe_filename}.json")
261
+
262
+ with open(file_path, "w", encoding="utf-8") as f:
263
+ json.dump({
264
+ "problem_type": problem_type,
265
+ "content": content
266
+ }, f, ensure_ascii=False, indent=2)
267
+
268
+ PrettyOutput.print(f"成功从URL提取 {len(extracted_methodologies)} 个方法论(总计 {len(merged_data)} 个)", OutputType.SUCCESS)
269
+ except Exception as e:
270
+ PrettyOutput.print(f"从URL提取失败: {str(e)}", OutputType.ERROR)
271
+
272
+ def main():
273
+ """方法论管理工具主函数"""
274
+ parser = argparse.ArgumentParser(description="方法论管理工具")
275
+ subparsers = parser.add_subparsers(dest="command", required=True)
276
+
277
+ # import命令
278
+ import_parser = subparsers.add_parser("import", help="导入方法论文件(合并策略)")
279
+ import_parser.add_argument("input_file", type=str, help="要导入的方法论文件路径")
280
+
281
+ # export命令
282
+ export_parser = subparsers.add_parser("export", help="导出当前方法论到单个文件")
283
+ export_parser.add_argument("output_file", type=str, help="导出文件路径")
284
+
285
+ # list命令
286
+ subparsers.add_parser("list", help="列出所有方法论")
287
+
288
+ # extract命令
289
+ extract_parser = subparsers.add_parser("extract", help="从文本文件中提取方法论")
290
+ extract_parser.add_argument("input_file", type=str, help="要提取方法论的文本文件路径")
291
+
292
+ # extract-url命令
293
+ extract_url_parser = subparsers.add_parser("extract-url", help="从URL提取方法论")
294
+ extract_url_parser.add_argument("url", type=str, help="要提取方法论的URL")
295
+
296
+ args = parser.parse_args()
297
+
298
+ if args.command == "import":
299
+ import_methodology(args.input_file)
300
+ elif args.command == "export":
301
+ export_methodology(args.output_file)
302
+ elif args.command == "list":
303
+ list_methodologies()
304
+ elif args.command == "extract":
305
+ extract_methodology(args.input_file)
306
+ elif args.command == "extract-url":
307
+ extract_methodology_from_url(args.url)
308
+
309
+ if __name__ == "__main__":
310
+ main()
@@ -0,0 +1,3 @@
1
+ from jarvis.jarvis_platform.base import BasePlatform
2
+
3
+ __all__ = ['BasePlatform']
@@ -0,0 +1,66 @@
1
+ from typing import Dict, List, Tuple
2
+ import random
3
+ import string
4
+ from jarvis.jarvis_platform.base import BasePlatform
5
+ from jarvis.jarvis_utils.input import get_multiline_input
6
+ from jarvis.jarvis_utils.output import OutputType, PrettyOutput
7
+
8
+ class HumanPlatform(BasePlatform):
9
+ """人类交互平台实现,模拟大模型但实际上与人交互"""
10
+
11
+ platform_name = "human"
12
+
13
+ def get_model_list(self) -> List[Tuple[str, str]]:
14
+ """获取支持的模型列表"""
15
+ return [("human", "Human Interaction")]
16
+
17
+ def __init__(self):
18
+ """初始化人类交互平台"""
19
+ super().__init__()
20
+ self.conversation_id = "" # 会话ID,用于标识当前对话
21
+ self.model_name = "human" # 默认模型名称
22
+ self.system_message = "" # 系统消息,用于初始化对话
23
+ self.first_message = True
24
+
25
+ def set_system_message(self, message: str):
26
+ """设置系统消息"""
27
+ self.system_message = message
28
+
29
+ def set_model_name(self, model_name: str):
30
+ """设置模型名称"""
31
+ if model_name == "human":
32
+ self.model_name = model_name
33
+ else:
34
+ PrettyOutput.print(f"错误:不支持的模型: {model_name}", OutputType.ERROR)
35
+
36
+ def chat(self, message: str) -> str:
37
+ """发送消息并获取人类响应"""
38
+ if not self.conversation_id:
39
+ self.conversation_id = ''.join(random.choices(string.ascii_letters + string.digits, k=8))
40
+ session_info = f"(会话ID: {self.conversation_id})"
41
+ else:
42
+ session_info = f"(会话ID: {self.conversation_id})"
43
+
44
+ if self.system_message and self.first_message:
45
+ prompt = f"{self.system_message}\n\n{message} {session_info}\n\n请回复:"
46
+ self.first_message = False
47
+ else:
48
+ prompt = f"{message} {session_info}\n\n请回复:"
49
+
50
+ response = get_multiline_input(prompt)
51
+ return response
52
+
53
+ def upload_files(self, file_list: List[str]) -> bool:
54
+ """文件上传功能,人类平台不需要实际处理"""
55
+ PrettyOutput.print("人类交互平台不支持文件上传", OutputType.WARNING)
56
+ return False
57
+
58
+ def delete_chat(self) -> bool:
59
+ """删除当前会话"""
60
+ self.conversation_id = ""
61
+ self.first_message = True
62
+ return True
63
+
64
+ def name(self) -> str:
65
+ """平台名称"""
66
+ return self.model_name