jarvis-ai-assistant 0.1.207__tar.gz → 0.1.208__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.
Files changed (109) hide show
  1. {jarvis_ai_assistant-0.1.207/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.208}/PKG-INFO +1 -10
  2. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/README.md +0 -8
  3. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/pyproject.toml +1 -3
  4. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/setup.py +5 -12
  5. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/__init__.py +1 -1
  6. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/__init__.py +71 -61
  7. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/edit_file_handler.py +42 -46
  8. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/jarvis.py +33 -39
  9. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_agent/code_agent.py +26 -27
  10. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_agent/lint.py +5 -5
  11. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/code_review.py +164 -175
  12. jarvis_ai_assistant-0.1.208/src/jarvis/jarvis_git_utils/git_commiter.py +331 -0
  13. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_methodology/main.py +70 -81
  14. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/base.py +21 -17
  15. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/kimi.py +39 -53
  16. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/tongyi.py +108 -126
  17. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/yuanbao.py +112 -120
  18. jarvis_ai_assistant-0.1.208/src/jarvis/jarvis_platform_manager/main.py +407 -0
  19. jarvis_ai_assistant-0.1.208/src/jarvis/jarvis_platform_manager/service.py +432 -0
  20. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_smart_shell/main.py +99 -33
  21. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/edit_file.py +64 -55
  22. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/file_analyzer.py +17 -25
  23. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/read_code.py +80 -81
  24. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/builtin_replace_map.py +1 -36
  25. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/config.py +14 -4
  26. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/git_utils.py +36 -35
  27. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/methodology.py +12 -17
  28. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -10
  29. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -6
  30. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -1
  31. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -1
  32. jarvis_ai_assistant-0.1.207/src/jarvis/jarvis_dev/main.py +0 -1247
  33. jarvis_ai_assistant-0.1.207/src/jarvis/jarvis_git_utils/git_commiter.py +0 -336
  34. jarvis_ai_assistant-0.1.207/src/jarvis/jarvis_platform_manager/main.py +0 -807
  35. jarvis_ai_assistant-0.1.207/src/jarvis/jarvis_tools/chdir.py +0 -72
  36. jarvis_ai_assistant-0.1.207/src/jarvis/jarvis_tools/code_plan.py +0 -218
  37. jarvis_ai_assistant-0.1.207/src/jarvis/jarvis_tools/create_code_agent.py +0 -95
  38. jarvis_ai_assistant-0.1.207/src/jarvis/jarvis_tools/create_sub_agent.py +0 -82
  39. jarvis_ai_assistant-0.1.207/src/jarvis/jarvis_tools/file_operation.py +0 -238
  40. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/LICENSE +0 -0
  41. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/MANIFEST.in +0 -0
  42. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/setup.cfg +0 -0
  43. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  44. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/main.py +0 -0
  45. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  46. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  47. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  48. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  49. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  50. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  51. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  52. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  53. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  54. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  55. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  56. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  57. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  58. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  59. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  60. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  61. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  62. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  63. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  64. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  65. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  66. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  67. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  68. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_data/config_schema.json +0 -0
  69. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_data/huggingface.tar.gz +0 -0
  70. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  71. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_git_details/main.py +0 -0
  72. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  73. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_git_squash/main.py +0 -0
  74. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  75. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  76. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  77. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  78. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  79. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  80. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/__init__.py +0 -0
  81. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/human.py +0 -0
  82. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/openai.py +0 -0
  83. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/registry.py +0 -0
  84. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  85. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  86. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/__init__.py +0 -0
  87. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  88. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/base.py +0 -0
  89. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  90. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  91. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  92. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  93. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/methodology.py +0 -0
  94. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  95. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/registry.py +0 -0
  96. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  97. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/search_web.py +0 -0
  98. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  99. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/__init__.py +0 -0
  100. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/embedding.py +0 -0
  101. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  102. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/globals.py +0 -0
  103. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/input.py +0 -0
  104. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/jarvis_history.py +0 -0
  105. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/output.py +0 -0
  106. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/tag.py +0 -0
  107. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/utils.py +0 -0
  108. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  109. {jarvis_ai_assistant-0.1.207 → jarvis_ai_assistant-0.1.208}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.207
3
+ Version: 0.1.208
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
@@ -43,7 +43,6 @@ License-File: LICENSE
43
43
  Requires-Dist: requests==2.32.3
44
44
  Requires-Dist: colorama==0.4.6
45
45
  Requires-Dist: prompt_toolkit==3.0.50
46
- Requires-Dist: yaspin==2.4.0
47
46
  Requires-Dist: pygments==2.19.1
48
47
  Requires-Dist: fuzzywuzzy==0.18.0
49
48
  Requires-Dist: fastapi==0.115.12
@@ -109,7 +108,6 @@ pip3 install jarvis-ai-assistant
109
108
  | `jarvis-platform-manager` | - | 使用平台管理功能 |
110
109
  | `jarvis-code-review` | - | 使用代码审查功能 |
111
110
  | `jarvis-git-commit` | `jgc` | 使用自动化git commit功能 |
112
- | `jarvis-dev` | - | 使用dev功能(开发中) |
113
111
  | `jarvis-git-squash` | - | 使用git squash功能 |
114
112
  | `jarvis-multi-agent` | - | 使用多代理功能 |
115
113
  | `jarvis-agent` | - | 使用agent功能 |
@@ -547,15 +545,10 @@ OPENAI_API_BASE: https://api.openai.com/v1
547
545
  | 工具名称 | 描述 |
548
546
  |----------|------|
549
547
  | ask_user | 交互式用户输入收集 |
550
- | chdir | 更改当前工作目录 |
551
548
  | rewrite_file | 文件重写工具 |
552
549
  | edit_file | 代码编辑工具 |
553
- | code_plan | 理解需求并制定代码修改计划 |
554
- | create_code_agent | 代码开发工具 |
555
- | create_sub_agent | 创建子代理处理特定任务 |
556
550
  | execute_script | 执行脚本并返回结果 |
557
551
  | file_analyzer | 分析文件内容并提取关键信息 |
558
- | file_operation | 文件批量操作工具 |
559
552
  | methodology | 方法论管理工具 |
560
553
  | read_code | 代码阅读与分析工具 |
561
554
  | read_webpage | 读取网页内容并分析 |
@@ -572,9 +565,7 @@ OPENAI_API_BASE: https://api.openai.com/v1
572
565
  | `'ToolUsage'` | 显示可用工具列表及使用方法 |
573
566
  | `'ReloadConfig'` | 重新加载配置文件 |
574
567
  | `'Web'` | 网页搜索,支持多种提问格式 |
575
- | `'Plan'` | 生成代码修改计划,提供详细需求描述 |
576
568
  | `'FindRelatedFiles'` | 查找与功能相关的文件 |
577
- | `'Dev'` | 调用create_code_agent开发需求 |
578
569
  | `'Fix'` | 修复问题 |
579
570
  | `'Check'` | 执行静态代码检查,包括错误和风格问题 |
580
571
 
@@ -39,7 +39,6 @@ pip3 install jarvis-ai-assistant
39
39
  | `jarvis-platform-manager` | - | 使用平台管理功能 |
40
40
  | `jarvis-code-review` | - | 使用代码审查功能 |
41
41
  | `jarvis-git-commit` | `jgc` | 使用自动化git commit功能 |
42
- | `jarvis-dev` | - | 使用dev功能(开发中) |
43
42
  | `jarvis-git-squash` | - | 使用git squash功能 |
44
43
  | `jarvis-multi-agent` | - | 使用多代理功能 |
45
44
  | `jarvis-agent` | - | 使用agent功能 |
@@ -477,15 +476,10 @@ OPENAI_API_BASE: https://api.openai.com/v1
477
476
  | 工具名称 | 描述 |
478
477
  |----------|------|
479
478
  | ask_user | 交互式用户输入收集 |
480
- | chdir | 更改当前工作目录 |
481
479
  | rewrite_file | 文件重写工具 |
482
480
  | edit_file | 代码编辑工具 |
483
- | code_plan | 理解需求并制定代码修改计划 |
484
- | create_code_agent | 代码开发工具 |
485
- | create_sub_agent | 创建子代理处理特定任务 |
486
481
  | execute_script | 执行脚本并返回结果 |
487
482
  | file_analyzer | 分析文件内容并提取关键信息 |
488
- | file_operation | 文件批量操作工具 |
489
483
  | methodology | 方法论管理工具 |
490
484
  | read_code | 代码阅读与分析工具 |
491
485
  | read_webpage | 读取网页内容并分析 |
@@ -502,9 +496,7 @@ OPENAI_API_BASE: https://api.openai.com/v1
502
496
  | `'ToolUsage'` | 显示可用工具列表及使用方法 |
503
497
  | `'ReloadConfig'` | 重新加载配置文件 |
504
498
  | `'Web'` | 网页搜索,支持多种提问格式 |
505
- | `'Plan'` | 生成代码修改计划,提供详细需求描述 |
506
499
  | `'FindRelatedFiles'` | 查找与功能相关的文件 |
507
- | `'Dev'` | 调用create_code_agent开发需求 |
508
500
  | `'Fix'` | 修复问题 |
509
501
  | `'Check'` | 执行静态代码检查,包括错误和风格问题 |
510
502
 
@@ -8,7 +8,7 @@ default = true
8
8
 
9
9
  [project]
10
10
  name = "jarvis-ai-assistant"
11
- version = "0.1.207"
11
+ version = "0.1.208"
12
12
  description = "Jarvis: An AI assistant that uses tools to interact with the system"
13
13
  readme = "README.md"
14
14
  authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
@@ -29,7 +29,6 @@ dependencies = [
29
29
  "requests==2.32.3",
30
30
  "colorama==0.4.6",
31
31
  "prompt_toolkit==3.0.50",
32
- "yaspin==2.4.0",
33
32
  "pygments==2.19.1",
34
33
  "fuzzywuzzy==0.18.0",
35
34
  "fastapi==0.115.12",
@@ -61,7 +60,6 @@ jarvis-platform-manager = "jarvis.jarvis_platform_manager.main:main"
61
60
  jarvis-git-commit = "jarvis.jarvis_git_utils.git_commiter:main"
62
61
  jarvis-code-review = "jarvis.jarvis_code_analysis.code_review:main"
63
62
  jgc = "jarvis.jarvis_git_utils.git_commiter:main"
64
- jarvis-dev = "jarvis.jarvis_dev.main:main"
65
63
  jarvis-git-squash = "jarvis.jarvis_git_squash.main:main"
66
64
  jarvis-multi-agent = "jarvis.jarvis_multi_agent.main:main"
67
65
  jarvis-agent = "jarvis.jarvis_agent.main:main"
@@ -1,9 +1,9 @@
1
1
  # -*- coding: utf-8 -*-
2
- from setuptools import setup, find_packages
2
+ from setuptools import setup, find_packages # type: ignore
3
3
 
4
4
  setup(
5
5
  name="jarvis-ai-assistant",
6
- version="0.1.207",
6
+ version="0.1.208",
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",
@@ -14,16 +14,12 @@ setup(
14
14
  package_dir={"": "src"},
15
15
  include_package_data=True,
16
16
  package_data={
17
- "jarvis": [
18
- "jarvis_data/huggingface.tar.gz",
19
- "jarvis_data/config_schema.json"
20
- ],
17
+ "jarvis": ["jarvis_data/huggingface.tar.gz", "jarvis_data/config_schema.json"],
21
18
  },
22
19
  install_requires=[
23
20
  "requests==2.32.3",
24
21
  "colorama==0.4.6",
25
22
  "prompt_toolkit==3.0.50",
26
- "yaspin==2.4.0",
27
23
  "pygments==2.19.1",
28
24
  "fuzzywuzzy==0.18.0",
29
25
  "fastapi==0.115.12",
@@ -37,9 +33,7 @@ setup(
37
33
  "tabulate==0.9.0",
38
34
  "pyte==0.8.2",
39
35
  ],
40
- extras_require={
41
- "dev": ["pytest", "black", "isort", "mypy", "build", "twine"]
42
- },
36
+ extras_require={"dev": ["pytest", "black", "isort", "mypy", "build", "twine"]},
43
37
  entry_points={
44
38
  "console_scripts": [
45
39
  "jarvis=jarvis.jarvis_agent.jarvis:main",
@@ -49,9 +43,8 @@ setup(
49
43
  "jss=jarvis.jarvis_smart_shell.main:main",
50
44
  "jarvis-platform-manager=jarvis.jarvis_platform_manager.main:main",
51
45
  "jarvis-code-review=jarvis.jarvis_code_analysis.code_review:main",
52
- "jarvis-git-commit=jarvis.jarvis_git_utils.git_commiter:main",
46
+ "jarvis-git-commit=jarvis.jarvis_git_utils.git_commiter:main",
53
47
  "jgc=jarvis.jarvis_git_utils.git_commiter:main",
54
- "jarvis-dev=jarvis.jarvis_dev.main:main",
55
48
  "jarvis-git-squash=jarvis.jarvis_git_squash.main:main",
56
49
  "jarvis-multi-agent=jarvis.jarvis_multi_agent.main:main",
57
50
  "jarvis-agent=jarvis.jarvis_agent.main:main",
@@ -1,4 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """Jarvis AI Assistant"""
3
3
 
4
- __version__ = "0.1.207"
4
+ __version__ = "0.1.208"
@@ -7,27 +7,35 @@ import platform
7
7
  from typing import Any, Callable, Dict, List, Optional, Protocol, Tuple, Union
8
8
 
9
9
  # 第三方库导入
10
- from yaspin import yaspin # type: ignore
11
10
 
12
11
  # 本地库导入
13
12
  # jarvis_agent 相关
14
13
  # jarvis_platform 相关
15
14
  from jarvis.jarvis_platform.base import BasePlatform
16
15
  from jarvis.jarvis_platform.registry import PlatformRegistry
16
+
17
17
  # jarvis_utils 相关
18
- from jarvis.jarvis_utils.config import (get_data_dir, get_max_token_count,
19
- get_max_tool_call_count,
20
- is_auto_complete,
21
- is_execute_tool_confirm,
22
- is_use_analysis, get_history_count, is_use_methodology)
18
+ from jarvis.jarvis_utils.config import (
19
+ get_data_dir,
20
+ get_max_token_count,
21
+ get_max_tool_call_count,
22
+ is_auto_complete,
23
+ is_execute_tool_confirm,
24
+ is_use_analysis,
25
+ get_history_count,
26
+ is_use_methodology,
27
+ )
23
28
  from jarvis.jarvis_utils.embedding import get_context_token_count
24
- from jarvis.jarvis_utils.globals import (delete_agent, get_interrupt,
25
- make_agent_name, set_agent,
26
- set_interrupt)
29
+ from jarvis.jarvis_utils.globals import (
30
+ delete_agent,
31
+ get_interrupt,
32
+ make_agent_name,
33
+ set_agent,
34
+ set_interrupt,
35
+ )
27
36
  from jarvis.jarvis_utils.input import get_multiline_input
28
37
  from jarvis.jarvis_utils.jarvis_history import JarvisHistory
29
- from jarvis.jarvis_utils.methodology import (load_methodology,
30
- upload_methodology)
38
+ from jarvis.jarvis_utils.methodology import load_methodology, upload_methodology
31
39
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
32
40
  from jarvis.jarvis_utils.tag import ct, ot
33
41
  from jarvis.jarvis_utils.utils import user_confirm
@@ -240,11 +248,12 @@ class Agent:
240
248
  self.after_tool_call_cb: Optional[Callable[[Agent], None]] = None
241
249
 
242
250
  self.history = JarvisHistory()
243
- self.history_dir = str(Path(get_data_dir())/"history")
251
+ self.history_dir = str(Path(get_data_dir()) / "history")
244
252
  self.history.start_record(self.history_dir)
245
253
 
246
- self.history_count = history_count if history_count is not None else get_history_count()
247
-
254
+ self.history_count = (
255
+ history_count if history_count is not None else get_history_count()
256
+ )
248
257
 
249
258
  self.execute_tool_confirm = (
250
259
  execute_tool_confirm
@@ -422,8 +431,8 @@ class Agent:
422
431
  注意:
423
432
  仅生成摘要,不修改对话状态
424
433
  """
425
- with yaspin(text="正在总结对话历史...", color="cyan") as spinner:
426
- summary_prompt = """
434
+ print("📄 正在总结对话历史...")
435
+ summary_prompt = """
427
436
  <summary_request>
428
437
  <objective>
429
438
  请对当前对话历史进行简明扼要的总结,提取关键信息和重要决策点。这个总结将作为上下文继续任务,因此需要保留对后续对话至关重要的内容。
@@ -447,14 +456,11 @@ class Agent:
447
456
  """
448
457
 
449
458
  try:
450
- with spinner.hidden():
451
- summary = self.model.chat_until_success(self.prompt + "\n" + summary_prompt) # type: ignore
452
- spinner.text = "总结对话历史完成"
453
- spinner.ok("✅")
459
+ summary = self.model.chat_until_success(self.prompt + "\n" + summary_prompt) # type: ignore
460
+ print("✅ 总结对话历史完成")
454
461
  return summary
455
462
  except Exception as e:
456
- spinner.text = "总结对话历史失败"
457
- spinner.fail("❌")
463
+ print("❌ 总结对话历史失败")
458
464
  return ""
459
465
 
460
466
  def _summarize_and_clear_history(self) -> str:
@@ -482,6 +488,7 @@ class Agent:
482
488
  summary = self.generate_summary()
483
489
  else:
484
490
  import tempfile
491
+
485
492
  tmp_file = tempfile.NamedTemporaryFile(delete=False)
486
493
  tmp_file_name = tmp_file.name
487
494
  self.history.save_history(tmp_file_name)
@@ -553,15 +560,11 @@ class Agent:
553
560
  if not self.execute_tool_confirm or user_confirm(
554
561
  f"需要执行{tool_list[0].name()}确认执行?", True
555
562
  ):
556
- with yaspin(
557
- text=f"正在执行{tool_list[0].name()}...", color="cyan"
558
- ) as spinner:
559
- with spinner.hidden():
560
- result = tool_list[0].handle(response, self)
561
- spinner.text = f"{tool_list[0].name()}执行完成"
562
- spinner.ok("✅")
563
- self.tool_call_count += 1
564
- return result
563
+ print(f"🔧 正在执行{tool_list[0].name()}...")
564
+ result = tool_list[0].handle(response, self)
565
+ print(f"✅ {tool_list[0].name()}执行完成")
566
+ self.tool_call_count += 1
567
+ return result
565
568
  return False, ""
566
569
 
567
570
  def reset_tool_call_count(self):
@@ -581,21 +584,19 @@ class Agent:
581
584
  if self.use_analysis:
582
585
  self._analysis_task()
583
586
  if self.need_summary:
584
- with yaspin(text="正在生成总结...", color="cyan") as spinner:
585
- self.prompt = self.summary_prompt
586
- with spinner.hidden():
587
- ret = self.model.chat_until_success(self.prompt) # type: ignore
588
- spinner.text = "总结生成完成"
589
- spinner.ok("✅")
590
- return ret
587
+ print("📄 正在生成总结...")
588
+ self.prompt = self.summary_prompt
589
+ ret = self.model.chat_until_success(self.prompt) # type: ignore
590
+ print("✅ 总结生成完成")
591
+ return ret
591
592
 
592
593
  return "任务完成"
593
594
 
594
595
  def _analysis_task(self):
595
- with yaspin(text="正在分析任务...", color="cyan") as spinner:
596
- try:
597
- # 让模型判断是否需要生成方法论
598
- analysis_prompt = f"""<task_analysis>
596
+ print("🔍 正在分析任务...")
597
+ try:
598
+ # 让模型判断是否需要生成方法论
599
+ analysis_prompt = f"""<task_analysis>
599
600
  <request>
600
601
  当前任务已结束,请分析该任务的解决方案:
601
602
  1. 首先检查现有工具或方法论是否已经可以完成该任务,如果可以,直接说明即可,无需生成新内容
@@ -741,17 +742,12 @@ arguments:
741
742
  </output_requirements>
742
743
  </task_analysis>"""
743
744
 
744
- self.prompt = analysis_prompt
745
- with spinner.hidden():
746
- response = self.model.chat_until_success(self.prompt) # type: ignore
747
-
748
- with spinner.hidden():
749
- self._call_tools(response)
750
- spinner.text = "分析完成"
751
- spinner.ok("✅")
752
- except Exception as e:
753
- spinner.text = "分析失败"
754
- spinner.fail("❌")
745
+ self.prompt = analysis_prompt
746
+ response = self.model.chat_until_success(self.prompt) # type: ignore
747
+ self._call_tools(response)
748
+ print("✅ 分析完成")
749
+ except Exception as e:
750
+ print("❌ 分析失败")
755
751
 
756
752
  def make_default_addon_prompt(self, need_complete: bool) -> str:
757
753
  """生成附加提示。
@@ -822,8 +818,13 @@ arguments:
822
818
  )
823
819
  if user_input:
824
820
  # 如果有工具调用且用户确认继续,则将干预信息和工具执行结果拼接为prompt
825
- if any(handler.can_handle(current_response) for handler in self.output_handler):
826
- if user_confirm("检测到有工具调用,是否继续处理工具调用?", True):
821
+ if any(
822
+ handler.can_handle(current_response)
823
+ for handler in self.output_handler
824
+ ):
825
+ if user_confirm(
826
+ "检测到有工具调用,是否继续处理工具调用?", True
827
+ ):
827
828
  self.prompt = f"{user_input}\n\n{current_response}"
828
829
  continue
829
830
  self.prompt += f"{user_input}"
@@ -871,18 +872,25 @@ arguments:
871
872
  history_md = ""
872
873
  if self.history_count > 0 and self.model and self.model.support_upload_files():
873
874
  import tempfile
875
+
874
876
  timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
875
- history_md = str(Path(tempfile.gettempdir())/f"{self.name}_history_{timestamp}.md")
876
- self.history.export_history_to_markdown(self.history_dir, history_md, max_files=self.history_count)
877
+ history_md = str(
878
+ Path(tempfile.gettempdir()) / f"{self.name}_history_{timestamp}.md"
879
+ )
880
+ self.history.export_history_to_markdown(
881
+ self.history_dir, history_md, max_files=self.history_count
882
+ )
877
883
  self.files.append(history_md)
878
884
 
879
- # 如果有上传文件,先上传文件
885
+ # 如果有上传文件,先上传文件
880
886
  if self.model and self.model.support_upload_files():
881
887
  if self.use_methodology:
882
888
  if not upload_methodology(self.model, other_files=self.files):
883
889
  if self.files:
884
- PrettyOutput.print("文件上传失败,将忽略文件列表", OutputType.WARNING)
885
- # 上传失败则回退到本地加载
890
+ PrettyOutput.print(
891
+ "文件上传失败,将忽略文件列表", OutputType.WARNING
892
+ )
893
+ # 上传失败则回退到本地加载
886
894
  msg = self.prompt
887
895
  for handler in self.input_handler:
888
896
  msg, _ = handler(msg, self)
@@ -894,7 +902,9 @@ arguments:
894
902
  self.prompt = f"{self.prompt}\n\n上传的文件包含历史对话信息,可以从中获取一些经验信息。"
895
903
  elif self.files:
896
904
  if not self.model.upload_files(self.files):
897
- PrettyOutput.print("文件上传失败,将忽略文件列表", OutputType.WARNING)
905
+ PrettyOutput.print(
906
+ "文件上传失败,将忽略文件列表", OutputType.WARNING
907
+ )
898
908
  else:
899
909
  self.prompt = f"{self.prompt}\n\n上传的文件包含历史对话信息,可以从中获取一些经验信息。"
900
910
  else:
@@ -2,9 +2,6 @@ import os
2
2
  import re
3
3
  from typing import Any, Dict, List, Tuple
4
4
 
5
- from yaspin import yaspin # type: ignore
6
- from yaspin.core import Yaspin # type: ignore
7
-
8
5
  from jarvis.jarvis_agent.output_handler import OutputHandler
9
6
  from jarvis.jarvis_platform.registry import PlatformRegistry
10
7
  from jarvis.jarvis_utils.git_utils import revert_file
@@ -71,19 +68,19 @@ class EditFileHandler(OutputHandler):
71
68
  {"SEARCH": diff["SEARCH"], "REPLACE": diff["REPLACE"]} for diff in diffs
72
69
  ]
73
70
 
74
- with yaspin(text=f"正在处理文件 {file_path}...", color="cyan") as spinner:
75
- # 首先尝试fast_edit模式
76
- success, result = self._fast_edit(file_path, file_patches, spinner)
77
- if not success:
78
- # 如果fast_edit失败,尝试slow_edit模式
79
- success, result = EditFileHandler._slow_edit(
80
- file_path, file_patches, spinner, agent
81
- )
71
+ print(f"📝 正在处理文件 {file_path}...")
72
+ # 首先尝试fast_edit模式
73
+ success, result = self._fast_edit(file_path, file_patches)
74
+ if not success:
75
+ # 如果fast_edit失败,尝试slow_edit模式
76
+ success, result = EditFileHandler._slow_edit(
77
+ file_path, file_patches, agent
78
+ )
82
79
 
83
- if success:
84
- results.append(f"✅ 文件 {file_path} 修改成功")
85
- else:
86
- results.append(f"❌ 文件 {file_path} 修改失败: {result}")
80
+ if success:
81
+ results.append(f"✅ 文件 {file_path} 修改成功")
82
+ else:
83
+ results.append(f"❌ 文件 {file_path} 修改失败: {result}")
87
84
 
88
85
  summary = "\n".join(results)
89
86
  return False, summary
@@ -153,10 +150,11 @@ class EditFileHandler(OutputHandler):
153
150
  file_path = match.group(1) or match.group(2) or match.group(3)
154
151
  diffs = []
155
152
  for diff_match in self.diff_pattern.finditer(match.group(0)):
153
+ # 完全保留原始格式(包括所有空白和换行)
156
154
  diffs.append(
157
155
  {
158
- "SEARCH": diff_match.group(1).strip(),
159
- "REPLACE": diff_match.group(2).strip(),
156
+ "SEARCH": diff_match.group(1), # 原始SEARCH内容
157
+ "REPLACE": diff_match.group(2), # 原始REPLACE内容
160
158
  }
161
159
  )
162
160
  if diffs:
@@ -167,9 +165,7 @@ class EditFileHandler(OutputHandler):
167
165
  return patches
168
166
 
169
167
  @staticmethod
170
- def _fast_edit(
171
- file_path: str, patches: List[Dict[str, str]], spinner: Yaspin
172
- ) -> Tuple[bool, str]:
168
+ def _fast_edit(file_path: str, patches: List[Dict[str, str]]) -> Tuple[bool, str]:
173
169
  """快速应用补丁到文件
174
170
 
175
171
  该方法直接尝试将补丁应用到目标文件,适用于简单、明确的修改场景。
@@ -182,7 +178,6 @@ class EditFileHandler(OutputHandler):
182
178
  Args:
183
179
  file_path: 要修改的文件路径,支持绝对路径和相对路径
184
180
  patches: 补丁列表,每个补丁包含search(搜索文本)和replace(替换文本)
185
- spinner: 进度显示对象,用于显示处理状态和结果
186
181
 
187
182
  Returns:
188
183
  Tuple[bool, str]:
@@ -207,17 +202,22 @@ class EditFileHandler(OutputHandler):
207
202
  replace_text = patch["REPLACE"]
208
203
  patch_count += 1
209
204
 
210
- if search_text in modified_content:
211
- if modified_content.count(search_text) > 1:
205
+ # 精确匹配搜索文本(保留原始换行和空格)
206
+ exact_search = search_text
207
+
208
+ if exact_search in modified_content:
209
+ if modified_content.count(exact_search) > 1:
212
210
  PrettyOutput.print(
213
- f"搜索文本在文件中存在多处匹配:\n{search_text}",
211
+ f"搜索文本在文件中存在多处匹配:\n{exact_search}",
214
212
  output_type=OutputType.WARNING,
215
213
  )
216
- return False, f"搜索文本在文件中存在多处匹配:\n{search_text}"
214
+ return False, f"搜索文本在文件中存在多处匹配:\n{exact_search}"
215
+
216
+ # 直接执行替换(保留所有原始格式)
217
217
  modified_content = modified_content.replace(
218
- search_text, replace_text
218
+ exact_search, replace_text
219
219
  )
220
- spinner.write(f"✅ 补丁 #{patch_count} 应用成功")
220
+ print(f"✅ 补丁 #{patch_count} 应用成功")
221
221
  else:
222
222
  # 尝试增加缩进重试
223
223
  found = False
@@ -243,7 +243,7 @@ class EditFileHandler(OutputHandler):
243
243
  modified_content = modified_content.replace(
244
244
  indented_search, indented_replace
245
245
  )
246
- spinner.write(
246
+ print(
247
247
  f"✅ 补丁 #{patch_count} 应用成功 (自动增加 {space_count} 个空格缩进)"
248
248
  )
249
249
  found = True
@@ -260,19 +260,17 @@ class EditFileHandler(OutputHandler):
260
260
  with open(file_path, "w", encoding="utf-8") as f:
261
261
  f.write(modified_content)
262
262
 
263
- spinner.text = f"文件 {file_path} 修改完成,应用了 {patch_count} 个补丁"
264
- spinner.ok("✅")
263
+ print(f"文件 {file_path} 修改完成,应用了 {patch_count} 个补丁")
265
264
  return True, modified_content
266
265
 
267
266
  except Exception as e:
268
- spinner.text = f"文件修改失败: {str(e)}"
269
- spinner.fail("❌")
267
+ print(f"文件修改失败: {str(e)}")
270
268
  revert_file(file_path)
271
269
  return False, f"文件修改失败: {str(e)}"
272
270
 
273
271
  @staticmethod
274
272
  def _slow_edit(
275
- file_path: str, patches: List[Dict[str, str]], spinner: Yaspin, agent: Any
273
+ file_path: str, patches: List[Dict[str, str]], agent: Any
276
274
  ) -> Tuple[bool, str]:
277
275
  """使用AI模型生成补丁并应用到文件
278
276
 
@@ -287,7 +285,6 @@ class EditFileHandler(OutputHandler):
287
285
  Args:
288
286
  file_path: 要修改的文件路径,支持绝对路径和相对路径
289
287
  patches: 补丁列表,每个补丁包含search(搜索文本)和replace(替换文本)
290
- spinner: 进度显示对象,用于显示处理状态和结果
291
288
  agent: 执行处理的agent实例,用于访问AI模型平台
292
289
 
293
290
  Returns:
@@ -308,13 +305,12 @@ class EditFileHandler(OutputHandler):
308
305
  upload_success = False
309
306
 
310
307
  # 如果是大文件,尝试上传到模型平台
311
- with spinner.hidden():
312
- if (
313
- is_large_context
314
- and model.support_upload_files()
315
- and model.upload_files([file_path])
316
- ):
317
- upload_success = True
308
+ if (
309
+ is_large_context
310
+ and model.support_upload_files()
311
+ and model.upload_files([file_path])
312
+ ):
313
+ upload_success = True
318
314
 
319
315
  model.set_suppress_output(True)
320
316
 
@@ -387,8 +383,9 @@ class EditFileHandler(OutputHandler):
387
383
  # 检查是否被中断
388
384
  if get_interrupt():
389
385
  set_interrupt(False)
390
- with spinner.hidden():
391
- user_input = agent.multiline_inputer("补丁应用被中断,请输入补充信息:")
386
+ user_input = agent.multiline_inputer(
387
+ "补丁应用被中断,请输入补充信息:"
388
+ )
392
389
  if not user_input.strip():
393
390
  return False, "用户中断了补丁应用"
394
391
  return False, f"用户中断了补丁应用并提供了补充信息: {user_input}"
@@ -422,7 +419,7 @@ class EditFileHandler(OutputHandler):
422
419
  if generated_patches:
423
420
  # 尝试应用生成的补丁
424
421
  success, result = EditFileHandler._fast_edit(
425
- file_path, generated_patches, spinner
422
+ file_path, generated_patches
426
423
  )
427
424
  if success:
428
425
  return True, result
@@ -430,7 +427,6 @@ class EditFileHandler(OutputHandler):
430
427
  return False, "AI模型无法生成有效的补丁"
431
428
 
432
429
  except Exception as e:
433
- spinner.text = f"文件修改失败: {str(e)}"
434
- spinner.fail("❌")
430
+ print(f"文件修改失败: {str(e)}")
435
431
  revert_file(file_path)
436
432
  return False, f"文件修改失败: {str(e)}"