Files
ollama-cli/build/lib/ollama_cli/tools/code.py

97 lines
3.4 KiB
Python

import os
import subprocess
from .base import tool
@tool(
name="code_analyze_file",
description="Analyze code structure and suggest improvements",
parameters={
"file_path": {"type": "string", "description": "Path to the file to analyze"}
}
)
def code_analyze_file(file_path: str) -> str:
try:
with open(os.path.expanduser(file_path), 'r') as f:
content = f.read()
lines = content.split('\n')
functions = [l for l in lines if 'def ' in l]
classes = [l for l in lines if 'class ' in l]
issues = []
if len(lines) > 500:
issues.append(f"Large file ({len(lines)} lines) - consider splitting")
if len(functions) > 30:
issues.append(f"Many functions ({len(functions)}) - consider refactoring")
return f"""File: {file_path}
Lines: {len(lines)} | Functions: {len(functions)} | Classes: {len(classes)}
Issues:
{chr(10).join(f'- {i}' for i in issues) if issues else '- None detected'}"""
except Exception as e:
return f"Error: {str(e)}"
@tool(
name="generate_readme",
description="Generate a README.md for the current project",
parameters={
"path": {"type": "string", "description": "Project root path", "default": "."}
}
)
def generate_readme(path: str = ".") -> str:
try:
project_name = os.path.basename(os.path.abspath(path))
readme_content = f"# {project_name}\n\nGenerated by Ollama CLI."
readme_path = os.path.join(path, "README.md")
with open(readme_path, 'w') as f:
f.write(readme_content)
return f"Generated README.md at {readme_path}"
except Exception as e:
return f"Error: {str(e)}"
@tool(
name="replace_text",
description="Surgically replace text in a file",
parameters={
"path": {"type": "string", "description": "Path to the file"},
"old_text": {"type": "string", "description": "The exact text to find"},
"new_text": {"type": "string", "description": "The text to replace it with"}
}
)
def replace_text(path: str, old_text: str, new_text: str) -> str:
try:
expanded_path = os.path.expanduser(path)
with open(expanded_path, 'r') as f:
content = f.read()
if old_text not in content:
return f"Error: The text to replace was not found in {path}"
new_content = content.replace(old_text, new_text, 1) # Replace first occurrence
with open(expanded_path, 'w') as f:
f.write(new_content)
return f"Successfully updated {path}"
except Exception as e:
return f"Error: {str(e)}"
@tool(
name="run_linter",
description="Run a linter on a file",
parameters={
"file_path": {"type": "string", "description": "Path to the file"},
"linter": {"type": "string", "description": "Linter to use (pylint|eslint|auto)", "default": "auto"}
}
)
def run_linter(file_path: str, linter: str = "auto") -> str:
try:
file_path = os.path.expanduser(file_path)
if linter == "auto":
ext = os.path.splitext(file_path)[1]
linter = "pylint" if ext == ".py" else "eslint"
result = subprocess.run(f"{linter} {file_path}", shell=True, capture_output=True, text=True)
return result.stdout + result.stderr
except Exception as e:
return f"Error: {str(e)}"