jarvis-ai-assistant 0.1.179__tar.gz → 0.1.181__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of jarvis-ai-assistant might be problematic. Click here for more details.
- {jarvis_ai_assistant-0.1.179/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.181}/PKG-INFO +45 -51
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/README.md +43 -50
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/pyproject.toml +2 -3
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/setup.py +6 -4
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_agent/code_agent.py +34 -106
- jarvis_ai_assistant-0.1.181/src/jarvis/jarvis_data/config_schema.json +230 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_dev/main.py +66 -112
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_git_utils/git_commiter.py +1 -1
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_platform/base.py +4 -2
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_platform/kimi.py +0 -22
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_platform/openai.py +0 -15
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_platform/yuanbao.py +0 -24
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_smart_shell/main.py +6 -3
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/code_plan.py +1 -3
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/edit_file.py +1 -1
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/execute_script.py +31 -8
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/registry.py +41 -35
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -48
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/config.py +61 -20
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/git_utils.py +89 -16
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/utils.py +131 -62
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181/src/jarvis_ai_assistant.egg-info}/PKG-INFO +45 -51
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -2
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -2
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis_ai_assistant.egg-info/requires.txt +1 -0
- jarvis_ai_assistant-0.1.179/src/jarvis/jarvis_tools/ask_codebase.py +0 -294
- jarvis_ai_assistant-0.1.179/src/jarvis/jarvis_tools/find_methodology.py +0 -73
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_agent/jarvis.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_agent/lint.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_data/huggingface.tar.gz +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_event/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_git_details/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_git_details/main.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_git_squash/main.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_mcp/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_methodology/main.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_multi_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_platform/human.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_platform_manager/main.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/chdir.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/cli/main.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/file_operation.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/read_code.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/search_web.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/embedding.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/file_processors.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/input.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/output.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis/jarvis_utils/tag.py +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.1.179 → jarvis_ai_assistant-0.1.181}/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.
|
|
3
|
+
Version: 0.1.181
|
|
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
|
|
@@ -55,6 +55,7 @@ Requires-Dist: python-Levenshtein==0.25.1
|
|
|
55
55
|
Requires-Dist: pillow==10.2.0
|
|
56
56
|
Requires-Dist: openai==1.78.1
|
|
57
57
|
Requires-Dist: tabulate==0.9.0
|
|
58
|
+
Requires-Dist: pyte==0.8.2
|
|
58
59
|
Provides-Extra: dev
|
|
59
60
|
Requires-Dist: pytest; extra == "dev"
|
|
60
61
|
Requires-Dist: black; extra == "dev"
|
|
@@ -114,7 +115,7 @@ pip3 install jarvis-ai-assistant
|
|
|
114
115
|
|
|
115
116
|
### 最小化配置
|
|
116
117
|
|
|
117
|
-
将以下配置写入到`~/.jarvis/
|
|
118
|
+
将以下配置写入到`~/.jarvis/config.yaml`文件中。
|
|
118
119
|
|
|
119
120
|
#### 腾讯元宝
|
|
120
121
|
```yaml
|
|
@@ -122,9 +123,9 @@ JARVIS_PLATFORM: yuanbao
|
|
|
122
123
|
JARVIS_MODEL: deep_seek_v3
|
|
123
124
|
JARVIS_THINKING_PLATFORM: yuanbao
|
|
124
125
|
JARVIS_THINKING_MODEL: deep_seek
|
|
125
|
-
|
|
126
|
-
YUANBAO_COOKIES: <元宝cookies>
|
|
127
|
-
YUANBAO_AGENT_ID: <元宝AgentID>
|
|
126
|
+
ENV:
|
|
127
|
+
YUANBAO_COOKIES: <元宝cookies>
|
|
128
|
+
YUANBAO_AGENT_ID: <元宝AgentID>
|
|
128
129
|
```
|
|
129
130
|
|
|
130
131
|
元宝cookies以及AgentID获取方式:
|
|
@@ -141,7 +142,8 @@ JARVIS_MODEL: kimi
|
|
|
141
142
|
JARVIS_THINKING_PLATFORM: kimi
|
|
142
143
|
JARVIS_THINKING_MODEL: k1
|
|
143
144
|
|
|
144
|
-
|
|
145
|
+
ENV:
|
|
146
|
+
KIMI_API_KEY: <Kimi API KEY>
|
|
145
147
|
```
|
|
146
148
|
|
|
147
149
|
Kimi API Key获取方式:
|
|
@@ -166,7 +168,7 @@ OPENAI_API_BASE: https://api.openai.com/v1 # 可选,默认为官方API地址
|
|
|
166
168
|
1. `OPENAI_API_KEY`: 必填。
|
|
167
169
|
2. `OPENAI_API_BASE`: 可选,用于自定义API端点
|
|
168
170
|
|
|
169
|
-
以上配置编写到`~/.jarvis/
|
|
171
|
+
以上配置编写到`~/.jarvis/config.yaml`文件中。
|
|
170
172
|
|
|
171
173
|
支持的模型可通过`jarvis-platform-manager --list-models`查看完整列表。
|
|
172
174
|
|
|
@@ -191,27 +193,10 @@ OPENAI_API_BASE: https://api.openai.com/v1 # 可选,默认为官方API地址
|
|
|
191
193
|
---
|
|
192
194
|
|
|
193
195
|
## ⚙️ 配置说明 <a id="configuration"></a>
|
|
194
|
-
###
|
|
195
|
-
配置文件支持两种格式:
|
|
196
|
-
1. **YAML格式(推荐)**:
|
|
197
|
-
```yaml
|
|
198
|
-
JARVIS_PLATFORM: yuanbao
|
|
199
|
-
JARVIS_MODEL: deep_seek_v3
|
|
200
|
-
YUANBAO_COOKIES: "your_cookies_here"
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
2. **传统键值对格式**:
|
|
204
|
-
```
|
|
205
|
-
JARVIS_PLATFORM=yuanbao
|
|
206
|
-
JARVIS_MODEL=deep_seek_v3
|
|
207
|
-
YUANBAO_COOKIES=your_cookies_here
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
系统会自动检测格式并处理。当检测到传统格式时,会自动转换为YAML格式并备份原文件。
|
|
211
|
-
|
|
212
|
-
### 环境变量配置
|
|
196
|
+
### 配置项
|
|
213
197
|
| 变量名称 | 默认值 | 说明 |
|
|
214
198
|
|----------|--------|------|
|
|
199
|
+
| `ENV` | {} | 环境变量配置,用于设置系统环境变量 |
|
|
215
200
|
| `JARVIS_MAX_TOKEN_COUNT` | 960000 | 上下文窗口的最大token数量 |
|
|
216
201
|
| `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 |
|
|
217
202
|
| `JARVIS_AUTO_COMPLETE` | false | 是否启用自动完成功能(任务判定完成的时候会自动终止) |
|
|
@@ -228,16 +213,26 @@ OPENAI_API_BASE: https://api.openai.com/v1 # 可选,默认为官方API地址
|
|
|
228
213
|
| `JARVIS_PRETTY_OUTPUT` | false | 是否启用PrettyOutput |
|
|
229
214
|
| `JARVIS_GIT_COMMIT_PROMPT` | "" | 自定义git提交信息生成提示模板 |
|
|
230
215
|
| `JARVIS_PRINT_PROMPT` | false | 是否打印提示 |
|
|
216
|
+
| `JARVIS_USE_METHODOLOGY` | true | 是否启用方法论功能 |
|
|
217
|
+
| `JARVIS_USE_ANALYSIS` | true | 是否启用任务分析功能 |
|
|
218
|
+
| `JARVIS_DATA_PATH` | ~/.jarvis | Jarvis数据存储目录路径 |
|
|
231
219
|
|
|
232
|
-
所有配置编写到`~/.jarvis/
|
|
220
|
+
所有配置编写到`~/.jarvis/config.yaml`文件中即可生效。
|
|
233
221
|
|
|
222
|
+
### 配置文件格式
|
|
223
|
+
配置文件仅支持YAML格式:
|
|
224
|
+
```yaml
|
|
225
|
+
JARVIS_PLATFORM: yuanbao
|
|
226
|
+
JARVIS_MODEL: deep_seek_v3
|
|
227
|
+
ENV:
|
|
228
|
+
YUANBAO_COOKIES: "your_cookies_here"
|
|
229
|
+
```
|
|
234
230
|
|
|
235
231
|
---
|
|
236
232
|
## 🛠️ 工具说明 <a id="tools"></a>
|
|
237
233
|
### 内置工具
|
|
238
234
|
| 工具名称 | 描述 |
|
|
239
235
|
|----------|------|
|
|
240
|
-
| ask_codebase | 智能代码库查询和分析,用于定位功能所在文件和理解单点实现,适合查询特定功能位置和实现原理 |
|
|
241
236
|
| ask_user | 交互式用户输入收集 |
|
|
242
237
|
| chdir | 更改当前工作目录 |
|
|
243
238
|
| rewrite_file | 文件重写工具,用于完全重写或创建文件,提供完整的文件内容替换 |
|
|
@@ -248,7 +243,6 @@ OPENAI_API_BASE: https://api.openai.com/v1 # 可选,默认为官方API地址
|
|
|
248
243
|
| execute_script | 执行脚本并返回结果,支持任意解释器。 |
|
|
249
244
|
| file_analyzer | 分析文件内容并提取关键信息。支持的文件:文本文件、word文档、pdf文件、图片 |
|
|
250
245
|
| file_operation | 文件批量操作工具,可批量读写多个文件,支持文本文件,适用于需要同时处理多个文件的场景(读取配置文件、保存生成内容等) |
|
|
251
|
-
| find_methodology | 方法论查找工具,用于在执行过程中查看历史方法论辅助决策 |
|
|
252
246
|
| methodology | 方法论管理工具,支持添加、更新和删除操作 |
|
|
253
247
|
| read_code | 代码阅读与分析工具,用于读取源代码文件并添加行号,针对代码文件优化,提供更好的格式化输出和行号显示,适用于代码分析、审查和理解代码实现的场景 |
|
|
254
248
|
| read_webpage | 读取网页内容并分析 |
|
|
@@ -274,15 +268,20 @@ Jarvis支持使用特殊标记`'<tag>'`来触发命令替换功能,其中`tag`
|
|
|
274
268
|
| `'Fix'` | 修复问题 |
|
|
275
269
|
|
|
276
270
|
#### 自定义替换
|
|
277
|
-
|
|
271
|
+
可以通过以下方式配置自定义替换规则:
|
|
272
|
+
|
|
273
|
+
**配置文件**:
|
|
274
|
+
在`~/.jarvis/config.yaml`中添加`JARVIS_REPLACE_MAP`配置项:
|
|
278
275
|
```yaml
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
276
|
+
JARVIS_REPLACE_MAP:
|
|
277
|
+
tag_name:
|
|
278
|
+
template: "替换后的内容"
|
|
279
|
+
description: "标记描述"
|
|
280
|
+
append: false # 可选,true表示追加到输入末尾,false表示直接替换
|
|
283
281
|
```
|
|
284
282
|
|
|
285
283
|
|
|
284
|
+
|
|
286
285
|
#### 文件路径补全
|
|
287
286
|
在交互式输入中,输入`@`可以触发文件路径补全功能,支持模糊匹配。
|
|
288
287
|
|
|
@@ -342,27 +341,22 @@ class CustomTool:
|
|
|
342
341
|
|
|
343
342
|
|
|
344
343
|
### 添加MCP
|
|
345
|
-
MCP(模型上下文协议)
|
|
344
|
+
MCP(模型上下文协议)支持以下配置方式:
|
|
346
345
|
|
|
347
|
-
####
|
|
346
|
+
#### 配置文件
|
|
347
|
+
在`~/.jarvis/config.yaml`中添加`JARVIS_MCP`配置项:
|
|
348
348
|
```yaml
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
349
|
+
JARVIS_MCP:
|
|
350
|
+
- type: stdio # 或 sse/streamable
|
|
351
|
+
name: MCP名称
|
|
352
|
+
command: 可执行命令 # stdio模式必填
|
|
353
|
+
base_url: http://example.com/api # sse/streamable模式必填
|
|
354
|
+
args: [参数列表] # 可选
|
|
355
|
+
env: # 可选环境变量
|
|
356
|
+
KEY: VALUE
|
|
357
|
+
enable: true # 可选,默认为true
|
|
355
358
|
```
|
|
356
359
|
|
|
357
|
-
#### 远程MCP配置(`sse`模式)
|
|
358
|
-
```yaml
|
|
359
|
-
type: sse
|
|
360
|
-
name: MCP名称
|
|
361
|
-
base_url: http://example.com/api
|
|
362
|
-
auth_token: 认证令牌 # 可选
|
|
363
|
-
headers: # 可选HTTP头
|
|
364
|
-
X-Custom-Header: value
|
|
365
|
-
```
|
|
366
360
|
|
|
367
361
|
|
|
368
362
|
### 添加新大模型平台
|
|
@@ -45,7 +45,7 @@ pip3 install jarvis-ai-assistant
|
|
|
45
45
|
|
|
46
46
|
### 最小化配置
|
|
47
47
|
|
|
48
|
-
将以下配置写入到`~/.jarvis/
|
|
48
|
+
将以下配置写入到`~/.jarvis/config.yaml`文件中。
|
|
49
49
|
|
|
50
50
|
#### 腾讯元宝
|
|
51
51
|
```yaml
|
|
@@ -53,9 +53,9 @@ JARVIS_PLATFORM: yuanbao
|
|
|
53
53
|
JARVIS_MODEL: deep_seek_v3
|
|
54
54
|
JARVIS_THINKING_PLATFORM: yuanbao
|
|
55
55
|
JARVIS_THINKING_MODEL: deep_seek
|
|
56
|
-
|
|
57
|
-
YUANBAO_COOKIES: <元宝cookies>
|
|
58
|
-
YUANBAO_AGENT_ID: <元宝AgentID>
|
|
56
|
+
ENV:
|
|
57
|
+
YUANBAO_COOKIES: <元宝cookies>
|
|
58
|
+
YUANBAO_AGENT_ID: <元宝AgentID>
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
元宝cookies以及AgentID获取方式:
|
|
@@ -72,7 +72,8 @@ JARVIS_MODEL: kimi
|
|
|
72
72
|
JARVIS_THINKING_PLATFORM: kimi
|
|
73
73
|
JARVIS_THINKING_MODEL: k1
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
ENV:
|
|
76
|
+
KIMI_API_KEY: <Kimi API KEY>
|
|
76
77
|
```
|
|
77
78
|
|
|
78
79
|
Kimi API Key获取方式:
|
|
@@ -97,7 +98,7 @@ OPENAI_API_BASE: https://api.openai.com/v1 # 可选,默认为官方API地址
|
|
|
97
98
|
1. `OPENAI_API_KEY`: 必填。
|
|
98
99
|
2. `OPENAI_API_BASE`: 可选,用于自定义API端点
|
|
99
100
|
|
|
100
|
-
以上配置编写到`~/.jarvis/
|
|
101
|
+
以上配置编写到`~/.jarvis/config.yaml`文件中。
|
|
101
102
|
|
|
102
103
|
支持的模型可通过`jarvis-platform-manager --list-models`查看完整列表。
|
|
103
104
|
|
|
@@ -122,27 +123,10 @@ OPENAI_API_BASE: https://api.openai.com/v1 # 可选,默认为官方API地址
|
|
|
122
123
|
---
|
|
123
124
|
|
|
124
125
|
## ⚙️ 配置说明 <a id="configuration"></a>
|
|
125
|
-
###
|
|
126
|
-
配置文件支持两种格式:
|
|
127
|
-
1. **YAML格式(推荐)**:
|
|
128
|
-
```yaml
|
|
129
|
-
JARVIS_PLATFORM: yuanbao
|
|
130
|
-
JARVIS_MODEL: deep_seek_v3
|
|
131
|
-
YUANBAO_COOKIES: "your_cookies_here"
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
2. **传统键值对格式**:
|
|
135
|
-
```
|
|
136
|
-
JARVIS_PLATFORM=yuanbao
|
|
137
|
-
JARVIS_MODEL=deep_seek_v3
|
|
138
|
-
YUANBAO_COOKIES=your_cookies_here
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
系统会自动检测格式并处理。当检测到传统格式时,会自动转换为YAML格式并备份原文件。
|
|
142
|
-
|
|
143
|
-
### 环境变量配置
|
|
126
|
+
### 配置项
|
|
144
127
|
| 变量名称 | 默认值 | 说明 |
|
|
145
128
|
|----------|--------|------|
|
|
129
|
+
| `ENV` | {} | 环境变量配置,用于设置系统环境变量 |
|
|
146
130
|
| `JARVIS_MAX_TOKEN_COUNT` | 960000 | 上下文窗口的最大token数量 |
|
|
147
131
|
| `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 |
|
|
148
132
|
| `JARVIS_AUTO_COMPLETE` | false | 是否启用自动完成功能(任务判定完成的时候会自动终止) |
|
|
@@ -159,16 +143,26 @@ OPENAI_API_BASE: https://api.openai.com/v1 # 可选,默认为官方API地址
|
|
|
159
143
|
| `JARVIS_PRETTY_OUTPUT` | false | 是否启用PrettyOutput |
|
|
160
144
|
| `JARVIS_GIT_COMMIT_PROMPT` | "" | 自定义git提交信息生成提示模板 |
|
|
161
145
|
| `JARVIS_PRINT_PROMPT` | false | 是否打印提示 |
|
|
146
|
+
| `JARVIS_USE_METHODOLOGY` | true | 是否启用方法论功能 |
|
|
147
|
+
| `JARVIS_USE_ANALYSIS` | true | 是否启用任务分析功能 |
|
|
148
|
+
| `JARVIS_DATA_PATH` | ~/.jarvis | Jarvis数据存储目录路径 |
|
|
162
149
|
|
|
163
|
-
所有配置编写到`~/.jarvis/
|
|
150
|
+
所有配置编写到`~/.jarvis/config.yaml`文件中即可生效。
|
|
164
151
|
|
|
152
|
+
### 配置文件格式
|
|
153
|
+
配置文件仅支持YAML格式:
|
|
154
|
+
```yaml
|
|
155
|
+
JARVIS_PLATFORM: yuanbao
|
|
156
|
+
JARVIS_MODEL: deep_seek_v3
|
|
157
|
+
ENV:
|
|
158
|
+
YUANBAO_COOKIES: "your_cookies_here"
|
|
159
|
+
```
|
|
165
160
|
|
|
166
161
|
---
|
|
167
162
|
## 🛠️ 工具说明 <a id="tools"></a>
|
|
168
163
|
### 内置工具
|
|
169
164
|
| 工具名称 | 描述 |
|
|
170
165
|
|----------|------|
|
|
171
|
-
| ask_codebase | 智能代码库查询和分析,用于定位功能所在文件和理解单点实现,适合查询特定功能位置和实现原理 |
|
|
172
166
|
| ask_user | 交互式用户输入收集 |
|
|
173
167
|
| chdir | 更改当前工作目录 |
|
|
174
168
|
| rewrite_file | 文件重写工具,用于完全重写或创建文件,提供完整的文件内容替换 |
|
|
@@ -179,7 +173,6 @@ OPENAI_API_BASE: https://api.openai.com/v1 # 可选,默认为官方API地址
|
|
|
179
173
|
| execute_script | 执行脚本并返回结果,支持任意解释器。 |
|
|
180
174
|
| file_analyzer | 分析文件内容并提取关键信息。支持的文件:文本文件、word文档、pdf文件、图片 |
|
|
181
175
|
| file_operation | 文件批量操作工具,可批量读写多个文件,支持文本文件,适用于需要同时处理多个文件的场景(读取配置文件、保存生成内容等) |
|
|
182
|
-
| find_methodology | 方法论查找工具,用于在执行过程中查看历史方法论辅助决策 |
|
|
183
176
|
| methodology | 方法论管理工具,支持添加、更新和删除操作 |
|
|
184
177
|
| read_code | 代码阅读与分析工具,用于读取源代码文件并添加行号,针对代码文件优化,提供更好的格式化输出和行号显示,适用于代码分析、审查和理解代码实现的场景 |
|
|
185
178
|
| read_webpage | 读取网页内容并分析 |
|
|
@@ -205,15 +198,20 @@ Jarvis支持使用特殊标记`'<tag>'`来触发命令替换功能,其中`tag`
|
|
|
205
198
|
| `'Fix'` | 修复问题 |
|
|
206
199
|
|
|
207
200
|
#### 自定义替换
|
|
208
|
-
|
|
201
|
+
可以通过以下方式配置自定义替换规则:
|
|
202
|
+
|
|
203
|
+
**配置文件**:
|
|
204
|
+
在`~/.jarvis/config.yaml`中添加`JARVIS_REPLACE_MAP`配置项:
|
|
209
205
|
```yaml
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
206
|
+
JARVIS_REPLACE_MAP:
|
|
207
|
+
tag_name:
|
|
208
|
+
template: "替换后的内容"
|
|
209
|
+
description: "标记描述"
|
|
210
|
+
append: false # 可选,true表示追加到输入末尾,false表示直接替换
|
|
214
211
|
```
|
|
215
212
|
|
|
216
213
|
|
|
214
|
+
|
|
217
215
|
#### 文件路径补全
|
|
218
216
|
在交互式输入中,输入`@`可以触发文件路径补全功能,支持模糊匹配。
|
|
219
217
|
|
|
@@ -273,27 +271,22 @@ class CustomTool:
|
|
|
273
271
|
|
|
274
272
|
|
|
275
273
|
### 添加MCP
|
|
276
|
-
MCP(模型上下文协议)
|
|
274
|
+
MCP(模型上下文协议)支持以下配置方式:
|
|
277
275
|
|
|
278
|
-
####
|
|
276
|
+
#### 配置文件
|
|
277
|
+
在`~/.jarvis/config.yaml`中添加`JARVIS_MCP`配置项:
|
|
279
278
|
```yaml
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
279
|
+
JARVIS_MCP:
|
|
280
|
+
- type: stdio # 或 sse/streamable
|
|
281
|
+
name: MCP名称
|
|
282
|
+
command: 可执行命令 # stdio模式必填
|
|
283
|
+
base_url: http://example.com/api # sse/streamable模式必填
|
|
284
|
+
args: [参数列表] # 可选
|
|
285
|
+
env: # 可选环境变量
|
|
286
|
+
KEY: VALUE
|
|
287
|
+
enable: true # 可选,默认为true
|
|
286
288
|
```
|
|
287
289
|
|
|
288
|
-
#### 远程MCP配置(`sse`模式)
|
|
289
|
-
```yaml
|
|
290
|
-
type: sse
|
|
291
|
-
name: MCP名称
|
|
292
|
-
base_url: http://example.com/api
|
|
293
|
-
auth_token: 认证令牌 # 可选
|
|
294
|
-
headers: # 可选HTTP头
|
|
295
|
-
X-Custom-Header: value
|
|
296
|
-
```
|
|
297
290
|
|
|
298
291
|
|
|
299
292
|
### 添加新大模型平台
|
|
@@ -8,7 +8,7 @@ default = true
|
|
|
8
8
|
|
|
9
9
|
[project]
|
|
10
10
|
name = "jarvis-ai-assistant"
|
|
11
|
-
version = "0.1.
|
|
11
|
+
version = "0.1.181"
|
|
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" }]
|
|
@@ -41,6 +41,7 @@ dependencies = [
|
|
|
41
41
|
"pillow==10.2.0",
|
|
42
42
|
"openai==1.78.1",
|
|
43
43
|
"tabulate==0.9.0",
|
|
44
|
+
"pyte==0.8.2",
|
|
44
45
|
]
|
|
45
46
|
requires-python = ">=3.8"
|
|
46
47
|
|
|
@@ -65,7 +66,5 @@ jarvis-git-squash = "jarvis.jarvis_git_squash.main:main"
|
|
|
65
66
|
jarvis-multi-agent = "jarvis.jarvis_multi_agent.main:main"
|
|
66
67
|
jarvis-agent = "jarvis.jarvis_agent.main:main"
|
|
67
68
|
jarvis-tool = "jarvis.jarvis_tools.cli.main:main"
|
|
68
|
-
jarvis-ask-codebase = "jarvis.jarvis_tools.ask_codebase:main"
|
|
69
|
-
jac = "jarvis.jarvis_tools.ask_codebase:main"
|
|
70
69
|
jarvis-git-details = "jarvis.jarvis_git_details.main:main"
|
|
71
70
|
jarvis-methodology = "jarvis.jarvis_methodology.main:main"
|
|
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages
|
|
|
3
3
|
|
|
4
4
|
setup(
|
|
5
5
|
name="jarvis-ai-assistant",
|
|
6
|
-
version="0.1.
|
|
6
|
+
version="0.1.181",
|
|
7
7
|
author="skyfire",
|
|
8
8
|
author_email="skyfireitdiy@hotmail.com",
|
|
9
9
|
description="An AI assistant that uses various tools to interact with the system",
|
|
@@ -14,7 +14,10 @@ setup(
|
|
|
14
14
|
package_dir={"": "src"},
|
|
15
15
|
include_package_data=True,
|
|
16
16
|
package_data={
|
|
17
|
-
"jarvis": [
|
|
17
|
+
"jarvis": [
|
|
18
|
+
"jarvis_data/huggingface.tar.gz",
|
|
19
|
+
"jarvis_data/config_schema.json"
|
|
20
|
+
],
|
|
18
21
|
},
|
|
19
22
|
install_requires=[
|
|
20
23
|
"requests==2.32.3",
|
|
@@ -32,6 +35,7 @@ setup(
|
|
|
32
35
|
"pillow==10.2.0",
|
|
33
36
|
"openai==1.78.1",
|
|
34
37
|
"tabulate==0.9.0",
|
|
38
|
+
"pyte==0.8.2",
|
|
35
39
|
],
|
|
36
40
|
extras_require={
|
|
37
41
|
"dev": ["pytest", "black", "isort", "mypy", "build", "twine"]
|
|
@@ -52,8 +56,6 @@ setup(
|
|
|
52
56
|
"jarvis-multi-agent=jarvis.jarvis_multi_agent.main:main",
|
|
53
57
|
"jarvis-agent=jarvis.jarvis_agent.main:main",
|
|
54
58
|
"jarvis-tool=jarvis.jarvis_tools.cli.main:main",
|
|
55
|
-
"jarvis-ask-codebase=jarvis.jarvis_tools.ask_codebase:main",
|
|
56
|
-
"jac=jarvis.jarvis_tools.ask_codebase:main",
|
|
57
59
|
"jarvis-git-details=jarvis.jarvis_git_details.main:main",
|
|
58
60
|
"jarvis-methodology=jarvis.jarvis_methodology.main:main",
|
|
59
61
|
],
|
|
@@ -8,7 +8,7 @@ import argparse
|
|
|
8
8
|
import os
|
|
9
9
|
import subprocess
|
|
10
10
|
import sys
|
|
11
|
-
from typing import
|
|
11
|
+
from typing import List, Optional, Tuple
|
|
12
12
|
|
|
13
13
|
from yaspin import yaspin # type: ignore
|
|
14
14
|
|
|
@@ -24,12 +24,12 @@ from jarvis.jarvis_tools.registry import ToolRegistry
|
|
|
24
24
|
from jarvis.jarvis_utils.config import is_confirm_before_apply_patch
|
|
25
25
|
from jarvis.jarvis_utils.git_utils import (find_git_root, get_commits_between,
|
|
26
26
|
get_diff, get_diff_file_list,
|
|
27
|
-
get_latest_commit_hash,
|
|
27
|
+
get_latest_commit_hash, get_recent_commits_with_files,
|
|
28
28
|
handle_commit_workflow,
|
|
29
29
|
has_uncommitted_changes)
|
|
30
30
|
from jarvis.jarvis_utils.input import get_multiline_input
|
|
31
31
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
32
|
-
from jarvis.jarvis_utils.utils import init_env, user_confirm
|
|
32
|
+
from jarvis.jarvis_utils.utils import get_loc_stats, init_env, user_confirm
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
class CodeAgent:
|
|
@@ -47,11 +47,9 @@ class CodeAgent:
|
|
|
47
47
|
"execute_script",
|
|
48
48
|
"search_web",
|
|
49
49
|
"ask_user",
|
|
50
|
-
"ask_codebase",
|
|
51
50
|
"read_code",
|
|
52
51
|
"methodology",
|
|
53
52
|
"chdir",
|
|
54
|
-
"find_methodology",
|
|
55
53
|
"edit_file",
|
|
56
54
|
"rewrite_file"
|
|
57
55
|
])
|
|
@@ -75,6 +73,12 @@ class CodeAgent:
|
|
|
75
73
|
1. **项目分析**:分析项目结构,确定需修改的文件
|
|
76
74
|
2. **需求分析**:理解需求意图,选择影响最小的实现方案
|
|
77
75
|
3. **代码分析**:详细分析目标文件,禁止虚构现有代码
|
|
76
|
+
- 结构分析:优先使用 fd 命令或 find 工具快速定位文件和目录结构
|
|
77
|
+
- 内容搜索:优先使用 rg(ripgrep)进行函数、类、变量等内容的全文搜索,避免遗漏
|
|
78
|
+
- 依赖关系:如需分析依赖、调用关系,可结合 grep、ctags、pyan3 等工具辅助
|
|
79
|
+
- 代码阅读:使用 read_code 工具获取目标文件的完整内容或指定范围内容,禁止凭空假设代码
|
|
80
|
+
- 变更影响:如需分析变更影响范围,可结合 git diff、git log 等命令辅助判断
|
|
81
|
+
- 工具优先级:优先使用自动化工具,减少人工推断,确保分析结果准确
|
|
78
82
|
4. **方案设计**:确定最小变更方案,保持代码结构
|
|
79
83
|
5. **实施修改**:遵循"先读后写"原则,保持代码风格一致性
|
|
80
84
|
|
|
@@ -90,7 +94,6 @@ class CodeAgent:
|
|
|
90
94
|
- 对于简单的修改,可以使用execute_script工具执行shell命令完成
|
|
91
95
|
</code_engineer_guide>
|
|
92
96
|
"""
|
|
93
|
-
# Dynamically add ask_codebase based on task complexity if really needed
|
|
94
97
|
# 处理platform参数
|
|
95
98
|
platform_instance = (PlatformRegistry().create_platform(platform) # type: ignore
|
|
96
99
|
if platform
|
|
@@ -110,14 +113,6 @@ class CodeAgent:
|
|
|
110
113
|
],
|
|
111
114
|
need_summary=need_summary
|
|
112
115
|
)
|
|
113
|
-
self.agent.set_addon_prompt(
|
|
114
|
-
"请使用工具充分理解用户需求,然后根据需求一步步执行代码修改/开发,"
|
|
115
|
-
"如果不清楚要修改那些文件,可以使用ask_codebase工具,"
|
|
116
|
-
"以:xxxx功能在哪个文件中实现?类似句式提问。"
|
|
117
|
-
"所有代码修改任务都应优先使用edit_file工具,而非edit_file工具。"
|
|
118
|
-
"edit_file工具通过精确的搜索和替换实现代码编辑,"
|
|
119
|
-
"搜索文本需在目标文件中有且仅有一次精确匹配,确保修改的准确性。"
|
|
120
|
-
)
|
|
121
116
|
|
|
122
117
|
self.agent.set_after_tool_call_cb(self.after_tool_call_cb)
|
|
123
118
|
|
|
@@ -129,82 +124,8 @@ class CodeAgent:
|
|
|
129
124
|
"""
|
|
130
125
|
return self.root_dir
|
|
131
126
|
|
|
132
|
-
def get_loc_stats(self) -> str:
|
|
133
|
-
"""使用loc命令获取当前目录的代码统计信息
|
|
134
|
-
|
|
135
|
-
返回:
|
|
136
|
-
str: loc命令输出的原始字符串,失败时返回空字符串
|
|
137
|
-
"""
|
|
138
|
-
try:
|
|
139
|
-
result = subprocess.run(
|
|
140
|
-
['loc'],
|
|
141
|
-
cwd=self.root_dir,
|
|
142
|
-
capture_output=True,
|
|
143
|
-
text=True
|
|
144
|
-
)
|
|
145
|
-
return result.stdout if result.returncode == 0 else ""
|
|
146
|
-
except FileNotFoundError:
|
|
147
|
-
return ""
|
|
148
|
-
|
|
149
|
-
def get_recent_commits_with_files(self) -> List[Dict[str, Any]]:
|
|
150
|
-
"""获取最近5次提交的commit信息和文件清单
|
|
151
|
-
|
|
152
|
-
返回:
|
|
153
|
-
List[Dict[str, Any]]: 包含commit信息和文件清单的字典列表,格式为:
|
|
154
|
-
[
|
|
155
|
-
{
|
|
156
|
-
'hash': 提交hash,
|
|
157
|
-
'message': 提交信息,
|
|
158
|
-
'author': 作者,
|
|
159
|
-
'date': 提交日期,
|
|
160
|
-
'files': [修改的文件列表] (最多20个文件)
|
|
161
|
-
},
|
|
162
|
-
...
|
|
163
|
-
]
|
|
164
|
-
失败时返回空列表
|
|
165
|
-
"""
|
|
166
|
-
try:
|
|
167
|
-
# 获取最近5次提交的基本信息
|
|
168
|
-
result = subprocess.run(
|
|
169
|
-
['git', 'log', '-5', '--pretty=format:%H%n%s%n%an%n%ad'],
|
|
170
|
-
cwd=self.root_dir,
|
|
171
|
-
capture_output=True,
|
|
172
|
-
text=True
|
|
173
|
-
)
|
|
174
|
-
if result.returncode != 0:
|
|
175
|
-
return []
|
|
176
|
-
|
|
177
|
-
# 解析提交信息
|
|
178
|
-
commits = []
|
|
179
|
-
lines = result.stdout.splitlines()
|
|
180
|
-
for i in range(0, len(lines), 4):
|
|
181
|
-
if i + 3 >= len(lines):
|
|
182
|
-
break
|
|
183
|
-
commit = {
|
|
184
|
-
'hash': lines[i],
|
|
185
|
-
'message': lines[i+1],
|
|
186
|
-
'author': lines[i+2],
|
|
187
|
-
'date': lines[i+3],
|
|
188
|
-
'files': []
|
|
189
|
-
}
|
|
190
|
-
commits.append(commit)
|
|
191
|
-
|
|
192
|
-
# 获取每个提交的文件修改清单
|
|
193
|
-
for commit in commits:
|
|
194
|
-
files_result = subprocess.run(
|
|
195
|
-
['git', 'show', '--name-only', '--pretty=format:', commit['hash']],
|
|
196
|
-
cwd=self.root_dir,
|
|
197
|
-
capture_output=True,
|
|
198
|
-
text=True
|
|
199
|
-
)
|
|
200
|
-
if files_result.returncode == 0:
|
|
201
|
-
files = list(set(filter(None, files_result.stdout.splitlines())))
|
|
202
|
-
commit['files'] = files[:20] # 限制最多20个文件
|
|
203
127
|
|
|
204
|
-
return commits
|
|
205
128
|
|
|
206
|
-
except subprocess.CalledProcessError:
|
|
207
|
-
return []
|
|
208
129
|
|
|
209
130
|
def _init_env(self) -> None:
|
|
210
131
|
"""初始化环境,包括:
|
|
@@ -317,8 +238,8 @@ class CodeAgent:
|
|
|
317
238
|
start_commit = get_latest_commit_hash()
|
|
318
239
|
|
|
319
240
|
# 获取项目统计信息并附加到用户输入
|
|
320
|
-
loc_stats =
|
|
321
|
-
commits_info =
|
|
241
|
+
loc_stats = get_loc_stats()
|
|
242
|
+
commits_info = get_recent_commits_with_files()
|
|
322
243
|
|
|
323
244
|
project_info = []
|
|
324
245
|
if loc_stats:
|
|
@@ -331,8 +252,20 @@ class CodeAgent:
|
|
|
331
252
|
for i, commit in enumerate(commits_info)
|
|
332
253
|
)
|
|
333
254
|
project_info.append(f"最近提交:\n{commits_str}")
|
|
334
|
-
|
|
335
|
-
|
|
255
|
+
|
|
256
|
+
first_tip = """请严格遵循以下规范进行代码修改任务:
|
|
257
|
+
1. 每次响应仅执行一步操作,先分析再修改,避免一步多改。
|
|
258
|
+
2. 充分利用工具理解用户需求和现有代码,禁止凭空假设。
|
|
259
|
+
3. 如果不清楚要修改的文件,必须先分析并找出需要修改的文件,明确目标后再进行编辑。
|
|
260
|
+
4. 代码编辑任务优先使用 edit_file 工具,确保搜索文本在目标文件中有且仅有一次精确匹配,保证修改的准确性和安全性。
|
|
261
|
+
5. 如需大范围重写,才可使用 rewrite_file 工具。
|
|
262
|
+
6. 如遇信息不明,优先调用工具补充分析,不要主观臆断。
|
|
263
|
+
"""
|
|
264
|
+
|
|
265
|
+
if project_info:
|
|
266
|
+
enhanced_input = f"项目概况:\n" + "\n\n".join(project_info) + "\n\n" + first_tip + "\n\n任务描述:\n" + user_input
|
|
267
|
+
else:
|
|
268
|
+
enhanced_input = first_tip + "\n\n任务描述:\n" + user_input
|
|
336
269
|
|
|
337
270
|
try:
|
|
338
271
|
self.agent.run(enhanced_input)
|
|
@@ -379,21 +312,16 @@ class CodeAgent:
|
|
|
379
312
|
for file in modified_files
|
|
380
313
|
if get_lint_tools(file)
|
|
381
314
|
)
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
f"""
|
|
386
|
-
|
|
387
|
-
{
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
4. 在引入的警告和错误都被修复的前提下,如果用户的需求未完成,请继续修改代码,如果已经完成,请终止,不要实现任何超出用户需求外的内容
|
|
391
|
-
5. 如果有任何信息不明确,调用工具获取信息
|
|
392
|
-
6. 每次响应必须且只能包含一个操作
|
|
315
|
+
file_list = "\n".join(f" - {file}" for file in modified_files)
|
|
316
|
+
tool_info = f"建议使用以下lint工具进行检查:\n{lint_tools_info}" if lint_tools_info else ""
|
|
317
|
+
if lint_tools_info:
|
|
318
|
+
addon_prompt = f"""
|
|
319
|
+
请对以下修改的文件进行静态扫描:
|
|
320
|
+
{file_list}
|
|
321
|
+
{tool_info}
|
|
322
|
+
如果本次修改引入了警告和错误,请根据警告和错误信息修复代码
|
|
393
323
|
"""
|
|
394
|
-
|
|
395
|
-
agent.set_addon_prompt(addon_prompt)
|
|
396
|
-
|
|
324
|
+
agent.set_addon_prompt(addon_prompt)
|
|
397
325
|
else:
|
|
398
326
|
final_ret += "✅ 补丁已应用(没有新的提交)"
|
|
399
327
|
else:
|