[{"data":1,"prerenderedAt":7004},["ShallowReactive",2],{"navigation":3,"\u002Fcore-features\u002Ftoolchain":189,"\u002Fcore-features\u002Ftoolchain-surround":6999},[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":98,"body":191,"description":197,"extension":6993,"links":6994,"meta":6995,"navigation":784,"path":99,"seo":6997,"stem":100,"__hash__":6998},"docs\u002F4.core-features\u002F5.toolchain.md",{"type":192,"value":193,"toc":6945},"minimark",[194,198,203,206,211,214,281,296,418,422,425,430,462,467,483,488,543,547,551,558,734,739,968,974,978,981,1148,1153,1197,1201,1204,1375,1380,1403,1407,1410,1672,1677,1698,1702,1706,1709,1818,1823,1849,1853,1940,1944,1947,2045,2050,2064,2068,2155,2159,2163,2173,2280,2285,2403,2406,2410,2415,2560,2565,2663,2667,2670,2690,2766,2770,2774,2908,2912,3093,3097,3220,3224,3228,3235,3240,3248,3253,3320,3325,3441,3446,3452,3526,3530,3533,3539,3548,3671,3679,3684,3768,3778,3822,3826,3829,4414,4418,4422,4429,4434,4636,4641,4721,4726,4759,4764,4812,4816,4825,4830,4841,4846,4861,4866,4877,4882,5056,5061,5093,5098,5169,5173,5266,5270,5278,5283,5309,5314,5352,5357,5455,5460,5545,5549,5552,5590,5596,5600,5653,5657,5671,5679,5684,5698,5703,5717,5722,5756,5764,5768,5772,6432,6436,6872,6876,6941],[195,196,197],"p",{},"Claude Code 的核心能力不仅在于代码理解与生成，更在于它能深度集成并执行开发者日常使用的各类工具链。从 Git 操作、包管理、构建编译到数据库迁移、云部署，Claude Code 通过内置工具系统、MCP 协议扩展、Skills 自定义命令和 Hooks 自动化机制，将 AI 助手从\"建议者\"转变为\"执行者\"。本章将系统梳理 Claude Code 的工具链执行能力，涵盖原生集成、安全机制、自定义扩展等各个层面。",[199,200,202],"h2",{"id":201},"_1-内置工具全景","1. 内置工具全景",[195,204,205],{},"Claude Code 提供了一套丰富的内置工具，覆盖文件操作、代码搜索、命令执行、网络请求等核心场景。这些工具是 Claude 与外部世界交互的基础接口。",[207,208,210],"h3",{"id":209},"_11-工具分类与权限模型","1.1 工具分类与权限模型",[195,212,213],{},"根据官方文档，内置工具按权限需求分为三类：",[215,216,217,236],"table",{},[218,219,220],"thead",{},[221,222,223,227,230,233],"tr",{},[224,225,226],"th",{},"工具类型",[224,228,229],{},"示例",[224,231,232],{},"是否需要权限",[224,234,235],{},"\"记住选择\"行为",[237,238,239,254,268],"tbody",{},[221,240,241,245,248,251],{},[242,243,244],"td",{},"只读工具",[242,246,247],{},"Read、Grep、Glob",[242,249,250],{},"否",[242,252,253],{},"不适用",[221,255,256,259,262,265],{},[242,257,258],{},"Bash 命令",[242,260,261],{},"Shell 执行",[242,263,264],{},"是",[242,266,267],{},"按项目目录和命令永久记住",[221,269,270,273,276,278],{},[242,271,272],{},"文件修改",[242,274,275],{},"Edit、Write",[242,277,264],{},[242,279,280],{},"会话结束前有效",[195,282,283,287,288,295],{},[284,285,286],"strong",{},"完整工具列表","（来源：",[289,290,294],"a",{"href":291,"rel":292},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Ftools-reference",[293],"nofollow","Claude Code Docs - Tools Reference","）：",[297,298,299,323,336,349,358,371,390,399,407],"ul",{},[300,301,302,305,306,310,311,314,315,318,319,322],"li",{},[284,303,304],{},"文件操作","：",[307,308,309],"code",{},"Read","（读取文件）、",[307,312,313],{},"Edit","（精准编辑）、",[307,316,317],{},"Write","（创建\u002F覆盖文件）、",[307,320,321],{},"Glob","（模式匹配找文件）",[300,324,325,305,328,331,332,335],{},[284,326,327],{},"代码搜索",[307,329,330],{},"Grep","（内容搜索）、",[307,333,334],{},"LSP","（语言服务器协议，支持跳转到定义、查找引用、类型检查）",[300,337,338,305,341,344,345,348],{},[284,339,340],{},"命令执行",[307,342,343],{},"Bash","（执行 Shell 命令）、",[307,346,347],{},"PowerShell","（Windows 原生 PowerShell 执行）",[300,350,351,305,354,357],{},[284,352,353],{},"扩展能力",[307,355,356],{},"Monitor","（通过插件系统启用，用于后台任务监控）",[300,359,360,305,363,366,367,370],{},[284,361,362],{},"网络请求",[307,364,365],{},"WebFetch","（获取 URL 内容）、",[307,368,369],{},"WebSearch","（网络搜索）",[300,372,373,305,376,379,380,379,383,379,386,389],{},[284,374,375],{},"任务管理",[307,377,378],{},"TaskCreate","、",[307,381,382],{},"TaskList",[307,384,385],{},"TaskUpdate",[307,387,388],{},"TaskStop","（后台任务管理）",[300,391,392,305,395,398],{},[284,393,394],{},"Notebook",[307,396,397],{},"NotebookEdit","（修改 Jupyter Notebook 单元格）",[300,400,401,305,404,406],{},[284,402,403],{},"Agent",[307,405,403],{},"（生成子代理处理任务）",[300,408,409,305,411,379,414,417],{},[284,410,116],{},[307,412,413],{},"ListMcpResourcesTool",[307,415,416],{},"ReadMcpResourceTool","（MCP 资源操作）",[207,419,421],{"id":420},"_12-bash-工具的行为特性","1.2 Bash 工具的行为特性",[195,423,424],{},"Bash 工具是工具链执行的核心，理解其行为特性至关重要：",[195,426,427,305],{},[284,428,429],{},"工作目录持久化",[297,431,432,443,452,455],{},[300,433,434,435,438,439,442],{},"主会话中 ",[307,436,437],{},"cd"," 的目录变更会延续到后续 Bash 命令（只要仍在项目目录或 ",[307,440,441],{},"--add-dir"," 添加的目录内）",[300,444,445,446,448,449],{},"如果 ",[307,447,437],{}," 跳出了这些目录，Claude Code 会自动重置到项目目录并提示 ",[307,450,451],{},"Shell cwd was reset to \u003Cdir>",[300,453,454],{},"子代理会话中工作目录变更不会延续",[300,456,457,458,461],{},"设置 ",[307,459,460],{},"CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR=1"," 可禁用目录延续，每次 Bash 命令都从项目目录开始",[195,463,464,305],{},[284,465,466],{},"环境变量隔离",[297,468,469,476],{},[300,470,471,472,475],{},"每个 Bash 命令在独立进程中执行，",[307,473,474],{},"export"," 不会跨命令持久化",[300,477,478,479,482],{},"如需持久化环境变量，在启动 Claude Code 前设置 ",[307,480,481],{},"CLAUDE_ENV_FILE"," 指向一个 shell 脚本，或使用 SessionStart Hook 动态填充",[195,484,485,305],{},[284,486,487],{},"只读命令免提示",[297,489,490,530,533],{},[300,491,492,493,379,496,379,499,379,502,379,505,379,508,379,511,379,514,379,517,379,520,379,523,525,526,529],{},"内置识别的只读命令包括：",[307,494,495],{},"ls",[307,497,498],{},"cat",[307,500,501],{},"head",[307,503,504],{},"tail",[307,506,507],{},"grep",[307,509,510],{},"find",[307,512,513],{},"wc",[307,515,516],{},"diff",[307,518,519],{},"stat",[307,521,522],{},"du",[307,524,437],{}," 以及只读形式的 ",[307,527,528],{},"git"," 命令",[300,531,532],{},"这些命令在任何模式下都不需要权限提示",[300,534,535,536,379,539,542],{},"但带有写操作标志的命令（如 ",[307,537,538],{},"find -delete",[307,540,541],{},"sed -i","）即使基础命令是只读的也会触发提示",[199,544,546],{"id":545},"_2-原生工具集成","2. 原生工具集成",[207,548,550],{"id":549},"_21-github-cli-gh","2.1 GitHub CLI (gh)",[195,552,553,554,557],{},"Claude Code 对 ",[307,555,556],{},"gh"," 命令有良好的原生支持，可通过权限规则精细控制：",[559,560,565],"pre",{"className":561,"code":562,"language":563,"meta":564,"style":564},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(gh pr view *)\",\n      \"Bash(gh pr diff *)\",\n      \"Bash(gh pr list *)\",\n      \"Bash(gh issue view *)\",\n      \"Bash(gh repo view *)\"\n    ],\n    \"deny\": [\n      \"Bash(gh pr merge *)\",\n      \"Bash(gh repo delete *)\"\n    ]\n  }\n}\n","json","",[307,566,567,576,595,612,627,639,651,663,674,680,694,706,716,722,728],{"__ignoreMap":564},[568,569,572],"span",{"class":570,"line":571},"line",1,[568,573,575],{"class":574},"sMK4o","{\n",[568,577,579,582,586,589,592],{"class":570,"line":578},2,[568,580,581],{"class":574},"  \"",[568,583,585],{"class":584},"spNyl","permissions",[568,587,588],{"class":574},"\"",[568,590,591],{"class":574},":",[568,593,594],{"class":574}," {\n",[568,596,598,601,605,607,609],{"class":570,"line":597},3,[568,599,600],{"class":574},"    \"",[568,602,604],{"class":603},"sBMFI","allow",[568,606,588],{"class":574},[568,608,591],{"class":574},[568,610,611],{"class":574}," [\n",[568,613,615,618,622,624],{"class":570,"line":614},4,[568,616,617],{"class":574},"      \"",[568,619,621],{"class":620},"sfazB","Bash(gh pr view *)",[568,623,588],{"class":574},[568,625,626],{"class":574},",\n",[568,628,630,632,635,637],{"class":570,"line":629},5,[568,631,617],{"class":574},[568,633,634],{"class":620},"Bash(gh pr diff *)",[568,636,588],{"class":574},[568,638,626],{"class":574},[568,640,642,644,647,649],{"class":570,"line":641},6,[568,643,617],{"class":574},[568,645,646],{"class":620},"Bash(gh pr list *)",[568,648,588],{"class":574},[568,650,626],{"class":574},[568,652,654,656,659,661],{"class":570,"line":653},7,[568,655,617],{"class":574},[568,657,658],{"class":620},"Bash(gh issue view *)",[568,660,588],{"class":574},[568,662,626],{"class":574},[568,664,666,668,671],{"class":570,"line":665},8,[568,667,617],{"class":574},[568,669,670],{"class":620},"Bash(gh repo view *)",[568,672,673],{"class":574},"\"\n",[568,675,677],{"class":570,"line":676},9,[568,678,679],{"class":574},"    ],\n",[568,681,683,685,688,690,692],{"class":570,"line":682},10,[568,684,600],{"class":574},[568,686,687],{"class":603},"deny",[568,689,588],{"class":574},[568,691,591],{"class":574},[568,693,611],{"class":574},[568,695,697,699,702,704],{"class":570,"line":696},11,[568,698,617],{"class":574},[568,700,701],{"class":620},"Bash(gh pr merge *)",[568,703,588],{"class":574},[568,705,626],{"class":574},[568,707,709,711,714],{"class":570,"line":708},12,[568,710,617],{"class":574},[568,712,713],{"class":620},"Bash(gh repo delete *)",[568,715,673],{"class":574},[568,717,719],{"class":570,"line":718},13,[568,720,721],{"class":574},"    ]\n",[568,723,725],{"class":570,"line":724},14,[568,726,727],{"class":574},"  }\n",[568,729,731],{"class":570,"line":730},15,[568,732,733],{"class":574},"}\n",[195,735,736,305],{},[284,737,738],{},"典型工作流示例",[559,740,744],{"className":741,"code":742,"language":743,"meta":564,"style":564},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 让 Claude 查看 PR 差异并给出评审意见\ngh pr diff 123 | claude \"Review this PR and suggest improvements\"\n\n# 在 Skill 中动态注入 PR 信息\n---\nname: pr-summary\ndescription: Summarize changes in a pull request\ncontext: fork\nagent: Explore\nallowed-tools: Bash(gh *)\n---\n\n## Pull request context\n- PR diff: !`gh pr diff`\n- PR comments: !`gh pr view --comments`\n- Changed files: !`gh pr diff --name-only`\n\n## Your task\nSummarize this pull request...\n","bash",[307,745,746,752,780,786,791,796,804,827,835,843,863,867,871,876,901,921,943,948,954],{"__ignoreMap":564},[568,747,748],{"class":570,"line":571},[568,749,751],{"class":750},"sHwdD","# 让 Claude 查看 PR 差异并给出评审意见\n",[568,753,754,756,759,762,766,769,772,775,778],{"class":570,"line":578},[568,755,556],{"class":603},[568,757,758],{"class":620}," pr",[568,760,761],{"class":620}," diff",[568,763,765],{"class":764},"sbssI"," 123",[568,767,768],{"class":574}," |",[568,770,771],{"class":603}," claude",[568,773,774],{"class":574}," \"",[568,776,777],{"class":620},"Review this PR and suggest improvements",[568,779,673],{"class":574},[568,781,782],{"class":570,"line":597},[568,783,785],{"emptyLinePlaceholder":784},true,"\n",[568,787,788],{"class":570,"line":614},[568,789,790],{"class":750},"# 在 Skill 中动态注入 PR 信息\n",[568,792,793],{"class":570,"line":629},[568,794,795],{"class":603},"---\n",[568,797,798,801],{"class":570,"line":641},[568,799,800],{"class":603},"name:",[568,802,803],{"class":620}," pr-summary\n",[568,805,806,809,812,815,818,821,824],{"class":570,"line":653},[568,807,808],{"class":603},"description:",[568,810,811],{"class":620}," Summarize",[568,813,814],{"class":620}," changes",[568,816,817],{"class":620}," in",[568,819,820],{"class":620}," a",[568,822,823],{"class":620}," pull",[568,825,826],{"class":620}," request\n",[568,828,829,832],{"class":570,"line":665},[568,830,831],{"class":603},"context:",[568,833,834],{"class":620}," fork\n",[568,836,837,840],{"class":570,"line":676},[568,838,839],{"class":603},"agent:",[568,841,842],{"class":620}," Explore\n",[568,844,845,848,851,854,856,860],{"class":570,"line":682},[568,846,847],{"class":603},"allowed-tools:",[568,849,850],{"class":620}," Bash",[568,852,853],{"class":574},"(",[568,855,556],{"class":603},[568,857,859],{"class":858},"sTEyZ"," *",[568,861,862],{"class":574},")\n",[568,864,865],{"class":570,"line":696},[568,866,795],{"class":603},[568,868,869],{"class":570,"line":708},[568,870,785],{"emptyLinePlaceholder":784},[568,872,873],{"class":570,"line":718},[568,874,875],{"class":750},"## Pull request context\n",[568,877,878,881,884,887,890,893,895,898],{"class":570,"line":724},[568,879,880],{"class":603},"-",[568,882,883],{"class":620}," PR",[568,885,886],{"class":620}," diff:",[568,888,889],{"class":620}," !",[568,891,892],{"class":574},"`",[568,894,556],{"class":603},[568,896,897],{"class":620}," pr diff",[568,899,900],{"class":574},"`\n",[568,902,903,905,907,910,912,914,916,919],{"class":570,"line":730},[568,904,880],{"class":603},[568,906,883],{"class":620},[568,908,909],{"class":620}," comments:",[568,911,889],{"class":620},[568,913,892],{"class":574},[568,915,556],{"class":603},[568,917,918],{"class":620}," pr view --comments",[568,920,900],{"class":574},[568,922,924,926,929,932,934,936,938,941],{"class":570,"line":923},16,[568,925,880],{"class":603},[568,927,928],{"class":620}," Changed",[568,930,931],{"class":620}," files:",[568,933,889],{"class":620},[568,935,892],{"class":574},[568,937,556],{"class":603},[568,939,940],{"class":620}," pr diff --name-only",[568,942,900],{"class":574},[568,944,946],{"class":570,"line":945},17,[568,947,785],{"emptyLinePlaceholder":784},[568,949,951],{"class":570,"line":950},18,[568,952,953],{"class":750},"## Your task\n",[568,955,957,960,963,965],{"class":570,"line":956},19,[568,958,959],{"class":603},"Summarize",[568,961,962],{"class":620}," this",[568,964,823],{"class":620},[568,966,967],{"class":620}," request...\n",[195,969,970,973],{},[307,971,972],{},"!","command`` 语法会在 Skill 内容发送给 Claude 之前执行命令，输出替换占位符。这是预处理机制，Claude 只看到最终结果。",[207,975,977],{"id":976},"_22-包管理工具-npm-pnpm-yarn-pip","2.2 包管理工具 (npm \u002F pnpm \u002F yarn \u002F pip)",[195,979,980],{},"包管理是日常开发最高频的操作之一。通过合理的权限配置，可以让 Claude 自主处理依赖：",[559,982,984],{"className":561,"code":983,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(npm run *)\",\n      \"Bash(npm install)\",\n      \"Bash(npm ci)\",\n      \"Bash(pnpm *)\",\n      \"Bash(yarn *)\",\n      \"Bash(pip install *)\",\n      \"Bash(pip list)\"\n    ],\n    \"deny\": [\n      \"Bash(npm publish *)\",\n      \"Bash(npm unpublish *)\",\n      \"Bash(npm audit fix *)\"\n    ]\n  }\n}\n",[307,985,986,990,1002,1014,1025,1036,1047,1058,1069,1080,1089,1093,1105,1116,1127,1136,1140,1144],{"__ignoreMap":564},[568,987,988],{"class":570,"line":571},[568,989,575],{"class":574},[568,991,992,994,996,998,1000],{"class":570,"line":578},[568,993,581],{"class":574},[568,995,585],{"class":584},[568,997,588],{"class":574},[568,999,591],{"class":574},[568,1001,594],{"class":574},[568,1003,1004,1006,1008,1010,1012],{"class":570,"line":597},[568,1005,600],{"class":574},[568,1007,604],{"class":603},[568,1009,588],{"class":574},[568,1011,591],{"class":574},[568,1013,611],{"class":574},[568,1015,1016,1018,1021,1023],{"class":570,"line":614},[568,1017,617],{"class":574},[568,1019,1020],{"class":620},"Bash(npm run *)",[568,1022,588],{"class":574},[568,1024,626],{"class":574},[568,1026,1027,1029,1032,1034],{"class":570,"line":629},[568,1028,617],{"class":574},[568,1030,1031],{"class":620},"Bash(npm install)",[568,1033,588],{"class":574},[568,1035,626],{"class":574},[568,1037,1038,1040,1043,1045],{"class":570,"line":641},[568,1039,617],{"class":574},[568,1041,1042],{"class":620},"Bash(npm ci)",[568,1044,588],{"class":574},[568,1046,626],{"class":574},[568,1048,1049,1051,1054,1056],{"class":570,"line":653},[568,1050,617],{"class":574},[568,1052,1053],{"class":620},"Bash(pnpm *)",[568,1055,588],{"class":574},[568,1057,626],{"class":574},[568,1059,1060,1062,1065,1067],{"class":570,"line":665},[568,1061,617],{"class":574},[568,1063,1064],{"class":620},"Bash(yarn *)",[568,1066,588],{"class":574},[568,1068,626],{"class":574},[568,1070,1071,1073,1076,1078],{"class":570,"line":676},[568,1072,617],{"class":574},[568,1074,1075],{"class":620},"Bash(pip install *)",[568,1077,588],{"class":574},[568,1079,626],{"class":574},[568,1081,1082,1084,1087],{"class":570,"line":682},[568,1083,617],{"class":574},[568,1085,1086],{"class":620},"Bash(pip list)",[568,1088,673],{"class":574},[568,1090,1091],{"class":570,"line":696},[568,1092,679],{"class":574},[568,1094,1095,1097,1099,1101,1103],{"class":570,"line":708},[568,1096,600],{"class":574},[568,1098,687],{"class":603},[568,1100,588],{"class":574},[568,1102,591],{"class":574},[568,1104,611],{"class":574},[568,1106,1107,1109,1112,1114],{"class":570,"line":718},[568,1108,617],{"class":574},[568,1110,1111],{"class":620},"Bash(npm publish *)",[568,1113,588],{"class":574},[568,1115,626],{"class":574},[568,1117,1118,1120,1123,1125],{"class":570,"line":724},[568,1119,617],{"class":574},[568,1121,1122],{"class":620},"Bash(npm unpublish *)",[568,1124,588],{"class":574},[568,1126,626],{"class":574},[568,1128,1129,1131,1134],{"class":570,"line":730},[568,1130,617],{"class":574},[568,1132,1133],{"class":620},"Bash(npm audit fix *)",[568,1135,673],{"class":574},[568,1137,1138],{"class":570,"line":923},[568,1139,721],{"class":574},[568,1141,1142],{"class":570,"line":945},[568,1143,727],{"class":574},[568,1145,1146],{"class":570,"line":950},[568,1147,733],{"class":574},[195,1149,1150,305],{},[284,1151,1152],{},"实际使用场景",[559,1154,1156],{"className":741,"code":1155,"language":743,"meta":564,"style":564},"# 让 Claude 安装缺失的依赖并修复版本冲突\n\"项目构建报错，帮我检查并修复依赖问题\"\n\n# Claude 会自动执行：\n# 1. 读取 package.json 和 lock 文件\n# 2. 运行 npm install 或 pnpm install\n# 3. 根据报错信息调整依赖版本\n# 4. 重新运行构建验证\n",[307,1157,1158,1163,1168,1172,1177,1182,1187,1192],{"__ignoreMap":564},[568,1159,1160],{"class":570,"line":571},[568,1161,1162],{"class":750},"# 让 Claude 安装缺失的依赖并修复版本冲突\n",[568,1164,1165],{"class":570,"line":578},[568,1166,1167],{"class":603},"\"项目构建报错，帮我检查并修复依赖问题\"\n",[568,1169,1170],{"class":570,"line":597},[568,1171,785],{"emptyLinePlaceholder":784},[568,1173,1174],{"class":570,"line":614},[568,1175,1176],{"class":750},"# Claude 会自动执行：\n",[568,1178,1179],{"class":570,"line":629},[568,1180,1181],{"class":750},"# 1. 读取 package.json 和 lock 文件\n",[568,1183,1184],{"class":570,"line":641},[568,1185,1186],{"class":750},"# 2. 运行 npm install 或 pnpm install\n",[568,1188,1189],{"class":570,"line":653},[568,1190,1191],{"class":750},"# 3. 根据报错信息调整依赖版本\n",[568,1193,1194],{"class":570,"line":665},[568,1195,1196],{"class":750},"# 4. 重新运行构建验证\n",[207,1198,1200],{"id":1199},"_23-docker","2.3 Docker",[195,1202,1203],{},"Docker 命令通常涉及容器生命周期管理，建议按操作类型分级授权：",[559,1205,1207],{"className":561,"code":1206,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(docker ps)\",\n      \"Bash(docker images)\",\n      \"Bash(docker logs *)\",\n      \"Bash(docker build *)\",\n      \"Bash(docker compose *)\"\n    ],\n    \"ask\": [\n      \"Bash(docker exec *)\"\n    ],\n    \"deny\": [\n      \"Bash(docker system prune *)\",\n      \"Bash(docker volume rm *)\",\n      \"Bash(docker rmi -f *)\"\n    ]\n  }\n}\n",[307,1208,1209,1213,1225,1237,1248,1259,1270,1281,1290,1294,1307,1316,1320,1332,1343,1354,1363,1367,1371],{"__ignoreMap":564},[568,1210,1211],{"class":570,"line":571},[568,1212,575],{"class":574},[568,1214,1215,1217,1219,1221,1223],{"class":570,"line":578},[568,1216,581],{"class":574},[568,1218,585],{"class":584},[568,1220,588],{"class":574},[568,1222,591],{"class":574},[568,1224,594],{"class":574},[568,1226,1227,1229,1231,1233,1235],{"class":570,"line":597},[568,1228,600],{"class":574},[568,1230,604],{"class":603},[568,1232,588],{"class":574},[568,1234,591],{"class":574},[568,1236,611],{"class":574},[568,1238,1239,1241,1244,1246],{"class":570,"line":614},[568,1240,617],{"class":574},[568,1242,1243],{"class":620},"Bash(docker ps)",[568,1245,588],{"class":574},[568,1247,626],{"class":574},[568,1249,1250,1252,1255,1257],{"class":570,"line":629},[568,1251,617],{"class":574},[568,1253,1254],{"class":620},"Bash(docker images)",[568,1256,588],{"class":574},[568,1258,626],{"class":574},[568,1260,1261,1263,1266,1268],{"class":570,"line":641},[568,1262,617],{"class":574},[568,1264,1265],{"class":620},"Bash(docker logs *)",[568,1267,588],{"class":574},[568,1269,626],{"class":574},[568,1271,1272,1274,1277,1279],{"class":570,"line":653},[568,1273,617],{"class":574},[568,1275,1276],{"class":620},"Bash(docker build *)",[568,1278,588],{"class":574},[568,1280,626],{"class":574},[568,1282,1283,1285,1288],{"class":570,"line":665},[568,1284,617],{"class":574},[568,1286,1287],{"class":620},"Bash(docker compose *)",[568,1289,673],{"class":574},[568,1291,1292],{"class":570,"line":676},[568,1293,679],{"class":574},[568,1295,1296,1298,1301,1303,1305],{"class":570,"line":682},[568,1297,600],{"class":574},[568,1299,1300],{"class":603},"ask",[568,1302,588],{"class":574},[568,1304,591],{"class":574},[568,1306,611],{"class":574},[568,1308,1309,1311,1314],{"class":570,"line":696},[568,1310,617],{"class":574},[568,1312,1313],{"class":620},"Bash(docker exec *)",[568,1315,673],{"class":574},[568,1317,1318],{"class":570,"line":708},[568,1319,679],{"class":574},[568,1321,1322,1324,1326,1328,1330],{"class":570,"line":718},[568,1323,600],{"class":574},[568,1325,687],{"class":603},[568,1327,588],{"class":574},[568,1329,591],{"class":574},[568,1331,611],{"class":574},[568,1333,1334,1336,1339,1341],{"class":570,"line":724},[568,1335,617],{"class":574},[568,1337,1338],{"class":620},"Bash(docker system prune *)",[568,1340,588],{"class":574},[568,1342,626],{"class":574},[568,1344,1345,1347,1350,1352],{"class":570,"line":730},[568,1346,617],{"class":574},[568,1348,1349],{"class":620},"Bash(docker volume rm *)",[568,1351,588],{"class":574},[568,1353,626],{"class":574},[568,1355,1356,1358,1361],{"class":570,"line":923},[568,1357,617],{"class":574},[568,1359,1360],{"class":620},"Bash(docker rmi -f *)",[568,1362,673],{"class":574},[568,1364,1365],{"class":570,"line":945},[568,1366,721],{"class":574},[568,1368,1369],{"class":570,"line":950},[568,1370,727],{"class":574},[568,1372,1373],{"class":570,"line":956},[568,1374,733],{"class":574},[195,1376,1377,305],{},[284,1378,1379],{},"注意事项",[297,1381,1382,1393,1396],{},[300,1383,1384,1387,1388,1390,1391],{},[307,1385,1386],{},"docker exec"," 允许在任意容器中以任意身份执行任意命令，等同于 root 权限，建议放在 ",[307,1389,1300],{}," 而非 ",[307,1392,604],{},[300,1394,1395],{},"沙箱模式下，Docker 命令的子进程同样受沙箱限制",[300,1397,1398,1399,1402],{},"通过 Unix Socket 访问 Docker Daemon 时需注意 ",[307,1400,1401],{},"allowUnixSockets"," 配置可能带来的沙箱绕过风险",[207,1404,1406],{"id":1405},"_24-kubernetes-kubectl","2.4 Kubernetes (kubectl)",[195,1408,1409],{},"kubectl 操作直接影响生产环境，建议采用严格的权限控制：",[559,1411,1413],{"className":561,"code":1412,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(kubectl get pods|services|deployments *)\",\n      \"Bash(kubectl describe *)\",\n      \"Bash(kubectl logs *)\",\n      \"Bash(kubectl top *)\"\n    ],\n    \"ask\": [\n      \"Bash(kubectl get secrets *)\",\n      \"Bash(kubectl apply *)\",\n      \"Bash(kubectl delete *)\",\n      \"Bash(kubectl rollout *)\"\n    ],\n    \"deny\": [\n      \"Bash(kubectl delete namespace *)\",\n      \"Bash(kubectl drain *)\"\n    ]\n  },\n  \"sandbox\": {\n    \"enabled\": true,\n    \"filesystem\": {\n      \"allowWrite\": [\"~\u002F.kube\"]\n    }\n  }\n}\n",[307,1414,1415,1419,1431,1443,1454,1465,1476,1485,1489,1501,1512,1523,1534,1543,1547,1559,1570,1579,1583,1588,1602,1617,1631,1656,1662,1667],{"__ignoreMap":564},[568,1416,1417],{"class":570,"line":571},[568,1418,575],{"class":574},[568,1420,1421,1423,1425,1427,1429],{"class":570,"line":578},[568,1422,581],{"class":574},[568,1424,585],{"class":584},[568,1426,588],{"class":574},[568,1428,591],{"class":574},[568,1430,594],{"class":574},[568,1432,1433,1435,1437,1439,1441],{"class":570,"line":597},[568,1434,600],{"class":574},[568,1436,604],{"class":603},[568,1438,588],{"class":574},[568,1440,591],{"class":574},[568,1442,611],{"class":574},[568,1444,1445,1447,1450,1452],{"class":570,"line":614},[568,1446,617],{"class":574},[568,1448,1449],{"class":620},"Bash(kubectl get pods|services|deployments *)",[568,1451,588],{"class":574},[568,1453,626],{"class":574},[568,1455,1456,1458,1461,1463],{"class":570,"line":629},[568,1457,617],{"class":574},[568,1459,1460],{"class":620},"Bash(kubectl describe *)",[568,1462,588],{"class":574},[568,1464,626],{"class":574},[568,1466,1467,1469,1472,1474],{"class":570,"line":641},[568,1468,617],{"class":574},[568,1470,1471],{"class":620},"Bash(kubectl logs *)",[568,1473,588],{"class":574},[568,1475,626],{"class":574},[568,1477,1478,1480,1483],{"class":570,"line":653},[568,1479,617],{"class":574},[568,1481,1482],{"class":620},"Bash(kubectl top *)",[568,1484,673],{"class":574},[568,1486,1487],{"class":570,"line":665},[568,1488,679],{"class":574},[568,1490,1491,1493,1495,1497,1499],{"class":570,"line":676},[568,1492,600],{"class":574},[568,1494,1300],{"class":603},[568,1496,588],{"class":574},[568,1498,591],{"class":574},[568,1500,611],{"class":574},[568,1502,1503,1505,1508,1510],{"class":570,"line":682},[568,1504,617],{"class":574},[568,1506,1507],{"class":620},"Bash(kubectl get secrets *)",[568,1509,588],{"class":574},[568,1511,626],{"class":574},[568,1513,1514,1516,1519,1521],{"class":570,"line":696},[568,1515,617],{"class":574},[568,1517,1518],{"class":620},"Bash(kubectl apply *)",[568,1520,588],{"class":574},[568,1522,626],{"class":574},[568,1524,1525,1527,1530,1532],{"class":570,"line":708},[568,1526,617],{"class":574},[568,1528,1529],{"class":620},"Bash(kubectl delete *)",[568,1531,588],{"class":574},[568,1533,626],{"class":574},[568,1535,1536,1538,1541],{"class":570,"line":718},[568,1537,617],{"class":574},[568,1539,1540],{"class":620},"Bash(kubectl rollout *)",[568,1542,673],{"class":574},[568,1544,1545],{"class":570,"line":724},[568,1546,679],{"class":574},[568,1548,1549,1551,1553,1555,1557],{"class":570,"line":730},[568,1550,600],{"class":574},[568,1552,687],{"class":603},[568,1554,588],{"class":574},[568,1556,591],{"class":574},[568,1558,611],{"class":574},[568,1560,1561,1563,1566,1568],{"class":570,"line":923},[568,1562,617],{"class":574},[568,1564,1565],{"class":620},"Bash(kubectl delete namespace *)",[568,1567,588],{"class":574},[568,1569,626],{"class":574},[568,1571,1572,1574,1577],{"class":570,"line":945},[568,1573,617],{"class":574},[568,1575,1576],{"class":620},"Bash(kubectl drain *)",[568,1578,673],{"class":574},[568,1580,1581],{"class":570,"line":950},[568,1582,721],{"class":574},[568,1584,1585],{"class":570,"line":956},[568,1586,1587],{"class":574},"  },\n",[568,1589,1591,1593,1596,1598,1600],{"class":570,"line":1590},20,[568,1592,581],{"class":574},[568,1594,1595],{"class":584},"sandbox",[568,1597,588],{"class":574},[568,1599,591],{"class":574},[568,1601,594],{"class":574},[568,1603,1605,1607,1610,1612,1614],{"class":570,"line":1604},21,[568,1606,600],{"class":574},[568,1608,1609],{"class":603},"enabled",[568,1611,588],{"class":574},[568,1613,591],{"class":574},[568,1615,1616],{"class":574}," true,\n",[568,1618,1620,1622,1625,1627,1629],{"class":570,"line":1619},22,[568,1621,600],{"class":574},[568,1623,1624],{"class":603},"filesystem",[568,1626,588],{"class":574},[568,1628,591],{"class":574},[568,1630,594],{"class":574},[568,1632,1634,1636,1639,1641,1643,1646,1648,1651,1653],{"class":570,"line":1633},23,[568,1635,617],{"class":574},[568,1637,1638],{"class":764},"allowWrite",[568,1640,588],{"class":574},[568,1642,591],{"class":574},[568,1644,1645],{"class":574}," [",[568,1647,588],{"class":574},[568,1649,1650],{"class":620},"~\u002F.kube",[568,1652,588],{"class":574},[568,1654,1655],{"class":574},"]\n",[568,1657,1659],{"class":570,"line":1658},24,[568,1660,1661],{"class":574},"    }\n",[568,1663,1665],{"class":570,"line":1664},25,[568,1666,727],{"class":574},[568,1668,1670],{"class":570,"line":1669},26,[568,1671,733],{"class":574},[195,1673,1674,305],{},[284,1675,1676],{},"沙箱配置要点",[297,1678,1679,1685,1695],{},[300,1680,1681,1682,1684],{},"kubectl 需要写入 ",[307,1683,1650],{}," 目录来缓存集群配置和认证信息",[300,1686,1687,1688,1390,1691,1694],{},"使用 ",[307,1689,1690],{},"sandbox.filesystem.allowWrite",[307,1692,1693],{},"excludedCommands"," 来授权，这是推荐做法",[300,1696,1697],{},"所有子进程（包括 kubectl 调用的底层命令）都继承相同的沙箱限制",[199,1699,1701],{"id":1700},"_3-构建工具集成","3. 构建工具集成",[207,1703,1705],{"id":1704},"_31-vite","3.1 Vite",[195,1707,1708],{},"Vite 作为现代前端构建工具，与 Claude Code 配合流畅：",[559,1710,1712],{"className":561,"code":1711,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(vite)\",\n      \"Bash(vite build)\",\n      \"Bash(vite preview)\",\n      \"Bash(npm run dev)\",\n      \"Bash(npm run build)\",\n      \"Bash(npm run preview)\"\n    ]\n  }\n}\n",[307,1713,1714,1718,1730,1742,1753,1764,1775,1786,1797,1806,1810,1814],{"__ignoreMap":564},[568,1715,1716],{"class":570,"line":571},[568,1717,575],{"class":574},[568,1719,1720,1722,1724,1726,1728],{"class":570,"line":578},[568,1721,581],{"class":574},[568,1723,585],{"class":584},[568,1725,588],{"class":574},[568,1727,591],{"class":574},[568,1729,594],{"class":574},[568,1731,1732,1734,1736,1738,1740],{"class":570,"line":597},[568,1733,600],{"class":574},[568,1735,604],{"class":603},[568,1737,588],{"class":574},[568,1739,591],{"class":574},[568,1741,611],{"class":574},[568,1743,1744,1746,1749,1751],{"class":570,"line":614},[568,1745,617],{"class":574},[568,1747,1748],{"class":620},"Bash(vite)",[568,1750,588],{"class":574},[568,1752,626],{"class":574},[568,1754,1755,1757,1760,1762],{"class":570,"line":629},[568,1756,617],{"class":574},[568,1758,1759],{"class":620},"Bash(vite build)",[568,1761,588],{"class":574},[568,1763,626],{"class":574},[568,1765,1766,1768,1771,1773],{"class":570,"line":641},[568,1767,617],{"class":574},[568,1769,1770],{"class":620},"Bash(vite preview)",[568,1772,588],{"class":574},[568,1774,626],{"class":574},[568,1776,1777,1779,1782,1784],{"class":570,"line":653},[568,1778,617],{"class":574},[568,1780,1781],{"class":620},"Bash(npm run dev)",[568,1783,588],{"class":574},[568,1785,626],{"class":574},[568,1787,1788,1790,1793,1795],{"class":570,"line":665},[568,1789,617],{"class":574},[568,1791,1792],{"class":620},"Bash(npm run build)",[568,1794,588],{"class":574},[568,1796,626],{"class":574},[568,1798,1799,1801,1804],{"class":570,"line":676},[568,1800,617],{"class":574},[568,1802,1803],{"class":620},"Bash(npm run preview)",[568,1805,673],{"class":574},[568,1807,1808],{"class":570,"line":682},[568,1809,721],{"class":574},[568,1811,1812],{"class":570,"line":696},[568,1813,727],{"class":574},[568,1815,1816],{"class":570,"line":708},[568,1817,733],{"class":574},[195,1819,1820,305],{},[284,1821,1822],{},"Claude 可执行的典型任务",[297,1824,1825,1832,1839,1846],{},[300,1826,1827,1828,1831],{},"分析 ",[307,1829,1830],{},"vite.config.ts"," 配置并优化构建性能",[300,1833,1834,1835,1838],{},"调整 ",[307,1836,1837],{},"build.rollupOptions"," 实现代码分割",[300,1840,1841,1842,1845],{},"配置 ",[307,1843,1844],{},"server.proxy"," 解决开发环境跨域",[300,1847,1848],{},"诊断构建错误并修复",[207,1850,1852],{"id":1851},"_32-webpack","3.2 Webpack",[559,1854,1856],{"className":561,"code":1855,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(webpack *)\",\n      \"Bash(npx webpack *)\",\n      \"Bash(npm run build:prod)\",\n      \"Bash(npm run build:dev)\"\n    ]\n  }\n}\n",[307,1857,1858,1862,1874,1886,1897,1908,1919,1928,1932,1936],{"__ignoreMap":564},[568,1859,1860],{"class":570,"line":571},[568,1861,575],{"class":574},[568,1863,1864,1866,1868,1870,1872],{"class":570,"line":578},[568,1865,581],{"class":574},[568,1867,585],{"class":584},[568,1869,588],{"class":574},[568,1871,591],{"class":574},[568,1873,594],{"class":574},[568,1875,1876,1878,1880,1882,1884],{"class":570,"line":597},[568,1877,600],{"class":574},[568,1879,604],{"class":603},[568,1881,588],{"class":574},[568,1883,591],{"class":574},[568,1885,611],{"class":574},[568,1887,1888,1890,1893,1895],{"class":570,"line":614},[568,1889,617],{"class":574},[568,1891,1892],{"class":620},"Bash(webpack *)",[568,1894,588],{"class":574},[568,1896,626],{"class":574},[568,1898,1899,1901,1904,1906],{"class":570,"line":629},[568,1900,617],{"class":574},[568,1902,1903],{"class":620},"Bash(npx webpack *)",[568,1905,588],{"class":574},[568,1907,626],{"class":574},[568,1909,1910,1912,1915,1917],{"class":570,"line":641},[568,1911,617],{"class":574},[568,1913,1914],{"class":620},"Bash(npm run build:prod)",[568,1916,588],{"class":574},[568,1918,626],{"class":574},[568,1920,1921,1923,1926],{"class":570,"line":653},[568,1922,617],{"class":574},[568,1924,1925],{"class":620},"Bash(npm run build:dev)",[568,1927,673],{"class":574},[568,1929,1930],{"class":570,"line":665},[568,1931,721],{"class":574},[568,1933,1934],{"class":570,"line":676},[568,1935,727],{"class":574},[568,1937,1938],{"class":570,"line":682},[568,1939,733],{"class":574},[207,1941,1943],{"id":1942},"_33-typescript-编译器","3.3 TypeScript 编译器",[195,1945,1946],{},"TypeScript 编译是 Claude Code 最常执行的构建操作之一：",[559,1948,1950],{"className":561,"code":1949,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(tsc)\",\n      \"Bash(tsc --noEmit)\",\n      \"Bash(tsc --watch)\",\n      \"Bash(npx tsc *)\",\n      \"Bash(npm run type-check)\"\n    ]\n  }\n}\n",[307,1951,1952,1956,1968,1980,1991,2002,2013,2024,2033,2037,2041],{"__ignoreMap":564},[568,1953,1954],{"class":570,"line":571},[568,1955,575],{"class":574},[568,1957,1958,1960,1962,1964,1966],{"class":570,"line":578},[568,1959,581],{"class":574},[568,1961,585],{"class":584},[568,1963,588],{"class":574},[568,1965,591],{"class":574},[568,1967,594],{"class":574},[568,1969,1970,1972,1974,1976,1978],{"class":570,"line":597},[568,1971,600],{"class":574},[568,1973,604],{"class":603},[568,1975,588],{"class":574},[568,1977,591],{"class":574},[568,1979,611],{"class":574},[568,1981,1982,1984,1987,1989],{"class":570,"line":614},[568,1983,617],{"class":574},[568,1985,1986],{"class":620},"Bash(tsc)",[568,1988,588],{"class":574},[568,1990,626],{"class":574},[568,1992,1993,1995,1998,2000],{"class":570,"line":629},[568,1994,617],{"class":574},[568,1996,1997],{"class":620},"Bash(tsc --noEmit)",[568,1999,588],{"class":574},[568,2001,626],{"class":574},[568,2003,2004,2006,2009,2011],{"class":570,"line":641},[568,2005,617],{"class":574},[568,2007,2008],{"class":620},"Bash(tsc --watch)",[568,2010,588],{"class":574},[568,2012,626],{"class":574},[568,2014,2015,2017,2020,2022],{"class":570,"line":653},[568,2016,617],{"class":574},[568,2018,2019],{"class":620},"Bash(npx tsc *)",[568,2021,588],{"class":574},[568,2023,626],{"class":574},[568,2025,2026,2028,2031],{"class":570,"line":665},[568,2027,617],{"class":574},[568,2029,2030],{"class":620},"Bash(npm run type-check)",[568,2032,673],{"class":574},[568,2034,2035],{"class":570,"line":676},[568,2036,721],{"class":574},[568,2038,2039],{"class":570,"line":682},[568,2040,727],{"class":574},[568,2042,2043],{"class":570,"line":696},[568,2044,733],{"class":574},[195,2046,2047,305],{},[284,2048,2049],{},"与 LSP 工具的协同",[297,2051,2052,2058,2061],{},[300,2053,2054,2055,2057],{},"Claude Code 的 ",[307,2056,334],{}," 工具在每次文件编辑后自动报告类型错误和警告",[300,2059,2060],{},"这消除了单独的编译步骤，Claude 可以在编辑过程中实时修复类型问题",[300,2062,2063],{},"LSP 支持：跳转到定义、查找引用、获取类型信息、列出文件符号、查找接口实现、追踪调用层次",[207,2065,2067],{"id":2066},"_34-babel-swc-esbuild","3.4 Babel \u002F SWC \u002F esbuild",[559,2069,2071],{"className":561,"code":2070,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(babel *)\",\n      \"Bash(npx babel *)\",\n      \"Bash(npx esbuild *)\",\n      \"Bash(npx swc *)\"\n    ]\n  }\n}\n",[307,2072,2073,2077,2089,2101,2112,2123,2134,2143,2147,2151],{"__ignoreMap":564},[568,2074,2075],{"class":570,"line":571},[568,2076,575],{"class":574},[568,2078,2079,2081,2083,2085,2087],{"class":570,"line":578},[568,2080,581],{"class":574},[568,2082,585],{"class":584},[568,2084,588],{"class":574},[568,2086,591],{"class":574},[568,2088,594],{"class":574},[568,2090,2091,2093,2095,2097,2099],{"class":570,"line":597},[568,2092,600],{"class":574},[568,2094,604],{"class":603},[568,2096,588],{"class":574},[568,2098,591],{"class":574},[568,2100,611],{"class":574},[568,2102,2103,2105,2108,2110],{"class":570,"line":614},[568,2104,617],{"class":574},[568,2106,2107],{"class":620},"Bash(babel *)",[568,2109,588],{"class":574},[568,2111,626],{"class":574},[568,2113,2114,2116,2119,2121],{"class":570,"line":629},[568,2115,617],{"class":574},[568,2117,2118],{"class":620},"Bash(npx babel *)",[568,2120,588],{"class":574},[568,2122,626],{"class":574},[568,2124,2125,2127,2130,2132],{"class":570,"line":641},[568,2126,617],{"class":574},[568,2128,2129],{"class":620},"Bash(npx esbuild *)",[568,2131,588],{"class":574},[568,2133,626],{"class":574},[568,2135,2136,2138,2141],{"class":570,"line":653},[568,2137,617],{"class":574},[568,2139,2140],{"class":620},"Bash(npx swc *)",[568,2142,673],{"class":574},[568,2144,2145],{"class":570,"line":665},[568,2146,721],{"class":574},[568,2148,2149],{"class":570,"line":676},[568,2150,727],{"class":574},[568,2152,2153],{"class":570,"line":682},[568,2154,733],{"class":574},[199,2156,2158],{"id":2157},"_4-数据库工具","4. 数据库工具",[207,2160,2162],{"id":2161},"_41-sql-查询","4.1 SQL 查询",[195,2164,2165,2166,2169,2170,305],{},"通过 MCP 服务器，Claude Code 可以直接连接数据库执行查询。以 PostgreSQL 为例，在 ",[307,2167,2168],{},"settings.json"," 中配置 ",[307,2171,2172],{},"mcpServers",[559,2174,2176],{"className":561,"code":2175,"language":563,"meta":564,"style":564},"{\n  \"mcpServers\": {\n    \"postgres\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-postgres\", \"postgresql:\u002F\u002Flocalhost\u002Fmydb\"]\n    }\n  }\n}\n",[307,2177,2178,2182,2194,2207,2227,2268,2272,2276],{"__ignoreMap":564},[568,2179,2180],{"class":570,"line":571},[568,2181,575],{"class":574},[568,2183,2184,2186,2188,2190,2192],{"class":570,"line":578},[568,2185,581],{"class":574},[568,2187,2172],{"class":584},[568,2189,588],{"class":574},[568,2191,591],{"class":574},[568,2193,594],{"class":574},[568,2195,2196,2198,2201,2203,2205],{"class":570,"line":597},[568,2197,600],{"class":574},[568,2199,2200],{"class":603},"postgres",[568,2202,588],{"class":574},[568,2204,591],{"class":574},[568,2206,594],{"class":574},[568,2208,2209,2211,2214,2216,2218,2220,2223,2225],{"class":570,"line":614},[568,2210,617],{"class":574},[568,2212,2213],{"class":764},"command",[568,2215,588],{"class":574},[568,2217,591],{"class":574},[568,2219,774],{"class":574},[568,2221,2222],{"class":620},"npx",[568,2224,588],{"class":574},[568,2226,626],{"class":574},[568,2228,2229,2231,2234,2236,2238,2240,2242,2245,2247,2250,2252,2255,2257,2259,2261,2264,2266],{"class":570,"line":629},[568,2230,617],{"class":574},[568,2232,2233],{"class":764},"args",[568,2235,588],{"class":574},[568,2237,591],{"class":574},[568,2239,1645],{"class":574},[568,2241,588],{"class":574},[568,2243,2244],{"class":620},"-y",[568,2246,588],{"class":574},[568,2248,2249],{"class":574},",",[568,2251,774],{"class":574},[568,2253,2254],{"class":620},"@modelcontextprotocol\u002Fserver-postgres",[568,2256,588],{"class":574},[568,2258,2249],{"class":574},[568,2260,774],{"class":574},[568,2262,2263],{"class":620},"postgresql:\u002F\u002Flocalhost\u002Fmydb",[568,2265,588],{"class":574},[568,2267,1655],{"class":574},[568,2269,2270],{"class":570,"line":641},[568,2271,1661],{"class":574},[568,2273,2274],{"class":570,"line":653},[568,2275,727],{"class":574},[568,2277,2278],{"class":570,"line":665},[568,2279,733],{"class":574},[195,2281,2282,305],{},[284,2283,2284],{},"代码中使用",[559,2286,2290],{"className":2287,"code":2288,"language":2289,"meta":564,"style":564},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const options = {\n  mcpServers: {\n    postgres: {\n      command: \"npx\",\n      args: [\"-y\", \"@modelcontextprotocol\u002Fserver-postgres\", \"postgresql:\u002F\u002Flocalhost\u002Fmydb\"]\n    }\n  },\n  allowedTools: [\"mcp__postgres__query\"]\n};\n","typescript",[307,2291,2292,2305,2315,2324,2339,2372,2376,2380,2398],{"__ignoreMap":564},[568,2293,2294,2297,2300,2303],{"class":570,"line":571},[568,2295,2296],{"class":584},"const",[568,2298,2299],{"class":858}," options ",[568,2301,2302],{"class":574},"=",[568,2304,594],{"class":574},[568,2306,2307,2311,2313],{"class":570,"line":578},[568,2308,2310],{"class":2309},"swJcz","  mcpServers",[568,2312,591],{"class":574},[568,2314,594],{"class":574},[568,2316,2317,2320,2322],{"class":570,"line":597},[568,2318,2319],{"class":2309},"    postgres",[568,2321,591],{"class":574},[568,2323,594],{"class":574},[568,2325,2326,2329,2331,2333,2335,2337],{"class":570,"line":614},[568,2327,2328],{"class":2309},"      command",[568,2330,591],{"class":574},[568,2332,774],{"class":574},[568,2334,2222],{"class":620},[568,2336,588],{"class":574},[568,2338,626],{"class":574},[568,2340,2341,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370],{"class":570,"line":629},[568,2342,2343],{"class":2309},"      args",[568,2345,591],{"class":574},[568,2347,1645],{"class":858},[568,2349,588],{"class":574},[568,2351,2244],{"class":620},[568,2353,588],{"class":574},[568,2355,2249],{"class":574},[568,2357,774],{"class":574},[568,2359,2254],{"class":620},[568,2361,588],{"class":574},[568,2363,2249],{"class":574},[568,2365,774],{"class":574},[568,2367,2263],{"class":620},[568,2369,588],{"class":574},[568,2371,1655],{"class":858},[568,2373,2374],{"class":570,"line":641},[568,2375,1661],{"class":574},[568,2377,2378],{"class":570,"line":653},[568,2379,1587],{"class":574},[568,2381,2382,2385,2387,2389,2391,2394,2396],{"class":570,"line":665},[568,2383,2384],{"class":2309},"  allowedTools",[568,2386,591],{"class":574},[568,2388,1645],{"class":858},[568,2390,588],{"class":574},[568,2392,2393],{"class":620},"mcp__postgres__query",[568,2395,588],{"class":574},[568,2397,1655],{"class":858},[568,2399,2400],{"class":570,"line":676},[568,2401,2402],{"class":574},"};\n",[195,2404,2405],{},"Claude 会自动发现数据库 Schema，编写 SQL 查询并返回结果。",[207,2407,2409],{"id":2408},"_42-orm-操作-prisma-drizzle","4.2 ORM 操作 (Prisma \u002F Drizzle)",[195,2411,2412,305],{},[284,2413,2414],{},"Prisma 工作流",[559,2416,2418],{"className":561,"code":2417,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(npx prisma migrate dev)\",\n      \"Bash(npx prisma migrate deploy)\",\n      \"Bash(npx prisma generate)\",\n      \"Bash(npx prisma studio)\",\n      \"Bash(npx prisma db pull)\",\n      \"Bash(npx prisma db seed)\"\n    ],\n    \"ask\": [\n      \"Bash(npx prisma migrate reset)\",\n      \"Bash(npx prisma db push)\"\n    ]\n  }\n}\n",[307,2419,2420,2424,2436,2448,2459,2470,2481,2492,2503,2512,2516,2528,2539,2548,2552,2556],{"__ignoreMap":564},[568,2421,2422],{"class":570,"line":571},[568,2423,575],{"class":574},[568,2425,2426,2428,2430,2432,2434],{"class":570,"line":578},[568,2427,581],{"class":574},[568,2429,585],{"class":584},[568,2431,588],{"class":574},[568,2433,591],{"class":574},[568,2435,594],{"class":574},[568,2437,2438,2440,2442,2444,2446],{"class":570,"line":597},[568,2439,600],{"class":574},[568,2441,604],{"class":603},[568,2443,588],{"class":574},[568,2445,591],{"class":574},[568,2447,611],{"class":574},[568,2449,2450,2452,2455,2457],{"class":570,"line":614},[568,2451,617],{"class":574},[568,2453,2454],{"class":620},"Bash(npx prisma migrate dev)",[568,2456,588],{"class":574},[568,2458,626],{"class":574},[568,2460,2461,2463,2466,2468],{"class":570,"line":629},[568,2462,617],{"class":574},[568,2464,2465],{"class":620},"Bash(npx prisma migrate deploy)",[568,2467,588],{"class":574},[568,2469,626],{"class":574},[568,2471,2472,2474,2477,2479],{"class":570,"line":641},[568,2473,617],{"class":574},[568,2475,2476],{"class":620},"Bash(npx prisma generate)",[568,2478,588],{"class":574},[568,2480,626],{"class":574},[568,2482,2483,2485,2488,2490],{"class":570,"line":653},[568,2484,617],{"class":574},[568,2486,2487],{"class":620},"Bash(npx prisma studio)",[568,2489,588],{"class":574},[568,2491,626],{"class":574},[568,2493,2494,2496,2499,2501],{"class":570,"line":665},[568,2495,617],{"class":574},[568,2497,2498],{"class":620},"Bash(npx prisma db pull)",[568,2500,588],{"class":574},[568,2502,626],{"class":574},[568,2504,2505,2507,2510],{"class":570,"line":676},[568,2506,617],{"class":574},[568,2508,2509],{"class":620},"Bash(npx prisma db seed)",[568,2511,673],{"class":574},[568,2513,2514],{"class":570,"line":682},[568,2515,679],{"class":574},[568,2517,2518,2520,2522,2524,2526],{"class":570,"line":696},[568,2519,600],{"class":574},[568,2521,1300],{"class":603},[568,2523,588],{"class":574},[568,2525,591],{"class":574},[568,2527,611],{"class":574},[568,2529,2530,2532,2535,2537],{"class":570,"line":708},[568,2531,617],{"class":574},[568,2533,2534],{"class":620},"Bash(npx prisma migrate reset)",[568,2536,588],{"class":574},[568,2538,626],{"class":574},[568,2540,2541,2543,2546],{"class":570,"line":718},[568,2542,617],{"class":574},[568,2544,2545],{"class":620},"Bash(npx prisma db push)",[568,2547,673],{"class":574},[568,2549,2550],{"class":570,"line":724},[568,2551,721],{"class":574},[568,2553,2554],{"class":570,"line":730},[568,2555,727],{"class":574},[568,2557,2558],{"class":570,"line":923},[568,2559,733],{"class":574},[195,2561,2562,305],{},[284,2563,2564],{},"Drizzle 工作流",[559,2566,2568],{"className":561,"code":2567,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(npx drizzle-kit generate)\",\n      \"Bash(npx drizzle-kit migrate)\",\n      \"Bash(npx drizzle-kit push)\",\n      \"Bash(npx drizzle-kit studio)\",\n      \"Bash(npx drizzle-kit pull)\"\n    ]\n  }\n}\n",[307,2569,2570,2574,2586,2598,2609,2620,2631,2642,2651,2655,2659],{"__ignoreMap":564},[568,2571,2572],{"class":570,"line":571},[568,2573,575],{"class":574},[568,2575,2576,2578,2580,2582,2584],{"class":570,"line":578},[568,2577,581],{"class":574},[568,2579,585],{"class":584},[568,2581,588],{"class":574},[568,2583,591],{"class":574},[568,2585,594],{"class":574},[568,2587,2588,2590,2592,2594,2596],{"class":570,"line":597},[568,2589,600],{"class":574},[568,2591,604],{"class":603},[568,2593,588],{"class":574},[568,2595,591],{"class":574},[568,2597,611],{"class":574},[568,2599,2600,2602,2605,2607],{"class":570,"line":614},[568,2601,617],{"class":574},[568,2603,2604],{"class":620},"Bash(npx drizzle-kit generate)",[568,2606,588],{"class":574},[568,2608,626],{"class":574},[568,2610,2611,2613,2616,2618],{"class":570,"line":629},[568,2612,617],{"class":574},[568,2614,2615],{"class":620},"Bash(npx drizzle-kit migrate)",[568,2617,588],{"class":574},[568,2619,626],{"class":574},[568,2621,2622,2624,2627,2629],{"class":570,"line":641},[568,2623,617],{"class":574},[568,2625,2626],{"class":620},"Bash(npx drizzle-kit push)",[568,2628,588],{"class":574},[568,2630,626],{"class":574},[568,2632,2633,2635,2638,2640],{"class":570,"line":653},[568,2634,617],{"class":574},[568,2636,2637],{"class":620},"Bash(npx drizzle-kit studio)",[568,2639,588],{"class":574},[568,2641,626],{"class":574},[568,2643,2644,2646,2649],{"class":570,"line":665},[568,2645,617],{"class":574},[568,2647,2648],{"class":620},"Bash(npx drizzle-kit pull)",[568,2650,673],{"class":574},[568,2652,2653],{"class":570,"line":676},[568,2654,721],{"class":574},[568,2656,2657],{"class":570,"line":682},[568,2658,727],{"class":574},[568,2660,2661],{"class":570,"line":696},[568,2662,733],{"class":574},[207,2664,2666],{"id":2665},"_43-迁移脚本管理","4.3 迁移脚本管理",[195,2668,2669],{},"Claude Code 可以协助规划和生成零停机数据库迁移，包括：",[297,2671,2672,2678,2684],{},[300,2673,2674,2677],{},[284,2675,2676],{},"Expand-Contract 模式","：用于列重命名和类型变更",[300,2679,2680,2683],{},[284,2681,2682],{},"数据回填脚本","：迁移后填充新列数据",[300,2685,2686,2689],{},[284,2687,2688],{},"回滚程序","：为每个迁移准备回滚方案",[559,2691,2693],{"className":561,"code":2692,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(npx prisma migrate dev --create-only)\",\n      \"Bash(npx prisma migrate status)\",\n      \"Bash(npx prisma migrate resolve *)\"\n    ]\n  }\n}\n",[307,2694,2695,2699,2711,2723,2734,2745,2754,2758,2762],{"__ignoreMap":564},[568,2696,2697],{"class":570,"line":571},[568,2698,575],{"class":574},[568,2700,2701,2703,2705,2707,2709],{"class":570,"line":578},[568,2702,581],{"class":574},[568,2704,585],{"class":584},[568,2706,588],{"class":574},[568,2708,591],{"class":574},[568,2710,594],{"class":574},[568,2712,2713,2715,2717,2719,2721],{"class":570,"line":597},[568,2714,600],{"class":574},[568,2716,604],{"class":603},[568,2718,588],{"class":574},[568,2720,591],{"class":574},[568,2722,611],{"class":574},[568,2724,2725,2727,2730,2732],{"class":570,"line":614},[568,2726,617],{"class":574},[568,2728,2729],{"class":620},"Bash(npx prisma migrate dev --create-only)",[568,2731,588],{"class":574},[568,2733,626],{"class":574},[568,2735,2736,2738,2741,2743],{"class":570,"line":629},[568,2737,617],{"class":574},[568,2739,2740],{"class":620},"Bash(npx prisma migrate status)",[568,2742,588],{"class":574},[568,2744,626],{"class":574},[568,2746,2747,2749,2752],{"class":570,"line":641},[568,2748,617],{"class":574},[568,2750,2751],{"class":620},"Bash(npx prisma migrate resolve *)",[568,2753,673],{"class":574},[568,2755,2756],{"class":570,"line":653},[568,2757,721],{"class":574},[568,2759,2760],{"class":570,"line":665},[568,2761,727],{"class":574},[568,2763,2764],{"class":570,"line":676},[568,2765,733],{"class":574},[199,2767,2769],{"id":2768},"_5-部署工具","5. 部署工具",[207,2771,2773],{"id":2772},"_51-vercel-cli","5.1 Vercel CLI",[559,2775,2777],{"className":561,"code":2776,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(vercel)\",\n      \"Bash(vercel --version)\",\n      \"Bash(vercel env *)\",\n      \"Bash(vercel logs *)\",\n      \"Bash(vercel list *)\"\n    ],\n    \"ask\": [\n      \"Bash(vercel --prod)\",\n      \"Bash(vercel deploy *)\"\n    ]\n  }\n}\n",[307,2778,2779,2783,2795,2807,2818,2829,2840,2851,2860,2864,2876,2887,2896,2900,2904],{"__ignoreMap":564},[568,2780,2781],{"class":570,"line":571},[568,2782,575],{"class":574},[568,2784,2785,2787,2789,2791,2793],{"class":570,"line":578},[568,2786,581],{"class":574},[568,2788,585],{"class":584},[568,2790,588],{"class":574},[568,2792,591],{"class":574},[568,2794,594],{"class":574},[568,2796,2797,2799,2801,2803,2805],{"class":570,"line":597},[568,2798,600],{"class":574},[568,2800,604],{"class":603},[568,2802,588],{"class":574},[568,2804,591],{"class":574},[568,2806,611],{"class":574},[568,2808,2809,2811,2814,2816],{"class":570,"line":614},[568,2810,617],{"class":574},[568,2812,2813],{"class":620},"Bash(vercel)",[568,2815,588],{"class":574},[568,2817,626],{"class":574},[568,2819,2820,2822,2825,2827],{"class":570,"line":629},[568,2821,617],{"class":574},[568,2823,2824],{"class":620},"Bash(vercel --version)",[568,2826,588],{"class":574},[568,2828,626],{"class":574},[568,2830,2831,2833,2836,2838],{"class":570,"line":641},[568,2832,617],{"class":574},[568,2834,2835],{"class":620},"Bash(vercel env *)",[568,2837,588],{"class":574},[568,2839,626],{"class":574},[568,2841,2842,2844,2847,2849],{"class":570,"line":653},[568,2843,617],{"class":574},[568,2845,2846],{"class":620},"Bash(vercel logs *)",[568,2848,588],{"class":574},[568,2850,626],{"class":574},[568,2852,2853,2855,2858],{"class":570,"line":665},[568,2854,617],{"class":574},[568,2856,2857],{"class":620},"Bash(vercel list *)",[568,2859,673],{"class":574},[568,2861,2862],{"class":570,"line":676},[568,2863,679],{"class":574},[568,2865,2866,2868,2870,2872,2874],{"class":570,"line":682},[568,2867,600],{"class":574},[568,2869,1300],{"class":603},[568,2871,588],{"class":574},[568,2873,591],{"class":574},[568,2875,611],{"class":574},[568,2877,2878,2880,2883,2885],{"class":570,"line":696},[568,2879,617],{"class":574},[568,2881,2882],{"class":620},"Bash(vercel --prod)",[568,2884,588],{"class":574},[568,2886,626],{"class":574},[568,2888,2889,2891,2894],{"class":570,"line":708},[568,2890,617],{"class":574},[568,2892,2893],{"class":620},"Bash(vercel deploy *)",[568,2895,673],{"class":574},[568,2897,2898],{"class":570,"line":718},[568,2899,721],{"class":574},[568,2901,2902],{"class":570,"line":724},[568,2903,727],{"class":574},[568,2905,2906],{"class":570,"line":730},[568,2907,733],{"class":574},[207,2909,2911],{"id":2910},"_52-aws-cli","5.2 AWS CLI",[559,2913,2915],{"className":561,"code":2914,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(aws s3 *)\",\n      \"Bash(aws ec2 describe *)\",\n      \"Bash(aws lambda list *)\",\n      \"Bash(aws cloudformation describe *)\",\n      \"Bash(aws logs *)\"\n    ],\n    \"ask\": [\n      \"Bash(aws ec2 terminate *)\",\n      \"Bash(aws lambda delete *)\",\n      \"Bash(aws s3 rm *)\"\n    ],\n    \"deny\": [\n      \"Bash(aws iam delete *)\",\n      \"Bash(aws account *)\"\n    ]\n  }\n}\n",[307,2916,2917,2921,2933,2945,2956,2967,2978,2989,2998,3002,3014,3025,3036,3045,3049,3061,3072,3081,3085,3089],{"__ignoreMap":564},[568,2918,2919],{"class":570,"line":571},[568,2920,575],{"class":574},[568,2922,2923,2925,2927,2929,2931],{"class":570,"line":578},[568,2924,581],{"class":574},[568,2926,585],{"class":584},[568,2928,588],{"class":574},[568,2930,591],{"class":574},[568,2932,594],{"class":574},[568,2934,2935,2937,2939,2941,2943],{"class":570,"line":597},[568,2936,600],{"class":574},[568,2938,604],{"class":603},[568,2940,588],{"class":574},[568,2942,591],{"class":574},[568,2944,611],{"class":574},[568,2946,2947,2949,2952,2954],{"class":570,"line":614},[568,2948,617],{"class":574},[568,2950,2951],{"class":620},"Bash(aws s3 *)",[568,2953,588],{"class":574},[568,2955,626],{"class":574},[568,2957,2958,2960,2963,2965],{"class":570,"line":629},[568,2959,617],{"class":574},[568,2961,2962],{"class":620},"Bash(aws ec2 describe *)",[568,2964,588],{"class":574},[568,2966,626],{"class":574},[568,2968,2969,2971,2974,2976],{"class":570,"line":641},[568,2970,617],{"class":574},[568,2972,2973],{"class":620},"Bash(aws lambda list *)",[568,2975,588],{"class":574},[568,2977,626],{"class":574},[568,2979,2980,2982,2985,2987],{"class":570,"line":653},[568,2981,617],{"class":574},[568,2983,2984],{"class":620},"Bash(aws cloudformation describe *)",[568,2986,588],{"class":574},[568,2988,626],{"class":574},[568,2990,2991,2993,2996],{"class":570,"line":665},[568,2992,617],{"class":574},[568,2994,2995],{"class":620},"Bash(aws logs *)",[568,2997,673],{"class":574},[568,2999,3000],{"class":570,"line":676},[568,3001,679],{"class":574},[568,3003,3004,3006,3008,3010,3012],{"class":570,"line":682},[568,3005,600],{"class":574},[568,3007,1300],{"class":603},[568,3009,588],{"class":574},[568,3011,591],{"class":574},[568,3013,611],{"class":574},[568,3015,3016,3018,3021,3023],{"class":570,"line":696},[568,3017,617],{"class":574},[568,3019,3020],{"class":620},"Bash(aws ec2 terminate *)",[568,3022,588],{"class":574},[568,3024,626],{"class":574},[568,3026,3027,3029,3032,3034],{"class":570,"line":708},[568,3028,617],{"class":574},[568,3030,3031],{"class":620},"Bash(aws lambda delete *)",[568,3033,588],{"class":574},[568,3035,626],{"class":574},[568,3037,3038,3040,3043],{"class":570,"line":718},[568,3039,617],{"class":574},[568,3041,3042],{"class":620},"Bash(aws s3 rm *)",[568,3044,673],{"class":574},[568,3046,3047],{"class":570,"line":724},[568,3048,679],{"class":574},[568,3050,3051,3053,3055,3057,3059],{"class":570,"line":730},[568,3052,600],{"class":574},[568,3054,687],{"class":603},[568,3056,588],{"class":574},[568,3058,591],{"class":574},[568,3060,611],{"class":574},[568,3062,3063,3065,3068,3070],{"class":570,"line":923},[568,3064,617],{"class":574},[568,3066,3067],{"class":620},"Bash(aws iam delete *)",[568,3069,588],{"class":574},[568,3071,626],{"class":574},[568,3073,3074,3076,3079],{"class":570,"line":945},[568,3075,617],{"class":574},[568,3077,3078],{"class":620},"Bash(aws account *)",[568,3080,673],{"class":574},[568,3082,3083],{"class":570,"line":950},[568,3084,721],{"class":574},[568,3086,3087],{"class":570,"line":956},[568,3088,727],{"class":574},[568,3090,3091],{"class":570,"line":1590},[568,3092,733],{"class":574},[207,3094,3096],{"id":3095},"_53-gcp-azure-cli","5.3 GCP \u002F Azure CLI",[559,3098,3100],{"className":561,"code":3099,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(gcloud compute instances list)\",\n      \"Bash(gcloud projects list)\",\n      \"Bash(az resource list)\",\n      \"Bash(az account list)\"\n    ],\n    \"ask\": [\n      \"Bash(gcloud compute instances delete *)\",\n      \"Bash(az vm delete *)\"\n    ]\n  }\n}\n",[307,3101,3102,3106,3118,3130,3141,3152,3163,3172,3176,3188,3199,3208,3212,3216],{"__ignoreMap":564},[568,3103,3104],{"class":570,"line":571},[568,3105,575],{"class":574},[568,3107,3108,3110,3112,3114,3116],{"class":570,"line":578},[568,3109,581],{"class":574},[568,3111,585],{"class":584},[568,3113,588],{"class":574},[568,3115,591],{"class":574},[568,3117,594],{"class":574},[568,3119,3120,3122,3124,3126,3128],{"class":570,"line":597},[568,3121,600],{"class":574},[568,3123,604],{"class":603},[568,3125,588],{"class":574},[568,3127,591],{"class":574},[568,3129,611],{"class":574},[568,3131,3132,3134,3137,3139],{"class":570,"line":614},[568,3133,617],{"class":574},[568,3135,3136],{"class":620},"Bash(gcloud compute instances list)",[568,3138,588],{"class":574},[568,3140,626],{"class":574},[568,3142,3143,3145,3148,3150],{"class":570,"line":629},[568,3144,617],{"class":574},[568,3146,3147],{"class":620},"Bash(gcloud projects list)",[568,3149,588],{"class":574},[568,3151,626],{"class":574},[568,3153,3154,3156,3159,3161],{"class":570,"line":641},[568,3155,617],{"class":574},[568,3157,3158],{"class":620},"Bash(az resource list)",[568,3160,588],{"class":574},[568,3162,626],{"class":574},[568,3164,3165,3167,3170],{"class":570,"line":653},[568,3166,617],{"class":574},[568,3168,3169],{"class":620},"Bash(az account list)",[568,3171,673],{"class":574},[568,3173,3174],{"class":570,"line":665},[568,3175,679],{"class":574},[568,3177,3178,3180,3182,3184,3186],{"class":570,"line":676},[568,3179,600],{"class":574},[568,3181,1300],{"class":603},[568,3183,588],{"class":574},[568,3185,591],{"class":574},[568,3187,611],{"class":574},[568,3189,3190,3192,3195,3197],{"class":570,"line":682},[568,3191,617],{"class":574},[568,3193,3194],{"class":620},"Bash(gcloud compute instances delete *)",[568,3196,588],{"class":574},[568,3198,626],{"class":574},[568,3200,3201,3203,3206],{"class":570,"line":696},[568,3202,617],{"class":574},[568,3204,3205],{"class":620},"Bash(az vm delete *)",[568,3207,673],{"class":574},[568,3209,3210],{"class":570,"line":708},[568,3211,721],{"class":574},[568,3213,3214],{"class":570,"line":718},[568,3215,727],{"class":574},[568,3217,3218],{"class":570,"line":724},[568,3219,733],{"class":574},[199,3221,3223],{"id":3222},"_6-自定义工具skills-与-mcp","6. 自定义工具：Skills 与 MCP",[207,3225,3227],{"id":3226},"_61-skills团队内部-cli-工具封装","6.1 Skills：团队内部 CLI 工具封装",[195,3229,3230,3231,3234],{},"Skills 是 Claude Code 扩展能力的核心机制。通过创建 ",[307,3232,3233],{},"SKILL.md"," 文件，你可以将团队内部的 CLI 工具、脚本和流程封装为可复用的 AI 命令。",[195,3236,3237,305],{},[284,3238,3239],{},"Skill 文件结构",[559,3241,3246],{"className":3242,"code":3244,"language":3245},[3243],"language-text","my-skill\u002F\n├── SKILL.md           # 主指令文件（必需）\n├── template.md        # Claude 填充的模板\n├── examples\u002F\n│   └── sample.md      # 示例输出\n└── scripts\u002F\n    └── validate.sh    # 可执行脚本\n","text",[307,3247,3244],{"__ignoreMap":564},[195,3249,3250,305],{},[284,3251,3252],{},"Skill 存储位置与作用域",[215,3254,3255,3268],{},[218,3256,3257],{},[221,3258,3259,3262,3265],{},[224,3260,3261],{},"位置",[224,3263,3264],{},"路径",[224,3266,3267],{},"适用范围",[237,3269,3270,3281,3294,3307],{},[221,3271,3272,3275,3278],{},[242,3273,3274],{},"企业级",[242,3276,3277],{},"托管设置",[242,3279,3280],{},"组织内所有用户",[221,3282,3283,3286,3291],{},[242,3284,3285],{},"个人级",[242,3287,3288],{},[307,3289,3290],{},"~\u002F.claude\u002Fskills\u002F\u003Cskill-name>\u002FSKILL.md",[242,3292,3293],{},"所有项目",[221,3295,3296,3299,3304],{},[242,3297,3298],{},"项目级",[242,3300,3301],{},[307,3302,3303],{},".claude\u002Fskills\u002F\u003Cskill-name>\u002FSKILL.md",[242,3305,3306],{},"仅当前项目",[221,3308,3309,3312,3317],{},[242,3310,3311],{},"插件级",[242,3313,3314],{},[307,3315,3316],{},"\u003Cplugin>\u002Fskills\u002F\u003Cskill-name>\u002FSKILL.md",[242,3318,3319],{},"插件启用处",[195,3321,3322,305],{},[284,3323,3324],{},"封装内部部署工具的 Skill 示例",[559,3326,3330],{"className":3327,"code":3328,"language":3329,"meta":564,"style":564},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- 以下为示意性 Skill 配置，具体 frontmatter 字段请以官方文档为准 -->\n\u003C!-- https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fskills -->\n---\nname: deploy-internal\ndescription: Deploy to internal Kubernetes cluster\n---\n\nDeploy $ARGUMENTS to production:\n\n1. Run pre-deployment checks: !`our-deploy-cli validate $ARGUMENTS`\n2. Apply Kubernetes manifests: `kubectl apply -f k8s\u002F$ARGUMENTS\u002F`\n3. Wait for rollout: `kubectl rollout status deployment\u002F$ARGUMENTS`\n4. Verify health: !`our-deploy-cli health-check $ARGUMENTS`\n5. Send notification to Slack if configured\n","markdown",[307,3331,3332,3337,3342,3346,3351,3356,3360,3364,3369,3373,3388,3403,3418,3433],{"__ignoreMap":564},[568,3333,3334],{"class":570,"line":571},[568,3335,3336],{"class":750},"\u003C!-- 以下为示意性 Skill 配置，具体 frontmatter 字段请以官方文档为准 -->\n",[568,3338,3339],{"class":570,"line":578},[568,3340,3341],{"class":750},"\u003C!-- https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fskills -->\n",[568,3343,3344],{"class":570,"line":597},[568,3345,795],{"class":858},[568,3347,3348],{"class":570,"line":614},[568,3349,3350],{"class":858},"name: deploy-internal\n",[568,3352,3353],{"class":570,"line":629},[568,3354,3355],{"class":858},"description: Deploy to internal Kubernetes cluster\n",[568,3357,3358],{"class":570,"line":641},[568,3359,795],{"class":574},[568,3361,3362],{"class":570,"line":653},[568,3363,785],{"emptyLinePlaceholder":784},[568,3365,3366],{"class":570,"line":665},[568,3367,3368],{"class":858},"Deploy $ARGUMENTS to production:\n",[568,3370,3371],{"class":570,"line":676},[568,3372,785],{"emptyLinePlaceholder":784},[568,3374,3375,3378,3381,3383,3386],{"class":570,"line":682},[568,3376,3377],{"class":574},"1.",[568,3379,3380],{"class":858}," Run pre-deployment checks: !",[568,3382,892],{"class":574},[568,3384,3385],{"class":620},"our-deploy-cli validate $ARGUMENTS",[568,3387,900],{"class":574},[568,3389,3390,3393,3396,3398,3401],{"class":570,"line":696},[568,3391,3392],{"class":574},"2.",[568,3394,3395],{"class":858}," Apply Kubernetes manifests: ",[568,3397,892],{"class":574},[568,3399,3400],{"class":620},"kubectl apply -f k8s\u002F$ARGUMENTS\u002F",[568,3402,900],{"class":574},[568,3404,3405,3408,3411,3413,3416],{"class":570,"line":708},[568,3406,3407],{"class":574},"3.",[568,3409,3410],{"class":858}," Wait for rollout: ",[568,3412,892],{"class":574},[568,3414,3415],{"class":620},"kubectl rollout status deployment\u002F$ARGUMENTS",[568,3417,900],{"class":574},[568,3419,3420,3423,3426,3428,3431],{"class":570,"line":718},[568,3421,3422],{"class":574},"4.",[568,3424,3425],{"class":858}," Verify health: !",[568,3427,892],{"class":574},[568,3429,3430],{"class":620},"our-deploy-cli health-check $ARGUMENTS",[568,3432,900],{"class":574},[568,3434,3435,3438],{"class":570,"line":724},[568,3436,3437],{"class":574},"5.",[568,3439,3440],{"class":858}," Send notification to Slack if configured\n",[195,3442,3443,305],{},[284,3444,3445],{},"动态上下文注入",[195,3447,1687,3448,3451],{},[307,3449,3450],{},"!`command`"," 语法可以在 Skill 执行前运行 shell 命令，将输出注入到 Skill 内容中：",[559,3453,3455],{"className":3327,"code":3454,"language":3329,"meta":564,"style":564},"---\nname: env-status\ndescription: Check environment status\n---\n\n## Current Environment\n```!\nnode --version\nnpm --version\ngit status --short\nkubectl config current-context\n",[307,3456,3457,3461,3471,3481,3485,3489,3497,3506,3511,3516,3521],{"__ignoreMap":564},[568,3458,3459],{"class":570,"line":571},[568,3460,795],{"class":574},[568,3462,3463,3466,3468],{"class":570,"line":578},[568,3464,3465],{"class":2309},"name",[568,3467,591],{"class":574},[568,3469,3470],{"class":620}," env-status\n",[568,3472,3473,3476,3478],{"class":570,"line":597},[568,3474,3475],{"class":2309},"description",[568,3477,591],{"class":574},[568,3479,3480],{"class":620}," Check environment status\n",[568,3482,3483],{"class":570,"line":614},[568,3484,795],{"class":574},[568,3486,3487],{"class":570,"line":629},[568,3488,785],{"emptyLinePlaceholder":784},[568,3490,3491,3494],{"class":570,"line":641},[568,3492,3493],{"class":574},"## ",[568,3495,3496],{"class":603},"Current Environment\n",[568,3498,3499,3502],{"class":570,"line":653},[568,3500,3501],{"class":620},"```",[568,3503,3505],{"class":3504},"sJsPd","!\n",[568,3507,3508],{"class":570,"line":665},[568,3509,3510],{"class":3504},"node --version\n",[568,3512,3513],{"class":570,"line":676},[568,3514,3515],{"class":3504},"npm --version\n",[568,3517,3518],{"class":570,"line":682},[568,3519,3520],{"class":3504},"git status --short\n",[568,3522,3523],{"class":570,"line":696},[568,3524,3525],{"class":3504},"kubectl config current-context\n",[199,3527,3529],{"id":3528},"analysis","Analysis",[195,3531,3532],{},"Based on the above environment information, analyze...",[559,3534,3537],{"className":3535,"code":3536,"language":3245},[3243],"\n### 6.2 MCP：连接外部服务\n\nModel Context Protocol (MCP) 是连接 AI Agent 与外部工具和数据源的开放标准。\n\n**MCP 工具命名规则**：`mcp__\u003Cserver-name>__\u003Ctool-name>`\n\n**三种传输类型**：\n\n1. **stdio**（本地进程，通过 stdin\u002Fstdout 通信）：\n\n```json\n{\n  \"mcpServers\": {\n    \"github\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-github\"],\n      \"env\": {\n        \"GITHUB_TOKEN\": \"${GITHUB_TOKEN}\"\n      }\n    }\n  }\n}\n",[307,3538,3536],{"__ignoreMap":564},[3540,3541,3542],"ol",{"start":578},[300,3543,3544,3547],{},[284,3545,3546],{},"HTTP\u002FSSE","（云端托管服务）：",[559,3549,3551],{"className":561,"code":3550,"language":563,"meta":564,"style":564},"{\n  \"mcpServers\": {\n    \"remote-api\": {\n      \"type\": \"sse\",\n      \"url\": \"https:\u002F\u002Fapi.example.com\u002Fmcp\u002Fsse\",\n      \"headers\": {\n        \"Authorization\": \"Bearer ${API_TOKEN}\"\n      }\n    }\n  }\n}\n",[307,3552,3553,3557,3569,3582,3602,3622,3635,3654,3659,3663,3667],{"__ignoreMap":564},[568,3554,3555],{"class":570,"line":571},[568,3556,575],{"class":574},[568,3558,3559,3561,3563,3565,3567],{"class":570,"line":578},[568,3560,581],{"class":574},[568,3562,2172],{"class":584},[568,3564,588],{"class":574},[568,3566,591],{"class":574},[568,3568,594],{"class":574},[568,3570,3571,3573,3576,3578,3580],{"class":570,"line":597},[568,3572,600],{"class":574},[568,3574,3575],{"class":603},"remote-api",[568,3577,588],{"class":574},[568,3579,591],{"class":574},[568,3581,594],{"class":574},[568,3583,3584,3586,3589,3591,3593,3595,3598,3600],{"class":570,"line":614},[568,3585,617],{"class":574},[568,3587,3588],{"class":764},"type",[568,3590,588],{"class":574},[568,3592,591],{"class":574},[568,3594,774],{"class":574},[568,3596,3597],{"class":620},"sse",[568,3599,588],{"class":574},[568,3601,626],{"class":574},[568,3603,3604,3606,3609,3611,3613,3615,3618,3620],{"class":570,"line":629},[568,3605,617],{"class":574},[568,3607,3608],{"class":764},"url",[568,3610,588],{"class":574},[568,3612,591],{"class":574},[568,3614,774],{"class":574},[568,3616,3617],{"class":620},"https:\u002F\u002Fapi.example.com\u002Fmcp\u002Fsse",[568,3619,588],{"class":574},[568,3621,626],{"class":574},[568,3623,3624,3626,3629,3631,3633],{"class":570,"line":641},[568,3625,617],{"class":574},[568,3627,3628],{"class":764},"headers",[568,3630,588],{"class":574},[568,3632,591],{"class":574},[568,3634,594],{"class":574},[568,3636,3637,3640,3643,3645,3647,3649,3652],{"class":570,"line":653},[568,3638,3639],{"class":574},"        \"",[568,3641,3642],{"class":2309},"Authorization",[568,3644,588],{"class":574},[568,3646,591],{"class":574},[568,3648,774],{"class":574},[568,3650,3651],{"class":620},"Bearer ${API_TOKEN}",[568,3653,673],{"class":574},[568,3655,3656],{"class":570,"line":665},[568,3657,3658],{"class":574},"      }\n",[568,3660,3661],{"class":570,"line":676},[568,3662,1661],{"class":574},[568,3664,3665],{"class":570,"line":682},[568,3666,727],{"class":574},[568,3668,3669],{"class":570,"line":696},[568,3670,733],{"class":574},[3540,3672,3673],{"start":597},[300,3674,3675,3678],{},[284,3676,3677],{},"SDK 内嵌","（在应用代码中直接定义工具）",[195,3680,3681,305],{},[284,3682,3683],{},"授权访问",[559,3685,3687],{"className":2287,"code":3686,"language":2289,"meta":564,"style":564},"const options = {\n  mcpServers: { \u002F* 服务器配置 *\u002F },\n  allowedTools: [\n    \"mcp__github__*\",      \u002F\u002F GitHub 服务器的所有工具\n    \"mcp__db__query\",      \u002F\u002F db 服务器的 query 工具\n    \"mcp__slack__send_message\"\n  ]\n};\n",[307,3688,3689,3699,3714,3722,3736,3750,3759,3764],{"__ignoreMap":564},[568,3690,3691,3693,3695,3697],{"class":570,"line":571},[568,3692,2296],{"class":584},[568,3694,2299],{"class":858},[568,3696,2302],{"class":574},[568,3698,594],{"class":574},[568,3700,3701,3703,3705,3708,3711],{"class":570,"line":578},[568,3702,2310],{"class":2309},[568,3704,591],{"class":574},[568,3706,3707],{"class":574}," {",[568,3709,3710],{"class":750}," \u002F* 服务器配置 *\u002F",[568,3712,3713],{"class":574}," },\n",[568,3715,3716,3718,3720],{"class":570,"line":597},[568,3717,2384],{"class":2309},[568,3719,591],{"class":574},[568,3721,611],{"class":858},[568,3723,3724,3726,3729,3731,3733],{"class":570,"line":614},[568,3725,600],{"class":574},[568,3727,3728],{"class":620},"mcp__github__*",[568,3730,588],{"class":574},[568,3732,2249],{"class":574},[568,3734,3735],{"class":750},"      \u002F\u002F GitHub 服务器的所有工具\n",[568,3737,3738,3740,3743,3745,3747],{"class":570,"line":629},[568,3739,600],{"class":574},[568,3741,3742],{"class":620},"mcp__db__query",[568,3744,588],{"class":574},[568,3746,2249],{"class":574},[568,3748,3749],{"class":750},"      \u002F\u002F db 服务器的 query 工具\n",[568,3751,3752,3754,3757],{"class":570,"line":641},[568,3753,600],{"class":574},[568,3755,3756],{"class":620},"mcp__slack__send_message",[568,3758,673],{"class":574},[568,3760,3761],{"class":570,"line":653},[568,3762,3763],{"class":858},"  ]\n",[568,3765,3766],{"class":570,"line":665},[568,3767,2402],{"class":574},[195,3769,3770,287,3773,295],{},[284,3771,3772],{},"常用 MCP 服务器",[289,3774,3777],{"href":3775,"rel":3776},"https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers",[293],"MCP Server Directory",[297,3779,3780,3786,3792,3798,3804,3810,3816],{},[300,3781,3782,3785],{},[284,3783,3784],{},"GitHub","：仓库、Issue、PR 操作",[300,3787,3788,3791],{},[284,3789,3790],{},"Filesystem","：安全文件操作（可配置访问控制）",[300,3793,3794,3797],{},[284,3795,3796],{},"PostgreSQL \u002F SQLite","：数据库查询",[300,3799,3800,3803],{},[284,3801,3802],{},"Puppeteer","：浏览器自动化",[300,3805,3806,3809],{},[284,3807,3808],{},"Brave Search","：网络搜索",[300,3811,3812,3815],{},[284,3813,3814],{},"Slack","：消息发送",[300,3817,3818,3821],{},[284,3819,3820],{},"Git","：仓库读取、搜索、操作",[207,3823,3825],{"id":3824},"_63-为团队-cli-创建-mcp-服务器","6.3 为团队 CLI 创建 MCP 服务器",[195,3827,3828],{},"如果团队有内部 CLI 工具，可以为其创建 MCP 服务器：",[559,3830,3832],{"className":2287,"code":3831,"language":2289,"meta":564,"style":564},"\u002F\u002F 以下为示意性 MCP 服务器代码，具体 API 请以官方 SDK 文档为准\n\u002F\u002F https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fsdk\nimport { Server } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Findex.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js\";\n\nconst server = new Server({\n  name: \"internal-tools\",\n  version: \"1.0.0\"\n}, {\n  capabilities: {\n    tools: {\n      deploy_service: {\n        description: \"Deploy a service to internal infrastructure\",\n        inputSchema: {\n          type: \"object\",\n          properties: {\n            service: { type: \"string\" },\n            environment: { type: \"string\", enum: [\"staging\", \"prod\"] }\n          },\n          required: [\"service\", \"environment\"]\n        }\n      }\n    }\n  }\n});\n\n\u002F\u002F 处理工具调用\nserver.setRequestHandler(\"tools\u002Fcall\", async (request) => {\n  if (request.params.name === \"deploy_service\") {\n    const { service, environment } = request.params.arguments;\n    \u002F\u002F 调用内部部署 API\n    const result = await internalDeploy(service, environment);\n    return { content: [{ type: \"text\", text: result }] };\n  }\n});\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n",[307,3833,3834,3839,3844,3871,3893,3897,3916,3932,3946,3953,3962,3971,3980,3996,4005,4021,4030,4053,4102,4107,4134,4139,4143,4147,4151,4161,4165,4171,4211,4245,4280,4286,4314,4357,4362,4371,4376,4395],{"__ignoreMap":564},[568,3835,3836],{"class":570,"line":571},[568,3837,3838],{"class":750},"\u002F\u002F 以下为示意性 MCP 服务器代码，具体 API 请以官方 SDK 文档为准\n",[568,3840,3841],{"class":570,"line":578},[568,3842,3843],{"class":750},"\u002F\u002F https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fsdk\n",[568,3845,3846,3850,3852,3855,3858,3861,3863,3866,3868],{"class":570,"line":597},[568,3847,3849],{"class":3848},"s7zQu","import",[568,3851,3707],{"class":574},[568,3853,3854],{"class":858}," Server",[568,3856,3857],{"class":574}," }",[568,3859,3860],{"class":3848}," from",[568,3862,774],{"class":574},[568,3864,3865],{"class":620},"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Findex.js",[568,3867,588],{"class":574},[568,3869,3870],{"class":574},";\n",[568,3872,3873,3875,3877,3880,3882,3884,3886,3889,3891],{"class":570,"line":614},[568,3874,3849],{"class":3848},[568,3876,3707],{"class":574},[568,3878,3879],{"class":858}," StdioServerTransport",[568,3881,3857],{"class":574},[568,3883,3860],{"class":3848},[568,3885,774],{"class":574},[568,3887,3888],{"class":620},"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js",[568,3890,588],{"class":574},[568,3892,3870],{"class":574},[568,3894,3895],{"class":570,"line":629},[568,3896,785],{"emptyLinePlaceholder":784},[568,3898,3899,3901,3904,3906,3909,3912,3914],{"class":570,"line":641},[568,3900,2296],{"class":584},[568,3902,3903],{"class":858}," server ",[568,3905,2302],{"class":574},[568,3907,3908],{"class":574}," new",[568,3910,3854],{"class":3911},"s2Zo4",[568,3913,853],{"class":858},[568,3915,575],{"class":574},[568,3917,3918,3921,3923,3925,3928,3930],{"class":570,"line":653},[568,3919,3920],{"class":2309},"  name",[568,3922,591],{"class":574},[568,3924,774],{"class":574},[568,3926,3927],{"class":620},"internal-tools",[568,3929,588],{"class":574},[568,3931,626],{"class":574},[568,3933,3934,3937,3939,3941,3944],{"class":570,"line":665},[568,3935,3936],{"class":2309},"  version",[568,3938,591],{"class":574},[568,3940,774],{"class":574},[568,3942,3943],{"class":620},"1.0.0",[568,3945,673],{"class":574},[568,3947,3948,3951],{"class":570,"line":676},[568,3949,3950],{"class":574},"},",[568,3952,594],{"class":574},[568,3954,3955,3958,3960],{"class":570,"line":682},[568,3956,3957],{"class":2309},"  capabilities",[568,3959,591],{"class":574},[568,3961,594],{"class":574},[568,3963,3964,3967,3969],{"class":570,"line":696},[568,3965,3966],{"class":2309},"    tools",[568,3968,591],{"class":574},[568,3970,594],{"class":574},[568,3972,3973,3976,3978],{"class":570,"line":708},[568,3974,3975],{"class":2309},"      deploy_service",[568,3977,591],{"class":574},[568,3979,594],{"class":574},[568,3981,3982,3985,3987,3989,3992,3994],{"class":570,"line":718},[568,3983,3984],{"class":2309},"        description",[568,3986,591],{"class":574},[568,3988,774],{"class":574},[568,3990,3991],{"class":620},"Deploy a service to internal infrastructure",[568,3993,588],{"class":574},[568,3995,626],{"class":574},[568,3997,3998,4001,4003],{"class":570,"line":724},[568,3999,4000],{"class":2309},"        inputSchema",[568,4002,591],{"class":574},[568,4004,594],{"class":574},[568,4006,4007,4010,4012,4014,4017,4019],{"class":570,"line":730},[568,4008,4009],{"class":2309},"          type",[568,4011,591],{"class":574},[568,4013,774],{"class":574},[568,4015,4016],{"class":620},"object",[568,4018,588],{"class":574},[568,4020,626],{"class":574},[568,4022,4023,4026,4028],{"class":570,"line":923},[568,4024,4025],{"class":2309},"          properties",[568,4027,591],{"class":574},[568,4029,594],{"class":574},[568,4031,4032,4035,4037,4039,4042,4044,4046,4049,4051],{"class":570,"line":945},[568,4033,4034],{"class":2309},"            service",[568,4036,591],{"class":574},[568,4038,3707],{"class":574},[568,4040,4041],{"class":2309}," type",[568,4043,591],{"class":574},[568,4045,774],{"class":574},[568,4047,4048],{"class":620},"string",[568,4050,588],{"class":574},[568,4052,3713],{"class":574},[568,4054,4055,4058,4060,4062,4064,4066,4068,4070,4072,4074,4077,4079,4081,4083,4086,4088,4090,4092,4095,4097,4100],{"class":570,"line":950},[568,4056,4057],{"class":2309},"            environment",[568,4059,591],{"class":574},[568,4061,3707],{"class":574},[568,4063,4041],{"class":2309},[568,4065,591],{"class":574},[568,4067,774],{"class":574},[568,4069,4048],{"class":620},[568,4071,588],{"class":574},[568,4073,2249],{"class":574},[568,4075,4076],{"class":2309}," enum",[568,4078,591],{"class":574},[568,4080,1645],{"class":858},[568,4082,588],{"class":574},[568,4084,4085],{"class":620},"staging",[568,4087,588],{"class":574},[568,4089,2249],{"class":574},[568,4091,774],{"class":574},[568,4093,4094],{"class":620},"prod",[568,4096,588],{"class":574},[568,4098,4099],{"class":858},"] ",[568,4101,733],{"class":574},[568,4103,4104],{"class":570,"line":956},[568,4105,4106],{"class":574},"          },\n",[568,4108,4109,4112,4114,4116,4118,4121,4123,4125,4127,4130,4132],{"class":570,"line":1590},[568,4110,4111],{"class":2309},"          required",[568,4113,591],{"class":574},[568,4115,1645],{"class":858},[568,4117,588],{"class":574},[568,4119,4120],{"class":620},"service",[568,4122,588],{"class":574},[568,4124,2249],{"class":574},[568,4126,774],{"class":574},[568,4128,4129],{"class":620},"environment",[568,4131,588],{"class":574},[568,4133,1655],{"class":858},[568,4135,4136],{"class":570,"line":1604},[568,4137,4138],{"class":574},"        }\n",[568,4140,4141],{"class":570,"line":1619},[568,4142,3658],{"class":574},[568,4144,4145],{"class":570,"line":1633},[568,4146,1661],{"class":574},[568,4148,4149],{"class":570,"line":1658},[568,4150,727],{"class":574},[568,4152,4153,4156,4159],{"class":570,"line":1664},[568,4154,4155],{"class":574},"}",[568,4157,4158],{"class":858},")",[568,4160,3870],{"class":574},[568,4162,4163],{"class":570,"line":1669},[568,4164,785],{"emptyLinePlaceholder":784},[568,4166,4168],{"class":570,"line":4167},27,[568,4169,4170],{"class":750},"\u002F\u002F 处理工具调用\n",[568,4172,4174,4177,4180,4183,4185,4187,4190,4192,4194,4197,4200,4204,4206,4209],{"class":570,"line":4173},28,[568,4175,4176],{"class":858},"server",[568,4178,4179],{"class":574},".",[568,4181,4182],{"class":3911},"setRequestHandler",[568,4184,853],{"class":858},[568,4186,588],{"class":574},[568,4188,4189],{"class":620},"tools\u002Fcall",[568,4191,588],{"class":574},[568,4193,2249],{"class":574},[568,4195,4196],{"class":584}," async",[568,4198,4199],{"class":574}," (",[568,4201,4203],{"class":4202},"sHdIc","request",[568,4205,4158],{"class":574},[568,4207,4208],{"class":584}," =>",[568,4210,594],{"class":574},[568,4212,4214,4217,4219,4221,4223,4226,4228,4230,4233,4235,4238,4240,4243],{"class":570,"line":4213},29,[568,4215,4216],{"class":3848},"  if",[568,4218,4199],{"class":2309},[568,4220,4203],{"class":858},[568,4222,4179],{"class":574},[568,4224,4225],{"class":858},"params",[568,4227,4179],{"class":574},[568,4229,3465],{"class":858},[568,4231,4232],{"class":574}," ===",[568,4234,774],{"class":574},[568,4236,4237],{"class":620},"deploy_service",[568,4239,588],{"class":574},[568,4241,4242],{"class":2309},") ",[568,4244,575],{"class":574},[568,4246,4248,4251,4253,4256,4258,4261,4263,4266,4269,4271,4273,4275,4278],{"class":570,"line":4247},30,[568,4249,4250],{"class":584},"    const",[568,4252,3707],{"class":574},[568,4254,4255],{"class":858}," service",[568,4257,2249],{"class":574},[568,4259,4260],{"class":858}," environment",[568,4262,3857],{"class":574},[568,4264,4265],{"class":574}," =",[568,4267,4268],{"class":858}," request",[568,4270,4179],{"class":574},[568,4272,4225],{"class":858},[568,4274,4179],{"class":574},[568,4276,4277],{"class":858},"arguments",[568,4279,3870],{"class":574},[568,4281,4283],{"class":570,"line":4282},31,[568,4284,4285],{"class":750},"    \u002F\u002F 调用内部部署 API\n",[568,4287,4289,4291,4294,4296,4299,4302,4304,4306,4308,4310,4312],{"class":570,"line":4288},32,[568,4290,4250],{"class":584},[568,4292,4293],{"class":858}," result",[568,4295,4265],{"class":574},[568,4297,4298],{"class":3848}," await",[568,4300,4301],{"class":3911}," internalDeploy",[568,4303,853],{"class":2309},[568,4305,4120],{"class":858},[568,4307,2249],{"class":574},[568,4309,4260],{"class":858},[568,4311,4158],{"class":2309},[568,4313,3870],{"class":574},[568,4315,4317,4320,4322,4325,4327,4329,4332,4334,4336,4338,4340,4342,4344,4347,4349,4351,4353,4355],{"class":570,"line":4316},33,[568,4318,4319],{"class":3848},"    return",[568,4321,3707],{"class":574},[568,4323,4324],{"class":2309}," content",[568,4326,591],{"class":574},[568,4328,1645],{"class":2309},[568,4330,4331],{"class":574},"{",[568,4333,4041],{"class":2309},[568,4335,591],{"class":574},[568,4337,774],{"class":574},[568,4339,3245],{"class":620},[568,4341,588],{"class":574},[568,4343,2249],{"class":574},[568,4345,4346],{"class":2309}," text",[568,4348,591],{"class":574},[568,4350,4293],{"class":858},[568,4352,3857],{"class":574},[568,4354,4099],{"class":2309},[568,4356,2402],{"class":574},[568,4358,4360],{"class":570,"line":4359},34,[568,4361,727],{"class":574},[568,4363,4365,4367,4369],{"class":570,"line":4364},35,[568,4366,4155],{"class":574},[568,4368,4158],{"class":858},[568,4370,3870],{"class":574},[568,4372,4374],{"class":570,"line":4373},36,[568,4375,785],{"emptyLinePlaceholder":784},[568,4377,4379,4381,4384,4386,4388,4390,4393],{"class":570,"line":4378},37,[568,4380,2296],{"class":584},[568,4382,4383],{"class":858}," transport ",[568,4385,2302],{"class":574},[568,4387,3908],{"class":574},[568,4389,3879],{"class":3911},[568,4391,4392],{"class":858},"()",[568,4394,3870],{"class":574},[568,4396,4398,4401,4404,4406,4409,4412],{"class":570,"line":4397},38,[568,4399,4400],{"class":3848},"await",[568,4402,4403],{"class":858}," server",[568,4405,4179],{"class":574},[568,4407,4408],{"class":3911},"connect",[568,4410,4411],{"class":858},"(transport)",[568,4413,3870],{"class":574},[199,4415,4417],{"id":4416},"_7-安全执行机制","7. 安全执行机制",[207,4419,4421],{"id":4420},"_71-权限规则系统","7.1 权限规则系统",[195,4423,4424,4425,4428],{},"权限规则按 ",[284,4426,4427],{},"deny -> ask -> allow"," 顺序评估，第一个匹配的规则生效。",[195,4430,4431,305],{},[284,4432,4433],{},"规则语法",[559,4435,4437],{"className":561,"code":4436,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(npm run *)\",\n      \"Bash(git commit *)\",\n      \"Bash(* --version)\",\n      \"Read(.\u002Fsrc\u002F**)\",\n      \"Edit(\u002Fdocs\u002F**)\",\n      \"WebFetch(domain:example.com)\"\n    ],\n    \"ask\": [\n      \"Bash(git push *)\",\n      \"Bash(docker *)\"\n    ],\n    \"deny\": [\n      \"Bash(rm -rf \u002F)\",\n      \"Bash(curl *)\",\n      \"Read(~\u002F.ssh\u002F**)\",\n      \"Read(\u002F\u002Fetc\u002Fpasswd)\"\n    ]\n  }\n}\n",[307,4438,4439,4443,4455,4467,4477,4488,4499,4510,4521,4530,4534,4546,4557,4566,4570,4582,4593,4604,4615,4624,4628,4632],{"__ignoreMap":564},[568,4440,4441],{"class":570,"line":571},[568,4442,575],{"class":574},[568,4444,4445,4447,4449,4451,4453],{"class":570,"line":578},[568,4446,581],{"class":574},[568,4448,585],{"class":584},[568,4450,588],{"class":574},[568,4452,591],{"class":574},[568,4454,594],{"class":574},[568,4456,4457,4459,4461,4463,4465],{"class":570,"line":597},[568,4458,600],{"class":574},[568,4460,604],{"class":603},[568,4462,588],{"class":574},[568,4464,591],{"class":574},[568,4466,611],{"class":574},[568,4468,4469,4471,4473,4475],{"class":570,"line":614},[568,4470,617],{"class":574},[568,4472,1020],{"class":620},[568,4474,588],{"class":574},[568,4476,626],{"class":574},[568,4478,4479,4481,4484,4486],{"class":570,"line":629},[568,4480,617],{"class":574},[568,4482,4483],{"class":620},"Bash(git commit *)",[568,4485,588],{"class":574},[568,4487,626],{"class":574},[568,4489,4490,4492,4495,4497],{"class":570,"line":641},[568,4491,617],{"class":574},[568,4493,4494],{"class":620},"Bash(* --version)",[568,4496,588],{"class":574},[568,4498,626],{"class":574},[568,4500,4501,4503,4506,4508],{"class":570,"line":653},[568,4502,617],{"class":574},[568,4504,4505],{"class":620},"Read(.\u002Fsrc\u002F**)",[568,4507,588],{"class":574},[568,4509,626],{"class":574},[568,4511,4512,4514,4517,4519],{"class":570,"line":665},[568,4513,617],{"class":574},[568,4515,4516],{"class":620},"Edit(\u002Fdocs\u002F**)",[568,4518,588],{"class":574},[568,4520,626],{"class":574},[568,4522,4523,4525,4528],{"class":570,"line":676},[568,4524,617],{"class":574},[568,4526,4527],{"class":620},"WebFetch(domain:example.com)",[568,4529,673],{"class":574},[568,4531,4532],{"class":570,"line":682},[568,4533,679],{"class":574},[568,4535,4536,4538,4540,4542,4544],{"class":570,"line":696},[568,4537,600],{"class":574},[568,4539,1300],{"class":603},[568,4541,588],{"class":574},[568,4543,591],{"class":574},[568,4545,611],{"class":574},[568,4547,4548,4550,4553,4555],{"class":570,"line":708},[568,4549,617],{"class":574},[568,4551,4552],{"class":620},"Bash(git push *)",[568,4554,588],{"class":574},[568,4556,626],{"class":574},[568,4558,4559,4561,4564],{"class":570,"line":718},[568,4560,617],{"class":574},[568,4562,4563],{"class":620},"Bash(docker *)",[568,4565,673],{"class":574},[568,4567,4568],{"class":570,"line":724},[568,4569,679],{"class":574},[568,4571,4572,4574,4576,4578,4580],{"class":570,"line":730},[568,4573,600],{"class":574},[568,4575,687],{"class":603},[568,4577,588],{"class":574},[568,4579,591],{"class":574},[568,4581,611],{"class":574},[568,4583,4584,4586,4589,4591],{"class":570,"line":923},[568,4585,617],{"class":574},[568,4587,4588],{"class":620},"Bash(rm -rf \u002F)",[568,4590,588],{"class":574},[568,4592,626],{"class":574},[568,4594,4595,4597,4600,4602],{"class":570,"line":945},[568,4596,617],{"class":574},[568,4598,4599],{"class":620},"Bash(curl *)",[568,4601,588],{"class":574},[568,4603,626],{"class":574},[568,4605,4606,4608,4611,4613],{"class":570,"line":950},[568,4607,617],{"class":574},[568,4609,4610],{"class":620},"Read(~\u002F.ssh\u002F**)",[568,4612,588],{"class":574},[568,4614,626],{"class":574},[568,4616,4617,4619,4622],{"class":570,"line":956},[568,4618,617],{"class":574},[568,4620,4621],{"class":620},"Read(\u002F\u002Fetc\u002Fpasswd)",[568,4623,673],{"class":574},[568,4625,4626],{"class":570,"line":1590},[568,4627,721],{"class":574},[568,4629,4630],{"class":570,"line":1604},[568,4631,727],{"class":574},[568,4633,4634],{"class":570,"line":1619},[568,4635,733],{"class":574},[195,4637,4638,305],{},[284,4639,4640],{},"路径模式类型",[215,4642,4643,4655],{},[218,4644,4645],{},[221,4646,4647,4650,4653],{},[224,4648,4649],{},"模式",[224,4651,4652],{},"含义",[224,4654,229],{},[237,4656,4657,4672,4687,4702],{},[221,4658,4659,4664,4667],{},[242,4660,4661],{},[307,4662,4663],{},"\u002F\u002Fpath",[242,4665,4666],{},"绝对路径",[242,4668,4669],{},[307,4670,4671],{},"Read(\u002F\u002FUsers\u002Falice\u002Fsecrets\u002F**)",[221,4673,4674,4679,4682],{},[242,4675,4676],{},[307,4677,4678],{},"~\u002Fpath",[242,4680,4681],{},"用户主目录",[242,4683,4684],{},[307,4685,4686],{},"Read(~\u002FDocuments\u002F*.pdf)",[221,4688,4689,4694,4697],{},[242,4690,4691],{},[307,4692,4693],{},"\u002Fpath",[242,4695,4696],{},"项目根目录相对",[242,4698,4699],{},[307,4700,4701],{},"Edit(\u002Fsrc\u002F**\u002F*.ts)",[221,4703,4704,4713,4716],{},[242,4705,4706,4709,4710],{},[307,4707,4708],{},"path"," 或 ",[307,4711,4712],{},".\u002Fpath",[242,4714,4715],{},"当前目录相对",[242,4717,4718],{},[307,4719,4720],{},"Read(*.env)",[195,4722,4723,305],{},[284,4724,4725],{},"通配符规则",[297,4727,4728,4734,4748],{},[300,4729,4730,4733],{},[307,4731,4732],{},"*"," 可匹配任意字符序列，包括空格",[300,4735,4736,4739,4740,4743,4744,4747],{},[307,4737,4738],{},"Bash(ls *)"," 匹配 ",[307,4741,4742],{},"ls -la"," 但不匹配 ",[307,4745,4746],{},"lsof","（有空格时要求词边界）",[300,4749,4750,4739,4753,4755,4756,4758],{},[307,4751,4752],{},"Bash(ls*)",[307,4754,4742],{}," 和 ",[307,4757,4746],{},"（无词边界约束）",[195,4760,4761,305],{},[284,4762,4763],{},"进程包装器剥离",[297,4765,4766,4785,4795],{},[300,4767,4768,4769,379,4772,379,4775,379,4778,379,4781,4784],{},"Claude Code 会自动剥离 ",[307,4770,4771],{},"timeout",[307,4773,4774],{},"time",[307,4776,4777],{},"nice",[307,4779,4780],{},"nohup",[307,4782,4783],{},"stdbuf"," 等包装器",[300,4786,4787,4788,4791,4792],{},"因此 ",[307,4789,4790],{},"Bash(npm test *)"," 也会匹配 ",[307,4793,4794],{},"timeout 30 npm test",[300,4796,4797,4798,379,4801,379,4804,379,4807,379,4809,4811],{},"但 ",[307,4799,4800],{},"direnv exec",[307,4802,4803],{},"devbox run",[307,4805,4806],{},"mise exec",[307,4808,2222],{},[307,4810,1386],{}," 不在剥离列表中",[207,4813,4815],{"id":4814},"_72-沙箱隔离","7.2 沙箱隔离",[195,4817,4818,4819,4824],{},"沙箱通过操作系统级原语实现文件系统和网络隔离（来源：",[289,4820,4823],{"href":4821,"rel":4822},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fsandboxing",[293],"Claude Code Docs - Sandboxing","）。",[195,4826,4827,305],{},[284,4828,4829],{},"文件系统隔离",[297,4831,4832,4835,4838],{},[300,4833,4834],{},"默认写入：当前工作目录及其子目录",[300,4836,4837],{},"默认读取：整台计算机（除特定拒绝目录外）",[300,4839,4840],{},"无法修改工作目录外的文件（除非显式授权）",[195,4842,4843,305],{},[284,4844,4845],{},"网络隔离",[297,4847,4848,4851,4858],{},[300,4849,4850],{},"仅允许访问批准的域名",[300,4852,4853,4854,4857],{},"新域名请求触发权限提示（除非启用 ",[307,4855,4856],{},"allowManagedDomainsOnly","）",[300,4859,4860],{},"限制适用于所有脚本、程序和子进程",[195,4862,4863,305],{},[284,4864,4865],{},"OS 级执行",[297,4867,4868,4871,4874],{},[300,4869,4870],{},"macOS：使用 Seatbelt 框架",[300,4872,4873],{},"Linux：使用 bubblewrap",[300,4875,4876],{},"WSL2：使用 bubblewrap（WSL1 不支持）",[195,4878,4879,305],{},[284,4880,4881],{},"启用沙箱",[559,4883,4885],{"className":741,"code":4884,"language":743,"meta":564,"style":564},"# 交互式启用\n\u002Fsandbox\n\n# 或在 settings.json 中配置\n{\n  \"sandbox\": {\n    \"enabled\": true,\n    \"mode\": \"autoAllow\",\n    \"filesystem\": {\n      \"allowWrite\": [\"~\u002F.kube\", \"\u002Ftmp\u002Fbuild\", \".\u002Foutput\"]\n    },\n    \"network\": {\n      \"allowedDomains\": [\"npmjs.org\", \"github.com\", \"registry.npmjs.org\"]\n    }\n  }\n}\n",[307,4886,4887,4892,4897,4901,4906,4910,4919,4931,4947,4956,4992,4999,5008,5044,5048,5052],{"__ignoreMap":564},[568,4888,4889],{"class":570,"line":571},[568,4890,4891],{"class":750},"# 交互式启用\n",[568,4893,4894],{"class":570,"line":578},[568,4895,4896],{"class":603},"\u002Fsandbox\n",[568,4898,4899],{"class":570,"line":597},[568,4900,785],{"emptyLinePlaceholder":784},[568,4902,4903],{"class":570,"line":614},[568,4904,4905],{"class":750},"# 或在 settings.json 中配置\n",[568,4907,4908],{"class":570,"line":629},[568,4909,575],{"class":574},[568,4911,4912,4915,4917],{"class":570,"line":641},[568,4913,4914],{"class":603},"  \"sandbox\"",[568,4916,591],{"class":3911},[568,4918,594],{"class":620},[568,4920,4921,4924,4926,4929],{"class":570,"line":653},[568,4922,4923],{"class":603},"    \"enabled\"",[568,4925,591],{"class":3911},[568,4927,4928],{"class":574}," true",[568,4930,626],{"class":620},[568,4932,4933,4936,4938,4940,4943,4945],{"class":570,"line":665},[568,4934,4935],{"class":603},"    \"mode\"",[568,4937,591],{"class":3911},[568,4939,774],{"class":574},[568,4941,4942],{"class":620},"autoAllow",[568,4944,588],{"class":574},[568,4946,626],{"class":620},[568,4948,4949,4952,4954],{"class":570,"line":676},[568,4950,4951],{"class":603},"    \"filesystem\"",[568,4953,591],{"class":3911},[568,4955,594],{"class":620},[568,4957,4958,4961,4963,4965,4967,4969,4971,4974,4976,4979,4981,4983,4985,4988,4990],{"class":570,"line":682},[568,4959,4960],{"class":603},"      \"allowWrite\"",[568,4962,591],{"class":3911},[568,4964,1645],{"class":858},[568,4966,588],{"class":574},[568,4968,1650],{"class":620},[568,4970,588],{"class":574},[568,4972,4973],{"class":858},", ",[568,4975,588],{"class":574},[568,4977,4978],{"class":620},"\u002Ftmp\u002Fbuild",[568,4980,588],{"class":574},[568,4982,2249],{"class":620},[568,4984,774],{"class":574},[568,4986,4987],{"class":620},".\u002Foutput",[568,4989,588],{"class":574},[568,4991,1655],{"class":620},[568,4993,4994,4997],{"class":570,"line":696},[568,4995,4996],{"class":574},"    }",[568,4998,626],{"class":858},[568,5000,5001,5004,5006],{"class":570,"line":708},[568,5002,5003],{"class":603},"    \"network\"",[568,5005,591],{"class":3911},[568,5007,594],{"class":620},[568,5009,5010,5013,5015,5017,5019,5022,5024,5026,5028,5031,5033,5035,5037,5040,5042],{"class":570,"line":718},[568,5011,5012],{"class":603},"      \"allowedDomains\"",[568,5014,591],{"class":3911},[568,5016,1645],{"class":858},[568,5018,588],{"class":574},[568,5020,5021],{"class":620},"npmjs.org",[568,5023,588],{"class":574},[568,5025,4973],{"class":858},[568,5027,588],{"class":574},[568,5029,5030],{"class":620},"github.com",[568,5032,588],{"class":574},[568,5034,2249],{"class":620},[568,5036,774],{"class":574},[568,5038,5039],{"class":620},"registry.npmjs.org",[568,5041,588],{"class":574},[568,5043,1655],{"class":620},[568,5045,5046],{"class":570,"line":724},[568,5047,1661],{"class":858},[568,5049,5050],{"class":570,"line":730},[568,5051,727],{"class":858},[568,5053,5054],{"class":570,"line":923},[568,5055,733],{"class":858},[195,5057,5058,305],{},[284,5059,5060],{},"沙箱模式",[215,5062,5063,5072],{},[218,5064,5065],{},[221,5066,5067,5069],{},[224,5068,4649],{},[224,5070,5071],{},"说明",[237,5073,5074,5083],{},[221,5075,5076,5080],{},[242,5077,5078],{},[307,5079,4942],{},[242,5081,5082],{},"沙箱内命令自动允许，无需提示；无法沙箱化的命令回退到常规权限流程",[221,5084,5085,5090],{},[242,5086,5087],{},[307,5088,5089],{},"regularPermissions",[242,5091,5092],{},"即使沙箱化，所有命令仍需标准权限确认",[195,5094,5095,305],{},[284,5096,5097],{},"路径前缀解析",[215,5099,5100,5111],{},[218,5101,5102],{},[221,5103,5104,5107,5109],{},[224,5105,5106],{},"前缀",[224,5108,4652],{},[224,5110,229],{},[237,5112,5113,5130,5148],{},[221,5114,5115,5120,5123],{},[242,5116,5117],{},[307,5118,5119],{},"\u002F",[242,5121,5122],{},"文件系统根目录绝对路径",[242,5124,5125,5127,5128],{},[307,5126,4978],{}," 保持 ",[307,5129,4978],{},[221,5131,5132,5137,5140],{},[242,5133,5134],{},[307,5135,5136],{},"~\u002F",[242,5138,5139],{},"相对于主目录",[242,5141,5142,5144,5145],{},[307,5143,1650],{}," 解析为 ",[307,5146,5147],{},"$HOME\u002F.kube",[221,5149,5150,5156,5162],{},[242,5151,5152,5155],{},[307,5153,5154],{},".\u002F"," 或无前缀",[242,5157,5158,5159],{},"项目设置中相对于项目根；用户设置中相对于 ",[307,5160,5161],{},"~\u002F.claude",[242,5163,5164,5144,5166],{},[307,5165,4987],{},[307,5167,5168],{},"\u003Cproject-root>\u002Foutput",[207,5170,5172],{"id":5171},"_73-权限模式","7.3 权限模式",[215,5174,5175,5186],{},[218,5176,5177],{},[221,5178,5179,5181,5183],{},[224,5180,4649],{},[224,5182,5071],{},[224,5184,5185],{},"适用场景",[237,5187,5188,5201,5214,5227,5240,5253],{},[221,5189,5190,5195,5198],{},[242,5191,5192],{},[307,5193,5194],{},"default",[242,5196,5197],{},"首次使用每个工具时提示权限",[242,5199,5200],{},"日常开发",[221,5202,5203,5208,5211],{},[242,5204,5205],{},[307,5206,5207],{},"acceptEdits",[242,5209,5210],{},"自动接受文件编辑和常见文件系统命令",[242,5212,5213],{},"信任编辑的场景",[221,5215,5216,5221,5224],{},[242,5217,5218],{},[307,5219,5220],{},"plan",[242,5222,5223],{},"仅分析不修改或执行",[242,5225,5226],{},"代码评审",[221,5228,5229,5234,5237],{},[242,5230,5231],{},[307,5232,5233],{},"auto",[242,5235,5236],{},"ML 分类器评估每个动作的风险，自动批准低风险操作",[242,5238,5239],{},"需理解其判断逻辑",[221,5241,5242,5247,5250],{},[242,5243,5244],{},[307,5245,5246],{},"dontAsk",[242,5248,5249],{},"未预批准的工具自动拒绝",[242,5251,5252],{},"锁定环境",[221,5254,5255,5260,5263],{},[242,5256,5257],{},[307,5258,5259],{},"bypassPermissions",[242,5261,5262],{},"跳过权限提示（谨慎使用）",[242,5264,5265],{},"完全受信环境",[207,5267,5269],{"id":5268},"_74-hooks自动化安全护栏","7.4 Hooks：自动化安全护栏",[195,5271,5272,5273,4824],{},"Hooks 是在 Claude Code 生命周期关键点执行的自定义命令，可用于实现安全护栏（来源：",[289,5274,5277],{"href":5275,"rel":5276},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fhooks",[293],"Claude Code Docs - Hooks",[195,5279,5280,305],{},[284,5281,5282],{},"核心 Hook 事件",[297,5284,5285,5291,5297,5303],{},[300,5286,5287,5290],{},[307,5288,5289],{},"PreToolUse","：工具使用前执行，可拦截危险操作",[300,5292,5293,5296],{},[307,5294,5295],{},"PostToolUse","：工具使用后执行，可记录审计日志",[300,5298,5299,5302],{},[307,5300,5301],{},"Stop","：Agent 停止时执行",[300,5304,5305,5308],{},[307,5306,5307],{},"Notification","：发送通知时执行",[195,5310,5311,305],{},[284,5312,5313],{},"Hook 决策机制",[215,5315,5316,5326],{},[218,5317,5318],{},[221,5319,5320,5323],{},[224,5321,5322],{},"退出码",[224,5324,5325],{},"行为",[237,5327,5328,5336,5344],{},[221,5329,5330,5333],{},[242,5331,5332],{},"0",[242,5334,5335],{},"允许工具调用继续",[221,5337,5338,5341],{},[242,5339,5340],{},"1",[242,5342,5343],{},"强制显示权限提示",[221,5345,5346,5349],{},[242,5347,5348],{},"2",[242,5350,5351],{},"阻止工具调用",[195,5353,5354,305],{},[284,5355,5356],{},"拦截危险命令的 Hook 示例",[559,5358,5360],{"className":561,"code":5359,"language":563,"meta":564,"style":564},"\u002F\u002F Hooks 格式请以官方文档为准: https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fhooks\n{\n  \"hooks\": {\n    \"PreToolUse\": [\n      {\n        \"matcher\": \"Bash(rm -rf \u002F*|DROP TABLE|DELETE FROM.*WHERE)\",\n        \"hook\": \"echo 'Dangerous command blocked' && exit 2\"\n      }\n    ]\n  }\n}\n",[307,5361,5362,5367,5371,5384,5396,5401,5421,5439,5443,5447,5451],{"__ignoreMap":564},[568,5363,5364],{"class":570,"line":571},[568,5365,5366],{"class":750},"\u002F\u002F Hooks 格式请以官方文档为准: https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fhooks\n",[568,5368,5369],{"class":570,"line":578},[568,5370,575],{"class":574},[568,5372,5373,5375,5378,5380,5382],{"class":570,"line":597},[568,5374,581],{"class":574},[568,5376,5377],{"class":584},"hooks",[568,5379,588],{"class":574},[568,5381,591],{"class":574},[568,5383,594],{"class":574},[568,5385,5386,5388,5390,5392,5394],{"class":570,"line":614},[568,5387,600],{"class":574},[568,5389,5289],{"class":603},[568,5391,588],{"class":574},[568,5393,591],{"class":574},[568,5395,611],{"class":574},[568,5397,5398],{"class":570,"line":629},[568,5399,5400],{"class":574},"      {\n",[568,5402,5403,5405,5408,5410,5412,5414,5417,5419],{"class":570,"line":641},[568,5404,3639],{"class":574},[568,5406,5407],{"class":764},"matcher",[568,5409,588],{"class":574},[568,5411,591],{"class":574},[568,5413,774],{"class":574},[568,5415,5416],{"class":620},"Bash(rm -rf \u002F*|DROP TABLE|DELETE FROM.*WHERE)",[568,5418,588],{"class":574},[568,5420,626],{"class":574},[568,5422,5423,5425,5428,5430,5432,5434,5437],{"class":570,"line":653},[568,5424,3639],{"class":574},[568,5426,5427],{"class":764},"hook",[568,5429,588],{"class":574},[568,5431,591],{"class":574},[568,5433,774],{"class":574},[568,5435,5436],{"class":620},"echo 'Dangerous command blocked' && exit 2",[568,5438,673],{"class":574},[568,5440,5441],{"class":570,"line":665},[568,5442,3658],{"class":574},[568,5444,5445],{"class":570,"line":676},[568,5446,721],{"class":574},[568,5448,5449],{"class":570,"line":682},[568,5450,727],{"class":574},[568,5452,5453],{"class":570,"line":696},[568,5454,733],{"class":574},[195,5456,5457,305],{},[284,5458,5459],{},"记录审计日志的 Hook",[559,5461,5463],{"className":561,"code":5462,"language":563,"meta":564,"style":564},"{\n  \"hooks\": [\n    {\n      \"event\": \"PostToolUse\",\n      \"command\": \"echo \\\"$(date -Iseconds) $(jq -r '.tool_name' \u002Fdev\u002Fstdin)\\\" >> ~\u002F.claude\u002Faudit.log\"\n    }\n  ]\n}\n",[307,5464,5465,5469,5481,5486,5505,5533,5537,5541],{"__ignoreMap":564},[568,5466,5467],{"class":570,"line":571},[568,5468,575],{"class":574},[568,5470,5471,5473,5475,5477,5479],{"class":570,"line":578},[568,5472,581],{"class":574},[568,5474,5377],{"class":584},[568,5476,588],{"class":574},[568,5478,591],{"class":574},[568,5480,611],{"class":574},[568,5482,5483],{"class":570,"line":597},[568,5484,5485],{"class":574},"    {\n",[568,5487,5488,5490,5493,5495,5497,5499,5501,5503],{"class":570,"line":614},[568,5489,617],{"class":574},[568,5491,5492],{"class":603},"event",[568,5494,588],{"class":574},[568,5496,591],{"class":574},[568,5498,774],{"class":574},[568,5500,5295],{"class":620},[568,5502,588],{"class":574},[568,5504,626],{"class":574},[568,5506,5507,5509,5511,5513,5515,5517,5520,5523,5526,5528,5531],{"class":570,"line":629},[568,5508,617],{"class":574},[568,5510,2213],{"class":603},[568,5512,588],{"class":574},[568,5514,591],{"class":574},[568,5516,774],{"class":574},[568,5518,5519],{"class":620},"echo ",[568,5521,5522],{"class":858},"\\\"",[568,5524,5525],{"class":620},"$(date -Iseconds) $(jq -r '.tool_name' \u002Fdev\u002Fstdin)",[568,5527,5522],{"class":858},[568,5529,5530],{"class":620}," >> ~\u002F.claude\u002Faudit.log",[568,5532,673],{"class":574},[568,5534,5535],{"class":570,"line":641},[568,5536,1661],{"class":574},[568,5538,5539],{"class":570,"line":653},[568,5540,3763],{"class":574},[568,5542,5543],{"class":570,"line":665},[568,5544,733],{"class":574},[207,5546,5548],{"id":5547},"_75-设置优先级","7.5 设置优先级",[195,5550,5551],{},"权限规则遵循五级优先级（高到低）：",[3540,5553,5554,5559,5565,5574,5582],{},[300,5555,5556,5558],{},[284,5557,3277],{},"：无法被任何其他级别覆盖",[300,5560,5561,5564],{},[284,5562,5563],{},"命令行参数","：临时会话覆盖",[300,5566,5567,5570,5571,4857],{},[284,5568,5569],{},"本地项目设置","（",[307,5572,5573],{},".claude\u002Fsettings.local.json",[300,5575,5576,5570,5579,4857],{},[284,5577,5578],{},"共享项目设置",[307,5580,5581],{},".claude\u002Fsettings.json",[300,5583,5584,5570,5587,4857],{},[284,5585,5586],{},"用户设置",[307,5588,5589],{},"~\u002F.claude\u002Fsettings.json",[195,5591,5592,5595],{},[284,5593,5594],{},"关键规则","：如果某工具在任何级别被拒绝，其他级别无法允许它。",[207,5597,5599],{"id":5598},"_76-安全最佳实践","7.6 安全最佳实践",[3540,5601,5602,5608,5614,5620,5626,5632,5643],{},[300,5603,5604,5607],{},[284,5605,5606],{},"从严格开始","：最小权限原则，按需扩展",[300,5609,5610,5613],{},[284,5611,5612],{},"监控日志","：审查沙箱违规尝试",[300,5615,5616,5619],{},[284,5617,5618],{},"环境隔离","：开发\u002F生产使用不同的沙箱规则",[300,5621,5622,5625],{},[284,5623,5624],{},"组合防护","：权限规则 + 沙箱 + Hooks 多层防御",[300,5627,5628,5631],{},[284,5629,5630],{},"测试配置","：验证沙箱设置不会阻塞合法工作流",[300,5633,5634,305,5637,5639,5640,4857],{},[284,5635,5636],{},"谨慎使用 Unix Socket",[307,5638,1401],{}," 可能绕过沙箱（如 ",[307,5641,5642],{},"\u002Fvar\u002Frun\u002Fdocker.sock",[300,5644,5645,5648,5649,5652],{},[284,5646,5647],{},"避免过宽的写入权限","：不要允许写入 ",[307,5650,5651],{},"$PATH"," 中的可执行目录或 shell 配置文件",[199,5654,5656],{"id":5655},"_8-monitor-插件后台任务监控","8. Monitor 插件：后台任务监控",[5658,5659,5660],"blockquote",{},[195,5661,5662,5663,5666,5667,5670],{},"⚠️ ",[284,5664,5665],{},"注意","：Monitor 是 Claude Code 的",[284,5668,5669],{},"插件组件","，需通过插件系统启用，而非内置工具。",[195,5672,5673,5674,4824],{},"Monitor 让 Claude Code 能够事件驱动地响应后台进程，无需阻塞对话（来源：",[289,5675,5678],{"href":5676,"rel":5677},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fplugins-reference",[293],"Claude Code Docs - Plugins Reference",[195,5680,5681,305],{},[284,5682,5683],{},"使用场景",[297,5685,5686,5689,5692,5695],{},[300,5687,5688],{},"追踪日志文件并标记错误",[300,5690,5691],{},"轮询 PR 或 CI 作业状态变化",[300,5693,5694],{},"监视目录文件变化",[300,5696,5697],{},"追踪任何长运行脚本的输出",[195,5699,5700,305],{},[284,5701,5702],{},"工作原理",[3540,5704,5705,5708,5711,5714],{},[300,5706,5707],{},"Claude 编写一个监视脚本",[300,5709,5710],{},"在后台运行该脚本",[300,5712,5713],{},"每行输出到达时接收通知",[300,5715,5716],{},"用户在对话中继续工作，Claude 在事件发生时插入响应",[195,5718,5719,5721],{},[284,5720,229],{},"：监视构建日志",[559,5723,5725],{"className":741,"code":5724,"language":743,"meta":564,"style":564},"# 用户请求\n\"Monitor the build log and let me know if any errors appear\"\n\n# Claude 启动 Monitor 插件\n# 相当于执行: tail -f build.log | grep -i error\n# 当错误出现时，Claude 会主动提示\n",[307,5726,5727,5732,5737,5741,5746,5751],{"__ignoreMap":564},[568,5728,5729],{"class":570,"line":571},[568,5730,5731],{"class":750},"# 用户请求\n",[568,5733,5734],{"class":570,"line":578},[568,5735,5736],{"class":603},"\"Monitor the build log and let me know if any errors appear\"\n",[568,5738,5739],{"class":570,"line":597},[568,5740,785],{"emptyLinePlaceholder":784},[568,5742,5743],{"class":570,"line":614},[568,5744,5745],{"class":750},"# Claude 启动 Monitor 插件\n",[568,5747,5748],{"class":570,"line":629},[568,5749,5750],{"class":750},"# 相当于执行: tail -f build.log | grep -i error\n",[568,5752,5753],{"class":570,"line":641},[568,5754,5755],{"class":750},"# 当错误出现时，Claude 会主动提示\n",[195,5757,5758,5759,4755,5761,5763],{},"Monitor 使用与 Bash 相同的权限规则，因此为 Bash 设置的 ",[307,5760,604],{},[307,5762,687],{}," 模式同样适用。",[199,5765,5767],{"id":5766},"_9-完整配置示例","9. 完整配置示例",[207,5769,5771],{"id":5770},"_91-前端项目配置","9.1 前端项目配置",[559,5773,5775],{"className":561,"code":5774,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(npm run *)\",\n      \"Bash(npm install)\",\n      \"Bash(npm ci)\",\n      \"Bash(pnpm *)\",\n      \"Bash(vite)\",\n      \"Bash(vite build)\",\n      \"Bash(tsc)\",\n      \"Bash(tsc --noEmit)\",\n      \"Bash(git status)\",\n      \"Bash(git add *)\",\n      \"Bash(git commit *)\",\n      \"Bash(git log *)\",\n      \"Bash(git diff *)\",\n      \"Bash(gh pr view *)\",\n      \"Bash(gh pr diff *)\"\n    ],\n    \"ask\": [\n      \"Bash(git push *)\",\n      \"Bash(git merge *)\",\n      \"Bash(npm publish *)\"\n    ],\n    \"deny\": [\n      \"Bash(curl *)\",\n      \"Bash(wget *)\",\n      \"Bash(rm -rf *)\",\n      \"Read(~\u002F.ssh\u002F**)\",\n      \"Read(\u002F\u002Fetc\u002Fpasswd)\",\n      \"WebFetch(domain:localhost)\"\n    ]\n  },\n  \"sandbox\": {\n    \"enabled\": true,\n    \"mode\": \"autoAllow\",\n    \"filesystem\": {\n      \"allowWrite\": [\".\u002Fdist\", \".\u002Fbuild\", \"\u002Ftmp\"]\n    },\n    \"network\": {\n      \"allowedDomains\": [\"registry.npmjs.org\", \"npmjs.org\", \"github.com\", \"unpkg.com\", \"cdn.jsdelivr.net\"]\n    }\n  },\n  \"hooks\": [\n    {\n      \"event\": \"PreToolUse\",\n      \"matcher\": {\n        \"tool\": \"Bash\",\n        \"pattern\": \"npm audit fix\"\n      },\n      \"command\": \"echo '{\\\"decision\\\": \\\"ask\\\", \\\"reason\\\": \\\"Audit fix may introduce breaking changes\\\"}' && exit 1\"\n    }\n  ]\n}\n",[307,5776,5777,5781,5793,5805,5815,5825,5835,5845,5855,5865,5875,5885,5896,5907,5917,5928,5939,5949,5957,5961,5973,5983,5994,6002,6006,6018,6028,6039,6050,6060,6070,6079,6083,6087,6099,6111,6130,6142,6181,6187,6201,6257,6262,6267,6280,6285,6304,6317,6337,6356,6362,6417,6422,6427],{"__ignoreMap":564},[568,5778,5779],{"class":570,"line":571},[568,5780,575],{"class":574},[568,5782,5783,5785,5787,5789,5791],{"class":570,"line":578},[568,5784,581],{"class":574},[568,5786,585],{"class":584},[568,5788,588],{"class":574},[568,5790,591],{"class":574},[568,5792,594],{"class":574},[568,5794,5795,5797,5799,5801,5803],{"class":570,"line":597},[568,5796,600],{"class":574},[568,5798,604],{"class":603},[568,5800,588],{"class":574},[568,5802,591],{"class":574},[568,5804,611],{"class":574},[568,5806,5807,5809,5811,5813],{"class":570,"line":614},[568,5808,617],{"class":574},[568,5810,1020],{"class":620},[568,5812,588],{"class":574},[568,5814,626],{"class":574},[568,5816,5817,5819,5821,5823],{"class":570,"line":629},[568,5818,617],{"class":574},[568,5820,1031],{"class":620},[568,5822,588],{"class":574},[568,5824,626],{"class":574},[568,5826,5827,5829,5831,5833],{"class":570,"line":641},[568,5828,617],{"class":574},[568,5830,1042],{"class":620},[568,5832,588],{"class":574},[568,5834,626],{"class":574},[568,5836,5837,5839,5841,5843],{"class":570,"line":653},[568,5838,617],{"class":574},[568,5840,1053],{"class":620},[568,5842,588],{"class":574},[568,5844,626],{"class":574},[568,5846,5847,5849,5851,5853],{"class":570,"line":665},[568,5848,617],{"class":574},[568,5850,1748],{"class":620},[568,5852,588],{"class":574},[568,5854,626],{"class":574},[568,5856,5857,5859,5861,5863],{"class":570,"line":676},[568,5858,617],{"class":574},[568,5860,1759],{"class":620},[568,5862,588],{"class":574},[568,5864,626],{"class":574},[568,5866,5867,5869,5871,5873],{"class":570,"line":682},[568,5868,617],{"class":574},[568,5870,1986],{"class":620},[568,5872,588],{"class":574},[568,5874,626],{"class":574},[568,5876,5877,5879,5881,5883],{"class":570,"line":696},[568,5878,617],{"class":574},[568,5880,1997],{"class":620},[568,5882,588],{"class":574},[568,5884,626],{"class":574},[568,5886,5887,5889,5892,5894],{"class":570,"line":708},[568,5888,617],{"class":574},[568,5890,5891],{"class":620},"Bash(git status)",[568,5893,588],{"class":574},[568,5895,626],{"class":574},[568,5897,5898,5900,5903,5905],{"class":570,"line":718},[568,5899,617],{"class":574},[568,5901,5902],{"class":620},"Bash(git add *)",[568,5904,588],{"class":574},[568,5906,626],{"class":574},[568,5908,5909,5911,5913,5915],{"class":570,"line":724},[568,5910,617],{"class":574},[568,5912,4483],{"class":620},[568,5914,588],{"class":574},[568,5916,626],{"class":574},[568,5918,5919,5921,5924,5926],{"class":570,"line":730},[568,5920,617],{"class":574},[568,5922,5923],{"class":620},"Bash(git log *)",[568,5925,588],{"class":574},[568,5927,626],{"class":574},[568,5929,5930,5932,5935,5937],{"class":570,"line":923},[568,5931,617],{"class":574},[568,5933,5934],{"class":620},"Bash(git diff *)",[568,5936,588],{"class":574},[568,5938,626],{"class":574},[568,5940,5941,5943,5945,5947],{"class":570,"line":945},[568,5942,617],{"class":574},[568,5944,621],{"class":620},[568,5946,588],{"class":574},[568,5948,626],{"class":574},[568,5950,5951,5953,5955],{"class":570,"line":950},[568,5952,617],{"class":574},[568,5954,634],{"class":620},[568,5956,673],{"class":574},[568,5958,5959],{"class":570,"line":956},[568,5960,679],{"class":574},[568,5962,5963,5965,5967,5969,5971],{"class":570,"line":1590},[568,5964,600],{"class":574},[568,5966,1300],{"class":603},[568,5968,588],{"class":574},[568,5970,591],{"class":574},[568,5972,611],{"class":574},[568,5974,5975,5977,5979,5981],{"class":570,"line":1604},[568,5976,617],{"class":574},[568,5978,4552],{"class":620},[568,5980,588],{"class":574},[568,5982,626],{"class":574},[568,5984,5985,5987,5990,5992],{"class":570,"line":1619},[568,5986,617],{"class":574},[568,5988,5989],{"class":620},"Bash(git merge *)",[568,5991,588],{"class":574},[568,5993,626],{"class":574},[568,5995,5996,5998,6000],{"class":570,"line":1633},[568,5997,617],{"class":574},[568,5999,1111],{"class":620},[568,6001,673],{"class":574},[568,6003,6004],{"class":570,"line":1658},[568,6005,679],{"class":574},[568,6007,6008,6010,6012,6014,6016],{"class":570,"line":1664},[568,6009,600],{"class":574},[568,6011,687],{"class":603},[568,6013,588],{"class":574},[568,6015,591],{"class":574},[568,6017,611],{"class":574},[568,6019,6020,6022,6024,6026],{"class":570,"line":1669},[568,6021,617],{"class":574},[568,6023,4599],{"class":620},[568,6025,588],{"class":574},[568,6027,626],{"class":574},[568,6029,6030,6032,6035,6037],{"class":570,"line":4167},[568,6031,617],{"class":574},[568,6033,6034],{"class":620},"Bash(wget *)",[568,6036,588],{"class":574},[568,6038,626],{"class":574},[568,6040,6041,6043,6046,6048],{"class":570,"line":4173},[568,6042,617],{"class":574},[568,6044,6045],{"class":620},"Bash(rm -rf *)",[568,6047,588],{"class":574},[568,6049,626],{"class":574},[568,6051,6052,6054,6056,6058],{"class":570,"line":4213},[568,6053,617],{"class":574},[568,6055,4610],{"class":620},[568,6057,588],{"class":574},[568,6059,626],{"class":574},[568,6061,6062,6064,6066,6068],{"class":570,"line":4247},[568,6063,617],{"class":574},[568,6065,4621],{"class":620},[568,6067,588],{"class":574},[568,6069,626],{"class":574},[568,6071,6072,6074,6077],{"class":570,"line":4282},[568,6073,617],{"class":574},[568,6075,6076],{"class":620},"WebFetch(domain:localhost)",[568,6078,673],{"class":574},[568,6080,6081],{"class":570,"line":4288},[568,6082,721],{"class":574},[568,6084,6085],{"class":570,"line":4316},[568,6086,1587],{"class":574},[568,6088,6089,6091,6093,6095,6097],{"class":570,"line":4359},[568,6090,581],{"class":574},[568,6092,1595],{"class":584},[568,6094,588],{"class":574},[568,6096,591],{"class":574},[568,6098,594],{"class":574},[568,6100,6101,6103,6105,6107,6109],{"class":570,"line":4364},[568,6102,600],{"class":574},[568,6104,1609],{"class":603},[568,6106,588],{"class":574},[568,6108,591],{"class":574},[568,6110,1616],{"class":574},[568,6112,6113,6115,6118,6120,6122,6124,6126,6128],{"class":570,"line":4373},[568,6114,600],{"class":574},[568,6116,6117],{"class":603},"mode",[568,6119,588],{"class":574},[568,6121,591],{"class":574},[568,6123,774],{"class":574},[568,6125,4942],{"class":620},[568,6127,588],{"class":574},[568,6129,626],{"class":574},[568,6131,6132,6134,6136,6138,6140],{"class":570,"line":4378},[568,6133,600],{"class":574},[568,6135,1624],{"class":603},[568,6137,588],{"class":574},[568,6139,591],{"class":574},[568,6141,594],{"class":574},[568,6143,6144,6146,6148,6150,6152,6154,6156,6159,6161,6163,6165,6168,6170,6172,6174,6177,6179],{"class":570,"line":4397},[568,6145,617],{"class":574},[568,6147,1638],{"class":764},[568,6149,588],{"class":574},[568,6151,591],{"class":574},[568,6153,1645],{"class":574},[568,6155,588],{"class":574},[568,6157,6158],{"class":620},".\u002Fdist",[568,6160,588],{"class":574},[568,6162,2249],{"class":574},[568,6164,774],{"class":574},[568,6166,6167],{"class":620},".\u002Fbuild",[568,6169,588],{"class":574},[568,6171,2249],{"class":574},[568,6173,774],{"class":574},[568,6175,6176],{"class":620},"\u002Ftmp",[568,6178,588],{"class":574},[568,6180,1655],{"class":574},[568,6182,6184],{"class":570,"line":6183},39,[568,6185,6186],{"class":574},"    },\n",[568,6188,6190,6192,6195,6197,6199],{"class":570,"line":6189},40,[568,6191,600],{"class":574},[568,6193,6194],{"class":603},"network",[568,6196,588],{"class":574},[568,6198,591],{"class":574},[568,6200,594],{"class":574},[568,6202,6204,6206,6209,6211,6213,6215,6217,6219,6221,6223,6225,6227,6229,6231,6233,6235,6237,6239,6241,6244,6246,6248,6250,6253,6255],{"class":570,"line":6203},41,[568,6205,617],{"class":574},[568,6207,6208],{"class":764},"allowedDomains",[568,6210,588],{"class":574},[568,6212,591],{"class":574},[568,6214,1645],{"class":574},[568,6216,588],{"class":574},[568,6218,5039],{"class":620},[568,6220,588],{"class":574},[568,6222,2249],{"class":574},[568,6224,774],{"class":574},[568,6226,5021],{"class":620},[568,6228,588],{"class":574},[568,6230,2249],{"class":574},[568,6232,774],{"class":574},[568,6234,5030],{"class":620},[568,6236,588],{"class":574},[568,6238,2249],{"class":574},[568,6240,774],{"class":574},[568,6242,6243],{"class":620},"unpkg.com",[568,6245,588],{"class":574},[568,6247,2249],{"class":574},[568,6249,774],{"class":574},[568,6251,6252],{"class":620},"cdn.jsdelivr.net",[568,6254,588],{"class":574},[568,6256,1655],{"class":574},[568,6258,6260],{"class":570,"line":6259},42,[568,6261,1661],{"class":574},[568,6263,6265],{"class":570,"line":6264},43,[568,6266,1587],{"class":574},[568,6268,6270,6272,6274,6276,6278],{"class":570,"line":6269},44,[568,6271,581],{"class":574},[568,6273,5377],{"class":584},[568,6275,588],{"class":574},[568,6277,591],{"class":574},[568,6279,611],{"class":574},[568,6281,6283],{"class":570,"line":6282},45,[568,6284,5485],{"class":574},[568,6286,6288,6290,6292,6294,6296,6298,6300,6302],{"class":570,"line":6287},46,[568,6289,617],{"class":574},[568,6291,5492],{"class":603},[568,6293,588],{"class":574},[568,6295,591],{"class":574},[568,6297,774],{"class":574},[568,6299,5289],{"class":620},[568,6301,588],{"class":574},[568,6303,626],{"class":574},[568,6305,6307,6309,6311,6313,6315],{"class":570,"line":6306},47,[568,6308,617],{"class":574},[568,6310,5407],{"class":603},[568,6312,588],{"class":574},[568,6314,591],{"class":574},[568,6316,594],{"class":574},[568,6318,6320,6322,6325,6327,6329,6331,6333,6335],{"class":570,"line":6319},48,[568,6321,3639],{"class":574},[568,6323,6324],{"class":764},"tool",[568,6326,588],{"class":574},[568,6328,591],{"class":574},[568,6330,774],{"class":574},[568,6332,343],{"class":620},[568,6334,588],{"class":574},[568,6336,626],{"class":574},[568,6338,6340,6342,6345,6347,6349,6351,6354],{"class":570,"line":6339},49,[568,6341,3639],{"class":574},[568,6343,6344],{"class":764},"pattern",[568,6346,588],{"class":574},[568,6348,591],{"class":574},[568,6350,774],{"class":574},[568,6352,6353],{"class":620},"npm audit fix",[568,6355,673],{"class":574},[568,6357,6359],{"class":570,"line":6358},50,[568,6360,6361],{"class":574},"      },\n",[568,6363,6365,6367,6369,6371,6373,6375,6378,6380,6383,6385,6388,6390,6392,6394,6396,6398,6401,6403,6405,6407,6410,6412,6415],{"class":570,"line":6364},51,[568,6366,617],{"class":574},[568,6368,2213],{"class":603},[568,6370,588],{"class":574},[568,6372,591],{"class":574},[568,6374,774],{"class":574},[568,6376,6377],{"class":620},"echo '{",[568,6379,5522],{"class":858},[568,6381,6382],{"class":620},"decision",[568,6384,5522],{"class":858},[568,6386,6387],{"class":620},": ",[568,6389,5522],{"class":858},[568,6391,1300],{"class":620},[568,6393,5522],{"class":858},[568,6395,4973],{"class":620},[568,6397,5522],{"class":858},[568,6399,6400],{"class":620},"reason",[568,6402,5522],{"class":858},[568,6404,6387],{"class":620},[568,6406,5522],{"class":858},[568,6408,6409],{"class":620},"Audit fix may introduce breaking changes",[568,6411,5522],{"class":858},[568,6413,6414],{"class":620},"}' && exit 1",[568,6416,673],{"class":574},[568,6418,6420],{"class":570,"line":6419},52,[568,6421,1661],{"class":574},[568,6423,6425],{"class":570,"line":6424},53,[568,6426,3763],{"class":574},[568,6428,6430],{"class":570,"line":6429},54,[568,6431,733],{"class":574},[207,6433,6435],{"id":6434},"_92-全栈项目配置含数据库和部署","9.2 全栈项目配置（含数据库和部署）",[559,6437,6439],{"className":561,"code":6438,"language":563,"meta":564,"style":564},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(npm run *)\",\n      \"Bash(npx prisma *)\",\n      \"Bash(npx drizzle-kit *)\",\n      \"Bash(vercel *)\",\n      \"Bash(vercel env *)\",\n      \"Bash(vercel logs *)\",\n      \"Bash(docker ps)\",\n      \"Bash(docker compose *)\",\n      \"Bash(kubectl get pods|services|deployments *)\",\n      \"Bash(kubectl describe *)\",\n      \"Bash(kubectl logs *)\",\n      \"Bash(gh *)\"\n    ],\n    \"ask\": [\n      \"Bash(vercel --prod)\",\n      \"Bash(docker exec *)\",\n      \"Bash(kubectl get secrets *)\",\n      \"Bash(kubectl apply *)\",\n      \"Bash(npx prisma migrate deploy)\"\n    ],\n    \"deny\": [\n      \"Bash(kubectl delete *)\",\n      \"Bash(docker system prune *)\",\n      \"Bash(vercel remove *)\"\n    ]\n  },\n  \"sandbox\": {\n    \"enabled\": true,\n    \"filesystem\": {\n      \"allowWrite\": [\"~\u002F.kube\", \".\u002Fprisma\u002Fmigrations\"]\n    }\n  },\n  \"mcpServers\": {\n    \"postgres\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-postgres\", \"${DATABASE_URL}\"]\n    }\n  }\n}\n",[307,6440,6441,6445,6457,6469,6479,6490,6501,6512,6522,6532,6542,6552,6562,6572,6582,6591,6595,6607,6617,6627,6637,6647,6655,6659,6671,6681,6691,6700,6704,6708,6720,6732,6744,6773,6777,6781,6793,6805,6823,6860,6864,6868],{"__ignoreMap":564},[568,6442,6443],{"class":570,"line":571},[568,6444,575],{"class":574},[568,6446,6447,6449,6451,6453,6455],{"class":570,"line":578},[568,6448,581],{"class":574},[568,6450,585],{"class":584},[568,6452,588],{"class":574},[568,6454,591],{"class":574},[568,6456,594],{"class":574},[568,6458,6459,6461,6463,6465,6467],{"class":570,"line":597},[568,6460,600],{"class":574},[568,6462,604],{"class":603},[568,6464,588],{"class":574},[568,6466,591],{"class":574},[568,6468,611],{"class":574},[568,6470,6471,6473,6475,6477],{"class":570,"line":614},[568,6472,617],{"class":574},[568,6474,1020],{"class":620},[568,6476,588],{"class":574},[568,6478,626],{"class":574},[568,6480,6481,6483,6486,6488],{"class":570,"line":629},[568,6482,617],{"class":574},[568,6484,6485],{"class":620},"Bash(npx prisma *)",[568,6487,588],{"class":574},[568,6489,626],{"class":574},[568,6491,6492,6494,6497,6499],{"class":570,"line":641},[568,6493,617],{"class":574},[568,6495,6496],{"class":620},"Bash(npx drizzle-kit *)",[568,6498,588],{"class":574},[568,6500,626],{"class":574},[568,6502,6503,6505,6508,6510],{"class":570,"line":653},[568,6504,617],{"class":574},[568,6506,6507],{"class":620},"Bash(vercel *)",[568,6509,588],{"class":574},[568,6511,626],{"class":574},[568,6513,6514,6516,6518,6520],{"class":570,"line":665},[568,6515,617],{"class":574},[568,6517,2835],{"class":620},[568,6519,588],{"class":574},[568,6521,626],{"class":574},[568,6523,6524,6526,6528,6530],{"class":570,"line":676},[568,6525,617],{"class":574},[568,6527,2846],{"class":620},[568,6529,588],{"class":574},[568,6531,626],{"class":574},[568,6533,6534,6536,6538,6540],{"class":570,"line":682},[568,6535,617],{"class":574},[568,6537,1243],{"class":620},[568,6539,588],{"class":574},[568,6541,626],{"class":574},[568,6543,6544,6546,6548,6550],{"class":570,"line":696},[568,6545,617],{"class":574},[568,6547,1287],{"class":620},[568,6549,588],{"class":574},[568,6551,626],{"class":574},[568,6553,6554,6556,6558,6560],{"class":570,"line":708},[568,6555,617],{"class":574},[568,6557,1449],{"class":620},[568,6559,588],{"class":574},[568,6561,626],{"class":574},[568,6563,6564,6566,6568,6570],{"class":570,"line":718},[568,6565,617],{"class":574},[568,6567,1460],{"class":620},[568,6569,588],{"class":574},[568,6571,626],{"class":574},[568,6573,6574,6576,6578,6580],{"class":570,"line":724},[568,6575,617],{"class":574},[568,6577,1471],{"class":620},[568,6579,588],{"class":574},[568,6581,626],{"class":574},[568,6583,6584,6586,6589],{"class":570,"line":730},[568,6585,617],{"class":574},[568,6587,6588],{"class":620},"Bash(gh *)",[568,6590,673],{"class":574},[568,6592,6593],{"class":570,"line":923},[568,6594,679],{"class":574},[568,6596,6597,6599,6601,6603,6605],{"class":570,"line":945},[568,6598,600],{"class":574},[568,6600,1300],{"class":603},[568,6602,588],{"class":574},[568,6604,591],{"class":574},[568,6606,611],{"class":574},[568,6608,6609,6611,6613,6615],{"class":570,"line":950},[568,6610,617],{"class":574},[568,6612,2882],{"class":620},[568,6614,588],{"class":574},[568,6616,626],{"class":574},[568,6618,6619,6621,6623,6625],{"class":570,"line":956},[568,6620,617],{"class":574},[568,6622,1313],{"class":620},[568,6624,588],{"class":574},[568,6626,626],{"class":574},[568,6628,6629,6631,6633,6635],{"class":570,"line":1590},[568,6630,617],{"class":574},[568,6632,1507],{"class":620},[568,6634,588],{"class":574},[568,6636,626],{"class":574},[568,6638,6639,6641,6643,6645],{"class":570,"line":1604},[568,6640,617],{"class":574},[568,6642,1518],{"class":620},[568,6644,588],{"class":574},[568,6646,626],{"class":574},[568,6648,6649,6651,6653],{"class":570,"line":1619},[568,6650,617],{"class":574},[568,6652,2465],{"class":620},[568,6654,673],{"class":574},[568,6656,6657],{"class":570,"line":1633},[568,6658,679],{"class":574},[568,6660,6661,6663,6665,6667,6669],{"class":570,"line":1658},[568,6662,600],{"class":574},[568,6664,687],{"class":603},[568,6666,588],{"class":574},[568,6668,591],{"class":574},[568,6670,611],{"class":574},[568,6672,6673,6675,6677,6679],{"class":570,"line":1664},[568,6674,617],{"class":574},[568,6676,1529],{"class":620},[568,6678,588],{"class":574},[568,6680,626],{"class":574},[568,6682,6683,6685,6687,6689],{"class":570,"line":1669},[568,6684,617],{"class":574},[568,6686,1338],{"class":620},[568,6688,588],{"class":574},[568,6690,626],{"class":574},[568,6692,6693,6695,6698],{"class":570,"line":4167},[568,6694,617],{"class":574},[568,6696,6697],{"class":620},"Bash(vercel remove *)",[568,6699,673],{"class":574},[568,6701,6702],{"class":570,"line":4173},[568,6703,721],{"class":574},[568,6705,6706],{"class":570,"line":4213},[568,6707,1587],{"class":574},[568,6709,6710,6712,6714,6716,6718],{"class":570,"line":4247},[568,6711,581],{"class":574},[568,6713,1595],{"class":584},[568,6715,588],{"class":574},[568,6717,591],{"class":574},[568,6719,594],{"class":574},[568,6721,6722,6724,6726,6728,6730],{"class":570,"line":4282},[568,6723,600],{"class":574},[568,6725,1609],{"class":603},[568,6727,588],{"class":574},[568,6729,591],{"class":574},[568,6731,1616],{"class":574},[568,6733,6734,6736,6738,6740,6742],{"class":570,"line":4288},[568,6735,600],{"class":574},[568,6737,1624],{"class":603},[568,6739,588],{"class":574},[568,6741,591],{"class":574},[568,6743,594],{"class":574},[568,6745,6746,6748,6750,6752,6754,6756,6758,6760,6762,6764,6766,6769,6771],{"class":570,"line":4316},[568,6747,617],{"class":574},[568,6749,1638],{"class":764},[568,6751,588],{"class":574},[568,6753,591],{"class":574},[568,6755,1645],{"class":574},[568,6757,588],{"class":574},[568,6759,1650],{"class":620},[568,6761,588],{"class":574},[568,6763,2249],{"class":574},[568,6765,774],{"class":574},[568,6767,6768],{"class":620},".\u002Fprisma\u002Fmigrations",[568,6770,588],{"class":574},[568,6772,1655],{"class":574},[568,6774,6775],{"class":570,"line":4359},[568,6776,1661],{"class":574},[568,6778,6779],{"class":570,"line":4364},[568,6780,1587],{"class":574},[568,6782,6783,6785,6787,6789,6791],{"class":570,"line":4373},[568,6784,581],{"class":574},[568,6786,2172],{"class":584},[568,6788,588],{"class":574},[568,6790,591],{"class":574},[568,6792,594],{"class":574},[568,6794,6795,6797,6799,6801,6803],{"class":570,"line":4378},[568,6796,600],{"class":574},[568,6798,2200],{"class":603},[568,6800,588],{"class":574},[568,6802,591],{"class":574},[568,6804,594],{"class":574},[568,6806,6807,6809,6811,6813,6815,6817,6819,6821],{"class":570,"line":4397},[568,6808,617],{"class":574},[568,6810,2213],{"class":764},[568,6812,588],{"class":574},[568,6814,591],{"class":574},[568,6816,774],{"class":574},[568,6818,2222],{"class":620},[568,6820,588],{"class":574},[568,6822,626],{"class":574},[568,6824,6825,6827,6829,6831,6833,6835,6837,6839,6841,6843,6845,6847,6849,6851,6853,6856,6858],{"class":570,"line":6183},[568,6826,617],{"class":574},[568,6828,2233],{"class":764},[568,6830,588],{"class":574},[568,6832,591],{"class":574},[568,6834,1645],{"class":574},[568,6836,588],{"class":574},[568,6838,2244],{"class":620},[568,6840,588],{"class":574},[568,6842,2249],{"class":574},[568,6844,774],{"class":574},[568,6846,2254],{"class":620},[568,6848,588],{"class":574},[568,6850,2249],{"class":574},[568,6852,774],{"class":574},[568,6854,6855],{"class":620},"${DATABASE_URL}",[568,6857,588],{"class":574},[568,6859,1655],{"class":574},[568,6861,6862],{"class":570,"line":6189},[568,6863,1661],{"class":574},[568,6865,6866],{"class":570,"line":6203},[568,6867,727],{"class":574},[568,6869,6870],{"class":570,"line":6259},[568,6871,733],{"class":574},[199,6873,6875],{"id":6874},"_10-参考来源","10. 参考来源",[297,6877,6878,6883,6888,6895,6902,6909,6914,6921,6927,6934],{},[300,6879,6880],{},[289,6881,294],{"href":291,"rel":6882},[293],[300,6884,6885],{},[289,6886,4823],{"href":4821,"rel":6887},[293],[300,6889,6890],{},[289,6891,6894],{"href":6892,"rel":6893},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fpermissions",[293],"Claude Code Docs - Permissions",[300,6896,6897],{},[289,6898,6901],{"href":6899,"rel":6900},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fagent-sdk\u002Fmcp",[293],"Claude Code Docs - MCP",[300,6903,6904],{},[289,6905,6908],{"href":6906,"rel":6907},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fskills",[293],"Claude Code Docs - Skills",[300,6910,6911],{},[289,6912,5277],{"href":5275,"rel":6913},[293],[300,6915,6916],{},[289,6917,6920],{"href":6918,"rel":6919},"https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fclaude-code-sandboxing",[293],"Anthropic Engineering Blog - Claude Code Sandboxing",[300,6922,6923],{},[289,6924,6926],{"href":3775,"rel":6925},[293],"MCP Server Directory (GitHub)",[300,6928,6929],{},[289,6930,6933],{"href":6931,"rel":6932},"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code-security-review",[293],"Claude Code Security Review (GitHub)",[300,6935,6936],{},[289,6937,6940],{"href":6938,"rel":6939},"https:\u002F\u002Ffindmcp.dev\u002F",[293],"FindMCP - MCP Server Directory",[6942,6943,6944],"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sJsPd, html code.shiki .sJsPd{--shiki-light:#90A4AE90;--shiki-default:#EEFFFF90;--shiki-dark:#BABED890}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}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":564,"searchDepth":571,"depth":578,"links":6946},[6947,6951,6957,6963,6968,6973,6976,6979,6987,6988,6992],{"id":201,"depth":578,"text":202,"children":6948},[6949,6950],{"id":209,"depth":597,"text":210},{"id":420,"depth":597,"text":421},{"id":545,"depth":578,"text":546,"children":6952},[6953,6954,6955,6956],{"id":549,"depth":597,"text":550},{"id":976,"depth":597,"text":977},{"id":1199,"depth":597,"text":1200},{"id":1405,"depth":597,"text":1406},{"id":1700,"depth":578,"text":1701,"children":6958},[6959,6960,6961,6962],{"id":1704,"depth":597,"text":1705},{"id":1851,"depth":597,"text":1852},{"id":1942,"depth":597,"text":1943},{"id":2066,"depth":597,"text":2067},{"id":2157,"depth":578,"text":2158,"children":6964},[6965,6966,6967],{"id":2161,"depth":597,"text":2162},{"id":2408,"depth":597,"text":2409},{"id":2665,"depth":597,"text":2666},{"id":2768,"depth":578,"text":2769,"children":6969},[6970,6971,6972],{"id":2772,"depth":597,"text":2773},{"id":2910,"depth":597,"text":2911},{"id":3095,"depth":597,"text":3096},{"id":3222,"depth":578,"text":3223,"children":6974},[6975],{"id":3226,"depth":597,"text":3227},{"id":3528,"depth":578,"text":3529,"children":6977},[6978],{"id":3824,"depth":597,"text":3825},{"id":4416,"depth":578,"text":4417,"children":6980},[6981,6982,6983,6984,6985,6986],{"id":4420,"depth":597,"text":4421},{"id":4814,"depth":597,"text":4815},{"id":5171,"depth":597,"text":5172},{"id":5268,"depth":597,"text":5269},{"id":5547,"depth":597,"text":5548},{"id":5598,"depth":597,"text":5599},{"id":5655,"depth":578,"text":5656},{"id":5766,"depth":578,"text":5767,"children":6989},[6990,6991],{"id":5770,"depth":597,"text":5771},{"id":6434,"depth":597,"text":6435},{"id":6874,"depth":578,"text":6875},"md",null,{"date":6996},"2026-04-26",{"title":98,"description":197},"pt3SxxP9tYfOWVI9g6mfALMgxbai4wr7LZwjhn_yC3M",[7000,7002],{"title":94,"path":95,"stem":96,"description":7001,"children":-1},"版本控制是软件开发的基石，而 Git 则是这一领域的事实标准。然而，日常的 Git 操作——提交、分支管理、冲突解决、PR 创建——往往占据了开发者大量的心智带宽。Claude Code 将 Git 从一套需要记忆的命令集，转变为可以用自然语言直接操控的协作伙伴。它读取你的仓库状态、理解 diff 的语义、生成符合团队规范的提交信息，并能以对话方式解决合并冲突。本章将系统介绍如何利用 Claude Code 构建高效、低摩擦的 Git 工作流。",{"title":108,"path":109,"stem":110,"description":7003,"children":-1},"项目记忆与团队知识沉淀",1777395308390]