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

When an issue in northwind/api gets the automate label, clone the repo into a workspace, have a coding agent fix the issue, run the tests, and open a pull request if they pass. If they don't, comment on the issue with the failure.

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.
Build this workflow

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
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
Calling workspace.create
Provisioning workspace main
{
  "workspace": "main",
  "repo": "northwind/api",
  "branch": "main",
  "head": "4c19ab2f8d3e0b17a5c9e6f2d84b1a70c3e5d9f1"
}

Hand it to the coding agent tool

succeeded
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
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
Calling workspace.commit
{
  "sha": "9f3c7e1a24b8d05f6e3a1c90b7d42f8e5a6c3b19",
  "branch": "main",
  "files": []
}

Report a failing suite tool

Skipped because its if condition was not met

skipped

Push the branch tool

succeeded
Calling workspace.push
{
  "branch": "automate/issue-1207",
  "repo": "northwind/api"
}

Open the pull request tool

succeeded
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"
  }
}

Your next automation is one sentence away.

14-day free trial with $5 of built-in AI included. Cancel anytime.