@ingeniomaps/cauce 0.61.0 → 0.62.0

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 CHANGED
@@ -14,6 +14,21 @@ desde este repositorio no va, porque el que lee no puede actuar sobre eso. Cuand
14
14
  unas pocas líneas casi siempre es porque cuenta cómo se descubrió el problema o por qué se eligió el
15
15
  diseño — eso vive en el commit y en el código.
16
16
 
17
+ ## [0.62.0] - 2026-09-06
18
+
19
+ ### Corregido
20
+
21
+ - **Tres reglas de `destructive` reconocen el comando aunque venga envuelto.** Decidían dónde termina
22
+ una palabra admitiendo sólo un espacio, el principio o el fin, y en un shell una palabra también
23
+ termina en `;`, `&`, `|`, `)` y en una comilla. Con eso `rm -rf /; echo listo` **pasaba** —sin una
24
+ sola comilla: lo que decidía era el espacio antes del punto y coma— y las tres se esquivaban dentro de
25
+ `bash -c`, `sh -c`, `eval` o un subshell, donde lo de adentro sí se ejecuta. Las tres son `rm -rf`
26
+ sobre `/`, home o `..`; `git checkout -- .` y su `restore`; y `mkfs`/`shred`. Las otras cinco de la
27
+ tabla ya estaban sanas. **Qué cambia para vos**: algún comando que ayer pasaba ahora se frena, y es el
28
+ que la regla siempre dijo que frenaba. Lo que **no** cambia es lo corriente: `rm -rf /srv/cache`,
29
+ `rm -r build/cache` y `git checkout -- src/app.js` siguen pasando — revertir un archivo nombrado
30
+ nunca fue lo que esta regla toca.
31
+
17
32
  ## [0.61.0] - 2026-09-06
18
33
 
19
34
  ### Agregado
@@ -13,6 +13,23 @@ const {
13
13
  writableRoots, outsideRoots, DECLARE_IT,
14
14
  } = require('./input')
15
15
 
16
+ // Dónde empieza y dónde termina una palabra dentro de un comando. Tres reglas de la tabla de abajo lo
17
+ // decidían por su cuenta admitiendo sólo un espacio, el principio o el fin, y en un shell una palabra
18
+ // también termina en `;`, `&`, `|`, `)` y en una comilla. Con eso `rm -rf /; echo listo` pasaba —sin una
19
+ // sola comilla, porque lo que decidía era el espacio antes del punto y coma— y las tres se esquivaban
20
+ // envueltas en `bash -c`, `sh -c`, `eval` o un subshell, donde lo de adentro sí se ejecuta.
21
+ //
22
+ // Son dos cierres y no uno, y la diferencia es lo que evita frenar de más. PALABRA termina una palabra:
23
+ // el espacio cuenta, porque después de una ruta un espacio la termina. COMANDO termina el comando: ahí
24
+ // el espacio **no** cuenta, porque `--` seguido de un espacio significa que viene un archivo nombrado, y
25
+ // revertir un archivo nombrado es trabajo corriente que la regla no toca.
26
+ //
27
+ // Y el `\s*` va adentro del lookahead. Afuera, el cuantificador retrocede a vacío y el lookahead ve el
28
+ // espacio que él mismo habría consumido, así que `git checkout -- src/app.js` empieza a caer.
29
+ const ANTES = String.raw`(?:^|[\s;&|('"\`])`
30
+ const PALABRA = String.raw`$|[\s;&|)'"\`]`
31
+ const COMANDO = String.raw`$|[;&|)'"\`]`
32
+
16
33
  // Un mensaje de commit es dato, no código. `git commit -m "fix: bloquear git push --force"` disparaba
17
34
  // el guard de publicación, y lo mismo `rm -rf /` nombrado en una explicación; con el heredoc que se usa
18
35
  // para un mensaje largo, el cuerpo entero entra en el comando, así que la línea que arregla esto no se
@@ -61,7 +78,8 @@ function destructive(input) {
61
78
  [
62
79
  // `git restore .` no lleva `--` y destruye igual: comprobado en `git restore --help` (git 2.43.0),
63
80
  // que restaura el working tree por defecto y toma el pathspec sin separador.
64
- /\bgit\s+(?:checkout|restore)\s+(?:[^;&|]*?\s)?(?:--\s*(?:$|[;&|])|(?:--\s+)?(?:\.|\*|:\/)\s*(?:$|[;&|]))/,
81
+ new RegExp(String.raw`\bgit\s+(?:checkout|restore)\s+(?:[^;&|]*?\s)?`
82
+ + String.raw`(?:--(?=\s*(?:${COMANDO}))|(?:--\s+)?(?:\.|\*|:\/)(?=\s*(?:${COMANDO})))`),
65
83
  "'git checkout -- .' revierte todo lo no commiteado del directorio, no sólo lo que estás mirando. "
66
84
  + 'Nombrá el archivo, o commiteá lo que quieras conservar antes.',
67
85
  ],
@@ -74,11 +92,12 @@ function destructive(input) {
74
92
  'Detener un stack Compose puede interrumpir servicios compartidos.',
75
93
  ],
76
94
  [
77
- /(?:^|\s)(?:mkfs\S*|shred)\s|\bdd\s+[^;&|]*\bof=\/dev\/|>\s*\/dev\/(?:sd|nvme|disk)/,
95
+ new RegExp(ANTES + String.raw`(?:mkfs\S*|shred)\s`
96
+ + String.raw`|\bdd\s+[^;&|]*\bof=\/dev\/|>\s*\/dev\/(?:sd|nvme|disk)`),
78
97
  'Operación destructiva sobre disco o dispositivo.',
79
98
  ],
80
99
  [
81
- /\brm\s+(?:-[^\s]*r[^\s]*\s+)+(?:\/\*?|~\/?|\$HOME|\.\.)(?:\s|$)/,
100
+ new RegExp(String.raw`\brm\s+(?:-[^\s]*r[^\s]*\s+)+(?:\/\*?|~\/?|\$HOME|\.\.)(?=${PALABRA})`),
82
101
  "'rm -r' sobre /, home o el directorio padre es catastrófico.",
83
102
  ],
84
103
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ingeniomaps/cauce",
3
- "version": "0.61.0",
3
+ "version": "0.62.0",
4
4
  "description": "Sistema portable de planificación y ejecución verificable para cualquier proyecto",
5
5
  "keywords": [
6
6
  "planning",