55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
from crewai import CrewBase, Agent, Task, Crew
|
|
from crewai_tools import MCPServerAdapter
|
|
from mcp import StdioServerParameters
|
|
import os
|
|
from typing import Dict, Any
|
|
|
|
|
|
class CodeReviewCrew(CrewBase):
|
|
"""Code Review Crew for conducting code quality reviews."""
|
|
|
|
agents_config = "config/agents.yaml"
|
|
tasks_config = "config/tasks.yaml"
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
# Configure Semgrep MCP server connection
|
|
self.semgrep_server_params = StdioServerParameters(
|
|
command="semgrep",
|
|
args=["--metrics=off", "--json", "--stdin-display-name", "scanned_code", "--"],
|
|
env={
|
|
**os.environ,
|
|
"SEMGRAPH_APP_URL": os.getenv("SEMGRAPH_APP_URL", ""),
|
|
"SEMGRAPH_API_TOKEN": os.getenv("SEMGRAPH_API_TOKEN", ""),
|
|
}
|
|
)
|
|
|
|
@Agent
|
|
def code_reviewer(self) -> Agent:
|
|
"""Senior Software Engineer agent for code review."""
|
|
return Agent(
|
|
config=self.agents_config["code_reviewer"],
|
|
tools=[], # Tools will be added via MCP adapter in the task
|
|
verbose=True
|
|
)
|
|
|
|
@Task
|
|
def code_review_task(self) -> Task:
|
|
"""Task for conducting code review."""
|
|
return Task(
|
|
config=self.tasks_config["code_review_task"],
|
|
)
|
|
|
|
@Crew
|
|
def crew(self) -> Crew:
|
|
"""Create the Code Review crew."""
|
|
# Create MCP server adapter for Semgrep
|
|
semgrep_adapter = MCPServerAdapter(self.semgrep_server_params)
|
|
|
|
return Crew(
|
|
agents=[self.code_reviewer()],
|
|
tasks=[self.code_review_task()],
|
|
process="sequential",
|
|
verbose=True,
|
|
tools=semgrep_adapter.tools if hasattr(semgrep_adapter, 'tools') else [],
|
|
) |