open-swe

$npx mdskill add TerminalSkills/skills/open-swe

Automate async code execution and PR submission for software tasks.

  • Handles GitHub issues, bug fixes, and autonomous pull request creation.
  • Integrates with LangChain and supports multiple LLM coding agents.
  • Executes planning, coding, testing, and reviewing in asynchronous loops.
  • Delivers completed code with test results and PR descriptions.

SKILL.md

.github/skills/open-sweView on GitHub ↗
---
name: open-swe
description: >-
  Build asynchronous coding agents using LangChain's Open SWE framework — agents that plan,
  code, test, and iterate on software engineering tasks. Use when: building coding bots,
  automating issue resolution, creating SWE agents that work on repos asynchronously.
license: MIT
compatibility: "Python 3.10+"
metadata:
  author: terminal-skills
  version: "1.0.0"
  category: development
  tags: [swe-agent, coding-agent, langchain, async, automation]
  use-cases:
    - "Build a bot that picks up GitHub issues and submits PRs automatically"
    - "Create an async coding agent that works on tasks while you sleep"
    - "Automate bug fixes and code improvements with SWE agent patterns"
  agents: [claude-code, openai-codex, gemini-cli, cursor]
---

# Open SWE

## Overview

Open SWE (by LangChain) is an open-source framework for building asynchronous software engineering agents that can autonomously plan, code, test, and submit pull requests. Unlike synchronous coding assistants, Open SWE agents work in the background — pick up a GitHub issue, work on it for minutes to hours, and deliver a ready-to-review PR.

```
GitHub Issue (labeled "ai-fix")
    ↓ webhook
Open SWE Agent
    ├── Planner: analyze issue, explore codebase, create plan
    ├── Coder: implement changes following plan
    ├── Tester: run tests, fix failures
    └── Reviewer: self-review before PR
    ↓
Pull Request with description + test results
```

## Instructions

When a user asks to build an async coding agent, automate issue resolution, or create SWE bots:

1. **Install Open SWE** — `pip install open-swe langgraph langchain-anthropic`
2. **Configure the agent** — Instantiate `SWEAgent` with an LLM, repo path, and tools
3. **Connect to GitHub** — Use `GitHubIntegration` to listen for labeled issues
4. **Decompose complex tasks** — Use `TaskPlanner` for multi-step issues
5. **Enable test loops** — Set `run_tests=True` so the agent iterates until tests pass

### Basic Agent Setup

```python
from open_swe import SWEAgent
from langchain_anthropic import ChatAnthropic

llm = ChatAnthropic(model="claude-sonnet-4-20250514")
agent = SWEAgent(llm=llm, repo_path="/path/to/repo", tools=["bash", "file_editor", "search"])

result = await agent.solve(
    issue="Fix the login timeout bug - sessions expire after 5 minutes instead of 30",
)
print(result.patch)       # unified diff
print(result.explanation) # what was changed and why
```

### GitHub Integration

```python
from open_swe.integrations import GitHubIntegration

github = GitHubIntegration(token=os.environ["GITHUB_TOKEN"], repo="owner/repo")

@github.on_issue(labels=["ai-fix"])
async def handle_issue(issue):
    agent = SWEAgent(llm=llm, repo_path=github.clone())
    result = await agent.solve(issue=issue.body)
    if result.success:
        pr = await github.create_pr(
            title=f"Fix: {issue.title}",
            body=f"Resolves #{issue.number}\n\n{result.explanation}",
            branch=f"ai-fix/{issue.number}",
            patch=result.patch,
        )
        await issue.comment(f"PR created: {pr.url}")
    else:
        await issue.comment(f"Could not resolve automatically:\n{result.error}")
```

## Examples

### Example 1: Decompose a Complex Feature into Subtasks

```python
from open_swe.planner import TaskPlanner

planner = TaskPlanner(llm=llm)
tasks = await planner.decompose(
    issue="Add user avatar upload with S3 storage and image resizing",
    codebase_context=agent.explore_codebase(),
)
# Returns: [
#   "Add S3 upload utility in lib/storage.ts",
#   "Create avatar resize middleware using sharp",
#   "Add PUT /api/users/:id/avatar endpoint",
#   "Write tests for upload and resize",
#   "Update user profile component to show avatar",
# ]

for task in tasks:
    result = await agent.solve(issue=task)
    agent.apply_patch(result.patch)
```

### Example 2: Process Multiple Issues in Parallel with Test Loops

```python
import asyncio
from open_swe import SWEAgent

async def process_issues(issues: list[str]):
    tasks = []
    for issue in issues:
        agent = SWEAgent(llm=llm, repo_path=clone_repo())
        tasks.append(agent.solve(issue=issue, max_iterations=5, run_tests=True, test_command="pytest"))
    return await asyncio.gather(*tasks)

results = asyncio.run(process_issues([
    "Fix SQL injection in search endpoint",
    "Add rate limiting to API",
    "Update deprecated dependencies",
    "Add input validation to signup form",
    "Fix timezone bug in event scheduler",
]))

for r in results:
    for i, attempt in enumerate(r.iterations):
        print(f"Attempt {i+1}: {'PASS' if attempt.tests_passed else 'FAIL'}")
```

## Guidelines

- **Explore first** — The agent should read relevant files before coding
- **Plan before code** — Create an implementation plan, get approval for large changes
- **Test after change** — Run tests after every modification to catch regressions early
- **Self-review** — Check own code for issues before submitting a PR
- **Incremental** — Apply changes file by file, testing between each step

More from TerminalSkills/skills