817a8cd5d1
La cartella aveva dentro solo rules/ e i settings: nessun posto dove mettere una skill, un hook o un piano. Ora ha lo scheletro completo e un .claude/CLAUDE.md che spiega cosa va dove — non duplica CLAUDE.md di progetto, che resta quello che comanda. Due skill locali (le altre restano globali in ~/.claude/skills/): - /preventivo — la catena agent.ts → schema.ts → assemble.ts → ProposalDeck e i tre modi di romperla, di cui uno solo fa rumore. Nessun prompt di generazione qui dentro: quello vive in agent.ts ed e' l'unico. Porta check-profilo.sh. - /audit — guida scripts/audit-fonti.ts, nuovo, che mette in moto le cinque fonti di src/lib/audit/sources/, in prod dal 2026-08-19 ma mai chiamate da nessuno. Provate su giojello.com: 5 su 5, 42,7 s, PageSpeed mobile 58 / desktop 93. Due hook, provati a mano (6 casi il primo, 5 il secondo): - guardia-migration.sh BLOCCA l'SQL distruttivo sulle entita' protette — il vincolo Data Safety (LOCKED) fatto rispettare dalla macchina invece che dalla memoria. - guardia-token.sh AVVISA sulle classi Tailwind grezze. Non blocca: con ~450 occorrenze di debito, bloccare lo renderebbe un ostacolo da disattivare. I tre piani di v2.5 entrano nel repo: stavano solo in ~/.claude/plans/ e STATE.md avvertiva che senza quelli la milestone non era ricostruibile. Passati al setaccio per credenziali prima di committarli. Corretta in rules/memory-discipline.md la chiave della memoria persistente: e' …-Vault-IAMCAVALLI-hub, non quella del workspace. Sedici file stavano nella prima, la regola indicava la seconda. Impeccable resta abilitato solo a livello globale: fuori da settings.json locale. Nessun tocco al prodotto. Build e lint verdi, lint identico al baseline. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
62 lines
2.0 KiB
Bash
Executable File
62 lines
2.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# PreToolUse su Write/Edit — vincolo Data Safety (LOCKED) di ../../CLAUDE.md.
|
|
#
|
|
# Blocca la scrittura di una migration che cancella dati dalle entita' protette.
|
|
# Non e' una prova: e' una rete. Un DROP scritto in modo esotico puo' passare —
|
|
# la revisione a occhio dell'SQL resta obbligatoria.
|
|
#
|
|
# exit 0 = passa · exit 2 = bloccato, il messaggio su stderr torna a Claude.
|
|
set -uo pipefail
|
|
|
|
INPUT=$(cat)
|
|
FILE=$(printf '%s' "$INPUT" | jq -r '.tool_input.file_path // empty')
|
|
|
|
# Fuori da src/db/migrations/ questo hook non ha voce in capitolo.
|
|
case "$FILE" in
|
|
*src/db/migrations/*) ;;
|
|
*) exit 0 ;;
|
|
esac
|
|
|
|
# Write porta `content`, Edit porta `new_string`. MultiEdit porta un array.
|
|
SQL=$(printf '%s' "$INPUT" | jq -r '
|
|
[ .tool_input.content?,
|
|
.tool_input.new_string?,
|
|
(.tool_input.edits? // [] | .[].new_string?)
|
|
] | map(select(. != null)) | join("\n")
|
|
')
|
|
[ -z "$SQL" ] && exit 0
|
|
|
|
PROTETTE='clients|projects|payments|phases'
|
|
|
|
# Via i commenti, tutto minuscolo, una riga per statement: cosi' "DROP" e il nome
|
|
# della tabella devono stare nella STESSA istruzione per far scattare il blocco.
|
|
PULITO=$(printf '%s' "$SQL" \
|
|
| sed -E 's/--.*$//' \
|
|
| tr '\n' ' ' \
|
|
| sed -E 's;/\*[^*]*\*+([^/*][^*]*\*+)*/; ;g' \
|
|
| tr '[:upper:]' '[:lower:]' \
|
|
| tr ';' '\n')
|
|
|
|
COLPEVOLI=$(printf '%s\n' "$PULITO" \
|
|
| grep -E 'drop[[:space:]]+table|drop[[:space:]]+column|truncate|delete[[:space:]]+from' \
|
|
| grep -E "\\b($PROTETTE)\\b" || true)
|
|
|
|
if [ -n "$COLPEVOLI" ]; then
|
|
{
|
|
echo "BLOCCATO — Data Safety (LOCKED, ../CLAUDE.md)."
|
|
echo
|
|
echo "Questa migration cancella dati da un'entita' protetta (clients, projects,"
|
|
echo "payments, phases). Le migration sono additive: si aggiungono colonne e"
|
|
echo "tabelle, non si tolgono righe."
|
|
echo
|
|
echo "Istruzioni incriminate:"
|
|
printf '%s\n' "$COLPEVOLI" | sed 's/^[[:space:]]*/ · /'
|
|
echo
|
|
echo "Se la rimozione serve davvero, e' una decisione da confermare a voce con"
|
|
echo "l'utente prima di scriverla — non da aggirare qui."
|
|
} >&2
|
|
exit 2
|
|
fi
|
|
|
|
exit 0
|