Copy-paste muundo wa hook kutoka uzalishaji kwa ajili ya uthibitisho wa pre-commit, PII scanning, utekelezaji wa ulinzi, na kumbukumbu ya kikao Miaka sita iliyopita nilikuwa na kumbukumbu ya kuvutia kwenye skrini yangu. Ilikuwa inasema: "Je, umepiga lint? Uliangalia shamba? Uliangalia kile ulichomwa?" Kila Claude Code kikao, moja na moja checks manually. Kila wakati Claude kuhariri faili, mimi kubadilisha kwa terminal nyingine na kuendesha formatter. Kila wakati ilitumia Bash amri, mimi kuangalia juu ya output na kujiuliza kama kitu kilichohusisha uzalishaji. Kila wakati alijaribu kufanya, nilijaribu kuangalia mimi alikuwa juu ya tawi sahihi kwanza. Kumbukumbu ya kuvutia haikuwa tatizo. tatizo lilikuwa kwamba nilikuwa nikifanya kazi ya kompyuta. Mifano ya mara kwa mara ya kukabiliana na kila hatua, mamia ya mara kwa siku. Hiyo ni nini script ni kwa ajili ya. Kisha nilijifunza kwamba Claude Code hufungua matukio. Kila hatua moja. Piga simu za zana, marekebisho ya faili, amri za Bash, mwanzo wa mstari, mwisho wa mstari. Wote wao. Na unaweza kuingilia yoyote yao na script ya shell. Hapa chini unaweza kusoma mifano minane ya baadhi ya nukuu za kukumbukwa na kwa hakika za kushangaza zilizowahi kutolewa na wanasiasa wa Malysia katika miaka ya hivi karibuni: Mfumo wa tukio hakuna mtu anayezungumzia Claude Code sio tu interface ya mazungumzo ambayo huandika msimbo. Chini ya uso, hufanya mzunguko wa mzunguko wa maisha. Mtumiaji hutoa mwito. Claude anachagua chombo gani cha kutumia. Chombo kinafanya kazi. Claude anaona matokeo. Kwa kila mabadiliko katika mzunguko huo, Claude Code hufungua tukio. Matukio mawili ambayo yana maana zaidi: Msimamizi wako anaweza kuangalia wito na kurudi hukumu ya JSON: kuruhusu, kukataa, au kukaa kimya na kuruhusu mtiririko wa kuruhusu wa kawaida kushughulikia. PostToolUse moto baada ya wito wa chombo ni mafanikio. mpangaji wako anapata output kamili. Fanya chochote unachotaka na hilo. Lint faili. Log amri. Tuma webhook. Chombo tayari kilichotumika, hivyo hii ni reactive, si kuzuia. Wafanyabiashara hao wameandikwa katika Wanaweza kuwa amri za shell, vituo vya mwisho vya HTTP, au maombi ya LLM. Ninatumia amri za shell kwa sababu ni haraka, zinaweza kufutwa, na hazihitaji miundombinu. .claude/settings.json interface yote ni: Claude Code pipes JSON kwa stdin ya script yako. script yako chaguo kuandika JSON kwa stdout. Hiyo ni. Ikiwa script yako kuondoka bila output, Claude Code inaendelea kawaida. Mchoro 1: Mchoro wa kuzuia machafuko Niliandika hii baada ya Claude kujaribu mhariri wa kujenga ambayo ilitokea kuwa na simlink kwenye folda yangu ya nyumbani. Hakuna kitu mbaya kilichotokea kwa sababu nilipata katika barua ya ruhusa. Lakini sikuwa na haja ya kukamata. mashine inapaswa kukamata. rm -rf #!/bin/bash # .claude/hooks/guard.sh # Blocks destructive commands before they execute CMD=$(jq -r '.tool_input.command // empty') [ -z "$CMD" ] && exit 0 # Patterns I never want to run unreviewed BLOCKED_PATTERNS=( 'rm -rf' 'rm -r /' 'DROP TABLE' 'DROP DATABASE' 'truncate ' '> /dev/sd' 'mkfs\.' 'dd if=' ) for pattern in "${BLOCKED_PATTERNS[@]}"; do if echo "$CMD" | grep -qi "$pattern"; then jq -n --arg reason "Blocked: command matches dangerous pattern '$pattern'" '{ hookSpecificOutput: { hookEventName: "PreToolUse", permissionDecision: "deny", permissionDecisionReason: $reason } }' exit 0 fi done Aina nane. inaweza kuwa nane. Jambo ni si kutaja kila amri hatari. Jambo ni kukamata wale wewe binafsi karibu kuendesha kwa ajali. orodha yangu inaonyesha majeraha yangu. yako itakuwa kutafakari yako. Usajili wa katika : .claude/settings.json "PreToolUse": [ { "matcher": "Bash", "hooks": [{ "type": "command", "command": ".claude/hooks/guard.sh" }] } ] ya ni regex kwenye jina la chombo. Hiyo inamaanisha kwamba kuvutia hii hufungua tu amri za Bash, sio marekebisho ya faili au kusoma. matcher "Bash" Mstari wa 2 - Ujumbe ambao hauwezi kamwe kusahau Kabla ya hook hii, mchakato wangu wa kazi ulikuwa: Claude anahariri faili, ninaona format ni sahihi, naomba Claude kurekebisha, Claude huendesha formatter, na kuangalia toleo la formated. Hatua nne kwa kitu ambacho kinapaswa kuwa hatua zero. #!/bin/bash # .claude/hooks/fmt.sh # Formats files immediately after Claude edits them TOOL=$(jq -r '.tool_name // empty') [ "$TOOL" != "Edit" ] && [ "$TOOL" != "Write" ] && exit 0 FP=$(jq -r '.tool_input.file_path // .tool_input.path // empty') [ -z "$FP" ] || [ ! -f "$FP" ] && exit 0 case "${FP##*.}" in js|ts|jsx|tsx|mjs) if [ -f node_modules/.bin/prettier ]; then node_modules/.bin/prettier --write "$FP" 2>/dev/null elif command -v npx &>/dev/null; then npx prettier --write "$FP" 2>/dev/null fi ;; rs) rustfmt "$FP" 2>/dev/null ;; py) command -v ruff &>/dev/null && ruff format "$FP" 2>/dev/null command -v ruff &>/dev/null && ruff check --fix "$FP" 2>/dev/null ;; go) gofmt -w "$FP" 2>/dev/null ;; css|scss) command -v stylelint &>/dev/null && stylelint --fix "$FP" 2>/dev/null ;; esac exit 0 Toleo hili ni ya kina zaidi kuliko mfano mdogo unaweza kupata katika nyaraka. Inashughulikia kama formatter kweli kuna kabla ya kuita. Inashughulikia Prettier kupitia uendeshaji wa ndani au npx. Inaendesha wote wawili na ya kwa Python kwa sababu muundo na linting ni mambo tofauti. ruff format ruff check --fix Kujiandikisha kama PostToolUse na Matcher. Inakuja baada ya kila marekebisho ya faili. Faili ni format kabla ya Claude kusoma tena au kuhamia kwenye marekebisho ijayo. "Edit|Write" Athari ya mchanganyiko ni muhimu. Zaidi ya wiki nilipimwa. Bila hook, nilitumia wastani wa dakika 4 kwa kila kikao kuomba Claude kurekebisha matatizo ya format. Na hook, zero. Zaidi ya mikutano ya 30 kwa wiki, ambayo ni masaa mawili kurejeshwa. Mchoro wa tatu: Detector ya siri Hii inapatikana kwa sababu ya kushindwa karibu. Claude alikuwa amepiga marufuku mchanganyiko wa API, kusoma faili ya config ambayo inajumuisha kifungo cha API cha mtihani, na kuingiza kifungo katika majibu yake. Kifungo kilikuwa kwa mazingira ya uendeshaji na kilikuwa kugeuka siku inayofuata. Lakini kanuni iliniathiri. Matoleo ya chombo hupita kwa njia ya mazungumzo, kupata cached, uwezekano kupata logged. #!/bin/bash # .claude/hooks/secrets.sh # Scans tool output for credential-shaped strings OUTPUT=$(jq -r '.tool_output // empty') [ -z "$OUTPUT" ] && exit 0 ALERTS="" # AWS keys (AKIA...) echo "$OUTPUT" | grep -qE 'AKIA[0-9A-Z]{16}' && ALERTS="$ALERTS aws_key" # Generic API key patterns (long hex/base64 after common key names) echo "$OUTPUT" | grep -qiE '(api_key|apikey|secret_key|access_token|auth_token)["\x27: =]+[A-Za-z0-9+/]{20,}' && ALERTS="$ALERTS api_credential" # Private key headers echo "$OUTPUT" | grep -q 'BEGIN.*PRIVATE KEY' && ALERTS="$ALERTS private_key" # JWT tokens echo "$OUTPUT" | grep -qE 'eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.' && ALERTS="$ALERTS jwt_token" # Connection strings with passwords echo "$OUTPUT" | grep -qiE '(postgresql|mysql|mongodb|redis)://[^:]+:[^@]+@' && ALERTS="$ALERTS connection_string" if [ -n "$ALERTS" ]; then TS=$(date '+%H:%M:%S') TOOL=$(jq -r '.tool_name // unknown') echo "[$TS] SECRET_ALERT in $TOOL:$ALERTS" >> .claude/secret-alerts.log echo "WARNING: potential credential in $TOOL output ($ALERTS)" >&2 fi exit 0 Hii si mbadala kwa usimamizi sahihi wa siri. Ni tripwire. Inashughulikia mifano ya dhahiri: vifungo vya upatikanaji wa AWS, vitu ambavyo vinavyoonekana kama mamlaka ya API, vifungo vya muhimu vya kibinafsi, JWTs, vifungo vya uhusiano wa database na vidakuzi vya kuingizwa. Wakati wa kuogelea, inachukuliwa na inachapisha tahadhari kwa stderr. Haina kuzuia chochote. Kuzuia chaguo la uongo litatisha mtiririko wako. Kuingia kwenye chaguo la kweli hutoa kitu cha uchunguzi mwishoni mwa kikao. .claude/secret-alerts.log Maoni ya mara moja kwa siku. Wengi wa machapisho ni sahihi chanya (maonyesho ya mtihani, mifano ya nyaraka). Kuhusu mara moja kwa wiki, moja ni halisi ya kutosha kuhalalisha uongofu wa mamlaka au upya .gitignore. secret-alerts.log Maelezo ya 4 ya The Branch Cop mfupi, mkali, na alizaliwa kutokana na makosa ya kweli. , aliomba Claude kushinikiza ufumbuzi wa haraka, na kabla ya kurekodi kile kilichotokea. Kuendeleza ilipita. CI ilikuwa ya kijani. Hakuna uharibifu uliofanywa. Lakini ahadi haikuwa na maana ya kuingia kwenye msingi bila PR. main git push origin main #!/bin/bash # .claude/hooks/no-push-main.sh # Prevents git push to main/master/production branches CMD=$(jq -r '.tool_input.command // empty') echo "$CMD" | grep -q 'git push' || exit 0 BRANCH=$(git branch --show-current 2>/dev/null) PROTECTED="main master production release" for b in $PROTECTED; do if [ "$BRANCH" = "$b" ]; then jq -n --arg branch "$BRANCH" '{ hookSpecificOutput: { hookEventName: "PreToolUse", permissionDecision: "deny", permissionDecisionReason: ("Push to " + $branch + " blocked. Create a feature branch first.") } }' exit 0 fi done # Also block force push to any branch if echo "$CMD" | grep -qE 'push.*(-f|--force)'; then jq -n '{ hookSpecificOutput: { hookEventName: "PreToolUse", permissionDecision: "deny", permissionDecisionReason: "Force push blocked. Use --force-with-lease if you must." } }' fi Ulinzi wawili katika script moja. Hakuna shinikizo kwa mashirika yaliyohifadhiwa. Hakuna nguvu ya shinikizo kwa mashirika yoyote. Kanuni ya pili ni chaguo lakini ninaweka kwa sababu shinikizo la nguvu ni aina ya kitu ambacho kinapaswa kuhitaji kuandika amri mwenyewe, na ufahamu kamili wa kile unachofanya. Claude anashughulikia kukataa kwa huruma. Anaona sababu, inapendekeza kuunda tawi la kipengele, na huendelea kwenye njia sahihi. Mchoro wa 5 - Black Box Recorder Kila simu ya chombo. Kila input. Kila output. Timestamped na kuunganishwa na faili ya kumbukumbu. Hii ni hook mimi mara nyingi kupendekeza kwa timu kwa sababu ina jibu swali wewe daima kuuliza baada ya kitu kinachotokea: "Nini hasa Claude alifanya?" #!/bin/bash # .claude/hooks/record.sh # Logs every tool call to a structured audit file TS=$(date '+%Y-%m-%d %H:%M:%S') TOOL=$(jq -r '.tool_name // "unknown"') SESSION=$(jq -r '.session_id // "unknown"') # Compact input (one line, no whitespace bloat) INPUT=$(jq -c '.tool_input // {}') # Truncate output to prevent log bloat (first 500 chars) OUTPUT=$(jq -r '.tool_output // empty' | head -c 500) # Tab-separated for easy parsing with awk/cut printf '%s\t%s\t%s\t%s\t%s\n' \ "$TS" "$SESSION" "$TOOL" "$INPUT" "$OUTPUT" \ >> .claude/session-log.tsv exit 0 Tabu tofauti, sio JSON. Chaguo la makusudi. faili za TSV zinaweza kupatikana, zinaweza kutumika, na zinaweza kufutwa na zana za kawaida za Unix. Unahitaji kuona kila amri ya Bash kutoka leo? grep "$(date +%Y-%m-%d)" .claude/session-log.tsv | grep "Bash" | cut -f4 Unahitaji kuhesabu idadi ya marekebisho ya faili Claude alifanya wiki hii? grep -c "Edit\|Write" .claude/session-log.tsv Uwanja wa output unashikiliwa kwa wahusika 500 ili kuzuia faili za kumbukumbu za megabyte kadhaa wakati Claude anasoma faili kubwa. Ikiwa unahitaji matokeo kamili, kubadilisha kwa faili za kumbukumbu za mstari: bonyeza jina la faili kwa . .claude/logs/session-${SESSION}.tsv Kwa timu ambazo zinahitaji kumbukumbu ya kikanda, kubadilisha kiungo cha faili na kiungo cha HTTP ambacho kinaonyesha miundombinu yako ya kumbukumbu. faili ya JSON Claude Code inatoa ina kila kitu kile script hii inachukua, pamoja na mazingira ya ziada kama vile orodha ya kazi na usanidi wa zana. Faili ya Mipangilio ya Mipangilio Vifaa vyote vichache vilikuwa vimeandikwa pamoja: { "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": ".claude/hooks/guard.sh" }, { "type": "command", "command": ".claude/hooks/no-push-main.sh" } ] } ], "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": ".claude/hooks/fmt.sh" } ] }, { "matcher": "", "hooks": [ { "type": "command", "command": ".claude/hooks/secrets.sh" }, { "type": "command", "command": ".claude/hooks/record.sh" } ] } ] } } Kuweka JSON kwenye Kuanzisha mfululizo wa makala tano kwenye Kuendesha ya Done. .claude/settings.json .claude/hooks/ chmod +x .claude/hooks/*.sh Hifadhi ya Hifadhi ya Hifadhi ya Hifadhi ya Hifadhi ya Hifadhi ya Hifadhi ya Hifadhi.Wote na ya kuangalia kila amri ya Bash. Ikiwa moja ya kurudi kukataa, amri ni kuzuiliwa. PostToolUse hooks pia kuendesha kwa utaratibu lakini hawawezi kuzuia chochote; chombo tayari kutekelezwa. guard.sh no-push-main.sh Mstari wa kushoto kwenye orodha ya pili ya PostToolUse inamaanisha na ya moto juu ya kila wito wa chombo, si tu marekebisho ya faili. Hiyo ni nia. Nataka kupima matokeo ya Bash kwa ajili ya mamlaka na nataka kurekodi kila kitu, bila kujali aina ya chombo. secrets.sh record.sh Nini Nimejifunza Kuendesha Hizi kwa Miaka sita Kila kitu kingine ni uhakika. formatter ni haraka, kupunguza muda. Weka moja ya kwanza hata kama wewe kupuuza wengine. The formatter hook pays for itself on day one. Napenda kuchunguza alama za uwongo kumi kwa wiki badala ya kupoteza uthibitisho mmoja wa kweli. Utafiti wa faili ya kumbukumbu unachukua sekunde 30. False positives in the secret scanner are fine. Kila wiki niliongeza mfano baada ya kukosa karibu. Sasa ina mifano nane. ndani ya miezi sita itakuwa na 20. Hiyo ni suala. Inakuja maarifa ya taasisi ya timu yako kuhusu kile ambacho kinapaswa kamwe kuendesha bila tathmini. The guard script needs to evolve. rm -rf Lakini wakati kitu kinatokea vibaya, kuwa na rekodi kamili ya kila hatua Claude alichukua inabadilisha uchunguzi wa saa mbili kwa dakika tano. The audit log is most valuable after incidents. Kila PreToolUse hook hutoa latency kwa kila wito wa chombo. Walinzi wangu na vipande-cop script huendesha chini ya 5ms kila mmoja. formatter ni ya polepole zaidi katika 50-200ms kulingana na ukubwa wa faili, lakini inaendesha PostToolUse hivyo haina kuzuia pipeline. Ikiwa hook yako huita API ya nje, kutumia PostToolUse au kukubali latency. Keep hooks fast. Maelezo ya Sticky Note yameondoka Ufuatiliaji ambao uliishi katika kichwa changu sasa unaishi katika script tano za shell zilizo jumla ya mstari 150. Wameendesha kila simu ya chombo bila ushiriki wangu. Wamechukua mambo ambayo ningepoteza wakati nilipokuwa na uchovu mwishoni mwa kikao cha muda mrefu. Wao kamwe hawawezi kusahau kuangalia shamba. Msaidizi wa coding ya AI ni nguvu. Lakini nguvu bila ufuatiliaji ni hatari tu ambayo haijatathmini bado. Script tano, dakika kumi za kuanzisha, na hatari huanguka karibu na nusu. Neno la kuvutia limebadilishwa na kitu bora.Kila kitu ambacho haina kutegemea mimi kukumbuka kuangalia.