<?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/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>GitHub Spec Kit｜林鼎淵 Dean Lin</title>
    <link>https://deanlin.net/tags/github-spec-kit/</link>
    <image><url>https://deanlin.net/images/author_hu_aa256fc934e9a932.jpg</url><title>GitHub Spec Kit｜林鼎淵 Dean Lin</title><link>https://deanlin.net/tags/github-spec-kit/</link><width>144</width><height>144</height></image>
    <description>林鼎淵（Dean Lin）的部落格：生成式 AI 企業內訓講師、外商資安公司軟體專家、7 本書作者。400 多篇文章用白話分享生成式 AI 實戰、Claude Code 與 Vibe Coding 教學、團隊合作與職場成長。</description>
    <generator>Hugo</generator>
    <language>zh-tw</language>
    <copyright>© 2020–2026 林鼎淵 Dean Lin</copyright>
    <lastBuildDate>Thu, 17 Sep 2026 19:45:48 +0800</lastBuildDate>
    <atom:link href="https://deanlin.net/tags/github-spec-kit/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【Spec-Kit × Claude Code 教學】用規格驅動開發全端專案，再搭配 MCP 部署到 Hostinger VPS</title>
      <link>https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/</link>
      <pubDate>Thu, 17 Sep 2026 19:45:48 +0800</pubDate>
      <guid>https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>AI 實戰</category>
      <description>上一集以 YouTube 留言彙整工具為案例，讓大家了解在 AI 時代只要有需求，就算工具不常使用，甚至只有自己一個使用者，那也值得開發。</description>
      <media:content url="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-og_hu_8482c61849394690.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<figure class="figure"><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-01.webp" width="1400" height="788" alt="【Spec-Kit × Claude Code 教學】用規格驅動開發全端專案，再搭配 MCP 部署到 Hostinger VPS（圖 1）" fetchpriority="high" decoding="async">
  <figcaption><a href="https://youtu.be/16IIi5uNx_M">https://youtu.be/16IIi5uNx_M</a></figcaption>
</figure>

<p>上一集<a href="https://youtu.be/BPdyiaC-3Lw">以 YouTube 留言彙整工具為案例</a>，讓大家了解在 AI 時代只要有需求，就算工具不常使用，甚至只有自己一個使用者，那也值得開發。</p>
<p>因為在 AI 的幫助下，開發的時間成本已經大幅下降。</p>
<figure class="figure"><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-02.webp" width="1400" height="749" alt="YouTube 留言彙整工具為案例" loading="lazy" decoding="async">
  <figcaption><a href="https://youtu.be/BPdyiaC-3Lw">YouTube 留言彙整工具為案例</a></figcaption>
</figure>

<p>但小工具因為功能單純，所以只要講清楚需求，AI 就能幫你搞定；<strong>但如果今天要設計一款公開給大家玩的遊戲，涵蓋註冊登入、遊戲商城、玩家排行榜等功能。</strong></p>
<blockquote class="pullquote"><p>你會發現隨著功能增加，AI 的執行能力越來越差</p>
</blockquote>
<p>請他改一個功能，結果另一個功能壞掉；開新的對話窗，就忘了過去的約定。</p>
<blockquote class="pullquote"><p>這是因為當系統功能變複雜後，如果缺乏規格文件，不管人還是 AI 都會「失憶」。</p>
</blockquote>
<p>所以這篇文章要分享用「規格驅動開發（SDD）」的技巧，會透過 Spec-Kit 這個工具，幫大家把模糊的需求變成具體的規格。</p>
<p>並在每次功能迭代時，記錄為何要做這次的修改，這樣未來維護時，才知道當初的決策依據。</p>
<blockquote>
<p>完整的 Demo，可以觀看 YT 喔 👉</p>
<p>對 AI 應用感興趣的朋友，歡迎按下訂閱按鈕，未來我計畫分享一系列 AI 工具的應用教學。</p>
</blockquote>
<div class="yt" data-yt="16IIi5uNx_M" data-title="【Claude Code × Spec-Kit 教學】用規格驅動開發全端專案，再搭配 MCP 部署到 Hostinger VPS | AI Agent | Vibe Coding | SDD">
  <a class="yt-link" href="https://www.youtube.com/watch?v=16IIi5uNx_M" target="_blank" rel="noopener" aria-label="播放影片：【Claude Code × Spec-Kit 教學】用規格驅動開發全端專案，再搭配 MCP 部署到 Hostinger VPS | AI Agent | Vibe Coding | SDD">
    <img src="https://i.ytimg.com/vi/16IIi5uNx_M/hqdefault.jpg" alt="" width="480" height="360" loading="lazy" decoding="async">
    <span class="yt-play" aria-hidden="true"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false"><path d="M8 5.2v13.6L19 12z"/></svg></span>
    <span class="yt-title">【Claude Code × Spec-Kit 教學】用規格驅動開發全端專案，再搭配 MCP 部署到 Hostinger VPS | AI Agent | Vibe Coding | SDD</span>
  </a>
</div>

<p>為了提升專案的趣味性，這次會帶大家實作常常在廣告上看到的「割草遊戲」。</p>
<p>除了設計前端網頁的遊戲機制外，還涵蓋了玩家的註冊、登入，以及排行榜與升級制度，這些需要後端與資料庫的功能。</p>
<figure class="figure"><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-03.webp" width="1400" height="746" alt="【Spec-Kit × Claude Code 教學】用規格驅動開發全端專案，再搭配 MCP 部署到 Hostinger VPS（圖 4）" loading="lazy" decoding="async">
  <figcaption><a href="https://game.deanlin.tech/">https://game.deanlin.tech/</a></figcaption>
</figure>

<h3 class="h-nomark" id="-開發環境設定">① 開發環境設定<a class="h-anchor" href="#-%e9%96%8b%e7%99%bc%e7%92%b0%e5%a2%83%e8%a8%ad%e5%ae%9a" aria-label="這個段落的連結"></a></h3>
<p>而在正式開工前，我會先帶大家確認電腦的開發環境是否準備就緒，接著安裝 Spec-Kit 完成專案的初始化。</p>
<h3 class="h-nomark" id="-透過-spec-kit-開發">② 透過 Spec-Kit 開發<a class="h-anchor" href="#-%e9%80%8f%e9%81%8e-spec-kit-%e9%96%8b%e7%99%bc" aria-label="這個段落的連結"></a></h3>
<p>然後我們就要透過 Spec-Kit 來設計規格文件，這邊也會分享製作遊戲能參考哪些資源，以此減少 AI 消耗 Token 的額度。</p>
<p>在確認規格符合自己的需求後，就可以讓 AI 幫我們完成遊戲的初版。</p>
<h3 class="h-nomark" id="-git-版控與迭代功能">③ Git 版控與迭代功能<a class="h-anchor" href="#-git-%e7%89%88%e6%8e%a7%e8%88%87%e8%bf%ad%e4%bb%a3%e5%8a%9f%e8%83%bd" aria-label="這個段落的連結"></a></h3>
<p>親自驗證遊戲基礎操作都沒問題後，我們要先加入 Git 做版本控制，並將專案同步到 GitHub 雲端保存。</p>
<p>接著再測試一些極端情境，比如手機畫面是否有破版；並在遊玩的過程中，思考哪些細節可以進行優化。</p>
<p>而這些我們變更的決策，也可以透過 Spec-Kit 來進行迭代。</p>
<h3 class="h-nomark" id="-透過-hostinger-部署上線">④ 透過 Hostinger 部署上線<a class="h-anchor" href="#-%e9%80%8f%e9%81%8e-hostinger-%e9%83%a8%e7%bd%b2%e4%b8%8a%e7%b7%9a" aria-label="這個段落的連結"></a></h3>
<p>確認遊戲各方面都符合期待後，我們就能部署到線上環境了。</p>
<p>因為最終成品涵蓋前端、後端、資料庫，所以這次我們會使用到 VPS 虛擬主機。</p>
<p>第一次接觸也不用擔心，在安裝 Hostinger MCP 後，透過白話文便可讓 AI Agent 協助完成部署與後續版本迭代的任務。</p>
<h3 class="h-nomark" id="-上線後的安全性考量">⑤ 上線後的安全性考量<a class="h-anchor" href="#-%e4%b8%8a%e7%b7%9a%e5%be%8c%e7%9a%84%e5%ae%89%e5%85%a8%e6%80%a7%e8%80%83%e9%87%8f" aria-label="這個段落的連結"></a></h3>
<p>但專案上線才是考驗的開始。</p>
<p>比如我們提供了註冊與登入流程，但有設計忘記密碼與使用者管理的功能嗎？是否需要加上信箱驗證的設定？</p>
<p>以及目前後端 API 有做什麼防護設定嗎？</p>
<blockquote>
<p>這些問題，都是當真實使用者進入後，會開始浮現的。</p>
</blockquote>
<h3 class="h-nomark" id="-總結與比較">⑥ 總結與比較<a class="h-anchor" href="#-%e7%b8%bd%e7%b5%90%e8%88%87%e6%af%94%e8%bc%83" aria-label="這個段落的連結"></a></h3>
<p>在影片的最後，我會分享自己這一年來使用規格驅動開發的心得；並比較過去介紹的 OpenSpec 跟這次的 Spec-Kit 有什麼差別。</p>
<hr>
<h2 class="h-nomark" id="-開發環境設定安裝-spec-kit-建立專案">① 開發環境設定，安裝 Spec-Kit 建立專案<a class="h-anchor" href="#-%e9%96%8b%e7%99%bc%e7%92%b0%e5%a2%83%e8%a8%ad%e5%ae%9a%e5%ae%89%e8%a3%9d-spec-kit-%e5%bb%ba%e7%ab%8b%e5%b0%88%e6%a1%88" aria-label="這個段落的連結"></a></h2>
<blockquote>
<p>如果你是第一次接觸 AI Coding，可以先<a href="https://youtu.be/BPdyiaC-3Lw">參考上一集影片來安裝開發環境</a>。</p>
</blockquote>
<p>這集使用 Claude Code 作為 AI Agent，需要升級到 Pro 才能使用；但如果你熟悉的是 Codex、Cursor 或 Antigravity，其實開發流程都是一樣的。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-04.webp" width="1239" height="727" alt="① 開發環境設定，安裝 Spec-Kit 建立專案（圖 4）" loading="lazy" decoding="async"></p>
<p>另外我們會使用到 Node.js 開發專案、Git 版本控制、GitHub 做雲端同步，並用 Docker 啟動資料庫容器。</p>
<h3 id="-環境檢查">環境檢查<a class="h-anchor" href="#-%e7%92%b0%e5%a2%83%e6%aa%a2%e6%9f%a5" aria-label="這個段落的連結"></a></h3>
<p>這邊先打開你熟悉的程式碼編輯器，我用的是 Cursor，你想用 VS Code、Antigravity 也都可以</p>
<p><a href="https://cursor.com/zh-Hant/download">https://cursor.com/zh-Hant/download</a></p>
<p>開啟程式碼編輯器後，我們先打開終端機，貼上下面的指令，確認基礎環境都完成安裝</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>nvm -v; node -v; git -v; docker -v
</span></span></code></pre></div><p>如果版號都有顯示，就代表安裝完成</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-05.webp" width="1239" height="727" alt="環境檢查（圖 5）" loading="lazy" decoding="async"></p>
<h3 id="-安裝-python-與-uv">安裝 Python 與 uv<a class="h-anchor" href="#-%e5%ae%89%e8%a3%9d-python-%e8%88%87-uv" aria-label="這個段落的連結"></a></h3>
<p>接下來要安裝 Python 與 uv，因為 Spec-Kit 的指令列工具是用 Python 寫的</p>
<p>首先在終端機輸入 <code>python3 &ndash;version</code>，要 3.11 以上，太舊或找不到就到官網裝最新版</p>
<p><a href="https://www.python.org/downloads/">https://www.python.org/downloads/</a></p>
<p>接著安裝 uv，它負責安裝與管理 Python 工具，如果你是 macOS 或 Linux 可以在終端機輸入：</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl -LsSf https://astral.sh/uv/install.sh | sh
</span></span></code></pre></div><p>如果你是 Windows 則可參考指令：</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>powershell -ExecutionPolicy ByPass -c <span style="color:#a5d6ff">&#34;irm https://astral.sh/uv/install.ps1 | iex&#34;</span>
</span></span></code></pre></div><p>裝完開啟一個新的終端機，輸入 <code>uv &ndash;version</code>，出現版號就代表你成功嚕</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-06.webp" width="1239" height="727" alt="安裝 Python 與 uv（圖 6）" loading="lazy" decoding="async"></p>
<h3 id="-安裝-spec-kit建立專案">安裝 Spec-Kit，建立專案<a class="h-anchor" href="#-%e5%ae%89%e8%a3%9d-spec-kit%e5%bb%ba%e7%ab%8b%e5%b0%88%e6%a1%88" aria-label="這個段落的連結"></a></h3>
<p>接著我們能透過 uv 來安裝 Spec-Kit</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>uv tool install specify-cli --from git+https://github.com/github/spec-kit.git
</span></span></code></pre></div><p>安裝完成後，你可以開啟一個存放專案的資料夾，輸入下面的指令來建立專案</p>
<pre tabindex="0"><code>specify init web-survivor --integration claude
</code></pre><blockquote>
<p>其中 web-survivor 是專案名稱，而 integration 後面的 claude 則是我們指定的 AI Agent</p>
</blockquote>
<figure class="figure"><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-07.webp" width="1239" height="727" alt="在 script type 這部分我選擇 sh" loading="lazy" decoding="async">
  <figcaption>在 script type 這部分我選擇 sh</figcaption>
</figure>

<p>完成後，我們要用 <code>cd</code> 指令進入這個專案資料夾，並透過程式碼編輯器打開它</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cd web-survivor
</span></span><span style="display:flex;"><span>cursor .
</span></span></code></pre></div><p>此時左側會看到兩個資料夾，「.claude」裡面儲存了 Spec-Kit 相關的 Agent Skill</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-08.webp" width="1239" height="727" alt="安裝 Spec-Kit，建立專案（圖 8）" loading="lazy" decoding="async"></p>
<p>裡面涵蓋了釐清需求、建立規則、撰寫程式的 SOP，如果你是第一次接觸 Agent Skill，<a href="https://youtu.be/xe00zJEtuMo">我過去有專門做一期影片講解</a>。</p>
<p>而下面的「.specify」則是存放規格流程需要的模板與腳本。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-09.webp" width="1239" height="727" alt="安裝 Spec-Kit，建立專案（圖 9）" loading="lazy" decoding="async"></p>
<h3 id="-安裝-chrome-mcp">安裝 Chrome MCP<a class="h-anchor" href="#-%e5%ae%89%e8%a3%9d-chrome-mcp" aria-label="這個段落的連結"></a></h3>
<p>接著我們打開終端機，為了讓 AI 可以操作 Chrome 瀏覽器完成自動化測試，我們要先裝一個 MCP 外掛。</p>
<p>但安裝前要確認電腦有安裝 Chrome 瀏覽器，然後就可以在終端機貼上下面指令進行安裝：</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>claude mcp add chrome-devtools -s user -- npx -y chrome-devtools-mcp@latest
</span></span></code></pre></div><p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-10.webp" width="1239" height="727" alt="安裝 Chrome MCP（圖 10）" loading="lazy" decoding="async"></p>
<blockquote>
<p>這邊因為我已經安裝過，所以他說這個工具已經存在了。</p>
</blockquote>
<h3 id="-確認-mcp-與-skill-安裝完成">確認 MCP 與 Skill 安裝完成<a class="h-anchor" href="#-%e7%a2%ba%e8%aa%8d-mcp-%e8%88%87-skill-%e5%ae%89%e8%a3%9d%e5%ae%8c%e6%88%90" aria-label="這個段落的連結"></a></h3>
<p>完成後在終端機輸入「claude」，然後在對話輸入「/mcp」，就可以看到剛剛安裝的 chrome-devtools 連線成功。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-11.webp" width="1239" height="727" alt="確認 MCP 與 Skill 安裝完成（圖 11）" loading="lazy" decoding="async"></p>
<p>按下 esc 離開後，接著輸入「/speckit」，可以看到相關的 Skill 都已經安裝完成。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-12.webp" width="1239" height="727" alt="確認 MCP 與 Skill 安裝完成（圖 12）" loading="lazy" decoding="async"></p>
<h3 id="-下載-cc0可商用的美術與音效">下載 CC0（可商用）的美術與音效<a class="h-anchor" href="#-%e4%b8%8b%e8%bc%89-cc0%e5%8f%af%e5%95%86%e7%94%a8%e7%9a%84%e7%be%8e%e8%a1%93%e8%88%87%e9%9f%b3%e6%95%88" aria-label="這個段落的連結"></a></h3>
<p>但在撰寫規格前，先做一件很多人會忽略的事情，那就是給 AI 準備可以使用的素材，這能讓最終的成果有風格一致的美術效果。</p>
<p>這次我是從下面幾個網站準備素材的：</p>
<ul>
<li><strong>Kenney：<a href="https://kenney.nl/">https://kenney.nl/</a></strong></li>
</ul>
<p>首先是 Kenney，點擊 Assets 後，你可以看到豐富的素材資源，這次遊戲的角色、怪物、武器都用它的。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-13.webp" width="1239" height="727" alt="下載 CC0（可商用）的美術與音效（圖 13）" loading="lazy" decoding="async"></p>
<p>有一點需要特別提醒，就是確認素材的授權為 CC0，這樣才可以放心的使用。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-14.webp" width="1239" height="727" alt="下載 CC0（可商用）的美術與音效（圖 14）" loading="lazy" decoding="async"></p>
<ul>
<li><strong>OpenGameArt：<a href="https://opengameart.org/">https://opengameart.org/</a></strong></li>
</ul>
<p>而背景音樂，則可以在 OpenGameArt 選擇，你可以根據自己的喜好挑選素材。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-15.webp" width="1239" height="727" alt="下載 CC0（可商用）的美術與音效（圖 15）" loading="lazy" decoding="async"></p>
<p>如果不知道怎麼選，可以先回到程式碼編輯器，我有準備練習的參考資源，直接貼上我的指令，讓 AI 下載並分類整理：</p>
<pre tabindex="0"><code>請把下列素材下載到 assets/ 並解壓分類（sprites／particles／ui／audio），
完成後生成 ASSETS.md，記錄每包的名稱、來源頁、授權（皆為 CC0）：
- https://kenney.nl/media/pages/assets/tiny-dungeon/f8422efb44-1674742415/kenney_tiny-dungeon.zip
- https://kenney.nl/media/pages/assets/particle-pack/f8fe0f8cb8-1677578741/kenney_particle-pack.zip
- https://kenney.nl/media/pages/assets/ui-pack/f651646eab-1718203990/kenney_ui-pack.zip
- https://kenney.nl/media/pages/assets/impact-sounds/87b4ddecda-1677589768/kenney_impact-sounds.zip
- https://kenney.nl/media/pages/assets/interface-sounds/fa43c1dd4d-1677589452/kenney_interface-sounds.zip
- https://kenney.nl/media/pages/assets/rpg-audio/8e99002d76-1677590336/kenney_rpg-audio.zip
- https://opengameart.org/sites/default/files/5%20Action%20Chiptunes%20By%20Juhani%20Junkala.zip
- https://opengameart.org/sites/default/files/battleThemeA.mp3
只准使用上述來源，不得自行搜尋或下載其他素材。
</code></pre><p>這裡我將資源分成幾塊： sprites 是角色與場景圖塊 particles 則是武器效果的粒子貼圖 ui 是遊戲畫面的常見的操作按鈕 audio 很好理解，就是背景音樂和音效。</p>
<p>稍等一段時間後，AI 就將資源下載好了，有興趣的朋友可以在 ASSETS.md 的檔案中深入了解每個素材的用途。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-16.webp" width="1239" height="727" alt="下載 CC0（可商用）的美術與音效（圖 16）" loading="lazy" decoding="async"></p>
<h3 id="-提供撰寫遊戲的說明書">提供撰寫遊戲的說明書<a class="h-anchor" href="#-%e6%8f%90%e4%be%9b%e6%92%b0%e5%af%ab%e9%81%8a%e6%88%b2%e7%9a%84%e8%aa%aa%e6%98%8e%e6%9b%b8" aria-label="這個段落的連結"></a></h3>
<p>另外這次遊戲我採用 Phaser 4 作為開發框架，他在處理 2D 遊戲上有很棒的表現：</p>
<p><a href="https://github.com/phaserjs/phaser">https://github.com/phaserjs/phaser</a></p>
<p>儘管我們可以讓 AI 自由開發，但指定明確的框架，並透過 Skill 告訴他框架如何使用，可以少走很多彎路。</p>
<p>這邊開啟一個新的終端機，貼上下面的指令，就能把 Phaser 的 Skill 搬到我們的專案中：</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git clone --depth <span style="color:#a5d6ff">1</span> --filter<span style="color:#ff7b72;font-weight:bold">=</span>blob:none --sparse <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --branch v4.2.1 https://github.com/phaserjs/phaser.git phaser-tmp
</span></span><span style="display:flex;"><span>git -C phaser-tmp sparse-checkout set skills
</span></span><span style="display:flex;"><span>mkdir -p .claude/skills
</span></span><span style="display:flex;"><span>cp -R phaser-tmp/skills/* .claude/skills/ <span style="color:#ff7b72;font-weight:bold">&amp;&amp;</span> rm -rf phaser-tmp
</span></span></code></pre></div><p>完成後，在「.claude/skills」資料夾下就能看到剛剛新增的 phaser 技能。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-17.webp" width="1239" height="727" alt="提供撰寫遊戲的說明書（圖 17）" loading="lazy" decoding="async"></p>
<hr>
<h2 class="h-nomark" id="-用-spec-kit建立全端網頁專案">② 用 Spec-Kit，建立全端網頁專案<a class="h-anchor" href="#-%e7%94%a8-spec-kit%e5%bb%ba%e7%ab%8b%e5%85%a8%e7%ab%af%e7%b6%b2%e9%a0%81%e5%b0%88%e6%a1%88" aria-label="這個段落的連結"></a></h2>
<p>在完成前置作業後，我們先回到與 Claude 的對話視窗，接下來要使用 Spec-Kit 來開發遊戲。</p>
<h3 id="-step-1speckit-constitution-建立專案規則">STEP 1：/speckit-constitution 建立專案規則<a class="h-anchor" href="#-step-1speckit-constitution-%e5%bb%ba%e7%ab%8b%e5%b0%88%e6%a1%88%e8%a6%8f%e5%89%87" aria-label="這個段落的連結"></a></h3>
<p>首先我們要建立這個專案要共同遵守的原則，設定好後，接下來的規格文件與執行計畫都會參考他</p>
<pre tabindex="0"><code>/speckit-constitution
1. 遊戲核心必須使用 Canvas/WebGL 遊戲框架，不得以 DOM 元素硬做遊戲。
2. 三層架構：前端遊戲、後端 API、資料庫；本機與部署皆以 docker-compose.yml 啟動。
3. 安全底線：密碼一律雜湊保存，不得明文或可逆加密；執行 API 必須通過身分驗證。
4. 所有設定透過環境變數管理；.env 永不進 git，必須提供 .env.example。
5. 美術與音效一律使用 assets/ 內預先放好的 CC0 素材，來源與授權記錄於 ASSETS.md。
6. 其餘未明定的細節，可在不牴觸上述原則下自行決策，但決策必須記錄於文件。
</code></pre><ol>
<li>第一條規則是先定下使用的技術，否則 AI 很可能用 DOM 元素硬做遊戲</li>
<li>第二條則說明專案的架構，其中使用 docker-compose.yml 是為了讓專案在本機與部署時都能共用</li>
<li>第三條是安全規範，確保使用者密碼的安全性，以及後端 API 存取要經過的驗證</li>
<li>第四條也跟安全有關，因為「.env」這個環境變數會儲存很多機敏資訊，所以不能加入版控，但要提供一份 example 的參考值</li>
<li>第五條是限定 AI 能使用的素材範圍，這樣能避免 AI 上網亂抓一些沒有授權的資源</li>
<li>第六條是保留 AI 執行的彈性，但同時要求他決策要寫進文件讓我們參考</li>
</ol>
<p>等 AI 執行完成後規則就被寫進 <code>.specify/memory/constitution.md</code></p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-18.webp" width="1239" height="727" alt="STEP 1：/speckit-constitution 建立專案規則（圖 18）" loading="lazy" decoding="async"></p>
<p>打開檔案會發現，它會在我們提供的指令上補充許多細節；每條都會在底下補上存在的「理由」，並且在最後多出了 Governance 說明這個憲章的使用規範。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-19.webp" width="1239" height="727" alt="STEP 1：/speckit-constitution 建立專案規則（圖 19）" loading="lazy" decoding="async"></p>
<p>底部還有版本號與批准日期，日後要求 AI 調整這份專案規則時，版本號也會自我更新。</p>
<h3 id="-step-2speckit-specify-撰寫規格">STEP 2：/speckit-specify 撰寫規格<a class="h-anchor" href="#-step-2speckit-specify-%e6%92%b0%e5%af%ab%e8%a6%8f%e6%a0%bc" aria-label="這個段落的連結"></a></h3>
<p>在設定好專案規則後，下一步就可以讓 AI 開始撰寫規格，這一步我們要說明遊戲外型、使用規則、驗收標準：</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>/speckit-specify
</span></span><span style="display:flex;"><span>建立一款名為「Web Survivor」的 2D 網頁肉鴿割草生存遊戲。
</span></span><span style="display:flex;"><span>遊戲目標：
</span></span><span style="display:flex;"><span>玩家在俯視角地圖中移動閃避，武器自動攻擊，面對不斷生成的怪物撐過 3 分鐘取得高分；
</span></span><span style="display:flex;"><span>已登入玩家結算後回寫金幣、永久升級進度、個人最高分與排行榜。
</span></span><span style="display:flex;"><span>核心規則（必須遵守）：
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 玩家只控制移動（WASD／方向鍵）；武器自動攻擊；怪物死亡掉落經驗與金幣。
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 3 種武器原型：直線投射、環繞近戰、範圍光環；每個最高 5 級，每次升級會有對應效益（速度、數量、範圍半徑），武器可同時持有；滿級武器不再出現在升級選項。
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 3 種敵人：普通、快速、坦克；生成數量與強度隨時間遞增。
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 經驗達標時暫停，出現 3 個隨機升級選項。
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 每局 3 分鐘，死亡或時間到進入結算；單局時長必須可由設定調整（供開發驗證）。
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 未登入可遊玩但不能提交成績；username 全站唯一（不分大小寫）；密碼不可明文保存。
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 金幣可購買永久升級（至少 3 種、各 5 級），下一局生效。
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 排行榜顯示前 100 名，每人只留個人最高分。
</span></span><span style="display:flex;"><span>開放決策（實作時自行平衡，決策記錄於文件）：
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 武器命名與手感、傷害曲線、敵人血量成長、掉落率、磁吸範圍、永久升級的種類與價格。
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 視覺與音效回饋細節（受擊表現、撿取音、升級演出）。
</span></span><span style="display:flex;"><span>美術與音效：
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 16×16 像素 dungeon 風；角色、怪物、武器、道具一律取自 assets/ 的 Kenney Tiny Dungeon；音效取自 assets/audio。
</span></span><span style="display:flex;"><span>成功條件（驗收用）：
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 玩家可完成一局 3 分鐘遊戲；三種武器自動攻擊；升級三選一正常。
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 結算畫面顯示分數、擊殺數、金幣；登入玩家成績正確回寫；較低分不覆蓋最高分。
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 以既有名稱（含大小寫變體）註冊被拒；排行榜正確顯示前 100 名。
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 同屏 300 隻敵人維持流暢（30fps 目標）。
</span></span></code></pre></div><p>這個指令分成五段，一開始先說明我想做什麼類型的遊戲，讓 AI 對成品有基本的想像。</p>
<ol>
<li>「遊戲目標」講的是一局的流程，從開始玩、撐過時間、到結算把資料寫回去</li>
<li>「核心規則」涵蓋了操作模式、遊戲機制，還有武器、敵人、升級規範，這些數字寫死，AI 才不會自由發揮</li>
<li>「開放決策」則是把「手感、數值、價格、音效回饋」這類玩過才知道好不好的，交給 AI 提案</li>
<li>「美術與音效」就是明確指定使用資源</li>
<li>最後「成功條件」則是驗收清單，這樣 AI 完成後才有明確的標準</li>
</ol>
<p>稍等一段時間，AI 會把初步的規格寫到「specs」資料夾底下，這邊你會看到資料夾開頭為「001」，這個數字會隨著功能迭代遞增。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-20.webp" width="1239" height="727" alt="STEP 2：/speckit-specify 撰寫規格（圖 20）" loading="lazy" decoding="async"></p>
<p>打開「spec.md」後，就可以看到 Spec-Kit 根據不同使用情境撰寫了 User Story。</p>
<p><strong>這份文件我建議大家花點時間看一遍，因為很多細節都是 AI 自己補充的，但是否符合期待，需要由你親自把關。</strong></p>
<p>如果有想調整的部分，你可以直接編輯文件，又或者跟 AI 討論自己的想法來優化。</p>
<p>在這個階段調整，會比後續 AI 做出來不符預期大改更有性價比。</p>
<h3 id="-step-3speckit-clarify-釐清">STEP 3：/speckit-clarify 釐清<a class="h-anchor" href="#-step-3speckit-clarify-%e9%87%90%e6%b8%85" aria-label="這個段落的連結"></a></h3>
<p>如果你自己也看不出哪些有問題，那可以在對話窗輸入</p>
<pre tabindex="0"><code>/speckit-clarify
</code></pre><p>這個指令會讓 AI 主動逼問你，釐清規格中沒想清楚的地方；像這邊他就開始問問題了，你可以根據自己實際的需求回答。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-21.webp" width="1239" height="727" alt="STEP 3：/speckit-clarify 釐清（圖 21）" loading="lazy" decoding="async"></p>
<p>回答後，AI 會自動把內容彙整到 spec.md 中。</p>
<p>其實這個來回對答的流程，也是在告訴大家「規格不可能一次就完善」，<strong>所以不要再被那些一行指令就生成完美系統的話術給騙了。</strong></p>
<h3 id="-step-4speckit-plan-技術規劃">STEP 4：/speckit-plan 技術規劃<a class="h-anchor" href="#-step-4speckit-plan-%e6%8a%80%e8%a1%93%e8%a6%8f%e5%8a%83" aria-label="這個段落的連結"></a></h3>
<p>在釐清專案「要做什麼」之後，接下來就能進入到「怎麼做」的環節</p>
<p>如果你心中已經有明確的技術組合，可以跟我一樣在這個階段提供給 AI</p>
<p>當然，如果你沒有任何想法，也可以讓 AI 直接幫你規劃</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>/speckit-plan
</span></span><span style="display:flex;"><span>技術限制：
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 前端：Vite + TypeScript + Phaser 4
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 後端：Node.js + Express + Prisma（含 migration）
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 資料庫：PostgreSQL
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 遊戲參考 Phaser skills 實作
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 防作弊：登入（JWT）後才可提交成績
</span></span></code></pre></div><p>像這邊我就明確要求前端要使用的網頁與遊戲框架，後端與資料庫的部分，則是使用我熟悉的工具。</p>
<p>另外遊戲實作這塊，我要求使用 Phaser skills，避免 AI 使用到舊版寫法，並且因為遊戲有設計排行榜，所以我特別要求必須登入後才能提交成績。</p>
<p>等專案技術規劃完畢後，你會看到他生成了許多文件，涵蓋技術脈絡、相關決策、資料流、API 設計與後續啟動與驗證的文件。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-22.webp" width="1239" height="727" alt="STEP 4：/speckit-plan 技術規劃（圖 22）" loading="lazy" decoding="async"></p>
<h3 id="-step-5speckit-tasks-與-speckit-analyze">STEP 5：/speckit-tasks 與 /speckit-analyze<a class="h-anchor" href="#-step-5speckit-tasks-%e8%88%87-speckit-analyze" aria-label="這個段落的連結"></a></h3>
<p>做到這一步，專案的規格文件已經非常詳細了，接下來只要輸入 <code>/speckit-tasks</code>，就能把複雜的計畫拆解成可執行的任務清單。</p>
<p>等 AI 完成後我們打開「tasks.md」可以看到每個任務有對應的依賴關係與驗收條件。</p>
<p>一開始前面的 Checkbox 都是空的，等 AI 實作完成後才會打勾。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-23.webp" width="1239" height="727" alt="STEP 5：/speckit-tasks 與 /speckit-analyze（圖 23）" loading="lazy" decoding="async"></p>
<blockquote>
<p>另外如果你對目前的設計還不夠放心，可以執行 <code>/speckit-analyze</code> 做交叉檢查；他能協助確認規格(spec)、計畫(plan)、任務(task)三份文件是否存在矛盾，以及是否有漏掉的需求。</p>
</blockquote>
<h3 id="-step-6speckit-implement-開始實作">STEP 6：/speckit-implement 開始實作<a class="h-anchor" href="#-step-6speckit-implement-%e9%96%8b%e5%a7%8b%e5%af%a6%e4%bd%9c" aria-label="這個段落的連結"></a></h3>
<p>另外提醒大家，與 AI 對話的內容越多，會對 Token 造成較多的消耗。</p>
<p>因為任務文件都已經建立完成了，所以我們可以先用 <code>/clear</code> 來開啟新對話窗。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-24.webp" width="1239" height="727" alt="STEP 6：/speckit-implement 開始實作（圖 24）" loading="lazy" decoding="async"></p>
<p>然後輸入 <code>/speckit-implement</code> 讓 AI 根據 Task 開始實作；通常會執行 30 分鐘以上，所以送出指令後，大家可以去做其他的事情，不用一直守在螢幕前</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-25.webp" width="1239" height="727" alt="STEP 6：/speckit-implement 開始實作（圖 25）" loading="lazy" decoding="async"></p>
<p>這次 AI 總共執行了一個多小時才完成任務，如果不知道如何啟用系統可以問他：</p>
<pre tabindex="0"><code>系統如果還沒啟動，請幫我啟動
並給我對應網址
</code></pre><p>拿到網址後，你可以看到遊戲畫面就是我們提供的素材，走低像素風格，這邊我們操作遊戲來確認是否符合預期：</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-26.webp" width="1239" height="727" alt="STEP 6：/speckit-implement 開始實作（圖 26）" loading="lazy" decoding="async"></p>
<p>首先這個遊戲即使不登入也是可以直接遊玩的，並且打怪也都符合預期，吸收足夠的經驗後也能升級武器；並且除了背景音樂外，擊倒怪物或受傷時也有對應的音效。</p>
<p>等這局玩完後，接下來我們嘗試註冊帳號來玩一局；這邊我發現了一個問題，有部分的按鍵打下去沒有反應。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-27.webp" width="1239" height="727" alt="STEP 6：/speckit-implement 開始實作（圖 27）" loading="lazy" decoding="async"></p>
<p>沒關係，我們先完成註冊的流程，確認是否還有其他的問題。</p>
<p>OK，大體上都符合預期，並且玩完這局後，可以看到我們是有進入排行榜的；並且金幣有保留，可以用來升級角色。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-28.webp" width="1239" height="727" alt="STEP 6：/speckit-implement 開始實作（圖 28）" loading="lazy" decoding="async"></p>
<h3 id="-修復問題">修復問題<a class="h-anchor" href="#-%e4%bf%ae%e5%be%a9%e5%95%8f%e9%a1%8c" aria-label="這個段落的連結"></a></h3>
<p>接下來我們再回到與 Claude 的對話，請他協助修復我們遇到的問題，直接跟他說：</p>
<pre tabindex="0"><code>請解決註冊時部分按鍵無法使用
</code></pre><p>稍等一段時間，AI 就把問題解決了。他說是因為註冊時，表單會吃掉 WASD 與空白鍵導致，調整後就符合預期了。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-29.webp" width="1239" height="727" alt="修復問題（圖 29）" loading="lazy" decoding="async"></p>
<p>修復完成後，先登出目前的帳號去重新註冊，以此來驗證問題有成功被修復，可以順利完成註冊流程。</p>
<hr>
<h2 class="h-nomark" id="-git-版本控制spec-kit-迭代功能">③ Git 版本控制，Spec-Kit 迭代功能<a class="h-anchor" href="#-git-%e7%89%88%e6%9c%ac%e6%8e%a7%e5%88%b6spec-kit-%e8%bf%ad%e4%bb%a3%e5%8a%9f%e8%83%bd" aria-label="這個段落的連結"></a></h2>
<p>在初步確認遊戲基礎功能符合需求後，我們要給這個專案加上版本控制，這邊會使用到 Git 這個工具。這樣就算 AI 未來把專案改壞了，我們都還有回頭路可以走。</p>
<h3 id="-建立第一個存檔點">建立第一個存檔點<a class="h-anchor" href="#-%e5%bb%ba%e7%ab%8b%e7%ac%ac%e4%b8%80%e5%80%8b%e5%ad%98%e6%aa%94%e9%bb%9e" aria-label="這個段落的連結"></a></h3>
<p>這邊先請 AI 幫我們產生 commit，可以直接在對話中跟 AI 說</p>
<pre tabindex="0"><code>請根據變更設計 commit 訊息，並完成 commit
</code></pre><p>你可以把 commit 想像成遊戲的「存檔點」，每完成一個階段就存一次檔，就算後面打輸了，也能回到上一個存檔點重來。</p>
<p>畢竟 AI 修改程式碼的幅度很大，有時你只是請他調整一個小功能，他卻順手動了其他地方。</p>
<blockquote class="pullquote"><p>如果沒有存檔點，改壞就真的回不去了</p>
</blockquote>
<p>另外也帶大家看一下「.gitignore」這個檔案：</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-30.webp" width="1239" height="727" alt="建立第一個存檔點（圖 30）" loading="lazy" decoding="async"></p>
<p>前面跟大家說 Git 是版本控制工具，而 gitignore 的功能，就是用來存放不要加入版本控制的檔案。</p>
<p>像是填寫隱私資訊的環境變數、存放套件與建置產物的資料夾、日誌暫存檔這些都是不需要加入專案版本控制的。</p>
<h3 id="-推上-github為部署做準備">推上 GitHub，為部署做準備<a class="h-anchor" href="#-%e6%8e%a8%e4%b8%8a-github%e7%82%ba%e9%83%a8%e7%bd%b2%e5%81%9a%e6%ba%96%e5%82%99" aria-label="這個段落的連結"></a></h3>
<p>commit 完成後，我建議把專案推上 GitHub，除了多一份雲端備份，後面部署上線時也會用到。</p>
<p>點擊左側的「Source Control」，在左下方可以看到剛剛 commit 的訊息。</p>
<p>點擊「發布 Branch」便可建立 GitHub repository，如果想公開讓大家看，就選擇 public，但私人專案用 private 即可。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-31.webp" width="1239" height="727" alt="推上 GitHub，為部署做準備（圖 31）" loading="lazy" decoding="async"></p>
<p>推送成功後，點擊「在 GitHub 上開啟」，看到專案的資料有上傳上去，就代表你成功嚕！</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-32.webp" width="1239" height="727" alt="推上 GitHub，為部署做準備（圖 32）" loading="lazy" decoding="async"></p>
<h3 id="-用-spec-kit-優化專案">用 Spec-Kit 優化專案<a class="h-anchor" href="#-%e7%94%a8-spec-kit-%e5%84%aa%e5%8c%96%e5%b0%88%e6%a1%88" aria-label="這個段落的連結"></a></h3>
<p>有了存檔點後，我們就可以來繼續優化專案了，像這邊我就發現這款遊戲有以下問題：</p>
<ol>
<li>像切換到手機畫面時，除了畫面還是橫式的，還會無法操作</li>
<li>另外現在的遊戲介面有點太簡約了，希望能變得更精緻一些</li>
<li>考量到遊戲玩到一半可能會被其他事情打斷，設計一個暫停按鈕會更好</li>
<li>還有武器升級時，希望有對應的武器圖片，這樣我們才知道自己選了什麼</li>
</ol>
<p>因為上面這些想法屬於「需求變更」，所以跟先前修正錯誤時直接請 AI 處理不同。</p>
<p>我們要透過 Spec-Kit 來進行優化，有了變更文件後，日後回頭看，你會更清楚當初為什麼做出這些決策。</p>
<p>但因為過去我們已經跟 AI 聊了很多，所以要輸入 <code>/clear</code> 來清除對話，避免 AI 因為新舊需求混在一起，導致回覆品質下降。</p>
<p>另外也跟大家介紹 Agent Skill 不同的觸發方式，前面我們都是透過「/」指令的方式來觸發，其實我們也能透過被動的方式來觸發，像這邊我就直接跟 AI 說「使用 spec-kit 來優化下面功能」：</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>使用 spec-kit 優化下面的功能
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 畫面需考量手機排版，避免破版問題，手機打開預設為直式全螢幕
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 手機單手可玩，手指按下的位置就是搖桿原點，往哪滑就往哪走，畫面任何位置都能按
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 在遊戲設計一個暫停按鈕
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 主選單、遊戲中的資訊列、商店、結算畫面排版再精緻一點，icon 取自 assets/ui
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">-</span> 升級時，每個選項要有對應的武器圖片，要與實際武器一致
</span></span></code></pre></div><blockquote>
<p>但提醒一下大家，這種被動觸發的方式，如何使用 Skill 就會交由 AI 判斷</p>
</blockquote>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-33.webp" width="1239" height="727" alt="用 Spec-Kit 優化專案（圖 33）" loading="lazy" decoding="async"></p>
<p>以這次的執行來說，他就是一口氣走完釐清規格、技術規劃、任務拆分、執行實作的流程。</p>
<p>如果想知道每個段落做了什麼，在 specs 資料夾底下有一個 002 開頭的資料夾，裡面就有設計的細節。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-34.webp" width="1239" height="727" alt="用 Spec-Kit 優化專案（圖 34）" loading="lazy" decoding="async"></p>
<p>另外在 AI 完成大幅修改後，建議大家讓它重新啟動一下，避免系統還卡在舊版本，方式很簡單，直接跟他說：</p>
<pre tabindex="0"><code>重啟系統確認變更生效
</code></pre><h3 id="-驗收變更符合預期">驗收變更符合預期<a class="h-anchor" href="#-%e9%a9%97%e6%94%b6%e8%ae%8a%e6%9b%b4%e7%ac%a6%e5%90%88%e9%a0%90%e6%9c%9f" aria-label="這個段落的連結"></a></h3>
<p>重啟後，我們打開瀏覽器直接玩一局，先按 F12 切換成手機的顯示模式，可以看到主選單的排版有優化過。</p>
<p>開始遊戲後，確認可以單指操控，玩到一半也可以暫停，並且升級時有明確的介紹與武器圖片。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-35.webp" width="1239" height="727" alt="驗收變更符合預期（圖 35）" loading="lazy" decoding="async"></p>
<h3 id="-commit--push">Commit &amp; Push<a class="h-anchor" href="#-commit--push" aria-label="這個段落的連結"></a></h3>
<p>接下來回到程式碼編輯器，先輸入<code>/clear</code>開啟一個新對話視窗，然後請 AI 幫我們把變更 commit 並更新到 GitHub：</p>
<pre tabindex="0"><code>請根據變更設計 commit 訊息，並完成 commit 與 push
</code></pre><p>等 AI 完成後，可以到 GitHub，確認都有更新上去：</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-36.webp" width="1239" height="727" alt="Commit &amp; Push（圖 36）" loading="lazy" decoding="async"></p>
<blockquote class="pullquote"><p>如果教學看到了這邊，可以幫這篇文章拍拍手～</p>
</blockquote>
<hr>
<h2 class="h-nomark" id="-安裝-hostinger-mcp將專案部署上線">④ 安裝 Hostinger MCP，將專案部署上線<a class="h-anchor" href="#-%e5%ae%89%e8%a3%9d-hostinger-mcp%e5%b0%87%e5%b0%88%e6%a1%88%e9%83%a8%e7%bd%b2%e4%b8%8a%e7%b7%9a" aria-label="這個段落的連結"></a></h2>
<p>在自己電腦確認功能可以運行後，就可以準備部署上線了。</p>
<p>因為這次的專案涵蓋前端、後端、資料庫，所以會需要一台雲端伺服器；這邊我以 Hostinger 的 VPS 來做部署示範。</p>
<h3 id="-建立-vps方案價格與優惠碼">建立 VPS：方案、價格與優惠碼<a class="h-anchor" href="#-%e5%bb%ba%e7%ab%8b-vps%e6%96%b9%e6%a1%88%e5%83%b9%e6%a0%bc%e8%88%87%e5%84%aa%e6%83%a0%e7%a2%bc" aria-label="這個段落的連結"></a></h3>
<p>進入 Hostinger 官網後，可以透過 Google 帳號註冊與登入</p>
<p><a href="https://hostinger.com/deanlin">https://hostinger.com/deanlin</a></p>
<p>點擊左側的「VPS」，選擇「VPS Hosting」，進去後你會看到一張世界地圖，這是在選擇伺服器的位置，建議選擇延遲比較低的機房，這邊我就選擇 Malaysia。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-37.webp" width="1239" height="727" alt="建立 VPS：方案、價格與優惠碼（圖 37）" loading="lazy" decoding="async"></p>
<p>然後他會詢問你要在機器上安裝什麼，這邊建議大家選擇「Ubuntu」這個作業系統，版本的部分，選擇最新的那個就好。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-38.webp" width="1239" height="727" alt="建立 VPS：方案、價格與優惠碼（圖 38）" loading="lazy" decoding="async"></p>
<p>在存取 VPS 的方式上，你可以設定 root 權限管理者的密碼，又或者增加 SSH Key 來登入也是可以的。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-39.webp" width="1239" height="727" alt="建立 VPS：方案、價格與優惠碼（圖 39）" loading="lazy" decoding="async"></p>
<p>而下一步，建議大家可以把 Malware scanner 這個保護 VPS 安全的功能打開；還有 Docker manager 也建議打開，這可以讓我們後續部署更加便利。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-40.webp" width="1239" height="727" alt="建立 VPS：方案、價格與優惠碼（圖 40）" loading="lazy" decoding="async"></p>
<p>點擊下一步後，會介紹不同機器的方案；原則上機器的規格越好，價格就越高；另外價格也會隨著機器的租賃週期有所不同，週期越長價格越便宜。</p>
<blockquote>
<p>如果輸入我的優惠碼「DEANLIN」，會再獲得 10% 的優惠。</p>
</blockquote>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-41.webp" width="1239" height="727" alt="建立 VPS：方案、價格與優惠碼（圖 41）" loading="lazy" decoding="async"></p>
<h3 id="-安裝-hostinger-mcp">安裝 Hostinger MCP<a class="h-anchor" href="#-%e5%ae%89%e8%a3%9d-hostinger-mcp" aria-label="這個段落的連結"></a></h3>
<p>這個範例我以「KVM 2」來進行示範，在 VPS 建立完成後，我們要來安裝 Hostinger 的 MCP。</p>
<p>點擊左側的 API 後，先選擇自己目前使用的 AI Agent，這邊我以 Claude Code 作為示範。</p>
<p>因為要跟大家示範如何設定網域以及將專案部署到 VPS Hosting，所以只要把 Domain and DNS 還 VPS Hosting 打勾就好，我建議根據實際需求給予對應的權限，而非全部打勾。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-42.webp" width="1239" height="727" alt="安裝 Hostinger MCP（圖 42）" loading="lazy" decoding="async"></p>
<p>下面就會給你設定 MCP 的 JSON 範例，這邊回到程式碼編輯器。</p>
<p>跟大家分享一個小技巧，只要點擊專案的名稱，貼上檔案的路徑就能直接前往，像這裡我就貼上 Claude 設定檔的路徑 <code>~/.claude.json</code></p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#7ee787">&#34;mcpServers&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&#34;hostinger-domains&#34;</span>: {
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&#34;command&#34;</span>: <span style="color:#a5d6ff">&#34;npx&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&#34;args&#34;</span>: [<span style="color:#a5d6ff">&#34;--package=hostinger-api-mcp@latest&#34;</span>, <span style="color:#a5d6ff">&#34;hostinger-domains-mcp&#34;</span>],
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&#34;env&#34;</span>: { <span style="color:#7ee787">&#34;HOSTINGER_API_TOKEN&#34;</span>: <span style="color:#a5d6ff">&#34;your-token-here&#34;</span> }
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&#34;hostinger-dns&#34;</span>: {
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&#34;command&#34;</span>: <span style="color:#a5d6ff">&#34;npx&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&#34;args&#34;</span>: [<span style="color:#a5d6ff">&#34;--package=hostinger-api-mcp@latest&#34;</span>, <span style="color:#a5d6ff">&#34;hostinger-dns-mcp&#34;</span>],
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&#34;env&#34;</span>: { <span style="color:#7ee787">&#34;HOSTINGER_API_TOKEN&#34;</span>: <span style="color:#a5d6ff">&#34;your-token-here&#34;</span> }
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    <span style="color:#7ee787">&#34;hostinger-vps&#34;</span>: {
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&#34;command&#34;</span>: <span style="color:#a5d6ff">&#34;npx&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&#34;args&#34;</span>: [<span style="color:#a5d6ff">&#34;--package=hostinger-api-mcp@latest&#34;</span>, <span style="color:#a5d6ff">&#34;hostinger-vps-mcp&#34;</span>],
</span></span><span style="display:flex;"><span>      <span style="color:#7ee787">&#34;env&#34;</span>: { <span style="color:#7ee787">&#34;HOSTINGER_API_TOKEN&#34;</span>: <span style="color:#a5d6ff">&#34;your-token-here&#34;</span> }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>搜尋「mcpServers」，再貼上設定，這邊你會看到有一個需要設定 HOSTINGER_API_TOKEN 的部分。</p>
<p>我們回到 Hostinger 網站，點擊「Generate API token」，然後輸入 Token 名稱，下面是 Token 有效的期限，可以根據自己需求調整，這裡我使用默認的一個月。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-43.webp" width="1239" height="727" alt="安裝 Hostinger MCP（圖 43）" loading="lazy" decoding="async"></p>
<blockquote class="pullquote"><p>生成完畢後，這個值一定要好好保存，並且不可以外洩，否則你的專案會有安全疑慮。</p>
</blockquote>
<p>接著回到程式碼編輯器，貼上剛剛取得的 Token。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-44.webp" width="1239" height="727" alt="安裝 Hostinger MCP（圖 44）" loading="lazy" decoding="async"></p>
<p>完成後，先開啟終端機，然後輸入「control + c」退出當前對話，接著輸入 claude 來重啟。</p>
<p>此時輸入「/mcp」，如果看到「hostinger」的「dns/domains/vps」就代表設定成功了。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-45.webp" width="1400" height="809" alt="安裝 Hostinger MCP（圖 45）" loading="lazy" decoding="async"></p>
<p>我們可以先詢問他</p>
<pre tabindex="0"><code>列出 hostinger 的 vps 機器
</code></pre><p>這邊就可以看到他可以成功找到</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-46.webp" width="1241" height="724" alt="安裝 Hostinger MCP（圖 46）" loading="lazy" decoding="async"></p>
<p>下一步，就請他把專案部署到 Hostinger，我跟他說</p>
<pre tabindex="0"><code>幫我把專案部署到這台 Hostinger VPS，有前端、後端、資料庫等元件
我希望各自建立對應的 image，然後參考 Docker 設定來做部署
</code></pre><p>在部署這塊，AI 跟我們說他已經完成了部署，因為目前還沒有綁網域，所以先使用 IP 的方式瀏覽：</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-47.webp" width="1241" height="724" alt="安裝 Hostinger MCP（圖 47）" loading="lazy" decoding="async"></p>
<p>這邊我就直接開一局玩玩看，在基礎使用上都是沒有問題的；在過去，專案部署是一件很複雜的事情，而且每家雲端服務商的操作流程都不同。</p>
<p>但有了 MCP，AI 就可以直接操作外部工具，省去我們要熟悉工具的過程。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-48.webp" width="1241" height="724" alt="安裝 Hostinger MCP（圖 48）" loading="lazy" decoding="async"></p>
<p>這邊我們先確認可以不登入遊玩，然後再來測試註冊帳號的流程是否正常，並且遊戲的商店以及排行榜功能都是符合預期的。</p>
<h3 id="-使用專屬網域">使用專屬網域<a class="h-anchor" href="#-%e4%bd%bf%e7%94%a8%e5%b0%88%e5%b1%ac%e7%b6%b2%e5%9f%9f" aria-label="這個段落的連結"></a></h3>
<p>最後補充一點，雖然 IP 也能用，但如果給朋友遊玩時丟給他一串 IP，看起來真的很像詐騙集團。</p>
<p>特別是想經營個人品牌的朋友，我會建議大家去購買網域，這可以讓你的產品、服務更有專業感與可信度。</p>
<p>Hostinger 也有提供網域購買的服務，購買後還可以直接請 AI 幫你完成相關設定。</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-49.webp" width="1241" height="724" alt="使用專屬網域（圖 49）" loading="lazy" decoding="async"></p>
<p>像我就直接跟他說：</p>
<pre tabindex="0"><code>我有購買[deanlin.tech]網址
想把目前的專案網址設定為[game.deanlin.tech]
幫我完成相關設定
</code></pre><p>稍等一段時間，AI 就幫我們搞定了，這樣網站看起來是不是就更有可信度了！</p>
<p><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-50.webp" width="1241" height="724" alt="使用專屬網域（圖 50）" loading="lazy" decoding="async"></p>
<blockquote>
<p>再次跟大家提醒，不管提示詞與規格文件多完善；系統都是需要在反覆迭代中修正的，有時沒有問題，可能只是使用的次數與人數不夠多而已。</p>
</blockquote>
<hr>
<h2 id="結語你不知道你不知道">結語：你不知道你不知道<a class="h-anchor" href="#%e7%b5%90%e8%aa%9e%e4%bd%a0%e4%b8%8d%e7%9f%a5%e9%81%93%e4%bd%a0%e4%b8%8d%e7%9f%a5%e9%81%93" aria-label="這個段落的連結"></a></h2>
<h3 id="-openspec-vs-spec-kit">OpenSpec VS Spec-Kit<a class="h-anchor" href="#-openspec-vs-spec-kit" aria-label="這個段落的連結"></a></h3>
<p>在影片的最後，跟大家分享同為規格驅動開發的 OpenSpec，<a href="https://youtu.be/FeQv7mngg6Q">過去我有做一隻影片專門介紹</a>，當時是以人力資源系統作為範例。</p>
<p>從體驗上來說，OpenSpec 可以在更短的步驟生成規格；而 Spec-Kit 對每個環節都有更詳盡的確認。</p>
<p><strong>我認為沒有哪個比較好，但相對來說 OpenSpec 的規格人類讀起來比較舒服，而 Spec-Kit 生成的規格更像是給 AI 參考的。</strong></p>
<p>規格詳細是好事，但當它大到一個程度時，人類的理解能力會大幅下降。我們只能抓重點讀，或是請 AI 幫忙摘要。</p>
<h3 id="-系統的隱患">系統的隱患<a class="h-anchor" href="#-%e7%b3%bb%e7%b5%b1%e7%9a%84%e9%9a%b1%e6%82%a3" aria-label="這個段落的連結"></a></h3>
<p>回到今天的主題，儘管我們在 Spec-Kit 的幫助下，用白話文生成了全端系統的網頁遊戲，又透過 Hostinger MCP 完成部署作業。</p>
<p>但系統上線後才是考驗的開始，有一句話叫做「你不知道你不知道」。</p>
<p>這邊我從三個面向，盤點出這個系統目前存在的問題：</p>
<h3 class="h-nomark" id="-部署方式">① 部署方式<a class="h-anchor" href="#-%e9%83%a8%e7%bd%b2%e6%96%b9%e5%bc%8f" aria-label="這個段落的連結"></a></h3>
<p>首先，雖然我們用白話文就完成了部署，但你真的知道 AI 做了什麼事嗎？</p>
<p>因為這個 GitHub Repo 是 Private，所以 AI 在 Hostinger VPS 無法直接拉取；因此改用 rsync 這個指令，把電腦上的檔案直接同步到 VPS。</p>
<p>他的確完成任務了，<strong>但 AI 幫你把事情做完，跟用的是不是好的方案，這是兩件事。</strong></p>
<p>因為部署上去的，<strong>是我電腦當下的狀態，而不是 GitHub 上的版本。</strong></p>
<p>如果專案只有我自己維護倒也還好，但假使有多個人一起協作專案，那不就亂成一團了？</p>
<p>因此比較好的做法，應該是在 GitHub 幫這台機器設定一把 Deploy Key，讓它有專案的唯讀權限，能直接從 GitHub 拉程式碼。</p>
<p>再進一步，還能讓程式碼推送到特定 branch 時，自動觸發部署，不用人工登入機器操作。如果大家有興趣，未來再做一期專門介紹。</p>
<h3 class="h-nomark" id="-資料管理">② 資料管理<a class="h-anchor" href="#-%e8%b3%87%e6%96%99%e7%ae%a1%e7%90%86" aria-label="這個段落的連結"></a></h3>
<p>再來聊聊資料，系統一上線，資料就是最重要的資產，這邊提出幾個問題讓大家思考：</p>
<ol>
<li>你知道怎麼進入資料庫管理介面，查看目前儲存的數據嗎？</li>
<li>這個遊戲雖然可以註冊、登入，但在沒有會員管理系統的狀態下，你要如何得知目前的會員總數？</li>
<li>目前系統沒有忘記密碼、信箱驗證的功能，因此使用者一旦忘記密碼，就只能再註冊一個帳號</li>
</ol>
<p>這些都是設計上的缺失。</p>
<h3 class="h-nomark" id="-公開網址後的風險">③ 公開網址後的風險<a class="h-anchor" href="#-%e5%85%ac%e9%96%8b%e7%b6%b2%e5%9d%80%e5%be%8c%e7%9a%84%e9%a2%a8%e9%9a%aa" aria-label="這個段落的連結"></a></h3>
<p>最後，再分享一個公開網址後可能會遇到的問題，<strong>講一個最直觀的，現在後端 API 沒有任何呼叫限制。</strong></p>
<p>如果有人寫腳本瘋狂呼叫，伺服器的資源就會被這些惡意流量吃光，正常玩家反而連不上。</p>
<p>因此上線的系統，通常會加上 Rate Limit 的機制，限制使用者在一段時間內，最多只能呼叫多少次 API。</p>
<p>當然，系統要考量的問題遠遠不止這些，只是提出幾個點給大家參考。</p>
<blockquote class="pullquote"><p>AI 很強沒有錯，他可以輕鬆地做出產品原型；但想一路走到產品，你需要考量更多細節。</p>
</blockquote>
<p>儘管 Spec-Kit 已經幫我們釐清許多模糊的需求了，但這並不代表全部面向都有考慮到。</p>
<p><strong>就像前面提到的這些問題，如果沒拿出來講，大家會在第一時間想到嗎？</strong></p>
<p>AI 能完善你提出的需求，但有更多問題在遇到之前你可能根本沒有想過。</p>
<blockquote class="pullquote"><p>這就是「你不知道你不知道」</p>
</blockquote>
<p>畢竟規格和測試只能涵蓋你想到的部分，而出了事，AI 不會負責，但許多問題在親自驗證時，或許能提早發現與修復。</p>
<p>好的，今天的分享就到這邊，如果這個系列有給你啟發與幫助；別忘了按讚、訂閱，並把文章分享給需要的朋友。</p>
<figure class="figure"><img src="https://deanlin.net/blog/202609/spec-kit-claude-code-hostinger/images/spec-kit-claude-code-hostinger-51.webp" width="1400" height="914" alt="林鼎淵著作《工程師下班有約：企業內訓講師帶你認清職涯真相！》" loading="lazy" decoding="async">
  <figcaption><a href="https://www.tenlong.com.tw/products/9786264142083">https://www.tenlong.com.tw/products/9786264142083</a></figcaption>
</figure>

]]></content:encoded>
    </item>
  </channel>
</rss>
