<?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>Claude on Tarragon</title><link>https://tarrragon.github.io/blog/tags/claude/</link><description>Recent content in Claude on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 24 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/claude/index.xml" rel="self" type="application/rss+xml"/><item><title>Skills — Claude skill 的文章版本</title><link>https://tarrragon.github.io/blog/skills/</link><pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/skills/</guid><description>&lt;h2 id="這個資料夾是什麼">這個資料夾是什麼&lt;/h2>
&lt;p>&lt;code>content/skills/&lt;/code> 收錄&lt;strong>從 &lt;code>.claude/skills/&lt;/code> 轉成文章&lt;/strong>的 skill 版本。&lt;/p>
&lt;p>同一份 skill 有兩種存在形式，各自負責不同角色：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>位置&lt;/th>
 &lt;th>角色&lt;/th>
 &lt;th>讀者&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>.claude/skills/&amp;lt;name&amp;gt;/&lt;/code>&lt;/td>
 &lt;td>實際 skill，Claude runtime 呼叫&lt;/td>
 &lt;td>Claude&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>content/skills/&amp;lt;name&amp;gt;/&lt;/code>（本處）&lt;/td>
 &lt;td>文章版本，Hugo 渲染成 blog 頁&lt;/td>
 &lt;td>人類讀者&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>兩處內容相同、結構略有差異：&lt;code>.claude/&lt;/code> 版本保留原始 &lt;code>SKILL.md + references/&lt;/code> 巢狀結構以配合 Claude 的路徑解析；&lt;code>content/&lt;/code> 版本扁平化（references 內容升級到同層），以契合 blog 的單層文章呈現。&lt;/p>
&lt;h2 id="目前收錄的-skill">目前收錄的 skill&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Skill&lt;/th>
 &lt;th>主題&lt;/th>
 &lt;th>入口&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>compositional-writing&lt;/td>
 &lt;td>Zettelkasten 式組合寫作方法論&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/skills/compositional-writing/" data-link-title="Compositional Writing — 組合式寫作方法論" data-link-desc="以 Zettelkasten 為核心、針對程式碼註解、文件、log、prompt、欄位、長篇技術文章、外部分析材料轉教學文章、跨多篇 collection 結構的寫作方法論。核心原則 &amp;#43; 觸發路由 &amp;#43; 情境 reference。">/skills/compositional-writing/&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>requirement-protocol&lt;/td>
 &lt;td>需求確認到實作的對話協議（模糊指令、失敗轉折、漸進驗證等）&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/skills/requirement-protocol/" data-link-title="Requirement Protocol — 需求確認到實作的對話協議" data-link-desc="從需求確認到實作的對話協議：模糊指令澄清、可決定 vs 該確認、失敗 2 次轉折、覆寫成本告知、revert checkpoint、漸進驗證、工具切換時機。六大原則 &amp;#43; 五份情境 reference。">/skills/requirement-protocol/&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>frontend-with-playwright&lt;/td>
 &lt;td>框架無關的前端開發 + Playwright 驗證 + Filter × Source 跨領域 stream 操作（DOM / CSS / JS / framework 共處 / a11y / 資料流）&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/skills/frontend-with-playwright/" data-link-title="Frontend with Playwright — 框架無關的前端開發 &amp;#43; Playwright 驗證" data-link-desc="框架無關的前端開發協議 &amp;#43; Playwright 驗證：DOM topology 先於 CSS、CSS / JS 邊界辨識、Playwright 三個位置（假設 / 行為 / 互動驗證）、framework 共處、Reactive 效能、A11y、Filter × Source 跨領域 stream 操作。六大原則 &amp;#43; 七份情境 reference。">/skills/frontend-with-playwright/&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>wrap-decision&lt;/td>
 &lt;td>WRAP 決策框架（錨點確認、資料充足度、擴增選項、實境檢驗、機會成本、行前預想與絆腳索）&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/skills/wrap-decision/" data-link-title="WRAP 決策框架 — 認知偏誤防護與決策品質" data-link-desc="WRAP 決策框架的 blog 好讀版：用錨點確認、資料充足度、選項擴增、現實檢驗、機會成本、行前預想與絆腳索防止自動駕駛式決策。">/skills/wrap-decision/&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="把新-skill-轉成文章的標準流程">把新 skill 轉成文章的標準流程&lt;/h2>
&lt;p>以下步驟假設新 skill 已經放在 &lt;code>.claude/skills/&amp;lt;name&amp;gt;/&lt;/code>，包含 &lt;code>SKILL.md&lt;/code> 和（可能的）&lt;code>references/&lt;/code> 子資料夾。&lt;/p>
&lt;h3 id="step-1複製一份到-contentskills">Step 1：複製一份到 content/skills/&lt;/h3>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">cp -R .claude/skills/&amp;lt;name&amp;gt; content/skills/&amp;lt;name&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Claude 版保持原樣、不再動它；所有後續修改都只改文章版。&lt;/p>
&lt;h3 id="step-2扁平化-references">Step 2：扁平化 references/&lt;/h3>
&lt;p>Blog 的文章層級為&lt;strong>單層&lt;/strong>，不保留 references 子資料夾。把所有 reference 移到跟 SKILL.md 同一層：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="nb">cd&lt;/span> content/skills/&amp;lt;name&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">git mv references/*.md .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">git rm references/.gitkeep &lt;span class="c1"># 如果有&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">rmdir references&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="step-3把-skillmd-改成小寫-skillmd">Step 3：把 &lt;code>SKILL.md&lt;/code> 改成小寫 &lt;code>skill.md&lt;/code>&lt;/h3>
&lt;p>Hugo pretty URL 會把檔名小寫輸出（&lt;code>SKILL.md&lt;/code> → &lt;code>/skills/&amp;lt;name&amp;gt;/skill/&lt;/code>），但 &lt;code>mdtools cards&lt;/code> 連結檢查以&lt;strong>檔名大小寫敏感&lt;/strong>的方式解析 URL 回檔案位置。若檔案是 &lt;code>SKILL.md&lt;/code>，cards 嘗試開啟 &lt;code>skill.md&lt;/code> 找不到，就會報 &lt;code>L1-broken-link&lt;/code>。&lt;/p></description><content:encoded><![CDATA[<h2 id="這個資料夾是什麼">這個資料夾是什麼</h2>
<p><code>content/skills/</code> 收錄<strong>從 <code>.claude/skills/</code> 轉成文章</strong>的 skill 版本。</p>
<p>同一份 skill 有兩種存在形式，各自負責不同角色：</p>
<table>
  <thead>
      <tr>
          <th>位置</th>
          <th>角色</th>
          <th>讀者</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>.claude/skills/&lt;name&gt;/</code></td>
          <td>實際 skill，Claude runtime 呼叫</td>
          <td>Claude</td>
      </tr>
      <tr>
          <td><code>content/skills/&lt;name&gt;/</code>（本處）</td>
          <td>文章版本，Hugo 渲染成 blog 頁</td>
          <td>人類讀者</td>
      </tr>
  </tbody>
</table>
<p>兩處內容相同、結構略有差異：<code>.claude/</code> 版本保留原始 <code>SKILL.md + references/</code> 巢狀結構以配合 Claude 的路徑解析；<code>content/</code> 版本扁平化（references 內容升級到同層），以契合 blog 的單層文章呈現。</p>
<h2 id="目前收錄的-skill">目前收錄的 skill</h2>
<table>
  <thead>
      <tr>
          <th>Skill</th>
          <th>主題</th>
          <th>入口</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>compositional-writing</td>
          <td>Zettelkasten 式組合寫作方法論</td>
          <td><a href="/blog/skills/compositional-writing/" data-link-title="Compositional Writing — 組合式寫作方法論" data-link-desc="以 Zettelkasten 為核心、針對程式碼註解、文件、log、prompt、欄位、長篇技術文章、外部分析材料轉教學文章、跨多篇 collection 結構的寫作方法論。核心原則 &#43; 觸發路由 &#43; 情境 reference。">/skills/compositional-writing/</a></td>
      </tr>
      <tr>
          <td>requirement-protocol</td>
          <td>需求確認到實作的對話協議（模糊指令、失敗轉折、漸進驗證等）</td>
          <td><a href="/blog/skills/requirement-protocol/" data-link-title="Requirement Protocol — 需求確認到實作的對話協議" data-link-desc="從需求確認到實作的對話協議：模糊指令澄清、可決定 vs 該確認、失敗 2 次轉折、覆寫成本告知、revert checkpoint、漸進驗證、工具切換時機。六大原則 &#43; 五份情境 reference。">/skills/requirement-protocol/</a></td>
      </tr>
      <tr>
          <td>frontend-with-playwright</td>
          <td>框架無關的前端開發 + Playwright 驗證 + Filter × Source 跨領域 stream 操作（DOM / CSS / JS / framework 共處 / a11y / 資料流）</td>
          <td><a href="/blog/skills/frontend-with-playwright/" data-link-title="Frontend with Playwright — 框架無關的前端開發 &#43; Playwright 驗證" data-link-desc="框架無關的前端開發協議 &#43; Playwright 驗證：DOM topology 先於 CSS、CSS / JS 邊界辨識、Playwright 三個位置（假設 / 行為 / 互動驗證）、framework 共處、Reactive 效能、A11y、Filter × Source 跨領域 stream 操作。六大原則 &#43; 七份情境 reference。">/skills/frontend-with-playwright/</a></td>
      </tr>
      <tr>
          <td>wrap-decision</td>
          <td>WRAP 決策框架（錨點確認、資料充足度、擴增選項、實境檢驗、機會成本、行前預想與絆腳索）</td>
          <td><a href="/blog/skills/wrap-decision/" data-link-title="WRAP 決策框架 — 認知偏誤防護與決策品質" data-link-desc="WRAP 決策框架的 blog 好讀版：用錨點確認、資料充足度、選項擴增、現實檢驗、機會成本、行前預想與絆腳索防止自動駕駛式決策。">/skills/wrap-decision/</a></td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="把新-skill-轉成文章的標準流程">把新 skill 轉成文章的標準流程</h2>
<p>以下步驟假設新 skill 已經放在 <code>.claude/skills/&lt;name&gt;/</code>，包含 <code>SKILL.md</code> 和（可能的）<code>references/</code> 子資料夾。</p>
<h3 id="step-1複製一份到-contentskills">Step 1：複製一份到 content/skills/</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">cp -R .claude/skills/&lt;name&gt; content/skills/&lt;name&gt;</span></span></code></pre></div><p>Claude 版保持原樣、不再動它；所有後續修改都只改文章版。</p>
<h3 id="step-2扁平化-references">Step 2：扁平化 references/</h3>
<p>Blog 的文章層級為<strong>單層</strong>，不保留 references 子資料夾。把所有 reference 移到跟 SKILL.md 同一層：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nb">cd</span> content/skills/&lt;name&gt;
</span></span><span class="line"><span class="ln">2</span><span class="cl">git mv references/*.md .
</span></span><span class="line"><span class="ln">3</span><span class="cl">git rm references/.gitkeep       <span class="c1"># 如果有</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">rmdir references</span></span></code></pre></div><h3 id="step-3把-skillmd-改成小寫-skillmd">Step 3：把 <code>SKILL.md</code> 改成小寫 <code>skill.md</code></h3>
<p>Hugo pretty URL 會把檔名小寫輸出（<code>SKILL.md</code> → <code>/skills/&lt;name&gt;/skill/</code>），但 <code>mdtools cards</code> 連結檢查以<strong>檔名大小寫敏感</strong>的方式解析 URL 回檔案位置。若檔案是 <code>SKILL.md</code>，cards 嘗試開啟 <code>skill.md</code> 找不到，就會報 <code>L1-broken-link</code>。</p>
<p>避免這個陷阱，把 content 版本的檔名直接改成小寫：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git mv content/skills/&lt;name&gt;/SKILL.md content/skills/&lt;name&gt;/skill.md</span></span></code></pre></div><p><code>.claude/</code> 版保留原本的 <code>SKILL.md</code>（符合 Claude skill 慣例）。兩邊檔名不同是刻意的：runtime 讀 <code>.claude/SKILL.md</code>、Hugo 渲染 <code>content/skill.md</code>、cards check 能解析。</p>
<h3 id="step-4修改-skillmd-的內部連結">Step 4：修改 skill.md 的內部連結</h3>
<p>skill.md 裡原本的 <code>references/X.md</code> 引用要改。有兩種合法寫法擇一：</p>
<ul>
<li><strong>Markdown 相對路徑</strong>：<code>./X.md</code> — 最無痛，Hugo render hook 會自動解析到對應頁面</li>
<li><strong>Hugo content-root 絕對路徑</strong>：<code>/skills/&lt;name&gt;/&lt;slug&gt;/</code> — 最穩，跟 blog 其他文章遷移後的寫法一致</li>
</ul>
<p>批次替換範例（將 <code>references/</code> 前綴整串刪除）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">sed -i <span class="s1">&#39;&#39;</span> <span class="s1">&#39;s|references/|./|g&#39;</span> content/skills/&lt;name&gt;/skill.md</span></span></code></pre></div><p>記得同時更新 <code>## Directory Index</code> 區塊那張 ASCII tree — 刪掉 <code>└── references/</code> 那一層、所有 reference 檔案縮排提到 skill.md 同層。</p>
<h3 id="step-5建立-_indexmdsection-索引">Step 5：建立 <code>_index.md</code>（section 索引）</h3>
<p><code>content/skills/&lt;name&gt;/_index.md</code> 是 Hugo section 的 landing page，URL 是 <code>/skills/&lt;name&gt;/</code>。</p>
<p>必備欄位（Hugo + mdtools 要求）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="ln">1</span><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&lt;Skill 名稱中英對照&gt;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w"></span><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;YYYY-MM-DD&gt;</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="w"></span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&lt;一句話描述 skill 做什麼&gt;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="w"></span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">...]</span><span class="w">
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="w"></span><span class="nn">---</span></span></span></code></pre></div><p>內容建議包含：</p>
<ol>
<li><strong>簡述</strong>：這個 skill 是什麼、解決什麼問題</li>
<li><strong>閱讀順序</strong>：場景 1（第一次接觸）與場景 2（已熟悉、直接解決任務）兩個切入點</li>
<li><strong>觸發路由表</strong>：複製 SKILL.md 的「When to Consult This Skill」表，但把檔案路徑替換成 Hugo 絕對 URL（<code>/skills/&lt;name&gt;/&lt;slug&gt;/</code>）</li>
<li><strong>與 blog 其他資料的關係</strong>：對照表（<code>.claude/skills/&lt;name&gt;/</code>、相關 <code>content/posts/...</code>）</li>
<li><strong>Last Updated</strong>：同步日期與 <code>.claude/</code> 版 SKILL.md 的 version</li>
</ol>
<p>可參考 <a href="https://github.com/tarrragon/blog/blob/main/content/skills/compositional-writing/_index.md">compositional-writing 的 <code>_index.md</code></a> 當範本。</p>
<h3 id="step-6補-hugo-frontmatter-到-skillmd-與每份-reference">Step 6：補 Hugo frontmatter 到 skill.md 與每份 reference</h3>
<p>原始 skill.md 與 reference 的 frontmatter 是為 Claude runtime 設計的（欄位多為 <code>name</code>/<code>license</code>/<code>metadata</code>），Hugo 與 mdtools 需要的是 <code>title</code> + <code>date</code>。每份檔案：</p>
<ol>
<li>把原 frontmatter 保留或替換成 Hugo 規格（<code>title</code>、<code>date</code>、<code>description</code>、<code>tags</code>）</li>
<li>刪掉 body 開頭的 <code># H1</code>（Hugo 會從 <code>title</code> 自動生成 H1，保留會觸發 <code>MD025-no-body-h1</code>）</li>
</ol>
<h3 id="step-7跑-make-check-與-hugo-驗收">Step 7：跑 <code>make check</code> 與 <code>hugo</code> 驗收</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">make check    <span class="c1"># fmt + lint + cards，三個閘門全綠</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">hugo          <span class="c1"># 確認無 WARN/ERROR，page count 多了對應檔數</span></span></span></code></pre></div><p>幾個常見訊號與對應的修補點：</p>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>原因</th>
          <th>回頭修</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>lint <code>front-matter-required</code> / <code>MD025</code></td>
          <td>有檔案漏掉 frontmatter 或 body H1 沒刪</td>
          <td>Step 6</td>
      </tr>
      <tr>
          <td>cards <code>L1-broken-link target not found</code> 且路徑是 <code>skill/</code></td>
          <td>SKILL.md 沒改成 skill.md（檔名大小寫）</td>
          <td>Step 3</td>
      </tr>
      <tr>
          <td>hugo <code>REF_NOT_FOUND</code></td>
          <td>連結還指向 <code>references/</code></td>
          <td>Step 4</td>
      </tr>
  </tbody>
</table>
<h3 id="step-8更新本-contentskills_indexmd-的目前收錄表">Step 8：更新本 <code>content/skills/_index.md</code> 的「目前收錄」表</h3>
<p>把新 skill 加入上方的表格，含主題一句話與 Hugo URL。</p>
<h3 id="step-9commit">Step 9：commit</h3>
<p>單一 commit 收尾：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git add .claude/skills/&lt;name&gt; content/skills/&lt;name&gt; content/skills/_index.md
</span></span><span class="line"><span class="ln">2</span><span class="cl">git commit -m <span class="s2">&#34;docs(skills): import &lt;name&gt; skill&#34;</span></span></span></code></pre></div><hr>
<h2 id="設計決策備忘">設計決策備忘</h2>
<h3 id="為什麼-claude-保留-referencescontent-扁平">為什麼 <code>.claude/</code> 保留 references/、<code>content/</code> 扁平？</h3>
<p><code>.claude/</code> 是 Claude runtime 的 SKILL 執行環境，SKILL.md 的路徑解析（<code>references/X.md</code>）是 skill 原生協議的一部分 — 改了會破壞 Claude 讀取行為。</p>
<p><code>content/</code> 是 blog 文章，Hugo 的 pretty URL 傾向單層結構（<code>/skills/name/page/</code> 比 <code>/skills/name/references/page/</code> 乾淨）。扁平化也讓 render hook 的 tooltip 與 mdtools 的 card graph 不必穿一層目錄。</p>
<p>兩種結構並行、各自最佳化、用 step 1 的複製動作維持同步。</p>
<h3 id="為什麼不直接-symlink-contentskills--claudeskills">為什麼不直接 symlink <code>content/skills/</code> → <code>.claude/skills/</code>？</h3>
<p>Symlink 會讓兩邊共用 frontmatter 與路徑規範。<code>.claude/</code> 版的 frontmatter 是 skill protocol（<code>name</code>/<code>license</code>/<code>metadata</code>），與 Hugo 要的（<code>title</code>/<code>date</code>）相衝；body 開頭的 <code># H1</code> 是 Claude 讀者的 context signpost，但在 Hugo 會跟 <code>title</code> 生的 H1 重複。結構上看似省事，語意上兩邊是不同受眾的產出，應該允許各自演化。</p>
<hr>
<h2 id="last-updated">Last Updated</h2>
<p>2026-04-24 — 初版：compositional-writing 轉文章完成，記錄標準流程。</p>
]]></content:encoded></item></channel></rss>