
AI कोडिंग सहायकों के लिए स्वचालित निर्भरता सुरक्षा परत जो npm, PyPI, RubyGems, Maven, Go और Rust पारिस्थितिकी तंत्रों में CVEs, typosquats, abandonment, version-age issues और hash integrity के लिए पैकेजों का ऑडिट करती है।
जब क्लॉड जैसे AI कोडिंग सहायक आपके प्रोजेक्ट में पैकेज जोड़ते हैं, तो वे अक्सर जो भी संस्करण सही लगता है उसे चुन लेते हैं — बिना यह जाँचे कि उसमें ज्ञात सुरक्षा कमज़ोरियाँ हैं या नहीं, पैकेज अभी भी सक्रिय रूप से बनाए रखा जा रहा है या नहीं, या नाम किसी दुर्भावनापूर्ण नकली से टाइपो की दूरी पर है या नहीं।
safer-dependencies क्लॉड कोड के लिए एक सुरक्षा परत है: यह क्लॉड और आपकी मैनिफ़ेस्ट फ़ाइलों के बीच बैठता है और अपनी सुरक्षा जाँच स्वचालित रूप से चलाता है: कमज़ोर इंस्टॉल चलने से पहले ही अस्वीकार कर दिए जाते हैं, और मैनिफ़ेस्ट में लिखा गया जोखिम भरा संस्करण लिखने के तुरंत बाद डिस्क पर सुधार दिया जाता है। यह जोखिम भरी निर्भरताओं का पता लगाता है और उन्हें ठीक करता है — CVEs, टाइपोस्क्वैट्स, परित्यक्त पैकेज, और संस्करण-आयु संबंधी समस्याएँ, साथ ही ब्रांड-नए रिलीज़ के लिए एक कूलडाउन अवधि — npm, PyPI, RubyGems, Maven, Go, Rust, और PHP (Composer) में। वास्तव में क्या कवर किया गया है और क्या नहीं, इसके लिए CAPABILITIES.md देखें।
नए हैं? GETTING-STARTED.md आपको लगभग पाँच मिनट में शून्य से कार्यशील इंस्टॉल तक ले जाता है।
सुरक्षा और गोपनीयता: SECURITY.md (कमज़ोरी प्रकटीकरण), PRIVACY.md (डेटा बहिर्गमन, कोई टेलीमेट्री नहीं), और CAPABILITIES.md (उपकरण किससे बचाव करता है और किससे नहीं) देखें।
लाइसेंस (स्रोत-उपलब्ध — OSI "ओपन सोर्स" नहीं): अपने स्वयं के उद्देश्यों के लिए उपयोग और संशोधन करने के लिए निःशुल्क, लाभ-उद्देश्य/कंपनी आंतरिक उपयोग और आपके द्वारा बेचे जाने वाले उत्पाद बनाने सहित। एक अलग सशुल्क लाइसेंस केवल सॉफ़्टवेयर का मुद्रीकरण करने के लिए आवश्यक है — इसे बेचना, इसे किसी बेचे जाने वाले उत्पाद या सेवा के अंदर भेजना, या इसकी कार्यक्षमता को तीसरे पक्षों को शुल्क पर प्रदान करना (होस्टेड/SaaS/API सहित)। पुनर्वितरण और व्युत्पन्न कार्यों को लाइसेंस बनाए रखना चाहिए और इस प्रोजेक्ट को श्रेय देना चाहिए। देखें (वाणिज्यिक प्रतिबंध के लिए धारा 4); वाणिज्यिक-लाइसेंस अनुरोध के माध्यम से।
GETTING-STARTED.md आपको लगभग पाँच मिनट में शून्य से कार्यशील इंस्टॉल तक ले जाता है — पूर्वापेक्षाएँ, इंटरैक्टिव इंस्टॉल, और सत्यापन। पूर्ण इंस्टॉल संदर्भ (वैश्विक/प्रोजेक्ट/मैनुअल इंस्टॉल, विंडोज़ विशिष्टताएँ, अनुमति अनुमतिसूची, अद्यतन, और अनइंस्टॉल) के लिए, INSTALLATION.md देखें।
दैनिक उपयोग: एक बार हुक इंस्टॉल हो जाने के बाद, चलाने के लिए कुछ भी नहीं है — safer-dependencies पृष्ठभूमि में स्वचालित रूप से काम करता है। जैसे ही क्लॉड पैकेज जोड़ता या इंस्टॉल करता है, यह जोखिम भरी निर्भरताओं को चिह्नित करता है और कमज़ोर संस्करणों को सुरक्षित संस्करण में अपग्रेड करता है — और ज्ञात-कमज़ोर इंस्टॉल को चलने से पहले ही रोक देता है — ताकि असुरक्षित पैकेज आपके पूछे बिना पकड़े और सुधारे जा सकें। आप इसे किसी भी समय सीधे भी लागू कर सकते हैं: "क्या [email protected] सुरक्षित है?", "safer-dependencies सेटअप जाँचें", या "safer-dependencies आँकड़े दिखाएँ"।
जब क्लॉड आपके प्रोजेक्ट में एक पैकेज जोड़ने वाला होता है, तो safer-dependencies हस्तक्षेप करता है और 5 जाँचें चलाता है:
requirements.txt पंक्तियों के लिए --hash=sha256:... पिन के साथ, घोषित हैश को PyPI के प्रकाशित हैश के विरुद्ध सत्यापित किया जाता है; बेमेल एक WARNING उत्सर्जित करता हैpaperclip, request, pycrypto, github.com/dgrijalva/jwt-go) तुरंत सुझाए गए प्रतिस्थापन के साथ हार्ड-ब्लॉक किए जाते हैं; 2+ वर्षों में कोई स्थिर रिलीज़ न होने वाले पैकेजों को एक सलाहकार STALE: चेतावनी मिलती है। हार्ड-ब्लॉक किए गए पैकेज मैनिफ़ेस्ट से हटा दिए जाते हैं और क्लॉड पूछेगा कि आगे कैसे बढ़ना है; केवल-पुराने पैकेज अपनी जगह पर छोड़ दिए जाते हैं।यदि समस्याएँ पाई जाती हैं, तो क्लॉड चेतावनियाँ उत्सर्जित करता है और सुरक्षित संस्करण पर वापस जा सकता है। सभी जाँचें ~/.claude/safer-dependencies-audit-YYYY-MM.log में लॉग की जाती हैं (प्रति कैलेंडर माह एक फ़ाइल)।
स्किल स्वचालित रूप से तब सक्रिय होती है जब क्लॉड:
मैनिफ़ेस्ट / इंस्टॉल संचालन
package.json, requirements.txt, Gemfile, pom.xml, build.gradle, Cargo.toml, go.mod, या किसी अन्य समर्थित मैनिफ़ेस्ट में एक पैकेज जोड़ता या अद्यतन करता हैimport, require, या use लिखता हैnpm install, bundle install, poetry install, uv sync, go mod tidy, आदि) — प्री-इंस्टॉल कमांड तर्कों का ऑडिट करता है, पोस्ट-इंस्टॉल परिणामी लॉकफ़ाइल का ऑडिट करता हैDockerfile या CI वर्कफ़्लो (.github/workflows/*.yml, आदि) लिखता है जिसमें पिन किए गए पैकेज-मैनेजर इंस्टॉल चरण एम्बेडेड होते हैंचयन और अनुशंसा प्रश्न
उपयोग-इरादे की अभिव्यक्तियाँ (जोड़ने से पहले)
पैकेज स्वास्थ्य और विश्वास प्रश्न
स्कैफोल्डिंग कमांड
npx create-react-app, npm create vite@latest, django-admin startproject, rails new, cargo new + cargo add, "एक नया FastAPI प्रोजेक्ट बूटस्ट्रैप करें"अंतर्निहित पैकेज जोड़ (फीचर अनुरोध जो एक नई निर्भरता का संकेत देते हैं)
माइग्रेशन और पोर्टिंग
यह निम्नलिखित के लिए सक्रिय नहीं होता:
os, fs, java.util.*, आदि)यह एक स्किल + हुक बंडल है, एकल स्किल फ़ाइल नहीं। एक पूर्ण इंस्टॉल इन भागों को तैनात करता है:
| फ़ाइल | भूमिका |
|---|---|
skills/safer-dependencies.md | स्किल (इंस्टॉल होने पर SKILL.md)। ऑडिट प्रक्रियाओं का वर्णन करता है और इंस्टॉलेशन/आँकड़ों के लिए प्रबंधन मोड शामिल करता है। |
skills/safer-dependencies-shim.sh | PostToolUse:Write/Edit हुक — मैनिफ़ेस्ट + लॉकफ़ाइल लेखन का ऑडिट करता है और कमज़ोर संस्करणों को स्थान पर स्वतः सुधारता है (इंटरसेप्ट मोड)। |
skills/safer-dependencies-pretooluse-bash.sh | PreToolUse:Bash हुक — पैकेज-मैनेजर इंस्टॉल कमांड का प्री-फ़्लाइट OSV ऑडिट; इंस्टॉल चलने से पहले कमज़ोर कंक्रीट पिन को अस्वीकार करता है (प्री-इंस्टॉल मोड)। |
skills/safer-dependencies-posttooluse-bash.sh | PostToolUse:Bash हुक — बैश कमांड के बाद पोस्ट-फ़्लाइट ऑडिट; नई लिखी गई लॉकफ़ाइलों, sed/jq/स्क्रिप्ट के माध्यम से संपादित मैनिफ़ेस्ट, और सादे pip install के हल किए गए वातावरण में ट्रांज़िटिव CVEs को पकड़ता है (पोस्ट-इंस्टॉल मोड)। |
skills/safer-dependencies-pretooluse-agent.sh + skills/safer-dependencies-posttooluse-agent.sh | PreToolUse:Agent + PostToolUse:Agent हुक जोड़ी — सबएजेंट कवरेज अंतर को बंद करती है। मोड 2–4 केवल रूट-सत्र टूल कॉल के लिए सक्रिय होते हैं, इसलिए सबएजेंट द्वारा लिखा गया कोई भी मैनिफ़ेस्ट उन्हें बायपास करता है। पोस्ट-एजेंट प्रत्येक Agent टूल-कॉल के लौटने के बाद सबएजेंट द्वारा लिखी गई किसी भी चीज़ का ऑडिट करता है (पोस्ट-एजेंट मोड)। |
skills/scripts/ | साझा Python लाइब्रेरी (safedep/) और स्टैंडअलोन रिज़ॉल्वर स्क्रिप्ट जो सभी हुक द्वारा उपयोग की जाती हैं। |
skills/scripts/safer_dependencies_manager.py | इंटरैक्टिव इंस्टॉलेशन, उपयोग आँकड़े, और सेटअप सत्यापन के लिए प्रबंधन मॉड्यूल। |
अकेले स्किल फ़ाइल पर्याप्त नहीं है — हुक के बिना, स्वचालित आह्वान क्लॉड के स्किल तक पहुँचने के निर्णय पर निर्भर करता है। पूर्ण कवरेज के लिए सभी पाँच भाग इंस्टॉल करें; कई स्किल और स्लैश कमांड आंतरिक रूप से सबएजेंट भेजते हैं, इसलिए पोस्ट-एजेंट जोड़ी मायने रखती है भले ही आप कभी स्पष्ट रूप से एक न बनाएँ। (अकेले स्किल कवरेज की गारंटी क्यों नहीं दे सकता, इसके लिए FAQ.md देखें।)
| इकोसिस्टम | मैनिफ़ेस्ट | लॉक फ़ाइल |
|---|---|---|
| npm | package.json | package-lock.json, yarn.lock, pnpm-lock.yaml |
| PyPI | requirements.txt, pyproject.toml, Pipfile, setup.py, setup.cfg | Pipfile.lock, poetry.lock, uv.lock |
| RubyGems | Gemfile, *.gemspec | Gemfile.lock |
| Maven | pom.xml, build.gradle, libs.versions.toml | -- |
| Go | go.mod | go.sum |
| Rust | Cargo.toml | Cargo.lock |
| PHP (Composer) | composer.json | composer.lock |
प्रोजेक्ट में नए हैं? GETTING-STARTED.md से शुरू करें। संक्षिप्त संस्करण:```bash git clone https://github.com/robert-auger/safer-dependencies /tmp/safer-dependencies python3 /tmp/safer-dependencies/skills/scripts/safer_dependencies_manager.py interactive_install
इंस्टॉलर स्कोप (ग्लोबल बनाम प्रोजेक्ट) और कौन से हुक सक्षम करने हैं, इसके बारे में पूछता है, फिर आपके लिए `settings.json` लिखता है — दोनों हुक एंट्री **और** अनुमतियाँ अनुमति-सूची, जो स्किल के चेक कमांड को हर ऑडिट पर अनुमोदन प्रॉम्प्ट के बिना चलाने देती है।
इंस्टॉल से जुड़ी बाकी सब कुछ **[INSTALLATION.md](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md)** में रहती है, जो इंस्टॉल तंत्र का एकमात्र संदर्भ है: मैन्युअल फ़ाइल-दर-फ़ाइल इंस्टॉल (ग्लोबल और प्रोजेक्ट-स्तर), Windows विशेषताएँ, Post-Agent हुक, [अनुमतियाँ अनुमति-सूची](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#permissions-allowlist), सेटअप सत्यापन, अपडेट, रिलीज़ टैग पर पिन करना, और अनइंस्टॉल करना।
इंस्टॉल के बाद, दिन-प्रतिदिन का प्रबंधन Claude को प्राकृतिक भाषा में किया जाता है — `install safer-dependencies` (फिर से चलाएँ / हुक बदलें), `show safer-dependencies stats`, `check safer-dependencies setup` — या `/safer-dependencies` मेनू के माध्यम से। अपडेट भी सत्र के भीतर होता है: `/safer-dependencies update` नवीनतम रिलीज़ लागू करता है (`update --check` ड्राई-रन के लिए, `update --rollback` पूर्ववत करने के लिए); विश्वास मॉडल के लिए [INSTALLATION.md](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#in-session-self-updater-safer-dependencies-update) देखें।
> **प्लेटफ़ॉर्म नोट:** macOS, Linux, और Windows समर्थित हैं। Windows को Git for Windows (जो bash प्रदान करता है) और `PATH` पर Python 3 की आवश्यकता होती है — WSL की कोई आवश्यकता नहीं। अब तक के व्यावहारिक परीक्षण **macOS और Windows** पर केंद्रित रहे हैं; Linux समर्थन स्वचालित CI मैट्रिक्स द्वारा परखा जाता है।
### कॉन्फ़िगरेशन
इंस्टॉल के बाद दो चीज़ें कॉन्फ़िगर करने योग्य हैं:
- **अनुमतियाँ अनुमति-सूची** — स्किल के केवल-पढ़ने वाले चेक कमांड (सटीक-रूप `npm audit` / `bundle audit` नियम और स्किल के अपने रिज़ॉल्वर स्क्रिप्ट) को पहले से अनुमोदित करती है, ताकि ऑडिट हर बार अनुमोदन प्रॉम्प्ट के बिना चलें; `curl` कभी पहले से अनुमोदित नहीं होता, और `npm view` / `pip-audit` Convenience प्रोफ़ाइल के माध्यम से ऑप्ट-इन होते हैं। इंटरैक्टिव इंस्टॉलर आपके लिए मुख्य एंट्री लिखता है; मैन्युअल इंस्टॉल पूरा ब्लॉक हाथ से जोड़ते हैं। पूरा ब्लॉक और तर्क: [INSTALLATION.md → अनुमतियाँ अनुमति-सूची](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#permissions-allowlist)।
- **सुरक्षा नीति** — रिलीज़-आयु कूलडाउन विंडो/मोड और हर चेक प्रकार के लिए एक प्रति-चेक `off`/`warn`/`block` स्तर, जिसे `/safer-dependencies config` से संपादित किया जाता है और `~/.config/safer-dependencies/config.toml` में संग्रहीत किया जाता है। स्कीमा और स्तर शब्दार्थ: [`skills/references/configuration.md`](https://github.com/robert-auger/safer-dependencies/blob/main/skills/references/configuration.md)।
### कूलडाउन अवधि बदलना
कूलडाउन (जिसे कॉन्फ़िग में **cooloff** कहा जाता है) वह न्यूनतम आयु है जो एक रिलीज़ को स्किल द्वारा चुने जाने से पहले प्राप्त करनी चाहिए — डिफ़ॉल्ट **7 दिन**। इसे बदलने के लिए, Claude से पूछें या कॉन्फ़िग कमांड सीधे चलाएँ:```
/safer-dependencies config set cooloff.days 14 # require releases to be 14+ days old
/safer-dependencies config set cooloff.mode block # gate strength: off | warn | block (default: warn)
/safer-dependencies config unset cooloff.days # revert to the 7-day default
/safer-dependencies config # show effective values and where each comes from
वही क्रियाएँ Claude सत्र के बाहर भी काम करती हैं:```bash python3 skills/scripts/safer_dependencies_manager.py config set cooloff.days 14
यह सेटिंग `~/.config/safer-dependencies/config.toml` (अनुभाग `[cooloff]`) में बनी रहती है; `SAFE_DEP_COOLOFF_DAYS` और `SAFE_DEP_COOLOFF_MODE` पर्यावरण चर प्रति-सत्र फ़ाइल को ओवरराइड करते हैं। तीन व्यवहार जानने योग्य हैं: `mode = "off"` संस्करण चयन से आयु फ़िल्टर को पूरी तरह हटा देता है; CVE-संचालित पुनर्लेखन गेट को बायपास करता है, इसलिए सुरक्षा सुधार को कभी भी बहुत नया होने के कारण रोका नहीं जाता; और गेट npm, PyPI, RubyGems, और crates.io को कवर करता है — Maven और Go को जानबूझकर गेट नहीं किया गया है। पूर्ण शब्दार्थ: [`skills/references/configuration.md`](https://github.com/robert-auger/safer-dependencies/blob/main/skills/references/configuration.md)।
## चेतावनी स्तर
| स्तर | अर्थ | उदाहरण |
|-------|---------|---------|
| CRITICAL | रोकें और उपयोगकर्ता से पूछें | टाइपोस्क्वाट का पता चला, छेड़छाड़ किया गया हस्ताक्षर |
| HIGH | चेतावनी दें और आगे बढ़ें | ज्ञात CVE, पैकेज 30 दिन से कम पुराना |
| MEDIUM | चेतावनी दें और आगे बढ़ें | संस्करण 7 दिन से कम पुराना, हस्ताक्षर गायब |
| LOW | चेतावनी दें और आगे बढ़ें | अहस्ताक्षरित Ruby gem (अपेक्षित) |
## यह कैसे काम करता है
यह स्किल पाँच मोड में संचालित होती है (नीचे सारांशित; सबसे गहरा डिज़ाइन तर्क `skills/safer-dependencies.md` में है):
### सामान्य मोड (मैनुअल)
जब Claude एक `import` लिखने, मैनिफ़ेस्ट में पैकेज जोड़ने, या लॉक फ़ाइल अपडेट करने वाला होता है, तो स्किल आपके सत्र में इनलाइन चलती है:
1. स्थिर संस्करणों के लिए पैकेज रजिस्ट्री से पूछताछ करती है
2. 7+ दिन पहले प्रकाशित नवीनतम संस्करण को स्वतः चुनती है (निर्धारक — कोई LLM निर्णय नहीं)
3. इकोसिस्टम टूल्स और OSV API के माध्यम से ज्ञात कमजोरियों की जाँच करती है
4. जहाँ उपलब्ध हो, पैकेज हस्ताक्षर सत्यापित करती है
5. समस्याएँ मिलने पर चेतावनियाँ जारी करती है, सटीक संस्करण पिन करती है
6. परिणाम को ऑडिट ट्रेल में लॉग करती है
संस्करण चयन स्किल के साथ बंडल किए गए स्टैंडअलोन Python स्क्रिप्ट द्वारा संभाला जाता है, न कि नियमों की व्याख्या करने वाले LLM द्वारा। कमांड `SELECTED: <version>` आउटपुट करता है और Claude उस संस्करण का सटीक उपयोग करता है।
### इंटरसेप्ट मोड (स्वचालित)
स्वचालित, पारदर्शी पैकेज सत्यापन सक्षम करने के लिए `.claude/settings.json` को `PostToolUse` हुक के साथ कॉन्फ़िगर करें:
1. Claude मूल रूप से अनुरोधित संस्करण के साथ एक मैनिफ़ेस्ट फ़ाइल (जैसे `package.json`) लिखता है — फ़ाइल डिस्क पर आ जाती है
2. `PostToolUse` हुक लेखन पूर्ण होते ही तुरंत सक्रिय होता है और `safer-dependencies-shim.sh` को आमंत्रित करता है
3. शिम फ़ाइल पढ़ता है, घोषित पैकेजों को पार्स करता है, और सभी सुरक्षा जाँचें (टाइपोस्क्वाट, परित्यक्त, CVE, स्टेलनेस, हैश-पिन) चलाता है
4. यदि सुधार आवश्यक हैं, तो शिम सुरक्षित संस्करणों के साथ **मैनिफ़ेस्ट को स्थान पर पुनर्लेखित करता है** (या उन प्रविष्टियों को हटा देता है जिनका कोई सुरक्षित संस्करण नहीं है)
5. शिम stdout पर `hookSpecificOutput.additionalContext` के माध्यम से सिग्नल (`UPDATED:`, `BLOCKED:`, `WARNING:`, `STALE:`, `MAJOR-UPDATE-CONFIRM:`, `REFACTOR-REQUIRED:`, `REGRESSION:`, `TYPOSQUAT-CONFIRM:`, `VERIFY:`, `CLEAN:`) उत्सर्जित करता है। `REGRESSION:` एक `MAJOR-UPDATE-CONFIRM:` से पहले आता है जब ऑडिट लॉग दिखाता है कि समान (फ़ाइल, पैकेज) को पहले उसी सुरक्षित लक्ष्य पर सुधारा गया था — अर्थात, एक सबएजेंट या पुरानी योजना ने ज्ञात-कमजोर संस्करण को पुनः प्रस्तुत किया है, और ऑर्केस्ट्रेटर को प्रमुख बंप को फिर से तय करने के बजाय पहले-अनुमोदित संस्करण को पुनर्स्थापित करना चाहिए।
6. Claude उन सिग्नलों को सिस्टम-रिमाइंडर के रूप में प्राप्त करता है और अनुवर्ती कार्य करता है (प्रभावित imports खोजें, परीक्षण चलाएँ, ब्रेकिंग परिवर्तनों के लिए रीफैक्टर करें)
**डिज़ाइन नोट — Shape C (पोस्ट-राइट सुधारात्मक):** हुक लेखन को ब्लॉक नहीं करता। प्रत्येक कमजोर संस्करण पहले डिस्क पर आता है और फिर उसी टूल-उपयोग चक्र के भीतर स्वतः सुधारा जाता है। यह `PreToolUse` ब्लॉकिंग डिज़ाइन पर एक जानबूझकर चयन है — ट्रेडऑफ़ के लिए [FAQ.md](https://github.com/robert-auger/safer-dependencies/blob/main/FAQ.md#why-posttooluse-post-write-corrective-instead-of-pretooluse-pre-write-blocking-for-the-manifest-path) देखें।
**उदाहरण सिग्नल:**```
UPDATED: aiohttp 3.8.5 → 3.9.0 (HIGH: 33 CVEs fixed)
मूल एजेंट इन संकेतों का उपयोग प्रभावित कोड की पहचान करने और आवश्यकतानुसार रीफैक्टर करने के लिए करता है।
पैकेज-मैनेजर इंस्टॉल कमांड की प्री-फ्लाइट ऑडिटिंग सक्षम करने के लिए .claude/settings.json को PreToolUse:Bash हुक के साथ कॉन्फ़िगर करें। यह इंटरसेप्ट मोड का पूरक है (इसे प्रतिस्थापित नहीं करता) — साथ मिलकर ये एक स्तरित सुरक्षा बनाते हैं।
npm install [email protected])PreToolUse हुक सक्रिय होता है और safer-dependencies-pretooluse-bash.sh को आमंत्रित करता हैgit status / ls / npm test हॉट पाथ पर नगण्य लागत वहन करते हैंnpm/pnpm/yarn install/i/add) के लिए, हेल्पर shlex के माध्यम से टोकनाइज़ करता है, प्रत्येक pkg@version तर्क निकालता है, और OSV पर POST करता हैpermissionDecision: "deny" लौटाता है, जिसमें प्रति-फाइंडिंग GHSA-id + CVSS + सारांश, साथ ही safer-dependencies स्किल को आमंत्रित करने का संकेत होता हैयह इंटरसेप्ट मोड के अतिरिक्त क्यों मौजूद है: पोस्ट-राइट शिम Bash के प्रति अंधा है। npm install [email protected] किसी भी ऑडिट सक्रिय होने से पहले पूर्ण रूप से चलता है (और postinstall स्क्रिप्ट निष्पादित होती हैं); npm install -g typosquat-pkg कोई प्रोजेक्ट मैनिफेस्ट ही नहीं लिखता। प्री-इंस्टॉल मोड उन अंतरालों को संरचनात्मक रूप से बंद करता है।
प्री-इंस्टॉल मोड केवल वही देखता है जो उपयोगकर्ता ने टाइप किया है (कमांड लाइन पर pkg@version तर्क)। यह उस ट्रांज़िटिव ट्री को नहीं देख सकता जिसे रिज़ॉल्वर वास्तव में इंस्टॉल करेगा। पोस्ट-इंस्टॉल मोड (नीचे) इंस्टॉल पूर्ण होने पर लॉकफ़ाइल की ऑडिट करता है — दोनों मोड पूरक हैं, अनावश्यक नहीं।
दायरा: यहाँ कवर किए गए पैकेज-मैनेजर CLI पाँच इकोसिस्टम में फैले हैं (npm/pnpm/yarn/bun/npx/deno, pip/pip3/pipx/pipenv/uv/uvx/poetry, gem/bundle, go, cargo), साथ ही इंटरसेप्ट मोड के माध्यम से Maven (Maven निर्भरताएँ आमतौर पर pom.xml/build.gradle में घोषित की जाती हैं, CLI वर्ब के माध्यम से नहीं जोड़ी जातीं)।
ज्ञात अंतराल: Maven CLI
mvn dependency:get -Dartifact=group:art:versionऔरmvn dependency:copyके माध्यम से सीधे डाउनलोड का समर्थन करता है। यह हुक अभी तक उन इनवोकेशन को पहचानता नहीं है। यदि आप इन्हें नियमित रूप से उपयोग करते हैं, तो मौजूदा पोस्ट-राइट शिम अभी भी आपके मैनिफेस्ट में जो कुछ भी आता है उसे पकड़ लेता है, लेकिन प्री-फ़ेच सुरक्षा केवल ऊपर सूचीबद्ध इकोसिस्टम पर लागू होती है। फॉलो-अप के रूप में ट्रैक किया गया।
प्रति-इकोसिस्टम मान्यता प्राप्त सिंटैक्स:
| PM | Verbs | कंक्रीट-पिन सिंटैक्स |
|---|---|---|
npm, pnpm, yarn, bun | install, i, add (साथ ही yarn/pnpm dlx, bun x, yarn create) | [email protected], @scope/[email protected] |
npx | (वर्बलेस — पैकेज पहला पोज़िशनल है) | [email protected] |
deno | add, install | npm:[email protected] (npm-उपसर्गित स्पेक्स) |
pip, pip3, pipx, pipenv, uv, uvx, poetry | install (pip/pip3/pipx/pipenv) / add (uv/poetry) / वर्बलेस (uvx) | pkg==1.2.3 (एक्स्ट्रा pkg[extra]==X भी संभाले जाते हैं) |
gem, bundle | install (gem) / add | -v 1.2.3, --version 1.2.3, --version=1.2.3 (अलग फ़्लैग) |
go | get, install | [email protected] (Go मॉड्यूल के अनुसार v उपसर्ग शामिल होना चाहिए) |
cargo | add, install | [email protected] |
रेंज पिन (npm ^4.17, pip >=, poetry ^/~, Go @latest) और अनिर्दिष्ट संस्करण इंस्टॉल के बाद इंटरसेप्ट मोड में पास हो जाते हैं — पोस्ट-राइट शिम जो भी रिज़ॉल्वर चुनता है उसकी ऑडिट करता है। सुरक्षित संस्करण में ऑटो-रीराइट फॉलो-अप के रूप में कतारबद्ध है।
विफलता मोड: फेल-ओपन। कोई भी त्रुटि (Python अनुपलब्ध, नेटवर्क ब्लिप, गलत इनपुट) बिना आउटपुट के 0 के साथ बाहर निकलती है, जिससे bash आगे बढ़ने देता है। इंटरसेप्ट मोड इंस्टॉल के बाद भी चलता है, इसलिए विफल प्री-फ्लाइट मौजूदा सुरक्षा में सुचारू रूप से डिग्रेड हो जाती है।
उदाहरण अस्वीकृति:``` safer-dependencies pre-flight audit blocked this install. Vulnerable pinned version(s) detected:
### पोस्ट-इंस्टॉल मोड (बैश हुक)
Bash कमांड के बाद पोस्ट-फ्लाइट ऑडिटिंग सक्षम करने के लिए `.claude/settings.json` में `PostToolUse:Bash` हुक कॉन्फ़िगर करें। यह कमांड के `cwd` के विरुद्ध **तीन स्वतंत्र स्कैन** चलाता है, जिनमें से प्रत्येक उस अंतर को भरता है जिसे अन्य हुक संबोधित नहीं कर सकते:
- **स्कैन A — लॉकफ़ाइलें।** एक सफल इंस्टॉल वर्ब (`npm install`, `bundle install`, `poetry install`, `uv sync`, `go mod tidy`, आदि) के बाद, हाल ही में संशोधित लॉकफ़ाइलों (`package-lock.json`, `Gemfile.lock`, `poetry.lock`, `uv.lock`, `go.sum`, `yarn.lock`, `pnpm-lock.yaml`, `Pipfile.lock`) का ऑडिट करता है। यह **ट्रांज़िटिव-CVE अंतर** को बंद करता है जिसे प्री-इंस्टॉल नहीं देख सकता: उपयोगकर्ता ने `pkg@version` टाइप किया, लेकिन रिज़ॉल्वर ने दर्जनों ट्रांज़िटिव पैकेज खींच लिए होंगे जिनका नाम किसी ने नहीं लिया।
- **स्कैन B — मैनिफ़ेस्ट।** किसी भी Bash कमांड के बाद जो रीड-ओनली डेनीलिस्ट (`ls`, `cat`, `git status`, …) पर *नहीं* है, हाल ही में संशोधित मैनिफ़ेस्ट का ऑडिट करता है। यह `sed -i`, `jq`, या स्क्रिप्ट के माध्यम से किए गए मैनिफ़ेस्ट संपादनों के लिए **एकमात्र** फ़ॉलबैक है — वे `Write`/`Edit` टूल को बायपास करते हैं जिस पर इंटरसेप्ट मोड हुक करता है।
- **स्कैन C — हल किया गया वातावरण।** सादा `pip install` / `pip install -r requirements.txt` कोई लॉकफ़ाइल नहीं लिखता, इसलिए स्कैन A हल किए गए ट्री को कभी नहीं देखता। pip-आकार के इंस्टॉल के बाद, स्कैन C उसी pip को रीड-ओनली `list --format=json` के साथ फिर से लागू करता है और पूरे हल किए गए वातावरण (डायरेक्ट + ट्रांज़िटिव) की OSV-जाँच करता है।
स्कैन कैसे चलता है:
1. Claude एक Bash टूल कॉल चलाता है
2. `PostToolUse` हुक कमांड पूरा होने के *बाद* फायर होता है और `safer-dependencies-posttooluse-bash.sh` को लागू करता है
3. एक शुद्ध-बैश प्रारंभिक फ़िल्टर उन कमांडों को शॉर्ट-सर्किट करता है जो ~115 ms में किसी स्कैन गेट से मेल नहीं खाते (प्री-इंस्टॉल के समान फास्ट-पाथ कन्वेंशन), इसलिए `ls` / `git` / `cat` नगण्य लागत वहन करते हैं
4. प्रत्येक स्कैन `find -maxdepth 5` के साथ `cwd` को ट्रैवर्स करता है (मोनोरेपो लेआउट को कवर करता है; `node_modules`, `.git`, `.venv`, `venv` को बाहर करता है) पिछले 60 s के भीतर संशोधित फ़ाइलों के लिए — `SAFE_DEP_POSTINSTALL_MTIME_WINDOW` के माध्यम से ओवरराइड करें
5. प्रत्येक हाल ही में संशोधित फ़ाइल (स्कैन A/B) के लिए, हुक एक सिंथेटिक `PostToolUse:Write` पेलोड बनाता है और इसे मौजूदा शिम में पाइप करता है — शिम के लॉकफ़ाइल और मैनिफ़ेस्ट ऑडिटर अपरिवर्तित चलते हैं, कोई डुप्लिकेट लॉजिक नहीं
6. प्रति-फ़ाइल सिग्नल संयोजित होते हैं और पैरेंट एजेंट को एक `hookSpecificOutput` JSON के रूप में उत्सर्जित होते हैं
**यह क्या पकड़ता है जो प्री-इंस्टॉल नहीं:** ट्रांज़िटिव कमजोरियाँ। एक साफ-सुथरा दिखने वाला `bundle install` `sinatra` के ट्रांज़िटिव के रूप में `[email protected]` (CVE-2025-27610) खींच सकता है — उपयोगकर्ता ने कभी `rack` नहीं टाइप किया, इसलिए प्री-इंस्टॉल इसे नहीं देख सकता, लेकिन पोस्ट-इंस्टॉल हल किए गए `Gemfile.lock` को पढ़ता है और CVE की रिपोर्ट करता है।
**दायरा:** स्कैन A हल किए गए संस्करणों को फिर से नहीं लिखता — ऑटो-करेक्ट अनुबंध केवल उन मैनिफ़ेस्ट पर लागू होता है जिन्हें Claude ने सीधे लिखा था। ट्रांज़िटिव CVE के लिए, फिक्स आमतौर पर "उस डायरेक्ट डिप को अपडेट करें जो ट्रांज़िटिव का मालिक है" होता है, जिसके लिए मानवीय निर्णय की आवश्यकता होती है। स्कैन B *वास्तव में* ऑटो-करेक्ट करता है, क्योंकि यह इंटरसेप्ट मोड के समान शिम पथ के माध्यम से मैनिफ़ेस्ट का ऑडिट करता है। स्कैन A तब छोड़ दिया जाता है जब `transitive` चेक टियर `off` पर सेट होता है (`config set checks.transitive off`)।
**विफलता मोड:** फेल-ओपन, अन्य हुक के समान। कोई भी त्रुटि (शिम गायब, विकृत पेलोड, Python अनुपलब्ध) चुपचाप 0 के साथ बाहर निकलती है।
**उदाहरण WARNING:**```
WARNING: [email protected] in lock file has GHSA-29mw-wpgm-hmr9, GHSA-35jh-r3h4-6jhm
ऊपर बताए गए चार मोड केवल रूट-सेशन टूल कॉल के लिए सक्रिय होते हैं। जब रूट
सेशन किसी सबएजेंट को भेजता है (Agent टूल के माध्यम से — कई स्किल्स और स्लैश
कमांड आंतरिक रूप से ऐसा करते हैं), तो सबएजेंट के Write/Edit/Bash कॉल इन सभी को
बायपास कर देते हैं। पोस्ट-एजेंट मोड उस अंतराल के लिए प्रतिक्रियाशील सुरक्षा जाल है।
PreToolUse:Agent हुक (safer-dependencies-pretooluse-agent.sh) प्रत्येक
Agent डिस्पैच से ठीक पहले चलता है और /tmp/.safer-deps-agent-<PPID>-<session_id>.sentinel
पर एक सेंटिनल फ़ाइल बनाता है (जब कोई सत्र आईडी उपलब्ध न हो तो केवल PPID-आधारित
नाम पर फ़ॉलबैक करता है)PostToolUse:Agent हुक (safer-dependencies-posttooluse-agent.sh) Agent
कॉल लौटने के बाद चलता है, सेंटिनल से नई हर मैनिफेस्ट और लॉकफ़ाइल को find
करता है, और उसी शिम पथ के माध्यम से प्रत्येक का ऑडिट करता हैadditionalContext के रूप में सामने
आते हैं; सेंटिनल हटा दिया जाता हैनेस्टेड सबएजेंट स्वचालित रूप से कवर हो जाते हैं — रूट का PostToolUse:Agent
तभी सक्रिय होता है जब बाहरी एजेंट का सारा काम (जिसमें वह सब कुछ शामिल है जो उसने
भेजा था) डिस्क पर मौजूद हो। एक अंतराल वैश्विक इंस्टॉल है जो कोई मैनिफेस्ट या
लॉकफ़ाइल नहीं लिखता (npm install -g …): स्कैन करने के लिए कुछ भी नहीं होता। अन्य
हुकों की तरह, यह फेल-ओपन होता है — कोई भी त्रुटि (लापता सेंटिनल, लापता शिम,
अपठनीय पेलोड) चुपचाप 0 के साथ बाहर निकलती है। पूर्ण डिज़ाइन तर्क
skills/safer-dependencies.md में दिया गया है।
हर जाँच ~/.claude/safer-dependencies-audit-YYYY-MM.log (प्रति कैलेंडर माह एक फ़ाइल, जहाँ YYYY-MM UTC वर्ष-माह है) में एक JSON लाइन के रूप में लॉग की जाती है। पूर्ण पथ को SAFE_DEP_AUDIT_LOG पर्यावरण चर से ओवरराइड करें (सेट होने पर, दिनांक प्रत्यय नहीं जोड़ा जाता)। फ़ाइलें तब भी आकार-रोटेट होती हैं जब वे SAFE_DEP_LOG_MAX_BYTES (डिफ़ॉल्ट 10 MiB; अक्षम करने के लिए 0 सेट करें) से अधिक हो जाती हैं। प्रत्येक प्रविष्टि में source.model में लिखे मॉडल मान को ओवरराइड करने के लिए SAFE_DEP_MODEL सेट करें — मॉडल संस्करणों के बीच A/B तुलना के लिए उपयोगी।
सभी पाँच मोड एक ही फ़ाइल में जोड़ते हैं। प्रत्येक प्रविष्टि में एक source ब्लॉक (स्कीमा 2.2) होता है जो पहचानता है कि इसे किस घटक ने लिखा:
source.component | किसके द्वारा लिखा गया | ट्रिगर |
|---|---|---|
shim.posttooluse | shim.sh | मैनिफेस्ट या लॉकफ़ाइल लेखन (इंटरसेप्ट मोड, पोस्ट-इंस्टॉल डिस्पैच) |
shim.install_error | shim.sh | शिम प्रीफ़्लाइट इंस्टॉल विफलता |
bash.pretooluse | pretooluse-bash.sh | Bash इंस्टॉल कमांड (प्री-इंस्टॉल मोड) |
bash.posttooluse | posttooluse-bash.sh | पोस्ट-इंस्टॉल Bash हुक स्वयं, जब यह शिम तक पहुँचने से पहले फेल-ओपन होता है |
agent.pretooluse | pretooluse-agent.sh | प्री-एजेंट फेल-ओपन घटनाओं के लिए आरक्षित (हुक स्वयं सफलता पर वर्तमान में मौन है) |
agent.posttooluse | posttooluse-agent.sh | पोस्ट-एजेंट हुक फेल-ओपन घटनाएँ (जैसे शिम लापता, python_missing) |
manual.skill | सामान्य मोड में चल रहा Claude | इनलाइन मैन्युअल ऑडिट |
source.model सत्र में सक्रिय Claude Code मॉडल को रिकॉर्ड करता है (जैसे "claude-sonnet-4-6")। स्कीमा 2.1+ में मौजूद; पुराने इंस्टॉल द्वारा लिखी गई प्रविष्टियाँ फ़ील्ड को छोड़ देती हैं। स्टैट्स कमांड अनुपस्थित होने पर शालीनता से "unknown" पर डिग्रेड हो जाता है।
jq के साथ source.component द्वारा फ़िल्टर करें:```bash
jq -r '.source.component' audit.log | sort | uniq -c | sort -rn
jq -c 'select(.source.component == "bash.pretooluse")' audit.log
jq -c 'select(.source.mode == "fail_open") | {component: .source.component, reason: .fail_open.reason, ts}' audit.log
आसान विश्लेषण के लिए, लॉग को मैन्युअल रूप से पार्स करने के बजाय क्लॉड से उपयोग आँकड़े पूछें:```
"Show safer-dependencies stats for the last month"
यह ऑडिट लॉग से निकाले गए गतिविधि, सुरक्षा प्रभाव और प्रदर्शन मेट्रिक्स के मानव-पठनीय सारांश प्रदान करता है।
प्रविष्टि आकृतियाँ (स्कीमा 2.2)। तीन अलग-अलग आकृतियाँ समान ts / schema / source हेडर साझा करती हैं:
| आकृति | कब लिखी जाती है | विशिष्ट फ़ील्ड |
|---|---|---|
| ऑडिट प्रविष्टि | मैनिफ़ेस्ट / लॉकफ़ाइल / bash-इंस्टॉल ऑडिट | file, ecosystem, checked, findings, abandoned, stale, typosquat, unknown, signatures, notes, clean |
| इंस्टॉल-त्रुटि प्रविष्टि | शिम प्रीफ़्लाइट इंस्टॉल-त्रुटि (घटक shim.install_error) | install_error, shim_dir, scripts_dir |
| फेल-ओपन प्रविष्टि | कोई भी हुक एंट्री-पॉइंट helper_missing / shim_missing / python_missing के कारण जल्दी बाहर निकलता है। source.mode "fail_open" है | fail_open: { reason, detail? } |
ऑडिट प्रविष्टियाँ: इंटरसेप्ट मोड पूरी पाइपलाइन (प्रोवेनेंस, संस्करण आयु, OSV, abandoned/stale, typosquat, signatures) चलाता है, इसलिए सभी ऐरे भरे जा सकते हैं। प्री-इंस्टॉल मोड आज केवल OSV चलाता है, इसलिए abandoned / stale / typosquat / signatures हमेशा खाली रहते हैं। पोस्ट-इंस्टॉल डिस्पैच (लॉकफ़ाइल ऑडिट) shim.posttooluse के अंतर्गत लिखता है, जिसमें findings लॉकफ़ाइल ऑडिटर्स के WARNING: स्ट्रिंग्स से भरे जाते हैं। notes ऐरे सूचनात्मक NOTE: सिग्नल (जैसे मैनिफ़ेस्ट-स्किप्ड-क्योंकि-अनपिन्ड) ले जाता है।
स्कीमा 2.2 ने — योगात्मक रूप से — लॉकफ़ाइल ऑडिट प्रविष्टियों में चार फ़ील्ड जोड़े: lockfile, manifest_ref, relation_summary (सहोदर मैनिफ़ेस्ट के विरुद्ध प्रत्येक फ़्लैग किए गए पैकेज का प्रत्यक्ष/ट्रांज़िटिव/अज्ञात वर्गीकरण), और एक policy ब्लॉक जो लागू transitive टियर दर्ज करता है। यह बदलाव पिछड़ा-संगत है: 2.1 प्रविष्टियों के पाठक नए फ़ील्ड सहन करते हैं, और source.model फ़ील्ड 2.1 से आगे भी मौजूद रहता है।```json
{
"ts": "2026-04-19T12:34:56Z",
"schema": "2.2",
"source": {
"component": "shim.posttooluse",
"script": "shim.sh",
"hook": "PostToolUse:Write",
"tool": "Write",
"mode": "intercept",
"model": "claude-sonnet-4-6"
},
"file": "/path/to/project/package.json",
"ecosystem": "npm",
"checked": ["[email protected]", "[email protected]"],
"findings": ["UPDATED: express 4.18.2 → 4.22.1 (HIGH: 1 CVE fixed)"],
"abandoned": [],
"stale": [],
"typosquat": [],
"unknown": [],
"signatures": [],
"notes": [],
"clean": ["[email protected]"]
}
प्री-इंस्टॉल मोड उदाहरण (Bash हुक, असुरक्षित पिन अस्वीकृत):```json
{
"ts": "2026-04-23T06:56:21Z",
"schema": "2.2",
"source": {
"component": "bash.pretooluse",
"script": "pretooluse-bash.sh",
"hook": "PreToolUse:Bash",
"tool": "Bash",
"mode": "intercept",
"model": "claude-sonnet-4-6"
},
"file": "bash:npm install [email protected] [email protected]",
"ecosystem": "npm",
"checked": ["[email protected]", "[email protected]"],
"findings": [
"BLOCKED: [email protected] GHSA-35jh-r3h4-6jhm (CVSS:3.1/...): Command Injection in lodash"
],
"abandoned": [],
"stale": [],
"typosquat": [],
"unknown": [],
"signatures": [],
"notes": [],
"clean": ["[email protected]"]
}
फेल-ओपन मोड उदाहरण (पोस्ट-इंस्टॉल बैश हुक जो बिना किसी शिम के पास में कॉल किया गया — टूटी हुई इंस्टॉल):```json { "ts": "2026-05-03T07:14:11Z", "schema": "2.2", "source": { "component": "bash.posttooluse", "script": "safer-dependencies-posttooluse-bash.sh", "hook": "PostToolUse", "tool": "Bash", "mode": "fail_open", "model": "claude-sonnet-4-6" }, "fail_open": { "reason": "shim_missing", "detail": "/home/alice/.claude/skills/safer-dependencies" } }
एक fail-open प्रविष्टि कहती है: "यह हुक फायर हुआ लेकिन बिना ऑडिट किए जल्दी बाहर निकल गया क्योंकि कोई पूर्वापेक्षा गायब थी।" अपने लॉग में हर मूक सुरक्षा-हानि घटना को सतह पर लाने के लिए उपरोक्त jq फ़िल्टर (`select(.source.mode == "fail_open")`) का उपयोग करें।
जब शिम ड्राई-रन मोड में चलता है (`SAFE_DEP_DRY_RUN=1`), प्रविष्टियों में `"mode": "dry_run"` भी शामिल होता है ताकि पोस्ट-हॉक विश्लेषण केवल-ऑडिट इनवोकेशन को फ़िल्टर कर सके।
## आवश्यकताएँ
- Python 3.9+ (हुक इसकी जाँच करते हैं और पुराने इंटरप्रेटरों पर fail-open होते हैं)
- `curl` (रजिस्ट्री API कॉल और OSV भेद्यता जाँच के लिए)
- इकोसिस्टम उपकरण (वैकल्पिक, गायब होने पर स्किल OSV API पर वापस आ जाती है):
- npm पैकेजों के लिए `npm`
- Python पैकेजों के लिए `pip-audit`
- Ruby पैकेजों के लिए `bundle`
- Java पैकेजों के लिए `dependency-check`
## FAQ
डिज़ाइन-निर्णय तर्क (PreToolUse के बजाय PostToolUse क्यों, हस्ताक्षर सत्यापित क्यों नहीं किए जाते, स्क्रिप्ट और शिम डुप्लिकेट क्यों हैं, स्किल-लोडिंग गॉचा, आदि) [`FAQ.md`](https://github.com/robert-auger/safer-dependencies/blob/main/FAQ.md) में प्रलेखित है।