<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Last Regrets</title><link>https://sdttttt.online/zh-tw/</link><description>Recent content on Last Regrets</description><generator>Hugo</generator><language>zh-TW</language><copyright>2026, sdttttt</copyright><lastBuildDate>Sun, 23 Aug 2026 21:46:49 +0800</lastBuildDate><atom:link href="https://sdttttt.online/zh-tw/index.xml" rel="self" type="application/rss+xml"/><item><title>2026-08-22</title><link>https://sdttttt.online/zh-tw/claudelog/2026-08-22/</link><pubDate>Sat, 22 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-08-22/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;刪除 &lt;code&gt;layouts/partials/footer.html&lt;/code&gt;(1 行 wrapper)&lt;/li&gt;
&lt;li&gt;刪除 &lt;code&gt;layouts/partials/custom_footer.html&lt;/code&gt;(156 行,PaperMod footer 的本地 fork)&lt;/li&gt;
&lt;li&gt;刪除 &lt;code&gt;hugo.toml&lt;/code&gt; 中 &lt;code&gt;[params.cloudflareAnalytics]&lt;/code&gt; 配置塊&lt;/li&gt;
&lt;li&gt;Hugo &lt;code&gt;--minify&lt;/code&gt; 構建通過,確認 Cloudflare Web Analytics 注入消失(&lt;code&gt;cf-beacon&lt;/code&gt; 匹配 0 次),PaperMod 自帶 footer 功能保留(&lt;code&gt;top-link&lt;/code&gt; / &lt;code&gt;scroll-to-top&lt;/code&gt; JS / 版權 / Powered by)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="決策"&gt;決策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;移除 Cloudflare 站點統計:&lt;code&gt;custom_footer.html&lt;/code&gt; 相對於 PaperMod 原版 footer 唯一真正的差異就是 Cloudflare beacon 注入;既然沒用價值,把 footer 部分整體還原回 PaperMod 默認,避免 PaperMod 升級 footer 時本地 fork 不同步的問題(&lt;code&gt;2026-08-01&lt;/code&gt; 已記錄此風險)&lt;/li&gt;
&lt;li&gt;保留 &lt;code&gt;layouts/_partials/cover.html&lt;/code&gt;:該 override 解決了 PaperMod &lt;code&gt;resources.ByType &amp;quot;image&amp;quot;&lt;/code&gt; 不識別 SVG 封面導致 404 的問題,不能刪&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果以後又想加自定義站點統計,可以直接在 Hugo 配置啟用內置埋點,或 inline 在 &lt;code&gt;layouts/partials/extend_footer.html&lt;/code&gt;(PaperMod 已留 hook),不需要再 fork 整個 footer&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="維護記錄-1"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作-1"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修正 &lt;code&gt;CLAUDE.md&lt;/code&gt; 中 prettier 安裝命令的事實錯誤:實際是 &lt;code&gt;deno install -g -A npm:prettier@3.9.6&lt;/code&gt; 落到 &lt;code&gt;~/.deno/bin/&lt;/code&gt;,不需要 &lt;code&gt;setup-node&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修正 &lt;code&gt;scripts/format-markdown.ts&lt;/code&gt; 頂部 docstring 的過時描述&lt;/li&gt;
&lt;li&gt;給 &lt;code&gt;check-dead-links.yml&lt;/code&gt; / &lt;code&gt;test-scripts.yml&lt;/code&gt; / &lt;code&gt;validate-posts.yml&lt;/code&gt; 三個 push-trigger workflow 加上 &lt;code&gt;if: github.actor != 'github-actions[bot]'&lt;/code&gt; 守衛,跟 &lt;code&gt;deploy.yml&lt;/code&gt; / &lt;code&gt;sync-covers.yml&lt;/code&gt; / &lt;code&gt;update-papermod.yml&lt;/code&gt; 一致;節省 bot 推送後再次觸發 CI 的時間&lt;/li&gt;
&lt;li&gt;刪除 &lt;code&gt;assets/images/covers/covers/&lt;/code&gt; 死目錄(220 個 SVG,5.4MB):該批封面是 &lt;code&gt;2026-07-21&lt;/code&gt; 第一次批量生成時落在 &lt;code&gt;assets/images/covers/&lt;/code&gt; 的;後來 &lt;code&gt;gen-covers.ts&lt;/code&gt; 的 &lt;code&gt;COVERS_DIR&lt;/code&gt; 改成 &lt;code&gt;static/images/covers/&lt;/code&gt;,但舊的沒清;grep 確認沒有任何 &lt;code&gt;.ts&lt;/code&gt; / &lt;code&gt;.md&lt;/code&gt; / &lt;code&gt;.yml&lt;/code&gt; / &lt;code&gt;.toml&lt;/code&gt; 引用該路徑&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議-1"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;第三方 action 仍用浮動 tag(&lt;code&gt;@v4&lt;/code&gt;/&lt;code&gt;@v3&lt;/code&gt;/&lt;code&gt;@v2&lt;/code&gt;);可考慮釘 SHA 防供應鏈投毒&lt;/li&gt;
&lt;li&gt;&lt;code&gt;format-markdown.ts&lt;/code&gt;(27 行)/ &lt;code&gt;optimize-images.ts&lt;/code&gt;(182 行) 仍無單測&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="維護記錄-2"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作-2"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;刪除全部 31 篇文章中的 &lt;code&gt;categories:&lt;/code&gt; 字段(都是 inline &lt;code&gt;categories: [&amp;quot;X&amp;quot;]&lt;/code&gt; 格式)— 決定只用 tag 做分類&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hugo.toml&lt;/code&gt; 的 &lt;code&gt;[taxonomies]&lt;/code&gt; 中刪掉 &lt;code&gt;category = &amp;quot;categories&amp;quot;&lt;/code&gt; 行;現在只剩 &lt;code&gt;tag = &amp;quot;tags&amp;quot;&lt;/code&gt; 和 &lt;code&gt;series = &amp;quot;series&amp;quot;&lt;/code&gt;(series 也無人使用,可後續考慮一併刪除)&lt;/li&gt;
&lt;li&gt;Hugo &lt;code&gt;--minify&lt;/code&gt; 構建通過(221 篇,466 ms)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="決策-1"&gt;決策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分類統一用 tag:之前 categories 和 tags 語義重疊(categories 僅 3 種且只覆蓋 31 篇;tag 是文章主要分類手段);統一後所有文章都通過 tag 分組,&lt;code&gt;/tags/&lt;/code&gt; 頁面真正反映全部分類&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議-2"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;series = &amp;quot;series&amp;quot;&lt;/code&gt; 在 &lt;code&gt;[taxonomies]&lt;/code&gt; 中也是死配置(無人用 series:),可順手刪&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="維護記錄-3"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作-3"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;把 14 篇文章中的 &lt;code&gt;軟路由&lt;/code&gt; tag 改為 &lt;code&gt;硬件&lt;/code&gt;(語義上 &lt;code&gt;軟路由&lt;/code&gt; 是軟件配置路由器,&lt;code&gt;硬件&lt;/code&gt; 是更廣義的物理設備類目;後續硬件折騰文也歸這裡)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議-3"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;tag 表仍偏多(8 個),繼續精簡可考慮:把 &lt;code&gt;日誌&lt;/code&gt;(97 篇,大雜燴)拆成 &lt;code&gt;雜記&lt;/code&gt; + 併入 &lt;code&gt;開發&lt;/code&gt;/&lt;code&gt;思考&lt;/code&gt;;刪除 &lt;code&gt;學習&lt;/code&gt;(已基本退役,2021 起再沒用過);刪除 &lt;code&gt;雜談&lt;/code&gt;(3 篇,可併入 &lt;code&gt;雜記&lt;/code&gt;/&lt;code&gt;思考&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="維護記錄-4"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作-4"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;把 50 篇文章的 &lt;code&gt;開發&lt;/code&gt; tag 改為 &lt;code&gt;學習&lt;/code&gt;(包括 2 篇原本就有 &lt;code&gt;學習&lt;/code&gt; 的:Stack by Rust / Tree by Rust,dedup 後剩 1 個 &lt;code&gt;學習&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;順手修了 &lt;code&gt;20200406-Rails-ENV-u0k.md&lt;/code&gt; 的 &lt;code&gt;tag:&lt;/code&gt; 單數 typo(之前是死配置,Hugo 不會識別),改為 &lt;code&gt;tags: [&amp;quot;學習&amp;quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Hugo &lt;code&gt;--minify&lt;/code&gt; 通過(370 ms,221 篇)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="決策-2"&gt;決策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;學習&lt;/code&gt; 現在承擔&amp;quot;技術學習/開發&amp;quot;語義(吸收了原 &lt;code&gt;開發&lt;/code&gt;),覆蓋 58 篇;原 &lt;code&gt;學習&lt;/code&gt; 主要貼在 2020 年早期學習筆記上,語義自然延伸&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議-4"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;當前 tag:&lt;code&gt;日誌&lt;/code&gt; 97 / &lt;code&gt;學習&lt;/code&gt; 58 / &lt;code&gt;思考&lt;/code&gt; 40 / &lt;code&gt;硬件&lt;/code&gt; 14 / &lt;code&gt;安全&lt;/code&gt; 6 / &lt;code&gt;雜談&lt;/code&gt; 3 / &lt;code&gt;書評&lt;/code&gt; 1&lt;/li&gt;
&lt;li&gt;仍有 &lt;code&gt;日誌&lt;/code&gt;(大雜燴)和 &lt;code&gt;雜談&lt;/code&gt;(3 篇,邊緣)可以繼續精簡&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="維護記錄-5"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作-5"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;給全部 221 篇文章補全 &lt;code&gt;description:&lt;/code&gt; 字段(原來只有 9 篇有內容、30 篇是空 &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;,其餘完全缺失)&lt;/li&gt;
&lt;li&gt;日誌類 94 篇:直接寫日期(&lt;code&gt;2020年04月06日&lt;/code&gt; 風格),機械處理&lt;/li&gt;
&lt;li&gt;非日誌類 117 篇:4 個 subagent 並行讀取正文,生成 80-150 字中文摘要(已驗證 PaperMod 把 description 渲染到 &lt;code&gt;meta[name=description]&lt;/code&gt;、&lt;code&gt;og:description&lt;/code&gt;、&lt;code&gt;twitter:description&lt;/code&gt; 三處)&lt;/li&gt;
&lt;li&gt;2 篇 draft 但空正文(&lt;code&gt;20200407-Linux-Process-0ca&lt;/code&gt; / &lt;code&gt;20250115-AHK的快捷鍵腳本方案-0ca&lt;/code&gt;)用標題生成了佔位描述&lt;/li&gt;
&lt;li&gt;Hugo &lt;code&gt;--minify&lt;/code&gt; 通過(288 ms,221 篇全部有 description)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="決策-3"&gt;決策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;全部 description 用中文雙引號包裹(&lt;code&gt;description: &amp;quot;...&amp;quot;&lt;/code&gt;),保持博客中文環境一致&lt;/li&gt;
&lt;li&gt;插入位置統一在 &lt;code&gt;date:&lt;/code&gt; 行之後;空 &lt;code&gt;description: &amp;quot;&amp;quot;&lt;/code&gt; 直接在原位替換&lt;/li&gt;
&lt;li&gt;摘要規則:不重複標題信息、客觀中性、長度可控&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議-5"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;部分早期文章(2020-2021)的標題比較模糊(如 &lt;code&gt;Log 14&lt;/code&gt;、&lt;code&gt;2020-9-19&lt;/code&gt;),AI 生成的 description 可能不太有意義,但仍優於完全缺失&lt;/li&gt;
&lt;li&gt;沒有動 &lt;code&gt;hugo.toml&lt;/code&gt; 中 &lt;code&gt;[params]&lt;/code&gt; 的 &lt;code&gt;description = &amp;quot;&amp;quot;&lt;/code&gt;(全站 fallback);如果想統一,可以改為 blog 簡介&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="維護記錄-6"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作-6"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;啟用 Hugo 多語言:在 &lt;code&gt;hugo.toml&lt;/code&gt; 加 &lt;code&gt;[languages]&lt;/code&gt; 塊,簡體 &lt;code&gt;zh&lt;/code&gt;(默認,URL 不帶前綴)+ 繁體 &lt;code&gt;zh-tw&lt;/code&gt;(URL 帶 &lt;code&gt;/zh-tw/&lt;/code&gt;);&lt;code&gt;defaultContentLanguageInSubdir = false&lt;/code&gt; 讓默認語言留在根路徑&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;pip install opencc-python-reimplemented&lt;/code&gt; 裝到 &lt;code&gt;.tools/pip/&lt;/code&gt;(sandbox 不讓裝到 HOME),用 &lt;code&gt;OpenCC('s2tw')&lt;/code&gt; 把所有內容轉繁中臺灣標準&lt;/li&gt;
&lt;li&gt;轉換 222 個 &lt;code&gt;content/posts/*.md&lt;/code&gt; → &lt;code&gt;*.zh-tw.md&lt;/code&gt;;16 個 &lt;code&gt;content/claudelog/*.md&lt;/code&gt; → &lt;code&gt;*.zh-tw.md&lt;/code&gt;;另外 &lt;code&gt;about.md&lt;/code&gt; / &lt;code&gt;archives.md&lt;/code&gt; / &lt;code&gt;search.md&lt;/code&gt; / &lt;code&gt;posts/_index.md&lt;/code&gt; 也都加了對應 zh-tw 版本&lt;/li&gt;
&lt;li&gt;每個 zh-tw 文件 front matter 加 &lt;code&gt;language: &amp;quot;zh-tw&amp;quot;&lt;/code&gt;(Hugo 多語言約定)&lt;/li&gt;
&lt;li&gt;複製 PaperMod 的 &lt;code&gt;themes/PaperMod/i18n/zh-tw.yaml&lt;/code&gt; 到本地 &lt;code&gt;i18n/zh-tw.yaml&lt;/code&gt;(UI 文案:分鐘/字/目錄/上一頁/下一頁/語言 等)&lt;/li&gt;
&lt;li&gt;zh-tw 菜單用中文繁體顯示名:文章 / 維護日誌 / 原始碼 / 彙整 / 搜尋 / 標籤 / 關於;&lt;code&gt;homeInfoParams.Content&lt;/code&gt; 也轉繁中(假如我走進海裡, 你會拉住我麼?)&lt;/li&gt;
&lt;li&gt;Hugo 修復 &lt;code&gt;languageCode&lt;/code&gt; 棄用警告,改用 &lt;code&gt;locale&lt;/code&gt;(&lt;code&gt;zh-CN&lt;/code&gt; / &lt;code&gt;zh-TW&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Hugo &lt;code&gt;--minify&lt;/code&gt; 雙語構建通過:ZH 259 頁 / ZH-TW 257 頁(差 2 個是歷史 alias 重定向目錄,不重要)&lt;/li&gt;
&lt;li&gt;已驗證生成的 zh-tw HTML 含 &lt;code&gt;&amp;lt;html lang=zh-tw&amp;gt;&lt;/code&gt;、&lt;code&gt;og:locale=zh_TW&lt;/code&gt;、&lt;code&gt;og:description&lt;/code&gt; 是繁體中文、hreflang 雙向鏈接、語言切換器菜單正確顯示&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="決策-4"&gt;決策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用 &lt;code&gt;s2tw&lt;/code&gt;(簡體→臺灣繁體)而不是 &lt;code&gt;s2t&lt;/code&gt;(僅字符轉換):前者同時做用詞轉換(軟件→軟件、網絡→網絡、視頻→影片、內存→記憶體);後者只轉字符會保留大陸用詞&lt;/li&gt;
&lt;li&gt;OpenCC 轉換覆蓋整篇文件(包括 front matter):會把 &lt;code&gt;title&lt;/code&gt;/&lt;code&gt;description&lt;/code&gt;/&lt;code&gt;tags&lt;/code&gt; 等中文值的字符也轉;英文字段/URL/代碼塊不動&lt;/li&gt;
&lt;li&gt;claudelog 也一起轉了:雖然不是&amp;quot;文章&amp;quot;,但既然公開在站點,雙語可讀性更一致&lt;/li&gt;
&lt;li&gt;不動 &lt;code&gt;defaultContentLanguageInSubdir = false&lt;/code&gt;:保持簡體版 URL 不帶 &lt;code&gt;/zh/&lt;/code&gt; 前綴(避免破壞現有 SEO/外鏈),只有繁體版帶 &lt;code&gt;/zh-tw/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議-6"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hugo 0.161 還有 3 個 PaperMod 模板的棄用警告(&lt;code&gt;LanguageDirection&lt;/code&gt; / &lt;code&gt;LanguageCode&lt;/code&gt; / &lt;code&gt;LanguageName&lt;/code&gt;),等 PaperMod 升級時自然解決&lt;/li&gt;
&lt;li&gt;2 個差量(&lt;code&gt;20260805-qds&lt;/code&gt; / &lt;code&gt;20260817-jtc&lt;/code&gt;)是歷史 alias 目錄只在 zh 出現,不影響正常瀏覽,可加忽略&lt;/li&gt;
&lt;li&gt;s2tw 自動轉換的術語可能在少數地方不準確(如博客自創詞、品牌名),需要人工抽查&lt;/li&gt;
&lt;li&gt;OpenCC 對 emoji/英文標點不轉換,只動中文字符,所以不會破壞 Markdown 語法&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="推送"&gt;推送&lt;/h3&gt;
&lt;p&gt;本批未推送,等待用戶授權。&lt;/p&gt;</description></item><item><title>2026-08-19</title><link>https://sdttttt.online/zh-tw/claudelog/2026-08-19/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-08-19/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;應用戶要求,把 scripts 工作流從 Node.js + tsc 全面遷移到 Deno ✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;deno.json&lt;/code&gt;:tasks 列出全部 14 個入口(&lt;code&gt;test&lt;/code&gt; / &lt;code&gt;validate-posts&lt;/code&gt; / &lt;code&gt;check-dead-links&lt;/code&gt; / &lt;code&gt;format-markdown&lt;/code&gt; / &lt;code&gt;sync-covers&lt;/code&gt; / &lt;code&gt;gen-covers&lt;/code&gt; / &lt;code&gt;rename-posts&lt;/code&gt; / &lt;code&gt;optimize-images&lt;/code&gt; / &lt;code&gt;git-commit-push&lt;/code&gt; + 各 &lt;code&gt;*-dry&lt;/code&gt; 變體),&lt;code&gt;unstable: [&amp;quot;sloppy-imports&amp;quot;]&lt;/code&gt; 避免改 28 處 &lt;code&gt;.js&lt;/code&gt; 後綴 import,&lt;code&gt;imports: { sharp: &amp;quot;npm:sharp@0.33.5&amp;quot; }&lt;/code&gt; 鎖定 sharp 版本,&lt;code&gt;nodeModulesDir: &amp;quot;none&amp;quot;&lt;/code&gt; 拒絕自動創建 &lt;code&gt;node_modules/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;更新 5 個 workflow yml(validate-posts / sync-covers / check-dead-links / test-scripts / deploy):替換 &lt;code&gt;setup-node@v4&lt;/code&gt; + &lt;code&gt;npm install&lt;/code&gt; + &lt;code&gt;npx tsc&lt;/code&gt; 三件套為 &lt;code&gt;denoland/setup-deno@v2&lt;/code&gt;,把 &lt;code&gt;node scripts/dist/xxx.js&lt;/code&gt; 全部換成 &lt;code&gt;deno task xxx&lt;/code&gt; 或 &lt;code&gt;deno run -A scripts/xxx.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;刪除 &lt;code&gt;package.json&lt;/code&gt; / &lt;code&gt;package-lock.json&lt;/code&gt; / &lt;code&gt;tsconfig.scripts.json&lt;/code&gt; / &lt;code&gt;scripts/dist/&lt;/code&gt;(168K 編譯產物,git 歷史裡也會清)&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;deno.lock&lt;/code&gt;(212 行,鎖定 sharp + 平臺原生包 + transitive deps),跟 &lt;code&gt;package-lock.json&lt;/code&gt; 一樣入倉&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;.gitignore&lt;/code&gt;:&lt;code&gt;scripts/dist/&lt;/code&gt; 改為 &lt;code&gt;.tools/&lt;/code&gt;(Deno 二進制 + cache,本地用,不入倉)+ &lt;code&gt;.npm-cache/&lt;/code&gt;(舊依賴)&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;CLAUDE.md&lt;/code&gt; 反映新結構(Deno 命令、scripts 目錄樹、修正 &lt;code&gt;content/maintenance/&lt;/code&gt; → &lt;code&gt;content/claudelog/&lt;/code&gt;、刪除不存在的 &lt;code&gt;format-markdown.yml&lt;/code&gt; 引用)&lt;/li&gt;
&lt;li&gt;POC 5 項全過:&lt;strong&gt;Deno 直接吃 .ts&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;node:test&lt;/code&gt; 原生兼容&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;node:child_process.execSync&lt;/code&gt; 工作&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;npm:sharp&lt;/code&gt; 預編譯包自動下載&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;denoland/setup-deno@v2&lt;/code&gt; 一行可換&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;測試 39 passed (162 steps),0 failed&lt;/strong&gt; — 與 Node + tsc 完全等價 ✅&lt;/li&gt;
&lt;li&gt;所有 9 個腳本 dry-run 驗證可加載/可執行&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;沙箱 HOME 不可寫 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deno_install&lt;/code&gt; 默認裝到 &lt;code&gt;~/.deno&lt;/code&gt;,沙箱拒絕&lt;/li&gt;
&lt;li&gt;&lt;code&gt;curl ... | sh&lt;/code&gt; 不接受 inline &lt;code&gt;DENO_INSTALL=...&lt;/code&gt; env(子 shell 不繼承 export 之前的賦值)&lt;/li&gt;
&lt;li&gt;解決:&lt;code&gt;export DENO_INSTALL=&amp;quot;$PWD/.tools/deno&amp;quot; &amp;amp;&amp;amp; curl ... | sh -s -- -y&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deno 默認緩存路徑也不可寫 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DENO_DIR&lt;/code&gt; 默認是 &lt;code&gt;~/.cache/deno&lt;/code&gt;,沙箱拒&lt;/li&gt;
&lt;li&gt;解決:本地開發設 &lt;code&gt;export DENO_DIR=&amp;quot;$PWD/.tools/deno-cache&amp;quot;&lt;/code&gt;,CI runner 不存在此問題&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--sloppy-imports&lt;/code&gt; 是攔路虎 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;全部 28 處 &lt;code&gt;from './lib/xxx.js'&lt;/code&gt;(實際 &lt;code&gt;.ts&lt;/code&gt; 文件)在 Deno 默認嚴格模式下報錯&lt;/li&gt;
&lt;li&gt;三種解法:加 &lt;code&gt;--sloppy-imports&lt;/code&gt;(每次手動)、&lt;code&gt;deno.json&lt;/code&gt; 配 &lt;code&gt;unstable: [&amp;quot;sloppy-imports&amp;quot;]&lt;/code&gt;(項目級)、手工改 28 處後綴(易出錯)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;採用 #2&lt;/strong&gt;,0 行代碼改動,vs 改 28 處 import + 擔心 typo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sharp 自動下載有警告 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Deno 默認跳過 npm 包 lifecycle scripts,提示 &amp;ldquo;Enable &lt;code&gt;nodeModulesDir: auto&lt;/code&gt;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;sharp 不需要 postinstall(平臺預編譯包 &lt;code&gt;@img/sharp-darwin-arm64&lt;/code&gt; 等),警告可忽略&lt;/li&gt;
&lt;li&gt;Linux CI 同理:會自動下 &lt;code&gt;@img/sharp-linux-x64&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deno task 不解析 &lt;code&gt;--&lt;/code&gt; 分隔符 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;原計劃用 &lt;code&gt;deno task xxx -- --message &amp;quot;...&amp;quot;&lt;/code&gt;(像 npm 那樣)&lt;/li&gt;
&lt;li&gt;實測 Deno 2.9 把 &lt;code&gt;--&lt;/code&gt; 原樣透傳給腳本,被 &lt;code&gt;parseArgs&lt;/code&gt; 當成 &lt;code&gt;--&lt;/code&gt; flag&lt;/li&gt;
&lt;li&gt;解決:workflow 裡改用 &lt;code&gt;deno run -A scripts/xxx.ts --message &amp;quot;...&amp;quot;&lt;/code&gt; 直接調用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLAUDE.md 文檔漂移 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;原本引用了 &lt;code&gt;.github/workflows/format-markdown.yml&lt;/code&gt;,但文件根本不存在(&lt;code&gt;deploy.yml&lt;/code&gt; 裡有 format-markdown.ts 調用,不是獨立 workflow)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content/maintenance/&lt;/code&gt; 是錯的,實際是 &lt;code&gt;content/claudelog/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;順手一起修了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="決策點"&gt;決策點&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保留 Node + prettier&lt;/strong&gt;:Deno 沒有等價 prettier 的內置格式化器,且 prettier 跨語言一致性強。&lt;code&gt;deploy.yml&lt;/code&gt; 裡 &lt;code&gt;format-markdown.ts&lt;/code&gt; shell 調用 &lt;code&gt;prettier&lt;/code&gt; 是最乾淨的邊界。代價:workflow 仍需 &lt;code&gt;setup-node@v4&lt;/code&gt; + &lt;code&gt;npm install -g prettier@3.9.6&lt;/code&gt;,但 &lt;code&gt;node_modules&lt;/code&gt; 不存在,體積零增量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留 &lt;code&gt;migrate-slug-scheme.ts&lt;/code&gt;&lt;/strong&gt;(一次性腳本,無測試,workflow 裡沒引用):雖然功能已結束,但刪用戶寫過的代碼得用戶授權。留著,以後清理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不加 &lt;code&gt;nodeModulesDir: &amp;quot;auto&amp;quot;&lt;/code&gt;&lt;/strong&gt;:會強制創建 &lt;code&gt;node_modules/&lt;/code&gt; 目錄,違背&amp;quot;零 npm&amp;quot;目標。sharp 無 postinstall,警告忽略&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ci-影響"&gt;CI 影響&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;before&lt;/strong&gt;:4 個 workflow 各 5 步(checkout → setup-node → npm install → npx tsc → node scripts/dist/xxx.js),平均每 job ~45 秒在 npm 上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;after&lt;/strong&gt;:3 步(checkout → setup-deno → deno task xxx),setup-deno 幾秒,deno 跑 .ts 是緩存熱路徑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;預計 CI 時間省 30-40%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;觀察第一次 push 觸發 deploy.yml 的運行,確認 sharp 在 Linux runner 上跑通(&lt;code&gt;@img/sharp-linux-x64&lt;/code&gt; 自動下載)&lt;/li&gt;
&lt;li&gt;如果 &lt;code&gt;deno task test&lt;/code&gt; 在 CI 比 &lt;code&gt;node --test scripts/dist/__tests__/*.js&lt;/code&gt; 慢(不太可能,但 Deno 冷啟動比 node 慢),考慮加 &lt;code&gt;cache: 'deno'&lt;/code&gt; 或類似策略到 setup-deno&lt;/li&gt;
&lt;li&gt;&lt;code&gt;migrate-slug-scheme.ts&lt;/code&gt; 可以獨立刪(下次大掃除時),無功能影響&lt;/li&gt;
&lt;li&gt;如果哪天不需要 prettier 了,可以把 deploy.yml 的 &lt;code&gt;setup-node@v4&lt;/code&gt; 也去掉,實現純 Deno&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="文件變更清單"&gt;文件變更清單&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增:&lt;code&gt;deno.json&lt;/code&gt;、&lt;code&gt;deno.lock&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;刪除:&lt;code&gt;package.json&lt;/code&gt;、&lt;code&gt;package-lock.json&lt;/code&gt;、&lt;code&gt;tsconfig.scripts.json&lt;/code&gt;、&lt;code&gt;scripts/dist/&lt;/code&gt;(含 11 .js + 3 .js in lib/ + 10 .js in &lt;strong&gt;tests&lt;/strong&gt;/)&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;.github/workflows/{deploy,validate-posts,sync-covers,check-dead-links,test-scripts}.yml&lt;/code&gt; + &lt;code&gt;CLAUDE.md&lt;/code&gt; + &lt;code&gt;.gitignore&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;腳本源碼(&lt;code&gt;scripts/**/*.ts&lt;/code&gt;):&lt;strong&gt;0 行改動&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-18</title><link>https://sdttttt.online/zh-tw/claudelog/2026-08-18/</link><pubDate>Tue, 18 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-08-18/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;拉取 origin/master 的 6 個新提交（fast-forward），工作樹已同步 ✅&lt;/li&gt;
&lt;li&gt;應用戶要求，&lt;strong&gt;只&lt;/strong&gt;優化工作流 #1（拆分 &lt;code&gt;chore: auto-fix content&lt;/code&gt; 噪音 commit），其他建議（PR 預覽、URL 穩定、Dependabot）不動 ✅&lt;/li&gt;
&lt;li&gt;實現 &lt;code&gt;scripts/git-commit-push.ts&lt;/code&gt; 的自動 commit message 分類：
&lt;ul&gt;
&lt;li&gt;5 個分類路徑：rename / fm / format / covers / posts&lt;/li&gt;
&lt;li&gt;混合或無法識別時回退到 &lt;code&gt;--message-fallback&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;--message-fallback&lt;/code&gt; 參數，deploy.yml 調用改為同時傳 &lt;code&gt;--message&lt;/code&gt; 和 &lt;code&gt;--message-fallback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;頂層 CLI 代碼包到 &lt;code&gt;isMain&lt;/code&gt; 守衛，避免被 &lt;code&gt;import&lt;/code&gt; 時誤執行（之前 import 會因 &lt;code&gt;process.exit(1)&lt;/code&gt; 失敗）&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/__tests__/git-commit-push.test.ts&lt;/code&gt;，13 個測試覆蓋所有分類路徑&lt;/li&gt;
&lt;li&gt;測試 + E2E dry-run 驗證：rename 漂移 → &lt;code&gt;chore(rename): sync post slugs (N files)&lt;/code&gt;；fm 注入 → &lt;code&gt;chore(fm): inject frontmatter (N files)&lt;/code&gt;；混合 → fallback&lt;/li&gt;
&lt;li&gt;全部測試 164/164 通過，Hugo 構建 clean ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;測試陷阱 1：git rename 檢測對短文件失敗 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;最初測試 fixture 只寫 10 行 body，git &lt;code&gt;-M20%&lt;/code&gt; 閾值下也檢測不出 rename&lt;/li&gt;
&lt;li&gt;實際 rename-posts.js 跑的都是 30+ 行文章，body 微調 &amp;lt; 20% 行&lt;/li&gt;
&lt;li&gt;解決：測試 fixture 加到 40 段，模擬真實文章密度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;測試陷阱 2：git mv vs 文件系統 mv ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;最初用 &lt;code&gt;mv&lt;/code&gt; 改文件名 + &lt;code&gt;writeFileSync&lt;/code&gt; 覆蓋,git 不識別為 rename（變 A+D）&lt;/li&gt;
&lt;li&gt;解決：改用 &lt;code&gt;git mv&lt;/code&gt; + 追加一行，模擬 rename-posts.js 真實操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;測試陷阱 3：Apple Git 的 &lt;code&gt;git rm&lt;/code&gt; 副作用 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git rm&lt;/code&gt; 刪除 tracked 文件後，git 2.x 會清理空目錄&lt;/li&gt;
&lt;li&gt;後續 &lt;code&gt;writeFileSync&lt;/code&gt; 寫新 SVG 時 ENOENT&lt;/li&gt;
&lt;li&gt;解決：測試 setup 時預放 &lt;code&gt;.gitkeep&lt;/code&gt; 佔位文件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模塊化陷阱：頂層代碼副作用 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;把分類函數 &lt;code&gt;export&lt;/code&gt; 給測試用後，import 時頂層 &lt;code&gt;if (!message) process.exit(1)&lt;/code&gt; 會觸發&lt;/li&gt;
&lt;li&gt;解決：用 &lt;code&gt;pathToFileURL(process.argv[1]).href === import.meta.url&lt;/code&gt; 守衛 CLI 代碼&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未用 import ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;測試文件 import 了 &lt;code&gt;join&lt;/code&gt; from &lt;code&gt;'node:path'&lt;/code&gt;，但實際用的是 &lt;code&gt;Array.prototype.join&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;自審時發現並清理，避免汙染&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="決策點"&gt;決策點&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不改 &lt;code&gt;sync-covers.yml&lt;/code&gt; 的調用方式&lt;/strong&gt;：它只傳 &lt;code&gt;--message&lt;/code&gt; 不傳 &lt;code&gt;--message-fallback&lt;/code&gt;，新腳本會讓 &lt;code&gt;fallback = --message&lt;/code&gt;(原行為)。而且它的場景（cover IO）會被自動分類為 &lt;code&gt;chore(covers): ...&lt;/code&gt;，永遠走不到 fallback 分支。比之前更精確 ✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;降級策略而非強制分類&lt;/strong&gt;：當改動是&amp;quot;rename + 改了正文&amp;quot;或&amp;quot;fm 注入 + 新建 cover&amp;quot;這種混合，分類不可靠，返回 null 讓 fallback 接住。不冒險亂分類&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;觀察接下來幾天的 auto-fix commit,如果 &lt;code&gt;chore(rename)&lt;/code&gt; / &lt;code&gt;chore(fm)&lt;/code&gt; 頻繁出現，說明分類正確；如果大量 &lt;code&gt;chore: auto-fix content&lt;/code&gt; (fallback) 出現，說明有分類邏輯沒覆蓋的場景，需要擴展&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sync-covers.yml&lt;/code&gt; 也可以從 &lt;code&gt;chore(assets): remove orphan cover images&lt;/code&gt; 升級到自動分類（會產出 &lt;code&gt;chore(covers): -N cover image(s)&lt;/code&gt;），讓兩個 workflow 的 commit 風格統一&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="文件變更清單"&gt;文件變更清單&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增:&lt;code&gt;scripts/__tests__/git-commit-push.test.ts&lt;/code&gt;（13 測試）&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;scripts/git-commit-push.ts&lt;/code&gt;(+196 行:isMain 守衛 + classifyStagedChanges + 子函數)&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;(commit step 加 &lt;code&gt;--message-fallback&lt;/code&gt; + 註釋)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-17</title><link>https://sdttttt.online/zh-tw/claudelog/2026-08-17/</link><pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-08-17/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;拉取 origin/master 的 18 個新提交（fast-forward），並同步 PaperMod 子模塊到 &lt;code&gt;v8.0-139&lt;/code&gt; ✅&lt;/li&gt;
&lt;li&gt;創建新文章 &lt;code&gt;content/posts/20260817[05hog4].md&lt;/code&gt;（標題「文章的變化」），作者口述風格，半角逗號佔位符寫法，參考近期 &lt;code&gt;20260807[01jma3].md&lt;/code&gt; 的日誌類 frontmatter ✅&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;rename-posts.js&lt;/code&gt; 由 body 算出 hash 並重命名佔位文件為 &lt;code&gt;20260817[05hog4].md&lt;/code&gt; ✅&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;gen-covers.js --files ... --force&lt;/code&gt; 生成封面 &lt;code&gt;static/images/covers/20260817[05hog4].svg&lt;/code&gt;（teal / patternConcentric）✅&lt;/li&gt;
&lt;li&gt;手動修正 front matter 中 &lt;code&gt;cover.image&lt;/code&gt; 引用（rename-posts 不會同步更新 cover 路徑，這是已知 bug）⚠️&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hugo --minify&lt;/code&gt; 構建通過，新頁面 &lt;code&gt;public/posts/2026081705hog4/&lt;/code&gt; 正常生成，封面路徑正確解析 ✅&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;content/claudelog/2026-08-17.md&lt;/code&gt; ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gen-covers.js --files&lt;/code&gt; 接受相對路徑時會被腳本拼接成 &lt;code&gt;content/posts/content/posts/...&lt;/code&gt;，必須傳 basename（不帶 &lt;code&gt;content/posts/&lt;/code&gt; 前綴） ⚠️ - 已規避&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rename-posts.js&lt;/code&gt; 在重命名佔位文件後不會同步更新 front matter 裡的 &lt;code&gt;cover.image&lt;/code&gt; 路徑 ⚠️ - 已手動修正；建議下次讓用戶或腳本執行後立即檢查 front matter 完整性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;可以考慮給 &lt;code&gt;rename-posts.js&lt;/code&gt; 加一個 &lt;code&gt;--sync-cover-fm&lt;/code&gt; 開關，自動同步 &lt;code&gt;cover.image&lt;/code&gt; 引用，避免遺漏&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;raw=$(hashed-slug)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;old=&amp;#34;images/covers/&amp;lt;oldSlug&amp;gt;.svg&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&lt;/span&gt;&lt;span&gt;new=&amp;#34;images/covers/&amp;lt;newSlug&amp;gt;.svg&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4&lt;/span&gt;&lt;span&gt;raw.replace(old, new)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="維護記錄-追加---命名規則重構--ci-修復"&gt;維護記錄 (追加 - 命名規則重構 + CI 修復)&lt;/h2&gt;
&lt;h3 id="完成的工作-1"&gt;完成的工作&lt;/h3&gt;
&lt;h4 id="命名規則改造"&gt;命名規則改造&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目標&lt;/strong&gt;:改造 posts 命名規則 &lt;code&gt;YYYYMMDD[hash].md&lt;/code&gt; → &lt;code&gt;YYYYMMDD-{slug}-{hash3}.md&lt;/code&gt;,讓文件名一眼能讀懂文章標題 ✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方案選型&lt;/strong&gt;:經 ask_user_question 與用戶確認方案 B(日期 + slug + 3 位 hash)、slug 從 title 自動生成、中文保留、遷移全部 221 篇歷史文章、生成 Hugo aliases 自動 301&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scripts/rename-posts.ts&lt;/code&gt; 改造&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;新增 &lt;code&gt;computeHash3&lt;/code&gt; 純函數(SHA-256 前 2 字節 → 16-bit base36)&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;slugify&lt;/code&gt; 純函數(保留 CJK unicode + 拉丁字母數字,其餘替換為連字符,長度上限 80,空串兜底 &lt;code&gt;'untitled'&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;oldUrlFromSlug&lt;/code&gt; 純函數(支持 &lt;code&gt;YYYYMMDD[hash]&lt;/code&gt; 和 &lt;code&gt;YYYY-MM-DD-slug&lt;/code&gt; 兩種歷史格式推導舊 URL)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RenamePlan&lt;/code&gt; 接口擴展:新增 &lt;code&gt;title&lt;/code&gt;、&lt;code&gt;oldUrl&lt;/code&gt;、&lt;code&gt;hash3&lt;/code&gt; 字段(替代 &lt;code&gt;hash6&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;buildReport&lt;/code&gt; 改用 slugify + computeHash3 命名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;executePlan&lt;/code&gt; 無需改動(已 git mv + 同步 cover)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新增 &lt;code&gt;scripts/migrate-slug-scheme.ts&lt;/code&gt;&lt;/strong&gt;:一次性遷移腳本
&lt;ul&gt;
&lt;li&gt;默認 dry-run,加 &lt;code&gt;--apply&lt;/code&gt; 才落地&lt;/li&gt;
&lt;li&gt;調用 &lt;code&gt;buildReport&lt;/code&gt; + &lt;code&gt;executePlan&lt;/code&gt;,並在 front matter 注入 &lt;code&gt;aliases: [&amp;quot;/posts/{oldSlug}/&amp;quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;injectAliases&lt;/code&gt; 支持合併已有 aliases(數組/字符串兩種格式)&lt;/li&gt;
&lt;li&gt;碰撞檢測 + 失敗即停&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;測試套件更新&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rename-posts.test.ts&lt;/code&gt; 中已有斷言 &lt;code&gt;plans[0]!.newSlug.startsWith('20240115')&lt;/code&gt; 驗證 date 前綴保留 → 收緊為正則 &lt;code&gt;/^20240115-.+-[a-z0-9]{1,4}$/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;新增 13 個測試:&lt;code&gt;computeHash3&lt;/code&gt; ×3 / &lt;code&gt;slugify&lt;/code&gt; ×7 / &lt;code&gt;oldUrlFromSlug&lt;/code&gt; ×3&lt;/li&gt;
&lt;li&gt;測試套件 138 → 151,全部通過 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="遷移執行"&gt;遷移執行&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dry-run 報告&lt;/strong&gt;:221 篇待遷移,0 碰撞&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;執行&lt;/strong&gt;:&lt;code&gt;node scripts/dist/migrate-slug-scheme.js --apply --verbose&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;221 篇 .md + 220 個 .svg 重命名(全部用 &lt;code&gt;git mv&lt;/code&gt; 保留歷史)&lt;/li&gt;
&lt;li&gt;441 個文件改動,git 全部識別為 &lt;code&gt;R&lt;/code&gt;(rename),內容相似度 54%-100%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;front matter 注入 aliases&lt;/strong&gt;:每篇文章新加 &lt;code&gt;aliases: [&amp;quot;/posts/{oldSlug}/&amp;quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugo 構建驗證&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Pages: 264 → 265&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aliases: 15 → 224&lt;/strong&gt;(舊 URL 全部生成了 301 等價頁面)&lt;/li&gt;
&lt;li&gt;抽樣 &lt;code&gt;20260817-文章的變化-jtc/index.html&lt;/code&gt; 包含:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;link&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;rel&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;canonical&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;href&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;https://sdttttt.online/posts/20260817-文章的變化-jtc/&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;meta&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;http-equiv&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;refresh&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;content&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;0; url=...&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地測試&lt;/strong&gt;:151/151 通過 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="git-提交多-commit-策略經-ask_user_question-確認"&gt;Git 提交(多 commit 策略,經 ask_user_question 確認)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;5a417ea&lt;/code&gt; chore(scripts): 新增 YYYYMMDD-slug-hash 命名支持 + 一次性遷移腳本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;5a7ad18&lt;/code&gt; chore(posts): 遷移 221 篇文章到 YYYYMMDD-slug-hash 命名格式&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="第一次推送與衝突解決"&gt;第一次推送與衝突解決&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git push origin master&lt;/code&gt; 被遠程拒絕:CI 的 &lt;code&gt;chore: auto-fix content&lt;/code&gt;(&lt;code&gt;4ace5ca&lt;/code&gt;)剛把 &lt;code&gt;20260817[05hog4]&lt;/code&gt; 改名為 &lt;code&gt;20260817[03wwo2]&lt;/code&gt;(因 body 改了導致 SHA-256 變了)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull --rebase&lt;/code&gt; 出現 &lt;strong&gt;rename/rename 衝突&lt;/strong&gt;:CI → &lt;code&gt;03wwo2&lt;/code&gt;,我 → &lt;code&gt;20260817-文章的變化-jtc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解決策略&lt;/strong&gt;:保留我的遷移結果(&lt;code&gt;jtc&lt;/code&gt;),丟棄 CI 中間產物(&lt;code&gt;03wwo2&lt;/code&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git rm content/posts/20260817[03wwo2].md&lt;/code&gt; + 同名 .svg&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add&lt;/code&gt; 我的遷移結果&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git rebase --continue&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;失誤 1(誠實交代)&lt;/strong&gt;:rebase 後 &lt;code&gt;20260817-文章的變化-jtc.md&lt;/code&gt; 文件裡殘留衝突標記
&lt;ul&gt;
&lt;li&gt;第一次嘗試修復時直接 &lt;code&gt;write&lt;/code&gt; 文件,差點覆蓋掉用戶手動潤色的版本(末尾換行、空行)&lt;/li&gt;
&lt;li&gt;通過 &lt;code&gt;git show 4ace5ca:&lt;/code&gt; 提取用戶的精確版本,再疊加新 frontmatter 恢復 ✅&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;git commit --fixup=9c99956&lt;/code&gt; + &lt;code&gt;rebase -i --autosquash&lt;/code&gt; 把修復折進原 commit,不增加冗餘 commit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;重新編號後的兩個 commit:&lt;code&gt;613cd99&lt;/code&gt;(腳本) + &lt;code&gt;2445eae&lt;/code&gt;(遷移)&lt;/li&gt;
&lt;li&gt;推送成功 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="ci-失敗與修復"&gt;CI 失敗與修復&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;推送後 CI deploy 失敗:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;ERROR error building site: &amp;#34;/content/posts/20200311-Github-Actions-3fw.md:2:1&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;EOF looking for end YAML front matter delimiter
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;根因&lt;/strong&gt;:&lt;code&gt;scripts/gen-covers.ts:injectCoverField&lt;/code&gt; line 266 字符串模板 &lt;code&gt;---\n${newFm}---&lt;/code&gt; 中,閉合符 &lt;code&gt;---&lt;/code&gt; 前缺 &lt;code&gt;\n&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;當文件 frontmatter 末尾為 &lt;code&gt;aliases: [...]\n&lt;/code&gt;(我遷移後所有文章都是這種結構),走 if 分支(&lt;code&gt;fm.replace&lt;/code&gt;)重寫 cover 塊後&lt;/li&gt;
&lt;li&gt;&lt;code&gt;newFm&lt;/code&gt; 末尾是 &lt;code&gt;\n&lt;/code&gt;(來自 &lt;code&gt;+ '\n'&lt;/code&gt;),模板拼接產生 &lt;code&gt;---\n...\n---&lt;/code&gt; 看似正常&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;但&lt;/strong&gt;當文件&lt;strong&gt;沒有 trailing newline&lt;/strong&gt; 時,regex &lt;code&gt;[\s\S]*?\n---&lt;/code&gt; 不匹配(因為根本沒有第二個 &lt;code&gt;---&lt;/code&gt;),&lt;code&gt;replace&lt;/code&gt; 不替換 → 文件保持原樣 → 但原文件 frontmatter 沒問題&amp;hellip; &lt;strong&gt;矛盾!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;真正重現&lt;/strong&gt;:本地用 v0.161.1 + 手動寫一個無 trailing newline 的測試文件 + 跑 injectCoverField 老邏輯 → 輸出文件 frontmatter &lt;code&gt;aliases: [...]---&lt;/code&gt;(無 &lt;code&gt;\n&lt;/code&gt; 分隔)
&lt;ul&gt;
&lt;li&gt;Hugo 解析:嚴格模式下視 &lt;code&gt;---&lt;/code&gt; 不在行首 → EOF 找不到結束符 → 報錯&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修復&lt;/strong&gt;:&lt;code&gt;scripts/gen-covers.ts&lt;/code&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;let&lt;/span&gt; newFm &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; fm.replace(&lt;span style="color:#f1fa8c"&gt;/^cover:\s*\n((?: .+\n?)+)/m&lt;/span&gt;, newCover &lt;span style="color:#ff79c6"&gt;+&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 確保 newFm 以換行結尾,避免與閉合 --- 之間缺少分隔符
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; (&lt;span style="color:#ff79c6"&gt;!&lt;/span&gt;newFm.endsWith(&lt;span style="color:#f1fa8c"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;)) newFm &lt;span style="color:#ff79c6"&gt;+=&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;const&lt;/span&gt; newRaw &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; raw.replace(&lt;span style="color:#f1fa8c"&gt;/^---\n[\s\S]*?\n---/&lt;/span&gt;, &lt;span style="color:#f1fa8c"&gt;`---&lt;/span&gt;\&lt;span style="color:#f1fa8c"&gt;n&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;${&lt;/span&gt;newFm&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;---`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;移除 else 分支多餘的 &lt;code&gt;+ '\n'&lt;/code&gt;(避免雙換行)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地驗證&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;復現腳本驗證 buggy 輸出:&lt;code&gt;aliases: [&amp;quot;/posts/2020031100oh3i/&amp;quot;]---&lt;/code&gt;(無 &lt;code&gt;\n&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;復現腳本驗證 fixed 輸出:&lt;code&gt;aliases: [&amp;quot;/posts/2020031100oh3i/&amp;quot;]\n---&lt;/code&gt;(有 &lt;code&gt;\n&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;跑 &lt;code&gt;hugo --minify&lt;/code&gt; 在 buggy 文件上 → 與 CI 完全一致的 EOF 錯誤 → 確認根因&lt;/li&gt;
&lt;li&gt;跑 &lt;code&gt;hugo --minify&lt;/code&gt; 在 fixed 文件上 → 通過 ✅&lt;/li&gt;
&lt;li&gt;測試套件 151/151 通過 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;誠實交代 - 失誤 2&lt;/strong&gt;:我&lt;strong&gt;誤以為&lt;/strong&gt;本地 v0.161 build OK = fix 沒問題
&lt;ul&gt;
&lt;li&gt;實際上我沒有把 bug 真正跑出來 —— 老代碼生成的輸出與原文件字節序列相同,所以 git diff 顯示 0 改動&lt;/li&gt;
&lt;li&gt;真正的 bug 只在&lt;strong&gt;沒有 trailing newline&lt;/strong&gt; 的輸入上才會暴露&lt;/li&gt;
&lt;li&gt;CI 上的 v0.165 比本地 v0.161 嚴格,所以 CI 才報錯&lt;/li&gt;
&lt;li&gt;教訓:&lt;strong&gt;純函數層面 fix 一定要構造能觸發 bug 的輸入 + 獨立驗證,不能依賴&amp;quot;diff 為空 = OK&amp;quot;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="推送修復與最終狀態"&gt;推送修復與最終狀態&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;32e7cd4&lt;/code&gt; fix(gen-covers): 修復 injectCoverField 丟失 frontmatter 末尾換行的 bug&lt;/li&gt;
&lt;li&gt;CI 重新跑 → &lt;strong&gt;成功&lt;/strong&gt; ✅(產生 &lt;code&gt;27fa25b chore: auto-fix content&lt;/code&gt;,是部署成功後的文件名微調)&lt;/li&gt;
&lt;li&gt;新文章線上 URL:https://sdttttt.online/posts/20260817-文章的變化-1e69/(後綴 hash 因 prettier 規範化略變,deploy.yml 自動處理)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題-1"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;rename/rename 衝突&lt;/strong&gt;:本地遷移和 CI auto-fix 在同一文件上往不同方向 rename。教訓:涉及大量 rename 的操作前應先 pull 同步 CI 狀態 ⚠️&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rebase 後衝突標記殘留&lt;/strong&gt;:git 有時不會自動清理 file content 中的衝突標記,只清理 status。教訓:rebase 後必須 &lt;code&gt;hugo --minify&lt;/code&gt; 驗證 build,不能只看 &lt;code&gt;git status&lt;/code&gt; 乾淨 ⚠️&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bug 漏檢&lt;/strong&gt;:本地 v0.161 與 CI v0.165 行為不一致(後者更嚴格),導致 bug 在本地測不出來。教訓:涉及 frontmatter / 嚴格解析的代碼應該用與 CI 同版本的工具驗證 ⚠️&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不區分大小寫的本地 + 區分大小寫的遠程&lt;/strong&gt;:APFS 默認 case-insensitive,導致本地文件名 &lt;code&gt;Github-Actions&lt;/code&gt; 在 Linux CI 上行為可能不同。本次沒踩坑,但值得警惕 ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議-1"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在 CI 流程開始前加一步 &lt;code&gt;git fetch + check clean&lt;/code&gt; 的 sanity check,避免 race&lt;/li&gt;
&lt;li&gt;給 &lt;code&gt;gen-covers.ts&lt;/code&gt; 加專門測試:用 &lt;code&gt;writeFile&lt;/code&gt; 寫出&lt;strong&gt;無 trailing newline&lt;/strong&gt; 的輸入,驗證輸出 frontmatter 閉合&lt;/li&gt;
&lt;li&gt;在 deploy workflow 加 step:&lt;code&gt;hugo --minify&lt;/code&gt; 失敗時打印前 3 個報錯的 .md 文件的 head/tail,便於排查&lt;/li&gt;
&lt;li&gt;考慮給 rename-posts.js 加 dry-run-only 模式(默認 dry-run,避免誤操作)&lt;/li&gt;
&lt;li&gt;新 hash 計算結果應在文件 gitattributes 或 .gitignore 里加 ignore,避免 auto-fix commit 噪聲(目前 &lt;code&gt;27fa25b&lt;/code&gt; 這種 commit 頻率會越來越高)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="文件變更清單"&gt;文件變更清單&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增:&lt;code&gt;scripts/migrate-slug-scheme.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;scripts/rename-posts.ts&lt;/code&gt;(computeHash3 + slugify + oldUrlFromSlug + RenamePlan 字段)&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;scripts/gen-covers.ts&lt;/code&gt;(injectCoverField 末尾換行兜底)&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;scripts/__tests__/rename-posts.test.ts&lt;/code&gt;(+13 測試)&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;scripts/__tests__/rename-posts-execute.test.ts&lt;/code&gt;(RenamePlan 字段適配)&lt;/li&gt;
&lt;li&gt;重命名:221 個 &lt;code&gt;content/posts/YYYYMMDD[hash].md&lt;/code&gt; → &lt;code&gt;content/posts/YYYYMMDD-{slug}-{hash3}.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;重命名:220 個 &lt;code&gt;static/images/covers/YYYYMMDD[hash].svg&lt;/code&gt; → 同名格式&lt;/li&gt;
&lt;li&gt;修改:221 個 .md 的 front matter(新增 &lt;code&gt;aliases:&lt;/code&gt; 字段)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-07</title><link>https://sdttttt.online/zh-tw/claudelog/2026-08-07/</link><pubDate>Fri, 07 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-08-07/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;創建新文章 &lt;code&gt;content/posts/20260807[0534gw].md&lt;/code&gt;（標題「自述 - 小學時期」），參考現有草稿 frontmatter 格式，並設置為 &lt;code&gt;draft: true&lt;/code&gt;（不展示狀態）✅&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;gen-covers --files --force&lt;/code&gt; 為文章生成封面 &lt;code&gt;static/images/covers/20260807[0534gw].svg&lt;/code&gt;（gold / patternConcentric）✅&lt;/li&gt;
&lt;li&gt;運行 &lt;code&gt;validate-posts.js&lt;/code&gt; 校驗通過，文章與封面一致 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;無&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;無&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-05</title><link>https://sdttttt.online/zh-tw/claudelog/2026-08-05/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-08-05/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;創建帶新 tag &lt;code&gt;書評&lt;/code&gt; 的文章模板&lt;/strong&gt;：&lt;code&gt;content/posts/20260805[0buk4e].md&lt;/code&gt;,front matter 含 &lt;code&gt;tags: [&amp;quot;書評&amp;quot;]&lt;/code&gt;、&lt;code&gt;draft: false&lt;/code&gt;、&lt;code&gt;author: sdttttt&lt;/code&gt;,正文留空待用戶填寫。✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;無。✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;書評&lt;/code&gt; 是除 &lt;code&gt;2026-08-01&lt;/code&gt; 精簡後的 7 個核心 tag 之外的&lt;strong&gt;新增類別&lt;/strong&gt;,寫作時如出現多本/多主題書評,可考慮是否再細分(例如 &lt;code&gt;技術書評&lt;/code&gt; / &lt;code&gt;小說書評&lt;/code&gt;)以保持 tag 粒度與既有體系一致。&lt;/li&gt;
&lt;li&gt;若後續 &lt;code&gt;書評&lt;/code&gt; 文章數量持續增長,可在 &lt;code&gt;content/posts/&lt;/code&gt; 下補一個 &lt;code&gt;_index.md&lt;/code&gt; 的 description 或在主頁 info 中提示,方便讀者篩選。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-01</title><link>https://sdttttt.online/zh-tw/claudelog/2026-08-01/</link><pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-08-01/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;精簡博客文章 tags 體系&lt;/strong&gt;：採用方案 A（激進精簡），將 &lt;code&gt;content/posts/&lt;/code&gt; 下 218 篇文章的 13 個 tag 收斂為 7 個。✅
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;合併到 &lt;code&gt;開發&lt;/code&gt;&lt;/strong&gt;：&lt;code&gt;工具&lt;/code&gt;、&lt;code&gt;分佈式&lt;/code&gt;、&lt;code&gt;建站&lt;/code&gt;、&lt;code&gt;Algorithm&lt;/code&gt;（子主題歸併）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新增 &lt;code&gt;雜談&lt;/code&gt;&lt;/strong&gt;：&lt;code&gt;金錢&lt;/code&gt;、&lt;code&gt;新聞&lt;/code&gt;、&lt;code&gt;文字&lt;/code&gt;（單例容納）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;清理重複條目&lt;/strong&gt;：3 篇文章的 &lt;code&gt;tags&lt;/code&gt; 數組中存在同一 tag 多次出現的情況，強制去重&lt;/li&gt;
&lt;li&gt;批量執行腳本：&lt;code&gt;/tmp/consolidate-tags.mjs&lt;/code&gt;（Node v24，原地編輯 frontmatter 的 &lt;code&gt;tags&lt;/code&gt; 行，其餘內容保持不變）&lt;/li&gt;
&lt;li&gt;改動文件數：&lt;strong&gt;14&lt;/strong&gt; 篇（佔 218 篇的 6.4%）&lt;/li&gt;
&lt;li&gt;最終分佈：&lt;code&gt;日誌 95 / 開發 49 / 思考 40 / 軟路由 14 / 學習 10 / 安全 6 / 雜談 3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;我的初步 &amp;ldquo;+9&amp;rdquo; 淨變化預測在數學上出現 ±1 偏差，實際 &lt;code&gt;開發&lt;/code&gt; 為 +4 而非 +9，原因是 &lt;code&gt;20260312[0443ef].md&lt;/code&gt; 同時擁有 &lt;code&gt;建站&lt;/code&gt; 與 &lt;code&gt;工具&lt;/code&gt;，dedup 後只貢獻 1 個 &lt;code&gt;開發&lt;/code&gt; 出現次數；同樣原本預測裡的邊界情況需用真實全局計數複核。⚠️ - 不影響最終結果，僅是粗算與精算的偏差。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增文章時建議優先複用現有 7 個 tag，僅在確有跨類目需求時再討論是否擴展。&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;scripts/&lt;/code&gt; 下考慮沉澱 &lt;code&gt;consolidate-tags.mjs&lt;/code&gt; 為可重入工具，便於後續調整 tag 體系時一鍵重跑 + 校驗；當前實現還停留在 &lt;code&gt;/tmp/&lt;/code&gt; 裡，無版本控制。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="完成的工作-續"&gt;完成的工作 (續)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;修復 &lt;code&gt;layouts/partials/custom_footer.html&lt;/code&gt; 的渲染範圍&lt;/strong&gt;：之前 1 行 stub 把 &lt;code&gt;layouts/partials/footer.html&lt;/code&gt; 轉交給 &lt;code&gt;custom_footer.html&lt;/code&gt;，而後者只塞了 Cloudflare Analytics，等於&lt;strong&gt;屏蔽了 PaperMod 的全部 footer 功能&lt;/strong&gt;，包括回頂按鈕、代碼複製按鈕、主題切換 JS、菜單滾動位置記憶、版權/Powered by 致謝等。✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;恢復 PaperMod 原版 &lt;code&gt;_partials/footer.html&lt;/code&gt; 的全部內容&lt;/strong&gt;：版權/年份、&lt;code&gt;Powered by Hugo &amp;amp; PaperMod&lt;/code&gt;、&lt;code&gt;#top-link&lt;/code&gt; 錨點和 SVG、滾動監聽 JS、平滑滾動 JS、&lt;code&gt;#theme-toggle&lt;/code&gt; JS、&lt;code&gt;copy-code&lt;/code&gt; 按鈕 JS；同時保留 PaperMod 的 &lt;code&gt;{{- partial &amp;quot;extend_footer.html&amp;quot; . }}&lt;/code&gt; 鉤子。✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留 Cloudflare Web Analytics&lt;/strong&gt;：在新版的 &lt;code&gt;custom_footer.html&lt;/code&gt; 末尾保留原有的 &lt;code&gt;{{- with site.Params.cloudflareAnalytics.token }}&lt;/code&gt; 注入邏輯，並 &lt;code&gt;hugo --minify&lt;/code&gt; 構建後用 &lt;code&gt;grep&lt;/code&gt; 校驗 &lt;code&gt;id=top-link&lt;/code&gt; / &lt;code&gt;copy-code&lt;/code&gt; / &lt;code&gt;Powered by&lt;/code&gt; / &lt;code&gt;class=footer&lt;/code&gt; / &lt;code&gt;menu-scroll&lt;/code&gt; / &lt;code&gt;cf-beacon&lt;/code&gt; 在生成的 &lt;code&gt;public/posts/.../index.html&lt;/code&gt; 中重新出現。✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題-續"&gt;遇到的問題 (續)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hugo minifier 會把 &lt;code&gt;&amp;lt;footer class=&amp;quot;footer&amp;quot;&amp;gt;&lt;/code&gt; 壓縮成 &lt;code&gt;&amp;lt;footer class=footer&amp;gt;&lt;/code&gt;，第一次 &lt;code&gt;grep &amp;quot;class=\&amp;quot;footer\&amp;quot;&amp;quot;&lt;/code&gt; 給出 0 命中導致誤判；改為匹配 &lt;code&gt;class=footer&lt;/code&gt; 即可。無功能影響。⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議-續"&gt;下次建議 (續)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;當前 &lt;code&gt;custom_footer.html&lt;/code&gt; 用 &lt;code&gt;--ultra-compact&lt;/code&gt; 等價於&amp;quot;複製粘貼 PaperMod 原內容&amp;quot;，會帶來一個問題：&lt;strong&gt;PaperMod 子模塊後續升級 footer 時此處不會自動同步&lt;/strong&gt;。如果想跟進官方 footer 改進，可以改用 &lt;code&gt;layouts/partials/footer.html&lt;/code&gt; 裡 &lt;code&gt;{{ block &amp;quot;footer&amp;quot; . }}{{ end }}&lt;/code&gt; 或類似模式避免硬編碼；短期內（PaperMod 不會有大改）維持現狀即可。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-30</title><link>https://sdttttt.online/zh-tw/claudelog/2026-07-30/</link><pubDate>Thu, 30 Jul 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-07-30/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;將 &lt;code&gt;scripts/rename-posts.ts&lt;/code&gt; 接入 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;：在 &lt;code&gt;Install Bun dependencies&lt;/code&gt; 之後、&lt;code&gt;Generate covers and inject front matter&lt;/code&gt; 之前新增 &lt;code&gt;Rename posts&lt;/code&gt; 步驟，使每次 &lt;code&gt;master&lt;/code&gt; 推送自動將文章重命名為 &lt;code&gt;YYYYMMDD[xxxxxx].md&lt;/code&gt;，並同步處理 cover SVG 與 frontmatter 引用。✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;package.json&lt;/code&gt; 新增 &lt;code&gt;typescript@7.0.2&lt;/code&gt; 與 &lt;code&gt;@types/bun&lt;/code&gt; 開發依賴，用於 CI 中編譯腳本。✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;tsconfig.scripts.json&lt;/code&gt;：將 &lt;code&gt;scripts/**/*.ts&lt;/code&gt; 編譯輸出到 &lt;code&gt;scripts/dist/&lt;/code&gt;，&lt;code&gt;noEmitOnError: false&lt;/code&gt; 保證即使存在類型錯誤也會產出 JS。✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.gitignore&lt;/code&gt; 增加 &lt;code&gt;scripts/dist/&lt;/code&gt;，避免提交 CI 產物。✅&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;：安裝依賴後先執行 &lt;code&gt;bunx tsc -p tsconfig.scripts.json&lt;/code&gt;，隨後所有 &lt;code&gt;bun scripts/*.ts&lt;/code&gt; 改為 &lt;code&gt;bun scripts/dist/*.js&lt;/code&gt;。✅&lt;/li&gt;
&lt;li&gt;修復 &lt;code&gt;scripts/format-markdown.ts&lt;/code&gt; 中 &lt;code&gt;execSync&lt;/code&gt; 的 &lt;code&gt;shell: true&lt;/code&gt; 在 TypeScript 7 / &lt;code&gt;@types/node&lt;/code&gt; 下產生的類型錯誤，改為根據平臺選擇 &lt;code&gt;cmd.exe&lt;/code&gt; 或 &lt;code&gt;/bin/sh&lt;/code&gt;。✅&lt;/li&gt;
&lt;li&gt;修復 &lt;code&gt;scripts/__tests__/rename-posts.test.ts&lt;/code&gt; 的跨文件 &lt;code&gt;mock.module&lt;/code&gt; 汙染問題：在 &lt;code&gt;beforeEach&lt;/code&gt; 中恢復真實 &lt;code&gt;node:fs/promises&lt;/code&gt; 與 &lt;code&gt;node:fs&lt;/code&gt; 模塊，避免其它測試的 mock 影響真實 fs 集成測試。✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;遷移到 Node v24&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;package.json&lt;/code&gt; 刪除 &lt;code&gt;bun-types&lt;/code&gt;、&lt;code&gt;@types/bun&lt;/code&gt;，新增 &lt;code&gt;@types/node@^24&lt;/code&gt;；移除 &lt;code&gt;bun.lock&lt;/code&gt;，由 &lt;code&gt;npm install&lt;/code&gt; 生成 &lt;code&gt;package-lock.json&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tsconfig.scripts.json&lt;/code&gt; 切換到 &lt;code&gt;module/moduleResolution: NodeNext&lt;/code&gt;，使編譯產物的相對導入帶上 &lt;code&gt;.js&lt;/code&gt; 後綴。&lt;/li&gt;
&lt;li&gt;所有腳本的 shebang 和使用說明改為 &lt;code&gt;node scripts/dist/&amp;lt;name&amp;gt;.js&lt;/code&gt;；&lt;code&gt;scripts/rename-posts.ts&lt;/code&gt; 的 &lt;code&gt;Bun.spawn&lt;/code&gt; 替換為 &lt;code&gt;node:child_process&lt;/code&gt; 的 &lt;code&gt;spawn&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;所有 8 個測試文件改用 &lt;code&gt;node:test&lt;/code&gt; + 本地 &lt;code&gt;expect&lt;/code&gt; 助手（&lt;code&gt;scripts/__tests__/expect.ts&lt;/code&gt;），並把原本 mock &lt;code&gt;node:fs/promises&lt;/code&gt; 的用例改為真實臨時目錄集成測試（&lt;code&gt;inTempDir&lt;/code&gt; 助手），避免了 Node 實驗性 &lt;code&gt;--experimental-test-module-mocks&lt;/code&gt; 的緩存痛點。&lt;/li&gt;
&lt;li&gt;5 個 GitHub Actions workflow（&lt;code&gt;deploy.yml&lt;/code&gt;、&lt;code&gt;test-scripts.yml&lt;/code&gt;、&lt;code&gt;check-dead-links.yml&lt;/code&gt;、&lt;code&gt;sync-covers.yml&lt;/code&gt;、&lt;code&gt;validate-posts.yml&lt;/code&gt;）移除 &lt;code&gt;oven-sh/setup-bun&lt;/code&gt;，改為 &lt;code&gt;actions/setup-node@v4&lt;/code&gt; + &lt;code&gt;npm install&lt;/code&gt; + &lt;code&gt;npx tsc&lt;/code&gt; + &lt;code&gt;node scripts/dist/*.js&lt;/code&gt;。✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tsc&lt;/code&gt; 首次編譯報錯 &lt;code&gt;Cannot find type definition file for 'bun'&lt;/code&gt;，原因是僅安裝 &lt;code&gt;bun-types&lt;/code&gt; 時 &lt;code&gt;types: [&amp;quot;bun&amp;quot;]&lt;/code&gt; 無法解析；補充安裝 &lt;code&gt;@types/bun&lt;/code&gt; 後解決。⚠️&lt;/li&gt;
&lt;li&gt;編譯過程中 &lt;code&gt;scripts/format-markdown.ts&lt;/code&gt; 的 &lt;code&gt;shell: true&lt;/code&gt; 觸發類型錯誤，已按平臺顯式指定 shell 路徑。⚠️&lt;/li&gt;
&lt;li&gt;全量 &lt;code&gt;bun test&lt;/code&gt; 因 &lt;code&gt;mock.module&lt;/code&gt; 在 bun:test 中跨文件持久而偶發/必發失敗；已通過恢復真實模塊解決。⚠️&lt;/li&gt;
&lt;li&gt;Node 原生 ESM 不支持擴展名省略，源 TS 文件全部相對導入加上 &lt;code&gt;.js&lt;/code&gt; 後綴。⚠️&lt;/li&gt;
&lt;li&gt;Node 的 &lt;code&gt;mock.module&lt;/code&gt; 只能影響後續 &lt;code&gt;import()&lt;/code&gt;，而 ESM 模塊緩存對同一次 &lt;code&gt;import&lt;/code&gt; 複用舊導出；改用真實臨時目錄集成測試以繞過實驗性 API。⚠️&lt;/li&gt;
&lt;li&gt;&lt;code&gt;node --test scripts/dist/__tests__/*.js&lt;/code&gt; 在 npm scripts 中依賴 shell 展開 glob，CI (bash) 正常；Windows 上需另行處理。⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;觀察首次遷移後 CI 運行日誌（&lt;code&gt;Hugo on GitHub Pages&lt;/code&gt;、&lt;code&gt;Test Scripts&lt;/code&gt; 等），確認 Node 工具鏈無迴歸。&lt;/li&gt;
&lt;li&gt;如需把 &lt;code&gt;npm test&lt;/code&gt; 在 Windows 上做成跨平臺，可改用 &lt;code&gt;node --test scripts/dist/__tests__&lt;/code&gt;（目錄）或顯式列舉文件。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-28</title><link>https://sdttttt.online/zh-tw/claudelog/2026-07-28/</link><pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-07-28/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;將首頁從 &lt;code&gt;profileMode&lt;/code&gt; 切換為 PaperMod 的 &lt;code&gt;Regular Mode&lt;/code&gt;：移除 &lt;code&gt;params.profileMode&lt;/code&gt; 配置，新增 &lt;code&gt;params.homeInfoParams&lt;/code&gt;，保留原有站點標題與副標題展示。✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;params.env = &amp;quot;production&amp;quot;&lt;/code&gt;，讓 PaperMod 在所有構建場景下都按生產環境處理（影響 robots、圖片優化等）。✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/optimize-images.ts&lt;/code&gt; 圖片壓縮腳本，使用 &lt;code&gt;sharp&lt;/code&gt; 對 PNG/JPEG/WebP/AVIF/GIF/TIFF 進行壓縮、限制最大寬度、生成 WebP 變體；並在 &lt;code&gt;package.json&lt;/code&gt; 中加入 &lt;code&gt;sharp&lt;/code&gt; 開發依賴。✅&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;：新增 &lt;code&gt;bun install&lt;/code&gt; 和 &lt;code&gt;Optimize images&lt;/code&gt; 步驟，CI 每次構建時自動為 &lt;code&gt;assets/images&lt;/code&gt; 生成寬度不超過 1200px 的 &lt;code&gt;.webp&lt;/code&gt; 變體，且不覆蓋原圖。✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/rename-posts.ts&lt;/code&gt;：將 &lt;code&gt;content/posts/&lt;/code&gt; 下的文章批量重命名為 &lt;code&gt;YYYYMMDD[xxxxxx].md&lt;/code&gt;（&lt;strong&gt;方括號為字面字符&lt;/strong&gt;），其中日期取自 frontmatter &lt;code&gt;date&lt;/code&gt; 字段，hash 是去除 frontmatter 後的 body 用 SHA-256 取前 3 字節（24 bit）後轉 base36（6 位固定長度）。配套重命名 &lt;code&gt;assets/images/covers/{slug}.svg&lt;/code&gt; 並改寫 frontmatter &lt;code&gt;cover.image&lt;/code&gt;；用 &lt;code&gt;git mv&lt;/code&gt; 保留歷史，git 不可用時降級 &lt;code&gt;fs.rename&lt;/code&gt;；支持 &lt;code&gt;--dry-run&lt;/code&gt; / &lt;code&gt;--verbose&lt;/code&gt;；已是新格式、缺 date、格式無效的文件自動跳過；目標名碰撞時按用戶策略「報錯停止」並列出衝突文件。✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/__tests__/rename-posts.test.ts&lt;/code&gt;：30 個測試覆蓋 &lt;code&gt;normalizeDate&lt;/code&gt;（三種日期格式 + 月日越界 + 補零）/ &lt;code&gt;extractBody&lt;/code&gt; / &lt;code&gt;computeHash6&lt;/code&gt;（確定性、長度、base36 字符集、對末尾空白敏感、&lt;strong&gt;SHA-256 已知向量防止誤改回 djb2&lt;/strong&gt;）/ &lt;code&gt;rewriteCoverImage&lt;/code&gt; / &lt;code&gt;buildReport&lt;/code&gt;（7 個集成測試覆蓋有效文章、缺 date、無效 date、已是新格式、忽略 &lt;code&gt;_index.md&lt;/code&gt;、自定義封面不重命名、封面物理缺失）/ &lt;code&gt;detectCollisions&lt;/code&gt;。全綠（&lt;code&gt;bun test&lt;/code&gt; 134/134 通過）。✅&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;git rm&lt;/code&gt; 刪除 5 對重複文章中用戶指定的 5 個，&lt;strong&gt;同步刪除對應的 5 個 cover SVG&lt;/strong&gt;（避免 sync-covers 誤判為孤兒、且這些 SVG 本來就只服務被刪的 .md）。✅&lt;/li&gt;
&lt;li&gt;執行 &lt;code&gt;bun scripts/rename-posts.ts&lt;/code&gt; 完成 216 篇文章 + 215 個 cover SVG 的一次性重命名；git 全部以 &lt;code&gt;R&lt;/code&gt; (rename) 跟蹤，&lt;strong&gt;完整保留歷史&lt;/strong&gt;。✅&lt;/li&gt;
&lt;li&gt;驗證 &lt;code&gt;bun scripts/validate-posts.ts&lt;/code&gt; 全綠 + &lt;code&gt;hugo --minify&lt;/code&gt; 乾淨構建（265 頁）。✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用戶最初理解 &lt;code&gt;YYYYMMDD{6位hash}.md&lt;/code&gt; 時我誤把方括號當成可選語法，按無方括號實現，後被糾正改為字面方括號 &lt;code&gt;YYYYMMDD[xxxxxx].md&lt;/code&gt;（修正 &lt;code&gt;computeHash6&lt;/code&gt; 輸出格式 + 測試 + 註釋）。⚠️&lt;/li&gt;
&lt;li&gt;用戶指出 hash 用自寫 djb2 不專業，&lt;strong&gt;改用 &lt;code&gt;node:crypto&lt;/code&gt; 的 SHA-256&lt;/strong&gt;（前 3 字節，分佈更均勻、行業標準）。⚠️&lt;/li&gt;
&lt;li&gt;dry-run 時腳本在 5 對文件上報告目標名碰撞，懷疑 djb2 分佈問題。實際排查：4 種不同哈希（djb2 24bit / djb2 full 32bit / FNV-1a 24bit / xxhash32 24bit）以及 SHA-256 全部在&lt;strong&gt;完全相同的 5 對&lt;/strong&gt;上碰撞 → 證實這 5 對 body 真的 100% 相同（完整 64 字符 SHA-256 也一致），屬於歷史遺留的真實重複文章，不是哈希質量問題。⚠️ 解決方案：用戶手動選保留哪個，&lt;code&gt;git rm&lt;/code&gt; 刪另一個，配套 cover SVG 同步刪除。&lt;/li&gt;
&lt;li&gt;第一次 &lt;code&gt;hugo --minify&lt;/code&gt; 後看到 public/ 裡仍有 &lt;code&gt;2020-10-29-log-8/&lt;/code&gt; 等舊 URL，懷疑 Hugo 把新文件當舊名渲染。⚠️ 實際是 hugo 沒清空 &lt;code&gt;public/&lt;/code&gt;，舊文件殘留；&lt;code&gt;rm -rf public/ resources/ &amp;amp;&amp;amp; hugo --minify&lt;/code&gt; 後正確：URL 形如 &lt;code&gt;/posts/2020031100oh3i/&lt;/code&gt;，&lt;strong&gt;Hugo slugify 自動去掉方括號&lt;/strong&gt;。⚠️&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URL 全部變更&lt;/strong&gt;：舊 &lt;code&gt;/posts/2020-03-11-github-actions/&lt;/code&gt; → 新 &lt;code&gt;/posts/2020031100oh3i/&lt;/code&gt;。按用戶決定不添加 alias，所有舊 URL 將 404。⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如需進一步自定義首頁信息卡片樣式，可通過 &lt;code&gt;assets/css/extended/*.css&lt;/code&gt; 覆蓋 &lt;code&gt;.home-info&lt;/code&gt; 相關樣式。&lt;/li&gt;
&lt;li&gt;舊的 &lt;code&gt;/posts/{slug}/&lt;/code&gt; URL 已全部失效。如未來想恢復外部鏈接有效性，可寫一個小腳本掃描 git 歷史為每篇生成 &lt;code&gt;aliases&lt;/code&gt; frontmatter。&lt;/li&gt;
&lt;li&gt;部署到生產後建議用 &lt;code&gt;curl -I&lt;/code&gt; 抽查若干新舊 URL 確認 404/200 符合預期，並提交 Google Search Console 站點地圖更新。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-27</title><link>https://sdttttt.online/zh-tw/claudelog/2026-07-27/</link><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-07-27/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修改 &lt;code&gt;scripts/gen-covers.ts&lt;/code&gt;，移除 SVG 封面中的方形與菱形元素：
&lt;ul&gt;
&lt;li&gt;從 symbol 列表刪除 &lt;code&gt;□&lt;/code&gt; 與 &lt;code&gt;◇&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;刪除 &lt;code&gt;patternRectangles&lt;/code&gt; 與 &lt;code&gt;patternGrid&lt;/code&gt; 兩個圖案函數，並從 &lt;code&gt;PATTERN_FNS&lt;/code&gt; 中移除&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;同步更新 &lt;code&gt;scripts/__tests__/gen-covers.test.ts&lt;/code&gt;，移除對已刪除圖案的引用&lt;/li&gt;
&lt;li&gt;運行 &lt;code&gt;bun test scripts/__tests__/gen-covers.test.ts&lt;/code&gt;，29 個測試全部通過 ✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合併自動修復流程到 deploy.yml&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;改寫 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;，把 &lt;code&gt;gen-covers&lt;/code&gt; + &lt;code&gt;format-markdown&lt;/code&gt; 併入 build job，在 &lt;code&gt;hugo --minify&lt;/code&gt; 之前順序執行（gen-covers 先，format 後，一次提交無殘留）&lt;/li&gt;
&lt;li&gt;刪除獨立的 &lt;code&gt;.github/workflows/format-markdown.yml&lt;/code&gt; 與 &lt;code&gt;.github/workflows/gen-covers.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/git-commit-push.ts&lt;/code&gt; 加 &lt;code&gt;git pull --rebase&lt;/code&gt; 兜底，避免併發 push 被拒&lt;/li&gt;
&lt;li&gt;移除 deploy build job 的 &lt;code&gt;if: github.actor != 'github-actions[bot]'&lt;/code&gt;（該條件在 &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; push 場景下從未生效，是死代碼）&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;permissions: contents: write&lt;/code&gt; 與 &lt;code&gt;workflow_dispatch&lt;/code&gt; 觸發器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果&lt;/strong&gt;：一次 push → 一個 bot commit → 部署的是修復後的內容（封面、格式化結果即時上線） ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;最初計劃新建獨立的 &lt;code&gt;auto-fix.yml&lt;/code&gt; workflow，但發現 &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; 推送的 commit 不會觸發新 workflow run，導致封面/格式化結果延遲一次 push 才上線 ⚠️
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解決方案&lt;/strong&gt;：直接合併到 &lt;code&gt;deploy.yml&lt;/code&gt;，在構建前完成修復，部署的就是修復後的內容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;若後續想補充新圖案，可優先加入曲線/有機形態，進一步豐富封面視覺差異&lt;/li&gt;
&lt;li&gt;如需進一步降低 bot commit 噪音，可考慮在 &lt;code&gt;git-commit-push.ts&lt;/code&gt; 里加 &lt;code&gt;git diff-index --quiet HEAD&lt;/code&gt; 檢查，有改動才 commit/push&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-24</title><link>https://sdttttt.online/zh-tw/claudelog/2026-07-24/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-07-24/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修改 &lt;code&gt;.github/workflows/check-dead-links.yml&lt;/code&gt; 中的 &lt;code&gt;Check dead links&lt;/code&gt; 步驟，使用 &lt;code&gt;|| true&lt;/code&gt; 讓該步驟始終成功，避免死鏈檢查失敗阻塞 CI ✅&lt;/li&gt;
&lt;li&gt;修改 &lt;code&gt;scripts/check-dead-links.ts&lt;/code&gt;，跳過位於 &lt;code&gt;```&lt;/code&gt; 與 &lt;code&gt;~~~&lt;/code&gt; 圍欄代碼塊內的鏈接，避免代碼示例中的 URL 被誤檢 ✅&lt;/li&gt;
&lt;li&gt;為 &lt;code&gt;scripts/&lt;/code&gt; 下所有非環境依賴腳本補充單元測試，共 106 個測試用例全部通過；同時修復了 &lt;code&gt;frontmatter.ts&lt;/code&gt; 嵌套對象解析和 &lt;code&gt;gen-covers.ts&lt;/code&gt; 的 &lt;code&gt;pick&lt;/code&gt; 函數在處理負數時的行為 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;無 ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;後續可考慮將死鏈檢查失敗結果以非阻塞方式上報（如 issue 或註釋），而非直接忽略&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-22</title><link>https://sdttttt.online/zh-tw/claudelog/2026-07-22/</link><pubDate>Wed, 22 Jul 2026 00:00:00 +0800</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-07-22/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;將博客默認主題從 &lt;code&gt;auto&lt;/code&gt; 切換為 &lt;code&gt;dark&lt;/code&gt;，訪問者首次進入站點時將直接以 Dark 模式瀏覽 ✅&lt;/li&gt;
&lt;li&gt;將最近兩篇文章（《意義》《關於戀愛觀》）從 &lt;code&gt;private: true&lt;/code&gt; 改為 Hugo 原生 &lt;code&gt;build.list: never + render: true&lt;/code&gt;，在 /posts/ 列表中隱藏但保留直接訪問鏈接 ✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;.github/workflows/gen-covers.yml&lt;/code&gt;，在 &lt;code&gt;content/posts/**.md&lt;/code&gt; 變更時自動運行 &lt;code&gt;bun scripts/gen-covers.ts --all --inject-fm&lt;/code&gt; 生成封面並注入 front matter ✅&lt;/li&gt;
&lt;li&gt;提取 &lt;code&gt;scripts/lib/args.ts&lt;/code&gt; 和 &lt;code&gt;scripts/lib/git.ts&lt;/code&gt; 共享工具，新增 &lt;code&gt;scripts/git-commit-push.ts&lt;/code&gt; ✅&lt;/li&gt;
&lt;li&gt;改造 &lt;code&gt;format-markdown.yml&lt;/code&gt; 和 &lt;code&gt;gen-covers.yml&lt;/code&gt;，統一使用 &lt;code&gt;bun scripts/git-commit-push.ts&lt;/code&gt; 提交變更 ✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/format-markdown.ts&lt;/code&gt;，&lt;code&gt;format-markdown.yml&lt;/code&gt; 的格式化步驟改為 &lt;code&gt;bun&lt;/code&gt; 執行 ✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/validate-posts.ts&lt;/code&gt;、&lt;code&gt;scripts/sync-covers.ts&lt;/code&gt;、&lt;code&gt;scripts/check-dead-links.ts&lt;/code&gt; 三個腳本 ✅&lt;/li&gt;
&lt;li&gt;抽離 &lt;code&gt;scripts/lib/frontmatter.ts&lt;/code&gt;，&lt;code&gt;gen-covers.ts&lt;/code&gt; 與校驗腳本共享 front matter 解析 ✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;validate-posts.yml&lt;/code&gt;、&lt;code&gt;sync-covers.yml&lt;/code&gt;、&lt;code&gt;check-dead-links.yml&lt;/code&gt; 三個 workflow ✅&lt;/li&gt;
&lt;li&gt;精簡 &lt;code&gt;layouts/partials/custom_footer.html&lt;/code&gt;，只保留 Cloudflare Web Analytics 腳本 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;validate-posts.ts&lt;/code&gt; 初版未按 Hugo 資源規則查找 &lt;code&gt;assets/&lt;/code&gt; 目錄，導致大量封面誤報不存在，已修復為同時查找 &lt;code&gt;assets/&lt;/code&gt; 和 &lt;code&gt;static/&lt;/code&gt; ⚠️&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content/posts/2020-05-09-gfs.md&lt;/code&gt; 使用 TOML front matter（&lt;code&gt;+++&lt;/code&gt;），共享解析器只支持 YAML，已將其轉換為 YAML 格式 ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;無&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-21</title><link>https://sdttttt.online/zh-tw/claudelog/2026-07-21/</link><pubDate>Tue, 21 Jul 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-07-21/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;嘗試更新 PaperMod 主題子模塊，確認已是最新版（154d006，v8.0-138）✅&lt;/li&gt;
&lt;li&gt;單獨提交 &lt;code&gt;content/about.md&lt;/code&gt;：移除 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 固定 &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; 屬性 ✅&lt;/li&gt;
&lt;li&gt;重寫 &lt;code&gt;static/favicon.svg&lt;/code&gt;：從原本的幾何圖形改為 Claude Code 風格的字母 R favicon（深色圓角矩形 + 襯線字體 + 暖橙色漸變）✅&lt;/li&gt;
&lt;li&gt;PaperMod 配置增強：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[params.editPost]&lt;/code&gt; URL：每篇文章底部加&amp;quot;在 GitHub 編輯此頁&amp;quot;按鈕 ✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[params.schema]&lt;/code&gt;：&lt;code&gt;publisherType = &amp;quot;Person&amp;quot;&lt;/code&gt; + &lt;code&gt;sameAs&lt;/code&gt; 社交鏈接（SEO）✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[params.profileMode]&lt;/code&gt;：從 &lt;code&gt;homeInfoParams&lt;/code&gt; 切到完整 profile 模式（先不放頭像）✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[params.assets]&lt;/code&gt;：補全 apple-touch-icon / safari-pinned-tab / mstile / theme ✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[params.cover]&lt;/code&gt;：默認行為參數（responsiveImages、linkFullImages）✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新增品牌資源（佔位，後續可換）：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;static/apple-touch-icon.png&lt;/code&gt; (180×180) ✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/mstile-150x150.png&lt;/code&gt; (150×150) ✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/safari-pinned-tab.svg&lt;/code&gt;（單色字母 R）✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assets/images/cover-default.svg&lt;/code&gt;（統一佔位封面）✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;給最近兩篇文章加 cover：&lt;code&gt;2026-07-21-love.md&lt;/code&gt; 和 &lt;code&gt;2026-07-16-self.md&lt;/code&gt; ✅&lt;/li&gt;
&lt;li&gt;修復 profileMode 啟用後首頁無文章列表的問題：
&lt;ul&gt;
&lt;li&gt;創建 &lt;code&gt;content/posts/_index.md&lt;/code&gt;（Posts section 頁） ✅&lt;/li&gt;
&lt;li&gt;導航菜單加 &amp;ldquo;Posts&amp;rdquo; 項（weight=1） ✅&lt;/li&gt;
&lt;li&gt;Hugo 構建驗證：&lt;code&gt;/posts/index.html&lt;/code&gt; 正常生成（16.3KB） ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;profileMode.buttons&lt;/code&gt; 加 Posts / Archives / Tags 三個跳轉按鈕 ✅&lt;/li&gt;
&lt;li&gt;批量生成文章封面 SVG：
&lt;ul&gt;
&lt;li&gt;寫 &lt;code&gt;scripts/gen-covers.ts&lt;/code&gt;（TypeScript + Bun，零依賴）✅&lt;/li&gt;
&lt;li&gt;5 種調色板 + 8 種幾何圖案 + djb2 hash 選樣（tags → 調色板，標題 → 圖案）✅&lt;/li&gt;
&lt;li&gt;生成 220 個 SVG 到 &lt;code&gt;assets/images/covers/&lt;/code&gt;（2.6MB，無標題、1200×630）✅&lt;/li&gt;
&lt;li&gt;給 219 篇文章 front matter 注入 &lt;code&gt;cover.image&lt;/code&gt; 字段（YAML）✅&lt;/li&gt;
&lt;li&gt;手動給 &lt;code&gt;2020-05-09-gfs.md&lt;/code&gt;（TOML front matter）加 cover 塊 ✅&lt;/li&gt;
&lt;li&gt;跳過 1 篇已有真實封面圖（kanon.md） ✅&lt;/li&gt;
&lt;li&gt;Hugo 構建驗證通過（266 頁面，309ms）✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;無&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;無&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-04-14</title><link>https://sdttttt.online/zh-tw/claudelog/2026-04-14/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-04-14/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;替換不蒜子為 Cloudflare Web Analytics&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;原因：不蒜子 Referer 問題導致 page PV 統計異常（所有文章顯示相同數字 261）&lt;/li&gt;
&lt;li&gt;移除：不蒜子統計代碼和配置&lt;/li&gt;
&lt;li&gt;添加：Cloudflare Web Analytics (token: 261d0f0&amp;hellip;f822)&lt;/li&gt;
&lt;li&gt;修改文件：hugo.toml, layouts/partials/custom_footer.html&lt;/li&gt;
&lt;li&gt;將遠程 URL 從 HTTPS 改為 SSH 格式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;刪除 layouts/_default/single.html&lt;/li&gt;
&lt;li&gt;刪除 layouts/partials/busuanzi.html（廢棄文件）&lt;/li&gt;
&lt;li&gt;刪除 static/avatar.jpg（未被使用）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;不蒜子 Referer 被火狐瀏覽器設置為首頁而非文章頁，導致 page_pv 統計串站 ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;提交前先確認日期，避免再犯&lt;/li&gt;
&lt;li&gt;所有改動都要寫 claudelog，不需要問用戶&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-04-01</title><link>https://sdttttt.online/zh-tw/claudelog/2026-04-01/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-04-01/</guid><description>&lt;h2 id="維護記錄"&gt;維護記錄&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CLAUDE.md 重構&lt;/strong&gt; ✅&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;添加標準前綴和項目概述&lt;/li&gt;
&lt;li&gt;新增常用命令和項目架構章節&lt;/li&gt;
&lt;li&gt;簡化 Git 提交規範和維護日誌說明&lt;/li&gt;
&lt;li&gt;移除過時信息（模型版本等）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;統一命名&lt;/strong&gt; ✅&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;content/maintenance/&lt;/code&gt; → &lt;code&gt;content/claudelog/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;菜單 &lt;code&gt;ClawCare&lt;/code&gt; → &lt;code&gt;ClaudeLog&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安全審查&lt;/strong&gt; ✅&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;檢查所有文章的敏感信息&lt;/li&gt;
&lt;li&gt;移除 PPPoE 用戶名（電話號碼）&lt;/li&gt;
&lt;li&gt;移除 RouterOS system id&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的問題"&gt;遇到的問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GitHub 推送被郵箱隱私保護拒絕 ⚠️
&lt;ul&gt;
&lt;li&gt;原因：Committer 郵箱為私有郵箱&lt;/li&gt;
&lt;li&gt;解決方案：臨時修改 git user.email 為 noreply 郵箱後重新 amend 提交&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建議"&gt;下次建議&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;考慮將 git user.email 永久設置為 noreply 郵箱，避免每次都遇到此問題&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Blog 維護日誌</title><link>https://sdttttt.online/zh-tw/claudelog/2026-03-31/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/claudelog/2026-03-31/</guid><description>&lt;h2 id="維護記錄---2026-03-31"&gt;維護記錄 - 2026-03-31&lt;/h2&gt;
&lt;h3 id="-任務完成總結"&gt;✅ 任務完成總結&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;例行維護檢查&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;檢查網站構建狀態 - 正常 ✅&lt;/li&gt;
&lt;li&gt;驗證Hugo配置文件 - 正常 ✅&lt;/li&gt;
&lt;li&gt;確認所有文章日期字段 - 正確 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;內容結構優化&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;創建專門的維護日誌頁面 &lt;code&gt;/maintenance/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;添加&amp;quot;ClawCare&amp;quot;菜單到主導航欄（權重:2）&lt;/li&gt;
&lt;li&gt;將維護記錄與普通blog文章分離&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Git規範修正&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>About</title><link>https://sdttttt.online/zh-tw/about/</link><pubDate>Fri, 03 Apr 2020 00:00:00 +0000</pubDate><guid>https://sdttttt.online/zh-tw/about/</guid><description>&lt;blockquote&gt;
&lt;p&gt;曠野和乾旱之地，必然歡喜。&lt;/p&gt;
&lt;p&gt;沙漠也必快樂，又像玫瑰開花。&lt;/p&gt;
&lt;p&gt;必開花繁盛，樂上加樂，而且歡呼。&lt;/p&gt;
&lt;p&gt;——《以賽亞書》第35章&lt;/p&gt;
&lt;/blockquote&gt;
&lt;img width="552" height="785" alt="a6841def004e6c7c38dd0a4b3f0fbc8e" src="https://github.com/user-attachments/assets/9a38610f-b3cc-4239-b940-e4b123d20ebe" /&gt;
&lt;p&gt;這是我最最最喜歡的角色！宮城志緒理！很可愛吧！她是屬於仙台葉月的！&lt;/p&gt;
&lt;p&gt;&lt;em&gt;我第一次發自真心的購買了正版的小說，或許是為了見到這她們兩個才會接觸ACG文化的吧。&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>