feat(mcp): Integrate C/C++ skeleton and outline tools
This commit is contained in:
@@ -296,6 +296,34 @@ def py_get_skeleton(path: str) -> str:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return f"ERROR generating skeleton for '{path}': {e}"
|
return f"ERROR generating skeleton for '{path}': {e}"
|
||||||
|
|
||||||
|
def ts_c_get_skeleton(path: str) -> str:
|
||||||
|
"""Returns a skeleton of a C file."""
|
||||||
|
p, err = _resolve_and_check(path)
|
||||||
|
if err: return err
|
||||||
|
assert p is not None
|
||||||
|
if not p.exists(): return f"ERROR: file not found: {path}"
|
||||||
|
try:
|
||||||
|
from src.file_cache import ASTParser
|
||||||
|
code = p.read_text(encoding="utf-8")
|
||||||
|
parser = ASTParser("c")
|
||||||
|
return parser.get_skeleton(code, path=str(p))
|
||||||
|
except Exception as e:
|
||||||
|
return f"ERROR generating skeleton for '{path}': {e}"
|
||||||
|
|
||||||
|
def ts_cpp_get_skeleton(path: str) -> str:
|
||||||
|
"""Returns a skeleton of a C++ file."""
|
||||||
|
p, err = _resolve_and_check(path)
|
||||||
|
if err: return err
|
||||||
|
assert p is not None
|
||||||
|
if not p.exists(): return f"ERROR: file not found: {path}"
|
||||||
|
try:
|
||||||
|
from src.file_cache import ASTParser
|
||||||
|
code = p.read_text(encoding="utf-8")
|
||||||
|
parser = ASTParser("cpp")
|
||||||
|
return parser.get_skeleton(code, path=str(p))
|
||||||
|
except Exception as e:
|
||||||
|
return f"ERROR generating skeleton for '{path}': {e}"
|
||||||
|
|
||||||
def py_get_code_outline(path: str) -> str:
|
def py_get_code_outline(path: str) -> str:
|
||||||
"""
|
"""
|
||||||
Returns a hierarchical outline of a code file (classes, functions, methods with line ranges).
|
Returns a hierarchical outline of a code file (classes, functions, methods with line ranges).
|
||||||
@@ -314,6 +342,34 @@ def py_get_code_outline(path: str) -> str:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return f"ERROR generating outline for '{path}': {e}"
|
return f"ERROR generating outline for '{path}': {e}"
|
||||||
|
|
||||||
|
def ts_c_get_code_outline(path: str) -> str:
|
||||||
|
"""Returns a hierarchical outline of a C file."""
|
||||||
|
p, err = _resolve_and_check(path)
|
||||||
|
if err: return err
|
||||||
|
assert p is not None
|
||||||
|
if not p.exists(): return f"ERROR: file not found: {path}"
|
||||||
|
try:
|
||||||
|
from src.file_cache import ASTParser
|
||||||
|
code = p.read_text(encoding="utf-8")
|
||||||
|
parser = ASTParser("c")
|
||||||
|
return parser.get_code_outline(code, path=str(p))
|
||||||
|
except Exception as e:
|
||||||
|
return f"ERROR generating outline for '{path}': {e}"
|
||||||
|
|
||||||
|
def ts_cpp_get_code_outline(path: str) -> str:
|
||||||
|
"""Returns a hierarchical outline of a C++ file."""
|
||||||
|
p, err = _resolve_and_check(path)
|
||||||
|
if err: return err
|
||||||
|
assert p is not None
|
||||||
|
if not p.exists(): return f"ERROR: file not found: {path}"
|
||||||
|
try:
|
||||||
|
from src.file_cache import ASTParser
|
||||||
|
code = p.read_text(encoding="utf-8")
|
||||||
|
parser = ASTParser("cpp")
|
||||||
|
return parser.get_code_outline(code, path=str(p))
|
||||||
|
except Exception as e:
|
||||||
|
return f"ERROR generating outline for '{path}': {e}"
|
||||||
|
|
||||||
def get_file_slice(path: str, start_line: int, end_line: int) -> str:
|
def get_file_slice(path: str, start_line: int, end_line: int) -> str:
|
||||||
"""Return a specific line range from a file."""
|
"""Return a specific line range from a file."""
|
||||||
p, err = _resolve_and_check(path)
|
p, err = _resolve_and_check(path)
|
||||||
@@ -1061,8 +1117,16 @@ def dispatch(tool_name: str, tool_input: dict[str, Any]) -> str:
|
|||||||
return get_file_summary(path)
|
return get_file_summary(path)
|
||||||
if tool_name == "py_get_skeleton":
|
if tool_name == "py_get_skeleton":
|
||||||
return py_get_skeleton(path)
|
return py_get_skeleton(path)
|
||||||
|
if tool_name == "ts_c_get_skeleton":
|
||||||
|
return ts_c_get_skeleton(path)
|
||||||
|
if tool_name == "ts_cpp_get_skeleton":
|
||||||
|
return ts_cpp_get_skeleton(path)
|
||||||
if tool_name == "py_get_code_outline":
|
if tool_name == "py_get_code_outline":
|
||||||
return py_get_code_outline(path)
|
return py_get_code_outline(path)
|
||||||
|
if tool_name == "ts_c_get_code_outline":
|
||||||
|
return ts_c_get_code_outline(path)
|
||||||
|
if tool_name == "ts_cpp_get_code_outline":
|
||||||
|
return ts_cpp_get_code_outline(path)
|
||||||
if tool_name == "py_get_definition":
|
if tool_name == "py_get_definition":
|
||||||
return py_get_definition(path, str(tool_input.get("name", "")))
|
return py_get_definition(path, str(tool_input.get("name", "")))
|
||||||
if tool_name == "py_update_definition":
|
if tool_name == "py_update_definition":
|
||||||
@@ -1256,6 +1320,80 @@ MCP_TOOL_SPECS: list[dict[str, Any]] = [
|
|||||||
"required": ["path"],
|
"required": ["path"],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "ts_c_get_skeleton",
|
||||||
|
"description": (
|
||||||
|
"Get a skeleton view of a C file. "
|
||||||
|
"This returns all function signatures and structs, "
|
||||||
|
"but replaces function bodies with '...'. "
|
||||||
|
"Use this to understand C interfaces without reading the full implementation."
|
||||||
|
),
|
||||||
|
"parameters": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"path": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Path to the C file.",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["path"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ts_cpp_get_skeleton",
|
||||||
|
"description": (
|
||||||
|
"Get a skeleton view of a C++ file. "
|
||||||
|
"This returns all classes, structs and function signatures, "
|
||||||
|
"but replaces function bodies with '...'. "
|
||||||
|
"Use this to understand C++ interfaces without reading the full implementation."
|
||||||
|
),
|
||||||
|
"parameters": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"path": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Path to the C++ file.",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["path"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ts_c_get_code_outline",
|
||||||
|
"description": (
|
||||||
|
"Get a hierarchical outline of a C file. "
|
||||||
|
"This returns structs and functions with their line ranges. "
|
||||||
|
"Use this to quickly map out a file's structure before reading specific sections."
|
||||||
|
),
|
||||||
|
"parameters": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"path": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Path to the C file.",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["path"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ts_cpp_get_code_outline",
|
||||||
|
"description": (
|
||||||
|
"Get a hierarchical outline of a C++ file. "
|
||||||
|
"This returns classes, structs and functions with their line ranges. "
|
||||||
|
"Use this to quickly map out a file's structure before reading specific sections."
|
||||||
|
),
|
||||||
|
"parameters": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"path": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Path to the C++ file.",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["path"],
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "get_file_slice",
|
"name": "get_file_slice",
|
||||||
"description": "Read a specific line range from a file. Useful for reading parts of very large files.",
|
"description": "Read a specific line range from a file. Useful for reading parts of very large files.",
|
||||||
|
|||||||
Reference in New Issue
Block a user