
Python CLI जो GitHub रिपॉजिटरीज़ को सुरक्षित डिफॉल्ट्स के साथ बनाता है — शाखा सुरक्षा, Dependabot, गुप्त स्कैनिंग, और प्री-फ्लाइट सुरक्षा स्कैनिंग — स्वचालित रूप से लागू।
सुरक्षित डिफ़ॉल्ट सेटिंग्स के साथ स्वचालित रूप से GitHub रिपॉजिटरी बनाएँ। यह निर्माण के बाद की पाँच मिनट की सेटिंग्स चेकलिस्ट को एक ही कमांड से बदल देता है।``` gh-safe-repo create <owner/repo>
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 में जोड़ता है।
git clone https://github.com/your-username/gh-safe-repo cd gh-safe-repo uv sync # creates .venv ./gh-safe-repo create <owner/repo>
### सत्यापन```bash
gh-safe-repo --help
gh-safe-repo create <owner/repo>
gh-safe-repo create <owner/repo> --dry-run
gh-safe-repo create <owner/repo> --public
gh-safe-repo create <owner/repo> --from <owner/source>
gh-safe-repo create <owner/pub> --from <owner/priv> --public
gh-safe-repo create <owner/repo> --local ~/projects/myapp
gh-safe-repo create <owner/repo> --local ~/projects/myapp --public
gh-safe-repo fix <owner/repo>
gh-safe-repo fix <owner/repo> --dry-run
gh-safe-repo fix <owner/repo> --yes
gh-safe-repo scan . gh-safe-repo scan ~/projects/myapp
## 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 | कोई बदलाव किए बिना योजना प्रिंट करें |
--json | ANSI तालिका के बजाय योजना को stdout पर JSON के रूप में भेजें |
--config [PATH] | कॉन्फ़िग फ़ाइल का पथ; बेयर --config केवल बिल्ट-इन डिफ़ॉल्ट का उपयोग करता है |
--debug | प्रत्येक API कॉल और प्रतिक्रिया प्रिंट करें |
एक सादा create (बिना --local/--from) रिपो को आरंभ करता है ताकि ब्रैंच प्रोटेक्शन के लिए एक डिफ़ॉल्ट ब्रैंच मौजूद रहे, फिर ऑटो-जनरेटेड README.md को हटा देता है ताकि नई रिपो साफ़ शुरू हो। README को बनाए रखने के लिए कॉन्फ़िग में auto_init = true सेट करें। --local/--from आपका अपना इतिहास पुश करते हैं और कभी README नहीं बनाते।
fix — मौजूदा रिपो का ऑडिट और सुधार करें| विकल्प | विवरण |
|---|---|
--yes / -y | पुष्टि संकेत छोड़ें और तुरंत लागू करें (स्क्रिप्टिंग/बैच उपयोग के लिए) |
--dry-run | बदलाव लागू किए बिना सेटिंग्स अंतर दिखाएँ |
--json | ANSI तालिका के बजाय योजना को 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
जब `--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 }
}
`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:
UPDATE और उन सेटिंग्स के लिए SKIP दिखाया जाता है जो पहले से वांछित मान पर हैं (no-op पहचान — यह कभी भी API कॉल नहीं करता जो कुछ भी नहीं बदलेगा)--yes के साथ छोड़ें)केवल वास्तविक परिवर्तन लागू किए जाते हैं — जो सेटिंग्स पहले से वांछित मान पर हैं, उन्हें SKIP के रूप में दिखाया जाता है और कोई API कॉल उत्पन्न नहीं होता।
--from)--from एक मौजूदा रिपॉजिटरी को सुरक्षित डिफ़ॉल्ट मानों के साथ एक नई रिपॉजिटरी में मिरर करता है। यह निजी और सार्वजनिक दोनों गंतव्यों के लिए काम करता है:```bash
gh-safe-repo create <owner/repo> --from <owner/source>
gh-safe-repo create <owner/pub> --from <owner/priv> --public
**क्रमशः क्या होता है:**
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
क्या होता है, क्रम में:
github.com के लिए आपके git क्रेडेंशियल की पहले से जाँच की जाती है (SSH प्रोब जब gh config get git_protocol ssh हो; HTTPS विश्वसनीय है), इसलिए गुम कुंजी किसी भी रेपो बनने से पहले तुरंत विफल हो जाती हैpush --all --tags (सभी शाखाएँ और टैग) के साथ पुश किया जाता है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 वर्कफ़्लो के भाग के रूप में स्वचालित रूप से चलता है।
gh-safe-repo scan .
gh-safe-repo scan ~/projects/myapp
यदि कोई गंभीर निष्कर्ष नहीं हैं तो एग्ज़िट कोड `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 स्वचालित रूप से तीन-चरणीय खोज श्रृंखला का उपयोग करके सर्वोत्तम उपलब्ध स्कैनर चुनता है:
trufflehog --version चलाता है, सत्यापित करता है कि यह v3 है, और इसका उपयोग करता है। v2 इंस्टॉल या अपरिचित संस्करण एक चेतावनी प्रिंट करता है और चरण 2 पर जाता है।podman run या docker run का उपयोग करके एक कंटेनर (ghcr.io/trufflesecurity/trufflehog:latest) में truffleHog चलाता है, स्कैन पथ को उसी पूर्ण पथ पर केवल-पढ़ने के लिए माउंट करता है ताकि JSON आउटपुट पथ मूल रन के समान हों।चयनित स्कैनर "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)
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 उपनिर्देशिकाएँ पाई जाती हैं, तब भी एक चेतावनी मुद्रित की जाती है, क्योंकि उनकी उपस्थिति यह संकेत दे सकती है कि अपेक्षा से अधिक सामग्री प्रतिबद्ध है।
दो कॉन्फ़िग कुंजियाँ आपको संपूर्ण जाँच श्रेणियों को अक्षम किए बिना ज्ञात-सुरक्षित निष्कर्षों को दबाने की अनुमति देती हैं।
scan_exclude_paths — फ़ाइलों या निर्देशिकाओं को पूरी तरह से छोड़ें। मान नई पंक्ति/अल्पविराम से अलग किए गए regex पैटर्न हैं जो सापेक्ष फ़ाइल पथ से मिलान किए जाते हैं। एक मिलान वाली फ़ाइल प्रत्येक जाँच से बाहर रखी जाती है: गुप्त जानकारी, ईमेल, TODOs, बड़ी फ़ाइलें, और AI संदर्भ फ़ाइल का पता लगाना। वही पैटर्न --exclude-paths के माध्यम से truffleHog को भी पास किए जाते हैं, ताकि कोई भी स्कैनर इंजन सक्रिय हो, कवरेज सुसंगत रहे।```ini
[pre_flight_scan]
scan_exclude_paths = docs/api.github.com.json tests/fixtures/
**`exclude_emails`** — विशिष्ट पतों या संपूर्ण डोमेन के लिए ईमेल निष्कर्षों को दबाएं। मान न्यूलाइन/कॉमा-पृथक, केस-असंवेदनशील होते हैं। `@` से शुरू होने वाली प्रविष्टियाँ उस डोमेन पर सभी ईमेल से मेल खाती हैं; अन्यथा प्रविष्टि का पूर्ण पते से बिल्कुल मेल खाना चाहिए। कार्यशील-ट्री और गिट इतिहास दोनों के निष्कर्षों पर लागू होता है।```ini
[pre_flight_scan]
# Suppress bot addresses and placeholder domains
exclude_emails = [email protected], [email protected], @example.com
[pre_flight_scan] scan_for_secrets = true scan_for_emails = true scan_for_todos = true max_file_size_mb = 100
जब प्रतिबंधित स्ट्रिंग्स या 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
[repo]
private = true
has_wiki = false has_projects = false has_issues = true
delete_branch_on_merge = false
allow_squash_merge = true allow_merge_commit = true allow_rebase_merge = true
create leaves an initialized README in the new repo.auto_init = false
[actions]
allowed_actions = selected
github_owned_allowed = true # actions maintained by GitHub (e.g. actions/checkout) verified_allowed = true # actions from Marketplace verified creators
default_workflow_permissions = read
can_approve_pull_request_reviews = false
sha_pinning_required = true
[branch_protection]
protected_branch = main
require_pull_request = true
required_approving_reviews = 1
dismiss_stale_reviews = true
require_conversation_resolution = true
enforce_admins = false
allow_force_pushes = false
allow_deletions = false
use_rulesets = true
[tag_protection]
protected_tags = *
prevent_tag_deletion = true
prevent_tag_update = true
[security]
enable_dependabot_alerts = true
enable_dependabot_security_updates = true
enable_private_vulnerability_reporting = true
enable_secret_scanning_push_protection = true
[pre_flight_scan] scan_for_secrets = true scan_for_emails = true scan_for_todos = true
max_file_size_mb = 100
[git_transport]
workflow token scope to pushworkflow scope intentionally.---
## 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/) है। प्रत्येक प्लगइन:
Plan लौटाता है (Change ऑब्जेक्ट्स की सूची: ADD / UPDATE / DELETE / SKIP)इसका मतलब है कि ऑडिट मोड और क्रिएट मोड एक ही योजना/लागू पथ का उपयोग करते हैं। एकमात्र अंतर यह है कि क्या वर्तमान स्थिति किसी मौजूदा रेपो से प्राप्त की जाती है या GitHub डिफ़ॉल्ट मान ली जाती है।
API कॉल इस क्रम में एक टोकन हल करते हैं:
GITHUB_TOKEN पर्यावरण चर — आपको सक्रिय gh सत्र को स्विच किए बिना किसी विशिष्ट खाते को लक्षित करने देता है (और CI में आवश्यक एकमात्र क्रेडेंशियल है)gh auth token — जो भी gh auth login ने सेट अप किया हैटोकन को सबप्रोसेस एनवायरनमेंट में GH_TOKEN के रूप में चाइल्ड gh api प्रक्रियाओं को पास किया जाता है और कभी लॉग नहीं किया जाता है।
Git ऑपरेशन (--local / --from push और clone) डिफ़ॉल्ट रूप से API टोकन का नहीं, बल्कि आपके अपने git क्रेडेंशियल — SSH कुंजी या क्रेडेंशियल हेल्पर — का उपयोग करते हैं। ऐसे वातावरण में जहां कोई भी नहीं है (जैसे केवल GITHUB_TOKEN के साथ CI), उपकरण URL में टोकन के साथ HTTPS पर पुश करने पर वापस आ जाता है; [git_transport] mode कॉन्फ़िग सेटिंग इसे नियंत्रित करती है (कॉन्फ़िगरेशन संदर्भ देखें)। टोकन-असर वाले URL कभी भी आपके रेपो के .git/config में नहीं लिखे जाते हैं और सभी आउटपुट से संपादित किए जाते हैं।
सभी GitHub API कॉल subprocess के माध्यम से gh api से होकर जाते हैं। यह प्रमाणीकरण को पूरी तरह से gh CLI में रखता है — कोई टोकन प्रबंधन कोड नहीं, कोई OAuth प्रवाह नहीं, कोई PyGithub संस्करण पिनिंग नहीं। JSON अनुरोध निकाय --input - (stdin) के माध्यम से पास किए जाते हैं, --field फ्लैग के माध्यम से नहीं।
git clone https://github.com/your-username/gh-safe-repo cd gh-safe-repo uv sync # creates .venv, installs pytest
uv run pytest tests/ -v
./gh-safe-repo create <owner/repo> --dry-run
uv tool install .
परीक्षण फ़ाइल विवरण, मॉकिंग परंपराएँ और नए परीक्षण जोड़ने के तरीके के लिए [`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 सबप्रोसेस रैपर पैटर्न और ड्राई-रन प्लान आउटपुट डिज़ाइन के लिए प्राथमिक प्रेरणा।