- 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>
5.4 KiB
Template — Configuración de permisos para Claude Code
Setup recomendado para
.claude/settings.jsony.claude/settings.local.jsonen 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 *)—rmestá afuera porque incluso unrm archivo.txtpuede 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 subiendoBash(curl *)yBash(wget *)— afuera porque pueden bajar y ejecutar código de internetBash(chmod *)yBash(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:
- Agregalo a
.claude/settings.local.json - Reiniciá la sesión de Claude Code
Cuando un comando de la lista te causó un problema:
- Sacalo de la lista
- 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:
- Que clone el repo (recibe
.claude/settings.jsonautomáticamente) - Que cree su propio
.claude/settings.local.jsondesde este template - Que NO copie el de otro dev — cada uno aprueba lo que usa, no lo que el otro usa
- Verificar que entendió la diferencia entre
allow(su decisión) ydeny(decisión del equipo)
Errores comunes a vigilar en miembros nuevos:
- Copiar el
settings.local.jsonde otro y agregarse cosas "por las dudas" - Comitear accidentalmente el
settings.local.json(verificar gitignore antes de su primer commit) - Usar
--dangerously-skip-permissionsporque "es más rápido" (ver AP.7)