Trang này được dịch từ tài liệu tiếng Anh. Lệnh, định danh và ví dụ giữ nguyên. Runtime 7.24.4 · SDK 2.6.7. Bản tiếng Anh
Hook vòng đời
Trạng thái: Đang hoạt động
Phạm vi: trạng thái hiện tại
Xem xét lần cuối: 2026-08-23
Chủ sở hữu: môi trường chạy ax-code
Hook vòng đời cho phép bạn chạy lệnh shell trên các sự kiện tác nhân mà không dựng lại môi trường chạy. Chúng bổ sung quy tắc quyền và hộp cát cô lập: hook là hiệu ứng phụ tất định (“luôn định dạng”, “không bao giờ force-push”), trong khi lời nhắc vẫn mang tính tham khảo.
Sự kiện
| Sự kiện | Khi nào | Có thể chặn? |
|---|---|---|
| PreToolUse | Trước khi một công cụ thực thi | Có (blockOnFailure: true) |
| PostToolUse | Sau khi một công cụ hoàn tất (args: đối số công cụ). Stdout có giới hạn / phản hồi có cấu trúc được nối vào kết quả công cụ mà mô hình thấy; xem bên dưới |
Không |
| PostToolUseFailure | Sau khi một công cụ ném lỗi (args: { args, error }, văn bản lỗi trần ở 4,000 ký tự). Bắn rồi quên; lỗi vẫn tới mô hình không đổi |
Không |
| Stop | Khi một lượt phiên hoàn tất (gói có thể chạy khi dừng qua tự động hóa) | Không |
| UserPromptSubmit | Khi một lời nhắc người dùng được gửi, trước khi thông điệp được lưu bền | Có (blockOnFailure: true) |
| PreCompact | Trước khi nén phiên chạy (args: { auto, overflow }) |
Không |
| SubagentStop | Khi một tác nhân con task kết thúc (args: { agent, status }) |
Không |
| SessionStart | Khi một phiên cấp cao nhất được tạo (args: { sessionID, title, time }) |
Không |
| SessionEnd | Khi một phiên bị gỡ hoặc lưu trữ (args: { sessionID, reason }, reason là "remove" hoặc "archive") |
Không |
| PostCompact | Sau khi một lần nén phiên hoàn tất thành công (args: { sessionID, reason }, reason là "auto" hoặc "manual"; không bắn khi nén bỏ cuộc, ví dụ khi ngữ cảnh tràn) |
Không |
| Interrupt | Khi người dùng hoặc vận hành viên hủy tường minh một lượt đang chạy (args: { sessionID }; không bắn khi lượt hoàn tất bình thường hoặc dọn dẹp nội bộ) |
Không |
Bốn sự kiện vòng đời phiên (SessionStart, SessionEnd, PostCompact, Interrupt) và PostToolUseFailure chỉ để quan sát: chúng bắn rồi quên, không bao giờ chặn đường vòng đời, và tải của chúng chỉ mang id/lý do/dấu thời gian — không bao giờ văn bản hội thoại, bản tóm tắt, hay đầu ra công cụ. Phiên tác nhân con không bắn SessionStart (chúng đã hiện qua SubagentStop). SubagentStop bắn cho các con được cả task và task_parallel khởi động.
Phản hồi PostToolUse tới mô hình
Một hook PostToolUse có thể trả văn bản lại cho mô hình. Nó được nối vào kết quả công cụ bên trong một
khối <hook_feedback event="PostToolUse">, sau đầu ra của chính công cụ; nó không bao giờ thay đầu ra và không bao giờ chặn.
- Mục cũ (không có
protocol): stdout đã cắt của một hook thoát 0. - Mục
protocol: "claude-code":hookSpecificOutput.additionalContext,reasoncủa một phán quyết{"decision": "block", "reason": "..."}, hoặc stderr khi hook thoát 2. Các lần thoát khác không phải không thì không đóng góp gì.
Phản hồi bị trần ở 4,000 ký tự mỗi hook và 8,000 ký tự mỗi lời gọi công cụ, nên một hook ồn không thể làm ngập
ngữ cảnh. Đây là điều làm gói format-after-edit hữu ích: lời nhắc của nó giờ tới lượt kế tiếp của mô hình thay vì
chỉ nằm trong nhật ký.
Các tên này ánh xạ tới bộ kích hoạt plugin nội bộ của AX Code (tool.execute.before / tool.execute.after) cộng hook lời nhắc, nén, tác nhân con và dừng cấp phiên. Các lời nhắc tiếp tục tổng hợp (lời nhắc agentRouting: "preserve" nội bộ) không bắn UserPromptSubmit.
Bật gói
Hook và plugin dự án thực thi mã do kho kiểm soát, nên .ax-code/hooks.json, .ax-code/plugin/ và plugin được cấu hình theo dự án bị tắt theo mặc định. Sau khi xem lại chúng, hãy chọn tham gia bên ngoài kho khi khởi động AX Code:
AX_CODE_TRUST_PROJECT_CONFIG=1 ax-code
Rồi tạo .ax-code/hooks.json trong dự án của bạn:
{
"packs": ["format-after-edit", "block-force-push", "require-tests-on-stop", "protect-env-files", "log-bash-commands"]
}
Gói chính thức (≥5)
| Gói | Sự kiện | Mô tả |
|---|---|---|
format-after-edit |
PostToolUse | Nhắc tác nhân định dạng sau khi sửa |
block-force-push |
PreToolUse | Chặn git push --force / -f |
require-tests-on-stop |
Stop | Nhắc xác minh sau các đột biến |
protect-env-files |
PreToolUse | Cảnh báo khi công cụ chạm .env |
log-bash-commands |
PreToolUse | Ghi nhật ký lệnh bash để kiểm toán |
Hook tùy chỉnh:
{
"hooks": [
{
"event": "PreToolUse",
"matcher": "bash",
"command": "echo running bash",
"blockOnFailure": false
}
]
}
Giao thức dây Claude Code (bật tùy chọn)
Nếu bạn đã có hook viết cho Claude Code, một mục có thể chọn giao thức
dây Claude Code bằng "protocol": "claude-code":
{
"hooks": [
{
"event": "PreToolUse",
"matcher": "bash",
"command": "my-claude-code-hook.sh",
"protocol": "claude-code"
}
]
}
Với các sự kiện có thể chặn (PreToolUse, UserPromptSubmit), các mục đã chọn tham gia
được giải mã bằng ngữ nghĩa Claude Code thay cho kiểm tra
blockOnFailure:
- Thoát 2 chặn hành động; stderr của hook được hiện làm lý do. Stdout sai dạng vẫn chặn (an toàn khi lỗi).
- Thoát 0 với JSON stdout
{"permissionDecision": "allow"|"deny"|"ask", "reason"?}:allowtiếp tục;denychặn vớireason;asktạm dừng lời gọi công cụ trên một lời nhắc quyềnhooktương tác hiện lý do (mặc định"hook requested user confirmation"). Lời nhắc chỉ tương tác: không quy tắcalways, cấp wildcard, hay tự phê duyệt tự chủ nào có thể trả lời nó, và một lần chạy không tương tác từ chối nó, điều mà mô hình thấy như một từ chối quyền thông thường. Một hook sau trả lờidenythắngasktrước đó.UserPromptSubmitkhông có lời gọi công cụ để gắn lời nhắc, nênaskvẫn chặn ở đó. Dạng Claude Code lồng{"hookSpecificOutput": {"permissionDecision": "...", "permissionDecisionReason": "..."}}được chấp nhận như một bí danh. - Mọi lần thoát khác là lỗi không chặn (được ghi nhật ký, hành động tiếp tục).
Các sự kiện chỉ quan sát bỏ qua bộ giải mã hoàn toàn — chúng không bao giờ có thể chặn.
Các mục không có trường protocol hành xử đúng như trước.
Biến môi trường sẵn có cho lệnh hook:
HOOK_EVENT— các sự kiện PreToolUse, PostToolUse, PostToolUseFailure, Stop, UserPromptSubmit, PreCompact, SubagentStop, SessionStart, SessionEnd, PostCompact và InterruptHOOK_TOOL— id công cụHOOK_SESSION_IDHOOK_ARGS_JSON— đối số công cụ JSONHOOK_ARGS_STDIN=1— đối số JSON đầy đủ luôn có trên stdin;HOOK_ARGS_JSONrỗng với tải lớn hơn 32 KiBHOOK_PACK— tên gói khi áp dụng
Tiến trình con hook thừa hưởng một phiên bản đã làm sạch của môi trường AX Code. AX Code giữ các biến nền tảng và
công cụ thông thường, nhưng gỡ các tên giống bí mật, URL mang thông tin xác thực, trợ giúp thông tin xác thực như SSH_AUTH_SOCK,
và biến tiêm tiến trình như NODE_OPTIONS. Các biến giao thức HOOK_* ở trên được thêm sau
khi làm sạch và luôn sẵn có.
Hook cũ được tin hoàn toàn, cần thông tin xác thực môi trường xung quanh, có thể khôi phục hành vi trước bên ngoài kho:
AX_CODE_HOOKS_FULL_ENV=1 AX_CODE_TRUST_PROJECT_CONFIG=1 ax-code
Cửa thoát này phơi mọi biến môi trường cho mọi hook đã bật. Một kho không thể yêu cầu nó qua
.ax-code/hooks.json; chỉ dùng sau khi xem lại mọi hook và gói.
Ghi chú bảo mật: việc làm sạch môi trường giảm phơi bày thông tin xác thực xung quanh nhưng không hộp cát hóa lệnh hook. Hook vẫn là mã shell tùy ý, có thể đọc tệp truy cập được và dùng mạng máy chủ. Hãy coi chúng là mã đáng tin và xem lại mọi hook và gói đã bật.
Quan hệ với cô lập
Hook không thay hộp cát. Hãy dùng:
- Cô lập ứng dụng cho ranh giới ghi/mạng có thể mang đi
- Cô lập hệ điều hành (backend
"auto"mặc định) cho hộp cát bash được nhân thực thi khi có - Hook cho hiệu ứng phụ chính sách và các chặn cứng như force-push
Xem Chế độ hộp cát và SECURITY.md.