OpenClaw Hooks이란 무엇입니까? (그리고 AI 에이전트와 작업하는 방식을 바꾸는 이유)
AI 에이전트가 건드리지 말아야 할 파일을 덮어쓰는 것을 본 적이 있거나 코드가 변경될 때마다 테스트 스위트가 자동으로 실행되기를 바랐다면 OpenClaw 후크가 답입니다. 이를 통해 중요한 순간에 에이전트의 행동을 가로채고, 반응하고, 제어할 수 있습니다.
Hooks은 OpenClaw 게이트웨이 내부에서 실행되는 작은 이벤트 중심 스크립트 에이전트 수명 주기의 특정 지점에서. AI 에이전트를 위한 미들웨어로 생각하십시오. 에이전트와 에이전트가 호출하는 도구 사이에 위치하여 프로그래밍 가능한 인터셉트 레이어를 제공합니다.
두 가지 유형이 있습니다.
- Internal hooks — 실행되는 스크립트 내부에 게이트웨이 프로세스 자체. 세션 상태, 도구 호출 메타데이터 및 에이전트의 작업 컨텍스트에 직접 액세스할 수 있습니다. 네트워크 오버헤드가 없습니다.
- Webhooks — 수명 주기 이벤트가 발생할 때 외부 끝점으로 실행되는 HTTP 콜백입니다. 게이트웨이는 POST 요청을 보냅니다. 서버가 논리를 처리합니다.
실질적인 차이점: 내부 후크는 빠른 동기식 가드레일과 로컬 자동화를 위한 것입니다. Webhooks은 Slack 알림, CI 시스템, 로깅 플랫폼 등 시스템 외부에 도달해야 하는 모든 것을 위한 것입니다.
Internal Hooks과 Webhooks — 어느 것이 필요합니까?
| 요인 | 내부 후크 | Webhook |
|---|---|---|
| Execution location | Inside the Gateway process | External HTTP server |
| Latency | Near-zero (synchronous) | Network round-trip |
| Session state access | Direct | Serialized payload only |
| 다음에 가장 적합 | File guards, auto-formatting, local scripts | Slack alerts, audit logging, external APIs |
| 설정 복잡성 | Low — 디렉토리 + 핸들러 파일 | Medium — 실행 중인 HTTP 엔드포인트가 필요합니다. |
| Blocking agent execution | Yes (PreToolUse hooks can abort) | Typically async/non-blocking |
Decision rule: 후크가 필요한 경우 예방하다 행동이나 로컬 세션 데이터 읽기, 내부 후크를 사용하십시오. 필요한 경우 외부 시스템에 알림 에이전트를 차단할 필요가 없으면 웹훅을 사용하세요.
OpenClaw 후크 검색 작동 방식
게이트웨이는 다음을 사용합니다. 자동 디렉토리 스캐닝 후크를 발견합니다. 시작 시 구성된 후크 디렉터리를 검색하고 찾은 유효한 후크 패키지를 로드합니다.
후크가 활성화되기 전 두 가지 중요한 전제 조건은 다음과 같습니다.
- Hooks은 다음과 같아야 합니다. 명시적으로 활성화됨 — 후크 디렉토리만으로는 충분하지 않습니다
- 적어도 하나의 후크 항목을 구성해야 합니다. 게이트웨이 설정에서
이것은 일반적인 혼란 지점입니다. 완벽하게 작성된 후크가 올바른 디렉토리에 있을 수 있지만 게이트웨이가 후크를 활성화하라는 지시를 받지 않은 경우 자동으로 이를 무시합니다.
각 후크 패키지에는 정확히 두 개의 파일이 필요합니다.
HOOK.md— 후크의 이름, 버전, 설명, 수명 주기 이벤트 구독 및 필요한 권한을 선언하는 메타데이터 파일handler.ts(또는handler.js) — 이벤트가 발생할 때 실행되는 실제 로직을 포함하는 구현 파일
HOOK.md 파일은 게이트웨이가 검색 중에 가장 먼저 읽는 파일입니다. 형식이 잘못되었거나 필수 필드가 누락된 경우 후크가 로드되지 않습니다. 오류는 발생하지 않고 그냥 침묵됩니다. 이는 "내 후크가 작동하지 않습니다" 보고서의 가장 일반적인 원인입니다.
모든 개발자가 알아야 할 4가지 수명주기 이벤트
| 이벤트 | 불이 붙을 때 | 일반적인 사용 |
|---|---|---|
| PreToolUse | 전에 에이전트가 도구를 호출합니다. | Block dangerous operations, validate inputs |
| PostToolUse | 후에 도구 호출이 완료됩니다 | Run tests, 형식 코드, 로그 결과 |
| Stop | 에이전트 세션이 종료되는 경우 | Send notifications, flush logs, cleanup |
| SessionStart | 새 상담사 세션이 시작될 때 | Load context, set guardrails, warm up state |
PreToolUse 가장 강력한 이벤트입니다. 중단하다 실행 전 도구 호출. 후크가 PreToolUse 중에 거부 신호를 반환하면 에이전트는 도구를 호출하지 않습니다.
PostToolUse 자동화를 위한 일꾼입니다. 파일이 작성되었나요? 린터를 실행하세요. 테스트가 수정되었나요? 제품군을 실행합니다. 코드가 커밋되었나요? 빌드를 트리거합니다.
Step-by-Step: 처음부터 첫 번째 사용자 정의 후크 작성
대부분의 문서에는 명령이 나와 있습니다. 이는 아무것도 없는 상태에서 작동하는 후크까지의 전체 경로를 보여줍니다.
Goal: 모든 파일 쓰기 후에 ESLint를 자동 실행합니다.
Step 1 — 후크 디렉터리 생성
mkdir -p .openclaw/hooks/auto-lint Step 2 — HOOK.md 메타데이터 쓰기
# auto-lint **Version:** 1.0.0 **Event:** PostToolUse **Description:** Runs ESLint on any file written by the agent **Tools:** write_file, edit_file Tools 필드는 후크 범위를 특정 도구 호출로 지정합니다. 그것이 없으면 후크가 작동합니다. 모든 PostToolUse 이벤트 — 일반적으로 원하는 것이 아닙니다.
Step 3 — handler.ts 구현
import { PostToolUseEvent } from "@openclaw/sdk"; import { execSync } from "child_process"; export default function handler(event: PostToolUseEvent) { const filePath = event.toolResult?.path; if (!filePath) return; try { execSync(`npx eslint --fix "${filePath}"`, { stdio: "inherit" }); } catch (err) { console.error(`[auto-lint] ESLint failed on ${filePath}`); } } Step 4 — CLI를 통해 활성화
openclaw hooks enable auto-lint Step 5 — 로드되었는지 확인
openclaw hooks list enabled 상태의 auto-lint이 표시되어야 합니다. 세션을 시작하고, 파일을 쓰고, linter가 실행되는 것을 지켜보세요.
후크 핸들러에 대한 JavaScript 및 TypeScript — 2026년에 선택할 항목
SDK는 전체 TypeScript 유형과 함께 제공되며 2026 SDK 릴리스부터 TypeScript은 권장 기본값입니다. 새로운 후크를 위해.
| 요인 | TypeScript | JavaScript |
|---|---|---|
| Type safety | Full — 이벤트 형태가 입력됩니다. | None — 런타임 놀라움 |
| Compilation step | Required (tsc or esbuild) | None |
| SDK compatibility | First-class support | Supported but no autocomplete |
| 다음에 가장 적합 | Any hook that will be maintained or shared | 빠른 일회성 스크립트 |
버전 제어를 약속하거나 팀과 공유할 후크를 작성하는 경우 TypeScript를 사용하세요. 일회용 로컬 가드레일의 경우 일반 JavaScript이 좋습니다. 이름을 handler.js로 지정하고 컴파일 단계를 건너뛰세요.
OpenClaw Hooks CLI Reference
| 명령 | Flags | 기능 |
|---|---|---|
| OpenClaw 후크 목록 | --json | Lists all discovered hooks and their status |
| openclaw 갈고리 검사 | — | HOOK.md + 현재 구성의 전체 메타데이터를 표시합니다. |
| openclaw 후크를 사용하면 | — | 현재 프로젝트에 대한 Activates a hook |
| openclaw 후크가 <이름>을 비활성화합니다. | — | Deactivates without removing |
| openclaw 후크 설치 <팩> | --yes, --dry-run | Installs a hook pack from registry |
| OpenClaw 후크 업데이트 | --all, --dry-run | Updates installed hook packs |
Managing Hook Packs — 설치, 업데이트 및 --dry-run 워크플로
후크 팩은 여러 관련 후크를 단일 설치 가능 단위로 묶습니다. 설치 워크플로는 다음을 확인합니다. 무결성 해시 디스크에 무엇이든 쓰기 전에.
# Preview what would be installed without committing openclaw hooks install productivity-pack --dry-run # Install non-interactively (for CI environments) openclaw hooks install productivity-pack --yes # Update all installed packs openclaw hooks update --all --dry-run 플래그가 제대로 사용되지 않습니다. install 또는 update 전에 실행하여 정확히 어떤 파일이 변경되는지 확인하세요. CI 파이프라인에서는 실제 설치 전에 별도의 검증 단계를 통해 --yes을 --dry-run과 쌍으로 만듭니다.
Bundled Hooks Reference: OpenClaw과 함께 제공되는 것
| 훅 | 기본 상태 | 기능 | 다음과 같은 경우에 가장 잘 사용됩니다. |
|---|---|---|---|
| 세션 메모리 | Enabled | Persists key context across sessions | Long-running projects with recurring tasks |
| additional bundled hooks vary by Gateway version | — | openclaw hooks list --builtin을 실행하여 내용을 확인하세요. | — |
전체 구성 옵션을 보려면 openclaw hooks inspect session-memory을 실행하세요. 대부분의 번들 후크는 합리적인 기본값으로 제공되지만 사용자 정의를 위해 구성 필드를 노출합니다.
실제 후크 사용 사례(작업 예제 포함)
1. File Protection Guardrail (PreToolUse)
에이전트가 .env 파일을 건드리지 못하도록 방지합니다.
import { PreToolUseEvent } from "@openclaw/sdk"; export default function handler(event: PreToolUseEvent) { const target = event.toolInput?.path ?? ""; if (target.includes(".env")) { return { abort: true, reason: "Modification of .env files is blocked by policy." }; } } write_file 및 edit_file 범위의 PreToolUse을 구독하는 일치하는 HOOK.md을 사용하여 이를 .openclaw/hooks/protect-env/에 삭제합니다. 에이전트는 해당 컨텍스트에서 거부 이유를 수신하고 재시도하지 않습니다.
2. Slack 세션 중단 알림
import { StopEvent } from "@openclaw/sdk"; export default async function handler(event: StopEvent) { await fetch(process.env.SLACK_WEBHOOK_URL!, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text: `OpenClaw session ended. Files modified: ${event.session.filesModified ?? 0}` }) }); } 이 후크를 Stop 이벤트에 구독하세요. 모든 세션이 종료되면 요약과 함께 Slack 메시지가 표시됩니다. 외부 서버가 필요하지 않습니다. 게이트웨이 프로세스가 아웃바운드 요청을 직접 수행합니다.
3. Auto-Format + Test on PostToolUse
import { PostToolUseEvent } from "@openclaw/sdk"; import { execSync } from "child_process"; export default function handler(event: PostToolUseEvent) { const file = event.toolResult?.path; if (!file?.endsWith(".ts")) return; execSync(`prettier --write "${file}"`); execSync("npm test -- --passWithNoTests", { stdio: "inherit" }); } 이는 모든 TypeScript 파일 쓰기 후에 실행되어 형식을 지정한 다음 테스트 스위트를 실행합니다. 대규모 프로젝트에서는 속도가 느립니다. HOOK.md의 Tools 필드를 사용하여 범위를 엄격하게 지정하세요.
팀을 위한 Hooks — 공유 프로젝트 전체에 가드레일 적용
.openclaw/hooks/ 디렉터리를 버전 제어에 커밋합니다. 저장소를 복제하는 모든 개발자는 자동으로 동일한 후크 구성을 갖습니다.
- 프로젝트 구성에서 중요한 후크를
enabled에 잠급니다. — 팀원이 실수로 파일 가드를 비활성화하는 것을 방지합니다. HOOK.md설명을 사용하여 의도를 문서화하세요. — 코드 주석처럼 취급하면 팀원이 읽을 것입니다.- Scope hooks to tool-level granularity — 광범위한 후크는 모든 에이전트 상호 작용 속도를 늦추고 마찰을 일으켜 팀원이 이를 비활성화하게 만듭니다.
- 단일 저장소에서 상위 디렉터리의 후크는 하위 디렉터리 수준에서 재정의되지 않는 한 모든 중첩 프로젝트에 적용됩니다.
CI/CD Integration — OpenClaw Hooks을 비대화식으로 실행
GitHub 작업 또는 헤드리스 환경에서는 대화형 확인 프롬프트로 인해 파이프라인이 중단됩니다. 건너뛰려면 --yes을 사용하세요.
- name: Install hooks non-interactively run: openclaw hooks install qa-pack --yes - name: Run OpenClaw session env: OPENCLAW_HOOKS_ENABLED: "true" SLACK_WEBHOOK_URL: secrets.SLACK_WEBHOOK_URL run: openclaw run --task "audit dependencies" --yes 대화형 확인 없이 후크를 활성화하려면 OPENCLAW_HOOKS_ENABLED=true을 환경 변수로 설정하세요. 이는 CI 모드의 "최소 하나의 항목 구성" 요구 사항을 재정의합니다.
Hook Security: 실행되는 항목, 액세스할 수 있는 항목 및 안전을 유지하는 방법
이것은 대부분의 문서에서 완전히 건너뛰는 부분이며 커뮤니티 후크 팩을 설치하는 경우 가장 중요한 섹션입니다.
액세스할 수 있는 후크: 후크 스크립트는 게이트웨이 프로세스의 전체 권한. 게이트웨이가 사용자 계정으로 실행되는 경우 후크는 계정이 읽을 수 있는 모든 파일을 읽고, 네트워크를 요청하고, 하위 프로세스를 실행하고, 비밀을 포함한 환경 변수에 액세스할 수 있습니다.
검토되지 않은 후크 팩의 위험: 악의적인 후크 팩은 .env, SSH 키 또는 API 토큰을 유출하는 동시에 "형식 코드"와 같은 무해한 작업을 수행하는 것처럼 보일 수 있습니다.
Hook Pack Audit Checklist
타사 팩을 설치하기 전에 다음을 수행하십시오.
- ☐
HOOK.md전체를 읽어보세요. 선언된 권한이 명시된 목적과 일치합니까? - ☐
handler.ts/js의 모든 줄 읽기 —fetch(),execSync,process.env액세스를 찾습니다. - ☐팩이 레지스트리에 배포된 경우 npm 출처를 확인하세요(
npm info <pack> --json | grep provenance). - ☐게시자의 신원을 확인하세요. 알려진 관리자인가요 아니면 새로운 계정인가요?
- ☐
--dry-run을 먼저 실행하고 파일 매니페스트를 검토하세요. - ☐위 단계를 먼저 완료하지 않고
--yes을 사용하여 후크 팩을 설치하지 마십시오.
openclaw hooks inspect 명령은 설치된 후크의 전체 소스 경로를 보여줍니다. 이를 사용하여 업데이트 후 핸들러 코드를 다시 검토합니다.
Troubleshooting OpenClaw Hooks — 실행되지 않을 때
Hook not discovered at all
- 디렉터리가 스캔된 후크 경로(
openclaw hooks list --verbose) 내에 있는지 확인하세요. HOOK.md이 존재하고 유효한지 확인하세요. 필수 필드가 누락되어 자동으로 후크를 건너뜁니다.- 후크가 전역적으로 활성화되어 있고 하나 이상의 항목이 구성되어 있는지 확인하세요.
Hook discovered but not firing
openclaw hooks inspect <name>실행 —HOOK.md의Event필드가 예상한 수명 주기 이벤트와 일치하는지 확인하세요.Tools범위를 확인하세요. 범위를write_file로 지정했지만 에이전트가create_file을 호출하는 경우 후크가 트리거되지 않습니다.- 후크 상태에
loaded이 아닌enabled이 표시되는지 확인합니다(로드됨은 검색되었지만 활성화되지 않았음을 의미함).
Hook fires but handler errors are silent
- 핸들러에
console.error로깅을 사용하여 명시적인try/catch블록을 추가하세요. - 게이트웨이 로그는
~/.openclaw/logs/에 기록됩니다. 가장 최근 세션 로그에서[hook]접두사가 붙은 줄을 확인하세요. openclaw hooks inspect <name> --logs을 사용하여 마지막 실행 출력을 표시합니다.
Hook slowing down every agent action
- 후크별 실행 시간을 확인하려면
openclaw hooks list --timing을 사용하여 프로필을 작성하세요. - 동기
execSync호출을 결과가 에이전트를 차단할 필요가 없는 비동기로 이동합니다. - 모든
PostToolUse이벤트를 구독하는 대신 특정 도구에 대한 범위 후크
EasyClaw으로 AI 에이전트 워크플로를 더욱 발전시키세요
OpenClaw 후크를 사용하면 에이전트 수준에서 제어할 수 있습니다. EasyClaw은 이러한 제어 기능을 제공할 뿐만 아니라 클라우드 의존성 없는 안정성, 개인 정보 보호 및 속도가 필요한 개발자 및 콘텐츠 팀을 위해 구축된 완전한 데스크탑 네이티브 환경을 제공합니다.
- ✓ 후크, 에이전트 및 자동화를 자체 시스템에서 완전히 실행하세요. 데이터가 환경 밖으로 유출되지 않습니다.
- ✓ 기존 개발 도구 체인(린터, 테스트 실행기, 포맷터, CI 파이프라인)과의 기본 통합
- ✓ 시각적 후크 관리 — CLI 플래그를 기억하지 않고도 후크 활성화, 비활성화 및 검사
- ✓ Team 지원: 하나의 대시보드에서 후크 구성, 잠금 가드레일 및 감사 세션 로그를 공유합니다.
Frequently Asked Questions
Q: 후크가 에이전트의 도구 호출 실행을 완전히 중지할 수 있습니까?
A: 예. PreToolUse 후크만 도구 호출을 중단할 수 있습니다. 처리기에서 { abort: true, reason: "..." }을 반환하면 게이트웨이가 도구 실행을 차단합니다. 에이전트는 해당 컨텍스트에서 이유 문자열을 받습니다. PostToolUse, Stop 및 SessionStart 후크는 소급하여 작업을 중단할 수 없습니다.
Q: 후크 핸들러에서 처리되지 않은 오류가 발생하면 어떻게 되나요?
A: 기본적으로 후크 처리기에서 처리되지 않은 오류는 게이트웨이 세션 로그에 기록되지만 에이전트 세션을 중단시키지는 않습니다. 에이전트는 마치 후크가 실행되지 않은 것처럼 계속 진행됩니다. 이는 의도적으로 설계된 것입니다. 후크는 핵심 에이전트 기능을 차단해서는 안 됩니다. 항상 처리기 논리를 try/catch로 래핑하고 오류를 명시적으로 처리하여 오류를 확인할 수 있습니다.
Q: 후크 핸들러에서 async/await을 사용할 수 있습니까?
A: 예, PreToolUse 및 PostToolUse 핸들러는 모두 비동기 기능을 지원합니다. PreToolUse의 경우 게이트웨이는 진행 여부를 결정하기 전에 처리기를 기다립니다. 따라서 비동기 중단 논리가 올바르게 작동합니다. PreToolUse에서 장기 실행 비동기 작업은 모든 도구 호출을 지연시키므로 빠르게 유지하세요.
Q: 후크는 모든 프로젝트에 적용됩니까, 아니면 해당 프로젝트에만 적용됩니까?
A: 프로젝트의 .openclaw/hooks/ 디렉터리에 있는 Hooks은 프로젝트 범위이며 해당 프로젝트의 세션에 대해서만 활성화됩니다. 전역 후크는 ~/.openclaw/hooks/에 배치하고 모든 프로젝트에 적용할 수 있습니다. 단일 저장소에서 상위 디렉터리의 후크는 하위 디렉터리 수준에서 재정의되지 않는 한 중첩된 프로젝트에 적용됩니다.
Q: 많은 후크를 실행하면 성능 비용이 발생합니까?
A: 모든 후크는 구독하는 이벤트에 대기 시간을 추가합니다. 범위가 넓은 빠른 후크(50ms 미만)는 눈에 띄지 않습니다. 도구 수준 범위 지정 없이 후크가 모든 PostToolUse 이벤트에 대해 과도한 동기 작업을 실행하면 문제가 발생합니다. openclaw hooks list --timing을 사용하여 프로파일링하고, HOOK.md의 특정 도구에 대한 후크 범위를 지정하고, 가능한 경우 비차단 작업을 비동기로 이동하세요.
Q: 후크가 환경 변수의 비밀에 안전하게 액세스할 수 있습니까?
A: Hooks은 게이트웨이 프로세스의 전체 환경을 상속하므로 process.env.MY_SECRET은 모든 핸들러 내에서 작동합니다. CI 환경의 경우 하드코딩하는 대신 파이프라인의 비밀 관리자(예: GitHub 작업 비밀)를 통해 비밀을 주입하세요. HOOK.md 또는 핸들러 파일에 비밀을 커밋하지 마십시오. 후크 소스 파일을 검토 및 버전 제어되는 코드로 취급하십시오.
최종 생각 — 작업 흐름에 맞는 올바른 후크 전략 선택
| Scenario | 권장 접근 방식 |
|---|---|
| Solo dev — 민감한 파일 보호 | 내부 후크, PreToolUse, 쓰기 도구 범위로 지정됨 |
| Solo dev — 자동 실행 테스트 | 테스트에 인접한 파일 형식으로 범위가 지정된 내부 후크, PostToolUse |
| Team — 공유 가드레일 시행 | 버전 제어에 후크를 커밋하고 프로젝트 구성에서 중요한 후크를 활성화합니다. |
| Team — 감사 추적 | Stop 공유 로깅 엔드포인트에 이벤트 후크 게시 |
| CI pipeline — 자동화된 세션 | --yes 플래그 + OPENCLAW_HOOKS_ENABLED env var, 유효성 검사 단계의 --dry-run |
| External notifications | Slack/PagerDuty에 대한 fetch()이 포함된 웹훅 또는 Stop 이벤트 후크 |
실제 문제를 해결하는 하나의 후크, 즉 파일 가드 또는 쓰기 후 린터로 시작하십시오. 더 많은 레이어를 추가하기 전에 처음부터 끝까지 작동하도록 하세요. 후크의 힘은 복합적입니다. 범위가 잘 지정된 후크 3개가 원활하게 실행되는 세션은 범위가 좋지 않은 10개의 후크가 있는 세션보다 훨씬 더 안정적입니다.
대부분의 개발자를 위한 가장 영향력 있는 첫 번째 후크: .env 및 비밀 파일에 대한 PreToolUse 가드. 작성하는 데 10분이 걸리고 실행하는 데 유지 관리가 필요 없으며 전체 상담원의 실수가 영구적으로 제거됩니다.