dsh-permission-rules 0.5.0 → 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/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
- *As regras decidem o que é conhecido. Um modelo revisor decide o que não é.*
7
+ *Regras decidem o conhecido. Um modelo revisor decide o que não é.*
8
8
 
9
9
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
10
10
  [![DSH plugin](https://img.shields.io/badge/dsh-plugin-✅-green)](https://github.com/topics/dsh-plugin)
@@ -20,179 +20,200 @@
20
20
 
21
21
  ---
22
22
 
23
- ## O que ele faz
23
+ ## Compatibility
24
24
 
25
- O `dsh-permission-rules` coloca uma lista ordenada de regras **`allow` / `deny` / `ask`** na frente de cada chamada de ferramenta no waterfall `tools/pre-execute` — determinístico, instantâneo, auditável e escrito por você em YAML puro:
26
-
27
- - **`deny`** bloqueia a chamada. O `reason` da regra vira o erro visível para o modelo, para que o agente aprenda o *porquê* em vez de tentar de novo às cegas.
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.
30
-
31
- Cada acerto **e** cada passagem direta é auditado como evento de sessão `permissionRules/decision` (somente registro — nada extra é injetado no contexto do modelo).
32
-
33
- ```text
34
- waterfall tools/pre-execute waterfall approval/request (cadeia de answerers)
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
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) |
51
31
 
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`
32
+ ## What you get
64
33
 
65
- ## Início rápido
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:
66
35
 
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
- # ou a partir de um tarball empacotado (artefatos compilados, sem permissão de build)
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
- # 2. reinicie
76
- dsh --profile web
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
- Depois crie o arquivo de regras do seu projeto e inicie uma sessão nele:
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: "Sem push a partir de caminhos protegidos"
55
+ reason: "No pushes from protected paths"
87
56
 
88
57
  - match: { tools: [edit, write] }
89
58
  action: ask
90
- reason: "Escrita de arquivos precisa de confirmação"
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
- dsh --profile web --dump-config | grep -A4 'id: permission-rules' # verifique a linha
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
- Uma linha de base de segurança completa com 5 regras e o esquema completo estão em [docs/rules-format.en.md](docs/rules-format.en.md).
92
+ ## Install & uninstall
98
93
 
99
- ## Configuração
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`.
100
98
 
101
- Todos os ajustes são campos `Config` do Schemastery (alteráveis no cordis.yml). Uma sobrescrita direcionada por id substitui a linha inteira — reescreva todas as chaves que você precisa.
99
+ ## Configuration
102
100
 
103
- | Chave | Padrão | Significado |
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
+
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` | *(nenhum)* | Arquivo de regras usado quando a descoberta por cwd não encontra nada; validado na montagem |
107
- | `badFilePolicy` | `fail` | Arquivo ruim: `fail` faz a chamada pendente falhar ruidosamente (recargas mantêm as regras anteriores); `ignore-with-warning` avisa e segue vazio |
108
- | `maxRules` | `256` | Limite rígido de regras em toda a cadeia de fontes efetiva; arquivos maiores falham a carga |
109
- | `maxCachedWorkspaces` | `512` | Limite rígido de cargas de regras por workspace em cache; além dele o menos usado recentemente (e seu watcher) é expulso |
110
- | `patternMode` | `glob` | Sabor dos padrões de `params`/`paths`/`when.env`: `glob` ou `regex` (nomes de ferramenta sempre são globs) |
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 da recarga (ms) |
113
- | `language` | `en` | Idioma da saída do `/rules`: `en`, `zh`, `es`, `pt`, `hi` (`en`/`zh` são as traduções de referência) |
114
- | `caseInsensitivePaths` | *(win32)* | Padrões de `paths` e comparação com a raiz do workspace ignoram maiúsculas ASCII; por padrão `true` no Windows, `false` nos demais |
115
- | `audit` | `all` | Granularidade da auditoria: `all` registra cada acerto E passagem; `hits` pula eventos de passagem |
116
- | `searchUp` | `false` | Percorre os diretórios pais a partir do cwd da sessão e combina cada arquivo de regras encontrado, o mais próximo primeiro |
117
- | `maxGlobStars` | `2` | Limite rígido de quantificadores `*`/`**` ilimitados por padrão glob (cota do grau de backtracking) |
118
- | `enforce` | `true` | `false` = modo simulação: acertos deny/ask são apenas registrados na auditoria com um marcador `dryRun` (ação hipotética + resultado real posterior) e todas as chamadas passam — teste uma política antes de aplicá-la |
119
- | `allowUnmarkedAudit` | `false` | Hosts cujo `Session.append` é anterior ao marcador `ignorable` (a linha `0.1.0-rc.6`) gravam eventos de auditoria sem marcação, tornando as sessões irrecuperáveis em builds mais rígidos: o plugin os detecta e desativa a auditoria do registro da sessão com um aviso único. Defina `true` para reativar o rastro na sessão (repare registros existentes com `scripts/repair-session-logs.mjs`) |
120
-
121
- ### Comandos de sessão
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 lista as regras ativas, seus arquivos de origem e qualquer erro da última recarga
125
- /rules list alias explícito da listagem simples
126
- /rules reload relê a cadeia de arquivos de regras deste workspace
127
- /rules decisions [n] mostra as últimas n decisões de permissão desta sessão (padrão 10)
128
- /rules test <tool> <json> avalia em seco as regras contra uma chamada hipotética, ex.: /rules test bash {"command":"git push origin main"}
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 sinalizadores iniciais: `--cwd <dir>` avalia contra outro workspace, `--env CHAVE=VALOR` (repetível) sobrescreve o ambiente para `when.env`, `--agent <seletor>` (repetível) fornece candidatos de identidade para a dimensão `agents`, e `--platform <nome>` sobrescreve a plataforma para `when.platform`. Em cadeias de vários arquivos (ex.: `searchUp`), cada linha de regra é atribuída ao seu próprio arquivo de origem.
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.
132
151
 
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).
152
+ ## Permissions & data
134
153
 
135
- ## Colaboração com o dsh-auto-review
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.
136
157
 
137
- - O `dsh-permission-rules` produz `ask`; o `dsh-auto-review` responde no waterfall `approval/request` com um veredito de um segundo modelo somente leitura (ou delega para humanos). Monte os dois para o ciclo completo.
138
- - Testado em integração (`test/integration.spec.ts`): `permissionRules/decision` → `approval/asked` → `autoReview/verdict` → `approval/decided`, com o revisor substituído por um mock.
139
- - A política de aprovação `never` e todas as garantias fail-closed do [harness oficial](https://github.com/deepseek-ai/deepseek-harness) permanecem intactas.
158
+ ## Security boundaries
140
159
 
141
- ## Limites de segurança
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.
142
165
 
143
- - **Política, não kernel.** Os candidatos de `paths` vêm apenas de um conjunto documentado de chaves de argumentos, e somente caminhos relativos ao workspace correspondem.
144
- - **Nenhum revisor aqui.** O plugin nunca lança subagentes nem chama modelos — produzir uma decisão `ask` é o fim do seu trabalho.
145
- - **Sem mudanças de sandbox.** A política de sandbox no nível do SO pertence ao seam de sandbox, não a este plugin.
146
- - **Configuração errada ruidosa.** Campos YAML desconhecidos, ações desconhecidas e padrões ruins são rejeitados na carga, nunca ignorados em silêncio.
147
- - **Limites de backtracking.** Padrões glob são limitados a `maxGlobStars` expansões de estrela ilimitadas; padrões em modo regex rejeitam quantificadores aninhados ilimitados e alternâncias literais sobrepostas quantificadas. (Cadeias regex como `\d+\.\d+\.\d+` permanecem permitidas — o modo regex é a válvula de escape, o modo glob é o padrão protegido.)
166
+ ## Known limitations
148
167
 
149
- ## Trabalho relacionado
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.
150
172
 
151
- - [Andy8647/dsh-auto-approval](https://github.com/Andy8647/dsh-auto-approval) — classificador allow/deny de dois estados com auditoria em arquivo próprio; este plugin adiciona a semântica completa de três estados, regras YAML declarativas, auditoria no log de sessão e delegação segura com `next()`.
152
- - `Drifter-yh/dsh-tool-policy` — política de ferramentas deny-by-default; documentada aqui para evitar implementação duplicada.
153
- - `dsh-auto-review` — a metade de apoio de IA do ciclo que este plugin lidera.
173
+ ## Collaborating with dsh-auto-review
154
174
 
155
- ## Limitações conhecidas
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.
156
178
 
157
- - `permissionRules/decision` é anexado com o marcador de envelope `ignorable: true`, então qualquer build do harness carrega o log — leitores que não conhecem o tipo fora do repositório simplesmente pulam o registro de auditoria em vez de recusar a sessão. Hosts cujo `Session.append` é anterior ao marcador (a linha `0.1.0-rc.6`) o DESCARTAM silenciosamente: o plugin os detecta em tempo de execução (verificação prévia da versão do peer + sonda do envelope anexado) e desativa a auditoria do registro da sessão com um aviso único, mantendo os registros carregáveis em qualquer lugar. Defina `allowUnmarkedAudit: true` para reativar o rastro na sessão; registros já gravados sem o marcador podem ser reparados com `scripts/repair-session-logs.mjs` antes de carregar em hosts com semântica required-on-read.
158
- - Os candidatos de `paths` são heurísticos: apenas as chaves de argumentos documentadas alimentam a correspondência de caminhos, e a correspondência relativa ao workspace ignora maiúsculas ASCII somente quando `caseInsensitivePaths` está ativo.
159
- - Os globs são um subconjunto conservador (sem expansão de chaves) — escreva dois padrões ou use o modo regex.
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.
179
+ ## Session log repair
161
180
 
162
- ## Reparo de registros de sessão
163
-
164
- Registros de sessão gravados antes do marcador `ignorable` podem ser recusados por builds mais novos do harness (`SessionFormatUnsupportedError`). O `scripts/repair-session-logs.mjs` incluído reescreve apenas as linhas de auditoria alvo para adicionar `ignorable: true`, preservando os frames, com backups:
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 externas, sem alterar
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`). O contrato completo está no cabeçalho do script.
188
+ `--home` por padrão é `$DSH_HOME/sessions` (ou `~/.dsh/sessions`).
172
189
 
173
- ## Desenvolvimento
190
+ ## Development
174
191
 
175
192
  ```sh
176
- pnpm install # node ^22.19 || >=24
177
- pnpm run typecheck # tsc, src + tests
178
- pnpm run lint # eslint, src + tests + scripts
179
- pnpm test # vitest: 139 tests, 9 suites
180
- pnpm run test:coverage # portão de cobertura (90/80/90/90)
181
- pnpm run build # declarações tsc + bundles tsdown (lib/)
182
- pnpm run pack:check # build + pack (o artefato publicado)
183
- node scripts/check-readme-sync.mjs # portão de sincronização dos READMEs em cinco idiomas (também na CI)
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
- Veja [VERIFICATION.md](VERIFICATION.md) para o registro de verificação headless de ponta a ponta (deny bloqueando uma ferramenta de shell, ask roteado pelo seam de aprovação, `--dump-config`).
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`
187
208
 
188
- ## Contribuidores
209
+ ## Contributors
189
210
 
190
- - [@PerryLink](https://github.com/PerryLink) — criador e mantenedor: vocabulário e avaliação de regras, runtime, vigilância HMR, auditoria do registro da sessão e documentação em cinco idiomas.
191
- - [@22xuan](https://github.com/22xuan) — o relatório detalhado sobre hosts rc.6 descartando silenciosamente o marcador `ignorable` dos eventos de auditoria ([#2](https://github.com/PerryLink/dsh-permission-rules/issues/2)) e a discussão no harness upstream; a detecção de capacidade do host da v0.4.1 e a correção da documentação derivam diretamente dessa análise.
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.
192
213
 
193
214
  ## PerryLink DSH Plugin Family
194
215
 
195
- Este projeto é um dos [15 plugins do DeepSeek Harness](https://github.com/PerryLink) mantidos por [PerryLink](https://github.com/PerryLink). Se este ajuda você, os outros provavelmente também ajudarão:
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:
196
217
 
197
218
  | Plugin | One-liner |
198
219
  |---|---|
@@ -212,6 +233,6 @@ Este projeto é um dos [15 plugins do DeepSeek Harness](https://github.com/Perry
212
233
  | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Plugin-development knowledge base as an on-demand agent skill |
213
234
  | [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH |
214
235
 
215
- ## Licença
236
+ ## License
216
237
 
217
238
  [Apache License 2.0](LICENSE) © 2026 dsh-permission-rules contributors