@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 +15 -0
- package/engine/hooks/shell.js +22 -3
- package/package.json +1 -1
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
|
package/engine/hooks/shell.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
]
|