[{"data":1,"prerenderedAt":2027},["ShallowReactive",2],{"search-dialog-posts":3,"post-\u002Fposts\u002Fclaude-agents-md-project-guidelines":316,"post-surround-\u002Fposts\u002Fclaude-agents-md-project-guidelines":2020},[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":238,"body":318,"category":228,"description":239,"draft":2011,"extension":541,"image":2012,"meta":2013,"navigation":555,"path":237,"publishedAt":2014,"relatedExperiments":2015,"seo":2016,"stem":2017,"tags":2018,"updatedAt":2012,"__hash__":2019},"posts\u002Fposts\u002F20260902.claude-agents-md-project-guidelines.md",{"type":319,"value":320,"toc":1991},"minimark",[321,330,333,339,342,363,366,375,378,383,386,394,397,407,410,455,458,465,467,470,475,478,498,501,516,522,525,528,535,537,616,619,625,635,637,640,645,647,874,877,897,902,904,910,913,916,941,944,963,966,968,972,975,979,982,984,1028,1031,1033,1083,1086,1088,1128,1131,1134,1136,1181,1184,1187,1189,1224,1227,1230,1233,1240,1242,1304,1306,1310,1313,1320,1323,1326,1343,1346,1348,1351,1354,1359,1362,1365,1368,1374,1377,1379,1383,1386,1389,1403,1406,1409,1422,1425,1434,1437,1440,1488,1491,1500,1507,1509,1513,1516,1527,1536,1542,1548,1557,1560,1596,1599,1601,1607,1610,1612,1616,1619,1621,1647,1655,1658,1661,1663,1669,1672,1674,1677,1680,1923,1926,1929,1931,1934,1942,1949,1952,1955,1978,1981,1984,1987],[322,323,324,325,329],"p",{},"上一篇整理了 Claude Code、Codex CLI 與 ",[326,327,328],"code",{},"\u002Finit"," 的一些基本使用方式。",[322,331,332],{},"實際開始讓 AI 參與專案開發後，我發現另一個很重要的問題：",[334,335,336],"blockquote",{},[322,337,338],{},"每次開新的 Session，都要重新跟 AI 說一次專案規則嗎？",[322,340,341],{},"例如：",[343,344,345,351,354,357,360],"ul",{},[346,347,348,349],"li",{},"這個專案使用 ",[326,350,62],{},[346,352,353],{},"使用 Nuxt 4 + TypeScript",[346,355,356],{},"不要隨意增加新的套件",[346,358,359],{},"修改完成後要執行 lint \u002F test",[346,361,362],{},"某些檔案不能直接修改",[322,364,365],{},"如果每次重新開啟 Claude Code 或 Codex 都要再說一次，其實很麻煩。",[322,367,368,369,371,372,374],{},"這時候就可以把這些「AI 長期需要知道的專案規則」整理到 ",[326,370,234],{}," 或 ",[326,373,235],{},"。",[376,377],"hr",{},[379,380,382],"h2",{"id":381},"claudemd-agentsmd-是什麼","CLAUDE.md \u002F AGENTS.md 是什麼？",[322,384,385],{},"簡單來說，可以把它們理解成：",[334,387,388],{},[322,389,390],{},[391,392,393],"strong",{},"寫給 AI Coding Agent 看的專案工作說明。",[322,395,396],{},"例如專案：",[398,399,405],"pre",{"className":400,"code":402,"language":403,"meta":404},[401],"language-text","my-project\u002F\n├─ CLAUDE.md\n├─ AGENTS.md\n├─ package.json\n├─ nuxt.config.ts\n└─ ...\n","text","",[326,406,402],{"__ignoreMap":404},[322,408,409],{},"兩者的用途很接近，但主要使用的工具不同。",[411,412,413,429],"table",{},[414,415,416],"thead",{},[417,418,419,423,426],"tr",{},[420,421,422],"th",{},"文件",[420,424,425],{},"主要工具",[420,427,428],{},"用途",[430,431,432,444],"tbody",{},[417,433,434,439,441],{},[435,436,437],"td",{},[326,438,234],{},[435,440,231],{},[435,442,443],{},"提供 Claude 長期需要知道的專案規則與 Context",[417,445,446,450,452],{},[435,447,448],{},[326,449,235],{},[435,451,296],{},[435,453,454],{},"提供 Codex 專案規範、測試方式、開發流程等資訊",[322,456,457],{},"它們不是用來取代 README 或完整技術文件，而是整理：",[334,459,460],{},[322,461,462],{},[391,463,464],{},"AI 每次進入這個專案工作時，都應該知道什麼？",[376,466],{},[379,468,234],{"id":469},"claudemd",[322,471,472,474],{},[326,473,234],{}," 是 Claude Code 使用的專案指示文件。",[322,476,477],{},"例如可以記錄：",[343,479,480,483,486,489,492,495],{},[346,481,482],{},"Coding Style",[346,484,485],{},"Build \u002F Test 指令",[346,487,488],{},"專案架構上的特殊規則",[346,490,491],{},"套件管理方式",[346,493,494],{},"工作流程",[346,496,497],{},"AI 經常弄錯的地方",[322,499,500],{},"可以使用：",[398,502,506],{"className":503,"code":504,"language":505,"meta":404,"style":404},"language-bash shiki shiki-themes github-light github-dark-default","\u002Finit\n","bash",[326,507,508],{"__ignoreMap":404},[509,510,513],"span",{"class":511,"line":512},"line",1,[509,514,504],{"class":515},"sYRkA",[322,517,518,519,521],{},"讓 Claude Code分析目前的專案並產生一份初始的 ",[326,520,234],{},"，之後再依照自己的需求調整。",[322,523,524],{},"不過我不太建議產生後就完全不管它。",[322,526,527],{},"真正重要的通常不是「AI 可以從程式碼自己看出來的事情」，而是：",[334,529,530],{},[322,531,532],{},[391,533,534],{},"AI 看程式碼不一定能知道，但實際開發時必須遵守的規則。",[322,536,341],{},[398,538,542],{"className":539,"code":540,"language":541,"meta":404,"style":404},"language-md shiki shiki-themes github-light github-dark-default","## Package Manager\n\n- 本專案統一使用 npm。\n- 不要使用 pnpm 或 yarn。\n\n## 開發規範\n\n- 新增程式碼使用 TypeScript。\n- 優先沿用現有元件。\n- 不要為了簡單功能額外安裝套件。\n","md",[326,543,544,550,557,568,576,581,587,592,600,608],{"__ignoreMap":404},[509,545,546],{"class":511,"line":512},[509,547,549],{"class":548},"sNGiL","## Package Manager\n",[509,551,553],{"class":511,"line":552},2,[509,554,556],{"emptyLinePlaceholder":555},true,"\n",[509,558,560,564],{"class":511,"line":559},3,[509,561,563],{"class":562},"sjlk-","-",[509,565,567],{"class":566},"szmH1"," 本專案統一使用 npm。\n",[509,569,571,573],{"class":511,"line":570},4,[509,572,563],{"class":562},[509,574,575],{"class":566}," 不要使用 pnpm 或 yarn。\n",[509,577,579],{"class":511,"line":578},5,[509,580,556],{"emptyLinePlaceholder":555},[509,582,584],{"class":511,"line":583},6,[509,585,586],{"class":548},"## 開發規範\n",[509,588,590],{"class":511,"line":589},7,[509,591,556],{"emptyLinePlaceholder":555},[509,593,595,597],{"class":511,"line":594},8,[509,596,563],{"class":562},[509,598,599],{"class":566}," 新增程式碼使用 TypeScript。\n",[509,601,603,605],{"class":511,"line":602},9,[509,604,563],{"class":562},[509,606,607],{"class":566}," 優先沿用現有元件。\n",[509,609,611,613],{"class":511,"line":610},10,[509,612,563],{"class":562},[509,614,615],{"class":566}," 不要為了簡單功能額外安裝套件。\n",[322,617,618],{},"這類資訊就很適合放進去。",[322,620,621,622,624],{},"另外，",[326,623,234],{}," 會佔用 Context，所以也不是寫得越多越好。",[322,626,627,628,630,631,634],{},"官方目前建議單份 ",[326,629,234],{}," 盡量保持精簡，以 ",[391,632,633],{},"200 行內為目標","。如果內容開始變得很多，可以再考慮拆分規則。",[376,636],{},[379,638,235],{"id":639},"agentsmd",[322,641,642,644],{},[326,643,235],{}," 則可以提供 Codex 專案相關的工作指示。",[322,646,341],{},[398,648,650],{"className":539,"code":649,"language":541,"meta":404,"style":404},"# Project Guidelines\n\n## Stack\n\n- Nuxt 4\n- Vue 3\n- TypeScript\n- Tailwind CSS\n- npm\n\n## Commands\n\n- Development: `npm dev`\n- Lint: `npm lint`\n- Test: `npm test`\n- Build: `npm build`\n\n## Coding Rules\n\n- 使用 Composition API。\n- 新增程式碼使用 TypeScript。\n- 優先沿用現有元件。\n- 不任意增加新的 dependency。\n\n## Validation\n\n完成修改後：\n\n1. 執行 lint。\n2. 執行相關測試。\n3. 確認 build 正常。\n4. 檢查 git diff，避免修改到無關檔案。\n",[326,651,652,657,661,666,670,677,684,691,698,705,709,715,720,732,743,754,765,770,776,781,789,796,803,811,816,822,827,833,838,847,856,865],{"__ignoreMap":404},[509,653,654],{"class":511,"line":512},[509,655,656],{"class":548},"# Project Guidelines\n",[509,658,659],{"class":511,"line":552},[509,660,556],{"emptyLinePlaceholder":555},[509,662,663],{"class":511,"line":559},[509,664,665],{"class":548},"## Stack\n",[509,667,668],{"class":511,"line":570},[509,669,556],{"emptyLinePlaceholder":555},[509,671,672,674],{"class":511,"line":578},[509,673,563],{"class":562},[509,675,676],{"class":566}," Nuxt 4\n",[509,678,679,681],{"class":511,"line":583},[509,680,563],{"class":562},[509,682,683],{"class":566}," Vue 3\n",[509,685,686,688],{"class":511,"line":589},[509,687,563],{"class":562},[509,689,690],{"class":566}," TypeScript\n",[509,692,693,695],{"class":511,"line":594},[509,694,563],{"class":562},[509,696,697],{"class":566}," Tailwind CSS\n",[509,699,700,702],{"class":511,"line":602},[509,701,563],{"class":562},[509,703,704],{"class":566}," npm\n",[509,706,707],{"class":511,"line":610},[509,708,556],{"emptyLinePlaceholder":555},[509,710,712],{"class":511,"line":711},11,[509,713,714],{"class":548},"## Commands\n",[509,716,718],{"class":511,"line":717},12,[509,719,556],{"emptyLinePlaceholder":555},[509,721,723,725,728],{"class":511,"line":722},13,[509,724,563],{"class":562},[509,726,727],{"class":566}," Development: ",[509,729,731],{"class":730},"sPgVT","`npm dev`\n",[509,733,735,737,740],{"class":511,"line":734},14,[509,736,563],{"class":562},[509,738,739],{"class":566}," Lint: ",[509,741,742],{"class":730},"`npm lint`\n",[509,744,746,748,751],{"class":511,"line":745},15,[509,747,563],{"class":562},[509,749,750],{"class":566}," Test: ",[509,752,753],{"class":730},"`npm test`\n",[509,755,757,759,762],{"class":511,"line":756},16,[509,758,563],{"class":562},[509,760,761],{"class":566}," Build: ",[509,763,764],{"class":730},"`npm build`\n",[509,766,768],{"class":511,"line":767},17,[509,769,556],{"emptyLinePlaceholder":555},[509,771,773],{"class":511,"line":772},18,[509,774,775],{"class":548},"## Coding Rules\n",[509,777,779],{"class":511,"line":778},19,[509,780,556],{"emptyLinePlaceholder":555},[509,782,784,786],{"class":511,"line":783},20,[509,785,563],{"class":562},[509,787,788],{"class":566}," 使用 Composition API。\n",[509,790,792,794],{"class":511,"line":791},21,[509,793,563],{"class":562},[509,795,599],{"class":566},[509,797,799,801],{"class":511,"line":798},22,[509,800,563],{"class":562},[509,802,607],{"class":566},[509,804,806,808],{"class":511,"line":805},23,[509,807,563],{"class":562},[509,809,810],{"class":566}," 不任意增加新的 dependency。\n",[509,812,814],{"class":511,"line":813},24,[509,815,556],{"emptyLinePlaceholder":555},[509,817,819],{"class":511,"line":818},25,[509,820,821],{"class":548},"## Validation\n",[509,823,825],{"class":511,"line":824},26,[509,826,556],{"emptyLinePlaceholder":555},[509,828,830],{"class":511,"line":829},27,[509,831,832],{"class":566},"完成修改後：\n",[509,834,836],{"class":511,"line":835},28,[509,837,556],{"emptyLinePlaceholder":555},[509,839,841,844],{"class":511,"line":840},29,[509,842,843],{"class":562},"1.",[509,845,846],{"class":566}," 執行 lint。\n",[509,848,850,853],{"class":511,"line":849},30,[509,851,852],{"class":562},"2.",[509,854,855],{"class":566}," 執行相關測試。\n",[509,857,859,862],{"class":511,"line":858},31,[509,860,861],{"class":562},"3.",[509,863,864],{"class":566}," 確認 build 正常。\n",[509,866,868,871],{"class":511,"line":867},32,[509,869,870],{"class":562},"4.",[509,872,873],{"class":566}," 檢查 git diff，避免修改到無關檔案。\n",[322,875,876],{},"除了 Coding Style 以外，也可以告訴 Codex：",[343,878,879,882,885,888,891,894],{},[346,880,881],{},"Codebase 怎麼組成",[346,883,884],{},"哪些目錄負責什麼",[346,886,887],{},"要怎麼執行測試",[346,889,890],{},"修改完成後要驗證什麼",[346,892,893],{},"哪些檔案不能修改",[346,895,896],{},"特殊的 Business Rule",[322,898,621,899,901],{},[326,900,235],{}," 還可以放在不同目錄。",[322,903,341],{},[398,905,908],{"className":906,"code":907,"language":403,"meta":404},[401],"my-project\u002F\n├─ AGENTS.md\n├─ frontend\u002F\n│  ├─ AGENTS.md\n│  └─ ...\n└─ backend\u002F\n   ├─ AGENTS.md\n   └─ ...\n",[326,909,907],{"__ignoreMap":404},[322,911,912],{},"根目錄可以放整個專案共同的規則，而子目錄再補上該區域特有的規範。",[322,914,915],{},"例如前端要求：",[398,917,919],{"className":539,"code":918,"language":541,"meta":404,"style":404},"- Vue Component 使用 Composition API。\n- Component 使用 `\u003Cscript setup lang=\"ts\">`。\n",[326,920,921,928],{"__ignoreMap":404},[509,922,923,925],{"class":511,"line":512},[509,924,563],{"class":562},[509,926,927],{"class":566}," Vue Component 使用 Composition API。\n",[509,929,930,932,935,938],{"class":511,"line":552},[509,931,563],{"class":562},[509,933,934],{"class":566}," Component 使用 ",[509,936,937],{"class":730},"`\u003Cscript setup lang=\"ts\">`",[509,939,940],{"class":566},"。\n",[322,942,943],{},"後端則可能是：",[398,945,947],{"className":539,"code":946,"language":541,"meta":404,"style":404},"- API 必須使用統一 Response 格式。\n- 新增 Endpoint 時需要補上測試。\n",[326,948,949,956],{"__ignoreMap":404},[509,950,951,953],{"class":511,"line":512},[509,952,563],{"class":562},[509,954,955],{"class":566}," API 必須使用統一 Response 格式。\n",[509,957,958,960],{"class":511,"line":552},[509,959,563],{"class":562},[509,961,962],{"class":566}," 新增 Endpoint 時需要補上測試。\n",[322,964,965],{},"這樣不需要把所有規則全部擠在同一份文件裡。",[376,967],{},[379,969,971],{"id":970},"到底該寫什麼","到底該寫什麼？",[322,973,974],{},"我自己目前會先整理幾種 AI 每次工作都可能需要知道的資訊。",[976,977,978],"h3",{"id":978},"技術",[322,980,981],{},"專案使用什麼技術。",[322,983,341],{},[398,985,987],{"className":539,"code":986,"language":541,"meta":404,"style":404},"## 技術\n\n- Nuxt 4\n- Vue 3\n- TypeScript\n- Tailwind CSS\n- npm\n",[326,988,989,994,998,1004,1010,1016,1022],{"__ignoreMap":404},[509,990,991],{"class":511,"line":512},[509,992,993],{"class":548},"## 技術\n",[509,995,996],{"class":511,"line":552},[509,997,556],{"emptyLinePlaceholder":555},[509,999,1000,1002],{"class":511,"line":559},[509,1001,563],{"class":562},[509,1003,676],{"class":566},[509,1005,1006,1008],{"class":511,"line":570},[509,1007,563],{"class":562},[509,1009,683],{"class":566},[509,1011,1012,1014],{"class":511,"line":578},[509,1013,563],{"class":562},[509,1015,690],{"class":566},[509,1017,1018,1020],{"class":511,"line":583},[509,1019,563],{"class":562},[509,1021,697],{"class":566},[509,1023,1024,1026],{"class":511,"line":589},[509,1025,563],{"class":562},[509,1027,704],{"class":566},[976,1029,1030],{"id":1030},"常用指令",[322,1032,341],{},[398,1034,1036],{"className":539,"code":1035,"language":541,"meta":404,"style":404},"## 常用指令\n\n- 開發：`npm dev`\n- Lint：`npm lint`\n- Test：`npm test`\n- Build：`npm build`\n",[326,1037,1038,1043,1047,1056,1065,1074],{"__ignoreMap":404},[509,1039,1040],{"class":511,"line":512},[509,1041,1042],{"class":548},"## 常用指令\n",[509,1044,1045],{"class":511,"line":552},[509,1046,556],{"emptyLinePlaceholder":555},[509,1048,1049,1051,1054],{"class":511,"line":559},[509,1050,563],{"class":562},[509,1052,1053],{"class":566}," 開發：",[509,1055,731],{"class":730},[509,1057,1058,1060,1063],{"class":511,"line":570},[509,1059,563],{"class":562},[509,1061,1062],{"class":566}," Lint：",[509,1064,742],{"class":730},[509,1066,1067,1069,1072],{"class":511,"line":578},[509,1068,563],{"class":562},[509,1070,1071],{"class":566}," Test：",[509,1073,753],{"class":730},[509,1075,1076,1078,1081],{"class":511,"line":583},[509,1077,563],{"class":562},[509,1079,1080],{"class":566}," Build：",[509,1082,764],{"class":730},[976,1084,482],{"id":1085},"coding-style",[322,1087,341],{},[398,1089,1091],{"className":539,"code":1090,"language":541,"meta":404,"style":404},"## Coding Style\n\n- 使用 Composition API。\n- 新增程式碼使用 TypeScript。\n- 優先使用既有元件。\n- 命名方式沿用目前專案風格。\n",[326,1092,1093,1098,1102,1108,1114,1121],{"__ignoreMap":404},[509,1094,1095],{"class":511,"line":512},[509,1096,1097],{"class":548},"## Coding Style\n",[509,1099,1100],{"class":511,"line":552},[509,1101,556],{"emptyLinePlaceholder":555},[509,1103,1104,1106],{"class":511,"line":559},[509,1105,563],{"class":562},[509,1107,788],{"class":566},[509,1109,1110,1112],{"class":511,"line":570},[509,1111,563],{"class":562},[509,1113,599],{"class":566},[509,1115,1116,1118],{"class":511,"line":578},[509,1117,563],{"class":562},[509,1119,1120],{"class":566}," 優先使用既有元件。\n",[509,1122,1123,1125],{"class":511,"line":583},[509,1124,563],{"class":562},[509,1126,1127],{"class":566}," 命名方式沿用目前專案風格。\n",[976,1129,1130],{"id":1130},"專案規範",[322,1132,1133],{},"一些 AI 單純閱讀程式碼不一定能理解的規則。",[322,1135,341],{},[398,1137,1139],{"className":539,"code":1138,"language":541,"meta":404,"style":404},"## 專案規範\n\n- API Response 統一使用既有格式。\n- 共用元件放在 `components\u002Fcommon`。\n- API 型別統一放在 `types\u002Fapi`。\n",[326,1140,1141,1146,1150,1157,1169],{"__ignoreMap":404},[509,1142,1143],{"class":511,"line":512},[509,1144,1145],{"class":548},"## 專案規範\n",[509,1147,1148],{"class":511,"line":552},[509,1149,556],{"emptyLinePlaceholder":555},[509,1151,1152,1154],{"class":511,"line":559},[509,1153,563],{"class":562},[509,1155,1156],{"class":566}," API Response 統一使用既有格式。\n",[509,1158,1159,1161,1164,1167],{"class":511,"line":570},[509,1160,563],{"class":562},[509,1162,1163],{"class":566}," 共用元件放在 ",[509,1165,1166],{"class":730},"`components\u002Fcommon`",[509,1168,940],{"class":566},[509,1170,1171,1173,1176,1179],{"class":511,"line":578},[509,1172,563],{"class":562},[509,1174,1175],{"class":566}," API 型別統一放在 ",[509,1177,1178],{"class":730},"`types\u002Fapi`",[509,1180,940],{"class":566},[976,1182,1183],{"id":1183},"限制",[322,1185,1186],{},"直接告訴 AI 哪些事情不要做。",[322,1188,341],{},[398,1190,1192],{"className":539,"code":1191,"language":541,"meta":404,"style":404},"## 限制\n\n- 不要任意增加新的套件。\n- 不要修改自動產生的檔案。\n- 不要修改與目前任務無關的程式碼。\n",[326,1193,1194,1199,1203,1210,1217],{"__ignoreMap":404},[509,1195,1196],{"class":511,"line":512},[509,1197,1198],{"class":548},"## 限制\n",[509,1200,1201],{"class":511,"line":552},[509,1202,556],{"emptyLinePlaceholder":555},[509,1204,1205,1207],{"class":511,"line":559},[509,1206,563],{"class":562},[509,1208,1209],{"class":566}," 不要任意增加新的套件。\n",[509,1211,1212,1214],{"class":511,"line":570},[509,1213,563],{"class":562},[509,1215,1216],{"class":566}," 不要修改自動產生的檔案。\n",[509,1218,1219,1221],{"class":511,"line":578},[509,1220,563],{"class":562},[509,1222,1223],{"class":566}," 不要修改與目前任務無關的程式碼。\n",[976,1225,1226],{"id":1226},"驗證方式",[322,1228,1229],{},"這也是我覺得很值得寫的一塊。",[322,1231,1232],{},"不要只告訴 AI「要改什麼」，也可以告訴它：",[334,1234,1235],{},[322,1236,1237],{},[391,1238,1239],{},"改完之後，要怎麼證明自己沒有改壞？",[322,1241,341],{},[398,1243,1245],{"className":539,"code":1244,"language":541,"meta":404,"style":404},"## 完成條件\n\n修改完成後：\n\n1. 執行 `npm lint`\n2. 執行相關 Test\n3. 執行 `npm build`\n4. 檢查 git diff\n5. 確認沒有修改到與任務無關的內容\n",[326,1246,1247,1252,1256,1261,1265,1274,1281,1289,1296],{"__ignoreMap":404},[509,1248,1249],{"class":511,"line":512},[509,1250,1251],{"class":548},"## 完成條件\n",[509,1253,1254],{"class":511,"line":552},[509,1255,556],{"emptyLinePlaceholder":555},[509,1257,1258],{"class":511,"line":559},[509,1259,1260],{"class":566},"修改完成後：\n",[509,1262,1263],{"class":511,"line":570},[509,1264,556],{"emptyLinePlaceholder":555},[509,1266,1267,1269,1272],{"class":511,"line":578},[509,1268,843],{"class":562},[509,1270,1271],{"class":566}," 執行 ",[509,1273,742],{"class":730},[509,1275,1276,1278],{"class":511,"line":583},[509,1277,852],{"class":562},[509,1279,1280],{"class":566}," 執行相關 Test\n",[509,1282,1283,1285,1287],{"class":511,"line":589},[509,1284,861],{"class":562},[509,1286,1271],{"class":566},[509,1288,764],{"class":730},[509,1290,1291,1293],{"class":511,"line":594},[509,1292,870],{"class":562},[509,1294,1295],{"class":566}," 檢查 git diff\n",[509,1297,1298,1301],{"class":511,"line":602},[509,1299,1300],{"class":562},"5.",[509,1302,1303],{"class":566}," 確認沒有修改到與任務無關的內容\n",[376,1305],{},[379,1307,1309],{"id":1308},"怎麼判斷一條規則要不要寫進去","怎麼判斷一條規則要不要寫進去？",[322,1311,1312],{},"我自己目前會用一個很簡單的方法判斷：",[334,1314,1315],{},[322,1316,1317],{},[391,1318,1319],{},"下一次開新的 Claude Code \u002F Codex Session 時，我還會希望 AI 知道這件事情嗎？",[322,1321,1322],{},"如果答案是「會」，就可以考慮寫進去。",[322,1324,1325],{},"另外還有幾種情況：",[343,1327,1328,1331,1334,1337,1340],{},[346,1329,1330],{},"AI 已經不只一次犯同樣的錯",[346,1332,1333],{},"每次開新 Session 都要重新提醒",[346,1335,1336],{},"Code Review 時常出現相同問題",[346,1338,1339],{},"新加入專案的人也需要知道",[346,1341,1342],{},"這是專案特有規則，AI 無法只靠閱讀程式碼判斷",[322,1344,1345],{},"這些通常都很適合留下來。",[376,1347],{},[379,1349,1350],{"id":1350},"不需要一開始就把規則寫到完美",[322,1352,1353],{},"一開始我也會覺得：",[334,1355,1356],{},[322,1357,1358],{},"那我要不要先把所有規則整理完整？",[322,1360,1361],{},"但後來覺得其實不用。",[322,1363,1364],{},"因為剛開始根本不知道 AI 會在哪些地方出問題。",[322,1366,1367],{},"我現在比較傾向：",[398,1369,1372],{"className":1370,"code":1371,"language":403,"meta":404},[401],"先放基本規則\n    ↓\n實際跟 AI 開發\n    ↓\n發現問題\n    ↓\n修正 AI\n    ↓\n同樣問題可能再次發生\n    ↓\n補進 CLAUDE.md \u002F AGENTS.md\n",[326,1373,1371],{"__ignoreMap":404},[322,1375,1376],{},"這樣文件會隨著實際開發慢慢成長，而不是一開始先想像幾十條可能根本用不到的規則。",[376,1378],{},[379,1380,1382],{"id":1381},"我的使用方式任務完成後跟-ai-覆盤","我的使用方式：任務完成後跟 AI 覆盤",[322,1384,1385],{},"這是我最近自己比較常使用的方式。",[322,1387,1388],{},"有時候跟 AI 完成一個比較大的功能後，我會再問它：",[343,1390,1391,1394,1397,1400],{},[346,1392,1393],{},"這次合作有什麼地方可以改善？",[346,1395,1396],{},"有沒有什麼資訊我一直重複提醒？",[346,1398,1399],{},"哪些規則值得下一次繼續保留？",[346,1401,1402],{},"應該整理到哪一份文件？",[322,1404,1405],{},"雖然這樣會再消耗一些 Token，但對比較長期的專案，我覺得還滿有幫助。",[322,1407,1408],{},"例如今天 AI 使用了：",[398,1410,1412],{"className":503,"code":1411,"language":505,"meta":404,"style":404},"npm install\n",[326,1413,1414],{"__ignoreMap":404},[509,1415,1416,1418],{"class":511,"line":512},[509,1417,62],{"class":515},[509,1419,1421],{"class":1420},"sNbzA"," install\n",[322,1423,1424],{},"但我的專案其實一直都是：",[398,1426,1428],{"className":503,"code":1427,"language":505,"meta":404,"style":404},"npm\n",[326,1429,1430],{"__ignoreMap":404},[509,1431,1432],{"class":511,"line":512},[509,1433,1427],{"class":515},[322,1435,1436],{},"第一次發生時，我可能只會直接糾正它。",[322,1438,1439],{},"但如果同樣的問題一直出現，就可以把它整理成：",[398,1441,1443],{"className":539,"code":1442,"language":541,"meta":404,"style":404},"## Package Manager\n\n本專案統一使用 npm。\n\n- 不要使用 pnpm。\n- 不要使用 yarn。\n- 安裝套件使用 `npm add`。\n",[326,1444,1445,1449,1453,1458,1462,1469,1476],{"__ignoreMap":404},[509,1446,1447],{"class":511,"line":512},[509,1448,549],{"class":548},[509,1450,1451],{"class":511,"line":552},[509,1452,556],{"emptyLinePlaceholder":555},[509,1454,1455],{"class":511,"line":559},[509,1456,1457],{"class":566},"本專案統一使用 npm。\n",[509,1459,1460],{"class":511,"line":570},[509,1461,556],{"emptyLinePlaceholder":555},[509,1463,1464,1466],{"class":511,"line":578},[509,1465,563],{"class":562},[509,1467,1468],{"class":566}," 不要使用 pnpm。\n",[509,1470,1471,1473],{"class":511,"line":583},[509,1472,563],{"class":562},[509,1474,1475],{"class":566}," 不要使用 yarn。\n",[509,1477,1478,1480,1483,1486],{"class":511,"line":589},[509,1479,563],{"class":562},[509,1481,1482],{"class":566}," 安裝套件使用 ",[509,1484,1485],{"class":730},"`npm add`",[509,1487,940],{"class":566},[322,1489,1490],{},"下一個 Session 就不用再重新說一次。",[322,1492,1493,1494,1496,1497,1499],{},"這也是我目前對 ",[326,1495,234],{}," \u002F ",[326,1498,235],{}," 最大的理解：",[334,1501,1502],{},[322,1503,1504],{},[391,1505,1506],{},"它不是一份要一次寫完的文件，而是一份跟著 AI 協作經驗慢慢累積的專案工作規範。",[376,1508],{},[379,1510,1512],{"id":1511},"claude-code-和-codex-都有用怎麼辦","Claude Code 和 Codex 都有用怎麼辦？",[322,1514,1515],{},"如果同一個專案同時使用 Claude Code 與 Codex，很容易遇到另一個問題：",[334,1517,1518],{},[322,1519,1520,1521,1523,1524,1526],{},"難道 ",[326,1522,234],{}," 和 ",[326,1525,235],{}," 要維護兩份一模一樣的內容？",[322,1528,1529,1530,1532,1533,1535],{},"目前 Claude Code 本身主要讀取 ",[326,1531,234],{},"，不會直接把 ",[326,1534,235],{}," 當成自己的專案指示文件。",[322,1537,1538,1539,1541],{},"不過 ",[326,1540,234],{}," 支援匯入其他文件。",[322,1543,1544,1545,1547],{},"所以如果專案已經把共通規範整理在 ",[326,1546,235],{},"，可以寫：",[398,1549,1551],{"className":539,"code":1550,"language":541,"meta":404,"style":404},"@AGENTS.md\n",[326,1552,1553],{"__ignoreMap":404},[509,1554,1555],{"class":511,"line":512},[509,1556,1550],{"class":566},[322,1558,1559],{},"再另外補充 Claude Code 專用的規則：",[398,1561,1563],{"className":539,"code":1562,"language":541,"meta":404,"style":404},"@AGENTS.md\n\n## Claude Code\n\n- 大型修改先規劃再實作。\n- 修改完成後檢查 git diff。\n",[326,1564,1565,1569,1573,1578,1582,1589],{"__ignoreMap":404},[509,1566,1567],{"class":511,"line":512},[509,1568,1550],{"class":566},[509,1570,1571],{"class":511,"line":552},[509,1572,556],{"emptyLinePlaceholder":555},[509,1574,1575],{"class":511,"line":559},[509,1576,1577],{"class":548},"## Claude Code\n",[509,1579,1580],{"class":511,"line":570},[509,1581,556],{"emptyLinePlaceholder":555},[509,1583,1584,1586],{"class":511,"line":578},[509,1585,563],{"class":562},[509,1587,1588],{"class":566}," 大型修改先規劃再實作。\n",[509,1590,1591,1593],{"class":511,"line":583},[509,1592,563],{"class":562},[509,1594,1595],{"class":566}," 修改完成後檢查 git diff。\n",[322,1597,1598],{},"這樣共通規範只需要維護一份。",[322,1600,341],{},[398,1602,1605],{"className":1603,"code":1604,"language":403,"meta":404},[401],"my-project\u002F\n├─ AGENTS.md       ← 共通專案規範\n├─ CLAUDE.md       ← 匯入 AGENTS.md + Claude 專用規則\n├─ package.json\n└─ ...\n",[326,1606,1604],{"__ignoreMap":404},[322,1608,1609],{},"對同時使用多個 AI Coding Agent 的專案來說，我覺得會比較容易維護。",[376,1611],{},[379,1613,1615],{"id":1614},"不建議放什麼","不建議放什麼？",[322,1617,1618],{},"有些內容反而不適合寫進這些文件。",[322,1620,341],{},[343,1622,1623,1626,1629,1632,1638,1641,1644],{},[346,1624,1625],{},"API Key",[346,1627,1628],{},"Password",[346,1630,1631],{},"Access Token",[346,1633,1634,1637],{},[326,1635,1636],{},".env"," 實際內容",[346,1639,1640],{},"私密憑證",[346,1642,1643],{},"單次任務內容",[346,1645,1646],{},"與 AI 工作無關的大量文件",[322,1648,1649,1650,1496,1652,1654],{},"尤其 ",[326,1651,234],{},[326,1653,235],{}," 很可能會跟著專案一起進入 Git，因此不要把敏感資訊直接寫進去。",[322,1656,1657],{},"Secret 還是應該使用環境變數或適合的 Secret Management 機制處理。",[322,1659,1660],{},"另外，單次任務也不需要留下來。",[322,1662,341],{},[398,1664,1667],{"className":1665,"code":1666,"language":403,"meta":404},[401],"今天幫我修改登入頁按鈕顏色。\n",[326,1668,1666],{"__ignoreMap":404},[322,1670,1671],{},"這種下一個 Session 就沒有意義的事情，直接留在當次 Prompt 即可。",[376,1673],{},[379,1675,1676],{"id":1676},"一份簡單的範例",[322,1678,1679],{},"如果是 Nuxt 專案，我可能會先從這樣開始：",[398,1681,1683],{"className":539,"code":1682,"language":541,"meta":404,"style":404},"# 專案\n\nNuxt 4 + Vue 3 + TypeScript 專案。\n\n## 技術\n\n- Nuxt 4\n- Vue 3\n- TypeScript\n- Tailwind CSS\n- npm\n\n## 開發規範\n\n- 使用 Composition API。\n- 新增程式碼使用 TypeScript。\n- 優先沿用現有元件。\n- 不任意增加新的套件。\n- 修改前先理解既有實作方式。\n\n## 常用指令\n\n- 開發：`npm dev`\n- Lint：`npm lint`\n- Test：`npm test`\n- Build：`npm build`\n\n## 限制\n\n- 不要修改自動產生的檔案。\n- 不要提交 `.env`。\n- 不要修改與目前任務無關的程式碼。\n\n## 驗證\n\n完成修改後：\n\n1. 執行 Lint。\n2. 執行相關 Test。\n3. 確認 Build 正常。\n4. 檢查 git diff。\n",[326,1684,1685,1690,1694,1699,1703,1707,1711,1717,1723,1729,1735,1741,1745,1749,1753,1759,1765,1771,1778,1785,1789,1793,1797,1805,1813,1821,1829,1833,1837,1841,1847,1859,1865,1870,1876,1881,1886,1891,1899,1907,1915],{"__ignoreMap":404},[509,1686,1687],{"class":511,"line":512},[509,1688,1689],{"class":548},"# 專案\n",[509,1691,1692],{"class":511,"line":552},[509,1693,556],{"emptyLinePlaceholder":555},[509,1695,1696],{"class":511,"line":559},[509,1697,1698],{"class":566},"Nuxt 4 + Vue 3 + TypeScript 專案。\n",[509,1700,1701],{"class":511,"line":570},[509,1702,556],{"emptyLinePlaceholder":555},[509,1704,1705],{"class":511,"line":578},[509,1706,993],{"class":548},[509,1708,1709],{"class":511,"line":583},[509,1710,556],{"emptyLinePlaceholder":555},[509,1712,1713,1715],{"class":511,"line":589},[509,1714,563],{"class":562},[509,1716,676],{"class":566},[509,1718,1719,1721],{"class":511,"line":594},[509,1720,563],{"class":562},[509,1722,683],{"class":566},[509,1724,1725,1727],{"class":511,"line":602},[509,1726,563],{"class":562},[509,1728,690],{"class":566},[509,1730,1731,1733],{"class":511,"line":610},[509,1732,563],{"class":562},[509,1734,697],{"class":566},[509,1736,1737,1739],{"class":511,"line":711},[509,1738,563],{"class":562},[509,1740,704],{"class":566},[509,1742,1743],{"class":511,"line":717},[509,1744,556],{"emptyLinePlaceholder":555},[509,1746,1747],{"class":511,"line":722},[509,1748,586],{"class":548},[509,1750,1751],{"class":511,"line":734},[509,1752,556],{"emptyLinePlaceholder":555},[509,1754,1755,1757],{"class":511,"line":745},[509,1756,563],{"class":562},[509,1758,788],{"class":566},[509,1760,1761,1763],{"class":511,"line":756},[509,1762,563],{"class":562},[509,1764,599],{"class":566},[509,1766,1767,1769],{"class":511,"line":767},[509,1768,563],{"class":562},[509,1770,607],{"class":566},[509,1772,1773,1775],{"class":511,"line":772},[509,1774,563],{"class":562},[509,1776,1777],{"class":566}," 不任意增加新的套件。\n",[509,1779,1780,1782],{"class":511,"line":778},[509,1781,563],{"class":562},[509,1783,1784],{"class":566}," 修改前先理解既有實作方式。\n",[509,1786,1787],{"class":511,"line":783},[509,1788,556],{"emptyLinePlaceholder":555},[509,1790,1791],{"class":511,"line":791},[509,1792,1042],{"class":548},[509,1794,1795],{"class":511,"line":798},[509,1796,556],{"emptyLinePlaceholder":555},[509,1798,1799,1801,1803],{"class":511,"line":805},[509,1800,563],{"class":562},[509,1802,1053],{"class":566},[509,1804,731],{"class":730},[509,1806,1807,1809,1811],{"class":511,"line":813},[509,1808,563],{"class":562},[509,1810,1062],{"class":566},[509,1812,742],{"class":730},[509,1814,1815,1817,1819],{"class":511,"line":818},[509,1816,563],{"class":562},[509,1818,1071],{"class":566},[509,1820,753],{"class":730},[509,1822,1823,1825,1827],{"class":511,"line":824},[509,1824,563],{"class":562},[509,1826,1080],{"class":566},[509,1828,764],{"class":730},[509,1830,1831],{"class":511,"line":829},[509,1832,556],{"emptyLinePlaceholder":555},[509,1834,1835],{"class":511,"line":835},[509,1836,1198],{"class":548},[509,1838,1839],{"class":511,"line":840},[509,1840,556],{"emptyLinePlaceholder":555},[509,1842,1843,1845],{"class":511,"line":849},[509,1844,563],{"class":562},[509,1846,1216],{"class":566},[509,1848,1849,1851,1854,1857],{"class":511,"line":858},[509,1850,563],{"class":562},[509,1852,1853],{"class":566}," 不要提交 ",[509,1855,1856],{"class":730},"`.env`",[509,1858,940],{"class":566},[509,1860,1861,1863],{"class":511,"line":867},[509,1862,563],{"class":562},[509,1864,1223],{"class":566},[509,1866,1868],{"class":511,"line":1867},33,[509,1869,556],{"emptyLinePlaceholder":555},[509,1871,1873],{"class":511,"line":1872},34,[509,1874,1875],{"class":548},"## 驗證\n",[509,1877,1879],{"class":511,"line":1878},35,[509,1880,556],{"emptyLinePlaceholder":555},[509,1882,1884],{"class":511,"line":1883},36,[509,1885,832],{"class":566},[509,1887,1889],{"class":511,"line":1888},37,[509,1890,556],{"emptyLinePlaceholder":555},[509,1892,1894,1896],{"class":511,"line":1893},38,[509,1895,843],{"class":562},[509,1897,1898],{"class":566}," 執行 Lint。\n",[509,1900,1902,1904],{"class":511,"line":1901},39,[509,1903,852],{"class":562},[509,1905,1906],{"class":566}," 執行相關 Test。\n",[509,1908,1910,1912],{"class":511,"line":1909},40,[509,1911,861],{"class":562},[509,1913,1914],{"class":566}," 確認 Build 正常。\n",[509,1916,1918,1920],{"class":511,"line":1917},41,[509,1919,870],{"class":562},[509,1921,1922],{"class":566}," 檢查 git diff。\n",[322,1924,1925],{},"其實一開始這樣就已經很夠用了。",[322,1927,1928],{},"之後遇到問題，再慢慢補。",[376,1930],{},[379,1932,1933],{"id":1933},"小結",[322,1935,1936,1937,1496,1939,1941],{},"目前我會把 ",[326,1938,234],{},[326,1940,235],{}," 理解成：",[334,1943,1944],{},[322,1945,1946],{},[391,1947,1948],{},"給 AI Coding Agent 的專案工作手冊。",[322,1950,1951],{},"不用一開始就寫得非常完整，也不需要把 README、API 文件、架構文件全部複製進去。",[322,1953,1954],{},"真正值得留下來的是：",[343,1956,1957,1960,1963,1966,1969,1972,1975],{},[346,1958,1959],{},"每個 Session 都需要知道的規則",[346,1961,1962],{},"AI 無法單靠程式碼推測的資訊",[346,1964,1965],{},"經常需要重新提醒的事情",[346,1967,1968],{},"Coding Convention",[346,1970,1971],{},"開發與測試流程",[346,1973,1974],{},"專案限制",[346,1976,1977],{},"修改後的驗證方式",[322,1979,1980],{},"而我自己目前比較喜歡的做法，是先從一份很小的規則開始。",[322,1982,1983],{},"實際跟 AI 合作 → 發現問題 → 覆盤 → 再把真正值得保留的內容補進去。",[322,1985,1986],{},"比起一開始試著寫出一份「完美的 AI 規範」，這樣反而比較符合實際開發的使用方式。",[1988,1989,1990],"style",{},"html pre.shiki code .sYRkA, html code.shiki .sYRkA{--shiki-default:#6F42C1;--shiki-dark:#FFA657}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 .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 pre.shiki code .sPgVT, html code.shiki .sPgVT{--shiki-default:#005CC5;--shiki-dark:#79C0FF}html pre.shiki code .sNbzA, html code.shiki .sNbzA{--shiki-default:#032F62;--shiki-dark:#A5D6FF}",{"title":404,"searchDepth":559,"depth":559,"links":1992},[1993,1994,1995,1996,2004,2005,2006,2007,2008,2009,2010],{"id":381,"depth":552,"text":382},{"id":469,"depth":552,"text":234},{"id":639,"depth":552,"text":235},{"id":970,"depth":552,"text":971,"children":1997},[1998,1999,2000,2001,2002,2003],{"id":978,"depth":559,"text":978},{"id":1030,"depth":559,"text":1030},{"id":1085,"depth":559,"text":482},{"id":1130,"depth":559,"text":1130},{"id":1183,"depth":559,"text":1183},{"id":1226,"depth":559,"text":1226},{"id":1308,"depth":552,"text":1309},{"id":1350,"depth":552,"text":1350},{"id":1381,"depth":552,"text":1382},{"id":1511,"depth":552,"text":1512},{"id":1614,"depth":552,"text":1615},{"id":1676,"depth":552,"text":1676},{"id":1933,"depth":552,"text":1933},false,null,{},"2026-09-02",[],{"title":238,"description":239},"posts\u002F20260902.claude-agents-md-project-guidelines",[230,231,232,234,235],"O9_X0qhAtmdu1K6j2O9HPqw1z-kJK5HmLkbOCBpLz1Q",[2021,2024],{"title":243,"path":242,"stem":2022,"description":244,"category":228,"publishedAt":2023,"children":-1},"posts\u002F20260903.claude-codex-config-locations","2026-09-03",{"title":217,"path":216,"stem":2025,"description":218,"category":16,"publishedAt":2026,"children":-1},"posts\u002F20260825.google-app-about-blank-placeholder","2026-08-25",1791786900758]