Files
inq-roi-simulador-web/methodology/TEMPLATES/CLAUDE_PERMISSIONS_TEMPLATE.md
Marcos Benítez 2f4633a33c feat(sprint-1.5): rediseño visual PDF ROI + identidad InQ (Etapas 4-7)
- Header/footer compartidos con paleta InQ naranja en los 3 PDFs (Etapa 4)
- Layout híbrido portrait+landscape en PDFs Actual/Automatizado:
  página 2 landscape para diagrama BPMN heatmap (Etapa 5)
- Página 1 PDF ROI rediseñada: header denso, banner narrativo, KPI Hero
  con gradiente naranja→magenta, grid 2×2 de KPIs secundarios, Top 3
  actividades por ahorro (Etapa 6)
- Páginas 2-5 PDF ROI con identidad InQ: tabla con paleta naranja,
  análisis del ahorro, nota metodológica, trayectoria del ahorro
  acumulado con gráfico SVG nativo (Etapa 7)
- 500 tests verdes (+ 34 tests nuevos del Sprint 1.5)
- BACKLOG.md, TECH_DEBT.md, OBSERVATIONS.md: sistema de planificación
  reemplaza TODO.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 20:45:01 -03:00

5.4 KiB

Template — Configuración de permisos para Claude Code

Setup recomendado para .claude/settings.json y .claude/settings.local.json en cualquier proyecto.

Implementa el Patrón D.4 (Permisos del agente versionados).


Estructura final esperada en tu repo

repo/
├── .claude/
│   ├── settings.json          ← versionado: solo deny patterns
│   └── settings.local.json    ← gitignored: tus allow personales
└── .gitignore                 ← incluye .claude/settings.local.json

Archivo 1: .claude/settings.json (versionado, compartido con el equipo)

Contiene únicamente patrones deny. Son las protecciones que aplicamos a todos.

{
  "permissions": {
    "deny": [
      "Bash(rm -rf /)",
      "Bash(rm -rf /*)",
      "Bash(rm -rf ~)",
      "Bash(rm -rf ~/*)",
      "Bash(rm -rf .git)",
      "Bash(rm -rf .git/*)",
      "Bash(git push --force *)",
      "Bash(git push -f *)",
      "Bash(git reset --hard *)",
      "Bash(git clean -fdx *)",
      "Bash(npm publish *)",
      "Bash(npm publish)"
    ]
  }
}

Si tu proyecto usa otras herramientas críticas, agregá los denies correspondientes. Ejemplos:

  • Si usás Postgres: "Bash(dropdb *)", "Bash(psql * -c \"DROP DATABASE *\")"
  • Si usás Docker: "Bash(docker system prune *)"
  • Si usás Terraform: "Bash(terraform destroy *)"
  • Si usás kubectl: "Bash(kubectl delete namespace *)"

Archivo 2: .claude/settings.local.json (gitignored, personal)

Contiene únicamente patrones allow. Son los comandos que pre-aprobás para tu propio uso.

Punto de partida recomendado (ajustá a tu workflow):

{
  "permissions": {
    "allow": [
      "Bash(npm install)",
      "Bash(npm install *)",
      "Bash(npm run *)",
      "Bash(npm test)",
      "Bash(npm test *)",
      "Bash(npm run build)",
      "Bash(npm run lint)",
      "Bash(npm run dev)",
      "Bash(npm run typecheck)",
      "Bash(npx *)",
      "Bash(git add *)",
      "Bash(git commit *)",
      "Bash(git status)",
      "Bash(git diff *)",
      "Bash(git log *)",
      "Bash(git tag *)",
      "Bash(git branch *)",
      "Bash(git checkout *)",
      "Bash(git stash *)",
      "Bash(ls *)",
      "Bash(cat *)",
      "Bash(mkdir *)",
      "Bash(cp *)",
      "Bash(mv *)",
      "Bash(grep *)",
      "Bash(find *)",
      "Bash(tar *)"
    ]
  }
}

Lo que NO incluí a propósito:

  • Bash(rm *)rm está afuera porque incluso un rm archivo.txt puede ser destructivo si el archivo no estaba en git. Si querés permitirlo, ponelo explícito.
  • Bash(git push *) — el push interactivo te da el momento para revisar qué estás subiendo
  • Bash(curl *) y Bash(wget *) — afuera porque pueden bajar y ejecutar código de internet
  • Bash(chmod *) y Bash(chown *) — cambios de permisos quedan fuera para no automatizar accidentalmente

Si alguno de estos te resulta valioso para tu flujo, agregalo conscientemente.


Archivo 3: .gitignore (asegurate que esté)

# Claude Code local settings
.claude/settings.local.json

Setup inicial (paso a paso)

Desde la raíz del repo:

# 1. Crear directorio
mkdir -p .claude

# 2. Crear settings.json (versionado)
cat > .claude/settings.json << 'EOF'
{
  "permissions": {
    "deny": [
      "Bash(rm -rf /)",
      "Bash(rm -rf /*)",
      "Bash(rm -rf ~)",
      "Bash(rm -rf ~/*)",
      "Bash(rm -rf .git)",
      "Bash(rm -rf .git/*)",
      "Bash(git push --force *)",
      "Bash(git push -f *)",
      "Bash(git reset --hard *)",
      "Bash(git clean -fdx *)",
      "Bash(npm publish *)",
      "Bash(npm publish)"
    ]
  }
}
EOF

# 3. Crear settings.local.json (personal, gitignored)
# [pegar contenido del Archivo 2 arriba]

# 4. Asegurar gitignore
grep "settings.local.json" .gitignore || echo ".claude/settings.local.json" >> .gitignore

# 5. Comitear solo el compartido
git add .claude/settings.json .gitignore
git commit -m "chore(claude-code): configurar permisos compartidos

- settings.json: deny patterns críticos
- settings.local.json en gitignore (cada dev configura sus allows)

Refs: methodology/PATTERNS.md D.4"

Mantenimiento del archivo personal

Cuando ver que aprobás repetidamente un comando que no está en la lista:

  1. Agregalo a .claude/settings.local.json
  2. Reiniciá la sesión de Claude Code

Cuando un comando de la lista te causó un problema:

  1. Sacalo de la lista
  2. Aceptá la fricción ocasional como costo de la seguridad

Revisión periódica recomendada: cada 4-6 semanas, abrir settings.local.json y verificar:

  • ¿Sigo usando todos los comandos de la lista?
  • ¿Hay alguno que ya no uso y conviene sacar para reducir superficie?

Cuando empieces a transmitirle esto al equipo

Para cada miembro nuevo del equipo:

  1. Que clone el repo (recibe .claude/settings.json automáticamente)
  2. Que cree su propio .claude/settings.local.json desde este template
  3. Que NO copie el de otro dev — cada uno aprueba lo que usa, no lo que el otro usa
  4. Verificar que entendió la diferencia entre allow (su decisión) y deny (decisión del equipo)

Errores comunes a vigilar en miembros nuevos:

  • Copiar el settings.local.json de otro y agregarse cosas "por las dudas"
  • Comitear accidentalmente el settings.local.json (verificar gitignore antes de su primer commit)
  • Usar --dangerously-skip-permissions porque "es más rápido" (ver AP.7)