jarvis-ai-assistant 0.1.132__py3-none-any.whl → 0.1.134__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.
Potentially problematic release.
This version of jarvis-ai-assistant might be problematic. Click here for more details.
- jarvis/__init__.py +1 -1
- jarvis/jarvis_agent/__init__.py +140 -279
- jarvis/jarvis_agent/jarvis.py +143 -0
- jarvis/jarvis_agent/main.py +0 -2
- jarvis/jarvis_agent/patch.py +16 -12
- jarvis/jarvis_code_agent/code_agent.py +155 -104
- jarvis/jarvis_dev/main.py +0 -8
- jarvis/jarvis_lsp/base.py +0 -42
- jarvis/jarvis_lsp/cpp.py +0 -15
- jarvis/jarvis_lsp/go.py +0 -15
- jarvis/jarvis_lsp/python.py +0 -19
- jarvis/jarvis_lsp/registry.py +0 -62
- jarvis/jarvis_lsp/rust.py +0 -15
- jarvis/jarvis_multi_agent/__init__.py +0 -41
- jarvis/jarvis_multi_agent/main.py +43 -0
- jarvis/jarvis_platform/registry.py +2 -16
- jarvis/jarvis_platform/yuanbao.py +1 -1
- jarvis/jarvis_rag/main.py +1 -1
- jarvis/jarvis_tools/ask_codebase.py +61 -54
- jarvis/jarvis_tools/code_review.py +21 -2
- jarvis/jarvis_tools/create_sub_agent.py +0 -1
- jarvis/jarvis_tools/file_analyzer.py +84 -73
- jarvis/jarvis_tools/find_caller.py +83 -18
- jarvis/jarvis_tools/find_symbol.py +102 -18
- jarvis/jarvis_tools/function_analyzer.py +115 -32
- jarvis/jarvis_tools/git_commiter.py +1 -1
- jarvis/jarvis_tools/methodology.py +0 -6
- jarvis/jarvis_tools/project_analyzer.py +116 -28
- jarvis/jarvis_tools/rag.py +0 -5
- jarvis/jarvis_tools/read_code.py +1 -1
- jarvis/jarvis_tools/search_web.py +23 -353
- jarvis/jarvis_tools/tool_generator.py +2 -2
- jarvis/jarvis_utils/config.py +13 -73
- jarvis/jarvis_utils/methodology.py +8 -11
- jarvis/jarvis_utils/output.py +2 -2
- jarvis/jarvis_utils/utils.py +1 -1
- {jarvis_ai_assistant-0.1.132.dist-info → jarvis_ai_assistant-0.1.134.dist-info}/METADATA +6 -15
- {jarvis_ai_assistant-0.1.132.dist-info → jarvis_ai_assistant-0.1.134.dist-info}/RECORD +42 -42
- {jarvis_ai_assistant-0.1.132.dist-info → jarvis_ai_assistant-0.1.134.dist-info}/entry_points.txt +2 -3
- jarvis/jarvis_tools/lsp_find_definition.py +0 -150
- jarvis/jarvis_tools/lsp_find_references.py +0 -127
- {jarvis_ai_assistant-0.1.132.dist-info → jarvis_ai_assistant-0.1.134.dist-info}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.132.dist-info → jarvis_ai_assistant-0.1.134.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.1.132.dist-info → jarvis_ai_assistant-0.1.134.dist-info}/top_level.txt +0 -0
|
@@ -102,12 +102,8 @@ class FindCallerTool:
|
|
|
102
102
|
name=f"CallerFinder-{function_name}",
|
|
103
103
|
description=f"查找 '{function_name}' 函数的所有调用位置",
|
|
104
104
|
summary_prompt=summary_prompt,
|
|
105
|
-
platform=PlatformRegistry().
|
|
105
|
+
platform=PlatformRegistry().get_normal_platform(),
|
|
106
106
|
output_handler=[tool_registry],
|
|
107
|
-
need_summary=True,
|
|
108
|
-
is_sub_agent=True,
|
|
109
|
-
use_methodology=False,
|
|
110
|
-
record_methodology=False,
|
|
111
107
|
execute_tool_confirm=False,
|
|
112
108
|
auto_complete=True
|
|
113
109
|
)
|
|
@@ -160,25 +156,93 @@ class FindCallerTool:
|
|
|
160
156
|
## 任务描述
|
|
161
157
|
查找所有调用 `{function_name}` 函数的代码位置,专注于分析目标所需的信息,生成有针对性的调用分析报告。{objective_text}
|
|
162
158
|
|
|
159
|
+
## 工具使用优先级
|
|
160
|
+
1. **优先使用 execute_shell 执行 rg 命令**:
|
|
161
|
+
- `rg "\\b{function_name}\\s*\\(" --type py` 查找Python文件中的调用
|
|
162
|
+
- `rg "\\b{function_name}\\s*\\(" --type js` 查找JavaScript文件中的调用
|
|
163
|
+
- `rg -w "{function_name}" -A 2 -B 2` 查看调用上下文
|
|
164
|
+
|
|
165
|
+
2. **辅以 read_code**:
|
|
166
|
+
- 找到调用位置后使用read_code阅读上下文
|
|
167
|
+
- 读取关键调用者的完整实现
|
|
168
|
+
|
|
169
|
+
3. **避免使用专用分析工具**:
|
|
170
|
+
- 只有当rg命令和read_code工具无法满足需求时才考虑
|
|
171
|
+
|
|
163
172
|
## 工作环境
|
|
164
173
|
- 工作目录: `{root_dir}`
|
|
165
174
|
- 文件类型: {file_ext_str if file_ext_str else "所有文件"}
|
|
166
175
|
- 排除目录: {", ".join(exclude_dirs) if exclude_dirs else "无"}
|
|
167
176
|
|
|
168
177
|
## 分析策略
|
|
169
|
-
1.
|
|
170
|
-
2.
|
|
171
|
-
3.
|
|
172
|
-
4.
|
|
173
|
-
5.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
-
|
|
181
|
-
-
|
|
178
|
+
1. 首先确定项目的主要编程语言和技术栈,以便更精确地查找函数调用
|
|
179
|
+
2. 理解分析目标,明确需要查找的信息类型
|
|
180
|
+
3. 使用适当的rg搜索模式查找函数调用
|
|
181
|
+
4. 验证搜索结果,确认是对目标函数的真正调用
|
|
182
|
+
5. 分析调用上下文,了解调用的目的和方式
|
|
183
|
+
6. 根据分析目标自行确定需要的分析深度和广度
|
|
184
|
+
|
|
185
|
+
## 调用者查找工具指南
|
|
186
|
+
|
|
187
|
+
### execute_shell 搜索命令
|
|
188
|
+
- **基本搜索**:
|
|
189
|
+
- `rg "\\b{function_name}\\s*\\(" --type=文件类型`
|
|
190
|
+
- 示例: `rg "\\b{function_name}\\s*\\(" --type py` 搜索Python文件中的调用
|
|
191
|
+
|
|
192
|
+
- **查看上下文**:
|
|
193
|
+
- `rg "\\b{function_name}\\s*\\(" -A 5 -B 5` 显示调用前后5行
|
|
194
|
+
- `rg "\\b{function_name}\\s*\\(" --context=10` 显示调用前后10行
|
|
195
|
+
|
|
196
|
+
- **排除目录**:
|
|
197
|
+
- `rg "\\b{function_name}\\s*\\(" --type py -g '!tests/'` 排除测试目录
|
|
198
|
+
- `rg "\\b{function_name}\\s*\\(" -g '!node_modules/'` 排除node_modules
|
|
199
|
+
|
|
200
|
+
- **统计调用**:
|
|
201
|
+
- `rg -c "\\b{function_name}\\s*\\(" --type py` 统计每个Python文件中的调用次数
|
|
202
|
+
- `rg "\\b{function_name}\\s*\\(" --count-matches --stats` 显示调用统计信息
|
|
203
|
+
|
|
204
|
+
### read_code
|
|
205
|
+
- **用途**:读取找到的调用点上下文
|
|
206
|
+
- **典型用法**:
|
|
207
|
+
- 读取调用函数的整个方法或类
|
|
208
|
+
- 读取调用点的上下文行(前后5-10行)
|
|
209
|
+
- **使用策略**:
|
|
210
|
+
- 首先读取足够的上下文以理解调用目的
|
|
211
|
+
- 对于复杂调用,可能需要读取整个调用函数
|
|
212
|
+
- 关注调用前的参数准备和调用后的结果处理
|
|
213
|
+
|
|
214
|
+
### 调用者分析模式
|
|
215
|
+
|
|
216
|
+
1. **影响范围评估模式**:
|
|
217
|
+
- 查找所有调用点: `rg -l "\\b{function_name}\\s*\\("`
|
|
218
|
+
- 按模块/组件分类调用位置
|
|
219
|
+
- 评估修改函数可能影响的范围和严重性
|
|
220
|
+
|
|
221
|
+
2. **使用模式分析**:
|
|
222
|
+
- 分析各调用点的参数传递方式
|
|
223
|
+
- 识别典型的调用模式和变体
|
|
224
|
+
- 总结函数的不同使用场景
|
|
225
|
+
|
|
226
|
+
3. **依赖关系追踪**:
|
|
227
|
+
- 识别直接调用者
|
|
228
|
+
- 分析这些调用者自身被谁调用
|
|
229
|
+
- 构建完整的调用链或调用树
|
|
230
|
+
|
|
231
|
+
4. **调用频率分析**:
|
|
232
|
+
- 统计不同模块中的调用频率: `rg -c "\\b{function_name}\\s*\\(" --sort path`
|
|
233
|
+
- 识别高频调用点和关键路径
|
|
234
|
+
- 评估函数在系统中的重要性
|
|
235
|
+
|
|
236
|
+
5. **异常使用检测**:
|
|
237
|
+
- 检查是否存在异常的调用模式
|
|
238
|
+
- 识别可能存在问题的调用点
|
|
239
|
+
- 提出优化或修正建议
|
|
240
|
+
|
|
241
|
+
## 搜索技巧
|
|
242
|
+
- 根据不同编程语言调整函数调用模式的搜索方式
|
|
243
|
+
- 考虑各种编程范式下的不同调用方式(面向对象、函数式等)
|
|
244
|
+
- 考虑函数可能通过变量或回调方式间接调用
|
|
245
|
+
- 检查可能存在的同名函数,确保找到的是目标函数的调用
|
|
182
246
|
|
|
183
247
|
## 输出要求
|
|
184
248
|
- 直接回应分析目标的关键问题
|
|
@@ -203,6 +267,7 @@ class FindCallerTool:
|
|
|
203
267
|
## 报告要求
|
|
204
268
|
生成一份完全以分析目标为导向的函数调用分析报告。不要遵循固定的报告模板,而是完全根据分析目标来组织内容:
|
|
205
269
|
|
|
270
|
+
- 首先简要说明项目的主要编程语言和技术栈
|
|
206
271
|
- 专注回答分析目标提出的问题
|
|
207
272
|
- 只包含与分析目标直接相关的调用发现和洞察
|
|
208
273
|
- 完全跳过与分析目标无关的内容,无需做全面分析
|
|
@@ -102,12 +102,8 @@ class SymbolTool:
|
|
|
102
102
|
name=f"SymbolFinder-{symbol}",
|
|
103
103
|
description=f"查找符号 '{symbol}' 的引用和定义位置",
|
|
104
104
|
summary_prompt=summary_prompt,
|
|
105
|
-
platform=PlatformRegistry().
|
|
105
|
+
platform=PlatformRegistry().get_normal_platform(),
|
|
106
106
|
output_handler=[tool_registry],
|
|
107
|
-
need_summary=True,
|
|
108
|
-
is_sub_agent=True,
|
|
109
|
-
use_methodology=False,
|
|
110
|
-
record_methodology=False,
|
|
111
107
|
execute_tool_confirm=False,
|
|
112
108
|
auto_complete=True
|
|
113
109
|
)
|
|
@@ -158,25 +154,112 @@ class SymbolTool:
|
|
|
158
154
|
## 任务描述
|
|
159
155
|
查找符号 `{symbol}` 在代码库中的定义、声明和引用位置,专注于分析目标所需的信息,生成有针对性的符号分析报告。{objective_text}
|
|
160
156
|
|
|
157
|
+
## 工具使用优先级
|
|
158
|
+
1. **优先使用 execute_shell 执行 rg 命令**:
|
|
159
|
+
- `rg -w "{symbol}" --type py` 查找Python文件中的符号
|
|
160
|
+
- `rg "class\\s+{symbol}|def\\s+{symbol}" --type py` 查找定义
|
|
161
|
+
- `rg -w "{symbol}" -A 2 -B 2` 查看符号上下文
|
|
162
|
+
|
|
163
|
+
2. **辅以 read_code**:
|
|
164
|
+
- 找到符号位置后使用read_code阅读上下文
|
|
165
|
+
- 读取符号定义和关键引用的完整实现
|
|
166
|
+
|
|
167
|
+
3. **避免使用专用分析工具**:
|
|
168
|
+
- 只有当rg命令和read_code工具无法满足需求时才考虑
|
|
169
|
+
|
|
161
170
|
## 工作环境
|
|
162
171
|
- 工作目录: `{root_dir}`
|
|
163
172
|
- 文件类型: {file_ext_str if file_ext_str else "所有文件"}
|
|
164
173
|
- 排除目录: {", ".join(exclude_dirs) if exclude_dirs else "无"}
|
|
165
174
|
|
|
166
175
|
## 分析策略
|
|
167
|
-
1.
|
|
168
|
-
2.
|
|
169
|
-
3.
|
|
170
|
-
4.
|
|
171
|
-
5.
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
-
|
|
176
|
+
1. 首先确定项目的主要编程语言和技术栈,以便更精确地查找符号
|
|
177
|
+
2. 理解分析目标,明确需要查找的信息类型
|
|
178
|
+
3. 使用适当的rg搜索模式查找符号定义和引用
|
|
179
|
+
4. 验证搜索结果,确认是目标符号的真正使用
|
|
180
|
+
5. 分析符号上下文,了解其用途和使用方式
|
|
181
|
+
6. 根据分析目标自行确定需要的分析深度和广度
|
|
182
|
+
|
|
183
|
+
## 符号查找工具指南
|
|
184
|
+
|
|
185
|
+
### execute_shell 搜索命令
|
|
186
|
+
- **基本搜索**:
|
|
187
|
+
- `rg -w "{symbol}" --type=文件类型`
|
|
188
|
+
- 示例: `rg -w "{symbol}" --type py` 搜索Python文件中的符号
|
|
189
|
+
|
|
190
|
+
- **查找定义**:
|
|
191
|
+
- `rg "class\\s+{symbol}\\b|def\\s+{symbol}\\b|function\\s+{symbol}\\b" --type py` 查找Python定义
|
|
192
|
+
- `rg "class\\s+{symbol}\\b|function\\s+{symbol}\\b" --type js` 查找JavaScript定义
|
|
193
|
+
- `rg "const\\s+{symbol}\\b|let\\s+{symbol}\\b|var\\s+{symbol}\\b" --type js` 查找JavaScript变量声明
|
|
194
|
+
|
|
195
|
+
- **查看上下文**:
|
|
196
|
+
- `rg -w "{symbol}" -A 5 -B 5` 显示符号前后5行
|
|
197
|
+
- `rg -w "{symbol}" --context=10` 显示符号前后10行
|
|
198
|
+
|
|
199
|
+
- **排除目录**:
|
|
200
|
+
- `rg -w "{symbol}" --type py -g '!tests/'` 排除测试目录
|
|
201
|
+
- `rg -w "{symbol}" -g '!node_modules/'` 排除node_modules
|
|
202
|
+
|
|
203
|
+
- **统计引用**:
|
|
204
|
+
- `rg -c -w "{symbol}" --type py` 统计每个Python文件中的引用次数
|
|
205
|
+
- `rg -w "{symbol}" --count-matches --stats` 显示引用统计信息
|
|
206
|
+
|
|
207
|
+
### read_code
|
|
208
|
+
- **用途**:读取符号定义和使用的上下文
|
|
209
|
+
- **典型用法**:
|
|
210
|
+
- 读取符号定义所在的文件区域
|
|
211
|
+
- 读取关键使用位置的上下文
|
|
212
|
+
- **使用策略**:
|
|
213
|
+
- 首先读取符号的定义以理解其属性和行为
|
|
214
|
+
- 然后读取典型使用场景的代码
|
|
215
|
+
- 重点关注频繁使用的模式和关键功能点
|
|
216
|
+
|
|
217
|
+
### 符号分析模式
|
|
218
|
+
|
|
219
|
+
1. **定义分析模式**:
|
|
220
|
+
- 首先找到符号的所有定义位置
|
|
221
|
+
- 分析定义的类型(类、函数、变量、常量等)
|
|
222
|
+
- 理解符号的属性、参数、返回值等特性
|
|
223
|
+
- 查看相关注释和文档字符串
|
|
224
|
+
|
|
225
|
+
2. **使用模式分析**:
|
|
226
|
+
- 分类统计不同类型的使用方式
|
|
227
|
+
- 识别典型的使用模式和上下文
|
|
228
|
+
- 总结符号的主要用途和功能
|
|
229
|
+
|
|
230
|
+
3. **影响范围评估**:
|
|
231
|
+
- 统计符号在不同模块中的使用频率
|
|
232
|
+
- 分析符号修改可能影响的代码范围
|
|
233
|
+
- 识别关键依赖点和潜在风险区域
|
|
234
|
+
|
|
235
|
+
4. **符号关系网络分析**:
|
|
236
|
+
- 分析与目标符号相关的其他符号
|
|
237
|
+
- 识别依赖该符号的组件
|
|
238
|
+
- 了解该符号依赖的其他组件
|
|
239
|
+
|
|
240
|
+
## 编程范式适应
|
|
241
|
+
|
|
242
|
+
无论项目使用什么编程语言或范式,符号分析都应考虑以下方面:
|
|
243
|
+
|
|
244
|
+
### 对象导向程序
|
|
245
|
+
- 类定义、继承关系和实例化
|
|
246
|
+
- 方法重载和覆盖
|
|
247
|
+
- 成员变量和属性访问
|
|
248
|
+
|
|
249
|
+
### 函数式编程
|
|
250
|
+
- 高阶函数和函数传递
|
|
251
|
+
- 不可变数据结构
|
|
252
|
+
- 闭包和作用域
|
|
253
|
+
|
|
254
|
+
### 过程式编程
|
|
255
|
+
- 全局和局部变量
|
|
256
|
+
- 函数调用关系
|
|
257
|
+
- 数据流动
|
|
258
|
+
|
|
259
|
+
### 声明式编程
|
|
260
|
+
- 规则和约束定义
|
|
261
|
+
- 模式匹配
|
|
262
|
+
- 数据转换
|
|
180
263
|
|
|
181
264
|
## 输出要求
|
|
182
265
|
- 直接回应分析目标的关键问题
|
|
@@ -201,6 +284,7 @@ class SymbolTool:
|
|
|
201
284
|
## 报告要求
|
|
202
285
|
生成一份完全以分析目标为导向的符号分析报告。不要遵循固定的报告模板,而是完全根据分析目标来组织内容:
|
|
203
286
|
|
|
287
|
+
- 首先简要说明项目的主要编程语言和技术栈
|
|
204
288
|
- 专注回答分析目标提出的问题
|
|
205
289
|
- 只包含与分析目标直接相关的符号发现和洞察
|
|
206
290
|
- 完全跳过与分析目标无关的内容,无需做全面分析
|
|
@@ -115,12 +115,8 @@ class FunctionAnalyzerTool:
|
|
|
115
115
|
name=f"FunctionAnalyzer-{function_name}",
|
|
116
116
|
description=f"分析 '{function_name}' 函数的内部实现",
|
|
117
117
|
summary_prompt=summary_prompt,
|
|
118
|
-
platform=PlatformRegistry().
|
|
118
|
+
platform=PlatformRegistry().get_normal_platform(),
|
|
119
119
|
output_handler=[tool_registry],
|
|
120
|
-
need_summary=True,
|
|
121
|
-
is_sub_agent=True,
|
|
122
|
-
use_methodology=False,
|
|
123
|
-
record_methodology=False,
|
|
124
120
|
execute_tool_confirm=False,
|
|
125
121
|
auto_complete=True
|
|
126
122
|
)
|
|
@@ -176,6 +172,23 @@ class FunctionAnalyzerTool:
|
|
|
176
172
|
## 任务描述
|
|
177
173
|
分析函数 `{function_name}` 的实现,专注于分析目标所需的信息,生成有针对性的函数分析报告。{objective_text}
|
|
178
174
|
|
|
175
|
+
## 工具使用优先级
|
|
176
|
+
1. **首先使用 execute_shell 执行 rg 命令查找函数定义**:
|
|
177
|
+
- `rg "def\\s+{function_name}\\s*\\(" --type py` 查找Python函数定义
|
|
178
|
+
- `rg "function\\s+{function_name}\\s*\\(" --type js` 查找JavaScript函数定义
|
|
179
|
+
- `rg "func\\s+{function_name}\\s*\\(" --type go` 查找Go函数定义
|
|
180
|
+
|
|
181
|
+
2. **优先使用 read_code 阅读函数实现**:
|
|
182
|
+
- 找到函数位置后使用read_code阅读完整实现
|
|
183
|
+
- 对于长函数可分段读取关键部分
|
|
184
|
+
|
|
185
|
+
3. **使用 rg 搜索子函数调用和使用模式**:
|
|
186
|
+
- `rg -w "子函数名" --type py` 查找子函数调用
|
|
187
|
+
- `rg "import|from" 函数所在文件` 查找导入模块
|
|
188
|
+
|
|
189
|
+
4. **避免使用专用分析工具**:
|
|
190
|
+
- 只有当rg命令和read_code工具无法满足需求时才考虑
|
|
191
|
+
|
|
179
192
|
## 函数信息
|
|
180
193
|
- 函数名称: `{function_name}`
|
|
181
194
|
- {file_info}
|
|
@@ -184,33 +197,102 @@ class FunctionAnalyzerTool:
|
|
|
184
197
|
- 排除目录: {", ".join(exclude_dirs) if exclude_dirs else "无"}
|
|
185
198
|
|
|
186
199
|
## 分析策略
|
|
187
|
-
1.
|
|
188
|
-
2.
|
|
189
|
-
3.
|
|
190
|
-
4.
|
|
191
|
-
5.
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
200
|
+
1. 首先确定项目的主要编程语言和技术栈,以便更准确地分析函数实现
|
|
201
|
+
2. 理解分析目标,明确需要查找的信息
|
|
202
|
+
3. {"在指定文件中定位函数定义" if file_path else "搜索代码库查找函数定义位置"}
|
|
203
|
+
4. 根据分析目标,确定重点分析的方面
|
|
204
|
+
5. 灵活调整分析深度,关注与目标相关的实现细节
|
|
205
|
+
6. 根据目标需要自行判断是否需要分析子函数
|
|
206
|
+
|
|
207
|
+
## 函数分析工具指南
|
|
208
|
+
|
|
209
|
+
### execute_shell 搜索命令
|
|
210
|
+
- **查找函数定义**:
|
|
211
|
+
- `rg "def\\s+{function_name}\\s*\\(" --type py` 查找Python函数定义
|
|
212
|
+
- `rg "function\\s+{function_name}\\s*\\(" --type js` 查找JavaScript函数定义
|
|
213
|
+
- `rg "func\\s+{function_name}\\s*\\(" --type go` 查找Go函数定义
|
|
214
|
+
|
|
215
|
+
- **查找函数调用**:
|
|
216
|
+
- `rg "\\b{function_name}\\s*\\(" --type py` 查找函数调用
|
|
217
|
+
- `rg -w "{function_name}" -A 2 -B 2` 查看函数调用上下文
|
|
218
|
+
|
|
219
|
+
- **分析函数依赖**:
|
|
220
|
+
- `rg "import|from" 函数所在文件` 查找Python导入语句
|
|
221
|
+
- `rg "require\\(" 函数所在文件` 查找JavaScript导入语句
|
|
222
|
+
- `rg "import " 函数所在文件` 查找Go导入语句
|
|
223
|
+
|
|
224
|
+
- **统计分析**:
|
|
225
|
+
- `loc 函数所在文件` 获取文件代码统计
|
|
226
|
+
- `rg -c "if|else|elif" 函数所在文件` 统计条件分支数量
|
|
227
|
+
- `rg -c "for|while" 函数所在文件` 统计循环数量
|
|
228
|
+
|
|
229
|
+
### read_code
|
|
230
|
+
- **用途**:读取函数实现和相关代码
|
|
231
|
+
- **典型用法**:
|
|
232
|
+
- 阅读完整函数实现,包括注释和文档
|
|
233
|
+
- 阅读关键子函数的实现(根据analysis_depth)
|
|
234
|
+
- 阅读使用到的关键变量和依赖组件定义
|
|
235
|
+
- **使用策略**:
|
|
236
|
+
- 首先阅读整个函数以获取完整视图
|
|
237
|
+
- 识别函数的主要逻辑分支和处理路径
|
|
238
|
+
- 重点关注错误处理和边界条件检查
|
|
239
|
+
- 对复杂子函数进行递归分析(不超过指定深度)
|
|
240
|
+
|
|
241
|
+
### 函数分析模式
|
|
242
|
+
|
|
243
|
+
1. **逻辑流程分析**:
|
|
244
|
+
- 识别函数的主要执行路径
|
|
245
|
+
- 分析条件分支和循环结构
|
|
246
|
+
- 构建完整的逻辑流程图
|
|
247
|
+
|
|
248
|
+
2. **参数分析**:
|
|
249
|
+
- 分析参数类型、默认值和约束条件
|
|
250
|
+
- 了解参数在函数中的使用方式
|
|
251
|
+
- 识别关键参数及其影响
|
|
252
|
+
|
|
253
|
+
3. **依赖与副作用分析**:
|
|
254
|
+
- 识别函数使用的外部变量和组件
|
|
255
|
+
- 分析函数对外部状态的修改
|
|
256
|
+
- 评估函数的纯度和可测试性
|
|
257
|
+
|
|
258
|
+
4. **异常处理分析**:
|
|
259
|
+
- 识别可能的异常和错误情况
|
|
260
|
+
- 分析错误处理和恢复机制
|
|
261
|
+
- 评估错误处理的完整性和合理性
|
|
262
|
+
|
|
263
|
+
5. **性能分析**:
|
|
264
|
+
- 识别潜在的性能瓶颈
|
|
265
|
+
- 分析循环和递归的效率
|
|
266
|
+
- 评估算法复杂度
|
|
267
|
+
|
|
268
|
+
6. **子函数调用分析**:
|
|
269
|
+
- 识别所有调用的子函数
|
|
270
|
+
- 分析子函数的作用和调用模式
|
|
271
|
+
- 在允许的深度内递归分析关键子函数
|
|
272
|
+
|
|
273
|
+
## 编程范式适应
|
|
274
|
+
|
|
275
|
+
针对不同的编程范式,函数分析应关注不同方面:
|
|
276
|
+
|
|
277
|
+
### 过程式/函数式
|
|
278
|
+
- 输入输出关系和纯函数特性
|
|
279
|
+
- 控制流程和数据转换
|
|
280
|
+
- 递归和迭代模式
|
|
281
|
+
|
|
282
|
+
### 面向对象
|
|
283
|
+
- 方法与类的交互
|
|
284
|
+
- 状态修改和实例变量访问
|
|
285
|
+
- 继承和多态特性
|
|
286
|
+
|
|
287
|
+
### 事件驱动/回调式
|
|
288
|
+
- 事件注册和触发机制
|
|
289
|
+
- 回调链和异步流程
|
|
290
|
+
- 状态管理和并发控制
|
|
291
|
+
|
|
292
|
+
### 声明式
|
|
293
|
+
- 规则和约束定义
|
|
294
|
+
- 表达式和模式匹配
|
|
295
|
+
- 执行上下文和环境
|
|
214
296
|
|
|
215
297
|
## 输出要求
|
|
216
298
|
- 直接回应分析目标的关键问题
|
|
@@ -238,6 +320,7 @@ class FunctionAnalyzerTool:
|
|
|
238
320
|
## 报告要求
|
|
239
321
|
生成一份完全以分析目标为导向的函数分析报告,{depth_description}。不要遵循固定的报告模板,而是完全根据分析目标来组织内容:
|
|
240
322
|
|
|
323
|
+
- 首先简要说明项目的主要编程语言和技术栈
|
|
241
324
|
- 专注回答分析目标提出的问题
|
|
242
325
|
- 只包含与分析目标直接相关的实现发现和洞察
|
|
243
326
|
- 完全跳过与分析目标无关的内容,无需做全面分析
|
|
@@ -110,7 +110,7 @@ class GitCommitTool:
|
|
|
110
110
|
# 分析材料
|
|
111
111
|
{diff}
|
|
112
112
|
'''
|
|
113
|
-
platform = PlatformRegistry().
|
|
113
|
+
platform = PlatformRegistry().get_normal_platform()
|
|
114
114
|
commit_message = platform.chat_until_success(prompt)
|
|
115
115
|
commit_message = self._extract_commit_message(commit_message)
|
|
116
116
|
spinner.write("✅ 生成提交消息")
|
|
@@ -4,7 +4,6 @@ import glob
|
|
|
4
4
|
import hashlib
|
|
5
5
|
from typing import Dict, Optional, Any
|
|
6
6
|
|
|
7
|
-
from jarvis.jarvis_utils.config import is_use_methodology
|
|
8
7
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
9
8
|
|
|
10
9
|
|
|
@@ -34,11 +33,6 @@ class MethodologyTool:
|
|
|
34
33
|
},
|
|
35
34
|
"required": ["operation", "problem_type"]
|
|
36
35
|
}
|
|
37
|
-
|
|
38
|
-
@staticmethod
|
|
39
|
-
def check()->bool:
|
|
40
|
-
"""检查是否启用了方法论功能"""
|
|
41
|
-
return is_use_methodology()
|
|
42
36
|
|
|
43
37
|
def __init__(self):
|
|
44
38
|
"""初始化经验管理工具"""
|
|
@@ -9,11 +9,11 @@ from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
|
9
9
|
class ProjectAnalyzerTool:
|
|
10
10
|
"""
|
|
11
11
|
项目分析工具
|
|
12
|
-
使用agent
|
|
12
|
+
使用agent分析项目结构、入口点、模块划分等信息(支持所有文件类型)
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
15
|
name = "project_analyzer"
|
|
16
|
-
description = "
|
|
16
|
+
description = "分析项目结构、入口点、模块划分等信息,提供项目概览(支持所有文件类型)"
|
|
17
17
|
parameters = {
|
|
18
18
|
"type": "object",
|
|
19
19
|
"properties": {
|
|
@@ -97,12 +97,8 @@ class ProjectAnalyzerTool:
|
|
|
97
97
|
name=f"ProjectAnalyzer",
|
|
98
98
|
description=f"分析项目结构、模块划分和关键组件",
|
|
99
99
|
summary_prompt=summary_prompt,
|
|
100
|
-
platform=PlatformRegistry().
|
|
100
|
+
platform=PlatformRegistry().get_normal_platform(),
|
|
101
101
|
output_handler=[tool_registry],
|
|
102
|
-
need_summary=True,
|
|
103
|
-
is_sub_agent=True,
|
|
104
|
-
use_methodology=False,
|
|
105
|
-
record_methodology=False,
|
|
106
102
|
execute_tool_confirm=False,
|
|
107
103
|
auto_complete=True
|
|
108
104
|
)
|
|
@@ -152,42 +148,131 @@ class ProjectAnalyzerTool:
|
|
|
152
148
|
## 任务描述
|
|
153
149
|
对项目 `{root_dir}` 进行针对性分析,专注于分析目标所需的内容,生成有针对性、深入且有洞察力的项目分析报告。{objective_text}
|
|
154
150
|
|
|
151
|
+
## 工具使用优先级
|
|
152
|
+
1. **优先使用 execute_shell 执行 fd 命令**:
|
|
153
|
+
- `fd -t f -e py` 查找所有Python文件
|
|
154
|
+
- `fd -t d` 列出所有目录
|
|
155
|
+
- `fd README.md` 查找所有README文件
|
|
156
|
+
|
|
157
|
+
2. **优先使用 execute_shell 执行 rg 命令**:
|
|
158
|
+
- `rg "import" --type py` 搜索导入语句
|
|
159
|
+
- `rg "class|def" --type py` 搜索类和函数定义
|
|
160
|
+
- `rg "TODO|FIXME" --type py` 搜索代码注释
|
|
161
|
+
|
|
162
|
+
3. **优先使用 execute_shell 执行 loc 命令**:
|
|
163
|
+
- `loc` 统计所有代码行数
|
|
164
|
+
- `loc --include="*.py"` 统计Python代码行数
|
|
165
|
+
|
|
166
|
+
4. **辅以 read_code 读取关键文件**:
|
|
167
|
+
- 读取README.md、配置文件、主要模块
|
|
168
|
+
- 对于较大的文件,可读取关键部分
|
|
169
|
+
|
|
170
|
+
5. **避免使用专用分析工具**:
|
|
171
|
+
- 只有当fd、rg、loc命令和read_code工具无法满足需求时才考虑使用
|
|
172
|
+
|
|
155
173
|
## 分析范围
|
|
156
174
|
- 项目根目录: `{root_dir}`
|
|
157
175
|
- 重点分析: {focus_dirs_str}
|
|
158
176
|
- 排除目录: {exclude_dirs_str}
|
|
159
177
|
|
|
160
178
|
## 分析策略
|
|
161
|
-
1.
|
|
162
|
-
2.
|
|
163
|
-
3.
|
|
164
|
-
4.
|
|
179
|
+
1. 在一切分析开始前,先使用loc确定项目的主要编程语言和技术栈
|
|
180
|
+
2. 理解分析目标,确定你需要寻找什么信息
|
|
181
|
+
3. 灵活采用适合目标的分析方法,不受预设分析框架的限制
|
|
182
|
+
4. 有选择地探索项目,只关注与目标直接相关的部分
|
|
183
|
+
5. 根据目标需要自行判断分析的深度和广度
|
|
184
|
+
6. 保证分析的完整性,收集充分的信息后再得出结论
|
|
185
|
+
|
|
186
|
+
## 分析步骤
|
|
187
|
+
以下步骤应根据具体分析目标灵活应用:
|
|
188
|
+
|
|
189
|
+
1. **确定项目的编程语言和技术栈**:
|
|
190
|
+
- 使用 `loc` 统计各类文件数量和分布
|
|
191
|
+
- 使用 `fd package.json` 或 `fd requirements.txt` 查找依赖配置文件
|
|
192
|
+
- 使用 `read_code` 读取配置文件,确定使用的主要框架和依赖
|
|
193
|
+
|
|
194
|
+
2. **梳理项目结构**:
|
|
195
|
+
- 使用 `fd -t d -d 3` 识别三层以内的目录结构
|
|
196
|
+
- 使用 `fd README.md` 查找并阅读项目说明文件
|
|
197
|
+
- 使用 `fd -t f -d 1` 查看根目录下的主要文件
|
|
198
|
+
|
|
199
|
+
3. **定位核心组件**:
|
|
200
|
+
- 使用 `fd -t f -e py` 找出所有Python文件(或其他语言文件)
|
|
201
|
+
- 使用 `rg "class\\s+[A-Z]" --type py` 查找主要类定义
|
|
202
|
+
- 使用 `rg "def\\s+main|if\\s+__name__\\s*==\\s*['\"]__main__['\"]" --type py` 查找入口点
|
|
203
|
+
|
|
204
|
+
4. **分析入口点和执行流程**:
|
|
205
|
+
- 使用 `read_code` 读取入口文件内容
|
|
206
|
+
- 使用 `rg "import|from" 入口文件路径` 查找导入的模块
|
|
207
|
+
- 分析初始化和主要执行流程
|
|
208
|
+
|
|
209
|
+
5. **研究核心实现**:
|
|
210
|
+
- 深入分析与分析目标相关的关键代码
|
|
211
|
+
- 使用 `read_code` 读取关键文件内容
|
|
212
|
+
- 使用 `rg` 搜索特定功能的实现
|
|
213
|
+
|
|
214
|
+
6. **总结并提供见解**:
|
|
215
|
+
- 基于分析形成对项目的整体理解
|
|
216
|
+
- 提供与分析目标直接相关的关键发现
|
|
217
|
+
- 做出有建设性的评价和建议
|
|
218
|
+
|
|
219
|
+
## 常用分析命令
|
|
220
|
+
|
|
221
|
+
### 项目结构分析
|
|
222
|
+
- `fd -t d -d 3` 列出三层以内的目录结构
|
|
223
|
+
- `fd -t f -e py -g "test*" -d 3` 查找前三层目录中的Python测试文件
|
|
224
|
+
- `fd -t f -e py | wc -l` 统计Python文件数量
|
|
225
|
+
- `fd -t f -e py -o -e js -o -e html -o -e css` 查找所有前端和后端文件
|
|
226
|
+
|
|
227
|
+
### 代码内容分析
|
|
228
|
+
- `rg "^\\s*class\\s+[A-Z]" --type py` 查找Python类定义
|
|
229
|
+
- `rg "^\\s*def\\s+" --type py` 查找Python函数定义
|
|
230
|
+
- `rg "import|from\\s+.+\\s+import" --type py` 查找Python导入语句
|
|
231
|
+
- `rg "CREATE TABLE" --type sql` 查找数据库表定义
|
|
232
|
+
|
|
233
|
+
### 代码统计分析
|
|
234
|
+
- `loc` 获取项目总体代码统计
|
|
235
|
+
- `loc --include="*.py"` 统计Python代码量
|
|
236
|
+
- `loc --include="*.js" --include="*.jsx" --include="*.ts" --include="*.tsx"` 统计JavaScript/TypeScript代码量
|
|
237
|
+
- `loc --exclude="test"` 排除测试代码后的统计
|
|
238
|
+
|
|
239
|
+
### 依赖分析
|
|
240
|
+
- `read_code requirements.txt` 读取Python依赖
|
|
241
|
+
- `read_code package.json` 读取Node.js依赖
|
|
242
|
+
- `read_code go.mod` 读取Go依赖
|
|
243
|
+
- `read_code pom.xml` 读取Java Maven依赖
|
|
244
|
+
|
|
245
|
+
记住:始终将分析目标作为分析过程的指导原则,不必为了完整性而执行与目标无关的步骤。
|
|
246
|
+
|
|
247
|
+
## 分析框架适应
|
|
165
248
|
|
|
166
|
-
|
|
167
|
-
```bash
|
|
168
|
-
# 获取项目文件结构
|
|
169
|
-
find . -type f -not -path "*/\\.*" | sort
|
|
249
|
+
根据不同类型的项目架构,应调整分析重点:
|
|
170
250
|
|
|
171
|
-
|
|
172
|
-
|
|
251
|
+
### 单体应用
|
|
252
|
+
- 核心业务逻辑和数据流
|
|
253
|
+
- 模块划分和内部依赖
|
|
254
|
+
- 扩展点和插件机制
|
|
173
255
|
|
|
174
|
-
|
|
175
|
-
|
|
256
|
+
### 微服务架构
|
|
257
|
+
- 服务边界和接口定义
|
|
258
|
+
- 服务间通信和数据交换
|
|
259
|
+
- 服务发现和配置管理
|
|
176
260
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
261
|
+
### 前端应用
|
|
262
|
+
- 组件结构和状态管理
|
|
263
|
+
- 路由和页面转换
|
|
264
|
+
- API调用和数据处理
|
|
180
265
|
|
|
181
|
-
|
|
182
|
-
-
|
|
183
|
-
-
|
|
184
|
-
-
|
|
185
|
-
- 使用`find_caller`追踪函数调用关系和依赖
|
|
266
|
+
### 数据处理系统
|
|
267
|
+
- 数据流向和转换过程
|
|
268
|
+
- 算法实现和优化方式
|
|
269
|
+
- 并行处理和性能考量
|
|
186
270
|
|
|
187
|
-
##
|
|
271
|
+
## 输出要求
|
|
188
272
|
- 直接回应分析目标的关键问题
|
|
189
273
|
- 提供与目标相关的深入洞察
|
|
190
274
|
- 分析内容应直接服务于分析目标
|
|
275
|
+
- 确保全面收集相关信息后再形成结论
|
|
191
276
|
- 避免与目标无关的冗余信息
|
|
192
277
|
- 使用具体代码路径和示例支持分析结论
|
|
193
278
|
- 提供针对分析目标的具体建议和改进方向"""
|
|
@@ -210,11 +295,14 @@ find . -name "core.*" -o -name "*core*" -o -name "main.*" -o -name "api.*"
|
|
|
210
295
|
## 报告要求
|
|
211
296
|
生成一份完全以分析目标为导向的项目分析报告。不要遵循固定的报告模板,而是完全根据分析目标来组织内容:
|
|
212
297
|
|
|
298
|
+
- 首先详细说明项目的主要编程语言、技术栈、框架和依赖
|
|
213
299
|
- 专注回答分析目标提出的问题
|
|
214
300
|
- 只包含与分析目标直接相关的发现和洞察
|
|
215
301
|
- 完全跳过与分析目标无关的内容,无需做全面分析
|
|
216
302
|
- 分析深度应与目标的具体需求匹配
|
|
217
303
|
- 使用具体的代码路径和示例支持你的观点
|
|
304
|
+
- 确保在得出结论前已全面收集和分析相关信息,避免基于部分信息形成不完整或偏颇的判断
|
|
305
|
+
- 根据分析目标灵活组织报告结构,不必包含所有传统的项目分析章节
|
|
218
306
|
- 以清晰的Markdown格式呈现,简洁明了
|
|
219
307
|
|
|
220
308
|
在分析中保持灵活性,避免固定思维模式。你的任务不是提供全面的项目概览,而是直接解决分析目标中提出的具体问题。"""
|