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/CHANGELOG.md +7 -0
- package/README.en.md +504 -0
- package/README.es.md +504 -0
- package/README.hi.md +504 -0
- package/README.md +309 -245
- package/README.pt.md +504 -0
- package/docs/assets/dsh-permission-rules-flow-dark.svg +58 -0
- package/docs/assets/dsh-permission-rules-flow-light.svg +58 -0
- package/docs/assets/dsh-permission-rules-flow-v5-dark.svg +103 -0
- package/docs/assets/dsh-permission-rules-flow-v5-light.svg +103 -0
- package/docs/assets/dsh-permission-rules-hero-en-dark.webp +0 -0
- package/docs/assets/dsh-permission-rules-hero-en-light.webp +0 -0
- package/docs/assets/dsh-permission-rules-hero-zh-dark.webp +0 -0
- package/docs/assets/dsh-permission-rules-hero-zh-light.webp +0 -0
- package/docs/rules-format.en.md +5 -4
- package/docs/rules-format.md +5 -4
- package/lib/index.js +230 -40
- package/lib/types/config.d.ts +9 -4
- package/lib/types/config.d.ts.map +1 -1
- package/lib/types/prose.d.ts +6 -0
- package/lib/types/prose.d.ts.map +1 -1
- package/lib/types/rules.d.ts +74 -15
- package/lib/types/rules.d.ts.map +1 -1
- package/lib/types/runtime.d.ts +59 -12
- package/lib/types/runtime.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/config.ts +9 -4
- package/src/prose.ts +21 -0
- package/src/rules.ts +131 -24
- package/src/runtime.ts +140 -24
- package/README-es.md +0 -443
- package/README-hi.md +0 -445
- package/README-pt.md +0 -443
- package/README-zh.md +0 -443
package/README.hi.md
ADDED
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-permission-rules-hero-en-dark.webp">
|
|
5
|
+
<img src="docs/assets/dsh-permission-rules-hero-en-light.webp" width="100%" alt="dsh-permission-rules का निर्णय लेजर: क्रमबद्ध नियम श्रृंखला का पहला मेल, उसका deny निर्णय कार्ड, और शेल आउटबाउंड के लिए प्रॉक्सी पट्टी">
|
|
6
|
+
</picture>
|
|
7
|
+
|
|
8
|
+
# dsh-permission-rules
|
|
9
|
+
|
|
10
|
+
**टूल कॉल पर फ़ैसले का अधिकार अपने हाथ में लें — हर allow / deny / ask YAML में रहता है: निर्धारक, तत्काल और ऑडिट-योग्य।**
|
|
11
|
+
|
|
12
|
+
DeepSeek Harness के लिए Claude Code शैली का डिक्लेरेटिव परमिशन मिडलवेयर: नियम ज्ञात को तय करते हैं और समीक्षक मॉडल अज्ञात को; साथ में Codex शैली की प्रोसेस-स्तरीय नेटवर्क नीति और स्थानीय प्रॉक्सी है जो शेल सबप्रोसेस की आउटबाउंड ट्रैफ़िक को नियंत्रित करती है।
|
|
13
|
+
|
|
14
|
+
[इंस्टॉल](#तीन-चरणों-में-शुरुआत) · [कॉन्फ़िगरेशन](#कॉन्फ़िगरेशन) · [FAQ](#faq) · [简体中文](README.md) · [English](README.en.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
|
|
15
|
+
|
|
16
|
+
[](LICENSE)
|
|
17
|
+
[](#संगतता)
|
|
18
|
+
[](https://www.npmjs.com/package/dsh-permission-rules)
|
|
19
|
+
[](https://github.com/PerryLink/dsh-permission-rules/actions/workflows/ci.yml)
|
|
20
|
+
[](#संगतता)
|
|
21
|
+
|
|
22
|
+
[](https://github.com/PerryLink/dsh-permission-rules/stargazers)
|
|
23
|
+
[](https://www.npmjs.com/package/dsh-permission-rules)
|
|
24
|
+
[](https://dshfind.com/plugins/PerryLink/dsh-permission-rules?ref=badge)
|
|
25
|
+
[](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-permission-rules)
|
|
26
|
+
[](https://dsh.market/)
|
|
27
|
+
[](https://gitee.com/perrylink/dsh-permission-rules)
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
dsh plugin --profile <name> add dsh-permission-rules
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<sub>सामुदायिक प्लगइन, DeepSeek से संबद्ध नहीं। आधिकारिक रेपो: <https://github.com/PerryLink/dsh-permission-rules> (Gitee एक मिरर है)।</sub>
|
|
36
|
+
|
|
37
|
+
## यह क्या है
|
|
38
|
+
|
|
39
|
+
`dsh-permission-rules` हर टूल कॉल से पहले `tools/pre-execute` waterfall पर **`allow` / `deny` / `ask`** नियमों की क्रमबद्ध सूची रखता है — निर्धारक, तत्काल, ऑडिट-योग्य और आपके द्वारा शुद्ध YAML में लिखी गई। नियम ज्ञात कॉल तय करते हैं; अनिश्चित कॉल आधिकारिक approval seam पर जाती हैं, जहाँ समीक्षक मॉडल या इंसान उत्तर देता है। दूसरी परत Codex शैली की प्रोसेस-स्तरीय नेटवर्क नीति जोड़ती है: शेल सबप्रोसेस की आउटबाउंड ट्रैफ़िक अंतर्निहित स्थानीय HTTP/CONNECT प्रॉक्सी से गुज़रती है, जिसे नेटवर्क नियम या आधिकारिक sandbox presets पर मैप किए गए तीन मोड तय करते हैं।
|
|
40
|
+
|
|
41
|
+
<picture>
|
|
42
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-permission-rules-flow-v5-dark.svg">
|
|
43
|
+
<img src="docs/assets/dsh-permission-rules-flow-v5-light.svg" width="100%" alt="dsh-permission-rules संरचना: टूल कॉल और शेल आउटबाउंड दो चैनल एक क्रमबद्ध नियम श्रृंखला में मिलते हैं, फिर टूल-कॉल और नेटवर्क-आउटबाउंड निर्णयों में बँटते हैं, और दो केवल-लॉग ऑडिट घटनाओं पर समाप्त होते हैं">
|
|
44
|
+
</picture>
|
|
45
|
+
|
|
46
|
+
*संरचना: दो चैनल (टूल कॉल / शेल आउटबाउंड) एक क्रमबद्ध नियम श्रृंखला में मिलते हैं — पहला मेल जीतता है — फिर टूल-कॉल और नेटवर्क-आउटबाउंड निर्णयों में बँटते हैं, और दो केवल-लॉग ऑडिट घटनाओं पर समाप्त होते हैं।*
|
|
47
|
+
|
|
48
|
+
## तीन चरणों में शुरुआत
|
|
49
|
+
|
|
50
|
+
1. **इंस्टॉल करें** (कोई एक चैनल चुनें):
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
# git चैनल (नवीनतम main; prepare स्क्रिप्ट केवल production dependencies से बिल्ड करती है)
|
|
54
|
+
dsh plugin --profile web add github:PerryLink/dsh-permission-rules
|
|
55
|
+
# npm चैनल (प्रकाशित रिलीज़)
|
|
56
|
+
dsh plugin --profile web add dsh-permission-rules
|
|
57
|
+
# tarball चैनल: इस रेपो में pnpm pack, फिर
|
|
58
|
+
dsh plugin --profile web add ./dsh-permission-rules-<version>.tgz
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
2. **अपना पहला नियम लिखें** (प्रोजेक्ट रूट में `.dsh/rules.yaml`; वैकल्पिक, अंतर्निहित उच्च-जोखिम बेसलाइन डिफ़ॉल्ट रूप से चालू है):
|
|
62
|
+
|
|
63
|
+
```yaml
|
|
64
|
+
# <project>/.dsh/rules.yaml
|
|
65
|
+
rules:
|
|
66
|
+
- match: { tools: [bash, pwsh], params: { command: "git push*" }, paths: ["**/secrets/**"] }
|
|
67
|
+
action: deny
|
|
68
|
+
reason: "No pushes from protected paths"
|
|
69
|
+
|
|
70
|
+
- match: { tools: [edit, write] }
|
|
71
|
+
action: ask
|
|
72
|
+
reason: "File writes need confirmation"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
3. **जाँचें कि यह माउंट होता है**:
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
# प्रोफ़ाइल रीस्टार्ट करने के बाद प्लगइन पंक्ति की पुष्टि करें
|
|
79
|
+
dsh --profile web --dump-config | grep -A4 'id: permission-rules'
|
|
80
|
+
# वास्तविक कमांड सतह पर एक काल्पनिक कॉल का शुष्क मूल्यांकन करें; कोई टूल नहीं चलता
|
|
81
|
+
/rules test bash {"command":"git push origin main","cwd":"src/secrets/app"}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
```text
|
|
85
|
+
"bash" matches rule 1 (deny): 禁止 push 到受保护路径
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**अनइंस्टॉल**: `dsh plugin --profile web remove dsh-permission-rules` (या प्रोफ़ाइल patch से वह पंक्ति हटाएँ)।
|
|
89
|
+
|
|
90
|
+
<details>
|
|
91
|
+
<summary>DSH Desktop मार्केट से इंस्टॉल करें</summary>
|
|
92
|
+
|
|
93
|
+
हर PerryLink प्लगइन DSH Desktop के अंतर्निहित मार्केट में सूचीबद्ध है: **मार्केट → स्रोत → स्रोत जोड़ें → चिपकाएँ** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ चुनें**। इंस्टॉल के लिए अब भी मार्केट का npm पहचान सत्यापन और आपकी पुष्टि आवश्यक है।
|
|
94
|
+
|
|
95
|
+
</details>
|
|
96
|
+
|
|
97
|
+
## मुख्य क्षमताएँ
|
|
98
|
+
|
|
99
|
+
`dsh-permission-rules` `tools/pre-execute` पर हर टूल कॉल से पहले क्रमबद्ध नियम रखता है — निर्धारक, तत्काल, ऑडिट-योग्य:
|
|
100
|
+
|
|
101
|
+
- **`deny`** कॉल को रोकता है; नियम का `reason` मॉडल को दिखने वाली त्रुटि बन जाता है।
|
|
102
|
+
- **`ask`** आधिकारिक approval seam से जाता है (`dsh-auto-review` माउंट करें तो दूसरा मॉडल उत्तर देता है, या इंसान उत्तर देता है; दोनों न हों तो harness fail closed होता है)।
|
|
103
|
+
- **`allow`** (और कोई मेल न होना) सख्ती से `next()` से प्रत्यायोजित होता है — डाउनस्ट्रीम listeners कभी short-circuit नहीं होते।
|
|
104
|
+
|
|
105
|
+
हर हिट **और** हर passthrough `permissionRules/decision` सत्र ईवेंट के रूप में ऑडिट-लॉग होता है (केवल लॉग — मॉडल संदर्भ में कुछ अतिरिक्त नहीं डाला जाता)।
|
|
106
|
+
|
|
107
|
+
- **समृद्ध मिलान** — टूल-नाम globs (`mcp__*` सहित), agent-identity चयनकर्ता (`main` / `subagent` / `preset:*`), argument key/value globs **या** regexes (`!pattern` निषेध और `absent` key आयाम सहित), **किसी भी नेस्टिंग गहराई** पर workspace-सापेक्ष path globs, `when` होस्ट शर्तें (env वेरिएबल, प्लेटफ़ॉर्म), और token-सटीक कमांड मिलान के लिए **शेल कमांड विघटन** (`argv`: कमांड शब्द, argument tokens, pipeline signature)।
|
|
108
|
+
- **अंतर्निहित उच्च-जोखिम बेसलाइन** — शिप किया गया deny/ask नियम-सेट (विनाशकारी कमांड, privilege escalation, download-and-execute, संवेदनशील paths) डिफ़ॉल्ट रूप से सक्षम और उपयोगकर्ता नियमों के बाद जोड़ा गया, ताकि निकटतर उपयोगकर्ता नियम उसे ओवरराइड कर सके; `builtin.enabled` से टॉगल करें।
|
|
109
|
+
- **पदानुक्रमित नियम फ़ाइलें** — वैकल्पिक `searchUp` सत्र cwd से फ़ाइलसिस्टम रूट तक हर `.dsh/rules.yaml` को मिलाता है, निकटतम पहले।
|
|
110
|
+
- **ड्राई-रन रोलआउट** — `enforce: false` ऑडिट करता है कि नीति *क्या* करती, जबकि हर कॉल पास हो जाती है।
|
|
111
|
+
- **हॉट रीलोड** — debounce के साथ Chokidar watch; फ़ाइल-स्तर पर टूटा संपादन पिछले नियम रखता है और कभी क्रैश नहीं करता, जबकि एक अमान्य नियम केवल स्वयं अक्षम होता है। WSL होस्ट पर, या `/mnt/<drive>` के अंतर्गत नियम फ़ाइल के लिए, watch polling पर चला जाता है क्योंकि वहाँ native change events अविश्वसनीय हैं।
|
|
112
|
+
- **ज़ोर से, पर सीमित** — फ़ाइल-स्तरीय त्रुटियाँ (अमान्य YAML आदि) `badFilePolicy` का पालन करती हैं; एक अमान्य नियम (खराब glob/regex, अज्ञात फ़ील्ड/action) केवल स्वयं अक्षम होता है और स्टार्टअप व `/rules` में दिखता है, बाकी नियम काम करते रहते हैं (issue #49)।
|
|
113
|
+
|
|
114
|
+
### कमांड और टूल सतह
|
|
115
|
+
|
|
116
|
+
| सतह | प्रकार | टिप्पणियाँ |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| `tools/pre-execute` | listener | पहला मेल खाने वाला allow/deny/ask नियम + नेटवर्क URL-उम्मीदवार निष्कर्षण |
|
|
119
|
+
| `/rules` | command | `list` · `reload` · `decisions [n]` · `test <tool> <json>` |
|
|
120
|
+
| `permissionRules/decision` | event | हर हिट और passthrough का केवल-लॉग ऑडिट |
|
|
121
|
+
| `permissionRules/network` | event | अवरुद्ध कनेक्शनों का proxy-परत ऑडिट |
|
|
122
|
+
| HTTP/CONNECT proxy | service | शेल सबप्रोसेस ट्रैफ़िक नियंत्रित करने वाला अंतर्निहित स्थानीय proxy |
|
|
123
|
+
| settings page | client | नेटवर्क-मोड एडिटर, नियम एडिटर, ब्लॉक काउंटर, हाल की इंटरसेप्शन (प्रत्येक के लिए अनुमति क्रिया) |
|
|
124
|
+
|
|
125
|
+
```text
|
|
126
|
+
/rules list the active rules, their source files, and any last-reload error
|
|
127
|
+
/rules list explicit alias for the bare listing
|
|
128
|
+
/rules reload re-read the rule-file chain for this workspace
|
|
129
|
+
/rules decisions [n] show the last n permission decisions of this session (default 10)
|
|
130
|
+
/rules test <tool> <json> dry-evaluate the rules against a hypothetical call
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
`/rules test` आगे flags भी स्वीकार करता है: `--cwd <dir>`, `--env KEY=VALUE` (दोहराने योग्य), `--agent <selector>` (दोहराने योग्य) और `--platform <name>`। बहु-फ़ाइल श्रृंखलाओं में (जैसे `searchUp`), सूचीबद्ध हर नियम पंक्ति अपनी स्रोत फ़ाइल को दी जाती है।
|
|
134
|
+
|
|
135
|
+
### उदाहरण
|
|
136
|
+
|
|
137
|
+
ये प्लगइन के वास्तविक प्रवेश-बिंदु हैं; एक बार इंस्टॉल करें, फिर कोई एक कॉल करें।
|
|
138
|
+
|
|
139
|
+
**विस्तृत उदाहरण** — कमांड `/rules test bash {"command":"git push origin main","cwd":"src/secrets/app"}`, आउटपुट:
|
|
140
|
+
|
|
141
|
+
```text
|
|
142
|
+
"bash" matches rule 1 (deny): 禁止 push 到受保护路径
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
*Observed from `test/command.spec.ts:204-219 (assertions at :209-213); src/prose.ts:121`*
|
|
146
|
+
|
|
147
|
+
**विफलता शाखा** — इनपुट `/rules test bash {not json`, आउटपुट:
|
|
148
|
+
|
|
149
|
+
```text
|
|
150
|
+
Invalid JSON arguments "{not json": the arguments must parse as JSON.
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
*Observed from `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`*
|
|
154
|
+
|
|
155
|
+
**संक्षिप्त उदाहरण**: `tools/pre-execute` · `/rules test <tool> <json>`
|
|
156
|
+
|
|
157
|
+
## नियम सिंटैक्स
|
|
158
|
+
|
|
159
|
+
```yaml
|
|
160
|
+
# <project>/.dsh/rules.yaml
|
|
161
|
+
rules:
|
|
162
|
+
- match: { tools: [bash, pwsh], params: { command: "git push*" }, paths: ["**/secrets/**"] }
|
|
163
|
+
action: deny
|
|
164
|
+
reason: "No pushes from protected paths"
|
|
165
|
+
|
|
166
|
+
- match: { tools: [edit, write] }
|
|
167
|
+
action: ask
|
|
168
|
+
reason: "File writes need confirmation"
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
- **मिलान आयाम** — `tools` (globs, `mcp__*` सहित), `agents` (`main` / `subagent` / `preset:<name>`; अज्ञात पहचान कभी नहीं मिलती — fail closed), `params` (key/value globs या regexes, `!pattern` निषेध, `absent` key आयाम), `paths` (किसी भी गहराई पर निकाले गए workspace-सापेक्ष globs), `when` (`env` var globs/regexes + बंद `platform` सूची), और `network` (`domains` / `ips` / `ports` / `schemes` — globs, wildcards, CIDRs, port ranges)।
|
|
172
|
+
- **क्रियाएँ** — `allow` / `deny` / `ask`, फ़ाइल क्रम में मूल्यांकित, पहला मेल जीतता है।
|
|
173
|
+
- **नियम मेटाडेटा** — `enabled: false` (दिखता है पर निष्क्रिय), `description`, `tags`; अज्ञात फ़ील्ड लोड पर विफल होते हैं।
|
|
174
|
+
- **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) में है।
|
|
175
|
+
|
|
176
|
+
## नेटवर्क नीति
|
|
177
|
+
|
|
178
|
+
Codex शैली की **प्रोसेस-स्तरीय नेटवर्क नीति**: शेल सबप्रोसेस ट्रैफ़िक अंतर्निहित स्थानीय **HTTP/CONNECT proxy** से गुज़रता है, और हर कनेक्शन क्रमबद्ध नेटवर्क नियमों या आधिकारिक sandbox presets पर मैप किए गए तीन मोड से तय होता है:
|
|
179
|
+
|
|
180
|
+
- **`deny-all`** — read-only sandbox preset: सभी आउटबाउंड रोकें।
|
|
181
|
+
- **`whitelist`** — workspace-write preset: सूचीबद्ध लक्ष्यों को अनुमति, बाकी के लिए `unlisted: ask` (या `deny`)।
|
|
182
|
+
- **`allow-all`** — danger-full-access preset: सब कुछ अनुमति।
|
|
183
|
+
- **`auto`** (डिफ़ॉल्ट) — sandbox preset का अनुसरण करता है; sandbox-policy सेवा न होने वाले होस्ट पर `autoFallback` (`allow-all`) में बदल जाता है।
|
|
184
|
+
|
|
185
|
+
- **मिलान** — `match.network` में `domains` / `ips` / `ports` / `schemes` (globs, wildcards, CIDRs, port ranges; संख्यात्मक YAML ports स्वीकार्य)। `tools/pre-execute` हॉट पथ पर URL-उम्मीदवार निष्कर्षण web-टूल arguments और bash/pwsh कमांड टेक्स्ट में अंतर्निहित URLs पर चलता है; loopback लक्ष्य `loopback` नीति के अनुसार नियमों को short-circuit कर सकते हैं। IPv4-मैप किए गए IPv6 literals मिलान से पहले अपने IPv4 रूप में सामान्यीकृत होते हैं, और proxy उन्हीं पतों पर जुड़ता है जिन पर निर्णय हुआ — कभी दूसरा DNS resolution नहीं — जिस कनेक्शन के adjudication में कोई पता नहीं मिला वह नाम डायल करने के बजाय fail closed (502) होता है।
|
|
186
|
+
- **अपस्ट्रीम चेनिंग** — `network.upstreamProxy` (डिफ़ॉल्ट `off`) इस proxy द्वारा **अनुमत** कनेक्शनों को upstream proxy से भेजता है: CONNECT upstream से tunnel माँगता है (`CONNECT host:port`) और सादे HTTP अनुरोध absolute रूप में उसे अग्रेषित होते हैं। अवरुद्ध लक्ष्य कभी upstream तक नहीं पहुँचता — उसे अब भी इस प्लगइन का संरचित 403 मिलता है। upstream कॉन्फ़िगर होने पर भी दो स्थितियाँ कभी चेन नहीं होतीं: **loopback** लक्ष्य (इस होस्ट के बाहर का proxy उसका loopback रूट नहीं कर सकता) और **`ips`-स्कोप नियम** से उत्पन्न कोई भी निर्णय (चेनिंग hostname upstream को सौंप देती है, इसलिए "कनेक्शन उसी पते पर पड़ता है जो नियमों ने देखा" — issue #21 — ठीक वहाँ टूट जाएगा जहाँ नियमों को पते की परवाह थी; वे निर्णय adjudicated पते पर सीधे डायल करते रहते हैं), साथ ही वह लक्ष्य जिसके scheme के लिए कोई उपयोगी upstream नहीं। upstream का अपना hostname ऑपरेटर कॉन्फ़िगरेशन है, agent इनपुट नहीं, और इन नियमों से adjudicate नहीं होता। credentials वाला URL कभी कच्चा नहीं छापा जाता: चेतावनियाँ, `/rules network` और settings snapshot पासवर्ड मास्क करते हैं (`http://user:***@host:port`)। upstream अनुपलब्ध, timeout (10 s), या non-2xx उत्तर **502** देता है — जानबूझकर सीधे डायल पर चुपचाप fallback नहीं, ताकि गलत कॉन्फ़िगरेशन दिखता रहे।
|
|
187
|
+
- **ऑडिट** — अस्वीकृत कनेक्शन स्वामी सत्र में `permissionRules/network` जोड़ते हैं (वही अनुकूली `ignorable` द्वार), ब्लॉक काउंटर और हाल की इंटरसेप्शन `/rules network` और settings पेज में।
|
|
188
|
+
- **निदान** — अवरुद्ध कनेक्शन `[network: …]` संदेश लेकर आते हैं जो अवरुद्ध लक्ष्य, निर्णय देने वाला मोड या नियम, और उपाय बताता है।
|
|
189
|
+
- **settings पेज से अनुमति** — हर हाल की इंटरसेप्शन एक **Allow** क्रिया देती है। यह उस निकटतम नियम फ़ाइल के **शीर्ष** (index 0) पर एक न्यूनतम `match: { network: { domains: [<host>] } }` / `action: allow` नियम लिखती है जो वास्तव में उस कनेक्शन का निर्णय करती है: जिस workspace को ब्लॉक आरोपित हुआ उसकी प्रोजेक्ट फ़ाइल (कॉन्फ़िगर होने पर absolute `rulesFile`), या session-रहित host-स्तरीय ब्लॉक के लिए वह फ़ाइल जो host chain हल करती है (absolute `rulesFile` → मौजूदा `<processCwd>/<rulesFile>` → कॉन्फ़िगर `fallbackPath` → `<processCwd>/<rulesFile>`, बनाई जाती है) — और जब कई workspaces लोड हों, पेज पहले picker देता है, क्योंकि कोई भी लोडेड workspace chain host chain से ऊपर है। index 0 इसलिए क्योंकि नियम first-match-wins हैं: मौजूदा `deny` के बाद जोड़ा नियम मृत पाठ होगा। केवल `domains`, क्योंकि वह आयाम subdomain-समावेशी और port/scheme-निरपेक्ष है, इसलिए host अगले port पर दोबारा अवरुद्ध नहीं होता; मौजूदा टिप्पणियाँ और अछूते नियम बचे रहते हैं, और पाठ hand edit जैसे ही validation द्वार से गुज़रता है। बदलाव तुरंत लागू होता है — cached workspace chains **और** session-रहित host chain दोनों फिर पढ़ी जाती हैं, न restart न `/rules reload` — और निर्णय फिर गणना होता है, इसलिए सूचना वास्तविक परिणाम बताती है और कनेक्शन अवरुद्ध रहने पर कभी सफलता का दावा नहीं करती। यह अज्ञात workspace, ज्ञात नियम स्रोतों के बाहर का लक्ष्य, read-only अंतर्निहित बेसलाइन, और ऐसी फ़ाइल जिसे पढ़ा या parse नहीं कर सकता — इन्हें फ़ाइल अछूती छोड़कर अस्वीकार करता है; पहले से अनुमत कनेक्शन कुछ नहीं लिखता। `network.allowHostAction: false` बटन छिपाता है और RPC को अस्वीकार कराता है।
|
|
190
|
+
|
|
191
|
+
## कॉन्फ़िगरेशन
|
|
192
|
+
|
|
193
|
+
सभी tunables Schemastery `Config` फ़ील्ड हैं (cordis.yml से बदले जा सकते हैं)। id-लक्षित override पूरी पंक्ति बदल देता है — ज़रूरी हर key दोहराएँ। `0.1.7-alpha` होस्ट पर हर फ़ील्ड `.volatile()` घोषित है, इसलिए Plugins settings पेज से जगह पर भी संपादित हो सकता है: संपादन चल रहे references में बिना प्लगइन remount किए commit होता है, runtime अगले उपयोग पर नया मान पढ़ता है, और `network.proxyPort`, `proxyBind`, `injectEnv` या `noProxy` बदलने पर स्थानीय proxy तुरंत rebind होता है। संख्यात्मक सीमाएँ schema में हैं, और config editor persist करने से पहले merged config को उसी schema से resolve करता है, इसलिए सीमा-बाहर मान लिखते समय अस्वीकृत होता है। जिन होस्ट का Schemastery `volatile()` से पुराना है, वहाँ ये फ़ील्ड केवल cordis.yml से बदलते हैं।
|
|
194
|
+
|
|
195
|
+
सबसे अधिक उपयोग होने वाली keys:
|
|
196
|
+
|
|
197
|
+
| कुंजी | डिफ़ॉल्ट | अर्थ |
|
|
198
|
+
|---|---|---|
|
|
199
|
+
| `rulesFile` | `.dsh/rules.yaml` | नियम फ़ाइल का स्थान; सापेक्ष = कॉल करने वाले सत्र के cwd से resolve, absolute = वैश्विक और माउंट पर सत्यापित |
|
|
200
|
+
| `fallbackPath` | *(none)* | cwd-आधारित खोज कुछ न मिलने पर उपयोग होने वाली नियम फ़ाइल; माउंट पर सत्यापित |
|
|
201
|
+
| `badFilePolicy` | `fail` | फ़ाइल-स्तरीय विफलता: `fail` लंबित टूल कॉल को ज़ोर से विफल करता है; `ignore-with-warning` चेतावनी देकर खाली आगे बढ़ता है। एक अमान्य नियम हमेशा अलग रहता है: वह नियम अक्षम होकर स्टार्टअप व `/rules` में रिपोर्ट होता है |
|
|
202
|
+
| `maxRules` | `256` | प्रभावी स्रोत श्रृंखला पर नियम संख्या की कठोर सीमा |
|
|
203
|
+
| `patternMode` | `glob` | `params`/`paths`/`when.env` pattern शैली: `glob` या `regex` (टूल नाम सदा globs) |
|
|
204
|
+
| `watch` | `true` | Chokidar watch + बदलाव पर रीलोड |
|
|
205
|
+
| `enforce` | `true` | `false` = ड्राई-रन: deny/ask हिट `dryRun` चिह्न के साथ ऑडिट होते हैं और हर कॉल पास होती है |
|
|
206
|
+
| `language` | `en` | `/rules` आउटपुट भाषा: `en`, `zh`, `es`, `pt`, `hi` |
|
|
207
|
+
|
|
208
|
+
<details>
|
|
209
|
+
<summary>पूर्ण कॉन्फ़िगरेशन तालिका (29 keys)</summary>
|
|
210
|
+
|
|
211
|
+
| कुंजी | डिफ़ॉल्ट | अर्थ |
|
|
212
|
+
|---|---|---|
|
|
213
|
+
| `rulesFile` | `.dsh/rules.yaml` | नियम फ़ाइल का स्थान; सापेक्ष = कॉल करने वाले सत्र के cwd से resolve, absolute = वैश्विक और माउंट पर सत्यापित |
|
|
214
|
+
| `fallbackPath` | *(none)* | cwd-आधारित खोज कुछ न मिलने पर उपयोग होने वाली नियम फ़ाइल; माउंट पर सत्यापित |
|
|
215
|
+
| `badFilePolicy` | `fail` | फ़ाइल-स्तरीय विफलता: `fail` लंबित टूल कॉल को ज़ोर से विफल करता है; `ignore-with-warning` चेतावनी देकर खाली आगे बढ़ता है। एक अमान्य नियम हमेशा अलग रहता है: वह नियम अक्षम होकर स्टार्टअप व `/rules` में रिपोर्ट होता है |
|
|
216
|
+
| `maxRules` | `256` | प्रभावी स्रोत श्रृंखला पर नियम संख्या की कठोर सीमा |
|
|
217
|
+
| `maxCachedWorkspaces` | `512` | cached प्रति-workspace नियम लोड की कठोर सीमा (LRU eviction) |
|
|
218
|
+
| `patternMode` | `glob` | `params`/`paths`/`when.env` pattern शैली: `glob` या `regex` (टूल नाम सदा globs) |
|
|
219
|
+
| `watch` | `true` | Chokidar watch + बदलाव पर रीलोड |
|
|
220
|
+
| `watchStabilityThresholdMs` | `200` | रीलोड debounce विंडो (ms) |
|
|
221
|
+
| `language` | `en` | `/rules` आउटपुट भाषा: `en`, `zh`, `es`, `pt`, `hi` |
|
|
222
|
+
| `caseInsensitivePaths` | *(win32)* | `paths` patterns और workspace-root तुलना ASCII केस अनदेखा करते हैं; Windows पर `true` |
|
|
223
|
+
| `audit` | `all` | ऑडिट ग्रैन्युलैरिटी: `all` हर हिट और passthrough लॉग करता है; `hits` passthrough छोड़ता है |
|
|
224
|
+
| `searchUp` | `false` | सत्र cwd से पैरेंट डायरेक्टरीज़ में जाकर हर मिली नियम फ़ाइल मिलाएँ, निकटतम पहले |
|
|
225
|
+
| `maxGlobStars` | `2` | प्रति glob pattern unbounded `*`/`**` quantifiers की कठोर सीमा |
|
|
226
|
+
| `enforce` | `true` | `false` = ड्राई-रन: deny/ask हिट `dryRun` चिह्न के साथ ऑडिट होते हैं और हर कॉल पास होती है |
|
|
227
|
+
| `allowUnmarkedAudit` | `false` | pre-marker होस्ट `ignorable` चिह्न छोड़ देते हैं; प्लगइन चेतावनी के साथ session-log ऑडिट बंद करता है। फिर चालू करने के लिए `true` |
|
|
228
|
+
| `network.enabled` | `true` | proxy, env injection, और web-tool mode defaults का मास्टर स्विच |
|
|
229
|
+
| `network.mode` | `auto` | नीति मोड: `auto` sandbox preset का अनुसरण करता है, या `deny-all` / `whitelist` / `allow-all` |
|
|
230
|
+
| `network.autoFallback` | `allow-all` | जब `auto` के पास sandbox-policy सेवा न हो तब प्रयुक्त मोड |
|
|
231
|
+
| `network.unlisted` | `ask` | whitelist मोड में बिना मेल वाले लक्ष्यों का व्यवहार: `ask` या `deny` |
|
|
232
|
+
| `network.proxyBind` | `127.0.0.1` | स्थानीय proxy bind पता (केवल loopback) |
|
|
233
|
+
| `network.proxyPort` | `0` | स्थानीय proxy port; `0` मुक्त ephemeral port चुनता है |
|
|
234
|
+
| `network.proxyMaxRecent` | `100` | settings पेज के लिए रखे हाल के block रिकॉर्ड की सीमा |
|
|
235
|
+
| `network.loopback` | `allow` | loopback लक्ष्य: `allow` (Codex समानता) या `policy` |
|
|
236
|
+
| `network.injectEnv` | `true` | सबप्रोसेस के लिए proxy env वेरिएबल इंजेक्ट हों या नहीं |
|
|
237
|
+
| `network.noProxy` | `clear` | सबप्रोसेस NO_PROXY व्यवहार: `clear` नीति लागू करता है या `preserve` |
|
|
238
|
+
| `network.upstreamProxy` | `off` | इस प्लगइन द्वारा **अनुमत** कनेक्शनों के लिए upstream proxy: `off` सीधे डायल, `inherit` launch environment के proxy नाम पुनः उपयोग, या स्पष्ट `http(s)://` proxy URL |
|
|
239
|
+
| `network.allowHostAction` | `true` | settings पेज की प्रति-ब्लॉक "इस होस्ट को अनुमति" क्रिया: `false` Allow बटन छिपाता है और `permissionRules/allowHost` RPC अस्वीकार कराता है (नियम एडिटर प्रभावित नहीं) |
|
|
240
|
+
| `builtin.enabled` | `true` | अंतर्निहित उच्च-जोखिम बेसलाइन: `false` शिप किया गया deny/ask सेट पूरी तरह बंद करता है |
|
|
241
|
+
| `builtin.path` | *(शिप किया गया)* | प्रतिस्थापन बेसलाइन फ़ाइल (absolute, या `process.cwd()` के सापेक्ष); माउंट पर सत्यापित |
|
|
242
|
+
|
|
243
|
+
</details>
|
|
244
|
+
|
|
245
|
+
## FAQ
|
|
246
|
+
|
|
247
|
+
<details>
|
|
248
|
+
<summary>नियम फ़ाइलें कहाँ रहती हैं? क्या प्लगइन मेरी फ़ाइलों में लिखेगा?</summary>
|
|
249
|
+
|
|
250
|
+
नियम डिस्क से पढ़े जाते हैं: प्रोजेक्ट रूट का `.dsh/rules.yaml`, या कॉन्फ़िगर किया गया `rulesFile` / `fallbackPath`, `searchUp` में ऊपर की ओर मिलाए जाते हैं। सामान्य adjudication पथ कोई नियम डेटा नहीं लिखता। लेखन की केवल दो सतहें हैं: settings पेज का नियम एडिटर और "Allow" क्रिया — बाद वाली ज्ञात नियम स्रोत के शीर्ष पर एक न्यूनतम allow नियम लिखती है और hand edit जैसी ही parse/compile जाँच से गुज़रती है (देखें "नेटवर्क नीति")।
|
|
251
|
+
|
|
252
|
+
</details>
|
|
253
|
+
|
|
254
|
+
<details>
|
|
255
|
+
<summary>dsh-auto-review माउंट न हो तो ask का क्या होता है?</summary>
|
|
256
|
+
|
|
257
|
+
`ask` आधिकारिक approval seam से जाता है: `dsh-auto-review` माउंट हो तो read-only दूसरा मॉडल उत्तर देता है; नहीं तो इंसान; दोनों न हों तो harness fail closed होता है और कॉल कभी चुपचाप अनुमत नहीं होती। यह प्लगइन स्वयं कभी subagents नहीं बनाता और मॉडल नहीं बुलाता — `ask` निर्णय देना उसके काम का अंत है।
|
|
258
|
+
|
|
259
|
+
</details>
|
|
260
|
+
|
|
261
|
+
<details>
|
|
262
|
+
<summary>क्या यह proxy होस्ट के अपने आउटबाउंड अनुरोधों को रोकता है?</summary>
|
|
263
|
+
|
|
264
|
+
नहीं। इंजेक्ट किया गया proxy environment **बनाए गए shell children** और अनुरोध के समय proxy नाम पढ़ने वाले किसी भी consumer को कवर करता है। यह होस्ट प्रोसेस के अपने `fetch`-आधारित ट्रैफ़िक को **नहीं** कवर करता: launcher पहले प्लगइन माउंट होने से पहले launch environment से undici का वैश्विक dispatcher स्थापित करता है, वह dispatcher environment से नहीं बल्कि अपनी नीति से रूट करता है। इसलिए provider endpoints को allow नियम की ज़रूरत **नहीं**, और `network.injectEnv: false` होस्ट प्रोसेस को किसी चीज़ से बाहर नहीं करता। 2026-09-10 को Node 22 पर मापा गया; `scripts/host-egress-probe.mjs` से दोहराएँ।
|
|
265
|
+
|
|
266
|
+
</details>
|
|
267
|
+
|
|
268
|
+
<details>
|
|
269
|
+
<summary>हॉट पथ पर प्रदर्शन लागत कितनी है?</summary>
|
|
270
|
+
|
|
271
|
+
नियम मूल्यांकन इन-मेमोरी first-match traversal है — कोई मॉडल कॉल नहीं, कोई नेटवर्क अनुरोध नहीं; हिट और passthrough केवल session audit जोड़ते हैं। विफल watch चेतावनी देकर पिछले नियम रखता है। बड़े नियम सेट के लिए `audit: hits` से passthrough छोड़ें, या `maxRules` / `maxCachedWorkspaces` से लोड सीमित करें।
|
|
272
|
+
|
|
273
|
+
</details>
|
|
274
|
+
|
|
275
|
+
<details>
|
|
276
|
+
<summary>क्या यह अन्य प्लगइनों से events, command नाम या slots पर टकराता है?</summary>
|
|
277
|
+
|
|
278
|
+
नहीं। टूल नाम namespaced हैं और कोई bare नाम नहीं लिया जाता; सेवा keys `permissionRules` / `permissionRulesRuntime` कोई अंतर्निहित seam नहीं हैं और किसी सर्वेक्षित high-star प्लगइन में नहीं मिलतीं; यह client slot या `webServer` prefix पंजीकृत नहीं करता, और इसका patch केवल अपनी पंक्ति `insert` करता है; साझा events सदा `next()` से प्रत्यायोजित होते हैं। बिंदु-दर-बिंदु तर्क "अन्य DSH प्लगइनों के साथ इंटरऑपरेबिलिटी" में है।
|
|
279
|
+
|
|
280
|
+
</details>
|
|
281
|
+
|
|
282
|
+
## सुरक्षा सीमाएँ
|
|
283
|
+
|
|
284
|
+
- **नीति, kernel नहीं।** `paths` उम्मीदवार केवल documented argument keys के सेट से आते हैं (किसी भी नेस्टिंग गहराई पर, गहराई-सीमित), और केवल workspace-सापेक्ष paths मेल खाते हैं।
|
|
285
|
+
- **यहाँ कोई समीक्षक नहीं।** प्लगइन कभी subagents नहीं बनाता और मॉडल नहीं बुलाता — `ask` निर्णय देना उसके काम का अंत है।
|
|
286
|
+
- **कोई sandbox परिवर्तन नहीं।** OS-स्तरीय sandbox नीति sandbox seam की है, इस प्लगइन की नहीं।
|
|
287
|
+
- **ज़ोर से गलत कॉन्फ़िगरेशन।** अज्ञात YAML फ़ील्ड, अज्ञात actions और खराब patterns लोड पर अस्वीकृत होते हैं।
|
|
288
|
+
- **Backtracking सीमाएँ।** Glob patterns `maxGlobStars` तक सीमित unbounded star expansions रखते हैं; regex-mode patterns nested unbounded quantifiers और quantified overlapping literal alternations अस्वीकार करते हैं।
|
|
289
|
+
- **Fail-closed डायलिंग।** सादे HTTP forwards और CONNECT tunnels केवल adjudicated पतों पर जुड़ते हैं; जिस allow के adjudication में कोई पता नहीं मिला वह नाम डायल करने के बजाय 502 के साथ fail closed होता है (issue #23)।
|
|
290
|
+
|
|
291
|
+
## अनुमतियाँ और डेटा
|
|
292
|
+
|
|
293
|
+
- **Permissions**: workshop manifest में `files:read`, `files:watch`, `files:write`, `session:append` और `network:outbound` घोषित करता है। `ask` निर्णय आधिकारिक approval seam से जाते हैं — कुछ भी पुनः लागू या bypass नहीं होता।
|
|
294
|
+
- **Data**: नियम फ़ाइलें डिस्क से पढ़ी जाती हैं; सामान्य adjudication कोई नियम डेटा नहीं लिखता — लेखन की केवल दो सतहें settings पेज का नियम एडिटर और "Allow" क्रिया हैं। कोई मॉडल कॉल नहीं, कोई समीक्षक subagent नहीं।
|
|
295
|
+
- **Session log**: `permissionRules/decision` कभी मॉडल संदर्भ में नहीं डाला जाता और envelope के `ignorable: true` चिह्न के साथ जोड़ा जाता है, ताकि कोई भी harness build लॉग लोड कर सके।
|
|
296
|
+
|
|
297
|
+
## ज्ञात सीमाएँ
|
|
298
|
+
|
|
299
|
+
- **pre-marker और अस्वीकारक होस्ट पर ऑडिट चिह्न।** `permissionRules/decision` `ignorable: true` के साथ जोड़ा जाता है; जिन होस्ट का `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` लाइन पढ़ते समय चिह्नित plugin events भी अस्वीकार करती है, और `0.1.3-alpha` व `0.1.5-alpha` लाइनें वही surface-only append signature रखती हैं (प्रकाशित `0.1.3-alpha.1`/`0.1.5-alpha.1` पैकेजों पर सत्यापित) — runtime पहले append से पहले इन सभी की पूर्व-जाँच करता है और एक-बार की चेतावनी के साथ session-log ऑडिट बंद करता है। पीढ़ी-पार migration भी चिह्नित audit rows अस्वीकार करती है: `0.1.3-alpha` का v1→v2 द्वार अज्ञात v1 events अस्वीकार करता है, और `0.1.5-alpha` का v2→v3 द्वार हर unclassified event अस्वीकार करता है (उसकी सूची प्रकाशित v2 शब्दावली पर फ़्रोज़न है), इसलिए 0.1.3 होस्ट के लॉग खोलने से पहले v1 rows और 0.1.5 होस्ट पर अपग्रेड से पहले v2 rows का `strip` करें। Native v3 logs चिह्नित plugin rows स्वीकार करते हैं, इसलिए उन्हें केवल `repair` चाहिए। फिर चालू करने के लिए `allowUnmarkedAudit: true`; पहले से लिखे logs `scripts/repair-session-logs.mjs` से ठीक करें (जहाँ चिह्न मदद नहीं कर सकता वहाँ उसका `strip` मोड audit rows हटाता है)।
|
|
300
|
+
- **Path उम्मीदवार heuristic हैं।** केवल documented argument keys path मिलान में जाते हैं, और workspace-सापेक्ष मिलान केवल `caseInsensitivePaths` चालू होने पर ASCII case अनदेखा करता है।
|
|
301
|
+
- **Globs रूढ़िवादी उपसमुच्चय हैं।** कोई brace expansion नहीं — दो patterns लिखें, या regex मोड उपयोग करें।
|
|
302
|
+
- **Regex backtracking guard संरचनात्मक है, नितांत नहीं।** अविश्वसनीय फ़ाइलों के लिए glob मोड पसंद करें।
|
|
303
|
+
- **होस्ट के अपने आउटबाउंड अनुरोध इस proxy से नहीं गुज़रते।** इंजेक्ट किया गया proxy environment **बनाए गए shell children** — जो injection का उद्देश्य है — और अनुरोध के समय proxy नाम पढ़ने वाले किसी भी consumer को कवर करता है। यह होस्ट प्रोसेस के अपने `fetch`-आधारित ट्रैफ़िक को **नहीं** कवर करता: launcher पहले प्लगइन माउंट होने से पहले **launch environment** से undici का वैश्विक dispatcher स्थापित करता है, वह dispatcher environment से नहीं बल्कि अपनी नीति से रूट करता है, और Node शुरुआत में proxy environment का नमूना लेता है — इसलिए बाद में माउंट होने वाला प्लगइन उसे redirect नहीं कर सकता। परिणाम: provider endpoints को allow नियम की ज़रूरत **नहीं**, और `network.injectEnv: false` होस्ट प्रोसेस को किसी चीज़ से बाहर नहीं करता। 2026-09-10 को Node 22 पर मापा गया; `scripts/host-egress-probe.mjs` से दोहराएँ।
|
|
304
|
+
- **Upstream chaining केवल उसी को कवर करती है जो इस proxy तक पहुँचता है।** `dsh-v0.1.7-alpha.1` और बाद में, harness की अपनी launch-time proxy नीति और उसका subprocess environment overlay इस प्लगइन द्वारा इंजेक्ट किए proxy नामों से ऊपर हो सकते हैं, इसलिए `network.upstreamProxy` बताता है कि इस proxy द्वारा संभाले गए कनेक्शनों का क्या होता है — यह होस्ट प्रोसेस के हर आउटबाउंड पथ के बारे में दावा नहीं है।
|
|
305
|
+
|
|
306
|
+
## अन्य DSH प्लगइनों के साथ इंटरऑपरेबिलिटी
|
|
307
|
+
|
|
308
|
+
**DSH `0.2.0-rc.2`** (यह README जिस runtime के लिए है) और 2026-10-05 को सर्वेक्षित high-star प्लगइन सेट के विरुद्ध सत्यापित।
|
|
309
|
+
|
|
310
|
+
यह प्लगइन अन्य प्लगइनों में **हस्तक्षेप नहीं** करता, उन व्यापक रूप से इंस्टॉल high-star प्लगइनों में भी नहीं:
|
|
311
|
+
|
|
312
|
+
- **कोई tool-name टकराव नहीं।** हर टूल namespaced है; किसी shipped टूल या अन्य प्लगइन का कोई bare नाम पंजीकृत नहीं होता।
|
|
313
|
+
- **कोई service-key टकराव नहीं।** यह `permissionRules`, `permissionRulesRuntime` देता है; वे keys अंतर्निहित seam नहीं हैं और किसी सर्वेक्षित high-star प्लगइन में नहीं हैं।
|
|
314
|
+
- **कोई slot टकराव नहीं।** यह कोई client slot key पंजीकृत नहीं करता, इसलिए `shadows-shipped-ui` सीट के लिए नहीं लड़ता।
|
|
315
|
+
- **कोई HTTP route टकराव नहीं।** यह कोई `webServer` prefix पंजीकृत नहीं करता।
|
|
316
|
+
- **कोई patch-परत टकराव नहीं।** Bundle patch केवल अपनी पंक्ति `insert` करता है; अंतर्निहित पंक्ति का `config` कभी ओवरराइड नहीं करता।
|
|
317
|
+
- **कोई वैश्विक परिवर्तन नहीं।** यह prototypes नहीं बदलता, `process.env` नहीं लिखता, वैश्विक fetch dispatcher नहीं बदलता।
|
|
318
|
+
|
|
319
|
+
**साझा event listeners रचना से ही अहस्तक्षेपी हैं।** यह क्रम-संवेदी events `tools/post-execute`, `tools/pre-execute` को `ctx.on()` से सुनता है — Cordis का broadcast पंजीकरण, जहाँ हर listener चलता है और कोई किसी को भूखा नहीं मार सकता। **यहाँ हर listener `next()` से प्रत्यायोजित करता है**, इसलिए श्रृंखला कभी short-circuit नहीं होती, और mutation `next()` के उत्पादित मान पर लागू होता है, उसके स्थान पर लौटाए गए मान पर नहीं:
|
|
320
|
+
|
|
321
|
+
- `tools/post-execute` — also used by `cc-safety-net` (1576★).
|
|
322
|
+
- `tools/pre-execute` — also used by `cc-safety-net` (1576★).
|
|
323
|
+
|
|
324
|
+
स्थिर साक्ष्य: इस रेपो पर `dsh-plugin-doctor` के K10–K13 हर जाँच में `pass` रिपोर्ट करते हैं।
|
|
325
|
+
|
|
326
|
+
## dsh-auto-review के साथ सहयोग
|
|
327
|
+
|
|
328
|
+
- `dsh-permission-rules` `ask` उत्पन्न करता है; `dsh-auto-review` `approval/request` waterfall पर read-only दूसरे मॉडल का निर्णय देता है (या इंसानों को सौंपता है)। पूरा closed loop पाने के लिए दोनों माउंट करें।
|
|
329
|
+
- एकीकरण-परीक्षित: `permissionRules/decision` → `approval/asked` → `autoReview/verdict` → `approval/decided`, समीक्षक को scripted mock से बदलकर।
|
|
330
|
+
- आधिकारिक harness की `never` approval नीति और हर fail-closed गारंटी अछूती रहती है।
|
|
331
|
+
|
|
332
|
+
## सत्र लॉग मरम्मत
|
|
333
|
+
|
|
334
|
+
`ignorable` चिह्न से पहले लिखे सत्र लॉग नए harness builds द्वारा अस्वीकृत हो सकते हैं (`SessionFormatUnsupportedError`)। शिप किया गया `scripts/repair-session-logs.mjs` केवल लक्षित audit rows को `ignorable: true` लेकर फिर से लिखता है, frame सुरक्षित और backups के साथ:
|
|
335
|
+
|
|
336
|
+
```sh
|
|
337
|
+
node scripts/repair-session-logs.mjs scan [--home DIR] # विदेशी rows रिपोर्ट करें, कुछ न बदलें
|
|
338
|
+
node scripts/repair-session-logs.mjs repair [--home DIR] [--dry-run]
|
|
339
|
+
node scripts/repair-session-logs.mjs strip [--home DIR] [--dry-run]
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
`--home` डिफ़ॉल्ट `$DSH_HOME/sessions` (या `~/.dsh/sessions`)। हर generation-addressed log अपने canonical basename से खोजा जाता है — `session.jsonl`, `session.v2.jsonl`, `session.v3.jsonl`, प्रत्येक वैकल्पिक रूप से `.zstd`-संपीड़ित — इसलिए generation के अनुसार मोड चुनें:
|
|
343
|
+
|
|
344
|
+
- **v3 (`session.v3.jsonl`, `0.1.5-alpha` लाइन द्वारा native रूप से लिखा)** — पढ़ने का पथ चिह्नित plugin rows स्वीकार करता है, इसलिए `repair` पर्याप्त है।
|
|
345
|
+
- **v2 (`session.v2.jsonl`, `0.1.3-alpha` लाइन द्वारा लिखा)** — `repair` इसे उस होस्ट पर खोलता है जिसने लिखा, लेकिन `0.1.5-alpha` की v2→v3 migration हर unclassified event अस्वीकार करती है, चिह्नित होने पर भी: `0.1.5-alpha` होस्ट पर अपग्रेड करने **से पहले** v2 logs पर `strip` चलाएँ।
|
|
346
|
+
- **v1 (`session.jsonl`)** — `0.1.3-alpha` की v1→v2 migration अज्ञात v1 events अस्वीकार करती है, चिह्नित होने पर भी: 0.1.3 या बाद के होस्ट द्वारा लॉग पहली बार खोलने से पहले `strip` चलाएँ।
|
|
347
|
+
|
|
348
|
+
## संगतता
|
|
349
|
+
|
|
350
|
+
| सतह | स्थिति |
|
|
351
|
+
|---|---|
|
|
352
|
+
| Harness | DeepSeek Harness `dsh-v0.2.1-alpha.1` (2026-09-22 को अनुकूलित, पूरी gate श्रृंखला): इसका plugin config live settings अनुबंध है — हर फ़ील्ड `.volatile()` घोषित है, Loader `apply` को प्रति फ़ील्ड live reference देता है, और सहेजा संपादन बिना plugin remount किए चल रहे references में commit होता है, सीमा-बाहर मान कुछ लिखने से पहले schema द्वारा अस्वीकृत। जिन होस्ट का Schemastery `volatile()` से पुराना है (3.18.3 से पहले) वे भी इस प्लगइन को माउंट और चला सकते हैं — फ़ील्ड साधारण मान रह जाते हैं और live config फ़ॉर्म अनुपलब्ध रहता है — क्योंकि चिह्न मान लिया नहीं, capability probe से लगाया जाता है। इस लाइन का `Session.append` अब भी `ignorable` चिह्न नहीं लगा सकता (उसका तीसरा argument surface-intent बैग है, और envelope फ़ील्ड केवल stored-log पढ़ने के लिए बचता है), इसलिए पूरी `0.2-alpha` लाइन पहले append से पहले unmarked मानी जाती है और session-log ऑडिट डिफ़ॉल्ट रूप से बंद रहता है — `append` केवल `sourceEventSeqs`/`surfaceOp` पढ़ता है और envelope फ़्रीज़ करता है, इसलिए चिह्न लगाने का कोई code path नहीं; पहले की `0.1.7-alpha` (2026-09-22 अनुकूलित), `0.1.5-rc.2` (2026-09-09 अनुकूलित) और `0.1.3-alpha` लाइनें वही surface-only append signature रखती हैं, और हर `0.2` prerelease उन्हीं के साथ वर्गीकृत है (STABLE `0.2.x` release append probe को छोड़ी जाती है, इसलिए बहाल चिह्न सतह बिना नए plugin release के अपनाई जाती है)। उन लाइनों की log migrations unclassified plugin events अस्वीकार करती हैं, चिह्नित होने पर भी, इसलिए `0.1.3-alpha` होस्ट के लॉग खोलने से पहले v1 audit rows और `0.1.5-alpha` होस्ट द्वारा migrate करने से पहले v2 audit rows का `strip` करें (native v3 logs को केवल `repair` चाहिए)। |
|
|
353
|
+
| Node | `^22.19.0 || >=24.9.0` |
|
|
354
|
+
| प्लेटफ़ॉर्म | सभी (host + web settings client) |
|
|
355
|
+
| मॉडल | कोई भी (deny/ask कारण tool results से दिखते हैं) |
|
|
356
|
+
|
|
357
|
+
## इकोसिस्टम और गुणवत्ता
|
|
358
|
+
|
|
359
|
+
- [Gitee मिरर](https://gitee.com/perrylink/dsh-permission-rules) (सिंक मिरर; GitHub आधिकारिक है)
|
|
360
|
+
- [dshfind प्लगइन पेज](https://dshfind.com/plugins/PerryLink/dsh-permission-rules) (इंस्टॉल और रैंकिंग)
|
|
361
|
+
- [OpenSSF Scorecard रिपोर्ट](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-permission-rules) ([.github/workflows/scorecard.yml](.github/workflows/scorecard.yml) द्वारा संचालित)
|
|
362
|
+
- [dsh-plugin-doctor सत्यापन रिपोर्ट](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章) (K10–K13 सभी `pass`)
|
|
363
|
+
- [DSH Market](https://dsh.market/) (सूचीबद्ध)
|
|
364
|
+
- **1024 स्टोर चैनल**: एक बार `npm i -g dsh1024`, फिर `dsh1024 plugin --profile web add dsh-permission-rules` ([deepseek1024.com](https://deepseek1024.com) इंस्टॉल रैंकिंग में गिना जाता है)
|
|
365
|
+
- [इकोसिस्टम ज्ञान-आधार](https://perrylink.github.io/dsh-plugin-guide/): मापा डेटा, मार्केटिंग नहीं: प्लगइन विकास गाइड · प्लगइन-चयन डेटा · रखरखाव मानदंड
|
|
366
|
+
|
|
367
|
+
## डेवलपमेंट
|
|
368
|
+
|
|
369
|
+
```sh
|
|
370
|
+
pnpm install # node ^22.19 || >=24.9
|
|
371
|
+
pnpm run typecheck # tsc, src + tests
|
|
372
|
+
pnpm run lint # eslint, src + tests + scripts
|
|
373
|
+
pnpm test # vitest: 24 spec files
|
|
374
|
+
pnpm run test:coverage # coverage gate (90/80/90/90)
|
|
375
|
+
pnpm run build # tsc declarations + tsdown bundles (lib/)
|
|
376
|
+
pnpm run pack:check # build + pack (the published artifact)
|
|
377
|
+
node scripts/check-readme-sync.mjs # पाँच-भाषा README सिंक द्वार (CI में भी)
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
हेडलेस end-to-end सत्यापन रिकॉर्ड [VERIFICATION.md](VERIFICATION.md) में देखें। README चित्र [`scripts/gen-readme-assets.py`](scripts/gen-readme-assets.py) से प्रोग्रामेटिक रूप से बनते हैं (Pillow 1440×576 के zh/en और light/dark hero बैनर बनाता है; 1100×660 की हस्तलिखित dual-channel SVG संरचना आकृति है) और दोबारा चलाना सुरक्षित है।
|
|
381
|
+
|
|
382
|
+
Topics: `dsh`, `dsh-plugin`, `deepseek-harness`, `permission`, `policy`, `allow-deny-ask`, `approval`, `safety`, `network`, `network-policy`, `proxy`
|
|
383
|
+
|
|
384
|
+
## परिवार और आभार
|
|
385
|
+
|
|
386
|
+
यह प्रोजेक्ट [PerryLink](https://github.com/PerryLink) के DeepSeek Harness प्लगइन परिवार का हिस्सा है (सभी Apache-2.0)। अगर यह उपयोगी लगे, तो **एक स्टार अगले व्यक्ति को इसे खोजने में मदद करता है** — इसके पीछे कुछ भी लॉक नहीं है।
|
|
387
|
+
|
|
388
|
+
- [@PerryLink](https://github.com/PerryLink) — निर्माता और अनुरक्षक: नियम शब्दावली और मूल्यांकन, runtime, HMR watch, session-log ऑडिट, नेटवर्क नीति + proxy, और पाँच-भाषा दस्तावेज़।
|
|
389
|
+
- [@am-i-dead](https://github.com/am-i-dead) — client-safe allow-host helpers को host-only मॉड्यूल से अलग किया (#24)।
|
|
390
|
+
- [@22xuan](https://github.com/22xuan) — rc.6 होस्ट द्वारा audit event का `ignorable` चिह्न चुपचाप छोड़े जाने की विस्तृत रिपोर्ट ([#2](https://github.com/PerryLink/dsh-permission-rules/issues/2)) और upstream harness चर्चा; v0.4.1 की runtime host-capability detection और दस्तावेज़ सुधार सीधे उसी विश्लेषण से आए।
|
|
391
|
+
- [@sjh9714](https://github.com/sjh9714) — साझा rule-syntax test-vector corpus प्रस्तावित किया ([#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-decomposition सीमा-मामले दिए।
|
|
392
|
+
- [@weipeng1999](https://github.com/weipeng1999) — AST-आधारित command-decomposition सुविधा प्रस्ताव ([#8](https://github.com/PerryLink/dsh-permission-rules/issues/8)), जिससे डिज़ाइन चर्चा बनी।
|
|
393
|
+
- [@alexchenzl](https://github.com/alexchenzl) — DSH Directory लिस्टिंग अनुरोध ([#7](https://github.com/PerryLink/dsh-permission-rules/issues/7))।
|
|
394
|
+
- [@zl190](https://github.com/zl190) — `0.1.0-rc.7` harness संगतता अंतराल की रिपोर्ट और सत्यापन ([PR #9](https://github.com/PerryLink/dsh-permission-rules/pulls/9))।
|
|
395
|
+
- [@cuohua](https://github.com/cuohua) — बताया कि version gate केवल `0.1.0` लाइन कवर करने पर भी `0.1.1-rc` लाइन `ignorable` चिह्न छोड़ती रही ([#11](https://github.com/PerryLink/dsh-permission-rules/issues/11)); चौड़ा किया गया gate सीधे उसी विश्लेषण से आया।
|
|
396
|
+
|
|
397
|
+
<details>
|
|
398
|
+
<summary>सभी प्लगइन विस्तृत करें</summary>
|
|
399
|
+
|
|
400
|
+
| प्लगइन | स्थिति |
|
|
401
|
+
|---|---|
|
|
402
|
+
| **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
|
|
403
|
+
| **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
|
|
404
|
+
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
|
|
405
|
+
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | 🧊 फ़्रोज़न — रेपो README देखें |
|
|
406
|
+
| **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
|
|
407
|
+
| **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
|
|
408
|
+
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | 🧊 फ़्रोज़न — रेपो README देखें |
|
|
409
|
+
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
|
|
410
|
+
| **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
|
|
411
|
+
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
|
|
412
|
+
| **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
|
|
413
|
+
| **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
|
|
414
|
+
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | 🧊 फ़्रोज़न — रेपो README देखें |
|
|
415
|
+
| **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
|
|
416
|
+
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
|
|
417
|
+
| **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
|
|
418
|
+
| **[dsh-eia-guide-check](https://github.com/PerryLink/dsh-eia-guide-check)** | |
|
|
419
|
+
| **[dsh-emergency-plan](https://github.com/PerryLink/dsh-emergency-plan)** | |
|
|
420
|
+
| **[dsh-essay-rubric-check](https://github.com/PerryLink/dsh-essay-rubric-check)** | |
|
|
421
|
+
| **[dsh-evidence-check](https://github.com/PerryLink/dsh-evidence-check)** | |
|
|
422
|
+
| **[dsh-export-ctl-check](https://github.com/PerryLink/dsh-export-ctl-check)** | |
|
|
423
|
+
| **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | |
|
|
424
|
+
| **[dsh-fmea-table-check](https://github.com/PerryLink/dsh-fmea-table-check)** | |
|
|
425
|
+
| **[dsh-forecast-penalty](https://github.com/PerryLink/dsh-forecast-penalty)** | |
|
|
426
|
+
| **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | |
|
|
427
|
+
| **[dsh-github](https://github.com/PerryLink/dsh-github)** | |
|
|
428
|
+
| **[dsh-gongwen-flow-check](https://github.com/PerryLink/dsh-gongwen-flow-check)** | |
|
|
429
|
+
| **[dsh-gongwen-word-check](https://github.com/PerryLink/dsh-gongwen-word-check)** | |
|
|
430
|
+
| **[dsh-guard-plan-qc](https://github.com/PerryLink/dsh-guard-plan-qc)** | |
|
|
431
|
+
| **[dsh-hazchem-check](https://github.com/PerryLink/dsh-hazchem-check)** | |
|
|
432
|
+
| **[dsh-hazplan-check](https://github.com/PerryLink/dsh-hazplan-check)** | |
|
|
433
|
+
| **[dsh-hidden-risk-map](https://github.com/PerryLink/dsh-hidden-risk-map)** | |
|
|
434
|
+
| **[dsh-hs-classify](https://github.com/PerryLink/dsh-hs-classify)** | |
|
|
435
|
+
| **[dsh-icd-rule-check](https://github.com/PerryLink/dsh-icd-rule-check)** | |
|
|
436
|
+
| **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | |
|
|
437
|
+
| **[dsh-lawcite-adapter](https://github.com/PerryLink/dsh-lawcite-adapter)** | |
|
|
438
|
+
| **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | |
|
|
439
|
+
| **[dsh-lc-doc-check](https://github.com/PerryLink/dsh-lc-doc-check)** | |
|
|
440
|
+
| **[dsh-learning-gap-check](https://github.com/PerryLink/dsh-learning-gap-check)** | |
|
|
441
|
+
| **[dsh-library](https://github.com/PerryLink/dsh-library)** | |
|
|
442
|
+
| **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | |
|
|
443
|
+
| **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | |
|
|
444
|
+
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
|
|
445
|
+
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
|
|
446
|
+
| **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
|
|
447
|
+
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | 🧊 फ़्रोज़न — रेपो README देखें |
|
|
448
|
+
| **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
|
|
449
|
+
| **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
|
|
450
|
+
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
|
|
451
|
+
| **[dsh-origin-rvc-check](https://github.com/PerryLink/dsh-origin-rvc-check)** | |
|
|
452
|
+
| **[dsh-ota-review-check](https://github.com/PerryLink/dsh-ota-review-check)** | |
|
|
453
|
+
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | |
|
|
454
|
+
| **[dsh-paper-doc-adapter](https://github.com/PerryLink/dsh-paper-doc-adapter)** | |
|
|
455
|
+
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | |
|
|
456
|
+
| **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
|
|
457
|
+
| **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
|
|
458
|
+
| **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
|
|
459
|
+
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | 🚫 रिटायर्ड (रेपो संग्रहीत) |
|
|
460
|
+
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | |
|
|
461
|
+
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | 🚫 रिटायर्ड (रेपो संग्रहीत) |
|
|
462
|
+
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | 🚫 रिटायर्ड (रेपो संग्रहीत) |
|
|
463
|
+
| **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
|
|
464
|
+
| **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
|
|
465
|
+
| **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
|
|
466
|
+
| **[dsh-ppap-check](https://github.com/PerryLink/dsh-ppap-check)** | |
|
|
467
|
+
| **[dsh-protest-deadline](https://github.com/PerryLink/dsh-protest-deadline)** | |
|
|
468
|
+
| **[dsh-railway-window](https://github.com/PerryLink/dsh-railway-window)** | |
|
|
469
|
+
| **[dsh-repair-order-qc](https://github.com/PerryLink/dsh-repair-order-qc)** | |
|
|
470
|
+
| **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | |
|
|
471
|
+
| **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
|
|
472
|
+
| **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
|
|
473
|
+
| **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
|
|
474
|
+
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | 🧊 फ़्रोज़न — रेपो README देखें |
|
|
475
|
+
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
|
|
476
|
+
| **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
|
|
477
|
+
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
|
|
478
|
+
| **[dsh-soe-decision-check](https://github.com/PerryLink/dsh-soe-decision-check)** | |
|
|
479
|
+
| **[dsh-soilwater-check](https://github.com/PerryLink/dsh-soilwater-check)** | |
|
|
480
|
+
| **[dsh-sop-sync-check](https://github.com/PerryLink/dsh-sop-sync-check)** | |
|
|
481
|
+
| **[dsh-spc-gbt-adapter](https://github.com/PerryLink/dsh-spc-gbt-adapter)** | |
|
|
482
|
+
| **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | |
|
|
483
|
+
| **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
|
|
484
|
+
| **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
|
|
485
|
+
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
|
|
486
|
+
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | 🚫 रिटायर्ड (रेपो संग्रहीत) |
|
|
487
|
+
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
|
|
488
|
+
| **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** | |
|
|
489
|
+
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 फ़्रोज़न — रेपो README देखें |
|
|
490
|
+
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 फ़्रोज़न — रेपो README देखें |
|
|
491
|
+
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 फ़्रोज़न — रेपो README देखें |
|
|
492
|
+
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 फ़्रोज़न — रेपो README देखें |
|
|
493
|
+
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 फ़्रोज़न — रेपो README देखें |
|
|
494
|
+
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 रिटायर्ड (रेपो संग्रहीत) |
|
|
495
|
+
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 रिटायर्ड (रेपो संग्रहीत) |
|
|
496
|
+
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 रिटायर्ड (रेपो संग्रहीत) |
|
|
497
|
+
|
|
498
|
+
</details>
|
|
499
|
+
|
|
500
|
+
## लाइसेंस
|
|
501
|
+
|
|
502
|
+
[LICENSE](LICENSE) (Apache License 2.0) © 2026 dsh-permission-rules contributors
|
|
503
|
+
|
|
504
|
+
<p align="center"><sub>Apache-2.0 · सामुदायिक प्लगइन, DeepSeek से असंबद्ध।</sub></p>
|