Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
gh-safe-repo — Python CLI जो GitHub रिपॉजिटरीज़ को सुरक्षित डिफॉल्ट्स के साथ बनाता है — शाखा सुरक्षा, Dependabot, गुप्त स्कैनिंग, और प्री-फ्लाइट सुरक्षा स्कैनिंग — स्वचालित रूप से लागू। | Kitploit
उपकरण/GitHubGitHub/ariesq/gh-safe-repo
सामान्य उपयोगिताएँभेद्यता स्कैनरस्क्रिप्टिंग और स्वचालनकॉन्फ़िगरेशन ऑडिटिंगक्लाउड सुरक्षाDevSecOpsसीक्रेट डिटेक्शन
GitHubariesq/gh-safe-repo

gh-safe-repo

Python CLI जो GitHub रिपॉजिटरीज़ को सुरक्षित डिफॉल्ट्स के साथ बनाता है — शाखा सुरक्षा, Dependabot, गुप्त स्कैनिंग, और प्री-फ्लाइट सुरक्षा स्कैनिंग — स्वचालित रूप से लागू।

रिपॉजिटरी देखें
383520 दिन पहलेKitploit द्वारा समीक्षित

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

gh-safe-repo

सुरक्षित डिफ़ॉल्ट सेटिंग्स के साथ स्वचालित रूप से GitHub रिपॉजिटरी बनाएँ। यह निर्माण के बाद की पाँच मिनट की सेटिंग्स चेकलिस्ट को एक ही कमांड से बदल देता है।``` gh-safe-repo create <owner/repo>

root@kitploit:~
Branch protection, immutable tags, Dependabot, restricted Actions permissions, secret scanning with push protection, and disabled wiki and projects — all configured before you write your first line of code.  

gh-safe-repo भारी विकास के दौर से गुजर रहा है। यह सुरक्षित डिफ़ॉल्ट के साथ एक नया रेपो बनाने के उपयोग-मामले के लिए अच्छा काम करता है। मैं CLI विकल्पों को उपयोगकर्ताओं की अपेक्षाओं के अनुरूप बेहतर बनाने पर काम कर रहा हूँ। तब तक ब्रेकिंग चेंज की उम्मीद करें जब तक हम उस बिंदु पर नहीं पहुँच जाते जहाँ मैं रिलीज़ कर रहा हूँ और CI/CD को सही ढंग से सेट कर लिया है। ✌️

---

## विषयसूची

- [क्यों](#why)
- [यह क्या बदलता है](#what-it-changes)
- [आवश्यकताएँ](#requirements)
- [स्थापना](#installation)
- [त्वरित प्रारंभ](#quick-start)
- [CLI संदर्भ](#cli-reference)
- [ड्राई रन / योजना आउटपुट](#dry-run--plan-output)
- [फिक्स मोड (मौजूदा रेपो का ऑडिट)](#fix-mode-audit-existing-repos)
- [रेपो मिररिंग (`--from`)](#mirroring-repos---from)
- [स्थानीय निर्देशिका से रेपो बनाना (`--local`)](#creating-a-repo-from-a-local-directory---local)
- [प्री-फ्लाइट सुरक्षा स्कैनर](#pre-flight-security-scanner)
  - [स्टैंडअलोन स्कैन](#standalone-scan)
  - [फाल्स पॉजिटिव को दबाना](#suppressing-false-positives)
- [कॉन्फ़िगरेशन](#configuration)
- [GitHub योजना सीमाएँ](#github-plan-limitations)
- [यह कैसे काम करता है](#how-it-works)
- [विकास](#development)

---

## क्यों

GitHub की डिफ़ॉल्ट रिपॉजिटरी सेटिंग्स खोज योग्यता और लचीलेपन के लिए अनुकूलित हैं, सुरक्षा के लिए नहीं। हर नया रेपो निम्नलिखित के साथ आता है:

- विकी और प्रोजेक्ट सक्षम (हमले की सतह, भले ही उपयोग न किए गए हों)
- मर्ज कमिट की अनुमति (अव्यवस्थित इतिहास, लेकिन मुख्य चिंता नहीं)
- कोई ब्रांच प्रोटेक्शन नहीं (लिखने की पहुँच वाला कोई भी सीधे `main` पर पुश कर सकता है)
- कोई Dependabot अलर्ट नहीं
- रिपॉजिटरी में लिखने की अनुमति के साथ GitHub Actions
- Actions को पुल अनुरोध स्वीकृत करने की अनुमति

इन सबको मैन्युअली ठीक करने में प्रति रेपो मिनट लगते हैं और भूलना आसान है। `gh-safe-repo` एक बार में राय आधारित लेकिन व्यावहारिक डिफ़ॉल्ट का सेट लागू करता है, एक योजना पूर्वावलोकन के साथ ताकि आपको पता हो कि कुछ भी बदलने से पहले क्या बदलेगा।

---

## यह क्या बदलता है

### रिपॉजिटरी सेटिंग्स

| सेटिंग | GitHub डिफ़ॉल्ट | सुरक्षित डिफ़ॉल्ट | नोट्स |
|---|---|---|---|
| दृश्यता | सार्वजनिक | **निजी** | ओवरराइड करने के लिए `--public` पास करें |
| विकी | सक्षम | **अक्षम** | |
| प्रोजेक्ट | सक्षम | **अक्षम** | |
| मुद्दे | सक्षम | सक्षम | |
| मर्ज पर शाखा हटाएँ | बंद | बंद | ऑटो-सफाई के लिए कॉन्फ़िगर में `true` पर सेट करें |
| मर्ज कमिट की अनुमति | चालू | चालू | केवल स्क्वैश के लिए कॉन्फ़िगर में `false` पर सेट करें |
| स्क्वैश मर्ज की अनुमति | चालू | चालू | |
| रीबेस मर्ज की अनुमति | चालू | चालू | |

### GitHub Actions

| सेटिंग | GitHub डिफ़ॉल्ट | सुरक्षित डिफ़ॉल्ट |
|---|---|---|
| अनुमत Actions | सभी | **चयनित** (GitHub-स्वामित्व वाले + सत्यापित निर्माता; अनुकूलन योग्य) |
| डिफ़ॉल्ट कार्यप्रवाह अनुमतियाँ | पढ़ें/लिखें | **केवल-पढ़ें** |
| Actions PR स्वीकृति दे सकते हैं | हाँ | **नहीं** |
| SHA पिनिंग आवश्यक है | नहीं | **हाँ** (कार्यप्रवाह को बदलने योग्य टैग के बजाय कमिट SHA पर पिन होना चाहिए) |
| फ़ोर्क PR स्वीकृति नीति | GitHub पर नए पहली बार के योगदानकर्ता | **सभी बाहरी योगदानकर्ता** — फ़ोर्क PR कार्यप्रवाह CI चलाने से पहले स्वीकृति की आवश्यकता होती है। विकल्प: केवल ब्रांड-नए GitHub खाते (GitHub डिफ़ॉल्ट), पहली बार रेपो योगदानकर्ता, या सभी फ़ोर्क PR (सबसे सुरक्षित) |

### ब्रांच प्रोटेक्शन (सार्वजनिक रेपो, या भुगतान योजना पर कोई भी रेपो)

| नियम | मान |
|---|---|
| मर्ज से पहले पुल अनुरोध आवश्यक है | हाँ |
| आवश्यक स्वीकृत समीक्षाएँ | 1 |
| पुश पर पुरानी समीक्षाएँ खारिज करें | हाँ |
| बातचीत समाधान आवश्यक है | हाँ |
| फ़ोर्स पुश की अनुमति | नहीं |
| शाखा हटाने की अनुमति | नहीं |
| प्रशासकों पर लागू करें | नहीं (मालिक टूलिंग को पुश करने की अनुमति देता है) |

ब्रांच प्रोटेक्शन डिफ़ॉल्ट रूप से **Rulesets API** के माध्यम से लागू किया जाता है (`use_rulesets = true`): एक एकल `gh-safe-repo defaults` ruleset प्रत्येक कॉन्फ़िगर की गई शाखा को कवर करता है और "प्रशासक बायपास कर सकते हैं" को क्लासिक `enforce_admins` फ़्लैग के बजाय बायपास एक्टर के माध्यम से व्यक्त करता है। क्लासिक प्रति-शाखा पथ के लिए `use_rulesets = false` सेट करें (एक रिलीज़ चक्र के लिए रखा गया)।

**क्लासिक प्रोटेक्शन से मौजूदा रेपो को स्थानांतरित करना:** यदि `fix` किसी रेपो पर क्लासिक ब्रांच प्रोटेक्शन पाता है, तो वह इसे ruleset में बदलने से इनकार करता है जब तक कि आप `--migrate-branch-protection` पास न करें। केवल-क्लासिक नियमों का इस टूल द्वारा बनाए गए ruleset में कोई समकक्ष नहीं है और वे चुपचाप छोड़ दिए जाएंगे — ज्ञात अंतराल:

- `required_status_checks` — आवश्यक CI जाँचें ruleset बॉडी में मॉडल नहीं की गई हैं।
- `restrictions` (उपयोगकर्ता/टीम द्वारा पुश प्रतिबंध) — Rulesets इसे बायपास एक्टर्स के माध्यम से अलग तरह से मॉडल करता है; 1:1 मैप नहीं।
- प्रति-शाखा भिन्नता — एक एकल साझा-शर्त ruleset `master` बनाम `main` के लिए अलग-अलग नियम व्यक्त नहीं कर सकता।

फ़्लैग के साथ, `fix` ruleset बनाता/अपडेट करता है और फिर प्रत्येक शाखा पर क्लासिक प्रोटेक्शन हटा देता है ताकि दो परतें स्टैक न हों।

### टैग प्रोटेक्शन (सार्वजनिक रेपो, या भुगतान योजना पर कोई भी रेपो)

टैग प्रोटेक्शन सभी टैग (`*` डिफ़ॉल्ट, `protected_tags` के माध्यम से कॉन्फ़िगर करने योग्य) को लक्षित करते हुए एक GitHub Ruleset बनाता है। निम्नलिखित नियम लागू किए जाते हैं:

| Ruleset नियम | लागू? | नोट्स |
|---|---|---|
| निर्माण प्रतिबंधित करें | नहीं | |
| **अपडेट प्रतिबंधित करें** | **हाँ** | टैग को पुनर्लेखन / फ़ोर्स-पुश से रोकता है |
| **हटाने प्रतिबंधित करें** | **हाँ** | टैग के `git push --delete` को रोकता है |
| रैखिक इतिहास आवश्यक है | नहीं | |
| डिप्लॉयमेंट सफल होना आवश्यक है | नहीं | |
| हस्ताक्षरित कमिट आवश्यक है | नहीं | |
| स्थिति जाँच पास होना आवश्यक है | नहीं | |
| फ़ोर्स पुश ब्लॉक करें | नहीं | |

रिपॉजिटरी प्रशासक बायपास सूची में हैं (ब्रांच प्रोटेक्शन `enforce_admins = false` डिफ़ॉल्ट के अनुरूप)। केवल सार्वजनिक रेपो या भुगतान GitHub योजनाओं पर काम करता है (ब्रांच प्रोटेक्शन के समान प्रतिबंध)। मुफ्त-योजना निजी रेपो के लिए योजना आउटपुट में इसे छोड़ दिया जाएगा।

### सुरक्षा

| सुविधा | व्यवहार |
|---|---|
| Dependabot अलर्ट | सक्षम (सार्वजनिक रेपो / भुगतान योजनाएँ) |
| Dependabot सुरक्षा अपडेट | सक्षम (कमजोर निर्भरता के लिए PR स्वचालित रूप से खोलता है) |
| सीक्रेट स्कैनिंग | सार्वजनिक रेपो पर स्वचालित; निजी भुगतान योजनाओं पर सक्षम |
| पुश प्रोटेक्शन | सक्षम (समर्थित सीक्रेट वाले कमिट को ब्लॉक करता है) |
| निजी भेद्यता रिपोर्टिंग | सक्षम (सुरक्षा शोधकर्ताओं को निजी रूप से रिपोर्ट करने देता है) |
| निर्भरता ग्राफ़ | सार्वजनिक रेपो पर स्वचालित; निजी के लिए कोई REST API नहीं (केवल UI) |

---

## आवश्यकताएँ

- Python 3.8+
- [`gh` CLI](https://cli.github.com/) स्थापित और प्रमाणित (`gh auth login`), **या** आपके वातावरण में `GITHUB_TOKEN` सेट
- `--local` / `--from` के लिए (जो कोड पुश या क्लोन करता है): आपके सामान्य git क्रेडेंशियल सेट होने चाहिए — या तो `ssh-agent` में लोड की गई SSH कुंजी (जब `gh config get git_protocol` `ssh` हो) या HTTPS क्रेडेंशियल हेल्पर (`gh auth setup-git` स्वचालित रूप से एक कॉन्फ़िगर करता है)। OAuth टोकन git push के लिए **नहीं** उपयोग किया जाता है, इसलिए वर्कफ़्लो फ़ाइलें (`.github/workflows/*`) बिना OAuth `workflow` स्कोप की आवश्यकता के पुश होती हैं।
- [`uv`](https://docs.astral.sh/uv/) स्रोत से स्थापना के लिए (अनुशंसित)
- `truffleHog` v3 (वैकल्पिक — प्री-फ़्लाइट स्कैनर द्वारा उपयोग किया जाता है; PATH से स्वचालित रूप से पता लगाया जाता है, या podman/docker के माध्यम से चलाया जाता है; यदि उपलब्ध नहीं है तो regex पर वापस आ जाता है)

---

## स्थापना

### स्रोत से uv के साथ (अनुशंसित)```bash
git clone https://github.com/your-username/gh-safe-repo
cd gh-safe-repo
uv tool install .

यह gh-safe-repo को uv के टूल वातावरण में स्थापित करता है और इसे आपके PATH में जोड़ता है।

बिना स्थापित किए सीधे चलाएं```bash

git clone https://github.com/your-username/gh-safe-repo cd gh-safe-repo uv sync # creates .venv ./gh-safe-repo create <owner/repo>

root@kitploit:~
### सत्यापन```bash
gh-safe-repo --help

त्वरित आरंभ```bash

Create a private repo with all safe defaults

gh-safe-repo create <owner/repo>

Preview what would happen — no changes made

gh-safe-repo create <owner/repo> --dry-run

Create a public repo (branch protection + security scanning applied)

gh-safe-repo create <owner/repo> --public

Mirror an existing repo into a new private repo (with pre-flight scan)

gh-safe-repo create <owner/repo> --from <owner/source>

Mirror a private repo to a new public repo (with pre-flight scan)

gh-safe-repo create <owner/pub> --from <owner/priv> --public

Create a repo from a local directory (with pre-flight scan)

gh-safe-repo create <owner/repo> --local ~/projects/myapp

Same, but make it public (branch protection applied before push)

gh-safe-repo create <owner/repo> --local ~/projects/myapp --public

Audit an existing repo and apply any missing safe defaults

gh-safe-repo fix <owner/repo>

Audit without making changes

gh-safe-repo fix <owner/repo> --dry-run

Apply fixes without confirmation prompt (scripting/batch use)

gh-safe-repo fix <owner/repo> --yes

Scan a local repo for secrets before pushing anywhere

gh-safe-repo scan . gh-safe-repo scan ~/projects/myapp

root@kitploit:~
## CLI संदर्भ```
gh-safe-repo create <owner/repo> [OPTIONS]
gh-safe-repo fix <owner/repo> [OPTIONS]
gh-safe-repo scan <path> [OPTIONS]

GitHub के साथ इंटरैक्ट करने वाले सभी कमांड्स के लिए owner/repo फ़ॉर्मेट आवश्यक है (उदा. myuser/my-repo)। create के लिए, मालिक (owner) आपके प्रमाणित GitHub खाते के विरुद्ध मान्य किया जाता है ताकि मल्टी-अकाउंट सिस्टम पर गलतियों से बचा जा सके। fix के लिए, इसके बजाय लक्ष्य रिपो पर व्यवस्थापक (admin) अनुमतियाँ आवश्यक हैं, जिससे आप उन रिपो को ठीक कर सकते हैं जो संगठनों या अन्य खातों के स्वामित्व में हैं जहाँ आपके पास व्यवस्थापक पहुँच है।

create — एक नई रिपो बनाएँ

विकल्पविवरण
--publicसार्वजनिक रिपो के रूप में बनाएँ (डिफ़ॉल्ट: निजी)
--local PATHस्थानीय git रिपॉजिटरी से नई रिपो में कोड पुश करें। पहले प्री-फ़्लाइट स्कैन चलाता है। --from के साथ परस्पर अनन्य।
--from OWNER/REPOमौजूदा रिपो से नई रिपो में कोड मिरर करें। प्री-फ़्लाइट स्कैन चलाता है। --local के साथ परस्पर अनन्य।
--yes / -yपुष्टि संकेत छोड़ें और तुरंत लागू करें (स्क्रिप्टिंग/बैच उपयोग के लिए)
--dry-runकोई बदलाव किए बिना योजना प्रिंट करें
--jsonANSI तालिका के बजाय योजना को stdout पर JSON के रूप में भेजें
--config [PATH]कॉन्फ़िग फ़ाइल का पथ; बेयर --config केवल बिल्ट-इन डिफ़ॉल्ट का उपयोग करता है
--debugप्रत्येक API कॉल और प्रतिक्रिया प्रिंट करें

एक सादा create (बिना --local/--from) रिपो को आरंभ करता है ताकि ब्रैंच प्रोटेक्शन के लिए एक डिफ़ॉल्ट ब्रैंच मौजूद रहे, फिर ऑटो-जनरेटेड README.md को हटा देता है ताकि नई रिपो साफ़ शुरू हो। README को बनाए रखने के लिए कॉन्फ़िग में auto_init = true सेट करें। --local/--from आपका अपना इतिहास पुश करते हैं और कभी README नहीं बनाते।

fix — मौजूदा रिपो का ऑडिट और सुधार करें

विकल्पविवरण
--yes / -yपुष्टि संकेत छोड़ें और तुरंत लागू करें (स्क्रिप्टिंग/बैच उपयोग के लिए)
--dry-runबदलाव लागू किए बिना सेटिंग्स अंतर दिखाएँ
--jsonANSI तालिका के बजाय योजना को stdout पर JSON के रूप में भेजें
--config [PATH]कॉन्फ़िग फ़ाइल का पथ; बेयर --config केवल बिल्ट-इन डिफ़ॉल्ट का उपयोग करता है
--debugप्रत्येक API कॉल और प्रतिक्रिया प्रिंट करें, साथ ही हल की गई रिपो पहचान (id, पूरा नाम, मालिक प्रकार)

scan — स्थानीय गुप्त स्कैनिंग

विकल्पविवरण
--config [PATH]कॉन्फ़िग फ़ाइल का पथ; बेयर --config केवल बिल्ट-इन डिफ़ॉल्ट का उपयोग करता है
--debugस्कैनर विवरण दिखाएँ

एग्ज़िट कोड 0 है यदि कोई क्रिटिकल फाइंडिंग नहीं है, 1 यदि क्रिटिकल पाए जाते हैं।


ड्राई रन / योजना आउटपुट

--dry-run बिल्कुल वही दिखाता है जो gh-safe-repo करेगा, बिना कोई बदलाव किए या API कॉल किए। वास्तविक रूप से चलाने से पहले इसका उपयोग करें। मशीन-पठनीय योजना आउटपुट के लिए --json के साथ संयोजित करें:```bash gh-safe-repo create <owner/repo> --dry-run --json gh-safe-repo fix <owner/repo> --dry-run --json

root@kitploit:~
जब `--json` सक्रिय होता है, तो योजना stdout पर एक JSON ऑब्जेक्ट के रूप में लिखी जाती है और अन्य सभी संदेश (प्रगति, चेतावनियाँ, "Dry run" फुटर) stderr पर जाते हैं, ताकि पाइपिंग या स्क्रिप्टिंग के लिए आउटपुट साफ रहे।```
$ gh-safe-repo create <owner/repo> --dry-run

  Plan for my-project (private)

  Category            Action  Setting                          Value
  ──────────────────────────────────────────────────────────────────
  Repository          ADD     repository                       my-project (private)
  Repository          ADD     has_wiki                         false
  Repository          ADD     has_projects                     false
  Actions             ADD     default_workflow_permissions     read
  Actions             ADD     can_approve_pull_request_reviews false
  Branch Protection   SKIP    branch_protection                Not available for private repos on free plan
  Security            SKIP    dependabot_alerts                Not available for private repos on free plan
  1 setting skipped (GitHub plan limitation).
  Dry run — no changes made.

कार्रवाई के रंग:

कार्रवाईअर्थ
ADD (हरा)नई सेटिंग लागू की जा रही है
UPDATE (पीला)मौजूदा सेटिंग बदली जा रही है (ऑडिट मोड)
DELETE (लाल)सेटिंग हटाई जा रही है
SKIP (मंद)कोई कार्रवाई आवश्यक नहीं — पहले से वांछित मान पर है, या आपकी योजना/दृश्यता संयोजन पर सुविधा अनुपलब्ध है

JSON आउटपुट (--json):```json { "changes": [ { "type": "add", "category": "repository", "key": "has_wiki", "old": null, "new": false, "reason": null }, { "type": "skip", "category": "branch_protection", "key": "branch_protection", "old": null, "new": null, "reason": "Not available for private repos on free plan" } ], "summary": { "add": 5, "skip": 2 } }

root@kitploit:~
`summary` में केवल वे प्रकार शामिल हैं जो योजना में मौजूद हैं। उपभोक्ताओं को सभी चार कुंजियों के मौजूद होने का अनुमान लगाने के बजाय `.get("delete", 0)` आदि का उपयोग करना चाहिए।

---

## फिक्स मोड (मौजूदा रिपॉजिटरी का ऑडिट)

`fix` मौजूदा रिपॉजिटरी की वर्तमान सेटिंग्स की तुलना सुरक्षित डिफॉल्ट्स से करता है और कोई भी सुधार लागू करता है। कोई गुप्त स्कैनिंग नहीं — `fix` पूरी तरह से रिपॉजिटरी सेटिंग्स के बारे में है।```bash
# See what's out of compliance
gh-safe-repo fix <owner/repo> --dry-run

# Apply missing safe defaults
gh-safe-repo fix <owner/repo>

# Apply without confirmation prompt (scripting/batch use)
gh-safe-repo fix <owner/repo> --yes

Fix mode:

  1. GitHub API के माध्यम से प्रत्येक सेटिंग का वर्तमान मान प्राप्त करता है
  2. वांछित सुरक्षित डिफ़ॉल्ट मानों से तुलना करता है
  3. एक योजना तालिका दिखाता है जिसमें बदली गई सेटिंग्स के लिए UPDATE और उन सेटिंग्स के लिए SKIP दिखाया जाता है जो पहले से वांछित मान पर हैं (no-op पहचान — यह कभी भी API कॉल नहीं करता जो कुछ भी नहीं बदलेगा)
  4. लागू करने से पहले पुष्टि माँगता है (--yes के साथ छोड़ें)

केवल वास्तविक परिवर्तन लागू किए जाते हैं — जो सेटिंग्स पहले से वांछित मान पर हैं, उन्हें SKIP के रूप में दिखाया जाता है और कोई API कॉल उत्पन्न नहीं होता।


रिपॉजिटरी मिरर करना (--from)

--from एक मौजूदा रिपॉजिटरी को सुरक्षित डिफ़ॉल्ट मानों के साथ एक नई रिपॉजिटरी में मिरर करता है। यह निजी और सार्वजनिक दोनों गंतव्यों के लिए काम करता है:```bash

Mirror into a new private repo (default)

gh-safe-repo create <owner/repo> --from <owner/source>

Mirror a private repo to a new public repo (riskiest operation — scanned thoroughly)

gh-safe-repo create <owner/pub> --from <owner/priv> --public

root@kitploit:~
**क्रमशः क्या होता है:**

1. `github.com` के लिए आपके git क्रेडेंशियल्स पहले से सत्यापित किए जाते हैं (SSH प्रोब जब `gh config get git_protocol` `ssh` हो; HTTPS विश्वसनीय है), ताकि किसी भी रिपो बनाने से पहले एक गुम कुंजी तेजी से विफल हो जाए।
2. स्रोत रिपो को स्थानीय रूप से क्लोन किया जाता है (पूर्ण क्लोन, कोई `--depth` नहीं, ताकि truffleHog पूरे कमिट इतिहास को चल सके)।
3. [प्री-फ्लाइट सुरक्षा स्कैनर](#pre-flight-security-scanner) स्थानीय क्लोन पर चलता है।
4. आप निष्कर्षों की समीक्षा करते हैं और पुष्टि (या रद्द) करते हैं।
5. एक नई रिपो बनाई जाती है (डिफ़ॉल्ट रूप से निजी, या `--public` के साथ सार्वजनिक)।
6. एक्शन अनुमतियाँ और सुरक्षा सेटिंग्स लागू की जाती हैं (Dependabot, गुप्त स्कैनिंग, पुश सुरक्षा)।
7. पूरा इतिहास मिरर किया जाता है: `git clone --mirror` + `git push --mirror`
8. ब्रांच और टैग सुरक्षा लागू की जाती है (कोड पुश के बाद, ताकि लक्ष्य ब्रांच मौजूद हो)।

यदि स्कैन कोई समस्या प्रकट करता है और आप रद्द करते हैं, तो GitHub पर कोई कोड कॉपी नहीं किया जाता है।

> **नोट:** `--from` स्रोत और गंतव्य दोनों के लिए `owner/repo` प्रारूप का उपयोग करता है।

---

## स्थानीय निर्देशिका से रिपो बनाना (`--local`)

`--local PATH`, `--from` का स्थानीय-से-GitHub समकक्ष है। यह एक नई GitHub रिपो बनाता है और स्थानीय git रिपॉजिटरी से कोड पुश करता है। `PATH` एक आरंभिक git रिपॉजिटरी होनी चाहिए (`git init` या क्लोन)।```bash
gh-safe-repo create <owner/repo> --local ~/projects/myapp
gh-safe-repo create <owner/repo> --local ~/projects/myapp --public

क्या होता है, क्रम में:

  1. github.com के लिए आपके git क्रेडेंशियल की पहले से जाँच की जाती है (SSH प्रोब जब gh config get git_protocol ssh हो; HTTPS विश्वसनीय है), इसलिए गुम कुंजी किसी भी रेपो बनने से पहले तुरंत विफल हो जाती है
  2. प्री-फ़्लाइट सुरक्षा स्कैनर स्थानीय निर्देशिका पर सीधे चलता है (क्लोन की आवश्यकता नहीं)
  3. आप निष्कर्षों की समीक्षा करते हैं और पुष्टि करते हैं (या रद्द करते हैं)
  4. एक नया रेपो बनाया जाता है, और क्रियाएँ अनुमतियाँ और सुरक्षा सेटिंग्स लागू की जाती हैं
  5. पूरा इतिहास push --all --tags (सभी शाखाएँ और टैग) के साथ पुश किया जाता है
  6. शाखा और टैग सुरक्षा लागू की जाती है (कोड पुश के बाद, ताकि लक्ष्य शाखा मौजूद हो)
  7. origin मूल स्थानीय रेपो में जोड़ा जाता है जो नए GitHub URL की ओर इंगित करता है, और वर्तमान शाखा का अपस्ट्रीम ट्रैकिंग कॉन्फ़िगर किया जाता है — ताकि git push और git pull बिना अतिरिक्त सेटअप के तुरंत काम करें।

--local और --from दोनों निजी और सार्वजनिक रेपो के लिए काम करते हैं। ये परस्पर अनन्य हैं।

स्थानीय डिफ़ॉल्ट शाखा (via git -C PATH symbolic-ref HEAD) का उपयोग शाखा सुरक्षा नियमों को लक्षित करने के लिए किया जाता है, ताकि सुरक्षा सही शाखा पर लागू हो, भले ही वह main न हो।

टिप: यदि आप बिना कुछ बनाए निष्कर्षों का निरीक्षण करना चाहते हैं तो पहले gh-safe-repo scan PATH चलाएँ।


प्री-फ़्लाइट सुरक्षा स्कैनर

स्कैनर स्थानीय रूप से चलता है और कोड को GitHub पर कभी नहीं भेजता है। इसे किसी भी पुश से पहले स्वतंत्र रूप से उपयोग करें, या यह --from और --local वर्कफ़्लो के भाग के रूप में स्वचालित रूप से चलता है।

स्वतंत्र स्कैन```bash

Scan the current directory

gh-safe-repo scan .

Scan an explicit path

gh-safe-repo scan ~/projects/myapp

root@kitploit:~
यदि कोई गंभीर निष्कर्ष नहीं हैं तो एग्ज़िट कोड `0` है, यदि गंभीर निष्कर्ष मिलते हैं तो `1` है — ताकि यह अन्य कमांडों के साथ साफ-सुथरे ढंग से जुड़ सके:```bash
gh-safe-repo scan . && git push

पूर्ण [pre_flight_scan] कॉन्फ़िग लागू होता है: banned_strings, max_file_size_mb, trufflehog_mode, आदि।

यह क्या पता लगाता है

श्रेणीगंभीरताउदाहरण
हार्डकोडेड रहस्यगंभीरAWS कुंजियाँ (AKIA…), GitHub टोकन (ghp_…, github_pat_…), निजी कुंजियाँ, डेटाबेस URL
प्रतिबंधित स्ट्रिंग्सगंभीरकोई भी शाब्दिक स्ट्रिंग जो आप कॉन्फ़िगर करते हैं (उपयोगकर्ता नाम, आंतरिक होस्टनाम, कोडनेम)
AI संदर्भ फ़ाइलेंगंभीरCLAUDE.md, AGENTS.md, .cursorrules, copilot-instructions.md, .cursor/ — इनमें आंतरिक डेव नोट्स हो सकते हैं; git इतिहास वर्तमान संस्करण से अधिक संवेदनशील हो सकता है
ईमेल पतेचेतावनीवर्किंग ट्री और git इतिहास में कोई भी [email protected] पैटर्न
बड़ी फ़ाइलेंचेतावनीकॉन्फ़िगर आकार सीमा से अधिक फ़ाइलें (डिफ़ॉल्ट: 100 MB)
TODO/FIXME टिप्पणियाँजानकारी# TODO, # FIXME, # HACK, # XXX

स्कैनर इंजन

gh-safe-repo स्वचालित रूप से तीन-चरणीय खोज श्रृंखला का उपयोग करके सर्वोत्तम उपलब्ध स्कैनर चुनता है:

  1. PATH पर truffleHog v3 — trufflehog --version चलाता है, सत्यापित करता है कि यह v3 है, और इसका उपयोग करता है। v2 इंस्टॉल या अपरिचित संस्करण एक चेतावनी प्रिंट करता है और चरण 2 पर जाता है।
  2. podman या docker — यदि कोई मूल truffleHog नहीं मिलता है, तो स्कैनर podman run या docker run का उपयोग करके एक कंटेनर (ghcr.io/trufflesecurity/trufflehog:latest) में truffleHog चलाता है, स्कैन पथ को उसी पूर्ण पथ पर केवल-पढ़ने के लिए माउंट करता है ताकि JSON आउटपुट पथ मूल रन के समान हों।
  3. Regex फ़ॉलबैक — यदि न तो मूल इंस्टॉल और न ही कंटेनर रनटाइम उपलब्ध है, तो एक चेतावनी प्रिंट होती है और इसके बजाय regex स्कैनर चलता है। यह ईमेल और TODO के लिए truffleHog के अतिरिक्त हमेशा चलता है, और अकेले key-ID पैटर्न को पकड़ता है जिन्हें truffleHog जानबूझकर छोड़ देता है (truffleHog को फ़ाइंडिंग फ़्लैग करने से पहले क्रेडेंशियल जोड़ी के दोनों हिस्सों की आवश्यकता होती है, जैसे AWS Key ID और Secret Access Key)।

चयनित स्कैनर "Running pre-flight security scan..." शीर्षक और योजना तालिका के SCAN प्रविष्टि में दिखाया गया है, उदाहरण के लिए:``` Running pre-flight security scan... (truffleHog v3.93.4) Running pre-flight security scan... (truffleHog via podman) Running pre-flight security scan... (regex only — see warning above)

root@kitploit:~
Environment variables respected by the container path: `CONTAINER_RUNTIME` to override runtime selection (e.g. `CONTAINER_RUNTIME=docker`), and `TRUFFLEHOG_IMAGE` to pin a specific image tag.

### podman या Docker के माध्यम से truffleHog चलाना (कोई स्थानीय इंस्टॉल नहीं)

कोई मैन्युअल सेटअप आवश्यक नहीं है। `gh-safe-repo` स्वचालित रूप से podman या docker का पता लगाता है (उपरोक्त चरण 2) और सही वॉल्यूम माउंट के साथ एक कंटेनर में truffleHog चलाता है। `CONTAINER_RUNTIME` और `TRUFFLEHOG_IMAGE` पर्यावरण चर का सम्मान किया जाता है।

एक शेल रैपर (`tools/trufflehog`) और एक `Containerfile` for building a pinned local image are provided in [`tools/`](https://github.com/ariesq/gh-safe-repo/blob/master/tools/README.md) for users who want container-based truffleHog available system-wide, or who need an air-gapped image.

### इंटरैक्टिव समीक्षा```
Pre-flight scan: my-private-project

  CRITICAL  my_private_project/config.py:12  AWS Access Key ID
            [redacted]

  WARNING   my_private_project/setup.py:3    Email address
            author_email="[email protected]"

  1 critical finding, 1 warning.

  Critical findings detected. Continue anyway? [y/N]:
  • गंभीर निष्कर्ष: डिफ़ॉल्ट रद्द (N) है। जारी रखने के लिए आपको स्पष्ट रूप से y टाइप करना होगा।
  • केवल चेतावनियाँ: डिफ़ॉल्ट जारी (Y) है। आगे बढ़ने के लिए Enter दबाएं या रद्द करने के लिए n टाइप करें।
  • कोई निष्कर्ष नहीं: स्कैन चुपचाप पूर्ण होता है और वर्कफ़्लो जारी रहता है।

गुप्त जानकारी आउटपुट में संपादित (redact) की जाती है। ईमेल पते और TODOs मिलान वाली पंक्ति दिखाते हैं।

स्कैन कवरेज

बिल्ड-आर्टिफैक्ट निर्देशिकाएँ (node_modules, __pycache__, .venv, venv, dist, build) स्कैन को तेज़ रखने के लिए डिफ़ॉल्ट रूप से छोड़ दी जाती हैं। Git रिपॉजिटरी में, यह छोड़ना सशर्त है: किसी निर्देशिका को हटाने से पहले, स्कैनर यह जाँचने के लिए git ls-files -- <dir> चलाता है कि अंदर कोई फ़ाइल ट्रैक की गई है या नहीं। यदि वे हैं, तो निर्देशिका सामान्य रूप से स्कैन की जाती है।

इसका मतलब है कि प्रतिबद्ध (committed) node_modules या dist ट्री — असामान्य, लेकिन होते हैं — चुपचाप नहीं छोड़े जाते। अपरिवर्तित (uncommitted) निर्देशिकाएँ (सामान्य मामला) पहले की तरह छोड़ी जाती रहती हैं।

जब क्लोन किए गए स्रोत रिपॉजिटरी में SKIP_DIRS उपनिर्देशिकाएँ पाई जाती हैं, तब भी एक चेतावनी मुद्रित की जाती है, क्योंकि उनकी उपस्थिति यह संकेत दे सकती है कि अपेक्षा से अधिक सामग्री प्रतिबद्ध है।

गलत सकारात्मक (false positives) को दबाना

दो कॉन्फ़िग कुंजियाँ आपको संपूर्ण जाँच श्रेणियों को अक्षम किए बिना ज्ञात-सुरक्षित निष्कर्षों को दबाने की अनुमति देती हैं।

scan_exclude_paths — फ़ाइलों या निर्देशिकाओं को पूरी तरह से छोड़ें। मान नई पंक्ति/अल्पविराम से अलग किए गए regex पैटर्न हैं जो सापेक्ष फ़ाइल पथ से मिलान किए जाते हैं। एक मिलान वाली फ़ाइल प्रत्येक जाँच से बाहर रखी जाती है: गुप्त जानकारी, ईमेल, TODOs, बड़ी फ़ाइलें, और AI संदर्भ फ़ाइल का पता लगाना। वही पैटर्न --exclude-paths के माध्यम से truffleHog को भी पास किए जाते हैं, ताकि कोई भी स्कैनर इंजन सक्रिय हो, कवरेज सुसंगत रहे।```ini [pre_flight_scan]

Exclude the GitHub API spec (example tokens) and all test fixtures

scan_exclude_paths = docs/api.github.com.json tests/fixtures/

root@kitploit:~
**`exclude_emails`** — विशिष्ट पतों या संपूर्ण डोमेन के लिए ईमेल निष्कर्षों को दबाएं। मान न्यूलाइन/कॉमा-पृथक, केस-असंवेदनशील होते हैं। `@` से शुरू होने वाली प्रविष्टियाँ उस डोमेन पर सभी ईमेल से मेल खाती हैं; अन्यथा प्रविष्टि का पूर्ण पते से बिल्कुल मेल खाना चाहिए। कार्यशील-ट्री और गिट इतिहास दोनों के निष्कर्षों पर लागू होता है।```ini
[pre_flight_scan]
# Suppress bot addresses and placeholder domains
exclude_emails = [email protected], [email protected], @example.com

स्कैनर कॉन्फ़िगरेशन```ini

[pre_flight_scan] scan_for_secrets = true scan_for_emails = true scan_for_todos = true max_file_size_mb = 100

Scan git history for email addresses (requires scan_for_emails = true)

scan_email_history = true

Scanner selection: auto | native | docker | off

auto — try native truffleHog, fall back to container (podman/docker), then regex (default)

native — native truffleHog only; no container fallback

docker — container only; skip native PATH check

off — regex scanner only, no truffleHog attempt

trufflehog_mode = auto

Flag AI context files (CLAUDE.md, AGENTS.md, .cursorrules, etc.) as critical findings.

Their git history may contain more sensitive content than the current version.

warn_ai_context_files = true

Literal strings to flag as critical findings (case-insensitive).

Comma-separated or one per line (continuation lines must be indented).

banned_strings = secret

password

credential

Exclude files/directories from all scan checks (regex patterns, comma/newline separated).

The same patterns are passed to truffleHog via --exclude-paths.

scan_exclude_paths = docs/api.github.com.json

tests/fixtures/

Suppress email findings for specific addresses or entire domains (case-insensitive).

Entries starting with @ match all emails at that domain; otherwise exact address match.

exclude_emails = [email protected], [email protected], @example.com

root@kitploit:~
जब प्रतिबंधित स्ट्रिंग्स या AI संदर्भ फ़ाइलें पाई जाती हैं, तो स्कैनर एक तैयार-से-चलने वाला `git filter-repo` कमांड प्रिंट करता है जो स्रोत रेपो के इतिहास को दोबारा चलाने से पहले हटा देता है।

---

## कॉन्फ़िगरेशन

`gh-safe-repo` इस क्रम में कॉन्फ़िगरेशन की तलाश करता है (पहला मिलान जीतता है):

1. **`--config PATH`** — स्पष्ट ओवरराइड
2. **`./gh-safe-repo.ini`** — वर्तमान कार्यशील निर्देशिका
3. **`$XDG_CONFIG_HOME/gh-safe-repo/gh-safe-repo.ini`** — डिफ़ॉल्ट रूप से `~/.config` होता है जब `$XDG_CONFIG_HOME` सेट नहीं है

बेयर `--config` (बिना पथ के) फ़ाइल लुकअप को पूरी तरह से छोड़ देता है और केवल अंतर्निहित डिफ़ॉल्ट का उपयोग करता है।
सभी मानों में सुरक्षित डिफ़ॉल्ट होते हैं — शुरू करने के लिए किसी कॉन्फ़िगरेशन फ़ाइल की आवश्यकता नहीं है।

एक पूरी तरह से एनोटेटेड उदाहरण कॉन्फ़िगरेशन रिपॉजिटरी में `gh-safe-repo.ini.example` के रूप में शामिल है। इसे शुरू करने के लिए कॉपी करें:```bash
# User-level config (XDG)
mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}/gh-safe-repo"
cp gh-safe-repo.ini.example "${XDG_CONFIG_HOME:-$HOME/.config}/gh-safe-repo/gh-safe-repo.ini"

# Or project-level config (current directory)
cp gh-safe-repo.ini.example ./gh-safe-repo.ini

पूर्ण कॉन्फ़िगरेशन संदर्भ```ini

[repo]

Whether new repos are private by default

private = true

Disable features that create clutter if unused

has_wiki = false has_projects = false has_issues = true

Auto-delete head branches after merge (default: off, matching GitHub)

delete_branch_on_merge = false

Merge strategies (all enabled by default, matching GitHub)

Set allow_merge_commit = false for squash-only workflows

allow_squash_merge = true allow_merge_commit = true allow_rebase_merge = true

Whether a plain create leaves an initialized README in the new repo.

false (default): the repo still gets a default branch (needed for branch

protection), but the auto-generated README.md is removed afterward.

true: keep the initialized README.

(Ignored for --local/--from, which always push your own history instead.)

auto_init = false

[actions]

Which actions are allowed to run: all | local_only | selected

allowed_actions = selected

When allowed_actions = selected, control which external actions are permitted:

github_owned_allowed = true # actions maintained by GitHub (e.g. actions/checkout) verified_allowed = true # actions from Marketplace verified creators

patterns_allowed = myorg/* # comma-separated allowlist (wildcards OK)

Principle of least privilege: read-only by default

Options: read | write

default_workflow_permissions = read

Prevent Actions from self-approving pull requests

can_approve_pull_request_reviews = false

Require workflows to pin actions to a specific commit SHA instead of a mutable tag

sha_pinning_required = true

[branch_protection]

Applied to public repos on any plan, and private repos on paid plans.

Branch to protect

protected_branch = main

Require a pull request before merging

require_pull_request = true

Number of approvals required

required_approving_reviews = 1

Dismiss existing approvals when new commits are pushed

dismiss_stale_reviews = true

Require all review comments to be resolved before merging

require_conversation_resolution = true

Do not enforce rules on administrators

false = repo owner can still push directly (needed for --from mirror workflow)

enforce_admins = false

Block force-pushes

allow_force_pushes = false

Block branch deletion

allow_deletions = false

Use the Rulesets API (default) instead of the legacy classic branch-protection

path. A single ruleset covers all configured branches, supports bypass actors,

and is GitHub's forward direction (new rule types are Rulesets-only). Set false

to fall back to the classic per-branch API, which is kept for one release cycle.

use_rulesets = true

[tag_protection]

Immutable tags via Rulesets API.

Only works on public repos or paid GitHub plans (same restriction as branch protection).

Glob pattern(s) for tags to protect — comma-separated.

protected_tags = *

Prevent deletion of matching tags (git tag -d / git push --delete)

prevent_tag_deletion = true

Prevent rewriting matching tags (git tag -f / force-push)

prevent_tag_update = true

[security]

Enable Dependabot vulnerability alerts

enable_dependabot_alerts = true

Auto-open PRs to fix vulnerable dependencies

enable_dependabot_security_updates = true

Let security researchers report vulnerabilities privately

enable_private_vulnerability_reporting = true

Block commits that contain supported secrets

enable_secret_scanning_push_protection = true

Note: The following features have no REST API and must be configured via UI or dependabot.yml:

- Grouped security updates: use dependabot.yml groups with applies-to: security-updates

- Automatic dependency submission: enable via repository settings UI

- Dependency graph: automatic for public repos; enable via UI for private repos

[pre_flight_scan] scan_for_secrets = true scan_for_emails = true scan_for_todos = true

Flag files larger than this threshold

max_file_size_mb = 100

Scan git history for email addresses (requires scan_for_emails = true)

scan_email_history = true

Scanner selection: auto | native | docker | off

auto = try native truffleHog, fall back to container (podman/docker), then regex

native = native PATH only

docker = container only

off = regex only

trufflehog_mode = auto

Flag AI context files (CLAUDE.md, AGENTS.md, .cursorrules, etc.) as critical findings.

warn_ai_context_files = true

Literal strings to flag as critical findings (case-insensitive).

Comma-separated, or one per line with continuation indentation.

banned_strings = secret

password

credential

Exclude files/directories from all scan checks (regex patterns, comma/newline separated).

Passed to truffleHog via --exclude-paths as well as applied to the regex walk.

scan_exclude_paths = docs/api.github.com.json

tests/fixtures/

Suppress email findings for specific addresses or entire domains (case-insensitive).

Entries starting with @ match all emails at that domain; otherwise exact address match.

exclude_emails = [email protected], [email protected], @example.com

[git_transport]

How git push/clone authenticates when using --local or --from: auto | user_creds | token

auto — use your own git credentials (SSH key or credential helper) when a

path exists; fall back to pushing over HTTPS with the API token in

the URL only when there is no SSH setup and no credential helper

(e.g. CI with just GITHUB_TOKEN). (default)

user_creds — never use the API token for git. Pushes with your own credentials

only; this avoids needing the workflow token scope to push

.github/workflows files.

token — always push over HTTPS with the API token in the URL. For CI where

the token was granted the workflow scope intentionally.

mode = auto

root@kitploit:~
---

## GitHub योजना सीमाएँ

कुछ सुविधाएँ केवल रिपॉजिटरी की दृश्यता और आपकी GitHub योजना के आधार पर उपलब्ध होती हैं।

| सुविधा | मुफ़्त + सार्वजनिक | मुफ़्त + निजी | Pro/Team + निजी |
|---|:---:|:---:|:---:|
| शाखा सुरक्षा / नियम सेट | हाँ | नहीं | हाँ |
| टैग सुरक्षा (नियम सेट) | हाँ | नहीं | हाँ |
| Dependabot अलर्ट | हाँ | नहीं | हाँ |
| Dependabot सुरक्षा अपडेट | हाँ | नहीं | हाँ |
| गुप्त स्कैनिंग | Auto | नहीं | हाँ |
| पुश सुरक्षा | हाँ | नहीं | हाँ |
| निजी भेद्यता रिपोर्टिंग | हाँ | हाँ | हाँ |
| निर्भरता ग्राफ़ | Auto | नहीं | हाँ |

`gh-safe-repo` रनटाइम पर आपकी योजना स्तर और रिपॉजिटरी दृश्यता का पता लगाता है। अनुपलब्ध सुविधाएँ योजना आउटपुट में स्पष्ट कारण के साथ `SKIP` के रूप में दिखाई देती हैं — उपकरण कभी भी चुपचाप विफल नहीं होता।

---

## यह कैसे काम करता है```
gh-safe-repo create <owner/repo>
      │
      ├─ Parse owner/repo, validate owner matches authenticated user (create only)
      ├─ Load config (./gh-safe-repo.ini or $XDG_CONFIG_HOME/gh-safe-repo/gh-safe-repo.ini)
      ├─ Apply CLI flag overrides (--public, etc.)
      ├─ Authenticate via gh CLI or GITHUB_TOKEN
      ├─ GET /user → owner login + plan level  (single cached call)
      │
      ├─ Build plan (each plugin compares desired vs. current state)
      │   ├─ RepositoryPlugin  → repo creation + basic settings
      │   ├─ ActionsPlugin     → allowed actions, workflow permissions, SHA pinning
      │   ├─ BranchProtectionPlugin → Rulesets API (default; classic if use_rulesets = false)
      │   ├─ SecurityPlugin    → Dependabot, secret scanning, push protection, private vuln reporting
      │   └─ TagProtectionPlugin → immutable tags via Rulesets API
      │
      ├─ Print plan table
      │
      └─ Apply (unless --dry-run)
          ├─ POST /user/repos
          ├─ PATCH /repos/{owner}/{repo}       (settings)
          ├─ PUT  /repos/{owner}/{repo}/actions/permissions/workflow
          ├─ POST/PATCH /repos/{owner}/{repo}/rulesets  (branch protection; default)
          │   or PUT /repos/{owner}/{repo}/branches/main/protection (if use_rulesets = false)
          ├─ PUT  /repos/{owner}/{repo}/vulnerability-alerts
          ├─ PUT  /repos/{owner}/{repo}/automated-security-fixes
          ├─ PUT  /repos/{owner}/{repo}/private-vulnerability-reporting
          ├─ PATCH /repos/{owner}/{repo}  (security_and_analysis: push protection)
          ├─ POST /repos/{owner}/{repo}/rulesets  (tag protection ruleset)
          ├─ git clone --mirror + git push --mirror (if --from)
          └─ git clone <local> + git push --all --tags (if --local, git repo)
              or git init + add -A + commit + push (if --local, plain dir)

प्लगइन आर्किटेक्चर

सेटिंग्स की प्रत्येक श्रेणी एक स्व-निहित प्लगइन क्लास (gh_safe_repo/plugins/) है। प्रत्येक प्लगइन:

  1. GitHub API से वर्तमान स्थिति प्राप्त करता है
  2. कॉन्फ़िग से वांछित स्थिति के साथ तुलना करता है
  3. एक Plan लौटाता है (Change ऑब्जेक्ट्स की सूची: ADD / UPDATE / DELETE / SKIP)
  4. केवल वास्तविक परिवर्तन लागू करता है — नो-ऑप के लिए कोई API कॉल नहीं

इसका मतलब है कि ऑडिट मोड और क्रिएट मोड एक ही योजना/लागू पथ का उपयोग करते हैं। एकमात्र अंतर यह है कि क्या वर्तमान स्थिति किसी मौजूदा रेपो से प्राप्त की जाती है या GitHub डिफ़ॉल्ट मान ली जाती है।

प्रमाणीकरण

API कॉल इस क्रम में एक टोकन हल करते हैं:

  1. GITHUB_TOKEN पर्यावरण चर — आपको सक्रिय gh सत्र को स्विच किए बिना किसी विशिष्ट खाते को लक्षित करने देता है (और CI में आवश्यक एकमात्र क्रेडेंशियल है)
  2. gh auth token — जो भी gh auth login ने सेट अप किया है
  3. यदि कोई उपलब्ध नहीं है तो त्रुटि

टोकन को सबप्रोसेस एनवायरनमेंट में GH_TOKEN के रूप में चाइल्ड gh api प्रक्रियाओं को पास किया जाता है और कभी लॉग नहीं किया जाता है।

Git ऑपरेशन (--local / --from push और clone) डिफ़ॉल्ट रूप से API टोकन का नहीं, बल्कि आपके अपने git क्रेडेंशियल — SSH कुंजी या क्रेडेंशियल हेल्पर — का उपयोग करते हैं। ऐसे वातावरण में जहां कोई भी नहीं है (जैसे केवल GITHUB_TOKEN के साथ CI), उपकरण URL में टोकन के साथ HTTPS पर पुश करने पर वापस आ जाता है; [git_transport] mode कॉन्फ़िग सेटिंग इसे नियंत्रित करती है (कॉन्फ़िगरेशन संदर्भ देखें)। टोकन-असर वाले URL कभी भी आपके रेपो के .git/config में नहीं लिखे जाते हैं और सभी आउटपुट से संपादित किए जाते हैं।

API दृष्टिकोण

सभी GitHub API कॉल subprocess के माध्यम से gh api से होकर जाते हैं। यह प्रमाणीकरण को पूरी तरह से gh CLI में रखता है — कोई टोकन प्रबंधन कोड नहीं, कोई OAuth प्रवाह नहीं, कोई PyGithub संस्करण पिनिंग नहीं। JSON अनुरोध निकाय --input - (stdin) के माध्यम से पास किए जाते हैं, --field फ्लैग के माध्यम से नहीं।


विकास```bash

Clone and set up

git clone https://github.com/your-username/gh-safe-repo cd gh-safe-repo uv sync # creates .venv, installs pytest

Run tests

uv run pytest tests/ -v

Run the tool directly (without installing)

./gh-safe-repo create <owner/repo> --dry-run

Install globally (picks up the current source)

uv tool install .

root@kitploit:~
परीक्षण फ़ाइल विवरण, मॉकिंग परंपराएँ और नए परीक्षण जोड़ने के तरीके के लिए [`tests/README.md`](https://github.com/ariesq/gh-safe-repo/blob/master/tests/README.md) देखें।

### प्रोजेक्ट संरचना```
gh-safe-repo/
├── gh-safe-repo          # Thin launcher (entry point for direct use)
├── gh_safe_repo/         # Package — see gh_safe_repo/README.md for internals
│   ├── cli.py            # Subparser dispatch (create, fix, scan)
│   ├── commands/         # Subcommand implementations
│   │   ├── _common.py    # Shared helpers, CLIContext, plan formatting
│   │   ├── create.py     # create subcommand
│   │   ├── fix.py        # fix subcommand
│   │   └── scan.py       # scan subcommand
│   └── plugins/          # Settings plugins (one per category)
├── pyproject.toml        # Build config, entry points
├── gh-safe-repo.ini.example  # Fully annotated example config
└── tests/

gh_safe_repo/README.md देखें जहां मॉड्यूल मैप, प्लगइन आर्किटेक्चर और नई सेटिंग्स जोड़ने का मार्गदर्शन दिया गया है।

निर्भरता नीति

कोई रनटाइम निर्भरता नहीं है। सब कुछ पायथन मानक लाइब्रेरी (argparse, configparser, subprocess, json, re) का उपयोग करता है। चर्चा के बिना तृतीय-पक्ष पैकेज न जोड़ें।

pytest एकमात्र डेव निर्भरता है, जिसे pyproject.toml में UV-मूल [dependency-groups] प्रविष्टि के रूप में घोषित किया गया है।


पूर्व कला

डिज़ाइन के दौरान इन परियोजनाओं का अध्ययन किया गया और इन्होंने gh-safe-repo की वास्तुकला को प्रभावित किया। ये अलग-अलग दायरे और उपयोगकर्ता मॉडल वाले विशिष्ट उपकरण हैं — पैटर्न को कैसे अनुकूलित किया गया, इसकी विस्तृत तकनीकी जानकारी के लिए docs/LEARNINGS.md देखें।

  • github/safe-settings — ऑर्ग-स्तरीय GitHub ऐप (Node.js/Probot) जो केंद्रीय कॉन्फ़िगरेशन से रिपॉजिटरी सेटिंग्स लागू करता है। प्लगइन आर्किटेक्चर पैटर्न (प्रति सेटिंग श्रेणी एक क्लास, fetch → diff → apply) और mergeDeep तुलना दृष्टिकोण का स्रोत।

  • repository-settings/app — safe-settings का सरल प्रति-रिपो वेरिएंट, जो Node.js/Probot पर भी आधारित है। Diffable बेस प्लगइन पैटर्न के लिए एक साफ संदर्भ प्रदान किया।

  • nicholasgasior/gh-repo-settings — Go में लिखा गया CLI एक्सटेंशन जिसमें plan/apply वर्कफ़्लो है। gh api सबप्रोसेस रैपर पैटर्न और ड्राई-रन प्लान आउटपुट डिज़ाइन के लिए प्राथमिक प्रेरणा।

टूल डाउनलोड करें