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/CHANGELOG.md +17 -0
- package/README.es.md +139 -118
- package/README.hi.md +141 -120
- package/README.md +111 -90
- package/README.pt.md +140 -119
- package/README.zh.md +158 -137
- package/docs/rule-test-vectors/README.md +28 -0
- package/docs/rule-test-vectors/corpus.json +109 -0
- package/lib/client.js +4 -7
- package/lib/client.js.map +1 -1
- package/lib/index.js +10 -7
- package/lib/types/client/remote.d.ts +1 -1
- package/lib/types/client/section.d.ts +2 -2
- package/lib/types/config.d.ts +3 -3
- package/lib/types/index.d.ts +8 -8
- package/lib/types/network.d.ts +2 -2
- package/lib/types/proxy.d.ts +2 -2
- package/lib/types/remote-service.d.ts +2 -2
- package/lib/types/runtime.d.ts +14 -11
- package/lib/types/runtime.d.ts.map +1 -1
- package/lib/types/settings.d.ts +2 -2
- package/package.json +182 -178
- package/scripts/repair-session-logs.mjs +7 -2
- package/src/client/index.ts +5 -5
- package/src/runtime.ts +10 -7
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,179 +20,200 @@
|
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
23
|
-
##
|
|
23
|
+
## Compatibility
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
|
98
93
|
|
|
99
|
-
|
|
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
|
-
|
|
99
|
+
## Configuration
|
|
102
100
|
|
|
103
|
-
|
|
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` | *(
|
|
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
|
|
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
|
-
|
|
152
|
+
## Permissions & data
|
|
134
153
|
|
|
135
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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`
|
|
187
208
|
|
|
188
|
-
##
|
|
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
|
|
191
|
-
- [@22xuan](https://github.com/22xuan) — o relatório detalhado sobre hosts rc.6 descartando silenciosamente o marcador `ignorable`
|
|
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
|
|
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
|
-
##
|
|
236
|
+
## License
|
|
216
237
|
|
|
217
238
|
[Apache License 2.0](LICENSE) © 2026 dsh-permission-rules contributors
|