GitIngest - Chuyển repo Git thành prompt LLM

Chuyển đổi bất kỳ kho Git nào thành tóm tắt văn bản thân thiện với LLM. Thay thế hub bằng ingest để truy cập tóm tắt tương ứng.

// ==UserScript==
// @name         GitIngest - Turn any Git repo to LLM prompt
// @name:zh-CN   GitIngest - 将Git仓库转换为LLM提示
// @name:zh-TW   GitIngest - 將Git倉庫轉換為LLM提示
// @name:ja      GitIngest - GitリポジトリをLLMプロンプトに変換
// @name:ko      GitIngest - Git 저장소를 LLM 프롬프트로 변환
// @name:es      GitIngest - Convierte cualquier repo Git en prompt LLM
// @name:fr      GitIngest - Convertir tout dépôt Git en prompt LLM
// @name:de      GitIngest - Git-Repository in LLM-Prompt umwandeln
// @name:it      GitIngest - Trasforma qualsiasi repo Git in prompt LLM
// @name:pt      GitIngest - Transformar repo Git em prompt LLM
// @name:ru      GitIngest - Превратить Git-репозиторий в LLM-промпт
// @name:ar      GitIngest - تحويل مستودع Git إلى موجه LLM
// @name:hi      GitIngest - Git रेपो को LLM प्रॉम्प्ट में बदलें
// @name:th      GitIngest - แปลง Git repo เป็น LLM prompt
// @name:vi      GitIngest - Chuyển repo Git thành prompt LLM
// @name:id      GitIngest - Ubah repo Git menjadi prompt LLM
// @name:ms      GitIngest - Tukar repo Git kepada prompt LLM
// @name:tl      GitIngest - I-convert ang Git repo sa LLM prompt
// @name:tr      GitIngest - Git deposunu LLM prompt'una dönüştür
// @name:nl      GitIngest - Zet elke Git repo om naar LLM prompt
// @name:sv      GitIngest - Förvandla Git repo till LLM prompt
// @name:da      GitIngest - Omdann Git repo til LLM prompt
// @name:no      GitIngest - Gjør Git repo til LLM prompt
// @name:fi      GitIngest - Muuta Git repo LLM promptiksi
// @name:pl      GitIngest - Przekształć repo Git w prompt LLM
// @name:cs      GitIngest - Převést Git repo na LLM prompt
// @name:sk      GitIngest - Premeniť Git repo na LLM prompt
// @name:hu      GitIngest - Git repo átalakítása LLM prompttá
// @name:ro      GitIngest - Transformă repo Git în prompt LLM
// @name:bg      GitIngest - Превърни Git хранилище в LLM подкана
// @name:hr      GitIngest - Pretvori Git repo u LLM prompt
// @name:sl      GitIngest - Pretvori Git repo v LLM prompt
// @name:et      GitIngest - Muuda Git repo LLM promptiks
// @name:lv      GitIngest - Pārveidot Git repo par LLM uzvedni
// @name:lt      GitIngest - Paversti Git repo į LLM raginimą
// @name:uk      GitIngest - Перетворити Git репозиторій на LLM промпт
// @name:be      GitIngest - Ператварыць Git рэпазіторый у LLM промпт
// @name:mk      GitIngest - Претвори Git репозиториум во LLM промпт
// @name:sq      GitIngest - Kthej repo Git në prompt LLM
// @name:mt      GitIngest - Ibdel repo Git għal prompt LLM
// @name:eu      GitIngest - Git errepositoriorik LLM gonbitean bihurtu
// @name:ca      GitIngest - Converteix qualsevol repo Git en prompt LLM
// @name:gl      GitIngest - Converter calquera repo Git en prompt LLM
// @name:cy      GitIngest - Troi unrhyw repo Git yn anogaeth LLM
// @name:ga      GitIngest - Tiontaigh stór Git ar bith go pras LLM
// @name:is      GitIngest - Breyta Git geymslu í LLM kvaðningu
// @name:fo      GitIngest - Broyt Git goymslu til LLM tilmæli
// @name:gd      GitIngest - Atharraich stòr Git gu brosnachadh LLM
// @name:br      GitIngest - Treiñ ur maven Git d'ur prompt LLM
// @name:kw      GitIngest - Chaunjya repo Git dhe prompt LLM
// @name:lb      GitIngest - Git Repository an LLM Prompt ëmwandelen
// @namespace    https://github.com/lcandy2/gitingest-extension
// @version      1.0.1
// @description  Turn any Git repository into a prompt-friendly text ingest for LLMs. By replacing hub with ingest to access a corresponding digest.
// @description:zh-CN 将任何Git仓库转换为LLM友好的文本摘要。通过将hub替换为ingest来访问相应的摘要。
// @description:zh-TW 將任何Git倉庫轉換為LLM友好的文本摘要。通過將hub替換為ingest來訪問相應的摘要。
// @description:ja 任意のGitリポジトリをLLMフレンドリーなテキスト要約に変換します。hubをingestに置き換えて対応するダイジェストにアクセスします。
// @description:ko 모든 Git 저장소를 LLM 친화적인 텍스트 요약으로 변환합니다. hub를 ingest로 바꿔 해당 다이제스트에 액세스합니다.
// @description:es Convierte cualquier repositorio Git en un resumen de texto amigable para LLMs. Reemplaza hub con ingest para acceder al resumen correspondiente.
// @description:fr Transforme n'importe quel dépôt Git en résumé textuel adapté aux LLMs. Remplace hub par ingest pour accéder au résumé correspondant.
// @description:de Wandelt jedes Git-Repository in eine LLM-freundliche Textzusammenfassung um. Ersetzt hub durch ingest, um auf die entsprechende Zusammenfassung zuzugreifen.
// @description:it Trasforma qualsiasi repository Git in un riassunto testuale adatto agli LLM. Sostituisce hub con ingest per accedere al riassunto corrispondente.
// @description:pt Transforma qualquer repositório Git em um resumo de texto amigável para LLMs. Substitui hub por ingest para acessar o resumo correspondente.
// @description:ru Превращает любой Git-репозиторий в дружественную для LLM текстовую сводку. Заменяет hub на ingest для доступа к соответствующему дайджесту.
// @description:ar تحويل أي مستودع Git إلى ملخص نصي مناسب لنماذج اللغة الكبيرة. يستبدل hub بـ ingest للوصول إلى الملخص المقابل.
// @description:hi किसी भी Git रिपॉजिटरी को LLM-अनुकूल टेक्स्ट सारांश में बदलें। संबंधित डाइजेस्ट तक पहुंचने के लिए hub को ingest से बदलें।
// @description:th แปลงที่เก็บ Git ใดๆ เป็นข้อความสรุปที่เหมาะสำหรับ LLM โดยแทนที่ hub ด้วย ingest เพื่อเข้าถึงสรุปที่สอดคล้องกัน
// @description:vi Chuyển đổi bất kỳ kho Git nào thành tóm tắt văn bản thân thiện với LLM. Thay thế hub bằng ingest để truy cập tóm tắt tương ứng.
// @description:id Mengubah repositori Git apa pun menjadi ringkasan teks yang ramah LLM. Mengganti hub dengan ingest untuk mengakses ringkasan yang sesuai.
// @description:ms Tukar mana-mana repositori Git kepada ringkasan teks mesra LLM. Gantikan hub dengan ingest untuk mengakses ringkasan yang berkaitan.
// @description:tl I-convert ang anumang Git repository sa LLM-friendly na text summary. Palitan ang hub ng ingest para ma-access ang kaukulang digest.
// @description:tr Herhangi bir Git deposunu LLM dostu metin özetine dönüştürür. İlgili özete erişmek için hub'ı ingest ile değiştirir.
// @description:nl Zet elke Git-repository om naar een LLM-vriendelijke tekstsamenvatting. Vervangt hub door ingest om toegang te krijgen tot de bijbehorende samenvatting.
// @description:sv Förvandla vilket Git-förråd som helst till en LLM-vänlig textsammanfattning. Ersätter hub med ingest för att komma åt motsvarande sammandrag.
// @description:da Omdanner ethvert Git-repository til et LLM-venligt tekstresumé. Erstatter hub med ingest for at få adgang til det tilsvarende resumé.
// @description:no Gjør ethvert Git-repository om til et LLM-vennlig tekstsammendrag. Erstatter hub med ingest for å få tilgang til tilsvarende sammendrag.
// @description:fi Muuttaa minkä tahansa Git-arkiston LLM-ystävälliseksi tekstiyhteenvedoksi. Korvaa hub sanalla ingest päästäksesi vastaavaan tiivistelmään.
// @description:pl Przekształca dowolne repozytorium Git w przyjazne dla LLM streszczenie tekstowe. Zastępuje hub słowem ingest, aby uzyskać dostęp do odpowiedniego streszczenia.
// @description:cs Převede libovolný Git repozitář na LLM-přátelský textový souhrn. Nahrazuje hub slovem ingest pro přístup k odpovídajícímu souhrnu.
// @description:sk Prevedie akýkoľvek Git repozitár na LLM-priateľský textový súhrn. Nahrádza hub slovom ingest pre prístup k príslušnému súhrnu.
// @description:hu Bármely Git repozitóriumot LLM-barát szöveges összefoglalóvá alakít. A hub szót ingest-re cseréli a megfelelő összefoglaló eléréséhez.
// @description:ro Transformă orice depozit Git într-un rezumat text prietenos cu LLM. Înlocuiește hub cu ingest pentru a accesa rezumatul corespunzător.
// @description:bg Превръща всяко Git хранилище в LLM-приятелско текстово резюме. Заменя hub с ingest за достъп до съответното резюме.
// @description:hr Pretvara bilo koji Git repozitorij u LLM-prijazan tekstni sažetak. Zamjenjuje hub s ingest za pristup odgovarajućem sažetku.
// @description:sl Pretvori kateri koli Git repozitorij v LLM-prijazen besedilni povzetek. Zamenja hub z ingest za dostop do ustreznega povzetka.
// @description:et Muudab iga Git hoidla LLM-sõbralikuks tekstikokkuvõtteks. Asendab hub sõnaga ingest vastavale kokkuvõttele ligipääsuks.
// @description:lv Pārveido jebkuru Git krātuvi par LLM draudzīgu teksta kopsavilkumu. Aizstāj hub ar ingest, lai piekļūtu atbilstošajam kopsavilkumam.
// @description:lt Paverčia bet kurį Git saugyklą į LLM palankų teksto santrauką. Pakeičia hub į ingest, kad galėtų pasiekti atitinkamą santrauką.
// @description:uk Перетворює будь-який Git репозиторій на дружній до LLM текстовий підсумок. Замінює hub на ingest для доступу до відповідного підсумку.
// @description:be Ператварае любы Git рэпазіторый у сяброўскую для LLM тэкставую зводку. Замяняе hub на ingest для доступу да адпаведнай зводкі.
// @description:mk Претвора било кој Git репозиториум во LLM пријателски текстуален резиме. Ја заменува hub со ingest за пристап до соодветниот резиме.
// @description:sq Kthen çdo depo Git në një përmbledhje teksti miqësore për LLM. Zëvendëson hub me ingest për të hyrë në përmbledhjen përkatëse.
// @description:mt Jibdel kwalunkwe repożitorju Git f'sommarju ta' test li jaqbel ma' LLM. Jibdel hub b'ingest biex jaċċessa s-sommarju korrispondenti.
// @description:eu Edozein Git errepositoriorik LLM-rekin adiskidetasun duen testu laburpen bihurtzen du. hub ingest-ekin ordezkatzen du dagokion laburpena atzitzeko.
// @description:ca Converteix qualsevol repositori Git en un resum de text amigable per a LLMs. Substitueix hub per ingest per accedir al resum corresponent.
// @description:gl Converte calquera repositorio Git nun resumo de texto amigable para LLMs. Substitúe hub por ingest para acceder ao resumo correspondente.
// @description:cy Yn troi unrhyw storfa Git yn grynodeb testun sy'n gyfeillgar i LLMs. Yn disodli hub gydag ingest i gael mynediad at y crynodeb cyfatebol.
// @description:ga Tiontaíonn sé stór Git ar bith go achoimre téacs a bhfuil LLM-chairdiúil. Cuireann sé ingest in ionad hub chun rochtain a fháil ar an achoimre chomhfhreagrach.
// @description:is Breytir hvaða Git geymslu sem er í LLM-vænlegt textasamantekt. Skiptir út hub fyrir ingest til að fá aðgang að samsvarandi samantekt.
// @description:fo Broytir hvørja Git goymslu sum helst í LLM-vinaliga tekstsamantekt. Skiftir hub við ingest fyri at fáa atgongd til viðkomandi samantekt.
// @description:gd Atharraichidh e stòr Git sam bith gu geàrr-chunntas teacsa a tha càirdeil do LLM. Cuiridh e ingest an àite hub gus faighinn chun a' gheàrr-chunntais fhreagarraich.
// @description:br Treiñ a ra ur maven Git bennak d'ur berradenn destenn a zo mignoned gant LLM. Erlec'hiañ a ra hub gant ingest evit tizhout ar berradenn kenglotus.
// @description:kw Chaunjya kres Git pyth yw dhe verkskrif test a yw kowethek dhe LLM. Chaunjya hub dhe ingest rag hedhas an verkskrif kehevelek.
// @description:lb Wandelt all Git Repository an eng LLM-frëndlech Text Zesummefaassung ëm. Ersat hub mat ingest fir op déi entspriechend Zesummefaassung ze kommen.
// @icon       data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACEUExURUxpcRgWFhsYGBgWFhcWFh8WFhoYGBgWFiUlJRcVFRkWFhgVFRgWFhgVFRsWFhgWFigeHhkWFv////////////r6+h4eHv///xcVFfLx8SMhIUNCQpSTk/r6+jY0NCknJ97e3ru7u+fn51BOTsPCwqGgoISDg6empmpoaK2srNDQ0FhXV3eXcCcAAAAXdFJOUwCBIZXMGP70BuRH2Ze/LpIMUunHkpQR34sfygAAAVpJREFUOMt1U+magjAMDAVb5BDU3W25b9T1/d9vaYpQKDs/rF9nSNJkArDA9ezQZ8wPbc8FE6eAiQUsOO1o19JolFibKCdHGHC0IJezOMD5snx/yE+KOYYr42fPSufSZyazqDoseTPw4lGJNOu6LBXVUPBG3lqYAOv/5ZwnNUfUifzBt8gkgfgINmjxOpgqUA147QWNaocLniqq3QsSVbQHNp45N/BAwoYQz9oUJEiE4GMGfoBSMj5gjeWRIMMqleD/CAzUHFqTLyjOA5zjNnwa4UCEZ2YK3khEcBXHjVBtEFeIZ6+NxYbPqWp1DLKV42t6Ujn2ydyiPi9nX0TTNAkVVZ/gozsl6FbrktkwaVvL2TRK0C8Ca7Hck7f5OBT6FFbLATkL2ugV0tm0RLM9fedDvhWstl8Wp9AFDjFX7yOY/lJrv8AkYuz7fuP8dv9izCYH+x3/LBnj9fYPBTpJDNzX+7cAAAAASUVORK5CYII=
// @author       coderamp-labs(lcandy2), aspen138(using Claude Code)
// @match        *://*.github.com/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @require      https://unpkg.com/react@18/umd/react.production.min.js
// @require      https://unpkg.com/react-dom@18/umd/react-dom.production.min.js
// @homepageURL  https://github.com/lcandy2/gitingest-extension
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Storage helpers using Tampermonkey's GM API
    const storage = {
        async getItem(key) {
            return GM_getValue(key, null);
        },
        async setItem(key, value) {
            GM_setValue(key, value);
        }
    };

    // Throttle function to limit the rate of execution
    const throttle = (func, limit) => {
        let inThrottle;
        return function(...args) {
            if (!inThrottle) {
                func.apply(this, args);
                inThrottle = true;
                setTimeout(() => inThrottle = false, limit);
            }
        }
    };

    // Page Observer Class
    class PageObserver {
        constructor(callback) {
            this.callback = throttle(callback, 250);
            this.setupObservers();
            this.setupNavigationEvents();
        }

        setupObservers() {
            // Main content observer
            this.observer = new MutationObserver((mutations) => {
                for (const mutation of mutations) {
                    if (mutation.type === 'childList') {
                        this.callback();
                        break;
                    }
                }
            });

            // Observe initial container if it exists
            this.observeMainContainer();

            // Watch for container changes
            this.bodyObserver = new MutationObserver((mutations) => {
                for (const mutation of mutations) {
                    if (mutation.type === 'childList') {
                        this.observeMainContainer();
                    }
                }
            });

            this.bodyObserver.observe(document.body, { childList: true });
        }

        observeMainContainer() {
            const mainContainer = document.querySelector('#js-repo-pjax-container');
            if (mainContainer && !this.observer.takeRecords().length) {
                this.observer.observe(mainContainer, {
                    childList: true,
                    subtree: true
                });
            }
        }

        setupNavigationEvents() {
            window.addEventListener('popstate', this.callback);
            window.addEventListener('pushstate', this.callback);
            window.addEventListener('replacestate', this.callback);
        }

        disconnect() {
            this.observer.disconnect();
            this.bodyObserver.disconnect();
            window.removeEventListener('popstate', this.callback);
            window.removeEventListener('pushstate', this.callback);
            window.removeEventListener('replacestate', this.callback);
        }
    }

    // Create GitIngest Button
    async function createGitIngestButton() {
        // Add custom styles
        const style = document.createElement('style');
        style.textContent = `
            @media (max-width: 1200px) {
                .gitingest-text-full {
                    display: none !important;
                }
                .gitingest-text-short {
                    display: inline !important;
                }
            }
            @media (min-width: 1201px) {
                .gitingest-text-full {
                    display: inline !important;
                }
                .gitingest-text-short {
                    display: none !important;
                }
            }
        `;
        if (!document.querySelector('#gitingest-styles')) {
            style.id = 'gitingest-styles';
            document.head.appendChild(style);
        }

        // Create button container
        const li = document.createElement('li');

        // Create link with GitHub's button style
        const link = document.createElement('a');
        link.className = 'btn-sm btn';
        link.id = 'gitingest_btn';
        link.setAttribute('aria-describedby', 'gitingest_tooltip');

        // Get custom base URL and window preference from storage
        const baseUrl = await storage.getItem('baseUrl') || 'gitingest.com';
        const openInNewWindow = await storage.getItem('openInNewWindow') || false;

        // Set URL
        link.href = window.location.href.replace('github.com', baseUrl);

        // Set target based on preference
        if (openInNewWindow) {
            link.target = '_blank';
            link.rel = 'noopener noreferrer';
        }

        const tooltipText = openInNewWindow
            ? 'Turn this to a LLM-friendly prompt in a new tab'
            : 'Turn this to a LLM-friendly prompt';

        // Create spans for different screen sizes
        const linkContent = `
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" class="octicon octicon-file-moved mr-2">
                <path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-3.5a.75.75 0 0 1 0-1.5h3.5a.25.25 0 0 0 .25-.25V4.664a.25.25 0 0 0-.073-.177l-2.914-2.914a.25.25 0 0 0-.177-.073H3.75a.25.25 0 0 0-.25.25v6.5a.75.75 0 0 1-1.5 0v-6.5Z"></path>
                <path d="m5.427 15.573 3.146-3.146a.25.25 0 0 0 0-.354L5.427 8.927A.25.25 0 0 0 5 9.104V11.5H.75a.75.75 0 0 0 0 1.5H5v2.396c0 .223.27.335.427.177Z"></path>
            </svg>
            <span class="gitingest-text-full">Open in GitIngest</span>
            <span class="gitingest-text-short">GitIngest</span>
        `;
        link.innerHTML = linkContent;

        // Create tooltip
        const tooltip = document.createElement('tool-tip');
        tooltip.setAttribute('for', 'gitingest_btn');
        tooltip.id = 'gitingest_tooltip';
        tooltip.setAttribute('popover', 'manual');
        tooltip.className = 'position-absolute sr-only';
        tooltip.setAttribute('role', 'tooltip');
        tooltip.textContent = tooltipText;

        // Add button and tooltip to container
        const div = document.createElement('div');
        div.className = 'float-left';
        div.appendChild(link);
        div.appendChild(tooltip);
        li.appendChild(div);
        li.id = 'git-ingest-button';

        return li;
    }

    function appendGitIngestButton(button) {
        const actionsList = document.querySelector('#repository-details-container > ul');
        if (actionsList) {
            if (actionsList.children.length >= 2) {
                actionsList.insertBefore(button, actionsList.children[1]);
            } else {
                actionsList.insertBefore(button, actionsList.firstChild);
            }
        }
    }

    // Main content script logic
    function main() {
        // Function to check if we're on a repository page
        const isRepoPage = () => window.location.pathname.match(/^\/[^/]+\/[^/]+/);

        // Function to manage button visibility
        let isCreatingButton = false;  // Flag to prevent concurrent button creation

        const manageButton = () => {
            const existingButton = document.getElementById('git-ingest-button');

            if (isRepoPage()) {
                if (!existingButton && !isCreatingButton) {
                    isCreatingButton = true;
                    // Handle async operation
                    createGitIngestButton()
                        .then(button => {
                            appendGitIngestButton(button);
                            isCreatingButton = false;
                        })
                        .catch(error => {
                            console.error(error);
                            isCreatingButton = false;
                        });
                }
            } else {
                existingButton?.remove();
            }
        };

        // Initial check
        manageButton();

        // Setup page observer
        new PageObserver(manageButton);
    }

    // Settings Menu Commands
    GM_registerMenuCommand('Configure Base URL', function() {
        const currentUrl = GM_getValue('baseUrl', 'gitingest.com');
        const newUrl = prompt('Enter the base URL for GitIngest service:', currentUrl);
        if (newUrl !== null && newUrl.trim() !== '') {
            GM_setValue('baseUrl', newUrl.trim());
            alert('Base URL updated! Refresh the page to see changes.');
        }
    });

    GM_registerMenuCommand('Toggle New Window', function() {
        const current = GM_getValue('openInNewWindow', false);
        GM_setValue('openInNewWindow', !current);
        alert(`Open in new window: ${!current ? 'Enabled' : 'Disabled'}. Refresh the page to see changes.`);
    });

    GM_registerMenuCommand('Reset Settings', function() {
        if (confirm('Reset all settings to default?')) {
            GM_setValue('baseUrl', 'gitingest.com');
            GM_setValue('openInNewWindow', false);
            alert('Settings reset! Refresh the page to see changes.');
        }
    });

    // Start the script
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', main);
    } else {
        main();
    }

})();
长期地址
遇到问题?请前往 GitHub 提 Issues。