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