jarvis-ai-assistant 0.3.30__py3-none-any.whl → 0.7.6__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 +458 -152
- jarvis/jarvis_agent/agent_manager.py +17 -13
- jarvis/jarvis_agent/builtin_input_handler.py +2 -6
- jarvis/jarvis_agent/config_editor.py +2 -7
- jarvis/jarvis_agent/event_bus.py +82 -12
- jarvis/jarvis_agent/file_context_handler.py +329 -0
- jarvis/jarvis_agent/file_methodology_manager.py +3 -4
- jarvis/jarvis_agent/jarvis.py +628 -55
- jarvis/jarvis_agent/language_extractors/__init__.py +57 -0
- jarvis/jarvis_agent/language_extractors/c_extractor.py +21 -0
- jarvis/jarvis_agent/language_extractors/cpp_extractor.py +21 -0
- jarvis/jarvis_agent/language_extractors/go_extractor.py +21 -0
- jarvis/jarvis_agent/language_extractors/java_extractor.py +84 -0
- jarvis/jarvis_agent/language_extractors/javascript_extractor.py +79 -0
- jarvis/jarvis_agent/language_extractors/python_extractor.py +21 -0
- jarvis/jarvis_agent/language_extractors/rust_extractor.py +21 -0
- jarvis/jarvis_agent/language_extractors/typescript_extractor.py +84 -0
- jarvis/jarvis_agent/language_support_info.py +486 -0
- jarvis/jarvis_agent/main.py +34 -10
- jarvis/jarvis_agent/memory_manager.py +7 -16
- jarvis/jarvis_agent/methodology_share_manager.py +10 -16
- jarvis/jarvis_agent/prompt_manager.py +1 -1
- jarvis/jarvis_agent/prompts.py +193 -171
- jarvis/jarvis_agent/protocols.py +8 -12
- jarvis/jarvis_agent/run_loop.py +105 -9
- jarvis/jarvis_agent/session_manager.py +2 -3
- jarvis/jarvis_agent/share_manager.py +20 -22
- jarvis/jarvis_agent/shell_input_handler.py +1 -2
- jarvis/jarvis_agent/stdio_redirect.py +295 -0
- jarvis/jarvis_agent/task_analyzer.py +31 -6
- jarvis/jarvis_agent/task_manager.py +11 -27
- jarvis/jarvis_agent/tool_executor.py +2 -3
- jarvis/jarvis_agent/tool_share_manager.py +12 -24
- jarvis/jarvis_agent/utils.py +5 -1
- jarvis/jarvis_agent/web_bridge.py +189 -0
- jarvis/jarvis_agent/web_output_sink.py +53 -0
- jarvis/jarvis_agent/web_server.py +786 -0
- jarvis/jarvis_c2rust/__init__.py +26 -0
- jarvis/jarvis_c2rust/cli.py +575 -0
- jarvis/jarvis_c2rust/collector.py +250 -0
- jarvis/jarvis_c2rust/constants.py +26 -0
- jarvis/jarvis_c2rust/library_replacer.py +1254 -0
- jarvis/jarvis_c2rust/llm_module_agent.py +1272 -0
- jarvis/jarvis_c2rust/loaders.py +207 -0
- jarvis/jarvis_c2rust/models.py +28 -0
- jarvis/jarvis_c2rust/optimizer.py +2157 -0
- jarvis/jarvis_c2rust/scanner.py +1681 -0
- jarvis/jarvis_c2rust/transpiler.py +2983 -0
- jarvis/jarvis_c2rust/utils.py +385 -0
- jarvis/jarvis_code_agent/build_validation_config.py +132 -0
- jarvis/jarvis_code_agent/code_agent.py +1371 -220
- jarvis/jarvis_code_agent/code_analyzer/__init__.py +65 -0
- jarvis/jarvis_code_agent/code_analyzer/base_language.py +74 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/__init__.py +44 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/base.py +106 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/cmake.py +74 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/detector.py +125 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/fallback.py +72 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/go.py +70 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/java_gradle.py +53 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/java_maven.py +47 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/makefile.py +61 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/nodejs.py +110 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/python.py +154 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/rust.py +110 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator/validator.py +153 -0
- jarvis/jarvis_code_agent/code_analyzer/build_validator.py +43 -0
- jarvis/jarvis_code_agent/code_analyzer/context_manager.py +648 -0
- jarvis/jarvis_code_agent/code_analyzer/context_recommender.py +18 -0
- jarvis/jarvis_code_agent/code_analyzer/dependency_analyzer.py +132 -0
- jarvis/jarvis_code_agent/code_analyzer/file_ignore.py +330 -0
- jarvis/jarvis_code_agent/code_analyzer/impact_analyzer.py +781 -0
- jarvis/jarvis_code_agent/code_analyzer/language_registry.py +185 -0
- jarvis/jarvis_code_agent/code_analyzer/language_support.py +110 -0
- jarvis/jarvis_code_agent/code_analyzer/languages/__init__.py +49 -0
- jarvis/jarvis_code_agent/code_analyzer/languages/c_cpp_language.py +299 -0
- jarvis/jarvis_code_agent/code_analyzer/languages/go_language.py +215 -0
- jarvis/jarvis_code_agent/code_analyzer/languages/java_language.py +212 -0
- jarvis/jarvis_code_agent/code_analyzer/languages/javascript_language.py +254 -0
- jarvis/jarvis_code_agent/code_analyzer/languages/python_language.py +269 -0
- jarvis/jarvis_code_agent/code_analyzer/languages/rust_language.py +281 -0
- jarvis/jarvis_code_agent/code_analyzer/languages/typescript_language.py +280 -0
- jarvis/jarvis_code_agent/code_analyzer/llm_context_recommender.py +605 -0
- jarvis/jarvis_code_agent/code_analyzer/structured_code.py +556 -0
- jarvis/jarvis_code_agent/code_analyzer/symbol_extractor.py +252 -0
- jarvis/jarvis_code_agent/code_analyzer/tree_sitter_extractor.py +58 -0
- jarvis/jarvis_code_agent/lint.py +501 -8
- jarvis/jarvis_code_agent/utils.py +141 -0
- jarvis/jarvis_code_analysis/code_review.py +493 -584
- jarvis/jarvis_data/config_schema.json +128 -12
- jarvis/jarvis_git_squash/main.py +4 -5
- jarvis/jarvis_git_utils/git_commiter.py +82 -75
- jarvis/jarvis_mcp/sse_mcp_client.py +22 -29
- jarvis/jarvis_mcp/stdio_mcp_client.py +12 -13
- jarvis/jarvis_mcp/streamable_mcp_client.py +15 -14
- jarvis/jarvis_memory_organizer/memory_organizer.py +55 -74
- jarvis/jarvis_methodology/main.py +32 -48
- jarvis/jarvis_multi_agent/__init__.py +287 -55
- jarvis/jarvis_multi_agent/main.py +36 -4
- jarvis/jarvis_platform/base.py +524 -202
- jarvis/jarvis_platform/human.py +7 -8
- jarvis/jarvis_platform/kimi.py +30 -36
- jarvis/jarvis_platform/openai.py +88 -25
- jarvis/jarvis_platform/registry.py +26 -10
- jarvis/jarvis_platform/tongyi.py +24 -25
- jarvis/jarvis_platform/yuanbao.py +32 -43
- jarvis/jarvis_platform_manager/main.py +66 -77
- jarvis/jarvis_platform_manager/service.py +8 -13
- jarvis/jarvis_rag/cli.py +53 -55
- jarvis/jarvis_rag/embedding_manager.py +13 -18
- jarvis/jarvis_rag/llm_interface.py +8 -9
- jarvis/jarvis_rag/query_rewriter.py +10 -21
- jarvis/jarvis_rag/rag_pipeline.py +24 -27
- jarvis/jarvis_rag/reranker.py +4 -5
- jarvis/jarvis_rag/retriever.py +28 -30
- jarvis/jarvis_sec/__init__.py +305 -0
- jarvis/jarvis_sec/agents.py +143 -0
- jarvis/jarvis_sec/analysis.py +276 -0
- jarvis/jarvis_sec/checkers/__init__.py +32 -0
- jarvis/jarvis_sec/checkers/c_checker.py +2680 -0
- jarvis/jarvis_sec/checkers/rust_checker.py +1108 -0
- jarvis/jarvis_sec/cli.py +139 -0
- jarvis/jarvis_sec/clustering.py +1439 -0
- jarvis/jarvis_sec/file_manager.py +427 -0
- jarvis/jarvis_sec/parsers.py +73 -0
- jarvis/jarvis_sec/prompts.py +268 -0
- jarvis/jarvis_sec/report.py +336 -0
- jarvis/jarvis_sec/review.py +453 -0
- jarvis/jarvis_sec/status.py +264 -0
- jarvis/jarvis_sec/types.py +20 -0
- jarvis/jarvis_sec/utils.py +499 -0
- jarvis/jarvis_sec/verification.py +848 -0
- jarvis/jarvis_sec/workflow.py +226 -0
- jarvis/jarvis_smart_shell/main.py +38 -87
- jarvis/jarvis_stats/cli.py +2 -2
- jarvis/jarvis_stats/stats.py +8 -8
- jarvis/jarvis_stats/storage.py +15 -21
- jarvis/jarvis_stats/visualizer.py +1 -1
- jarvis/jarvis_tools/clear_memory.py +3 -20
- jarvis/jarvis_tools/cli/main.py +21 -23
- jarvis/jarvis_tools/edit_file.py +1019 -132
- jarvis/jarvis_tools/execute_script.py +83 -25
- jarvis/jarvis_tools/file_analyzer.py +6 -9
- jarvis/jarvis_tools/generate_new_tool.py +14 -21
- jarvis/jarvis_tools/lsp_client.py +1552 -0
- jarvis/jarvis_tools/methodology.py +2 -3
- jarvis/jarvis_tools/read_code.py +1736 -35
- jarvis/jarvis_tools/read_symbols.py +140 -0
- jarvis/jarvis_tools/read_webpage.py +12 -13
- jarvis/jarvis_tools/registry.py +427 -200
- jarvis/jarvis_tools/retrieve_memory.py +20 -19
- jarvis/jarvis_tools/rewrite_file.py +72 -158
- jarvis/jarvis_tools/save_memory.py +3 -15
- jarvis/jarvis_tools/search_web.py +18 -18
- jarvis/jarvis_tools/sub_agent.py +36 -43
- jarvis/jarvis_tools/sub_code_agent.py +25 -26
- jarvis/jarvis_tools/virtual_tty.py +55 -33
- jarvis/jarvis_utils/clipboard.py +7 -10
- jarvis/jarvis_utils/config.py +232 -45
- jarvis/jarvis_utils/embedding.py +8 -5
- jarvis/jarvis_utils/fzf.py +8 -8
- jarvis/jarvis_utils/git_utils.py +225 -36
- jarvis/jarvis_utils/globals.py +3 -3
- jarvis/jarvis_utils/http.py +1 -1
- jarvis/jarvis_utils/input.py +99 -48
- jarvis/jarvis_utils/jsonnet_compat.py +465 -0
- jarvis/jarvis_utils/methodology.py +52 -48
- jarvis/jarvis_utils/utils.py +819 -491
- jarvis_ai_assistant-0.7.6.dist-info/METADATA +600 -0
- jarvis_ai_assistant-0.7.6.dist-info/RECORD +218 -0
- {jarvis_ai_assistant-0.3.30.dist-info → jarvis_ai_assistant-0.7.6.dist-info}/entry_points.txt +4 -0
- jarvis/jarvis_agent/config.py +0 -92
- jarvis/jarvis_agent/edit_file_handler.py +0 -296
- jarvis/jarvis_platform/ai8.py +0 -332
- jarvis/jarvis_tools/ask_user.py +0 -54
- jarvis_ai_assistant-0.3.30.dist-info/METADATA +0 -381
- jarvis_ai_assistant-0.3.30.dist-info/RECORD +0 -137
- {jarvis_ai_assistant-0.3.30.dist-info → jarvis_ai_assistant-0.7.6.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.3.30.dist-info → jarvis_ai_assistant-0.7.6.dist-info}/licenses/LICENSE +0 -0
- {jarvis_ai_assistant-0.3.30.dist-info → jarvis_ai_assistant-0.7.6.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Language extractors for file context handler.
|
|
3
|
+
|
|
4
|
+
This module automatically registers all language extractors.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# Import all language extractors to trigger registration
|
|
8
|
+
try:
|
|
9
|
+
from .python_extractor import register_python_extractor
|
|
10
|
+
register_python_extractor()
|
|
11
|
+
except (ImportError, Exception):
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
from .rust_extractor import register_rust_extractor
|
|
16
|
+
register_rust_extractor()
|
|
17
|
+
except (ImportError, Exception):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
try:
|
|
21
|
+
from .go_extractor import register_go_extractor
|
|
22
|
+
register_go_extractor()
|
|
23
|
+
except (ImportError, Exception):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
from .c_extractor import register_c_extractor
|
|
28
|
+
register_c_extractor()
|
|
29
|
+
except (ImportError, Exception):
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
from .cpp_extractor import register_cpp_extractor
|
|
34
|
+
register_cpp_extractor()
|
|
35
|
+
except (ImportError, Exception):
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
try:
|
|
39
|
+
from .javascript_extractor import register_javascript_extractor
|
|
40
|
+
register_javascript_extractor()
|
|
41
|
+
except (ImportError, Exception):
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
try:
|
|
45
|
+
from .typescript_extractor import register_typescript_extractor
|
|
46
|
+
register_typescript_extractor()
|
|
47
|
+
except (ImportError, Exception):
|
|
48
|
+
pass
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
from .java_extractor import register_java_extractor
|
|
52
|
+
register_java_extractor()
|
|
53
|
+
except (ImportError, Exception):
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
__all__ = []
|
|
57
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""C language symbol extractor."""
|
|
3
|
+
|
|
4
|
+
from typing import Optional, Any
|
|
5
|
+
|
|
6
|
+
from jarvis.jarvis_agent.file_context_handler import register_language_extractor
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_c_extractor() -> Optional[Any]:
|
|
10
|
+
"""Create C symbol extractor using tree-sitter."""
|
|
11
|
+
try:
|
|
12
|
+
from jarvis.jarvis_code_agent.code_analyzer.languages.c_cpp_language import CSymbolExtractor
|
|
13
|
+
return CSymbolExtractor()
|
|
14
|
+
except (ImportError, RuntimeError, Exception):
|
|
15
|
+
return None
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def register_c_extractor() -> None:
|
|
19
|
+
"""Register C extractor for .c and .h files."""
|
|
20
|
+
register_language_extractor(['.c', '.h'], create_c_extractor)
|
|
21
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""C++ language symbol extractor."""
|
|
3
|
+
|
|
4
|
+
from typing import Optional, Any
|
|
5
|
+
|
|
6
|
+
from jarvis.jarvis_agent.file_context_handler import register_language_extractor
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_cpp_extractor() -> Optional[Any]:
|
|
10
|
+
"""Create C++ symbol extractor using tree-sitter."""
|
|
11
|
+
try:
|
|
12
|
+
from jarvis.jarvis_code_agent.code_analyzer.languages.c_cpp_language import CppSymbolExtractor
|
|
13
|
+
return CppSymbolExtractor()
|
|
14
|
+
except (ImportError, RuntimeError, Exception):
|
|
15
|
+
return None
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def register_cpp_extractor() -> None:
|
|
19
|
+
"""Register C++ extractor for .cpp, .cc, .cxx, .hpp, .hxx files."""
|
|
20
|
+
register_language_extractor(['.cpp', '.cc', '.cxx', '.hpp', '.hxx'], create_cpp_extractor)
|
|
21
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Go language symbol extractor."""
|
|
3
|
+
|
|
4
|
+
from typing import Optional, Any
|
|
5
|
+
|
|
6
|
+
from jarvis.jarvis_agent.file_context_handler import register_language_extractor
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_go_extractor() -> Optional[Any]:
|
|
10
|
+
"""Create Go symbol extractor using tree-sitter."""
|
|
11
|
+
try:
|
|
12
|
+
from jarvis.jarvis_code_agent.code_analyzer.languages.go_language import GoSymbolExtractor
|
|
13
|
+
return GoSymbolExtractor()
|
|
14
|
+
except (ImportError, RuntimeError, Exception):
|
|
15
|
+
return None
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def register_go_extractor() -> None:
|
|
19
|
+
"""Register Go extractor for .go files."""
|
|
20
|
+
register_language_extractor('.go', create_go_extractor)
|
|
21
|
+
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Java language symbol extractor."""
|
|
3
|
+
|
|
4
|
+
from typing import Optional, Any
|
|
5
|
+
|
|
6
|
+
from jarvis.jarvis_agent.file_context_handler import register_language_extractor
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_java_extractor() -> Optional[Any]:
|
|
10
|
+
"""Create Java symbol extractor using tree-sitter."""
|
|
11
|
+
try:
|
|
12
|
+
from jarvis.jarvis_code_agent.code_analyzer.languages.java_language import JavaSymbolExtractor
|
|
13
|
+
return JavaSymbolExtractor()
|
|
14
|
+
except (ImportError, RuntimeError, Exception):
|
|
15
|
+
# 如果 code_analyzer 中没有 Java 支持,尝试直接使用 tree-sitter
|
|
16
|
+
try:
|
|
17
|
+
from tree_sitter import Language, Parser
|
|
18
|
+
import tree_sitter_java
|
|
19
|
+
from jarvis.jarvis_code_agent.code_analyzer.symbol_extractor import Symbol
|
|
20
|
+
|
|
21
|
+
JAVA_LANGUAGE = tree_sitter_java.language()
|
|
22
|
+
JAVA_SYMBOL_QUERY = """
|
|
23
|
+
(method_declaration
|
|
24
|
+
name: (identifier) @method.name)
|
|
25
|
+
|
|
26
|
+
(class_declaration
|
|
27
|
+
name: (identifier) @class.name)
|
|
28
|
+
|
|
29
|
+
(interface_declaration
|
|
30
|
+
name: (identifier) @interface.name)
|
|
31
|
+
|
|
32
|
+
(field_declaration
|
|
33
|
+
(variable_declarator
|
|
34
|
+
name: (identifier) @field.name))
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
class JavaSymbolExtractor:
|
|
38
|
+
def __init__(self):
|
|
39
|
+
# 如果传入的是 PyCapsule,需要转换为 Language 对象
|
|
40
|
+
if not isinstance(JAVA_LANGUAGE, Language):
|
|
41
|
+
self.language = Language(JAVA_LANGUAGE)
|
|
42
|
+
else:
|
|
43
|
+
self.language = JAVA_LANGUAGE
|
|
44
|
+
self.parser = Parser()
|
|
45
|
+
# 使用 language 属性而不是 set_language 方法
|
|
46
|
+
self.parser.language = self.language
|
|
47
|
+
self.symbol_query = JAVA_SYMBOL_QUERY
|
|
48
|
+
|
|
49
|
+
def extract_symbols(self, file_path: str, content: str) -> list:
|
|
50
|
+
try:
|
|
51
|
+
tree = self.parser.parse(bytes(content, "utf8"))
|
|
52
|
+
query = self.language.query(self.symbol_query)
|
|
53
|
+
captures = query.captures(tree.root_node)
|
|
54
|
+
|
|
55
|
+
symbols = []
|
|
56
|
+
for node, name in captures:
|
|
57
|
+
kind_map = {
|
|
58
|
+
"method.name": "method",
|
|
59
|
+
"class.name": "class",
|
|
60
|
+
"interface.name": "interface",
|
|
61
|
+
"field.name": "field",
|
|
62
|
+
}
|
|
63
|
+
symbol_kind = kind_map.get(name)
|
|
64
|
+
if symbol_kind:
|
|
65
|
+
symbols.append(Symbol(
|
|
66
|
+
name=node.text.decode('utf8'),
|
|
67
|
+
kind=symbol_kind,
|
|
68
|
+
file_path=file_path,
|
|
69
|
+
line_start=node.start_point[0] + 1,
|
|
70
|
+
line_end=node.end_point[0] + 1,
|
|
71
|
+
))
|
|
72
|
+
return symbols
|
|
73
|
+
except Exception:
|
|
74
|
+
return []
|
|
75
|
+
|
|
76
|
+
return JavaSymbolExtractor()
|
|
77
|
+
except (ImportError, Exception):
|
|
78
|
+
return None
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def register_java_extractor() -> None:
|
|
82
|
+
"""Register Java extractor for .java files."""
|
|
83
|
+
register_language_extractor('.java', create_java_extractor)
|
|
84
|
+
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""JavaScript language symbol extractor."""
|
|
3
|
+
|
|
4
|
+
from typing import Optional, Any, List
|
|
5
|
+
|
|
6
|
+
from jarvis.jarvis_agent.file_context_handler import register_language_extractor
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_javascript_extractor() -> Optional[Any]:
|
|
10
|
+
"""Create JavaScript symbol extractor using tree-sitter."""
|
|
11
|
+
try:
|
|
12
|
+
from tree_sitter import Language, Parser
|
|
13
|
+
import tree_sitter_javascript
|
|
14
|
+
from jarvis.jarvis_code_agent.code_analyzer.symbol_extractor import Symbol
|
|
15
|
+
|
|
16
|
+
JS_LANGUAGE = tree_sitter_javascript.language()
|
|
17
|
+
JS_SYMBOL_QUERY = """
|
|
18
|
+
(function_declaration
|
|
19
|
+
name: (identifier) @function.name)
|
|
20
|
+
|
|
21
|
+
(method_definition
|
|
22
|
+
name: (property_identifier) @method.name)
|
|
23
|
+
|
|
24
|
+
(class_declaration
|
|
25
|
+
name: (identifier) @class.name)
|
|
26
|
+
|
|
27
|
+
(variable_declaration
|
|
28
|
+
(variable_declarator
|
|
29
|
+
name: (identifier) @variable.name))
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
class JSSymbolExtractor:
|
|
33
|
+
def __init__(self):
|
|
34
|
+
# 如果传入的是 PyCapsule,需要转换为 Language 对象
|
|
35
|
+
if not isinstance(JS_LANGUAGE, Language):
|
|
36
|
+
self.language = Language(JS_LANGUAGE)
|
|
37
|
+
else:
|
|
38
|
+
self.language = JS_LANGUAGE
|
|
39
|
+
self.parser = Parser()
|
|
40
|
+
# 使用 language 属性而不是 set_language 方法
|
|
41
|
+
self.parser.language = self.language
|
|
42
|
+
self.symbol_query = JS_SYMBOL_QUERY
|
|
43
|
+
|
|
44
|
+
def extract_symbols(self, file_path: str, content: str) -> List[Any]:
|
|
45
|
+
try:
|
|
46
|
+
tree = self.parser.parse(bytes(content, "utf8"))
|
|
47
|
+
query = self.language.query(self.symbol_query)
|
|
48
|
+
captures = query.captures(tree.root_node)
|
|
49
|
+
|
|
50
|
+
symbols = []
|
|
51
|
+
for node, name in captures:
|
|
52
|
+
kind_map = {
|
|
53
|
+
"function.name": "function",
|
|
54
|
+
"method.name": "method",
|
|
55
|
+
"class.name": "class",
|
|
56
|
+
"variable.name": "variable",
|
|
57
|
+
}
|
|
58
|
+
symbol_kind = kind_map.get(name)
|
|
59
|
+
if symbol_kind:
|
|
60
|
+
symbols.append(Symbol(
|
|
61
|
+
name=node.text.decode('utf8'),
|
|
62
|
+
kind=symbol_kind,
|
|
63
|
+
file_path=file_path,
|
|
64
|
+
line_start=node.start_point[0] + 1,
|
|
65
|
+
line_end=node.end_point[0] + 1,
|
|
66
|
+
))
|
|
67
|
+
return symbols
|
|
68
|
+
except Exception:
|
|
69
|
+
return []
|
|
70
|
+
|
|
71
|
+
return JSSymbolExtractor()
|
|
72
|
+
except (ImportError, Exception):
|
|
73
|
+
return None
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def register_javascript_extractor() -> None:
|
|
77
|
+
"""Register JavaScript extractor for .js and .jsx files."""
|
|
78
|
+
register_language_extractor(['.js', '.jsx'], create_javascript_extractor)
|
|
79
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Python language symbol extractor."""
|
|
3
|
+
|
|
4
|
+
from typing import Optional, Any
|
|
5
|
+
|
|
6
|
+
from jarvis.jarvis_agent.file_context_handler import register_language_extractor
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_python_extractor() -> Optional[Any]:
|
|
10
|
+
"""Create Python symbol extractor using AST."""
|
|
11
|
+
try:
|
|
12
|
+
from jarvis.jarvis_code_agent.code_analyzer.languages.python_language import PythonSymbolExtractor
|
|
13
|
+
return PythonSymbolExtractor()
|
|
14
|
+
except (ImportError, Exception):
|
|
15
|
+
return None
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def register_python_extractor() -> None:
|
|
19
|
+
"""Register Python extractor for .py and .pyw files."""
|
|
20
|
+
register_language_extractor(['.py', '.pyw'], create_python_extractor)
|
|
21
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Rust language symbol extractor."""
|
|
3
|
+
|
|
4
|
+
from typing import Optional, Any
|
|
5
|
+
|
|
6
|
+
from jarvis.jarvis_agent.file_context_handler import register_language_extractor
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_rust_extractor() -> Optional[Any]:
|
|
10
|
+
"""Create Rust symbol extractor using tree-sitter."""
|
|
11
|
+
try:
|
|
12
|
+
from jarvis.jarvis_code_agent.code_analyzer.languages.rust_language import RustSymbolExtractor
|
|
13
|
+
return RustSymbolExtractor()
|
|
14
|
+
except (ImportError, RuntimeError, Exception):
|
|
15
|
+
return None
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def register_rust_extractor() -> None:
|
|
19
|
+
"""Register Rust extractor for .rs files."""
|
|
20
|
+
register_language_extractor('.rs', create_rust_extractor)
|
|
21
|
+
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""TypeScript language symbol extractor."""
|
|
3
|
+
|
|
4
|
+
from typing import Optional, Any, List
|
|
5
|
+
|
|
6
|
+
from jarvis.jarvis_agent.file_context_handler import register_language_extractor
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_typescript_extractor() -> Optional[Any]:
|
|
10
|
+
"""Create TypeScript symbol extractor using tree-sitter."""
|
|
11
|
+
try:
|
|
12
|
+
from tree_sitter import Language, Parser
|
|
13
|
+
import tree_sitter_typescript
|
|
14
|
+
from jarvis.jarvis_code_agent.code_analyzer.symbol_extractor import Symbol
|
|
15
|
+
|
|
16
|
+
# tree-sitter-typescript 使用 language_typescript() 和 language_tsx()
|
|
17
|
+
TS_LANGUAGE = tree_sitter_typescript.language_typescript()
|
|
18
|
+
TS_SYMBOL_QUERY = """
|
|
19
|
+
(function_declaration
|
|
20
|
+
name: (identifier) @function.name)
|
|
21
|
+
|
|
22
|
+
(method_definition
|
|
23
|
+
name: (property_identifier) @method.name)
|
|
24
|
+
|
|
25
|
+
(class_declaration
|
|
26
|
+
name: (type_identifier) @class.name)
|
|
27
|
+
|
|
28
|
+
(interface_declaration
|
|
29
|
+
name: (type_identifier) @interface.name)
|
|
30
|
+
|
|
31
|
+
(variable_declaration
|
|
32
|
+
(variable_declarator
|
|
33
|
+
name: (identifier) @variable.name))
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
class TSSymbolExtractor:
|
|
37
|
+
def __init__(self):
|
|
38
|
+
# 如果传入的是 PyCapsule,需要转换为 Language 对象
|
|
39
|
+
if not isinstance(TS_LANGUAGE, Language):
|
|
40
|
+
self.language = Language(TS_LANGUAGE)
|
|
41
|
+
else:
|
|
42
|
+
self.language = TS_LANGUAGE
|
|
43
|
+
self.parser = Parser()
|
|
44
|
+
# 使用 language 属性而不是 set_language 方法
|
|
45
|
+
self.parser.language = self.language
|
|
46
|
+
self.symbol_query = TS_SYMBOL_QUERY
|
|
47
|
+
|
|
48
|
+
def extract_symbols(self, file_path: str, content: str) -> List[Any]:
|
|
49
|
+
try:
|
|
50
|
+
tree = self.parser.parse(bytes(content, "utf8"))
|
|
51
|
+
query = self.language.query(self.symbol_query)
|
|
52
|
+
captures = query.captures(tree.root_node)
|
|
53
|
+
|
|
54
|
+
symbols = []
|
|
55
|
+
for node, name in captures:
|
|
56
|
+
kind_map = {
|
|
57
|
+
"function.name": "function",
|
|
58
|
+
"method.name": "method",
|
|
59
|
+
"class.name": "class",
|
|
60
|
+
"interface.name": "interface",
|
|
61
|
+
"variable.name": "variable",
|
|
62
|
+
}
|
|
63
|
+
symbol_kind = kind_map.get(name)
|
|
64
|
+
if symbol_kind:
|
|
65
|
+
symbols.append(Symbol(
|
|
66
|
+
name=node.text.decode('utf8'),
|
|
67
|
+
kind=symbol_kind,
|
|
68
|
+
file_path=file_path,
|
|
69
|
+
line_start=node.start_point[0] + 1,
|
|
70
|
+
line_end=node.end_point[0] + 1,
|
|
71
|
+
))
|
|
72
|
+
return symbols
|
|
73
|
+
except Exception:
|
|
74
|
+
return []
|
|
75
|
+
|
|
76
|
+
return TSSymbolExtractor()
|
|
77
|
+
except (ImportError, Exception):
|
|
78
|
+
return None
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def register_typescript_extractor() -> None:
|
|
82
|
+
"""Register TypeScript extractor for .ts and .tsx files."""
|
|
83
|
+
register_language_extractor(['.ts', '.tsx'], create_typescript_extractor)
|
|
84
|
+
|