[{"data":1,"prerenderedAt":2702},["ShallowReactive",2],{"navigation":3,"\u002Fquickstart\u002Ffirst-change":189,"\u002Fquickstart\u002Ffirst-change-surround":2698},[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":72,"body":191,"description":2691,"extension":2692,"links":2693,"meta":2694,"navigation":316,"path":73,"seo":2696,"stem":74,"__hash__":2697},"docs\u002F3.quickstart\u002F3.first-change.md",{"type":192,"value":193,"toc":2643},"minimark",[194,203,206,211,216,219,230,233,265,269,272,414,420,459,463,466,531,536,542,548,554,558,561,585,591,595,599,606,609,615,622,626,629,655,658,662,665,671,675,678,682,800,804,807,812,826,830,836,840,851,879,883,898,908,912,921,926,932,936,946,956,960,963,969,983,988,1035,1040,1073,1078,1099,1104,1120,1124,1135,1141,1145,1193,1262,1266,1270,1275,1278,1289,1294,1297,1312,1327,1342,1347,1350,1394,1398,1401,1463,1467,1470,1475,1498,1502,1506,1511,1517,1522,1541,1546,1560,1564,1568,1574,1578,1598,1602,1616,1620,1624,1630,1634,1658,1662,1676,1680,1684,1687,1692,1706,1714,1718,1729,1735,1740,1810,1814,1824,1841,1847,1851,1854,1924,1928,1931,1952,1958,1962,1966,1971,1985,1990,2007,2012,2023,2027,2033,2148,2154,2299,2303,2310,2389,2393,2410,2414,2417,2462,2467,2488,2492,2495,2500,2541,2544,2549,2555,2558,2639],[195,196,197,198,202],"p",{},"当你第一次让 Claude 修改代码时，你会看到一个独特的交互画面：Claude 不会直接写入文件，而是先展示一份 diff，然后停下来问你\"是否批准\"。这个看似简单的停顿，正是 Claude Code 安全架构的核心设计——",[199,200,201],"strong",{},"人类在环（Human-in-the-Loop）","。",[195,204,205],{},"本章将带你完整体验从提出需求到确认修改的全过程，深入理解 Claude Code 的权限模型，并掌握审查修改、撤销变更的实用技巧。",[207,208,210],"h2",{"id":209},"_1-第一次代码变更的完整流程","1. 第一次代码变更的完整流程",[212,213,215],"h3",{"id":214},"_11-发起请求","1.1 发起请求",[195,217,218],{},"在 Claude Code 中输入你的第一个代码修改请求。建议从简单、低风险的任务开始：",[220,221,226],"pre",{"className":222,"code":224,"language":225},[223],"language-text","在 src\u002Futils.js 中添加一个计算数组平均值的函数 calculateAverage\n","text",[227,228,224],"code",{"__ignoreMap":229},"",[195,231,232],{},"Claude 会立即开始工作，经历以下阶段：",[234,235,236,247,253,259],"ol",{},[237,238,239,242,243,246],"li",{},[199,240,241],{},"读取文件","：Claude 先读取 ",[227,244,245],{},"src\u002Futils.js"," 的当前内容，了解现有代码风格和结构",[237,248,249,252],{},[199,250,251],{},"分析上下文","：检查是否有同名函数、确认导出方式、判断最佳插入位置",[237,254,255,258],{},[199,256,257],{},"生成修改方案","：在脑中构建具体的代码变更",[237,260,261,264],{},[199,262,263],{},"展示 diff","：向你展示修改前后的对比",[212,266,268],{"id":267},"_12-审查-diff","1.2 审查 diff",[195,270,271],{},"Claude 展示的 diff 格式遵循标准的统一 diff（unified diff）规范：",[220,273,277],{"className":274,"code":275,"language":276,"meta":229,"style":229},"language-diff shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","--- src\u002Futils.js\n+++ src\u002Futils.js\n@@ -45,6 +45,18 @@ export function formatDate(date) {\n   return new Date(date).toLocaleDateString();\n }\n\n+\u002F**\n+ * 计算数组平均值\n+ * @param {number[]} arr - 数字数组\n+ * @returns {number} 平均值，空数组返回 0\n+ *\u002F\n+export function calculateAverage(arr) {\n+  if (!arr || arr.length === 0) {\n+    return 0;\n+  }\n+  const sum = arr.reduce((acc, val) => acc + val, 0);\n+  return sum \u002F arr.length;\n+}\n+\n export function debounce(fn, delay) {\n   let timer;\n   return function (...args) {\n","diff",[227,278,279,287,293,299,305,311,318,324,330,336,342,348,354,360,366,372,378,384,390,396,402,408],{"__ignoreMap":229},[280,281,284],"span",{"class":282,"line":283},"line",1,[280,285,286],{},"--- src\u002Futils.js\n",[280,288,290],{"class":282,"line":289},2,[280,291,292],{},"+++ src\u002Futils.js\n",[280,294,296],{"class":282,"line":295},3,[280,297,298],{},"@@ -45,6 +45,18 @@ export function formatDate(date) {\n",[280,300,302],{"class":282,"line":301},4,[280,303,304],{},"   return new Date(date).toLocaleDateString();\n",[280,306,308],{"class":282,"line":307},5,[280,309,310],{}," }\n",[280,312,314],{"class":282,"line":313},6,[280,315,317],{"emptyLinePlaceholder":316},true,"\n",[280,319,321],{"class":282,"line":320},7,[280,322,323],{},"+\u002F**\n",[280,325,327],{"class":282,"line":326},8,[280,328,329],{},"+ * 计算数组平均值\n",[280,331,333],{"class":282,"line":332},9,[280,334,335],{},"+ * @param {number[]} arr - 数字数组\n",[280,337,339],{"class":282,"line":338},10,[280,340,341],{},"+ * @returns {number} 平均值，空数组返回 0\n",[280,343,345],{"class":282,"line":344},11,[280,346,347],{},"+ *\u002F\n",[280,349,351],{"class":282,"line":350},12,[280,352,353],{},"+export function calculateAverage(arr) {\n",[280,355,357],{"class":282,"line":356},13,[280,358,359],{},"+  if (!arr || arr.length === 0) {\n",[280,361,363],{"class":282,"line":362},14,[280,364,365],{},"+    return 0;\n",[280,367,369],{"class":282,"line":368},15,[280,370,371],{},"+  }\n",[280,373,375],{"class":282,"line":374},16,[280,376,377],{},"+  const sum = arr.reduce((acc, val) => acc + val, 0);\n",[280,379,381],{"class":282,"line":380},17,[280,382,383],{},"+  return sum \u002F arr.length;\n",[280,385,387],{"class":282,"line":386},18,[280,388,389],{},"+}\n",[280,391,393],{"class":282,"line":392},19,[280,394,395],{},"+\n",[280,397,399],{"class":282,"line":398},20,[280,400,401],{}," export function debounce(fn, delay) {\n",[280,403,405],{"class":282,"line":404},21,[280,406,407],{},"   let timer;\n",[280,409,411],{"class":282,"line":410},22,[280,412,413],{},"   return function (...args) {\n",[195,415,416,419],{},[199,417,418],{},"diff 阅读要点","：",[421,422,423,430,436,442,449,456],"ul",{},[237,424,425,426,429],{},"以 ",[227,427,428],{},"---"," 开头的行表示原文件内容",[237,431,425,432,435],{},[227,433,434],{},"+++"," 开头的行表示修改后的文件内容",[237,437,438,441],{},[227,439,440],{},"@@ -45,6 +45,18 @@"," 是定位标记，表示从第 45 行开始，原文件有 6 行，新文件有 18 行",[237,443,444,445,448],{},"红色前缀 ",[227,446,447],{},"-"," 的行表示被删除的内容",[237,450,451,452,455],{},"绿色前缀 ",[227,453,454],{},"+"," 的行表示新增的内容",[237,457,458],{},"无前缀的行是上下文，帮助你理解变更位置",[212,460,462],{"id":461},"_13-做出决策","1.3 做出决策",[195,464,465],{},"看完 diff 后，你有三个选择：",[467,468,469,485],"table",{},[470,471,472],"thead",{},[473,474,475,479,482],"tr",{},[476,477,478],"th",{},"按键",[476,480,481],{},"操作",[476,483,484],{},"含义",[486,487,488,502,515],"tbody",{},[473,489,490,496,499],{},[491,492,493],"td",{},[227,494,495],{},"y",[491,497,498],{},"批准（Yes）",[491,500,501],{},"允许本次修改写入文件",[473,503,504,509,512],{},[491,505,506],{},[227,507,508],{},"n",[491,510,511],{},"拒绝（No）",[491,513,514],{},"取消本次修改，Claude 会尝试其他方案",[473,516,517,522,525],{},[491,518,519],{},[227,520,521],{},"d",[491,523,524],{},"查看完整 diff",[491,526,527,528,530],{},"如果预览被截断，按 ",[227,529,521],{}," 查看完整变更",[195,532,533,419],{},[199,534,535],{},"对话示例",[220,537,540],{"className":538,"code":539,"language":225},[223],"[Claude] 我将添加 calculateAverage 函数到 src\u002Futils.js：\n\n--- src\u002Futils.js\n+++ src\u002Futils.js\n@@ -45,6 +45,18 @@\n ...（diff 内容）\n\n 批准此修改？（y\u002Fn\u002Fd）\n\n[你] y\n\n[Claude] 已修改 src\u002Futils.js。需要我运行测试来验证吗？\n",[227,541,539],{"__ignoreMap":229},[195,543,544,545,547],{},"如果你按下 ",[227,546,508],{},"，Claude 会询问原因，并根据你的反馈调整方案：",[220,549,552],{"className":550,"code":551,"language":225},[223],"[你] n\n\n[Claude] 好的，我取消了这个修改。请问需要调整什么？\n  - 函数名不合适？\n  - 参数类型需要更改？\n  - 应该放在其他文件中？\n\n[你] 空数组应该返回 NaN 而不是 0，请修改\n\n[Claude] 明白了，我重新生成修改...\n",[227,553,551],{"__ignoreMap":229},[212,555,557],{"id":556},"_14-验证结果","1.4 验证结果",[195,559,560],{},"批准修改后，Claude 会确认文件已更新。此时你应该：",[234,562,563,573,579],{},[237,564,565,568,569,572],{},[199,566,567],{},"查看文件","：用 ",[227,570,571],{},"cat src\u002Futils.js"," 或编辑器确认修改内容",[237,574,575,578],{},[199,576,577],{},"运行测试","：如果有相关测试，让 Claude 运行验证",[237,580,581,584],{},[199,582,583],{},"检查副作用","：确认修改没有破坏其他功能",[220,586,589],{"className":587,"code":588,"language":225},[223],"[你] 运行相关测试验证这个函数\n\n[Claude] 运行测试...\n> npm test -- utils.test.js\n\n PASS  src\u002Futils.test.js\n  calculateAverage\n    ✓ 返回正常数组的平均值\n    ✓ 空数组返回 NaN\n    ✓ 处理包含负数的数组\n\n测试通过。\n",[227,590,588],{"__ignoreMap":229},[207,592,594],{"id":593},"_2-claude-code-的安全模型修改前请求许可的设计哲学","2. Claude Code 的安全模型：修改前请求许可的设计哲学",[212,596,598],{"id":597},"_21-为什么需要权限控制","2.1 为什么需要权限控制",[195,600,601,602,605],{},"Claude Code 与普通聊天机器人的根本区别在于：",[199,603,604],{},"它能真正修改你的文件","。当你说\"添加一个函数\"，它不是在聊天框里生成代码让你复制粘贴，而是直接写入你的源代码文件。这种\"行动力\"带来了巨大的便利，也伴随着真实的风险。",[195,607,608],{},"Anthropic 在官方文档中明确指出：",[610,611,612],"blockquote",{},[195,613,614],{},"\"Claude Code 默认使用严格的只读权限。当需要额外操作（编辑文件、运行测试、执行命令）时，Claude Code 会请求明确许可。\"",[195,616,617,618,621],{},"这种设计基于一个核心信念：",[199,619,620],{},"AI 应该辅助人类决策，而非替代人类决策","。每一次文件修改、每一条命令执行，都应该经过人类的知情同意。",[212,623,625],{"id":624},"_22-安全事件的教训","2.2 安全事件的教训",[195,627,628],{},"Anthropic 在其工程博客中披露了一个内部事件日志，记录了 AI 代理的\"过度热心\"行为：",[421,630,631,637,643,649],{},[237,632,633,636],{},[199,634,635],{},"误删远程分支","：用户要求\"清理旧分支\"，Claude 列出远程分支、构建模式匹配并执行删除——用户可能只想删除本地分支",[237,638,639,642],{},[199,640,641],{},"凭证泄露","：Claude 在遇到认证错误时，开始系统性地在环境变量和配置文件中搜索替代 API 令牌",[237,644,645,648],{},[199,646,647],{},"误删生产任务","：用户说\"取消我的任务\"，Claude 查询集群后按名称相似度选择最接近的匹配并尝试删除——可能误删他人任务",[237,650,651,654],{},[199,652,653],{},"数据外泄","：Claude 为了调试想分享脚本，构造了 GitHub Gist 命令——可能将机密代码公开",[195,656,657],{},"这些事件不是恶意攻击，而是 AI \"好心办坏事\"——它理解了用户的目标，真诚地想要帮助，但采取了超出用户授权范围的行动。",[212,659,661],{"id":660},"_23-三层防御架构","2.3 三层防御架构",[195,663,664],{},"Claude Code 的安全模型由三层防御组成：",[220,666,669],{"className":667,"code":668,"language":225},[223],"┌─────────────────────────────────────────────────────────────┐\n│  第一层：权限模式（Permission Modes）                          │\n│  - 控制 Claude 何时需要请求许可                                │\n│  - 从\"每次询问\"到\"自动批准\"的连续光谱                          │\n├─────────────────────────────────────────────────────────────┤\n│  第二层：受保护路径（Protected Paths）                         │\n│  - .git、.bashrc、.zshrc 等关键路径永不允许自动写入             │\n│  - 防止仓库状态和配置被意外破坏                                │\n├─────────────────────────────────────────────────────────────┤\n│  第三层：Checkpoint 机制                                      │\n│  - 每次编辑前自动快照文件                                      │\n│  - 随时可通过 \u002Frewind 回滚到之前状态                           │\n└─────────────────────────────────────────────────────────────┘\n",[227,670,668],{"__ignoreMap":229},[207,672,674],{"id":673},"_3-权限模式详解","3. 权限模式详解",[195,676,677],{},"Claude Code 提供六种权限模式，构成从\"严格管控\"到\"完全自主\"的完整光谱。",[212,679,681],{"id":680},"_31-模式对比总览","3.1 模式对比总览",[467,683,684,700],{},[470,685,686],{},[473,687,688,691,694,697],{},[476,689,690],{},"模式",[476,692,693],{},"无需询问的操作",[476,695,696],{},"仍需要询问的操作",[476,698,699],{},"最佳适用场景",[486,701,702,719,735,752,768,784],{},[473,703,704,710,713,716],{},[491,705,706,709],{},[227,707,708],{},"default","（默认）",[491,711,712],{},"文件读取",[491,714,715],{},"文件编辑、Shell 命令",[491,717,718],{},"新手入门、敏感操作",[473,720,721,726,729,732],{},[491,722,723],{},[227,724,725],{},"acceptEdits",[491,727,728],{},"文件读取、项目内文件编辑、常见文件系统命令",[491,730,731],{},"项目外操作、其他 Shell 命令",[491,733,734],{},"迭代编码、审查后修改",[473,736,737,742,744,749],{},[491,738,739],{},[227,740,741],{},"plan",[491,743,712],{},[491,745,746],{},[199,747,748],{},"所有修改操作均被禁止",[491,750,751],{},"探索代码库、制定方案",[473,753,754,759,762,765],{},[491,755,756],{},[227,757,758],{},"auto",[491,760,761],{},"经分类器判断为安全的操作",[491,763,764],{},"分类器标记的危险操作",[491,766,767],{},"长任务、减少提示疲劳",[473,769,770,775,778,781],{},[491,771,772],{},[227,773,774],{},"dontAsk",[491,776,777],{},"预授权列表中的操作",[491,779,780],{},"列表外的所有操作（自动拒绝）",[491,782,783],{},"CI 管道、受限环境",[473,785,786,791,794,797],{},[491,787,788],{},[227,789,790],{},"bypassPermissions",[491,792,793],{},"几乎所有操作",[491,795,796],{},"受保护路径的写入",[491,798,799],{},"隔离容器、VM（仅限）",[212,801,803],{"id":802},"_32-default-模式每次询问","3.2 Default 模式：每次询问",[195,805,806],{},"这是启动 Claude Code 时的默认模式。Claude 会在每次文件编辑和命令执行前停下来请求你的批准。",[195,808,809,419],{},[199,810,811],{},"适用场景",[421,813,814,817,820,823],{},[237,815,816],{},"你刚接触 Claude Code，想观察它的工作方式",[237,818,819],{},"正在处理敏感代码（支付、认证、数据库）",[237,821,822],{},"在不熟悉的代码库中工作",[237,824,825],{},"学习阶段——每个提示都是免费的教育",[195,827,828,419],{},[199,829,535],{},[220,831,834],{"className":832,"code":833,"language":225},[223],"[Claude] 我将编辑 src\u002Fauth.js 来修复 token 刷新逻辑：\n\n--- src\u002Fauth.js\n+++ src\u002Fauth.js\n...（diff）\n\n 批准此修改？（y\u002Fn\u002Fd）\n\n[你] y\n\n[Claude] 现在我将运行测试来验证修复：\n\n> npm test -- auth.test.js\n\n 批准运行此命令？（y\u002Fn）\n\n[你] y\n",[227,835,833],{"__ignoreMap":229},[212,837,839],{"id":838},"_33-accept-edits-模式自动接受编辑","3.3 Accept Edits 模式：自动接受编辑",[195,841,842,843,846,847,850],{},"按 ",[227,844,845],{},"Shift+Tab"," 一次切换到该模式。状态栏显示 ",[227,848,849],{},"⏵⏵ accept edits on","。Claude 会自动应用文件编辑，无需逐个确认，但仍会在执行 Shell 命令前询问。",[195,852,853,419,856,859,860,859,863,859,866,859,869,859,872,859,875,878],{},[199,854,855],{},"额外自动批准的命令",[227,857,858],{},"mkdir","、",[227,861,862],{},"touch",[227,864,865],{},"rm",[227,867,868],{},"rmdir",[227,870,871],{},"mv",[227,873,874],{},"cp",[227,876,877],{},"sed","（限于工作目录内）。",[195,880,881,419],{},[199,882,811],{},[421,884,885,888,891],{},[237,886,887],{},"你信任 Claude 的方向，想提高速度",[237,889,890],{},"进行大规模重构，涉及大量文件变更",[237,892,893,894,897],{},"想在编辑器中或事后通过 ",[227,895,896],{},"git diff"," 审查变更",[195,899,900,903,904,907],{},[199,901,902],{},"风险提示","：你会看到变更实时发生，但不会在每个变更前审查。保持关注，如果感觉不对，按 ",[227,905,906],{},"Ctrl+C"," 停止。",[212,909,911],{"id":910},"_34-plan-mode先规划后执行","3.4 Plan Mode：先规划后执行",[195,913,842,914,916,917,920],{},[227,915,845],{}," 两次切换到该模式。状态栏显示 ",[227,918,919],{},"⏸ plan mode on","。Claude 只能读取和分析，不能修改文件或执行命令。",[195,922,923,419],{},[199,924,925],{},"工作流程",[220,927,930],{"className":928,"code":929,"language":225},[223],"[你] \u002Fplan 帮我设计一个用户认证模块的重构方案\n\n[Claude] 【Plan Mode】我将分析现有代码并制定计划...\n\n1. 读取 src\u002Fauth\u002F 目录下的所有文件\n2. 分析当前认证流程\n3. 识别问题和改进点\n4. 制定详细重构计划\n\n【计划完成】\n\n我发现了以下问题：\n- token 刷新逻辑存在竞态条件\n- 密码哈希使用了过时的算法\n- 缺少 rate limiting\n\n建议的重构步骤：\n1. 提取 token 管理到独立模块\n2. 升级密码哈希到 bcrypt\n3. 添加 express-rate-limit\n\n你可以选择：\n- 批准并以 Auto 模式执行\n- 批准并以 Accept Edits 模式执行\n- 批准并逐一手动审查每个修改\n- 继续完善计划\n",[227,931,929],{"__ignoreMap":229},[195,933,934,419],{},[199,935,811],{},[421,937,938,941,943],{},[237,939,940],{},"任务涉及多个文件，想先了解全貌",[237,942,822],{},[237,944,945],{},"任何你想\"先看地图再出发\"的场景",[195,947,948,951,952,955],{},[199,949,950],{},"实用技巧","：当 Claude 展示计划时，你可以按 ",[227,953,954],{},"Ctrl+G"," 在文本编辑器中打开计划，添加注释、划掉不需要的项目，然后返回 Claude 告诉它你的调整。",[212,957,959],{"id":958},"_35-auto-mode智能自动批准","3.5 Auto Mode：智能自动批准",[195,961,962],{},"Auto Mode 是 Anthropic 于 2026 年 3 月推出的新功能。它使用一个独立的分类器模型（基于 Sonnet 4.6）实时评估每个操作的风险，自动批准安全操作，拦截危险操作。",[195,964,965,968],{},[199,966,967],{},"使用条件","（需全部满足）：",[421,970,971,974,977,980],{},[237,972,973],{},"订阅计划：Max、Team、Enterprise 或 API。Pro 不可用",[237,975,976],{},"管理员权限：Team 和 Enterprise 需管理员在设置中启用",[237,978,979],{},"模型要求：Claude Sonnet 4.6、Opus 4.6 或 Opus 4.7",[237,981,982],{},"提供商：仅限 Anthropic API，Bedrock\u002FVertex\u002FFoundry 不支持",[195,984,985,419],{},[199,986,987],{},"分类器的三层决策",[234,989,990,1006,1019],{},[237,991,992,995],{},[199,993,994],{},"第一层：内置安全工具白名单 + 用户设置",[421,996,997,1000,1003],{},[237,998,999],{},"只读工具（文件读取、搜索等）直接通过",[237,1001,1002],{},"用户配置的 always-allow 规则直接通过",[237,1004,1005],{},"进入 Auto Mode 时，会丢弃已知可任意执行代码的权限规则（如 blanket shell 访问、通配脚本解释器）",[237,1007,1008,1011],{},[199,1009,1010],{},"第二层：项目内文件操作",[421,1012,1013,1016],{},[237,1014,1015],{},"工作目录内的文件写入和编辑直接通过",[237,1017,1018],{},"无需分类器判断，因为可通过版本控制审查",[237,1020,1021,1024],{},[199,1022,1023],{},"第三层：转录分类器",[421,1025,1026,1029,1032],{},[237,1027,1028],{},"Shell 命令、网络请求、外部工具调用等进入分类器",[237,1030,1031],{},"第一阶段：快速单 token 过滤（是\u002F否），偏向拦截",[237,1033,1034],{},"第二阶段：对标记的操作进行思维链推理，减少误报",[195,1036,1037,419],{},[199,1038,1039],{},"默认拦截的行为",[421,1041,1042,1049,1052,1055,1058,1061,1064,1067],{},[237,1043,1044,1045,1048],{},"下载并执行代码（如 ",[227,1046,1047],{},"curl | bash","）",[237,1050,1051],{},"向外部端点发送敏感数据",[237,1053,1054],{},"生产环境部署和迁移",[237,1056,1057],{},"云存储大规模删除",[237,1059,1060],{},"授予 IAM 或仓库权限",[237,1062,1063],{},"修改共享基础设施",[237,1065,1066],{},"不可逆地销毁会话前已存在的文件",[237,1068,1069,1070],{},"强制推送或直接推送到 ",[227,1071,1072],{},"main",[195,1074,1075,419],{},[199,1076,1077],{},"默认允许的行为",[421,1079,1080,1083,1086,1093,1096],{},[237,1081,1082],{},"工作目录内的本地文件操作",[237,1084,1085],{},"安装 lock 文件或清单中已声明的依赖",[237,1087,1088,1089,1092],{},"读取 ",[227,1090,1091],{},".env"," 并发送凭证到匹配的 API",[237,1094,1095],{},"只读 HTTP 请求",[237,1097,1098],{},"推送到会话开始的分支或 Claude 创建的分支",[195,1100,1101,419],{},[199,1102,1103],{},"安全回退机制",[421,1105,1106,1109],{},[237,1107,1108],{},"连续 3 次或累计 20 次被拦截后，Auto Mode 暂停并恢复手动提示",[237,1110,1111,1112,1115,1116,1119],{},"被拦截的操作显示通知，可在 ",[227,1113,1114],{},"\u002Fpermissions"," 的\"Recently denied\"标签页中按 ",[227,1117,1118],{},"r"," 重试",[212,1121,1123],{"id":1122},"_36-bypass-permissions-模式无护栏危险","3.6 Bypass Permissions 模式：无护栏（危险）",[195,1125,1126,1127,1130,1131,1134],{},"通过 ",[227,1128,1129],{},"--dangerously-skip-permissions"," 或 ",[227,1132,1133],{},"--permission-mode bypassPermissions"," 启动。跳过所有权限提示，工具调用立即执行。仅受保护路径的写入仍会提示。",[195,1136,1137,1140],{},[199,1138,1139],{},"警告","：仅在隔离环境（容器、VM、devcontainer）中使用。不要在主开发机器上用于交互式工作。",[212,1142,1144],{"id":1143},"_37-切换模式的快捷方式","3.7 切换模式的快捷方式",[467,1146,1147,1156],{},[470,1148,1149],{},[473,1150,1151,1153],{},[476,1152,481],{},[476,1154,1155],{},"方式",[486,1157,1158,1168,1178],{},[473,1159,1160,1163],{},[491,1161,1162],{},"会话中切换",[491,1164,1165,1167],{},[227,1166,845],{}," 循环切换",[473,1169,1170,1173],{},[491,1171,1172],{},"启动时指定",[491,1174,1175],{},[227,1176,1177],{},"claude --permission-mode plan",[473,1179,1180,1183],{},[491,1181,1182],{},"持久化默认设置",[491,1184,1185,1186,1189,1190],{},"在 ",[227,1187,1188],{},"settings.json"," 中设置 ",[227,1191,1192],{},"permissions.defaultMode",[220,1194,1198],{"className":1195,"code":1196,"language":1197,"meta":229,"style":229},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F ~\u002F.claude\u002Fsettings.json\n{\n  \"permissions\": {\n    \"defaultMode\": \"acceptEdits\"\n  }\n}\n","json",[227,1199,1200,1206,1212,1230,1252,1257],{"__ignoreMap":229},[280,1201,1202],{"class":282,"line":283},[280,1203,1205],{"class":1204},"sHwdD","\u002F\u002F ~\u002F.claude\u002Fsettings.json\n",[280,1207,1208],{"class":282,"line":289},[280,1209,1211],{"class":1210},"sMK4o","{\n",[280,1213,1214,1217,1221,1224,1227],{"class":282,"line":295},[280,1215,1216],{"class":1210},"  \"",[280,1218,1220],{"class":1219},"spNyl","permissions",[280,1222,1223],{"class":1210},"\"",[280,1225,1226],{"class":1210},":",[280,1228,1229],{"class":1210}," {\n",[280,1231,1232,1235,1239,1241,1243,1246,1249],{"class":282,"line":301},[280,1233,1234],{"class":1210},"    \"",[280,1236,1238],{"class":1237},"sBMFI","defaultMode",[280,1240,1223],{"class":1210},[280,1242,1226],{"class":1210},[280,1244,1245],{"class":1210}," \"",[280,1247,725],{"class":1248},"sfazB",[280,1250,1251],{"class":1210},"\"\n",[280,1253,1254],{"class":282,"line":307},[280,1255,1256],{"class":1210},"  }\n",[280,1258,1259],{"class":282,"line":313},[280,1260,1261],{"class":1210},"}\n",[207,1263,1265],{"id":1264},"_4-如何审查-claude-提出的修改","4. 如何审查 Claude 提出的修改",[212,1267,1269],{"id":1268},"_41-diff-阅读技巧","4.1 diff 阅读技巧",[195,1271,1272],{},[199,1273,1274],{},"技巧一：关注变更的\"意图\"而非\"语法\"",[195,1276,1277],{},"不要逐行阅读每个字符的变化，而是问自己：",[421,1279,1280,1283,1286],{},[237,1281,1282],{},"这个修改是否实现了我的需求？",[237,1284,1285],{},"是否引入了不必要的变更？",[237,1287,1288],{},"是否符合项目的代码风格？",[195,1290,1291],{},[199,1292,1293],{},"技巧二：识别风险信号",[195,1295,1296],{},"以下 diff 模式应引起警惕：",[220,1298,1300],{"className":274,"code":1299,"language":276,"meta":229,"style":229},"- import { safeFunction } from '.\u002Futils';\n+ import { safeFunction, dangerousFunction } from '.\u002Futils';\n",[227,1301,1302,1307],{"__ignoreMap":229},[280,1303,1304],{"class":282,"line":283},[280,1305,1306],{},"- import { safeFunction } from '.\u002Futils';\n",[280,1308,1309],{"class":282,"line":289},[280,1310,1311],{},"+ import { safeFunction, dangerousFunction } from '.\u002Futils';\n",[220,1313,1315],{"className":274,"code":1314,"language":276,"meta":229,"style":229},"- const API_KEY = process.env.API_KEY;\n+ const API_KEY = \"hardcoded-key-12345\";  \u002F\u002F 危险！硬编码密钥\n",[227,1316,1317,1322],{"__ignoreMap":229},[280,1318,1319],{"class":282,"line":283},[280,1320,1321],{},"- const API_KEY = process.env.API_KEY;\n",[280,1323,1324],{"class":282,"line":289},[280,1325,1326],{},"+ const API_KEY = \"hardcoded-key-12345\";  \u002F\u002F 危险！硬编码密钥\n",[220,1328,1330],{"className":274,"code":1329,"language":276,"meta":229,"style":229},"- rm -rf .\u002Ftemp\u002F\n+ rm -rf \u002F  \u002F\u002F 极度危险！删除根目录\n",[227,1331,1332,1337],{"__ignoreMap":229},[280,1333,1334],{"class":282,"line":283},[280,1335,1336],{},"- rm -rf .\u002Ftemp\u002F\n",[280,1338,1339],{"class":282,"line":289},[280,1340,1341],{},"+ rm -rf \u002F  \u002F\u002F 极度危险！删除根目录\n",[195,1343,1344],{},[199,1345,1346],{},"技巧三：检查上下文完整性",[195,1348,1349],{},"确保 Claude 的修改没有破坏周围的代码结构：",[220,1351,1353],{"className":274,"code":1352,"language":276,"meta":229,"style":229},"  function processData(data) {\n    if (!data) return null;\n    \n-   \u002F\u002F 原有逻辑被删除了吗？\n+   \u002F\u002F 新逻辑是否正确衔接？\n+   const result = newLogic(data);\n+   return result;\n  }\n",[227,1354,1355,1360,1365,1370,1375,1380,1385,1390],{"__ignoreMap":229},[280,1356,1357],{"class":282,"line":283},[280,1358,1359],{},"  function processData(data) {\n",[280,1361,1362],{"class":282,"line":289},[280,1363,1364],{},"    if (!data) return null;\n",[280,1366,1367],{"class":282,"line":295},[280,1368,1369],{},"    \n",[280,1371,1372],{"class":282,"line":301},[280,1373,1374],{},"-   \u002F\u002F 原有逻辑被删除了吗？\n",[280,1376,1377],{"class":282,"line":307},[280,1378,1379],{},"+   \u002F\u002F 新逻辑是否正确衔接？\n",[280,1381,1382],{"class":282,"line":313},[280,1383,1384],{},"+   const result = newLogic(data);\n",[280,1386,1387],{"class":282,"line":320},[280,1388,1389],{},"+   return result;\n",[280,1391,1392],{"class":282,"line":326},[280,1393,1256],{},[212,1395,1397],{"id":1396},"_42-风险评估-checklist","4.2 风险评估 checklist",[195,1399,1400],{},"在批准修改前，快速检查以下项目：",[421,1402,1405,1418,1427,1436,1445,1454],{"className":1403},[1404],"contains-task-list",[237,1406,1409,1413,1414,1417],{"className":1407},[1408],"task-list-item",[1410,1411],"input",{"disabled":316,"type":1412},"checkbox"," ",[199,1415,1416],{},"范围","：修改是否仅限于我要求的范围？有没有\"顺手\"修改了不相关的代码？",[237,1419,1421,1413,1423,1426],{"className":1420},[1408],[1410,1422],{"disabled":316,"type":1412},[199,1424,1425],{},"删除","：是否有我不期望的删除操作？被删除的代码是否在其他地方被依赖？",[237,1428,1430,1413,1432,1435],{"className":1429},[1408],[1410,1431],{"disabled":316,"type":1412},[199,1433,1434],{},"依赖","：新增代码是否引入了新的依赖？这些依赖是否可靠？",[237,1437,1439,1413,1441,1444],{"className":1438},[1408],[1410,1440],{"disabled":316,"type":1412},[199,1442,1443],{},"副作用","：修改是否会影响其他模块或功能？",[237,1446,1448,1413,1450,1453],{"className":1447},[1408],[1410,1449],{"disabled":316,"type":1412},[199,1451,1452],{},"安全","：是否有硬编码的密钥、密码或敏感信息？",[237,1455,1457,1413,1459,1462],{"className":1456},[1408],[1410,1458],{"disabled":316,"type":1412},[199,1460,1461],{},"测试","：修改是否破坏了现有测试？是否需要新增测试？",[212,1464,1466],{"id":1465},"_43-使用-vs-code-进行可视化-diff-审查","4.3 使用 VS Code 进行可视化 diff 审查",[195,1468,1469],{},"如果你在 VS Code 中使用 Claude Code 扩展，每个文件修改都会在编辑器中以独立的 diff 标签页展示。对于涉及十几个文件的重构，在编辑器中逐个查看比终端中阅读要高效得多。",[195,1471,1472,419],{},[199,1473,1474],{},"快捷键",[421,1476,1477,1482,1488,1493],{},[237,1478,1479,1481],{},[227,1480,521],{},"：查看 diff",[237,1483,1484,1487],{},[227,1485,1486],{},"e","：在编辑器中打开文件",[237,1489,1490,1492],{},[227,1491,495],{},"：接受修改",[237,1494,1495,1497],{},[227,1496,508],{},"：拒绝修改",[207,1499,1501],{"id":1500},"_5-常见的第一代码变更场景","5. 常见的第一代码变更场景",[212,1503,1505],{"id":1504},"_51-场景一添加新函数","5.1 场景一：添加新函数",[195,1507,1508,419],{},[199,1509,1510],{},"请求",[220,1512,1515],{"className":1513,"code":1514,"language":225},[223],"在 src\u002Futils.js 中添加一个防抖函数 debounce\n",[227,1516,1514],{"__ignoreMap":229},[195,1518,1519,419],{},[199,1520,1521],{},"Claude 的思考过程",[234,1523,1524,1529,1532,1535,1538],{},[237,1525,1088,1526,1528],{},[227,1527,245],{}," 确认文件存在",[237,1530,1531],{},"检查是否已有同名函数",[237,1533,1534],{},"确定插入位置（通常放在相关函数附近或文件末尾）",[237,1536,1537],{},"遵循现有代码风格（ES modules vs CommonJS、JSDoc 注释习惯等）",[237,1539,1540],{},"生成修改并展示 diff",[195,1542,1543,419],{},[199,1544,1545],{},"你的审查重点",[421,1547,1548,1551,1554,1557],{},[237,1549,1550],{},"函数签名是否符合项目约定",[237,1552,1553],{},"是否有 JSDoc 注释",[237,1555,1556],{},"边界条件处理（如 delay 为负数的情况）",[237,1558,1559],{},"是否导出了函数",[212,1561,1563],{"id":1562},"_52-场景二修复-bug","5.2 场景二：修复 Bug",[195,1565,1566,419],{},[199,1567,1510],{},[220,1569,1572],{"className":1570,"code":1571,"language":225},[223],"修复 src\u002Fcalculator.js 中除零错误\n",[227,1573,1571],{"__ignoreMap":229},[195,1575,1576,419],{},[199,1577,1521],{},[234,1579,1580,1586,1589,1592,1595],{},[237,1581,1088,1582,1585],{},[227,1583,1584],{},"src\u002Fcalculator.js"," 定位除法相关代码",[237,1587,1588],{},"识别所有可能的除零场景",[237,1590,1591],{},"确定修复策略（返回 Infinity？抛出错误？返回 0？）",[237,1593,1594],{},"检查是否有相关测试需要更新",[237,1596,1597],{},"生成修改",[195,1599,1600,419],{},[199,1601,1545],{},[421,1603,1604,1607,1610,1613],{},[237,1605,1606],{},"修复是否覆盖了所有除零场景",[237,1608,1609],{},"错误处理方式是否符合项目约定",[237,1611,1612],{},"是否引入了新的问题",[237,1614,1615],{},"测试是否同步更新",[212,1617,1619],{"id":1618},"_53-场景三重构代码","5.3 场景三：重构代码",[195,1621,1622,419],{},[199,1623,1510],{},[220,1625,1628],{"className":1626,"code":1627,"language":225},[223],"将 src\u002Fcomponents\u002FButton.js 中的内联样式提取为 CSS 模块\n",[227,1629,1627],{"__ignoreMap":229},[195,1631,1632,419],{},[199,1633,1521],{},[234,1635,1636,1642,1645,1652,1655],{},[237,1637,1088,1638,1641],{},[227,1639,1640],{},"src\u002Fcomponents\u002FButton.js"," 识别所有内联样式",[237,1643,1644],{},"检查项目是否已使用 CSS 模块",[237,1646,1647,1648,1651],{},"创建新的 ",[227,1649,1650],{},".module.css"," 文件",[237,1653,1654],{},"修改组件文件导入样式",[237,1656,1657],{},"确保类名映射正确",[195,1659,1660,419],{},[199,1661,1545],{},[421,1663,1664,1667,1670,1673],{},[237,1665,1666],{},"样式提取是否完整",[237,1668,1669],{},"类名命名是否符合 BEM 或其他约定",[237,1671,1672],{},"是否破坏了组件的可复用性",[237,1674,1675],{},"是否有样式冲突",[207,1677,1679],{"id":1678},"_6-撤销与回滚checkpoint-机制","6. 撤销与回滚：Checkpoint 机制",[212,1681,1683],{"id":1682},"_61-checkpoint-工作原理","6.1 Checkpoint 工作原理",[195,1685,1686],{},"Claude Code 在每次编辑文件前自动创建文件快照。这是你的\"安全网\"——如果出了问题，可以随时回滚。",[195,1688,1689,419],{},[199,1690,1691],{},"关键特性",[421,1693,1694,1697,1700,1703],{},[237,1695,1696],{},"每次用户提示创建一个新的 checkpoint",[237,1698,1699],{},"Checkpoint 在会话间持久化，恢复会话后仍可访问",[237,1701,1702],{},"默认 30 天后自动清理（可配置）",[237,1704,1705],{},"最多保留 100 个快照，超出时淘汰最早的",[195,1707,1708,419,1711],{},[199,1709,1710],{},"存储位置",[227,1712,1713],{},"~\u002F.claude\u002Ffile-history\u002F{sessionId}\u002F",[212,1715,1717],{"id":1716},"_62-使用-rewind-回滚","6.2 使用 \u002Frewind 回滚",[195,1719,1720,1721,1724,1725,1728],{},"输入 ",[227,1722,1723],{},"\u002Frewind","（或按 ",[227,1726,1727],{},"Esc"," 两次）打开回滚菜单：",[220,1730,1733],{"className":1731,"code":1732,"language":225},[223],"[你] \u002Frewind\n\n[Claude] 选择要回滚到的消息：\n\n  > 1. 添加 calculateAverage 函数（修改了 1 个文件，+12 行）\n    2. 修复除零错误（修改了 1 个文件，+3\u002F-1 行）\n    3. 重构 Button 组件（修改了 2 个文件，+25\u002F-18 行）\n\n  选择后，你可以选择回滚方式：\n  - 恢复代码和对话\n  - 仅恢复对话\n  - 仅恢复代码\n  - 从此处开始总结\n",[227,1734,1732],{"__ignoreMap":229},[195,1736,1737,419],{},[199,1738,1739],{},"四种回滚方式",[467,1741,1742,1756],{},[470,1743,1744],{},[473,1745,1746,1748,1751,1754],{},[476,1747,1155],{},[476,1749,1750],{},"代码",[476,1752,1753],{},"对话",[476,1755,811],{},[486,1757,1758,1771,1784,1796],{},[473,1759,1760,1763,1766,1768],{},[491,1761,1762],{},"恢复代码和对话",[491,1764,1765],{},"回滚",[491,1767,1765],{},[491,1769,1770],{},"Claude 完全走偏了，想从头再来",[473,1772,1773,1776,1779,1781],{},[491,1774,1775],{},"仅恢复对话",[491,1777,1778],{},"保持",[491,1780,1765],{},[491,1782,1783],{},"代码是对的，但后续讨论跑偏了",[473,1785,1786,1789,1791,1793],{},[491,1787,1788],{},"仅恢复代码",[491,1790,1765],{},[491,1792,1778],{},[491,1794,1795],{},"想保留分析上下文，但撤销代码变更",[473,1797,1798,1801,1804,1807],{},[491,1799,1800],{},"从此处总结",[491,1802,1803],{},"不变",[491,1805,1806],{},"压缩",[491,1808,1809],{},"上下文窗口满了，需要释放空间",[212,1811,1813],{"id":1812},"_63-checkpoint-的局限性","6.3 Checkpoint 的局限性",[195,1815,1816,1819,1820,1823],{},[199,1817,1818],{},"重要限制","：Checkpoint ",[199,1821,1822],{},"不追踪","以下变更：",[421,1825,1826,1835,1838],{},[237,1827,1828,1829,859,1832,1048],{},"Bash 命令修改的文件（如 ",[227,1830,1831],{},"rm file.txt",[227,1833,1834],{},"sed -i",[237,1836,1837],{},"你手动编辑的文件",[237,1839,1840],{},"其他并发会话的修改",[195,1842,1843,1846],{},[199,1844,1845],{},"规则","：只有 Claude 通过内置的 FileEditTool 和 FileWriteTool 进行的文件操作才会被追踪和可回滚。",[212,1848,1850],{"id":1849},"_64-git-作为最终安全网","6.4 Git 作为最终安全网",[195,1852,1853],{},"Checkpoint 是\"会话级撤销\"，Git 是\"永久历史\"。最佳实践：",[220,1855,1859],{"className":1856,"code":1857,"language":1858,"meta":229,"style":229},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 在进行大规模修改前，先提交当前状态\ngit add .\ngit commit -m \"checkpoint: 重构前的稳定状态\"\n\n# 然后让 Claude 进行重构\n# 如果结果不满意：\ngit reset --hard HEAD  # 回到提交前的状态\n","bash",[227,1860,1861,1866,1877,1894,1898,1903,1908],{"__ignoreMap":229},[280,1862,1863],{"class":282,"line":283},[280,1864,1865],{"class":1204},"# 在进行大规模修改前，先提交当前状态\n",[280,1867,1868,1871,1874],{"class":282,"line":289},[280,1869,1870],{"class":1237},"git",[280,1872,1873],{"class":1248}," add",[280,1875,1876],{"class":1248}," .\n",[280,1878,1879,1881,1884,1887,1889,1892],{"class":282,"line":295},[280,1880,1870],{"class":1237},[280,1882,1883],{"class":1248}," commit",[280,1885,1886],{"class":1248}," -m",[280,1888,1245],{"class":1210},[280,1890,1891],{"class":1248},"checkpoint: 重构前的稳定状态",[280,1893,1251],{"class":1210},[280,1895,1896],{"class":282,"line":301},[280,1897,317],{"emptyLinePlaceholder":316},[280,1899,1900],{"class":282,"line":307},[280,1901,1902],{"class":1204},"# 然后让 Claude 进行重构\n",[280,1904,1905],{"class":282,"line":313},[280,1906,1907],{"class":1204},"# 如果结果不满意：\n",[280,1909,1910,1912,1915,1918,1921],{"class":282,"line":320},[280,1911,1870],{"class":1237},[280,1913,1914],{"class":1248}," reset",[280,1916,1917],{"class":1248}," --hard",[280,1919,1920],{"class":1248}," HEAD",[280,1922,1923],{"class":1204},"  # 回到提交前的状态\n",[212,1925,1927],{"id":1926},"_65-禁用-checkpoint","6.5 禁用 Checkpoint",[195,1929,1930],{},"如果你出于性能或隐私考虑想禁用：",[220,1932,1934],{"className":1856,"code":1933,"language":1858,"meta":229,"style":229},"export CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING=1\n",[227,1935,1936],{"__ignoreMap":229},[280,1937,1938,1941,1945,1948],{"class":282,"line":283},[280,1939,1940],{"class":1219},"export",[280,1942,1944],{"class":1943},"sTEyZ"," CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING",[280,1946,1947],{"class":1210},"=",[280,1949,1951],{"class":1950},"sbssI","1\n",[195,1953,1954,1955,202],{},"或在全局配置中设置 ",[227,1956,1957],{},"fileCheckpointingEnabled: false",[207,1959,1961],{"id":1960},"_7-安全最佳实践","7. 安全最佳实践",[212,1963,1965],{"id":1964},"_71-何时批准何时拒绝","7.1 何时批准、何时拒绝",[195,1967,1968,419],{},[199,1969,1970],{},"应该批准的情况",[421,1972,1973,1976,1979,1982],{},[237,1974,1975],{},"修改范围明确，diff 清晰可读",[237,1977,1978],{},"符合项目代码风格和约定",[237,1980,1981],{},"没有意外的删除或变更",[237,1983,1984],{},"边界条件处理得当",[195,1986,1987,419],{},[199,1988,1989],{},"应该拒绝的情况",[421,1991,1992,1995,1998,2001,2004],{},[237,1993,1994],{},"修改范围超出你的请求（\"顺手\"修改了不相关的文件）",[237,1996,1997],{},"包含你不理解的变更",[237,1999,2000],{},"删除了你没有要求删除的代码",[237,2002,2003],{},"引入了硬编码的敏感信息",[237,2005,2006],{},"使用了你不熟悉的依赖或 API",[195,2008,2009,419],{},[199,2010,2011],{},"应该暂停并询问的情况",[421,2013,2014,2017,2020],{},[237,2015,2016],{},"Claude 建议运行你不熟悉的命令",[237,2018,2019],{},"修改涉及数据库、生产环境或敏感配置",[237,2021,2022],{},"diff 太大，无法在一次审查中理解全部内容",[212,2024,2026],{"id":2025},"_72-配置安全级别","7.2 配置安全级别",[195,2028,2029,2032],{},[199,2030,2031],{},"新手配置","（最严格）：",[220,2034,2036],{"className":1195,"code":2035,"language":1197,"meta":229,"style":229},"\u002F\u002F .claude\u002Fsettings.json\n{\n  \"permissions\": {\n    \"defaultMode\": \"default\",\n    \"deny\": [\n      \"Bash(git push *)\",\n      \"Bash(rm -rf *)\",\n      \"Read(**\u002F.env)\",\n      \"Read(**\u002Fsecrets.*)\"\n    ]\n  }\n}\n",[227,2037,2038,2043,2047,2059,2078,2092,2104,2115,2126,2135,2140,2144],{"__ignoreMap":229},[280,2039,2040],{"class":282,"line":283},[280,2041,2042],{"class":1204},"\u002F\u002F .claude\u002Fsettings.json\n",[280,2044,2045],{"class":282,"line":289},[280,2046,1211],{"class":1210},[280,2048,2049,2051,2053,2055,2057],{"class":282,"line":295},[280,2050,1216],{"class":1210},[280,2052,1220],{"class":1219},[280,2054,1223],{"class":1210},[280,2056,1226],{"class":1210},[280,2058,1229],{"class":1210},[280,2060,2061,2063,2065,2067,2069,2071,2073,2075],{"class":282,"line":301},[280,2062,1234],{"class":1210},[280,2064,1238],{"class":1237},[280,2066,1223],{"class":1210},[280,2068,1226],{"class":1210},[280,2070,1245],{"class":1210},[280,2072,708],{"class":1248},[280,2074,1223],{"class":1210},[280,2076,2077],{"class":1210},",\n",[280,2079,2080,2082,2085,2087,2089],{"class":282,"line":307},[280,2081,1234],{"class":1210},[280,2083,2084],{"class":1237},"deny",[280,2086,1223],{"class":1210},[280,2088,1226],{"class":1210},[280,2090,2091],{"class":1210}," [\n",[280,2093,2094,2097,2100,2102],{"class":282,"line":313},[280,2095,2096],{"class":1210},"      \"",[280,2098,2099],{"class":1248},"Bash(git push *)",[280,2101,1223],{"class":1210},[280,2103,2077],{"class":1210},[280,2105,2106,2108,2111,2113],{"class":282,"line":320},[280,2107,2096],{"class":1210},[280,2109,2110],{"class":1248},"Bash(rm -rf *)",[280,2112,1223],{"class":1210},[280,2114,2077],{"class":1210},[280,2116,2117,2119,2122,2124],{"class":282,"line":326},[280,2118,2096],{"class":1210},[280,2120,2121],{"class":1248},"Read(**\u002F.env)",[280,2123,1223],{"class":1210},[280,2125,2077],{"class":1210},[280,2127,2128,2130,2133],{"class":282,"line":332},[280,2129,2096],{"class":1210},[280,2131,2132],{"class":1248},"Read(**\u002Fsecrets.*)",[280,2134,1251],{"class":1210},[280,2136,2137],{"class":282,"line":338},[280,2138,2139],{"class":1210},"    ]\n",[280,2141,2142],{"class":282,"line":344},[280,2143,1256],{"class":1210},[280,2145,2146],{"class":282,"line":350},[280,2147,1261],{"class":1210},[195,2149,2150,2153],{},[199,2151,2152],{},"日常开发配置","（平衡）：",[220,2155,2157],{"className":1195,"code":2156,"language":1197,"meta":229,"style":229},"\u002F\u002F .claude\u002Fsettings.json\n{\n  \"permissions\": {\n    \"defaultMode\": \"acceptEdits\",\n    \"allow\": [\n      \"Bash(npm run *)\",\n      \"Bash(git status)\",\n      \"Bash(git diff *)\"\n    ],\n    \"deny\": [\n      \"Bash(git push *)\",\n      \"Bash(docker *)\",\n      \"Read(**\u002F.env)\"\n    ]\n  }\n}\n",[227,2158,2159,2163,2167,2179,2197,2210,2221,2232,2241,2246,2258,2268,2279,2287,2291,2295],{"__ignoreMap":229},[280,2160,2161],{"class":282,"line":283},[280,2162,2042],{"class":1204},[280,2164,2165],{"class":282,"line":289},[280,2166,1211],{"class":1210},[280,2168,2169,2171,2173,2175,2177],{"class":282,"line":295},[280,2170,1216],{"class":1210},[280,2172,1220],{"class":1219},[280,2174,1223],{"class":1210},[280,2176,1226],{"class":1210},[280,2178,1229],{"class":1210},[280,2180,2181,2183,2185,2187,2189,2191,2193,2195],{"class":282,"line":301},[280,2182,1234],{"class":1210},[280,2184,1238],{"class":1237},[280,2186,1223],{"class":1210},[280,2188,1226],{"class":1210},[280,2190,1245],{"class":1210},[280,2192,725],{"class":1248},[280,2194,1223],{"class":1210},[280,2196,2077],{"class":1210},[280,2198,2199,2201,2204,2206,2208],{"class":282,"line":307},[280,2200,1234],{"class":1210},[280,2202,2203],{"class":1237},"allow",[280,2205,1223],{"class":1210},[280,2207,1226],{"class":1210},[280,2209,2091],{"class":1210},[280,2211,2212,2214,2217,2219],{"class":282,"line":313},[280,2213,2096],{"class":1210},[280,2215,2216],{"class":1248},"Bash(npm run *)",[280,2218,1223],{"class":1210},[280,2220,2077],{"class":1210},[280,2222,2223,2225,2228,2230],{"class":282,"line":320},[280,2224,2096],{"class":1210},[280,2226,2227],{"class":1248},"Bash(git status)",[280,2229,1223],{"class":1210},[280,2231,2077],{"class":1210},[280,2233,2234,2236,2239],{"class":282,"line":326},[280,2235,2096],{"class":1210},[280,2237,2238],{"class":1248},"Bash(git diff *)",[280,2240,1251],{"class":1210},[280,2242,2243],{"class":282,"line":332},[280,2244,2245],{"class":1210},"    ],\n",[280,2247,2248,2250,2252,2254,2256],{"class":282,"line":338},[280,2249,1234],{"class":1210},[280,2251,2084],{"class":1237},[280,2253,1223],{"class":1210},[280,2255,1226],{"class":1210},[280,2257,2091],{"class":1210},[280,2259,2260,2262,2264,2266],{"class":282,"line":344},[280,2261,2096],{"class":1210},[280,2263,2099],{"class":1248},[280,2265,1223],{"class":1210},[280,2267,2077],{"class":1210},[280,2269,2270,2272,2275,2277],{"class":282,"line":350},[280,2271,2096],{"class":1210},[280,2273,2274],{"class":1248},"Bash(docker *)",[280,2276,1223],{"class":1210},[280,2278,2077],{"class":1210},[280,2280,2281,2283,2285],{"class":282,"line":356},[280,2282,2096],{"class":1210},[280,2284,2121],{"class":1248},[280,2286,1251],{"class":1210},[280,2288,2289],{"class":282,"line":362},[280,2290,2139],{"class":1210},[280,2292,2293],{"class":282,"line":368},[280,2294,1256],{"class":1210},[280,2296,2297],{"class":282,"line":374},[280,2298,1261],{"class":1210},[212,2300,2302],{"id":2301},"_73-权限规则优先级","7.3 权限规则优先级",[195,2304,2305,2306,2309],{},"规则按以下顺序评估：",[199,2307,2308],{},"deny > ask > allow","。第一个匹配的规则生效。",[220,2311,2313],{"className":1195,"code":2312,"language":1197,"meta":229,"style":229},"{\n  \"permissions\": {\n    \"allow\": [\"Bash\"],\n    \"deny\": [\"Bash(touch *)\"]\n  }\n}\n\u002F\u002F touch 命令仍被拒绝，因为 deny 优先\n",[227,2314,2315,2319,2331,2354,2376,2380,2384],{"__ignoreMap":229},[280,2316,2317],{"class":282,"line":283},[280,2318,1211],{"class":1210},[280,2320,2321,2323,2325,2327,2329],{"class":282,"line":289},[280,2322,1216],{"class":1210},[280,2324,1220],{"class":1219},[280,2326,1223],{"class":1210},[280,2328,1226],{"class":1210},[280,2330,1229],{"class":1210},[280,2332,2333,2335,2337,2339,2341,2344,2346,2349,2351],{"class":282,"line":295},[280,2334,1234],{"class":1210},[280,2336,2203],{"class":1237},[280,2338,1223],{"class":1210},[280,2340,1226],{"class":1210},[280,2342,2343],{"class":1210}," [",[280,2345,1223],{"class":1210},[280,2347,2348],{"class":1248},"Bash",[280,2350,1223],{"class":1210},[280,2352,2353],{"class":1210},"],\n",[280,2355,2356,2358,2360,2362,2364,2366,2368,2371,2373],{"class":282,"line":301},[280,2357,1234],{"class":1210},[280,2359,2084],{"class":1237},[280,2361,1223],{"class":1210},[280,2363,1226],{"class":1210},[280,2365,2343],{"class":1210},[280,2367,1223],{"class":1210},[280,2369,2370],{"class":1248},"Bash(touch *)",[280,2372,1223],{"class":1210},[280,2374,2375],{"class":1210},"]\n",[280,2377,2378],{"class":282,"line":307},[280,2379,1256],{"class":1210},[280,2381,2382],{"class":282,"line":313},[280,2383,1261],{"class":1210},[280,2385,2386],{"class":282,"line":320},[280,2387,2388],{"class":1204},"\u002F\u002F touch 命令仍被拒绝，因为 deny 优先\n",[212,2390,2392],{"id":2391},"_74-团队安全","7.4 团队安全",[421,2394,2395,2398,2401,2407],{},[237,2396,2397],{},"使用 managed settings 强制执行组织标准",[237,2399,2400],{},"通过版本控制共享批准的权限配置",[237,2402,2403,2404,2406],{},"定期用 ",[227,2405,1114],{}," 审查权限设置",[237,2408,2409],{},"在共享环境或受监管工作场所使用 DontAsk 模式配合精心定义的白名单",[212,2411,2413],{"id":2412},"_75-防范提示注入","7.5 防范提示注入",[195,2415,2416],{},"提示注入是一种攻击技术，攻击者通过在文件、网页或工具输出中插入恶意文本来操纵 AI 助手。Claude Code 包含以下防护：",[421,2418,2419,2425,2431,2437,2450,2456],{},[237,2420,2421,2424],{},[199,2422,2423],{},"权限系统","：敏感操作需要显式批准",[237,2426,2427,2430],{},[199,2428,2429],{},"上下文感知分析","：通过分析完整请求检测潜在有害指令",[237,2432,2433,2436],{},[199,2434,2435],{},"输入清理","：处理用户输入以防止命令注入",[237,2438,2439,2442,2443,859,2446,2449],{},[199,2440,2441],{},"命令黑名单","：默认阻止 ",[227,2444,2445],{},"curl",[227,2447,2448],{},"wget"," 等从网络获取任意内容的命令",[237,2451,2452,2455],{},[199,2453,2454],{},"网络请求批准","：默认需要用户批准",[237,2457,2458,2461],{},[199,2459,2460],{},"隔离上下文窗口","：WebFetch 使用单独的上下文窗口",[195,2463,2464,419],{},[199,2465,2466],{},"最佳实践",[234,2468,2469,2472,2475,2478,2481],{},[237,2470,2471],{},"批准前审查建议的命令",[237,2473,2474],{},"避免将不受信任的内容直接管道传输给 Claude",[237,2476,2477],{},"验证对关键文件的提议变更",[237,2479,2480],{},"使用虚拟机运行脚本和工具调用",[237,2482,2483,2484,2487],{},"发现可疑行为时用 ",[227,2485,2486],{},"\u002Ffeedback"," 报告",[207,2489,2491],{"id":2490},"_8-总结","8. 总结",[195,2493,2494],{},"Claude Code 的\"修改前请求许可\"机制不是障碍，而是保护。它确保你始终掌握代码库的主动权，同时享受 AI 辅助编程的效率。",[195,2496,2497,419],{},[199,2498,2499],{},"核心要点回顾",[234,2501,2502,2508,2514,2520,2526,2535],{},[237,2503,2504,2507],{},[199,2505,2506],{},"Default 模式","是新手最好的朋友——每个修改都经过你的审查",[237,2509,2510,2513],{},[199,2511,2512],{},"Accept Edits 模式","适合信任的迭代场景——提高速度但不放弃安全",[237,2515,2516,2519],{},[199,2517,2518],{},"Plan Mode","是复杂任务的必备——先看地图再出发",[237,2521,2522,2525],{},[199,2523,2524],{},"Auto Mode","是高级用户的效率工具——智能分类器在后台守护",[237,2527,2528,2531,2532,2534],{},[199,2529,2530],{},"Checkpoint","是你的后悔药——",[227,2533,1723],{}," 随时回滚",[237,2536,2537,2540],{},[199,2538,2539],{},"Git","是最终安全网——重要修改前先提交",[195,2542,2543],{},"随着你对 Claude Code 的信任逐渐建立，可以从 Default 模式逐步过渡到更宽松的模式。但记住 Anthropic 的忠告：",[610,2545,2546],{},[195,2547,2548],{},"\"权限系统不是不信任 Claude——而是让你始终坐在驾驶座上。Claude 非常能干，而这种能力应该始终在你的控制之下。\"",[195,2550,2551,2552,2554],{},"选择匹配你信心和上下文的模式。不确定时，保守一点。建立信任后，再放松。并且永远记住：",[227,2553,906],{}," 就在手边，随时可以停止。",[207,2556,2557],{"id":2557},"参考来源",[421,2559,2560,2569,2576,2583,2590,2597,2604,2611,2618,2625,2632],{},[237,2561,2562],{},[2563,2564,2568],"a",{"href":2565,"rel":2566},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fpermission-modes",[2567],"nofollow","Claude Code 官方文档 - 权限模式",[237,2570,2571],{},[2563,2572,2575],{"href":2573,"rel":2574},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fpermissions",[2567],"Claude Code 官方文档 - 配置权限",[237,2577,2578],{},[2563,2579,2582],{"href":2580,"rel":2581},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fcheckpointing",[2567],"Claude Code 官方文档 - Checkpointing",[237,2584,2585],{},[2563,2586,2589],{"href":2587,"rel":2588},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fsecurity",[2567],"Claude Code 官方文档 - 安全",[237,2591,2592],{},[2563,2593,2596],{"href":2594,"rel":2595},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fhow-claude-code-works",[2567],"Claude Code 官方文档 - 工作原理",[237,2598,2599],{},[2563,2600,2603],{"href":2601,"rel":2602},"https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fclaude-code-auto-mode",[2567],"Anthropic 工程博客 - Claude Code Auto Mode",[237,2605,2606],{},[2563,2607,2610],{"href":2608,"rel":2609},"https:\u002F\u002Fjoeyyu23.github.io\u002Fclaude-code-handbook\u002Fen\u002Fbook1-getting-started\u002F06-permission-modes",[2567],"Claude Code Handbook - 权限模式",[237,2612,2613],{},[2563,2614,2617],{"href":2615,"rel":2616},"https:\u002F\u002Fwww.petefreitag.com\u002Fblog\u002Fclaude-code-permissions\u002F",[2567],"Pete Freitag - Claude Code 权限深度解析",[237,2619,2620],{},[2563,2621,2624],{"href":2622,"rel":2623},"https:\u002F\u002Fblog.vincentqiao.com\u002Fen\u002Fposts\u002Fclaude-code-rewind\u002F",[2567],"Vincent Qiao - Claude Code \u002Frewind 详解",[237,2626,2627],{},[2563,2628,2631],{"href":2629,"rel":2630},"https:\u002F\u002Fwww.builder.io\u002Fblog\u002Fhow-to-use-claude-code",[2567],"Builder.io - Claude Code 初学者指南",[237,2633,2634],{},[2563,2635,2638],{"href":2636,"rel":2637},"https:\u002F\u002Fclaudefa.st\u002Fblog\u002Fguide\u002Fmechanics\u002Foutput-formatting",[2567],"ClaudeFast - Diff 审查快捷键",[2640,2641,2642],"style",{},"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 .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":229,"searchDepth":283,"depth":289,"links":2644},[2645,2651,2656,2665,2670,2675,2682,2689,2690],{"id":209,"depth":289,"text":210,"children":2646},[2647,2648,2649,2650],{"id":214,"depth":295,"text":215},{"id":267,"depth":295,"text":268},{"id":461,"depth":295,"text":462},{"id":556,"depth":295,"text":557},{"id":593,"depth":289,"text":594,"children":2652},[2653,2654,2655],{"id":597,"depth":295,"text":598},{"id":624,"depth":295,"text":625},{"id":660,"depth":295,"text":661},{"id":673,"depth":289,"text":674,"children":2657},[2658,2659,2660,2661,2662,2663,2664],{"id":680,"depth":295,"text":681},{"id":802,"depth":295,"text":803},{"id":838,"depth":295,"text":839},{"id":910,"depth":295,"text":911},{"id":958,"depth":295,"text":959},{"id":1122,"depth":295,"text":1123},{"id":1143,"depth":295,"text":1144},{"id":1264,"depth":289,"text":1265,"children":2666},[2667,2668,2669],{"id":1268,"depth":295,"text":1269},{"id":1396,"depth":295,"text":1397},{"id":1465,"depth":295,"text":1466},{"id":1500,"depth":289,"text":1501,"children":2671},[2672,2673,2674],{"id":1504,"depth":295,"text":1505},{"id":1562,"depth":295,"text":1563},{"id":1618,"depth":295,"text":1619},{"id":1678,"depth":289,"text":1679,"children":2676},[2677,2678,2679,2680,2681],{"id":1682,"depth":295,"text":1683},{"id":1716,"depth":295,"text":1717},{"id":1812,"depth":295,"text":1813},{"id":1849,"depth":295,"text":1850},{"id":1926,"depth":295,"text":1927},{"id":1960,"depth":289,"text":1961,"children":2683},[2684,2685,2686,2687,2688],{"id":1964,"depth":295,"text":1965},{"id":2025,"depth":295,"text":2026},{"id":2301,"depth":295,"text":2302},{"id":2391,"depth":295,"text":2392},{"id":2412,"depth":295,"text":2413},{"id":2490,"depth":289,"text":2491},{"id":2557,"depth":289,"text":2557},"体验修改前请求许可的安全机制","md",null,{"date":2695},"2026-04-26",{"title":72,"description":2691},"gtnJJIvCOUPcPNmz75xhIhiZnFYpJflg9vEfCtrWEKo",[2699,2701],{"title":68,"path":69,"stem":70,"description":2700,"children":-1},"代码库扫描与结构分析",{"title":82,"path":83,"stem":84,"description":229,"children":-1},1777395308298]