Graphite => GitHub button

Add a button to go from app.graphite.dev to github.com

2026/08/06のページです。最新版はこちら

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name        Graphite => GitHub button
// @version     0.3.9
// @description Add a button to go from app.graphite.dev to github.com
// @author      Nathan Heaps
// @namespace   https://app.graphite.dev
// @match       https://app.graphite.dev/*
// @run-at      document-start
// @icon        data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant       none
// @license     MIT
// ==/UserScript==
"use strict";
// The `// ==UserScript==` metadata block for this script lives in
// src/meta.json and is prepended to the compiled output by
// scripts/build-userscript.mjs. See that script for why it isn't inlined here.
const PATH_REGEX = /^\/github\/pr\/([^\/]+)\/([^\/]+)\/([^\/]+).*$/;
const SELECTOR = '[class^="PullRequestTitleBar_container_"] > div:nth-child(1) > div:nth-child(2)';
const addButton = (toolbar) => {
    const match = window.location.pathname.match(PATH_REGEX);
    if (!match)
        return;
    const [_, org, repo, pr] = match;
    const gitHubLink = `https://github.com/${org}/${repo}/pull/${pr}`;
    if (document.getElementById("gitHubLink") != null) {
        return;
    }
    const anchorEl = document.createElement("a");
    anchorEl.setAttribute("id", "gitHubLink");
    anchorEl.setAttribute("href", gitHubLink);
    anchorEl.setAttribute("target", "_blank");
    anchorEl.setAttribute("rel", "noopener noreferrer");
    anchorEl.setAttribute("style", "background: #f0f0f333; padding: 6px; border-radius: 4px; flex-shrink: 0;");
    anchorEl.appendChild(document.createTextNode("GitHub ↗️"));
    toolbar.appendChild(anchorEl);
};
const toolbarObserver = new MutationObserver((_, observer) => {
    const toolbar = document.querySelector(SELECTOR);
    if (toolbar) {
        observer.disconnect();
        addButton(toolbar);
    }
});
let lastPathname;
const routeChangeObserver = new MutationObserver(() => {
    const { pathname } = window.location;
    if (pathname !== lastPathname) {
        lastPathname = pathname;
        if (pathname.match(PATH_REGEX)) {
            toolbarObserver.observe(document.body, {
                childList: true,
                subtree: true,
            });
        }
    }
});
routeChangeObserver.observe(document.body, { childList: true, subtree: true });