[{"data":1,"prerenderedAt":440},["ShallowReactive",2],{"$Nehrp7Lchg":3},[4],{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":10,"layout":11,"series":12,"image":13,"keywords":18,"head":25,"body":38,"_type":434,"_id":435,"_source":436,"_file":437,"_stem":438,"_extension":439},"/blog/ai-daily/00","ai-daily",false,"","工程師的 AI 日常 00 - 用 AI 打造部落格自動化","身為一位在矽谷工作的軟體工程師，寫部落格這件事一直是我想持續做但常常擱置的事情。而在 AI 工具越來越成熟的現在，我花了一個下午的時間和 Claude 一起設計並搭建了一套從筆記到發布的自動化系統。其實過程中最有趣的不是自動化本身，而是 AI 竟然能夠分析出我自己都沒意識到的寫作習慣。","post","工程師的 AI 日常",{"src":14,"alt":15,"width":16,"height":17},"hero.jpeg","hero",750,536,[12,19,20,21,22,23,24],"AI","AI 加速","automation","blog","Claude","Obsidian",{"meta":26},[27,30,33,36],{"name":28,"content":29},"author","小貓貓工程師",{"name":31,"content":32},"read","7 min read",{"property":34,"content":35},"article:published_time","2026-04-03T00:00:00.000Z",{"property":37,"content":35},"article:modified_time",{"type":39,"children":40,"toc":419},"root",[41,49,54,60,65,94,107,113,118,123,169,184,189,194,199,210,219,256,261,266,271,305,314,319,324,329,336,341,346,351,356,361,366,371,376,381,386,391,399],{"type":42,"tag":43,"props":44,"children":45},"element","p",{},[46],{"type":47,"value":48},"text","2026 年的某個週末下午，窩在家裡的我看著自己好一陣子沒更新的部落格，心裡又生出了那股熟悉的愧疚感。其實想分享的東西一直都有，但每次想到要手動處理 frontmatter、調整格式、確認 nuxt-content 的各種自訂組件，那股動力就瞬間消失了（大概就和打開健身 App 看了一眼又關掉的感覺差不多吧）。",{"type":42,"tag":43,"props":50,"children":51},{},[52],{"type":47,"value":53},"於是我做了一件工程師最擅長的事情——把問題自動化。",{"type":42,"tag":55,"props":56,"children":58},"h2",{"id":57},"緣起",[59],{"type":47,"value":57},{"type":42,"tag":43,"props":61,"children":62},{},[63],{"type":47,"value":64},"我的部落格是用 Nuxt 加上 nuxt-content 搭建的，文章都是 Markdown 格式。而我平時用 Obsidian 來管理自己的各種筆記和想法，裡面早就累積了不少可以寫成文章的素材。但這兩個系統之間一直是斷開的——Obsidian 裡的想法要變成部落格文章，中間隔著一道格式轉換和風格調整的牆。",{"type":42,"tag":43,"props":66,"children":67},{},[68,70,77,79,85,86,92],{"type":47,"value":69},"而且說實話，我的部落格用了不少自訂組件，像是 ",{"type":42,"tag":71,"props":72,"children":74},"code",{"className":73},[],[75],{"type":47,"value":76},"::epilogue",{"type":47,"value":78},"、",{"type":42,"tag":71,"props":80,"children":82},{"className":81},[],[83],{"type":47,"value":84},"::note-img",{"type":47,"value":78},{"type":42,"tag":71,"props":87,"children":89},{"className":88},[],[90],{"type":47,"value":91},"::footnote-block",{"type":47,"value":93}," 之類的。每次寫新文章都要回頭翻舊文章確認格式，實在是有些麻煩。",{"type":42,"tag":43,"props":95,"children":96},{},[97,99,105],{"type":47,"value":98},"所以我的目標很明確：",{"type":42,"tag":100,"props":101,"children":102},"strong",{},[103],{"type":47,"value":104},"讓 AI 幫我把 Obsidian 裡的草稿，轉換成符合我寫作風格的部落格文章，然後自動發布",{"type":47,"value":106},"。",{"type":42,"tag":55,"props":108,"children":110},{"id":109},"聲音-dna",[111],{"type":47,"value":112},"聲音 DNA",{"type":42,"tag":43,"props":114,"children":115},{},[116],{"type":47,"value":117},"整個專案中最有意思的部分，是讓 Claude 分析我所有已發布的 40 多篇文章，從中提取出一份完整的「寫作風格指南」。",{"type":42,"tag":43,"props":119,"children":120},{},[121],{"type":47,"value":122},"這份指南涵蓋了 22 個維度的寫作特徵。其中有些是我自己完全沒有意識到的習慣，像是：",{"type":42,"tag":124,"props":125,"children":126},"ul",{},[127,140,152,157],{"type":42,"tag":128,"props":129,"children":130},"li",{},[131,133,138],{"type":47,"value":132},"我的驚嘆號和句號的比例是 ",{"type":42,"tag":100,"props":134,"children":135},{},[136],{"type":47,"value":137},"1:11",{"type":47,"value":139},"——也就是說我其實很少用驚嘆號，遠比我自己以為的還要少",{"type":42,"tag":128,"props":141,"children":142},{},[143,145,150],{"type":47,"value":144},"波浪號「～」在 40 多篇文章中只出現了 ",{"type":42,"tag":100,"props":146,"children":147},{},[148],{"type":47,"value":149},"3 次",{"type":47,"value":151},"，而且都只在對話或隨性的第一人稱想法中使用",{"type":42,"tag":128,"props":153,"children":154},{},[155],{"type":47,"value":156},"我最常用的轉折詞是「而」（95 次）和「但」（79 次），而不是更正式的「但是」（只有 15 次）",{"type":42,"tag":128,"props":158,"children":159},{},[160,162,167],{"type":47,"value":161},"每篇敘事類文章的結尾都有一個固定的四層結構：故事收束 → 哲學反思 → 給讀者的問題 → ",{"type":42,"tag":71,"props":163,"children":165},{"className":164},[],[166],{"type":47,"value":76},{"type":47,"value":168}," 簽名",{"type":42,"tag":170,"props":171,"children":172},"note-img",{},[173],{"type":42,"tag":43,"props":174,"children":175},{},[176,182],{"type":42,"tag":177,"props":178,"children":181},"img",{"alt":179,"src":180},"風格指南中的各種寫作特徵分析","style-analysis.jpeg",[],{"type":47,"value":183},"\n我的寫作風格竟然有這麼多可以量化的特徵...",{"type":42,"tag":43,"props":185,"children":186},{},[187],{"type":47,"value":188},"Claude 還幫我整理出了六種不同的文章類型，每一種都有各自的語氣、結構和組件使用規則。從創業故事系列到技術教學、從面試心得到自我成長，每一類的「聲音」其實都不太一樣。",{"type":42,"tag":43,"props":190,"children":191},{},[192],{"type":47,"value":193},"簡而言之，這份風格指南就像是我寫作風格的 DNA——有了它，AI 在生成文章時就有了一份精確的參考依據。",{"type":42,"tag":55,"props":195,"children":197},{"id":196},"架構設計",[198],{"type":47,"value":196},{"type":42,"tag":43,"props":200,"children":201},{},[202,204,209],{"type":47,"value":203},"在考慮了幾種方案後，我選擇了最乾淨的做法：",{"type":42,"tag":100,"props":205,"children":206},{},[207],{"type":47,"value":208},"兩個獨立的系統，用一個 AI 技能作為橋梁",{"type":47,"value":106},{"type":42,"tag":211,"props":212,"children":214},"pre",{"code":213},"Obsidian（思考）→ Claude 技能（轉換）→ 部落格 Repo（發布）\n",[215],{"type":42,"tag":71,"props":216,"children":217},{"__ignoreMap":8},[218],{"type":47,"value":213},{"type":42,"tag":43,"props":220,"children":221},{},[222,224,230,232,238,240,246,248,254],{"type":47,"value":223},"Obsidian 那邊新增了一個 ",{"type":42,"tag":71,"props":225,"children":227},{"className":226},[],[228],{"type":47,"value":229},"Blog/",{"type":47,"value":231}," 資料夾，裡面分成 ",{"type":42,"tag":71,"props":233,"children":235},{"className":234},[],[236],{"type":47,"value":237},"ideas/",{"type":47,"value":239}," 和 ",{"type":42,"tag":71,"props":241,"children":243},{"className":242},[],[244],{"type":47,"value":245},"drafts/",{"type":47,"value":247},"。草稿可以用任何語言、任何格式來寫——英文、中文、混合都行。而部落格 Repo 這邊完全不需要改動，現有的 ",{"type":42,"tag":71,"props":249,"children":251},{"className":250},[],[252],{"type":47,"value":253},"content/",{"type":47,"value":255}," 結構保持原樣。",{"type":42,"tag":43,"props":257,"children":258},{},[259],{"type":47,"value":260},"這個決定其實比想像中重要。一開始我有考慮過把部落格內容也搬進 Obsidian，但後來想想，Obsidian 是用來「想事情」的，部落格是用來「發布成果」的。硬是要讓 Obsidian 去渲染 nuxt-content 的自訂組件，等於是在逼兩個工具做它們不擅長的事（大概就像是叫 Monroe 去學握手，理論上可以但何必呢）。",{"type":42,"tag":55,"props":262,"children":264},{"id":263},"發布技能",[265],{"type":47,"value":263},{"type":42,"tag":43,"props":267,"children":268},{},[269],{"type":47,"value":270},"整個系統的核心是一個 Claude Code 的技能檔案。當我寫好草稿後，只需要下一個指令，技能就會：",{"type":42,"tag":272,"props":273,"children":274},"ol",{},[275,280,285,290,295,300],{"type":42,"tag":128,"props":276,"children":277},{},[278],{"type":47,"value":279},"讀取 Obsidian 草稿和風格指南",{"type":42,"tag":128,"props":281,"children":282},{},[283],{"type":47,"value":284},"分析內容並推斷文章類型（敘事、技術教學、面試心得等）",{"type":42,"tag":128,"props":286,"children":287},{},[288],{"type":47,"value":289},"生成符合我風格的完整部落格文章——包括 frontmatter、自訂組件、正確的中英文混用",{"type":42,"tag":128,"props":291,"children":292},{},[293],{"type":47,"value":294},"在部落格 Repo 建立一個分支並開 Pull Request",{"type":42,"tag":128,"props":296,"children":297},{},[298],{"type":47,"value":299},"Netlify 自動生成預覽連結",{"type":42,"tag":128,"props":301,"children":302},{},[303],{"type":47,"value":304},"GitHub Action 把預覽連結寄到我的信箱",{"type":42,"tag":306,"props":307,"children":308},"footnote-block",{},[309],{"type":42,"tag":43,"props":310,"children":311},{},[312],{"type":47,"value":313},"[1] Claude Code 是 Anthropic 的 CLI 工具，可以透過技能檔案來擴充功能。\n[2] Netlify Deploy Preview 會為每個 PR 自動部署一個預覽版本的網站。",{"type":42,"tag":43,"props":315,"children":316},{},[317],{"type":47,"value":318},"所以最後的流程變成：我在 Obsidian 寫個草稿，下個指令，然後就會收到一封帶有預覽連結的 Email。點開看看滿不滿意，滿意的話合併 PR 就上線了。",{"type":42,"tag":43,"props":320,"children":321},{},[322],{"type":47,"value":323},"而最讓我驚喜的是，因為有了那份詳盡的風格指南，生成出來的文章在語氣和用詞上其實相當接近我平時的寫法。",{"type":42,"tag":55,"props":325,"children":327},{"id":326},"學到了什麼",[328],{"type":47,"value":326},{"type":42,"tag":330,"props":331,"children":333},"h3",{"id":332},"ai-的風格分析比想像中準確",[334],{"type":47,"value":335},"AI 的風格分析比想像中準確",{"type":42,"tag":43,"props":337,"children":338},{},[339],{"type":47,"value":340},"那些我從未刻意追蹤的寫作習慣——驚嘆號比例、波浪號使用頻率、轉折詞偏好——AI 都精準地提取出來了。有了這些數據化的描述，風格就變得可複製了。",{"type":42,"tag":330,"props":342,"children":344},{"id":343},"關注點分離很重要",[345],{"type":47,"value":343},{"type":42,"tag":43,"props":347,"children":348},{},[349],{"type":47,"value":350},"Obsidian 是用來思考的，部落格是用來發布的。把這兩件事混在一起只會讓兩邊都變得更難用。用技能當作橋梁，讓每個工具專注做自己最擅長的事。",{"type":42,"tag":330,"props":352,"children":354},{"id":353},"風格指南才是真正的成果",[355],{"type":47,"value":353},{"type":42,"tag":43,"props":357,"children":358},{},[359],{"type":47,"value":360},"自動化的管線固然方便，但真正讓整套系統能用的是那份風格指南。沒有它，AI 生成的文章就只是通用的文字。有了它，技能對每一個寫作決定都有 22 個維度的參考依據。",{"type":42,"tag":330,"props":362,"children":364},{"id":363},"基礎建設其實很簡單",[365],{"type":47,"value":363},{"type":42,"tag":43,"props":367,"children":368},{},[369],{"type":47,"value":370},"Netlify Deploy Preview = 一個 toml 檔案加上後台的一個開關。Email 通知 = 一個 GitHub Action。整個專案中最困難的部分是風格分析，而不是那些管線和設定。",{"type":42,"tag":55,"props":372,"children":374},{"id":373},"結語",[375],{"type":47,"value":373},{"type":42,"tag":43,"props":377,"children":378},{},[379],{"type":47,"value":380},"回頭看看這個下午的成果，其實讓我最有感觸的不是自動化本身，而是在分析的過程中重新認識了自己的寫作。那些無意識的習慣被一條一條列出來的時候，就像是照鏡子看到了平時沒注意到的表情。",{"type":42,"tag":43,"props":382,"children":383},{},[384],{"type":47,"value":385},"也許未來 AI 工具會變得更加強大，而我們作為工程師能做的，就是找到讓這些工具和自己的工作流程自然融合的方式。不是用 AI 來取代自己的聲音，而是用它來放大自己的聲音。",{"type":42,"tag":43,"props":387,"children":388},{},[389],{"type":47,"value":390},"你有想過用 AI 來自動化你日常工作中那些「想做但一直擱置」的事情嗎？",{"type":42,"tag":306,"props":392,"children":393},{},[394],{"type":42,"tag":43,"props":395,"children":396},{},[397],{"type":47,"value":398},"本文由小貓貓工程師與 AI 協作完成",{"type":42,"tag":400,"props":401,"children":402},"epilogue",{},[403],{"type":42,"tag":43,"props":404,"children":405},{},[406,408,412,414,417],{"type":47,"value":407},"我是小貓貓工程師",{"type":42,"tag":409,"props":410,"children":411},"br",{},[],{"type":47,"value":413},"\n期待下次繼續與你分享",{"type":42,"tag":409,"props":415,"children":416},{},[],{"type":47,"value":418},"\n工程師的 AI 日常",{"title":8,"searchDepth":420,"depth":420,"links":421},2,[422,423,424,425,426,433],{"id":57,"depth":420,"text":57},{"id":109,"depth":420,"text":112},{"id":196,"depth":420,"text":196},{"id":263,"depth":420,"text":263},{"id":326,"depth":420,"text":326,"children":427},[428,430,431,432],{"id":332,"depth":429,"text":335},3,{"id":343,"depth":429,"text":343},{"id":353,"depth":429,"text":353},{"id":363,"depth":429,"text":363},{"id":373,"depth":420,"text":373},"markdown","content:1.blog:010.ai-daily:00.md","content","1.blog/010.ai-daily/00.md","1.blog/010.ai-daily/00","md",1775371292530]