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.

Files changed (103) hide show
  1. {jarvis_ai_assistant-0.1.154/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.156}/PKG-INFO +45 -14
  2. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/README.md +44 -13
  3. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/pyproject.toml +2 -1
  4. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/setup.py +2 -1
  5. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/__init__.py +1 -1
  6. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/__init__.py +1 -1
  7. jarvis_ai_assistant-0.1.156/src/jarvis/jarvis_agent/builtin_input_handler.py +51 -0
  8. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/jarvis.py +6 -0
  9. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/patch.py +65 -37
  10. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_agent/code_agent.py +6 -1
  11. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/code_review.py +5 -5
  12. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_git_utils/git_commiter.py +2 -1
  13. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform/base.py +2 -1
  14. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform_manager/main.py +41 -0
  15. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_smart_shell/main.py +68 -27
  16. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/create_code_agent.py +0 -20
  17. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/find_methodology.py +2 -1
  18. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/registry.py +2 -1
  19. 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
  20. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/config.py +26 -8
  21. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/input.py +34 -20
  22. jarvis_ai_assistant-0.1.156/src/jarvis/jarvis_utils/tag.py +21 -0
  23. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/utils.py +0 -22
  24. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156/src/jarvis_ai_assistant.egg-info}/PKG-INFO +45 -14
  25. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +2 -0
  26. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis_ai_assistant.egg-info/entry_points.txt +1 -0
  27. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/LICENSE +0 -0
  28. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/MANIFEST.in +0 -0
  29. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/setup.cfg +0 -0
  30. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
  31. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/main.py +0 -0
  32. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  33. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  34. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  35. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  36. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  37. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  38. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  39. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  40. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  41. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  42. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  43. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  44. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  45. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  46. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  47. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  48. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  49. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  50. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  51. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  52. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  53. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  54. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  55. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_dev/main.py +0 -0
  56. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  57. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_git_details/main.py +0 -0
  58. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  59. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_git_squash/main.py +0 -0
  60. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/base.py +0 -0
  61. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/cpp.py +0 -0
  62. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/go.py +0 -0
  63. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/python.py +0 -0
  64. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/registry.py +0 -0
  65. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_lsp/rust.py +0 -0
  66. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  67. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  68. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  69. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_methodology/main.py +0 -0
  70. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  71. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  72. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform/__init__.py +0 -0
  73. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform/kimi.py +0 -0
  74. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform/registry.py +0 -0
  75. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  76. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  77. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  78. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/__init__.py +0 -0
  79. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
  80. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  81. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/base.py +0 -0
  82. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/chdir.py +0 -0
  83. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/code_plan.py +0 -0
  84. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  85. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  86. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  87. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/file_operation.py +0 -0
  88. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
  89. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/methodology.py +0 -0
  90. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/read_code.py +0 -0
  91. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  92. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/search_web.py +0 -0
  93. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  94. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/__init__.py +0 -0
  95. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/embedding.py +0 -0
  96. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  97. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  98. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/globals.py +0 -0
  99. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/methodology.py +0 -0
  100. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis/jarvis_utils/output.py +0 -0
  101. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  102. {jarvis_ai_assistant-0.1.154 → jarvis_ai_assistant-0.1.156}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  103. {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.154
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
- | 核心配置 | `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 | 最大连续工具调用次数 |
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
- | 核心配置 | `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 | 最大连续工具调用次数 |
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.154"
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.154",
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
  ],
@@ -1,3 +1,3 @@
1
1
  """Jarvis AI Assistant"""
2
2
 
3
- __version__ = "0.1.154"
3
+ __version__ = "0.1.156"
@@ -15,7 +15,7 @@ from jarvis.jarvis_utils.methodology import load_methodology
15
15
  from jarvis.jarvis_utils.globals import make_agent_name, set_agent, delete_agent
16
16
  from jarvis.jarvis_utils.input import get_multiline_input
17
17
  from jarvis.jarvis_utils.config import get_max_token_count
18
- from jarvis.jarvis_utils.utils import ct, ot
18
+ from jarvis.jarvis_utils.tag import ct, ot
19
19
  from jarvis.jarvis_utils.utils import user_confirm
20
20
 
21
21
  from jarvis.jarvis_platform.registry import PlatformRegistry
@@ -0,0 +1,51 @@
1
+ import re
2
+ from typing import Any, Tuple
3
+ from jarvis.jarvis_utils.config import get_replace_map
4
+
5
+
6
+
7
+ def builtin_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
8
+ """
9
+ 处理内置的特殊输入标记,并追加相应的提示词
10
+
11
+ 参数:
12
+ user_input: 用户输入
13
+ agent: 代理对象
14
+
15
+ 返回:
16
+ Tuple[str, bool]: 处理后的输入和是否需要进一步处理
17
+ """
18
+ # 查找特殊标记
19
+ special_tags = re.findall(r"'<([^>]+)>'", user_input)
20
+
21
+ if not special_tags:
22
+ return user_input, False
23
+
24
+ # 获取替换映射表
25
+ replace_map = get_replace_map()
26
+ # 处理每个标记
27
+ for tag in special_tags:
28
+
29
+ # 优先处理特殊标记
30
+ if tag == "Summary":
31
+ agent._summarize_and_clear_history()
32
+ return "", True
33
+ elif tag == "Clear":
34
+ agent.clear()
35
+ return "", True
36
+
37
+ processed_tag = set()
38
+ add_on_prompt = ""
39
+
40
+ # 处理普通替换标记
41
+ if tag in replace_map:
42
+ processed_tag.add(tag)
43
+ if "append" in replace_map[tag] and replace_map[tag]["append"] and tag not in processed_tag:
44
+ user_input = user_input.replace(f"'<{tag}>'", "")
45
+ add_on_prompt += replace_map[tag]["template"] + "\n"
46
+ else:
47
+ user_input = user_input.replace(f"'<{tag}>'", replace_map[tag]["template"])
48
+
49
+ agent.set_addon_prompt(add_on_prompt)
50
+
51
+ return user_input, False
@@ -114,6 +114,7 @@ def main() -> None:
114
114
  parser = argparse.ArgumentParser(description='Jarvis AI assistant')
115
115
  parser.add_argument('-p', '--platform', type=str, help='Platform to use')
116
116
  parser.add_argument('-m', '--model', type=str, help='Model to use')
117
+ parser.add_argument('-t', '--task', type=str, help='Directly input task content from command line')
117
118
  args = parser.parse_args()
118
119
 
119
120
  try:
@@ -126,6 +127,11 @@ def main() -> None:
126
127
  need_summary=False
127
128
  )
128
129
 
130
+ # 优先处理命令行直接传入的任务
131
+ if args.task:
132
+ agent.run(args.task)
133
+ sys.exit(0)
134
+
129
135
  tasks = _load_tasks()
130
136
  if tasks and (selected_task := _select_task(tasks)):
131
137
  PrettyOutput.print(f"执行任务: {selected_task}", OutputType.INFO)
@@ -15,7 +15,8 @@ from jarvis.jarvis_utils.git_utils import get_commits_between, get_latest_commit
15
15
  from jarvis.jarvis_utils.globals import add_read_file_record, has_read_file
16
16
  from jarvis.jarvis_utils.input import get_multiline_input
17
17
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
18
- from jarvis.jarvis_utils.utils import ct, ot, get_file_line_count, user_confirm
18
+ from jarvis.jarvis_utils.utils import get_file_line_count, user_confirm
19
+ from jarvis.jarvis_utils.tag import ot, ct
19
20
 
20
21
 
21
22
  class PatchOutputHandler(OutputHandler):
@@ -153,6 +154,13 @@ def apply_patch(output_str: str, agent: Any) -> str:
153
154
  spinner.fail("❌")
154
155
  return f"以下文件未读取: {not_read_file},应用补丁存在风险,请先读取文件后再生成补丁"
155
156
 
157
+ # 检查是否有文件在Git仓库外
158
+ in_git_repo = True
159
+ for filepath in patches.keys():
160
+ if not _is_file_in_git_repo(filepath):
161
+ in_git_repo = False
162
+ break
163
+
156
164
  # 按文件逐个处理
157
165
  for filepath, patch_content in patches.items():
158
166
  try:
@@ -177,46 +185,50 @@ def apply_patch(output_str: str, agent: Any) -> str:
177
185
  spinner.write(f"✅ 文件 {filepath} 回滚完成")
178
186
 
179
187
  final_ret = ""
180
- diff = get_diff()
181
- if diff:
182
- PrettyOutput.print(diff, OutputType.CODE, lang="diff")
183
- with spinner.hidden():
184
- commited = handle_commit_workflow()
185
- if commited:
186
- # 获取提交信息
187
- end_hash = get_latest_commit_hash()
188
- commits = get_commits_between(start_hash, end_hash)
189
-
190
- # 添加提交信息到final_ret
191
- if commits:
192
- final_ret += "✅ 补丁已应用\n"
193
- final_ret += "# 提交信息:\n"
194
- for commit_hash, commit_message in commits:
195
- final_ret += f"- {commit_hash[:7]}: {commit_message}\n"
196
-
197
- final_ret += f"# 应用补丁:\n```diff\n{diff}\n```"
198
-
199
- # 增加代码变更分析和错误提示
200
-
201
- addon_prompt = "1. 请调用静态检查工具(如有)检查以上变更是否引入了潜在错误\n"
202
- addon_prompt += "2. 如果发现致命的代码错误,请立即开始修复\n"
203
- addon_prompt += "3. 如果发现性能、风格等问题,要询问用户是否需要立即修复\n"
204
- addon_prompt += "\n\n"
205
- addon_prompt += "如果没有问题,请继续进行下一步修改\n"
206
- addon_prompt += f"如果用户的需求已经完成,请终止,不要输出新的 {ot('PATCH')},不要实现任何超出用户需求外的内容\n"
207
- addon_prompt += "如果有任何信息不清楚,调用工具获取信息\n"
208
- addon_prompt += "每次响应必须且只能包含一个操作\n"
209
-
210
- agent.set_addon_prompt(addon_prompt)
188
+ if in_git_repo:
189
+ diff = get_diff()
190
+ if diff:
191
+ PrettyOutput.print(diff, OutputType.CODE, lang="diff")
192
+ with spinner.hidden():
193
+ commited = handle_commit_workflow()
194
+ if commited:
195
+ # 获取提交信息
196
+ end_hash = get_latest_commit_hash()
197
+ commits = get_commits_between(start_hash, end_hash)
198
+
199
+ # 添加提交信息到final_ret
200
+ if commits:
201
+ final_ret += " 补丁已应用\n"
202
+ final_ret += "# 提交信息:\n"
203
+ for commit_hash, commit_message in commits:
204
+ final_ret += f"- {commit_hash[:7]}: {commit_message}\n"
205
+
206
+ final_ret += f"# 应用补丁:\n```diff\n{diff}\n```"
207
+
208
+ # 增加代码变更分析和错误提示
209
+ addon_prompt = "1. 请调用静态检查工具(如有)检查以上变更是否引入了潜在错误\n"
210
+ addon_prompt += "2. 如果发现致命的代码错误,请立即开始修复\n"
211
+ addon_prompt += "3. 如果发现性能、风格等问题,要询问用户是否需要立即修复\n"
212
+ addon_prompt += "\n\n"
213
+ addon_prompt += "如果没有问题,请继续进行下一步修改\n"
214
+ addon_prompt += f"如果用户的需求已经完成,请终止,不要输出新的 {ot('PATCH')},不要实现任何超出用户需求外的内容\n"
215
+ addon_prompt += "如果有任何信息不清楚,调用工具获取信息\n"
216
+ addon_prompt += "每次响应必须且只能包含一个操作\n"
217
+
218
+ agent.set_addon_prompt(addon_prompt)
211
219
 
220
+ else:
221
+ final_ret += "✅ 补丁已应用(没有新的提交)"
212
222
  else:
213
- final_ret += " 补丁已应用(没有新的提交)"
223
+ final_ret += " 补丁应用被拒绝\n"
224
+ final_ret += f"# 补丁预览:\n```diff\n{diff}\n```"
214
225
  else:
215
- final_ret += "❌ 补丁应用被拒绝\n"
216
- final_ret += f"# 补丁预览:\n```diff\n{diff}\n```"
226
+ commited = False
227
+ final_ret += " 没有要提交的更改\n"
217
228
  else:
218
- commited = False
219
- final_ret += " 没有要提交的更改\n"
229
+ # 对于Git仓库外的文件,直接返回成功
230
+ final_ret += " 补丁已应用(文件不在Git仓库中)"
231
+ commited = True
220
232
  # 用户确认最终结果
221
233
  with spinner.hidden():
222
234
  if commited:
@@ -231,6 +243,22 @@ def apply_patch(output_str: str, agent: Any) -> str:
231
243
  return final_ret
232
244
 
233
245
 
246
+ def _is_file_in_git_repo(filepath: str) -> bool:
247
+ """检查文件是否在当前Git仓库中"""
248
+ import subprocess
249
+ try:
250
+ # 获取Git仓库根目录
251
+ repo_root = subprocess.run(
252
+ ['git', 'rev-parse', '--show-toplevel'],
253
+ capture_output=True,
254
+ text=True
255
+ ).stdout.strip()
256
+
257
+ # 检查文件路径是否在仓库根目录下
258
+ return os.path.abspath(filepath).startswith(os.path.abspath(repo_root))
259
+ except:
260
+ return False
261
+
234
262
  def revert_file(filepath: str):
235
263
  """增强版git恢复,处理新文件"""
236
264
  import subprocess
@@ -354,6 +354,8 @@ def main() -> None:
354
354
  help='Target platform name', default=None)
355
355
  parser.add_argument('-m', '--model', type=str,
356
356
  help='Model name to use', default=None)
357
+ parser.add_argument('-r', '--requirement', type=str,
358
+ help='Requirement to process', default=None)
357
359
  args = parser.parse_args()
358
360
 
359
361
  curr_dir = os.getcwd()
@@ -361,7 +363,10 @@ def main() -> None:
361
363
  PrettyOutput.print(f"当前目录: {git_dir}", OutputType.INFO)
362
364
 
363
365
  try:
364
- user_input = get_multiline_input("请输入你的需求(输入空行退出):")
366
+ if args.requirement:
367
+ user_input = args.requirement
368
+ else:
369
+ user_input = get_multiline_input("请输入你的需求(输入空行退出):")
365
370
  if not user_input:
366
371
  sys.exit(0)
367
372
  agent = CodeAgent(platform=args.platform,
@@ -13,7 +13,8 @@ from jarvis.jarvis_agent import Agent
13
13
  from jarvis.jarvis_utils.config import INPUT_WINDOW_REVERSE_SIZE, get_max_input_token_count
14
14
  from jarvis.jarvis_utils.embedding import get_context_token_count
15
15
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
16
- from jarvis.jarvis_utils.utils import ct, ot, init_env
16
+ from jarvis.jarvis_utils.utils import init_env
17
+ from jarvis.jarvis_utils.tag import ot, ct
17
18
  from jarvis.jarvis_code_analysis.checklists.loader import get_language_checklist
18
19
 
19
20
  class CodeReviewTool:
@@ -559,7 +560,7 @@ class CodeReviewTool:
559
560
  {ct("REPORT")}""",
560
561
  output_handler=[tool_registry],
561
562
  platform=PlatformRegistry().get_thinking_platform(),
562
- auto_complete=True
563
+ auto_complete=False
563
564
  )
564
565
 
565
566
  # Determine if we need to split the diff due to size
@@ -616,9 +617,8 @@ class CodeReviewTool:
616
617
  complete_prompt = user_prompt + "\n\n代码差异内容:\n```diff\n" + diff_output + "\n```"
617
618
 
618
619
  # Run the agent with the prompt
619
- with yaspin(text="正在分析代码变更...", color="cyan") as spinner:
620
- result = agent.run(complete_prompt)
621
- spinner.ok("✅")
620
+
621
+ result = agent.run(complete_prompt)
622
622
  finally:
623
623
  # Clean up the temporary file
624
624
  if os.path.exists(temp_file_path):
@@ -14,7 +14,8 @@ from jarvis.jarvis_utils.config import INPUT_WINDOW_REVERSE_SIZE, get_max_input_
14
14
  from jarvis.jarvis_utils.embedding import get_context_token_count
15
15
  from jarvis.jarvis_utils.git_utils import find_git_root, has_uncommitted_changes
16
16
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
17
- from jarvis.jarvis_utils.utils import ct, ot, init_env
17
+ from jarvis.jarvis_utils.utils import init_env
18
+ from jarvis.jarvis_utils.tag import ot, ct
18
19
 
19
20
 
20
21
  class GitCommitTool:
@@ -3,7 +3,8 @@ import re
3
3
  from typing import List, Tuple
4
4
  from jarvis.jarvis_utils.globals import clear_read_file_record
5
5
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
6
- from jarvis.jarvis_utils.utils import ct, ot, get_context_token_count, while_success, while_true
6
+ from jarvis.jarvis_utils.utils import get_context_token_count, while_success, while_true
7
+ from jarvis.jarvis_utils.tag import ot, ct
7
8
 
8
9
 
9
10
  class BasePlatform(ABC):
@@ -1,3 +1,4 @@
1
+ import os
1
2
  from jarvis.jarvis_platform.registry import PlatformRegistry
2
3
  import asyncio
3
4
  from fastapi import FastAPI, HTTPException
@@ -61,6 +62,7 @@ def chat_with_model(platform_name: str, model_name: str):
61
62
  platform.set_model_name(model_name)
62
63
  platform.set_suppress_output(False)
63
64
  PrettyOutput.print(f"连接到 {platform_name} 平台 {model_name} 模型", OutputType.SUCCESS)
65
+ PrettyOutput.print("可用命令: /bye - 退出聊天, /clear - 清除会话, /upload - 上传文件, /shell - 执行shell命令", OutputType.INFO)
64
66
 
65
67
  # Start conversation loop
66
68
  while True:
@@ -86,6 +88,45 @@ def chat_with_model(platform_name: str, model_name: str):
86
88
  PrettyOutput.print(f"清除会话失败: {str(e)}", OutputType.ERROR)
87
89
  continue
88
90
 
91
+ # Check if it is an upload command
92
+ if user_input.strip().startswith("/upload"):
93
+ try:
94
+ file_path = user_input.strip()[8:].strip()
95
+ if not file_path:
96
+ PrettyOutput.print("请指定要上传的文件路径,例如: /upload /path/to/file 或 /upload \"/path/with spaces/file\"", OutputType.WARNING)
97
+ continue
98
+
99
+ # Remove quotes if present
100
+ if (file_path.startswith('"') and file_path.endswith('"')) or (file_path.startswith("'") and file_path.endswith("'")):
101
+ file_path = file_path[1:-1]
102
+
103
+ PrettyOutput.print(f"正在上传文件: {file_path}", OutputType.INFO)
104
+ if platform.upload_files([file_path]):
105
+ PrettyOutput.print("文件上传成功", OutputType.SUCCESS)
106
+ else:
107
+ PrettyOutput.print("文件上传失败", OutputType.ERROR)
108
+ except Exception as e:
109
+ PrettyOutput.print(f"上传文件失败: {str(e)}", OutputType.ERROR)
110
+ continue
111
+
112
+ # Check if it is a shell command
113
+ if user_input.strip().startswith("/shell"):
114
+ try:
115
+ command = user_input.strip()[6:].strip()
116
+ if not command:
117
+ PrettyOutput.print("请指定要执行的shell命令,例如: /shell ls -l", OutputType.WARNING)
118
+ continue
119
+
120
+ PrettyOutput.print(f"执行命令: {command}", OutputType.INFO)
121
+ return_code = os.system(command)
122
+ if return_code == 0:
123
+ PrettyOutput.print("命令执行完成", OutputType.SUCCESS)
124
+ else:
125
+ PrettyOutput.print(f"命令执行失败(返回码: {return_code})", OutputType.ERROR)
126
+ except Exception as ex:
127
+ PrettyOutput.print(f"执行命令失败: {str(ex)}", OutputType.ERROR)
128
+ continue
129
+
89
130
  try:
90
131
  # Send to model and get reply
91
132
  response = platform.chat_until_success(user_input)