- Canal 1024 store:
npm i -g dsh1024una vez, luegodsh1024 plugin --profile web add dsh-permission-rules(cuenta para el ranking de instalaciones de deepseek1024.com).
Reglas de permisos declarativas estilo Claude Code para DeepSeek Harness.
Las reglas deciden lo conocido. Un modelo revisor decide lo que no lo es.
| Surface | Status |
|---|---|
| Harness | DeepSeek Harness 0.1.1-rc.2 |
| Node | `^22.19.0 |
| Platforms | Todas (host + cliente web de settings) |
| Model | Cualquiera (las razones deny/ask se muestran a través de los resultados de herramienta) |
dsh-permission-rules antepone una lista ordenada de reglas allow / deny / ask a cada llamada de herramienta en la cascada tools/pre-execute — determinista, instantánea, auditable y escrita por ti en YAML plano:
denybloquea la llamada; lareasonde la regla se convierte en el error visible para el modelo.askusa la costura oficial de aprobación (montadsh-auto-reviewpara un answerer de segundo modelo, o responde un humano; sin ninguno, el harness falla cerrado).allow(y sin coincidencia) delega estrictamente víanext()— los listeners posteriores nunca se cortocircuitan.
Cada acierto y cada paso directo se registra como un evento de sesión permissionRules/decision (solo registro — nada extra se inyecta en el contexto del modelo).
- Emparejamiento rico — globs de nombre de herramienta (incl.
mcp__*), selectores de identidad de agente (main/subagent/preset:*), globs o regexes de clave/valor de argumentos (con negación!patterny una dimensión de claveabsent), globs de ruta relativos al workspace a cualquier profundidad de anidamiento, condiciones de hostwhen(variables de entorno, plataforma), y descomposición de comandos de shell (argv: palabra de comando, tokens de argumento, firma de pipeline) para emparejamiento preciso a nivel de token. - Línea base de alto riesgo integrada — un conjunto deny/ask embarcado (comandos destructivos, escalada de privilegios, descarga-y-ejecución, rutas sensibles) habilitado por defecto y añadido después de las reglas de usuario (una regla de usuario más cercana puede sobrescribirlo); se alterna con
builtin.enabled. - Archivos de reglas jerárquicos —
searchUpopcional fusiona cada.dsh/rules.yamldesde el cwd de la sesión hasta la raíz del sistema de archivos, el más cercano primero. - Despliegue en dry-run —
enforce: falseaudita lo que la política haría mientras deja pasar cada llamada. - Recarga en caliente — vigilancia Chokidar con debounce; una edición rota conserva las reglas anteriores, nunca falla.
- Fallo ruidoso — YAML inválido, acciones/campos desconocidos, globs/regexes malos, patrones propensos a backtracking o más de
maxRulesreglas fallan la carga.
# <project>/.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"- Dimensiones de coincidencia —
tools(globs, incl.mcp__*),agents(main/subagent/preset:<name>; identidad desconocida nunca coincide — falla cerrado),params(globs o regexes de clave/valor, negación!pattern, dimensión de claveabsent),paths(globs relativos al workspace extraídos a cualquier profundidad),when(globs/regexes de variablesenv+ una listaplatformcerrada), ynetwork(domains/ips/ports/schemes— globs, comodines, CIDR, rangos de puertos). - Acciones —
allow/deny/ask, evaluadas en orden de archivo, la primera coincidencia gana. - Metadatos de regla —
enabled: false(visible pero inerte),description,tags; los campos desconocidos fallan la carga. - Schema — un JSON Schema se distribuye en docs/rules-format.schema.json (autocompletado de editor vía
# yaml-language-server: $schema=...); el vocabulario completo y una línea base de 5 reglas viven en docs/rules-format.en.md.
Una política de red a nivel de proceso estilo Codex: el tráfico de subprocesos de shell fluye a través de un proxy HTTP/CONNECT local integrado, y cada conexión se decide mediante reglas de red ordenadas o mediante tres modos mapeados sobre los presets oficiales del sandbox:
-
deny-all— el preset de sandbox de solo lectura: bloquear todo el tráfico saliente. -
whitelist— el preset workspace-write: permitir los destinos listados,unlisted: ask(odeny) para el resto. -
allow-all— el preset danger-full-access: permitir todo. -
auto(por defecto) — sigue el preset del sandbox; en hosts sin el servicio de política de sandbox se resuelve aautoFallback(allow-all). -
Emparejamiento —
match.networkcondomains/ips/ports/schemes(globs, comodines, CIDR, rangos de puertos; se aceptan puertos YAML numéricos). La extracción de candidatos URL en la ruta calientetools/pre-executese dispara sobre argumentos de herramientas web y URLs embebidas en texto de comandos bash/pwsh; los destinos de loopback pueden cortocircuitar reglas según la políticaloopback. -
Auditoría — las conexiones denegadas anexan
permissionRules/networka la sesión propietaria (la misma puerta adaptativaignorable), con contadores de bloqueo e intercepciones recientes en/rules networky la página de settings.
# 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'- canal git (último
main):dsh plugin --profile web add "github:PerryLink/dsh-permission-rules#main"— el scriptpreparecompila solo con dependencias de producción. - canal npm (versiones publicadas):
dsh plugin --profile web add dsh-permission-rules. - canal tarball:
pnpm packen este repo, luegodsh plugin --profile web add ./dsh-permission-rules-<version>.tgz. - desinstalar:
dsh plugin --profile web remove dsh-permission-rules.
Todos los parámetros son campos Schemastery Config (modificables desde cordis.yml). Una sobrescritura dirigida por id reemplaza toda la fila — reafirma cada clave que necesites.
| Key | Default | Meaning |
|---|---|---|
rulesFile |
.dsh/rules.yaml |
Ubicación del archivo de reglas; relativo = resuelto contra el cwd de la sesión, absoluto = global y validado al montar |
fallbackPath |
(none) | Archivo de reglas usado cuando la detección por cwd no encuentra nada; validado al montar |
badFilePolicy |
fail |
Archivo de reglas malo: fail hace fallar la llamada pendiente ruidosamente; ignore-with-warning advierte y continúa vacío |
maxRules |
256 |
Límite duro de recuento de reglas en la cadena fuente efectiva |
maxCachedWorkspaces |
512 |
Límite duro de cargas de reglas por workspace en caché (evicción LRU) |
patternMode |
glob |
Sabor de patrón params/paths/when.env: glob o regex (los nombres de herramienta siempre son globs) |
watch |
true |
Vigilancia Chokidar + recarga al cambiar |
watchStabilityThresholdMs |
200 |
Ventana de debounce de recarga (ms) |
language |
en |
Idioma de salida de /rules: en, zh, es, pt, hi |
caseInsensitivePaths |
(win32) | Los patrones paths y la comparación de raíz del workspace ignoran mayúsculas ASCII; true en Windows |
audit |
all |
Granularidad de auditoría: all registra cada acierto Y paso directo; hits omite eventos de paso |
searchUp |
false |
Recorrer directorios padre desde el cwd y fusionar cada archivo de reglas encontrado, el más cercano primero |
maxGlobStars |
2 |
Límite duro de cuantificadores */** no acotados por patrón glob |
enforce |
true |
false = modo dry-run: los aciertos deny/ask se registran con marcador dryRun y cada llamada pasa |
allowUnmarkedAudit |
false |
Los hosts previos al marcador descartan el marcador ignorable; el plugin desactiva la auditoría de registro con una advertencia. Pon true para reactivar |
network.enabled |
true |
Interruptor maestro del proxy, la inyección de entorno y los modos por defecto de herramienta web |
network.mode |
auto |
Modo de política: auto sigue el preset del sandbox, o deny-all / whitelist / allow-all |
network.autoFallback |
allow-all |
Modo usado cuando auto no tiene servicio de política de sandbox |
network.unlisted |
ask |
Manejo en modo whitelist de destinos sin regla coincidente: ask o deny |
network.proxyBind |
127.0.0.1 |
Dirección de enlace del proxy local (solo loopback) |
network.proxyPort |
0 |
Puerto del proxy local; 0 elige un puerto efímero libre |
network.proxyMaxRecent |
100 |
Límite de registros de bloqueo recientes para la página de settings |
network.loopback |
allow |
Destinos de loopback: allow (paridad Codex) o policy |
network.injectEnv |
true |
Si se inyectan variables de entorno del proxy para subprocesos |
network.noProxy |
clear |
Manejo de NO_PROXY en subprocesos: clear aplica la política o preserve |
builtin.enabled |
true |
Línea base de alto riesgo integrada: false deshabilita por completo el conjunto deny/ask embarcado |
builtin.path |
(embarcado) | Archivo de línea base de reemplazo (absoluto, o relativo a process.cwd()); validado al montar |
| Surface | Kind | Notes |
|---|---|---|
tools/pre-execute |
listener | Reglas allow/deny/ask de primera coincidencia + extracción de candidatos URL de red |
/rules |
command | list · reload · decisions [n] · test <tool> <json> |
permissionRules/decision |
event | Auditoría solo de registro para cada acierto y paso directo |
permissionRules/network |
event | Auditoría de capa de proxy para conexiones bloqueadas |
| HTTP/CONNECT proxy | service | Proxy local integrado que gobierna el tráfico de subprocesos de shell |
| settings page | client | Editor de modo de red, editor de reglas, contadores de bloqueo, intercepciones recientes |
/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 <tool> <json> dry-evaluate the rules against a hypothetical call/rules test también acepta banderas iniciales: --cwd <dir>, --env KEY=VALUE (repetible), --agent <selector> (repetible) y --platform <name>. En cadenas multi-archivo (p. ej. searchUp), cada línea de regla listada se atribuye a su propio archivo fuente.
- Permissions: el manifiesto de workshop declara
files:read,files:watch,files:write,session:appendynetwork:outbound. Las decisionesaskusan la costura oficial de aprobación — nada se reimplementa ni se evade. - Data: los archivos de reglas se leen del disco; no se escribe ningún dato de reglas. Sin llamadas al modelo, sin subagentes revisores.
- Session log:
permissionRules/decisionnunca se inyecta en el contexto del modelo y se anexa con el marcadorignorable: truedel sobre, de modo que cualquier build del harness carga el registro.
- Política, no kernel. Los candidatos
pathsprovienen solo de un conjunto documentado de claves de argumento (a cualquier profundidad, con tope), y solo coinciden las rutas relativas al workspace. - Aquí no hay revisor. El plugin nunca genera subagentes ni llama modelos — producir una decisión
askes el fin de su trabajo. - Sin cambios de sandbox. La política de sandbox a nivel de SO pertenece a la costura del sandbox, no a este plugin.
- Rechazo ruidoso de mala configuración. Campos YAML desconocidos, acciones desconocidas y patrones malos se rechazan al cargar.
- Límites de backtracking. Los patrones glob se limitan a
maxGlobStarsexpansiones de estrella no acotadas; los patrones regex rechazan cuantificadores anidados no acotados y alternancias literales solapadas cuantificadas.
- Marcador de auditoría en hosts previos al marcador o que rechazan eventos.
permissionRules/decisionse anexa conignorable: true; los hosts cuyoSession.appendes anterior al marcador (las líneas0.1.0-rc.1–rc.7y0.1.1-rc.1–rc.7) lo descartan silenciosamente, y la línea0.1.2-alpharechaza eventos de plugin al leerlos incluso marcados — el runtime detecta ambos antes del primer append y desactiva la auditoría de registro con una advertencia única. PonallowUnmarkedAudit: truepara reactivar; repara registros ya escritos conscripts/repair-session-logs.mjs(su modostripelimina filas de auditoría donde el marcador no ayuda). - Los candidatos de ruta son heurísticos. Solo las claves de argumento documentadas alimentan el emparejamiento de rutas, y el emparejamiento relativo al workspace es insensible a mayúsculas ASCII solo con
caseInsensitivePathsactivado. - Los globs son un subconjunto conservador. Sin expansión de llaves — escribe dos patrones, o usa modo regex.
- La guardia de backtracking de regex es estructural, no exhaustiva. Prefiere el modo glob para archivos no confiables.
dsh-permission-rulesproduceask;dsh-auto-reviewresponde en la cascadaapproval/requestcon un veredicto de segundo modelo de solo lectura (o delega en humanos). Monta ambos para el bucle completo cerrado.- Probado en integración:
permissionRules/decision→approval/asked→autoReview/verdict→approval/decided, con el revisor reemplazado por un mock guionado. - La política de aprobación
nevery toda garantía de fallo cerrado del harness oficial permanecen intactas.
Los registros de sesión escritos antes de que existiera el marcador ignorable pueden ser rechazados por builds más nuevas del harness (SessionFormatUnsupportedError). El scripts/repair-session-logs.mjs distribuido reescribe solo las filas de auditoría objetivo para llevar ignorable: true, preservando marcos, con copias de seguridad:
node scripts/repair-session-logs.mjs scan [--home DIR] # reporta filas ajenas, no cambia nada
node scripts/repair-session-logs.mjs repair [--home DIR] [--dry-run]--home por defecto es $DSH_HOME/sessions (o ~/.dsh/sessions).
pnpm install # node ^22.19 || >=24
pnpm run typecheck # tsc, src + tests
pnpm run lint # eslint, src + tests + scripts
pnpm test # vitest: 236 tests, 20 files
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)Consulta VERIFICATION.md para el registro de verificación end-to-end sin cabeza.
dsh, dsh-plugin, deepseek-harness, permission, policy, allow-deny-ask, approval, safety, network, network-policy, proxy
- @PerryLink — creador y mantenedor: vocabulario y evaluación de reglas, runtime, vigilancia HMR, auditoría de registro de sesión, política de red + proxy, y la documentación en cinco idiomas.
- @22xuan — el informe detallado sobre hosts rc.6 que descartan silenciosamente el marcador
ignorabledel evento de auditoría (#2) y la discusión del harness upstream; la detección de capacidad de host en runtime v0.4.1 y la corrección de documentación se derivaron directamente de ese análisis. - @sjh9714 — propuso el corpus compartido de vectores de prueba de sintaxis de reglas (#4, #5), incluido en v0.5.1 como
docs/rule-test-vectors/, y aportó los casos límite de descomposición AST en la discusión de diseño. - @weipeng1999 — la propuesta de descomposición de comandos basada en AST (#8) detrás de la discusión de diseño.
- @alexchenzl — la solicitud de inclusión en el DSH Directory (#7).
- @zl190 — informó y verificó la brecha de compatibilidad del harness
0.1.0-rc.7(PR #9). - @cuohua — informó de que la línea
0.1.1-rcsigue descartando el marcadorignorableaunque la compuerta de versión solo cubría0.1.0(#11); la compuerta ampliada surgió directamente de ese análisis.
Este proyecto es uno de los 33 complementos de DeepSeek Harness mantenidos por PerryLink. Si este te ayuda, probablemente los demás también:
| Plugin | One-liner |
|---|---|
| dsh-dsh-auto-review | Auto-revisión de segundo modelo en la cadena de aprobación, con cierre en fallo por defecto |
| dsh-dsh-background-agents | Agentes hijos en segundo plano durables con barra lateral de UI web, mensajería e interrupción |
| dsh-dsh-budget | Gobernanza de costes para DeepSeek Harness: presupuestos, carbono y latencia en un panel. |
| dsh-dsh-checkpoint-rewind | Equivalente a /rewind de Claude Code: instantáneas, bifurcaciones de sesión, restauración de un solo uso |
| dsh-dsh-claude-move | Migra sesiones, memoria, habilidades y CLAUDE.md de Claude Code a DSH |
| dsh-dsh-click | Control de escritorio nativo multiplataforma para DeepSeek Harness — Windows primero. |
| dsh-dsh-composer-history | Historial de entrada estilo terminal para el compositor web: flechas, búsqueda Ctrl+R |
| dsh-dsh-data-quality | Comprobaciones de calidad de datasets y verificación de citas (el puente numérico opcional consumido aquí) |
| dsh-dsh-defend | Defensa contra inyección de prompts, jailbreak y fuga de secretos para DeepSeek Harness. |
| dsh-dsh-doublecheck | Guardián de disciplina de ingeniería: interrogatorio de requisitos, puertas de pruebas, revisión adversaria |
| dsh-dsh-draw | Enrutamiento unificado de generación de imágenes estáticas para DeepSeek Harness. |
| dsh-dsh-fast | Diagnóstico de rendimiento de solo lectura para DeepSeek Harness. |
| dsh-dsh-fund-research | Informes de investigación deterministas para fondos mutuos públicos chinos |
| dsh-dsh-github | Integración de PR/issues de GitHub para DSH, cada escritura controlada por aprobación |
| dsh-dsh-industry-research | Orquestación de investigación sectorial que sella sus entregables mediante el ctx.researchReport.assemble de este plugin |
| dsh-dsh-library | Base de conocimiento documental local para DeepSeek Harness. |
| dsh-dsh-local-ai | Integración de modelos locales (Ollama) para DeepSeek Harness. |
| dsh-dsh-lsp-actions | Diagnósticos, formato, autocompletado, acciones de código y renombrado LSP sobre servidores de lenguaje |
| dsh-dsh-mask | Middleware de enmascaramiento de PII: anonimiza en el límite del modelo, restaura en la capa de visualización |
| dsh-dsh-mcp-panel | Panel de tiempo de ejecución MCP de solo lectura: comando /mcp + pestaña Settings con estado, herramientas y errores |
| dsh-dsh-memento | Memoria entre sesiones controlada por aprobación: costura ctx.memory + SQLite + herramienta de memoria |
| dsh-dsh-observe | Exportador de observabilidad OpenTelemetry y Langfuse para DeepSeek Harness. |
| dsh-dsh-output-styles | Cambio de estilo en tiempo de ejecución equivalente a outputStyles de Claude Code |
| dsh-dsh-plugin-guide | Base de conocimiento de desarrollo de plugins como habilidad de agente bajo demanda |
| dsh-dsh-research-report | Motor de informes de investigación verificables con evidencia direccionada por contenido |
| dsh-dsh-score | Puntuación de calidad multidimensional para plugins de DeepSeek Harness. |
| dsh-dsh-session-pin | Fija sesiones en la barra lateral web con orden durable |
| dsh-dsh-session-sync | Sincronización de sesiones entre dispositivos para DeepSeek Harness — un espejo git dedicado de tu almacén de sesiones. |
| dsh-dsh-skill-pack-security | Paquete de habilidades de auditoría de seguridad: escaneo de secretos, revisión de dependencias y cadena de suministro |
| dsh-dsh-talk | Bucle de sesión con voz para DeepSeek Harness: háblale y escucha su respuesta. |
| dsh-dsh-test-drive | Pruebas de instalación y humo aisladas para plugins de DeepSeek Harness. |
| dsh-dsh-translate | Traducción de parámetros entre proveedores y reparación determinista de JSON para DeepSeek Harness. |
Apache License 2.0 © 2026 dsh-permission-rules contributors