PR Babysitter
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
Create an automation that implements GitHub issues when a configurable trigger label is applied.
$ npx skills add OpenHands/extensions --skill github-issue-to-pr -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install OpenHands/extensions github-issue-to-pr --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/github-issue-to-pr .claude/skills/github-issue-to-pr && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "github-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-issue-to-pr into .claude/skills/github-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-issue-to-pr", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/OpenHands/extensions/tree/main/skills/github-issue-to-prType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add OpenHands/extensions --skill github-issue-to-pr -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install OpenHands/extensions github-issue-to-pr --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/github-issue-to-pr .agents/skills/github-issue-to-pr && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "github-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-issue-to-pr into .agents/skills/github-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-issue-to-pr", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add OpenHands/extensions --skill github-issue-to-pr -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install OpenHands/extensions github-issue-to-pr --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/github-issue-to-pr .cursor/skills/github-issue-to-pr && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "github-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-issue-to-pr into .cursor/skills/github-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-issue-to-pr", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/OpenHands/extensions.git --path skills/github-issue-to-pr--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add OpenHands/extensions --skill github-issue-to-pr -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install OpenHands/extensions github-issue-to-pr --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/github-issue-to-pr .gemini/skills/github-issue-to-pr && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "github-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-issue-to-pr into .gemini/skills/github-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-issue-to-pr", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install OpenHands/extensions github-issue-to-prInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add OpenHands/extensions --skill github-issue-to-pr -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/github-issue-to-pr .github/skills/github-issue-to-pr && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "github-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-issue-to-pr into .github/skills/github-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-issue-to-pr", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add OpenHands/extensions --skill github-issue-to-pr -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install OpenHands/extensions github-issue-to-pr --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/github-issue-to-pr .opencode/skills/github-issue-to-pr && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "github-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-issue-to-pr into .opencode/skills/github-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-issue-to-pr", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
github-issue-to-prCreate an automation that implements GitHub issues when a configurable trigger label is applied.
GitHub Issue To PR is an agent skill from OpenHands/extensions. Create an automation that implements GitHub issues when a configurable trigger label is applied. Polls one or more repositories deterministically, clones the default branch, starts one OpenHands conversation per label event, then commits, pushes, and opens the pull request itself.
Its SKILL.md is about 4.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 14 other files, including scripts and reference files (for example `.plugin/plugin.json`, `README.md` and `commands/issue-to-pr-setup.md`).
It sits in Development, covering Pull requests. It works with GitHub. The repository describes itself as: Public registry for OpenHands extensions. The licence is MIT.
11 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d008b81. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 4 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
python3curlgitFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.github.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GITHUB_PERSONAL_ACCESS_TOKENOPENHANDS_AUTOMATION_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
GitHub Issue To PR loads about 4.4k tokens when it runs, and up to ~5.8k if it reads all its reference files. Until then it costs about 75 tokens; SKILL.md has 2,237 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from OpenHands/extensions at commit d008b81, republished under its MIT licence (© OpenHands). 2,237 words, ~4,404 tokens.
.claude/skills/github-issue-to-pr/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.For new Agent Canvas installations, use the GitHub issue to PR catalog
entry. Its deterministic worker.py scanner delegates each eligible issue to a
stable conversation using the selected agent profile. The manual upload flow
below remains for existing deployments and is deprecated for new installations.
Create a cron automation that watches one or more GitHub repositories for issues with a trigger label, starts an OpenHands conversation once per label event with the repository's default branch already checked out, and opens a pull request with whatever the agent produced.
The automation script is deterministic: issue discovery, label-event tracking, state persistence, the clone, the branch, the commit, the push, the pull request, the issue comments, and the clone's removal are all handled in Python. The LLM is invoked only to write the code.
The agent is told which issue to implement, not what it says. It fetches the description, the discussion, and whatever they link to itself, so nothing in the prompt goes stale between dispatch and the moment the agent reads it.
That needs read access, so the conversation is handed exactly one secret,
GITHUB_PERSONAL_ACCESS_TOKEN, and no MCP servers. AGENT_SECRET_NAMES stays an
allow-list: the rest of the deployment's secret store is not reachable from a
conversation whose instructions came from an issue.
The agent also finishes the job: it commits, pushes its branch, and opens the
pull request, so the pull request appears when the agent stops rather than on the
next poll. The script does not trust that it happened - when the conversation
ends it asks GitHub whether the pull request exists, and opens it itself when it
does not. origin still carries no credential, so every GitHub command the agent
runs has to name GITHUB_PERSONAL_ACCESS_TOKEN; the SDK only puts a secret in the
environment of a command that mentions it, and masks it in the output.
The script imports shared GitHub transport from
scripts/github_client.py, installed with this skill. Include it beside
main.py when packaging manually, as shown below; catalog bundles include it
automatically.
Verify that the following secret is set in OpenHands Settings -> Secrets:
| Secret name | Token type | Minimum permissions |
|---|---|---|
GITHUB_PERSONAL_ACCESS_TOKEN | Classic PAT | repo, plus workflow |
GITHUB_PERSONAL_ACCESS_TOKEN | Fine-grained PAT | Contents: Read and write, Metadata: Read, Issues: Read and write, Pull requests: Read and write, Workflows: Read and write |
The workflow scope is not optional in practice. An issue asking for a CI change
is a normal issue, and GitHub rejects the whole push when a token without it
touches .github/workflows/: "refusing to allow a Personal Access Token to
create or update workflow ... without workflow scope". The branch is rejected
in full, so the pull request never opens.
Contents write access is required because the script pushes the branch, and pull request write because it opens the pull request. A read-only token will poll happily and then fail at the point of pushing.
When several repositories are monitored, the token must cover all of them.
Check with:
curl -s https://api.github.com/user \
-H "Authorization: Bearer $GITHUB_PERSONAL_ACCESS_TOKEN" \
| python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('login') or d.get('message'))"If the token is missing or invalid, inform the user and stop.
Follow these steps in order.
GITHUB_PERSONAL_ACCESS_TOKENRun the curl check above.
{"message": "Bad credentials"}: tell the user the token is
invalid and ask them to update it. Stop.Ask: "Which GitHub repositories should be watched?
(Format: owner/repo, e.g. myorg/backend. List several separated by commas to
serve them all from one automation.)"
Validate access to each repository, and confirm the token can push:
curl -s "https://api.github.com/repos/{owner}/{repo}" \
-H "Authorization: Bearer $GITHUB_PERSONAL_ACCESS_TOKEN" \
| python3 -c "
import json, sys
d = json.load(sys.stdin)
if 'message' in d:
print('ERROR:', d['message'])
else:
perms = d.get('permissions', {})
print(f\"Accessible. Default branch: {d.get('default_branch')}. Push: {perms.get('push')}\")
"Record every accepted repository into REPOS = ["{owner}/{repo}", ...]. If one
repository fails the check, say which and ask whether to continue without it. If
Push: False, say that the automation cannot open pull requests there and ask
for a token with write access.
Each repository is polled independently and keeps its own state, so issue numbers never collide between them. The trigger label, branch prefix, and schedule are shared; a repository needing different settings wants its own automation.
Ask: "Which issue label should trigger an implementation?
(Press Enter for the default: openhands.)"
Record the answer as TRIGGER_LABEL. If the label does not exist yet, tell the
user that GitHub will still record the event once the label is created and
applied to an issue.
The automation works an issue when it sees the latest matching labeled event
for that label. To ask for another attempt later, remove and re-apply the label -
that opens a second branch and a second pull request rather than overwriting the
first.
Ask: *"Should the pull requests be opened as drafts?
Map the choice to DRAFT_PULL_REQUEST (True or False).
Ask: "What branch prefix should the automation use?
(Press Enter for the default: openhands/issue, which produces
openhands/issue-42.)"
Record as BRANCH_PREFIX. Keep it free of spaces and of characters git rejects
in a ref name.
Ask: "How often should the automation poll for labelled issues?
(Press Enter for the default: every 5 minutes.
Use a cron expression for a different interval, e.g. 0 * * * * = hourly)"
Default: */5 * * * *.
Record as CRON_SCHEDULE.
The agent is handed GITHUB_PERSONAL_ACCESS_TOKEN, because it reads the issue and
its discussion itself. Ask: "Beyond the GitHub token, does the repository's build
need a secret of its own - a package registry token, for example? (Press Enter for
none.)"
Record the answers appended to the default, as
AGENT_SECRET_NAMES = ["GITHUB_PERSONAL_ACCESS_TOKEN", "NAME", ...].
Keep it an allow-list. Forwarding the whole secret store would put every
credential in the deployment behind a prompt written by whoever opened the issue.
If the repositories are public and you would rather the conversation held no
credential at all, set the list to [] - the agent can still read a public issue
unauthenticated, and private repositories then stop working.
Read scripts/main.py from this skill's directory. Apply exactly five constant
substitutions near the top of the file:
The script also reads a
config.jsonshipped beside it, if there is one, over these constants. That is how the catalog entry (automations/catalog/github-issue-to-pr/) configures an unmodified copy, since a declarative host cannot rewrite Python. This setup path substitutes the constants and ships noconfig.json, so the two never collide.
| Placeholder | Replace with |
|---|---|
REPOS = ["owner/repo"] | REPOS = ["{owner_repo}", ...] - one entry per repository collected in Step 2 |
TRIGGER_LABEL = "openhands" | TRIGGER_LABEL = "{trigger_label}" |
BRANCH_PREFIX = "openhands/issue" | BRANCH_PREFIX = "{branch_prefix}" |
DRAFT_PULL_REQUEST = True | DRAFT_PULL_REQUEST = {True or False} |
AGENT_SECRET_NAMES: list[str] = [] | AGENT_SECRET_NAMES: list[str] = ["{name}", ...] |
Leave MAX_NEW_PER_RUN and DEFAULT_OPENHANDS_URL alone unless the user asks
for a different cap or a non-default OpenHands URL.
A repository may be given as owner/repo, as a clone URL, or as an SSH remote;
the script normalizes each one at startup and names the value it could not read
rather than blaming the token.
Use a safe string writer such as json.dumps(value) when inserting user-provided
repository names, labels, or prefixes into Python string literals.
json.dumps(list_of_repos) produces the whole REPOS list safely in one step.
Run these commands from this skill's directory and write the customized script to a temporary build directory:
mkdir -p /tmp/issue-to-pr-build
cp -L scripts/github_client.py /tmp/issue-to-pr-build/github_client.py
# write the customized main.py to /tmp/issue-to-pr-build/main.pyValidate syntax before packaging:
python3 -m py_compile /tmp/issue-to-pr-build/main.py && echo "Syntax OK"Fix any syntax errors before proceeding.
Determine the Automation backend URL and auth from the <RUNTIME_SERVICES>
block in your system context:
url_from_agentX-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEYtar -czf /tmp/issue-to-pr.tar.gz -C /tmp/issue-to-pr-build .
TARBALL_PATH=$(curl -s -X POST \
"${OPENHANDS_HOST}/api/automation/v1/uploads?name=github-issue-to-pr" \
-H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \
-H "Content-Type: application/gzip" \
--data-binary @/tmp/issue-to-pr.tar.gz \
| python3 -c "import json,sys; print(json.load(sys.stdin)['tarball_path'])")
echo "Uploaded: $TARBALL_PATH"curl -s -X POST "${OPENHANDS_HOST}/api/automation/v1" \
-H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"name\": \"GitHub Issue to PR: {repo_summary} label {trigger_label}\",
\"trigger\": {\"type\": \"cron\", \"schedule\": \"{cron_schedule}\"},
\"tarball_path\": \"$TARBALL_PATH\",
\"entrypoint\": \"python3 main.py\",
\"timeout\": 900
}" | python3 -m json.toolUse the single repository as {repo_summary} when there is one, and something
like 3 repos when there are several. A poll clones a repository per queued
issue and pushes finished branches, so the timeout allows for that; a run never
waits for an agent to finish, only for it to be started.
Record the returned id.
Tell the user:
✅ GitHub Issue to PR is running!
- Automation ID:
{id}- Repositories:
{owner}/{repo}, ... (one line each)- Trigger label:
{trigger_label}- Branch prefix:
{branch_prefix}- Pull requests:
{draft or ready for review}- Polling schedule:
{cron_schedule}- State file per repository:
~/.openhands/workspaces/automation-state/github_issue_to_pr_{id}_{owner}__{repo}.jsonApply the
{trigger_label}label to an issue to queue an implementation. Each label event is processed once. To ask for another attempt, remove and re-apply the label - that opens a second branch and pull request.The agent runs without GitHub credentials; the automation pushes the branch and opens the pull request once the agent has stopped.
Each cron run executes main.py, which loads config.json if the catalog
shipped one, checks that git is available, resolves and validates
GITHUB_PERSONAL_ACCESS_TOKEN once, then processes every repository in REPOS
independently. One repository failing does not stop the
others; the run fails only if every repository fails.
For each repository:
references/state-schema.md) and reads its
default branch.TRIGGER_LABEL, newest-updated first. Pull
requests are dropped, so labelling a PR never queues an implementation.MAX_NEW_PER_RUN new ones per run:labeled event, and skips it if that event
has already been tracked.{BRANCH_PREFIX}-{number} or a numbered
variant of it.{WORKSPACE_BASE}/issue-to-pr/{owner}__{repo}/issue-{number}-{event_id},
sets the commit identity, and creates the branch. origin keeps its plain
HTTPS URL, so the workspace holds no credential.AGENT_SECRET_NAMES attached.status: "active".idle, finished, error, or stuck:error or
stuck.[#42] <issue title>, with the agent's summary and Closes #42 in
the body), and comments the link on the issue.The completion callback fires once for the whole run.
references/state-schema.md - State JSON schema, field definitions, and the
task lifecycle.scripts/main.py - The complete automation script. Customize the five
constants at the top before packaging.| Symptom | Likely cause | Fix |
|---|---|---|
| Nothing is ever queued | Trigger label not present, or applied to a pull request rather than an issue | Apply the configured label to an issue |
| "Bad credentials" in run logs | Token expired | Rotate and update GITHUB_PERSONAL_ACCESS_TOKEN |
| "The token cannot push to ..." | Token lacks Contents: write on that repository | Issue a token with write access, or drop the repository from REPOS |
| Push rejected: "refusing to allow a Personal Access Token to create or update workflow" | The change touches .github/workflows/ and the token has no workflow scope | Add the scope to the token; the next poll retries the same branch and opens the pull request |
| 404 on repo access | Repo name wrong or no access | Re-check the entry in REPOS and the token's permissions |
git is not available in the automation runtime | The runtime image has no git | Use a runtime image that ships git; the script clones, commits, and pushes with it |
| Issue commented "did not change any code" | The agent judged the issue too ambiguous, or made no edits | Read its answer in the comment, add the missing detail to the issue, then re-apply the label |
| Same issue not picked up again after new comments | Its label event was already processed | Remove and re-apply the trigger label |
| Agent reports it cannot push or open a PR | By design - it has no credentials | No action; the automation pushes and opens the pull request after the agent stops |
| A backlog of labelled issues starts slowly | MAX_NEW_PER_RUN caps how many conversations one poll starts | Wait for the next polls, or raise the cap in the script |
Clones remain under issue-to-pr/ | Their conversations had not stopped yet | They are removed by a later poll once the conversation is terminal |
© OpenHands, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 10 other files (scripts, references) in skills/github-issue-to-pr of OpenHands/extensions.
Open the folder on GitHubat commit d008b81
GitHub Issue To PR next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| GitHub Issue To PR this skillOpenHands/extensions | 157 | — | ~4.4k | Automated safety check: Pass | MIT | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Check PRonyx-dot-app/onyx | 32k | 2 repos | ~2.3k | Automated safety check: Pass | MIT | |
| Contributor-First PR MergeHKUDS/OpenHarness | 16k | 1 repos | ~847 | Automated safety check: Pass | MIT | |
| Create Pull Requestcline/cline | 70k | 1 repos | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| Pull Request Title and Body Writeropeninterpreter/openinterpreter | 69k | 2 repos | ~1.1k | Automated safety check: Pass | Apache-2.0 |
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
onyx-dot-app/onyx
Checks a GitHub, GitLab, or Perforce (p4) pull request (or merge request, or shelved changelist) for unresolved review comments, failing status checks, and incomplete PR descriptions.
HKUDS/OpenHarness
Merges external GitHub pull requests while keeping the original author credited, and fixes conflicts after the merge instead of rewriting the contribution.
cline/cline
Opens a GitHub pull request from your current branch with the gh CLI, after reviewing the commits and diff and gathering the details the PR needs.
openinterpreter/openinterpreter
Rewrites the title and body of one or more pull requests with gh, leading with why the change was made, then what changed, and describing only the net result.
prisma/orm
Runs a loop on a GitHub pull request: fetch review state, triage comments into actions, implement them and resolve threads, repeating until nothing actionable is left.
OpenHands/extensions
Evaluate how well a codebase supports autonomous AI-assisted development.
OpenHands/extensions
Build and automate Discord integrations (bots, webhooks, slash commands, and REST API workflows).
OpenHands/extensions
Interact with GitHub repositories, pull requests, issues, and workflows using the GITHUBTOKEN environment variable and GitHub CLI.
OpenHands/extensions
This skill should be used when the user asks to "monitor a GitHub repository", "watch GitHub for issues or PRs", "respond to @OpenHands mentions on GitHub", "set up an OpenHands GitHub integration"…
OpenHands/extensions
Create an automation that implements GitLab issues when a configurable trigger label is applied.
OpenHands/extensions
This skill should be used when the user asks to "set up a Jira automation to create pull requests", "poll Jira for create-pr issues", "automatically create GitHub PRs from Jira tickets", "deploy a…
Works with
Categories
Create an automation that implements GitHub issues when a configurable trigger label is applied. GitHub Issue To PR is an agent skill from OpenHands/extensions. Create an automation that implements GitHub issues when a configurable trigger label is applied.
GitHub Issue To PR fits situations like: label is applied; tasks that involve Pull requests.
Run `npx skills add OpenHands/extensions --skill github-issue-to-pr -a claude-code`. Or copy the skill folder (skills/github-issue-to-pr in OpenHands/extensions) into .claude/skills/github-issue-to-pr in your project. Claude Code loads it when a task matches its description.
Run `npx skills add OpenHands/extensions --skill github-issue-to-pr -a codex`. Or copy the skill folder (skills/github-issue-to-pr in OpenHands/extensions) into .agents/skills/github-issue-to-pr in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add OpenHands/extensions --skill github-issue-to-pr -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/github-issue-to-pr, .gemini/skills/github-issue-to-pr, .github/skills/github-issue-to-pr and .opencode/skills/github-issue-to-pr in your project.
Going by SKILL.md and its folder, GitHub Issue To PR needs Python for the scripts in its folder, the command-line tools its instructions call (python3, curl and git) and credentials named GITHUB_PERSONAL_ACCESS_TOKEN and OPENHANDS_AUTOMATION_API_KEY. Our summary lists: Python 3; A credential in GITHUB_PERSONAL_ACCESS_TOKEN; A credential in OPENHANDS_AUTOMATION_API_KEY.
SKILL.md names 1 domain. In commands or code: api.github.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
GitHub Issue To PR is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.4k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.4k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with GitHub Issue To PR: PR Babysitter (openinterpreter/openinterpreter, 69k stars), Check PR (onyx-dot-app/onyx, 32k stars), Contributor-First PR Merge (HKUDS/OpenHarness, 16k stars) and Create Pull Request (cline/cline, 70k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
OpenHands (a GitHub organization) maintains it in OpenHands/extensions, which has 157 GitHub stars. The repository holds 78 skills in this directory. The repository was last updated on October 6, 2026.
Source: OpenHands/extensions on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.