[{"data":1,"prerenderedAt":963},["ShallowReactive",2],{"search-dialog-posts":3,"post-\u002Fposts\u002Fclaude-codex-rules-structure":316,"post-surround-\u002Fposts\u002Fclaude-codex-rules-structure":956},[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":256,"body":318,"category":228,"description":257,"draft":947,"extension":443,"image":948,"meta":949,"navigation":460,"path":255,"publishedAt":950,"relatedExperiments":951,"seo":952,"stem":953,"tags":954,"updatedAt":948,"__hash__":955},"posts\u002Fposts\u002F20260905.claude-codex-rules-structure.md",{"type":319,"value":320,"toc":934},"minimark",[321,325,336,339,342,364,367,372,375,378,387,390,398,401,407,410,412,418,421,427,430,436,439,489,492,498,501,507,510,512,516,519,525,528,534,537,543,546,552,555,561,564,569,571,577,580,582,587,590,593,599,601,607,610,615,618,621,627,634,636,642,644,651,654,657,663,666,672,674,680,683,689,692,694,698,701,749,751,757,760,766,769,774,776,780,783,789,792,798,801,807,810,813,815,819,822,825,831,834,840,843,849,852,858,861,864,869,872,875,883,886,889,891,897,899,905,908,914,917,920,927,930],[322,323,324],"p",{},"前面整理過：",[326,327,333],"pre",{"className":328,"code":330,"language":331,"meta":332},[329],"language-text","CLAUDE.md\nAGENTS.md\n","text","",[334,335,330],"code",{"__ignoreMap":332},[322,337,338],{},"這兩個檔案可以放 AI Coding Agent 在專案中需要知道的工作規則。",[322,340,341],{},"例如：",[343,344,345,349,352,355,358,361],"ul",{},[346,347,348],"li",{},"專案使用什麼技術",[346,350,351],{},"常用開發指令",[346,353,354],{},"Coding Style",[346,356,357],{},"測試方式",[346,359,360],{},"修改限制",[346,362,363],{},"驗證流程",[322,365,366],{},"一般小型專案其實先使用：",[326,368,370],{"className":369,"code":330,"language":331,"meta":332},[329],[334,371,330],{"__ignoreMap":332},[322,373,374],{},"就已經很夠用了。",[322,376,377],{},"不用一開始就建立很多規則檔案。",[322,379,380,381,383,384,386],{},"等到規則真的越來越多，",[334,382,234],{}," 或 ",[334,385,235],{}," 開始不好整理時，再考慮把它們拆開。",[388,389],"hr",{},[391,392,394,395],"h2",{"id":393},"claude-codeclauderules","Claude Code：",[334,396,397],{},".claude\u002Frules\u002F",[322,399,400],{},"Claude Code 可以使用：",[326,402,405],{"className":403,"code":404,"language":331,"meta":332},[329],".claude\u002F\n└─ rules\u002F\n",[334,406,404],{"__ignoreMap":332},[322,408,409],{},"把比較多的專案規則拆成不同 Markdown。",[322,411,341],{},[326,413,416],{"className":414,"code":415,"language":331,"meta":332},[329],"my-project\u002F\n├─ CLAUDE.md\n│\n└─ .claude\u002F\n   └─ rules\u002F\n      ├─ testing.md\n      └─ security.md\n",[334,417,415],{"__ignoreMap":332},[322,419,420],{},"可以先簡單理解：",[326,422,425],{"className":423,"code":424,"language":331,"meta":332},[329],"CLAUDE.md\n↓\n主要專案規則\n\n\n.claude\u002Frules\u002F\n↓\n規則變多後\n拆開分類管理\n",[334,426,424],{"__ignoreMap":332},[322,428,429],{},"例如測試相關規則越來越多，就可以另外建立：",[326,431,434],{"className":432,"code":433,"language":331,"meta":332},[329],".claude\u002Frules\u002Ftesting.md\n",[334,435,433],{"__ignoreMap":332},[322,437,438],{},"內容可能是：",[326,440,444],{"className":441,"code":442,"language":443,"meta":332,"style":332},"language-md shiki shiki-themes github-light github-dark-default","# Testing\n\n- 修改功能後執行相關測試。\n- Bug Fix 如果可以重現，考慮補上 Regression Test。\n- 測試失敗時先確認原因，不直接刪除既有測試。\n","md",[334,445,446,455,462,473,481],{"__ignoreMap":332},[447,448,451],"span",{"class":449,"line":450},"line",1,[447,452,454],{"class":453},"sNGiL","# Testing\n",[447,456,458],{"class":449,"line":457},2,[447,459,461],{"emptyLinePlaceholder":460},true,"\n",[447,463,465,469],{"class":449,"line":464},3,[447,466,468],{"class":467},"sjlk-","-",[447,470,472],{"class":471},"szmH1"," 修改功能後執行相關測試。\n",[447,474,476,478],{"class":449,"line":475},4,[447,477,468],{"class":467},[447,479,480],{"class":471}," Bug Fix 如果可以重現，考慮補上 Regression Test。\n",[447,482,484,486],{"class":449,"line":483},5,[447,485,468],{"class":467},[447,487,488],{"class":471}," 測試失敗時先確認原因，不直接刪除既有測試。\n",[322,490,491],{},"原本全部放在：",[326,493,496],{"className":494,"code":495,"language":331,"meta":332},[329],"CLAUDE.md\n",[334,497,495],{"__ignoreMap":332},[322,499,500],{},"之後變成：",[326,502,505],{"className":503,"code":504,"language":331,"meta":332},[329],"CLAUDE.md\n↓\n留下主要規則\n\n\ntesting.md\n↓\n測試相關規則\n\n\nsecurity.md\n↓\n安全相關規則\n",[334,506,504],{"__ignoreMap":332},[322,508,509],{},"主要目的就是讓文件比較容易整理。",[388,511],{},[391,513,515],{"id":514},"不一定要拆很多-rules","不一定要拆很多 Rules",[322,517,518],{},"看到：",[326,520,523],{"className":521,"code":522,"language":331,"meta":332},[329],".claude\u002Frules\u002F\n",[334,524,522],{"__ignoreMap":332},[322,526,527],{},"不代表一定要建立：",[326,529,532],{"className":530,"code":531,"language":331,"meta":332},[329],"frontend.md\nbackend.md\ndatabase.md\ntesting.md\nsecurity.md\n...\n",[334,533,531],{"__ignoreMap":332},[322,535,536],{},"如果目前只有一類規則特別多，也可以只有：",[326,538,541],{"className":539,"code":540,"language":331,"meta":332},[329],".claude\u002F\n└─ rules\u002F\n   └─ testing.md\n",[334,542,540],{"__ignoreMap":332},[322,544,545],{},"需要什麼再增加什麼即可。",[322,547,548,549,551],{},"如果現在 ",[334,550,234],{}," 本身內容不多，而且很好理解，也完全可以維持原樣。",[322,553,554],{},"Rules 比較像：",[556,557,558],"blockquote",{},[322,559,560],{},"規則開始變多之後的整理方式。",[322,562,563],{},"而不是：",[556,565,566],{},[322,567,568],{},"每個 Claude Code 專案都一定要建立的結構。",[388,570],{},[391,572,574,575],{"id":573},"codex使用不同目錄的-agentsmd","Codex：使用不同目錄的 ",[334,576,235],{},[322,578,579],{},"Codex 在專案規則這件事情上，做法跟 Claude Code 不太一樣。",[322,581,400],{},[326,583,585],{"className":584,"code":522,"language":331,"meta":332},[329],[334,586,522],{"__ignoreMap":332},[322,588,589],{},"拆分規則。",[322,591,592],{},"Codex 則可以在不同目錄放：",[326,594,597],{"className":595,"code":596,"language":331,"meta":332},[329],"AGENTS.md\n",[334,598,596],{"__ignoreMap":332},[322,600,341],{},[326,602,605],{"className":603,"code":604,"language":331,"meta":332},[329],"my-project\u002F\n├─ AGENTS.md\n│\n└─ server\u002F\n   └─ AGENTS.md\n",[334,606,604],{"__ignoreMap":332},[322,608,609],{},"根目錄的：",[326,611,613],{"className":612,"code":596,"language":331,"meta":332},[329],[334,614,596],{"__ignoreMap":332},[322,616,617],{},"可以放整個專案共同需要知道的規則。",[322,619,620],{},"而：",[326,622,625],{"className":623,"code":624,"language":331,"meta":332},[329],"server\u002FAGENTS.md\n",[334,626,624],{"__ignoreMap":332},[322,628,629,630,633],{},"則可以補充 ",[334,631,632],{},"server\u002F"," 這個區域特有的規則。",[322,635,420],{},[326,637,640],{"className":638,"code":639,"language":331,"meta":332},[329],"根目錄 AGENTS.md\n↓\n整個專案的規則\n\n\n子目錄 AGENTS.md\n↓\n該區域額外需要知道的規則\n",[334,641,639],{"__ignoreMap":332},[388,643],{},[391,645,647,648,650],{"id":646},"一定要建立很多-agentsmd-嗎","一定要建立很多 ",[334,649,235],{}," 嗎？",[322,652,653],{},"也不用。",[322,655,656],{},"例如一般小型專案：",[326,658,661],{"className":659,"code":660,"language":331,"meta":332},[329],"my-project\u002F\n└─ AGENTS.md\n",[334,662,660],{"__ignoreMap":332},[322,664,665],{},"其實就可以了。",[322,667,668,669,671],{},"只有當專案真的變大，而且不同區域的開發方式開始出現明顯差異時，才需要考慮增加子目錄的 ",[334,670,235],{},"。",[322,673,341],{},[326,675,678],{"className":676,"code":677,"language":331,"meta":332},[329],"frontend\u002F\nserver\u002F\n",[334,679,677],{"__ignoreMap":332},[322,681,682],{},"兩邊有完全不同的開發規範，這時才可能變成：",[326,684,687],{"className":685,"code":686,"language":331,"meta":332},[329],"my-project\u002F\n├─ AGENTS.md\n│\n├─ frontend\u002F\n│  └─ AGENTS.md\n│\n└─ server\u002F\n   └─ AGENTS.md\n",[334,688,686],{"__ignoreMap":332},[322,690,691],{},"不用一開始就把所有目錄都放一份。",[388,693],{},[391,695,697],{"id":696},"claude-code-codex-可以先這樣記","Claude Code \u002F Codex 可以先這樣記",[322,699,700],{},"如果只是先理解 Rules，我覺得記這些就夠了：",[702,703,704,715],"table",{},[705,706,707],"thead",{},[708,709,710,713],"tr",{},[711,712,231],"th",{},[711,714,296],{},[716,717,718,729,741],"tbody",{},[708,719,720,725],{},[721,722,723],"td",{},[334,724,234],{},[721,726,727],{},[334,728,235],{},[708,730,731,736],{},[721,732,733],{},[334,734,735],{},".claude\u002Frules\u002F*.md",[721,737,738,739],{},"子目錄 ",[334,740,235],{},[708,742,743,746],{},[721,744,745],{},"規則可以依主題拆開",[721,747,748],{},"規則可以依目錄拆開",[322,750,341],{},[326,752,755],{"className":753,"code":754,"language":331,"meta":332},[329],"Claude Code\n\nCLAUDE.md\n↓\n主要規則\n\n.claude\u002Frules\u002Ftesting.md\n↓\n測試規則\n",[334,756,754],{"__ignoreMap":332},[322,758,759],{},"Codex：",[326,761,764],{"className":762,"code":763,"language":331,"meta":332},[329],"AGENTS.md\n↓\n主要規則\n\nserver\u002FAGENTS.md\n↓\nserver 區域規則\n",[334,765,763],{"__ignoreMap":332},[322,767,768],{},"兩邊的做法不同，但目的很接近：",[556,770,771],{},[322,772,773],{},"專案規則開始變多後，不需要全部塞在同一份文件。",[388,775],{},[391,777,779],{"id":778},"什麼時候才需要拆-rules","什麼時候才需要拆 Rules？",[322,781,782],{},"我目前會先把它理解成：",[326,784,787],{"className":785,"code":786,"language":331,"meta":332},[329],"規則不多\n↓\nCLAUDE.md \u002F AGENTS.md 就好\n",[334,788,786],{"__ignoreMap":332},[322,790,791],{},"等到真的出現：",[326,793,796],{"className":794,"code":795,"language":331,"meta":332},[329],"規則越來越多\n↓\n一份文件不好整理\n",[334,797,795],{"__ignoreMap":332},[322,799,800],{},"或者：",[326,802,805],{"className":803,"code":804,"language":331,"meta":332},[329],"不同區域\n↓\n有不同的開發規則\n",[334,806,804],{"__ignoreMap":332},[322,808,809],{},"再開始拆即可。",[322,811,812],{},"不需要為了讓 AI Coding 設定看起來「很完整」，一開始就建立很多檔案。",[388,814],{},[391,816,818],{"id":817},"不知道怎麼拆可以先請-ai-幫忙整理","不知道怎麼拆，可以先請 AI 幫忙整理",[322,820,821],{},"如果已經累積不少規則，但不知道該怎麼分類，也不用一開始就自己設計完整結構。",[322,823,824],{},"可以先請 AI：",[326,826,829],{"className":827,"code":828,"language":331,"meta":332},[329],"閱讀目前的 CLAUDE.md \u002F AGENTS.md，\n幫我找出哪些規則適合保留在主文件，\n哪些規則可以另外分類。\n\n先提出拆分建議，不要直接修改檔案。\n",[334,830,828],{"__ignoreMap":332},[322,832,833],{},"AI 可以先根據內容整理成類似：",[326,835,838],{"className":836,"code":837,"language":331,"meta":332},[329],"主要專案規則\n→ 保留在 CLAUDE.md \u002F AGENTS.md\n\nTesting\n→ 測試相關規則\n\nSecurity\n→ 安全相關規則\n\nAPI\n→ API 開發規則\n",[334,839,837],{"__ignoreMap":332},[322,841,842],{},"如果專案本身已經有明確的目錄結構，也可以請 AI 一起參考：",[326,844,847],{"className":845,"code":846,"language":331,"meta":332},[329],"請閱讀目前的專案結構與規則文件，\n判斷是否真的需要拆 Rules。\n\n如果需要：\n1. 建議怎麼分類\n2. 說明每一類為什麼值得拆開\n3. 先給我預計建立的檔案清單\n4. 等我確認後再修改\n",[334,848,846],{"__ignoreMap":332},[322,850,851],{},"我覺得這種方式比直接跟 AI 說：",[326,853,856],{"className":854,"code":855,"language":331,"meta":332},[329],"幫我把 Rules 全部拆好\n",[334,857,855],{"__ignoreMap":332},[322,859,860],{},"更容易控制。",[322,862,863],{},"因為有些專案其實規則並不多，AI 看完後也可能發現：",[556,865,866],{},[322,867,868],{},"目前不用拆，維持一份文件比較簡單。",[322,870,871],{},"這反而也是合理的結果。",[322,873,874],{},"所以在不知道怎麼拆的情況下，可以先把 AI 當成：",[556,876,877],{},[322,878,879],{},[880,881,882],"strong",{},"協助分類與整理規則的人。",[322,884,885],{},"先讓它提出方案，再決定是否真的拆分即可。",[391,887,888],{"id":888},"最後簡單整理",[322,890,394],{},[326,892,895],{"className":893,"code":894,"language":331,"meta":332},[329],"CLAUDE.md\n↓\n主要專案規則\n\n規則變多\n↓\n.claude\u002Frules\u002F\n",[334,896,894],{"__ignoreMap":332},[322,898,759],{},[326,900,903],{"className":901,"code":902,"language":331,"meta":332},[329],"AGENTS.md\n↓\n主要專案規則\n\n某個子目錄有自己的規則\n↓\n子目錄 AGENTS.md\n",[334,904,902],{"__ignoreMap":332},[322,906,907],{},"所以對一般專案來說：",[326,909,912],{"className":910,"code":911,"language":331,"meta":332},[329],"先從 CLAUDE.md \u002F AGENTS.md 開始\n        ↓\n實際使用\n        ↓\n規則真的開始增加\n        ↓\n再考慮拆分\n",[334,913,911],{"__ignoreMap":332},[322,915,916],{},"就可以了。",[322,918,919],{},"Rules 對我來說比較像是：",[556,921,922],{},[322,923,924],{},[880,925,926],{},"專案規則變多之後的整理工具。",[322,928,929],{},"而不是建立 AI Coding 環境時一定要先準備完整的一套設定。",[931,932,933],"style",{},"html pre.shiki code .sNGiL, html code.shiki .sNGiL{--shiki-default:#005CC5;--shiki-default-font-weight:bold;--shiki-dark:#79C0FF;--shiki-dark-font-weight:bold}html pre.shiki code .sjlk-, html code.shiki .sjlk-{--shiki-default:#E36209;--shiki-dark:#FFA657}html pre.shiki code .szmH1, html code.shiki .szmH1{--shiki-default:#24292E;--shiki-dark:#E6EDF3}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);}",{"title":332,"searchDepth":464,"depth":464,"links":935},[936,938,939,941,943,944,945,946],{"id":393,"depth":457,"text":937},"Claude Code：.claude\u002Frules\u002F",{"id":514,"depth":457,"text":515},{"id":573,"depth":457,"text":940},"Codex：使用不同目錄的 AGENTS.md",{"id":646,"depth":457,"text":942},"一定要建立很多 AGENTS.md 嗎？",{"id":696,"depth":457,"text":697},{"id":778,"depth":457,"text":779},{"id":817,"depth":457,"text":818},{"id":888,"depth":457,"text":888},false,null,{},"2026-09-05",[],{"title":256,"description":257},"posts\u002F20260905.claude-codex-rules-structure",[230,231,232,259,235],"WI-zV8Xrpq9vM3cckjLzX-HJGNjpjpwGZ1PI3lhOlt0",[957,960],{"title":262,"path":261,"stem":958,"description":263,"category":228,"publishedAt":959,"children":-1},"posts\u002F20260906.claude-codex-slash-commands","2026-09-06",{"title":249,"path":248,"stem":961,"description":250,"category":228,"publishedAt":962,"children":-1},"posts\u002F20260904.claude-settings-codex-config","2026-09-04",1791786900662]