# ЁЯЫбя╕П dsh-permission-rules
**DeepSeek Harness рдХреЗ рд▓рд┐рдП Claude Code-рд╢реИрд▓реА рдХреА рдШреЛрд╖рдгрд╛рддреНрдордХ рдЕрдиреБрдорддрд┐ рдирд┐рдпрдоред**
*рдирд┐рдпрдо рдЬреНрдЮрд╛рдд рдХреЛ рддрдп рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╕рдореАрдХреНрд╖рдХ рдореЙрдбрд▓ рдЕрдЬреНрдЮрд╛рдд рдХреЛ рддрдп рдХрд░рддрд╛ рд╣реИред*
[](LICENSE)
[](https://github.com/topics/dsh-plugin)
[](#)
[](https://github.com/PerryLink/dsh-permission-rules/actions)
[](https://github.com/PerryLink/dsh-permission-rules/releases)
[](https://www.npmjs.com/package/dsh-permission-rules)
[](https://www.npmjs.com/package/dsh-permission-rules)
[English](README.md) ┬╖ [чоАф╜Уф╕нцЦЗ](README.zh.md) ┬╖ [Espa├▒ol](README.es.md) ┬╖ [Portugu├кs](README.pt.md) ┬╖ [рд╣рд┐рдиреНрджреА](README.hi.md)
---
## Compatibility
| Surface | Status |
|---|---|
| Harness | DeepSeek Harness `0.1.0-rc.5`тАУ`0.1.0-rc.6` |
| Node | `^22.19.0 || >=24.0.0` |
| Platforms | рд╕рднреА (host + рд╡реЗрдм settings рдХреНрд▓рд╛рдЗрдВрдЯ) |
| Model | рдХреЛрдИ рднреА (deny/ask рдХрд╛рд░рдг рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ) |
## What you get
`dsh-permission-rules` `tools/pre-execute` рд╡реЙрдЯрд░рдлрд╝реЙрд▓ рдкрд░ рд╣рд░ рдЯреВрд▓ рдХреЙрд▓ рдХреЗ рдЖрдЧреЗ рдПрдХ рдХреНрд░рдордмрджреНрдз **`allow` / `deny` / `ask`** рдирд┐рдпрдо рд╕реВрдЪреА рд░рдЦрддрд╛ рд╣реИ тАФ рдирд┐рдпрддрд╛рддреНрдордХ, рддрддреНрдХрд╛рд▓, рд▓реЗрдЦрд╛-рдкрд░реАрдХреНрд╖рдг-рдпреЛрдЧреНрдп рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рджреЗ YAML рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ:
- **`deny`** рдХреЙрд▓ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ; рдирд┐рдпрдо рдХрд╛ `reason` рдореЙрдбрд▓-рджреГрд╢реНрдп рддреНрд░реБрдЯрд┐ рдмрди рдЬрд╛рддрд╛ рд╣реИред
- **`ask`** рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЕрдиреБрдореЛрджрди рд╕реАрдо рдкрд░ рдЪрд▓рддрд╛ рд╣реИ (рджреНрд╡рд┐рддреАрдп-рдореЙрдбрд▓ answerer рдХреЗ рд▓рд┐рдП `dsh-auto-review` рдорд╛рдЙрдВрдЯ рдХрд░реЗрдВ, рдпрд╛ рдорд╛рдирд╡ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ; рджреЛрдиреЛрдВ рди рд╣реЛрдиреЗ рдкрд░ harness рдмрдВрдж-рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИ)ред
- **`allow`** (рдФрд░ рдХреЛрдИ-рдорд┐рд▓рд╛рди-рдирд╣реАрдВ) рд╕рдЦреНрддреА рд╕реЗ `next()` рд╕реЗ рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ тАФ рдмрд╛рдж рдХреЗ listeners рдХрднреА рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗред
рд╣рд░ рд╣рд┐рдЯ **рдФрд░** рд╣рд░ рдкрд╛рд╕-рдереНрд░реВ `permissionRules/decision` рд╕рддреНрд░ рдШрдЯрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рд╣реЛрддрд╛ рд╣реИ (рдХреЗрд╡рд▓-рд▓реЙрдЧ тАФ рдореЙрдбрд▓ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреБрдЫ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛)ред
- **рд╕рдореГрджреНрдз рдорд┐рд▓рд╛рди** тАФ рдЯреВрд▓-рдирд╛рдо globs (рдЬрд┐рдирдореЗрдВ `mcp__*` рд╢рд╛рдорд┐рд▓), рдПрдЬреЗрдВрдЯ-рдкрд╣рдЪрд╛рди рдЪрдпрдирдХрд░реНрддрд╛ (`main` / `subagent` / `preset:*`), рддрд░реНрдХ рдХреБрдВрдЬреА/рдорд╛рди globs **рдпрд╛** regex (рдЬрд┐рдирдореЗрдВ `!pattern` рдирд┐рд╖реЗрдз рдФрд░ `absent` рдХреБрдВрдЬреА рдЖрдпрд╛рдо), **рдХрд┐рд╕реА рднреА рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдЧрд╣рд░рд╛рдИ** рдкрд░ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░-рд╕рд╛рдкреЗрдХреНрд╖ рдкрде globs, рдФрд░ `when` рд╣реЛрд╕реНрдЯ рд╢рд░реНрддреЗрдВ (env рдЪрд░, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо)ред
- **рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдирд┐рдпрдо рдлрд╝рд╛рдЗрд▓реЗрдВ** тАФ рд╡реИрдХрд▓реНрдкрд┐рдХ `searchUp` рд╕рддреНрд░ cwd рд╕реЗ рдлрд╝рд╛рдЗрд▓-рд╕рд┐рд╕реНрдЯрдо рд░реВрдЯ рддрдХ рд╣рд░ `.dsh/rules.yaml` рдХреЛ рдорд░реНрдЬ рдХрд░рддрд╛ рд╣реИ, рдирд┐рдХрдЯрддрдо рдкрд╣рд▓реЗред
- **dry-run рд░реЛрд▓рдЖрдЙрдЯ** тАФ `enforce: false` рдСрдбрд┐рдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдиреАрддрд┐ *рдХреНрдпрд╛* рдХрд░рддреА, рд╣рд░ рдХреЙрд▓ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реБрдПред
- **рд╣реЙрдЯ рд░реАрд▓реЛрдб** тАФ debounce рд╕рд╣рд┐рдд Chokidar рдирд┐рдЧрд░рд╛рдиреА; рдЯреВрдЯрд╛ рд╕рдВрдкрд╛рджрди рдкрд┐рдЫрд▓реЗ рдирд┐рдпрдо рд░рдЦрддрд╛ рд╣реИ, рдХрднреА рдХреНрд░реИрд╢ рдирд╣реАрдВред
- **рдЬрд╝реЛрд░ рд╕реЗ рд╡рд┐рдлрд▓** тАФ рдЕрдорд╛рдиреНрдп YAML, рдЕрдЬреНрдЮрд╛рдд action/рдлрд╝реАрд▓реНрдб, рдЦрд╝рд░рд╛рдм globs/regex, рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ-рдкреНрд░рд╡рдг рдкреИрдЯрд░реНрди рдпрд╛ `maxRules` рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдпрдо рд▓реЛрдб рдХреЛ рд╡рд┐рдлрд▓ рдХрд░рддреЗ рд╣реИрдВред
## Rule syntax
```yaml
# /.dsh/rules.yaml
rules:
- match: { tools: [bash, pwsh], params: { command: "git push*" }, paths: ["**/secrets/**"] }
action: deny
reason: "No pushes from protected paths"
- match: { tools: [edit, write] }
action: ask
reason: "File writes need confirmation"
```
- **рдорд┐рд▓рд╛рди рдЖрдпрд╛рдо** тАФ `tools` (globs, incl. `mcp__*`), `agents` (`main` / `subagent` / `preset:`; рдЕрдЬреНрдЮрд╛рдд рдкрд╣рдЪрд╛рди рдХрднреА рдорд┐рд▓рд╛рди рдирд╣реАрдВ рдХрд░рддреА тАФ рдмрдВрдж-рд╡рд┐рдлрд▓), `params` (рдХреБрдВрдЬреА/рдорд╛рди globs рдпрд╛ regex, `!pattern` рдирд┐рд╖реЗрдз, `absent` рдХреБрдВрдЬреА рдЖрдпрд╛рдо), `paths` (рдХрд┐рд╕реА рднреА рдЧрд╣рд░рд╛рдИ рдкрд░ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░-рд╕рд╛рдкреЗрдХреНрд╖ globs), `when` (`env` рдЪрд░ globs/regex + рдмрдВрдж `platform` рд╕реВрдЪреА), рдФрд░ `network` (`domains` / `ips` / `ports` / `schemes` тАФ globs, рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб, CIDR, рдкреЛрд░реНрдЯ рд╢реНрд░реЗрдгрд┐рдпрд╛рдБ)ред
- **рдХреНрд░рд┐рдпрд╛рдПрдБ** тАФ `allow` / `deny` / `ask`, рдлрд╝рд╛рдЗрд▓ рдХреНрд░рдо рдореЗрдВ рдореВрд▓реНрдпрд╛рдВрдХрд┐рдд, рдкрд╣рд▓рд╛ рдорд┐рд▓рд╛рди рдЬреАрддрддрд╛ рд╣реИред
- **рдирд┐рдпрдо рдореЗрдЯрд╛рдбреЗрдЯрд╛** тАФ `enabled: false` (рджреГрд╢реНрдп рдкрд░рдВрддреБ рдирд┐рд╖реНрдХреНрд░рд┐рдп), `description`, `tags`; рдЕрдЬреНрдЮрд╛рдд рдлрд╝реАрд▓реНрдб рд▓реЛрдб рд╡рд┐рдлрд▓ рдХрд░рддреЗ рд╣реИрдВред
- **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) рдореЗрдВред
## Network policy
Codex-рд╢реИрд▓реА рдХреА **рдкреНрд░рдХреНрд░рд┐рдпрд╛-рд╕реНрддрд░реАрдп рдиреЗрдЯрд╡рд░реНрдХ рдиреАрддрд┐**: shell рдЙрдк-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдерд╛рдиреАрдп **HTTP/CONNECT рдкреНрд░реЙрдХреНрд╕реА** рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд╝рд░рддрд╛ рд╣реИ, рдФрд░ рд╣рд░ рдХрдиреЗрдХреНрд╢рди рдХреНрд░рдордмрджреНрдз рдиреЗрдЯрд╡рд░реНрдХ рдирд┐рдпрдореЛрдВ рдпрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ sandbox presets рдкрд░ рдореИрдк рдХрд┐рдП рдЧрдП рддреАрди рдореЛрдб рд╕реЗ рддрдп рд╣реЛрддрд╛ рд╣реИ:
- **`deny-all`** тАФ рдХреЗрд╡рд▓-рдкрдарди sandbox preset: рд╕рднреА рдЖрдЙрдЯрдмрд╛рдЙрдВрдб рд░реЛрдХреЗрдВред
- **`whitelist`** тАФ workspace-write preset: рд╕реВрдЪреАрдмрджреНрдз рд▓рдХреНрд╖реНрдп рдЕрдиреБрдордд, рд╢реЗрд╖ рдХреЗ рд▓рд┐рдП `unlisted: ask` (рдпрд╛ `deny`)ред
- **`allow-all`** тАФ danger-full-access preset: рд╕рдм рдХреБрдЫ рдЕрдиреБрдорддред
- **`auto`** (рдбрд┐рдлрд╝реЙрд▓реНрдЯ) тАФ sandbox preset рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ; рдмрд┐рдирд╛ sandbox-рдиреАрддрд┐ рд╕реЗрд╡рд╛ рд╡рд╛рд▓реЗ hosts рдкрд░ `autoFallback` (`allow-all`) рдореЗрдВ рд╣рд▓ рд╣реЛрддрд╛ рд╣реИред
- **рдорд┐рд▓рд╛рди** тАФ `match.network` `domains` / `ips` / `ports` / `schemes` рдХреЗ рд╕рд╛рде (globs, рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб, CIDR, рдкреЛрд░реНрдЯ рд╢реНрд░реЗрдгрд┐рдпрд╛рдБ; рд╕рдВрдЦреНрдпрд╛рддреНрдордХ YAML рдкреЛрд░реНрдЯ рд╕реНрд╡реАрдХреГрдд)ред `tools/pre-execute` рд╣реЙрдЯ рдкрде рдкрд░ URL-рдЙрдореНрдореАрджрд╡рд╛рд░ рдирд┐рд╖реНрдХрд░реНрд╖рдг рд╡реЗрдм-рдЯреВрд▓ рддрд░реНрдХреЛрдВ рдФрд░ bash/pwsh рдХрдорд╛рдВрдб рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб URLs рдкрд░ рдЪрд▓рддрд╛ рд╣реИ; рд▓реВрдкрдмреИрдХ рд▓рдХреНрд╖реНрдп `loopback` рдиреАрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд┐рдпрдореЛрдВ рдХреЛ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- **рдСрдбрд┐рдЯ** тАФ рдЕрд╕реНрд╡реАрдХреГрдд рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡рд╛рдореА рд╕рддреНрд░ рдореЗрдВ `permissionRules/network` рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рд╡рд╣реА рдЕрдиреБрдХреВрд▓реА `ignorable` рджреНрд╡рд╛рд░), `/rules network` рдФрд░ settings рдкреГрд╖реНрда рдореЗрдВ рдмреНрд▓реЙрдХ рдХрд╛рдЙрдВрдЯрд░ рд╡ рд╣рд╛рд▓ рдХреА рдЕрд╡рд░реЛрдзрди рдХреЗ рд╕рд╛рдеред
## Quick start
```sh
# 1. install the bundle into your profile
dsh plugin --profile web add "github:PerryLink/dsh-permission-rules#main"
# or from npm (published releases)
dsh plugin --profile web add dsh-permission-rules
# 2. restart and verify the row
dsh --profile web --dump-config | grep -A4 'id: permission-rules'
```
## Install & uninstall
- **git рдЪреИрдирд▓** (рдирд╡реАрдирддрдо `main`): `dsh plugin --profile web add "github:PerryLink/dsh-permission-rules#main"` тАФ `prepare` рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╡рд▓ рдЙрддреНрдкрд╛рджрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рд╕реЗ рдмрдирд╛рддреА рд╣реИред
- **npm рдЪреИрдирд▓** (рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд▓реАрдЬрд╝): `dsh plugin --profile web add dsh-permission-rules`.
- **tarball рдЪреИрдирд▓**: рдЗрд╕ рд░реЗрдкреЛ рдореЗрдВ `pnpm pack`, рдлрд┐рд░ `dsh plugin --profile web add ./dsh-permission-rules-.tgz`.
- **uninstall**: `dsh plugin --profile web remove dsh-permission-rules`.
## Configuration
рд╕рднреА рдЯреНрдпреВрдиреЗрдмрд▓ Schemastery `Config` рдлрд╝реАрд▓реНрдб рд╣реИрдВ (cordis.yml рд╕реЗ рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред id-рд▓рдХреНрд╖рд┐рдд рдУрд╡рд░рд░рд╛рдЗрдб рдкреВрд░реА рдкрдВрдХреНрддрд┐ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ тАФ рд╣рд░ рдЖрд╡рд╢реНрдпрдХ рдХреБрдВрдЬреА рдлрд┐рд░ рд╕реЗ рдмрддрд╛рдПрдБред
| Key | Default | Meaning |
|---|---|---|
| `rulesFile` | `.dsh/rules.yaml` | рдирд┐рдпрдо рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд╛рди; рд╕рд╛рдкреЗрдХреНрд╖ = рдХреЙрд▓рд┐рдВрдЧ рд╕рддреНрд░ cwd рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣рд▓, рдирд┐рд░рдкреЗрдХреНрд╖ = рд╡реИрд╢реНрд╡рд┐рдХ рдФрд░ рдорд╛рдЙрдВрдЯ рдкрд░ рдорд╛рдиреНрдп |
| `fallbackPath` | *(none)* | рдкреНрд░рддрд┐-cwd рдЦреЛрдЬ рдореЗрдВ рдХреБрдЫ рди рдорд┐рд▓рдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдирд┐рдпрдо рдлрд╝рд╛рдЗрд▓; рдорд╛рдЙрдВрдЯ рдкрд░ рдорд╛рдиреНрдп |
| `badFilePolicy` | `fail` | рдЦрд╝рд░рд╛рдм рдирд┐рдпрдо рдлрд╝рд╛рдЗрд▓: `fail` рд▓рдВрдмрд┐рдд рдЯреВрд▓ рдХреЙрд▓ рдХреЛ рдЬрд╝реЛрд░ рд╕реЗ рд╡рд┐рдлрд▓ рдХрд░рддрд╛ рд╣реИ; `ignore-with-warning` рдЪреЗрддрд╛рд╡рдиреА рджреЗрдХрд░ рдЦрд╛рд▓реА рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ |
| `maxRules` | `256` | рдкреНрд░рднрд╛рд╡реА рд╕реНрд░реЛрдд рд╢реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ рдХреА рдХрдареЛрд░ рд╕реАрдорд╛ |
| `maxCachedWorkspaces` | `512` | рдХреИрд╢ рдХрд┐рдП рдЧрдП рдкреНрд░рддрд┐-рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдирд┐рдпрдо рд▓реЛрдб рдХреА рдХрдареЛрд░ рд╕реАрдорд╛ (LRU рдирд┐рд╖реНрдХрд╛рд╕рди) |
| `patternMode` | `glob` | `params`/`paths`/`when.env` рдкреИрдЯрд░реНрди рд╕реНрд╡рд╛рдж: `glob` рдпрд╛ `regex` (рдЯреВрд▓ рдирд╛рдо рд╣рдореЗрд╢рд╛ globs) |
| `watch` | `true` | Chokidar рдирд┐рдЧрд░рд╛рдиреА + рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рд░реАрд▓реЛрдб |
| `watchStabilityThresholdMs` | `200` | рд░реАрд▓реЛрдб debounce рд╡рд┐рдВрдбреЛ (ms) |
| `language` | `en` | `/rules` рдЖрдЙрдЯрдкреБрдЯ рднрд╛рд╖рд╛: `en`, `zh`, `es`, `pt`, `hi` |
| `caseInsensitivePaths` | *(win32)* | `paths` рдкреИрдЯрд░реНрди рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░-рд░реВрдЯ рддреБрд▓рдирд╛ ASCII рдХреЗрд╕ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ; Windows рдкрд░ `true` |
| `audit` | `all` | рдСрдбрд┐рдЯ рджрд╛рдиреЗрджрд╛рд░реА: `all` рд╣рд░ рд╣рд┐рдЯ рдФрд░ рдкрд╛рд╕-рдереНрд░реВ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ; `hits` рдкрд╛рд╕-рдереНрд░реВ рдШрдЯрдирд╛рдПрдБ рдЫреЛрдбрд╝рддрд╛ рд╣реИ |
| `searchUp` | `false` | рд╕рддреНрд░ cwd рд╕реЗ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЪрд▓рдХрд░ рд╣рд░ рдорд┐рд▓реА рдирд┐рдпрдо рдлрд╝рд╛рдЗрд▓ рдорд░реНрдЬ рдХрд░реЗрдВ, рдирд┐рдХрдЯрддрдо рдкрд╣рд▓реЗ |
| `maxGlobStars` | `2` | рдкреНрд░рддрд┐ glob рдкреИрдЯрд░реНрди рдЕрд╕реАрдорд┐рдд `*`/`**` рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╝рд╛рдпрд░ рдХреА рдХрдареЛрд░ рд╕реАрдорд╛ |
| `enforce` | `true` | `false` = dry-run рдореЛрдб: deny/ask рд╣рд┐рдЯ `dryRun` рдорд╛рд░реНрдХрд░ рд╕реЗ рд▓реЙрдЧ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рдХреЙрд▓ рдкрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ |
| `allowUnmarkedAudit` | `false` | рдкреВрд░реНрд╡-рдорд╛рд░реНрдХрд░ hosts `ignorable` рдорд╛рд░реНрдХрд░ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ; рдкреНрд▓рдЧрдЗрди рдПрдХ рдмрд╛рд░ рдХреА рдЪреЗрддрд╛рд╡рдиреА рд╕реЗ рд╕рддреНрд░-рд▓реЙрдЧ рдСрдбрд┐рдЯ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдкреБрдирдГ рд╕рдХреНрд╖рдо рдХреЗ рд▓рд┐рдП `true` |
| `network.enabled` | `true` | рдкреНрд░реЙрдХреНрд╕реА, env рдЗрдВрдЬреЗрдХреНрд╢рди рдФрд░ рд╡реЗрдм-рдЯреВрд▓ рдореЛрдб рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдореБрдЦреНрдп рд╕реНрд╡рд┐рдЪ |
| `network.mode` | `auto` | рдиреАрддрд┐ рдореЛрдб: `auto` sandbox preset рдХрд╛ рдЕрдиреБрд╕рд░рдг, рдпрд╛ `deny-all` / `whitelist` / `allow-all` |
| `network.autoFallback` | `allow-all` | `auto` рдХреЗ рдкрд╛рд╕ sandbox-рдиреАрддрд┐ рд╕реЗрд╡рд╛ рди рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдореЛрдб |
| `network.unlisted` | `ask` | рд╢реНрд╡реЗрддрд╕реВрдЪреА рдореЛрдб рдореЗрдВ рдмрд┐рдирд╛ рдирд┐рдпрдо рдорд┐рд▓рд╛рди рд╡рд╛рд▓реЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░: `ask` рдпрд╛ `deny` |
| `network.proxyBind` | `127.0.0.1` | рд╕реНрдерд╛рдиреАрдп рдкреНрд░реЙрдХреНрд╕реА рдмрд╛рдЗрдВрдб рдкрддрд╛ (рдХреЗрд╡рд▓ рд▓реВрдкрдмреИрдХ) |
| `network.proxyPort` | `0` | рд╕реНрдерд╛рдиреАрдп рдкреНрд░реЙрдХреНрд╕реА рдкреЛрд░реНрдЯ; `0` рдПрдХ рдореБрдХреНрдд рдХреНрд╖рдгрд┐рдХ рдкреЛрд░реНрдЯ рдЪреБрдирддрд╛ рд╣реИ |
| `network.proxyMaxRecent` | `100` | settings рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рд░рдЦреЗ рд╣рд╛рд▓ рдХреЗ рдмреНрд▓реЙрдХ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕реАрдорд╛ |
| `network.loopback` | `allow` | рд▓реВрдкрдмреИрдХ рд▓рдХреНрд╖реНрдп: `allow` (Codex рд╕рдорддрд╛) рдпрд╛ `policy` |
| `network.injectEnv` | `true` | рдХреНрдпрд╛ рдЙрдк-рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдЗрдВрдЬреЗрдХреНрдЯ рд╣реЛрдВ |
| `network.noProxy` | `clear` | рдЙрдк-рдкреНрд░рдХреНрд░рд┐рдпрд╛ NO_PROXY рд╡реНрдпрд╡рд╣рд╛рд░: `clear` рдиреАрддрд┐ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ `preserve` |
## Tools & surfaces
| Surface | Kind | Notes |
|---|---|---|
| `tools/pre-execute` | listener | рдкрд╣рд▓реЗ-рдорд┐рд▓рд╛рди allow/deny/ask рдирд┐рдпрдо + рдиреЗрдЯрд╡рд░реНрдХ URL-рдЙрдореНрдореАрджрд╡рд╛рд░ рдирд┐рд╖реНрдХрд░реНрд╖рдг |
| `/rules` | command | `list` ┬╖ `reload` ┬╖ `decisions [n]` ┬╖ `test ` |
| `permissionRules/decision` | event | рд╣рд░ рд╣рд┐рдЯ рдФрд░ рдкрд╛рд╕-рдереНрд░реВ рдХреА рдХреЗрд╡рд▓-рд▓реЙрдЧ рдСрдбрд┐рдЯ |
| `permissionRules/network` | event | рдЕрд╡рд░реБрджреНрдз рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рдкреНрд░реЙрдХреНрд╕реА-рдкрд░рдд рдСрдбрд┐рдЯ |
| HTTP/CONNECT proxy | service | shell рдЙрдк-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдерд╛рдиреАрдп рдкреНрд░реЙрдХреНрд╕реА |
| settings page | client | рдиреЗрдЯрд╡рд░реНрдХ-рдореЛрдб рд╕рдВрдкрд╛рджрдХ, рдирд┐рдпрдо рд╕рдВрдкрд╛рджрдХ, рдмреНрд▓реЙрдХ рдХрд╛рдЙрдВрдЯрд░, рд╣рд╛рд▓ рдХреА рдЕрд╡рд░реЛрдзрди |
```
/rules list the active rules, their source files, and any last-reload error
/rules list explicit alias for the bare listing
/rules reload re-read the rule-file chain for this workspace
/rules decisions [n] show the last n permission decisions of this session (default 10)
/rules test dry-evaluate the rules against a hypothetical call
```
`/rules test` рдЕрдЧреНрд░рдгреА рдлрд╝реНрд▓реИрдЧ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ: `--cwd `, `--env KEY=VALUE` (рджреЛрд╣рд░рд╛рдиреЗ-рдпреЛрдЧреНрдп), `--agent ` (рджреЛрд╣рд░рд╛рдиреЗ-рдпреЛрдЧреНрдп) рдФрд░ `--platform `ред рдмрд╣реБ-рдлрд╝рд╛рдЗрд▓ рд╢реГрдВрдЦрд▓рд╛рдУрдВ (рдЬреИрд╕реЗ `searchUp`) рдореЗрдВ рд╣рд░ рд╕реВрдЪреАрдмрджреНрдз рдирд┐рдпрдо рдкрдВрдХреНрддрд┐ рдЕрдкрдиреА рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдВрдмрджреНрдз рд╣реЛрддреА рд╣реИред
## Permissions & data
- **Permissions**: workshop рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ `files:read`, `files:watch`, `files:write`, `session:append` рдФрд░ `network:outbound` рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред `ask` рдирд┐рд░реНрдгрдп рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЕрдиреБрдореЛрджрди рд╕реАрдо рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ тАФ рдХреБрдЫ рднреА рдкреБрдирдГ-рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдпрд╛ рдЯрд╛рд▓рд╛ рдирд╣реАрдВ рдЧрдпрд╛ред
- **Data**: рдирд┐рдпрдо рдлрд╝рд╛рдЗрд▓реЗрдВ рдбрд┐рд╕реНрдХ рд╕реЗ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИрдВ; рдХреЛрдИ рдирд┐рдпрдо рдбреЗрдЯрд╛ рд▓рд┐рдЦрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ред рдХреЛрдИ рдореЙрдбрд▓ рдХреЙрд▓ рдирд╣реАрдВ, рдХреЛрдИ рд╕рдореАрдХреНрд╖рдХ рдЙрдк-рдПрдЬреЗрдВрдЯ рдирд╣реАрдВред
- **Session log**: `permissionRules/decision` рдХрднреА рдореЙрдбрд▓ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рдФрд░ рд▓рд┐рдлрд╝рд╛рдлрд╝реЗ рдХреЗ `ignorable: true` рдорд╛рд░реНрдХрд░ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рднреА harness рдмрд┐рд▓реНрдб рд▓реЙрдЧ рд▓реЛрдб рдХрд░ рд╕рдХреЗред
## Security boundaries
- **рдиреАрддрд┐, рдХрд░реНрдиреЗрд▓ рдирд╣реАрдВред** `paths` рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗрд╡рд▓ рддрд░реНрдХ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рд┐рдд рд╕рдореВрд╣ рд╕реЗ рдЖрддреЗ рд╣реИрдВ (рдХрд┐рд╕реА рднреА рдЧрд╣рд░рд╛рдИ рдкрд░, рдЧрд╣рд░рд╛рдИ-рд╕реАрдорд┐рдд), рдФрд░ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░-рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдорд┐рд▓рд╛рди рдХрд░рддреЗ рд╣реИрдВред
- **рдпрд╣рд╛рдБ рдХреЛрдИ рд╕рдореАрдХреНрд╖рдХ рдирд╣реАрдВред** рдкреНрд▓рдЧрдЗрди рдХрднреА рдЙрдк-рдПрдЬреЗрдВрдЯ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рдпрд╛ рдореЙрдбрд▓ рдирд╣реАрдВ рдмреБрд▓рд╛рддрд╛ тАФ `ask` рдирд┐рд░реНрдгрдп рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реА рдЗрд╕рдХреЗ рдХрд╛рдо рдХрд╛ рдЕрдВрдд рд╣реИред
- **рдХреЛрдИ sandbox рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВред** OS-рд╕реНрддрд░реАрдп sandbox рдиреАрддрд┐ sandbox рд╕реАрдо рдХреА рд╣реИ, рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреА рдирд╣реАрдВред
- **рдЧрд╝рд▓рдд рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдЬрд╝реЛрд░рджрд╛рд░ рдЕрд╕реНрд╡реАрдХреГрддрд┐ред** рдЕрдЬреНрдЮрд╛рдд YAML рдлрд╝реАрд▓реНрдб, рдЕрдЬреНрдЮрд╛рдд рдХреНрд░рд┐рдпрд╛рдПрдБ рдФрд░ рдЦрд╝рд░рд╛рдм рдкреИрдЯрд░реНрди рд▓реЛрдб рдкрд░ рдЕрд╕реНрд╡реАрдХреГрддред
- **рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ рд╕реАрдорд╛рдПрдБред** glob рдкреИрдЯрд░реНрди `maxGlobStars` рдЕрд╕реАрдорд┐рдд рд╕реНрдЯрд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░ рддрдХ рд╕реАрдорд┐рдд; regex-рдореЛрдб рдкреИрдЯрд░реНрди рдиреЗрд╕реНрдЯреЗрдб рдЕрд╕реАрдорд┐рдд рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╝рд╛рдпрд░ рдФрд░ рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╝рд╛рдЗрдб рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдЕрд╕реНрд╡реАрдХрд╛рд░рддреЗ рд╣реИрдВред
## Known limitations
- **рдкреВрд░реНрд╡-рдорд╛рд░реНрдХрд░ hosts рдкрд░ рдСрдбрд┐рдЯ рдорд╛рд░реНрдХрд░ред** `permissionRules/decision` `ignorable: true` рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЬрд┐рди hosts рдХрд╛ `Session.append` рдорд╛рд░реНрдХрд░ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рд╣реИ (`0.1.0-rc.6` рдкрдВрдХреНрддрд┐) рд╡реЗ рдЗрд╕реЗ рдЪреБрдкрдЪрд╛рдк рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП runtime рдПрдХ рдмрд╛рд░ рдХреА рдЪреЗрддрд╛рд╡рдиреА рд╕реЗ рд╕рддреНрд░-рд▓реЙрдЧ рдСрдбрд┐рдЯ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрддрд╛ рд╣реИред рдкреБрдирдГ рд╕рдХреНрд╖рдо рдХреЗ рд▓рд┐рдП `allowUnmarkedAudit: true`; рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦреЗ рд▓реЙрдЧ `scripts/repair-session-logs.mjs` рд╕реЗ рдорд░рдореНрдордд рдХрд░реЗрдВред
- **рдкрде рдЙрдореНрдореАрджрд╡рд╛рд░ рдЕрдиреБрдорд╛рдиреА рд╣реИрдВред** рдХреЗрд╡рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рд┐рдд рддрд░реНрдХ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдкрде рдорд┐рд▓рд╛рди рдХреЛ рдЦрд┐рд▓рд╛рддреА рд╣реИрдВ, рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░-рд╕рд╛рдкреЗрдХреНрд╖ рдорд┐рд▓рд╛рди рдХреЗрд╡рд▓ `caseInsensitivePaths` рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ ASCII-рдХреЗрд╕-рдЕрд╕рдВрд╡реЗрджреА рд╣реИред
- **globs рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдЙрдкрд╕рдореБрдЪреНрдЪрдп рд╣реИрдВред** рдХреЛрдИ рдмреНрд░реЗрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ тАФ рджреЛ рдкреИрдЯрд░реНрди рд▓рд┐рдЦреЗрдВ, рдпрд╛ regex рдореЛрдб рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
- **regex рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ рдЧрд╛рд░реНрдб рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╣реИ, рд╕рдВрдкреВрд░реНрдг рдирд╣реАрдВред** рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП glob рдореЛрдб рдкрд╕рдВрдж рдХрд░реЗрдВред
## Collaborating with dsh-auto-review
- `dsh-permission-rules` `ask` рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ; `dsh-auto-review` `approval/request` рд╡реЙрдЯрд░рдлрд╝реЙрд▓ рдкрд░ рдХреЗрд╡рд▓-рдкрдарди рджреНрд╡рд┐рддреАрдп-рдореЙрдбрд▓ рдирд┐рд░реНрдгрдп рд╕реЗ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ (рдпрд╛ рдорд╛рдирд╡реЛрдВ рдХреЛ рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред рдкреВрд░реНрдг рдмрдВрдж рд▓реВрдк рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдорд╛рдЙрдВрдЯ рдХрд░реЗрдВред
- рдПрдХреАрдХрд░рдг-рдкрд░реАрдХреНрд╖рд┐рдд: `permissionRules/decision` тЖТ `approval/asked` тЖТ `autoReview/verdict` тЖТ `approval/decided`, рд╕рдореАрдХреНрд╖рдХ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдореЙрдХ рд╕реЗ рдмрджрд▓рдХрд░ред
- рдЖрдзрд┐рдХрд╛рд░рд┐рдХ harness рдХреА `never` рдЕрдиреБрдореЛрджрди рдиреАрддрд┐ рдФрд░ рд╣рд░ рдмрдВрдж-рд╡рд┐рдлрд▓ рдЧрд╛рд░рдВрдЯреА рдЕрдЫреВрддреА рд░рд╣рддреА рд╣реИрдВред
## Session log repair
`ignorable` рдорд╛рд░реНрдХрд░ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╕рддреНрд░ рд▓реЙрдЧ рдирдП harness рдмрд┐рд▓реНрдб рджреНрд╡рд╛рд░рд╛ рдЕрд╕реНрд╡реАрдХреГрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (`SessionFormatUnsupportedError`)ред рд╡рд┐рддрд░рд┐рдд `scripts/repair-session-logs.mjs` рдХреЗрд╡рд▓ рд▓рдХреНрд╖рд┐рдд рдСрдбрд┐рдЯ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ `ignorable: true` рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдлрд╝реНрд░реЗрдо-рд╕рдВрд░рдХреНрд╖рд┐рдд, рдмреИрдХрдЕрдк рд╕рд╣рд┐рдд:
```sh
node scripts/repair-session-logs.mjs scan [--home DIR] # рд╡рд┐рджреЗрд╢реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ, рдХреБрдЫ рдирд╣реАрдВ рдмрджрд▓рддрд╛
node scripts/repair-session-logs.mjs repair [--home DIR] [--dry-run]
```
`--home` рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ `$DSH_HOME/sessions` (рдпрд╛ `~/.dsh/sessions`)ред
## Development
```sh
pnpm install # node ^22.19 || >=24
pnpm run typecheck # tsc, src + tests
pnpm run lint # eslint, src + tests + scripts
pnpm test # vitest: 139 tests, 9 suites
pnpm run test:coverage # coverage gate (90/80/90/90)
pnpm run build # tsc declarations + tsdown bundles (lib/)
pnpm run pack:check # build + pack (the published artifact)
node scripts/check-readme-sync.mjs # five-language README sync gate (also in CI)
```
рд╣реЗрдбрд▓реЗрд╕ рдПрдВрдб-рдЯреВ-рдПрдВрдб рд╕рддреНрдпрд╛рдкрди рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП [VERIFICATION.md](VERIFICATION.md) рджреЗрдЦреЗрдВред
## Topics
`dsh`, `dsh-plugin`, `deepseek-harness`, `permission`, `policy`, `allow-deny-ask`, `approval`, `safety`, `network`, `network-policy`, `proxy`
## Contributors
- [@PerryLink](https://github.com/PerryLink) тАФ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдЕрдиреБрд░рдХреНрд╖рдХ: рдирд┐рдпрдо рд╢рдмреНрджрд╛рд╡рд▓реА рд╡ рдореВрд▓реНрдпрд╛рдВрдХрди, runtime, HMR рдирд┐рдЧрд░рд╛рдиреА, рд╕рддреНрд░-рд▓реЙрдЧ рдСрдбрд┐рдЯ, рдиреЗрдЯрд╡рд░реНрдХ рдиреАрддрд┐ + рдкреНрд░реЙрдХреНрд╕реА, рдФрд░ рдкрд╛рдБрдЪ-рднрд╛рд╖рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред
- [@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-рдХреНрд╖рдорддрд╛ рдкрд╣рдЪрд╛рди рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реБрдзрд╛рд░ рд╕реАрдзреЗ рдЙрд╕реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдирд┐рдХрд▓реЗред
## PerryLink DSH Plugin Family
рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ [PerryLink](https://github.com/PerryLink) рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░рдХреНрд╖рд┐рдд [15 DeepSeek Harness рдкреНрд▓рдЧрдЗрди](https://github.com/PerryLink) рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрджрд┐ рдпрд╣ рдЖрдкрдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмрд╛рдХреА рднреА рд╕рдВрднрд╡рддрдГ рдХрд░реЗрдВрдЧреЗ:
| Plugin | One-liner |
|---|---|
| [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors |
| [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | Engineering-discipline guard: requirements grill, test gates, adversary review |
| [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Durable background child agents with a Web UI sidebar, messaging and interrupt |
| [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | LSP diagnostics, formatting, completion, code actions and rename over language servers |
| [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Claude Code outputStyles-equivalent runtime style switching |
| [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore |
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit |
| [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Second-model auto-review on the approval chain, fail-closed by default |
| [dsh-memento](https://github.com/PerryLink/dsh-memento) | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool |
| [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Security-audit skill pack: secret scan, dependency and supply-chain review |
| [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Pin sessions in the Web sidebar with durable ordering |
| [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Terminal-style input history for the web composer: arrows, Ctrl+R search |
| [dsh-github](https://github.com/PerryLink/dsh-github) | GitHub PR/issues integration for DSH, every write gated by approval |
| [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Plugin-development knowledge base as an on-demand agent skill |
| [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH |
## License
[Apache License 2.0](LICENSE) ┬й 2026 dsh-permission-rules contributors