dsh-permission-rules 0.4.2 → 0.5.2
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 +34 -0
- package/README.es.md +160 -117
- package/README.hi.md +162 -119
- package/README.md +133 -90
- package/README.pt.md +161 -118
- package/README.zh.md +162 -119
- package/docs/rule-test-vectors/README.md +28 -0
- package/docs/rule-test-vectors/corpus.json +109 -0
- package/lib/client.js +4693 -0
- package/lib/client.js.map +1 -0
- package/lib/index.js +1530 -179
- package/lib/typert.host.js +4305 -0
- package/lib/types/client/index.d.ts +28 -0
- package/lib/types/client/index.d.ts.map +1 -0
- package/lib/types/client/locales.d.ts +9 -0
- package/lib/types/client/locales.d.ts.map +1 -0
- package/lib/types/client/remote.d.ts +181 -0
- package/lib/types/client/remote.d.ts.map +1 -0
- package/lib/types/client/section.d.ts +35 -0
- package/lib/types/client/section.d.ts.map +1 -0
- package/lib/types/config.d.ts +54 -2
- package/lib/types/config.d.ts.map +1 -1
- package/lib/types/events.d.ts +45 -0
- package/lib/types/events.d.ts.map +1 -1
- package/lib/types/index.d.ts +8 -6
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/network.d.ts +90 -0
- package/lib/types/network.d.ts.map +1 -0
- package/lib/types/prose.d.ts +15 -0
- package/lib/types/prose.d.ts.map +1 -1
- package/lib/types/proxy.d.ts +128 -0
- package/lib/types/proxy.d.ts.map +1 -0
- package/lib/types/remote-service.d.ts +45 -0
- package/lib/types/remote-service.d.ts.map +1 -0
- package/lib/types/rules.d.ts +131 -0
- package/lib/types/rules.d.ts.map +1 -1
- package/lib/types/runtime.d.ts +153 -21
- package/lib/types/runtime.d.ts.map +1 -1
- package/lib/types/settings.d.ts +28 -0
- package/lib/types/settings.d.ts.map +1 -0
- package/lib/types/typert.host.d.ts +166 -0
- package/lib/types/typert.host.d.ts.map +1 -0
- package/lib/types/wire.d.ts +421 -0
- package/lib/types/wire.d.ts.map +1 -0
- package/package.json +182 -144
- package/scripts/repair-session-logs.mjs +7 -2
- package/src/client/index.ts +111 -0
- package/src/client/locales.ts +94 -0
- package/src/client/remote.ts +41 -0
- package/src/client/section.ts +201 -0
- package/src/config.ts +111 -0
- package/src/events.ts +46 -0
- package/src/index.ts +2 -0
- package/src/network.ts +177 -0
- package/src/prose.ts +85 -10
- package/src/proxy.ts +327 -0
- package/src/remote-service.ts +109 -0
- package/src/rules.ts +424 -5
- package/src/runtime.ts +464 -53
- package/src/settings.ts +74 -0
- package/src/typert.host.ts +25 -0
- package/src/wire.ts +239 -0
- package/lib/types/config.js +0 -99
- package/lib/types/config.js.map +0 -1
- package/lib/types/events.js +0 -44
- package/lib/types/events.js.map +0 -1
- package/lib/types/glob.js +0 -307
- package/lib/types/glob.js.map +0 -1
- package/lib/types/index.js +0 -27
- package/lib/types/index.js.map +0 -1
- package/lib/types/prose.js +0 -173
- package/lib/types/prose.js.map +0 -1
- package/lib/types/rules.js +0 -610
- package/lib/types/rules.js.map +0 -1
- package/lib/types/runtime.js +0 -818
- package/lib/types/runtime.js.map +0 -1
package/README.pt.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**Regras de permissão declarativas estilo Claude Code para o DeepSeek Harness.**
|
|
6
6
|
|
|
7
|
-
*
|
|
7
|
+
*Regras decidem o conhecido. Um modelo revisor decide o que não é.*
|
|
8
8
|
|
|
9
9
|
[](LICENSE)
|
|
10
10
|
[](https://github.com/topics/dsh-plugin)
|
|
@@ -20,176 +20,219 @@
|
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
23
|
-
##
|
|
23
|
+
## Compatibility
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
| Surface | Status |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Harness | DeepSeek Harness `0.1.0-rc.5`–`0.1.0-rc.6` |
|
|
28
|
+
| Node | `^22.19.0 || >=24.0.0` |
|
|
29
|
+
| Platforms | Todas (host + cliente web de settings) |
|
|
30
|
+
| Model | Qualquer (razões deny/ask aparecem pelos resultados de ferramenta) |
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
- **`ask`** usa o seam de aprovação oficial. Monte o `dsh-auto-review` junto e a pergunta é decidida por um segundo modelo; caso contrário, um humano responde; sem nenhum dos dois, o harness falha fechado (fail-closed).
|
|
29
|
-
- **`allow`** (e a ausência de correspondência) delega estritamente via `next()` — os listeners seguintes nunca são curto-circuitados.
|
|
32
|
+
## What you get
|
|
30
33
|
|
|
31
|
-
|
|
34
|
+
O `dsh-permission-rules` antepõe uma lista ordenada de regras **`allow` / `deny` / `ask`** a cada chamada de ferramenta na cascata `tools/pre-execute` — determinística, instantânea, auditável e escrita por você em YAML puro:
|
|
32
35
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
dsh-permission-rules answerer dsh-auto-review
|
|
37
|
-
· primeira correspondência em ordem ┌───────────────────┴──────────────┐
|
|
38
|
-
· deny/ask reivindicam a chamada │ veredito de IA (segundo modelo) │ não ── next() ──▶ UI humana
|
|
39
|
-
· allow/passagem → next() └───────────────────┬──────────────┘
|
|
40
|
-
│ deny ──▶ resultado negado │ allowed-once / rejected
|
|
41
|
-
│ ask ──▶ ctx.approval ────────────────────────┘
|
|
42
|
-
│
|
|
43
|
-
auditoria: permissionRules/decision → approval/asked → autoReview/verdict → approval/decided
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Por que regras *e* um revisor?
|
|
47
|
-
|
|
48
|
-
Um segundo modelo responde *"ESTA chamada é segura?"* com julgamento, mas custa uma ida e volta e pode errar. Regras declarativas respondem de forma determinística, instantânea e sem modelo — mas só cobrem o que um administrador escreveu. Combinados, você obtém o ciclo **"regras primeiro, IA de apoio"**: as regras decidem o conhecido, o revisor decide o desconhecido.
|
|
49
|
-
|
|
50
|
-
## Funcionalidades
|
|
51
|
-
|
|
52
|
-
- ✅ **Semântica de três estados** — `allow`, `deny`, `ask`, avaliadas na ordem do arquivo; a primeira correspondência vence
|
|
53
|
-
- ✅ **Correspondência rica** — globs de nome de ferramenta (incluindo `mcp__*`), seletores de identidade de agente (`main` / `subagent` / `preset:*`), globs **ou** regex de chave/valor de argumentos (com negação `!pattern` e a dimensão de chave `absent`), globs de caminhos relativos ao workspace extraídos de chaves de argumentos documentadas em **qualquer profundidade de aninhamento**, e condições de host `when` (variáveis de ambiente, plataforma)
|
|
54
|
-
- ✅ **Arquivos de regras hierárquicos** — `searchUp` opcional combina cada `.dsh/rules.yaml` do cwd da sessão até a raiz do sistema de arquivos, o mais próximo primeiro, para que um projeto filho possa sobrescrever regras do pai
|
|
55
|
-
- ✅ **Metadados de regras** — `enabled: false`, `description`, `tags`; `/rules` avisa sobre regras encobertas por um catch-all anterior
|
|
56
|
-
- ✅ **Seguro para o waterfall** — `allow`/passagem sempre chamam `next()`; somente `deny`/`ask` curto-circuitam
|
|
57
|
-
- ✅ **Seam de aprovação oficial** — `ask` flui por `ctx.approval`; nunca reimplementado, nunca contornado
|
|
58
|
-
- ✅ **Auditoria completa** — os eventos `permissionRules/decision` carregam a ação da regra, o cwd do workspace E o resultado final de cada chamada; `/rules decisions` reproduz o rastro na sessão; hosts anteriores ao marcador de envelope de auditoria degradam para auditoria desativada com um aviso único em vez de gravar registros irrecuperáveis (`allowUnmarkedAudit` reativa)
|
|
59
|
-
- ✅ **Implantação em simulação** — `enforce: false` audita o que a política *faria* (ação hipotética + resultado real posterior, marcado com `dryRun`) enquanto deixa todas as chamadas passarem; teste seguro de políticas em produção
|
|
60
|
-
- ✅ **Teste em seco** — `/rules test <tool> <json-args>` avalia as regras ativas sem executar nada, com sobrescritas `--cwd`, `--env`, `--agent` e `--platform` para cada dimensão
|
|
61
|
-
- ✅ **Recarga a quente** — vigilância Chokidar com debounce; uma edição quebrada mantém as regras anteriores, nunca quebra; um arquivo de regras criado no meio da sessão (o do projeto ou o fallback) é adotado automaticamente, sem recarga manual
|
|
62
|
-
- ✅ **Falha ruidosa** — YAML inválido, ações/campos desconhecidos, globs/regex ruins, padrões propensos a backtracking ou > `maxRules` fazem a carga falhar
|
|
63
|
-
- ✅ **Caminho quente limitado** — matchers pré-compilados, O(regras × padrões), limitado por `maxRules`; o grau de backtracking de glob limitado por `maxGlobStars`
|
|
64
|
-
|
|
65
|
-
## Início rápido
|
|
66
|
-
|
|
67
|
-
```sh
|
|
68
|
-
# 1. instale o bundle no seu perfil
|
|
69
|
-
dsh plugin --profile web add "github:PerryLink/dsh-permission-rules#main"
|
|
36
|
+
- **`deny`** bloqueia a chamada; a `reason` da regra vira o erro visível para o modelo.
|
|
37
|
+
- **`ask`** usa a costura oficial de aprovação (monte o `dsh-auto-review` para um answerer de segundo modelo, ou um humano responde; sem nenhum, o harness falha fechado).
|
|
38
|
+
- **`allow`** (e sem correspondência) delega estritamente via `next()` — os listeners posteriores nunca são curto-circuitados.
|
|
70
39
|
|
|
71
|
-
|
|
72
|
-
pnpm pack
|
|
73
|
-
dsh plugin --profile web add ./dsh-permission-rules-0.4.1.tgz
|
|
40
|
+
Cada acerto **e** cada passagem direta é registrada como um evento de sessão `permissionRules/decision` (somente log — nada extra é injetado no contexto do modelo).
|
|
74
41
|
|
|
75
|
-
|
|
76
|
-
dsh
|
|
77
|
-
|
|
42
|
+
- **Correspondência rica** — globs de nome de ferramenta (incl. `mcp__*`), seletores de identidade de agente (`main` / `subagent` / `preset:*`), globs **ou** regexes de chave/valor de argumentos (com negação `!pattern` e dimensão de chave `absent`), globs de caminho relativos ao workspace em **qualquer profundidade de aninhamento**, e condições de host `when` (variáveis de ambiente, plataforma).
|
|
43
|
+
- **Arquivos de regras hierárquicos** — `searchUp` opcional mescla cada `.dsh/rules.yaml` do cwd da sessão até a raiz do sistema de arquivos, o mais próximo primeiro.
|
|
44
|
+
- **Implantação em dry-run** — `enforce: false` audita o que a política *faria* enquanto deixa cada chamada passar.
|
|
45
|
+
- **Recarga a quente** — vigilância Chokidar com debounce; uma edição quebrada mantém as regras anteriores, nunca falha.
|
|
46
|
+
- **Falha ruidosa** — YAML inválido, ações/campos desconhecidos, globs/regexes ruins, padrões propensos a backtracking ou mais de `maxRules` regras falham a carga.
|
|
78
47
|
|
|
79
|
-
|
|
48
|
+
## Rule syntax
|
|
80
49
|
|
|
81
50
|
```yaml
|
|
82
51
|
# <project>/.dsh/rules.yaml
|
|
83
52
|
rules:
|
|
84
53
|
- match: { tools: [bash, pwsh], params: { command: "git push*" }, paths: ["**/secrets/**"] }
|
|
85
54
|
action: deny
|
|
86
|
-
reason: "
|
|
55
|
+
reason: "No pushes from protected paths"
|
|
87
56
|
|
|
88
57
|
- match: { tools: [edit, write] }
|
|
89
58
|
action: ask
|
|
90
|
-
reason: "
|
|
59
|
+
reason: "File writes need confirmation"
|
|
91
60
|
```
|
|
92
61
|
|
|
62
|
+
- **Dimensões de correspondência** — `tools` (globs, incl. `mcp__*`), `agents` (`main` / `subagent` / `preset:<name>`; identidade desconhecida nunca corresponde — falha fechado), `params` (globs ou regexes de chave/valor, negação `!pattern`, dimensão de chave `absent`), `paths` (globs relativos ao workspace extraídos a qualquer profundidade), `when` (globs/regexes de variáveis `env` + lista `platform` fechada), e `network` (`domains` / `ips` / `ports` / `schemes` — globs, curingas, CIDR, faixas de porta).
|
|
63
|
+
- **Ações** — `allow` / `deny` / `ask`, avaliadas em ordem de arquivo, primeira correspondência vence.
|
|
64
|
+
- **Metadados de regra** — `enabled: false` (visível mas inerte), `description`, `tags`; campos desconhecidos falham a carga.
|
|
65
|
+
- **Schema** — um JSON Schema é distribuído em [docs/rules-format.schema.json](docs/rules-format.schema.json) (autocompletar de editor via `# yaml-language-server: $schema=...`); o vocabulário completo e uma linha base de 5 regras vivem em [docs/rules-format.en.md](docs/rules-format.en.md).
|
|
66
|
+
|
|
67
|
+
## Network policy
|
|
68
|
+
|
|
69
|
+
Uma **política de rede em nível de processo** estilo Codex: o tráfego de subprocessos de shell flui por um **proxy HTTP/CONNECT** local integrado, e cada conexão é decidida por regras de rede ordenadas ou por três modos mapeados sobre os presets oficiais do sandbox:
|
|
70
|
+
|
|
71
|
+
- **`deny-all`** — o preset de sandbox somente leitura: bloquear todo o tráfego de saída.
|
|
72
|
+
- **`whitelist`** — o preset workspace-write: permitir destinos listados, `unlisted: ask` (ou `deny`) para o resto.
|
|
73
|
+
- **`allow-all`** — o preset danger-full-access: permitir tudo.
|
|
74
|
+
- **`auto`** (padrão) — segue o preset do sandbox; em hosts sem o serviço de política de sandbox resolve para `autoFallback` (`allow-all`).
|
|
75
|
+
|
|
76
|
+
- **Correspondência** — `match.network` com `domains` / `ips` / `ports` / `schemes` (globs, curingas, CIDR, faixas de porta; portas YAML numéricas são aceitas). A extração de candidatos URL na rota quente `tools/pre-execute` dispara sobre argumentos de ferramentas web e URLs embutidas em texto de comando bash/pwsh; destinos de loopback podem curto-circuitar regras conforme a política `loopback`.
|
|
77
|
+
- **Auditoria** — conexões negadas anexam `permissionRules/network` à sessão proprietária (a mesma porta adaptativa `ignorable`), com contadores de bloqueio e intercepções recentes em `/rules network` e na página de settings.
|
|
78
|
+
|
|
79
|
+
## Quick start
|
|
80
|
+
|
|
93
81
|
```sh
|
|
94
|
-
|
|
82
|
+
# 1. install the bundle into your profile
|
|
83
|
+
dsh plugin --profile web add "github:PerryLink/dsh-permission-rules#main"
|
|
84
|
+
|
|
85
|
+
# or from npm (published releases)
|
|
86
|
+
dsh plugin --profile web add dsh-permission-rules
|
|
87
|
+
|
|
88
|
+
# 2. restart and verify the row
|
|
89
|
+
dsh --profile web --dump-config | grep -A4 'id: permission-rules'
|
|
95
90
|
```
|
|
96
91
|
|
|
97
|
-
|
|
92
|
+
## Install & uninstall
|
|
93
|
+
|
|
94
|
+
- **canal git** (último `main`): `dsh plugin --profile web add "github:PerryLink/dsh-permission-rules#main"` — o script `prepare` compila apenas com dependências de produção.
|
|
95
|
+
- **canal npm** (versões publicadas): `dsh plugin --profile web add dsh-permission-rules`.
|
|
96
|
+
- **canal tarball**: `pnpm pack` neste repo, depois `dsh plugin --profile web add ./dsh-permission-rules-<version>.tgz`.
|
|
97
|
+
- **desinstalar**: `dsh plugin --profile web remove dsh-permission-rules`.
|
|
98
98
|
|
|
99
|
-
##
|
|
99
|
+
## Configuration
|
|
100
100
|
|
|
101
|
-
Todos os
|
|
101
|
+
Todos os parâmetros são campos Schemastery `Config` (alteráveis pelo cordis.yml). Uma sobrescrita direcionada por id substitui a linha inteira — reafirme cada chave de que precisa.
|
|
102
102
|
|
|
103
|
-
|
|
|
103
|
+
| Key | Default | Meaning |
|
|
104
104
|
|---|---|---|
|
|
105
105
|
| `rulesFile` | `.dsh/rules.yaml` | Local do arquivo de regras; relativo = resolvido contra o cwd da sessão, absoluto = global e validado na montagem |
|
|
106
|
-
| `fallbackPath` | *(
|
|
107
|
-
| `badFilePolicy` | `fail` | Arquivo ruim: `fail` faz a chamada pendente falhar ruidosamente
|
|
108
|
-
| `maxRules` | `256` | Limite rígido de
|
|
109
|
-
| `maxCachedWorkspaces` | `512` | Limite rígido de cargas de regras por workspace em cache
|
|
110
|
-
| `patternMode` | `glob` | Sabor
|
|
106
|
+
| `fallbackPath` | *(none)* | Arquivo de regras usado quando a detecção por cwd não encontra nada; validado na montagem |
|
|
107
|
+
| `badFilePolicy` | `fail` | Arquivo de regras ruim: `fail` faz a chamada pendente falhar ruidosamente; `ignore-with-warning` avisa e continua vazio |
|
|
108
|
+
| `maxRules` | `256` | Limite rígido de contagem de regras na cadeia fonte efetiva |
|
|
109
|
+
| `maxCachedWorkspaces` | `512` | Limite rígido de cargas de regras por workspace em cache (evicção LRU) |
|
|
110
|
+
| `patternMode` | `glob` | Sabor de padrão `params`/`paths`/`when.env`: `glob` ou `regex` (nomes de ferramenta são sempre globs) |
|
|
111
111
|
| `watch` | `true` | Vigilância Chokidar + recarga ao mudar |
|
|
112
|
-
| `watchStabilityThresholdMs` | `200` | Janela de debounce
|
|
113
|
-
| `language` | `en` | Idioma
|
|
114
|
-
| `caseInsensitivePaths` | *(win32)* | Padrões
|
|
115
|
-
| `audit` | `all` | Granularidade
|
|
116
|
-
| `searchUp` | `false` |
|
|
117
|
-
| `maxGlobStars` | `2` | Limite rígido de quantificadores `*`/`**`
|
|
118
|
-
| `enforce` | `true` | `false` = modo
|
|
119
|
-
| `allowUnmarkedAudit` | `false` | Hosts
|
|
120
|
-
|
|
121
|
-
|
|
112
|
+
| `watchStabilityThresholdMs` | `200` | Janela de debounce de recarga (ms) |
|
|
113
|
+
| `language` | `en` | Idioma de saída de `/rules`: `en`, `zh`, `es`, `pt`, `hi` |
|
|
114
|
+
| `caseInsensitivePaths` | *(win32)* | Padrões `paths` e comparação de raiz do workspace ignoram maiúsculas ASCII; `true` no Windows |
|
|
115
|
+
| `audit` | `all` | Granularidade de auditoria: `all` registra cada acerto E passagem; `hits` omite eventos de passagem |
|
|
116
|
+
| `searchUp` | `false` | Percorrer diretórios pai do cwd e mesclar cada arquivo de regras encontrado, o mais próximo primeiro |
|
|
117
|
+
| `maxGlobStars` | `2` | Limite rígido de quantificadores `*`/`**` não limitados por padrão glob |
|
|
118
|
+
| `enforce` | `true` | `false` = modo dry-run: acertos deny/ask são registrados com marcador `dryRun` e cada chamada passa |
|
|
119
|
+
| `allowUnmarkedAudit` | `false` | Hosts anteriores ao marcador descartam o marcador `ignorable`; o plugin desativa a auditoria de log com um aviso. Ponha `true` para reativar |
|
|
120
|
+
| `network.enabled` | `true` | Interruptor mestre do proxy, da injeção de ambiente e dos padrões de modo de ferramenta web |
|
|
121
|
+
| `network.mode` | `auto` | Modo de política: `auto` segue o preset do sandbox, ou `deny-all` / `whitelist` / `allow-all` |
|
|
122
|
+
| `network.autoFallback` | `allow-all` | Modo usado quando `auto` não tem serviço de política de sandbox |
|
|
123
|
+
| `network.unlisted` | `ask` | Manejo em modo whitelist de destinos sem regra coincidente: `ask` ou `deny` |
|
|
124
|
+
| `network.proxyBind` | `127.0.0.1` | Endereço de vínculo do proxy local (somente loopback) |
|
|
125
|
+
| `network.proxyPort` | `0` | Porta do proxy local; `0` escolhe uma porta efêmera livre |
|
|
126
|
+
| `network.proxyMaxRecent` | `100` | Limite de registros de bloqueio recentes para a página de settings |
|
|
127
|
+
| `network.loopback` | `allow` | Destinos de loopback: `allow` (paridade Codex) ou `policy` |
|
|
128
|
+
| `network.injectEnv` | `true` | Se variáveis de ambiente do proxy são injetadas para subprocessos |
|
|
129
|
+
| `network.noProxy` | `clear` | Manejo de NO_PROXY em subprocessos: `clear` aplica a política ou `preserve` |
|
|
130
|
+
|
|
131
|
+
## Tools & surfaces
|
|
132
|
+
|
|
133
|
+
| Surface | Kind | Notes |
|
|
134
|
+
|---|---|---|
|
|
135
|
+
| `tools/pre-execute` | listener | Regras allow/deny/ask de primeira correspondência + extração de candidatos URL de rede |
|
|
136
|
+
| `/rules` | command | `list` · `reload` · `decisions [n]` · `test <tool> <json>` |
|
|
137
|
+
| `permissionRules/decision` | event | Auditoria somente de log para cada acerto e passagem |
|
|
138
|
+
| `permissionRules/network` | event | Auditoria da camada de proxy para conexões bloqueadas |
|
|
139
|
+
| HTTP/CONNECT proxy | service | Proxy local integrado que governa o tráfego de subprocessos de shell |
|
|
140
|
+
| settings page | client | Editor de modo de rede, editor de regras, contadores de bloqueio, intercepções recentes |
|
|
122
141
|
|
|
123
142
|
```
|
|
124
|
-
/rules
|
|
125
|
-
/rules list alias
|
|
126
|
-
/rules reload
|
|
127
|
-
/rules decisions [n]
|
|
128
|
-
/rules test <tool> <json>
|
|
143
|
+
/rules list the active rules, their source files, and any last-reload error
|
|
144
|
+
/rules list explicit alias for the bare listing
|
|
145
|
+
/rules reload re-read the rule-file chain for this workspace
|
|
146
|
+
/rules decisions [n] show the last n permission decisions of this session (default 10)
|
|
147
|
+
/rules test <tool> <json> dry-evaluate the rules against a hypothetical call
|
|
129
148
|
```
|
|
130
149
|
|
|
131
|
-
`/rules test` também aceita
|
|
132
|
-
|
|
133
|
-
A saída dos comandos é somente UI — o modelo aprende as regras apenas pelos resultados de ferramenta que elas produzem. `language` escolhe o idioma da saída. Um JSON Schema do arquivo de regras é distribuído em [docs/rules-format.schema.json](docs/rules-format.schema.json) (conecte-o com `# yaml-language-server: $schema=...` para autocompletar no editor).
|
|
150
|
+
`/rules test` também aceita bandeiras iniciais: `--cwd <dir>`, `--env KEY=VALUE` (repetível), `--agent <selector>` (repetível) e `--platform <name>`. Em cadeias multi-arquivo (ex.: `searchUp`), cada linha de regra listada é atribuída ao seu próprio arquivo fonte.
|
|
134
151
|
|
|
135
|
-
##
|
|
152
|
+
## Permissions & data
|
|
136
153
|
|
|
137
|
-
-
|
|
138
|
-
-
|
|
139
|
-
-
|
|
154
|
+
- **Permissions**: o manifesto de workshop declara `files:read`, `files:watch`, `files:write`, `session:append` e `network:outbound`. Decisões `ask` usam a costura oficial de aprovação — nada é reimplementado ou contornado.
|
|
155
|
+
- **Data**: arquivos de regras são lidos do disco; nenhum dado de regra é escrito. Sem chamadas de modelo, sem subagentes revisores.
|
|
156
|
+
- **Session log**: `permissionRules/decision` nunca é injetado no contexto do modelo e é anexado com o marcador `ignorable: true` do envelope, de modo que qualquer build do harness carrega o log.
|
|
140
157
|
|
|
141
|
-
##
|
|
158
|
+
## Security boundaries
|
|
142
159
|
|
|
143
|
-
- **Política, não kernel.**
|
|
144
|
-
- **
|
|
145
|
-
- **Sem mudanças de sandbox.** A política de sandbox
|
|
146
|
-
- **
|
|
147
|
-
- **Limites de backtracking.** Padrões glob são limitados a `maxGlobStars` expansões de estrela
|
|
160
|
+
- **Política, não kernel.** Candidatos `paths` vêm apenas de um conjunto documentado de chaves de argumento (a qualquer profundidade, com limite), e apenas caminhos relativos ao workspace correspondem.
|
|
161
|
+
- **Aqui não há revisor.** O plugin nunca gera subagentes nem chama modelos — produzir uma decisão `ask` é o fim do seu trabalho.
|
|
162
|
+
- **Sem mudanças de sandbox.** A política de sandbox em nível de SO pertence à costura do sandbox, não a este plugin.
|
|
163
|
+
- **Rejeição ruidosa de má configuração.** Campos YAML desconhecidos, ações desconhecidas e padrões ruins são rejeitados na carga.
|
|
164
|
+
- **Limites de backtracking.** Padrões glob são limitados a `maxGlobStars` expansões de estrela não limitadas; padrões regex rejeitam quantificadores aninhados não limitados e alternâncias literais sobrepostas quantificadas.
|
|
148
165
|
|
|
149
|
-
##
|
|
166
|
+
## Known limitations
|
|
150
167
|
|
|
151
|
-
-
|
|
152
|
-
-
|
|
153
|
-
-
|
|
168
|
+
- **Marcador de auditoria em hosts anteriores ao marcador.** `permissionRules/decision` é anexado com `ignorable: true`; hosts cujo `Session.append` é anterior ao marcador (a linha `0.1.0-rc.6`) o descartam silenciosamente, então o runtime desativa a auditoria de log com um aviso único. Ponha `allowUnmarkedAudit: true` para reativar; repare logs já escritos com `scripts/repair-session-logs.mjs`.
|
|
169
|
+
- **Candidatos de caminho são heurísticos.** Somente as chaves de argumento documentadas alimentam a correspondência de caminho, e a correspondência relativa ao workspace é insensível a maiúsculas ASCII apenas com `caseInsensitivePaths` ativado.
|
|
170
|
+
- **Globs são um subconjunto conservador.** Sem expansão de chaves — escreva dois padrões, ou use o modo regex.
|
|
171
|
+
- **A guarda de backtracking de regex é estrutural, não exaustiva.** Prefira o modo glob para arquivos não confiáveis.
|
|
154
172
|
|
|
155
|
-
##
|
|
173
|
+
## Collaborating with dsh-auto-review
|
|
156
174
|
|
|
157
|
-
- `
|
|
158
|
-
-
|
|
159
|
-
-
|
|
160
|
-
- O guard de backtracking de regex é estrutural, não exaustivo: casos de ambiguidade por alternância sem prefixos literais (ex.: lookarounds elaborados) são responsabilidade do autor; prefira o modo glob para arquivos não confiáveis.
|
|
175
|
+
- O `dsh-permission-rules` produz `ask`; o `dsh-auto-review` responde na cascata `approval/request` com um veredito de segundo modelo somente leitura (ou delega a humanos). Monte ambos para o laço completo fechado.
|
|
176
|
+
- Testado em integração: `permissionRules/decision` → `approval/asked` → `autoReview/verdict` → `approval/decided`, com o revisor substituído por um mock roteirizado.
|
|
177
|
+
- A política de aprovação `never` e toda garantia de falha fechada do harness oficial permanecem intactas.
|
|
161
178
|
|
|
162
|
-
##
|
|
179
|
+
## Session log repair
|
|
163
180
|
|
|
164
|
-
|
|
181
|
+
Logs de sessão escritos antes de o marcador `ignorable` existir podem ser recusados por builds mais novas do harness (`SessionFormatUnsupportedError`). O `scripts/repair-session-logs.mjs` distribuído reescreve apenas as linhas de auditoria alvo para carregar `ignorable: true`, preservando quadros, com backups:
|
|
165
182
|
|
|
166
183
|
```sh
|
|
167
|
-
node scripts/repair-session-logs.mjs scan [--home DIR] # relata linhas
|
|
184
|
+
node scripts/repair-session-logs.mjs scan [--home DIR] # relata linhas estranhas, não muda nada
|
|
168
185
|
node scripts/repair-session-logs.mjs repair [--home DIR] [--dry-run]
|
|
169
186
|
```
|
|
170
187
|
|
|
171
|
-
`--home` por padrão é `$DSH_HOME/sessions` (ou `~/.dsh/sessions`).
|
|
188
|
+
`--home` por padrão é `$DSH_HOME/sessions` (ou `~/.dsh/sessions`).
|
|
172
189
|
|
|
173
|
-
##
|
|
190
|
+
## Development
|
|
174
191
|
|
|
175
192
|
```sh
|
|
176
|
-
pnpm install
|
|
177
|
-
pnpm run typecheck
|
|
178
|
-
pnpm run lint
|
|
179
|
-
pnpm test
|
|
180
|
-
pnpm run test:coverage #
|
|
181
|
-
pnpm run build
|
|
182
|
-
pnpm run pack:check
|
|
183
|
-
node scripts/check-readme-sync.mjs
|
|
193
|
+
pnpm install # node ^22.19 || >=24
|
|
194
|
+
pnpm run typecheck # tsc, src + tests
|
|
195
|
+
pnpm run lint # eslint, src + tests + scripts
|
|
196
|
+
pnpm test # vitest: 139 tests, 9 suites
|
|
197
|
+
pnpm run test:coverage # coverage gate (90/80/90/90)
|
|
198
|
+
pnpm run build # tsc declarations + tsdown bundles (lib/)
|
|
199
|
+
pnpm run pack:check # build + pack (the published artifact)
|
|
200
|
+
node scripts/check-readme-sync.mjs # five-language README sync gate (also in CI)
|
|
184
201
|
```
|
|
185
202
|
|
|
186
|
-
|
|
203
|
+
Consulte [VERIFICATION.md](VERIFICATION.md) para o registro de verificação end-to-end sem cabeça.
|
|
204
|
+
|
|
205
|
+
## Topics
|
|
206
|
+
|
|
207
|
+
`dsh`, `dsh-plugin`, `deepseek-harness`, `permission`, `policy`, `allow-deny-ask`, `approval`, `safety`, `network`, `network-policy`, `proxy`
|
|
208
|
+
|
|
209
|
+
## Contributors
|
|
210
|
+
|
|
211
|
+
- [@PerryLink](https://github.com/PerryLink) — criador e mantenedor: vocabulário e avaliação de regras, runtime, vigilância HMR, auditoria de log de sessão, política de rede + proxy, e a documentação em cinco idiomas.
|
|
212
|
+
- [@22xuan](https://github.com/22xuan) — o relatório detalhado sobre hosts rc.6 descartando silenciosamente o marcador `ignorable` do evento de auditoria ([#2](https://github.com/PerryLink/dsh-permission-rules/issues/2)) e a discussão do harness upstream; a detecção de capacidade de host em runtime v0.4.1 e a correção de documentação se derivaram diretamente dessa análise.
|
|
213
|
+
|
|
214
|
+
## PerryLink DSH Plugin Family
|
|
187
215
|
|
|
188
|
-
|
|
216
|
+
Este projeto é um dos [15 plugins do DeepSeek Harness](https://github.com/PerryLink) mantidos por [PerryLink](https://github.com/PerryLink). Se este te ajuda, os demais provavelmente também:
|
|
189
217
|
|
|
190
|
-
|
|
191
|
-
|
|
218
|
+
| Plugin | One-liner |
|
|
219
|
+
|---|---|
|
|
220
|
+
| [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors |
|
|
221
|
+
| [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | Engineering-discipline guard: requirements grill, test gates, adversary review |
|
|
222
|
+
| [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Durable background child agents with a Web UI sidebar, messaging and interrupt |
|
|
223
|
+
| [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | LSP diagnostics, formatting, completion, code actions and rename over language servers |
|
|
224
|
+
| [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Claude Code outputStyles-equivalent runtime style switching |
|
|
225
|
+
| [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore |
|
|
226
|
+
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit |
|
|
227
|
+
| [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Second-model auto-review on the approval chain, fail-closed by default |
|
|
228
|
+
| [dsh-memento](https://github.com/PerryLink/dsh-memento) | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool |
|
|
229
|
+
| [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Security-audit skill pack: secret scan, dependency and supply-chain review |
|
|
230
|
+
| [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Pin sessions in the Web sidebar with durable ordering |
|
|
231
|
+
| [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Terminal-style input history for the web composer: arrows, Ctrl+R search |
|
|
232
|
+
| [dsh-github](https://github.com/PerryLink/dsh-github) | GitHub PR/issues integration for DSH, every write gated by approval |
|
|
233
|
+
| [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Plugin-development knowledge base as an on-demand agent skill |
|
|
234
|
+
| [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH |
|
|
192
235
|
|
|
193
|
-
##
|
|
236
|
+
## License
|
|
194
237
|
|
|
195
238
|
[Apache License 2.0](LICENSE) © 2026 dsh-permission-rules contributors
|