今天要解的問題
Day30 寫完回顧,鐵人賽的 30 天就結束了。可是 Day31 和 Day32 已經寫好,還用鐵人賽的格式放著:目錄叫 ironman-2026-day31-…、series 掛在 ironman-2026、文末有「本文同步發表於 kiwi-walk.com」那一行。
我想繼續每天寫,但方向會變。當時是這樣說的:
因為鐵人賽已經結束,但我仍想維持這個發文,只是發文不會只有 engineer,可能會包含其他 domain 所以範本會不一樣,但其他的文章都會來自於 llm-wiki
這句話拆開有三個問題:
- 鐵人賽之後的文章要怎麼串起來?之前靠的是
ironman-2026這個系列。 - 文章會散在 art、books、engineer 等不同分類,路徑和標題怎麼定?
- 寫文章的 skill 只會寫開發紀錄,書評、藝評這類從 llm-wiki 來的文章需要另一套範本。
做到一半又冒出第四個:系列如果一直寫下去,每篇封面下那個可展開的系列清單會越來越長。
想法與取捨
開新系列,還是不用系列
Claude 一開始列了三個選項:Day1–30 留在 ironman-2026、之後另開系列;沿用同一個系列、改掉鐵人賽字樣;或乾脆不用系列,只靠 tag 和分類。我的回答是:
我想要開新的系列,但比較偏向 daily streak 的概念,而且因為主題非集中在 engineer,所以目前是 1,3 在猶豫
Claude 第二輪再問的時候補了一個事實:Hugo 的 series 是 taxonomy,跟分類無關。文章散在 art、books、engineer 的時候,能把 Day31、Day32、Day33… 串成一條線的只有系列頁和封面下的導覽;不用系列的話,Day 編號只剩標題上的數字,讀者在各分類頁只看得到片段。daily streak 要的正是那條線,最後選了開新系列。
名稱從幾個候選裡挑了 kiwi-daily,顯示名稱「Kiwi 的每日筆記」。ironman-2026 就停在 30 篇,Day31、Day32 移出來。
Day 編號、路徑、標題
- Day 照日期算,延續鐵人賽的 Day1 = 2026-09-15。漏發一天就跳號,不補號。
- 只發 blog,不再同步 iThome,文末那行連結拿掉。
- 路徑依主題放分類,目錄只用 slug:例如
blogs/engineer/claude-doctor/、之後的書評放blogs/books/<書名>/。Day 只出現在標題和 frontmatter,URL 不帶編號。Day31、Day32 還沒發佈,現在改名不會讓任何連結失效。 - 標題:工程文維持
DayN [專案名] …;非工程文不加方括號。
鐵人賽系列頁要不要加一句「後續在新系列」?我的回答是「Day30 加就好了」。所以只在 Day30 文末加一則日期註記,系列頁不動。
系列導覽太長:列最近的,還是列前後幾篇
改到一半我補了一句:
因為這個可能會延續好幾天,可能會導致原本上方的展開變得非常長,或許就列出近期的或是直接放連結也可
最後做的是第三種:以目前這篇為中心,列前後共 7 篇,編號照它在系列裡的真實位置,其餘用「前面還有 N 篇」「後面還有 N 篇」和「看整個系列」帶過。跟「列出最近幾篇」比,差別在讀舊文章的時候:讀 Day15 時,旁邊列的是 Day12 到 Day18,而不是跟它無關的最新幾篇。系列不超過 10 篇時照舊全列,llm-wiki 這種精選清單不受影響。這個改動是全站的,鐵人賽那 30 篇也一起變短。

範本:拆兩個 skill
寫文章的 skill 原本是鐵人賽專用的 ironman-post,固定五段:今天要解的問題、想法與取捨、實作、踩到的坑、小結。這套範本對開發紀錄很合用,但書評不會有「踩到的坑」。選項有「一個 skill 依類型切換範本」和「拆兩個」,我選拆兩個:
daily-devlog:從ironman-post改來,寫開發紀錄。五段範本不動,改掉的是系列、路徑、Day 的算法和 iThome 輸出。daily-wiki-post:把 llm-wiki vault 裡的頁面轉成文章。
第二支的範本,我請 Claude 先提草案。它去看了 vault 才發現書評和藝評本來就有範本:vault 的 book-review skill 產出的書頁有固定段落(簡單說、用三句話說明、為什麼選擇、帶來什麼……),art-review 也有自己的 template。所以草案是照類型分:
| 類型 | 範本 |
|---|---|
| 書評 | 沿用 book-review 的段落 |
| 藝評 | 沿用 art-review,標題用 Day32 定的「前綴《展名》一句話」 |
| 主題研究 | 新的:為什麼想查、我原本以為、查到什麼、跟我的關係、還沒解的問題、來源 |
三種共用一條規則:vault 裡標著「AI 提問,待你確認」或「缺分析」的段落,不能直接當成我的看法寫進文章,要逐條列給我決定。
skill 放哪、能不能在 mac 上跑
兩支 skill 都會從別的專案被叫起來,例如在 vault 裡寫完書評,直接發到部落格。我的要求是:
skill 也需要支援之前跨 project 的寫入,所以需要放在 account
所以放在使用者層級的 ~/.claude/skills/,另外打包上傳到 claude.ai 帳號。寫完我看了一眼又補了一句:
你的 skill 不要固定在 windows 路徑,可能還會有 mac
第一版裡寫死了 E:\Projects\sean2249.github.io、E:\Projects\llm-wiki,截圖指令也是 PowerShell 加 Windows 的 Chrome 路徑。改成用內容認 repo,詳見下面。
實作
新系列
系列的標題和介紹放在 content/series/kiwi-daily/_index.md:
---
title: "Kiwi 的每日筆記"
summary: 鐵人賽結束後的每日連載:side project 的開發紀錄,也有從 llm-wiki 整理出來的看展、讀書與各種主題筆記。
---
文章這邊只要 frontmatter 換掉。以 Day31 為例:
day: 31
project: llm-wiki
series:
- kiwi-daily
- llm-wiki
ironman-2026 這個 tag 一起拿掉。一篇文章可以同時在兩個系列,封面下就會出現兩個導覽,各自計算位置。
系列導覽的視窗
layouts/partials/series-nav.html 原本是把系列的每一篇都列出來。改成先算目前這篇的位置 $pos,再算出視窗的頭尾 $lo、$hi:
{{- $page := . }}
{{- $max := 7 }}
{{- range .GetTerms "series" }}
{{- $posts := .Pages.ByDate }}
{{- $n := len $posts }}
{{- $pos := 0 }}
{{- range $i, $p := $posts }}{{ if eq $p.RelPermalink $page.RelPermalink }}{{ $pos = add $i 1 }}{{ end }}{{ end }}
{{- $lo := 1 }}
{{- $hi := $n }}
{{- if gt $n (add $max 3) }}
{{- $lo = sub $pos (div $max 2) }}
{{- if lt $lo 1 }}{{ $lo = 1 }}{{ end }}
{{- $hi = sub (add $lo $max) 1 }}
{{- if gt $hi $n }}{{ $hi = $n }}{{ $lo = add (sub $n $max) 1 }}{{ end }}
{{- end }}
{{- $shown := first (add (sub $hi $lo) 1) (after (sub $lo 1) $posts) }}
gt $n (add $max 3) 是門檻:超過 10 篇才開始裁。裁的時候以目前這篇為中心往前取 3 篇(div 7 2 是 3),往後補滿 7 篇;碰到尾端就整個往前推,所以 Day30 拿到的是 Day24 到 Day30,不會只剩 4 篇。after 跳過前面的、first 取 7 篇,兩個都是 Hugo 內建的 collection 函式。
列表本身用 <ol start> 讓編號接上真實位置,前後各補一行還剩幾篇:
{{- if gt $lo 1 }}
<p class="series-nav-more">⋯ 前面還有 {{ sub $lo 1 }} 篇</p>
{{- end }}
<ol start="{{ $lo }}">
{{- range $shown }}
...
{{- end }}
</ol>
{{- if lt $hi $n }}
<p class="series-nav-more">⋯ 後面還有 {{ sub $n $hi }} 篇</p>
{{- end }}
<a class="series-nav-all" href="{{ .RelPermalink }}">看整個系列({{ $n }} 篇)→</a>
驗證方式是建置整站,再把 Day2、Day15、Day30 的導覽文字抓出來看,就是上面那張圖的三欄。
Day31、Day32 搬家
兩篇的目錄從 ironman-2026-day31-claude-doctor/ 改成 claude-doctor/,ironman-2026-day32-sources-and-titles/ 改成 sources-and-titles/。要跟著改的地方有四處:互相引用的站內連結、Day29 兩則更新註記裡指向 Day32 的連結、文末的 iThome 那一行,還有圖片。
圖片在 R2 的 key 是照目錄名來的(content/posts/engineer/<目錄>/images/<檔名>),所以用新目錄名重新上傳一次,再用 curl 確認四張都回 200。舊 key 底下的檔案沒有刪:已經沒有任何頁面引用它們,而刪掉是不可逆的。
Day30 文末的註記:
> 2026-10-15 更新:鐵人賽結束後繼續每天寫,主題不再只有工程,改放在新系列 [Kiwi 的每日筆記](/series/kiwi-daily/),從 [Day31](/blogs/engineer/claude-doctor/) 開始。
日期寫 10-15,是 Day31 上線的那天。照部落格的慣例,註記的日期要寫改動當天,但改動當天比 Day30 自己的日期(10-14)還早,讀者看到會覺得奇怪,所以改用新系列開始的日期。
找 repo 不靠路徑
兩支 skill 裡找 blog repo 的規則改成這樣(daily-devlog):
**找 blog repo**:不要寫死路徑(會在 Windows 和 mac 上跑)。blog repo 是 `origin` 指向
`sean2249/sean2249.github.io`、根目錄有 `hugo.yml` 與 `content/blogs/` 的 git repo。依序找:
1. 目前工作目錄(或它所在的 git worktree)就是它,就寫在這裡
2. 目前專案的上一層目錄裡有 `sean2249.github.io/`(side project 都放在同一個父目錄下),就用它
3. 都找不到就問使用者一次路徑
平台相關的指令(Python、wrangler 的 PATH 等)以 blog repo 的 `CLAUDE.md` 為準。
vault 也一樣,用資料夾名 llm-wiki 和裡面有 books/wiki/、art/wiki/ 來認。截圖指令改成 "$CHROME" --headless=new …,下面列出 Windows 和 mac 各自的 Chrome 位置。跟平台有關的細節交給各 repo 自己的 CLAUDE.md,skill 不用知道。
順手清掉 slug
部落格的規則是「不要在 frontmatter 放 slug:,URL 由目錄決定」,但舊的書評、藝評、想法文還留著 24 個 slug:,有幾個寫成 "/fun的力量" 這種開頭帶斜線、大小寫跟目錄不同的寫法。刪之前先建一次站、列出所有 index.html 的路徑,刪完再建一次比對:
grep -rlE "^slug:" content/blogs --include=index.md | while read f; do sed -i '/^slug:/d' "$f"; done
diff "$SP/before.txt" "$SP/after.txt"; echo diff=$?
輸出是 diff=0,兩次建置的頁面路徑完全一樣,這 24 個 slug 本來就沒有作用。
踩到的坑
建置成功,卻少了一半的頁面
改完導覽之後在 worktree 裡建置,Hugo 正常結束,但抓出來的導覽是空的,連 /series/kiwi-daily/ 都只有 index.xml、沒有 index.html。建置輸出:
WARN found no layout file for "json" for kind "home": You should create a template file which matches Hugo Layouts Lookup Rules for this combination.
| ZH-TW
-------------------+--------
Pages | 297
先回頭確認 single.html 有沒有呼叫 series-nav.html,有。再看 themes/PaperMod/,是空的:這個 worktree 是從主 repo 開出來的,git submodule 沒有跟著初始化,整個 PaperMod 主題不存在。Hugo 找不到主題的 layout 不會報錯,只會少產頁面,所以 exit code 是 0。
改成指向主 checkout 已經有的主題目錄,不用另外拉 submodule:
hugo --themesDir E:/Projects/sean2249.github.io/themes -d "$P"
頁數變成 460,導覽也出現了。之後在 worktree 裡建置,先看一眼 Pages 數字對不對。
用 Python 改 skill,反斜線被吃掉
把 skill 改成跨平台時,用一支 Python 腳本做字串替換,結果 daily-wiki-post 那邊報:
MISSING in C:\Users\sean2/.claude/skills/daily-wiki-post/SKILL.md: …
原因是 skill 的 description 寫在 YAML 的雙引號字串裡,路徑在檔案裡是 E:\\Projects\\llm-wiki(兩個反斜線)。腳本裡要找的字串卻只剩一個,兩邊對不上。同一支腳本在 daily-devlog 那邊雖然替換成功,但截圖指令原本用行尾的 \ 分成兩行,替換後黏成了一行。最後 daily-wiki-post 改用逐段編輯,黏掉的那行再手動修回。
寫這篇的時候又踩了一次:用同樣的方式改這篇文章裡提到反斜線的段落,同一個錯誤再出現一次。要替換的內容含反斜線時,腳本裡的字串跳脫很容易差一層,直接編輯檔案反而比較穩。
小結
鐵人賽之後的文章有了新的系列 kiwi-daily:Day 照日期延續、路徑依主題放分類、只發 blog;Day31、Day32 已經搬過去。系列導覽在超過 10 篇時只列目前這篇前後共 7 篇。寫文章的 skill 拆成 daily-devlog 和 daily-wiki-post,放在帳號層級,不綁 Windows 路徑。這篇就是用 daily-devlog 寫的第一篇。
還留著兩件收尾的事:R2 上舊目錄名底下那四張已經沒人引用的圖,以及主 checkout 裡 Day31、Day32 的未提交草稿,要在拉新版之前清掉。daily-wiki-post 還沒實際跑過,下一篇要寫什麼還沒決定。
