jarvis-ai-assistant 0.7.16__py3-none-any.whl → 1.0.2__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 (279) hide show
  1. jarvis/__init__.py +1 -1
  2. jarvis/jarvis_agent/__init__.py +567 -222
  3. jarvis/jarvis_agent/agent_manager.py +19 -12
  4. jarvis/jarvis_agent/builtin_input_handler.py +79 -11
  5. jarvis/jarvis_agent/config_editor.py +7 -2
  6. jarvis/jarvis_agent/event_bus.py +24 -13
  7. jarvis/jarvis_agent/events.py +19 -1
  8. jarvis/jarvis_agent/file_context_handler.py +67 -64
  9. jarvis/jarvis_agent/file_methodology_manager.py +38 -24
  10. jarvis/jarvis_agent/jarvis.py +186 -114
  11. jarvis/jarvis_agent/language_extractors/__init__.py +8 -1
  12. jarvis/jarvis_agent/language_extractors/c_extractor.py +7 -4
  13. jarvis/jarvis_agent/language_extractors/cpp_extractor.py +9 -4
  14. jarvis/jarvis_agent/language_extractors/go_extractor.py +7 -4
  15. jarvis/jarvis_agent/language_extractors/java_extractor.py +27 -20
  16. jarvis/jarvis_agent/language_extractors/javascript_extractor.py +22 -17
  17. jarvis/jarvis_agent/language_extractors/python_extractor.py +7 -4
  18. jarvis/jarvis_agent/language_extractors/rust_extractor.py +7 -4
  19. jarvis/jarvis_agent/language_extractors/typescript_extractor.py +22 -17
  20. jarvis/jarvis_agent/language_support_info.py +250 -219
  21. jarvis/jarvis_agent/main.py +19 -23
  22. jarvis/jarvis_agent/memory_manager.py +9 -6
  23. jarvis/jarvis_agent/methodology_share_manager.py +21 -15
  24. jarvis/jarvis_agent/output_handler.py +4 -2
  25. jarvis/jarvis_agent/prompt_builder.py +7 -6
  26. jarvis/jarvis_agent/prompt_manager.py +113 -8
  27. jarvis/jarvis_agent/prompts.py +317 -85
  28. jarvis/jarvis_agent/protocols.py +5 -2
  29. jarvis/jarvis_agent/run_loop.py +192 -32
  30. jarvis/jarvis_agent/session_manager.py +7 -3
  31. jarvis/jarvis_agent/share_manager.py +23 -13
  32. jarvis/jarvis_agent/shell_input_handler.py +12 -8
  33. jarvis/jarvis_agent/stdio_redirect.py +25 -26
  34. jarvis/jarvis_agent/task_analyzer.py +29 -23
  35. jarvis/jarvis_agent/task_list.py +869 -0
  36. jarvis/jarvis_agent/task_manager.py +26 -23
  37. jarvis/jarvis_agent/tool_executor.py +6 -5
  38. jarvis/jarvis_agent/tool_share_manager.py +24 -14
  39. jarvis/jarvis_agent/user_interaction.py +3 -3
  40. jarvis/jarvis_agent/utils.py +9 -1
  41. jarvis/jarvis_agent/web_bridge.py +37 -17
  42. jarvis/jarvis_agent/web_output_sink.py +5 -2
  43. jarvis/jarvis_agent/web_server.py +165 -36
  44. jarvis/jarvis_c2rust/__init__.py +1 -1
  45. jarvis/jarvis_c2rust/cli.py +260 -141
  46. jarvis/jarvis_c2rust/collector.py +37 -18
  47. jarvis/jarvis_c2rust/constants.py +60 -0
  48. jarvis/jarvis_c2rust/library_replacer.py +242 -1010
  49. jarvis/jarvis_c2rust/library_replacer_checkpoint.py +133 -0
  50. jarvis/jarvis_c2rust/library_replacer_llm.py +287 -0
  51. jarvis/jarvis_c2rust/library_replacer_loader.py +191 -0
  52. jarvis/jarvis_c2rust/library_replacer_output.py +134 -0
  53. jarvis/jarvis_c2rust/library_replacer_prompts.py +124 -0
  54. jarvis/jarvis_c2rust/library_replacer_utils.py +188 -0
  55. jarvis/jarvis_c2rust/llm_module_agent.py +98 -1044
  56. jarvis/jarvis_c2rust/llm_module_agent_apply.py +170 -0
  57. jarvis/jarvis_c2rust/llm_module_agent_executor.py +288 -0
  58. jarvis/jarvis_c2rust/llm_module_agent_loader.py +170 -0
  59. jarvis/jarvis_c2rust/llm_module_agent_prompts.py +268 -0
  60. jarvis/jarvis_c2rust/llm_module_agent_types.py +57 -0
  61. jarvis/jarvis_c2rust/llm_module_agent_utils.py +150 -0
  62. jarvis/jarvis_c2rust/llm_module_agent_validator.py +119 -0
  63. jarvis/jarvis_c2rust/loaders.py +28 -10
  64. jarvis/jarvis_c2rust/models.py +5 -2
  65. jarvis/jarvis_c2rust/optimizer.py +192 -1974
  66. jarvis/jarvis_c2rust/optimizer_build_fix.py +286 -0
  67. jarvis/jarvis_c2rust/optimizer_clippy.py +766 -0
  68. jarvis/jarvis_c2rust/optimizer_config.py +49 -0
  69. jarvis/jarvis_c2rust/optimizer_docs.py +183 -0
  70. jarvis/jarvis_c2rust/optimizer_options.py +48 -0
  71. jarvis/jarvis_c2rust/optimizer_progress.py +469 -0
  72. jarvis/jarvis_c2rust/optimizer_report.py +52 -0
  73. jarvis/jarvis_c2rust/optimizer_unsafe.py +309 -0
  74. jarvis/jarvis_c2rust/optimizer_utils.py +469 -0
  75. jarvis/jarvis_c2rust/optimizer_visibility.py +185 -0
  76. jarvis/jarvis_c2rust/scanner.py +229 -166
  77. jarvis/jarvis_c2rust/transpiler.py +531 -2732
  78. jarvis/jarvis_c2rust/transpiler_agents.py +503 -0
  79. jarvis/jarvis_c2rust/transpiler_build.py +1294 -0
  80. jarvis/jarvis_c2rust/transpiler_codegen.py +204 -0
  81. jarvis/jarvis_c2rust/transpiler_compile.py +146 -0
  82. jarvis/jarvis_c2rust/transpiler_config.py +178 -0
  83. jarvis/jarvis_c2rust/transpiler_context.py +122 -0
  84. jarvis/jarvis_c2rust/transpiler_executor.py +516 -0
  85. jarvis/jarvis_c2rust/transpiler_generation.py +278 -0
  86. jarvis/jarvis_c2rust/transpiler_git.py +163 -0
  87. jarvis/jarvis_c2rust/transpiler_mod_utils.py +225 -0
  88. jarvis/jarvis_c2rust/transpiler_modules.py +336 -0
  89. jarvis/jarvis_c2rust/transpiler_planning.py +394 -0
  90. jarvis/jarvis_c2rust/transpiler_review.py +1196 -0
  91. jarvis/jarvis_c2rust/transpiler_symbols.py +176 -0
  92. jarvis/jarvis_c2rust/utils.py +269 -79
  93. jarvis/jarvis_code_agent/after_change.py +233 -0
  94. jarvis/jarvis_code_agent/build_validation_config.py +37 -30
  95. jarvis/jarvis_code_agent/builtin_rules.py +68 -0
  96. jarvis/jarvis_code_agent/code_agent.py +976 -1517
  97. jarvis/jarvis_code_agent/code_agent_build.py +227 -0
  98. jarvis/jarvis_code_agent/code_agent_diff.py +246 -0
  99. jarvis/jarvis_code_agent/code_agent_git.py +525 -0
  100. jarvis/jarvis_code_agent/code_agent_impact.py +177 -0
  101. jarvis/jarvis_code_agent/code_agent_lint.py +283 -0
  102. jarvis/jarvis_code_agent/code_agent_llm.py +159 -0
  103. jarvis/jarvis_code_agent/code_agent_postprocess.py +105 -0
  104. jarvis/jarvis_code_agent/code_agent_prompts.py +46 -0
  105. jarvis/jarvis_code_agent/code_agent_rules.py +305 -0
  106. jarvis/jarvis_code_agent/code_analyzer/__init__.py +52 -48
  107. jarvis/jarvis_code_agent/code_analyzer/base_language.py +12 -10
  108. jarvis/jarvis_code_agent/code_analyzer/build_validator/__init__.py +12 -11
  109. jarvis/jarvis_code_agent/code_analyzer/build_validator/base.py +16 -12
  110. jarvis/jarvis_code_agent/code_analyzer/build_validator/cmake.py +26 -17
  111. jarvis/jarvis_code_agent/code_analyzer/build_validator/detector.py +558 -104
  112. jarvis/jarvis_code_agent/code_analyzer/build_validator/fallback.py +27 -16
  113. jarvis/jarvis_code_agent/code_analyzer/build_validator/go.py +22 -18
  114. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_gradle.py +21 -16
  115. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_maven.py +20 -16
  116. jarvis/jarvis_code_agent/code_analyzer/build_validator/makefile.py +27 -16
  117. jarvis/jarvis_code_agent/code_analyzer/build_validator/nodejs.py +47 -23
  118. jarvis/jarvis_code_agent/code_analyzer/build_validator/python.py +71 -37
  119. jarvis/jarvis_code_agent/code_analyzer/build_validator/rust.py +162 -35
  120. jarvis/jarvis_code_agent/code_analyzer/build_validator/validator.py +111 -57
  121. jarvis/jarvis_code_agent/code_analyzer/build_validator.py +18 -12
  122. jarvis/jarvis_code_agent/code_analyzer/context_manager.py +185 -183
  123. jarvis/jarvis_code_agent/code_analyzer/context_recommender.py +2 -1
  124. jarvis/jarvis_code_agent/code_analyzer/dependency_analyzer.py +24 -15
  125. jarvis/jarvis_code_agent/code_analyzer/file_ignore.py +227 -141
  126. jarvis/jarvis_code_agent/code_analyzer/impact_analyzer.py +321 -247
  127. jarvis/jarvis_code_agent/code_analyzer/language_registry.py +37 -29
  128. jarvis/jarvis_code_agent/code_analyzer/language_support.py +21 -13
  129. jarvis/jarvis_code_agent/code_analyzer/languages/__init__.py +15 -9
  130. jarvis/jarvis_code_agent/code_analyzer/languages/c_cpp_language.py +75 -45
  131. jarvis/jarvis_code_agent/code_analyzer/languages/go_language.py +87 -52
  132. jarvis/jarvis_code_agent/code_analyzer/languages/java_language.py +84 -51
  133. jarvis/jarvis_code_agent/code_analyzer/languages/javascript_language.py +94 -64
  134. jarvis/jarvis_code_agent/code_analyzer/languages/python_language.py +109 -71
  135. jarvis/jarvis_code_agent/code_analyzer/languages/rust_language.py +97 -63
  136. jarvis/jarvis_code_agent/code_analyzer/languages/typescript_language.py +103 -69
  137. jarvis/jarvis_code_agent/code_analyzer/llm_context_recommender.py +271 -268
  138. jarvis/jarvis_code_agent/code_analyzer/symbol_extractor.py +76 -64
  139. jarvis/jarvis_code_agent/code_analyzer/tree_sitter_extractor.py +92 -19
  140. jarvis/jarvis_code_agent/diff_visualizer.py +998 -0
  141. jarvis/jarvis_code_agent/lint.py +223 -524
  142. jarvis/jarvis_code_agent/rule_share_manager.py +158 -0
  143. jarvis/jarvis_code_agent/rules/clean_code.md +144 -0
  144. jarvis/jarvis_code_agent/rules/code_review.md +115 -0
  145. jarvis/jarvis_code_agent/rules/documentation.md +165 -0
  146. jarvis/jarvis_code_agent/rules/generate_rules.md +52 -0
  147. jarvis/jarvis_code_agent/rules/performance.md +158 -0
  148. jarvis/jarvis_code_agent/rules/refactoring.md +139 -0
  149. jarvis/jarvis_code_agent/rules/security.md +160 -0
  150. jarvis/jarvis_code_agent/rules/tdd.md +78 -0
  151. jarvis/jarvis_code_agent/test_rules/cpp_test.md +118 -0
  152. jarvis/jarvis_code_agent/test_rules/go_test.md +98 -0
  153. jarvis/jarvis_code_agent/test_rules/java_test.md +99 -0
  154. jarvis/jarvis_code_agent/test_rules/javascript_test.md +113 -0
  155. jarvis/jarvis_code_agent/test_rules/php_test.md +117 -0
  156. jarvis/jarvis_code_agent/test_rules/python_test.md +91 -0
  157. jarvis/jarvis_code_agent/test_rules/ruby_test.md +102 -0
  158. jarvis/jarvis_code_agent/test_rules/rust_test.md +86 -0
  159. jarvis/jarvis_code_agent/utils.py +36 -26
  160. jarvis/jarvis_code_analysis/checklists/loader.py +21 -21
  161. jarvis/jarvis_code_analysis/code_review.py +64 -33
  162. jarvis/jarvis_data/config_schema.json +285 -192
  163. jarvis/jarvis_git_squash/main.py +8 -6
  164. jarvis/jarvis_git_utils/git_commiter.py +53 -76
  165. jarvis/jarvis_mcp/__init__.py +5 -2
  166. jarvis/jarvis_mcp/sse_mcp_client.py +40 -30
  167. jarvis/jarvis_mcp/stdio_mcp_client.py +27 -19
  168. jarvis/jarvis_mcp/streamable_mcp_client.py +35 -26
  169. jarvis/jarvis_memory_organizer/memory_organizer.py +78 -55
  170. jarvis/jarvis_methodology/main.py +48 -39
  171. jarvis/jarvis_multi_agent/__init__.py +56 -23
  172. jarvis/jarvis_multi_agent/main.py +15 -18
  173. jarvis/jarvis_platform/base.py +179 -111
  174. jarvis/jarvis_platform/human.py +27 -16
  175. jarvis/jarvis_platform/kimi.py +52 -45
  176. jarvis/jarvis_platform/openai.py +101 -40
  177. jarvis/jarvis_platform/registry.py +51 -33
  178. jarvis/jarvis_platform/tongyi.py +68 -38
  179. jarvis/jarvis_platform/yuanbao.py +59 -43
  180. jarvis/jarvis_platform_manager/main.py +68 -76
  181. jarvis/jarvis_platform_manager/service.py +24 -14
  182. jarvis/jarvis_rag/README_CONFIG.md +314 -0
  183. jarvis/jarvis_rag/README_DYNAMIC_LOADING.md +311 -0
  184. jarvis/jarvis_rag/README_ONLINE_MODELS.md +230 -0
  185. jarvis/jarvis_rag/__init__.py +57 -4
  186. jarvis/jarvis_rag/cache.py +3 -1
  187. jarvis/jarvis_rag/cli.py +48 -68
  188. jarvis/jarvis_rag/embedding_interface.py +39 -0
  189. jarvis/jarvis_rag/embedding_manager.py +7 -230
  190. jarvis/jarvis_rag/embeddings/__init__.py +41 -0
  191. jarvis/jarvis_rag/embeddings/base.py +114 -0
  192. jarvis/jarvis_rag/embeddings/cohere.py +66 -0
  193. jarvis/jarvis_rag/embeddings/edgefn.py +117 -0
  194. jarvis/jarvis_rag/embeddings/local.py +260 -0
  195. jarvis/jarvis_rag/embeddings/openai.py +62 -0
  196. jarvis/jarvis_rag/embeddings/registry.py +293 -0
  197. jarvis/jarvis_rag/llm_interface.py +8 -6
  198. jarvis/jarvis_rag/query_rewriter.py +8 -9
  199. jarvis/jarvis_rag/rag_pipeline.py +61 -52
  200. jarvis/jarvis_rag/reranker.py +7 -75
  201. jarvis/jarvis_rag/reranker_interface.py +32 -0
  202. jarvis/jarvis_rag/rerankers/__init__.py +41 -0
  203. jarvis/jarvis_rag/rerankers/base.py +109 -0
  204. jarvis/jarvis_rag/rerankers/cohere.py +67 -0
  205. jarvis/jarvis_rag/rerankers/edgefn.py +140 -0
  206. jarvis/jarvis_rag/rerankers/jina.py +79 -0
  207. jarvis/jarvis_rag/rerankers/local.py +89 -0
  208. jarvis/jarvis_rag/rerankers/registry.py +293 -0
  209. jarvis/jarvis_rag/retriever.py +58 -43
  210. jarvis/jarvis_sec/__init__.py +66 -141
  211. jarvis/jarvis_sec/agents.py +21 -17
  212. jarvis/jarvis_sec/analysis.py +80 -33
  213. jarvis/jarvis_sec/checkers/__init__.py +7 -13
  214. jarvis/jarvis_sec/checkers/c_checker.py +356 -164
  215. jarvis/jarvis_sec/checkers/rust_checker.py +47 -29
  216. jarvis/jarvis_sec/cli.py +43 -21
  217. jarvis/jarvis_sec/clustering.py +430 -272
  218. jarvis/jarvis_sec/file_manager.py +99 -55
  219. jarvis/jarvis_sec/parsers.py +9 -6
  220. jarvis/jarvis_sec/prompts.py +4 -3
  221. jarvis/jarvis_sec/report.py +44 -22
  222. jarvis/jarvis_sec/review.py +180 -107
  223. jarvis/jarvis_sec/status.py +50 -41
  224. jarvis/jarvis_sec/types.py +3 -0
  225. jarvis/jarvis_sec/utils.py +160 -83
  226. jarvis/jarvis_sec/verification.py +411 -181
  227. jarvis/jarvis_sec/workflow.py +132 -21
  228. jarvis/jarvis_smart_shell/main.py +28 -41
  229. jarvis/jarvis_stats/cli.py +14 -12
  230. jarvis/jarvis_stats/stats.py +28 -19
  231. jarvis/jarvis_stats/storage.py +14 -8
  232. jarvis/jarvis_stats/visualizer.py +12 -7
  233. jarvis/jarvis_tools/base.py +5 -2
  234. jarvis/jarvis_tools/clear_memory.py +13 -9
  235. jarvis/jarvis_tools/cli/main.py +23 -18
  236. jarvis/jarvis_tools/edit_file.py +572 -873
  237. jarvis/jarvis_tools/execute_script.py +10 -7
  238. jarvis/jarvis_tools/file_analyzer.py +7 -8
  239. jarvis/jarvis_tools/meta_agent.py +287 -0
  240. jarvis/jarvis_tools/methodology.py +5 -3
  241. jarvis/jarvis_tools/read_code.py +305 -1438
  242. jarvis/jarvis_tools/read_symbols.py +50 -17
  243. jarvis/jarvis_tools/read_webpage.py +19 -18
  244. jarvis/jarvis_tools/registry.py +435 -156
  245. jarvis/jarvis_tools/retrieve_memory.py +16 -11
  246. jarvis/jarvis_tools/save_memory.py +8 -6
  247. jarvis/jarvis_tools/search_web.py +31 -31
  248. jarvis/jarvis_tools/sub_agent.py +32 -28
  249. jarvis/jarvis_tools/sub_code_agent.py +44 -60
  250. jarvis/jarvis_tools/task_list_manager.py +1811 -0
  251. jarvis/jarvis_tools/virtual_tty.py +29 -19
  252. jarvis/jarvis_utils/__init__.py +4 -0
  253. jarvis/jarvis_utils/builtin_replace_map.py +2 -1
  254. jarvis/jarvis_utils/clipboard.py +9 -8
  255. jarvis/jarvis_utils/collections.py +331 -0
  256. jarvis/jarvis_utils/config.py +699 -194
  257. jarvis/jarvis_utils/dialogue_recorder.py +294 -0
  258. jarvis/jarvis_utils/embedding.py +6 -3
  259. jarvis/jarvis_utils/file_processors.py +7 -1
  260. jarvis/jarvis_utils/fzf.py +9 -3
  261. jarvis/jarvis_utils/git_utils.py +71 -42
  262. jarvis/jarvis_utils/globals.py +116 -32
  263. jarvis/jarvis_utils/http.py +6 -2
  264. jarvis/jarvis_utils/input.py +318 -83
  265. jarvis/jarvis_utils/jsonnet_compat.py +119 -104
  266. jarvis/jarvis_utils/methodology.py +37 -28
  267. jarvis/jarvis_utils/output.py +201 -44
  268. jarvis/jarvis_utils/utils.py +986 -628
  269. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/METADATA +49 -33
  270. jarvis_ai_assistant-1.0.2.dist-info/RECORD +304 -0
  271. jarvis/jarvis_code_agent/code_analyzer/structured_code.py +0 -556
  272. jarvis/jarvis_tools/generate_new_tool.py +0 -205
  273. jarvis/jarvis_tools/lsp_client.py +0 -1552
  274. jarvis/jarvis_tools/rewrite_file.py +0 -105
  275. jarvis_ai_assistant-0.7.16.dist-info/RECORD +0 -218
  276. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/WHEEL +0 -0
  277. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/entry_points.txt +0 -0
  278. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/licenses/LICENSE +0 -0
  279. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/top_level.txt +0 -0
@@ -1,12 +1,15 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """分析相关模块"""
3
3
 
4
- from typing import Dict, List, Optional
5
- import typer
4
+ from typing import Dict
5
+ from typing import List
6
+ from typing import Optional
7
+
8
+ from jarvis.jarvis_utils.output import PrettyOutput
6
9
 
7
10
  from jarvis.jarvis_agent import Agent
8
- from jarvis.jarvis_sec.prompts import build_summary_prompt
9
11
  from jarvis.jarvis_sec.parsers import try_parse_summary_report
12
+ from jarvis.jarvis_sec.prompts import build_summary_prompt
10
13
  from jarvis.jarvis_sec.utils import git_restore_if_dirty
11
14
 
12
15
 
@@ -49,9 +52,12 @@ def valid_items(items: Optional[List]) -> bool:
49
52
  return True
50
53
 
51
54
 
52
- def build_analysis_task_context(batch: List[Dict], entry_path: str, langs: List[str]) -> str:
55
+ def build_analysis_task_context(
56
+ batch: List[Dict], entry_path: str, langs: List[str]
57
+ ) -> str:
53
58
  """构建分析任务上下文"""
54
59
  import json as _json2
60
+
55
61
  batch_ctx: List[Dict] = list(batch)
56
62
  cluster_verify = str(batch_ctx[0].get("verify") if batch_ctx else "")
57
63
  cluster_gids_ctx = [it.get("gid") for it in batch_ctx]
@@ -76,7 +82,12 @@ def build_validation_error_guidance(
76
82
  ) -> str:
77
83
  """构建验证错误指导信息"""
78
84
  if parse_error_analysis:
79
- return f"\n\n**格式错误详情(请根据以下错误修复输出格式):**\n- JSON解析失败: {parse_error_analysis}\n\n请确保输出的JSON格式正确,包括正确的引号、逗号、大括号等。仅输出一个 <REPORT> 块,块内直接包含 JSON 数组(不需要额外的标签)。支持jsonnet语法(如尾随逗号、注释、||| 或 ``` 分隔符多行字符串等)。"
85
+ return f"""
86
+
87
+ **格式错误详情(请根据以下错误修复输出格式):**
88
+ - JSON解析失败: {parse_error_analysis}
89
+
90
+ 请确保输出的JSON格式正确,包括正确的引号、逗号、大括号等。仅输出一个 <REPORT> 块,块内直接包含 JSON 数组(不需要额外的标签)。支持jsonnet语法(如尾随逗号、注释、||| 或 ``` 分隔符多行字符串等)。"""
80
91
  elif prev_parsed_items is None:
81
92
  return "\n\n**格式错误详情(请根据以下错误修复输出格式):**\n- 无法从摘要中解析出有效的 JSON 数组"
82
93
  elif not valid_items(prev_parsed_items):
@@ -102,29 +113,47 @@ def build_validation_error_guidance(
102
113
  validation_errors.append(f"元素{idx}的 gid 必须 >= 1")
103
114
  break
104
115
  except Exception:
105
- validation_errors.append(f"元素{idx}的 gid 格式错误(必须是整数)")
116
+ validation_errors.append(
117
+ f"元素{idx}的 gid 格式错误(必须是整数)"
118
+ )
106
119
  break
107
120
  elif has_gids:
108
- if not isinstance(it.get("gids"), list) or len(it.get("gids", [])) == 0:
121
+ if (
122
+ not isinstance(it.get("gids"), list)
123
+ or len(it.get("gids", [])) == 0
124
+ ):
109
125
  validation_errors.append(f"元素{idx}的 gids 必须是非空数组")
110
126
  break
111
127
  try:
112
128
  for gid_idx, gid_val in enumerate(it.get("gids", [])):
113
129
  if int(gid_val) < 1:
114
- validation_errors.append(f"元素{idx}的 gids[{gid_idx}] 必须 >= 1")
130
+ validation_errors.append(
131
+ f"元素{idx}的 gids[{gid_idx}] 必须 >= 1"
132
+ )
115
133
  break
116
134
  if validation_errors:
117
135
  break
118
136
  except Exception:
119
- validation_errors.append(f"元素{idx}的 gids 格式错误(必须是整数数组)")
137
+ validation_errors.append(
138
+ f"元素{idx}的 gids 格式错误(必须是整数数组)"
139
+ )
120
140
  break
121
141
  if "has_risk" not in it or not isinstance(it.get("has_risk"), bool):
122
- validation_errors.append(f"元素{idx}缺少必填字段 has_risk(必须是布尔值)")
142
+ validation_errors.append(
143
+ f"元素{idx}缺少必填字段 has_risk(必须是布尔值)"
144
+ )
123
145
  break
124
146
  if it.get("has_risk"):
125
- for key in ["preconditions", "trigger_path", "consequences", "suggestions"]:
147
+ for key in [
148
+ "preconditions",
149
+ "trigger_path",
150
+ "consequences",
151
+ "suggestions",
152
+ ]:
126
153
  if key not in it:
127
- validation_errors.append(f"元素{idx}的 has_risk 为 true,但缺少必填字段 {key}")
154
+ validation_errors.append(
155
+ f"元素{idx}的 has_risk 为 true,但缺少必填字段 {key}"
156
+ )
128
157
  break
129
158
  if not isinstance(it[key], str) or not it[key].strip():
130
159
  validation_errors.append(f"元素{idx}的 {key} 字段不能为空")
@@ -132,7 +161,9 @@ def build_validation_error_guidance(
132
161
  if validation_errors:
133
162
  break
134
163
  if validation_errors:
135
- return "\n\n**格式错误详情(请根据以下错误修复输出格式):**\n" + "\n".join(f"- {err}" for err in validation_errors)
164
+ return "\n\n**格式错误详情(请根据以下错误修复输出格式):**\n" + "\n".join(
165
+ f"- {err}" for err in validation_errors
166
+ )
136
167
  return ""
137
168
 
138
169
 
@@ -152,21 +183,25 @@ def run_analysis_agent_with_retry(
152
183
  prev_parsed_items: Optional[List] = None
153
184
  parse_error_analysis: Optional[str] = None
154
185
  attempt = 0
155
-
186
+
156
187
  while True:
157
188
  attempt += 1
158
189
  summary_container["text"] = ""
159
-
190
+
160
191
  if use_direct_model_analysis:
161
192
  summary_prompt_text = build_summary_prompt()
162
- error_guidance = build_validation_error_guidance(parse_error_analysis, prev_parsed_items)
193
+ error_guidance = build_validation_error_guidance(
194
+ parse_error_analysis, prev_parsed_items
195
+ )
163
196
  full_prompt = f"{per_task}{error_guidance}\n\n{summary_prompt_text}"
164
197
  try:
165
- response = agent.model.chat_until_success(full_prompt) # type: ignore
198
+ response = agent.model.chat_until_success(full_prompt)
166
199
  summary_container["text"] = response
167
200
  except Exception as e:
168
201
  try:
169
- typer.secho(f"[jarvis-sec] 直接模型调用失败: {e},回退到 run()", fg=typer.colors.YELLOW)
202
+ PrettyOutput.auto_print(
203
+ f"⚠️ [jarvis-sec] 直接模型调用失败: {e},回退到 run()"
204
+ )
170
205
  except Exception:
171
206
  pass
172
207
  agent.run(per_task)
@@ -181,15 +216,19 @@ def run_analysis_agent_with_retry(
181
216
  "changed_files_count": int(_changed or 0),
182
217
  "action": "git checkout -- .",
183
218
  }
184
- meta_records.append({
185
- "task_id": task_id,
186
- "batch_index": bidx,
187
- "workspace_restore": workspace_restore_info,
188
- "attempt": attempt + 1,
189
- })
219
+ meta_records.append(
220
+ {
221
+ "task_id": task_id,
222
+ "batch_index": bidx,
223
+ "workspace_restore": workspace_restore_info,
224
+ "attempt": attempt + 1,
225
+ }
226
+ )
190
227
  if _changed:
191
228
  try:
192
- typer.secho(f"[jarvis-sec] 工作区已恢复 ({_changed} 个文件),操作: git checkout -- .", fg=typer.colors.BLUE)
229
+ PrettyOutput.auto_print(
230
+ f"🔵 [jarvis-sec] 工作区已恢复 ({_changed} 个文件),操作: git checkout -- ."
231
+ )
193
232
  except Exception:
194
233
  pass
195
234
  except Exception:
@@ -203,7 +242,9 @@ def run_analysis_agent_with_retry(
203
242
  rep, parse_error_analysis = try_parse_summary_report(summary_text)
204
243
  if parse_error_analysis:
205
244
  try:
206
- typer.secho(f"[jarvis-sec] 分析结果JSON解析失败: {parse_error_analysis}", fg=typer.colors.YELLOW)
245
+ PrettyOutput.auto_print(
246
+ f"⚠️ [jarvis-sec] 分析结果JSON解析失败: {parse_error_analysis}"
247
+ )
207
248
  except Exception:
208
249
  pass
209
250
  elif isinstance(rep, list):
@@ -224,30 +265,36 @@ def run_analysis_agent_with_retry(
224
265
  # 非空数组需要验证格式
225
266
  summary_items = parsed_items
226
267
  break
227
-
268
+
228
269
  # 格式校验失败,后续重试使用直接模型调用
229
270
  use_direct_model_analysis = True
230
271
  prev_parsed_items = parsed_items
231
272
  if parse_error_analysis:
232
273
  try:
233
- typer.secho(f"[jarvis-sec] 分析结果JSON解析失败 -> 重试第 {attempt} 次 (批次={bidx},使用直接模型调用,将反馈解析错误)", fg=typer.colors.YELLOW)
274
+ PrettyOutput.auto_print(
275
+ f"⚠️ [jarvis-sec] 分析结果JSON解析失败 -> 重试第 {attempt} 次 (批次={bidx},使用直接模型调用,将反馈解析错误)"
276
+ )
234
277
  except Exception:
235
278
  pass
236
279
  else:
237
280
  try:
238
- typer.secho(f"[jarvis-sec] 分析结果格式无效 -> 重试第 {attempt} 次 (批次={bidx},使用直接模型调用)", fg=typer.colors.YELLOW)
281
+ PrettyOutput.auto_print(
282
+ f"⚠️ [jarvis-sec] 分析结果格式无效 -> 重试第 {attempt} 次 (批次={bidx},使用直接模型调用)"
283
+ )
239
284
  except Exception:
240
285
  pass
241
-
286
+
242
287
  return summary_items, workspace_restore_info
243
288
 
244
289
 
245
- def expand_and_filter_analysis_results(summary_items: List[Dict]) -> tuple[List[Dict], List[Dict]]:
290
+ def expand_and_filter_analysis_results(
291
+ summary_items: List[Dict],
292
+ ) -> tuple[List[Dict], List[Dict]]:
246
293
  """展开gids格式为单个gid格式,并过滤出有风险的项目"""
247
294
  items_with_risk: List[Dict] = []
248
295
  items_without_risk: List[Dict] = []
249
296
  merged_items: List[Dict] = []
250
-
297
+
251
298
  for it in summary_items:
252
299
  has_risk = it.get("has_risk") is True
253
300
  if "gids" in it and isinstance(it.get("gids"), list):
@@ -272,5 +319,5 @@ def expand_and_filter_analysis_results(summary_items: List[Dict]) -> tuple[List[
272
319
  items_with_risk.append(it)
273
320
  else:
274
321
  items_without_risk.append(it)
275
-
322
+
276
323
  return items_with_risk, items_without_risk
@@ -7,18 +7,12 @@ Jarvis 安全演进多Agent套件 —— Checkers 包初始化
7
7
  - 保持最小依赖,不在此处执行任何扫描逻辑,仅做导入与别名暴露。
8
8
  """
9
9
 
10
-
11
-
12
- from .c_checker import (
13
- analyze_files as analyze_c_files,
14
- analyze_c_cpp_file,
15
- analyze_c_cpp_text,
16
- )
17
- from .rust_checker import (
18
- analyze_rust_files,
19
- analyze_rust_file,
20
- analyze_rust_text,
21
- )
10
+ from .c_checker import analyze_c_cpp_file
11
+ from .c_checker import analyze_c_cpp_text
12
+ from .c_checker import analyze_files as analyze_c_files
13
+ from .rust_checker import analyze_rust_file
14
+ from .rust_checker import analyze_rust_files
15
+ from .rust_checker import analyze_rust_text
22
16
 
23
17
  __all__ = [
24
18
  # C/C++
@@ -29,4 +23,4 @@ __all__ = [
29
23
  "analyze_rust_files",
30
24
  "analyze_rust_file",
31
25
  "analyze_rust_text",
32
- ]
26
+ ]