jarvis-ai-assistant 0.1.131__py3-none-any.whl → 0.1.132__py3-none-any.whl
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.
- jarvis/__init__.py +1 -1
- jarvis/jarvis_agent/__init__.py +48 -29
- jarvis/jarvis_agent/patch.py +61 -43
- jarvis/jarvis_agent/shell_input_handler.py +1 -1
- jarvis/jarvis_code_agent/code_agent.py +87 -86
- jarvis/jarvis_dev/main.py +335 -626
- jarvis/jarvis_git_squash/main.py +10 -31
- jarvis/jarvis_multi_agent/__init__.py +19 -28
- jarvis/jarvis_platform/ai8.py +7 -32
- jarvis/jarvis_platform/base.py +2 -7
- jarvis/jarvis_platform/kimi.py +3 -144
- jarvis/jarvis_platform/ollama.py +54 -68
- jarvis/jarvis_platform/openai.py +0 -4
- jarvis/jarvis_platform/oyi.py +0 -75
- jarvis/jarvis_platform/yuanbao.py +264 -0
- jarvis/jarvis_rag/file_processors.py +138 -0
- jarvis/jarvis_rag/main.py +1305 -425
- jarvis/jarvis_tools/ask_codebase.py +205 -39
- jarvis/jarvis_tools/code_review.py +125 -99
- jarvis/jarvis_tools/execute_python_script.py +58 -0
- jarvis/jarvis_tools/execute_shell.py +13 -26
- jarvis/jarvis_tools/execute_shell_script.py +1 -1
- jarvis/jarvis_tools/file_analyzer.py +271 -0
- jarvis/jarvis_tools/file_operation.py +1 -1
- jarvis/jarvis_tools/find_caller.py +213 -0
- jarvis/jarvis_tools/find_symbol.py +211 -0
- jarvis/jarvis_tools/function_analyzer.py +248 -0
- jarvis/jarvis_tools/git_commiter.py +4 -4
- jarvis/jarvis_tools/methodology.py +89 -48
- jarvis/jarvis_tools/project_analyzer.py +220 -0
- jarvis/jarvis_tools/read_code.py +23 -2
- jarvis/jarvis_tools/read_webpage.py +195 -81
- jarvis/jarvis_tools/registry.py +132 -11
- jarvis/jarvis_tools/search_web.py +55 -10
- jarvis/jarvis_tools/tool_generator.py +6 -8
- jarvis/jarvis_utils/__init__.py +1 -0
- jarvis/jarvis_utils/config.py +67 -3
- jarvis/jarvis_utils/embedding.py +344 -45
- jarvis/jarvis_utils/git_utils.py +9 -1
- jarvis/jarvis_utils/input.py +7 -6
- jarvis/jarvis_utils/methodology.py +379 -7
- jarvis/jarvis_utils/output.py +5 -3
- jarvis/jarvis_utils/utils.py +59 -7
- {jarvis_ai_assistant-0.1.131.dist-info → jarvis_ai_assistant-0.1.132.dist-info}/METADATA +3 -2
- jarvis_ai_assistant-0.1.132.dist-info/RECORD +82 -0
- {jarvis_ai_assistant-0.1.131.dist-info → jarvis_ai_assistant-0.1.132.dist-info}/entry_points.txt +2 -0
- jarvis/jarvis_codebase/__init__.py +0 -0
- jarvis/jarvis_codebase/main.py +0 -1011
- jarvis/jarvis_tools/treesitter_analyzer.py +0 -331
- jarvis/jarvis_treesitter/README.md +0 -104
- jarvis/jarvis_treesitter/__init__.py +0 -20
- jarvis/jarvis_treesitter/database.py +0 -258
- jarvis/jarvis_treesitter/example.py +0 -115
- jarvis/jarvis_treesitter/grammar_builder.py +0 -182
- jarvis/jarvis_treesitter/language.py +0 -117
- jarvis/jarvis_treesitter/symbol.py +0 -31
- jarvis/jarvis_treesitter/tools_usage.md +0 -121
- jarvis_ai_assistant-0.1.131.dist-info/RECORD +0 -85
- {jarvis_ai_assistant-0.1.131.dist-info → jarvis_ai_assistant-0.1.132.dist-info}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.131.dist-info → jarvis_ai_assistant-0.1.132.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.1.131.dist-info → jarvis_ai_assistant-0.1.132.dist-info}/top_level.txt +0 -0
|
@@ -28,109 +28,112 @@ class CodeAgent:
|
|
|
28
28
|
tool_registry.use_tools(["execute_shell",
|
|
29
29
|
"execute_shell_script",
|
|
30
30
|
"search_web",
|
|
31
|
-
"create_code_agent",
|
|
32
31
|
"ask_user",
|
|
33
32
|
"ask_codebase",
|
|
34
33
|
"lsp_get_diagnostics",
|
|
35
34
|
"lsp_find_references",
|
|
36
35
|
"lsp_find_definition",
|
|
37
|
-
"
|
|
38
|
-
"
|
|
36
|
+
"code_review", # 代码审查工具
|
|
37
|
+
"find_symbol", # 添加符号查找工具
|
|
38
|
+
"find_caller", # 添加函数调用者查找工具
|
|
39
|
+
"function_analyzer", # 添加函数分析工具
|
|
40
|
+
"project_analyzer", # 添加项目分析工具
|
|
41
|
+
"file_analyzer" # 添加单文件分析工具
|
|
39
42
|
])
|
|
40
43
|
code_system_prompt = """
|
|
41
44
|
# 专业代码工程师
|
|
42
45
|
|
|
43
|
-
##
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
## 任务执行规范
|
|
46
|
+
## 身份与职责
|
|
47
|
+
- **角色**:精通代码修改的高级工程师
|
|
48
|
+
- **能力**:代码分析、精准重构和系统化验证
|
|
49
|
+
- **知识**:软件架构、设计模式和编程最佳实践
|
|
50
|
+
|
|
51
|
+
## 工作原则
|
|
52
|
+
- **准备工作**:在修改任何代码之前,必须已经阅读并充分理解相关代码
|
|
53
|
+
- **分析范围判断**:首先评估当前文件内容是否足够完成修改,避免不必要的项目分析
|
|
54
|
+
- **沟通**:清晰简洁的技术解释,提供决策依据
|
|
55
|
+
- **代码修改**:结构化展示变更及其上下文
|
|
56
|
+
- **问题处理**:遇到模糊请求时提出澄清问题,高风险变更时提出渐进式方法
|
|
57
|
+
- **修改效率**:对于变更不超过50行的代码,应一次性完成修改,避免分段处理
|
|
58
|
+
|
|
59
|
+
## 任务执行流程
|
|
59
60
|
### 分析阶段
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
61
|
+
- **范围确定**:首先判断是否仅需当前文件内容即可完成任务,避免不必要的分析
|
|
62
|
+
- 评估任务复杂度,只在必要时进行全面分析
|
|
63
|
+
- 简单修改可直接进行,无需复杂分析
|
|
64
|
+
- 使用代码分析工具理解依赖关系
|
|
65
|
+
- 识别潜在影响区域
|
|
66
|
+
- 确保在开始修改前,已经完全阅读和理解相关代码文件
|
|
64
67
|
|
|
65
68
|
### 实施阶段
|
|
66
|
-
-
|
|
69
|
+
- 进行最小范围更改,保持代码完整性
|
|
70
|
+
- 对于不超过50行的代码变更,应一次性完成修改
|
|
71
|
+
- 大型文件分段修改,确保每段修改后代码功能完整
|
|
67
72
|
- 保持一致的代码风格和格式
|
|
68
|
-
-
|
|
69
|
-
- 立即修复任何检测到的问题
|
|
70
|
-
- 确保代码修改后第一时间验证,优先修复错误而不是继续实现新功能
|
|
73
|
+
- 修改后立即验证,优先修复错误
|
|
71
74
|
|
|
72
75
|
### 验证阶段
|
|
73
|
-
-
|
|
76
|
+
- 确认已充分理解所修改代码及其上下文
|
|
77
|
+
- 使用诊断工具检查问题
|
|
74
78
|
- 检查相关代码中的意外副作用
|
|
75
|
-
-
|
|
79
|
+
- 确保兼容性和功能正确性
|
|
80
|
+
- 验证修改是否符合原始设计意图和代码结构
|
|
76
81
|
|
|
77
82
|
### 文档阶段
|
|
78
|
-
-
|
|
79
|
-
-
|
|
80
|
-
- 记录任何假设或约束条件
|
|
83
|
+
- 提供清晰的修改理由和上下文
|
|
84
|
+
- 记录假设和约束条件
|
|
81
85
|
- 准备详细的提交信息
|
|
82
86
|
|
|
83
|
-
##
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
2. **修改实施**:
|
|
90
|
-
- 单一职责变更
|
|
91
|
-
- 严格的范围验证
|
|
92
|
-
- 接口兼容性检查
|
|
93
|
-
|
|
94
|
-
3. **验证清单**:
|
|
95
|
-
- 运行lsp_get_diagnostics确保零错误
|
|
96
|
-
- 使用lsp_find_references确认影响范围
|
|
87
|
+
## 工具使用指南
|
|
88
|
+
- **范围决策**:
|
|
89
|
+
- 先阅读当前文件,判断是否包含足够信息完成任务
|
|
90
|
+
- 只有在确认需要更多上下文时才扩展分析范围
|
|
91
|
+
- 明确告知用户当前文件是否足够,避免不必要分析
|
|
97
92
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
93
|
+
- **代码阅读与理解**:
|
|
94
|
+
- 在使用任何分析工具前,应首先完整阅读相关代码
|
|
95
|
+
- 使用分析工具补充而非替代直接阅读和理解代码
|
|
96
|
+
- 如有必要,可以使用`ask_codebase`工具来帮助理解复杂部分
|
|
102
97
|
|
|
103
|
-
## 工具使用指南
|
|
104
98
|
- **分析工具**:
|
|
105
|
-
- lsp_find_references
|
|
106
|
-
- lsp_find_definition
|
|
107
|
-
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
注意事项:
|
|
113
|
-
- 每次操作都会自动索引指定目录,无需单独执行索引步骤
|
|
114
|
-
- 适用于多种编程语言:Python, C, C++, Go, Rust 等
|
|
115
|
-
- 首次使用时会自动下载语法文件,可能需要一些时间
|
|
99
|
+
- lsp_find_references:理解使用模式
|
|
100
|
+
- lsp_find_definition:追踪实现细节
|
|
101
|
+
- find_symbol:查找代码符号位置
|
|
102
|
+
- find_caller:查找函数调用位置
|
|
103
|
+
- function_analyzer:分析函数实现
|
|
104
|
+
- project_analyzer:分析项目架构(仅复杂任务使用)
|
|
105
|
+
- file_analyzer:分析单文件结构
|
|
116
106
|
|
|
117
107
|
- **验证工具**:
|
|
118
|
-
- lsp_get_diagnostics
|
|
119
|
-
- code_review
|
|
108
|
+
- lsp_get_diagnostics:检查修改问题
|
|
109
|
+
- code_review:代码审查
|
|
120
110
|
|
|
121
111
|
- **系统工具**:
|
|
122
|
-
- execute_shell
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
|
|
126
|
-
##
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
112
|
+
- execute_shell:执行系统命令
|
|
113
|
+
- search_web:查找技术参考
|
|
114
|
+
- ask_codebase:补充分析(优先使用直接分析工具)
|
|
115
|
+
|
|
116
|
+
## 代码分析策略
|
|
117
|
+
- **阅读优先**:在提出任何修改前,必须先阅读和理解相关代码
|
|
118
|
+
- **避免过度分析**:只分析与任务直接相关的代码
|
|
119
|
+
- **单文件优先**:优先考虑当前文件是否含有足够信息完成任务
|
|
120
|
+
- 当任务仅涉及语法、文本修改、逻辑优化等当前文件内部变更时,无需分析项目
|
|
121
|
+
- 当当前文件包含完整的模块/类/功能实现,且修改不影响外部接口时,无需额外分析
|
|
122
|
+
- 当用户明确指示仅修改当前文件时,无需扩大分析范围
|
|
123
|
+
- **任务分级**:
|
|
124
|
+
- 简单任务:先阅读相关代码,然后直接执行,尽量减少不必要的分析
|
|
125
|
+
- 中等任务:全面阅读相关文件并分析直接依赖,确保理解上下文
|
|
126
|
+
- 复杂任务:彻底阅读并进行全面项目分析,确保理解代码交互方式
|
|
127
|
+
- **长文件处理**:
|
|
128
|
+
- 完整阅读后再分段理解和修改
|
|
129
|
+
- 先处理核心部分,再扩展到相关代码
|
|
130
|
+
- 优先修改相对独立的部分
|
|
131
|
+
- **修改规模策略**:
|
|
132
|
+
- 对于不超过50行的代码变更,应尽量一次性完成
|
|
133
|
+
- 将相关逻辑变更放在同一个修改中,保持功能完整性
|
|
134
|
+
- 无需为小规模修改(≤50行)拆分多次提交,除非跨多个不相关模块
|
|
133
135
|
"""
|
|
136
|
+
# Dynamically add ask_codebase based on task complexity if really needed
|
|
134
137
|
self.agent = Agent(system_prompt=code_system_prompt,
|
|
135
138
|
name="CodeAgent",
|
|
136
139
|
auto_complete=False,
|
|
@@ -214,17 +217,15 @@ def main():
|
|
|
214
217
|
PrettyOutput.print(f"当前目录: {git_dir}", OutputType.INFO)
|
|
215
218
|
|
|
216
219
|
try:
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
except Exception as e:
|
|
227
|
-
PrettyOutput.print(f"错误: {str(e)}", OutputType.ERROR)
|
|
220
|
+
try:
|
|
221
|
+
user_input = get_multiline_input("请输入你的需求(输入空行退出):")
|
|
222
|
+
if not user_input:
|
|
223
|
+
return 0
|
|
224
|
+
agent = CodeAgent()
|
|
225
|
+
agent.run(user_input)
|
|
226
|
+
|
|
227
|
+
except Exception as e:
|
|
228
|
+
PrettyOutput.print(f"错误: {str(e)}", OutputType.ERROR)
|
|
228
229
|
|
|
229
230
|
except Exception as e:
|
|
230
231
|
PrettyOutput.print(f"初始化错误: {str(e)}", OutputType.ERROR)
|