dsh-permission-rules 0.7.21 → 0.7.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README-hi.md DELETED
@@ -1,445 +0,0 @@
1
- <div align="center">
2
-
3
- # 🛡️ dsh-permission-rules
4
- - **1024 स्टोर चैनल**: एक बार `npm i -g dsh1024`, फिर `dsh1024 plugin --profile web add dsh-permission-rules` ([deepseek1024.com](https://deepseek1024.com) इंस्टॉल रैंकिंग में गिना जाता है)।
5
-
6
- **DeepSeek Harness के लिए Claude Code-शैली की घोषणात्मक अनुमति नियम।**
7
-
8
- *नियम ज्ञात को तय करते हैं। एक समीक्षक मॉडल अज्ञात को तय करता है।*
9
-
10
- [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
11
- [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-permission-rules)
12
- [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
13
- [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-permission-rules.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
14
- [![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-top-rated.svg)](https://dsh.market/)
15
- [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
16
- [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-permission-rules/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-permission-rules/actions)
17
- [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-permission-rules?label=version)](https://github.com/PerryLink/dsh-permission-rules/releases)
18
- [![npm version](https://img.shields.io/npm/v/dsh-permission-rules)](https://www.npmjs.com/package/dsh-permission-rules)
19
- [![npm downloads](https://img.shields.io/npm/dm/dsh-permission-rules)](https://www.npmjs.com/package/dsh-permission-rules)
20
- [![dshfind](https://dshfind.com/api/badge/PerryLink/dsh-permission-rules?metric=downloads&lang=hi)](https://dshfind.com/hi/plugins/PerryLink/dsh-permission-rules?ref=badge)
21
-
22
- [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
23
-
24
- ```sh
25
- dsh plugin --profile <name> add dsh-permission-rules
26
- ```
27
-
28
-
29
- </div>
30
-
31
- ---
32
-
33
- **📖 इकोसिस्टम नॉलेज बेस** — मापे गए आँकड़े, मार्केटिंग नहीं: [डेवलपमेंट गाइड · चयन डेटा · रखरखाव मानदंड](https://perrylink.github.io/dsh-plugin-guide/)।
34
-
35
- <!-- star-cta -->
36
- ## Install & uninstall
37
-
38
- - **git चैनल** (नवीनतम `main`): `dsh plugin --profile web add github:PerryLink/dsh-permission-rules` — `prepare` स्क्रिप्ट केवल उत्पादन निर्भरताओं से बनाती है।
39
- - **npm चैनल** (प्रकाशित रिलीज़): `dsh plugin --profile web add dsh-permission-rules`.
40
- - **tarball चैनल**: इस रेपो में `pnpm pack`, फिर `dsh plugin --profile web add ./dsh-permission-rules-<version>.tgz`.
41
- - **uninstall**: `dsh plugin --profile web remove dsh-permission-rules`.
42
-
43
- ## ⭐ 如果它帮到了你
44
-
45
- यह प्लगइन [DSH प्लगइन परिवार](https://github.com/PerryLink) का हिस्सा है (95 प्लगइन, सभी Apache-2.0)। अगर यह उपयोगी लगे, तो **एक स्टार दें** — इससे कोई सुविधा अनलॉक नहीं होती, पर अगला व्यक्ति इसे खोज में आसानी से पा लेता है।
46
-
47
- *English:* part of a 95 plugin family for DeepSeek Harness. If it is useful, **a star helps the next person find it** — nothing is gated behind it.
48
-
49
- ## What is dsh-permission-rules?
50
-
51
- DeepSeek Harness के लिए Claude Code-शैली की घोषणात्मक अनुमति नियम।
52
-
53
- नियम ज्ञात को तय करते हैं। एक समीक्षक मॉडल अज्ञात को तय करता है।
54
-
55
- ![dsh-permission-rules कार्यप्रवाह आरेख: अनुरोध → नीति/समीक्षा → निर्णय।](docs/assets/dsh-permission-rules-flow.svg)
56
-
57
- *कार्यप्रवाह: अनुरोध → नीति/समीक्षा → निर्णय। नीचे के उदाहरण वास्तविक कमांड सतह का उपयोग करते हैं।*
58
-
59
-
60
- *वही रन, एनिमेटेड।*
61
-
62
- ## Compatibility
63
-
64
- | Surface | Status |
65
- |---|---|
66
- | Harness | DeepSeek Harness `dsh-v0.2.1-alpha.1` (2026-09-22 को अनुकूलित, पूर्ण gates शृंखला): इसका प्लगइन कॉन्फ़िग ही नया live settings अनुबंध है — हर फ़ील्ड `.volatile()` घोषित है, Loader `apply` को प्रति-फ़ील्ड एक live संदर्भ देता है, और सहेजा गया संपादन चल रहे संदर्भों में सीधे लिखा जाता है, **प्लगइन दोबारा माउंट नहीं होता**, तथा सीमा-बाहर मान लिखने से पहले ही schema द्वारा अस्वीकार कर दिया जाता है। जिस host का Schemastery `volatile()` से पुराना है (3.18.3 से पहले) वह भी इस प्लगइन को माउंट और चलाता है — फ़ील्ड साधारण मान रह जाते हैं और live कॉन्फ़िग फ़ॉर्म उपलब्ध नहीं होता — क्योंकि यह मार्कर क्षमता-जाँच (capability probe) से लगाया जाता है, मान लेकर नहीं। इस पंक्ति का `Session.append` अभी भी `ignorable` मार्कर स्टैम्प नहीं कर सकता (उसका तीसरा आर्ग्युमेंट surface-intent बैग है, और लिफ़ाफ़ा फ़ील्ड केवल संग्रहीत-लॉग पठन के लिए बचता है), इसलिए पूरी `0.2-alpha` पंक्ति पहले append से पहले ही अनमार्क्ड के रूप में पूर्व-जाँची जाती है और सत्र-लॉग ऑडिट डिफ़ॉल्ट रूप से बंद रहता है — `append` केवल `sourceEventSeqs`/`surfaceOp` पढ़ता है और लिफ़ाफ़े को freeze कर देता है, इसलिए उसमें मार्कर स्टैम्प करने वाला कोई कोड पथ ही नहीं है; पुरानी `0.1.7-alpha` (2026-09-22 को अनुकूलित), `0.1.5-rc.2` (2026-09-09 को अनुकूलित) और `0.1.3-alpha` पंक्तियाँ वही surface-only append हस्ताक्षर रखती हैं, और हर `0.2` प्री-रिलीज़ उन्हीं के साथ वर्गीकृत होता है (`0.2.x` का **स्थिर** रिलीज़ append probe पर छोड़ा गया है, ताकि बहाल हुई मार्कर सतह इस प्लगइन के नए रिलीज़ के बिना ही अपनाई जा सके)। उन पंक्तियों का लॉग प्रवासन चिह्नित अन-क्लासिफ़ाइड प्लगइन घटनाओं को भी अस्वीकारता है: `0.1.3-alpha` host के लॉग खोलने से पहले v1 ऑडिट पंक्तियाँ और `0.1.5-alpha` host के प्रवासन से पहले v2 पंक्तियाँ `strip` करें (v3 मूल लॉग के लिए केवल `repair` चाहिए)। |
67
- | Node | `^22.19.0 || >=24.0.0` |
68
- | Platforms | सभी (host + वेब settings क्लाइंट) |
69
- | Model | कोई भी (deny/ask कारण टूल परिणामों के माध्यम से दिखते हैं) |
70
-
71
- ## What you get
72
-
73
- `dsh-permission-rules` `tools/pre-execute` वॉटरफ़ॉल पर हर टूल कॉल के आगे एक क्रमबद्ध **`allow` / `deny` / `ask`** नियम सूची रखता है — नियतात्मक, तत्काल, लेखा-परीक्षण-योग्य और आपके द्वारा सादे YAML में लिखी गई:
74
-
75
- - **`deny`** कॉल को रोकता है; नियम का `reason` मॉडल-दृश्य त्रुटि बन जाता है।
76
- - **`ask`** आधिकारिक अनुमोदन सीम पर चलता है (द्वितीय-मॉडल answerer के लिए `dsh-auto-review` माउंट करें, या मानव उत्तर देता है; दोनों न होने पर harness बंद-विफल होता है)।
77
- - **`allow`** (और कोई-मिलान-नहीं) सख्ती से `next()` से प्रत्यायोजित करता है — बाद के listeners कभी शॉर्ट-सर्किट नहीं होते।
78
-
79
- हर हिट **और** हर पास-थ्रू `permissionRules/decision` सत्र घटना के रूप में लॉग होता है (केवल-लॉग — मॉडल संदर्भ में कुछ भी अतिरिक्त इंजेक्ट नहीं होता)।
80
-
81
- - **समृद्ध मिलान** — टूल-नाम globs (जिनमें `mcp__*` शामिल), एजेंट-पहचान चयनकर्ता (`main` / `subagent` / `preset:*`), तर्क कुंजी/मान globs **या** regex (जिनमें `!pattern` निषेध और `absent` कुंजी आयाम), **किसी भी नेस्टिंग गहराई** पर कार्यक्षेत्र-सापेक्ष पथ globs, `when` होस्ट शर्तें (env चर, प्लेटफ़ॉर्म), और **शेल कमांड विघटन** (`argv`: कमांड शब्द, तर्क टोकन, पाइपलाइन हस्ताक्षर) टोकन-स्तर सटीक मिलान के लिए।
82
- - **अंतर्निहित उच्च-जोखिम आधाररेखा** — एक साथ भेजा गया deny/ask नियम-समूह (विनाशकारी कमांड, विशेषाधिकार वृद्धि, डाउनलोड-और-निष्पादन, संवेदनशील पथ) डिफ़ॉल्ट रूप से सक्षम और उपयोगकर्ता नियमों के बाद जोड़ा गया (निकटतम उपयोगकर्ता नियम इसे अधिरोहित कर सकता है); `builtin.enabled` से टॉगल करें।
83
- - **पदानुक्रमित नियम फ़ाइलें** — वैकल्पिक `searchUp` सत्र cwd से फ़ाइल-सिस्टम रूट तक हर `.dsh/rules.yaml` को मर्ज करता है, निकटतम पहले।
84
- - **dry-run रोलआउट** — `enforce: false` ऑडिट करता है कि नीति *क्या* करती, हर कॉल को पास करते हुए।
85
- - **हॉट रीलोड** — debounce सहित Chokidar निगरानी; टूटा संपादन पिछले नियम रखता है, कभी क्रैश नहीं। WSL होस्ट पर, या `/mnt/<drive>` के नीचे रखी नियम फ़ाइल के लिए, निगरानी polling पर चली जाती है क्योंकि वहाँ मूल परिवर्तन इवेंट भरोसेमंद नहीं होते।
86
- - **ज़ोर से विफल** — अमान्य YAML, अज्ञात action/फ़ील्ड, ख़राब globs/regex, बैकट्रैकिंग-प्रवण पैटर्न या `maxRules` से अधिक नियम लोड को विफल करते हैं।
87
-
88
- ## Rule syntax
89
-
90
- ```yaml
91
- # <project>/.dsh/rules.yaml
92
- rules:
93
- - match: { tools: [bash, pwsh], params: { command: "git push*" }, paths: ["**/secrets/**"] }
94
- action: deny
95
- reason: "No pushes from protected paths"
96
-
97
- - match: { tools: [edit, write] }
98
- action: ask
99
- reason: "File writes need confirmation"
100
- ```
101
-
102
- - **मिलान आयाम** — `tools` (globs, incl. `mcp__*`), `agents` (`main` / `subagent` / `preset:<name>`; अज्ञात पहचान कभी मिलान नहीं करती — बंद-विफल), `params` (कुंजी/मान globs या regex, `!pattern` निषेध, `absent` कुंजी आयाम), `paths` (किसी भी गहराई पर निकाले गए कार्यक्षेत्र-सापेक्ष globs), `when` (`env` चर globs/regex + बंद `platform` सूची), और `network` (`domains` / `ips` / `ports` / `schemes` — globs, वाइल्डकार्ड, CIDR, पोर्ट श्रेणियाँ)।
103
- - **क्रियाएँ** — `allow` / `deny` / `ask`, फ़ाइल क्रम में मूल्यांकित, पहला मिलान जीतता है।
104
- - **नियम मेटाडेटा** — `enabled: false` (दृश्य परंतु निष्क्रिय), `description`, `tags`; अज्ञात फ़ील्ड लोड विफल करते हैं।
105
- - **Schema** — JSON Schema [docs/rules-format.schema.json](docs/rules-format.schema.json) पर वितरित (संपादक पूर्णता `# yaml-language-server: $schema=...`); पूर्ण शब्दावली और 5-नियम सुरक्षा आधाररेखा [docs/rules-format.en.md](docs/rules-format.en.md) में।
106
-
107
- ## Network policy
108
-
109
- Codex-शैली की **प्रक्रिया-स्तरीय नेटवर्क नीति**: shell उप-प्रक्रिया ट्रैफ़िक एक अंतर्निहित स्थानीय **HTTP/CONNECT प्रॉक्सी** से होकर गुज़रता है, और हर कनेक्शन क्रमबद्ध नेटवर्क नियमों या आधिकारिक sandbox presets पर मैप किए गए तीन मोड से तय होता है:
110
-
111
- - **`deny-all`** — केवल-पठन sandbox preset: सभी आउटबाउंड रोकें।
112
- - **`whitelist`** — workspace-write preset: सूचीबद्ध लक्ष्य अनुमत, शेष के लिए `unlisted: ask` (या `deny`)।
113
- - **`allow-all`** — danger-full-access preset: सब कुछ अनुमत।
114
- - **`auto`** (डिफ़ॉल्ट) — sandbox preset का अनुसरण करता है; बिना sandbox-नीति सेवा वाले hosts पर `autoFallback` (`allow-all`) में हल होता है।
115
-
116
- - **मिलान** — `match.network` `domains` / `ips` / `ports` / `schemes` के साथ (globs, वाइल्डकार्ड, CIDR, पोर्ट श्रेणियाँ; संख्यात्मक YAML पोर्ट स्वीकृत)। `tools/pre-execute` हॉट पथ पर URL-उम्मीदवार निष्कर्षण वेब-टूल तर्कों और bash/pwsh कमांड टेक्स्ट में एम्बेडेड URLs पर चलता है; लूपबैक लक्ष्य `loopback` नीति के अनुसार नियमों को शॉर्ट-सर्किट कर सकते हैं। IPv4-मैप्ड IPv6 लिटरल तुलना से पहले IPv4 रूप में सामान्यीकृत होते हैं, और प्रॉक्सी उन्हीं पतों पर कनेक्ट करता है जिन पर निर्णय लिया गया — दूसरा DNS रिज़ॉल्यूशन नहीं; जिस कनेक्शन की निर्णय-प्रक्रिया ने कोई पता हल नहीं किया वह नाम डायल करने के बजाय बंद-विफल (502) होता है।
117
- - **अपस्ट्रीम श्रृंखलन** — `network.upstreamProxy` (डिफ़ॉल्ट `off`) इस प्रॉक्सी द्वारा **अनुमत** कनेक्शनों को अपस्ट्रीम प्रॉक्सी से भेजता है: CONNECT उससे सुरंग माँगता है (`CONNECT host:port`), और सादे HTTP अनुरोध पूर्ण रूप में उसे अग्रेषित होते हैं। अवरुद्ध लक्ष्य कभी अपस्ट्रीम तक नहीं पहुँचता — उसे इस प्लगइन का संरचित 403 ही मिलता है। अपस्ट्रीम कॉन्फ़िगर होने पर भी दो स्थितियाँ कभी श्रृंखलित नहीं होतीं: **लूपबैक** लक्ष्य (इस होस्ट के बाहर का प्रॉक्सी उसके लूपबैक को रूट नहीं कर सकता), और **`ips`-स्कोप वाले नियम** से उत्पन्न कोई भी निर्णय (श्रृंखलन होस्टनाम अपस्ट्रीम को सौंप देता है, इसलिए "कनेक्शन उसी पते पर पहुँचता है जो नियमों ने देखा" — issue #21 — ठीक वहीं टूट जाता जहाँ नियमों को पते की परवाह थी; ऐसे निर्णय निर्णीत पते पर ही सीधे कनेक्ट करते रहते हैं), साथ ही वह लक्ष्य जिसके scheme के लिए कोई उपयोगी अपस्ट्रीम न हो। अपस्ट्रीम का अपना होस्टनाम ऑपरेटर कॉन्फ़िगरेशन है, एजेंट इनपुट नहीं, और इन नियमों द्वारा निर्णीत नहीं होता। क्रेडेंशियल वाला URL कभी कच्चा नहीं छपता: चेतावनियाँ, `/rules network` और settings स्नैपशॉट पासवर्ड मास्क करते हैं (`http://user:***@host:port`)। अपस्ट्रीम अगम्य हो, टाइमआउट (10 सेकंड) हो, या गैर-2xx उत्तर दे — तो **502** मिलता है; सीधे कनेक्शन पर मौन वापसी जानबूझकर नहीं है, ताकि गलत कॉन्फ़िगरेशन दिखता रहे।
118
- - **ऑडिट** — अस्वीकृत कनेक्शन स्वामी सत्र में `permissionRules/network` जोड़ते हैं (वही अनुकूली `ignorable` द्वार), `/rules network` और settings पृष्ठ में ब्लॉक काउंटर व हाल की अवरोधन के साथ।
119
- - **निदान** — अवरुद्ध कनेक्शन `[network: …]` संदेश लेकर आते हैं जो अवरुद्ध लक्ष्य, निर्णय लेने वाला मोड या नियम, और समाधान बताता है।
120
- - **settings पृष्ठ से अनुमति** — हाल की हर अवरोधन पर **अनुमति दें** क्रिया उपलब्ध है। यह उस कनेक्शन का वास्तव में निर्णय करने वाली निकटतम नियम फ़ाइल के **सिरे** (इंडेक्स 0) पर एक न्यूनतम `match: { network: { domains: [<host>] } }` / `action: allow` नियम लिखती है: जिस कार्यक्षेत्र को ब्लॉक सौंपा गया उसका प्रोजेक्ट फ़ाइल (कोई निरपेक्ष `rulesFile` कॉन्फ़िगर हो तो वही), और सत्र-रहित होस्ट-स्तरीय ब्लॉक के लिए वह फ़ाइल जिसे host शृंखला हल करती है (निरपेक्ष `rulesFile` → मौजूद `<processCwd>/<rulesFile>` → कॉन्फ़िगर किया `fallbackPath` → `<processCwd>/<rulesFile>`, न हो तो बनाई जाती है)। कई कार्यक्षेत्र लोड हों तो पृष्ठ पहले चयनकर्ता देता है, क्योंकि कोई भी लोडेड कार्यक्षेत्र शृंखला host शृंखला से ऊपर होती है। इंडेक्स 0 पर, क्योंकि नियम पहले-मिलान से चलते हैं: मौजूदा `deny` के बाद जोड़ा नियम मृत पाठ ही रहेगा। केवल `domains`, क्योंकि वह आयाम उपडोमेन सहित है और पोर्ट/scheme से स्वतंत्र है, इसलिए वही होस्ट अगले पोर्ट पर फिर अवरुद्ध नहीं होगा; मौजूदा टिप्पणियाँ और बिना छुए नियम बचे रहते हैं, और पाठ हस्त-संपादन जैसी ही मान्यता-द्वार से गुज़रता है। परिवर्तन तुरंत प्रभावी होता है — कैश किए गए कार्यक्षेत्र-चरण **और** सत्र-रहित host शृंखला दोनों दोबारा पढ़े जाते हैं, इसलिए न पुनःआरंभ और न `/rules reload` — और निर्णय फिर से गणना होता है, इसलिए सूचना **वास्तविक** परिणाम बताती है और कनेक्शन के अवरुद्ध रहते हुए कभी सफलता नहीं कहती। यह बिना फ़ाइल छुए अस्वीकार करती है: अज्ञात कार्यक्षेत्र, ज्ञात नियम-स्रोतों से बाहर का लक्ष्य, केवल-पठन अंतर्निहित आधाररेखा, और वह फ़ाइल जिसे वह पढ़ या पार्स नहीं कर सकती; पहले से अनुमत कनेक्शन पर कुछ नहीं लिखा जाता। `network.allowHostAction: false` बटन छिपाता है और RPC को अस्वीकार कराता है।
121
-
122
- ## Quick start
123
-
124
- ```sh
125
- dsh plugin --profile web add github:PerryLink/dsh-permission-rules
126
- ```
127
-
128
- ```sh
129
- # 1. install the bundle into your profile
130
- dsh plugin --profile web add github:PerryLink/dsh-permission-rules
131
-
132
- # or from npm (published releases)
133
- dsh plugin --profile web add dsh-permission-rules
134
-
135
- # 2. restart and verify the row
136
- dsh --profile web --dump-config | grep -A4 'id: permission-rules'
137
- ```
138
-
139
- ### उदाहरण
140
-
141
- ये वास्तविक प्रवेश बिंदु हैं; इंस्टॉल के बाद एक चलाएँ।
142
-
143
- #### विस्तृत उदाहरण
144
-
145
- **कमांड**
146
-
147
- ~~~sh
148
- /rules test bash {"command":"git push origin main","cwd":"src/secrets/app"}
149
- ~~~
150
-
151
- **आउटपुट**
152
-
153
- ~~~text
154
- "bash" matches rule 1 (deny): 禁止 push 到受保护路径
155
- ~~~
156
-
157
- *स्रोत `test/command.spec.ts:204-219 (assertions at :209-213); src/prose.ts:121`*
158
-
159
- #### विफलता शाखा
160
-
161
- **इनपुट**
162
-
163
- ~~~text
164
- /rules test bash {not json
165
- ~~~
166
-
167
- **आउटपुट**
168
-
169
- ~~~text
170
- Invalid JSON arguments "{not json": the arguments must parse as JSON.
171
- ~~~
172
-
173
- *स्रोत `plugins/dsh-permission-rules/src/prose.ts:123; plugins/dsh-permission-rules/src/runtime.ts:1266-1272; plugins/dsh-permission-rules/test/command.spec.ts:221-228`*
174
-
175
- #### संक्षिप्त उदाहरण
176
-
177
- - `tools/pre-execute`
178
-
179
- ## Configuration
180
-
181
- सभी ट्यूनेबल Schemastery `Config` फ़ील्ड हैं (cordis.yml से बदले जा सकते हैं)। id-लक्षित ओवरराइड पूरी पंक्ति बदल देता है — हर आवश्यक कुंजी फिर से बताएँ।
182
-
183
- `0.1.7-alpha` host पर हर फ़ील्ड `.volatile()` घोषित है, इसलिए यह Plugins सेटिंग्स पृष्ठ से मौके पर ही संपादन योग्य भी है: संपादन चल रहे संदर्भों में बिना प्लगइन दोबारा माउंट किए लिखा जाता है, runtime अगली बार पढ़ते समय नया मान लेता है, और `network.proxyPort`, `proxyBind`, `injectEnv` या `noProxy` बदलने पर स्थानीय प्रॉक्सी तुरंत दोबारा बाइंड होता है। संख्यात्मक सीमाएँ schema में रहती हैं, और कॉन्फ़िग एडिटर लिखने से पहले मर्ज किए गए कॉन्फ़िग को उसी schema से हल करता है, इसलिए सीमा-बाहर मान लिखते समय ही अस्वीकार हो जाता है। जिस host का Schemastery `volatile()` से पुराना है वहाँ ये फ़ील्ड केवल cordis.yml से बदले जा सकते हैं।
184
-
185
- | Key | Default | Meaning |
186
- |---|---|---|
187
- | `rulesFile` | `.dsh/rules.yaml` | नियम फ़ाइल स्थान; सापेक्ष = कॉलिंग सत्र cwd के विरुद्ध हल, निरपेक्ष = वैश्विक और माउंट पर मान्य |
188
- | `fallbackPath` | *(none)* | प्रति-cwd खोज में कुछ न मिलने पर उपयोग की गई नियम फ़ाइल; माउंट पर मान्य |
189
- | `badFilePolicy` | `fail` | ख़राब नियम फ़ाइल: `fail` लंबित टूल कॉल को ज़ोर से विफल करता है; `ignore-with-warning` चेतावनी देकर खाली जारी रखता है |
190
- | `maxRules` | `256` | प्रभावी स्रोत शृंखला में नियम संख्या की कठोर सीमा |
191
- | `maxCachedWorkspaces` | `512` | कैश किए गए प्रति-कार्यक्षेत्र नियम लोड की कठोर सीमा (LRU निष्कासन) |
192
- | `patternMode` | `glob` | `params`/`paths`/`when.env` पैटर्न स्वाद: `glob` या `regex` (टूल नाम हमेशा globs) |
193
- | `watch` | `true` | Chokidar निगरानी + परिवर्तन पर रीलोड |
194
- | `watchStabilityThresholdMs` | `200` | रीलोड debounce विंडो (ms) |
195
- | `language` | `en` | `/rules` आउटपुट भाषा: `en`, `zh`, `es`, `pt`, `hi` |
196
- | `caseInsensitivePaths` | *(win32)* | `paths` पैटर्न और कार्यक्षेत्र-रूट तुलना ASCII केस अनदेखा करते हैं; Windows पर `true` |
197
- | `audit` | `all` | ऑडिट दानेदारी: `all` हर हिट और पास-थ्रू लॉग करता है; `hits` पास-थ्रू घटनाएँ छोड़ता है |
198
- | `searchUp` | `false` | सत्र cwd से मूल निर्देशिकाओं को चलकर हर मिली नियम फ़ाइल मर्ज करें, निकटतम पहले |
199
- | `maxGlobStars` | `2` | प्रति glob पैटर्न असीमित `*`/`**` क्वांटिफ़ायर की कठोर सीमा |
200
- | `enforce` | `true` | `false` = dry-run मोड: deny/ask हिट `dryRun` मार्कर से लॉग होते हैं और हर कॉल पास होता है |
201
- | `allowUnmarkedAudit` | `false` | पूर्व-मार्कर hosts `ignorable` मार्कर छोड़ देते हैं; प्लगइन एक बार की चेतावनी से सत्र-लॉग ऑडिट अक्षम करता है। पुनः सक्षम के लिए `true` |
202
- | `network.enabled` | `true` | प्रॉक्सी, env इंजेक्शन और वेब-टूल मोड डिफ़ॉल्ट का मुख्य स्विच |
203
- | `network.mode` | `auto` | नीति मोड: `auto` sandbox preset का अनुसरण, या `deny-all` / `whitelist` / `allow-all` |
204
- | `network.autoFallback` | `allow-all` | `auto` के पास sandbox-नीति सेवा न होने पर उपयोग किया मोड |
205
- | `network.unlisted` | `ask` | श्वेतसूची मोड में बिना नियम मिलान वाले लक्ष्यों का व्यवहार: `ask` या `deny` |
206
- | `network.proxyBind` | `127.0.0.1` | स्थानीय प्रॉक्सी बाइंड पता (केवल लूपबैक) |
207
- | `network.proxyPort` | `0` | स्थानीय प्रॉक्सी पोर्ट; `0` एक मुक्त क्षणिक पोर्ट चुनता है |
208
- | `network.proxyMaxRecent` | `100` | settings पृष्ठ के लिए रखे हाल के ब्लॉक रिकॉर्ड की सीमा |
209
- | `network.loopback` | `allow` | लूपबैक लक्ष्य: `allow` (Codex समता) या `policy` |
210
- | `network.injectEnv` | `true` | क्या उप-प्रक्रियाओं के लिए प्रॉक्सी पर्यावरण चर इंजेक्ट हों |
211
- | `network.noProxy` | `clear` | उप-प्रक्रिया NO_PROXY व्यवहार: `clear` नीति लागू करता है या `preserve` |
212
- | `network.upstreamProxy` | `off` | इस प्लगइन द्वारा अनुमत कनेक्शनों के लिए अपस्ट्रीम प्रॉक्सी: `off` सीधे कनेक्ट करता है, `inherit` लॉन्च वातावरण के प्रॉक्सी नाम दोबारा उपयोग करता है, या स्पष्ट `http(s)://` प्रॉक्सी URL |
213
- | `network.allowHostAction` | `true` | settings पृष्ठ की प्रति-ब्लॉक "इस होस्ट को अनुमति दें" क्रिया: `false` अनुमति बटन छिपाता है और `permissionRules/allowHost` RPC को अस्वीकार कराता है (नियम संपादक अप्रभावित रहता है) |
214
- | `builtin.enabled` | `true` | अंतर्निहित उच्च-जोखिम आधाररेखा: `false` साथ भेजे गए deny/ask नियम-समूह को पूरी तरह अक्षम करता है |
215
- | `builtin.path` | *(साथ भेजा)* | प्रतिस्थापन आधाररेखा फ़ाइल (निरपेक्ष, या `process.cwd()` के सापेक्ष); माउंट पर मान्य |
216
-
217
- ## Tools & surfaces
218
-
219
- | Surface | Kind | Notes |
220
- |---|---|---|
221
- | `tools/pre-execute` | listener | पहले-मिलान allow/deny/ask नियम + नेटवर्क URL-उम्मीदवार निष्कर्षण |
222
- | `/rules` | command | `list` · `reload` · `decisions [n]` · `test <tool> <json>` |
223
- | `permissionRules/decision` | event | हर हिट और पास-थ्रू की केवल-लॉग ऑडिट |
224
- | `permissionRules/network` | event | अवरुद्ध कनेक्शनों की प्रॉक्सी-परत ऑडिट |
225
- | HTTP/CONNECT proxy | service | shell उप-प्रक्रिया ट्रैफ़िक को नियंत्रित करने वाला अंतर्निहित स्थानीय प्रॉक्सी |
226
- | settings page | client | नेटवर्क-मोड संपादक, नियम संपादक, ब्लॉक काउंटर, हाल की अवरोधन — प्रति-ब्लॉक अनुमति क्रिया के साथ |
227
-
228
- ```
229
- /rules list the active rules, their source files, and any last-reload error
230
- /rules list explicit alias for the bare listing
231
- /rules reload re-read the rule-file chain for this workspace
232
- /rules decisions [n] show the last n permission decisions of this session (default 10)
233
- /rules test <tool> <json> dry-evaluate the rules against a hypothetical call
234
- ```
235
-
236
- `/rules test` अग्रणी फ़्लैग भी स्वीकार करता है: `--cwd <dir>`, `--env KEY=VALUE` (दोहराने-योग्य), `--agent <selector>` (दोहराने-योग्य) और `--platform <name>`। बहु-फ़ाइल शृंखलाओं (जैसे `searchUp`) में हर सूचीबद्ध नियम पंक्ति अपनी स्रोत फ़ाइल से संबद्ध होती है।
237
-
238
- ## Permissions & data
239
-
240
- - **Permissions**: workshop मैनिफ़ेस्ट `files:read`, `files:watch`, `files:write`, `session:append` और `network:outbound` घोषित करता है। `ask` निर्णय आधिकारिक अनुमोदन सीम पर चलते हैं — कुछ भी पुनः-कार्यान्वित या टाला नहीं गया।
241
- - **Data**: नियम फ़ाइलें डिस्क से पढ़ी जाती हैं; कोई नियम डेटा लिखा नहीं जाता। कोई मॉडल कॉल नहीं, कोई समीक्षक उप-एजेंट नहीं।
242
- - **Session log**: `permissionRules/decision` कभी मॉडल संदर्भ में इंजेक्ट नहीं होता और लिफ़ाफ़े के `ignorable: true` मार्कर से जोड़ा जाता है ताकि कोई भी harness बिल्ड लॉग लोड कर सके।
243
-
244
- ## Security boundaries
245
-
246
- - **नीति, कर्नेल नहीं।** `paths` उम्मीदवार केवल तर्क कुंजियों के एक दस्तावेज़ित समूह से आते हैं (किसी भी गहराई पर, गहराई-सीमित), और केवल कार्यक्षेत्र-सापेक्ष पथ मिलान करते हैं।
247
- - **यहाँ कोई समीक्षक नहीं।** प्लगइन कभी उप-एजेंट नहीं बनाता या मॉडल नहीं बुलाता — `ask` निर्णय उत्पन्न करना ही इसके काम का अंत है।
248
- - **कोई sandbox परिवर्तन नहीं।** OS-स्तरीय sandbox नीति sandbox सीम की है, इस प्लगइन की नहीं।
249
- - **ग़लत विन्यास की ज़ोरदार अस्वीकृति।** अज्ञात YAML फ़ील्ड, अज्ञात क्रियाएँ और ख़राब पैटर्न लोड पर अस्वीकृत।
250
- - **बैकट्रैकिंग सीमाएँ।** glob पैटर्न `maxGlobStars` असीमित स्टार विस्तार तक सीमित; regex-मोड पैटर्न नेस्टेड असीमित क्वांटिफ़ायर और क्वांटिफ़ाइड ओवरलैपिंग शाब्दिक विकल्प अस्वीकारते हैं।
251
- - **बंद-विफल डायलिंग।** सादे HTTP अग्रेषण और CONNECT सुरंगें केवल निर्णीत पतों से जुड़ती हैं; जिस allow की निर्णय-प्रक्रिया ने कोई पता हल नहीं किया वह नाम डायल करने के बजाय 502 के साथ बंद-विफल होता है (issue #23)।
252
-
253
- ## Known limitations
254
-
255
- - **पूर्व-मार्कर hosts और घटना-अस्वीकार hosts पर ऑडिट मार्कर।** `permissionRules/decision` `ignorable: true` से जोड़ा जाता है; जिन hosts का `Session.append` मार्कर से पहले का है (`0.1.0-rc.1`–`rc.7` और `0.1.1-rc.1`–`rc.7` पंक्तियाँ) वे इसे चुपचाप छोड़ देते हैं, `0.1.2-rc` पंक्ति alpha.5 सतह लाती है (append का कोई विकल्प मार्कर नहीं लिखता), `0.1.2-alpha` पंक्ति पढ़ने पर चिह्नित प्लगइन घटनाओं को भी अस्वीकारती है, और `0.1.3-alpha` तथा `0.1.5-alpha` पंक्तियाँ वही surface-only append हस्ताक्षर रखती हैं (प्रकाशित `0.1.3-alpha.1`/`0.1.5-alpha.1` पैकेजों पर सत्यापित) — runtime पहले append से पहले इन सबकी पूर्व-जाँच कर एक बार की चेतावनी से सत्र-लॉग ऑडिट अक्षम कर देता है। पीढ़ी-पार प्रवासन चिह्नित ऑडिट पंक्तियों को भी अस्वीकारता है: `0.1.3-alpha` का v1→v2 द्वार अज्ञात v1 घटनाओं को अस्वीकारता है, और `0.1.5-alpha` का v2→v3 द्वार हर अन-क्लासिफ़ाइड घटना को (उसकी सूची प्रकाशित v2 शब्दावली पर स्थिर है), इसलिए 0.1.3 host के लॉग खोलने से पहले v1 पंक्तियाँ और 0.1.5 host पर अपग्रेड से पहले v2 पंक्तियाँ `strip` करें। v3 मूल लॉग चिह्नित प्लगइन पंक्तियाँ स्वीकारते हैं, इसलिए उन्हें केवल `repair` चाहिए। पुनः सक्षम के लिए `allowUnmarkedAudit: true`; पहले से लिखे लॉग `scripts/repair-session-logs.mjs` से मरम्मत करें (जहाँ मार्कर मदद नहीं करता वहाँ इसका `strip` मोड ऑडिट पंक्तियाँ हटाता है)।
256
- - **पथ उम्मीदवार अनुमानी हैं।** केवल दस्तावेज़ित तर्क कुंजियाँ पथ मिलान को खिलाती हैं, और कार्यक्षेत्र-सापेक्ष मिलान केवल `caseInsensitivePaths` चालू होने पर ASCII-केस-असंवेदी है।
257
- - **globs एक रूढ़िवादी उपसमुच्चय हैं।** कोई ब्रेस विस्तार नहीं — दो पैटर्न लिखें, या regex मोड उपयोग करें।
258
- - **regex बैकट्रैकिंग गार्ड संरचनात्मक है, संपूर्ण नहीं।** अविश्वसनीय फ़ाइलों के लिए glob मोड पसंद करें।
259
- - **होस्ट के अपने आउटबाउंड अनुरोध इस प्रॉक्सी से नहीं जाते।** इंजेक्ट किया गया प्रॉक्सी वातावरण **उत्पन्न shell उप-प्रक्रियाओं** को कवर करता है — इंजेक्शन इसी के लिए है — और उन उपभोक्ताओं को जो अनुरोध के समय प्रॉक्सी नाम पढ़ते हैं। यह होस्ट प्रोसेस के अपने `fetch`-आधारित ट्रैफ़िक को **नहीं** कवर करता: launcher पहले प्लगइन के माउंट होने से पहले **लॉन्च वातावरण** से undici का ग्लोबल dispatcher स्थापित कर देता है, वह dispatcher वातावरण से नहीं बल्कि अपनी नीति से रूट करता है, और Node प्रॉक्सी वातावरण को प्रारंभ पर सैंपल करता है — इसलिए बाद में माउंट होने वाला प्लगइन उसे नहीं मोड़ सकता। परिणाम: प्रदाता endpoints के लिए allow नियम की **आवश्यकता नहीं** है, और `network.injectEnv: false` होस्ट प्रोसेस को किसी चीज़ से बाहर नहीं करता। 2026-09-10 को Node 22 पर मापा गया; `scripts/host-egress-probe.mjs` से दोहराएँ।
260
- - **श्रृंखलन केवल इस प्रॉक्सी तक पहुँचने वाले ट्रैफ़िक के बारे में है।** `dsh-v0.1.7-alpha.1` और उसके बाद के hosts पर, harness की स्वयं की लॉन्च-कालीन प्रॉक्सी नीति और उसकी उप-प्रक्रिया वातावरण परत इस प्लगइन द्वारा इंजेक्ट किए गए प्रॉक्सी नामों पर वरीयता ले सकती हैं, इसलिए `network.upstreamProxy` बताता है कि इस प्रॉक्सी द्वारा संभाले गए कनेक्शनों का क्या होता है — यह होस्ट प्रोसेस के हर आउटबाउंड पथ के बारे में दावा नहीं है।
261
-
262
- ## Collaborating with dsh-auto-review
263
-
264
- - `dsh-permission-rules` `ask` उत्पन्न करता है; `dsh-auto-review` `approval/request` वॉटरफ़ॉल पर केवल-पठन द्वितीय-मॉडल निर्णय से उत्तर देता है (या मानवों को प्रत्यायोजित करता है)। पूर्ण बंद लूप के लिए दोनों माउंट करें।
265
- - एकीकरण-परीक्षित: `permissionRules/decision` → `approval/asked` → `autoReview/verdict` → `approval/decided`, समीक्षक को स्क्रिप्टेड मॉक से बदलकर।
266
- - आधिकारिक harness की `never` अनुमोदन नीति और हर बंद-विफल गारंटी अछूती रहती हैं।
267
-
268
- ## Session log repair
269
-
270
- `ignorable` मार्कर के अस्तित्व से पहले लिखे गए सत्र लॉग नए harness बिल्ड द्वारा अस्वीकृत हो सकते हैं (`SessionFormatUnsupportedError`)। वितरित `scripts/repair-session-logs.mjs` केवल लक्षित ऑडिट पंक्तियों को `ignorable: true` ले जाने के लिए फिर से लिखता है, फ़्रेम-संरक्षित, बैकअप सहित:
271
-
272
- ```sh
273
- node scripts/repair-session-logs.mjs scan [--home DIR] # विदेशी पंक्तियों की रिपोर्ट, कुछ नहीं बदलता
274
- node scripts/repair-session-logs.mjs repair [--home DIR] [--dry-run]
275
- node scripts/repair-session-logs.mjs strip [--home DIR] [--dry-run]
276
- ```
277
-
278
- `--home` डिफ़ॉल्ट रूप से `$DSH_HOME/sessions` (या `~/.dsh/sessions`)। यह हर पीढ़ी के लॉग को उसके विहित नाम से खोजता है — `session.jsonl`, `session.v2.jsonl`, `session.v3.jsonl`, प्रत्येक वैकल्पिक रूप से `.zstd`-संपीड़ित — इसलिए पीढ़ी के अनुसार मोड चुनें:
279
-
280
- - **v3 (`session.v3.jsonl`, `0.1.5-alpha` पंक्ति द्वारा मूल रूप से लिखा)** — पठन पथ चिह्नित प्लगइन पंक्तियाँ स्वीकारता है, इसलिए `repair` पर्याप्त है।
281
- - **v2 (`session.v2.jsonl`, `0.1.3-alpha` पंक्ति द्वारा लिखा)** — `repair` इसे लिखने वाले host पर खोल देता है, पर `0.1.5-alpha` का v2→v3 प्रवासन चिह्नित अन-क्लासिफ़ाइड घटनाओं को भी अस्वीकारता है: `0.1.5-alpha` host पर अपग्रेड करने से **पहले** v2 लॉग पर `strip` चलाएँ।
282
- - **v1 (`session.jsonl`)** — `0.1.3-alpha` का v1→v2 प्रवासन चिह्नित अज्ञात v1 घटनाओं को भी अस्वीकारता है: 0.1.3 या बाद के host द्वारा लॉग पहली बार खोलने से पहले `strip` चलाएँ।
283
-
284
- ## Development
285
-
286
- ```sh
287
- pnpm install # node ^22.19 || >=24
288
- pnpm run typecheck # tsc, src + tests
289
- pnpm run lint # eslint, src + tests + scripts
290
- pnpm test # vitest: 24 spec files
291
- pnpm run test:coverage # coverage gate (90/80/90/90)
292
- pnpm run build # tsc declarations + tsdown bundles (lib/)
293
- pnpm run pack:check # build + pack (the published artifact)
294
- node scripts/check-readme-sync.mjs # five-language README sync gate (also in CI)
295
- ```
296
-
297
- हेडलेस एंड-टू-एंड सत्यापन रिकॉर्ड के लिए [VERIFICATION.md](VERIFICATION.md) देखें।
298
-
299
- ## Interoperability with other DSH plugins
300
-
301
- **DSH `0.2.0-rc.2`** (वह रनटाइम जिसके लिए यह README प्रकाशित है) और 2026-10-05 को सर्वे किए गए उच्च-स्टार प्लगइन सेट के विरुद्ध सत्यापित।
302
-
303
- यह प्लगइन अन्य प्लगइनों में **हस्तक्षेप नहीं करता**, उन उच्च-स्टार प्लगइनों सहित जो व्यापक रूप से इंस्टॉल हैं:
304
-
305
- - **कोई टूल-नाम टकराव नहीं।** सभी टूल नेमस्पेस युक्त हैं; कोई भी ऐसा नंगा नाम नहीं लेता जो पहले से किसी अंतर्निहित टूल या अन्य प्लगइन का हो।
306
- - **कोई सर्विस-की टकराव नहीं।** यह केवल `permissionRules`, `permissionRulesRuntime` प्रदान करता है; यह key न अंतर्निहित सीम है और न किसी सर्वे किए गए उच्च-स्टार प्लगइन द्वारा प्रदान की जाती है।
307
- - **कोई स्लॉट टकराव नहीं।** यह कोई क्लाइंट slot key पंजीकृत नहीं करता, इसलिए `shadows-shipped-ui` सीट के लिए प्रतिस्पर्धा नहीं करता।
308
- - **कोई HTTP रूट टकराव नहीं।** यह कोई `webServer` प्रीफ़िक्स पंजीकृत नहीं करता।
309
- - **कोई patch-लेयर टकराव नहीं।** बंडल patch केवल अपनी पंक्ति `insert` करता है; कभी किसी अंतर्निहित पंक्ति का `config` ओवरराइड नहीं करता।
310
- - **कोई वैश्विक परिवर्तन नहीं।** यह प्रोटोटाइप नहीं बदलता, `process.env` नहीं लिखता, और वैश्विक fetch dispatcher प्रतिस्थापित नहीं करता।
311
-
312
- **साझा ईवेंट लिसनर रचना से ही अहस्तक्षेपी हैं।** यह क्रम-संवेदनशील ईवेंट `tools/post-execute`, `tools/pre-execute` को `ctx.on()` से देखता है — Cordis का **ब्रॉडकास्ट** पंजीकरण, जहाँ हर लिसनर चलता है और कोई किसी दूसरे को वंचित नहीं कर सकता। **यहाँ प्रत्येक लिसनर `next()` से डेलिगेट करता है**, इसलिए श्रृंखला कभी शॉर्ट-सर्किट नहीं होती:
313
- - `tools/post-execute` — also used by `cc-safety-net` (1576★).
314
- - `tools/pre-execute` — also used by `cc-safety-net` (1576★).
315
-
316
- स्थैतिक प्रमाण: इस रिपॉज़िटरी पर `dsh-plugin-doctor` के K10–K13 सभी `pass` हैं।
317
-
318
- ## Topics
319
-
320
- `dsh`, `dsh-plugin`, `deepseek-harness`, `permission`, `policy`, `allow-deny-ask`, `approval`, `safety`, `network`, `network-policy`, `proxy`
321
-
322
- ## Contributors
323
-
324
- - [@PerryLink](https://github.com/PerryLink) — निर्माता और अनुरक्षक: नियम शब्दावली व मूल्यांकन, runtime, HMR निगरानी, सत्र-लॉग ऑडिट, नेटवर्क नीति + प्रॉक्सी, और पाँच-भाषा दस्तावेज़।
325
- - [@22xuan](https://github.com/22xuan) — rc.6 hosts द्वारा ऑडिट घटना के `ignorable` मार्कर को चुपचाप छोड़ने की विस्तृत रिपोर्ट ([#2](https://github.com/PerryLink/dsh-permission-rules/issues/2)) और अपस्ट्रीम harness चर्चा; v0.4.1 runtime host-क्षमता पहचान और दस्तावेज़ सुधार सीधे उसी विश्लेषण से निकले।
326
- - [@sjh9714](https://github.com/sjh9714) — साझा नियम-सिंटैक्स टेस्ट-वेक्टर कॉर्पस प्रस्तावित किया ([#4](https://github.com/PerryLink/dsh-permission-rules/issues/4), [#5](https://github.com/PerryLink/dsh-permission-rules/issues/5)), जो v0.5.1 में `docs/rule-test-vectors/` के रूप में शामिल हुआ, और [डिज़ाइन चर्चा](https://github.com/PerryLink/dsh-permission-rules/discussions/10) में AST-विघटन के सीमा-मामले दिए।
327
- - [@weipeng1999](https://github.com/weipeng1999) — AST-आधारित कमांड-विघटन फ़ीचर प्रस्ताव ([#8](https://github.com/PerryLink/dsh-permission-rules/issues/8)), जिससे डिज़ाइन चर्चा शुरू हुई।
328
- - [@alexchenzl](https://github.com/alexchenzl) — DSH Directory में सूचीबद्ध करने का अनुरोध ([#7](https://github.com/PerryLink/dsh-permission-rules/issues/7))।
329
- - [@zl190](https://github.com/zl190) — `0.1.0-rc.7` harness संगतता अंतर की सूचना दी और उसे सत्यापित किया ([PR #9](https://github.com/PerryLink/dsh-permission-rules/pulls/9))।
330
- - [@cuohua](https://github.com/cuohua) — बताया कि संस्करण-जाँच केवल `0.1.0` को कवर करने के बावजूद `0.1.1-rc` पंक्ति अब भी `ignorable` मार्कर को चुपचाप छोड़ देती है ([#11](https://github.com/PerryLink/dsh-permission-rules/issues/11)); विस्तारित जाँच सीधे उसी विश्लेषण से बनी।
331
-
332
- ## PerryLink DSH Plugin Family
333
-
334
- यह प्रोजेक्ट [PerryLink](https://github.com/PerryLink) के DeepSeek Harness प्लगइन परिवार का हिस्सा है। पूरी सूची नीचे संक्षिप्त रखी गई है ताकि हर README की पहली स्क्रीन छोटी रहे; हर पंक्ति और उसकी स्थिति देखने के लिए इसे खोलें।
335
-
336
- <details>
337
- <summary>सभी प्लगइन खोलें</summary>
338
-
339
- | प्लगइन | स्थिति |
340
- |---|---|
341
- | **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
342
- | **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
343
- | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
344
- | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | |
345
- | **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
346
- | **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
347
- | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | |
348
- | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
349
- | **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
350
- | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
351
- | **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
352
- | **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
353
- | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | |
354
- | **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
355
- | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
356
- | **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
357
- | **[dsh-eia-guide-check](https://github.com/PerryLink/dsh-eia-guide-check)** | |
358
- | **[dsh-emergency-plan](https://github.com/PerryLink/dsh-emergency-plan)** | |
359
- | **[dsh-essay-rubric-check](https://github.com/PerryLink/dsh-essay-rubric-check)** | |
360
- | **[dsh-evidence-check](https://github.com/PerryLink/dsh-evidence-check)** | |
361
- | **[dsh-export-ctl-check](https://github.com/PerryLink/dsh-export-ctl-check)** | |
362
- | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | |
363
- | **[dsh-fmea-table-check](https://github.com/PerryLink/dsh-fmea-table-check)** | |
364
- | **[dsh-forecast-penalty](https://github.com/PerryLink/dsh-forecast-penalty)** | |
365
- | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | |
366
- | **[dsh-github](https://github.com/PerryLink/dsh-github)** | |
367
- | **[dsh-gongwen-flow-check](https://github.com/PerryLink/dsh-gongwen-flow-check)** | |
368
- | **[dsh-gongwen-word-check](https://github.com/PerryLink/dsh-gongwen-word-check)** | |
369
- | **[dsh-guard-plan-qc](https://github.com/PerryLink/dsh-guard-plan-qc)** | |
370
- | **[dsh-hazchem-check](https://github.com/PerryLink/dsh-hazchem-check)** | |
371
- | **[dsh-hazplan-check](https://github.com/PerryLink/dsh-hazplan-check)** | |
372
- | **[dsh-hidden-risk-map](https://github.com/PerryLink/dsh-hidden-risk-map)** | |
373
- | **[dsh-hs-classify](https://github.com/PerryLink/dsh-hs-classify)** | |
374
- | **[dsh-icd-rule-check](https://github.com/PerryLink/dsh-icd-rule-check)** | |
375
- | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | |
376
- | **[dsh-lawcite-adapter](https://github.com/PerryLink/dsh-lawcite-adapter)** | |
377
- | **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | |
378
- | **[dsh-lc-doc-check](https://github.com/PerryLink/dsh-lc-doc-check)** | |
379
- | **[dsh-learning-gap-check](https://github.com/PerryLink/dsh-learning-gap-check)** | |
380
- | **[dsh-library](https://github.com/PerryLink/dsh-library)** | |
381
- | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | |
382
- | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | |
383
- | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
384
- | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
385
- | **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
386
- | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | |
387
- | **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
388
- | **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
389
- | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
390
- | **[dsh-origin-rvc-check](https://github.com/PerryLink/dsh-origin-rvc-check)** | |
391
- | **[dsh-ota-review-check](https://github.com/PerryLink/dsh-ota-review-check)** | |
392
- | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | |
393
- | **[dsh-paper-doc-adapter](https://github.com/PerryLink/dsh-paper-doc-adapter)** | |
394
- | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | |
395
- | **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
396
- | **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
397
- | **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
398
- | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | |
399
- | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | |
400
- | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | |
401
- | **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | |
402
- | **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
403
- | **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
404
- | **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
405
- | **[dsh-ppap-check](https://github.com/PerryLink/dsh-ppap-check)** | |
406
- | **[dsh-protest-deadline](https://github.com/PerryLink/dsh-protest-deadline)** | |
407
- | **[dsh-railway-window](https://github.com/PerryLink/dsh-railway-window)** | |
408
- | **[dsh-repair-order-qc](https://github.com/PerryLink/dsh-repair-order-qc)** | |
409
- | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | |
410
- | **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
411
- | **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
412
- | **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
413
- | **[dsh-score](https://github.com/PerryLink/dsh-score)** | |
414
- | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
415
- | **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
416
- | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
417
- | **[dsh-soe-decision-check](https://github.com/PerryLink/dsh-soe-decision-check)** | |
418
- | **[dsh-soilwater-check](https://github.com/PerryLink/dsh-soilwater-check)** | |
419
- | **[dsh-sop-sync-check](https://github.com/PerryLink/dsh-sop-sync-check)** | |
420
- | **[dsh-spc-gbt-adapter](https://github.com/PerryLink/dsh-spc-gbt-adapter)** | |
421
- | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | |
422
- | **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
423
- | **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
424
- | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
425
- | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | |
426
- | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
427
- | **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** | |
428
- | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 फ़्रोज़न — रिपॉज़िटरी README देखें |
429
- | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 फ़्रोज़न — रिपॉज़िटरी README देखें |
430
- | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 फ़्रोज़न — रिपॉज़िटरी README देखें |
431
- | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 फ़्रोज़न — रिपॉज़िटरी README देखें |
432
- | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 फ़्रोज़न — रिपॉज़िटरी README देखें |
433
- | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 सेवानिवृत्त — रिपॉज़िटरी README देखें |
434
- | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 सेवानिवृत्त — रिपॉज़िटरी README देखें |
435
- | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 सेवानिवृत्त — रिपॉज़िटरी README देखें |
436
-
437
- </details>
438
-
439
- ## License
440
-
441
- [Apache License 2.0](LICENSE) © 2026 dsh-permission-rules contributors
442
-
443
- ### DSH Desktop मार्केट से इंस्टॉल करें
444
-
445
- सभी PerryLink प्लगइन DSH Desktop के बिल्ट-इन मार्केट में देखे जा सकते हैं: **Market → Sources → add source → पेस्ट करें** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ चुनें**। इंस्टॉलेशन मार्केट के npm-identity सत्यापन और आपकी पुष्टि से ही होता है।