<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: luijhy michael guerra flores</title>
    <description>The latest articles on DEV Community by luijhy michael guerra flores (@luijhy_michaelguerraflo).</description>
    <link>https://dev.to/luijhy_michaelguerraflo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2461991%2F862abf92-e3ec-48e8-8ac8-317b7e09e9c2.jpg</url>
      <title>DEV Community: luijhy michael guerra flores</title>
      <link>https://dev.to/luijhy_michaelguerraflo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luijhy_michaelguerraflo"/>
    <language>en</language>
    <item>
      <title>3 hooks de Claude Code que evitan desastres (con código)</title>
      <dc:creator>luijhy michael guerra flores</dc:creator>
      <pubDate>Thu, 08 Oct 2026 04:57:47 +0000</pubDate>
      <link>https://dev.to/luijhy_michaelguerraflo/3-hooks-de-claude-code-que-evitan-desastres-con-codigo-2h3d</link>
      <guid>https://dev.to/luijhy_michaelguerraflo/3-hooks-de-claude-code-que-evitan-desastres-con-codigo-2h3d</guid>
      <description>&lt;p&gt;Claude Code es muy bueno ejecutando comandos. Ese es justo el problema cuando ejecuta el comando equivocado. Los &lt;strong&gt;hooks&lt;/strong&gt; te dejan poner una red de seguridad que corre &lt;strong&gt;antes&lt;/strong&gt; de cada acción, sin depender de que el modelo "recuerde" tus reglas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funcionan (en 30 segundos)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Se configuran en &lt;code&gt;.claude/settings.json&lt;/code&gt;, por evento (&lt;code&gt;PreToolUse&lt;/code&gt;, &lt;code&gt;PostToolUse&lt;/code&gt;, &lt;code&gt;Notification&lt;/code&gt;…) y por herramienta (&lt;code&gt;Bash&lt;/code&gt;, &lt;code&gt;Write|Edit&lt;/code&gt;…).&lt;/li&gt;
&lt;li&gt;El hook recibe el evento como JSON por &lt;strong&gt;stdin&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Si sale con &lt;strong&gt;código 2&lt;/strong&gt;, la acción se bloquea y el texto de &lt;strong&gt;stderr&lt;/strong&gt; se le devuelve a Claude como motivo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Bloquear comandos destructivos
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;.claude/hooks/bloquear-comandos-peligrosos.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nv"&gt;entrada&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;patrones&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
  &lt;span class="s1"&gt;'git[[:space:]]+push[[:space:]].*(--force([^-]|$)|-f([[:space:]"]|$))'&lt;/span&gt;
  &lt;span class="s1"&gt;'git[[:space:]]+reset[[:space:]]+--hard'&lt;/span&gt;
  &lt;span class="s1"&gt;'DROP[[:space:]]+(TABLE|DATABASE)'&lt;/span&gt;
  &lt;span class="s1"&gt;'(curl|wget)[^|]*\|[[:space:]]*(sudo[[:space:]]+)?(ba)?sh'&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;patron &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;patrones&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  if &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$entrada&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qiE&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$patron&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Bloqueado: coincide con un patrón peligroso. Pide al usuario que lo ejecute."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
    &lt;span class="nb"&gt;exit &lt;/span&gt;2
  &lt;span class="k"&gt;fi
done
&lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fíjate en el detalle de &lt;code&gt;--force([^-]|$)&lt;/code&gt;: bloquea &lt;code&gt;--force&lt;/code&gt; pero deja pasar &lt;code&gt;--force-with-lease&lt;/code&gt;, que es la forma segura.&lt;br&gt;
&lt;code&gt;.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PreToolUse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;$CLAUDE_PROJECT_DIR&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;/.claude/hooks/bloquear-comandos-peligrosos.sh"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No olvides &lt;code&gt;chmod +x&lt;/code&gt; y pruébalo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"tool_input":{"command":"git reset --hard"}}'&lt;/span&gt; | .claude/hooks/bloquear-comandos-peligrosos.sh&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;span class="c"&gt;# → 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Detectar secretos antes de escribirlos
&lt;/h2&gt;

&lt;p&gt;Mismo patrón, pero con &lt;code&gt;matcher: "Write|Edit|MultiEdit"&lt;/code&gt; y expresiones como &lt;code&gt;AKIA[0-9A-Z]{16}&lt;/code&gt; (AWS), &lt;code&gt;sk-ant-[A-Za-z0-9_-]{20,}&lt;/code&gt; (Anthropic) o &lt;code&gt;gh[pousr]_[A-Za-z0-9]{36,}&lt;/code&gt; (GitHub). Si Claude intenta escribir una clave, recibe el mensaje "usa una variable de entorno y documéntala en &lt;code&gt;.env.example&lt;/code&gt;" y corrige solo.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Formatear después de cada edición
&lt;/h2&gt;

&lt;p&gt;Un &lt;code&gt;PostToolUse&lt;/code&gt; que lee &lt;code&gt;file_path&lt;/code&gt; del JSON y corre el Prettier/Biome &lt;strong&gt;del proyecto&lt;/strong&gt; (&lt;code&gt;node_modules/.bin/prettier&lt;/code&gt;). Siempre sale con 0: nunca bloquea, solo ordena.&lt;/p&gt;

&lt;h2&gt;
  
  
  Código gratis
&lt;/h2&gt;

&lt;p&gt;Los hooks 1 y 2 completos, con pruebas que corren en Linux y macOS, están en GitHub con licencia MIT: &lt;a href="https://github.com/kailucho/claude-code-hooks-seguridad" rel="noopener noreferrer"&gt;https://github.com/kailucho/claude-code-hooks-seguridad&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Si quieres todo armado
&lt;/h2&gt;

&lt;p&gt;El &lt;strong&gt;Kit Claude Code en español&lt;/strong&gt; (US$9) trae los tres hooks y uno de notificaciones, 6 skills en español (&lt;code&gt;/commit&lt;/code&gt;, &lt;code&gt;/pr&lt;/code&gt;, &lt;code&gt;/revisar&lt;/code&gt;, &lt;code&gt;/tests&lt;/code&gt;, &lt;code&gt;/plan&lt;/code&gt;, &lt;code&gt;/depurar&lt;/code&gt;), plantillas &lt;code&gt;CLAUDE.md&lt;/code&gt; para React, Node y GraphQL y presets de permisos: &lt;a href="https://luijhy.gumroad.com/l/kit-claude-code-es" rel="noopener noreferrer"&gt;https://luijhy.gumroad.com/l/kit-claude-code-es&lt;/a&gt;&lt;br&gt;
¿Qué otro comando bloquearías tú? Te leo en los comentarios.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
