[{"data":1,"prerenderedAt":939},["ShallowReactive",2],{"navigation":3,"\u002Farticles\u002Fclaude-code-skill-mcp-hook-plugin":54,"\u002Farticles\u002Fclaude-code-skill-mcp-hook-plugin-surround":934},[4],{"title":5,"path":6,"stem":7,"children":8,"page":53},"Articles","\u002Farticles","articles",[9,13,17,21,25,29,33,37,41,45,49],{"title":10,"path":11,"stem":12},"Async 到底在解決什麼問題？","\u002Farticles\u002Fasync-waiting","articles\u002Fasync-waiting",{"title":14,"path":15,"stem":16},"Callback 是什麼？","\u002Farticles\u002Fcallback","articles\u002Fcallback",{"title":18,"path":19,"stem":20},"Claude Code 的 Skill、MCP、Hook、Plugin 分別是什麼？","\u002Farticles\u002Fclaude-code-skill-mcp-hook-plugin","articles\u002Fclaude-code-skill-mcp-hook-plugin",{"title":22,"path":23,"stem":24},"用 Daily Snapshot 提升統計查詢速度","\u002Farticles\u002Fdaily-snapshot","articles\u002Fdaily-snapshot",{"title":26,"path":27,"stem":28},"GKE 部署","\u002Farticles\u002Fgke-deployment","articles\u002Fgke-deployment",{"title":30,"path":31,"stem":32},"I\u002FO 密集 vs CPU 密集：執行緒數該開多少？","\u002Farticles\u002Fio-bound-vs-cpu-bound","articles\u002Fio-bound-vs-cpu-bound",{"title":34,"path":35,"stem":36},"從 LLM 到 Agent：打通底層邏輯","\u002Farticles\u002Fllm-to-agent","articles\u002Fllm-to-agent",{"title":38,"path":39,"stem":40},"資訊安全實踐","\u002Farticles\u002Fsecurity-best-practices","articles\u002Fsecurity-best-practices",{"title":42,"path":43,"stem":44},"單機架構的性能優化","\u002Farticles\u002Fsingle-machine-performance","articles\u002Fsingle-machine-performance",{"title":46,"path":47,"stem":48},"伺服器渲染 SSR","\u002Farticles\u002Fssr","articles\u002Fssr",{"title":50,"path":51,"stem":52},"同步 vs 非同步","\u002Farticles\u002Fsync-vs-async","articles\u002Fsync-vs-async",false,{"id":55,"title":18,"author":56,"body":60,"date":927,"description":928,"extension":143,"externalUrl":929,"image":930,"meta":931,"minRead":183,"navigation":186,"path":19,"seo":932,"stem":20,"__hash__":933},"blog\u002Farticles\u002Fclaude-code-skill-mcp-hook-plugin.md",{"name":57,"avatar":58},"Gary",{"src":59,"alt":57},"\u002Fimages\u002Fselfie.webp",{"type":61,"value":62,"toc":915},"minimark",[63,67,112,116,119,123,131,138,212,231,236,253,306,313,315,319,326,400,407,558,560,564,571,722,740,742,746,749,757,772,774,778,781,787,806,808,811,840,842,845,901,911],[64,65,66],"h2",{"id":66},"一句話區分",[68,69,70,82,92,102],"ul",{},[71,72,73,77,78,81],"li",{},[74,75,76],"strong",{},"Skill"," = 教 AI ",[74,79,80],{},"怎麼做","（知識）",[71,83,84,87,88,91],{},[74,85,86],{},"MCP"," = 讓 AI ",[74,89,90],{},"能連什麼","（工具／資料）",[71,93,94,97,98,101],{},[74,95,96],{},"Hook"," = 事件發生時",[74,99,100],{},"強制做什麼","（自動化）",[71,103,104,107,108,111],{},[74,105,106],{},"Plugin"," = 把以上",[74,109,110],{},"打包分發","（容器）",[113,114,115],"p",{},"這四個是 AI coding agent（如 Claude Code）生態常見的擴充概念，各自處理不同層面的問題。",[117,118],"hr",{},[64,120,122],{"id":121},"skill技能","Skill（技能）",[113,124,125,126,130],{},"一個資料夾，裡面放說明文件（",[127,128,129],"code",{},"SKILL.md","）和腳本，教 AI「怎麼做某類任務」的最佳實踐，例如產生 Word 文件、處理 PDF。",[113,132,133,134,137],{},"本質是",[74,135,136],{},"給模型讀的知識／流程指引","，按需載入，不佔平時的 context。",[139,140,145],"pre",{"className":141,"code":142,"language":143,"meta":144,"style":144},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- .claude\u002Fskills\u002Freview\u002FSKILL.md -->\n---\nname: review\ndescription: 執行程式碼審查，審 PR 時使用\n---\n\n審查步驟：\n1. 檢查安全性問題\n2. 檢查效能問題\n","md","",[127,146,147,156,163,169,175,181,188,194,203],{"__ignoreMap":144},[148,149,152],"span",{"class":150,"line":151},"line",1,[148,153,155],{"class":154},"sHwdD","\u003C!-- .claude\u002Fskills\u002Freview\u002FSKILL.md -->\n",[148,157,159],{"class":150,"line":158},2,[148,160,162],{"class":161},"sTEyZ","---\n",[148,164,166],{"class":150,"line":165},3,[148,167,168],{"class":161},"name: review\n",[148,170,172],{"class":150,"line":171},4,[148,173,174],{"class":161},"description: 執行程式碼審查，審 PR 時使用\n",[148,176,178],{"class":150,"line":177},5,[148,179,162],{"class":180},"sMK4o",[148,182,184],{"class":150,"line":183},6,[148,185,187],{"emptyLinePlaceholder":186},true,"\n",[148,189,191],{"class":150,"line":190},7,[148,192,193],{"class":161},"審查步驟：\n",[148,195,197,200],{"class":150,"line":196},8,[148,198,199],{"class":180},"1.",[148,201,202],{"class":161}," 檢查安全性問題\n",[148,204,206,209],{"class":150,"line":205},9,[148,207,208],{"class":180},"2.",[148,210,211],{"class":161}," 檢查效能問題\n",[113,213,214,215,218,219,222,223,226,227,230],{},"放在 ",[127,216,217],{},".claude\u002Fskills\u002F技能名\u002FSKILL.md","（專案用）或 ",[127,220,221],{},"~\u002F.claude\u002Fskills\u002F","（全域個人用）。用法：打 ",[127,224,225],{},"\u002Freview","，或 Claude 依 ",[127,228,229],{},"description"," 自動判斷是否觸發。",[232,233,235],"h3",{"id":234},"小知識跟-claudemd-有什麼不一樣","小知識：跟 CLAUDE.md 有什麼不一樣？",[113,237,238,241,242,245,246,249,250,252],{},[127,239,240],{},"CLAUDE.md"," 是 Claude Code 認得的保留檔名，放在專案根目錄（或 ",[127,243,244],{},"~\u002F.claude\u002FCLAUDE.md"," 全域）就會",[74,247,248],{},"每次對話自動載入","，不用像 Skill 一樣靠 ",[127,251,229],{}," 判斷要不要觸發。兩者看起來都是「教 AI 怎麼做」，差別在載入時機，也因此決定了該放什麼內容：",[254,255,256,269],"table",{},[257,258,259],"thead",{},[260,261,262,265,267],"tr",{},[263,264],"th",{},[263,266,240],{},[263,268,76],{},[270,271,272,284,295],"tbody",{},[260,273,274,278,281],{},[275,276,277],"td",{},"何時載入",[275,279,280],{},"每次對話都自動載入",[275,282,283],{},"只有判斷跟任務相關才載入",[260,285,286,289,292],{},[275,287,288],{},"該放什麼",[275,290,291],{},"不管做什麼任務都用得到的通用規矩",[275,293,294],{},"只有做「特定那類任務」才需要的詳細步驟",[260,296,297,300,303],{},[275,298,299],{},"篇幅",[275,301,302],{},"要精簡，因為每次都佔 context",[275,304,305],{},"可以很長很細，因為平常不佔位置",[113,307,308,309,312],{},"例如「commit message 要用什麼格式」「不要改 ",[127,310,311],{},"generated\u002F"," 資料夾」這種不管做什麼任務都適用的規矩，放 CLAUDE.md；但「審查 PR 時要先查安全性、再查效能、輸出要照固定格式」這種只有做該任務才需要的詳細流程，放 Skill——不審查 PR 的時候，不需要讓這串步驟佔用 context。",[117,314],{},[64,316,318],{"id":317},"mcpmodel-context-protocol","MCP（Model Context Protocol）",[113,320,321,322,325],{},"Anthropic 推出的開放協定，讓 AI 連接外部服務和資料（如 Gmail、Slack、資料庫）。MCP server 提供「工具」給模型呼叫，類似 AI 的 USB 標準接口。重點是",[74,323,324],{},"連外部系統、執行操作","。",[139,327,331],{"className":328,"code":329,"language":330,"meta":144,"style":144},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 最簡單的加法：用指令加\nclaude mcp add --transport http github https:\u002F\u002Fapi.githubcopilot.com\u002Fmcp\u002F\nclaude mcp add --transport stdio --env API_KEY=$KEY mytool -- npx -y some-mcp-server\n","bash",[127,332,333,338,363],{"__ignoreMap":144},[148,334,335],{"class":150,"line":151},[148,336,337],{"class":154},"# 最簡單的加法：用指令加\n",[148,339,340,344,348,351,354,357,360],{"class":150,"line":158},[148,341,343],{"class":342},"sBMFI","claude",[148,345,347],{"class":346},"sfazB"," mcp",[148,349,350],{"class":346}," add",[148,352,353],{"class":346}," --transport",[148,355,356],{"class":346}," http",[148,358,359],{"class":346}," github",[148,361,362],{"class":346}," https:\u002F\u002Fapi.githubcopilot.com\u002Fmcp\u002F\n",[148,364,365,367,369,371,373,376,379,382,385,388,391,394,397],{"class":150,"line":165},[148,366,343],{"class":342},[148,368,347],{"class":346},[148,370,350],{"class":346},[148,372,353],{"class":346},[148,374,375],{"class":346}," stdio",[148,377,378],{"class":346}," --env",[148,380,381],{"class":346}," API_KEY=",[148,383,384],{"class":161},"$KEY ",[148,386,387],{"class":346},"mytool",[148,389,390],{"class":346}," --",[148,392,393],{"class":346}," npx",[148,395,396],{"class":346}," -y",[148,398,399],{"class":346}," some-mcp-server\n",[113,401,402,403,406],{},"團隊共享則在專案根目錄放 ",[127,404,405],{},".mcp.json","（進 git 管理），認證資訊改用環境變數：",[139,408,412],{"className":409,"code":410,"language":411,"meta":144,"style":144},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"mcpServers\": {\n    \"github\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-github\"],\n      \"env\": { \"GITHUB_TOKEN\": \"...\" }\n    }\n  }\n}\n","json",[127,413,414,419,437,451,475,509,543,548,553],{"__ignoreMap":144},[148,415,416],{"class":150,"line":151},[148,417,418],{"class":180},"{\n",[148,420,421,424,428,431,434],{"class":150,"line":158},[148,422,423],{"class":180},"  \"",[148,425,427],{"class":426},"spNyl","mcpServers",[148,429,430],{"class":180},"\"",[148,432,433],{"class":180},":",[148,435,436],{"class":180}," {\n",[148,438,439,442,445,447,449],{"class":150,"line":165},[148,440,441],{"class":180},"    \"",[148,443,444],{"class":342},"github",[148,446,430],{"class":180},[148,448,433],{"class":180},[148,450,436],{"class":180},[148,452,453,456,460,462,464,467,470,472],{"class":150,"line":171},[148,454,455],{"class":180},"      \"",[148,457,459],{"class":458},"sbssI","command",[148,461,430],{"class":180},[148,463,433],{"class":180},[148,465,466],{"class":180}," \"",[148,468,469],{"class":346},"npx",[148,471,430],{"class":180},[148,473,474],{"class":180},",\n",[148,476,477,479,482,484,486,489,491,494,496,499,501,504,506],{"class":150,"line":177},[148,478,455],{"class":180},[148,480,481],{"class":458},"args",[148,483,430],{"class":180},[148,485,433],{"class":180},[148,487,488],{"class":180}," [",[148,490,430],{"class":180},[148,492,493],{"class":346},"-y",[148,495,430],{"class":180},[148,497,498],{"class":180},",",[148,500,466],{"class":180},[148,502,503],{"class":346},"@modelcontextprotocol\u002Fserver-github",[148,505,430],{"class":180},[148,507,508],{"class":180},"],\n",[148,510,511,513,516,518,520,523,525,529,531,533,535,538,540],{"class":150,"line":183},[148,512,455],{"class":180},[148,514,515],{"class":458},"env",[148,517,430],{"class":180},[148,519,433],{"class":180},[148,521,522],{"class":180}," {",[148,524,466],{"class":180},[148,526,528],{"class":527},"swJcz","GITHUB_TOKEN",[148,530,430],{"class":180},[148,532,433],{"class":180},[148,534,466],{"class":180},[148,536,537],{"class":346},"...",[148,539,430],{"class":180},[148,541,542],{"class":180}," }\n",[148,544,545],{"class":150,"line":190},[148,546,547],{"class":180},"    }\n",[148,549,550],{"class":150,"line":196},[148,551,552],{"class":180},"  }\n",[148,554,555],{"class":150,"line":205},[148,556,557],{"class":180},"}\n",[117,559],{},[64,561,563],{"id":562},"hook鉤子","Hook（鉤子）",[113,565,566,567,570],{},"在特定事件發生時自動觸發的腳本，例如「每次 AI 要執行指令前先檢查」、「檔案編輯後自動跑 lint」。是",[74,568,569],{},"確定性的自動化","，不靠模型判斷，用來強制執行規則或流程。",[139,572,574],{"className":409,"code":573,"language":411,"meta":144,"style":144},"{\n  \"hooks\": {\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"Edit|Write\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"jq -r '.tool_input.file_path' | xargs npx prettier --write\"\n          }\n        ]\n      }\n    ]\n  }\n}\n",[127,575,576,580,593,607,612,633,645,650,670,688,694,700,706,712,717],{"__ignoreMap":144},[148,577,578],{"class":150,"line":151},[148,579,418],{"class":180},[148,581,582,584,587,589,591],{"class":150,"line":158},[148,583,423],{"class":180},[148,585,586],{"class":426},"hooks",[148,588,430],{"class":180},[148,590,433],{"class":180},[148,592,436],{"class":180},[148,594,595,597,600,602,604],{"class":150,"line":165},[148,596,441],{"class":180},[148,598,599],{"class":342},"PostToolUse",[148,601,430],{"class":180},[148,603,433],{"class":180},[148,605,606],{"class":180}," [\n",[148,608,609],{"class":150,"line":171},[148,610,611],{"class":180},"      {\n",[148,613,614,617,620,622,624,626,629,631],{"class":150,"line":177},[148,615,616],{"class":180},"        \"",[148,618,619],{"class":458},"matcher",[148,621,430],{"class":180},[148,623,433],{"class":180},[148,625,466],{"class":180},[148,627,628],{"class":346},"Edit|Write",[148,630,430],{"class":180},[148,632,474],{"class":180},[148,634,635,637,639,641,643],{"class":150,"line":183},[148,636,616],{"class":180},[148,638,586],{"class":458},[148,640,430],{"class":180},[148,642,433],{"class":180},[148,644,606],{"class":180},[148,646,647],{"class":150,"line":190},[148,648,649],{"class":180},"          {\n",[148,651,652,655,658,660,662,664,666,668],{"class":150,"line":196},[148,653,654],{"class":180},"            \"",[148,656,657],{"class":527},"type",[148,659,430],{"class":180},[148,661,433],{"class":180},[148,663,466],{"class":180},[148,665,459],{"class":346},[148,667,430],{"class":180},[148,669,474],{"class":180},[148,671,672,674,676,678,680,682,685],{"class":150,"line":205},[148,673,654],{"class":180},[148,675,459],{"class":527},[148,677,430],{"class":180},[148,679,433],{"class":180},[148,681,466],{"class":180},[148,683,684],{"class":346},"jq -r '.tool_input.file_path' | xargs npx prettier --write",[148,686,687],{"class":180},"\"\n",[148,689,691],{"class":150,"line":690},10,[148,692,693],{"class":180},"          }\n",[148,695,697],{"class":150,"line":696},11,[148,698,699],{"class":180},"        ]\n",[148,701,703],{"class":150,"line":702},12,[148,704,705],{"class":180},"      }\n",[148,707,709],{"class":150,"line":708},13,[148,710,711],{"class":180},"    ]\n",[148,713,715],{"class":150,"line":714},14,[148,716,552],{"class":180},[148,718,720],{"class":150,"line":719},15,[148,721,557],{"class":180},[113,723,724,725,728,729,732,733,735,736,739],{},"寫在 ",[127,726,727],{},".claude\u002Fsettings.json","。常見事件：",[127,730,731],{},"PreToolUse","（執行前攔截檢查）、",[127,734,599],{},"（執行後）、",[127,737,738],{},"Stop","（回合結束）等。",[117,741],{},[64,743,745],{"id":744},"plugin外掛","Plugin（外掛）",[113,747,748],{},"打包上述東西的容器。一個 plugin 可以同時包含 skills、MCP servers、hooks、自訂指令等，方便一鍵安裝和分享整套設定。",[139,750,755],{"className":751,"code":753,"language":754},[752],"language-text","my-plugin\u002F\n├── .claude-plugin\u002Fplugin.json   # 必要的 manifest\n├── skills\u002Fxxx\u002FSKILL.md\n├── hooks\u002Fhooks.json\n└── .mcp.json\n","text",[127,756,753],{"__ignoreMap":144},[113,758,759,760,763,764,767,768,771],{},"開發測試用 ",[127,761,762],{},"--plugin-dir .\u002Fmy-plugin","，安裝用 ",[127,765,766],{},"\u002Fplugin install 名稱@marketplace","，也可以推到 GitHub 讓隊友用 ",[127,769,770],{},"\u002Fplugin install"," 裝。",[117,773],{},[64,775,777],{"id":776},"實際使用範例pr-自動審查","實際使用範例：PR 自動審查",[113,779,780],{},"假設想做一個功能：每次開 PR，AI 自動審查、把結果留言在 PR 上，重大問題還要擋下 merge。四個概念在這裡各司其職：",[139,782,785],{"className":783,"code":784,"language":754},[752],"開 PR\n  ↓\nHook（PreToolUse／CI 階段）：強制跑 lint、test，不合格直接擋下，不靠 AI 判斷\n  ↓\nSkill（review）：教 AI 審查標準——先查安全性，再查效能，用固定格式輸出結果\n  ↓\nMCP（GitHub）：AI 讀取 PR 的 diff 內容，並把審查結果留言回 PR、視結果標記 review 狀態\n  ↓\nPlugin（pr-reviewer）：把上面的 Skill + Hook + MCP 設定打包成一個 plugin，\n                        推到團隊的 marketplace，其他人 `\u002Fplugin install pr-reviewer@team` 就能直接用\n",[127,786,784],{"__ignoreMap":144},[113,788,789,790,793,794,797,798,801,802,805],{},"分工上很清楚：",[74,791,792],{},"Hook 負責「不管怎樣都要做」的硬規則","（跑 lint\u002Ftest），",[74,795,796],{},"Skill 負責「AI 該怎麼判斷」的知識","（審查標準），",[74,799,800],{},"MCP 負責「AI 要連到哪裡拿資料、送結果」","（讀 diff、留言），",[74,803,804],{},"Plugin 則是把這一整套流程包起來方便分享","，讓團隊不用每個人各自重新設定一次。",[117,807],{},[64,809,810],{"id":810},"建議上手順序",[812,813,814,820,825,830,835],"ol",{},[71,815,816,817,819],{},"先寫 ",[74,818,240],{},"（專案規則）",[71,821,822,823],{},"重複的手順抽成 ",[74,824,76],{},[71,826,827,828],{},"「必須執行」的事寫成 ",[74,829,96],{},[71,831,832,833],{},"需要連外部服務才加 ",[74,834,86],{},[71,836,837,838],{},"要跨專案／團隊共享才打包成 ",[74,839,106],{},[117,841],{},[64,843,844],{"id":844},"總結",[254,846,847,859],{},[257,848,849],{},[260,850,851,853,856],{},[263,852],{},[263,854,855],{},"解決什麼問題",[263,857,858],{},"靠誰判斷",[270,860,861,871,881,891],{},[260,862,863,865,868],{},[275,864,76],{},[275,866,867],{},"AI 不知道怎麼做某類任務",[275,869,870],{},"模型自行判斷是否載入",[260,872,873,875,878],{},[275,874,86],{},[275,876,877],{},"AI 連不到外部系統／資料",[275,879,880],{},"模型呼叫工具",[260,882,883,885,888],{},[275,884,96],{},[275,886,887],{},"某件事必須每次都發生，不能靠模型自由心證",[275,889,890],{},"事件觸發，確定性執行",[260,892,893,895,898],{},[275,894,106],{},[275,896,897],{},"一整套設定要跨專案／團隊分享",[275,899,900],{},"安裝時打包帶走",[113,902,903,904],{},"功能更新很快，細節以官方文件為準：",[905,906,910],"a",{"href":907,"rel":908},"https:\u002F\u002Fcode.claude.com\u002Fdocs",[909],"nofollow","code.claude.com\u002Fdocs",[912,913,914],"style",{},"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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":144,"searchDepth":158,"depth":158,"links":916},[917,918,921,922,923,924,925,926],{"id":66,"depth":158,"text":66},{"id":121,"depth":158,"text":122,"children":919},[920],{"id":234,"depth":165,"text":235},{"id":317,"depth":158,"text":318},{"id":562,"depth":158,"text":563},{"id":744,"depth":158,"text":745},{"id":776,"depth":158,"text":777},{"id":810,"depth":158,"text":810},{"id":844,"depth":158,"text":844},"2026-07-14","拆解 AI coding agent 生態常見的四個擴充概念——Skill、MCP、Hook、Plugin，並以 Claude Code 為例說明實際配置方式與建議上手順序。",null,"\u002Fimages\u002Fdata-flow.jpg",{},{"title":18,"description":928},"UrLMkUeRqF6MyWCxz7BrOjuVxH6oDW8yy-hm7XGvL1k",[935,937],{"title":14,"path":15,"stem":16,"description":936,"children":-1},"精確定義 callback、判斷標準與常見誤解，介紹 JavaScript 中常用到 callback 的內建函數、Callback Hell 問題，以及它與 Promise、async\u002Fawait 的關係。",{"title":22,"path":23,"stem":24,"description":938,"children":-1},"資料量龐大導致查詢變慢，透過 Cron Job 將每日統計好的資料寫入 Snapshot Table，查詢不再需要跨表掃描改為單表讀取。",1784010808948]