diff --git a/sweepai/api.py b/sweepai/api.py index f4cbbbc8b2..b9c95b0184 100644 --- a/sweepai/api.py +++ b/sweepai/api.py @@ -56,8 +56,9 @@ on_check_suite, ) from sweepai.handlers.on_comment import on_comment -from sweepai.handlers.on_jira_ticket import handle_jira_ticket -from sweepai.handlers.on_ticket import on_ticket + +from sweepai.handlers.on_linear_ticket import handle_linear_ticket +from sweepai.handlers.on_ticket import on_ticket from sweepai.handlers.stack_pr import stack_pr from sweepai.utils.buttons import ( check_button_activated, @@ -330,14 +331,14 @@ def webhook( logger.info(f"Received event: {x_github_event}, {action}") return handle_request(request_dict, event=x_github_event) -@app.post("/jira") -def jira_webhook( +@app.post("/linear") +def linear_webhook( request_dict: dict = Body(...), ) -> None: - def call_jira_ticket(*args, **kwargs): - thread = threading.Thread(target=handle_jira_ticket, args=args, kwargs=kwargs) + def call_linear_ticket(*args, **kwargs): + thread = threading.Thread(target=handle_linear_ticket, args=args, kwargs=kwargs) thread.start() - call_jira_ticket(event=request_dict) + call_linear_ticket(event=request_dict) # Set up cronjob for this @app.get("/update_sweep_prs_v2") diff --git a/sweepai/config/server.py b/sweepai/config/server.py index 5141c20992..6dbf87ff0d 100644 --- a/sweepai/config/server.py +++ b/sweepai/config/server.py @@ -197,9 +197,14 @@ DEPLOYMENT_GHA_ENABLED = os.environ.get("DEPLOYMENT_GHA_ENABLED", "true").lower() == "true" JIRA_USER_NAME = os.environ.get("JIRA_USER_NAME", None) -JIRA_API_TOKEN = os.environ.get("JIRA_API_TOKEN", None) +JIRA_API_TOKEN = os.environ.get("JIRA_API_TOKEN", None) JIRA_URL = os.environ.get("JIRA_URL", None) +LINEAR_API_KEY = os.environ.get("LINEAR_API_KEY", None) +LINEAR_LABEL_NAME = os.environ.get("LINEAR_LABEL_NAME", "sweep") +LINEAR_GITHUB_REPO = os.environ.get("LINEAR_GITHUB_REPO", None) +LINEAR_GITHUB_INSTALLATION_ID = os.environ.get("LINEAR_GITHUB_INSTALLATION_ID", None) + SLACK_API_KEY = os.environ.get("SLACK_API_KEY", None) LICENSE_KEY = os.environ.get("LICENSE_KEY", None) diff --git a/sweepai/handlers/on_linear_ticket.py b/sweepai/handlers/on_linear_ticket.py new file mode 100644 index 0000000000..669d0b4d46 --- /dev/null +++ b/sweepai/handlers/on_linear_ticket.py @@ -0,0 +1,31 @@ +import os +from typing import Any, Dict + +from loguru import logger +from sweepai.handlers.on_ticket import on_ticket + +LINEAR_LABEL_NAME = os.environ.get("LINEAR_LABEL_NAME", "sweep") + +def handle_linear_ticket(event: Dict[str, Any]): + try: + ticket_data = event["data"]["issue"] + ticket_labels = ticket_data.get("labels", {}).get("nodes", []) + + if any(label["name"].lower() == LINEAR_LABEL_NAME.lower() for label in ticket_labels): + logger.info(f"Sweep label detected on Linear ticket {ticket_data['id']}") + + on_ticket( + title=ticket_data["title"], + summary=ticket_data["description"], + issue_number=ticket_data["identifier"], + issue_url=ticket_data["url"], + username=ticket_data["createdBy"]["name"], + repo_full_name=os.environ.get("LINEAR_GITHUB_REPO"), + repo_description="", + installation_id=int(os.environ.get("LINEAR_GITHUB_INSTALLATION_ID")), + ) + else: + logger.info(f"Sweep label not found on Linear ticket {ticket_data['id']}") + + except Exception as e: + logger.exception(f"Error processing Linear webhook event: {e}") \ No newline at end of file