jarvis-ai-assistant 0.2.3__tar.gz → 0.2.5__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.
- {jarvis_ai_assistant-0.2.3/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.2.5}/PKG-INFO +29 -3
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/README.md +27 -2
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/pyproject.toml +7 -1
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/setup.py +5 -2
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/__init__.py +13 -7
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/edit_file_handler.py +4 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/jarvis.py +22 -25
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/main.py +6 -6
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_agent/code_agent.py +273 -11
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/code_review.py +21 -19
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_data/config_schema.json +25 -29
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_git_squash/main.py +3 -3
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_git_utils/git_commiter.py +32 -11
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_mcp/sse_mcp_client.py +4 -6
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +5 -9
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_rag/retriever.py +1 -1
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_smart_shell/main.py +2 -2
- jarvis_ai_assistant-0.2.5/src/jarvis/jarvis_stats/__init__.py +13 -0
- jarvis_ai_assistant-0.2.5/src/jarvis/jarvis_stats/cli.py +404 -0
- jarvis_ai_assistant-0.2.5/src/jarvis/jarvis_stats/stats.py +538 -0
- jarvis_ai_assistant-0.2.5/src/jarvis/jarvis_stats/storage.py +381 -0
- jarvis_ai_assistant-0.2.5/src/jarvis/jarvis_stats/visualizer.py +282 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/cli/main.py +82 -15
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/registry.py +32 -16
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/search_web.py +3 -3
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/virtual_tty.py +315 -26
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/config.py +12 -8
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/git_utils.py +8 -16
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/methodology.py +74 -67
- jarvis_ai_assistant-0.2.5/src/jarvis/jarvis_utils/utils.py +1010 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5/src/jarvis_ai_assistant.egg-info}/PKG-INFO +29 -3
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +5 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis_ai_assistant.egg-info/entry_points.txt +2 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis_ai_assistant.egg-info/requires.txt +1 -0
- jarvis_ai_assistant-0.2.3/src/jarvis/jarvis_utils/utils.py +0 -614
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/LICENSE +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/prompts.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/protocols.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/session_manager.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_agent/lint.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_mcp/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_methodology/main.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_multi_agent/main.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform/ai8.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform/base.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform/human.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform/kimi.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform/openai.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform/tongyi.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform_manager/main.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_platform_manager/service.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_rag/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_rag/cache.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_rag/cli.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_rag/rag_pipeline.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_rag/reranker.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/edit_file.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/execute_script.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/read_code.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/embedding.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/file_processors.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/http.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/input.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/output.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_utils/tag.py +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
{jarvis_ai_assistant-0.2.3/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.2.5}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: jarvis-ai-assistant
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.5
|
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
|
@@ -60,6 +60,7 @@ Requires-Dist: lxml==6.0.0
|
|
60
60
|
Requires-Dist: markdownify>=1.1.0
|
61
61
|
Requires-Dist: typer
|
62
62
|
Requires-Dist: pathspec
|
63
|
+
Requires-Dist: plotext==5.2.8
|
63
64
|
Provides-Extra: dev
|
64
65
|
Requires-Dist: pytest; extra == "dev"
|
65
66
|
Requires-Dist: black; extra == "dev"
|
@@ -143,6 +144,22 @@ Jarvis 的定位是**个人开发者的高效助理**,旨在将研发流程中
|
|
143
144
|
3. **迭代完善**: 根据 “补充用户群体”、“增加工作流对比”、“再增加一个例子” 等一系列追加指令,Jarvis 通过多次 `PATCH` 操作,逐步、精确地将新内容添加到本文档的指定位置。
|
144
145
|
4. **人机协作**: 在整个过程中,人类提供高层次的目标和方向,Jarvis 负责具体的探索、总结和代码(文档)修改任务,将一个模糊的想法快速落地为结构清晰的文档。
|
145
146
|
|
147
|
+
### Vibe Working: 一种更直觉的工作流
|
148
|
+
|
149
|
+
Jarvis 的核心理念与一种新兴的人机协作模式 **"Vibe Working"** (氛围式工作)不谋而合。这个概念源于AI研究者Andrej Karpathy,指的是利用大语言模型(LLM),将人类头脑中模糊、直觉性的想法(即“Vibe”)高效转化为具体的、结构化的成果。
|
150
|
+
|
151
|
+
这不再是传统的“指令-执行”模式,而是一种**对话式、迭代式**的共同创造过程。
|
152
|
+
|
153
|
+
* **从一个“感觉”开始**: 传统的自动化需要精确的输入和规则。而使用 Jarvis,你可以从一个模糊的目标开始,比如 `jca "给我写个脚本,监控这个网站的变化"` 或者 `jca "重构 'user' 模块,让它看起来更清爽"`。你提供的是方向和“感觉”,而不是详细的规格书。
|
154
|
+
|
155
|
+
* **迭代中逼近完美**: Jarvis (或其背后的LLM) 会提供一个初步的实现。这个版本可能不完美,但它是一个坚实的起点。接下来,你通过反馈来指导它,比如 `“这个地方的逻辑不对,应该先检查A再处理B”` 或者 `“变量名能再语义化一点吗?”`。通过这种快速的反馈循环,AI的产出将逐步逼近你的真实意图。
|
156
|
+
|
157
|
+
* **人与AI的角色转变**:
|
158
|
+
* **你 (人类)**: 扮演**创意总监、品味判断者和方向引领者**。你负责提供愿景、经验和高层次的判断力,确保最终结果的质量和方向。
|
159
|
+
* **Jarvis (AI)**: 扮演**强大的执行伙伴和灵感催化剂**。它负责处理所有繁重、重复和技术性的细节,并能提供意想不到的解决方案,激发你的新想法。
|
160
|
+
|
161
|
+
Jarvis 正是为这种工作流而设计的工具。它通过无缝的命令行集成和强大的本地交互能力,将 "Vibe Working" 从一个抽象概念,变为了开发者触手可及的日常生产力工具,让你能更专注于**高价值的创造性思考**,而非琐碎的实现细节。
|
162
|
+
|
146
163
|
### 👥 目标用户
|
147
164
|
|
148
165
|
**谁适合使用 Jarvis?**
|
@@ -164,15 +181,23 @@ Jarvis 的定位是**个人开发者的高效助理**,旨在将研发流程中
|
|
164
181
|
|
165
182
|
### 系统要求
|
166
183
|
- **Linux**: 完全支持。
|
167
|
-
- **Windows**:
|
184
|
+
- **Windows**: 完全支持(需要 PowerShell)。
|
168
185
|
|
169
186
|
### 安装
|
170
187
|
|
171
188
|
#### 一键安装 (推荐)
|
172
189
|
只需一行命令即可完成所有安装和配置:
|
190
|
+
|
191
|
+
**Linux/macOS:**
|
173
192
|
```bash
|
174
193
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/skyfireitdiy/Jarvis/main/scripts/install.sh)"
|
175
194
|
```
|
195
|
+
|
196
|
+
**Windows (PowerShell):**
|
197
|
+
```powershell
|
198
|
+
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/skyfireitdiy/Jarvis/main/scripts/install.ps1'))
|
199
|
+
```
|
200
|
+
|
176
201
|
> 该脚本会自动检测Python环境、克隆项目、安装依赖并设置好路径。
|
177
202
|
|
178
203
|
#### 手动安装
|
@@ -197,6 +222,7 @@ Jarvis 包含一系列专注于不同任务的工具。以下是主要命令及
|
|
197
222
|
| `jarvis-platform-manager` | `jpm` | 管理和测试不同的大语言模型平台 |
|
198
223
|
| `jarvis-rag` | `jrg` | 构建和查询本地化的RAG知识库 |
|
199
224
|
| `jarvis-smart-shell` | `jss` | 实验性的智能Shell功能 |
|
225
|
+
| `jarvis-stats` | `jst` | 通用统计模块,支持记录和可视化任意指标数据 |
|
200
226
|
|
201
227
|
更多详细用法和参数,请查阅我们的 [**使用指南**](docs/jarvis_book/4.使用指南.md)。
|
202
228
|
|
@@ -240,7 +266,7 @@ ENV:
|
|
240
266
|
|
241
267
|
Jarvis 支持多种平台,包括 **Kimi**, **通义千问**, **OpenAI** 等。详细的配置选项、模型组设置以及所有可用参数,请参阅 [**使用指南**](docs/jarvis_book/4.使用指南.md)。
|
242
268
|
|
243
|
-
> **模型推荐**:
|
269
|
+
> **模型推荐**: 目前效果较好的模型是 `claude-opus-4-20250514`,可以通过国内代理商购买,例如 [FoxiAI](https://foxi-ai.top)。
|
244
270
|
|
245
271
|
---
|
246
272
|
|
@@ -59,6 +59,22 @@ Jarvis 的定位是**个人开发者的高效助理**,旨在将研发流程中
|
|
59
59
|
3. **迭代完善**: 根据 “补充用户群体”、“增加工作流对比”、“再增加一个例子” 等一系列追加指令,Jarvis 通过多次 `PATCH` 操作,逐步、精确地将新内容添加到本文档的指定位置。
|
60
60
|
4. **人机协作**: 在整个过程中,人类提供高层次的目标和方向,Jarvis 负责具体的探索、总结和代码(文档)修改任务,将一个模糊的想法快速落地为结构清晰的文档。
|
61
61
|
|
62
|
+
### Vibe Working: 一种更直觉的工作流
|
63
|
+
|
64
|
+
Jarvis 的核心理念与一种新兴的人机协作模式 **"Vibe Working"** (氛围式工作)不谋而合。这个概念源于AI研究者Andrej Karpathy,指的是利用大语言模型(LLM),将人类头脑中模糊、直觉性的想法(即“Vibe”)高效转化为具体的、结构化的成果。
|
65
|
+
|
66
|
+
这不再是传统的“指令-执行”模式,而是一种**对话式、迭代式**的共同创造过程。
|
67
|
+
|
68
|
+
* **从一个“感觉”开始**: 传统的自动化需要精确的输入和规则。而使用 Jarvis,你可以从一个模糊的目标开始,比如 `jca "给我写个脚本,监控这个网站的变化"` 或者 `jca "重构 'user' 模块,让它看起来更清爽"`。你提供的是方向和“感觉”,而不是详细的规格书。
|
69
|
+
|
70
|
+
* **迭代中逼近完美**: Jarvis (或其背后的LLM) 会提供一个初步的实现。这个版本可能不完美,但它是一个坚实的起点。接下来,你通过反馈来指导它,比如 `“这个地方的逻辑不对,应该先检查A再处理B”` 或者 `“变量名能再语义化一点吗?”`。通过这种快速的反馈循环,AI的产出将逐步逼近你的真实意图。
|
71
|
+
|
72
|
+
* **人与AI的角色转变**:
|
73
|
+
* **你 (人类)**: 扮演**创意总监、品味判断者和方向引领者**。你负责提供愿景、经验和高层次的判断力,确保最终结果的质量和方向。
|
74
|
+
* **Jarvis (AI)**: 扮演**强大的执行伙伴和灵感催化剂**。它负责处理所有繁重、重复和技术性的细节,并能提供意想不到的解决方案,激发你的新想法。
|
75
|
+
|
76
|
+
Jarvis 正是为这种工作流而设计的工具。它通过无缝的命令行集成和强大的本地交互能力,将 "Vibe Working" 从一个抽象概念,变为了开发者触手可及的日常生产力工具,让你能更专注于**高价值的创造性思考**,而非琐碎的实现细节。
|
77
|
+
|
62
78
|
### 👥 目标用户
|
63
79
|
|
64
80
|
**谁适合使用 Jarvis?**
|
@@ -80,15 +96,23 @@ Jarvis 的定位是**个人开发者的高效助理**,旨在将研发流程中
|
|
80
96
|
|
81
97
|
### 系统要求
|
82
98
|
- **Linux**: 完全支持。
|
83
|
-
- **Windows**:
|
99
|
+
- **Windows**: 完全支持(需要 PowerShell)。
|
84
100
|
|
85
101
|
### 安装
|
86
102
|
|
87
103
|
#### 一键安装 (推荐)
|
88
104
|
只需一行命令即可完成所有安装和配置:
|
105
|
+
|
106
|
+
**Linux/macOS:**
|
89
107
|
```bash
|
90
108
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/skyfireitdiy/Jarvis/main/scripts/install.sh)"
|
91
109
|
```
|
110
|
+
|
111
|
+
**Windows (PowerShell):**
|
112
|
+
```powershell
|
113
|
+
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/skyfireitdiy/Jarvis/main/scripts/install.ps1'))
|
114
|
+
```
|
115
|
+
|
92
116
|
> 该脚本会自动检测Python环境、克隆项目、安装依赖并设置好路径。
|
93
117
|
|
94
118
|
#### 手动安装
|
@@ -113,6 +137,7 @@ Jarvis 包含一系列专注于不同任务的工具。以下是主要命令及
|
|
113
137
|
| `jarvis-platform-manager` | `jpm` | 管理和测试不同的大语言模型平台 |
|
114
138
|
| `jarvis-rag` | `jrg` | 构建和查询本地化的RAG知识库 |
|
115
139
|
| `jarvis-smart-shell` | `jss` | 实验性的智能Shell功能 |
|
140
|
+
| `jarvis-stats` | `jst` | 通用统计模块,支持记录和可视化任意指标数据 |
|
116
141
|
|
117
142
|
更多详细用法和参数,请查阅我们的 [**使用指南**](docs/jarvis_book/4.使用指南.md)。
|
118
143
|
|
@@ -156,7 +181,7 @@ ENV:
|
|
156
181
|
|
157
182
|
Jarvis 支持多种平台,包括 **Kimi**, **通义千问**, **OpenAI** 等。详细的配置选项、模型组设置以及所有可用参数,请参阅 [**使用指南**](docs/jarvis_book/4.使用指南.md)。
|
158
183
|
|
159
|
-
> **模型推荐**:
|
184
|
+
> **模型推荐**: 目前效果较好的模型是 `claude-opus-4-20250514`,可以通过国内代理商购买,例如 [FoxiAI](https://foxi-ai.top)。
|
160
185
|
|
161
186
|
---
|
162
187
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "jarvis-ai-assistant"
|
7
|
-
version = "0.2.
|
7
|
+
version = "0.2.5"
|
8
8
|
description = "Jarvis: An AI assistant that uses tools to interact with the system"
|
9
9
|
readme = "README.md"
|
10
10
|
authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
|
@@ -42,6 +42,7 @@ dependencies = [
|
|
42
42
|
"markdownify>=1.1.0",
|
43
43
|
"typer",
|
44
44
|
"pathspec",
|
45
|
+
"plotext==5.2.8",
|
45
46
|
]
|
46
47
|
requires-python = ">=3.9,<3.13"
|
47
48
|
|
@@ -65,6 +66,9 @@ Homepage = "https://github.com/skyfireitdiy/Jarvis"
|
|
65
66
|
[tool.isort]
|
66
67
|
profile = "black"
|
67
68
|
|
69
|
+
[tool.mypy]
|
70
|
+
ignore_missing_imports = true
|
71
|
+
|
68
72
|
[project.scripts]
|
69
73
|
jarvis = "jarvis.jarvis_agent.jarvis:main"
|
70
74
|
jvs = "jarvis.jarvis_agent.jarvis:main"
|
@@ -90,6 +94,8 @@ jarvis-methodology = "jarvis.jarvis_methodology.main:main"
|
|
90
94
|
jm = "jarvis.jarvis_methodology.main:main"
|
91
95
|
jarvis-rag = "jarvis.jarvis_rag.cli:main"
|
92
96
|
jrg = "jarvis.jarvis_rag.cli:main"
|
97
|
+
jarvis-stats = "jarvis.jarvis_stats.cli:main"
|
98
|
+
jst = "jarvis.jarvis_stats.cli:main"
|
93
99
|
|
94
100
|
[[tool.uv.index]]
|
95
101
|
url = "https://artsz.zte.com.cn/artifactory/api/pypi/public-pypi-virtual/simple"
|
@@ -3,11 +3,11 @@ from setuptools import setup, find_packages # type: ignore
|
|
3
3
|
|
4
4
|
setup(
|
5
5
|
name="jarvis-ai-assistant",
|
6
|
-
version="0.2.
|
6
|
+
version="0.2.5",
|
7
7
|
author="skyfire",
|
8
8
|
author_email="skyfireitdiy@hotmail.com",
|
9
9
|
description="An AI assistant that uses various tools to interact with the system",
|
10
|
-
long_description=open("README.md").read(),
|
10
|
+
long_description=open("README.md", encoding="utf-8").read(),
|
11
11
|
long_description_content_type="text/markdown",
|
12
12
|
url="https://github.com/skyfireitdiy/Jarvis",
|
13
13
|
packages=find_packages(where="src"),
|
@@ -36,6 +36,7 @@ setup(
|
|
36
36
|
"lxml==6.0.0",
|
37
37
|
"markdownify>=1.1.0",
|
38
38
|
"typer",
|
39
|
+
"plotext==5.2.8",
|
39
40
|
],
|
40
41
|
extras_require={
|
41
42
|
"dev": ["pytest", "black", "isort", "mypy", "build", "twine"],
|
@@ -78,6 +79,8 @@ setup(
|
|
78
79
|
"jm=jarvis.jarvis_methodology.main:main",
|
79
80
|
"jarvis-rag=jarvis.jarvis_rag.cli:main",
|
80
81
|
"jrg=jarvis.jarvis_rag.cli:main",
|
82
|
+
"jarvis-stats=jarvis.jarvis_stats.cli:main",
|
83
|
+
"jst=jarvis.jarvis_stats.cli:main",
|
81
84
|
],
|
82
85
|
},
|
83
86
|
python_requires=">=3.9,<3.13",
|
@@ -511,7 +511,7 @@ class Agent:
|
|
511
511
|
)
|
512
512
|
if user_input:
|
513
513
|
run_input_handlers = True
|
514
|
-
#
|
514
|
+
# 如果有工具调用且用户确认继续,则继续执行工具调用
|
515
515
|
if any(
|
516
516
|
handler.can_handle(current_response)
|
517
517
|
for handler in self.output_handler
|
@@ -519,13 +519,19 @@ class Agent:
|
|
519
519
|
if user_confirm(
|
520
520
|
"检测到有工具调用,是否继续处理工具调用?", True
|
521
521
|
):
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
522
|
+
# 先添加用户干预信息到session
|
523
|
+
self.session.prompt = f"被用户中断,用户补充信息为:{user_input}\n\n用户同意继续工具调用。"
|
524
|
+
# 继续执行下面的工具调用逻辑,不要continue跳过
|
525
|
+
else:
|
526
|
+
# 用户选择不继续处理工具调用
|
527
|
+
self.session.prompt = f"被用户中断,用户补充信息为:{user_input}\n\n检测到有工具调用,但被用户拒绝执行。请根据用户的补充信息重新考虑下一步操作。"
|
526
528
|
continue
|
527
|
-
|
528
|
-
|
529
|
+
else:
|
530
|
+
# 没有检测到工具调用
|
531
|
+
self.session.prompt = (
|
532
|
+
f"被用户中断,用户补充信息为:{user_input}"
|
533
|
+
)
|
534
|
+
continue
|
529
535
|
|
530
536
|
need_return, self.session.prompt = self._call_tools(
|
531
537
|
current_response
|
{jarvis_ai_assistant-0.2.3 → jarvis_ai_assistant-0.2.5}/src/jarvis/jarvis_agent/edit_file_handler.py
RENAMED
@@ -55,6 +55,10 @@ class EditFileHandler(OutputHandler):
|
|
55
55
|
patches = self._parse_patches(response)
|
56
56
|
if not patches:
|
57
57
|
return False, "未找到有效的文件编辑指令"
|
58
|
+
|
59
|
+
# 记录 edit_file 工具调用统计
|
60
|
+
from jarvis.jarvis_stats.stats import StatsManager
|
61
|
+
StatsManager.increment("edit_file", group="tool")
|
58
62
|
|
59
63
|
results = []
|
60
64
|
|
@@ -24,7 +24,7 @@ from jarvis.jarvis_tools.registry import ToolRegistry
|
|
24
24
|
from jarvis.jarvis_utils.config import get_data_dir
|
25
25
|
from jarvis.jarvis_utils.utils import init_env
|
26
26
|
|
27
|
-
app = typer.Typer(help="Jarvis AI
|
27
|
+
app = typer.Typer(help="Jarvis AI 助手")
|
28
28
|
|
29
29
|
|
30
30
|
def _load_tasks() -> Dict[str, str]:
|
@@ -91,19 +91,13 @@ def _select_task(tasks: Dict[str, str]) -> str:
|
|
91
91
|
selected_task = tasks[task_names[choice - 1]]
|
92
92
|
PrettyOutput.print(f"将要执行任务:\n {selected_task}", OutputType.INFO)
|
93
93
|
# 询问是否需要补充信息
|
94
|
-
need_additional = user_confirm(
|
95
|
-
"需要为此任务添加补充信息吗?", default=False
|
96
|
-
)
|
94
|
+
need_additional = user_confirm("需要为此任务添加补充信息吗?", default=False)
|
97
95
|
if need_additional:
|
98
96
|
additional_input = get_multiline_input("请输入补充信息:")
|
99
97
|
if additional_input:
|
100
|
-
selected_task =
|
101
|
-
f"{selected_task}\n\n补充信息:\n{additional_input}"
|
102
|
-
)
|
98
|
+
selected_task = f"{selected_task}\n\n补充信息:\n{additional_input}"
|
103
99
|
return selected_task
|
104
|
-
PrettyOutput.print(
|
105
|
-
"无效的选择。请选择列表中的一个号码。", OutputType.WARNING
|
106
|
-
)
|
100
|
+
PrettyOutput.print("无效的选择。请选择列表中的一个号码。", OutputType.WARNING)
|
107
101
|
|
108
102
|
except (KeyboardInterrupt, EOFError):
|
109
103
|
return ""
|
@@ -121,7 +115,16 @@ def _handle_edit_mode(edit: bool, config_file: Optional[str]) -> None:
|
|
121
115
|
if config_file
|
122
116
|
else Path(os.path.expanduser("~/.jarvis/config.yaml"))
|
123
117
|
)
|
124
|
-
|
118
|
+
# 根据操作系统选择合适的编辑器
|
119
|
+
import platform
|
120
|
+
|
121
|
+
if platform.system() == "Windows":
|
122
|
+
# 优先级:终端工具 -> 代码编辑器 -> 通用文本编辑器
|
123
|
+
editors = ["nvim", "vim", "nano", "code", "notepad++", "notepad"]
|
124
|
+
else:
|
125
|
+
# 优先级:终端工具 -> 代码编辑器 -> 通用文本编辑器
|
126
|
+
editors = ["nvim", "vim", "vi", "nano", "emacs", "code", "gedit", "kate"]
|
127
|
+
|
125
128
|
editor = next((e for e in editors if shutil.which(e)), None)
|
126
129
|
|
127
130
|
if editor:
|
@@ -133,7 +136,7 @@ def _handle_edit_mode(edit: bool, config_file: Optional[str]) -> None:
|
|
133
136
|
raise typer.Exit(code=1)
|
134
137
|
else:
|
135
138
|
PrettyOutput.print(
|
136
|
-
"No suitable editor found
|
139
|
+
f"No suitable editor found. Tried: {', '.join(editors)}", OutputType.ERROR
|
137
140
|
)
|
138
141
|
raise typer.Exit(code=1)
|
139
142
|
|
@@ -186,30 +189,24 @@ def run_cli(
|
|
186
189
|
llm_type: str = typer.Option(
|
187
190
|
"normal",
|
188
191
|
"--llm_type",
|
189
|
-
help="LLM
|
190
|
-
),
|
191
|
-
task: Optional[str] = typer.Option(
|
192
|
-
None, "-t", "--task", help="Directly input task content from command line"
|
192
|
+
help="使用的LLM类型,可选值:'normal'(普通)或 'thinking'(思考模式)",
|
193
193
|
),
|
194
|
+
task: Optional[str] = typer.Option(None, "-t", "--task", help="从命令行直接输入任务内容"),
|
194
195
|
model_group: Optional[str] = typer.Option(
|
195
|
-
None, "--
|
196
|
-
),
|
197
|
-
config_file: Optional[str] = typer.Option(
|
198
|
-
None, "-f", "--config", help="Path to custom config file"
|
196
|
+
None, "--llm_group", help="使用的模型组,覆盖配置文件中的设置"
|
199
197
|
),
|
198
|
+
config_file: Optional[str] = typer.Option(None, "-f", "--config", help="自定义配置文件路径"),
|
200
199
|
restore_session: bool = typer.Option(
|
201
200
|
False,
|
202
201
|
"--restore-session",
|
203
|
-
help="
|
204
|
-
),
|
205
|
-
edit: bool = typer.Option(
|
206
|
-
False, "-e", "--edit", help="Edit the configuration file"
|
202
|
+
help="从 .jarvis/saved_session.json 恢复会话",
|
207
203
|
),
|
204
|
+
edit: bool = typer.Option(False, "-e", "--edit", help="编辑配置文件"),
|
208
205
|
) -> None:
|
209
206
|
"""Jarvis AI assistant command-line interface."""
|
210
207
|
if ctx.invoked_subcommand is not None:
|
211
208
|
return
|
212
|
-
|
209
|
+
|
213
210
|
_handle_edit_mode(edit, config_file)
|
214
211
|
|
215
212
|
init_env("欢迎使用 Jarvis AI 助手,您的智能助理已准备就绪!", config_file=config_file)
|
@@ -10,7 +10,7 @@ from jarvis.jarvis_utils.input import get_multiline_input
|
|
10
10
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
11
11
|
from jarvis.jarvis_utils.utils import init_env
|
12
12
|
|
13
|
-
app = typer.Typer(help="Jarvis AI
|
13
|
+
app = typer.Typer(help="Jarvis AI 助手")
|
14
14
|
|
15
15
|
|
16
16
|
def load_config(config_path: str) -> dict:
|
@@ -40,21 +40,21 @@ def load_config(config_path: str) -> dict:
|
|
40
40
|
@app.command()
|
41
41
|
def cli(
|
42
42
|
config_file: Optional[str] = typer.Option(
|
43
|
-
None, "-f", "--config", help="
|
43
|
+
None, "-f", "--config", help="代理配置文件路径"
|
44
44
|
),
|
45
45
|
agent_definition: Optional[str] = typer.Option(
|
46
|
-
None, "-c", "--agent_definition", help="
|
46
|
+
None, "-c", "--agent_definition", help="代理定义文件路径"
|
47
47
|
),
|
48
48
|
task: Optional[str] = typer.Option(
|
49
|
-
None, "-t", "--task", help="
|
49
|
+
None, "-t", "--task", help="初始任务内容"
|
50
50
|
),
|
51
51
|
llm_type: str = typer.Option(
|
52
52
|
"normal",
|
53
53
|
"--llm_type",
|
54
|
-
help="LLM
|
54
|
+
help="使用的LLM类型,覆盖配置文件中的设置",
|
55
55
|
),
|
56
56
|
model_group: Optional[str] = typer.Option(
|
57
|
-
None, "--
|
57
|
+
None, "--llm_group", help="使用的模型组,覆盖配置文件中的设置"
|
58
58
|
),
|
59
59
|
):
|
60
60
|
"""Main entry point for Jarvis agent"""
|