Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion automations/bundle-index.js

Large diffs are not rendered by default.

39 changes: 23 additions & 16 deletions automations/catalog/github-issue-to-pr/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,17 @@
"id": "github-issue-to-pr",
"name": "GitHub issue to PR",
"category": "Software development",
"description": "Watch for a configurable label on GitHub issues, implement the issue in a clone of the default branch, and open a pull request for each label event.",
"description": "Implement ready GitHub issues, address pull request feedback, and publish tested changes for review.",
"requires": {
"integrations": {
"github": {
"message": "Used to read labelled issues, push the branch, and open the pull request."
}
},
"integrations": {},
"features": [
"customTarball"
"customTarball",
"agentProfiles"
]
},
"popularityRank": 95,
"estimatedSetupMinutes": 4,
"exampleImplementation": "Trigger: cron polling for open GitHub issues with a configured label such as openhands\nRequired secret: GITHUB_PERSONAL_ACCESS_TOKEN, with permission to write contents, issues, and pull requests\n\n1. Read the repositories, trigger label, branch prefix, draft mode, and polling schedule from setup.\n2. Poll each repository independently, with its own state, so issue numbers never collide.\n3. List open labelled issues, drop pull requests, and find the latest matching GitHub labeled issue event for each.\n4. Deduplicate on the label event ID so every label application queues exactly one attempt.\n5. Clone the default branch into a directory of its own, create the working branch, and start an OpenHands conversation with that directory as its workspace. The clone carries no credential and the agent is handed no secrets, because the prompt is built from an issue body that anyone can write.\n6. Comment on the issue with the branch and the conversation link.\n7. Once the conversation has stopped, commit whatever the agent left, push the branch, open a draft pull request titled after the issue, and comment the link on the issue. An agent that made no changes gets its answer posted instead.\n8. Remove the clone once the conversation has stopped, so nothing accumulates between runs.",
"exampleImplementation": "A scheduled scanner selects every ready issue and each pull request whose exact head failed review. It submits one idempotent subject turn for each item. The profile-backed agent then clones the repository in its own runtime, implements or revises the change, tests it, pushes it, and requests independent review.",
"impact": {
"basis": "completed-runs",
"one": "1 issue sweep completed",
Expand Down Expand Up @@ -47,7 +44,7 @@
"repositories": {
"type": "repo-picker",
"label": "Repositories",
"help": "The repositories whose labelled issues are implemented. Each is polled independently and keeps its own state, so issue numbers never collide between them.",
"help": "Repositories to scan. Eligible issues are delegated independently so several agents can work in parallel.",
"provider": "github",
"multiple": true,
"required": true
Expand Down Expand Up @@ -90,24 +87,34 @@
"label": "Ready for review"
}
]
},
"githubTokenSecret": {
"type": "text",
"label": "GitHub token secret",
"help": "Name of a saved secret allowed by the selected agent profile. Enter its name, not its value.",
"default": "GITHUB_PERSONAL_ACCESS_TOKEN",
"required": true
}
}
},
"bundle": {
"version": "1.0.0",
"entrypoint": "python3 main.py",
"timeout": 900,
"version": "1.2.0",
"entrypoint": "python3 worker.py",
"timeout": 1800,
"files": {
"main.py": "skills/github-issue-to-pr/scripts/main.py",
"github_client.py": "skills/github/scripts/github_client.py"
"github_client.py": "skills/github/scripts/github_client.py",
"worker.py": "skills/github-issue-to-pr/scripts/worker.py"
},
"config": {
"repos": "{{form.repositories}}",
"trigger_label": "{{form.triggerLabel}}",
"branch_prefix": "{{form.branchPrefix}}",
"pull_request_mode": "{{form.pullRequestMode}}"
"pull_request_mode": "{{form.pullRequestMode}}",
"github_token_secret": "{{form.githubTokenSecret}}"
}
},
"message": "This deployment cannot run the scheduled issue-to-PR automation directly. Set it up in this conversation instead: confirm the repositories to watch, the trigger label, the branch prefix, whether pull requests open as drafts, and the polling schedule, then create the automation."
}
"message": "Configure the repositories, labels, branch prefix, pull request mode, agent profile, and schedule."
},
"version": "1.2.0"
}
Loading
Loading