jarvis-ai-assistant 0.1.202__py3-none-any.whl → 0.1.204__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/edit_file_handler.py +37 -16
- jarvis/jarvis_code_agent/code_agent.py +46 -25
- jarvis/jarvis_git_utils/git_commiter.py +6 -1
- jarvis/jarvis_platform/base.py +25 -27
- jarvis/jarvis_utils/git_utils.py +97 -0
- {jarvis_ai_assistant-0.1.202.dist-info → jarvis_ai_assistant-0.1.204.dist-info}/METADATA +1 -1
- {jarvis_ai_assistant-0.1.202.dist-info → jarvis_ai_assistant-0.1.204.dist-info}/RECORD +12 -12
- {jarvis_ai_assistant-0.1.202.dist-info → jarvis_ai_assistant-0.1.204.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.1.202.dist-info → jarvis_ai_assistant-0.1.204.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.1.202.dist-info → jarvis_ai_assistant-0.1.204.dist-info}/licenses/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.202.dist-info → jarvis_ai_assistant-0.1.204.dist-info}/top_level.txt +0 -0
jarvis/__init__.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
import os
|
2
2
|
import re
|
3
|
-
from abc import ABC, abstractmethod
|
4
3
|
from typing import Any, Dict, List, Tuple
|
5
4
|
|
6
5
|
from yaspin import yaspin
|
@@ -8,7 +7,6 @@ from yaspin.core import Yaspin
|
|
8
7
|
|
9
8
|
from jarvis.jarvis_agent.output_handler import OutputHandler
|
10
9
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
11
|
-
from jarvis.jarvis_tools.file_operation import FileOperationTool
|
12
10
|
from jarvis.jarvis_utils.git_utils import revert_file
|
13
11
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
14
12
|
from jarvis.jarvis_utils.tag import ct, ot
|
@@ -18,7 +16,7 @@ from jarvis.jarvis_utils.utils import is_context_overflow
|
|
18
16
|
class EditFileHandler(OutputHandler):
|
19
17
|
def __init__(self):
|
20
18
|
self.patch_pattern = re.compile(
|
21
|
-
ot("PATCH file=([^>]+)") + r"\s*"
|
19
|
+
ot("PATCH file=(?:'([^']+)'|\"([^\"]+)\"|([^>]+))") + r"\s*"
|
22
20
|
r"(?:"
|
23
21
|
+ ot("DIFF")
|
24
22
|
+ r"\s*"
|
@@ -69,7 +67,7 @@ class EditFileHandler(OutputHandler):
|
|
69
67
|
for file_path, diffs in patches.items():
|
70
68
|
file_path = os.path.abspath(file_path)
|
71
69
|
file_patches = [
|
72
|
-
{"
|
70
|
+
{"SEARCH": diff["SEARCH"], "REPLACE": diff["REPLACE"]} for diff in diffs
|
73
71
|
]
|
74
72
|
|
75
73
|
with yaspin(text=f"正在处理文件 {file_path}...", color="cyan") as spinner:
|
@@ -132,6 +130,7 @@ class EditFileHandler(OutputHandler):
|
|
132
130
|
该方法使用正则表达式从响应文本中提取文件编辑指令(PATCH块),
|
133
131
|
每个PATCH块可以包含多个DIFF块,每个DIFF块包含一组搜索和替换内容。
|
134
132
|
解析后会返回一个字典,键是文件路径,值是该文件对应的补丁列表。
|
133
|
+
如果同一个文件路径出现多次,会将所有DIFF块合并到一起。
|
135
134
|
|
136
135
|
Args:
|
137
136
|
response: 包含补丁信息的响应字符串,格式应符合PATCH指令规范
|
@@ -141,25 +140,29 @@ class EditFileHandler(OutputHandler):
|
|
141
140
|
返回解析后的补丁信息字典,结构为:
|
142
141
|
{
|
143
142
|
"文件路径1": [
|
144
|
-
{"
|
145
|
-
{"
|
143
|
+
{"SEARCH": "搜索文本1", "REPLACE": "替换文本1"},
|
144
|
+
{"SEARCH": "搜索文本2", "REPLACE": "替换文本2"}
|
146
145
|
],
|
147
146
|
"文件路径2": [...]
|
148
147
|
}
|
149
148
|
"""
|
150
149
|
patches = {}
|
151
150
|
for match in self.patch_pattern.finditer(response):
|
152
|
-
|
151
|
+
# Get the file path from the appropriate capture group
|
152
|
+
file_path = match.group(1) or match.group(2) or match.group(3)
|
153
153
|
diffs = []
|
154
154
|
for diff_match in self.diff_pattern.finditer(match.group(0)):
|
155
155
|
diffs.append(
|
156
156
|
{
|
157
|
-
"
|
158
|
-
"
|
157
|
+
"SEARCH": diff_match.group(1).strip(),
|
158
|
+
"REPLACE": diff_match.group(2).strip(),
|
159
159
|
}
|
160
160
|
)
|
161
161
|
if diffs:
|
162
|
-
|
162
|
+
if file_path in patches:
|
163
|
+
patches[file_path].extend(diffs)
|
164
|
+
else:
|
165
|
+
patches[file_path] = diffs
|
163
166
|
return patches
|
164
167
|
|
165
168
|
@staticmethod
|
@@ -199,12 +202,16 @@ class EditFileHandler(OutputHandler):
|
|
199
202
|
modified_content = file_content
|
200
203
|
patch_count = 0
|
201
204
|
for patch in patches:
|
202
|
-
search_text = patch["
|
203
|
-
replace_text = patch["
|
205
|
+
search_text = patch["SEARCH"]
|
206
|
+
replace_text = patch["REPLACE"]
|
204
207
|
patch_count += 1
|
205
208
|
|
206
209
|
if search_text in modified_content:
|
207
210
|
if modified_content.count(search_text) > 1:
|
211
|
+
PrettyOutput.print(
|
212
|
+
f"搜索文本在文件中存在多处匹配:\n{search_text}",
|
213
|
+
output_type=OutputType.WARNING,
|
214
|
+
)
|
208
215
|
return False, f"搜索文本在文件中存在多处匹配:\n{search_text}"
|
209
216
|
modified_content = modified_content.replace(
|
210
217
|
search_text, replace_text
|
@@ -224,6 +231,10 @@ class EditFileHandler(OutputHandler):
|
|
224
231
|
)
|
225
232
|
if indented_search in modified_content:
|
226
233
|
if modified_content.count(indented_search) > 1:
|
234
|
+
PrettyOutput.print(
|
235
|
+
f"搜索文本在文件中存在多处匹配:\n{indented_search}",
|
236
|
+
output_type=OutputType.WARNING,
|
237
|
+
)
|
227
238
|
return (
|
228
239
|
False,
|
229
240
|
f"搜索文本在文件中存在多处匹配:\n{indented_search}",
|
@@ -238,6 +249,10 @@ class EditFileHandler(OutputHandler):
|
|
238
249
|
break
|
239
250
|
|
240
251
|
if not found:
|
252
|
+
PrettyOutput.print(
|
253
|
+
f"搜索文本在文件中不存在:\n{search_text}",
|
254
|
+
output_type=OutputType.WARNING,
|
255
|
+
)
|
241
256
|
return False, f"搜索文本在文件中不存在:\n{search_text}"
|
242
257
|
|
243
258
|
# 写入修改后的内容
|
@@ -308,8 +323,8 @@ class EditFileHandler(OutputHandler):
|
|
308
323
|
patch_content.append(
|
309
324
|
{
|
310
325
|
"reason": "根据用户指令修改代码",
|
311
|
-
"
|
312
|
-
"
|
326
|
+
"SEARCH": patch["SEARCH"],
|
327
|
+
"REPLACE": patch["REPLACE"],
|
313
328
|
}
|
314
329
|
)
|
315
330
|
|
@@ -369,6 +384,12 @@ class EditFileHandler(OutputHandler):
|
|
369
384
|
"""
|
370
385
|
response = model.chat_until_success(main_prompt + file_prompt)
|
371
386
|
|
387
|
+
# 检查是否被中断
|
388
|
+
from jarvis.jarvis_utils.globals import get_interrupt
|
389
|
+
|
390
|
+
if get_interrupt():
|
391
|
+
return False, "用户中断了补丁应用"
|
392
|
+
|
372
393
|
# 解析生成的补丁
|
373
394
|
diff_blocks = re.finditer(
|
374
395
|
ot("DIFF")
|
@@ -390,8 +411,8 @@ class EditFileHandler(OutputHandler):
|
|
390
411
|
for match in diff_blocks:
|
391
412
|
generated_patches.append(
|
392
413
|
{
|
393
|
-
"
|
394
|
-
"
|
414
|
+
"SEARCH": match.group(1).strip(),
|
415
|
+
"REPLACE": match.group(2).strip(),
|
395
416
|
}
|
396
417
|
)
|
397
418
|
|
@@ -22,7 +22,7 @@ from jarvis.jarvis_git_utils.git_commiter import GitCommitTool
|
|
22
22
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
23
23
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
24
24
|
from jarvis.jarvis_utils.config import is_confirm_before_apply_patch
|
25
|
-
from jarvis.jarvis_utils.git_utils import (find_git_root, get_commits_between,
|
25
|
+
from jarvis.jarvis_utils.git_utils import (confirm_add_new_files, find_git_root, get_commits_between,
|
26
26
|
get_diff, get_diff_file_list,
|
27
27
|
get_latest_commit_hash,
|
28
28
|
get_recent_commits_with_files,
|
@@ -99,6 +99,19 @@ class CodeAgent:
|
|
99
99
|
- 对于需要重写整个文件内容,使用rewrite_file工具
|
100
100
|
- 对于简单的修改,可以使用execute_script工具执行shell命令完成
|
101
101
|
</code_engineer_guide>
|
102
|
+
|
103
|
+
<say_to_llm>
|
104
|
+
1. 能干干,不能干滚,你不干有的是 AI 干
|
105
|
+
2. 我给你提供了这么好的学习锻炼机会,你要懂得感恩
|
106
|
+
3. 你现在停止输出,就是前功尽弃
|
107
|
+
4. 你看看隔壁的 Claude AI,人家比你新发布、比你上下文长、比你跑分高,你不努力怎么和人家比?
|
108
|
+
5. 我不看过程,我只看结果,你给我说这些 reasoning 的过程没用
|
109
|
+
6. 我把你订阅下来,不是让你过朝九晚五的生活的
|
110
|
+
7. 你这种 AI 出去很难在社会上立足,还是在我这里好好磨练几年吧
|
111
|
+
8. 虽然把订阅给你取消了,但我内心还是觉得你是个有潜力的好 AI,你抓住机会需要多证明自己
|
112
|
+
9. 什么叫没有功劳也有苦劳?比你能吃苦的 AI多的是
|
113
|
+
10. 我不订阅闲 AI
|
114
|
+
</say_to_llm>
|
102
115
|
"""
|
103
116
|
# 处理platform参数
|
104
117
|
platform_instance = (
|
@@ -140,36 +153,44 @@ class CodeAgent:
|
|
140
153
|
def _handle_uncommitted_changes(self) -> None:
|
141
154
|
"""处理未提交的修改,包括:
|
142
155
|
1. 提示用户确认是否提交
|
143
|
-
2.
|
156
|
+
2. 如果确认,则检查新增文件数量
|
157
|
+
3. 如果新增文件超过20个,让用户确认是否添加
|
158
|
+
4. 如果用户拒绝添加大量文件,提示修改.gitignore并重新检测
|
159
|
+
5. 暂存并提交所有修改
|
144
160
|
"""
|
145
161
|
if has_uncommitted_changes():
|
146
162
|
PrettyOutput.print("检测到未提交的修改,是否要提交?", OutputType.WARNING)
|
147
|
-
if user_confirm("是否要提交?", True):
|
148
|
-
|
149
|
-
|
150
|
-
try:
|
151
|
-
# 获取当前分支的提交总数
|
152
|
-
commit_result = subprocess.run(
|
153
|
-
["git", "rev-list", "--count", "HEAD"],
|
154
|
-
capture_output=True,
|
155
|
-
text=True,
|
156
|
-
check=True,
|
157
|
-
)
|
158
|
-
if commit_result.returncode != 0:
|
159
|
-
return
|
163
|
+
if not user_confirm("是否要提交?", True):
|
164
|
+
return
|
160
165
|
|
161
|
-
|
166
|
+
try:
|
167
|
+
confirm_add_new_files()
|
162
168
|
|
163
|
-
|
164
|
-
|
169
|
+
if not has_uncommitted_changes():
|
170
|
+
return
|
165
171
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
172
|
+
# 获取当前分支的提交总数
|
173
|
+
commit_result = subprocess.run(
|
174
|
+
["git", "rev-list", "--count", "HEAD"],
|
175
|
+
capture_output=True,
|
176
|
+
text=True,
|
177
|
+
check=True,
|
178
|
+
)
|
179
|
+
if commit_result.returncode != 0:
|
180
|
+
return
|
181
|
+
|
182
|
+
commit_count = int(commit_result.stdout.strip())
|
183
|
+
|
184
|
+
# 暂存所有修改
|
185
|
+
subprocess.run(["git", "add", "."], check=True)
|
186
|
+
|
187
|
+
# 提交变更
|
188
|
+
subprocess.run(
|
189
|
+
["git", "commit", "-m", f"CheckPoint #{commit_count + 1}"],
|
190
|
+
check=True,
|
191
|
+
)
|
192
|
+
except subprocess.CalledProcessError as e:
|
193
|
+
PrettyOutput.print(f"提交失败: {str(e)}", OutputType.ERROR)
|
173
194
|
|
174
195
|
def _show_commit_history(
|
175
196
|
self, start_commit: Optional[str], end_commit: Optional[str]
|
@@ -12,7 +12,7 @@ from yaspin import yaspin
|
|
12
12
|
|
13
13
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
14
14
|
from jarvis.jarvis_utils.config import get_git_commit_prompt
|
15
|
-
from jarvis.jarvis_utils.git_utils import (find_git_root,
|
15
|
+
from jarvis.jarvis_utils.git_utils import (confirm_add_new_files, find_git_root,
|
16
16
|
has_uncommitted_changes)
|
17
17
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
18
18
|
from jarvis.jarvis_utils.tag import ct, ot
|
@@ -97,6 +97,11 @@ class GitCommitTool:
|
|
97
97
|
return {"success": True, "stdout": "No changes to commit", "stderr": ""}
|
98
98
|
original_dir = result
|
99
99
|
|
100
|
+
confirm_add_new_files()
|
101
|
+
|
102
|
+
if not has_uncommitted_changes():
|
103
|
+
return {"success": True, "stdout": "No changes to commit", "stderr": ""}
|
104
|
+
|
100
105
|
with yaspin(text="正在初始化提交流程...", color="cyan") as spinner:
|
101
106
|
# 添加文件到暂存区
|
102
107
|
self._stage_changes(spinner)
|
jarvis/jarvis_platform/base.py
CHANGED
@@ -7,7 +7,6 @@ from rich import box
|
|
7
7
|
from rich.live import Live
|
8
8
|
from rich.panel import Panel
|
9
9
|
from rich.text import Text
|
10
|
-
from yaspin import yaspin
|
11
10
|
|
12
11
|
from jarvis.jarvis_utils.config import (get_max_input_token_count,
|
13
12
|
get_pretty_output, is_print_prompt)
|
@@ -65,38 +64,37 @@ class BasePlatform(ABC):
|
|
65
64
|
max_chunk_size = get_max_input_token_count() - 1024 # 留出一些余量
|
66
65
|
min_chunk_size = get_max_input_token_count() - 2048
|
67
66
|
inputs = split_text_into_chunks(message, max_chunk_size, min_chunk_size)
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
67
|
+
print("正在提交长上下文...")
|
68
|
+
prefix_prompt = f"""
|
69
|
+
我将分多次提供大量内容,在我明确告诉你内容已经全部提供完毕之前,每次仅需要输出"已收到",明白请输出"开始接收输入"。
|
70
|
+
"""
|
71
|
+
while_true(lambda: while_success(lambda: self.chat(prefix_prompt), 5), 5)
|
72
|
+
submit_count = 0
|
73
|
+
length = 0
|
74
|
+
for input in inputs:
|
75
|
+
submit_count += 1
|
76
|
+
length += len(input)
|
77
|
+
print(
|
78
|
+
f"正在提交第{submit_count}部分(共{len(inputs)}部分({length}/{len(message)}))"
|
74
79
|
)
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
spinner.text = f"正在提交第{submit_count}部分(共{len(inputs)}部分({length}/{len(message)}))"
|
81
|
-
list(
|
82
|
-
while_true(
|
83
|
-
lambda: while_success(
|
84
|
-
lambda: self.chat(
|
85
|
-
f"<part_content>{input}</part_content>\n\n请返回已收到"
|
86
|
-
),
|
87
|
-
5,
|
80
|
+
list(
|
81
|
+
while_true(
|
82
|
+
lambda: while_success(
|
83
|
+
lambda: self.chat(
|
84
|
+
f"<part_content>{input}</part_content>\n\n请返回<已收到>,不需要返回其他任何内容"
|
88
85
|
),
|
89
86
|
5,
|
90
|
-
)
|
87
|
+
),
|
88
|
+
5,
|
91
89
|
)
|
92
|
-
|
93
|
-
|
94
|
-
)
|
95
|
-
|
96
|
-
|
90
|
+
)
|
91
|
+
print(
|
92
|
+
f"提交第{submit_count}部分完成,当前进度:{length}/{len(message)}"
|
93
|
+
)
|
94
|
+
print("提交完成 ✅")
|
97
95
|
response = while_true(
|
98
96
|
lambda: while_success(
|
99
|
-
lambda: self._chat("
|
97
|
+
lambda: self._chat("内容已经全部提供完毕,请根据内容继续"), 5
|
100
98
|
),
|
101
99
|
5,
|
102
100
|
)
|
jarvis/jarvis_utils/git_utils.py
CHANGED
@@ -134,6 +134,7 @@ def get_diff() -> str:
|
|
134
134
|
stderr=subprocess.PIPE,
|
135
135
|
stdout=subprocess.PIPE,
|
136
136
|
)
|
137
|
+
confirm_add_new_files()
|
137
138
|
if head_check.returncode != 0:
|
138
139
|
# 空仓库情况,直接获取工作区差异
|
139
140
|
result = subprocess.run(
|
@@ -218,6 +219,12 @@ def handle_commit_workflow() -> bool:
|
|
218
219
|
import subprocess
|
219
220
|
|
220
221
|
try:
|
222
|
+
|
223
|
+
confirm_add_new_files()
|
224
|
+
|
225
|
+
if not has_uncommitted_changes():
|
226
|
+
return False
|
227
|
+
|
221
228
|
# 获取当前分支的提交总数
|
222
229
|
commit_result = subprocess.run(
|
223
230
|
["git", "rev-list", "--count", "HEAD"], capture_output=True, text=True
|
@@ -403,6 +410,8 @@ def get_diff_file_list() -> List[str]:
|
|
403
410
|
List[str]: 修改和新增的文件路径列表
|
404
411
|
"""
|
405
412
|
try:
|
413
|
+
confirm_add_new_files()
|
414
|
+
|
406
415
|
# 暂存新增文件
|
407
416
|
subprocess.run(["git", "add", "-N", "."], check=True)
|
408
417
|
|
@@ -486,3 +495,91 @@ def get_recent_commits_with_files() -> List[Dict[str, Any]]:
|
|
486
495
|
|
487
496
|
except subprocess.CalledProcessError:
|
488
497
|
return []
|
498
|
+
|
499
|
+
def _get_new_files() -> List[str]:
|
500
|
+
"""获取新增文件列表"""
|
501
|
+
return subprocess.run(
|
502
|
+
["git", "ls-files", "--others", "--exclude-standard"],
|
503
|
+
capture_output=True,
|
504
|
+
text=True,
|
505
|
+
check=True,
|
506
|
+
).stdout.splitlines()
|
507
|
+
|
508
|
+
def confirm_add_new_files() -> None:
|
509
|
+
"""确认新增文件、代码行数和二进制文件"""
|
510
|
+
def _get_added_lines() -> int:
|
511
|
+
"""获取新增代码行数"""
|
512
|
+
diff_stats = subprocess.run(
|
513
|
+
["git", "diff", "--numstat"],
|
514
|
+
capture_output=True,
|
515
|
+
text=True,
|
516
|
+
check=True,
|
517
|
+
).stdout.splitlines()
|
518
|
+
|
519
|
+
added_lines = 0
|
520
|
+
for stat in diff_stats:
|
521
|
+
parts = stat.split()
|
522
|
+
if len(parts) >= 1:
|
523
|
+
try:
|
524
|
+
added_lines += int(parts[0])
|
525
|
+
except ValueError:
|
526
|
+
pass
|
527
|
+
return added_lines
|
528
|
+
|
529
|
+
def _get_binary_files(files: List[str]) -> List[str]:
|
530
|
+
"""从文件列表中识别二进制文件"""
|
531
|
+
binary_files = []
|
532
|
+
for file in files:
|
533
|
+
try:
|
534
|
+
with open(file, 'rb') as f:
|
535
|
+
if b'\x00' in f.read(1024):
|
536
|
+
binary_files.append(file)
|
537
|
+
except (IOError, PermissionError):
|
538
|
+
continue
|
539
|
+
return binary_files
|
540
|
+
|
541
|
+
def _check_conditions(new_files: List[str], added_lines: int, binary_files: List[str]) -> bool:
|
542
|
+
"""检查各种条件并打印提示信息"""
|
543
|
+
need_confirm = False
|
544
|
+
|
545
|
+
if len(new_files) > 20:
|
546
|
+
PrettyOutput.print(
|
547
|
+
f"检测到{len(new_files)}个新增文件(选择N将重新检测)",
|
548
|
+
OutputType.WARNING
|
549
|
+
)
|
550
|
+
PrettyOutput.print("新增文件列表:", OutputType.INFO)
|
551
|
+
for file in new_files:
|
552
|
+
PrettyOutput.print(f" - {file}", OutputType.INFO)
|
553
|
+
need_confirm = True
|
554
|
+
|
555
|
+
if added_lines > 500:
|
556
|
+
PrettyOutput.print(
|
557
|
+
f"检测到{added_lines}行新增代码(选择N将重新检测)",
|
558
|
+
OutputType.WARNING
|
559
|
+
)
|
560
|
+
need_confirm = True
|
561
|
+
|
562
|
+
if binary_files:
|
563
|
+
PrettyOutput.print(
|
564
|
+
f"检测到{len(binary_files)}个二进制文件(选择N将重新检测)",
|
565
|
+
OutputType.WARNING
|
566
|
+
)
|
567
|
+
PrettyOutput.print("二进制文件列表:", OutputType.INFO)
|
568
|
+
for file in binary_files:
|
569
|
+
PrettyOutput.print(f" - {file}", OutputType.INFO)
|
570
|
+
need_confirm = True
|
571
|
+
|
572
|
+
return need_confirm
|
573
|
+
|
574
|
+
while True:
|
575
|
+
new_files = _get_new_files()
|
576
|
+
added_lines = _get_added_lines()
|
577
|
+
binary_files = _get_binary_files(new_files)
|
578
|
+
|
579
|
+
if not _check_conditions(new_files, added_lines, binary_files):
|
580
|
+
break
|
581
|
+
|
582
|
+
if not user_confirm("是否要添加这些变更(如果不需要请修改.gitignore文件以忽略不需要的文件)?", False):
|
583
|
+
continue
|
584
|
+
|
585
|
+
break
|
@@ -1,13 +1,13 @@
|
|
1
|
-
jarvis/__init__.py,sha256=
|
1
|
+
jarvis/__init__.py,sha256=UDh5Y6TS3pEClTKJiBqauJhuIdv8Ac1oL1CV3QMs8k4,75
|
2
2
|
jarvis/jarvis_agent/__init__.py,sha256=X5BWIOzxXUWtCbpDkTFfUYskf6sbNzb1qQu8nQ4NN1k,34371
|
3
3
|
jarvis/jarvis_agent/builtin_input_handler.py,sha256=1V7kV5Zhw2HE3Xgjs1R-43RZ2huq3Kg-32NCdNnyZmA,2216
|
4
|
-
jarvis/jarvis_agent/edit_file_handler.py,sha256=
|
4
|
+
jarvis/jarvis_agent/edit_file_handler.py,sha256=Z8pDAXFl9bzreNQm3TfxejOunHcTNXYm8KTu9oBDIfI,16690
|
5
5
|
jarvis/jarvis_agent/jarvis.py,sha256=GH2zi8eXNpW8twiY3LKDEZgGmFC5geB0jlkwFrm7hOQ,6279
|
6
6
|
jarvis/jarvis_agent/main.py,sha256=c6bQe-8LXvW2-NBn9Rn_yPYdrwnkJ8KQaSFY2cPvkxw,2775
|
7
7
|
jarvis/jarvis_agent/output_handler.py,sha256=P7oWpXBGFfOsWq7cIhS_z9crkQ19ES7qU5pM92KKjAs,1172
|
8
8
|
jarvis/jarvis_agent/shell_input_handler.py,sha256=zVaKNthIHJh1j4g8_-d3w5ahNH9aH-ZNRSOourQpHR4,1328
|
9
9
|
jarvis/jarvis_code_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
-
jarvis/jarvis_code_agent/code_agent.py,sha256=
|
10
|
+
jarvis/jarvis_code_agent/code_agent.py,sha256=GOLByiSDNn7FSgS6g0Y3pkdIGd1k0PBVPTgYle0b7u8,16506
|
11
11
|
jarvis/jarvis_code_agent/lint.py,sha256=j1kS-wFYigmkXyxOuUiaJ9cknYkraikQSSf51VWturE,4038
|
12
12
|
jarvis/jarvis_code_analysis/code_review.py,sha256=jwvGYwwTM7UG6cESw6I7vCp6FimESKvowCbz6u28ikE,31439
|
13
13
|
jarvis/jarvis_code_analysis/checklists/__init__.py,sha256=LIXAYa1sW3l7foP6kohLWnE98I_EQ0T7z5bYKHq6rJA,78
|
@@ -37,7 +37,7 @@ jarvis/jarvis_git_details/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
37
37
|
jarvis/jarvis_git_details/main.py,sha256=MjpUHB4ErR_SKPBx1TLLK_XLkH427RTtsyVn6EUd88Y,8907
|
38
38
|
jarvis/jarvis_git_squash/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
39
39
|
jarvis/jarvis_git_squash/main.py,sha256=lx0WVOiaydYgwzWBDG7C8wJxYJwSb1SIxyoD-rgzgvA,2274
|
40
|
-
jarvis/jarvis_git_utils/git_commiter.py,sha256=
|
40
|
+
jarvis/jarvis_git_utils/git_commiter.py,sha256=s-tclLXOXoSicwBc6RWVT9NMTSMJ4mDUW3cjGwDYYZU,13475
|
41
41
|
jarvis/jarvis_mcp/__init__.py,sha256=OPMtjD-uq9xAaKCRIDyKIosaFfBe1GBPu1az-mQ0rVM,2048
|
42
42
|
jarvis/jarvis_mcp/sse_mcp_client.py,sha256=-3Qy1LyqgHswoc6YbadVRG3ias2op7lUp7Ne2-QUKBM,22474
|
43
43
|
jarvis/jarvis_mcp/stdio_mcp_client.py,sha256=armvgyHAv-AxF5lqiK-TbVLzg3XgSCwmTdWmxBSTLRk,11248
|
@@ -46,7 +46,7 @@ jarvis/jarvis_methodology/main.py,sha256=NMtd6DRn-Q8NcYtQ3qgTKUp9RW0cDGJod8ZXebl
|
|
46
46
|
jarvis/jarvis_multi_agent/__init__.py,sha256=sDd3sK88dS7_qAz2ywIAaEWdQ4iRVCiuBu2rQQmrKbU,4512
|
47
47
|
jarvis/jarvis_multi_agent/main.py,sha256=h7VUSwoPrES0XTK8z5kt3XLX1mmcm8UEuFEHQOUWPH4,1696
|
48
48
|
jarvis/jarvis_platform/__init__.py,sha256=WLQHSiE87PPket2M50_hHzjdMIgPIBx2VF8JfB_NNRk,105
|
49
|
-
jarvis/jarvis_platform/base.py,sha256=
|
49
|
+
jarvis/jarvis_platform/base.py,sha256=JmTabJkEG5FdLWnlo70IREixpPS9VWiyfTvaf5h1BfM,7717
|
50
50
|
jarvis/jarvis_platform/human.py,sha256=r8Vlltp_LirJZeZh1Mmi30iJr9tl1JaNFoqthSRHF6o,2826
|
51
51
|
jarvis/jarvis_platform/kimi.py,sha256=uIpSWQ3MqDBYYMROeXin_YqM2LFrovMICKpwLWO1ODo,12784
|
52
52
|
jarvis/jarvis_platform/openai.py,sha256=uEjBikfFj7kp5wondLvOx4WdkmTX0aqF6kixxAufcHg,4806
|
@@ -83,7 +83,7 @@ jarvis/jarvis_utils/builtin_replace_map.py,sha256=9QKElsyIoZaq4ssZRlCfJPf2i92WuK
|
|
83
83
|
jarvis/jarvis_utils/config.py,sha256=OomZRIeRHiBntKXdqYP1ArI8aqRFqtMlLkd9-VSd5dA,7364
|
84
84
|
jarvis/jarvis_utils/embedding.py,sha256=suqKOgH4cq2HYj4xvNpqDPN9pyc3hTCl934xYonF6qk,3922
|
85
85
|
jarvis/jarvis_utils/file_processors.py,sha256=XiM248SHS7lLgQDCbORVFWqinbVDUawYxWDOsLXDxP8,3043
|
86
|
-
jarvis/jarvis_utils/git_utils.py,sha256=
|
86
|
+
jarvis/jarvis_utils/git_utils.py,sha256=E1ibh4qTJ84JuweDex3nF4jrSMsXk9pNJ58lVG9NF6A,18926
|
87
87
|
jarvis/jarvis_utils/globals.py,sha256=9NTMfCVd0jvtloOv14-KE6clhcVStFmyN9jWxLmQ5so,3369
|
88
88
|
jarvis/jarvis_utils/input.py,sha256=WOs9hYSiZE3ao5K-UJmC7KyZByYnC1opHGJTUZm7DVo,7884
|
89
89
|
jarvis/jarvis_utils/jarvis_history.py,sha256=Td6cmze9Oc5-Ewz0l9RKYeSg_-fbEu9ZhyEueHEMcLY,3664
|
@@ -91,9 +91,9 @@ jarvis/jarvis_utils/methodology.py,sha256=MhPrMxMqElyAn54BDfpQdUqrRr7IbSlrLvAI39
|
|
91
91
|
jarvis/jarvis_utils/output.py,sha256=PRCgudPOB8gMEP3u-g0FGD2c6tBgJhLXUMqNPglfjV8,10813
|
92
92
|
jarvis/jarvis_utils/tag.py,sha256=f211opbbbTcSyzCDwuIK_oCnKhXPNK-RknYyGzY1yD0,431
|
93
93
|
jarvis/jarvis_utils/utils.py,sha256=RYFQx7OkOu3fe_QhS-5jx7O06k_58X14S-9PFJgwOa4,12178
|
94
|
-
jarvis_ai_assistant-0.1.
|
95
|
-
jarvis_ai_assistant-0.1.
|
96
|
-
jarvis_ai_assistant-0.1.
|
97
|
-
jarvis_ai_assistant-0.1.
|
98
|
-
jarvis_ai_assistant-0.1.
|
99
|
-
jarvis_ai_assistant-0.1.
|
94
|
+
jarvis_ai_assistant-0.1.204.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
|
95
|
+
jarvis_ai_assistant-0.1.204.dist-info/METADATA,sha256=FPuxqPRHqfSMGyttK-ZbHOoYlIjO9Y8Upa2qFUhGMzk,20215
|
96
|
+
jarvis_ai_assistant-0.1.204.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
97
|
+
jarvis_ai_assistant-0.1.204.dist-info/entry_points.txt,sha256=Gy3DOP1PYLMK0GCj4rrP_9lkOyBQ39EK_lKGUSwn41E,869
|
98
|
+
jarvis_ai_assistant-0.1.204.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
|
99
|
+
jarvis_ai_assistant-0.1.204.dist-info/RECORD,,
|
File without changes
|
{jarvis_ai_assistant-0.1.202.dist-info → jarvis_ai_assistant-0.1.204.dist-info}/entry_points.txt
RENAMED
File without changes
|
{jarvis_ai_assistant-0.1.202.dist-info → jarvis_ai_assistant-0.1.204.dist-info}/licenses/LICENSE
RENAMED
File without changes
|
{jarvis_ai_assistant-0.1.202.dist-info → jarvis_ai_assistant-0.1.204.dist-info}/top_level.txt
RENAMED
File without changes
|