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.
- jarvis/__init__.py +1 -1
- jarvis/jarvis_agent/__init__.py +567 -222
- jarvis/jarvis_agent/agent_manager.py +19 -12
- jarvis/jarvis_agent/builtin_input_handler.py +79 -11
- jarvis/jarvis_agent/config_editor.py +7 -2
- jarvis/jarvis_agent/event_bus.py +24 -13
- jarvis/jarvis_agent/events.py +19 -1
- jarvis/jarvis_agent/file_context_handler.py +67 -64
- jarvis/jarvis_agent/file_methodology_manager.py +38 -24
- jarvis/jarvis_agent/jarvis.py +186 -114
- jarvis/jarvis_agent/language_extractors/__init__.py +8 -1
- jarvis/jarvis_agent/language_extractors/c_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/cpp_extractor.py +9 -4
- jarvis/jarvis_agent/language_extractors/go_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/java_extractor.py +27 -20
- jarvis/jarvis_agent/language_extractors/javascript_extractor.py +22 -17
- jarvis/jarvis_agent/language_extractors/python_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/rust_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/typescript_extractor.py +22 -17
- jarvis/jarvis_agent/language_support_info.py +250 -219
- jarvis/jarvis_agent/main.py +19 -23
- jarvis/jarvis_agent/memory_manager.py +9 -6
- jarvis/jarvis_agent/methodology_share_manager.py +21 -15
- jarvis/jarvis_agent/output_handler.py +4 -2
- jarvis/jarvis_agent/prompt_builder.py +7 -6
- jarvis/jarvis_agent/prompt_manager.py +113 -8
- jarvis/jarvis_agent/prompts.py +317 -85
- jarvis/jarvis_agent/protocols.py +5 -2
- jarvis/jarvis_agent/run_loop.py +192 -32
- jarvis/jarvis_agent/session_manager.py +7 -3
- jarvis/jarvis_agent/share_manager.py +23 -13
- jarvis/jarvis_agent/shell_input_handler.py +12 -8
- jarvis/jarvis_agent/stdio_redirect.py +25 -26
- jarvis/jarvis_agent/task_analyzer.py +29 -23
- jarvis/jarvis_agent/task_list.py +869 -0
- jarvis/jarvis_agent/task_manager.py +26 -23
- jarvis/jarvis_agent/tool_executor.py +6 -5
- jarvis/jarvis_agent/tool_share_manager.py +24 -14
- jarvis/jarvis_agent/user_interaction.py +3 -3
- jarvis/jarvis_agent/utils.py +9 -1
- jarvis/jarvis_agent/web_bridge.py +37 -17
- jarvis/jarvis_agent/web_output_sink.py +5 -2
- jarvis/jarvis_agent/web_server.py +165 -36
- jarvis/jarvis_c2rust/__init__.py +1 -1
- jarvis/jarvis_c2rust/cli.py +260 -141
- jarvis/jarvis_c2rust/collector.py +37 -18
- jarvis/jarvis_c2rust/constants.py +60 -0
- jarvis/jarvis_c2rust/library_replacer.py +242 -1010
- jarvis/jarvis_c2rust/library_replacer_checkpoint.py +133 -0
- jarvis/jarvis_c2rust/library_replacer_llm.py +287 -0
- jarvis/jarvis_c2rust/library_replacer_loader.py +191 -0
- jarvis/jarvis_c2rust/library_replacer_output.py +134 -0
- jarvis/jarvis_c2rust/library_replacer_prompts.py +124 -0
- jarvis/jarvis_c2rust/library_replacer_utils.py +188 -0
- jarvis/jarvis_c2rust/llm_module_agent.py +98 -1044
- jarvis/jarvis_c2rust/llm_module_agent_apply.py +170 -0
- jarvis/jarvis_c2rust/llm_module_agent_executor.py +288 -0
- jarvis/jarvis_c2rust/llm_module_agent_loader.py +170 -0
- jarvis/jarvis_c2rust/llm_module_agent_prompts.py +268 -0
- jarvis/jarvis_c2rust/llm_module_agent_types.py +57 -0
- jarvis/jarvis_c2rust/llm_module_agent_utils.py +150 -0
- jarvis/jarvis_c2rust/llm_module_agent_validator.py +119 -0
- jarvis/jarvis_c2rust/loaders.py +28 -10
- jarvis/jarvis_c2rust/models.py +5 -2
- jarvis/jarvis_c2rust/optimizer.py +192 -1974
- jarvis/jarvis_c2rust/optimizer_build_fix.py +286 -0
- jarvis/jarvis_c2rust/optimizer_clippy.py +766 -0
- jarvis/jarvis_c2rust/optimizer_config.py +49 -0
- jarvis/jarvis_c2rust/optimizer_docs.py +183 -0
- jarvis/jarvis_c2rust/optimizer_options.py +48 -0
- jarvis/jarvis_c2rust/optimizer_progress.py +469 -0
- jarvis/jarvis_c2rust/optimizer_report.py +52 -0
- jarvis/jarvis_c2rust/optimizer_unsafe.py +309 -0
- jarvis/jarvis_c2rust/optimizer_utils.py +469 -0
- jarvis/jarvis_c2rust/optimizer_visibility.py +185 -0
- jarvis/jarvis_c2rust/scanner.py +229 -166
- jarvis/jarvis_c2rust/transpiler.py +531 -2732
- jarvis/jarvis_c2rust/transpiler_agents.py +503 -0
- jarvis/jarvis_c2rust/transpiler_build.py +1294 -0
- jarvis/jarvis_c2rust/transpiler_codegen.py +204 -0
- jarvis/jarvis_c2rust/transpiler_compile.py +146 -0
- jarvis/jarvis_c2rust/transpiler_config.py +178 -0
- jarvis/jarvis_c2rust/transpiler_context.py +122 -0
- jarvis/jarvis_c2rust/transpiler_executor.py +516 -0
- jarvis/jarvis_c2rust/transpiler_generation.py +278 -0
- jarvis/jarvis_c2rust/transpiler_git.py +163 -0
- jarvis/jarvis_c2rust/transpiler_mod_utils.py +225 -0
- jarvis/jarvis_c2rust/transpiler_modules.py +336 -0
- jarvis/jarvis_c2rust/transpiler_planning.py +394 -0
- jarvis/jarvis_c2rust/transpiler_review.py +1196 -0
- jarvis/jarvis_c2rust/transpiler_symbols.py +176 -0
- jarvis/jarvis_c2rust/utils.py +269 -79
- jarvis/jarvis_code_agent/after_change.py +233 -0
- jarvis/jarvis_code_agent/build_validation_config.py +37 -30
- jarvis/jarvis_code_agent/builtin_rules.py +68 -0
- jarvis/jarvis_code_agent/code_agent.py +976 -1517
- jarvis/jarvis_code_agent/code_agent_build.py +227 -0
- jarvis/jarvis_code_agent/code_agent_diff.py +246 -0
- jarvis/jarvis_code_agent/code_agent_git.py +525 -0
- jarvis/jarvis_code_agent/code_agent_impact.py +177 -0
- jarvis/jarvis_code_agent/code_agent_lint.py +283 -0
- jarvis/jarvis_code_agent/code_agent_llm.py +159 -0
- jarvis/jarvis_code_agent/code_agent_postprocess.py +105 -0
- jarvis/jarvis_code_agent/code_agent_prompts.py +46 -0
- jarvis/jarvis_code_agent/code_agent_rules.py +305 -0
- jarvis/jarvis_code_agent/code_analyzer/__init__.py +52 -48
- jarvis/jarvis_code_agent/code_analyzer/base_language.py +12 -10
- jarvis/jarvis_code_agent/code_analyzer/build_validator/__init__.py +12 -11
- jarvis/jarvis_code_agent/code_analyzer/build_validator/base.py +16 -12
- jarvis/jarvis_code_agent/code_analyzer/build_validator/cmake.py +26 -17
- jarvis/jarvis_code_agent/code_analyzer/build_validator/detector.py +558 -104
- jarvis/jarvis_code_agent/code_analyzer/build_validator/fallback.py +27 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/go.py +22 -18
- jarvis/jarvis_code_agent/code_analyzer/build_validator/java_gradle.py +21 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/java_maven.py +20 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/makefile.py +27 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/nodejs.py +47 -23
- jarvis/jarvis_code_agent/code_analyzer/build_validator/python.py +71 -37
- jarvis/jarvis_code_agent/code_analyzer/build_validator/rust.py +162 -35
- jarvis/jarvis_code_agent/code_analyzer/build_validator/validator.py +111 -57
- jarvis/jarvis_code_agent/code_analyzer/build_validator.py +18 -12
- jarvis/jarvis_code_agent/code_analyzer/context_manager.py +185 -183
- jarvis/jarvis_code_agent/code_analyzer/context_recommender.py +2 -1
- jarvis/jarvis_code_agent/code_analyzer/dependency_analyzer.py +24 -15
- jarvis/jarvis_code_agent/code_analyzer/file_ignore.py +227 -141
- jarvis/jarvis_code_agent/code_analyzer/impact_analyzer.py +321 -247
- jarvis/jarvis_code_agent/code_analyzer/language_registry.py +37 -29
- jarvis/jarvis_code_agent/code_analyzer/language_support.py +21 -13
- jarvis/jarvis_code_agent/code_analyzer/languages/__init__.py +15 -9
- jarvis/jarvis_code_agent/code_analyzer/languages/c_cpp_language.py +75 -45
- jarvis/jarvis_code_agent/code_analyzer/languages/go_language.py +87 -52
- jarvis/jarvis_code_agent/code_analyzer/languages/java_language.py +84 -51
- jarvis/jarvis_code_agent/code_analyzer/languages/javascript_language.py +94 -64
- jarvis/jarvis_code_agent/code_analyzer/languages/python_language.py +109 -71
- jarvis/jarvis_code_agent/code_analyzer/languages/rust_language.py +97 -63
- jarvis/jarvis_code_agent/code_analyzer/languages/typescript_language.py +103 -69
- jarvis/jarvis_code_agent/code_analyzer/llm_context_recommender.py +271 -268
- jarvis/jarvis_code_agent/code_analyzer/symbol_extractor.py +76 -64
- jarvis/jarvis_code_agent/code_analyzer/tree_sitter_extractor.py +92 -19
- jarvis/jarvis_code_agent/diff_visualizer.py +998 -0
- jarvis/jarvis_code_agent/lint.py +223 -524
- jarvis/jarvis_code_agent/rule_share_manager.py +158 -0
- jarvis/jarvis_code_agent/rules/clean_code.md +144 -0
- jarvis/jarvis_code_agent/rules/code_review.md +115 -0
- jarvis/jarvis_code_agent/rules/documentation.md +165 -0
- jarvis/jarvis_code_agent/rules/generate_rules.md +52 -0
- jarvis/jarvis_code_agent/rules/performance.md +158 -0
- jarvis/jarvis_code_agent/rules/refactoring.md +139 -0
- jarvis/jarvis_code_agent/rules/security.md +160 -0
- jarvis/jarvis_code_agent/rules/tdd.md +78 -0
- jarvis/jarvis_code_agent/test_rules/cpp_test.md +118 -0
- jarvis/jarvis_code_agent/test_rules/go_test.md +98 -0
- jarvis/jarvis_code_agent/test_rules/java_test.md +99 -0
- jarvis/jarvis_code_agent/test_rules/javascript_test.md +113 -0
- jarvis/jarvis_code_agent/test_rules/php_test.md +117 -0
- jarvis/jarvis_code_agent/test_rules/python_test.md +91 -0
- jarvis/jarvis_code_agent/test_rules/ruby_test.md +102 -0
- jarvis/jarvis_code_agent/test_rules/rust_test.md +86 -0
- jarvis/jarvis_code_agent/utils.py +36 -26
- jarvis/jarvis_code_analysis/checklists/loader.py +21 -21
- jarvis/jarvis_code_analysis/code_review.py +64 -33
- jarvis/jarvis_data/config_schema.json +285 -192
- jarvis/jarvis_git_squash/main.py +8 -6
- jarvis/jarvis_git_utils/git_commiter.py +53 -76
- jarvis/jarvis_mcp/__init__.py +5 -2
- jarvis/jarvis_mcp/sse_mcp_client.py +40 -30
- jarvis/jarvis_mcp/stdio_mcp_client.py +27 -19
- jarvis/jarvis_mcp/streamable_mcp_client.py +35 -26
- jarvis/jarvis_memory_organizer/memory_organizer.py +78 -55
- jarvis/jarvis_methodology/main.py +48 -39
- jarvis/jarvis_multi_agent/__init__.py +56 -23
- jarvis/jarvis_multi_agent/main.py +15 -18
- jarvis/jarvis_platform/base.py +179 -111
- jarvis/jarvis_platform/human.py +27 -16
- jarvis/jarvis_platform/kimi.py +52 -45
- jarvis/jarvis_platform/openai.py +101 -40
- jarvis/jarvis_platform/registry.py +51 -33
- jarvis/jarvis_platform/tongyi.py +68 -38
- jarvis/jarvis_platform/yuanbao.py +59 -43
- jarvis/jarvis_platform_manager/main.py +68 -76
- jarvis/jarvis_platform_manager/service.py +24 -14
- jarvis/jarvis_rag/README_CONFIG.md +314 -0
- jarvis/jarvis_rag/README_DYNAMIC_LOADING.md +311 -0
- jarvis/jarvis_rag/README_ONLINE_MODELS.md +230 -0
- jarvis/jarvis_rag/__init__.py +57 -4
- jarvis/jarvis_rag/cache.py +3 -1
- jarvis/jarvis_rag/cli.py +48 -68
- jarvis/jarvis_rag/embedding_interface.py +39 -0
- jarvis/jarvis_rag/embedding_manager.py +7 -230
- jarvis/jarvis_rag/embeddings/__init__.py +41 -0
- jarvis/jarvis_rag/embeddings/base.py +114 -0
- jarvis/jarvis_rag/embeddings/cohere.py +66 -0
- jarvis/jarvis_rag/embeddings/edgefn.py +117 -0
- jarvis/jarvis_rag/embeddings/local.py +260 -0
- jarvis/jarvis_rag/embeddings/openai.py +62 -0
- jarvis/jarvis_rag/embeddings/registry.py +293 -0
- jarvis/jarvis_rag/llm_interface.py +8 -6
- jarvis/jarvis_rag/query_rewriter.py +8 -9
- jarvis/jarvis_rag/rag_pipeline.py +61 -52
- jarvis/jarvis_rag/reranker.py +7 -75
- jarvis/jarvis_rag/reranker_interface.py +32 -0
- jarvis/jarvis_rag/rerankers/__init__.py +41 -0
- jarvis/jarvis_rag/rerankers/base.py +109 -0
- jarvis/jarvis_rag/rerankers/cohere.py +67 -0
- jarvis/jarvis_rag/rerankers/edgefn.py +140 -0
- jarvis/jarvis_rag/rerankers/jina.py +79 -0
- jarvis/jarvis_rag/rerankers/local.py +89 -0
- jarvis/jarvis_rag/rerankers/registry.py +293 -0
- jarvis/jarvis_rag/retriever.py +58 -43
- jarvis/jarvis_sec/__init__.py +66 -141
- jarvis/jarvis_sec/agents.py +21 -17
- jarvis/jarvis_sec/analysis.py +80 -33
- jarvis/jarvis_sec/checkers/__init__.py +7 -13
- jarvis/jarvis_sec/checkers/c_checker.py +356 -164
- jarvis/jarvis_sec/checkers/rust_checker.py +47 -29
- jarvis/jarvis_sec/cli.py +43 -21
- jarvis/jarvis_sec/clustering.py +430 -272
- jarvis/jarvis_sec/file_manager.py +99 -55
- jarvis/jarvis_sec/parsers.py +9 -6
- jarvis/jarvis_sec/prompts.py +4 -3
- jarvis/jarvis_sec/report.py +44 -22
- jarvis/jarvis_sec/review.py +180 -107
- jarvis/jarvis_sec/status.py +50 -41
- jarvis/jarvis_sec/types.py +3 -0
- jarvis/jarvis_sec/utils.py +160 -83
- jarvis/jarvis_sec/verification.py +411 -181
- jarvis/jarvis_sec/workflow.py +132 -21
- jarvis/jarvis_smart_shell/main.py +28 -41
- jarvis/jarvis_stats/cli.py +14 -12
- jarvis/jarvis_stats/stats.py +28 -19
- jarvis/jarvis_stats/storage.py +14 -8
- jarvis/jarvis_stats/visualizer.py +12 -7
- jarvis/jarvis_tools/base.py +5 -2
- jarvis/jarvis_tools/clear_memory.py +13 -9
- jarvis/jarvis_tools/cli/main.py +23 -18
- jarvis/jarvis_tools/edit_file.py +572 -873
- jarvis/jarvis_tools/execute_script.py +10 -7
- jarvis/jarvis_tools/file_analyzer.py +7 -8
- jarvis/jarvis_tools/meta_agent.py +287 -0
- jarvis/jarvis_tools/methodology.py +5 -3
- jarvis/jarvis_tools/read_code.py +305 -1438
- jarvis/jarvis_tools/read_symbols.py +50 -17
- jarvis/jarvis_tools/read_webpage.py +19 -18
- jarvis/jarvis_tools/registry.py +435 -156
- jarvis/jarvis_tools/retrieve_memory.py +16 -11
- jarvis/jarvis_tools/save_memory.py +8 -6
- jarvis/jarvis_tools/search_web.py +31 -31
- jarvis/jarvis_tools/sub_agent.py +32 -28
- jarvis/jarvis_tools/sub_code_agent.py +44 -60
- jarvis/jarvis_tools/task_list_manager.py +1811 -0
- jarvis/jarvis_tools/virtual_tty.py +29 -19
- jarvis/jarvis_utils/__init__.py +4 -0
- jarvis/jarvis_utils/builtin_replace_map.py +2 -1
- jarvis/jarvis_utils/clipboard.py +9 -8
- jarvis/jarvis_utils/collections.py +331 -0
- jarvis/jarvis_utils/config.py +699 -194
- jarvis/jarvis_utils/dialogue_recorder.py +294 -0
- jarvis/jarvis_utils/embedding.py +6 -3
- jarvis/jarvis_utils/file_processors.py +7 -1
- jarvis/jarvis_utils/fzf.py +9 -3
- jarvis/jarvis_utils/git_utils.py +71 -42
- jarvis/jarvis_utils/globals.py +116 -32
- jarvis/jarvis_utils/http.py +6 -2
- jarvis/jarvis_utils/input.py +318 -83
- jarvis/jarvis_utils/jsonnet_compat.py +119 -104
- jarvis/jarvis_utils/methodology.py +37 -28
- jarvis/jarvis_utils/output.py +201 -44
- jarvis/jarvis_utils/utils.py +986 -628
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/METADATA +49 -33
- jarvis_ai_assistant-1.0.2.dist-info/RECORD +304 -0
- jarvis/jarvis_code_agent/code_analyzer/structured_code.py +0 -556
- jarvis/jarvis_tools/generate_new_tool.py +0 -205
- jarvis/jarvis_tools/lsp_client.py +0 -1552
- jarvis/jarvis_tools/rewrite_file.py +0 -105
- jarvis_ai_assistant-0.7.16.dist-info/RECORD +0 -218
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/licenses/LICENSE +0 -0
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""优化器配置管理模块。"""
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def load_additional_notes(crate_dir: Path) -> str:
|
|
9
|
+
"""从配置文件加载附加说明。"""
|
|
10
|
+
try:
|
|
11
|
+
from jarvis.jarvis_c2rust.constants import CONFIG_JSON
|
|
12
|
+
|
|
13
|
+
# 尝试从项目根目录读取配置(crate_dir 的父目录或同级目录)
|
|
14
|
+
# 首先尝试 crate_dir 的父目录
|
|
15
|
+
project_root = crate_dir.parent
|
|
16
|
+
config_path = project_root / ".jarvis" / "c2rust" / CONFIG_JSON
|
|
17
|
+
if config_path.exists():
|
|
18
|
+
with config_path.open("r", encoding="utf-8") as f:
|
|
19
|
+
config = json.load(f)
|
|
20
|
+
if isinstance(config, dict):
|
|
21
|
+
return str(config.get("additional_notes", "") or "").strip()
|
|
22
|
+
# 如果父目录没有,尝试当前目录
|
|
23
|
+
config_path = crate_dir / ".jarvis" / "c2rust" / CONFIG_JSON
|
|
24
|
+
if config_path.exists():
|
|
25
|
+
with config_path.open("r", encoding="utf-8") as f:
|
|
26
|
+
config = json.load(f)
|
|
27
|
+
if isinstance(config, dict):
|
|
28
|
+
return str(config.get("additional_notes", "") or "").strip()
|
|
29
|
+
except Exception:
|
|
30
|
+
pass
|
|
31
|
+
return ""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def append_additional_notes(prompt: str, additional_notes: str) -> str:
|
|
35
|
+
"""
|
|
36
|
+
在提示词末尾追加附加说明(如果存在)。
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
prompt: 原始提示词
|
|
40
|
+
additional_notes: 附加说明
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
追加了附加说明的提示词
|
|
44
|
+
"""
|
|
45
|
+
if additional_notes and additional_notes.strip():
|
|
46
|
+
return (
|
|
47
|
+
prompt + "\n\n" + "【附加说明(用户自定义)】\n" + additional_notes.strip()
|
|
48
|
+
)
|
|
49
|
+
return prompt
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""文档补充优化模块。"""
|
|
3
|
+
|
|
4
|
+
import os
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Callable
|
|
7
|
+
from typing import List
|
|
8
|
+
|
|
9
|
+
from jarvis.jarvis_utils.output import PrettyOutput
|
|
10
|
+
|
|
11
|
+
from jarvis.jarvis_agent.events import AFTER_TOOL_CALL
|
|
12
|
+
from jarvis.jarvis_agent.events import BEFORE_TOOL_CALL
|
|
13
|
+
from jarvis.jarvis_c2rust.optimizer_options import OptimizeOptions
|
|
14
|
+
from jarvis.jarvis_c2rust.optimizer_options import OptimizeStats
|
|
15
|
+
from jarvis.jarvis_c2rust.optimizer_progress import ProgressManager
|
|
16
|
+
from jarvis.jarvis_c2rust.optimizer_utils import cargo_check_full
|
|
17
|
+
from jarvis.jarvis_c2rust.optimizer_utils import run_cargo_fmt
|
|
18
|
+
from jarvis.jarvis_code_agent.code_agent import CodeAgent
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class DocsOptimizer:
|
|
22
|
+
"""文档补充优化器。"""
|
|
23
|
+
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
crate_dir: Path,
|
|
27
|
+
options: OptimizeOptions,
|
|
28
|
+
stats: OptimizeStats,
|
|
29
|
+
progress_manager: ProgressManager,
|
|
30
|
+
append_additional_notes_func: Callable[[str], str],
|
|
31
|
+
):
|
|
32
|
+
self.crate_dir = crate_dir
|
|
33
|
+
self.options = options
|
|
34
|
+
self.stats = stats
|
|
35
|
+
self.progress_manager = progress_manager
|
|
36
|
+
self.append_additional_notes = append_additional_notes_func
|
|
37
|
+
|
|
38
|
+
def codeagent_opt_docs(self, target_files: List[Path]) -> None:
|
|
39
|
+
"""
|
|
40
|
+
使用 CodeAgent 进行文档补充。
|
|
41
|
+
|
|
42
|
+
注意:CodeAgent 必须在 crate 目录下创建和执行,以确保所有文件操作和命令执行都在正确的上下文中进行。
|
|
43
|
+
"""
|
|
44
|
+
crate = self.crate_dir.resolve()
|
|
45
|
+
file_list: List[str] = []
|
|
46
|
+
for p in target_files:
|
|
47
|
+
try:
|
|
48
|
+
rel = p.resolve().relative_to(crate).as_posix()
|
|
49
|
+
except Exception:
|
|
50
|
+
rel = p.as_posix()
|
|
51
|
+
file_list.append(rel)
|
|
52
|
+
self.stats.files_scanned += 1
|
|
53
|
+
|
|
54
|
+
prompt_lines: List[str] = [
|
|
55
|
+
"你是资深 Rust 代码工程师。请在当前 crate 下执行文档补充优化,并以补丁形式输出修改:",
|
|
56
|
+
f"- crate 根目录:{crate}",
|
|
57
|
+
"",
|
|
58
|
+
"本次优化仅允许修改以下文件范围(严格限制):",
|
|
59
|
+
*[f"- {rel}" for rel in file_list],
|
|
60
|
+
"",
|
|
61
|
+
"优化目标:",
|
|
62
|
+
"1) 文档补充:",
|
|
63
|
+
" - 为缺少模块级文档的文件添加 `//! ...` 模块文档注释(放在文件开头);",
|
|
64
|
+
" - 为缺少函数文档的公共函数(pub 或 pub(crate))添加 `/// ...` 文档注释;",
|
|
65
|
+
" - 文档内容可以是占位注释(如 `//! TODO: Add module-level documentation` 或 `/// TODO: Add documentation`),也可以根据函数签名和实现提供简要说明。",
|
|
66
|
+
"",
|
|
67
|
+
"2) 修复已有实现的问题:",
|
|
68
|
+
" - 如果在进行文档补充的过程中,发现代码已有的实现有问题(如逻辑错误、潜在 bug、性能问题、内存安全问题等),也需要一并修复;",
|
|
69
|
+
" - 这些问题可能包括但不限于:不正确的算法实现、未检查的边界条件、资源泄漏、竞态条件等;",
|
|
70
|
+
" - 修复时应该保持最小改动原则,优先修复最严重的问题。",
|
|
71
|
+
"",
|
|
72
|
+
"约束与范围:",
|
|
73
|
+
"- 仅修改上述列出的文件;除非必须(如修复引用路径),否则不要修改其他文件。",
|
|
74
|
+
"- 保持最小改动,不要进行与文档补充无关的重构或格式化。",
|
|
75
|
+
"- 修改后需保证 `cargo test` 可以通过;如需引入少量配套改动,请一并包含在补丁中以确保通过。",
|
|
76
|
+
"- 输出仅为补丁,不要输出解释或多余文本。",
|
|
77
|
+
"",
|
|
78
|
+
"优先级说明:",
|
|
79
|
+
"- **如果优化过程中出现了测试不通过或编译错误,必须优先解决这些问题**;",
|
|
80
|
+
"- 在进行文档补充之前,先确保代码能够正常编译和通过测试;",
|
|
81
|
+
"- 如果文档补充导致了编译错误或测试失败,必须立即修复这些错误,然后再继续优化。",
|
|
82
|
+
"",
|
|
83
|
+
"自检要求:在每次输出补丁后,请使用 execute_script 工具在 crate 根目录执行 `cargo test -q` 进行验证;",
|
|
84
|
+
"若出现编译错误或测试失败,请优先修复这些问题,然后再继续文档补充;",
|
|
85
|
+
"若未通过,请继续输出新的补丁进行最小修复并再次自检,直至 `cargo test` 通过为止。",
|
|
86
|
+
]
|
|
87
|
+
prompt = "\n".join(prompt_lines)
|
|
88
|
+
prompt = self.append_additional_notes(prompt)
|
|
89
|
+
# 切换到 crate 目录,确保 CodeAgent 在正确的上下文中创建和执行
|
|
90
|
+
prev_cwd = os.getcwd()
|
|
91
|
+
PrettyOutput.auto_print(
|
|
92
|
+
"📝 [c2rust-optimizer][codeagent][doc] 正在调用 CodeAgent 进行文档补充..."
|
|
93
|
+
)
|
|
94
|
+
try:
|
|
95
|
+
os.chdir(str(crate))
|
|
96
|
+
# 修复前执行 cargo fmt
|
|
97
|
+
run_cargo_fmt(crate)
|
|
98
|
+
|
|
99
|
+
# 记录运行前的 commit id
|
|
100
|
+
commit_before = self.progress_manager.get_crate_commit_hash()
|
|
101
|
+
|
|
102
|
+
# CodeAgent 在 crate 目录下创建和执行
|
|
103
|
+
agent = CodeAgent(
|
|
104
|
+
name="DocumentationAgent",
|
|
105
|
+
need_summary=False,
|
|
106
|
+
non_interactive=self.options.non_interactive,
|
|
107
|
+
model_group=self.options.llm_group,
|
|
108
|
+
enable_task_list_manager=False,
|
|
109
|
+
disable_review=True,
|
|
110
|
+
)
|
|
111
|
+
# 订阅 BEFORE_TOOL_CALL 和 AFTER_TOOL_CALL 事件,用于细粒度检测测试代码删除
|
|
112
|
+
agent.event_bus.subscribe(
|
|
113
|
+
BEFORE_TOOL_CALL, self.progress_manager.on_before_tool_call
|
|
114
|
+
)
|
|
115
|
+
agent.event_bus.subscribe(
|
|
116
|
+
AFTER_TOOL_CALL, self.progress_manager.on_after_tool_call
|
|
117
|
+
)
|
|
118
|
+
# 记录 Agent 创建时的 commit id(作为初始值)
|
|
119
|
+
agent_id = id(agent)
|
|
120
|
+
agent_key = f"agent_{agent_id}"
|
|
121
|
+
initial_commit = self.progress_manager.get_crate_commit_hash()
|
|
122
|
+
if initial_commit:
|
|
123
|
+
self.progress_manager._agent_before_commits[agent_key] = initial_commit
|
|
124
|
+
agent.run(prompt, prefix="[c2rust-optimizer][codeagent][doc]", suffix="")
|
|
125
|
+
|
|
126
|
+
# 检测并处理测试代码删除
|
|
127
|
+
if self.progress_manager.check_and_handle_test_deletion(
|
|
128
|
+
commit_before, agent
|
|
129
|
+
):
|
|
130
|
+
# 如果回退了,需要重新运行 agent
|
|
131
|
+
PrettyOutput.auto_print(
|
|
132
|
+
"⚠️ [c2rust-optimizer][codeagent][doc] 检测到测试代码删除问题,已回退,重新运行 agent"
|
|
133
|
+
)
|
|
134
|
+
commit_before = self.progress_manager.get_crate_commit_hash()
|
|
135
|
+
agent.run(
|
|
136
|
+
prompt,
|
|
137
|
+
prefix="[c2rust-optimizer][codeagent][doc][retry]",
|
|
138
|
+
suffix="",
|
|
139
|
+
)
|
|
140
|
+
# 再次检测
|
|
141
|
+
if self.progress_manager.check_and_handle_test_deletion(
|
|
142
|
+
commit_before, agent
|
|
143
|
+
):
|
|
144
|
+
PrettyOutput.auto_print(
|
|
145
|
+
"❌ [c2rust-optimizer][codeagent][doc] 再次检测到测试代码删除问题,已回退"
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# 验证修复是否成功(通过 cargo test)
|
|
149
|
+
ok, _ = cargo_check_full(
|
|
150
|
+
crate,
|
|
151
|
+
self.stats,
|
|
152
|
+
self.options.max_checks,
|
|
153
|
+
timeout=self.options.cargo_test_timeout,
|
|
154
|
+
)
|
|
155
|
+
if ok:
|
|
156
|
+
# 修复成功,保存进度和 commit id
|
|
157
|
+
file_paths = [crate / f for f in file_list if (crate / f).exists()]
|
|
158
|
+
self.progress_manager.save_fix_progress(
|
|
159
|
+
"doc_opt", "batch", file_paths if file_paths else None
|
|
160
|
+
)
|
|
161
|
+
PrettyOutput.auto_print(
|
|
162
|
+
"✅ [c2rust-optimizer][codeagent][doc] 文档补充成功,已保存进度"
|
|
163
|
+
)
|
|
164
|
+
else:
|
|
165
|
+
# 测试失败,回退到运行前的 commit
|
|
166
|
+
if commit_before:
|
|
167
|
+
PrettyOutput.auto_print(
|
|
168
|
+
f"⚠️ [c2rust-optimizer][codeagent][doc] 文档补充后测试失败,回退到运行前的 commit: {commit_before[:8]}"
|
|
169
|
+
)
|
|
170
|
+
if self.progress_manager.reset_to_commit(commit_before):
|
|
171
|
+
PrettyOutput.auto_print(
|
|
172
|
+
f"ℹ️ [c2rust-optimizer][codeagent][doc] 已成功回退到 commit: {commit_before[:8]}"
|
|
173
|
+
)
|
|
174
|
+
else:
|
|
175
|
+
PrettyOutput.auto_print(
|
|
176
|
+
"❌ [c2rust-optimizer][codeagent][doc] 回退失败,请手动检查代码状态"
|
|
177
|
+
)
|
|
178
|
+
else:
|
|
179
|
+
PrettyOutput.auto_print(
|
|
180
|
+
"⚠️ [c2rust-optimizer][codeagent][doc] 文档补充后测试失败,但无法获取运行前的 commit"
|
|
181
|
+
)
|
|
182
|
+
finally:
|
|
183
|
+
os.chdir(prev_cwd)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""优化器选项和统计数据结构。"""
|
|
3
|
+
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import List
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class OptimizeOptions:
|
|
11
|
+
"""优化器选项配置。"""
|
|
12
|
+
|
|
13
|
+
enable_unsafe_cleanup: bool = True
|
|
14
|
+
enable_visibility_opt: bool = True
|
|
15
|
+
enable_doc_opt: bool = True
|
|
16
|
+
max_checks: int = 0 # 0 表示不限;用于限制 cargo check 次数(防止过慢)
|
|
17
|
+
dry_run: bool = False
|
|
18
|
+
# 大项目分批优化控制
|
|
19
|
+
include_patterns: Optional[str] = (
|
|
20
|
+
None # 逗号分隔的 glob,相对 crate 根(支持 src/**.rs)
|
|
21
|
+
)
|
|
22
|
+
exclude_patterns: Optional[str] = None # 逗号分隔的 glob
|
|
23
|
+
max_files: int = 0 # 本次最多处理的文件数(0 不限)
|
|
24
|
+
resume: bool = True # 断点续跑:跳过已处理文件
|
|
25
|
+
reset_progress: bool = False # 重置进度(清空 processed 列表)
|
|
26
|
+
build_fix_retries: int = 3 # 构建失败时的修复重试次数
|
|
27
|
+
# Git 保护:优化前快照 commit,失败时自动 reset 回快照
|
|
28
|
+
git_guard: bool = True
|
|
29
|
+
llm_group: Optional[str] = None
|
|
30
|
+
cargo_test_timeout: int = 300 # cargo test 超时(秒)
|
|
31
|
+
non_interactive: bool = True
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class OptimizeStats:
|
|
36
|
+
"""优化统计信息。"""
|
|
37
|
+
|
|
38
|
+
files_scanned: int = 0
|
|
39
|
+
unsafe_removed: int = 0
|
|
40
|
+
unsafe_annotated: int = 0
|
|
41
|
+
visibility_downgraded: int = 0
|
|
42
|
+
docs_added: int = 0
|
|
43
|
+
cargo_checks: int = 0
|
|
44
|
+
errors: Optional[List[str]] = None
|
|
45
|
+
|
|
46
|
+
def __post_init__(self):
|
|
47
|
+
if self.errors is None:
|
|
48
|
+
self.errors = []
|