[{"data":1,"prerenderedAt":1811},["ShallowReactive",2],{"search-dialog-posts":3,"post-\u002Fposts\u002Fclaude-settings-codex-config":316,"post-surround-\u002Fposts\u002Fclaude-settings-codex-config":1804},[4,12,21,29,37,47,57,67,77,85,96,104,112,121,129,137,147,155,164,173,181,188,195,207,215,224,236,241,247,254,260,266,272,279,286,291,298,304,310],{"path":5,"title":6,"description":7,"category":8,"tags":9},"\u002Fposts\u002Fgit-commands-cheatsheet","Git 常用指令與終端機筆記","2018 年整理的 Git 學習筆記，包含基本終端機指令、Git 操作、分支、reset、SourceTree、Vim 與一些常用設定。","notes",[10,11],"Git","版本控制",{"path":13,"title":14,"description":15,"category":16,"tags":17},"\u002Fposts\u002Fjs-prototype-inheritance","JavaScript 物件導向：建構函式、prototype 與繼承三步驟","整理 ES5 時代用建構函式加 prototype 手刻物件導向的完整流程——封裝屬性與方法、共用函式為什麼要掛在 prototype 上、以及繼承的三個步驟（call 借用母類別建構子、Object.create 接上原型鏈、修正 constructor 指向），並附上物件縮寫與計算屬性這兩個順便學到的 ES6 寫法。","frontend",[18,19,20],"JavaScript","物件導向","prototype",{"path":22,"title":23,"description":24,"category":16,"tags":25},"\u002Fposts\u002Fflexbox-notes","Flexbox 對齊與彈性尺寸筆記","記錄 Flexbox 的主軸與交錯軸對齊、flex-direction、flex-wrap，以及 flex-grow、flex-shrink、flex-basis 等常用屬性。",[26,27,28],"CSS","Flexbox","版面",{"path":30,"title":31,"description":32,"category":16,"tags":33},"\u002Fposts\u002Fscreen-orientation-api","screen.orientation：現在判斷與鎖定螢幕方向的做法","整理現在 JavaScript 判斷螢幕方向的方式，包括 screen.orientation、change 事件與 lock()，並說明 RWD 使用 matchMedia 或 CSS orientation 會更適合。",[18,34,35,36],"RWD","螢幕方向","PWA",{"path":38,"title":39,"description":40,"category":16,"tags":41},"\u002Fposts\u002Fpinia-vuex-state-management","Pinia \u002F Vuex 狀態管理及差異","紀錄 Vuex、Pinia 的狀態管理概念、差異與用法。",[42,43,44,45,46],"Pinia","Vuex","Vue3","狀態管理","Nuxt",{"path":48,"title":49,"description":50,"category":8,"tags":51},"\u002Fposts\u002Fpyenv-python-version-management","Python 多版本管理 pyenv","紀錄 macOS 與 Windows 使用 pyenv 管理 Python 版本的方式。",[52,53,54,55,56],"Python","pyenv","macOS","Windows","版本管理",{"path":58,"title":59,"description":60,"category":8,"tags":61},"\u002Fposts\u002Fnpm-publish-vue2-component","npm 發布流程","紀錄 Vue 2 元件的 npm 發布、dist-tag 與打包流程。",[62,63,64,65,66],"npm","Vue2","Vue CLI","套件發布","MIT",{"path":68,"title":69,"description":70,"category":8,"tags":71},"\u002Fposts\u002Fmobile-debugging-today","現在怎麼 debug 手機網頁：從裝一堆工具到幾乎不用裝","對照 2022 年那套 scoop、iTunes、remotedebug-ios-webkit-adapter 的繁瑣設定，整理現在偵錯手機網頁的做法：Android 無線偵錯、iOS 的實際選項、on-device console、Playwright 裝置模擬，以及本機 HTTPS 的處理。",[72,73,74,75,76],"debug","iOS","Android","Chrome DevTools","Playwright",{"path":78,"title":79,"description":80,"category":16,"tags":81},"\u002Fposts\u002Fplaywright-vs-cypress","E2E 測試現在選什麼：Playwright 與 Cypress 的實際差異","對照幾年前用 Cypress 的做法，說明 Playwright 為什麼變成多數新專案的預設選擇：真正的多瀏覽器支援、免費的平行執行、trace viewer 除錯，以及兩者在架構上的根本差異與各自仍然適合的場景。",[76,82,83,84],"Cypress","E2E","測試",{"path":86,"title":87,"description":88,"category":89,"tags":90},"\u002Fposts\u002Fjs-encoding-today","現在處理編碼：TextEncoder、Uint8Array 的 Base64 方法與 URLSearchParams","整理 JavaScript 現代編碼方式，使用 TextEncoder、TextDecoder 與 Uint8Array 處理 UTF-8 與 Base64，並說明 Base64URL、URLSearchParams 與 encodeURIComponent 的差異。","research",[91,92,93,94,95,18],"編碼","TextEncoder","Base64","URLSearchParams","Uint8Array",{"path":97,"title":98,"description":99,"category":16,"tags":100},"\u002Fposts\u002Fdart-sass-migration","Dart Sass 遷移筆記：node-sass 之後怎麼裝 Sass","node-sass 與 LibSass 已停止維護，現在改用 Dart Sass。整理 webpack 與 Vite 的安裝方式，以及為什麼不再像 node-sass 一樣容易遇到 Node.js 版本與原生編譯問題。",[101,102,103],"Sass","Webpack","Vite",{"path":105,"title":106,"description":107,"category":16,"tags":108},"\u002Fposts\u002Fdayjs-vue3-computed","day.js 搭配 Vue 3 的日期格式化","整理 Vue 3 日期格式化的常見做法，使用 day.js 取代舊專案常見的 moment.js，並以 method 或 computed 取代 Vue 2 filter，也補充原生 Intl.DateTimeFormat 的使用方式。",[44,109,110,111],"day.js","日期","Intl",{"path":113,"title":114,"description":115,"category":16,"tags":116},"\u002Fposts\u002Fes-modules-today","ES Module 現在的樣子：Node ESM、exports 與 import maps","整理現代 JavaScript ES Module 的常見用法，包括 Node.js 原生 ESM、package.json exports、瀏覽器 import maps、JSON import attributes，以及 Vite 動態載入的注意事項。",[117,118,119,120,103,18],"ES Module","Node.js","import maps","exports",{"path":122,"title":123,"description":124,"category":89,"tags":125},"\u002Fposts\u002Fstructured-clone","structuredClone()：終於有內建的深層拷貝","整理 JavaScript structuredClone() 的深層拷貝用法，說明 Date、Map、Set、循環參考的處理方式，以及 Function、class 與 Vue reactive Proxy 的注意事項。",[18,126,127,128],"structuredClone","深拷貝","Vue",{"path":130,"title":131,"description":132,"category":16,"tags":133},"\u002Fposts\u002Fdynamic-import","JavaScript 動態載入：import() 與 Vue 非同步元件","整理靜態 import、動態 import() 與 Vue defineAsyncComponent 的使用方式，並簡單補充 Vite import.meta.glob 的用途。",[18,134,135,103,136],"ES Modules","Vue 3","Code Splitting",{"path":138,"title":139,"description":140,"category":16,"tags":141},"\u002Fposts\u002Fscreen-wake-lock-api","Screen Wake Lock API：不用套件也能讓頁面保持亮著","整理 Screen Wake Lock API 的基本用法，說明 HTTPS、頁面可見性、切換分頁後重新取得 wake lock，以及 Vue／Nuxt 計時器使用時的注意事項。",[142,128,143,144,145,146],"Wake Lock","Nuxt4","行動裝置","計時器","Web API",{"path":148,"title":149,"description":150,"category":16,"tags":151},"\u002Fposts\u002Fhtml-meta-boilerplate-today","現在的 HTML meta 標籤怎麼寫","整理現在一個新頁面該有的 meta 標籤骨架——viewport 補上 viewport-fit=cover 因應瀏海與圓角螢幕、color-scheme 讓表單控制項跟著深色模式換色、theme-color 決定行動瀏覽器工具列顏色，以及基本的 SEO 與 Open Graph 標籤。",[152,153,154],"HTML","meta","SEO",{"path":156,"title":157,"description":158,"category":8,"tags":159},"\u002Fposts\u002Fdocker-node-postgres","把 Node + PostgreSQL 的 backend 裝進 Docker：Dockerfile、.dockerignore 與 compose","從「本機裝了就跑」到打包成容器的通用做法——Dockerfile 每一行的理由與 layer cache 為什麼決定了指令順序、.dockerignore 漏掉 node_modules 對原生模組是災難級的問題、容器之間為什麼不能用 localhost 互相找到對方，以及怎麼驗證資料真的寫進了 volume。",[160,161,118,162,163],"Docker","Docker Compose","PostgreSQL","Express",{"path":165,"title":166,"description":167,"category":16,"tags":168},"\u002Fposts\u002Fnuxt-server-proxy","Nuxt 3 \u002F 4 用 Server API 做代理與轉發","整理 Nuxt 3 與 Nuxt 4 使用 server\u002Fapi 轉發第三方 API 的方式，可以避免瀏覽器 CORS 問題、隱藏 API Key，也能在伺服器端加入快取。",[169,143,170,171,172],"Nuxt3","CORS","Nitro","API",{"path":174,"title":175,"description":176,"category":16,"tags":177},"\u002Fposts\u002Fnuxt4-project-setup","Nuxt 4 建立專案：和 Nuxt 3 有哪些不同","整理 Nuxt 4 建立專案的基本流程與目錄結構，並對照 Nuxt 3 的差異，包括 app\u002F 目錄、路徑別名、TypeScript，以及目前常用的 ESLint 與 Tailwind CSS 4 設定。",[143,44,178,179,180],"TypeScript","ESLint","Tailwind CSS 4",{"path":182,"title":183,"description":184,"category":16,"tags":185},"\u002Fposts\u002Fnuxt3-route-middleware","Nuxt 3 \u002F 4 的 Route Middleware：進頁面前先做判斷","整理 Nuxt 3 與 Nuxt 4 的 Route Middleware，用 defineNuxtRouteMiddleware 在進入頁面前檢查登入狀態，搭配 navigateTo 重新導向，並說明一般 middleware、global middleware 與 definePageMeta 的用法。",[169,143,186,187],"Middleware","驗證",{"path":189,"title":190,"description":191,"category":16,"tags":192},"\u002Fposts\u002Fnuxt-route-rules-redirect","Nuxt 3 \u002F 4 的 routeRules：重新導向與頁面設定","整理 Nuxt 3 與 Nuxt 4 的 routeRules 用法，可以依照不同網址設定重新導向、預渲染、SSR 與快取，並簡單對照 Nuxt 2 的舊做法。",[169,143,193,194],"routeRules","重新導向",{"path":196,"title":197,"description":198,"category":16,"tags":199},"\u002Fposts\u002Fios-iframe-google-login-blank-page","iOS iframe 串接 Google 登入出現空白頁：Popup 與頁面回收問題排查紀錄","記錄 iframe 內串接 Google 第三方登入時，部分 iOS 裝置因背景頁面遭到回收並重新載入，導致 Popup 登入流程中斷，以及最後透過 Redirect 分流與登入狀態接回機制處理的過程。",[73,200,201,202,203,204,205,206],"Safari","iframe","Google Login","GIS","OAuth","Popup","Redirect",{"path":208,"title":209,"description":210,"category":16,"tags":211},"\u002Fposts\u002Fios-login-tab-return-behavior","iOS 第三方登入後回不到原頁？分頁開啟關係與回頁行為實測","記錄 iOS Safari 與 Chrome 在多分頁第三方登入流程中，登入頁關閉後不一定回到原頁的實測，以及分頁開啟關係、window.close 與 window.focus 的限制。",[73,200,212,202,204,201,213,214],"Chrome","window.close","window.focus",{"path":216,"title":217,"description":218,"category":16,"tags":219},"\u002Fposts\u002Fgoogle-app-about-blank-placeholder","Google App 內建瀏覽器：about:blank 佔位頁被關閉的排查紀錄","記錄 iOS Google App 內建瀏覽器在非同步開啟外部頁面時，about:blank 佔位分頁被自動關閉，導致第三方登入或外部導轉失敗的排查與解法。",[73,220,221,222,204,223],"Google App","window.open","about:blank","WebView",{"path":225,"title":226,"description":227,"category":228,"tags":229},"\u002Fposts\u002Fclaude-code-codex-cli-init-basics","AI 相關紀錄 v1｜Claude Code \u002F Codex CLI 初始化與基本概念","從 Claude Code 與 Codex CLI 開始，整理 CLI、Coding Agent、Context、\u002Finit 與 CLAUDE.md／AGENTS.md 這幾個一開始最容易搞混的概念，以及在既有專案中的安裝與啟動方式。","ai",[230,231,232,233,234,235],"AI","Claude Code","Codex CLI","Coding Agent","CLAUDE.md","AGENTS.md",{"path":237,"title":238,"description":239,"category":228,"tags":240},"\u002Fposts\u002Fclaude-agents-md-project-guidelines","AI 相關紀錄 v2｜CLAUDE.md \u002F AGENTS.md 怎麼寫？專案規範與實際範例","整理 CLAUDE.md 與 AGENTS.md 的用途、適合記錄的專案規範，以及可直接參考的設定範例。",[230,231,232,234,235],{"path":242,"title":243,"description":244,"category":228,"tags":245},"\u002Fposts\u002Fclaude-codex-config-locations","AI 相關紀錄 v3｜Claude Code `.claude\u002F` \u002F Codex CLI 設定位置：全域與專案設定基本概要介紹","整理 Claude Code 與 Codex CLI 的使用者層級、專案層級設定位置，以及 rules、skills、agents 等目錄的用途。",[230,231,232,246],"設定檔",{"path":248,"title":249,"description":250,"category":228,"tags":251},"\u002Fposts\u002Fclaude-settings-codex-config","AI 相關紀錄 v4｜Claude Code settings \u002F Codex config 基本設定","整理 Claude Code settings.json 與 Codex config.toml 的設定層級、權限控制和常見基本設定。",[230,231,232,252,253],"settings.json","config.toml",{"path":255,"title":256,"description":257,"category":228,"tags":258},"\u002Fposts\u002Fclaude-codex-rules-structure","AI 相關紀錄 v5｜Rules：專案規則多了之後怎麼拆？","整理 Claude Code Rules 與 Codex AGENTS.md 的拆分方式，說明何時該拆、怎麼依目錄管理專案規則。",[230,231,232,259,235],"Rules",{"path":261,"title":262,"description":263,"category":228,"tags":264},"\u002Fposts\u002Fclaude-codex-slash-commands","AI 相關紀錄 v6｜Commands \u002F Slash Commands：CLI 裡的 `\u002F` 指令是什麼？","介紹 Claude Code 與 Codex CLI 的 Slash Commands，整理常用內建指令、自訂指令與 Skills 的差異。",[230,231,232,265],"Slash Commands",{"path":267,"title":268,"description":269,"category":228,"tags":270},"\u002Fposts\u002Fclaude-codex-skills","AI 相關紀錄 v7｜Skills：把重複工作流程整理起來","介紹 Claude Code 與 Codex Skills，整理適合保存成 Skill 的重複流程、基本結構與使用方式。",[230,231,232,271],"Skills",{"path":273,"title":274,"description":275,"category":228,"tags":276},"\u002Fposts\u002Fclaude-codex-agents-subagents","AI 相關紀錄 v8｜Agent \u002F Subagent：什麼時候真的需要分工？","整理 Agent、Subagent 與 Custom Agent 的用途，說明何時適合分工，以及它們和 Rules、Skills 的差異。",[230,231,232,277,278],"Agent","Subagent",{"path":280,"title":281,"description":282,"category":228,"tags":283},"\u002Fposts\u002Fmcp-basics","AI 相關紀錄 v9｜MCP：讓 AI 使用其他工具與資料","介紹 MCP 如何讓 AI 使用外部工具與資料，並以 Pencil MCP 說明實際用途、權限風險及與 Skill 的差異。",[230,284,231,232,285],"MCP","Pencil",{"path":287,"title":288,"description":289,"category":228,"tags":290},"\u002Fposts\u002Fai-coding-agent-concepts-summary","AI 相關紀錄 v10｜基本概念小結論","用一篇快速整理 CLAUDE.md、AGENTS.md、設定檔、Rules、Commands、Skills、Agent 與 MCP 的角色和差異。",[230,231,232,284,271,277],{"path":292,"title":293,"description":294,"category":228,"tags":295},"\u002Fposts\u002Fclaude-code-codex-model-selection","Claude Code 與 Codex：不同模型怎麼選？","比較 Claude Code 與 Codex 不同模型的速度、能力與成本取捨，依工作難度整理實用的選擇方向。",[230,231,296,297],"Codex","模型選擇",{"path":299,"title":300,"description":301,"category":228,"tags":302},"\u002Fposts\u002Fclaude-model-selection","Claude 模型簡單怎麼選？","整理 Claude 各模型在速度、能力與使用情境上的差異，提供從輕量工作到複雜任務的選擇方向。",[230,231,303,297],"Claude",{"path":305,"title":306,"description":307,"category":228,"tags":308},"\u002Fposts\u002Fcodex-model-selection","Codex 模型簡單怎麼選？","整理 Codex 各模型在速度、能力與使用情境上的差異，提供從簡單修改到大型端到端任務的選擇方向。",[230,296,309,297],"OpenAI",{"path":311,"title":312,"description":313,"category":228,"tags":314},"\u002Fposts\u002Fclaude-code-codex-cli-command-cheatsheet","Claude Code \u002F Codex CLI 常用指令速查表","整理 Claude Code 與 Codex CLI 的常用斜線指令、快捷操作與進階功能，方便需要時快速查找。",[230,231,232,265,315],"速查表",{"id":317,"title":249,"body":318,"category":228,"description":250,"draft":1795,"extension":1454,"image":1796,"meta":1797,"navigation":1158,"path":248,"publishedAt":1798,"relatedExperiments":1799,"seo":1800,"stem":1801,"tags":1802,"updatedAt":1796,"__hash__":1803},"posts\u002Fposts\u002F20260904.claude-settings-codex-config.md",{"type":319,"value":320,"toc":1752},"minimark",[321,325,351,354,360,369,374,382,387,390,413,416,420,424,427,430,440,443,449,452,458,461,467,469,472,475,481,483,489,492,498,501,507,510,516,523,525,532,535,538,557,559,566,569,575,578,583,585,592,595,600,602,616,619,621,628,631,637,640,645,648,659,662,667,670,673,679,681,685,688,694,697,700,705,708,714,717,722,725,727,731,734,737,743,745,748,755,824,830,837,840,843,849,852,854,858,861,863,909,912,915,930,933,945,948,950,963,966,972,975,982,991,994,1024,1027,1029,1035,1037,1042,1045,1047,1068,1070,1073,1076,1082,1085,1091,1093,1108,1111,1113,1116,1119,1124,1126,1132,1135,1137,1141,1143,1180,1183,1189,1191,1196,1198,1208,1211,1214,1219,1222,1224,1229,1231,1242,1245,1250,1253,1256,1261,1264,1269,1271,1276,1278,1289,1292,1295,1301,1304,1310,1313,1316,1322,1325,1327,1331,1334,1337,1343,1346,1349,1354,1357,1362,1365,1367,1376,1379,1382,1388,1391,1394,1400,1403,1406,1412,1414,1418,1421,1426,1429,1434,1436,1440,1443,1448,1450,1482,1484,1488,1491,1496,1499,1504,1506,1511,1514,1517,1523,1526,1545,1548,1553,1556,1598,1601,1606,1609,1611,1615,1618,1621,1626,1629,1634,1636,1656,1658,1663,1665,1670,1672,1690,1692,1695,1697,1703,1705,1711,1714,1720,1723,1726,1731,1734,1737,1745,1748],[322,323,324],"p",{},"前面幾篇整理了：",[326,327,328,334,338,343,348],"ul",{},[329,330,331],"li",{},[332,333,234],"code",{},[329,335,336],{},[332,337,235],{},[329,339,340],{},[332,341,342],{},".claude\u002F",[329,344,345],{},[332,346,347],{},".codex\u002F",[329,349,350],{},"使用者層級與專案層級設定",[322,352,353],{},"接下來進一步看：",[355,356,357],"blockquote",{},[322,358,359],{},"Claude Code \u002F Codex 本身有哪些執行設定？",[322,361,362,363,365,366,368],{},"如果 ",[332,364,234],{},"、",[332,367,235],{}," 比較像是在告訴 AI：",[355,370,371],{},[322,372,373],{},"「這個專案應該怎麼工作？」",[322,375,376,377,365,379,381],{},"那 ",[332,378,252],{},[332,380,253],{}," 比較像是在控制：",[355,383,384],{},[322,385,386],{},"「Coding Agent 實際可以怎麼執行？」",[322,388,389],{},"例如：",[326,391,392,395,398,401,404,407,410],{},[329,393,394],{},"使用哪個 Model",[329,396,397],{},"哪些操作允許執行",[329,399,400],{},"哪些操作需要先詢問",[329,402,403],{},"Sandbox 可以存取哪些範圍",[329,405,406],{},"Hooks",[329,408,409],{},"環境設定",[329,411,412],{},"MCP \u002F 工具設定",[414,415],"hr",{},[417,418,419],"h3",{"id":419},"先看設定檔放哪裡",[421,422,231],"h4",{"id":423},"claude-code",[322,425,426],{},"Claude Code 主要使用 JSON 設定檔。",[322,428,429],{},"使用者層級：",[431,432,438],"pre",{"className":433,"code":435,"language":436,"meta":437},[434],"language-text","~\u002F.claude\u002F\n└─ settings.json\n","text","",[332,439,435],{"__ignoreMap":437},[322,441,442],{},"專案共用：",[431,444,447],{"className":445,"code":446,"language":436,"meta":437},[434],"my-project\u002F\n└─ .claude\u002F\n   └─ settings.json\n",[332,448,446],{"__ignoreMap":437},[322,450,451],{},"專案中的個人 Local 設定：",[431,453,456],{"className":454,"code":455,"language":436,"meta":437},[434],"my-project\u002F\n└─ .claude\u002F\n   └─ settings.local.json\n",[332,457,455],{"__ignoreMap":437},[322,459,460],{},"可以先簡單記成：",[431,462,465],{"className":463,"code":464,"language":436,"meta":437},[434],"~\u002F.claude\u002Fsettings.json\n↓\n自己的預設設定\n\n.claude\u002Fsettings.json\n↓\n專案共同使用的設定\n\n.claude\u002Fsettings.local.json\n↓\n自己在這個專案使用的設定\n",[332,466,464],{"__ignoreMap":437},[414,468],{},[421,470,296],{"id":471},"codex",[322,473,474],{},"Codex 主要使用：",[431,476,479],{"className":477,"code":478,"language":436,"meta":437},[434],"config.toml\n",[332,480,478],{"__ignoreMap":437},[322,482,429],{},[431,484,487],{"className":485,"code":486,"language":436,"meta":437},[434],"~\u002F.codex\u002F\n└─ config.toml\n",[332,488,486],{"__ignoreMap":437},[322,490,491],{},"Windows 通常可以寫成：",[431,493,496],{"className":494,"code":495,"language":436,"meta":437},[434],"%USERPROFILE%\\.codex\\\n└─ config.toml\n",[332,497,495],{"__ignoreMap":437},[322,499,500],{},"專案設定則可以放：",[431,502,505],{"className":503,"code":504,"language":436,"meta":437},[434],"my-project\u002F\n└─ .codex\u002F\n   └─ config.toml\n",[332,506,504],{"__ignoreMap":437},[322,508,509],{},"可以簡單記成：",[431,511,514],{"className":512,"code":513,"language":436,"meta":437},[434],"~\u002F.codex\u002Fconfig.toml\n↓\n自己的 Codex 預設設定\n\n.codex\u002Fconfig.toml\n↓\n目前專案的 Codex 設定\n",[332,515,513],{"__ignoreMap":437},[322,517,518,519,522],{},"Codex 只有在專案被視為 Trusted 時，才會讀取專案裡的 ",[332,520,521],{},".codex\u002Fconfig.toml","。",[414,524],{},[526,527,529,530],"h2",{"id":528},"claude-codesettingsjson","Claude Code：",[332,531,252],{},[322,533,534],{},"Claude Code 的主要設定檔使用 JSON。",[322,536,537],{},"例如可以設定：",[326,539,540,543,545,548,551,554],{},[329,541,542],{},"Permission",[329,544,406],{},[329,546,547],{},"環境變數",[329,549,550],{},"Plugin",[329,552,553],{},"工具行為",[329,555,556],{},"其他 Claude Code 設定",[414,558],{},[417,560,562,563],{"id":561},"使用者設定claudesettingsjson","使用者設定：",[332,564,565],{},"~\u002F.claude\u002Fsettings.json",[322,567,568],{},"如果希望某些設定套用到自己使用 Claude Code 的多個專案，可以放在：",[431,570,573],{"className":571,"code":572,"language":436,"meta":437},[434],"~\u002F.claude\u002Fsettings.json\n",[332,574,572],{"__ignoreMap":437},[322,576,577],{},"例如這些比較偏向：",[355,579,580],{},[322,581,582],{},"自己平常使用 Claude Code 的預設習慣。",[414,584],{},[417,586,588,589],{"id":587},"專案設定claudesettingsjson","專案設定：",[332,590,591],{},".claude\u002Fsettings.json",[322,593,594],{},"如果設定只屬於某個專案，或希望整個團隊共同使用，可以放：",[431,596,598],{"className":597,"code":446,"language":436,"meta":437},[434],[332,599,446],{"__ignoreMap":437},[322,601,389],{},[326,603,604,607,610,613],{},[329,605,606],{},"專案允許使用哪些 Command",[329,608,609],{},"專案需要哪些 Hook",[329,611,612],{},"團隊共同使用的 Permission",[329,614,615],{},"專案相關工具設定",[322,617,618],{},"這類設定就比較適合跟著專案一起管理。",[414,620],{},[417,622,624,625],{"id":623},"個人專案設定claudesettingslocaljson","個人專案設定：",[332,626,627],{},".claude\u002Fsettings.local.json",[322,629,630],{},"另外還有：",[431,632,635],{"className":633,"code":634,"language":436,"meta":437},[434],".claude\u002Fsettings.local.json\n",[332,636,634],{"__ignoreMap":437},[322,638,639],{},"可以把它理解成：",[355,641,642],{},[322,643,644],{},"我自己在「這個專案」裡使用的設定。",[322,646,647],{},"例如有某個 Permission：",[326,649,650,653,656],{},[329,651,652],{},"自己開發時需要",[329,654,655],{},"其他開發者不一定需要",[329,657,658],{},"不適合直接變成整個團隊的設定",[322,660,661],{},"這時就可以放在：",[431,663,665],{"className":664,"code":634,"language":436,"meta":437},[434],[332,666,634],{"__ignoreMap":437},[322,668,669],{},"這類 Local 設定通常不需要提交給其他開發者。",[322,671,672],{},"簡單理解：",[431,674,677],{"className":675,"code":676,"language":436,"meta":437},[434],"settings.json\n↓\n專案共用\n\nsettings.local.json\n↓\n專案裡自己使用\n",[332,678,676],{"__ignoreMap":437},[414,680],{},[417,682,684],{"id":683},"claude-code-設定層級","Claude Code 設定層級",[322,686,687],{},"如果先不討論企業環境的 Managed Settings，可以大致理解成：",[431,689,692],{"className":690,"code":691,"language":436,"meta":437},[434],"使用者設定\n~\u002F.claude\u002Fsettings.json\n        ↓\n\n專案設定\n.claude\u002Fsettings.json\n        ↓\n\n專案 Local 設定\n.claude\u002Fsettings.local.json\n",[332,693,691],{"__ignoreMap":437},[322,695,696],{},"越接近目前專案與個人的設定，可以補充或覆蓋比較上層的設定。",[322,698,699],{},"所以：",[431,701,703],{"className":702,"code":572,"language":436,"meta":437},[434],[332,704,572],{"__ignoreMap":437},[322,706,707],{},"適合放自己的預設值；",[431,709,712],{"className":710,"code":711,"language":436,"meta":437},[434],".claude\u002Fsettings.json\n",[332,713,711],{"__ignoreMap":437},[322,715,716],{},"放這個專案共同使用的內容；",[431,718,720],{"className":719,"code":634,"language":436,"meta":437},[434],[332,721,634],{"__ignoreMap":437},[322,723,724],{},"則放只有自己在這個專案需要的設定。",[414,726],{},[526,728,730],{"id":729},"claude-code-permission","Claude Code Permission",[322,732,733],{},"其中我覺得很重要的一項就是 Permission。",[322,735,736],{},"Claude Code 可以設定哪些操作：",[431,738,741],{"className":739,"code":740,"language":436,"meta":437},[434],"allow\n↓\n允許執行\n\nask\n↓\n執行前先詢問\n\ndeny\n↓\n禁止執行\n",[332,742,740],{"__ignoreMap":437},[414,744],{},[417,746,747],{"id":747},"禁止讀取敏感檔案",[322,749,750,751,754],{},"例如不希望 Claude Code 讀取 ",[332,752,753],{},".env","：",[431,756,760],{"className":757,"code":758,"language":759,"meta":437,"style":437},"language-json shiki shiki-themes github-light github-dark-default","{\n  \"permissions\": {\n    \"deny\": [\n      \"Read(.\u002F.env)\",\n      \"Read(.\u002F.env.*)\"\n    ]\n  }\n}\n","json",[332,761,762,771,781,790,800,806,812,818],{"__ignoreMap":437},[763,764,767],"span",{"class":765,"line":766},"line",1,[763,768,770],{"class":769},"szmH1","{\n",[763,772,774,778],{"class":765,"line":773},2,[763,775,777],{"class":776},"swgif","  \"permissions\"",[763,779,780],{"class":769},": {\n",[763,782,784,787],{"class":765,"line":783},3,[763,785,786],{"class":776},"    \"deny\"",[763,788,789],{"class":769},": [\n",[763,791,793,797],{"class":765,"line":792},4,[763,794,796],{"class":795},"sNbzA","      \"Read(.\u002F.env)\"",[763,798,799],{"class":769},",\n",[763,801,803],{"class":765,"line":802},5,[763,804,805],{"class":795},"      \"Read(.\u002F.env.*)\"\n",[763,807,809],{"class":765,"line":808},6,[763,810,811],{"class":769},"    ]\n",[763,813,815],{"class":765,"line":814},7,[763,816,817],{"class":769},"  }\n",[763,819,821],{"class":765,"line":820},8,[763,822,823],{"class":769},"}\n",[322,825,826,827,829],{},"這樣除了在 ",[332,828,234],{}," 裡告訴 AI：",[355,831,832],{},[322,833,834,835],{},"不要讀取 ",[332,836,753],{},[322,838,839],{},"還可以直接透過 Permission 限制工具行為。",[322,841,842],{},"兩者概念其實不太一樣：",[431,844,847],{"className":845,"code":846,"language":436,"meta":437},[434],"CLAUDE.md\n↓\n告訴 AI 不應該做什麼\n\nPermission\n↓\n直接限制工具能不能做\n",[332,848,846],{"__ignoreMap":437},[322,850,851],{},"如果是敏感資訊，我會比較傾向不只依賴 Prompt，而是搭配 Permission。",[414,853],{},[417,855,857],{"id":856},"允許特定-command","允許特定 Command",[322,859,860],{},"也可以允許某些常用 Command。",[322,862,389],{},[431,864,866],{"className":757,"code":865,"language":759,"meta":437,"style":437},"{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(npm lint)\",\n      \"Bash(npm test *)\"\n    ]\n  }\n}\n",[332,867,868,872,878,885,892,897,901,905],{"__ignoreMap":437},[763,869,870],{"class":765,"line":766},[763,871,770],{"class":769},[763,873,874,876],{"class":765,"line":773},[763,875,777],{"class":776},[763,877,780],{"class":769},[763,879,880,883],{"class":765,"line":783},[763,881,882],{"class":776},"    \"allow\"",[763,884,789],{"class":769},[763,886,887,890],{"class":765,"line":792},[763,888,889],{"class":795},"      \"Bash(npm lint)\"",[763,891,799],{"class":769},[763,893,894],{"class":765,"line":802},[763,895,896],{"class":795},"      \"Bash(npm test *)\"\n",[763,898,899],{"class":765,"line":808},[763,900,811],{"class":769},[763,902,903],{"class":765,"line":814},[763,904,817],{"class":769},[763,906,907],{"class":765,"line":820},[763,908,823],{"class":769},[322,910,911],{},"代表這些操作可以直接執行，不需要每次都重新詢問。",[322,913,914],{},"例如專案經常需要執行：",[431,916,920],{"className":917,"code":918,"language":919,"meta":437,"style":437},"language-bash shiki shiki-themes github-light github-dark-default","npm lint\n","bash",[332,921,922],{"__ignoreMap":437},[763,923,924,927],{"class":765,"line":766},[763,925,62],{"class":926},"sYRkA",[763,928,929],{"class":795}," lint\n",[322,931,932],{},"或：",[431,934,936],{"className":917,"code":935,"language":919,"meta":437,"style":437},"npm test\n",[332,937,938],{"__ignoreMap":437},[763,939,940,942],{"class":765,"line":766},[763,941,62],{"class":926},[763,943,944],{"class":795}," test\n",[322,946,947],{},"就可以依照自己的使用需求決定是否加入。",[414,949],{},[417,951,953,365,956,365,959,962],{"id":952},"denyaskallow-的優先順序",[332,954,955],{},"deny",[332,957,958],{},"ask",[332,960,961],{},"allow"," 的優先順序",[322,964,965],{},"Claude Code 判斷 Permission 時，可以先記一個順序：",[431,967,970],{"className":968,"code":969,"language":436,"meta":437},[434],"deny\n↓\nask\n↓\nallow\n",[332,971,969],{"__ignoreMap":437},[322,973,974],{},"也就是：",[355,976,977],{},[322,978,979,981],{},[332,980,955],{}," 的限制優先。",[322,983,984,985,987,988,990],{},"假設某個操作同時符合 ",[332,986,961],{}," 與 ",[332,989,955],{},"，仍然會被禁止。",[322,992,993],{},"所以敏感操作可以優先放在：",[431,995,997],{"className":757,"code":996,"language":759,"meta":437,"style":437},"{\n  \"permissions\": {\n    \"deny\": []\n  }\n}\n",[332,998,999,1003,1009,1016,1020],{"__ignoreMap":437},[763,1000,1001],{"class":765,"line":766},[763,1002,770],{"class":769},[763,1004,1005,1007],{"class":765,"line":773},[763,1006,777],{"class":776},[763,1008,780],{"class":769},[763,1010,1011,1013],{"class":765,"line":783},[763,1012,786],{"class":776},[763,1014,1015],{"class":769},": []\n",[763,1017,1018],{"class":765,"line":792},[763,1019,817],{"class":769},[763,1021,1022],{"class":765,"line":802},[763,1023,823],{"class":769},[322,1025,1026],{},"避免因為其他比較寬鬆的 Allow Rule 而被放行。",[414,1028],{},[526,1030,1032,1033],{"id":1031},"codexconfigtoml","Codex：",[332,1034,253],{},[322,1036,474],{},[431,1038,1040],{"className":1039,"code":478,"language":436,"meta":437},[434],[332,1041,478],{"__ignoreMap":437},[322,1043,1044],{},"來控制 Codex 本身的執行設定。",[322,1046,389],{},[326,1048,1049,1052,1055,1058,1061,1063,1065],{},[329,1050,1051],{},"Model",[329,1053,1054],{},"Reasoning",[329,1056,1057],{},"Approval",[329,1059,1060],{},"Sandbox",[329,1062,284],{},[329,1064,277],{},[329,1066,1067],{},"其他執行設定",[414,1069],{},[417,1071,1072],{"id":1072},"使用者設定",[322,1074,1075],{},"自己的預設設定可以放在：",[431,1077,1080],{"className":1078,"code":1079,"language":436,"meta":437},[434],"~\u002F.codex\u002Fconfig.toml\n",[332,1081,1079],{"__ignoreMap":437},[322,1083,1084],{},"Windows：",[431,1086,1089],{"className":1087,"code":1088,"language":436,"meta":437},[434],"%USERPROFILE%\\.codex\\config.toml\n",[332,1090,1088],{"__ignoreMap":437},[322,1092,389],{},[431,1094,1098],{"className":1095,"code":1096,"language":1097,"meta":437,"style":437},"language-toml shiki shiki-themes github-light github-dark-default","model = \"gpt-5.6\"\n","toml",[332,1099,1100],{"__ignoreMap":437},[763,1101,1102,1105],{"class":765,"line":766},[763,1103,1104],{"class":769},"model = ",[763,1106,1107],{"class":795},"\"gpt-5.6\"\n",[322,1109,1110],{},"代表設定自己的預設 Model。",[414,1112],{},[417,1114,1115],{"id":1115},"專案設定",[322,1117,1118],{},"如果某個設定只想套用到特定專案，可以建立：",[431,1120,1122],{"className":1121,"code":504,"language":436,"meta":437},[434],[332,1123,504],{"__ignoreMap":437},[322,1125,389],{},[431,1127,1130],{"className":1128,"code":1129,"language":436,"meta":437},[434],"~\u002F.codex\u002Fconfig.toml\n↓\n自己的預設設定\n\n.codex\u002Fconfig.toml\n↓\n這個專案的特殊設定\n",[332,1131,1129],{"__ignoreMap":437},[322,1133,1134],{},"所以如果不同專案需要不同的 Sandbox、MCP 或其他設定，就不需要全部放在自己的全域設定裡。",[414,1136],{},[526,1138,1140],{"id":1139},"codex-基本設定範例","Codex 基本設定範例",[322,1142,389],{},[431,1144,1146],{"className":1095,"code":1145,"language":1097,"meta":437,"style":437},"model = \"gpt-5.6\"\n\napproval_policy = \"on-request\"\n\nsandbox_mode = \"workspace-write\"\n",[332,1147,1148,1154,1160,1168,1172],{"__ignoreMap":437},[763,1149,1150,1152],{"class":765,"line":766},[763,1151,1104],{"class":769},[763,1153,1107],{"class":795},[763,1155,1156],{"class":765,"line":773},[763,1157,1159],{"emptyLinePlaceholder":1158},true,"\n",[763,1161,1162,1165],{"class":765,"line":783},[763,1163,1164],{"class":769},"approval_policy = ",[763,1166,1167],{"class":795},"\"on-request\"\n",[763,1169,1170],{"class":765,"line":792},[763,1171,1159],{"emptyLinePlaceholder":1158},[763,1173,1174,1177],{"class":765,"line":802},[763,1175,1176],{"class":769},"sandbox_mode = ",[763,1178,1179],{"class":795},"\"workspace-write\"\n",[322,1181,1182],{},"先簡單理解：",[431,1184,1187],{"className":1185,"code":1186,"language":436,"meta":437},[434],"model\n↓\n預設使用哪個模型\n\napproval_policy\n↓\nCodex 在什麼情況可以要求使用者批准操作\n\nsandbox_mode\n↓\nCodex 執行 Command 時，可以存取哪些範圍\n",[332,1188,1186],{"__ignoreMap":437},[414,1190],{},[417,1192,1194],{"id":1193},"model",[332,1195,1193],{},[322,1197,389],{},[431,1199,1200],{"className":1095,"code":1096,"language":1097,"meta":437,"style":437},[332,1201,1202],{"__ignoreMap":437},[763,1203,1204,1206],{"class":765,"line":766},[763,1205,1104],{"class":769},[763,1207,1107],{"class":795},[322,1209,1210],{},"用來設定預設使用的 Model。",[322,1212,1213],{},"如果平常固定使用某個模型，就可以放在自己的：",[431,1215,1217],{"className":1216,"code":1079,"language":436,"meta":437},[434],[332,1218,1079],{"__ignoreMap":437},[322,1220,1221],{},"如果某個專案有不同需求，也可以在專案設定中調整。",[414,1223],{},[417,1225,1227],{"id":1226},"approval_policy",[332,1228,1226],{},[322,1230,389],{},[431,1232,1234],{"className":1095,"code":1233,"language":1097,"meta":437,"style":437},"approval_policy = \"on-request\"\n",[332,1235,1236],{"__ignoreMap":437},[763,1237,1238,1240],{"class":765,"line":766},[763,1239,1164],{"class":769},[763,1241,1167],{"class":795},[322,1243,1244],{},"可以先理解成：",[355,1246,1247],{},[322,1248,1249],{},"Codex 在需要額外權限時，可以詢問使用者是否批准。",[322,1251,1252],{},"Approval 與 Sandbox 是兩個很容易混在一起的概念。",[322,1254,1255],{},"Approval 比較偏向：",[355,1257,1258],{},[322,1259,1260],{},"「這個操作需要問我嗎？」",[322,1262,1263],{},"而 Sandbox 比較偏向：",[355,1265,1266],{},[322,1267,1268],{},"「這個操作本身可以碰到哪裡？」",[414,1270],{},[417,1272,1274],{"id":1273},"sandbox_mode",[332,1275,1273],{},[322,1277,389],{},[431,1279,1281],{"className":1095,"code":1280,"language":1097,"meta":437,"style":437},"sandbox_mode = \"workspace-write\"\n",[332,1282,1283],{"__ignoreMap":437},[763,1284,1285,1287],{"class":765,"line":766},[763,1286,1176],{"class":769},[763,1288,1179],{"class":795},[322,1290,1291],{},"Sandbox 是用來限制 Codex 執行 Command 時能操作的範圍。",[322,1293,1294],{},"常見模式可以先簡單理解成：",[431,1296,1299],{"className":1297,"code":1298,"language":436,"meta":437},[434],"read-only\n↓\n主要只能讀取\n\nworkspace-write\n↓\n可以在目前 Workspace 中寫入\n\ndanger-full-access\n↓\n限制非常少\n",[332,1300,1298],{"__ignoreMap":437},[322,1302,1303],{},"一般開發情境下：",[431,1305,1308],{"className":1306,"code":1307,"language":436,"meta":437},[434],"workspace-write\n",[332,1309,1307],{"__ignoreMap":437},[322,1311,1312],{},"會比直接開放完整系統存取更容易控制範圍。",[322,1314,1315],{},"而：",[431,1317,1320],{"className":1318,"code":1319,"language":436,"meta":437},[434],"danger-full-access\n",[332,1321,1319],{"__ignoreMap":437},[322,1323,1324],{},"代表更高的操作能力，也代表需要更清楚自己正在開放什麼權限。",[414,1326],{},[526,1328,1330],{"id":1329},"approval-和-sandbox-差在哪","Approval 和 Sandbox 差在哪？",[322,1332,1333],{},"這兩個第一次看到很容易搞混。",[322,1335,1336],{},"我會先這樣記：",[431,1338,1341],{"className":1339,"code":1340,"language":436,"meta":437},[434],"Approval\n↓\n要不要先問我？\n\n\nSandbox\n↓\n就算允許執行，可以碰到哪裡？\n",[332,1342,1340],{"__ignoreMap":437},[322,1344,1345],{},"例如 Codex 想執行某個 Command。",[322,1347,1348],{},"第一個問題可能是：",[355,1350,1351],{},[322,1352,1353],{},"這個操作需不需要使用者批准？",[322,1355,1356],{},"接著才是：",[355,1358,1359],{},[322,1360,1361],{},"即使允許執行，Sandbox 可以讓它讀寫哪些檔案與資源？",[322,1363,1364],{},"所以兩者是不同層級的安全控制。",[414,1366],{},[526,1368,1370,1372,1373,1375],{"id":1369},"claudemd-agentsmd-和設定檔差在哪",[332,1371,234],{}," \u002F ",[332,1374,235],{}," 和設定檔差在哪？",[322,1377,1378],{},"寫到這裡，我覺得這是最容易混淆的地方。",[322,1380,1381],{},"前面介紹的：",[431,1383,1386],{"className":1384,"code":1385,"language":436,"meta":437},[434],"CLAUDE.md\nAGENTS.md\n",[332,1387,1385],{"__ignoreMap":437},[322,1389,1390],{},"也是在「設定 AI」。",[322,1392,1393],{},"那跟：",[431,1395,1398],{"className":1396,"code":1397,"language":436,"meta":437},[434],"settings.json\nconfig.toml\n",[332,1399,1397],{"__ignoreMap":437},[322,1401,1402],{},"到底有什麼差別？",[322,1404,1405],{},"可以先簡單理解：",[431,1407,1410],{"className":1408,"code":1409,"language":436,"meta":437},[434],"CLAUDE.md \u002F AGENTS.md\n↓\n告訴 AI「工作應該怎麼做」\n\n\nsettings.json \u002F config.toml\n↓\n控制 Coding Agent「實際可以怎麼執行」\n",[332,1411,1409],{"__ignoreMap":437},[322,1413,389],{},[421,1415,1417],{"id":1416},"專案統一使用-npm","專案統一使用 npm",[322,1419,1420],{},"比較適合：",[431,1422,1424],{"className":1423,"code":1385,"language":436,"meta":437},[434],[332,1425,1385],{"__ignoreMap":437},[322,1427,1428],{},"因為這是：",[355,1430,1431],{},[322,1432,1433],{},"專案工作規範。",[414,1435],{},[421,1437,1439],{"id":1438},"修改完成後一定執行-lint","修改完成後一定執行 lint",[322,1441,1442],{},"也比較偏向：",[431,1444,1446],{"className":1445,"code":1385,"language":436,"meta":437},[434],[332,1447,1385],{"__ignoreMap":437},[322,1449,389],{},[431,1451,1455],{"className":1452,"code":1453,"language":1454,"meta":437,"style":437},"language-md shiki shiki-themes github-light github-dark-default","修改完成後執行：\n\n- npm lint\n- npm test\n","md",[332,1456,1457,1462,1466,1475],{"__ignoreMap":437},[763,1458,1459],{"class":765,"line":766},[763,1460,1461],{"class":769},"修改完成後執行：\n",[763,1463,1464],{"class":765,"line":773},[763,1465,1159],{"emptyLinePlaceholder":1158},[763,1467,1468,1472],{"class":765,"line":783},[763,1469,1471],{"class":1470},"sjlk-","-",[763,1473,1474],{"class":769}," npm lint\n",[763,1476,1477,1479],{"class":765,"line":792},[763,1478,1471],{"class":1470},[763,1480,1481],{"class":769}," npm test\n",[414,1483],{},[421,1485,1487],{"id":1486},"是否允許直接執行-lint","是否允許直接執行 lint",[322,1489,1490],{},"這就比較偏向：",[431,1492,1494],{"className":1493,"code":1397,"language":436,"meta":437},[434],[332,1495,1397],{"__ignoreMap":437},[322,1497,1498],{},"因為這是在控制：",[355,1500,1501],{},[322,1502,1503],{},"Coding Agent 有沒有權限實際執行 Command。",[414,1505],{},[421,1507,834,1509],{"id":1508},"不要讀取-env",[332,1510,753],{},[322,1512,1513],{},"則兩邊都可以處理，但目的不同。",[322,1515,1516],{},"在：",[431,1518,1521],{"className":1519,"code":1520,"language":436,"meta":437},[434],"CLAUDE.md\n",[332,1522,1520],{"__ignoreMap":437},[322,1524,1525],{},"寫：",[431,1527,1529],{"className":1452,"code":1528,"language":1454,"meta":437,"style":437},"- 不要讀取 `.env`。\n",[332,1530,1531],{"__ignoreMap":437},[763,1532,1533,1535,1538,1542],{"class":765,"line":766},[763,1534,1471],{"class":1470},[763,1536,1537],{"class":769}," 不要讀取 ",[763,1539,1541],{"class":1540},"sPgVT","`.env`",[763,1543,1544],{"class":769},"。\n",[322,1546,1547],{},"是告訴 AI：",[355,1549,1550],{},[322,1551,1552],{},"這是專案規則。",[322,1554,1555],{},"而在 Permission 裡：",[431,1557,1558],{"className":757,"code":758,"language":759,"meta":437,"style":437},[332,1559,1560,1564,1570,1576,1582,1586,1590,1594],{"__ignoreMap":437},[763,1561,1562],{"class":765,"line":766},[763,1563,770],{"class":769},[763,1565,1566,1568],{"class":765,"line":773},[763,1567,777],{"class":776},[763,1569,780],{"class":769},[763,1571,1572,1574],{"class":765,"line":783},[763,1573,786],{"class":776},[763,1575,789],{"class":769},[763,1577,1578,1580],{"class":765,"line":792},[763,1579,796],{"class":795},[763,1581,799],{"class":769},[763,1583,1584],{"class":765,"line":802},[763,1585,805],{"class":795},[763,1587,1588],{"class":765,"line":808},[763,1589,811],{"class":769},[763,1591,1592],{"class":765,"line":814},[763,1593,817],{"class":769},[763,1595,1596],{"class":765,"line":820},[763,1597,823],{"class":769},[322,1599,1600],{},"則是：",[355,1602,1603],{},[322,1604,1605],{},"直接限制工具的能力。",[322,1607,1608],{},"所以比較重要的限制，不一定只能依靠其中一種方式。",[414,1610],{},[526,1612,1614],{"id":1613},"我自己會怎麼分","我自己會怎麼分？",[322,1616,1617],{},"目前我會先這樣判斷。",[322,1619,1620],{},"如果問題是：",[355,1622,1623],{},[322,1624,1625],{},"AI 應該怎麼工作？",[322,1627,1628],{},"放：",[431,1630,1632],{"className":1631,"code":1385,"language":436,"meta":437},[434],[332,1633,1385],{"__ignoreMap":437},[322,1635,389],{},[326,1637,1638,1641,1644,1647,1650,1653],{},[329,1639,1640],{},"Coding Style",[329,1642,1643],{},"專案架構",[329,1645,1646],{},"測試流程",[329,1648,1649],{},"套件管理規則",[329,1651,1652],{},"修改完成後要做什麼",[329,1654,1655],{},"哪些事情原則上不要做",[322,1657,1620],{},[355,1659,1660],{},[322,1661,1662],{},"AI 實際可以怎麼執行？",[322,1664,1628],{},[431,1666,1668],{"className":1667,"code":1397,"language":436,"meta":437},[434],[332,1669,1397],{"__ignoreMap":437},[322,1671,389],{},[326,1673,1674,1676,1678,1680,1682,1685,1687],{},[329,1675,542],{},[329,1677,1057],{},[329,1679,1060],{},[329,1681,1051],{},[329,1683,1684],{},"Hook",[329,1686,284],{},[329,1688,1689],{},"工具執行設定",[414,1691],{},[526,1693,1694],{"id":1694},"最後簡單整理",[322,1696,529],{},[431,1698,1701],{"className":1699,"code":1700,"language":436,"meta":437},[434],"~\u002F.claude\u002Fsettings.json\n↓\n使用者預設設定\n\n.claude\u002Fsettings.json\n↓\n專案共用設定\n\n.claude\u002Fsettings.local.json\n↓\n自己在目前專案使用的設定\n",[332,1702,1700],{"__ignoreMap":437},[322,1704,1032],{},[431,1706,1709],{"className":1707,"code":1708,"language":436,"meta":437},[434],"~\u002F.codex\u002Fconfig.toml\n↓\n使用者預設設定\n\n.codex\u002Fconfig.toml\n↓\n目前專案設定\n",[332,1710,1708],{"__ignoreMap":437},[322,1712,1713],{},"而整個概念可以先記成：",[431,1715,1718],{"className":1716,"code":1717,"language":436,"meta":437},[434],"CLAUDE.md \u002F AGENTS.md\n↓\n工作規則\n\n\nsettings.json \u002F config.toml\n↓\n工具執行設定\n",[332,1719,1717],{"__ignoreMap":437},[322,1721,1722],{},"第一次接觸不用急著把所有 Permission、Sandbox、Approval、Hook 都設定好。",[322,1724,1725],{},"我自己會比較傾向：",[355,1727,1728],{},[322,1729,1730],{},"先使用預設設定，實際遇到需要控制權限或工作流程的情況，再逐步增加。",[322,1732,1733],{},"不然一開始設定太多，反而很難知道到底是哪一條規則影響了 Agent 的行為。",[322,1735,1736],{},"先理解：",[355,1738,1739],{},[322,1740,1741],{},[1742,1743,1744],"strong",{},"規則是什麼、工具能做什麼、哪些操作需要批准。",[322,1746,1747],{},"後面再繼續深入 Permission、Sandbox、Hook 等設定，會比較容易理解。",[1749,1750,1751],"style",{},"html pre.shiki code .szmH1, html code.shiki .szmH1{--shiki-default:#24292E;--shiki-dark:#E6EDF3}html pre.shiki code .swgif, html code.shiki .swgif{--shiki-default:#005CC5;--shiki-dark:#7EE787}html pre.shiki code .sNbzA, html code.shiki .sNbzA{--shiki-default:#032F62;--shiki-dark:#A5D6FF}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 .sYRkA, html code.shiki .sYRkA{--shiki-default:#6F42C1;--shiki-dark:#FFA657}html pre.shiki code .sjlk-, html code.shiki .sjlk-{--shiki-default:#E36209;--shiki-dark:#FFA657}html pre.shiki code .sPgVT, html code.shiki .sPgVT{--shiki-default:#005CC5;--shiki-dark:#79C0FF}",{"title":437,"searchDepth":783,"depth":783,"links":1753},[1754,1758,1768,1774,1779,1784,1785,1793,1794],{"id":419,"depth":783,"text":419,"children":1755},[1756,1757],{"id":423,"depth":792,"text":231},{"id":471,"depth":792,"text":296},{"id":528,"depth":773,"text":1759,"children":1760},"Claude Code：settings.json",[1761,1763,1765,1767],{"id":561,"depth":783,"text":1762},"使用者設定：~\u002F.claude\u002Fsettings.json",{"id":587,"depth":783,"text":1764},"專案設定：.claude\u002Fsettings.json",{"id":623,"depth":783,"text":1766},"個人專案設定：.claude\u002Fsettings.local.json",{"id":683,"depth":783,"text":684},{"id":729,"depth":773,"text":730,"children":1769},[1770,1771,1772],{"id":747,"depth":783,"text":747},{"id":856,"depth":783,"text":857},{"id":952,"depth":783,"text":1773},"deny、ask、allow 的優先順序",{"id":1031,"depth":773,"text":1775,"children":1776},"Codex：config.toml",[1777,1778],{"id":1072,"depth":783,"text":1072},{"id":1115,"depth":783,"text":1115},{"id":1139,"depth":773,"text":1140,"children":1780},[1781,1782,1783],{"id":1193,"depth":783,"text":1193},{"id":1226,"depth":783,"text":1226},{"id":1273,"depth":783,"text":1273},{"id":1329,"depth":773,"text":1330},{"id":1369,"depth":773,"text":1786,"children":1787},"CLAUDE.md \u002F AGENTS.md 和設定檔差在哪？",[1788,1789,1790,1791],{"id":1416,"depth":792,"text":1417},{"id":1438,"depth":792,"text":1439},{"id":1486,"depth":792,"text":1487},{"id":1508,"depth":792,"text":1792},"不要讀取 .env",{"id":1613,"depth":773,"text":1614},{"id":1694,"depth":773,"text":1694},false,null,{},"2026-09-04",[],{"title":249,"description":250},"posts\u002F20260904.claude-settings-codex-config",[230,231,232,252,253],"FBbdkXbOi2_YgG3ZOZ5wt4Ye4PJEM4KRiN4s4xTdPf8",[1805,1808],{"title":256,"path":255,"stem":1806,"description":257,"category":228,"publishedAt":1807,"children":-1},"posts\u002F20260905.claude-codex-rules-structure","2026-09-05",{"title":243,"path":242,"stem":1809,"description":244,"category":228,"publishedAt":1810,"children":-1},"posts\u002F20260903.claude-codex-config-locations","2026-09-03",1791786900710]