jarvis-ai-assistant 0.1.154__tar.gz → 0.1.156__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.154/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.156}/PKG-INFO +45 -14
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/README.md +44 -13
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/pyproject.toml +2 -1
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/setup.py +2 -1
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/__init__.py +1 -1
- jarvis_ai_assistant-0.1.156/src/jarvis/jarvis_agent/builtin_input_handler.py +51 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/jarvis.py +6 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/patch.py +65 -37
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_agent/code_agent.py +6 -1
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/code_review.py +5 -5
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_git_utils/git_commiter.py +2 -1
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform/base.py +2 -1
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform_manager/main.py +41 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_smart_shell/main.py +68 -27
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/create_code_agent.py +0 -20
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/find_methodology.py +2 -1
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/registry.py +2 -1
- jarvis_ai_assistant-0.1.154/src/jarvis/jarvis_agent/builtin_input_handler.py → jarvis_ai_assistant-0.1.156/src/jarvis/jarvis_utils/builtin_replace_map.py +55 -57
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/config.py +26 -8
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/input.py +34 -20
- jarvis_ai_assistant-0.1.156/src/jarvis/jarvis_utils/tag.py +21 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/utils.py +0 -22
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156/src/jarvis_ai_assistant.egg-info}/PKG-INFO +45 -14
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +2 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis_ai_assistant.egg-info/entry_points.txt +1 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_dev/main.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_git_details/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_git_details/main.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_git_squash/main.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/base.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/cpp.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/go.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/python.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/registry.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/rust.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_mcp/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_methodology/main.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_multi_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform/kimi.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/chdir.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/code_plan.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/execute_script.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/file_operation.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/read_code.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/search_web.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/embedding.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/file_processors.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/git_utils.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/output.py +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
- {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/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.156
|
|
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
|
|
@@ -189,19 +189,19 @@ jarvis-methodology --help
|
|
|
189
189
|
|
|
190
190
|
## ⚙️ 配置说明 <a id="configuration"></a>
|
|
191
191
|
### 环境变量配置
|
|
192
|
-
|
|
|
193
|
-
|
|
194
|
-
|
|
|
195
|
-
|
|
|
196
|
-
|
|
|
197
|
-
|
|
|
198
|
-
|
|
|
199
|
-
|
|
|
200
|
-
|
|
|
201
|
-
|
|
|
202
|
-
|
|
|
203
|
-
|
|
|
204
|
-
|
|
|
192
|
+
| 变量名称 | 默认值 | 说明 |
|
|
193
|
+
|----------|--------|------|
|
|
194
|
+
| `JARVIS_MAX_TOKEN_COUNT` | 102400000 | 上下文窗口的最大token数量 |
|
|
195
|
+
| `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 |
|
|
196
|
+
| `JARVIS_AUTO_COMPLETE` | false | 是否启用自动完成功能(任务判定完成的时候会自动终止) |
|
|
197
|
+
| `JARVIS_SHELL_NAME` | bash | 系统shell名称 |
|
|
198
|
+
| `JARVIS_PLATFORM` | yuanbao | 默认AI平台 |
|
|
199
|
+
| `JARVIS_MODEL` | deep_seek_v3 | 默认模型 |
|
|
200
|
+
| `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 |
|
|
201
|
+
| `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 |
|
|
202
|
+
| `JARVIS_EXECUTE_TOOL_CONFIRM` | false | 执行工具前是否需要确认 |
|
|
203
|
+
| `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | true | 应用补丁前是否需要确认 |
|
|
204
|
+
| `JARVIS_MAX_TOOL_CALL_COUNT` | 20 | 最大连续工具调用次数 |
|
|
205
205
|
|
|
206
206
|
|
|
207
207
|
---
|
|
@@ -227,6 +227,37 @@ jarvis-methodology --help
|
|
|
227
227
|
| virtual_tty | 控制虚拟终端执行各种操作,如启动终端、输入命令、获取输出等。 |
|
|
228
228
|
|
|
229
229
|
|
|
230
|
+
### 命令替换功能
|
|
231
|
+
Jarvis支持使用特殊标记`'<tag>'`来触发命令替换功能,其中`tag`是预定义的标记名称。系统会自动将这些标记替换为预定义的模板内容。
|
|
232
|
+
|
|
233
|
+
#### 内置标记
|
|
234
|
+
| 标记 | 功能 |
|
|
235
|
+
|------|------|
|
|
236
|
+
| `'Summary'` | 总结当前会话并清空历史记录 |
|
|
237
|
+
| `'Clear'` | 清空当前会话 |
|
|
238
|
+
| `'CodeBase'` | 查询代码库 |
|
|
239
|
+
| `'Web'` | 网页搜索 |
|
|
240
|
+
| `'Methodology'` | 查找相关方法论 |
|
|
241
|
+
| `'Plan'` | 生成代码修改计划 |
|
|
242
|
+
| `'FindRelatedFiles'` | 查找相关文件 |
|
|
243
|
+
| `'FindMethodology'` | 查找方法论 |
|
|
244
|
+
| `'Dev'` | 调用create_code_agent开发需求 |
|
|
245
|
+
| `'Fix'` | 修复问题 |
|
|
246
|
+
|
|
247
|
+
#### 自定义替换
|
|
248
|
+
可以通过在`~/.jarvis/replace_map.yaml`文件中添加自定义替换规则:
|
|
249
|
+
```yaml
|
|
250
|
+
tag_name:
|
|
251
|
+
template: "替换后的内容"
|
|
252
|
+
description: "标记描述"
|
|
253
|
+
append: false # 可选,true表示追加到输入末尾,false表示直接替换
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
#### 文件路径补全
|
|
258
|
+
在交互式输入中,输入`@`可以触发文件路径补全功能,支持模糊匹配。
|
|
259
|
+
|
|
260
|
+
|
|
230
261
|
### 工具位置
|
|
231
262
|
- 内置工具:`src/jarvis/tools/`
|
|
232
263
|
- 用户工具:`~/.jarvis/tools/`
|
|
@@ -122,19 +122,19 @@ jarvis-methodology --help
|
|
|
122
122
|
|
|
123
123
|
## ⚙️ 配置说明 <a id="configuration"></a>
|
|
124
124
|
### 环境变量配置
|
|
125
|
-
|
|
|
126
|
-
|
|
127
|
-
|
|
|
128
|
-
|
|
|
129
|
-
|
|
|
130
|
-
|
|
|
131
|
-
|
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
135
|
-
|
|
|
136
|
-
|
|
|
137
|
-
|
|
|
125
|
+
| 变量名称 | 默认值 | 说明 |
|
|
126
|
+
|----------|--------|------|
|
|
127
|
+
| `JARVIS_MAX_TOKEN_COUNT` | 102400000 | 上下文窗口的最大token数量 |
|
|
128
|
+
| `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 |
|
|
129
|
+
| `JARVIS_AUTO_COMPLETE` | false | 是否启用自动完成功能(任务判定完成的时候会自动终止) |
|
|
130
|
+
| `JARVIS_SHELL_NAME` | bash | 系统shell名称 |
|
|
131
|
+
| `JARVIS_PLATFORM` | yuanbao | 默认AI平台 |
|
|
132
|
+
| `JARVIS_MODEL` | deep_seek_v3 | 默认模型 |
|
|
133
|
+
| `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 |
|
|
134
|
+
| `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 |
|
|
135
|
+
| `JARVIS_EXECUTE_TOOL_CONFIRM` | false | 执行工具前是否需要确认 |
|
|
136
|
+
| `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | true | 应用补丁前是否需要确认 |
|
|
137
|
+
| `JARVIS_MAX_TOOL_CALL_COUNT` | 20 | 最大连续工具调用次数 |
|
|
138
138
|
|
|
139
139
|
|
|
140
140
|
---
|
|
@@ -160,6 +160,37 @@ jarvis-methodology --help
|
|
|
160
160
|
| virtual_tty | 控制虚拟终端执行各种操作,如启动终端、输入命令、获取输出等。 |
|
|
161
161
|
|
|
162
162
|
|
|
163
|
+
### 命令替换功能
|
|
164
|
+
Jarvis支持使用特殊标记`'<tag>'`来触发命令替换功能,其中`tag`是预定义的标记名称。系统会自动将这些标记替换为预定义的模板内容。
|
|
165
|
+
|
|
166
|
+
#### 内置标记
|
|
167
|
+
| 标记 | 功能 |
|
|
168
|
+
|------|------|
|
|
169
|
+
| `'Summary'` | 总结当前会话并清空历史记录 |
|
|
170
|
+
| `'Clear'` | 清空当前会话 |
|
|
171
|
+
| `'CodeBase'` | 查询代码库 |
|
|
172
|
+
| `'Web'` | 网页搜索 |
|
|
173
|
+
| `'Methodology'` | 查找相关方法论 |
|
|
174
|
+
| `'Plan'` | 生成代码修改计划 |
|
|
175
|
+
| `'FindRelatedFiles'` | 查找相关文件 |
|
|
176
|
+
| `'FindMethodology'` | 查找方法论 |
|
|
177
|
+
| `'Dev'` | 调用create_code_agent开发需求 |
|
|
178
|
+
| `'Fix'` | 修复问题 |
|
|
179
|
+
|
|
180
|
+
#### 自定义替换
|
|
181
|
+
可以通过在`~/.jarvis/replace_map.yaml`文件中添加自定义替换规则:
|
|
182
|
+
```yaml
|
|
183
|
+
tag_name:
|
|
184
|
+
template: "替换后的内容"
|
|
185
|
+
description: "标记描述"
|
|
186
|
+
append: false # 可选,true表示追加到输入末尾,false表示直接替换
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
#### 文件路径补全
|
|
191
|
+
在交互式输入中,输入`@`可以触发文件路径补全功能,支持模糊匹配。
|
|
192
|
+
|
|
193
|
+
|
|
163
194
|
### 工具位置
|
|
164
195
|
- 内置工具:`src/jarvis/tools/`
|
|
165
196
|
- 用户工具:`~/.jarvis/tools/`
|
|
@@ -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.156"
|
|
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.
|
|
5
|
+
version="0.1.156",
|
|
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
|
],
|
{jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/__init__.py
RENAMED
|
@@ -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.
|
|
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
|
{jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/jarvis.py
RENAMED
|
@@ -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)
|
{jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/patch.py
RENAMED
|
@@ -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
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
216
|
-
final_ret +=
|
|
226
|
+
commited = False
|
|
227
|
+
final_ret += "❌ 没有要提交的更改\n"
|
|
217
228
|
else:
|
|
218
|
-
|
|
219
|
-
final_ret += "
|
|
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
|
-
|
|
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
|
|
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=
|
|
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
|
-
|
|
620
|
-
|
|
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
|
|
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:
|
{jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform/base.py
RENAMED
|
@@ -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
|
|
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)
|