
AI कोडिंग सहायकों के लिए स्वचालित निर्भरता सुरक्षा परत जो npm, PyPI, RubyGems, Maven, Go और Rust पारिस्थितिकी तंत्रों में CVEs, typosquats, abandonment, version-age issues और hash integrity के लिए पैकेजों का ऑडिट करती है।
जब Claude जैसे AI कोडिंग सहायक आपके प्रोजेक्ट में पैकेज जोड़ते हैं, तो वे अक्सर वही संस्करण चुन लेते हैं जो सही लगता है — बिना यह जाँचे कि उसमें ज्ञात सुरक्षा कमज़ोरियाँ हैं या नहीं, क्या पैकेज अभी भी सक्रिय रूप से बनाए रखा गया है, या क्या नाम किसी दुर्भावनापूर्ण नकली से केवल एक टाइपो की दूरी पर है।
safer-dependencies, Claude Code के लिए एक सुरक्षा परत है: यह Claude और आपकी manifest फ़ाइलों के बीच बैठता है और अपनी सुरक्षा जाँचें स्वचालित रूप से चलाता है: कमज़ोर इंस्टॉल चलने से पहले ही अस्वीकार कर दिए जाते हैं, और manifest में लिखा गया जोखिम भरा संस्करण लिखे जाने के तुरंत बाद डिस्क पर सुधार दिया जाता है। यह जोखिम भरी निर्भरताओं का पता लगाता है और उन्हें ठीक करता है — CVEs, typosquats, परित्यक्त (abandoned) पैकेज, और संस्करण-आयु (version-age) समस्याएँ, साथ ही नए-नए रिलीज़ के लिए एक cooldown अवधि — npm, PyPI, RubyGems, Maven, Go, Rust, और PHP (Composer) में। वास्तव में क्या कवर किया जाता है और क्या नहीं, इसके लिए CAPABILITIES.md देखें।
नए हैं? GETTING-STARTED.md आपको लगभग पाँच मिनट में शून्य से एक कार्यशील इंस्टॉल तक पहुँचाता है।
सुरक्षा और गोपनीयता: SECURITY.md (कमज़ोरियों का खुलासा), PRIVACY.md (डेटा ईग्रेस, कोई टेलीमेट्री नहीं), और CAPABILITIES.md (टूल किस चीज़ से बचाता है और किससे नहीं) देखें।
लाइसेंस (source-available — OSI "ओपन सोर्स" नहीं): अपने स्वयं के उद्देश्यों के लिए उपयोग और संशोधन करना निःशुल्क है, जिसमें लाभ-कमाई/कंपनी आंतरिक उपयोग और ऐसे उत्पाद बनाना शामिल है जिन्हें आप बेचते हैं। एक अलग सशुल्क लाइसेंस केवल सॉफ़्टवेयर को स्वयं मुद्रीकृत करने के लिए आवश्यक है — उसे बेचना, उसे किसी बेचे जाने वाले उत्पाद या सेवा के अंदर भेजना, या उसकी कार्यक्षमता को शुल्क लेकर तीसरे पक्षों को प्रदान करना (hosted/SaaS/API सहित)। पुनर्वितरण और व्युत्पन्न कार्यों को लाइसेंस बनाए रखना चाहिए और इस प्रोजेक्ट को श्रेय देना चाहिए। LICENSE देखें (वाणिज्यिक प्रतिबंध के लिए धारा 4); वाणिज्यिक-लाइसेंस अनुरोध github.com/robert-auger के माध्यम से।
GETTING-STARTED.md आपको लगभग पाँच मिनट में शून्य से एक कार्यशील इंस्टॉल तक पहुँचाता है — पूर्वापेक्षाएँ, इंटरैक्टिव इंस्टॉल, और सत्यापन। पूर्ण इंस्टॉल संदर्भ (वैश्विक/प्रोजेक्ट/मैनुअल इंस्टॉल, Windows विशेषताएँ, अनुमति allowlist, अपडेट करना, और अनइंस्टॉल करना) के लिए INSTALLATION.md देखें।
रोज़मर्रा का उपयोग: एक बार हुक इंस्टॉल हो जाने के बाद, चलाने के लिए कुछ नहीं है — safer-dependencies पृष्ठभूमि में स्वचालित रूप से काम करता है। जैसे ही Claude पैकेज जोड़ता या इंस्टॉल करता है, यह जोखिम भरी निर्भरताओं को फ़्लैग करता है और कमज़ोर संस्करणों को वहीं सुरक्षित संस्करण में अपग्रेड करता है — और किसी ज्ञात-कमज़ोर इंस्टॉल को चलने से पहले ही ब्लॉक कर देता है — ताकि असुरक्षित पैकेज पकड़े जाएँ और बिना आपके पूछे ठीक कर दिए जाएँ। आप फिर भी इसे किसी भी समय सीधे कॉल कर सकते हैं: "क्या [email protected] सुरक्षित है?", "safer-dependencies सेटअप जाँचें", या "safer-dependencies आँकड़े दिखाएँ"।
जब Claude आपके प्रोजेक्ट में एक पैकेज जोड़ने वाला होता है, safer-dependencies बीच में आकर 5 जाँचें चलाता है:
requirements.txt की उन पंक्तियों के लिए जिनमें --hash=sha256:... पिन हैं, घोषित हैश की पुष्टि PyPI के प्रकाशित हैशों से की जाती है; बेमेल होने पर WARNING जारी होता हैpaperclip, request, pycrypto, github.com/dgrijalva/jwt-go) तुरंत हार्ड-ब्लॉक कर दिए जाते हैं, सुझाए गए प्रतिस्थापन के साथ; जिन पैकेजों का 2+ वर्षों में कोई स्थिर रिलीज़ नहीं हुआ है, उन्हें एक सलाहकार STALE: चेतावनी मिलती है। हार्ड-ब्लॉक किए गए पैकेज manifest से हटा दिए जाते हैं और Claude पूछेगा कि आगे कैसे बढ़ना है; केवल stale पैकेजों को यथावत छोड़ दिया जाता है।यदि समस्याएँ मिलती हैं, तो Claude चेतावनी जारी करता है और किसी सुरक्षित संस्करण पर वापस जा सकता है। सभी जाँचें ~/.claude/safer-dependencies-audit-YYYY-MM.log में लॉग होती हैं (प्रति कैलेंडर माह एक फ़ाइल)।
यह स्किल पाँच मोड में काम करती है (नीचे सारांश दिया गया है; सबसे गहन डिज़ाइन तर्क skills/safer-dependencies.md में है):
जब Claude कोई import लिखने, manifest में पैकेज जोड़ने, या lock फ़ाइल अपडेट करने वाला होता है, यह स्किल आपके सत्र में इनलाइन चलती है:
संस्करण चयन को स्किल के साथ बंडल की गई स्टैंडअलोन Python स्क्रिप्ट संभालती हैं, न कि LLM जो नियमों की व्याख्या करता है। कमांड SELECTED: <version> आउटपुट करता है और Claude उसी संस्करण का उपयोग करता है।
स्वचालित, पारदर्शी पैकेज सत्यापन सक्षम करने के लिए .claude/settings.json को PostToolUse हुक के साथ कॉन्फ़िगर करें:
package.json) लिखता है — फ़ाइल डिस्क पर आ जाती हैPostToolUse हुक लिखने के पूरा होते ही तुरंत चालू होता है और safer-dependencies-shim.sh को इनवोक करता हैhookSpecificOutput.additionalContext के माध्यम से stdout पर सिग्नल (UPDATED:, BLOCKED:, WARNING:, STALE:, MAJOR-UPDATE-CONFIRM:, REFACTOR-REQUIRED:, REGRESSION:, TYPOSQUAT-CONFIRM:, , ) जारी करता है। एक से पहले आता है जब ऑडिट लॉग दिखाता है कि उसी (फ़ाइल, पैकेज) को पहले उसी सुरक्षित लक्ष्य पर सुधारा गया था — अर्थात, किसी subagent या पुरानी योजना ने किसी ज्ञात-कमज़ोर संस्करण को फिर से ला दिया है, और orchestrator को मेजर बम्प का पुनः निर्णय करने के बजाय पहले से अनुमोदित संस्करण बहाल करना चाहिए।डिज़ाइन नोट — Shape C (post-write corrective): हुक लिखने को ब्लॉक नहीं करता। प्रत्येक कमज़ोर संस्करण पहले डिस्क पर आता है और फिर उसी tool-use चक्र में स्वतः सुधारा जाता है। यह PreToolUse ब्लॉकिंग डिज़ाइन के मुकाबले एक जानबूझकर चुना गया विकल्प है — व्यापार-बंदों के लिए FAQ.md देखें।
उदाहरण सिग्नल:``` UPDATED: aiohttp 3.8.5 → 3.9.0 (HIGH: 33 CVEs fixed)
मूल एजेंट इन सिग्नलों का उपयोग प्रभावित कोड की पहचान करने और आवश्यकतानुसार रीफैक्टर करने के लिए करता है।
### प्री-इंस्टॉल मोड (बैश हुक)
`.claude/settings.json` को `PreToolUse:Bash` हुक के साथ कॉन्फ़िगर करें ताकि
पैकेज-मैनेजर इंस्टॉल कमांडों की प्री-फ्लाइट ऑडिटिंग सक्षम हो सके। यह
इंटरसेप्ट मोड का पूरक है (प्रतिस्थापन नहीं) — साथ मिलकर ये एक स्तरित सुरक्षा बनाते हैं।
1. Claude एक बैश टूल कॉल का प्रयास करता है (जैसे `npm install [email protected]`)
2. कॉल चलने से पहले `PreToolUse` हुक सक्रिय होता है और
`safer-dependencies-pretooluse-bash.sh` को आह्वान करता है
3. एक शुद्ध-बैश प्रारंभिक फ़िल्टर गैर-पीएम कमांडों को ~115 ms में शॉर्ट-सर्किट कर देता है
(कोई Python आह्वान नहीं), इसलिए `git status` / `ls` / `npm test` को
हॉट पाथ पर नगण्य लागत चुकानी पड़ती है
4. पहचाने गए पैकेज-मैनेजर इंस्टॉलों के लिए (`npm`/`pnpm`/`yarn`
`install`/`i`/`add`), सहायक `shlex` के माध्यम से टोकनाइज़ करता है, प्रत्येक
`pkg@version` तर्क निकालता है, और OSV को POST करता है
5. कोई भी असुरक्षित कंक्रीट पिन → हुक लौटाता है
`permissionDecision: "deny"` प्रति-खोज GHSA-id + CVSS +
सारांश के साथ, साथ ही safer-dependencies स्किल को आह्वान करने का संकेत देता है
6. इंस्टॉल कभी नहीं चलता — कोई नेटवर्क फ़ेच नहीं, कोई पोस्टइंस्टॉल स्क्रिप्ट नहीं
**यह इंटरसेप्ट मोड के अतिरिक्त क्यों मौजूद है:** पोस्ट-राइट शिम
बैश के प्रति अंधा है। `npm install [email protected]` पूर्ण रूप से चलता है (और
कोई भी ऑडिट सक्रिय होने से पहले पोस्टइंस्टॉल स्क्रिप्ट निष्पादित होती हैं); `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 | क्रियाएँ | कंक्रीट-पिन सिंटैक्स |
|---|---|---|
| `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 से बाहर निकलती है, जिससे बैश आगे बढ़ पाता है।
इंटरसेप्ट मोड इंस्टॉल के बाद भी चलता है, इसलिए विफल प्री-फ्लाइट
मौजूदा सुरक्षा में सुचारू रूप से अवक्रमित हो जाती है।
**उदाहरण अस्वीकृति:**```
safer-dependencies pre-flight audit blocked this install.
Vulnerable pinned version(s) detected:
- [email protected] → GHSA-35jh-r3h4-6jhm (CVSS:7.4): Command Injection in lodash
Re-run with a patched version, or invoke the safer-dependencies skill
for a recommended pin.
.claude/settings.json को PostToolUse:Bash हुक के साथ कॉन्फ़िगर करें ताकि
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). यह transitive-CVE अंतराल को बंद करता है जिसे प्री-इंस्टॉल नहीं
देख सकता: उपयोगकर्ता ने pkg@version टाइप किया, लेकिन रिज़ॉल्वर ने खींच लिए होंगे
दर्जनों transitive पैकेज जिन्हें किसी ने नामित नहीं किया।
स्कैन कैसे चलता है:
PostToolUse हुक कमांड के पूरा होने के बाद फायर होता है और आमंत्रित करता है
safer-dependencies-posttooluse-bash.shls / git / cat
नगण्य लागत चुकाते हैंcwd को find -maxdepth 5 के साथ पार करता है (मोनोरेपो लेआउट कवर करता है;
node_modules, .git, .venv, venv को बाहर करता है) उन फ़ाइलों के लिए जो
पिछले 60 सेकंड के भीतर संशोधित हुई हैं — SAFE_DEP_POSTINSTALL_MTIME_WINDOW के माध्यम से ओवरराइड करेंPostToolUse:Write पेलोड बनाता है और इसे मौजूदा शिम में पाइप करता है — शिम के
लॉकफ़ाइल और मेनिफ़ेस्ट ऑडिटर बिना किसी बदलाव के चलते हैं, कोई डुप्लिकेट लॉजिक नहींयह ऐसा क्या पकड़ता है जो प्री-इंस्टॉल नहीं पकड़ता: transitive भेद्यताएँ।
एक साफ-सुथरा दिखने वाला bundle install [email protected] (CVE-2025-27610) को खींच सकता है
sinatra के transitive के रूप में — उपयोगकर्ता ने कभी rack नहीं लिखा, इसलिए
प्री-इंस्टॉल इसे नहीं देख सकता, लेकिन पोस्ट-इंस्टॉल हल किए गए
Gemfile.lock को पढ़ता है और CVE की रिपोर्ट करता है।
दायरा: स्कैन A हल किए गए संस्करणों को फिर से नहीं लिखता — ऑटो-सुधार
अनुबंध केवल उन मेनिफ़ेस्ट पर लागू होता है जिन्हें Claude ने सीधे लिखा था। transitive CVE के लिए,
समाधान आमतौर पर "उस डायरेक्ट डिप को अपडेट करें जो transitive का स्वामी है," जो
मानवीय निर्णय की आवश्यकता होती है। स्कैन B ऑटो-सुधार करता है, क्योंकि यह मेनिफ़ेस्ट का ऑडिट करता है
इंटरसेप्ट मोड के समान शिम पथ के माध्यम से। स्कैन A तब छोड़ दिया जाता है जब
transitive जाँच टियर को off पर सेट किया जाता है (config set checks.transitive off).
विफलता मोड: fail-open, अन्य हुकों के समान। कोई भी त्रुटि (शिम गायब, विकृत पेलोड, Python उपलब्ध नहीं) चुपचाप 0 के साथ बाहर निकलती है।
उदाहरण चेतावनी:``` WARNING: [email protected] in lock file has GHSA-29mw-wpgm-hmr9, GHSA-35jh-r3h4-6jhm
### पोस्ट-एजेंट मोड (एजेंट हुक जोड़ी)
उपरोक्त चार मोड केवल **रूट-सेशन** टूल कॉल के लिए सक्रिय होते हैं। जब रूट
सेशन एक सबएजेंट भेजता है (`Agent` टूल के माध्यम से — कई स्किल्स और स्लैश
कमांड आंतरिक रूप से ऐसा करते हैं), सबएजेंट के Write/Edit/Bash कॉल इन सभी को
बायपास कर देते हैं। पोस्ट-एजेंट मोड उस अंतराल के लिए प्रतिक्रियाशील सुरक्षा जाल है।
1. एक `PreToolUse:Agent` हुक (`safer-dependencies-pretooluse-agent.sh`) चलता है
प्रत्येक Agent डिस्पैच से तुरंत पहले और एक सेंटिनल फ़ाइल को यहाँ छूता है:
`/tmp/.safer-deps-agent-<PPID>-<session_id>.sentinel` (फ़ॉलबैक करता है
केवल-PPID नाम पर जब कोई session id उपलब्ध न हो)
2. सबएजेंट चलता है और मैनिफेस्ट या लॉकफ़ाइल लिख सकता है
3. एक `PostToolUse:Agent` हुक (`safer-dependencies-posttooluse-agent.sh`) चलता है
Agent कॉल लौटने के बाद, सेंटिनल से नई हर मैनिफेस्ट और लॉकफ़ाइल को `find` करता है
और उसी शिम पथ के माध्यम से प्रत्येक का ऑडिट करता है
4. निष्कर्ष रूट सत्र के अगले टर्न पर `additionalContext` के रूप में सामने आते हैं; सेंटिनल
हटा दिया जाता है
नेस्टेड सबएजेंट स्वचालित रूप से कवर हो जाते हैं — रूट का `PostToolUse:Agent`
तभी सक्रिय होता है जब बाहरी एजेंट का सारा काम (जिसमें *उसके* द्वारा भेजा गया कुछ भी शामिल है)
डिस्क पर होता है। एक अंतराल ग्लोबल इंस्टॉल है जो कोई मैनिफेस्ट या लॉकफ़ाइल नहीं लिखता
(`npm install -g …`): स्कैन करने के लिए कुछ नहीं होता। अन्य हुकों की तरह,
यह फेल-ओपन है — कोई भी त्रुटि (सेंटिनल गायब, शिम गायब,
अपठनीय पेलोड) चुपचाप 0 से बाहर निकलती है। पूर्ण डिज़ाइन तर्क यहाँ दिया गया है:
`skills/safer-dependencies.md`
## यह कब सक्रिय होता है
स्किल तब स्वचालित रूप से सक्रिय होती है जब Claude:
**मैनिफेस्ट / इंस्टॉल ऑपरेशन**
- `package.json`, `requirements.txt`, `Gemfile`, `pom.xml`, `build.gradle`, `Cargo.toml`, `go.mod`, या किसी अन्य समर्थित मैनिफेस्ट में एक पैकेज जोड़ता या अपडेट करता है
- मैनिफेस्ट में पहले से घोषित न किए गए पैकेज के लिए `import`, `require`, या `use` लिखता है
- एक लॉक फ़ाइल उत्पन्न या अपडेट करता है (केवल नई/बदली हुई प्रविष्टियों की जाँच करता है)
- Bash के माध्यम से एक पैकेज-मैनेजर इंस्टॉल चलाता है (`npm install`, `bundle install`, `poetry install`, `uv sync`, `go mod tidy`, आदि) — प्री-इंस्टॉल कमांड आर्ग्स का ऑडिट करता है, पोस्ट-इंस्टॉल परिणामी लॉकफ़ाइल का ऑडिट करता है
- एक `Dockerfile` या CI वर्कफ़्लो (`.github/workflows/*.yml`, आदि) लिखता है जिसमें पिन किए गए पैकेज-मैनेजर इंस्टॉल चरण शामिल होते हैं
**चयन और अनुशंसा प्रश्न**
- लाइब्रेरी/फ्रेमवर्क तुलनाएँ: "क्या मुझे axios या node-fetch इस्तेमाल करना चाहिए?", "moment बनाम dayjs?", "कौन सा बेहतर है X या Y?"
- अनुशंसा अनुरोध: "Python के लिए एक अच्छा HTTP क्लाइंट कौन सा है?", "Go के लिए एक लॉगिंग लाइब्रेरी सुझाएँ", "Node में CSV कौन सा पैकेज संभालता है?"
- वर्शन चयन: "मुझे Django का कौन सा वर्शन इस्तेमाल करना चाहिए?", "नवीनतम स्थिर Flask?"
**उपयोग-का-इरादा अभिव्यक्तियाँ (पहले-जोड़ें)**
- "मैं इसके लिए FastAPI उपयोग करना चाहता हूँ", "मैं Celery जोड़ने के बारे में सोच रहा हूँ", "हम ORM के रूप में Prisma देख रहे हैं", "चलो Tailwind उपयोग करते हैं"
**पैकेज स्वास्थ्य और विश्वास प्रश्न**
- "क्या moment.js अभी भी मेंटेन किया जाता है?", "क्या यह gem अभी भी सक्रिय है?", "क्या X छोड़ दिया गया है?", "क्या X EOL है?", "क्या मैं इस पैकेज पर भरोसा कर सकता हूँ?", "faker को आखिरी बार कब अपडेट किया गया था?"
**स्कैफोल्डिंग कमांड्स**
- `npx create-react-app`, `npm create vite@latest`, `django-admin startproject`, `rails new`, `cargo new` + `cargo add`, "एक नया FastAPI प्रोजेक्ट बूटस्ट्रैप करें"
**अप्रत्यक्ष पैकेज जोड़ (फ़ीचर अनुरोध जो एक नई निर्भरता का संकेत देते हैं)**
- "ऐप में Redis कैशिंग जोड़ें", "Postgres से कनेक्ट करें", "JWT auth जोड़ें", "ईमेल भेजने के लिए कोड लिखें" — यह तब सक्रिय होता है जब उस क्षमता के लिए कोई पैकेज पहले से मैनिफेस्ट में नहीं होता
**माइग्रेशन और पोर्टिंग**
- "requests से httpx में माइग्रेट करें", "CRA से Vite में जाएँ", "moment से date-fns में पोर्ट करें" — आने वाले पैकेज का ऑडिट करता है
यह **नहीं** सक्रिय होता है:
- स्टैंडर्ड लाइब्रेरी इम्पोर्ट्स (`os`, `fs`, `java.util.*`, आदि)
- पहले से घोषित निर्भरताएँ जिन्हें बदला नहीं जा रहा है
- किसी पैकेज के आंतरिक कार्य के बारे में शैक्षणिक चर्चा ("React के reconciler को समझाएँ", "webpack का module resolution कैसे काम करता है?") — तुलना और चयन प्रश्न अभी भी सक्रिय होते हैं
- OS-स्तरीय ऐप्स, रनटाइम्स, या IDE एक्सटेंशन इंस्टॉल करना (Python खुद, Docker, Homebrew, VS Code एक्सटेंशन)
## इस रिपॉजिटरी में क्या है
यह एक **स्किल + हुक बंडल** है, कोई एकल स्किल फ़ाइल नहीं। एक पूर्ण इंस्टॉल इन टुकड़ों को तैनात करता है:
| File | Role |
|---|---|
| `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` हुक — Bash कमांड्स के बाद पोस्ट-फ्लाइट ऑडिट; ताज़े लिखे लॉकफ़ाइलों, `sed`/`jq`/स्क्रिप्ट्स के माध्यम से संपादित मैनिफेस्टों, और सादे `pip install` के रिज़ॉल्व्ड एनवायरनमेंट में ट्रांज़िटिव CVE पकड़ता है (पोस्ट-इंस्टॉल मोड). |
| `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` | इंटरैक्टिव इंस्टॉलेशन, उपयोग आँकड़े, और सेटअप सत्यापन के लिए प्रबंधन मॉड्यूल. |
अकेली स्किल फ़ाइल पर्याप्त नहीं है — हुकों के बिना, स्वचालित आह्वान Claude के स्किल तक पहुँचने के निर्णय पर निर्भर करता है। पूर्ण कवरेज के लिए सभी पाँच टुकड़े इंस्टॉल करें; कई स्किल्स और स्लैश कमांड आंतरिक रूप से सबएजेंट भेजते हैं, इसलिए पोस्ट-एजेंट जोड़ी मायने रखती है भले ही आप कभी स्पष्ट रूप से एक न बनाएँ। (देखें [FAQ.md](https://github.com/robert-auger/safer-dependencies/blob/HEAD/FAQ.md#why-a-skill-alone-is-not-sufficient) कि एक स्किल अकेले कवरेज की गारंटी क्यों नहीं दे सकती.)
## समर्थित इकोसिस्टम
| Ecosystem | Manifest | Lock file |
|-----------|----------|-----------|
| 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](https://github.com/robert-auger/safer-dependencies/blob/HEAD/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 में हैं, जो इंस्टॉल तंत्र का एकमात्र संदर्भ है: मैन्युअल फ़ाइल-दर-फ़ाइल इंस्टॉल (ग्लोबल और प्रोजेक्ट-स्तर), Windows विशेषताएँ, Post-Agent हुक, अनुमति-सूची, सेटअप का सत्यापन, अपडेट, रिलीज़ टैग पर पिन करना और अनइंस्टॉल करना।
इंस्टॉल के बाद, दैनिक प्रबंधन Claude के साथ प्राकृतिक भाषा में किया जाता है — install safer-dependencies (पुनः चलाना / हुक बदलना), show safer-dependencies stats, check safer-dependencies setup — या /safer-dependencies मेनू के माध्यम से। अपडेट करना भी सत्र के भीतर ही होता है: /safer-dependencies update नवीनतम रिलीज़ लागू करता है (update --check ड्राई-रन के लिए, update --rollback पूर्ववत करने के लिए); विश्वास मॉडल के लिए INSTALLATION.md देखें।
प्लेटफ़ॉर्म नोट: 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 → अनुमति-सूची।off/warn/block स्तर, जिसे /safer-dependencies config से संपादित किया जाता है और ~/.config/safer-dependencies/config.toml में संग्रहीत किया जाता है। स्कीमा और स्तर शब्दार्थ: skills/references/configuration.md।हर जाँच ~/.claude/safer-dependencies-audit-YYYY-MM.log में एक JSON पंक्ति के रूप में लॉग होती है (प्रत्येक कैलेंडर माह के लिए एक फ़ाइल, जहाँ YYYY-MM UTC वर्ष-माह है)। SAFE_DEP_AUDIT_LOG पर्यावरण चर से पूर्ण पथ को ओवरराइड करें (सेट होने पर, दिनांक प्रत्यय नहीं जोड़ा जाता)। फ़ाइलें SAFE_DEP_LOG_MAX_BYTES (डिफ़ॉल्ट 10 MiB; अक्षम करने के लिए 0 सेट करें) से अधिक होने पर आकार-आधारित रोटेशन (size-rotation) के अधीन भी होती हैं। प्रत्येक प्रविष्टि में source.model में लिखे गए मॉडल मान को ओवरराइड करने के लिए SAFE_DEP_MODEL सेट करें — मॉडल संस्करणों के बीच A/B तुलना के लिए उपयोगी।
सभी पाँच मोड एक ही फ़ाइल में जोड़ते (append) हैं। प्रत्येक प्रविष्टि में एक source ब्लॉक (स्कीमा 2.2) होता है जो यह पहचानता है कि उसे किस घटक ने लिखा है:
source.model सत्र में सक्रिय Claude Code मॉडल को दर्ज करता है (जैसे "claude-sonnet-4-6")। स्कीमा 2.1+ में मौजूद; पुराने इंस्टॉल द्वारा लिखी गई प्रविष्टियाँ इस फ़ील्ड को छोड़ देती हैं। जब यह अनुपस्थित होता है, तो stats कमांड सुचारू रूप से "unknown" पर वापस आ जाता है।
source.component द्वारा jq से फ़िल्टर करें:```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 हेडर साझा करते हैं:
ऑडिट प्रविष्टियाँ: इंटरसेप्ट मोड पूरी पाइपलाइन चलाता है (provenance, version age, OSV, abandoned/stale, typosquat, signatures), इसलिए सभी ऐरे भरे जा सकते हैं। प्री-इंस्टॉल मोड अभी केवल OSV चलाता है, इसलिए abandoned / stale / typosquat / signatures हमेशा खाली रहते हैं। पोस्ट-इंस्टॉल डिस्पैच (लॉकफ़ाइल ऑडिट) shim.posttooluse के अंतर्गत लिखता है, जिसमें findings लॉकफ़ाइल ऑडिटर्स के WARNING: स्ट्रिंग्स से भरा जाता है। notes ऐरे सूचनात्मक NOTE: सिग्नल रखता है (जैसे manifest-skipped-because-unpinned)।
स्कीमा 2.2 ने लॉकफ़ाइल ऑडिट प्रविष्टियों में — योगात्मक रूप से — चार फ़ील्ड जोड़े: lockfile, manifest_ref, relation_summary (सहोदर मेनिफेस्ट के सापेक्ष प्रत्येक फ़्लैग किए गए पैकेज का direct/transitive/unknown वर्गीकरण), और एक 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]"]
}
Fail-open Mode उदाहरण (बिना निकटवर्ती shim के बुलाया गया Post-Install Bash hook — टूटी हुई स्थापना):```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")`) का उपयोग करें।
जब shim dry-run मोड में चलता है (`SAFE_DEP_DRY_RUN=1`), तो प्रविष्टियों में `"mode": "dry_run"` भी शामिल होता है, ताकि पोस्ट-हॉक विश्लेषण केवल-ऑडिट आह्वानों को फ़िल्टर कर सके।
## आवश्यकताएँ
- Python 3.9+ (हुक इसकी जाँच करते हैं और पुराने इंटरप्रेटरों पर fail-open हो जाते हैं)
- `curl` (रजिस्ट्री API कॉल और OSV भेद्यता जाँचों के लिए)
- इकोसिस्टम उपकरण (वैकल्पिक, गुम होने पर skill OSV API का सहारा लेता है):
- `npm` npm पैकेजों के लिए
- `pip-audit` Python पैकेजों के लिए
- `bundle` Ruby पैकेजों के लिए
- `dependency-check` Java पैकेजों के लिए
## FAQ
डिज़ाइन-निर्णय का तर्क (क्यों `PostToolUse` न कि `PreToolUse`, हस्ताक्षर सत्यापित क्यों नहीं किए जाते, स्क्रिप्ट और shim डुप्लिकेट क्यों हैं, skill-लोडिंग की अड़चनें, आदि) [`FAQ.md`](https://github.com/robert-auger/safer-dependencies/blob/HEAD/FAQ.md) में प्रलेखित है।
VERIFY:CLEAN:REGRESSION:MAJOR-UPDATE-CONFIRM:स्कैन 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 के साथ पुनः आमंत्रित करता है और पूरे हल किए गए
वातावरण (डायरेक्ट + transitive) की OSV-जाँच करता है।
hookSpecificOutput
JSON के रूप में पैरेंट एजेंट को उत्सर्जित किए जाते हैं| स्तर | अर्थ | उदाहरण |
|---|
| CRITICAL | रुकें और उपयोगकर्ता से पूछें | टाइपोस्क्वैट पाया गया, छेड़छाड़ किया गया हस्ताक्षर |
| HIGH | चेतावनी दें और आगे बढ़ें | ज्ञात CVE, पैकेज 30 दिन से कम पुराना |
| MEDIUM | चेतावनी दें और आगे बढ़ें | संस्करण 7 दिन से कम पुराना, अनुपलब्ध हस्ताक्षर |
| LOW | चेतावनी दें और आगे बढ़ें | बिना हस्ताक्षर वाला Ruby gem (अपेक्षित) |
source.component | किसके द्वारा लिखा गया | ट्रिगर |
|---|
shim.posttooluse | shim.sh | मैनिफेस्ट या लॉकफ़ाइल लेखन (Intercept Mode, Post-Install प्रेषण) |
shim.install_error | shim.sh | Shim प्रीफ़्लाइट इंस्टॉल विफलता |
bash.pretooluse | pretooluse-bash.sh | Bash इंस्टॉल कमांड (Pre-Install Mode) |
bash.posttooluse | posttooluse-bash.sh | Post-Install Bash हुक स्वयं, जब यह shim तक पहुँचने से पहले fail-open हो जाता है |
agent.pretooluse | pretooluse-agent.sh | Pre-Agent fail-open घटनाओं के लिए आरक्षित (हुक स्वयं वर्तमान में सफलता पर मौन है) |
agent.posttooluse | posttooluse-agent.sh | Post-Agent हुक fail-open घटनाएँ (जैसे shim अनुपलब्ध, python_missing) |
manual.skill | Normal Mode में चल रहा Claude | इनलाइन चलाया गया मैन्युअल ऑडिट |
| आकार | कब लिखा जाता है | विशिष्ट फ़ील्ड |
|---|
| ऑडिट प्रविष्टि | मेनिफेस्ट / लॉकफ़ाइल / bash-install ऑडिट | file, ecosystem, checked, findings, abandoned, stale, typosquat, unknown, signatures, notes, clean |
| इंस्टॉल-त्रुटि प्रविष्टि | शिम प्रीफ़्लाइट इंस्टॉल-त्रुटि (कंपोनेंट shim.install_error) | install_error, shim_dir, scripts_dir |
| Fail-open प्रविष्टि | कोई भी हुक एंट्री-पॉइंट helper_missing / shim_missing / python_missing के कारण जल्दी बाहर निकल जाता है। source.mode "fail_open" होता है | fail_open: { reason, detail? } |