Extensions

While Probot doesn’t have an official extension API (yet), there are a handful of reusable utilities that have been extracted from existing apps.

Commands

probot-commands is an extension that adds slash commands to GitHub. Slash commands are lines that start with / in comments on Issues or Pull Requests that allow users to interact directly with your app.

For example, users could add labels from comments by typing /label in-progress.

const commands = require('probot-commands')

module.exports = app => {
  // Type `/label foo, bar` in a comment box for an Issue or Pull Request
  commands(app, 'label', (context, command) => {
    const labels = command.arguments.split(/, */)
    return context.github.issues.addLabels(context.issue({ labels }))
  })
}

Metadata

probot-metadata is an extension that stores metadata on Issues and Pull Requests.

For example, here is a contrived app that stores the number of times that comments were edited in a discussion and comments with the edit count when the issue is closed.

const metadata = require('probot-metadata')

module.exports = app => {
  app.on(['issues.edited', 'issue_comment.edited'], async context => {
    const kv = await metadata(context)
    await kv.set('edits', await kv.get('edits') || 1)
  })

  app.on('issues.closed', async context => {
    const edits = await metadata(context).get('edits')
    context.github.issues.createComment(context.issue({
      body: `There were ${edits} edits to issues in this thread.`
    }))
  })
}

Scheduler

probot-scheduler is an extension to trigger events on a periodic schedule. It triggers a schedule.repository event every hour for each repository it has access to.

const createScheduler = require('probot-scheduler')

module.exports = app => {
  createScheduler(app)

  app.on('schedule.repository', context => {
    // this event is triggered on an interval, which is 1 hr by default
  })
}

Check out stale to see it in action.

Attachments

probot-attachments adds message attachments to comments on GitHub. This extension should be used any time an app is appending content to user comments.

const attachments = require('probot-attachments')

module.exports = app => {
  app.on('issue_comment.created', context => {
    return attachments(context).add({
      title: 'Hello World',
      title_link: 'https://example.com/hello'
    })
  })
}

Check out probot/unfurl to see it in action.

Community Created Extensions

probot-messages was created by @dessant to deliver messages that require user action to ensure the correct operation of the app.