Examples / Issue to pull request
Issue to pull request
When an issue is labelled, Murmurator clones the repository into a sandboxed workspace, hands the issue to a coding agent, runs your test suite over what it wrote, and opens a pull request — or comments on the issue with what went wrong.
GitHubYour AI models
What you tell the assistant
Why it works
- The agent works in a Docker sandbox that is deleted when the run ends — it never touches our servers or your credentials.
- Nothing is opened on trust: the pull request step only runs when your own test suite passed.
- Pushing uses the GitHub connection's token and its allowed repositories, so a run can only write where you already said it could.
What it builds
Trigger
GitHub
github · issues · northwind/api
tool
Read the issue
github.get_issue
if trigger.label.name equals automate
tool
Clone into a workspace
workspace.create
tool
Hand it to the coding agent
workspace.agent
tool
Run the test suite
workspace.exec
tool
Commit the change
workspace.commit
if tests.output.exit_code equals 0
tool
Report a failing suite
github.create_comment
if tests.output.exit_code not equals 0
tool
Push the branch
workspace.push
tool
Open the pull request
github.create_pull_request
View the definition
trigger:
kind: github
connection: github
events: [issues]
actions: [labeled]
repos: [northwind/api]
steps:
- key: issue
name: Read the issue
kind: tool
if: { path: trigger.label.name, equals: automate }
tool: github.get_issue
args:
repo: "{{ trigger.repository.full_name }}"
number: "{{ trigger.issue.number }}"
- key: checkout
name: Clone into a workspace
kind: tool
depends_on: [issue]
tool: workspace.create
args:
repo: "{{ trigger.repository.full_name }}"
branch: main
connection: github
- key: fix
name: Hand it to the coding agent
kind: tool
depends_on: [checkout]
tool: workspace.agent
args:
model: smart
prompt: |
Fix this issue. Work only in this repository, keep the change small,
and add or update a test that would have caught it.
{{ steps.issue.output.title }}
{{ steps.issue.output.body }}
- key: tests
name: Run the test suite
kind: tool
depends_on: [fix]
tool: workspace.exec
args:
command: "bin/rails test"
timeout: 900
- key: commit
name: Commit the change
kind: tool
if: { path: steps.tests.output.exit_code, equals: 0 }
tool: workspace.commit
args:
message: "Fix #{{ trigger.issue.number }}: {{ steps.issue.output.title }}"
- key: push
name: Push the branch
kind: tool
depends_on: [commit]
tool: workspace.push
args:
branch: "automate/issue-{{ trigger.issue.number }}"
- key: pull_request
name: Open the pull request
kind: tool
depends_on: [push]
tool: github.create_pull_request
args:
repo: "{{ trigger.repository.full_name }}"
head: "automate/issue-{{ trigger.issue.number }}"
base: main
title: "Fix #{{ trigger.issue.number }}: {{ steps.issue.output.title }}"
body: |
Closes #{{ trigger.issue.number }}.
{{ steps.fix.output.text }}
Test suite passed in the workspace before this was opened.
- key: report_failure
name: Report a failing suite
kind: tool
if: { path: steps.tests.output.exit_code, not_equals: 0 }
tool: github.create_comment
args:
repo: "{{ trigger.repository.full_name }}"
number: "{{ trigger.issue.number }}"
body: |
I tried this one and the tests didn't pass, so nothing was opened.
{{ steps.fix.output.text }}
A sample run
What each step produces
Read the issue tool
succeeded
Read the issue tool
Calling github.get_issue
{
"number": 1207,
"title": "Invoice totals round to the wrong cent",
"state": "open",
"body": "An invoice for 3 × $19.99 shows $59.96 instead of $59.97. Looks like we round each line before summing.",
"author": "sokafor",
"html_url": "https://github.com/northwind/api/issues/1207"
}
Clone into a workspace tool
succeeded
Clone into a workspace tool
Calling workspace.create
Provisioning workspace main
{
"workspace": "main",
"repo": "northwind/api",
"branch": "main",
"head": "4c19ab2f8d3e0b17a5c9e6f2d84b1a70c3e5d9f1"
}
Hand it to the coding agent tool
succeeded
Hand it to the coding agent tool
Calling workspace.agent
Running opencode in main
{
"text": "Line totals were rounded with round() before being summed, so each line lost up to half a cent. I moved rounding to the invoice total in Invoice#total_cents and added a test for 3 × $19.99.",
"files_changed": [
"app/models/invoice.rb",
"test/models/invoice_test.rb"
],
"model": "smart"
}
Run the test suite tool
succeeded
Run the test suite tool
Calling workspace.exec
$ bin/rails test
{
"exit_code": 0,
"output": "Running 342 tests in parallel using 10 processes\n.....................\n342 runs, 1189 assertions, 0 failures, 0 errors, 0 skips\n"
}
Commit the change tool
succeeded
Commit the change tool
Calling workspace.commit
{
"sha": "9f3c7e1a24b8d05f6e3a1c90b7d42f8e5a6c3b19",
"branch": "main",
"files": []
}
Report a failing suite tool
Skipped because its if condition was not met
skipped
Report a failing suite tool
Skipped because its if condition was not met
Push the branch tool
succeeded
Push the branch tool
Calling workspace.push
{
"branch": "automate/issue-1207",
"repo": "northwind/api"
}
Open the pull request tool
succeeded
Open the pull request tool
Calling github.create_pull_request
{
"number": 1208,
"title": "Fix #1207: Invoice totals round to the wrong cent",
"state": "open",
"html_url": "https://github.com/northwind/api/pull/1208",
"author": "northwind-bot"
}
Trigger payload
{
"event": "issues",
"action": "labeled",
"repository": {
"full_name": "northwind/api"
},
"label": {
"name": "automate"
},
"issue": {
"number": 1207,
"title": "Invoice totals round to the wrong cent"
}
}
More examples
Your next automation is one sentence away.
14-day free trial with $5 of built-in AI included. Cancel anytime.