TL;DR
GitHub issueとpull requestのやるやらないを、すばやく振り分けていくためのデス
クトップアプリ “Triage for GitHub“を作りました。

GitHubのIssue, Pull Requestを迅速にさばいていくことが出来ます。
Motivation
Dependency Update as a Service – Tachikoma.io, greenkeeper, deppbot – Automated Dependency Updates を使うことで、ガンガンpull requestを飛ばし、CIやカバレッジなど、GitHubのエコシステムに乗ることが出来るようになりました。
(tachikoma.io 使ってね!)
ただし、数が増えるとpull requestを持て余します。見逃すこともしょっちゅう。

特に定期ping的に空pull requestでciを起動するような場合、ciが通っていることを
確認したらガンガンpull requestを閉じたい。
Plan A: /pulls
https://github.com/pulls

GitHubには自分のpull request一覧を見るページがあり、これは求めるものに近いものがある。他にも、検索を使ってorganizationのpull request一覧を見る方法もある。しかし、現状どうしてもポチポチクリックしていく必要があり、閉じていくのも面倒くさい。
Plan B: Triage for GitHub

そこで、ガシガシ閉じていく専用のデスクトップアプリを作りました。
ランチャーみたいなイメージで、気になるのあったら’Jump’してGitHubのUIを開いて確認していく、GitHub Issueのトリアージを実現します。
使い方
セットアップ
Latest releaseから自分の環境のzipをダウンロードします。

settingsに、GitHubのpersonal tokenを入れてください。scopeは repo
or public_repo
で、つまり、private+public repos or public reposのどちらかのトークンを入れます。
トークン未入力の場合、lyrictenor/example-issues
のissues/pull requestsを表示します。issue立てたり、pull requestを送ったり、自由にどうぞ。雰囲気はつかめると思います。
トークン未入力の場合、GitHubのAPIリクエスト回数制限が極端に少ないです。
https://developer.github.com/v3/#rate-limiting
60 requests per hour.
一定時間IP制限かかるので注意です。
トークンを使っていても、人によっては結構な回数APIリクエストをするアプリなので、過剰な巡回・起動には注意してください。
表示
updated atの新しい順に、5日ぶんのissue/pull requestが並びます。日数はひとまず固定です。
実験的機能 自動巡回
autopilotをonにすると、定期的に自動巡回します。
が、コレはまだ動いたり動かなかったりです。
autopiloting flagがonになったままになってしまうバグが有るため、そうなった場合
はdebug paneから force unlockしてください。
issueの詳細
issue, pull requestの詳細は v っぽいアイコンをクリックしてください。

まとめ
GitHub issues, pull requestsをガンガン振り分けできる “Triage for GitHub”を作ったのでガンガン整理できる。
使ったnpm modules
力作。package.json
"dependencies": {
"classnames": "^2.1.3",
"crossing": "^1.0.1",
"crypto-js": "^3.1.5",
"electron-debug": "0.3.0",
"electron-open-link-in-browser": "^1.0.1",
"electron-template-menu": "1.0.3",
"es6-error": "^2.0.0",
"is-empty-object": "^1.1.0",
"level-js": "^2.2.2",
"level-sublevel": "^6.5.2",
"levelup": "^1.2.1",
"lodash": "^3.10.1",
"material-ui": "0.13.1",
"moment": "^2.10.6",
"octokat": "^0.4.11",
"react": "^0.14.2",
"react-addons-create-fragment": "^0.14.2",
"react-addons-pure-render-mixin": "^0.14.2",
"react-addons-transition-group": "^0.14.2",
"react-addons-update": "^0.14.2",
"react-dom": "^0.14.2",
"react-redux": "^4.0.0",
"react-router": "1.0.0-rc4",
"react-tap-event-plugin": "0.2.1",
"redux": "^3.0.0",
"redux-batched-updates": "^0.1.0",
"redux-devtools-dock-monitor": "^1.0.0-beta-3",
"redux-devtools-log-monitor": "^1.0.0-beta-3",
"redux-form": "^3.0.0-beta-4",
"redux-thunk": "^1.0.0",
"reset-storage": "^1.0.1",
"rndm": "^1.1.0"
},
"devDependencies": {
"archiver": "^0.16.0",
"babel": "^5.8.23",
"babel-core": "^5.8.23",
"babel-eslint": "^4.1.1",
"babel-loader": "^5.3.2",
"babel-plugin-react-transform": "^1.0.3",
"babel-runtime": "^5.8.20",
"buffered-spawn": "^1.1.2",
"conventional-changelog": "^0.5.0",
"cpy": "^3.4.0",
"css-loader": "^0.21.0",
"eclint": "^1.1.1",
"electron-packager": "^5.0.2",
"electron-prebuilt": "0.34.2",
"eslint": "^1.3.1",
"eslint-config-airbnb": "0.1.0",
"eslint-loader": "^1.0.0",
"eslint-plugin-babel": "^2.1.1",
"eslint-plugin-react": "~3.6.3",
"espower-babel": "^3.3.0",
"express": "^4.13.3",
"extract-text-webpack-plugin": "^0.9.0",
"fixpack": "^2.2.0",
"globstar": "^1.0.0",
"html-webpack-plugin": "^1.6.1",
"is-travis-ci-build-for-tag": "^1.1.1",
"json-loader": "^0.5.2",
"mocha": "^2.3.0",
"npm-check-updates": "^2.2.0",
"power-assert": "^1.0.0",
"react-transform-catch-errors": "^1.0.0",
"react-transform-hmr": "^1.0.1",
"redbox-react": "^1.0.5",
"redux-devtools": "^v3.0.0-beta-3",
"rimraf": "^2.4.3",
"silence-chromium": "^2.0.0",
"style-loader": "^0.13.0",
"touch": "^1.0.0",
"webfont-dl": "^0.1.2",
"webpack": "^1.12.0",
"webpack-dev-middleware": "^1.2.0",
"webpack-hot-middleware": "^2.1.0",
"yargs": "^3.23.0"
},