Блог

Claude Code-тағы хуктар 2026: қадамдық баптау және қолдануға дайын 7 мысал

Markdown

Көшіруге дайын .claude/settings.json файлына арналған 7 хук: .env файлын қорғау, prettier, main тармағына force-push жасау, ұзын тире және әзірлеу сервері. Өңдегіштің 4 түрі және 31 оқиға.

Мақаланы толық оқу

Claude Code-тағы хуктар — Claude әрекетінің алдында не одан кейін автоматты түрде орындалатын shell командалары, HTTP шақырулары немесе қысқа LLM тексерулері. Олар нақты құрал оқиғаларына тексерулер қосады, өңдеуден кейін кодты пішімдейді және сеанс басында жаңа контекст береді. Сәйкес PreToolUse hook сол шақыруды қабылдамай алады; regex мысалдары — барлық файл не Git қолжетімділік жолының қауіпсіздік шекарасы емес, ыңғайлы қорғаныс. Төменде өңдегіштің 4 түрі, өмірлік циклдің 31 оқиғасы, «ережені хукке қашан айналдыру керек» дегенді анықтайтын тексеріс, .claude/settings.json файлына көшіруге дайын 7 хук және өзім тап болған 3 қате қарастырылады.

Ailoot құжаттамасы: API, кілттер және баптау.

Claude Code-тағы хуктар деген не?

Негізгі түйін

Хук — Claude Code белгілі бір өмірлік цикл оқиғасына жауап ретінде іске қосатын shell командасы, HTTP шақыруы, қысқа LLM сұрау мәтіні немесе қосалқы агент. Модель елемеуі не ұмытып кетуі мүмкін CLAUDE.md ішіндегі нұсқаулардан айырмашылығы, хук әр жолы бірдей орындалады: бұл — ұсыныс емес, код.

Жарты жыл бойы мен «.env файлын тікелей өңдеме» деген ережені CLAUDE.md ішінде сақтадым. Claude оны айына бір рет бұзатын. Әдейі емес, жай ғана ұзақ сессияның соңына қарай ұмытып кететін. Бірде .env файлына артық токен қосылды; тағы бірде аты қайталанған айнымалы қолданыстағы айнымалының үстінен жазылды.

Мен бұл ережені хукке ауыстырдым, сонда оны ұмыту мүмкін болмай қалды. Сәйкес тікелей өңдеу құралы .env жолын берсе, бапталған hook сол шақырудан бас тартады. Bash бағыттауы, скрипттер, MCP және басқа жолдарға бөлек бақылау қажет; мысал файлды өзгермейтін етпейді.

Хуктар — Claude Code өмірлік циклінің белгілі бір тұстарында автоматты түрде орындалатын, өзіңіз анықтайтын shell командалары, HTTP соңғы нүктелері немесе LLM сұрау мәтіндері.

— Anthropic, https://code.claude.com/docs/en/hooks

Басқаша айтқанда, хук — Claude Code белгілі бір оқиғада орындайтын сіздің командаңыз. Файлды өңдеу, Bash іске қосу, сессияны бастау немесе қосалқы агенттің жұмысын аяқтауы — хук жалғауға болатын оқиғалар.

Vibe coder үшін бұл неге маңызды:

  • Құпиялары бар файлдарды кездейсоқ өңдеуден қорғау.
  • Әр код генерациясынан кейін prettier/eslint бағдарламаларын автоматты түрде іске қосу.
  • Нақты рұқсатсыз main тармағына git push --force жасауды бұғаттау.
  • Әр сессияның басында жаңа контекст қосу.
  • Claude әрекеттерін аудит үшін журналға жазу.

CLAUDE.md контексті басқарады. Хуктар әрекеттерді басқарады. Бұлар — екі бөлек нәрсе, оларды шатастыру — жаңадан бастаушылардың басты қатесі.

Хуктардың CLAUDE.md пен skills-тен айырмашылығы қандай?

Негізгі түйін

CLAUDE.md — модель сессия басында оқып, орындауға тырысатын мәтін. Хук — Claude Code процесі модельге тәуелсіз, оқиғаға жауап ретінде орындайтын shell командасы. Skill — Claude Skill құралы арқылы шақыра алатын, функция тәрізді аталған нұсқаулар жиынтығы. Үшеуі де әртүрлі міндеттерге арналған.

Anthropic құжаттамасында CLAUDE.md мен хуктардың айырмашылығы нақты түсіндірілген:

CLAUDE.md мазмұны жүйелік сұрау мәтінінің бөлігі ретінде емес, жүйелік сұраудан кейін пайдаланушы хабарламасы ретінде беріледі. Claude оны оқып, орындауға тырысады, бірақ қатаң түрде орындайтынына кепілдік жоқ.

— Anthropic, memory docs, https://code.claude.com/docs/en/memory

Басқаша айтқанда, CLAUDE.md мазмұны Claude-қа жүйелік нұсқау емес, пайдаланушыдан келген алғашқы хабарлама ретінде жетеді. Модель оны оқып, орындауға тырысады. Бірақ, әсіресе ұзақ сессияның соңына қарай, контекст ұлғайып, бұрынғы нұсқаулар ығыстырылған кезде, ешқандай кепілдік жоқ.

Хук басқаша жұмыс істейді. Ол settings.json ішінде сақталады, модельге тәуелді емес және Claude Code процесі нақты бір оқиғада орындайды: PreToolUse, PostToolUse, SessionStart және басқалары. Команда нәтиже Claude-қа берілмей тұрып орындалады және әрекетті физикалық түрде бұғаттай алады (exit 2) немесе өңдеуден кейін файлды өзгерте алады (exit 0).

Салыстыру:

МүмкіндікCLAUDE.mdХукSkill
Қайда орналасадыЖоба түбіріндегі CLAUDE.md.claude/settings.json.claude/skills/ қалтасы
Оны кім іске қосадыМодель оны пайдаланушы хабарламасының бөлігі ретінде оқидыClaude Code процесі оқиға туғанда іске қосадыМодель Skill құралы арқылы іске қосады
Орындалу кепілдігіЖоқ (бар күшін салып орындау)Бапталған сәйкес command hook код орындайды; ақау мен шығу әрекеті оқиғаға тәуелдіМодель шақыруы арқылы (рұқсатпен, бірақ shell деңгейінде емес)
Не үшін қажетЖоба контексті, үн, стиль, бағыттауШектеулер, пішімдеу, нақты файлдарға арналған тексерістерПараметрлері бар күрделі көпқадамды процедуралар
Қашан орындаладыСессиядағы әр модель хабарламасындаӨмірлік цикл оқиғасы болғандаМодель шақырғанда
Әрекетті бұғаттай ала ма?ЖоқИә (exit 2)Жоқ

Толық CLAUDE.md үлгісі мен үнемі жаңарып тұратын файлға арналған 6 ереже 2026 жылы CLAUDE.md файлын қалай баптауға болады: дайын үлгі және 6 ереже нұсқаулығында берілген. Аталған мүмкіндіктер ретіндегі skills туралы Claude Code Skills: жеке кітапханаңызды қалай құруға болады мақаласынан біліңіз.

Хук — ең төменгі деңгей: модель жоқ, түсіндіру жоқ, тек shell.

Хуктар — Plan Mode және /compact-пен қатар контекст инженериясының құралдарының бірі.

Хуктың 4 түрі: Command, HTTP, Prompt, Agent — қайсысын таңдау керек?

Негізгі түйін

Claude Code-та өңдегіштің 4 түрі бар. Command — ең кең тараған shell скрипті. HTTP сіздің URL мекенжайыңызға POST сұрауын жібереді, топтар мен интеграцияларға арналған. Prompt семантикалық тексеріс үшін қысқа Haiku шақыруын жасайды. Agent терең тексеруге арналған, құралдарға қол жеткізе алатын қосалқы агентті жасайды. Жаңадан бастаушыларға Command пен Prompt жеткілікті; олар міндеттердің 90%-ын қамтиды.

ТүріНе істейдіҚай кезде таңдау керекКүрделілігі
CommandShell командасын іске қосады, stdin арқылы JSON қабылдайды және шығу коды мен stdout қайтарадыЖағдайлардың 90%-ы: жолдарды тексеру, пішімдеу, мазмұннан grep іздеу, lsof, git операцияларытөмен
HTTPJSON денесі бар POST сұрауын URL мекенжайыңызға жіберіп, жауап ретінде JSON қабылдайдыЕреже топқа/CI-ге ортақ болғанда: орталықтандырылған тексеру, ортақ күй тақтасы, қашықтан аудиторташа (сервер қажет)
PromptHaiku-ға (әдепкіде) қысқа сұрау мәтінін жіберіп, семантикалық бағалау үшін иә/жоқ жауабын аладыgrep жеткіліксіз болғанда: «мына мәтіннің үні ресми корпоративтік сияқты ма?»төмен
AgentКөпқадамды тексеру үшін Read/Grep/Glob қолжетімділігі бар қосалқы агент жасайдыАуқымды тексеру: «өзгерген барлық файлды тауып, оларға сәйкес тестілер барын тексер»жоғары

Ең жиі кездесетін қате — Command түрімен Prompt қажет болатын жұмысты істеуге тырысу. Мысалы, «.md файлдарында ұзын тире қолданбау» — grep арқылы тексерілетін міндет, сондықтан Command қолайлы. Ал «корпоративтік үнмен жазбау» — семантикалық міндет, сондықтан оған Prompt қажет.

Жаңа бастап жүрсеңіз, Command қолданыңыз. Төмендегі қолдануға дайын 7 хуктің бәрі — Command. Дайын болғанда HTTP/Prompt/Agent түрлеріне өте аласыз.

settings.json қайда орналасқан және конфигурацияның 4 деңгейі қандай?

Негізгі түйін

Claude Code конфигурацияны 4 жерден іздейді: enterprise (MDM арқылы орналастырылады), пайдаланушы деңгейі (~/.claude/settings.json), жоба деңгейі (репозиторий түбіріндегі .claude/settings.json) және жергілікті деңгей (.claude/settings.local.json, git-ке қосылмайды). Сессия басталғанда 4 файл да біріктіріледі, төменгі деңгейдің баптауы басым болады.

ДеңгейЖолҚай кезде қолданыладыGit ішінде ме?
Enterprise/Library/Application Support/ClaudeCode/settings.json (Mac), /etc/claude-code/settings.json (Linux)MDM арқылы бүкіл топтажоқ
Пайдаланушы~/.claude/settings.jsonБір пайдаланушының барлық жобасындажоқ
ЖобаРепозиторий түбіріндегі .claude/settings.jsonБүкіл топқа арналған осы жобадаиә
Жергілікті.claude/settings.local.jsonТек осы пайдаланушының осы жобасындажоқ (.gitignore ішінде)

Төменде сипатталған 7 хукты жобаның .claude/settings.json файлында сақтаймын, сондықтан олар репозиторийді клондағанда автоматты түрде қосылады, ал Claude жаңа терезеде де сол ережелерді ұстанады. Жеке тәжірибелік хуктар топтың жұмысына кедергі келтірмес үшін .claude/settings.local.json файлына салынады.

Сессия басталғанда 4 файл да біріктіріледі. Ережелер қайшы келсе, төменгі деңгей басым болады (жергілікті деңгей жоба деңгейінен, жоба пайдаланушы деңгейінен басым).

Алғашқы хукты жасаудың ең жылдам жолы — Claude Code ішіндегі интерактивті /hooks мәзірі. Тізімнен оқиғаны таңдап, сәйкестендіргішті (мысалы, Bash немесе Edit) белгілеп, команда енгізіңіз. Claude Code сіз үшін settings.json ішіне жарамды JSON жазады.

Өмірлік циклдің 31 оқиғасы: жаңадан бастаушыларға қайсысы қажет?

Негізгі түйін

Қазіргі Claude Code-та өмірлік циклдің 31 оқиғасы бар, олар орындалу жиілігіне қарай 3 топқа бөлінеді: сессияда бір рет (SessionStart/SessionEnd), әр кезекте бір рет (UserPromptSubmit/Stop) және әр құрал шақырылған сайын (PreToolUse/PostToolUse). Жаңадан бастаушыларға 31 оқиғаның 4-еуі керек: шектеулер үшін PreToolUse, автоматты өңдеулер үшін PostToolUse, контекст үшін SessionStart және соңғы тексерулер үшін Stop.

Оқиғалар үш жиілікте болады: сессияда бір рет (SessionStart, SessionEnd), әр кезекте бір рет (UserPromptSubmit, Stop, StopFailure) және агенттік цикл ішіндегі әр құрал шақырылған сайын (PreToolUse, PostToolUse).

— Anthropic, hooks reference, https://code.claude.com/docs/en/hooks

Шатаспау үшін осы үш жиілікті түсініп алған жөн:

  1. Сессияда бір рет - SessionStart, SessionEnd, Setup. Бұлар Claude Code ашылғанда және жабылғанда бір рет орындалады. Контексті дайындау және уақытша файлдарды тазарту үшін қолданыңыз.
  2. Әр кезекте бір рет - UserPromptSubmit, UserPromptExpansion, Stop, StopFailure. Бұлар әр хабарламаңызда және модель тоқтаған сайын іске қосылады. Әңгіме журналын жүргізіп, соңғы нәтиже тексерулерін жасау үшін қолданыңыз.
  3. Әр құрал шақырылған сайын - PreToolUse, PostToolUse, PostToolUseFailure, PermissionRequest, PermissionDenied, PostToolBatch, SubagentStart, SubagentStop. Бұлар әр файл өңделгенде, Bash іске қосылғанда, оқығанда немесе іздегенде іске қосылады. Бұл — шектеулер, пішімдеу және тексерулер орындалатын ең қарқынды қабат.

31 оқиғаның толық тізіміне асинхронды/реактивті оқиғалар кіреді: TeammateIdle, PreCompact, PostCompact, Elicitation, ElicitationResult, InstructionsLoaded, ConfigChange, CwdChanged, FileChanged, WorktreeCreate, WorktreeRemove, Notification. Бұлар кеңейтілген сценарийлерге арналған, әзірше өткізіп жіберіңіз.

Ереже хукке қашан айналуы керек, ал қашан CLAUDE.md ішінде қалуы керек? Бес сұрақтық тексеріс

Негізгі түйін

Ереже әрекетке (контекстке емес) қатысты болса, қауіпсіздікке/ақшаға/деректерге қатысы болса, grep/regex арқылы тексерілсе, бұзылған жағдайда қалпына келтіру қиын болса және Claude оны кем дегенде бір рет бұзған болса, ол хукке айналуы керек. Осы бес жауаптың үшеуінен азы «иә» болса, ереже CLAUDE.md ішінде қалады. Мен бұл тексерісті өзімнің 80 жолыма қолданып, 5 ережені хукке ауыстырдым.

Мен үшін бұл — ұсыныс емес, заң сияқты. CLAUDE.md пен хуктың арасындағы таңдауды бес сұрақтық қарапайым тексеріске айналдырдым. Кемінде үш жауап «иә» болса, ереже хукке жазылады. Үшеуден аз болса, мәтінде қалады.

«Ереже хукке қашан айналуы керек?» деген тексеріс:

  1. Бұл ереже контекстке емес, әрекетке қатысты ма? («rm -rf іске қоспа» — әрекет; «менде TypeScript жобасы бар» — контекст.)
  2. Бұл ереже қауіпсіздікке, ақшаға немесе деректерге қатысты ма? («.env файлына тиме», «кілттерді жариялама».)
  3. Оны grep, regex немесе shell командасының шығу коды арқылы тексеруге бола ма? («.md файлын өңдегеннен кейін, онда ұзын тире жоқ екенін тексер».)
  4. Ереже бұзылса, салдарын түзету қиын бола ма? («main тармағына force push жасау» қиын; «сөйлем соңында нүкте қоюды ұмыту» оңай.)
  5. Claude бұл ережені кемінде бір рет ұмытқанын көрдіңіз бе?

Мысал: «Ұзын тире қолданба; тек дефис қолдан». Әрекет пе? Иә. Қауіпсіздік пе? Жоқ. grep-пен тексеріле ме? Иә. Түзету қиын ба? Жоқ. Бұзылғанын көрдіңіз бе? Иә. 5 сұрақтың 3-еуі: хукке қойыңыз.

Қарсы мысал: «Менде әзірлеушілер емес, vibe coder-лер бар; сленгсіз жазыңыз». Әрекет пе? Көбірек контекстке ұқсайды. Қауіпсіздік пе? Жоқ. Regex-пен тексеріле ме? Өте қиын. Түзету қиын ба? Жоқ. Бұзылғанын көрдіңіз бе? Иә. 5 сұрақтың 1-еуі: CLAUDE.md ішінде қалдырыңыз.

Менің бес ережем тексерістен өтті. Олар хуктарға көшті. Қалған 75%-ы мәтіндік файлда қалды.

Көшіруге дайын 7 хук

Негізгі түйін

Төменде .claude/settings.json файлына арналған қолдануға дайын 7 хук берілген: .env файлын өңдеуді бұғаттау, prettier бағдарламасын автоматты іске қосу, main тармағына force-push жасауға жол бермеу, ұзын тирені тексеру, npm run dev алдында портты босату, тестілер сәтті аяқталғаннан кейін автоматты түрде commit жасау және сессия басында жаңа контекст қосу. Әрқайсысын файлға көшіріп, Claude Code-ты қайта іске қоссаңыз, жұмыс істейді.

7 хуктің бәрі жоба түбіріндегі бір .claude/settings.json файлында сақталады. Әр жазбада оқиға түрі, құрал сүзгісі (matcher) және shell командасы бар. Exit code 2 сәйкес PreToolUse шақыруын орындалмас бұрын қабылдамайды. PostToolUse кезінде әрекет өтіп қойған: hook кері байланыс береді және оны қайтара алмайды.

Хук оқиғаларының көбінде әрекетті тек exit code 2 ғана бұғаттайды. Claude Code exit code 1-ді бұғаттамайтын қате деп санап, әрекетті жалғастырады, ал Unix-те 1 әдетте сәтсіздікті білдіреді.

— Anthropic, hooks reference, https://code.claude.com/docs/en/hooks

exit 0 — сәтті аяқталды дегенді білдіреді. exit 1 — қате, бірақ Claude жалғастырады (бұл — төмендегі алғашқы антиүлгі). exit 2 әрекеті оқиғаға тән: PreToolUse-ты бұғаттай алады, ал PostToolUse орындалған әрекет туралы кері байланыс қана береді.

Хук 1. Тікелей .env өңдеуін тексеру (PreToolUse, exit 2)

.env, .env.local, .env.production және тағы басқаларға сәйкес келетін кез келген файлды тікелей өңдеу әрекетін бұғаттайды.

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE=$(jq -r '.tool_input.file_path // empty'); [ -z \"$FILE\" ] && exit 0; echo \"$FILE\" | grep -qE '(^|/)\\.env(\\.|$)' && { echo 'Do not edit `.env` directly. Tell me which variable to add, and I’ll open the file myself.' >&2; exit 2; } || exit 0"
          }
        ]
      }
    ]
  }
}

Не істейді: Әр Edit/Write/MultiEdit алдында файл жолын алады, grep арқылы оның .env үлгісіне сәйкес екенін тексереді, сәйкес келсе, хабарлама беріп exit 2 қайтарады. Claude stderr мәтінін көріп, маған: «.env файлын өңдеуге тырыстым, бірақ хук бұғаттады; қандай айнымалы қосу керегін айтыңызшы», — дейді.

Хук 2. Әр код өңделгеннен кейін prettier-ді автоматты түрде іске қосу (PostToolUse, exit 0)

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE=$(jq -r '.tool_input.file_path // empty'); [ -z \"$FILE\" ] && exit 0; echo \"$FILE\" | grep -qE '\\.(ts|tsx|js|jsx|json)$' && npx prettier --write \"$FILE\" 2>/dev/null & exit 0"
          }
        ]
      }
    ]
  }
}

Не істейді: Әр Edit/Write әрекетінен кейін жолды алады, кеңейтімі .ts/.tsx/.js/.jsx/.json болса, prettier-ді фондық режимде & арқылы іске қосады. Ол әрдайым exit 0 береді, өйткені бұл — шектеу емес, пішімдеу. Prettier сәтсіз аяқталса, ештеңе етпейді; файл бұрынғы күйінде қалады.

1-хуктан айырмашылығы түбегейлі: PreToolUse + exit 2 әрекетке дейін қатаң бұғаттайды. PostToolUse + exit 0 әрекеттен кейін жұмсақ өңдейді. Бұл — әртүрлі міндеттерге арналған екі бөлек режим.

Хук 3. Main тармағына git push --force жасауды бұғаттау (PreToolUse, exit 2)

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "CMD=$(jq -r '.tool_input.command // empty'); [ -z \"$CMD\" ] && exit 0; echo \"$CMD\" | grep -qE 'git[[:space:]]+push' && echo \"$CMD\" | grep -qE '(\\-\\-force|\\-\\-force-with-lease|[[:space:]]-f([[:space:]]|$))' && echo \"$CMD\" | grep -qE '([[:space:]/:])main([[:space:]/:]|$)' && { echo 'Force push to main is forbidden. Create a new branch or ask me to do it manually.' >&2; exit 2; } || exit 0"
          }
        ]
      }
    ]
  }
}

Не істейді: Әр Bash іске қосылғанда, командада push, --force/--force-with-lease/-f және main атауы бар-жоғын тексереді. Үш шарт та сәйкес келсе, анық хабарлама беріп бұғаттайды.

Бұрын бұл ережені CLAUDE.md ішінде бас әріптермен жазып қоятынмын. «Қате коммитімді қайтару үшін force push жаса» десем де, Claude оны шамамен екі аптада бір рет бұзатын. Hook көрсетілген тікелей пәрмен пішімдерін ұстайды, бірақ alias, скрипт, жасырын нысана тармақ не басқа Git клиенті мәтін тексеруін айналып өте алады. Қашықтағыда main қорғанысын міндеттеп, агенттің кіру деректерін шектеңіз.

Хук 4. Мәтіндік файлдарда ұзын тирені бұғаттау (PostToolUse, exit 2)

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE=$(jq -r '.tool_input.file_path // empty'); [ -z \"$FILE\" ] && exit 0; echo \"$FILE\" | grep -qE '\\.(md|mdx|tsx?)$' && grep -q $'\\xe2\\x80\\x94' \"$FILE\" && { echo \"File $FILE contains an em dash (U+2014). Replace it with a regular hyphen (U+002D).\" >&2; exit 2; } || exit 0"
          }
        ]
      }
    ]
  }
}

Не істейді: PostToolUse ішіндегі exit 2 өңдеуден кейін Claude-қа тексеру қатесін хабарлайды. Ол жазуды кері қайтармайды және алдын алмайды. Claude файлды өңдеп, онда ұзын тире қалдырса, хук сәтсіз аяқталып, Claude кері байланыс алады да, қайта әрекет етеді. 2–3 сессиядан кейін Claude бұл таңбаны мүлде енгізуді қояды.

grep $'\xe2\x80\x94' арқылы UTF-8 байттарымен жазудың Bash нотациясын қолданып, ұзын тире таңбасын (U+2014) арнайы іздейтінін ескеріңіз. Егер жай ғана grep -q '-' деп жазсаңыз, кәдімгі дефистер де ұсталып, команда әр файлда іске қосылады. Көрінбейтін бір таңба бүкіл логиканы бұзуы мүмкін.

Хук 5. npm run dev алдында 3000-портты босату (PreToolUse, exit 0)

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "CMD=$(jq -r '.tool_input.command // empty'); [ -z \"$CMD\" ] && exit 0; echo \"$CMD\" | grep -qE '(npm|pnpm|yarn)[[:space:]]+run[[:space:]]+dev' && { lsof -ti:3000 | xargs -r kill -9 2>/dev/null; echo 'Port 3000 freed before launch' >&2; }; exit 0"
          }
        ]
      }
    ]
  }
}

Не істейді: Әр npm run dev алдында (немесе pnpm/yarn пәрмендері үшін) 3000-порттағы процесті тоқтатады. Әрдайым exit 0 береді, өйткені бұл — шектеу емес, алдын ала дайындық. Бұл Claude «порт қолданыста» дегенді көріп, кодтан ақау іздей бастайтын жағдайлардың алдын алады, ал шын мәнінде тек ескі сервер жабылмай қалған болуы мүмкін.

Хук 6. Тестілер сәтті аяқталғаннан кейін автоматты commit жасау (PostToolUse, exit 0)

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "INPUT=$(cat); CMD=$(printf '%s' \"$INPUT\" | jq -r '.tool_input.command // empty') || exit 1; EXIT=$(printf '%s' \"$INPUT\" | jq -r '.tool_response.exit_code // empty') || exit 1; case \"$CMD\" in 'npm test'|'pnpm test'|'yarn test') ;; *) exit 0 ;; esac; [ \"$EXIT\" = \"0\" ] || exit 0; git diff --cached --quiet || { echo 'Existing staged changes: review manually' >&2; exit 0; }; git add -- src/orders.ts tests/orders.test.ts || exit 1; git diff --cached --quiet && exit 0; git commit -m 'tests: checkpoint after successful run'"
          }
        ]
      }
    ]
  }
}

Не істейді: JSON stdin бір рет оқылады, тек көрсетілген дәл қарапайым сынақ пәрмендері қабылданады. Берілген tool_response.exit_code нақты нөл болса ғана жалғасады; орнатылған нұсқа өрісті бермесе, табысты жорамалдамай коммитті өткізеді. src/orders.ts пен tests/orders.test.ts орнына тапсырма иелігіндегі нақты файлдарды қойыңыз. Бар индекстелген өзгерістер қатысы жоқ жұмыс кірмеуі үшін рецептті тоқтатады. Add сәтсіз болса тоқтайды, бос diff коммит жасамайды, қалыпты commit hook-тары қосулы қалады. Қоспас бұрын сәтті, сәтсіз және нәтижесі жоқ кірістерді офлайн сынаңыз.

Антиүлгі: әр Edit-ке git commit --no-verify қосу. Коммит тексерулерін қосулы ұстаңыз. Тексеру осы автоматтандыруды рекурсивті шақырса, триггерді тарылтыңыз не тексеруді қайта жасаңыз; әдепкіде тексеруді айналып өтпеңіз. Автокоммиттен бұрын индекстегі diff пен тапсырма иелігін қараңыз.

Хук 7. Сессия басталғанда жаңа контекст қосу (SessionStart және additionalContext)

{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null || echo 'no-branch'); STATUS=$(git status --short 2>/dev/null | head -10); echo \"{\\\"additionalContext\\\":\\\"Current branch: $BRANCH. Uncommitted changes:\\n$STATUS\\\"}\""
          }
        ]
      }
    ]
  }
}

Не істейді: Сессия басталғанда ағымдағы Git тармағы мен commit жасалмаған өзгерістер тізімін жинап, additionalContext өрісі бар JSON қайтарады. Claude Code бұл мәтінді алғашқы жүйелік хабарламаға қосады, сондықтан Claude басынан бастап жобаның қазіргі күйін және алдыңғы сессиядан не қалғанын біледі.

Claude ағымдағы ортаның күйі немесе жаңа ғана аяқталған операция туралы білуі керек ақпарат үшін additionalContext қолданыңыз: орта күйі (ағымдағы тармақ, орналастыру нысанасы, белсенді функция жалаушалары), шартты жоба ережелері (жаңа ғана өңделген файлға қай тест командасы сәйкес келеді), сыртқы деректер (сізге тағайындалған ашық мәселелер, соңғы CI нәтижелері).

— Anthropic, hooks reference, https://code.claude.com/docs/en/hooks

Бұл хукке қосуға болатын нәрселер: соңғы коммит пен оның сипаттамасын, GitHub Actions күйін, Linear/Jira жүйесіндегі белсенді спринтті және ағымдағы репозиторийдің ашық мәселелерін алу.

Көп адамды шатастыратын хуктардың 3 тұзағы

Негізгі түйін

Бірінші тұзақ: exit 1 қайтаратын хук әрекетті үнсіз өткізіп, Claude қатені елемейді. Екінші: хук ішіндегі ауыр жұмыс 60 секундтан кейін тоқтатылады. Үшінші: хук жоба .env файлын емес, тек ~/.zshrc ішіндегі орта айнымалыларын көреді. Әрқайсысы бір жолмен шешіледі, бірақ бұл тұзақтарды білмесеңіз, «хуктар жұмыс істемейді» деген әсер қалуы мүмкін.

Тұзақ 1. Exit 1 қайтаратын хук әрекетті үнсіз өткізеді

Бұл — ең қауіптісі. Бір апта бойы .env қорғағышым жұмыс істейді деп ойладым, бірақ хук ішінде null мәнді тексермей jq -r '.tool_input.file_path' деп жазған екенмін. tool_input бос болғанда, jq 1 кодымен шыққан. Claude exit 1-ді «хукте қате бар, жалғастыр» деп қабылдағандықтан, әрекет орындалған. Неге .env файлына әлі де тиіп жатқанын түсіне алмадым. Бос кіріс дерегімен хукті терминалда қолмен іске қосқанда ғана себебін көрдім.

Шешім — бір ереже: әр хукті null мәнді тексеруден бастаңыз және || exit 0 жолымен аяқтаңыз. Кез келген күтпеген шығу үнсіз өткізіп жіберудің орнына «қауіпсіз» шығуға әкеледі.

# Safe start and end template:
FILE=$(jq -r '.tool_input.file_path // empty')
[ -z "$FILE" ] && exit 0
# ... your logic ...
exit 0   # or || exit 0 on one line

Тұзақ 2. Баяу хуктар тайм-ауттан кейін тоқтатылады

Edit-тен кейін бүкіл файлға eslint --fix іске қосатын хук қолдандым. Үлкен файлдарды (1000+ жол) өңдеуге 8–10 секунд кететін. Claude Code хугының әдепкі тайм-ауты 60 секунд болғандықтан, уақыт шегінен аспаймын деп ойладым. Бірақ бір минут ішінде бірнеше Edit жасалса, хуктар жиналып, кезекке тұрады, ал кейбірі мүлде өткізіліп кетеді. Мұны журналда “hook timed out” деген жазуды көргенде ғана түсіндім.

Шешім: хук ауыр жұмысты қажет етсе, оны фондық режимде іске қосыңыз. Нәтижесін күтпей eslint --fix "$FILE" & деп орындаңыз. Сонда хук бірнеше миллисекундта exit 0 қайтарады, ал нақты жұмыс фондық режимде жүреді.

# Heavy operation in background:
npx eslint --fix "$FILE" &
exit 0

Тұзақ 3. Хук жобаның орта айнымалыларын көре алмайды

Node.js қолданбасындағыдай, хукте process.env қолжетімді болады деп ойладым. Олай емес. Хук Claude Code-тың ата-аналық процесі іске қосқан shell ішінде жұмыс істейді және ~/.zshrc не ~/.bashrc файлдарындағыларды, сондай-ақ Claude Code арнайы беретін айнымалыларды ғана көреді. Хукке .env ішіндегі OPENAI_API_KEY қажет болса, .env файлын қолмен оқуыңыз керек.

Шешім: хук командасында .env файлын арнайы оқыңыз.

# Passing project env into hook:
cd "$PWD" && source .env && curl -H "Authorization: Bearer $OPENAI_API_KEY" ...
# Or with dotenv:
dotenv -e .env -- node my-validator.js

Бұл монорепозиторийде, әр пакетте жеке .env файлы болғанда, әсіресе қиын. PWD айнымалысын беріп, команданың басында cd "$PWD" орындау арқылы шешіңіз.

Commit жасамас бұрын хуктарды қалай тексеруге болады?

Негізгі түйін

Хук — shell командасы. Оны терминалда қолдан жасалған stdin дерегімен қолмен іске қосып, шығу кодын және stderr мәтінін тексеруге болады, мұның бәрін Claude Code хукты іске қоспай тұрып жасауға болады. Бұл жөндеу жұмысын бірнеше сағатқа қысқартып, өз жұмысын өзі бұғаттайтын хуктардан қорғайды.

Негізгі тест сценарийі. JSON ішіндегі хук командасын алып, терминалды ашыңыз да, Claude Code жіберетін JSON-ды оған беріңіз:

# Test hook 1 (protect .env):
echo '{"tool_input":{"file_path":".env"}}' | bash -c '
FILE=$(jq -r ".tool_input.file_path // empty")
[ -z "$FILE" ] && exit 0
echo "$FILE" | grep -qE "(^|/)\.env(\.|$)" && {
  echo "BLOCKED" >&2
  exit 2
} || exit 0
'
echo "Exit code: $?"

stderr ішінде BLOCKED және Exit code: 2 жазуын көруіңіз керек. Егер exit 0 шықса, regex жұмыс істемейді; grep-ті түзетіңіз.

Тексерілетін сценарийлер:

  1. Оң жағдай - файл бұғатталуы керек. 1-хук үшін .env, 3-хук үшін git push --force main.
  2. Теріс жағдай - файл бұғатталмауы керек. 1-хук үшін README.md, 3-хук үшін git push origin feature-branch.
  3. Шеткі жағдайлар - бос кіріс дерегі, null мәндер, күтпеген таңбалар. Хук exit 0 қайтаруы немесе анық қатемен аяқталуы керек, үнсіз өткізіп жібермеуі тиіс.

Тәжірибелік хуктарды қайда орналастыру керек. .claude/settings.json емес, .claude/settings.local.json ішіне (git-ке кірмейді). Нақты әрекеттің орнына echo қойып, PostToolUse астына жаңа хуктарды сонда қосыңыз; іске қосылатынын тексеріп, содан кейін оларды өндірістік settings.json файлына көшіріңіз.

// Experiment in settings.local.json - writes to /tmp/hook-debug.log:
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"[hook fired] $(date) $(jq -r '.tool_input.file_path // \"?\"')\" >> /tmp/hook-debug.log"
          }
        ]
      }
    ]
  }
}

Claude Code-та 5–10 рет өңдеу жасағаннан кейін /tmp/hook-debug.log файлын ашып, хуктың қай файлдарға іске қосылғанын көріңіз. Файл бос болса, matcher сәйкес емес; regex-ті түзетіңіз.

Әрі қарай не істеу керек?

Негізгі түйін

Алдымен exit 0 қайтаратын PostToolUse хуктарынан бастаңыз; олар ең қауіпсізі және ештеңені бұғаттамайды. Бір аптадан кейін .env файлын қорғауға немесе force-push жасауға жол бермеуге арналған алғашқы PreToolUse хугыңызды exit 2 арқылы қосыңыз. Екі аптадан соң CLAUDE.md 200 жолдық келісімшарттан, таңдалған оқиға тексерулері hook-тарға көшіп, қатаң қолжетімділік шектері рұқсаттар, құмсалғыш және қашықтағы қорғаныстармен бөлек міндеттелген 50–80 жолдық қысқа контекст сипаттамасына айналады.

Алдағы аптаға арналған 5 қадам:

  1. CLAUDE.md файлынан “never,” “forbidden,” “always” және “must” сияқты сөздерді grep арқылы іздеңіз. Мұндай әр ереже хукке кандидат. Ереже бұйрық райда болса, мәтіндік файл оны орындатпайды.
  2. PostToolUse + exit 0 арқылы бастаңыз. Бұлар ең қауіпсізі: өзгеріс жасайды, бірақ ештеңені бұғаттамайды. Prettier (2-хук), әзірлеу серверін тоқтату (5-хук), тестілерден кейін автоматты commit жасау (6-хук).
  3. Тек сенімді болғанда, алғашқы PreToolUse + exit 2 хугыңызды қосыңыз. Мысалы, .env файлын қорғаңыз (1-хук) немесе force-push-қа жол бермеңіз (3-хук). Бұл — қатаң бұғаттау, ал grep командасындағы қате өзіңізді де бұғаттауы мүмкін.
  4. Commit жасамас бұрын хуктарды қолмен тексеріңіз (жоғарыдағы бөлімді қараңыз). Бұл жөндеу жұмысын бірнеше сағатқа қысқартады.
  5. Тәжірибелер үшін settings.local.json файлын қолданыңыз. Нақты әрекеттің орнына echo қосылған жаңа хуктарды сонда орналастырыңыз.

Хуктар бапталған соң, осы топтамадағы келесі қадам — Claude Code-тағы өзгерістерді қалай қайтаруға болады; бұл хук қауіпті әрекетті өткізіп жіберсе, көмектеседі. Claude жоба құрылымын сессиялар арасында есте сақтасын десеңіз, Claude Code-та Екінші ми құрыңыз (business/ қалтасы + байланыстырылған білім базасы). Жобаңыздың skills-ін атау беріп, қайта қолдану үшін Claude Code Skills нұсқаулығын қараңыз.

Ailoot арқылы нейрожелілерге қол жеткізу керек болса, Ailoot сайтын қараңыз.

Толығырақ

Жиі қойылатын сұрақтар

Hook JSON кірісін неге бір-ақ рет оқуы керек?

Stdin — ағын: бірінші jq процесі оны оқып, кейінгілеріне EOF қалдырады. Кірісті бір рет сақтап, пәрмен мен нәтиже өрістерін сол мәннен алыңыз. Жоқ не белгісіз нәтижені тексерілмеген деп санап, автокоммитті өткізіңіз.

Мысал regex hook-тары қауіпсіздік шекарасын жасай ма?

Жоқ. Олар нақты оқиғалар мен танылатын пәрмен жолдарын тексереді. Shell бағыттауы, alias, скрипт, MCP құралы не басқа жазу жолы айналып өте алады; қатаң шектерге шектеулі кіру деректері, файл рұқсаттары, құмсалғыш және қорғалған тармақтар қолданыңыз.

Барлық мақалалар