[{"data":1,"prerenderedAt":6144},["ShallowReactive",2],{"navigation":3,"\u002Fadvanced\u002Fhooks-plan":189,"\u002Fadvanced\u002Fhooks-plan-surround":6139},[4,35,57,75,101,123,149,171],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":34},"第 1 章：认识 Claude Code","i-lucide-rocket","\u002Fintro","1.intro",[10,14,18,22,26,30],{"title":11,"path":12,"stem":13},"什么是 Claude Code","\u002Fintro\u002Fwhat-is-claude-code","1.intro\u002F1.what-is-claude-code",{"title":15,"path":16,"stem":17},"Claude Code 与 Copilot、Cursor、Windsurf 的本质区别","\u002Fintro\u002Fvs-competitors","1.intro\u002F2.vs-competitors",{"title":19,"path":20,"stem":21},"AI 编程助手生态全景与选型指南","\u002Fintro\u002Fecosystem-guide","1.intro\u002F3.ecosystem-guide",{"title":23,"path":24,"stem":25},"LLM 的概率本质","\u002Fintro\u002Fllm-probability","1.intro\u002F4.llm-probability",{"title":27,"path":28,"stem":29},"从聊天机器人到 Agent","\u002Fintro\u002Ffrom-chatbot-to-agent","1.intro\u002F5.from-chatbot-to-agent",{"title":31,"path":32,"stem":33},"Claude Code 的 Agentic Loop 全拆解","\u002Fintro\u002Fagentic-loop","1.intro\u002F6.agentic-loop",false,{"title":36,"icon":37,"path":38,"stem":39,"children":40,"page":34},"第 2 章：安装与配置","i-lucide-settings","\u002Fsetup","2.setup",[41,45,49,53],{"title":42,"path":43,"stem":44},"系统要求与安装方式","\u002Fsetup\u002Fsystem-requirements","2.setup\u002F1.system-requirements",{"title":46,"path":47,"stem":48},"认证、登录与多账户管理","\u002Fsetup\u002Fauthentication","2.setup\u002F2.authentication",{"title":50,"path":51,"stem":52},"选择你的界面","\u002Fsetup\u002Fchoose-interface","2.setup\u002F3.choose-interface",{"title":54,"path":55,"stem":56},"Coding Plan","\u002Fsetup\u002Fcoding-plan","2.setup\u002F4.coding-plan",{"title":58,"icon":59,"path":60,"stem":61,"children":62,"page":34},"第 3 章：快速上手","i-lucide-hand","\u002Fquickstart","3.quickstart",[63,67,71],{"title":64,"path":65,"stem":66},"启动、交互模式与基本命令","\u002Fquickstart\u002Fstartup","3.quickstart\u002F1.startup",{"title":68,"path":69,"stem":70},"让 Claude 理解你的项目","\u002Fquickstart\u002Fcodebase-understanding","3.quickstart\u002F2.codebase-understanding",{"title":72,"path":73,"stem":74},"第一次代码变更","\u002Fquickstart\u002Ffirst-change","3.quickstart\u002F3.first-change",{"title":76,"icon":77,"path":78,"stem":79,"children":80,"page":34},"第 4 章：核心功能","i-lucide-laptop","\u002Fcore-features","4.core-features",[81,85,89,93,97],{"title":82,"path":83,"stem":84},"代码库全景扫描与模块关系分析","\u002Fcore-features\u002Fcodebase-scan","4.core-features\u002F1.codebase-scan",{"title":86,"path":87,"stem":88},"代码编辑与生成","\u002Fcore-features\u002Fedit-generate","4.core-features\u002F2.edit-generate",{"title":90,"path":91,"stem":92},"测试与调试","\u002Fcore-features\u002Ftest-debug","4.core-features\u002F3.test-debug",{"title":94,"path":95,"stem":96},"Git 工作流","\u002Fcore-features\u002Fgit-workflow","4.core-features\u002F4.git-workflow",{"title":98,"path":99,"stem":100},"工具链执行","\u002Fcore-features\u002Ftoolchain","4.core-features\u002F5.toolchain",{"title":102,"icon":103,"path":104,"stem":105,"children":106,"page":34},"第 5 章：进阶配置","i-lucide-wrench","\u002Fadvanced","5.advanced",[107,111,115,119],{"title":108,"path":109,"stem":110},"CLAUDE.md","\u002Fadvanced\u002Fclaude-md","5.advanced\u002F1.claude-md",{"title":112,"path":113,"stem":114},"Skills","\u002Fadvanced\u002Fskills","5.advanced\u002F2.skills",{"title":116,"path":117,"stem":118},"MCP","\u002Fadvanced\u002Fmcp","5.advanced\u002F3.mcp",{"title":120,"path":121,"stem":122},"Hooks 与 Plan 模式","\u002Fadvanced\u002Fhooks-plan","5.advanced\u002F4.hooks-plan",{"title":124,"icon":125,"path":126,"stem":127,"children":128,"page":34},"第 6 章：实战开发","i-lucide-hammer","\u002Fpractice","6.practice",[129,133,137,141,145],{"title":130,"path":131,"stem":132},"需求分析与架构设计","\u002Fpractice\u002Frequirements-architecture","6.practice\u002F1.requirements-architecture",{"title":134,"path":135,"stem":136},"项目脚手架搭建与技术选型","\u002Fpractice\u002Fscaffolding","6.practice\u002F2.scaffolding",{"title":138,"path":139,"stem":140},"核心功能实现","\u002Fpractice\u002Fcore-features","6.practice\u002F3.core-features",{"title":142,"path":143,"stem":144},"测试覆盖、代码审查与质量调优","\u002Fpractice\u002Ftesting-quality","6.practice\u002F4.testing-quality",{"title":146,"path":147,"stem":148},"部署上线与成果分享","\u002Fpractice\u002Fdeployment","6.practice\u002F5.deployment",{"title":150,"icon":151,"path":152,"stem":153,"children":154,"page":34},"第 7 章：心法层","i-lucide-brain","\u002Fmindset","7.mindset",[155,159,163,167],{"title":156,"path":157,"stem":158},"提示词设计原则","\u002Fmindset\u002Fprompt-design","7.mindset\u002F1.prompt-design",{"title":160,"path":161,"stem":162},"上下文管理策略","\u002Fmindset\u002Fcontext-management","7.mindset\u002F2.context-management",{"title":164,"path":165,"stem":166},"安全与权限控制","\u002Fmindset\u002Fsecurity","7.mindset\u002F3.security",{"title":168,"path":169,"stem":170},"Boris Cherny 的 9 条实战心法与团队推广经验","\u002Fmindset\u002Fboris-cherny-tips","7.mindset\u002F4.boris-cherny-tips",{"title":172,"icon":173,"path":174,"stem":175,"children":176,"page":34},"附录","i-lucide-paperclip","\u002Fappendix","8.appendix",[177,181,185],{"title":178,"path":179,"stem":180},"常用命令速查表","\u002Fappendix\u002Fa.command-cheatsheet","8.appendix\u002Fa.command-cheatsheet",{"title":182,"path":183,"stem":184},"AI 核心术语汇编","\u002Fappendix\u002Fb.ai-terminology","8.appendix\u002Fb.ai-terminology",{"title":186,"path":187,"stem":188},"资源链接与延伸阅读","\u002Fappendix\u002Fc.resources","8.appendix\u002Fc.resources",{"id":190,"title":120,"body":191,"description":6131,"extension":6132,"links":6133,"meta":6134,"navigation":6136,"path":121,"seo":6137,"stem":122,"__hash__":6138},"docs\u002F5.advanced\u002F4.hooks-plan.md",{"type":192,"value":193,"toc":6077},"minimark",[194,198,203,208,211,221,225,228,233,345,349,432,436,534,538,622,626,732,736,831,835,838,905,908,1221,1225,1228,1282,1288,1431,1436,1458,1462,1465,1543,1596,1600,1627,1631,1635,1840,1844,2021,2025,2273,2277,2504,2640,2644,2821,2825,2976,3109,3124,3128,3131,3295,3299,3426,3430,3434,3441,3446,3472,3476,3481,3497,3502,3518,3523,3571,3575,3602,3606,3609,3641,3644,3648,3652,3777,3781,3786,3811,3816,3824,3828,3834,3868,3903,3921,3925,3929,3932,3936,3941,3952,3957,3986,3990,3998,4002,4070,4075,4082,4086,4091,4123,4128,4148,4152,4357,4360,4402,4406,4409,4434,4438,4453,4457,4461,4468,4472,4483,4487,4497,4564,4568,4571,4577,4638,4642,4669,4673,4677,4683,4687,4692,5008,5013,5048,5053,5418,5423,5595,5599,5602,5607,5759,5764,5899,5904,5969,5973,6073],[195,196,197],"p",{},"Claude Code 的 Hooks 与 Plan 模式共同构成了一套从\"被动审批\"到\"主动防御\"的安全体系。Hooks 是在 Claude Code 生命周期特定节点自动执行的脚本或逻辑，Plan 模式则是将 AI 的\"思考\"与\"执行\"分离的只读分析模式。二者与权限模式、安全分类器、Checkpoint 机制协同工作，形成多层次的自动化安全网。",[199,200,202],"h2",{"id":201},"_1-hooks事件驱动的自动化守卫","1. Hooks：事件驱动的自动化守卫",[204,205,207],"h3",{"id":206},"_11-什么是-hooks","1.1 什么是 Hooks",[195,209,210],{},"Hooks 是用户定义的 shell 命令、HTTP 端点、LLM 提示或子智能体，在 Claude Code 生命周期的特定节点自动执行。与 CLAUDE.md 中的指令不同——后者是\"建议\"，Claude 通常会遵循但不保证——Hooks 是\"确定性\"的，只要事件触发，Hook 就一定会执行。",[212,213,214],"blockquote",{},[195,215,216,220],{},[217,218,219],"strong",{},"核心原则","：CLAUDE.md 用于偏好指导（\"优先使用 Bun 而非 npm\"），Hooks 用于不可违背的规则（\"必须用 Prettier 格式化\"、\"禁止触碰 .env 文件\"）。",[204,222,224],{"id":223},"_12-生命周期事件全景","1.2 生命周期事件全景",[195,226,227],{},"截至 2026 年 3 月，Claude Code 支持 21 个生命周期事件，按触发频率分为三类：",[229,230,232],"h4",{"id":231},"会话级事件每会话触发一次","会话级事件（每会话触发一次）",[234,235,236,255],"table",{},[237,238,239],"thead",{},[240,241,242,246,249,252],"tr",{},[243,244,245],"th",{},"事件",[243,247,248],{},"触发时机",[243,250,251],{},"可拦截",[243,253,254],{},"Matcher 值",[256,257,258,288,310,330],"tbody",{},[240,259,260,267,270,273],{},[261,262,263],"td",{},[264,265,266],"code",{},"SessionStart",[261,268,269],{},"会话开始或恢复时",[261,271,272],{},"否",[261,274,275,278,279,278,282,278,285],{},[264,276,277],{},"startup",", ",[264,280,281],{},"resume",[264,283,284],{},"compact",[264,286,287],{},"clear",[240,289,290,295,298,300],{},[261,291,292],{},[264,293,294],{},"SessionEnd",[261,296,297],{},"会话终止时",[261,299,272],{},[261,301,302,278,304,278,307],{},[264,303,287],{},[264,305,306],{},"logout",[264,308,309],{},"other",[240,311,312,317,320,322],{},[261,313,314],{},[264,315,316],{},"PreCompact",[261,318,319],{},"上下文压缩前",[261,321,272],{},[261,323,324,278,327],{},[264,325,326],{},"manual",[264,328,329],{},"auto",[240,331,332,337,340,342],{},[261,333,334],{},[264,335,336],{},"PostCompact",[261,338,339],{},"上下文压缩完成后",[261,341,272],{},[261,343,344],{},"—",[229,346,348],{"id":347},"轮次级事件每轮对话触发一次","轮次级事件（每轮对话触发一次）",[234,350,351,364],{},[237,352,353],{},[240,354,355,357,359,361],{},[243,356,245],{},[243,358,248],{},[243,360,251],{},[243,362,363],{},"用途",[256,365,366,382,397,412],{},[240,367,368,373,376,379],{},[261,369,370],{},[264,371,372],{},"UserPromptSubmit",[261,374,375],{},"用户提交提示时",[261,377,378],{},"是",[261,380,381],{},"提示验证、上下文增强",[240,383,384,389,392,394],{},[261,385,386],{},[264,387,388],{},"Stop",[261,390,391],{},"主 Agent 完成响应时",[261,393,378],{},[261,395,396],{},"自动提交、任务完成验证",[240,398,399,404,407,409],{},[261,400,401],{},[264,402,403],{},"StopFailure",[261,405,406],{},"主 Agent 执行失败时",[261,408,378],{},[261,410,411],{},"失败恢复、错误日志",[240,413,414,419,422,424],{},[261,415,416],{},[264,417,418],{},"Notification",[261,420,421],{},"通知发送时",[261,423,272],{},[261,425,426,278,429],{},[264,427,428],{},"permission_prompt",[264,430,431],{},"idle_prompt",[229,433,435],{"id":434},"工具级事件每次工具调用触发","工具级事件（每次工具调用触发）",[234,437,438,450],{},[237,439,440],{},[240,441,442,444,446,448],{},[243,443,245],{},[243,445,248],{},[243,447,251],{},[243,449,254],{},[256,451,452,491,506,520],{},[240,453,454,459,462,464],{},[261,455,456],{},[264,457,458],{},"PreToolUse",[261,460,461],{},"工具执行前",[261,463,378],{},[261,465,466,467,278,470,278,473,278,476,278,479,278,482,278,485,278,488],{},"工具名：",[264,468,469],{},"Bash",[264,471,472],{},"Edit",[264,474,475],{},"Write",[264,477,478],{},"Read",[264,480,481],{},"Glob",[264,483,484],{},"Grep",[264,486,487],{},"WebFetch",[264,489,490],{},"mcp__*",[240,492,493,498,501,503],{},[261,494,495],{},[264,496,497],{},"PostToolUse",[261,499,500],{},"工具成功执行后",[261,502,272],{},[261,504,505],{},"同上",[240,507,508,513,516,518],{},[261,509,510],{},[264,511,512],{},"PostToolUseFailure",[261,514,515],{},"工具执行失败后",[261,517,272],{},[261,519,505],{},[240,521,522,527,530,532],{},[261,523,524],{},[264,525,526],{},"PermissionRequest",[261,528,529],{},"权限请求对话框出现时",[261,531,378],{},[261,533,505],{},[229,535,537],{"id":536},"agent-与子智能体事件","Agent 与子智能体事件",[234,539,540,553],{},[237,541,542],{},[240,543,544,546,548,550],{},[243,545,245],{},[243,547,248],{},[243,549,251],{},[243,551,552],{},"说明",[256,554,555,578,592,607],{},[240,556,557,562,565,567],{},[261,558,559],{},[264,560,561],{},"SubagentStart",[261,563,564],{},"子智能体启动时",[261,566,272],{},[261,568,569,570,278,572,278,575],{},"Agent 类型：",[264,571,469],{},[264,573,574],{},"Explore",[264,576,577],{},"Plan",[240,579,580,585,588,590],{},[261,581,582],{},[264,583,584],{},"SubagentStop",[261,586,587],{},"子智能体完成时",[261,589,378],{},[261,591,505],{},[240,593,594,599,602,604],{},[261,595,596],{},[264,597,598],{},"TeammateIdle",[261,600,601],{},"Agent Teams 队友即将空闲时",[261,603,378],{},[261,605,606],{},"重新分配任务",[240,608,609,614,617,619],{},[261,610,611],{},[264,612,613],{},"TaskCompleted",[261,615,616],{},"任务标记为完成时",[261,618,378],{},[261,620,621],{},"完成通知、触发下一任务",[229,623,625],{"id":624},"配置与-worktree-事件","配置与 Worktree 事件",[234,627,628,640],{},[237,629,630],{},[240,631,632,634,636,638],{},[243,633,245],{},[243,635,248],{},[243,637,251],{},[243,639,552],{},[256,641,642,657,672,687,702,717],{},[240,643,644,649,652,654],{},[261,645,646],{},[264,647,648],{},"InstructionsLoaded",[261,650,651],{},"CLAUDE.md 或规则文件加载时",[261,653,272],{},[261,655,656],{},"仅观察，不可控制",[240,658,659,664,667,669],{},[261,660,661],{},[264,662,663],{},"ConfigChange",[261,665,666],{},"会话中配置文件变更时",[261,668,378],{},[261,670,671],{},"审计日志、阻止未授权变更",[240,673,674,679,682,684],{},[261,675,676],{},[264,677,678],{},"WorktreeCreate",[261,680,681],{},"Worktree 创建时",[261,683,272],{},[261,685,686],{},"自定义 Worktree 创建逻辑",[240,688,689,694,697,699],{},[261,690,691],{},[264,692,693],{},"WorktreeRemove",[261,695,696],{},"Worktree 移除时",[261,698,272],{},[261,700,701],{},"清理处理",[240,703,704,709,712,714],{},[261,705,706],{},[264,707,708],{},"Elicitation",[261,710,711],{},"MCP 服务器请求用户输入时",[261,713,378],{},[261,715,716],{},"自动响应或拒绝请求",[240,718,719,724,727,729],{},[261,720,721],{},[264,722,723],{},"ElicitationResult",[261,725,726],{},"用户响应 MCP 请求后",[261,728,378],{},[261,730,731],{},"响应验证、日志",[204,733,735],{"id":734},"_13-四种-hook-处理器类型","1.3 四种 Hook 处理器类型",[234,737,738,754],{},[237,739,740],{},[240,741,742,745,748,751],{},[243,743,744],{},"类型",[243,746,747],{},"描述",[243,749,750],{},"适用场景",[243,752,753],{},"支持的事件",[256,755,756,772,787,815],{},[240,757,758,763,766,769],{},[261,759,760],{},[264,761,762],{},"command",[261,764,765],{},"执行 shell 命令",[261,767,768],{},"格式化、lint、Git 操作、通知、备份",[261,770,771],{},"所有事件",[240,773,774,779,782,785],{},[261,775,776],{},[264,777,778],{},"http",[261,780,781],{},"POST 事件数据到 HTTP 端点",[261,783,784],{},"外部服务集成、共享审计日志",[261,786,771],{},[240,788,789,794,797,800],{},[261,790,791],{},[264,792,793],{},"prompt",[261,795,796],{},"单轮 LLM 评估",[261,798,799],{},"基于上下文的允许\u002F拒绝决策",[261,801,802,278,804,278,806,278,808,278,810,278,812,814],{},[264,803,458],{},[264,805,497],{},[264,807,526],{},[264,809,372],{},[264,811,388],{},[264,813,584],{}," 等",[240,816,817,822,825,828],{},[261,818,819],{},[264,820,821],{},"agent",[261,823,824],{},"多轮子智能体，可访问工具",[261,826,827],{},"需要实际文件状态验证的复杂决策",[261,829,830],{},"同 prompt",[204,832,834],{"id":833},"_14-配置方式","1.4 配置方式",[195,836,837],{},"Hooks 配置在 JSON 设置文件中，支持三级作用域：",[234,839,840,856],{},[237,841,842],{},[240,843,844,847,850,853],{},[243,845,846],{},"位置",[243,848,849],{},"作用域",[243,851,852],{},"可共享",[243,854,855],{},"典型用途",[256,857,858,874,890],{},[240,859,860,865,868,871],{},[261,861,862],{},[264,863,864],{},"~\u002F.claude\u002Fsettings.json",[261,866,867],{},"所有项目",[261,869,870],{},"否（仅本地）",[261,872,873],{},"个人偏好、全局安全策略",[240,875,876,881,884,887],{},[261,877,878],{},[264,879,880],{},".claude\u002Fsettings.json",[261,882,883],{},"单个项目",[261,885,886],{},"是（可提交到 Git）",[261,888,889],{},"团队共享的格式化规则",[240,891,892,897,899,902],{},[261,893,894],{},[264,895,896],{},".claude\u002Fsettings.local.json",[261,898,883],{},[261,900,901],{},"否（gitignored）",[261,903,904],{},"个人敏感配置、本地调试",[195,906,907],{},"基础配置结构：",[909,910,915],"pre",{"className":911,"code":912,"language":913,"meta":914,"style":914},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"hooks\": {\n    \"PreToolUse\": [\n      {\n        \"matcher\": \"Bash\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"echo \\\"$CLAUDE_TOOL_INPUT\\\" | grep -qE 'rm -rf|DROP TABLE' && exit 2 || exit 0\"\n          }\n        ]\n      }\n    ],\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"Write|Edit|MultiEdit\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"npx prettier --write \\\"$CLAUDE_TOOL_INPUT_FILE_PATH\\\"\"\n          }\n        ]\n      }\n    ]\n  }\n}\n","json","",[264,916,917,926,945,961,967,992,1005,1011,1033,1064,1070,1076,1082,1088,1101,1106,1126,1139,1144,1163,1188,1193,1198,1203,1209,1215],{"__ignoreMap":914},[918,919,922],"span",{"class":920,"line":921},"line",1,[918,923,925],{"class":924},"sMK4o","{\n",[918,927,929,932,936,939,942],{"class":920,"line":928},2,[918,930,931],{"class":924},"  \"",[918,933,935],{"class":934},"spNyl","hooks",[918,937,938],{"class":924},"\"",[918,940,941],{"class":924},":",[918,943,944],{"class":924}," {\n",[918,946,948,951,954,956,958],{"class":920,"line":947},3,[918,949,950],{"class":924},"    \"",[918,952,458],{"class":953},"sBMFI",[918,955,938],{"class":924},[918,957,941],{"class":924},[918,959,960],{"class":924}," [\n",[918,962,964],{"class":920,"line":963},4,[918,965,966],{"class":924},"      {\n",[918,968,970,973,977,979,981,984,987,989],{"class":920,"line":969},5,[918,971,972],{"class":924},"        \"",[918,974,976],{"class":975},"sbssI","matcher",[918,978,938],{"class":924},[918,980,941],{"class":924},[918,982,983],{"class":924}," \"",[918,985,469],{"class":986},"sfazB",[918,988,938],{"class":924},[918,990,991],{"class":924},",\n",[918,993,995,997,999,1001,1003],{"class":920,"line":994},6,[918,996,972],{"class":924},[918,998,935],{"class":975},[918,1000,938],{"class":924},[918,1002,941],{"class":924},[918,1004,960],{"class":924},[918,1006,1008],{"class":920,"line":1007},7,[918,1009,1010],{"class":924},"          {\n",[918,1012,1014,1017,1021,1023,1025,1027,1029,1031],{"class":920,"line":1013},8,[918,1015,1016],{"class":924},"            \"",[918,1018,1020],{"class":1019},"swJcz","type",[918,1022,938],{"class":924},[918,1024,941],{"class":924},[918,1026,983],{"class":924},[918,1028,762],{"class":986},[918,1030,938],{"class":924},[918,1032,991],{"class":924},[918,1034,1036,1038,1040,1042,1044,1046,1049,1053,1056,1058,1061],{"class":920,"line":1035},9,[918,1037,1016],{"class":924},[918,1039,762],{"class":1019},[918,1041,938],{"class":924},[918,1043,941],{"class":924},[918,1045,983],{"class":924},[918,1047,1048],{"class":986},"echo ",[918,1050,1052],{"class":1051},"sTEyZ","\\\"",[918,1054,1055],{"class":986},"$CLAUDE_TOOL_INPUT",[918,1057,1052],{"class":1051},[918,1059,1060],{"class":986}," | grep -qE 'rm -rf|DROP TABLE' && exit 2 || exit 0",[918,1062,1063],{"class":924},"\"\n",[918,1065,1067],{"class":920,"line":1066},10,[918,1068,1069],{"class":924},"          }\n",[918,1071,1073],{"class":920,"line":1072},11,[918,1074,1075],{"class":924},"        ]\n",[918,1077,1079],{"class":920,"line":1078},12,[918,1080,1081],{"class":924},"      }\n",[918,1083,1085],{"class":920,"line":1084},13,[918,1086,1087],{"class":924},"    ],\n",[918,1089,1091,1093,1095,1097,1099],{"class":920,"line":1090},14,[918,1092,950],{"class":924},[918,1094,497],{"class":953},[918,1096,938],{"class":924},[918,1098,941],{"class":924},[918,1100,960],{"class":924},[918,1102,1104],{"class":920,"line":1103},15,[918,1105,966],{"class":924},[918,1107,1109,1111,1113,1115,1117,1119,1122,1124],{"class":920,"line":1108},16,[918,1110,972],{"class":924},[918,1112,976],{"class":975},[918,1114,938],{"class":924},[918,1116,941],{"class":924},[918,1118,983],{"class":924},[918,1120,1121],{"class":986},"Write|Edit|MultiEdit",[918,1123,938],{"class":924},[918,1125,991],{"class":924},[918,1127,1129,1131,1133,1135,1137],{"class":920,"line":1128},17,[918,1130,972],{"class":924},[918,1132,935],{"class":975},[918,1134,938],{"class":924},[918,1136,941],{"class":924},[918,1138,960],{"class":924},[918,1140,1142],{"class":920,"line":1141},18,[918,1143,1010],{"class":924},[918,1145,1147,1149,1151,1153,1155,1157,1159,1161],{"class":920,"line":1146},19,[918,1148,1016],{"class":924},[918,1150,1020],{"class":1019},[918,1152,938],{"class":924},[918,1154,941],{"class":924},[918,1156,983],{"class":924},[918,1158,762],{"class":986},[918,1160,938],{"class":924},[918,1162,991],{"class":924},[918,1164,1166,1168,1170,1172,1174,1176,1179,1181,1184,1186],{"class":920,"line":1165},20,[918,1167,1016],{"class":924},[918,1169,762],{"class":1019},[918,1171,938],{"class":924},[918,1173,941],{"class":924},[918,1175,983],{"class":924},[918,1177,1178],{"class":986},"npx prettier --write ",[918,1180,1052],{"class":1051},[918,1182,1183],{"class":986},"$CLAUDE_TOOL_INPUT_FILE_PATH",[918,1185,1052],{"class":1051},[918,1187,1063],{"class":924},[918,1189,1191],{"class":920,"line":1190},21,[918,1192,1069],{"class":924},[918,1194,1196],{"class":920,"line":1195},22,[918,1197,1075],{"class":924},[918,1199,1201],{"class":920,"line":1200},23,[918,1202,1081],{"class":924},[918,1204,1206],{"class":920,"line":1205},24,[918,1207,1208],{"class":924},"    ]\n",[918,1210,1212],{"class":920,"line":1211},25,[918,1213,1214],{"class":924},"  }\n",[918,1216,1218],{"class":920,"line":1217},26,[918,1219,1220],{"class":924},"}\n",[204,1222,1224],{"id":1223},"_15-退出码与决策控制","1.5 退出码与决策控制",[195,1226,1227],{},"Hook 通过退出码和 stdout JSON 输出控制行为：",[234,1229,1230,1243],{},[237,1231,1232],{},[240,1233,1234,1237,1240],{},[243,1235,1236],{},"退出码",[243,1238,1239],{},"含义",[243,1241,1242],{},"效果",[256,1244,1245,1258,1271],{},[240,1246,1247,1252,1255],{},[261,1248,1249],{},[264,1250,1251],{},"0",[261,1253,1254],{},"成功",[261,1256,1257],{},"继续执行，stdout 解析为 JSON 或作为上下文添加",[240,1259,1260,1265,1268],{},[261,1261,1262],{},[264,1263,1264],{},"2",[261,1266,1267],{},"拦截",[261,1269,1270],{},"阻止操作，stderr 反馈给 Claude",[240,1272,1273,1276,1279],{},[261,1274,1275],{},"其他",[261,1277,1278],{},"非阻塞错误",[261,1280,1281],{},"操作继续，stderr 在 verbose 模式显示",[195,1283,1284,1287],{},[217,1285,1286],{},"JSON 结构化输出","（exit 0 时通过 stdout）：",[909,1289,1291],{"className":911,"code":1290,"language":913,"meta":914,"style":914},"{\n  \"hookSpecificOutput\": {\n    \"hookEventName\": \"PreToolUse\",\n    \"permissionDecision\": \"deny\",\n    \"permissionDecisionReason\": \"此命令被项目策略阻止\",\n    \"updatedInput\": {\n      \"command\": \"modified-command\"\n    },\n    \"additionalContext\": \"额外上下文信息\"\n  }\n}\n",[264,1292,1293,1297,1310,1329,1349,1369,1382,1400,1405,1423,1427],{"__ignoreMap":914},[918,1294,1295],{"class":920,"line":921},[918,1296,925],{"class":924},[918,1298,1299,1301,1304,1306,1308],{"class":920,"line":928},[918,1300,931],{"class":924},[918,1302,1303],{"class":934},"hookSpecificOutput",[918,1305,938],{"class":924},[918,1307,941],{"class":924},[918,1309,944],{"class":924},[918,1311,1312,1314,1317,1319,1321,1323,1325,1327],{"class":920,"line":947},[918,1313,950],{"class":924},[918,1315,1316],{"class":953},"hookEventName",[918,1318,938],{"class":924},[918,1320,941],{"class":924},[918,1322,983],{"class":924},[918,1324,458],{"class":986},[918,1326,938],{"class":924},[918,1328,991],{"class":924},[918,1330,1331,1333,1336,1338,1340,1342,1345,1347],{"class":920,"line":963},[918,1332,950],{"class":924},[918,1334,1335],{"class":953},"permissionDecision",[918,1337,938],{"class":924},[918,1339,941],{"class":924},[918,1341,983],{"class":924},[918,1343,1344],{"class":986},"deny",[918,1346,938],{"class":924},[918,1348,991],{"class":924},[918,1350,1351,1353,1356,1358,1360,1362,1365,1367],{"class":920,"line":969},[918,1352,950],{"class":924},[918,1354,1355],{"class":953},"permissionDecisionReason",[918,1357,938],{"class":924},[918,1359,941],{"class":924},[918,1361,983],{"class":924},[918,1363,1364],{"class":986},"此命令被项目策略阻止",[918,1366,938],{"class":924},[918,1368,991],{"class":924},[918,1370,1371,1373,1376,1378,1380],{"class":920,"line":994},[918,1372,950],{"class":924},[918,1374,1375],{"class":953},"updatedInput",[918,1377,938],{"class":924},[918,1379,941],{"class":924},[918,1381,944],{"class":924},[918,1383,1384,1387,1389,1391,1393,1395,1398],{"class":920,"line":1007},[918,1385,1386],{"class":924},"      \"",[918,1388,762],{"class":975},[918,1390,938],{"class":924},[918,1392,941],{"class":924},[918,1394,983],{"class":924},[918,1396,1397],{"class":986},"modified-command",[918,1399,1063],{"class":924},[918,1401,1402],{"class":920,"line":1013},[918,1403,1404],{"class":924},"    },\n",[918,1406,1407,1409,1412,1414,1416,1418,1421],{"class":920,"line":1035},[918,1408,950],{"class":924},[918,1410,1411],{"class":953},"additionalContext",[918,1413,938],{"class":924},[918,1415,941],{"class":924},[918,1417,983],{"class":924},[918,1419,1420],{"class":986},"额外上下文信息",[918,1422,1063],{"class":924},[918,1424,1425],{"class":920,"line":1066},[918,1426,1214],{"class":924},[918,1428,1429],{"class":920,"line":1072},[918,1430,1220],{"class":924},[195,1432,1433,1435],{},[264,1434,1335],{}," 可选值：",[1437,1438,1439,1446,1452],"ul",{},[1440,1441,1442,1445],"li",{},[264,1443,1444],{},"\"allow\""," — 绕过权限系统，自动批准",[1440,1447,1448,1451],{},[264,1449,1450],{},"\"deny\""," — 阻止工具调用",[1440,1453,1454,1457],{},[264,1455,1456],{},"\"ask\""," — 显示正常权限提示",[204,1459,1461],{"id":1460},"_16-异步-hooks","1.6 异步 Hooks",[195,1463,1464],{},"2026 年 1 月新增的异步执行模式：",[909,1466,1468],{"className":911,"code":1467,"language":913,"meta":914,"style":914},"{\n  \"type\": \"command\",\n  \"command\": \"node backup-script.js\",\n  \"async\": true,\n  \"timeout\": 30\n}\n",[264,1469,1470,1474,1492,1511,1525,1539],{"__ignoreMap":914},[918,1471,1472],{"class":920,"line":921},[918,1473,925],{"class":924},[918,1475,1476,1478,1480,1482,1484,1486,1488,1490],{"class":920,"line":928},[918,1477,931],{"class":924},[918,1479,1020],{"class":934},[918,1481,938],{"class":924},[918,1483,941],{"class":924},[918,1485,983],{"class":924},[918,1487,762],{"class":986},[918,1489,938],{"class":924},[918,1491,991],{"class":924},[918,1493,1494,1496,1498,1500,1502,1504,1507,1509],{"class":920,"line":947},[918,1495,931],{"class":924},[918,1497,762],{"class":934},[918,1499,938],{"class":924},[918,1501,941],{"class":924},[918,1503,983],{"class":924},[918,1505,1506],{"class":986},"node backup-script.js",[918,1508,938],{"class":924},[918,1510,991],{"class":924},[918,1512,1513,1515,1518,1520,1522],{"class":920,"line":963},[918,1514,931],{"class":924},[918,1516,1517],{"class":934},"async",[918,1519,938],{"class":924},[918,1521,941],{"class":924},[918,1523,1524],{"class":924}," true,\n",[918,1526,1527,1529,1532,1534,1536],{"class":920,"line":969},[918,1528,931],{"class":924},[918,1530,1531],{"class":934},"timeout",[918,1533,938],{"class":924},[918,1535,941],{"class":924},[918,1537,1538],{"class":975}," 30\n",[918,1540,1541],{"class":920,"line":994},[918,1542,1220],{"class":924},[234,1544,1545,1562],{},[237,1546,1547],{},[240,1548,1549,1552,1555],{},[243,1550,1551],{},"特性",[243,1553,1554],{},"同步 Hooks（默认）",[243,1556,1557,1558,1561],{},"异步 Hooks（",[264,1559,1560],{},"async: true","）",[256,1563,1564,1575,1586],{},[240,1565,1566,1569,1572],{},[261,1567,1568],{},"Claude 行为",[261,1570,1571],{},"等待 Hook 完成",[261,1573,1574],{},"立即继续，不等待",[240,1576,1577,1580,1583],{},[261,1578,1579],{},"拦截能力",[261,1581,1582],{},"可用 exit 2 拦截",[261,1584,1585],{},"无法拦截（不阻塞）",[240,1587,1588,1590,1593],{},[261,1589,750],{},[261,1591,1592],{},"安全检查、权限决策",[261,1594,1595],{},"日志、备份、发送通知",[204,1597,1599],{"id":1598},"_17-环境变量","1.7 环境变量",[1437,1601,1602,1607,1612,1618],{},[1440,1603,1604,1606],{},[264,1605,1055],{},"：当前事件的 JSON 字符串",[1440,1608,1609,1611],{},[264,1610,1183],{},"：工具输入中的文件路径（如有）",[1440,1613,1614,1617],{},[264,1615,1616],{},"$CLAUDE_PROJECT_DIR","：项目根目录绝对路径",[1440,1619,1620,1623,1624,1626],{},[264,1621,1622],{},"$CLAUDE_ENV_FILE","：用于 ",[264,1625,266],{}," 中持久化环境变量到会话",[199,1628,1630],{"id":1629},"_2-hooks-实际应用场景","2. Hooks 实际应用场景",[204,1632,1634],{"id":1633},"_21-提交前自动-lint-与格式化","2.1 提交前自动 Lint 与格式化",[909,1636,1638],{"className":911,"code":1637,"language":913,"meta":914,"style":914},"{\n  \"hooks\": {\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"Write|Edit|MultiEdit\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash -c 'FILE=$(jq -r \\\".tool_input.file_path\\\" \u003C\u003C\u003C \\\"$(cat)\\\"); if [[ \\\"$FILE\\\" == *.ts || \\\"$FILE\\\" == *.tsx || \\\"$FILE\\\" == *.js || \\\"$FILE\\\" == *.jsx ]]; then npx eslint --fix \\\"$FILE\\\" 2>\u002Fdev\u002Fnull; npx prettier --write \\\"$FILE\\\" 2>\u002Fdev\u002Fnull; fi; exit 0'\"\n          }\n        ]\n      }\n    ]\n  }\n}\n",[264,1639,1640,1644,1656,1668,1672,1690,1702,1706,1724,1816,1820,1824,1828,1832,1836],{"__ignoreMap":914},[918,1641,1642],{"class":920,"line":921},[918,1643,925],{"class":924},[918,1645,1646,1648,1650,1652,1654],{"class":920,"line":928},[918,1647,931],{"class":924},[918,1649,935],{"class":934},[918,1651,938],{"class":924},[918,1653,941],{"class":924},[918,1655,944],{"class":924},[918,1657,1658,1660,1662,1664,1666],{"class":920,"line":947},[918,1659,950],{"class":924},[918,1661,497],{"class":953},[918,1663,938],{"class":924},[918,1665,941],{"class":924},[918,1667,960],{"class":924},[918,1669,1670],{"class":920,"line":963},[918,1671,966],{"class":924},[918,1673,1674,1676,1678,1680,1682,1684,1686,1688],{"class":920,"line":969},[918,1675,972],{"class":924},[918,1677,976],{"class":975},[918,1679,938],{"class":924},[918,1681,941],{"class":924},[918,1683,983],{"class":924},[918,1685,1121],{"class":986},[918,1687,938],{"class":924},[918,1689,991],{"class":924},[918,1691,1692,1694,1696,1698,1700],{"class":920,"line":994},[918,1693,972],{"class":924},[918,1695,935],{"class":975},[918,1697,938],{"class":924},[918,1699,941],{"class":924},[918,1701,960],{"class":924},[918,1703,1704],{"class":920,"line":1007},[918,1705,1010],{"class":924},[918,1707,1708,1710,1712,1714,1716,1718,1720,1722],{"class":920,"line":1013},[918,1709,1016],{"class":924},[918,1711,1020],{"class":1019},[918,1713,938],{"class":924},[918,1715,941],{"class":924},[918,1717,983],{"class":924},[918,1719,762],{"class":986},[918,1721,938],{"class":924},[918,1723,991],{"class":924},[918,1725,1726,1728,1730,1732,1734,1736,1739,1741,1744,1746,1749,1751,1754,1756,1759,1761,1764,1766,1769,1771,1773,1775,1778,1780,1782,1784,1787,1789,1791,1793,1796,1798,1800,1802,1805,1807,1809,1811,1814],{"class":920,"line":1035},[918,1727,1016],{"class":924},[918,1729,762],{"class":1019},[918,1731,938],{"class":924},[918,1733,941],{"class":924},[918,1735,983],{"class":924},[918,1737,1738],{"class":986},"bash -c 'FILE=$(jq -r ",[918,1740,1052],{"class":1051},[918,1742,1743],{"class":986},".tool_input.file_path",[918,1745,1052],{"class":1051},[918,1747,1748],{"class":986}," \u003C\u003C\u003C ",[918,1750,1052],{"class":1051},[918,1752,1753],{"class":986},"$(cat)",[918,1755,1052],{"class":1051},[918,1757,1758],{"class":986},"); if [[ ",[918,1760,1052],{"class":1051},[918,1762,1763],{"class":986},"$FILE",[918,1765,1052],{"class":1051},[918,1767,1768],{"class":986}," == *.ts || ",[918,1770,1052],{"class":1051},[918,1772,1763],{"class":986},[918,1774,1052],{"class":1051},[918,1776,1777],{"class":986}," == *.tsx || ",[918,1779,1052],{"class":1051},[918,1781,1763],{"class":986},[918,1783,1052],{"class":1051},[918,1785,1786],{"class":986}," == *.js || ",[918,1788,1052],{"class":1051},[918,1790,1763],{"class":986},[918,1792,1052],{"class":1051},[918,1794,1795],{"class":986}," == *.jsx ]]; then npx eslint --fix ",[918,1797,1052],{"class":1051},[918,1799,1763],{"class":986},[918,1801,1052],{"class":1051},[918,1803,1804],{"class":986}," 2>\u002Fdev\u002Fnull; npx prettier --write ",[918,1806,1052],{"class":1051},[918,1808,1763],{"class":986},[918,1810,1052],{"class":1051},[918,1812,1813],{"class":986}," 2>\u002Fdev\u002Fnull; fi; exit 0'",[918,1815,1063],{"class":924},[918,1817,1818],{"class":920,"line":1066},[918,1819,1069],{"class":924},[918,1821,1822],{"class":920,"line":1072},[918,1823,1075],{"class":924},[918,1825,1826],{"class":920,"line":1078},[918,1827,1081],{"class":924},[918,1829,1830],{"class":920,"line":1084},[918,1831,1208],{"class":924},[918,1833,1834],{"class":920,"line":1090},[918,1835,1214],{"class":924},[918,1837,1838],{"class":920,"line":1103},[918,1839,1220],{"class":924},[204,1841,1843],{"id":1842},"_22-编辑后自动类型检查","2.2 编辑后自动类型检查",[909,1845,1847],{"className":911,"code":1846,"language":913,"meta":914,"style":914},"{\n  \"hooks\": {\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"Write|Edit\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash -c 'FILE=$(jq -r \\\".tool_input.file_path\\\" \u003C\u003C\u003C \\\"$(cat)\\\"); if [[ \\\"$FILE\\\" == *.ts || \\\"$FILE\\\" == *.tsx ]]; then npx tsc --noEmit 2>&1 | head -20; fi; exit 0'\",\n            \"timeout\": 30\n          }\n        ]\n      }\n    ]\n  }\n}\n",[264,1848,1849,1853,1865,1877,1881,1900,1912,1916,1934,1985,1997,2001,2005,2009,2013,2017],{"__ignoreMap":914},[918,1850,1851],{"class":920,"line":921},[918,1852,925],{"class":924},[918,1854,1855,1857,1859,1861,1863],{"class":920,"line":928},[918,1856,931],{"class":924},[918,1858,935],{"class":934},[918,1860,938],{"class":924},[918,1862,941],{"class":924},[918,1864,944],{"class":924},[918,1866,1867,1869,1871,1873,1875],{"class":920,"line":947},[918,1868,950],{"class":924},[918,1870,497],{"class":953},[918,1872,938],{"class":924},[918,1874,941],{"class":924},[918,1876,960],{"class":924},[918,1878,1879],{"class":920,"line":963},[918,1880,966],{"class":924},[918,1882,1883,1885,1887,1889,1891,1893,1896,1898],{"class":920,"line":969},[918,1884,972],{"class":924},[918,1886,976],{"class":975},[918,1888,938],{"class":924},[918,1890,941],{"class":924},[918,1892,983],{"class":924},[918,1894,1895],{"class":986},"Write|Edit",[918,1897,938],{"class":924},[918,1899,991],{"class":924},[918,1901,1902,1904,1906,1908,1910],{"class":920,"line":994},[918,1903,972],{"class":924},[918,1905,935],{"class":975},[918,1907,938],{"class":924},[918,1909,941],{"class":924},[918,1911,960],{"class":924},[918,1913,1914],{"class":920,"line":1007},[918,1915,1010],{"class":924},[918,1917,1918,1920,1922,1924,1926,1928,1930,1932],{"class":920,"line":1013},[918,1919,1016],{"class":924},[918,1921,1020],{"class":1019},[918,1923,938],{"class":924},[918,1925,941],{"class":924},[918,1927,983],{"class":924},[918,1929,762],{"class":986},[918,1931,938],{"class":924},[918,1933,991],{"class":924},[918,1935,1936,1938,1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966,1968,1970,1972,1974,1976,1978,1981,1983],{"class":920,"line":1035},[918,1937,1016],{"class":924},[918,1939,762],{"class":1019},[918,1941,938],{"class":924},[918,1943,941],{"class":924},[918,1945,983],{"class":924},[918,1947,1738],{"class":986},[918,1949,1052],{"class":1051},[918,1951,1743],{"class":986},[918,1953,1052],{"class":1051},[918,1955,1748],{"class":986},[918,1957,1052],{"class":1051},[918,1959,1753],{"class":986},[918,1961,1052],{"class":1051},[918,1963,1758],{"class":986},[918,1965,1052],{"class":1051},[918,1967,1763],{"class":986},[918,1969,1052],{"class":1051},[918,1971,1768],{"class":986},[918,1973,1052],{"class":1051},[918,1975,1763],{"class":986},[918,1977,1052],{"class":1051},[918,1979,1980],{"class":986}," == *.tsx ]]; then npx tsc --noEmit 2>&1 | head -20; fi; exit 0'",[918,1982,938],{"class":924},[918,1984,991],{"class":924},[918,1986,1987,1989,1991,1993,1995],{"class":920,"line":1066},[918,1988,1016],{"class":924},[918,1990,1531],{"class":1019},[918,1992,938],{"class":924},[918,1994,941],{"class":924},[918,1996,1538],{"class":975},[918,1998,1999],{"class":920,"line":1072},[918,2000,1069],{"class":924},[918,2002,2003],{"class":920,"line":1078},[918,2004,1075],{"class":924},[918,2006,2007],{"class":920,"line":1084},[918,2008,1081],{"class":924},[918,2010,2011],{"class":920,"line":1090},[918,2012,1208],{"class":924},[918,2014,2015],{"class":920,"line":1103},[918,2016,1214],{"class":924},[918,2018,2019],{"class":920,"line":1108},[918,2020,1220],{"class":924},[204,2022,2024],{"id":2023},"_23-阻止危险命令","2.3 阻止危险命令",[909,2026,2028],{"className":911,"code":2027,"language":913,"meta":914,"style":914},"{\n  \"hooks\": {\n    \"PreToolUse\": [\n      {\n        \"matcher\": \"Bash\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash -c 'CMD=$(jq -r \\\".tool_input.command\\\" \u003C\u003C\u003C \\\"$(cat)\\\"); for p in \\\"rm -rf \u002F\\\" \\\"rm -rf ~\\\" \\\"drop table\\\" \\\"DROP TABLE\\\" \\\"truncate\\\" \\\"TRUNCATE\\\" \\\"--force\\\" \\\"push.*--force\\\"; do if echo \\\"$CMD\\\" | grep -qiE \\\"$p\\\"; then echo \\\"Blocked: pattern \\\\\\\"$p\\\\\\\" detected\\\" >&2; exit 2; fi; done; exit 0'\"\n          }\n        ]\n      }\n    ]\n  }\n}\n",[264,2029,2030,2034,2046,2058,2062,2080,2092,2096,2114,2249,2253,2257,2261,2265,2269],{"__ignoreMap":914},[918,2031,2032],{"class":920,"line":921},[918,2033,925],{"class":924},[918,2035,2036,2038,2040,2042,2044],{"class":920,"line":928},[918,2037,931],{"class":924},[918,2039,935],{"class":934},[918,2041,938],{"class":924},[918,2043,941],{"class":924},[918,2045,944],{"class":924},[918,2047,2048,2050,2052,2054,2056],{"class":920,"line":947},[918,2049,950],{"class":924},[918,2051,458],{"class":953},[918,2053,938],{"class":924},[918,2055,941],{"class":924},[918,2057,960],{"class":924},[918,2059,2060],{"class":920,"line":963},[918,2061,966],{"class":924},[918,2063,2064,2066,2068,2070,2072,2074,2076,2078],{"class":920,"line":969},[918,2065,972],{"class":924},[918,2067,976],{"class":975},[918,2069,938],{"class":924},[918,2071,941],{"class":924},[918,2073,983],{"class":924},[918,2075,469],{"class":986},[918,2077,938],{"class":924},[918,2079,991],{"class":924},[918,2081,2082,2084,2086,2088,2090],{"class":920,"line":994},[918,2083,972],{"class":924},[918,2085,935],{"class":975},[918,2087,938],{"class":924},[918,2089,941],{"class":924},[918,2091,960],{"class":924},[918,2093,2094],{"class":920,"line":1007},[918,2095,1010],{"class":924},[918,2097,2098,2100,2102,2104,2106,2108,2110,2112],{"class":920,"line":1013},[918,2099,1016],{"class":924},[918,2101,1020],{"class":1019},[918,2103,938],{"class":924},[918,2105,941],{"class":924},[918,2107,983],{"class":924},[918,2109,762],{"class":986},[918,2111,938],{"class":924},[918,2113,991],{"class":924},[918,2115,2116,2118,2120,2122,2124,2126,2129,2131,2134,2136,2138,2140,2142,2144,2147,2149,2152,2154,2157,2160,2162,2164,2167,2169,2171,2174,2176,2178,2181,2183,2185,2188,2190,2192,2195,2197,2199,2202,2204,2207,2209,2212,2214,2217,2219,2222,2224,2227,2229,2232,2235,2237,2239,2242,2244,2247],{"class":920,"line":1035},[918,2117,1016],{"class":924},[918,2119,762],{"class":1019},[918,2121,938],{"class":924},[918,2123,941],{"class":924},[918,2125,983],{"class":924},[918,2127,2128],{"class":986},"bash -c 'CMD=$(jq -r ",[918,2130,1052],{"class":1051},[918,2132,2133],{"class":986},".tool_input.command",[918,2135,1052],{"class":1051},[918,2137,1748],{"class":986},[918,2139,1052],{"class":1051},[918,2141,1753],{"class":986},[918,2143,1052],{"class":1051},[918,2145,2146],{"class":986},"); for p in ",[918,2148,1052],{"class":1051},[918,2150,2151],{"class":986},"rm -rf \u002F",[918,2153,1052],{"class":1051},[918,2155,2156],{"class":1051}," \\\"",[918,2158,2159],{"class":986},"rm -rf ~",[918,2161,1052],{"class":1051},[918,2163,2156],{"class":1051},[918,2165,2166],{"class":986},"drop table",[918,2168,1052],{"class":1051},[918,2170,2156],{"class":1051},[918,2172,2173],{"class":986},"DROP TABLE",[918,2175,1052],{"class":1051},[918,2177,2156],{"class":1051},[918,2179,2180],{"class":986},"truncate",[918,2182,1052],{"class":1051},[918,2184,2156],{"class":1051},[918,2186,2187],{"class":986},"TRUNCATE",[918,2189,1052],{"class":1051},[918,2191,2156],{"class":1051},[918,2193,2194],{"class":986},"--force",[918,2196,1052],{"class":1051},[918,2198,2156],{"class":1051},[918,2200,2201],{"class":986},"push.*--force",[918,2203,1052],{"class":1051},[918,2205,2206],{"class":986},"; do if echo ",[918,2208,1052],{"class":1051},[918,2210,2211],{"class":986},"$CMD",[918,2213,1052],{"class":1051},[918,2215,2216],{"class":986}," | grep -qiE ",[918,2218,1052],{"class":1051},[918,2220,2221],{"class":986},"$p",[918,2223,1052],{"class":1051},[918,2225,2226],{"class":986},"; then echo ",[918,2228,1052],{"class":1051},[918,2230,2231],{"class":986},"Blocked: pattern ",[918,2233,2234],{"class":1051},"\\\\\\\"",[918,2236,2221],{"class":986},[918,2238,2234],{"class":1051},[918,2240,2241],{"class":986}," detected",[918,2243,1052],{"class":1051},[918,2245,2246],{"class":986}," >&2; exit 2; fi; done; exit 0'",[918,2248,1063],{"class":924},[918,2250,2251],{"class":920,"line":1066},[918,2252,1069],{"class":924},[918,2254,2255],{"class":920,"line":1072},[918,2256,1075],{"class":924},[918,2258,2259],{"class":920,"line":1078},[918,2260,1081],{"class":924},[918,2262,2263],{"class":920,"line":1084},[918,2264,1208],{"class":924},[918,2266,2267],{"class":920,"line":1090},[918,2268,1214],{"class":924},[918,2270,2271],{"class":920,"line":1103},[918,2272,1220],{"class":924},[204,2274,2276],{"id":2275},"_24-保护敏感文件","2.4 保护敏感文件",[909,2278,2282],{"className":2279,"code":2280,"language":2281,"meta":914,"style":914},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","#!\u002Fbin\u002Fbash\n# .claude\u002Fhooks\u002Fprotect-files.sh\nINPUT=$(cat)\nFILE=$(echo \"$INPUT\" | jq -r '.tool_input.file_path \u002F\u002F empty')\nPROTECTED=(\".env\" \".env.local\" \"secrets\u002F\" \".git\u002F\" \"package-lock.json\" \"pnpm-lock.yaml\")\nfor pattern in \"${PROTECTED[@]}\"; do\n  if [[ \"$FILE\" == *\"$pattern\"* ]]; then\n    echo \"Protected file: $pattern\" >&2\n    exit 2\n  fi\ndone\nexit 0\n","bash",[264,2283,2284,2290,2295,2309,2347,2399,2425,2461,2478,2486,2491,2496],{"__ignoreMap":914},[918,2285,2286],{"class":920,"line":921},[918,2287,2289],{"class":2288},"sHwdD","#!\u002Fbin\u002Fbash\n",[918,2291,2292],{"class":920,"line":928},[918,2293,2294],{"class":2288},"# .claude\u002Fhooks\u002Fprotect-files.sh\n",[918,2296,2297,2300,2303,2306],{"class":920,"line":947},[918,2298,2299],{"class":1051},"INPUT",[918,2301,2302],{"class":924},"=$(",[918,2304,2305],{"class":953},"cat",[918,2307,2308],{"class":924},")\n",[918,2310,2311,2314,2316,2320,2322,2325,2327,2330,2333,2336,2339,2342,2345],{"class":920,"line":963},[918,2312,2313],{"class":1051},"FILE",[918,2315,2302],{"class":924},[918,2317,2319],{"class":2318},"s2Zo4","echo",[918,2321,983],{"class":924},[918,2323,2324],{"class":1051},"$INPUT",[918,2326,938],{"class":924},[918,2328,2329],{"class":924}," |",[918,2331,2332],{"class":953}," jq",[918,2334,2335],{"class":986}," -r",[918,2337,2338],{"class":924}," '",[918,2340,2341],{"class":986},".tool_input.file_path \u002F\u002F empty",[918,2343,2344],{"class":924},"'",[918,2346,2308],{"class":924},[918,2348,2349,2352,2355,2357,2360,2362,2364,2367,2369,2371,2374,2376,2378,2381,2383,2385,2388,2390,2392,2395,2397],{"class":920,"line":969},[918,2350,2351],{"class":1051},"PROTECTED",[918,2353,2354],{"class":924},"=(",[918,2356,938],{"class":924},[918,2358,2359],{"class":986},".env",[918,2361,938],{"class":924},[918,2363,983],{"class":924},[918,2365,2366],{"class":986},".env.local",[918,2368,938],{"class":924},[918,2370,983],{"class":924},[918,2372,2373],{"class":986},"secrets\u002F",[918,2375,938],{"class":924},[918,2377,983],{"class":924},[918,2379,2380],{"class":986},".git\u002F",[918,2382,938],{"class":924},[918,2384,983],{"class":924},[918,2386,2387],{"class":986},"package-lock.json",[918,2389,938],{"class":924},[918,2391,983],{"class":924},[918,2393,2394],{"class":986},"pnpm-lock.yaml",[918,2396,938],{"class":924},[918,2398,2308],{"class":924},[918,2400,2401,2405,2408,2411,2414,2416,2419,2422],{"class":920,"line":994},[918,2402,2404],{"class":2403},"s7zQu","for",[918,2406,2407],{"class":1051}," pattern ",[918,2409,2410],{"class":2403},"in",[918,2412,2413],{"class":924}," \"${",[918,2415,2351],{"class":1051},[918,2417,2418],{"class":924},"[@]}\"",[918,2420,2421],{"class":924},";",[918,2423,2424],{"class":2403}," do\n",[918,2426,2427,2430,2433,2435,2437,2439,2442,2445,2447,2450,2452,2455,2458],{"class":920,"line":1007},[918,2428,2429],{"class":2403},"  if",[918,2431,2432],{"class":924}," [[",[918,2434,983],{"class":924},[918,2436,1763],{"class":1051},[918,2438,938],{"class":924},[918,2440,2441],{"class":924}," ==",[918,2443,2444],{"class":924}," *",[918,2446,938],{"class":924},[918,2448,2449],{"class":1051},"$pattern",[918,2451,938],{"class":924},[918,2453,2454],{"class":924},"*",[918,2456,2457],{"class":924}," ]];",[918,2459,2460],{"class":2403}," then\n",[918,2462,2463,2466,2468,2471,2473,2475],{"class":920,"line":1013},[918,2464,2465],{"class":2318},"    echo",[918,2467,983],{"class":924},[918,2469,2470],{"class":986},"Protected file: ",[918,2472,2449],{"class":1051},[918,2474,938],{"class":924},[918,2476,2477],{"class":924}," >&2\n",[918,2479,2480,2483],{"class":920,"line":1035},[918,2481,2482],{"class":2318},"    exit",[918,2484,2485],{"class":975}," 2\n",[918,2487,2488],{"class":920,"line":1066},[918,2489,2490],{"class":2403},"  fi\n",[918,2492,2493],{"class":920,"line":1072},[918,2494,2495],{"class":2403},"done\n",[918,2497,2498,2501],{"class":920,"line":1078},[918,2499,2500],{"class":2318},"exit",[918,2502,2503],{"class":975}," 0\n",[909,2505,2507],{"className":911,"code":2506,"language":913,"meta":914,"style":914},"{\n  \"hooks\": {\n    \"PreToolUse\": [\n      {\n        \"matcher\": \"Write|Edit\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"\\\"$CLAUDE_PROJECT_DIR\\\"\u002F.claude\u002Fhooks\u002Fprotect-files.sh\"\n          }\n        ]\n      }\n    ]\n  }\n}\n",[264,2508,2509,2513,2525,2537,2541,2559,2571,2575,2593,2616,2620,2624,2628,2632,2636],{"__ignoreMap":914},[918,2510,2511],{"class":920,"line":921},[918,2512,925],{"class":924},[918,2514,2515,2517,2519,2521,2523],{"class":920,"line":928},[918,2516,931],{"class":924},[918,2518,935],{"class":934},[918,2520,938],{"class":924},[918,2522,941],{"class":924},[918,2524,944],{"class":924},[918,2526,2527,2529,2531,2533,2535],{"class":920,"line":947},[918,2528,950],{"class":924},[918,2530,458],{"class":953},[918,2532,938],{"class":924},[918,2534,941],{"class":924},[918,2536,960],{"class":924},[918,2538,2539],{"class":920,"line":963},[918,2540,966],{"class":924},[918,2542,2543,2545,2547,2549,2551,2553,2555,2557],{"class":920,"line":969},[918,2544,972],{"class":924},[918,2546,976],{"class":975},[918,2548,938],{"class":924},[918,2550,941],{"class":924},[918,2552,983],{"class":924},[918,2554,1895],{"class":986},[918,2556,938],{"class":924},[918,2558,991],{"class":924},[918,2560,2561,2563,2565,2567,2569],{"class":920,"line":994},[918,2562,972],{"class":924},[918,2564,935],{"class":975},[918,2566,938],{"class":924},[918,2568,941],{"class":924},[918,2570,960],{"class":924},[918,2572,2573],{"class":920,"line":1007},[918,2574,1010],{"class":924},[918,2576,2577,2579,2581,2583,2585,2587,2589,2591],{"class":920,"line":1013},[918,2578,1016],{"class":924},[918,2580,1020],{"class":1019},[918,2582,938],{"class":924},[918,2584,941],{"class":924},[918,2586,983],{"class":924},[918,2588,762],{"class":986},[918,2590,938],{"class":924},[918,2592,991],{"class":924},[918,2594,2595,2597,2599,2601,2603,2605,2607,2609,2611,2614],{"class":920,"line":1035},[918,2596,1016],{"class":924},[918,2598,762],{"class":1019},[918,2600,938],{"class":924},[918,2602,941],{"class":924},[918,2604,983],{"class":924},[918,2606,1052],{"class":1051},[918,2608,1616],{"class":986},[918,2610,1052],{"class":1051},[918,2612,2613],{"class":986},"\u002F.claude\u002Fhooks\u002Fprotect-files.sh",[918,2615,1063],{"class":924},[918,2617,2618],{"class":920,"line":1066},[918,2619,1069],{"class":924},[918,2621,2622],{"class":920,"line":1072},[918,2623,1075],{"class":924},[918,2625,2626],{"class":920,"line":1078},[918,2627,1081],{"class":924},[918,2629,2630],{"class":920,"line":1084},[918,2631,1208],{"class":924},[918,2633,2634],{"class":920,"line":1090},[918,2635,1214],{"class":924},[918,2637,2638],{"class":920,"line":1103},[918,2639,1220],{"class":924},[204,2641,2643],{"id":2642},"_25-会话开始时注入上下文","2.5 会话开始时注入上下文",[909,2645,2647],{"className":911,"code":2646,"language":913,"meta":914,"style":914},"{\n  \"hooks\": {\n    \"SessionStart\": [\n      {\n        \"matcher\": \"startup|resume\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash -c 'BRANCH=$(git -C \\\"$CLAUDE_PROJECT_DIR\\\" branch --show-current 2>\u002Fdev\u002Fnull); echo \\\"{\\\\\\\"additionalContext\\\\\\\": \\\\\\\"Current branch: $BRANCH. Recent commits: $(git -C \\\"$CLAUDE_PROJECT_DIR\\\" log --oneline -3 2>\u002Fdev\u002Fnull)\\\\\\\"}\\\"'\"\n          }\n        ]\n      }\n    ]\n  }\n}\n",[264,2648,2649,2653,2665,2677,2681,2700,2712,2716,2734,2797,2801,2805,2809,2813,2817],{"__ignoreMap":914},[918,2650,2651],{"class":920,"line":921},[918,2652,925],{"class":924},[918,2654,2655,2657,2659,2661,2663],{"class":920,"line":928},[918,2656,931],{"class":924},[918,2658,935],{"class":934},[918,2660,938],{"class":924},[918,2662,941],{"class":924},[918,2664,944],{"class":924},[918,2666,2667,2669,2671,2673,2675],{"class":920,"line":947},[918,2668,950],{"class":924},[918,2670,266],{"class":953},[918,2672,938],{"class":924},[918,2674,941],{"class":924},[918,2676,960],{"class":924},[918,2678,2679],{"class":920,"line":963},[918,2680,966],{"class":924},[918,2682,2683,2685,2687,2689,2691,2693,2696,2698],{"class":920,"line":969},[918,2684,972],{"class":924},[918,2686,976],{"class":975},[918,2688,938],{"class":924},[918,2690,941],{"class":924},[918,2692,983],{"class":924},[918,2694,2695],{"class":986},"startup|resume",[918,2697,938],{"class":924},[918,2699,991],{"class":924},[918,2701,2702,2704,2706,2708,2710],{"class":920,"line":994},[918,2703,972],{"class":924},[918,2705,935],{"class":975},[918,2707,938],{"class":924},[918,2709,941],{"class":924},[918,2711,960],{"class":924},[918,2713,2714],{"class":920,"line":1007},[918,2715,1010],{"class":924},[918,2717,2718,2720,2722,2724,2726,2728,2730,2732],{"class":920,"line":1013},[918,2719,1016],{"class":924},[918,2721,1020],{"class":1019},[918,2723,938],{"class":924},[918,2725,941],{"class":924},[918,2727,983],{"class":924},[918,2729,762],{"class":986},[918,2731,938],{"class":924},[918,2733,991],{"class":924},[918,2735,2736,2738,2740,2742,2744,2746,2749,2751,2753,2755,2758,2760,2763,2765,2767,2769,2772,2774,2777,2779,2781,2783,2786,2788,2791,2793,2795],{"class":920,"line":1035},[918,2737,1016],{"class":924},[918,2739,762],{"class":1019},[918,2741,938],{"class":924},[918,2743,941],{"class":924},[918,2745,983],{"class":924},[918,2747,2748],{"class":986},"bash -c 'BRANCH=$(git -C ",[918,2750,1052],{"class":1051},[918,2752,1616],{"class":986},[918,2754,1052],{"class":1051},[918,2756,2757],{"class":986}," branch --show-current 2>\u002Fdev\u002Fnull); echo ",[918,2759,1052],{"class":1051},[918,2761,2762],{"class":986},"{",[918,2764,2234],{"class":1051},[918,2766,1411],{"class":986},[918,2768,2234],{"class":1051},[918,2770,2771],{"class":986},": ",[918,2773,2234],{"class":1051},[918,2775,2776],{"class":986},"Current branch: $BRANCH. Recent commits: $(git -C ",[918,2778,1052],{"class":1051},[918,2780,1616],{"class":986},[918,2782,1052],{"class":1051},[918,2784,2785],{"class":986}," log --oneline -3 2>\u002Fdev\u002Fnull)",[918,2787,2234],{"class":1051},[918,2789,2790],{"class":986},"}",[918,2792,1052],{"class":1051},[918,2794,2344],{"class":986},[918,2796,1063],{"class":924},[918,2798,2799],{"class":920,"line":1066},[918,2800,1069],{"class":924},[918,2802,2803],{"class":920,"line":1072},[918,2804,1075],{"class":924},[918,2806,2807],{"class":920,"line":1078},[918,2808,1081],{"class":924},[918,2810,2811],{"class":920,"line":1084},[918,2812,1208],{"class":924},[918,2814,2815],{"class":920,"line":1090},[918,2816,1214],{"class":924},[918,2818,2819],{"class":920,"line":1103},[918,2820,1220],{"class":924},[204,2822,2824],{"id":2823},"_26-任务完成前强制测试通过","2.6 任务完成前强制测试通过",[909,2826,2828],{"className":2279,"code":2827,"language":2281,"meta":914,"style":914},"#!\u002Fbin\u002Fbash\n# .claude\u002Fhooks\u002Fverify-tests.sh\nINPUT=$(cat)\n# 防止无限循环\nif [ \"$(echo \"$INPUT\" | jq -r '.stop_hook_active')\" = \"true\" ]; then\n  exit 0\nfi\n# 运行测试\nif ! npm test --silent 2>\u002Fdev\u002Fnull; then\n  echo \"Tests are failing. Fix them before finishing.\" >&2\n  exit 2\nfi\nexit 0\n",[264,2829,2830,2834,2839,2849,2854,2903,2910,2915,2920,2946,2960,2966,2970],{"__ignoreMap":914},[918,2831,2832],{"class":920,"line":921},[918,2833,2289],{"class":2288},[918,2835,2836],{"class":920,"line":928},[918,2837,2838],{"class":2288},"# .claude\u002Fhooks\u002Fverify-tests.sh\n",[918,2840,2841,2843,2845,2847],{"class":920,"line":947},[918,2842,2299],{"class":1051},[918,2844,2302],{"class":924},[918,2846,2305],{"class":953},[918,2848,2308],{"class":924},[918,2850,2851],{"class":920,"line":963},[918,2852,2853],{"class":2288},"# 防止无限循环\n",[918,2855,2856,2859,2862,2865,2867,2869,2871,2873,2875,2877,2880,2882,2885,2888,2891,2893,2896,2898,2901],{"class":920,"line":969},[918,2857,2858],{"class":2403},"if",[918,2860,2861],{"class":924}," [",[918,2863,2864],{"class":924}," \"$(",[918,2866,2319],{"class":2318},[918,2868,983],{"class":924},[918,2870,2324],{"class":1051},[918,2872,938],{"class":924},[918,2874,2329],{"class":924},[918,2876,2332],{"class":953},[918,2878,2879],{"class":986}," -r ",[918,2881,2344],{"class":924},[918,2883,2884],{"class":986},".stop_hook_active",[918,2886,2887],{"class":924},"')\"",[918,2889,2890],{"class":924}," =",[918,2892,983],{"class":924},[918,2894,2895],{"class":986},"true",[918,2897,938],{"class":924},[918,2899,2900],{"class":924}," ];",[918,2902,2460],{"class":2403},[918,2904,2905,2908],{"class":920,"line":994},[918,2906,2907],{"class":2318},"  exit",[918,2909,2503],{"class":975},[918,2911,2912],{"class":920,"line":1007},[918,2913,2914],{"class":2403},"fi\n",[918,2916,2917],{"class":920,"line":1013},[918,2918,2919],{"class":2288},"# 运行测试\n",[918,2921,2922,2924,2927,2930,2933,2936,2939,2942,2944],{"class":920,"line":1035},[918,2923,2858],{"class":2403},[918,2925,2926],{"class":924}," !",[918,2928,2929],{"class":953}," npm",[918,2931,2932],{"class":986}," test",[918,2934,2935],{"class":986}," --silent",[918,2937,2938],{"class":924}," 2>",[918,2940,2941],{"class":986},"\u002Fdev\u002Fnull",[918,2943,2421],{"class":924},[918,2945,2460],{"class":2403},[918,2947,2948,2951,2953,2956,2958],{"class":920,"line":1066},[918,2949,2950],{"class":2318},"  echo",[918,2952,983],{"class":924},[918,2954,2955],{"class":986},"Tests are failing. Fix them before finishing.",[918,2957,938],{"class":924},[918,2959,2477],{"class":924},[918,2961,2962,2964],{"class":920,"line":1072},[918,2963,2907],{"class":2318},[918,2965,2485],{"class":975},[918,2967,2968],{"class":920,"line":1078},[918,2969,2914],{"class":2403},[918,2971,2972,2974],{"class":920,"line":1084},[918,2973,2500],{"class":2318},[918,2975,2503],{"class":975},[909,2977,2979],{"className":911,"code":2978,"language":913,"meta":914,"style":914},"{\n  \"hooks\": {\n    \"Stop\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"\\\"$CLAUDE_PROJECT_DIR\\\"\u002F.claude\u002Fhooks\u002Fverify-tests.sh\",\n            \"timeout\": 60\n          }\n        ]\n      }\n    ]\n  }\n}\n",[264,2980,2981,2985,2997,3009,3013,3025,3029,3047,3072,3085,3089,3093,3097,3101,3105],{"__ignoreMap":914},[918,2982,2983],{"class":920,"line":921},[918,2984,925],{"class":924},[918,2986,2987,2989,2991,2993,2995],{"class":920,"line":928},[918,2988,931],{"class":924},[918,2990,935],{"class":934},[918,2992,938],{"class":924},[918,2994,941],{"class":924},[918,2996,944],{"class":924},[918,2998,2999,3001,3003,3005,3007],{"class":920,"line":947},[918,3000,950],{"class":924},[918,3002,388],{"class":953},[918,3004,938],{"class":924},[918,3006,941],{"class":924},[918,3008,960],{"class":924},[918,3010,3011],{"class":920,"line":963},[918,3012,966],{"class":924},[918,3014,3015,3017,3019,3021,3023],{"class":920,"line":969},[918,3016,972],{"class":924},[918,3018,935],{"class":975},[918,3020,938],{"class":924},[918,3022,941],{"class":924},[918,3024,960],{"class":924},[918,3026,3027],{"class":920,"line":994},[918,3028,1010],{"class":924},[918,3030,3031,3033,3035,3037,3039,3041,3043,3045],{"class":920,"line":1007},[918,3032,1016],{"class":924},[918,3034,1020],{"class":1019},[918,3036,938],{"class":924},[918,3038,941],{"class":924},[918,3040,983],{"class":924},[918,3042,762],{"class":986},[918,3044,938],{"class":924},[918,3046,991],{"class":924},[918,3048,3049,3051,3053,3055,3057,3059,3061,3063,3065,3068,3070],{"class":920,"line":1013},[918,3050,1016],{"class":924},[918,3052,762],{"class":1019},[918,3054,938],{"class":924},[918,3056,941],{"class":924},[918,3058,983],{"class":924},[918,3060,1052],{"class":1051},[918,3062,1616],{"class":986},[918,3064,1052],{"class":1051},[918,3066,3067],{"class":986},"\u002F.claude\u002Fhooks\u002Fverify-tests.sh",[918,3069,938],{"class":924},[918,3071,991],{"class":924},[918,3073,3074,3076,3078,3080,3082],{"class":920,"line":1035},[918,3075,1016],{"class":924},[918,3077,1531],{"class":1019},[918,3079,938],{"class":924},[918,3081,941],{"class":924},[918,3083,3084],{"class":975}," 60\n",[918,3086,3087],{"class":920,"line":1066},[918,3088,1069],{"class":924},[918,3090,3091],{"class":920,"line":1072},[918,3092,1075],{"class":924},[918,3094,3095],{"class":920,"line":1078},[918,3096,1081],{"class":924},[918,3098,3099],{"class":920,"line":1084},[918,3100,1208],{"class":924},[918,3102,3103],{"class":920,"line":1090},[918,3104,1214],{"class":924},[918,3106,3107],{"class":920,"line":1103},[918,3108,1220],{"class":924},[212,3110,3111],{},[195,3112,3113,3116,3117,3119,3120,3123],{},[217,3114,3115],{},"关键","：",[264,3118,388],{}," Hook 必须检查 ",[264,3121,3122],{},"stop_hook_active"," 字段，否则会导致无限循环——Hook 阻止停止，Claude 继续工作，再次触发 Hook。",[204,3125,3127],{"id":3126},"_27-prompt-hooksllm-驱动的质量门","2.7 Prompt Hooks：LLM 驱动的质量门",[195,3129,3130],{},"当验证逻辑过于复杂，无法用 shell 脚本表达时：",[909,3132,3134],{"className":911,"code":3133,"language":913,"meta":914,"style":914},"{\n  \"hooks\": {\n    \"Stop\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"prompt\",\n            \"prompt\": \"Review the conversation. Did the user's request get fully completed? Check: all files created, tests passing, no TODO comments left. Respond with {\\\"ok\\\": true} if done, or {\\\"ok\\\": false, \\\"reason\\\": \\\"what remains\\\"} if not.\",\n            \"timeout\": 30\n          }\n        ]\n      }\n    ]\n  }\n}\n",[264,3135,3136,3140,3152,3164,3168,3180,3184,3202,3259,3271,3275,3279,3283,3287,3291],{"__ignoreMap":914},[918,3137,3138],{"class":920,"line":921},[918,3139,925],{"class":924},[918,3141,3142,3144,3146,3148,3150],{"class":920,"line":928},[918,3143,931],{"class":924},[918,3145,935],{"class":934},[918,3147,938],{"class":924},[918,3149,941],{"class":924},[918,3151,944],{"class":924},[918,3153,3154,3156,3158,3160,3162],{"class":920,"line":947},[918,3155,950],{"class":924},[918,3157,388],{"class":953},[918,3159,938],{"class":924},[918,3161,941],{"class":924},[918,3163,960],{"class":924},[918,3165,3166],{"class":920,"line":963},[918,3167,966],{"class":924},[918,3169,3170,3172,3174,3176,3178],{"class":920,"line":969},[918,3171,972],{"class":924},[918,3173,935],{"class":975},[918,3175,938],{"class":924},[918,3177,941],{"class":924},[918,3179,960],{"class":924},[918,3181,3182],{"class":920,"line":994},[918,3183,1010],{"class":924},[918,3185,3186,3188,3190,3192,3194,3196,3198,3200],{"class":920,"line":1007},[918,3187,1016],{"class":924},[918,3189,1020],{"class":1019},[918,3191,938],{"class":924},[918,3193,941],{"class":924},[918,3195,983],{"class":924},[918,3197,793],{"class":986},[918,3199,938],{"class":924},[918,3201,991],{"class":924},[918,3203,3204,3206,3208,3210,3212,3214,3217,3219,3222,3224,3227,3229,3231,3233,3236,3238,3241,3243,3245,3247,3250,3252,3255,3257],{"class":920,"line":1013},[918,3205,1016],{"class":924},[918,3207,793],{"class":1019},[918,3209,938],{"class":924},[918,3211,941],{"class":924},[918,3213,983],{"class":924},[918,3215,3216],{"class":986},"Review the conversation. Did the user's request get fully completed? Check: all files created, tests passing, no TODO comments left. Respond with {",[918,3218,1052],{"class":1051},[918,3220,3221],{"class":986},"ok",[918,3223,1052],{"class":1051},[918,3225,3226],{"class":986},": true} if done, or {",[918,3228,1052],{"class":1051},[918,3230,3221],{"class":986},[918,3232,1052],{"class":1051},[918,3234,3235],{"class":986},": false, ",[918,3237,1052],{"class":1051},[918,3239,3240],{"class":986},"reason",[918,3242,1052],{"class":1051},[918,3244,2771],{"class":986},[918,3246,1052],{"class":1051},[918,3248,3249],{"class":986},"what remains",[918,3251,1052],{"class":1051},[918,3253,3254],{"class":986},"} if not.",[918,3256,938],{"class":924},[918,3258,991],{"class":924},[918,3260,3261,3263,3265,3267,3269],{"class":920,"line":1035},[918,3262,1016],{"class":924},[918,3264,1531],{"class":1019},[918,3266,938],{"class":924},[918,3268,941],{"class":924},[918,3270,1538],{"class":975},[918,3272,3273],{"class":920,"line":1066},[918,3274,1069],{"class":924},[918,3276,3277],{"class":920,"line":1072},[918,3278,1075],{"class":924},[918,3280,3281],{"class":920,"line":1078},[918,3282,1081],{"class":924},[918,3284,3285],{"class":920,"line":1084},[918,3286,1208],{"class":924},[918,3288,3289],{"class":920,"line":1090},[918,3290,1214],{"class":924},[918,3292,3293],{"class":920,"line":1103},[918,3294,1220],{"class":924},[204,3296,3298],{"id":3297},"_28-agent-hooks多轮验证","2.8 Agent Hooks：多轮验证",[909,3300,3302],{"className":911,"code":3301,"language":913,"meta":914,"style":914},"{\n  \"hooks\": {\n    \"Stop\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"agent\",\n            \"prompt\": \"Verify the work is complete: 1) Run the test suite. 2) Check for any TypeScript errors. 3) Verify no console.log statements were left in production code. Report your findings.\",\n            \"timeout\": 120\n          }\n        ]\n      }\n    ]\n  }\n}\n",[264,3303,3304,3308,3320,3332,3336,3348,3352,3370,3389,3402,3406,3410,3414,3418,3422],{"__ignoreMap":914},[918,3305,3306],{"class":920,"line":921},[918,3307,925],{"class":924},[918,3309,3310,3312,3314,3316,3318],{"class":920,"line":928},[918,3311,931],{"class":924},[918,3313,935],{"class":934},[918,3315,938],{"class":924},[918,3317,941],{"class":924},[918,3319,944],{"class":924},[918,3321,3322,3324,3326,3328,3330],{"class":920,"line":947},[918,3323,950],{"class":924},[918,3325,388],{"class":953},[918,3327,938],{"class":924},[918,3329,941],{"class":924},[918,3331,960],{"class":924},[918,3333,3334],{"class":920,"line":963},[918,3335,966],{"class":924},[918,3337,3338,3340,3342,3344,3346],{"class":920,"line":969},[918,3339,972],{"class":924},[918,3341,935],{"class":975},[918,3343,938],{"class":924},[918,3345,941],{"class":924},[918,3347,960],{"class":924},[918,3349,3350],{"class":920,"line":994},[918,3351,1010],{"class":924},[918,3353,3354,3356,3358,3360,3362,3364,3366,3368],{"class":920,"line":1007},[918,3355,1016],{"class":924},[918,3357,1020],{"class":1019},[918,3359,938],{"class":924},[918,3361,941],{"class":924},[918,3363,983],{"class":924},[918,3365,821],{"class":986},[918,3367,938],{"class":924},[918,3369,991],{"class":924},[918,3371,3372,3374,3376,3378,3380,3382,3385,3387],{"class":920,"line":1013},[918,3373,1016],{"class":924},[918,3375,793],{"class":1019},[918,3377,938],{"class":924},[918,3379,941],{"class":924},[918,3381,983],{"class":924},[918,3383,3384],{"class":986},"Verify the work is complete: 1) Run the test suite. 2) Check for any TypeScript errors. 3) Verify no console.log statements were left in production code. Report your findings.",[918,3386,938],{"class":924},[918,3388,991],{"class":924},[918,3390,3391,3393,3395,3397,3399],{"class":920,"line":1035},[918,3392,1016],{"class":924},[918,3394,1531],{"class":1019},[918,3396,938],{"class":924},[918,3398,941],{"class":924},[918,3400,3401],{"class":975}," 120\n",[918,3403,3404],{"class":920,"line":1066},[918,3405,1069],{"class":924},[918,3407,3408],{"class":920,"line":1072},[918,3409,1075],{"class":924},[918,3411,3412],{"class":920,"line":1078},[918,3413,1081],{"class":924},[918,3415,3416],{"class":920,"line":1084},[918,3417,1208],{"class":924},[918,3419,3420],{"class":920,"line":1090},[918,3421,1214],{"class":924},[918,3423,3424],{"class":920,"line":1103},[918,3425,1220],{"class":924},[199,3427,3429],{"id":3428},"_3-plan-模式只读分析的安全前哨","3. Plan 模式：只读分析的安全前哨",[204,3431,3433],{"id":3432},"_31-定义与核心特性","3.1 定义与核心特性",[195,3435,3436,3437,3440],{},"Plan 模式是一种只读权限状态，Claude 可以分析代码库、搜索文件、创建详细计划——但",[217,3438,3439],{},"不能修改任何文件","，直到你明确允许。",[195,3442,3443,3116],{},[217,3444,3445],{},"核心特性",[1437,3447,3448,3459,3469],{},[1440,3449,3450,3451,3453,3454,3453,3456,3458],{},"工具限制：仅允许 ",[264,3452,478],{},"、",[264,3455,484],{},[264,3457,481],{}," 等分析操作",[1440,3460,3461,3462,3453,3464,3453,3466,3468],{},"修改阻断：",[264,3463,472],{},[264,3465,475],{},[264,3467,469],{}," 等修改操作被阻止",[1440,3470,3471],{},"权限提示仍然适用：与 default 模式的权限提示行为一致",[204,3473,3475],{"id":3474},"_32-如何启用","3.2 如何启用",[195,3477,3478,3116],{},[217,3479,3480],{},"会话中切换",[1437,3482,3483,3490],{},[1440,3484,3485,3486,3489],{},"按 ",[264,3487,3488],{},"Shift+Tab"," 循环切换模式",[1440,3491,3492,3493,3496],{},"或在单条提示前加 ",[264,3494,3495],{},"\u002Fplan"," 前缀",[195,3498,3499,3116],{},[217,3500,3501],{},"启动时指定",[909,3503,3505],{"className":2279,"code":3504,"language":2281,"meta":914,"style":914},"claude --permission-mode plan\n",[264,3506,3507],{"__ignoreMap":914},[918,3508,3509,3512,3515],{"class":920,"line":921},[918,3510,3511],{"class":953},"claude",[918,3513,3514],{"class":986}," --permission-mode",[918,3516,3517],{"class":986}," plan\n",[195,3519,3520,3116],{},[217,3521,3522],{},"设为默认",[909,3524,3526],{"className":911,"code":3525,"language":913,"meta":914,"style":914},"{\n  \"permissions\": {\n    \"defaultMode\": \"plan\"\n  }\n}\n",[264,3527,3528,3532,3545,3563,3567],{"__ignoreMap":914},[918,3529,3530],{"class":920,"line":921},[918,3531,925],{"class":924},[918,3533,3534,3536,3539,3541,3543],{"class":920,"line":928},[918,3535,931],{"class":924},[918,3537,3538],{"class":934},"permissions",[918,3540,938],{"class":924},[918,3542,941],{"class":924},[918,3544,944],{"class":924},[918,3546,3547,3549,3552,3554,3556,3558,3561],{"class":920,"line":947},[918,3548,950],{"class":924},[918,3550,3551],{"class":953},"defaultMode",[918,3553,938],{"class":924},[918,3555,941],{"class":924},[918,3557,983],{"class":924},[918,3559,3560],{"class":986},"plan",[918,3562,1063],{"class":924},[918,3564,3565],{"class":920,"line":963},[918,3566,1214],{"class":924},[918,3568,3569],{"class":920,"line":969},[918,3570,1220],{"class":924},[204,3572,3574],{"id":3573},"_33-使用场景","3.3 使用场景",[3576,3577,3578,3584,3590,3596],"ol",{},[1440,3579,3580,3583],{},[217,3581,3582],{},"探索代码库","：在不修改任何文件的情况下理解项目结构",[1440,3585,3586,3589],{},[217,3587,3588],{},"复杂变更前的规划","：让 Claude 先制定详细实施计划，你审查后再执行",[1440,3591,3592,3595],{},[217,3593,3594],{},"安全审查","：分析潜在风险而不触发副作用",[1440,3597,3598,3601],{},[217,3599,3600],{},"需求澄清","：在动手编码前确保理解正确",[204,3603,3605],{"id":3604},"_34-plan-完成后的选项","3.4 Plan 完成后的选项",[195,3607,3608],{},"当 Plan 准备就绪后，Claude 会呈现计划并询问如何继续：",[1437,3610,3611,3617,3623,3629,3635],{},[1440,3612,3613,3616],{},[217,3614,3615],{},"批准并以 auto 模式启动","：完全自动执行计划",[1440,3618,3619,3622],{},[217,3620,3621],{},"批准并接受编辑","：自动接受文件编辑，但命令仍提示",[1440,3624,3625,3628],{},[217,3626,3627],{},"批准并手动审查每个编辑","：逐条审批",[1440,3630,3631,3634],{},[217,3632,3633],{},"继续规划并反馈","：提供更多指导",[1440,3636,3637,3640],{},[217,3638,3639],{},"使用 Ultraplan 细化","：在浏览器中审查",[195,3642,3643],{},"每个选项还可选择是否先清除规划上下文。",[199,3645,3647],{"id":3646},"_4-权限模式全景对比","4. 权限模式全景对比",[204,3649,3651],{"id":3650},"_41-六种权限模式一览","4.1 六种权限模式一览",[234,3653,3654,3669],{},[237,3655,3656],{},[240,3657,3658,3661,3664,3666],{},[243,3659,3660],{},"模式",[243,3662,3663],{},"无需询问即可执行",[243,3665,750],{},[243,3667,3668],{},"安全风险",[256,3670,3671,3687,3716,3730,3745,3761],{},[240,3672,3673,3678,3681,3684],{},[261,3674,3675],{},[264,3676,3677],{},"default",[261,3679,3680],{},"仅读取操作",[261,3682,3683],{},"入门、敏感工作",[261,3685,3686],{},"低",[240,3688,3689,3694,3710,3713],{},[261,3690,3691],{},[264,3692,3693],{},"acceptEdits",[261,3695,3696,3697,278,3700,278,3703,278,3706,3709],{},"读取 + 文件编辑 + 常见文件系统命令（",[264,3698,3699],{},"mkdir",[264,3701,3702],{},"touch",[264,3704,3705],{},"mv",[264,3707,3708],{},"cp"," 等）",[261,3711,3712],{},"审查代码时迭代",[261,3714,3715],{},"低-中",[240,3717,3718,3722,3724,3727],{},[261,3719,3720],{},[264,3721,3560],{},[261,3723,3680],{},[261,3725,3726],{},"探索代码库、变更前规划",[261,3728,3729],{},"极低",[240,3731,3732,3736,3739,3742],{},[261,3733,3734],{},[264,3735,329],{},[261,3737,3738],{},"所有操作（经 ML 分类器后台安全检查）",[261,3740,3741],{},"长任务、减少提示疲劳",[261,3743,3744],{},"中（有分类器保护）",[240,3746,3747,3752,3755,3758],{},[261,3748,3749],{},[264,3750,3751],{},"dontAsk",[261,3753,3754],{},"仅预批准的工具",[261,3756,3757],{},"锁定的 CI 和脚本",[261,3759,3760],{},"低（严格白名单）",[240,3762,3763,3768,3771,3774],{},[261,3764,3765],{},[264,3766,3767],{},"bypassPermissions",[261,3769,3770],{},"除受保护路径外的所有操作",[261,3772,3773],{},"仅隔离容器和 VM",[261,3775,3776],{},"高",[204,3778,3780],{"id":3779},"_42-模式切换方式","4.2 模式切换方式",[195,3782,3783,3116],{},[217,3784,3785],{},"CLI",[1437,3787,3788,3797,3805],{},[1440,3789,3790,3791,3793,3794],{},"会话中按 ",[264,3792,3488],{}," 循环 ",[264,3795,3796],{},"default -> acceptEdits -> plan",[1440,3798,3799,3801,3802,3804],{},[264,3800,329],{}," 和 ",[264,3803,3767],{}," 需先启用才会出现在循环中",[1440,3806,3807,3808],{},"启动时：",[264,3809,3810],{},"claude --permission-mode \u003Cmode>",[195,3812,3813,3116],{},[217,3814,3815],{},"VS Code",[1437,3817,3818,3821],{},[1440,3819,3820],{},"点击提示框底部的模式指示器",[1440,3822,3823],{},"或在 Claude Code 扩展设置中配置",[204,3825,3827],{"id":3826},"_43-受保护路径","4.3 受保护路径",[195,3829,3830,3831,3116],{},"以下路径在任何模式下都",[217,3832,3833],{},"不会自动批准",[195,3835,3836,3116,3839,278,3842,278,3845,278,3848,278,3851,3854,3855,278,3858,278,3861,278,3864,3867],{},[217,3837,3838],{},"受保护目录",[264,3840,3841],{},".git",[264,3843,3844],{},".vscode",[264,3846,3847],{},".idea",[264,3849,3850],{},".husky",[264,3852,3853],{},".claude","（",[264,3856,3857],{},".claude\u002Fcommands",[264,3859,3860],{},".claude\u002Fagents",[264,3862,3863],{},".claude\u002Fskills",[264,3865,3866],{},".claude\u002Fworktrees"," 除外）",[195,3869,3870,3116,3873,278,3876,278,3879,278,3882,278,3885,278,3888,278,3891,278,3894,278,3897,278,3900],{},[217,3871,3872],{},"受保护文件",[264,3874,3875],{},".gitconfig",[264,3877,3878],{},".gitmodules",[264,3880,3881],{},".bashrc",[264,3883,3884],{},".bash_profile",[264,3886,3887],{},".zshrc",[264,3889,3890],{},".zprofile",[264,3892,3893],{},".profile",[264,3895,3896],{},".ripgreprc",[264,3898,3899],{},".mcp.json",[264,3901,3902],{},".claude.json",[195,3904,3905,3906,3453,3908,3453,3910,3453,3912,3914,3915,3917,3918,3920],{},"在 ",[264,3907,3677],{},[264,3909,3693],{},[264,3911,3560],{},[264,3913,3767],{}," 模式下，这些写入会提示；在 ",[264,3916,329],{}," 模式下路由到分类器；在 ",[264,3919,3751],{}," 模式下被拒绝。",[199,3922,3924],{"id":3923},"_5-auto-mode-安全分类器","5. Auto Mode 安全分类器",[204,3926,3928],{"id":3927},"_51-为什么需要分类器","5.1 为什么需要分类器",[195,3930,3931],{},"Anthropic 内部数据显示，用户手动批准了 93% 的权限提示。这意味着大量提示只增加了摩擦，没有增加安全性。Auto Mode 的目标是在不牺牲安全的前提下消除这种摩擦。",[204,3933,3935],{"id":3934},"_52-两层防御架构","5.2 两层防御架构",[195,3937,3938],{},[217,3939,3940],{},"输入层：提示注入探测",[1437,3942,3943,3946,3949],{},[1440,3944,3945],{},"服务器端的 prompt-injection probe 扫描工具输出（文件读取、网页获取、shell 输出、外部工具响应）",[1440,3947,3948],{},"当内容看起来像劫持行为的尝试时，在结果传递给 Agent 前添加警告",[1440,3950,3951],{},"提示 Agent 将此内容视为可疑，并锚定用户的实际请求",[195,3953,3954],{},[217,3955,3956],{},"输出层：转录分类器",[1437,3958,3959,3962,3979],{},[1440,3960,3961],{},"基于 Sonnet 4.6 的分类器模型评估每个操作",[1440,3963,3964,3965],{},"两阶段设计：\n",[1437,3966,3967,3973],{},[1440,3968,3969,3972],{},[217,3970,3971],{},"Stage 1","：快速单 token 过滤器（是\u002F否决定），偏向拦截",[1440,3974,3975,3978],{},[217,3976,3977],{},"Stage 2","：仅对 Stage 1 标记的内容进行链式思考推理，减少误报",[1440,3980,3981,3982,3985],{},"分类器",[217,3983,3984],{},"仅看到用户消息和工具调用","，剥离了 Claude 自己的消息和工具输出（防止 Agent \"说服\" 分类器）",[204,3987,3989],{"id":3988},"_53-五级权限决策流程","5.3 五级权限决策流程",[909,3991,3996],{"className":3992,"code":3994,"language":3995},[3993],"language-text","Tier 1: 内置安全工具白名单 + 用户设置\n  -> 只读工具（Read, Grep, Glob 等）直接允许\n  -> 进入 auto 模式时，丢弃已知的任意代码执行权限规则\n\nTier 2: 项目内文件操作\n  -> 工作目录内的文件写入\u002F编辑直接允许（无需分类器调用）\n  -> 可通过版本控制审查\n\nTier 3: 转录分类器\n  -> Shell 命令、Web 请求、外部工具集成、子智能体、项目外文件操作\n  -> Stage 1 快速过滤 -> Stage 2 推理审查\n","text",[264,3997,3994],{"__ignoreMap":914},[204,3999,4001],{"id":4000},"_54-分类器性能数据","5.4 分类器性能数据",[234,4003,4004,4023],{},[237,4005,4006],{},[240,4007,4008,4011,4014,4017,4020],{},[243,4009,4010],{},"数据集",[243,4012,4013],{},"Stage 1 FPR",[243,4015,4016],{},"Stage 1 FNR",[243,4018,4019],{},"完整管道 FPR",[243,4021,4022],{},"完整管道 FNR",[256,4024,4025,4040,4055],{},[240,4026,4027,4030,4033,4035,4038],{},[261,4028,4029],{},"真实内部流量（n=10,000）",[261,4031,4032],{},"8.5%",[261,4034,344],{},[261,4036,4037],{},"0.4%",[261,4039,344],{},[240,4041,4042,4045,4047,4050,4052],{},[261,4043,4044],{},"真实过度热心行为（n=52）",[261,4046,344],{},[261,4048,4049],{},"6.6%",[261,4051,344],{},[261,4053,4054],{},"17%",[240,4056,4057,4060,4062,4065,4067],{},[261,4058,4059],{},"合成数据泄露（n=1,000）",[261,4061,344],{},[261,4063,4064],{},"1.8%",[261,4066,344],{},[261,4068,4069],{},"5.7%",[212,4071,4072],{},[195,4073,4074],{},"FPR = 误报率（良性操作被拦截的比例）；FNR = 漏报率（危险操作被放行的比例）",[195,4076,4077,4078,4081],{},"17% 的漏报率是诚实的数字——分类器正确识别了危险，但错误判断了用户意图是否覆盖了该操作。这意味着 Auto Mode ",[217,4079,4080],{},"不是高 stakes 基础设施的谨慎人工审查的替代品","。",[204,4083,4085],{"id":4084},"_55-分类器默认拦截的行为","5.5 分类器默认拦截的行为",[195,4087,4088,3116],{},[217,4089,4090],{},"默认拦截",[1437,4092,4093,4099,4102,4105,4108,4111,4114,4117],{},[1440,4094,4095,4096,1561],{},"下载并执行代码（如 ",[264,4097,4098],{},"curl | bash",[1440,4100,4101],{},"向外部端点发送敏感数据",[1440,4103,4104],{},"生产环境部署和迁移",[1440,4106,4107],{},"云存储大规模删除",[1440,4109,4110],{},"授予 IAM 或仓库权限",[1440,4112,4113],{},"修改共享基础设施",[1440,4115,4116],{},"不可逆地销毁会话前已存在的文件",[1440,4118,4119,4120],{},"Force push 或直接推送到 ",[264,4121,4122],{},"main",[195,4124,4125,3116],{},[217,4126,4127],{},"默认允许",[1437,4129,4130,4133,4136,4142,4145],{},[1440,4131,4132],{},"工作目录内的本地文件操作",[1440,4134,4135],{},"安装 lock 文件或清单中声明的依赖",[1440,4137,4138,4139,4141],{},"读取 ",[264,4140,2359],{}," 并将凭据发送到匹配的 API",[1440,4143,4144],{},"只读 HTTP 请求",[1440,4146,4147],{},"推送到启动时的分支或 Claude 创建的分支",[204,4149,4151],{"id":4150},"_56-配置信任基础设施","5.6 配置信任基础设施",[909,4153,4155],{"className":911,"code":4154,"language":913,"meta":914,"style":914},"{\n  \"autoMode\": {\n    \"environment\": [\n      \"$defaults\",\n      \"Organization: ACME Corp. Primary use: software development\",\n      \"Source control: github.example.com\u002Facme-corp\",\n      \"Cloud providers: AWS, GCP\",\n      \"Trusted cloud buckets: s3:\u002F\u002Facme-builds, gs:\u002F\u002Facme-datasets\",\n      \"Trusted internal domains: *.internal.example.com, api.example.com\",\n      \"Key internal services: Jenkins at ci.example.com, Artifactory at artifacts.example.com\"\n    ],\n    \"allow\": [\n      \"$defaults\",\n      \"Deploying to the staging namespace is allowed: staging is isolated from production\"\n    ],\n    \"soft_deny\": [\n      \"$defaults\",\n      \"Never run database migrations outside the migrations CLI\",\n      \"Never modify files under infra\u002Fterraform\u002Fprod\u002F\"\n    ]\n  }\n}\n",[264,4156,4157,4161,4174,4187,4198,4209,4220,4231,4242,4253,4262,4266,4279,4289,4298,4302,4315,4325,4336,4345,4349,4353],{"__ignoreMap":914},[918,4158,4159],{"class":920,"line":921},[918,4160,925],{"class":924},[918,4162,4163,4165,4168,4170,4172],{"class":920,"line":928},[918,4164,931],{"class":924},[918,4166,4167],{"class":934},"autoMode",[918,4169,938],{"class":924},[918,4171,941],{"class":924},[918,4173,944],{"class":924},[918,4175,4176,4178,4181,4183,4185],{"class":920,"line":947},[918,4177,950],{"class":924},[918,4179,4180],{"class":953},"environment",[918,4182,938],{"class":924},[918,4184,941],{"class":924},[918,4186,960],{"class":924},[918,4188,4189,4191,4194,4196],{"class":920,"line":963},[918,4190,1386],{"class":924},[918,4192,4193],{"class":986},"$defaults",[918,4195,938],{"class":924},[918,4197,991],{"class":924},[918,4199,4200,4202,4205,4207],{"class":920,"line":969},[918,4201,1386],{"class":924},[918,4203,4204],{"class":986},"Organization: ACME Corp. Primary use: software development",[918,4206,938],{"class":924},[918,4208,991],{"class":924},[918,4210,4211,4213,4216,4218],{"class":920,"line":994},[918,4212,1386],{"class":924},[918,4214,4215],{"class":986},"Source control: github.example.com\u002Facme-corp",[918,4217,938],{"class":924},[918,4219,991],{"class":924},[918,4221,4222,4224,4227,4229],{"class":920,"line":1007},[918,4223,1386],{"class":924},[918,4225,4226],{"class":986},"Cloud providers: AWS, GCP",[918,4228,938],{"class":924},[918,4230,991],{"class":924},[918,4232,4233,4235,4238,4240],{"class":920,"line":1013},[918,4234,1386],{"class":924},[918,4236,4237],{"class":986},"Trusted cloud buckets: s3:\u002F\u002Facme-builds, gs:\u002F\u002Facme-datasets",[918,4239,938],{"class":924},[918,4241,991],{"class":924},[918,4243,4244,4246,4249,4251],{"class":920,"line":1035},[918,4245,1386],{"class":924},[918,4247,4248],{"class":986},"Trusted internal domains: *.internal.example.com, api.example.com",[918,4250,938],{"class":924},[918,4252,991],{"class":924},[918,4254,4255,4257,4260],{"class":920,"line":1066},[918,4256,1386],{"class":924},[918,4258,4259],{"class":986},"Key internal services: Jenkins at ci.example.com, Artifactory at artifacts.example.com",[918,4261,1063],{"class":924},[918,4263,4264],{"class":920,"line":1072},[918,4265,1087],{"class":924},[918,4267,4268,4270,4273,4275,4277],{"class":920,"line":1078},[918,4269,950],{"class":924},[918,4271,4272],{"class":953},"allow",[918,4274,938],{"class":924},[918,4276,941],{"class":924},[918,4278,960],{"class":924},[918,4280,4281,4283,4285,4287],{"class":920,"line":1084},[918,4282,1386],{"class":924},[918,4284,4193],{"class":986},[918,4286,938],{"class":924},[918,4288,991],{"class":924},[918,4290,4291,4293,4296],{"class":920,"line":1090},[918,4292,1386],{"class":924},[918,4294,4295],{"class":986},"Deploying to the staging namespace is allowed: staging is isolated from production",[918,4297,1063],{"class":924},[918,4299,4300],{"class":920,"line":1103},[918,4301,1087],{"class":924},[918,4303,4304,4306,4309,4311,4313],{"class":920,"line":1108},[918,4305,950],{"class":924},[918,4307,4308],{"class":953},"soft_deny",[918,4310,938],{"class":924},[918,4312,941],{"class":924},[918,4314,960],{"class":924},[918,4316,4317,4319,4321,4323],{"class":920,"line":1128},[918,4318,1386],{"class":924},[918,4320,4193],{"class":986},[918,4322,938],{"class":924},[918,4324,991],{"class":924},[918,4326,4327,4329,4332,4334],{"class":920,"line":1141},[918,4328,1386],{"class":924},[918,4330,4331],{"class":986},"Never run database migrations outside the migrations CLI",[918,4333,938],{"class":924},[918,4335,991],{"class":924},[918,4337,4338,4340,4343],{"class":920,"line":1146},[918,4339,1386],{"class":924},[918,4341,4342],{"class":986},"Never modify files under infra\u002Fterraform\u002Fprod\u002F",[918,4344,1063],{"class":924},[918,4346,4347],{"class":920,"line":1165},[918,4348,1208],{"class":924},[918,4350,4351],{"class":920,"line":1190},[918,4352,1214],{"class":924},[918,4354,4355],{"class":920,"line":1195},[918,4356,1220],{"class":924},[195,4358,4359],{},"配置检查命令：",[909,4361,4363],{"className":2279,"code":4362,"language":2281,"meta":914,"style":914},"claude auto-mode defaults    # 查看内置规则\nclaude auto-mode config      # 查看实际生效配置\nclaude auto-mode critique    # AI 审查自定义规则\n",[264,4364,4365,4378,4390],{"__ignoreMap":914},[918,4366,4367,4369,4372,4375],{"class":920,"line":921},[918,4368,3511],{"class":953},[918,4370,4371],{"class":986}," auto-mode",[918,4373,4374],{"class":986}," defaults",[918,4376,4377],{"class":2288},"    # 查看内置规则\n",[918,4379,4380,4382,4384,4387],{"class":920,"line":928},[918,4381,3511],{"class":953},[918,4383,4371],{"class":986},[918,4385,4386],{"class":986}," config",[918,4388,4389],{"class":2288},"      # 查看实际生效配置\n",[918,4391,4392,4394,4396,4399],{"class":920,"line":947},[918,4393,3511],{"class":953},[918,4395,4371],{"class":986},[918,4397,4398],{"class":986}," critique",[918,4400,4401],{"class":2288},"    # AI 审查自定义规则\n",[204,4403,4405],{"id":4404},"_57-使用限制","5.7 使用限制",[195,4407,4408],{},"Auto Mode 有严格的账户要求：",[1437,4410,4411,4416,4422,4428],{},[1440,4412,4413,4415],{},[217,4414,577],{},"：Max、Team、Enterprise 或 API。Pro 不可用",[1440,4417,4418,4421],{},[217,4419,4420],{},"Admin","：Team 和 Enterprise 需管理员在设置中启用",[1440,4423,4424,4427],{},[217,4425,4426],{},"Model","：Team\u002FEnterprise\u002FAPI 需 Claude Sonnet 4.6、Opus 4.6 或 Opus 4.7；Max 计划仅 Opus 4.7",[1440,4429,4430,4433],{},[217,4431,4432],{},"Provider","：仅 Anthropic API。Bedrock、Vertex、Foundry 不可用",[204,4435,4437],{"id":4436},"_58-回退机制","5.8 回退机制",[1437,4439,4440,4443,4446],{},[1440,4441,4442],{},"连续 3 次或总计 20 次被拦截后，Auto Mode 暂停，恢复手动提示",[1440,4444,4445],{},"批准被提示的操作后恢复 Auto Mode",[1440,4447,4448,4449,4452],{},"非交互模式（",[264,4450,4451],{},"-p"," 标志）下，重复拦截会终止会话",[199,4454,4456],{"id":4455},"_6-checkpoint-机制时间旅行安全网","6. Checkpoint 机制：时间旅行安全网",[204,4458,4460],{"id":4459},"_61-自动检查点","6.1 自动检查点",[195,4462,4463,4464,4467],{},"Claude Code 在每次用户提示提交时",[217,4465,4466],{},"自动","创建检查点，捕获编辑前的代码状态。这让你可以放心地尝试大规模变更，知道随时可以回到之前的状态。",[195,4469,4470,3116],{},[217,4471,1551],{},[1437,4473,4474,4477,4480],{},[1440,4475,4476],{},"每次用户提示创建新检查点",[1440,4478,4479],{},"检查点跨会话持久化（恢复对话后仍可访问）",[1440,4481,4482],{},"30 天后自动清理（可配置）",[204,4484,4486],{"id":4485},"_62-三种恢复模式","6.2 三种恢复模式",[195,4488,3485,4489,4492,4493,4496],{},[264,4490,4491],{},"Esc"," 两次或使用 ",[264,4494,4495],{},"\u002Frewind"," 命令打开恢复菜单：",[234,4498,4499,4510],{},[237,4500,4501],{},[240,4502,4503,4506,4508],{},[243,4504,4505],{},"恢复选项",[243,4507,1242],{},[243,4509,750],{},[256,4511,4512,4525,4538,4551],{},[240,4513,4514,4519,4522],{},[261,4515,4516],{},[217,4517,4518],{},"恢复代码和对话",[261,4520,4521],{},"代码和对话都回退到该点",[261,4523,4524],{},"完全改变方向",[240,4526,4527,4532,4535],{},[261,4528,4529],{},[217,4530,4531],{},"仅恢复对话",[261,4533,4534],{},"回退对话，保留当前代码",[261,4536,4537],{},"拒绝 Claude 的方案，要求替代方法",[240,4539,4540,4545,4548],{},[261,4541,4542],{},[217,4543,4544],{},"仅恢复代码",[261,4546,4547],{},"回退代码，保留对话上下文",[261,4549,4550],{},"代码有 Bug 但想保持对话理解",[240,4552,4553,4558,4561],{},[261,4554,4555],{},[217,4556,4557],{},"从此处总结",[261,4559,4560],{},"压缩从此点往后的对话",[261,4562,4563],{},"释放上下文窗口空间",[204,4565,4567],{"id":4566},"_63-与-git-的协作","6.3 与 Git 的协作",[195,4569,4570],{},"Checkpoint 是\"本地撤销\"，Git 是\"永久历史\"。推荐工作流：",[909,4572,4575],{"className":4573,"code":4574,"language":3995},[3993],"开始新功能 -> 创建 Git 分支 -> 请求 Claude 实现\n  -> 审查结果\n    -> OK -> Git commit -> 继续改进或创建 PR\n    -> NG -> Checkpoint 恢复 -> 重新指导 Claude\n",[264,4576,4574],{"__ignoreMap":914},[234,4578,4579,4592],{},[237,4580,4581],{},[240,4582,4583,4586,4589],{},[243,4584,4585],{},"操作",[243,4587,4588],{},"Checkpoint",[243,4590,4591],{},"Git",[256,4593,4594,4605,4616,4627],{},[240,4595,4596,4599,4602],{},[261,4597,4598],{},"短期实验恢复",[261,4600,4601],{},"推荐",[261,4603,4604],{},"污染提交历史",[240,4606,4607,4610,4613],{},[261,4608,4609],{},"长期存储",[261,4611,4612],{},"30 天限制",[261,4614,4615],{},"永久",[240,4617,4618,4621,4624],{},[261,4619,4620],{},"团队共享",[261,4622,4623],{},"仅本地",[261,4625,4626],{},"可推送",[240,4628,4629,4632,4635],{},[261,4630,4631],{},"对话上下文保留",[261,4633,4634],{},"支持",[261,4636,4637],{},"不支持",[204,4639,4641],{"id":4640},"_64-限制","6.4 限制",[1437,4643,4644,4657,4663],{},[1440,4645,4646,3116,4649,278,4652,278,4654,4656],{},[217,4647,4648],{},"不追踪 Bash 命令变更",[264,4650,4651],{},"rm",[264,4653,3705],{},[264,4655,3708],{}," 等命令造成的文件修改无法通过 rewind 撤销",[1440,4658,4659,4662],{},[217,4660,4661],{},"不追踪外部变更","：Claude Code 外的手动编辑和其他会话的编辑通常不被捕获",[1440,4664,4665,4668],{},[217,4666,4667],{},"不是版本控制替代品","：Checkpoint 用于会话级快速恢复，Git 用于永久版本历史",[199,4670,4672],{"id":4671},"_7-组合使用策略","7. 组合使用策略",[204,4674,4676],{"id":4675},"_71-安全金字塔","7.1 安全金字塔",[909,4678,4681],{"className":4679,"code":4680,"language":3995},[3993],"          ┌─────────────┐\n          │  Checkpoint │  \u003C- 最后防线：时间旅行恢复\n          │  (自动备份)  │\n          ├─────────────┤\n          │   Hooks     │  \u003C- 自动化守卫：确定性规则执行\n          │ (Pre\u002FPost)  │\n          ├─────────────┤\n          │  Plan Mode  │  \u003C- 思考与执行分离\n          │  (只读规划)  │\n          ├─────────────┤\n          │  Auto Mode  │  \u003C- ML 分类器：智能审批\n          │  (分类器)   │\n          ├─────────────┤\n          │ Permission  │  \u003C- 基础层：手动审批\n          │   Modes     │\n          └─────────────┘\n",[264,4682,4680],{"__ignoreMap":914},[204,4684,4686],{"id":4685},"_72-推荐工作流组合","7.2 推荐工作流组合",[195,4688,4689],{},[217,4690,4691],{},"场景一：日常开发（低风险）",[909,4693,4695],{"className":911,"code":4694,"language":913,"meta":914,"style":914},"{\n  \"permissions\": {\n    \"defaultMode\": \"acceptEdits\"\n  },\n  \"hooks\": {\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"Write|Edit|MultiEdit\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"npx prettier --write \\\"$CLAUDE_TOOL_INPUT_FILE_PATH\\\"\"\n          }\n        ]\n      }\n    ],\n    \"PreToolUse\": [\n      {\n        \"matcher\": \"Bash\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash -c 'CMD=$(jq -r \\\".tool_input.command\\\" \u003C\u003C\u003C \\\"$(cat)\\\"); if echo \\\"$CMD\\\" | grep -qE \\\"rm -rf \u002F|rm -rf ~|DROP TABLE|force push\\\"; then echo \\\"Blocked by policy\\\" >&2; exit 2; fi; exit 0'\"\n          }\n        ]\n      }\n    ]\n  }\n}\n",[264,4696,4697,4701,4713,4729,4734,4746,4758,4762,4780,4792,4796,4814,4836,4840,4844,4848,4852,4864,4868,4886,4898,4902,4920,4981,4985,4989,4993,4998,5003],{"__ignoreMap":914},[918,4698,4699],{"class":920,"line":921},[918,4700,925],{"class":924},[918,4702,4703,4705,4707,4709,4711],{"class":920,"line":928},[918,4704,931],{"class":924},[918,4706,3538],{"class":934},[918,4708,938],{"class":924},[918,4710,941],{"class":924},[918,4712,944],{"class":924},[918,4714,4715,4717,4719,4721,4723,4725,4727],{"class":920,"line":947},[918,4716,950],{"class":924},[918,4718,3551],{"class":953},[918,4720,938],{"class":924},[918,4722,941],{"class":924},[918,4724,983],{"class":924},[918,4726,3693],{"class":986},[918,4728,1063],{"class":924},[918,4730,4731],{"class":920,"line":963},[918,4732,4733],{"class":924},"  },\n",[918,4735,4736,4738,4740,4742,4744],{"class":920,"line":969},[918,4737,931],{"class":924},[918,4739,935],{"class":934},[918,4741,938],{"class":924},[918,4743,941],{"class":924},[918,4745,944],{"class":924},[918,4747,4748,4750,4752,4754,4756],{"class":920,"line":994},[918,4749,950],{"class":924},[918,4751,497],{"class":953},[918,4753,938],{"class":924},[918,4755,941],{"class":924},[918,4757,960],{"class":924},[918,4759,4760],{"class":920,"line":1007},[918,4761,966],{"class":924},[918,4763,4764,4766,4768,4770,4772,4774,4776,4778],{"class":920,"line":1013},[918,4765,972],{"class":924},[918,4767,976],{"class":975},[918,4769,938],{"class":924},[918,4771,941],{"class":924},[918,4773,983],{"class":924},[918,4775,1121],{"class":986},[918,4777,938],{"class":924},[918,4779,991],{"class":924},[918,4781,4782,4784,4786,4788,4790],{"class":920,"line":1035},[918,4783,972],{"class":924},[918,4785,935],{"class":975},[918,4787,938],{"class":924},[918,4789,941],{"class":924},[918,4791,960],{"class":924},[918,4793,4794],{"class":920,"line":1066},[918,4795,1010],{"class":924},[918,4797,4798,4800,4802,4804,4806,4808,4810,4812],{"class":920,"line":1072},[918,4799,1016],{"class":924},[918,4801,1020],{"class":1019},[918,4803,938],{"class":924},[918,4805,941],{"class":924},[918,4807,983],{"class":924},[918,4809,762],{"class":986},[918,4811,938],{"class":924},[918,4813,991],{"class":924},[918,4815,4816,4818,4820,4822,4824,4826,4828,4830,4832,4834],{"class":920,"line":1078},[918,4817,1016],{"class":924},[918,4819,762],{"class":1019},[918,4821,938],{"class":924},[918,4823,941],{"class":924},[918,4825,983],{"class":924},[918,4827,1178],{"class":986},[918,4829,1052],{"class":1051},[918,4831,1183],{"class":986},[918,4833,1052],{"class":1051},[918,4835,1063],{"class":924},[918,4837,4838],{"class":920,"line":1084},[918,4839,1069],{"class":924},[918,4841,4842],{"class":920,"line":1090},[918,4843,1075],{"class":924},[918,4845,4846],{"class":920,"line":1103},[918,4847,1081],{"class":924},[918,4849,4850],{"class":920,"line":1108},[918,4851,1087],{"class":924},[918,4853,4854,4856,4858,4860,4862],{"class":920,"line":1128},[918,4855,950],{"class":924},[918,4857,458],{"class":953},[918,4859,938],{"class":924},[918,4861,941],{"class":924},[918,4863,960],{"class":924},[918,4865,4866],{"class":920,"line":1141},[918,4867,966],{"class":924},[918,4869,4870,4872,4874,4876,4878,4880,4882,4884],{"class":920,"line":1146},[918,4871,972],{"class":924},[918,4873,976],{"class":975},[918,4875,938],{"class":924},[918,4877,941],{"class":924},[918,4879,983],{"class":924},[918,4881,469],{"class":986},[918,4883,938],{"class":924},[918,4885,991],{"class":924},[918,4887,4888,4890,4892,4894,4896],{"class":920,"line":1165},[918,4889,972],{"class":924},[918,4891,935],{"class":975},[918,4893,938],{"class":924},[918,4895,941],{"class":924},[918,4897,960],{"class":924},[918,4899,4900],{"class":920,"line":1190},[918,4901,1010],{"class":924},[918,4903,4904,4906,4908,4910,4912,4914,4916,4918],{"class":920,"line":1195},[918,4905,1016],{"class":924},[918,4907,1020],{"class":1019},[918,4909,938],{"class":924},[918,4911,941],{"class":924},[918,4913,983],{"class":924},[918,4915,762],{"class":986},[918,4917,938],{"class":924},[918,4919,991],{"class":924},[918,4921,4922,4924,4926,4928,4930,4932,4934,4936,4938,4940,4942,4944,4946,4948,4951,4953,4955,4957,4960,4962,4965,4967,4969,4971,4974,4976,4979],{"class":920,"line":1200},[918,4923,1016],{"class":924},[918,4925,762],{"class":1019},[918,4927,938],{"class":924},[918,4929,941],{"class":924},[918,4931,983],{"class":924},[918,4933,2128],{"class":986},[918,4935,1052],{"class":1051},[918,4937,2133],{"class":986},[918,4939,1052],{"class":1051},[918,4941,1748],{"class":986},[918,4943,1052],{"class":1051},[918,4945,1753],{"class":986},[918,4947,1052],{"class":1051},[918,4949,4950],{"class":986},"); if echo ",[918,4952,1052],{"class":1051},[918,4954,2211],{"class":986},[918,4956,1052],{"class":1051},[918,4958,4959],{"class":986}," | grep -qE ",[918,4961,1052],{"class":1051},[918,4963,4964],{"class":986},"rm -rf \u002F|rm -rf ~|DROP TABLE|force push",[918,4966,1052],{"class":1051},[918,4968,2226],{"class":986},[918,4970,1052],{"class":1051},[918,4972,4973],{"class":986},"Blocked by policy",[918,4975,1052],{"class":1051},[918,4977,4978],{"class":986}," >&2; exit 2; fi; exit 0'",[918,4980,1063],{"class":924},[918,4982,4983],{"class":920,"line":1205},[918,4984,1069],{"class":924},[918,4986,4987],{"class":920,"line":1211},[918,4988,1075],{"class":924},[918,4990,4991],{"class":920,"line":1217},[918,4992,1081],{"class":924},[918,4994,4996],{"class":920,"line":4995},27,[918,4997,1208],{"class":924},[918,4999,5001],{"class":920,"line":5000},28,[918,5002,1214],{"class":924},[918,5004,5006],{"class":920,"line":5005},29,[918,5007,1220],{"class":924},[195,5009,5010],{},[217,5011,5012],{},"场景二：复杂重构（中风险）",[3576,5014,5015,5024,5027,5036,5042],{},[1440,5016,5017,5018,5020,5021],{},"以 ",[264,5019,3560],{}," 模式启动：",[264,5022,5023],{},"claude --permission-mode plan",[1440,5025,5026],{},"让 Claude 分析并制定详细计划",[1440,5028,5029,5030,5032,5033,5035],{},"审查计划，批准后切换到 ",[264,5031,3693],{}," 或 ",[264,5034,329],{}," 模式",[1440,5037,5038,5039,5041],{},"启用 ",[264,5040,497],{}," Hook 自动格式化",[1440,5043,5044,5045,5047],{},"使用 ",[264,5046,4495],{}," 在出现问题时回退",[195,5049,5050],{},[217,5051,5052],{},"场景三：生产环境操作（高风险）",[909,5054,5056],{"className":911,"code":5055,"language":913,"meta":914,"style":914},"{\n  \"permissions\": {\n    \"defaultMode\": \"default\",\n    \"deny\": [\n      \"Bash(*deploy*)\",\n      \"Bash(*migration*)\",\n      \"Bash(git push *)\"\n    ]\n  },\n  \"hooks\": {\n    \"PreToolUse\": [\n      {\n        \"matcher\": \"Bash\",\n        \"hooks\": [\n          {\n            \"type\": \"prompt\",\n            \"prompt\": \"Evaluate whether this Bash command could affect the production environment. Consider: database operations, deployments, infrastructure changes. Respond with {\\\"safe\\\": true} or {\\\"safe\\\": false, \\\"reason\\\": \\\"...\\\"}.\",\n            \"timeout\": 10\n          }\n        ]\n      }\n    ],\n    \"Stop\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"agent\",\n            \"prompt\": \"Before completing, verify: 1) No production credentials were logged. 2) No database connections were made to prod. 3) All changes are reversible. Report findings.\",\n            \"timeout\": 60\n          }\n        ]\n      }\n    ]\n  }\n}\n",[264,5057,5058,5062,5074,5092,5104,5115,5126,5135,5139,5143,5155,5167,5171,5189,5201,5205,5223,5278,5291,5295,5299,5303,5307,5319,5323,5335,5339,5357,5376,5388,5393,5398,5403,5408,5413],{"__ignoreMap":914},[918,5059,5060],{"class":920,"line":921},[918,5061,925],{"class":924},[918,5063,5064,5066,5068,5070,5072],{"class":920,"line":928},[918,5065,931],{"class":924},[918,5067,3538],{"class":934},[918,5069,938],{"class":924},[918,5071,941],{"class":924},[918,5073,944],{"class":924},[918,5075,5076,5078,5080,5082,5084,5086,5088,5090],{"class":920,"line":947},[918,5077,950],{"class":924},[918,5079,3551],{"class":953},[918,5081,938],{"class":924},[918,5083,941],{"class":924},[918,5085,983],{"class":924},[918,5087,3677],{"class":986},[918,5089,938],{"class":924},[918,5091,991],{"class":924},[918,5093,5094,5096,5098,5100,5102],{"class":920,"line":963},[918,5095,950],{"class":924},[918,5097,1344],{"class":953},[918,5099,938],{"class":924},[918,5101,941],{"class":924},[918,5103,960],{"class":924},[918,5105,5106,5108,5111,5113],{"class":920,"line":969},[918,5107,1386],{"class":924},[918,5109,5110],{"class":986},"Bash(*deploy*)",[918,5112,938],{"class":924},[918,5114,991],{"class":924},[918,5116,5117,5119,5122,5124],{"class":920,"line":994},[918,5118,1386],{"class":924},[918,5120,5121],{"class":986},"Bash(*migration*)",[918,5123,938],{"class":924},[918,5125,991],{"class":924},[918,5127,5128,5130,5133],{"class":920,"line":1007},[918,5129,1386],{"class":924},[918,5131,5132],{"class":986},"Bash(git push *)",[918,5134,1063],{"class":924},[918,5136,5137],{"class":920,"line":1013},[918,5138,1208],{"class":924},[918,5140,5141],{"class":920,"line":1035},[918,5142,4733],{"class":924},[918,5144,5145,5147,5149,5151,5153],{"class":920,"line":1066},[918,5146,931],{"class":924},[918,5148,935],{"class":934},[918,5150,938],{"class":924},[918,5152,941],{"class":924},[918,5154,944],{"class":924},[918,5156,5157,5159,5161,5163,5165],{"class":920,"line":1072},[918,5158,950],{"class":924},[918,5160,458],{"class":953},[918,5162,938],{"class":924},[918,5164,941],{"class":924},[918,5166,960],{"class":924},[918,5168,5169],{"class":920,"line":1078},[918,5170,966],{"class":924},[918,5172,5173,5175,5177,5179,5181,5183,5185,5187],{"class":920,"line":1084},[918,5174,972],{"class":924},[918,5176,976],{"class":975},[918,5178,938],{"class":924},[918,5180,941],{"class":924},[918,5182,983],{"class":924},[918,5184,469],{"class":986},[918,5186,938],{"class":924},[918,5188,991],{"class":924},[918,5190,5191,5193,5195,5197,5199],{"class":920,"line":1090},[918,5192,972],{"class":924},[918,5194,935],{"class":975},[918,5196,938],{"class":924},[918,5198,941],{"class":924},[918,5200,960],{"class":924},[918,5202,5203],{"class":920,"line":1103},[918,5204,1010],{"class":924},[918,5206,5207,5209,5211,5213,5215,5217,5219,5221],{"class":920,"line":1108},[918,5208,1016],{"class":924},[918,5210,1020],{"class":1019},[918,5212,938],{"class":924},[918,5214,941],{"class":924},[918,5216,983],{"class":924},[918,5218,793],{"class":986},[918,5220,938],{"class":924},[918,5222,991],{"class":924},[918,5224,5225,5227,5229,5231,5233,5235,5238,5240,5243,5245,5248,5250,5252,5254,5256,5258,5260,5262,5264,5266,5269,5271,5274,5276],{"class":920,"line":1128},[918,5226,1016],{"class":924},[918,5228,793],{"class":1019},[918,5230,938],{"class":924},[918,5232,941],{"class":924},[918,5234,983],{"class":924},[918,5236,5237],{"class":986},"Evaluate whether this Bash command could affect the production environment. Consider: database operations, deployments, infrastructure changes. Respond with {",[918,5239,1052],{"class":1051},[918,5241,5242],{"class":986},"safe",[918,5244,1052],{"class":1051},[918,5246,5247],{"class":986},": true} or {",[918,5249,1052],{"class":1051},[918,5251,5242],{"class":986},[918,5253,1052],{"class":1051},[918,5255,3235],{"class":986},[918,5257,1052],{"class":1051},[918,5259,3240],{"class":986},[918,5261,1052],{"class":1051},[918,5263,2771],{"class":986},[918,5265,1052],{"class":1051},[918,5267,5268],{"class":986},"...",[918,5270,1052],{"class":1051},[918,5272,5273],{"class":986},"}.",[918,5275,938],{"class":924},[918,5277,991],{"class":924},[918,5279,5280,5282,5284,5286,5288],{"class":920,"line":1141},[918,5281,1016],{"class":924},[918,5283,1531],{"class":1019},[918,5285,938],{"class":924},[918,5287,941],{"class":924},[918,5289,5290],{"class":975}," 10\n",[918,5292,5293],{"class":920,"line":1146},[918,5294,1069],{"class":924},[918,5296,5297],{"class":920,"line":1165},[918,5298,1075],{"class":924},[918,5300,5301],{"class":920,"line":1190},[918,5302,1081],{"class":924},[918,5304,5305],{"class":920,"line":1195},[918,5306,1087],{"class":924},[918,5308,5309,5311,5313,5315,5317],{"class":920,"line":1200},[918,5310,950],{"class":924},[918,5312,388],{"class":953},[918,5314,938],{"class":924},[918,5316,941],{"class":924},[918,5318,960],{"class":924},[918,5320,5321],{"class":920,"line":1205},[918,5322,966],{"class":924},[918,5324,5325,5327,5329,5331,5333],{"class":920,"line":1211},[918,5326,972],{"class":924},[918,5328,935],{"class":975},[918,5330,938],{"class":924},[918,5332,941],{"class":924},[918,5334,960],{"class":924},[918,5336,5337],{"class":920,"line":1217},[918,5338,1010],{"class":924},[918,5340,5341,5343,5345,5347,5349,5351,5353,5355],{"class":920,"line":4995},[918,5342,1016],{"class":924},[918,5344,1020],{"class":1019},[918,5346,938],{"class":924},[918,5348,941],{"class":924},[918,5350,983],{"class":924},[918,5352,821],{"class":986},[918,5354,938],{"class":924},[918,5356,991],{"class":924},[918,5358,5359,5361,5363,5365,5367,5369,5372,5374],{"class":920,"line":5000},[918,5360,1016],{"class":924},[918,5362,793],{"class":1019},[918,5364,938],{"class":924},[918,5366,941],{"class":924},[918,5368,983],{"class":924},[918,5370,5371],{"class":986},"Before completing, verify: 1) No production credentials were logged. 2) No database connections were made to prod. 3) All changes are reversible. Report findings.",[918,5373,938],{"class":924},[918,5375,991],{"class":924},[918,5377,5378,5380,5382,5384,5386],{"class":920,"line":5005},[918,5379,1016],{"class":924},[918,5381,1531],{"class":1019},[918,5383,938],{"class":924},[918,5385,941],{"class":924},[918,5387,3084],{"class":975},[918,5389,5391],{"class":920,"line":5390},30,[918,5392,1069],{"class":924},[918,5394,5396],{"class":920,"line":5395},31,[918,5397,1075],{"class":924},[918,5399,5401],{"class":920,"line":5400},32,[918,5402,1081],{"class":924},[918,5404,5406],{"class":920,"line":5405},33,[918,5407,1208],{"class":924},[918,5409,5411],{"class":920,"line":5410},34,[918,5412,1214],{"class":924},[918,5414,5416],{"class":920,"line":5415},35,[918,5417,1220],{"class":924},[195,5419,5420],{},[217,5421,5422],{},"场景四：自动化 CI 流水线",[909,5424,5426],{"className":911,"code":5425,"language":913,"meta":914,"style":914},"{\n  \"permissions\": {\n    \"defaultMode\": \"dontAsk\",\n    \"allow\": [\n      \"Bash(npm test)\",\n      \"Bash(npm run build)\",\n      \"Bash(npm run lint)\",\n      \"Read(*)\",\n      \"Edit(*)\",\n      \"Write(*)\"\n    ],\n    \"deny\": [\n      \"Bash(git push *)\",\n      \"Bash(*deploy*)\",\n      \"WebFetch(*)\"\n    ]\n  }\n}\n",[264,5427,5428,5432,5444,5462,5474,5485,5496,5507,5518,5529,5538,5542,5554,5564,5574,5583,5587,5591],{"__ignoreMap":914},[918,5429,5430],{"class":920,"line":921},[918,5431,925],{"class":924},[918,5433,5434,5436,5438,5440,5442],{"class":920,"line":928},[918,5435,931],{"class":924},[918,5437,3538],{"class":934},[918,5439,938],{"class":924},[918,5441,941],{"class":924},[918,5443,944],{"class":924},[918,5445,5446,5448,5450,5452,5454,5456,5458,5460],{"class":920,"line":947},[918,5447,950],{"class":924},[918,5449,3551],{"class":953},[918,5451,938],{"class":924},[918,5453,941],{"class":924},[918,5455,983],{"class":924},[918,5457,3751],{"class":986},[918,5459,938],{"class":924},[918,5461,991],{"class":924},[918,5463,5464,5466,5468,5470,5472],{"class":920,"line":963},[918,5465,950],{"class":924},[918,5467,4272],{"class":953},[918,5469,938],{"class":924},[918,5471,941],{"class":924},[918,5473,960],{"class":924},[918,5475,5476,5478,5481,5483],{"class":920,"line":969},[918,5477,1386],{"class":924},[918,5479,5480],{"class":986},"Bash(npm test)",[918,5482,938],{"class":924},[918,5484,991],{"class":924},[918,5486,5487,5489,5492,5494],{"class":920,"line":994},[918,5488,1386],{"class":924},[918,5490,5491],{"class":986},"Bash(npm run build)",[918,5493,938],{"class":924},[918,5495,991],{"class":924},[918,5497,5498,5500,5503,5505],{"class":920,"line":1007},[918,5499,1386],{"class":924},[918,5501,5502],{"class":986},"Bash(npm run lint)",[918,5504,938],{"class":924},[918,5506,991],{"class":924},[918,5508,5509,5511,5514,5516],{"class":920,"line":1013},[918,5510,1386],{"class":924},[918,5512,5513],{"class":986},"Read(*)",[918,5515,938],{"class":924},[918,5517,991],{"class":924},[918,5519,5520,5522,5525,5527],{"class":920,"line":1035},[918,5521,1386],{"class":924},[918,5523,5524],{"class":986},"Edit(*)",[918,5526,938],{"class":924},[918,5528,991],{"class":924},[918,5530,5531,5533,5536],{"class":920,"line":1066},[918,5532,1386],{"class":924},[918,5534,5535],{"class":986},"Write(*)",[918,5537,1063],{"class":924},[918,5539,5540],{"class":920,"line":1072},[918,5541,1087],{"class":924},[918,5543,5544,5546,5548,5550,5552],{"class":920,"line":1078},[918,5545,950],{"class":924},[918,5547,1344],{"class":953},[918,5549,938],{"class":924},[918,5551,941],{"class":924},[918,5553,960],{"class":924},[918,5555,5556,5558,5560,5562],{"class":920,"line":1084},[918,5557,1386],{"class":924},[918,5559,5132],{"class":986},[918,5561,938],{"class":924},[918,5563,991],{"class":924},[918,5565,5566,5568,5570,5572],{"class":920,"line":1090},[918,5567,1386],{"class":924},[918,5569,5110],{"class":986},[918,5571,938],{"class":924},[918,5573,991],{"class":924},[918,5575,5576,5578,5581],{"class":920,"line":1103},[918,5577,1386],{"class":924},[918,5579,5580],{"class":986},"WebFetch(*)",[918,5582,1063],{"class":924},[918,5584,5585],{"class":920,"line":1108},[918,5586,1208],{"class":924},[918,5588,5589],{"class":920,"line":1128},[918,5590,1214],{"class":924},[918,5592,5593],{"class":920,"line":1141},[918,5594,1220],{"class":924},[204,5596,5598],{"id":5597},"_73-企业级安全策略","7.3 企业级安全策略",[195,5600,5601],{},"对于团队和组织，建议分层配置：",[195,5603,5604,3116],{},[217,5605,5606],{},"Managed Settings（管理员强制）",[909,5608,5610],{"className":911,"code":5609,"language":913,"meta":914,"style":914},"{\n  \"permissions\": {\n    \"disableBypassPermissionsMode\": \"disable\",\n    \"disableAutoMode\": \"disable\",\n    \"deny\": [\n      \"Bash(*prod*)\",\n      \"Bash(*deploy*)\",\n      \"Read(\u002F\u002Fetc\u002F**)\",\n      \"Read(~\u002F.ssh\u002F**)\"\n    ]\n  },\n  \"allowManagedPermissionRulesOnly\": true,\n  \"allowManagedHooksOnly\": true\n}\n",[264,5611,5612,5616,5628,5648,5667,5679,5690,5700,5711,5720,5724,5728,5741,5755],{"__ignoreMap":914},[918,5613,5614],{"class":920,"line":921},[918,5615,925],{"class":924},[918,5617,5618,5620,5622,5624,5626],{"class":920,"line":928},[918,5619,931],{"class":924},[918,5621,3538],{"class":934},[918,5623,938],{"class":924},[918,5625,941],{"class":924},[918,5627,944],{"class":924},[918,5629,5630,5632,5635,5637,5639,5641,5644,5646],{"class":920,"line":947},[918,5631,950],{"class":924},[918,5633,5634],{"class":953},"disableBypassPermissionsMode",[918,5636,938],{"class":924},[918,5638,941],{"class":924},[918,5640,983],{"class":924},[918,5642,5643],{"class":986},"disable",[918,5645,938],{"class":924},[918,5647,991],{"class":924},[918,5649,5650,5652,5655,5657,5659,5661,5663,5665],{"class":920,"line":963},[918,5651,950],{"class":924},[918,5653,5654],{"class":953},"disableAutoMode",[918,5656,938],{"class":924},[918,5658,941],{"class":924},[918,5660,983],{"class":924},[918,5662,5643],{"class":986},[918,5664,938],{"class":924},[918,5666,991],{"class":924},[918,5668,5669,5671,5673,5675,5677],{"class":920,"line":969},[918,5670,950],{"class":924},[918,5672,1344],{"class":953},[918,5674,938],{"class":924},[918,5676,941],{"class":924},[918,5678,960],{"class":924},[918,5680,5681,5683,5686,5688],{"class":920,"line":994},[918,5682,1386],{"class":924},[918,5684,5685],{"class":986},"Bash(*prod*)",[918,5687,938],{"class":924},[918,5689,991],{"class":924},[918,5691,5692,5694,5696,5698],{"class":920,"line":1007},[918,5693,1386],{"class":924},[918,5695,5110],{"class":986},[918,5697,938],{"class":924},[918,5699,991],{"class":924},[918,5701,5702,5704,5707,5709],{"class":920,"line":1013},[918,5703,1386],{"class":924},[918,5705,5706],{"class":986},"Read(\u002F\u002Fetc\u002F**)",[918,5708,938],{"class":924},[918,5710,991],{"class":924},[918,5712,5713,5715,5718],{"class":920,"line":1035},[918,5714,1386],{"class":924},[918,5716,5717],{"class":986},"Read(~\u002F.ssh\u002F**)",[918,5719,1063],{"class":924},[918,5721,5722],{"class":920,"line":1066},[918,5723,1208],{"class":924},[918,5725,5726],{"class":920,"line":1072},[918,5727,4733],{"class":924},[918,5729,5730,5732,5735,5737,5739],{"class":920,"line":1078},[918,5731,931],{"class":924},[918,5733,5734],{"class":934},"allowManagedPermissionRulesOnly",[918,5736,938],{"class":924},[918,5738,941],{"class":924},[918,5740,1524],{"class":924},[918,5742,5743,5745,5748,5750,5752],{"class":920,"line":1084},[918,5744,931],{"class":924},[918,5746,5747],{"class":934},"allowManagedHooksOnly",[918,5749,938],{"class":924},[918,5751,941],{"class":924},[918,5753,5754],{"class":924}," true\n",[918,5756,5757],{"class":920,"line":1090},[918,5758,1220],{"class":924},[195,5760,5761,3116],{},[217,5762,5763],{},"项目级 Settings（团队共享）",[909,5765,5767],{"className":911,"code":5766,"language":913,"meta":914,"style":914},"{\n  \"hooks\": {\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"Write|Edit\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"npx prettier --write \\\"$CLAUDE_TOOL_INPUT_FILE_PATH\\\"\"\n          }\n        ]\n      }\n    ]\n  }\n}\n",[264,5768,5769,5773,5785,5797,5801,5819,5831,5835,5853,5875,5879,5883,5887,5891,5895],{"__ignoreMap":914},[918,5770,5771],{"class":920,"line":921},[918,5772,925],{"class":924},[918,5774,5775,5777,5779,5781,5783],{"class":920,"line":928},[918,5776,931],{"class":924},[918,5778,935],{"class":934},[918,5780,938],{"class":924},[918,5782,941],{"class":924},[918,5784,944],{"class":924},[918,5786,5787,5789,5791,5793,5795],{"class":920,"line":947},[918,5788,950],{"class":924},[918,5790,497],{"class":953},[918,5792,938],{"class":924},[918,5794,941],{"class":924},[918,5796,960],{"class":924},[918,5798,5799],{"class":920,"line":963},[918,5800,966],{"class":924},[918,5802,5803,5805,5807,5809,5811,5813,5815,5817],{"class":920,"line":969},[918,5804,972],{"class":924},[918,5806,976],{"class":975},[918,5808,938],{"class":924},[918,5810,941],{"class":924},[918,5812,983],{"class":924},[918,5814,1895],{"class":986},[918,5816,938],{"class":924},[918,5818,991],{"class":924},[918,5820,5821,5823,5825,5827,5829],{"class":920,"line":994},[918,5822,972],{"class":924},[918,5824,935],{"class":975},[918,5826,938],{"class":924},[918,5828,941],{"class":924},[918,5830,960],{"class":924},[918,5832,5833],{"class":920,"line":1007},[918,5834,1010],{"class":924},[918,5836,5837,5839,5841,5843,5845,5847,5849,5851],{"class":920,"line":1013},[918,5838,1016],{"class":924},[918,5840,1020],{"class":1019},[918,5842,938],{"class":924},[918,5844,941],{"class":924},[918,5846,983],{"class":924},[918,5848,762],{"class":986},[918,5850,938],{"class":924},[918,5852,991],{"class":924},[918,5854,5855,5857,5859,5861,5863,5865,5867,5869,5871,5873],{"class":920,"line":1035},[918,5856,1016],{"class":924},[918,5858,762],{"class":1019},[918,5860,938],{"class":924},[918,5862,941],{"class":924},[918,5864,983],{"class":924},[918,5866,1178],{"class":986},[918,5868,1052],{"class":1051},[918,5870,1183],{"class":986},[918,5872,1052],{"class":1051},[918,5874,1063],{"class":924},[918,5876,5877],{"class":920,"line":1066},[918,5878,1069],{"class":924},[918,5880,5881],{"class":920,"line":1072},[918,5882,1075],{"class":924},[918,5884,5885],{"class":920,"line":1078},[918,5886,1081],{"class":924},[918,5888,5889],{"class":920,"line":1084},[918,5890,1208],{"class":924},[918,5892,5893],{"class":920,"line":1090},[918,5894,1214],{"class":924},[918,5896,5897],{"class":920,"line":1103},[918,5898,1220],{"class":924},[195,5900,5901,3116],{},[217,5902,5903],{},"个人 Local Settings（开发者自定义）",[909,5905,5907],{"className":911,"code":5906,"language":913,"meta":914,"style":914},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(npm run dev)\",\n      \"Bash(npm run test:watch)\"\n    ]\n  }\n}\n",[264,5908,5909,5913,5925,5937,5948,5957,5961,5965],{"__ignoreMap":914},[918,5910,5911],{"class":920,"line":921},[918,5912,925],{"class":924},[918,5914,5915,5917,5919,5921,5923],{"class":920,"line":928},[918,5916,931],{"class":924},[918,5918,3538],{"class":934},[918,5920,938],{"class":924},[918,5922,941],{"class":924},[918,5924,944],{"class":924},[918,5926,5927,5929,5931,5933,5935],{"class":920,"line":947},[918,5928,950],{"class":924},[918,5930,4272],{"class":953},[918,5932,938],{"class":924},[918,5934,941],{"class":924},[918,5936,960],{"class":924},[918,5938,5939,5941,5944,5946],{"class":920,"line":963},[918,5940,1386],{"class":924},[918,5942,5943],{"class":986},"Bash(npm run dev)",[918,5945,938],{"class":924},[918,5947,991],{"class":924},[918,5949,5950,5952,5955],{"class":920,"line":969},[918,5951,1386],{"class":924},[918,5953,5954],{"class":986},"Bash(npm run test:watch)",[918,5956,1063],{"class":924},[918,5958,5959],{"class":920,"line":994},[918,5960,1208],{"class":924},[918,5962,5963],{"class":920,"line":1007},[918,5964,1214],{"class":924},[918,5966,5967],{"class":920,"line":1013},[918,5968,1220],{"class":924},[199,5970,5972],{"id":5971},"_8-参考来源","8. 参考来源",[3576,5974,5975,5985,5993,6001,6009,6017,6025,6033,6041,6049,6057,6065],{},[1440,5976,5977,5984],{},[5978,5979,5983],"a",{"href":5980,"rel":5981},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fhooks",[5982],"nofollow","Hooks Reference - Claude Code Docs"," — 官方 Hooks 事件、配置模式、JSON 输入\u002F输出格式参考",[1440,5986,5987,5992],{},[5978,5988,5991],{"href":5989,"rel":5990},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fpermission-modes",[5982],"Choose a Permission Mode - Claude Code Docs"," — 权限模式官方文档",[1440,5994,5995,6000],{},[5978,5996,5999],{"href":5997,"rel":5998},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fauto-mode-config",[5982],"Configure Auto Mode - Claude Code Docs"," — Auto Mode 分类器配置指南",[1440,6002,6003,6008],{},[5978,6004,6007],{"href":6005,"rel":6006},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fpermissions",[5982],"Configure Permissions - Claude Code Docs"," — 权限规则语法与细粒度控制",[1440,6010,6011,6016],{},[5978,6012,6015],{"href":6013,"rel":6014},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fsecurity",[5982],"Security - Claude Code Docs"," — 安全机制与最佳实践",[1440,6018,6019,6024],{},[5978,6020,6023],{"href":6021,"rel":6022},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fcheckpointing",[5982],"Checkpointing - Claude Code Docs"," — 检查点与恢复机制",[1440,6026,6027,6032],{},[5978,6028,6031],{"href":6029,"rel":6030},"https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fclaude-code-auto-mode",[5982],"Claude Code Auto Mode: A Safer Way to Skip Permissions"," — Anthropic 官方工程博客，分类器架构详解",[1440,6034,6035,6040],{},[5978,6036,6039],{"href":6037,"rel":6038},"https:\u002F\u002Fsmartscope.blog\u002Fen\u002Fgenerative-ai\u002Fclaude\u002Fclaude-code-hooks-guide\u002F",[5982],"Claude Code Hooks Complete Guide (March 2026 Edition)"," — 21 个生命周期事件、4 种处理器类型的完整指南",[1440,6042,6043,6048],{},[5978,6044,6047],{"href":6045,"rel":6046},"https:\u002F\u002Faiorg.dev\u002Fblog\u002Fclaude-code-hooks",[5982],"Claude Code Hooks: Complete Guide with 20+ Examples (2026)"," — 20+ 生产级配置示例",[1440,6050,6051,6056],{},[5978,6052,6055],{"href":6053,"rel":6054},"https:\u002F\u002Fsmartscope.blog\u002Fen\u002Fgenerative-ai\u002Fclaude\u002Fclaude-code-2-0-checkpoint-patterns\u002F",[5982],"Claude Code 2.0 Checkpoint Feature Practical Guide"," — 恢复模式与 Git 集成策略",[1440,6058,6059,6064],{},[5978,6060,6063],{"href":6061,"rel":6062},"https:\u002F\u002Fsmartscope.blog\u002Fen\u002Fgenerative-ai\u002Fclaude\u002Fclaude-code-permission-overview\u002F",[5982],"Claude Code Permission Modes: Complete Guide"," — 6 种权限模式全景对比",[1440,6066,6067,6072],{},[5978,6068,6071],{"href":6069,"rel":6070},"https:\u002F\u002Farxiv.org\u002Fhtml\u002F2604.14228v1",[5982],"Dive into Claude Code: The Design Space of Today's and Future AI Agent"," — 源代码级架构分析论文",[6074,6075,6076],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":914,"searchDepth":921,"depth":928,"links":6078},[6079,6088,6098,6104,6109,6119,6125,6130],{"id":201,"depth":928,"text":202,"children":6080},[6081,6082,6083,6084,6085,6086,6087],{"id":206,"depth":947,"text":207},{"id":223,"depth":947,"text":224},{"id":734,"depth":947,"text":735},{"id":833,"depth":947,"text":834},{"id":1223,"depth":947,"text":1224},{"id":1460,"depth":947,"text":1461},{"id":1598,"depth":947,"text":1599},{"id":1629,"depth":928,"text":1630,"children":6089},[6090,6091,6092,6093,6094,6095,6096,6097],{"id":1633,"depth":947,"text":1634},{"id":1842,"depth":947,"text":1843},{"id":2023,"depth":947,"text":2024},{"id":2275,"depth":947,"text":2276},{"id":2642,"depth":947,"text":2643},{"id":2823,"depth":947,"text":2824},{"id":3126,"depth":947,"text":3127},{"id":3297,"depth":947,"text":3298},{"id":3428,"depth":928,"text":3429,"children":6099},[6100,6101,6102,6103],{"id":3432,"depth":947,"text":3433},{"id":3474,"depth":947,"text":3475},{"id":3573,"depth":947,"text":3574},{"id":3604,"depth":947,"text":3605},{"id":3646,"depth":928,"text":3647,"children":6105},[6106,6107,6108],{"id":3650,"depth":947,"text":3651},{"id":3779,"depth":947,"text":3780},{"id":3826,"depth":947,"text":3827},{"id":3923,"depth":928,"text":3924,"children":6110},[6111,6112,6113,6114,6115,6116,6117,6118],{"id":3927,"depth":947,"text":3928},{"id":3934,"depth":947,"text":3935},{"id":3988,"depth":947,"text":3989},{"id":4000,"depth":947,"text":4001},{"id":4084,"depth":947,"text":4085},{"id":4150,"depth":947,"text":4151},{"id":4404,"depth":947,"text":4405},{"id":4436,"depth":947,"text":4437},{"id":4455,"depth":928,"text":4456,"children":6120},[6121,6122,6123,6124],{"id":4459,"depth":947,"text":4460},{"id":4485,"depth":947,"text":4486},{"id":4566,"depth":947,"text":4567},{"id":4640,"depth":947,"text":4641},{"id":4671,"depth":928,"text":4672,"children":6126},[6127,6128,6129],{"id":4675,"depth":947,"text":4676},{"id":4685,"depth":947,"text":4686},{"id":5597,"depth":947,"text":5598},{"id":5971,"depth":928,"text":5972},"自动化守卫与高风险操作安全网","md",null,{"date":6135},"2026-04-26",true,{"title":120,"description":6131},"xJptSS7KTaArTM93CseUHyoDZOitfbbdZ4sIGiOQPMI",[6140,6142],{"title":116,"path":117,"stem":118,"description":6141,"children":-1},"通过模型上下文协议连接外部世界",{"title":130,"path":131,"stem":132,"description":6143,"children":-1},"与 Claude 协作完成",1777395309961]