jarvis-ai-assistant 0.2.2__py3-none-any.whl → 0.2.4__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.
Files changed (39) hide show
  1. jarvis/__init__.py +1 -1
  2. jarvis/jarvis_agent/edit_file_handler.py +5 -0
  3. jarvis/jarvis_agent/jarvis.py +22 -25
  4. jarvis/jarvis_agent/main.py +6 -6
  5. jarvis/jarvis_agent/prompts.py +26 -4
  6. jarvis/jarvis_code_agent/code_agent.py +279 -11
  7. jarvis/jarvis_code_analysis/code_review.py +21 -19
  8. jarvis/jarvis_data/config_schema.json +86 -18
  9. jarvis/jarvis_git_squash/main.py +3 -3
  10. jarvis/jarvis_git_utils/git_commiter.py +32 -11
  11. jarvis/jarvis_mcp/sse_mcp_client.py +4 -6
  12. jarvis/jarvis_mcp/streamable_mcp_client.py +5 -9
  13. jarvis/jarvis_platform/tongyi.py +9 -9
  14. jarvis/jarvis_rag/cli.py +79 -23
  15. jarvis/jarvis_rag/query_rewriter.py +61 -12
  16. jarvis/jarvis_rag/rag_pipeline.py +143 -34
  17. jarvis/jarvis_rag/retriever.py +6 -6
  18. jarvis/jarvis_smart_shell/main.py +2 -2
  19. jarvis/jarvis_stats/__init__.py +13 -0
  20. jarvis/jarvis_stats/cli.py +337 -0
  21. jarvis/jarvis_stats/stats.py +433 -0
  22. jarvis/jarvis_stats/storage.py +329 -0
  23. jarvis/jarvis_stats/visualizer.py +443 -0
  24. jarvis/jarvis_tools/cli/main.py +84 -15
  25. jarvis/jarvis_tools/generate_new_tool.py +22 -1
  26. jarvis/jarvis_tools/registry.py +35 -16
  27. jarvis/jarvis_tools/search_web.py +3 -3
  28. jarvis/jarvis_tools/virtual_tty.py +315 -26
  29. jarvis/jarvis_utils/config.py +98 -11
  30. jarvis/jarvis_utils/git_utils.py +8 -16
  31. jarvis/jarvis_utils/globals.py +29 -8
  32. jarvis/jarvis_utils/input.py +114 -121
  33. jarvis/jarvis_utils/utils.py +213 -37
  34. {jarvis_ai_assistant-0.2.2.dist-info → jarvis_ai_assistant-0.2.4.dist-info}/METADATA +99 -9
  35. {jarvis_ai_assistant-0.2.2.dist-info → jarvis_ai_assistant-0.2.4.dist-info}/RECORD +39 -34
  36. {jarvis_ai_assistant-0.2.2.dist-info → jarvis_ai_assistant-0.2.4.dist-info}/entry_points.txt +2 -0
  37. {jarvis_ai_assistant-0.2.2.dist-info → jarvis_ai_assistant-0.2.4.dist-info}/WHEEL +0 -0
  38. {jarvis_ai_assistant-0.2.2.dist-info → jarvis_ai_assistant-0.2.4.dist-info}/licenses/LICENSE +0 -0
  39. {jarvis_ai_assistant-0.2.2.dist-info → jarvis_ai_assistant-0.2.4.dist-info}/top_level.txt +0 -0
@@ -77,6 +77,186 @@ def _check_git_updates() -> bool:
77
77
  return check_and_update_git_repo(str(script_dir))
78
78
 
79
79
 
80
+ def _show_usage_stats() -> None:
81
+ """显示Jarvis使用统计信息"""
82
+ try:
83
+ from jarvis.jarvis_stats.stats import StatsManager
84
+ from jarvis.jarvis_utils.output import OutputType, PrettyOutput
85
+ from datetime import datetime
86
+
87
+ stats_manager = StatsManager()
88
+
89
+ # 获取所有可用的指标
90
+ all_metrics = stats_manager.list_metrics()
91
+
92
+ # 根据指标名称和标签自动分类
93
+ categorized_stats: Dict[str, Dict[str, Any]] = {
94
+ "tool": {"title": "🔧 工具调用", "metrics": {}, "suffix": "次"},
95
+ "code": {"title": "📝 代码修改", "metrics": {}, "suffix": "次"},
96
+ "lines": {"title": "📊 代码行数", "metrics": {}, "suffix": "行"},
97
+ "commit": {"title": "💾 提交统计", "metrics": {}, "suffix": "个"},
98
+ "command": {"title": "📱 命令使用", "metrics": {}, "suffix": "次"},
99
+ }
100
+
101
+ # 遍历所有指标,获取统计数据
102
+ for metric in all_metrics:
103
+ # 获取该指标的所有数据
104
+ stats_data = stats_manager.get_stats(
105
+ metric_name=metric,
106
+ start_time=datetime(2000, 1, 1),
107
+ end_time=datetime.now(),
108
+ )
109
+
110
+ if stats_data and isinstance(stats_data, dict) and "records" in stats_data:
111
+ # 按照标签分组统计
112
+ tag_totals: Dict[str, float] = {}
113
+ for record in stats_data["records"]:
114
+ tags = record.get("tags", {})
115
+ group = tags.get("group", "other")
116
+ tag_totals[group] = tag_totals.get(group, 0) + record["value"]
117
+
118
+ # 根据标签将指标分配到相应类别
119
+ for group, total in tag_totals.items():
120
+ if total > 0:
121
+ if group == "tool":
122
+ categorized_stats["tool"]["metrics"][metric] = int(total)
123
+ elif group == "code_agent":
124
+ # 根据指标名称细分
125
+ if metric.startswith("code_lines_"):
126
+ categorized_stats["lines"]["metrics"][metric] = int(
127
+ total
128
+ )
129
+ elif "commit" in metric:
130
+ categorized_stats["commit"]["metrics"][metric] = int(
131
+ total
132
+ )
133
+ else:
134
+ categorized_stats["code"]["metrics"][metric] = int(
135
+ total
136
+ )
137
+ elif group == "command":
138
+ categorized_stats["command"]["metrics"][metric] = int(total)
139
+
140
+ # 构建输出
141
+ has_data = False
142
+ stats_output = []
143
+
144
+ for category, data in categorized_stats.items():
145
+ if data["metrics"]:
146
+ has_data = True
147
+ stats_output.append((data["title"], data["metrics"], data["suffix"]))
148
+
149
+ # 显示统计信息
150
+ if has_data:
151
+ # 构建统计信息字符串
152
+ stats_lines = ["📊 Jarvis 使用统计"]
153
+
154
+ for title, stats, suffix in stats_output:
155
+ if stats:
156
+ stats_lines.append(f"\n{title}:")
157
+ for metric, count in sorted(
158
+ stats.items(), key=lambda x: x[1], reverse=True
159
+ ):
160
+ # 美化指标名称
161
+ display_name = metric.replace("_", " ").title()
162
+ stats_lines.append(f" • {display_name}: {count:,} {suffix}")
163
+
164
+ # 总结统计
165
+ total_tools = sum(
166
+ count
167
+ for title, stats, _ in stats_output
168
+ if "工具" in title
169
+ for metric, count in stats.items()
170
+ )
171
+ total_changes = sum(
172
+ count
173
+ for title, stats, _ in stats_output
174
+ if "代码修改" in title
175
+ for metric, count in stats.items()
176
+ )
177
+
178
+ if total_tools > 0 or total_changes > 0:
179
+ stats_lines.append(
180
+ f"\n📈 总计: 工具调用 {total_tools:,} 次, 代码修改 {total_changes:,} 次"
181
+ )
182
+
183
+ # 计算节省的时间
184
+ # 基于经验估算:
185
+ # - 每次工具调用平均节省5分钟(相比手动操作)
186
+ # - 每行代码修改平均节省60秒(考虑思考、编写、测试时间)
187
+ # - 每次提交平均节省15分钟(考虑整理、描述、检查时间)
188
+ # - 每个命令调用平均节省5分钟(相比手动执行)
189
+
190
+ time_saved_minutes = 0
191
+
192
+ # 工具调用节省的时间
193
+ time_saved_minutes += total_tools * 5
194
+
195
+ # 代码行数节省的时间(每行修改节省60秒)
196
+ total_lines = sum(
197
+ count
198
+ for title, stats, _ in stats_output
199
+ if "代码行数" in title
200
+ for metric, count in stats.items()
201
+ )
202
+ time_saved_minutes += total_lines * 1 # 60秒 = 1分钟
203
+
204
+ # 提交节省的时间
205
+ total_commits = sum(
206
+ count
207
+ for title, stats, _ in stats_output
208
+ if "提交统计" in title
209
+ for metric, count in stats.items()
210
+ )
211
+ time_saved_minutes += total_commits * 15
212
+
213
+ # 命令调用节省的时间
214
+ total_commands = sum(
215
+ count
216
+ for title, stats, _ in stats_output
217
+ if "命令使用" in title
218
+ for metric, count in stats.items()
219
+ )
220
+ time_saved_minutes += total_commands * 5
221
+
222
+ # 转换为更友好的格式
223
+ if time_saved_minutes > 0:
224
+ hours = int(time_saved_minutes // 60)
225
+ minutes = int(time_saved_minutes % 60)
226
+
227
+ if hours > 24:
228
+ days = hours // 24
229
+ remaining_hours = hours % 24
230
+ time_str = f"{days} 天 {remaining_hours} 小时 {minutes} 分钟"
231
+ elif hours > 0:
232
+ time_str = f"{hours} 小时 {minutes} 分钟"
233
+ else:
234
+ time_str = f"{minutes} 分钟"
235
+
236
+ stats_lines.append(f"\n⏱️ 节省时间: 约 {time_str}")
237
+
238
+ # 根据节省的时间给出鼓励信息
239
+ if hours >= 100:
240
+ stats_lines.append(
241
+ "🎉 您已经通过 Jarvis 节省了超过100小时的开发时间!"
242
+ )
243
+ elif hours >= 40:
244
+ stats_lines.append("🚀 相当于节省了一整周的工作时间!")
245
+ elif hours >= 8:
246
+ stats_lines.append("💪 相当于节省了一个工作日的时间!")
247
+ elif hours >= 1:
248
+ stats_lines.append("✨ 积少成多,继续保持!")
249
+
250
+ # 一次性输出所有统计信息
251
+ PrettyOutput.print("\n".join(stats_lines), OutputType.INFO)
252
+ except Exception as e:
253
+ # 输出错误信息以便调试
254
+ import traceback
255
+
256
+ PrettyOutput.print(f"统计显示出错: {str(e)}", OutputType.ERROR)
257
+ PrettyOutput.print(traceback.format_exc(), OutputType.ERROR)
258
+
259
+
80
260
  def init_env(welcome_str: str, config_file: Optional[str] = None) -> None:
81
261
  """初始化Jarvis环境
82
262
 
@@ -99,7 +279,11 @@ def init_env(welcome_str: str, config_file: Optional[str] = None) -> None:
99
279
  g_config_file = config_file
100
280
  load_config()
101
281
 
102
- # 5. 检查git更新
282
+ # 5. 显示历史统计数据(仅在显示欢迎信息时显示)
283
+ if welcome_str:
284
+ _show_usage_stats()
285
+
286
+ # 6. 检查git更新
103
287
  if _check_git_updates():
104
288
  os.execv(sys.executable, [sys.executable] + sys.argv)
105
289
  sys.exit(0)
@@ -243,14 +427,7 @@ def generate_default_config(schema_path: str, output_path: str) -> None:
243
427
 
244
428
  default_config = _generate_from_schema(schema)
245
429
 
246
- # 添加schema声明
247
- rel_schema_path = Path(
248
- os.path.relpath(
249
- Path(schema_path),
250
- start=Path(output_path).parent,
251
- )
252
- )
253
- content = f"# yaml-language-server: $schema={rel_schema_path}\n"
430
+ content = f"# yaml-language-server: $schema={schema}\n"
254
431
  content += yaml.dump(default_config, allow_unicode=True, sort_keys=False)
255
432
 
256
433
  with open(output_path, "w", encoding="utf-8") as f:
@@ -386,35 +563,19 @@ def get_file_line_count(filename: str) -> int:
386
563
  return 0
387
564
 
388
565
 
389
- def _get_cmd_stats() -> Dict[str, int]:
390
- """从数据目录获取命令调用统计"""
391
- stats_file = Path(get_data_dir()) / "cmd_stat.yaml"
392
- if stats_file.exists():
393
- try:
394
- with open(stats_file, "r", encoding="utf-8") as f:
395
- return yaml.safe_load(f) or {}
396
- except Exception as e:
397
- PrettyOutput.print(f"加载命令调用统计失败: {str(e)}", OutputType.WARNING)
398
- return {}
399
-
400
-
401
- def _update_cmd_stats(cmd_name: str) -> None:
402
- """更新命令调用统计"""
403
- stats = _get_cmd_stats()
404
- stats[cmd_name] = stats.get(cmd_name, 0) + 1
405
- stats_file = Path(get_data_dir()) / "cmd_stat.yaml"
406
- try:
407
- with open(stats_file, "w", encoding="utf-8") as f:
408
- yaml.safe_dump(stats, f, allow_unicode=True)
409
- except Exception as e:
410
- PrettyOutput.print(f"保存命令调用统计失败: {str(e)}", OutputType.WARNING)
411
-
412
-
413
566
  def count_cmd_usage() -> None:
414
567
  """统计当前命令的使用次数"""
415
568
  import sys
569
+ import os
570
+ from jarvis.jarvis_stats.stats import StatsManager
416
571
 
417
- _update_cmd_stats(sys.argv[0])
572
+ # 从完整路径中提取命令名称
573
+ cmd_path = sys.argv[0]
574
+ cmd_name = os.path.basename(cmd_path)
575
+
576
+ # 使用 StatsManager 记录命令使用统计
577
+ stats_manager = StatsManager()
578
+ stats_manager.increment(cmd_name, group="command")
418
579
 
419
580
 
420
581
  def is_context_overflow(
@@ -433,7 +594,9 @@ def get_loc_stats() -> str:
433
594
  str: loc命令输出的原始字符串,失败时返回空字符串
434
595
  """
435
596
  try:
436
- result = subprocess.run(["loc"], capture_output=True, text=True)
597
+ result = subprocess.run(
598
+ ["loc"], capture_output=True, text=True, encoding="utf-8", errors="replace"
599
+ )
437
600
  return result.stdout if result.returncode == 0 else ""
438
601
  except FileNotFoundError:
439
602
  return ""
@@ -445,6 +608,9 @@ def copy_to_clipboard(text: str) -> None:
445
608
  参数:
446
609
  text: 要复制的文本
447
610
  """
611
+ print("--- 剪贴板内容开始 ---")
612
+ print(text)
613
+ print("--- 剪贴板内容结束 ---")
448
614
  # 尝试使用 xsel
449
615
  try:
450
616
  process = subprocess.Popen(
@@ -496,6 +662,8 @@ def _pull_git_repo(repo_path: Path, repo_type: str):
496
662
  cwd=repo_path,
497
663
  capture_output=True,
498
664
  text=True,
665
+ encoding="utf-8",
666
+ errors="replace",
499
667
  check=True,
500
668
  timeout=10,
501
669
  )
@@ -512,6 +680,8 @@ def _pull_git_repo(repo_path: Path, repo_type: str):
512
680
  cwd=repo_path,
513
681
  capture_output=True,
514
682
  text=True,
683
+ encoding="utf-8",
684
+ errors="replace",
515
685
  check=True,
516
686
  timeout=10,
517
687
  )
@@ -528,6 +698,8 @@ def _pull_git_repo(repo_path: Path, repo_type: str):
528
698
  cwd=repo_path,
529
699
  capture_output=True,
530
700
  text=True,
701
+ encoding="utf-8",
702
+ errors="replace",
531
703
  check=True,
532
704
  timeout=10,
533
705
  )
@@ -555,11 +727,15 @@ def _pull_git_repo(repo_path: Path, repo_type: str):
555
727
  after_hash = after_hash_result.stdout.strip()
556
728
 
557
729
  if before_hash != after_hash:
558
- PrettyOutput.print(f"{repo_type}库 '{repo_path.name}' 已更新。", OutputType.SUCCESS)
730
+ PrettyOutput.print(
731
+ f"{repo_type}库 '{repo_path.name}' 已更新。", OutputType.SUCCESS
732
+ )
559
733
  if pull_result.stdout.strip():
560
734
  PrettyOutput.print(pull_result.stdout.strip(), OutputType.INFO)
561
735
  else:
562
- PrettyOutput.print(f"{repo_type}库 '{repo_path.name}' 已是最新版本。", OutputType.INFO)
736
+ PrettyOutput.print(
737
+ f"{repo_type}库 '{repo_path.name}' 已是最新版本。", OutputType.INFO
738
+ )
563
739
 
564
740
  except FileNotFoundError:
565
741
  PrettyOutput.print(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.2.2
3
+ Version: 0.2.4
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
@@ -37,7 +37,7 @@ Classifier: Programming Language :: Python :: 3.9
37
37
  Classifier: Programming Language :: Python :: 3.10
38
38
  Classifier: Programming Language :: Python :: 3.11
39
39
  Classifier: Programming Language :: Python :: 3.12
40
- Requires-Python: >=3.9
40
+ Requires-Python: >=3.9,<3.13
41
41
  Description-Content-Type: text/markdown
42
42
  License-File: LICENSE
43
43
  Requires-Dist: requests==2.32.3
@@ -58,6 +58,8 @@ Requires-Dist: pyyaml>=5.3.1
58
58
  Requires-Dist: ddgs==9.0.2
59
59
  Requires-Dist: lxml==6.0.0
60
60
  Requires-Dist: markdownify>=1.1.0
61
+ Requires-Dist: typer
62
+ Requires-Dist: pathspec
61
63
  Provides-Extra: dev
62
64
  Requires-Dist: pytest; extra == "dev"
63
65
  Requires-Dist: black; extra == "dev"
@@ -73,7 +75,6 @@ Requires-Dist: chromadb; extra == "rag"
73
75
  Requires-Dist: diskcache; extra == "rag"
74
76
  Requires-Dist: sentence-transformers==2.7.0; extra == "rag"
75
77
  Requires-Dist: torch>=2.6; extra == "rag"
76
- Requires-Dist: typer; extra == "rag"
77
78
  Requires-Dist: unstructured[md]; extra == "rag"
78
79
  Requires-Dist: rank-bm25; extra == "rag"
79
80
  Dynamic: author
@@ -87,15 +88,94 @@ Dynamic: requires-python
87
88
  </p>
88
89
  <div align="center">
89
90
 
90
- [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
91
+ [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
91
92
 
92
93
  *您的智能开发和系统交互助手*
93
94
 
94
- [快速开始](#quick-start) • [核心功能](#core-features) • [配置说明](#configuration) • [Jarvis Book](#jarvis-book) • [技术细节](docs/technical_documentation.md) • [Wiki文档](https://deepwiki.com/skyfireitdiy/Jarvis) • [贡献指南](#contributing) • [许可证](#license)
95
+ [快速开始](#quick-start) • [核心功能](#core-features) • [配置说明](#configuration) • [Jarvis Book](#jarvis-book) • [技术细节](docs/technical_documentation.md) • [Wiki文档](docs/jarvis_book/1.项目介绍.md) • [贡献指南](#contributing) • [许可证](#license)
95
96
  </div>
96
97
 
97
98
  ---
98
99
 
100
+ ## 🎯 定位与优势
101
+
102
+ Jarvis 的定位是**个人开发者的高效助理**,旨在将研发流程中一次性、碎片化的工作变得更加流畅和高效。这与 `workflow` 形式的 `Agent` 平台(如 Dify)有着本质区别,专注于提升个人生产力。
103
+
104
+ ### Jarvis 的核心优势
105
+
106
+ 1. **访问本地资源**: Jarvis 能够直接与您的本地环境交互,执行诸如**软件开发、代码修复、环境搭建**等需要本地文件系统和工具链的复杂任务。
107
+ 2. **纯粹的命令行体验**: 作为一款纯命令行工具,Jarvis 可以无缝集成到您喜爱的任何IDE、终端或SSH会话中,不干扰您现有的工作流程。
108
+ 3. **Python包形式提供**: Jarvis 以标准的Python包形式分发,可以轻松地作为依赖项集成到您自己构建的AI应用或自动化脚本中。
109
+
110
+ ### 💡 Jarvis 的价值:工作流对比
111
+
112
+ #### 示例一:开发新功能
113
+
114
+ **传统工作流 (没有 Jarvis):**
115
+
116
+ 1. **理解需求**: 阅读需求文档,在代码库中全局搜索,定位可能需要修改的文件和函数。
117
+ 2. **切换上下文**: 在IDE、浏览器(查资料)、终端(执行命令)之间反复切换。
118
+ 3. **编写代码**: 手动编写新功能、单元测试和相关文档。
119
+ 4. **调试**: 反复运行、打印日志、设置断点来定位和修复bug。
120
+ 5. **代码提交**: 手动检查代码变更,撰写符合团队规范的 Git Commit Message。
121
+ > 这个过程不仅耗时,而且频繁的上下文切换极易打断心流,消耗大量精力。
122
+
123
+ **Jarvis 增强工作流:**
124
+
125
+ 1. **任务启动**: 在项目根目录,用自然语言向 `jca` (代码助理) 描述需求:`jca "为 'user' 模块增加 'profile' 接口,需要包含用户信息查询和更新功能"`。
126
+ 2. **AI 分析与编码**:
127
+ * Jarvis 自动分析代码结构,定位相关文件 (`user/service.py`, `user/controller.py`, `tests/test_user.py`)。
128
+ * 自动生成新接口的代码、必要的单元测试,并提出修改方案。
129
+ 3. **人机协作与迭代**:
130
+ * 你审查 AI 生成的代码,并提出修改意见:`"字段名需要用驼峰式"` 或 `"增加一个输入校验"`。
131
+ * Jarvis 根据反馈快速迭代,更新代码。
132
+ 4. **自动化提交**:
133
+ * 完成开发后,执行 `jgc` (Git 提交助理)。
134
+ * Jarvis 自动分析代码变更,生成一条规范的 Git Commit Message (例如: `feat(user): add user profile api with query and update`)。
135
+ > 通过 Jarvis,整个流程从“手动执行”变为了“监督和指导”,开发者可以将精力集中在**架构设计和代码审查**等高价值活动上,而不是繁琐的编码和调试细节。
136
+
137
+ #### 示例二:用 Jarvis 完善本文档
138
+
139
+ 您正在阅读的这部分文档,其诞生过程本身就是 Jarvis 价值的体现。
140
+
141
+ 1. **初始指令**: `“在README.md中补充jarvis的用户群体和应用场景等信息”`
142
+ 2. **探索与学习**: Jarvis 使用 `fd` 和 `read_code` 工具,分析了 `docs/` 目录下的说明文档,快速学习了项目的核心定位和功能。
143
+ 3. **迭代完善**: 根据 “补充用户群体”、“增加工作流对比”、“再增加一个例子” 等一系列追加指令,Jarvis 通过多次 `PATCH` 操作,逐步、精确地将新内容添加到本文档的指定位置。
144
+ 4. **人机协作**: 在整个过程中,人类提供高层次的目标和方向,Jarvis 负责具体的探索、总结和代码(文档)修改任务,将一个模糊的想法快速落地为结构清晰的文档。
145
+
146
+ ### Vibe Working: 一种更直觉的工作流
147
+
148
+ Jarvis 的核心理念与一种新兴的人机协作模式 **"Vibe Working"** (氛围式工作)不谋而合。这个概念源于AI研究者Andrej Karpathy,指的是利用大语言模型(LLM),将人类头脑中模糊、直觉性的想法(即“Vibe”)高效转化为具体的、结构化的成果。
149
+
150
+ 这不再是传统的“指令-执行”模式,而是一种**对话式、迭代式**的共同创造过程。
151
+
152
+ * **从一个“感觉”开始**: 传统的自动化需要精确的输入和规则。而使用 Jarvis,你可以从一个模糊的目标开始,比如 `jca "给我写个脚本,监控这个网站的变化"` 或者 `jca "重构 'user' 模块,让它看起来更清爽"`。你提供的是方向和“感觉”,而不是详细的规格书。
153
+
154
+ * **迭代中逼近完美**: Jarvis (或其背后的LLM) 会提供一个初步的实现。这个版本可能不完美,但它是一个坚实的起点。接下来,你通过反馈来指导它,比如 `“这个地方的逻辑不对,应该先检查A再处理B”` 或者 `“变量名能再语义化一点吗?”`。通过这种快速的反馈循环,AI的产出将逐步逼近你的真实意图。
155
+
156
+ * **人与AI的角色转变**:
157
+ * **你 (人类)**: 扮演**创意总监、品味判断者和方向引领者**。你负责提供愿景、经验和高层次的判断力,确保最终结果的质量和方向。
158
+ * **Jarvis (AI)**: 扮演**强大的执行伙伴和灵感催化剂**。它负责处理所有繁重、重复和技术性的细节,并能提供意想不到的解决方案,激发你的新想法。
159
+
160
+ Jarvis 正是为这种工作流而设计的工具。它通过无缝的命令行集成和强大的本地交互能力,将 "Vibe Working" 从一个抽象概念,变为了开发者触手可及的日常生产力工具,让你能更专注于**高价值的创造性思考**,而非琐碎的实现细节。
161
+
162
+ ### 👥 目标用户
163
+
164
+ **谁适合使用 Jarvis?**
165
+
166
+ * **个人开发者和极客**: 希望通过AI提升个人开发、学习和探索效率的用户。
167
+ * **需要处理碎片化任务的工程师**: 面对各种一次性、非标准化的技术任务,例如快速编写脚本、调试代码、搭建新环境等。
168
+ * **AI应用探索者**: 希望有一个灵活的本地框架来实验和集成不同的大语言模型和工具。
169
+
170
+ **谁可能不适合?**
171
+
172
+ * **寻求固定工作流自动化的人**: 如果您的需求是高度固定和重复的,例如“每天定时抓取数据并生成报告”,那么编写一个专门的、功能单一的脚本可能是更直接、更高效的解决方案。Jarvis 更擅长处理多变和探索性的任务。
173
+ * **企业级团队协作者**: Jarvis 被设计为个人工具,不包含团队管理、权限控制等面向企业级协作的功能。
174
+
175
+ 总之,Jarvis 是为每一位开发者量身打造的个人助手,而非用于团队协作的集中式平台。
176
+
177
+ ---
178
+
99
179
  ## 🚀 快速开始 <a id="quick-start"></a>
100
180
 
101
181
  ### 系统要求
@@ -133,8 +213,9 @@ Jarvis 包含一系列专注于不同任务的工具。以下是主要命令及
133
213
  | `jarvis-platform-manager` | `jpm` | 管理和测试不同的大语言模型平台 |
134
214
  | `jarvis-rag` | `jrg` | 构建和查询本地化的RAG知识库 |
135
215
  | `jarvis-smart-shell` | `jss` | 实验性的智能Shell功能 |
216
+ | `jarvis-stats` | `jst` | 通用统计模块,支持记录和可视化任意指标数据 |
136
217
 
137
- 更多详细用法和参数,请查阅我们的 [**Wiki 文档**](https://deepwiki.com/skyfireitdiy/Jarvis)。
218
+ 更多详细用法和参数,请查阅我们的 [**使用指南**](docs/jarvis_book/4.使用指南.md)。
138
219
 
139
220
  ---
140
221
 
@@ -174,7 +255,9 @@ ENV:
174
255
  YUANBAO_COOKIES: "在此处粘贴您的元宝Cookies"
175
256
  ```
176
257
 
177
- Jarvis 支持多种平台,包括 **Kimi**, **通义千问**, **OpenAI** 等。详细的配置选项、模型组设置以及所有可用参数,请参阅 [**配置文档**](https://deepwiki.com/skyfireitdiy/Jarvis)。
258
+ Jarvis 支持多种平台,包括 **Kimi**, **通义千问**, **OpenAI** 等。详细的配置选项、模型组设置以及所有可用参数,请参阅 [**使用指南**](docs/jarvis_book/4.使用指南.md)。
259
+
260
+ > **模型推荐**: 目前效果较好的模型是 `claude-opus-4-20250514`,可以通过国内代理商购买,例如 [FoxiAI](https://foxi-ai.top)。
178
261
 
179
262
  ---
180
263
 
@@ -185,7 +268,7 @@ Jarvis 被设计为高度可扩展的框架。您可以轻松地:
185
268
  - **集成新LLM平台**: 在 `~/.jarvis/platforms/` 目录下添加新的平台适配器。
186
269
  - **定义MCP**: 通过配置文件集成外部或自定义的命令协议。
187
270
 
188
- 有关扩展开发的详细指南和[**技术细节**](docs/technical_documentation.md),请访问我们的 [**开发者文档**](https://deepwiki.com/skyfireitdiy/Jarvis)。
271
+ 有关扩展开发的详细指南和[**技术细节**](docs/technical_documentation.md),请访问我们的 [**开发者文档**](docs/jarvis_book/5.功能扩展.md)。
189
272
 
190
273
  ---
191
274
 
@@ -197,7 +280,7 @@ Jarvis 被设计为高度可扩展的框架。您可以轻松地:
197
280
  - **[第二章:快速开始](docs/jarvis_book/2.快速开始.md)**
198
281
  - **[第三章:核心概念与架构](docs/jarvis_book/3.核心概念与架构.md)**
199
282
  - **[第四章:使用指南](docs/jarvis_book/4.使用指南.md)**
200
- - **[第五章:工具开发](docs/jarvis_book/5.工具开发.md)**
283
+ - **[第五章:功能扩展](docs/jarvis_book/5.功能扩展.md)**
201
284
  - **[第六章:高级主题](docs/jarvis_book/6.高级主题.md)**
202
285
  - **[第七章:参与贡献](docs/jarvis_book/7.参与贡献.md)**
203
286
  - **[第八章:常见问题](docs/jarvis_book/8.常见问题.md)**
@@ -216,6 +299,13 @@ Jarvis 被设计为高度可扩展的框架。您可以轻松地:
216
299
 
217
300
  ---
218
301
 
302
+ ## ⚠️ 免责声明 <a id="disclaimer"></a>
303
+
304
+ - **模型使用风险**: 频繁使用通过非官方API(如腾讯元宝、Kimi、通义千问等)接入的模型可能会导致您的账户被平台封禁。请合理使用,并自行承担相应风险。
305
+ - **命令执行风险**: Jarvis具备执行系统命令的能力。请确保您了解将要执行的命令,并避免输入可能导致系统风险的指令。为了增强安全性,您可以在配置文件中启用工具执行确认(`JARVIS_EXECUTE_TOOL_CONFIRM: true`),以便在执行每个工具前进行手动确认。
306
+
307
+ ---
308
+
219
309
  ## 📄 许可证 <a id="license"></a>
220
310
 
221
311
  本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件。
@@ -1,20 +1,20 @@
1
- jarvis/__init__.py,sha256=rtajFgNEXT7gc8K28B_xDpASjeMEaIwc9yBA9fWhG6E,73
1
+ jarvis/__init__.py,sha256=S61oLarYay1rhLcBt-WbaPF2ViSt-gtq-aUNYUXQS9s,73
2
2
  jarvis/jarvis_agent/__init__.py,sha256=BmBbMUsCwe_0znrwxSipaKj-MuOgJTZvLbyKzBFfpic,22559
3
3
  jarvis/jarvis_agent/builtin_input_handler.py,sha256=Qs4LAr4xdKLBJpQE81YP4CkucAop86ms0iVoKa1nnso,2468
4
- jarvis/jarvis_agent/edit_file_handler.py,sha256=ml1o-BE2Ca1-ybPlKuhstLQYwdJag39o0_-PXTUvFaE,11646
5
- jarvis/jarvis_agent/jarvis.py,sha256=PQ2dHPWeCAHL4JCk-_oYa26pP2bIWUdokkO-VW7-6h0,8185
6
- jarvis/jarvis_agent/main.py,sha256=IM9_AsCmTw4QYLp3AMF97kRGctQC2pEIZls6zxZgUSQ,3319
4
+ jarvis/jarvis_agent/edit_file_handler.py,sha256=a-SFLZs4FNjyVIkEi1PwPj7KT9np_ItMeaRNUoGHEWU,11858
5
+ jarvis/jarvis_agent/jarvis.py,sha256=L2sI-Y7gxqH6M4E4F2GlNoZcxxvz_f72rxvjh7bxuZE,8443
6
+ jarvis/jarvis_agent/main.py,sha256=56pLVy6v-3ZdyPCcWXdRkgbjmYsoIfC7zrA6B7sYivU,3334
7
7
  jarvis/jarvis_agent/output_handler.py,sha256=P7oWpXBGFfOsWq7cIhS_z9crkQ19ES7qU5pM92KKjAs,1172
8
8
  jarvis/jarvis_agent/prompt_builder.py,sha256=PH1fPDVa8z_RXkoXHJFNDf8PQjUoLNLYwkh2lC__p40,1705
9
- jarvis/jarvis_agent/prompts.py,sha256=e8i-3kaGr96mlzL3UUhQUHFDfbJSoE4xiF9TDksNDm4,7720
9
+ jarvis/jarvis_agent/prompts.py,sha256=VLQtz75X5qExQkSwYlJYQzNLpDMdByr4FaY71POVLMI,8713
10
10
  jarvis/jarvis_agent/protocols.py,sha256=JWnJDikFEuwvFUv7uzXu0ggJ4O9K2FkMnfVCwIJ5REw,873
11
11
  jarvis/jarvis_agent/session_manager.py,sha256=DnvI9rWkVmkyO1XfKZyo9lTn4ajg4ccwzEkoRHFPOJM,2925
12
12
  jarvis/jarvis_agent/shell_input_handler.py,sha256=1IboqdxcJuoIqRpmDU10GugR9fWXUHyCEbVF4nIWbyo,1328
13
13
  jarvis/jarvis_agent/tool_executor.py,sha256=nIq-sPNgrtimtM-IHpN09cWmId8jDzWRdCFoRzXnnoo,1721
14
14
  jarvis/jarvis_code_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- jarvis/jarvis_code_agent/code_agent.py,sha256=n0_sOXuGgzSQKLUj64ap0lWqKR67RZPnO3jpl2YD7MI,18681
15
+ jarvis/jarvis_code_agent/code_agent.py,sha256=BQvXXN4zjJd7xlZEqqEZmB9KBGNDrzDglRM8QblkpbU,29414
16
16
  jarvis/jarvis_code_agent/lint.py,sha256=LZPsfyZPMo7Wm7LN4osZocuNJwZx1ojacO3MlF870x8,4009
17
- jarvis/jarvis_code_analysis/code_review.py,sha256=3oRxB4Ks2lbnzQpPWFU6cpwpVz1sWtQ7OAT-kwZOUSI,32150
17
+ jarvis/jarvis_code_analysis/code_review.py,sha256=TMov1pqDe1bg0vM1ndnYeW9ejHrRN_jMroo3T4L9yag,32368
18
18
  jarvis/jarvis_code_analysis/checklists/__init__.py,sha256=LIXAYa1sW3l7foP6kohLWnE98I_EQ0T7z5bYKHq6rJA,78
19
19
  jarvis/jarvis_code_analysis/checklists/c_cpp.py,sha256=9t62bMqs6qTkFSio4SKkj88qyb5ZubWrw3MxJBQ4X1A,1317
20
20
  jarvis/jarvis_code_analysis/checklists/csharp.py,sha256=ShPXrl2_UPAnGaCHAG2wLl90COG3HK2XCSr1UK2dxN4,2420
@@ -35,15 +35,15 @@ jarvis/jarvis_code_analysis/checklists/shell.py,sha256=aRFYhQQvTgbYd-uY5pc8UHIUA
35
35
  jarvis/jarvis_code_analysis/checklists/sql.py,sha256=vR0T6qC7b4dURjJVAd7kSVxyvZEQXPG1Jqc2sNTGp5c,2355
36
36
  jarvis/jarvis_code_analysis/checklists/swift.py,sha256=TPx4I6Gupvs6tSerRKmTSKEPQpOLEbH2Y7LXg1uBgxc,2566
37
37
  jarvis/jarvis_code_analysis/checklists/web.py,sha256=25gGD7pDadZQybNFvALYxWvK0VRjGQb1NVJQElwjyk0,3943
38
- jarvis/jarvis_data/config_schema.json,sha256=XpQ7aaHMW-YCuFrnaAEjMWrnv6a8B7MqGjm2XgrvtgQ,8573
38
+ jarvis/jarvis_data/config_schema.json,sha256=4HnTn0BUBEyohAOzj70BhtHMIQiwzwTXIQ3dn652JTg,10539
39
39
  jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4,sha256=Ijkht27pm96ZW3_3OFE-7xAPtR0YyTWXoRO8_-hlsqc,1681126
40
40
  jarvis/jarvis_git_squash/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- jarvis/jarvis_git_squash/main.py,sha256=8_ADMTGi8Z41mqKCed4zHOd3nZCqEDWfqVLWpnYvCnE,2263
42
- jarvis/jarvis_git_utils/git_commiter.py,sha256=fJ97nvvDt-0E8E4PbeMvptx_yoJXFAObhaPVb3mjO_g,12676
41
+ jarvis/jarvis_git_squash/main.py,sha256=6PECdAbTbrsJBRLK1pXBh4hdJ_LADh-XXSic1xJi97E,2255
42
+ jarvis/jarvis_git_utils/git_commiter.py,sha256=M6SnhF_GJktO0mIT8_Y4J4Zin7-w3V_MJADndfQ9_QU,13550
43
43
  jarvis/jarvis_mcp/__init__.py,sha256=OPMtjD-uq9xAaKCRIDyKIosaFfBe1GBPu1az-mQ0rVM,2048
44
- jarvis/jarvis_mcp/sse_mcp_client.py,sha256=AhYLPQb0mE9-6ZQw1JesRNyEy0esJumNEFb5LyzyIn0,22612
44
+ jarvis/jarvis_mcp/sse_mcp_client.py,sha256=neKrgFxwLDPWjVrl9uDt1ricNwbLZbv1ZEFh0IkmqZk,22656
45
45
  jarvis/jarvis_mcp/stdio_mcp_client.py,sha256=APYUksYKlMx7AVNODKOLrTkKZPnp4kqTQIYIuNDDKko,11286
46
- jarvis/jarvis_mcp/streamable_mcp_client.py,sha256=1OZpsG82U2MLbGuojllJAblFUAMmp1N0i5fsKM4n5Ts,14453
46
+ jarvis/jarvis_mcp/streamable_mcp_client.py,sha256=sP0KEsxVcXGht0eA7a_m-ECtZAk39s4PL9OUdm35x2Y,14467
47
47
  jarvis/jarvis_methodology/main.py,sha256=6QF8hH3vB6rfxim0fPR34uVPf41zVpb4ZLqrFN2qONg,10983
48
48
  jarvis/jarvis_multi_agent/__init__.py,sha256=kCgtAX7VvliyEOQxIj2DvNjRAuh6bpNaOtDn60nzph4,6089
49
49
  jarvis/jarvis_multi_agent/main.py,sha256=EUJCLjiN6ZZkOTmRS13oeTquo3tXD-cdO_QvaEPCK_c,1715
@@ -54,54 +54,59 @@ jarvis/jarvis_platform/human.py,sha256=cSN8Lqf0ts2_pPfS2_v7PaWxQKqcW_3bSmhRTHey7
54
54
  jarvis/jarvis_platform/kimi.py,sha256=HzNcdQ3tO2ndHk02mfD9DeeGP7JVFnQ1pbkAVF21jjA,14222
55
55
  jarvis/jarvis_platform/openai.py,sha256=ccGqsU2cFfd5324P7SH1tSmFABpvto8fytmxQGkr3BA,6412
56
56
  jarvis/jarvis_platform/registry.py,sha256=1bMy0YZUa8NLzuZlKfC4CBtpa0iniypTxUZk0Hv6g9Y,8415
57
- jarvis/jarvis_platform/tongyi.py,sha256=d0l2S9P80CF1OgloCI9qXa1Qnfy6yMYjsmuOVAEW99I,22021
57
+ jarvis/jarvis_platform/tongyi.py,sha256=22NPrJDrd4Zag2oWlytZ9--vA3hLJhJ2YJ-kM5RwLQ8,22212
58
58
  jarvis/jarvis_platform/yuanbao.py,sha256=FbkpMs_hUL8bGJHbWivQEynnU892-5qPsMe0xASGXkI,22673
59
59
  jarvis/jarvis_platform_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  jarvis/jarvis_platform_manager/main.py,sha256=V320cEk2CP-NhmdNr0dED77VOUTJ6ODYL0YXC7wLZzw,17513
61
61
  jarvis/jarvis_platform_manager/service.py,sha256=hQGWQ2qAlzm_C_lNQDuLORQ4rmjR1P1-V3ou7l2Bv0s,13622
62
62
  jarvis/jarvis_rag/__init__.py,sha256=HRTXgnQxDuaE9x-e3r6SYqhJ5d4DSI_rrIxy2IGY6qk,320
63
63
  jarvis/jarvis_rag/cache.py,sha256=Tqx_Oe-AhuWlMXHGHUaIuG6OEHoHBVZq7mL3kldtFFU,2723
64
- jarvis/jarvis_rag/cli.py,sha256=q1W7XWZ7u7oMckqeNUX7YQoiQ3PzT3Rh-FZvTeG_U3I,13159
64
+ jarvis/jarvis_rag/cli.py,sha256=bIQKibp8swJDyfFBXaiX5C20LHN_2W2knO2I-MQp58c,15620
65
65
  jarvis/jarvis_rag/embedding_manager.py,sha256=BoV6Vr_3F4zbjBAOQ1FdEBnJXGPwBkv1IEkdRP9CgFw,3338
66
66
  jarvis/jarvis_rag/llm_interface.py,sha256=eZHibNHD5dFK9yolr3hYNNhAEZUsPA-cIf1uHapI2h8,4338
67
- jarvis/jarvis_rag/query_rewriter.py,sha256=JM1Q23zZISze77BleRgTPgNAtLUtLAXkEo3G70kaTK8,2190
68
- jarvis/jarvis_rag/rag_pipeline.py,sha256=9yeNRv6qOS2zo7o0b0u3gFmiW_XSivesvPKVJ8e5DlE,6209
67
+ jarvis/jarvis_rag/query_rewriter.py,sha256=rmXj-j3jjsOR-Dj9Hk5exfCJqZ4uCxMFfvybzurpj5w,4047
68
+ jarvis/jarvis_rag/rag_pipeline.py,sha256=MSVfTVqDRK1_m0SMeOBcqirAyrd8GsVC27vanMbUCUY,10598
69
69
  jarvis/jarvis_rag/reranker.py,sha256=wYUDIMHQL8_tFcQ7GFn_zYHTE1AbKk4a9TRoN2lKtA8,1767
70
- jarvis/jarvis_rag/retriever.py,sha256=B6oq1SAh7QAE9G5o0sXyNtLjFodukd8p-Was2QJZXg0,7637
70
+ jarvis/jarvis_rag/retriever.py,sha256=vI-T_L6zdGOm2YCq98CEx0cevz8lKp0iVfjV4nQ3oJs,7681
71
71
  jarvis/jarvis_smart_shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- jarvis/jarvis_smart_shell/main.py,sha256=MXUVaXvT9zOxykbQphCGEXUCRhdOhEthQxHba_D4oiE,6015
72
+ jarvis/jarvis_smart_shell/main.py,sha256=ReCC9bWPlgl84ylI0uvdzlE3J6fS0XzFSLOpQQyDcMY,6008
73
+ jarvis/jarvis_stats/__init__.py,sha256=jJzgP43nxzLbNGs8Do4Jfta1PNCJMf1Oq9YTPd6EnFM,342
74
+ jarvis/jarvis_stats/cli.py,sha256=o62mfyfQRRWEEDsiORhqF4RUZjDsB2OPXEvbN8I_qxA,10127
75
+ jarvis/jarvis_stats/stats.py,sha256=vN4qhugldKJwpw0yBUwCt7rnGonXElwq_DjuwmGiioc,13978
76
+ jarvis/jarvis_stats/storage.py,sha256=jGHgudtx-N-EgEWFUbbg13-K5t2iORsRwd-1_WMRdKk,10708
77
+ jarvis/jarvis_stats/visualizer.py,sha256=Zj-HPB0ZLx66L9Fk6taOmII-C0xQssWC4Gb6Rfp0XoA,13561
73
78
  jarvis/jarvis_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
79
  jarvis/jarvis_tools/ask_user.py,sha256=M6DdLNryCE8y1JcdZHEifUgZkPUEPNKc-zDW5p0Mb1k,2029
75
80
  jarvis/jarvis_tools/base.py,sha256=tFVmK6ppsImW2BzHZmrNmMRiOJdW-4aZP6Me3VxdYcA,1194
76
81
  jarvis/jarvis_tools/edit_file.py,sha256=hM345E9rxS-EkqCZpwwizL6fmPdTadtB798tEO5Ce3g,10417
77
82
  jarvis/jarvis_tools/execute_script.py,sha256=gMarE5yCCSPU6Dp6HlcL2KT-2xCzR-1p-oQNlYOJK58,6157
78
83
  jarvis/jarvis_tools/file_analyzer.py,sha256=aVe1jBSp0YmlypihxrGADJpYrU_7CxDETxGUNySuSlI,4044
79
- jarvis/jarvis_tools/generate_new_tool.py,sha256=ppMRuTYUZ0c02rHo7xi8DCGiDVPZTANVp9nS7bvkqqo,7819
84
+ jarvis/jarvis_tools/generate_new_tool.py,sha256=uaWKlDMGjetvvwKTj0_AVTdmd14IktRbU3cpzKCBiIQ,8728
80
85
  jarvis/jarvis_tools/methodology.py,sha256=_K4GIDUodGEma3SvNRo7Qs5rliijgNespVLyAPN35JU,5233
81
86
  jarvis/jarvis_tools/read_code.py,sha256=EnI-R-5HyIQYhMD391nZWXHIuHHBF-OJIRE0QpLcPX4,6417
82
87
  jarvis/jarvis_tools/read_webpage.py,sha256=NmDUboVZd4CGHBPRFK6dp3uqVhuGopW1bOi3TcaLDF4,2092
83
- jarvis/jarvis_tools/registry.py,sha256=etJicnDvmfvu3MZwF4LiufKL63sV812FUZOpBBS28DU,28195
88
+ jarvis/jarvis_tools/registry.py,sha256=WSR8DxC5VSSQVLU42Pgc97_eAo5EQhmO0que1CzAVpc,28703
84
89
  jarvis/jarvis_tools/rewrite_file.py,sha256=eG_WKg6cVAXmuGwUqlWkcuyay5S8DOzEi8vZCmX3O8w,7255
85
- jarvis/jarvis_tools/search_web.py,sha256=qh3MomJNDzpw5JTBbJWxzJmIdmuUt2SZNqJNc8LJrO4,5829
86
- jarvis/jarvis_tools/virtual_tty.py,sha256=KKr3jpvQWWMPr2o40hlmN6fuXJCN8H4_ma5QU40Citc,16089
90
+ jarvis/jarvis_tools/search_web.py,sha256=zh6EYLQPIQneoz27Hheh-fifMeMNhrTVldXKMSsMz2Y,5801
91
+ jarvis/jarvis_tools/virtual_tty.py,sha256=LTsg1PlsPvgaLShUaxpAKwTpyjXRr0l0qSREI7Q-fBc,26349
87
92
  jarvis/jarvis_tools/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
- jarvis/jarvis_tools/cli/main.py,sha256=ZOvdC6wEOTdhTJy8ZDF_AKlH0jBmVcbOrU-8JPK2gWM,4703
93
+ jarvis/jarvis_tools/cli/main.py,sha256=3kizOkAmld3ZiTnSoUx4Xo2XO7BnrPnyITKCMBFod1w,7765
89
94
  jarvis/jarvis_utils/__init__.py,sha256=67h0ldisGlh3oK4DAeNEL2Bl_VsI3tSmfclasyVlueM,850
90
95
  jarvis/jarvis_utils/builtin_replace_map.py,sha256=4BurljGuiG_I93EBs7mlFlPm9wYC_4CmdTG5tQWpF6g,1712
91
- jarvis/jarvis_utils/config.py,sha256=YcPGjCSJ2_2CKtlY8ecyqaovKVb65XcQ5WNizjwmdVs,10689
96
+ jarvis/jarvis_utils/config.py,sha256=nXeQPEhZZw8UMPOsVNFGEh7SscTSe_1f9oDQwrLhfMo,12950
92
97
  jarvis/jarvis_utils/embedding.py,sha256=oEOEM2qf16DMYwPsQe6srET9BknyjOdY2ef0jsp3Or8,2714
93
98
  jarvis/jarvis_utils/file_processors.py,sha256=XiM248SHS7lLgQDCbORVFWqinbVDUawYxWDOsLXDxP8,3043
94
- jarvis/jarvis_utils/git_utils.py,sha256=_b4-5uWOTVFjAB48QbRJNBR7PTD_jzi7-5V5M_wjXFo,21740
95
- jarvis/jarvis_utils/globals.py,sha256=QKeiiWhUlu9HE7SzAn0lKaeaXQF1uhmLXPZTeLKyGPQ,4048
99
+ jarvis/jarvis_utils/git_utils.py,sha256=dkC0HcUdm_rF5vXNoLByne3mGykZEviD3Lo_SYbwROU,21667
100
+ jarvis/jarvis_utils/globals.py,sha256=INBGXbDkXOQa0AE7L6JhR5gr-TAZMsE5y4yK1sbB98U,4643
96
101
  jarvis/jarvis_utils/http.py,sha256=eRhV3-GYuWmQ0ogq9di9WMlQkFcVb1zGCrySnOgT1x0,4392
97
- jarvis/jarvis_utils/input.py,sha256=V2w3xV0MO73c4Y4XY_yy9jVNg7MmN76FmAnpKRiJUog,9160
102
+ jarvis/jarvis_utils/input.py,sha256=g0Xa1TNZHxLaYduREV_Wc55iqHD6djN73YFJbR83gUg,9488
98
103
  jarvis/jarvis_utils/methodology.py,sha256=V2Y0mbamrWBhhCK-3foAM1hKewOEcIDcXO-Sv_AU-kQ,9106
99
104
  jarvis/jarvis_utils/output.py,sha256=E_J_RYXtkOgRiDSHCRE9QPHY8WQmmhIotQtIQru8GZA,10888
100
105
  jarvis/jarvis_utils/tag.py,sha256=f211opbbbTcSyzCDwuIK_oCnKhXPNK-RknYyGzY1yD0,431
101
- jarvis/jarvis_utils/utils.py,sha256=G6UuiBrPlWLpau1LbSGStrlAHCHG8JufINLD_bwtjTE,20006
102
- jarvis_ai_assistant-0.2.2.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
103
- jarvis_ai_assistant-0.2.2.dist-info/METADATA,sha256=I2MdBpFwqLwq8kSfG--5ULCddP6OL-ZRHARbmyG6EQ8,9255
104
- jarvis_ai_assistant-0.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
105
- jarvis_ai_assistant-0.2.2.dist-info/entry_points.txt,sha256=nXgfarEvf9Zelwvl6yGa4Zmqpsa7dDTahlzHRHL8qvM,1178
106
- jarvis_ai_assistant-0.2.2.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
107
- jarvis_ai_assistant-0.2.2.dist-info/RECORD,,
106
+ jarvis/jarvis_utils/utils.py,sha256=3DbUczVY9kzyAwbpA4mk9AuTUOG0L4Oviw-Cjdn0bF0,27289
107
+ jarvis_ai_assistant-0.2.4.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
108
+ jarvis_ai_assistant-0.2.4.dist-info/METADATA,sha256=GdY7W685Ylx4SOOUTNw9WeFXNeRkiTA1WWISdXxfJeo,16641
109
+ jarvis_ai_assistant-0.2.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
110
+ jarvis_ai_assistant-0.2.4.dist-info/entry_points.txt,sha256=8cwi1VxZGU5UeSZMFiH-jG6NK95Asjukj5SBLBrGiGo,1257
111
+ jarvis_ai_assistant-0.2.4.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
112
+ jarvis_ai_assistant-0.2.4.dist-info/RECORD,,
@@ -11,6 +11,7 @@ jarvis-multi-agent = jarvis.jarvis_multi_agent.main:main
11
11
  jarvis-platform-manager = jarvis.jarvis_platform_manager.main:main
12
12
  jarvis-rag = jarvis.jarvis_rag.cli:main
13
13
  jarvis-smart-shell = jarvis.jarvis_smart_shell.main:main
14
+ jarvis-stats = jarvis.jarvis_stats.cli:main
14
15
  jarvis-tool = jarvis.jarvis_tools.cli.main:main
15
16
  jca = jarvis.jarvis_code_agent.code_agent:main
16
17
  jcr = jarvis.jarvis_code_analysis.code_review:main
@@ -21,5 +22,6 @@ jma = jarvis.jarvis_multi_agent.main:main
21
22
  jpm = jarvis.jarvis_platform_manager.main:main
22
23
  jrg = jarvis.jarvis_rag.cli:main
23
24
  jss = jarvis.jarvis_smart_shell.main:main
25
+ jst = jarvis.jarvis_stats.cli:main
24
26
  jt = jarvis.jarvis_tools.cli.main:main
25
27
  jvs = jarvis.jarvis_agent.jarvis:main